From 67fced37c826f32ea571dd5c5b24b16016c27953 Mon Sep 17 00:00:00 2001 From: Anders Hafreager Date: Wed, 26 Apr 2017 20:10:18 +0200 Subject: [PATCH 001/302] Setting molecule COM to 0 after moving atoms --- src/MC/fix_gcmc.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index 73758e3628..a83a7aaf63 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -595,6 +595,9 @@ void FixGCMC::init() onemols[imol]->x[i][1] -= onemols[imol]->com[1]; onemols[imol]->x[i][2] -= onemols[imol]->com[2]; } + onemols[imol]->com[0] = 0; + onemols[imol]->com[1] = 0; + onemols[imol]->com[2] = 0; } else gas_mass = atom->mass[ngcmc_type]; From 914848433a9ec47e63193373c77889ee39180788 Mon Sep 17 00:00:00 2001 From: Anders Hafreager Date: Mon, 1 May 2017 00:02:57 +0200 Subject: [PATCH 002/302] Using correct value for atom->nlocal --- src/MC/fix_gcmc.cpp | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index 73758e3628..3122da4f85 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -1023,10 +1023,9 @@ void FixGCMC::attempt_molecule_translation() com_displace[1] = displace*ry; com_displace[2] = displace*rz; - int nlocal = atom->nlocal; if (regionflag) { int *mask = atom->mask; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < atom->nlocal; i++) { if (atom->molecule[i] == translation_molecule) { mask[i] |= molecule_group_bit; } else { @@ -1057,7 +1056,7 @@ void FixGCMC::attempt_molecule_translation() } double energy_after = 0.0; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < atom->nlocal; i++) { if (atom->molecule[i] == translation_molecule) { coord[0] = x[i][0] + com_displace[0]; coord[1] = x[i][1] + com_displace[1]; @@ -1074,7 +1073,7 @@ void FixGCMC::attempt_molecule_translation() if (energy_after_sum < MAXENERGYTEST && random_equal->uniform() < exp(beta*(energy_before_sum - energy_after_sum))) { - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < atom->nlocal; i++) { if (atom->molecule[i] == translation_molecule) { x[i][0] += com_displace[0]; x[i][1] += com_displace[1]; @@ -1109,9 +1108,8 @@ void FixGCMC::attempt_molecule_rotation() error->warning(FLERR,"Energy of old configuration in " "fix gcmc is > MAXENERGYTEST."); - int nlocal = atom->nlocal; int *mask = atom->mask; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < atom->nlocal; i++) { if (atom->molecule[i] == rotation_molecule) { mask[i] |= molecule_group_bit; } else { @@ -1144,7 +1142,7 @@ void FixGCMC::attempt_molecule_rotation() imageint *image = atom->image; double energy_after = 0.0; int n = 0; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < atom->nlocal; i++) { if (mask[i] & molecule_group_bit) { double xtmp[3]; domain->unmap(x[i],image[i],xtmp); @@ -1173,7 +1171,7 @@ void FixGCMC::attempt_molecule_rotation() random_equal->uniform() < exp(beta*(energy_before_sum - energy_after_sum))) { int n = 0; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < atom->nlocal; i++) { if (mask[i] & molecule_group_bit) { image[i] = imagezero; x[i][0] = atom_coord[n][0]; @@ -1689,10 +1687,9 @@ void FixGCMC::attempt_molecule_translation_full() com_displace[1] = displace*ry; com_displace[2] = displace*rz; - int nlocal = atom->nlocal; if (regionflag) { int *mask = atom->mask; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < atom->nlocal; i++) { if (atom->molecule[i] == translation_molecule) { mask[i] |= molecule_group_bit; } else { @@ -1722,7 +1719,7 @@ void FixGCMC::attempt_molecule_translation_full() com_displace[2] = displace*rz; } - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < atom->nlocal; i++) { if (atom->molecule[i] == translation_molecule) { x[i][0] += com_displace[0]; x[i][1] += com_displace[1]; @@ -1741,7 +1738,7 @@ void FixGCMC::attempt_molecule_translation_full() energy_stored = energy_after; } else { energy_stored = energy_before; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < atom->nlocal; i++) { if (atom->molecule[i] == translation_molecule) { x[i][0] -= com_displace[0]; x[i][1] -= com_displace[1]; @@ -1766,9 +1763,8 @@ void FixGCMC::attempt_molecule_rotation_full() double energy_before = energy_stored; - int nlocal = atom->nlocal; int *mask = atom->mask; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < atom->nlocal; i++) { if (atom->molecule[i] == rotation_molecule) { mask[i] |= molecule_group_bit; } else { @@ -1801,7 +1797,7 @@ void FixGCMC::attempt_molecule_rotation_full() imageint *image = atom->image; imageint image_orig[natoms_per_molecule]; int n = 0; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < atom->nlocal; i++) { if (mask[i] & molecule_group_bit) { atom_coord[n][0] = x[i][0]; atom_coord[n][1] = x[i][1]; @@ -1834,7 +1830,7 @@ void FixGCMC::attempt_molecule_rotation_full() } else { energy_stored = energy_before; int n = 0; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < atom->nlocal; i++) { if (mask[i] & molecule_group_bit) { x[i][0] = atom_coord[n][0]; x[i][1] = atom_coord[n][1]; From 7adc7f02e0ac9234dc4e70b968f88eb318ea29e3 Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Wed, 3 May 2017 11:21:18 -0400 Subject: [PATCH 003/302] Stopped working on gaussian bump. --- src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp | 7 + src/USER-MANIFOLD/manifold_factory.cpp | 4 +- src/USER-MANIFOLD/manifold_gaussian_bump.cpp | 138 ++++++++++++++++++ src/USER-MANIFOLD/manifold_gaussian_bump.h | 79 ++++++++++ 4 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 src/USER-MANIFOLD/manifold_gaussian_bump.cpp create mode 100644 src/USER-MANIFOLD/manifold_gaussian_bump.h diff --git a/src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp b/src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp index 4f6b62590d..67f298d8df 100644 --- a/src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp +++ b/src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp @@ -115,6 +115,13 @@ FixNVEManifoldRattle::FixNVEManifoldRattle( LAMMPS *lmp, int &narg, char **arg, error->all(FLERR, "Error creating manifold arg arrays"); } + // Check if you have enough args: + if( 6 + nvars > narg ){ + char msg[2048]; + sprintf(msg, "Not enough args for manifold %s, %d expected but got %d\n", + ptr_m->id(), nvars, narg - 6); + error->all(FLERR, msg); + } // Loop over manifold args: for( int i = 0; i < nvars; ++i ){ int len = 0, offset = 0; diff --git a/src/USER-MANIFOLD/manifold_factory.cpp b/src/USER-MANIFOLD/manifold_factory.cpp index 57c6e8305f..f98180ddb6 100644 --- a/src/USER-MANIFOLD/manifold_factory.cpp +++ b/src/USER-MANIFOLD/manifold_factory.cpp @@ -37,6 +37,7 @@ #include "manifold_cylinder_dent.h" #include "manifold_dumbbell.h" #include "manifold_ellipsoid.h" +#include "manifold_gaussian_bump.h" #include "manifold_plane.h" #include "manifold_plane_wiggle.h" #include "manifold_sphere.h" @@ -58,12 +59,13 @@ manifold* LAMMPS_NS::user_manifold::create_manifold(const char *mname, make_manifold_if ( &man, mname, lmp, narg, arg ); make_manifold_if ( &man, mname, lmp, narg, arg ); make_manifold_if ( &man, mname, lmp, narg, arg ); + make_manifold_if ( &man, mname, lmp, narg, arg ); make_manifold_if ( &man, mname, lmp, narg, arg ); make_manifold_if ( &man, mname, lmp, narg, arg ); make_manifold_if ( &man, mname, lmp, narg, arg ); make_manifold_if ( &man, mname, lmp, narg, arg ); make_manifold_if ( &man, mname, lmp, narg, arg ); - make_manifold_if ( &man, mname, lmp, narg, arg ); + make_manifold_if ( &man, mname, lmp, narg, arg ); make_manifold_if ( &man, mname, lmp, narg, arg ); make_manifold_if ( &man, mname, lmp, narg, arg ); diff --git a/src/USER-MANIFOLD/manifold_gaussian_bump.cpp b/src/USER-MANIFOLD/manifold_gaussian_bump.cpp new file mode 100644 index 0000000000..200edd2fb0 --- /dev/null +++ b/src/USER-MANIFOLD/manifold_gaussian_bump.cpp @@ -0,0 +1,138 @@ +#include "manifold_gaussian_bump.h" + +using namespace LAMMPS_NS; +using namespace user_manifold; + +// The constraint is z = f(r = sqrt( x^2 + y^2) ) +// f(x) = A*exp( -x^2 / 2 l^2 ) if x < rc1 +// = a + b*x + c*x**2 + d*x**3 if rc1 <= x < rc2 +// = 0 if x >= rc2 +// +double manifold_gaussian_bump::g( const double *x ) +{ + double xf[3]; + xf[0] = x[0]; + xf[1] = x[1]; + xf[2] = 0.0; + + double x2 = dot(xf,xf); + if( x2 < rc12 ){ + return x[2] - gaussian_bump_x2( x2 ); + }else if( x2 < rc22 ){ + double rr = sqrt(x2); + double xi = rr - rc1; + xi *= inv_dr; + double xi2 = x2 * inv_dr*inv_dr; + double xi3 = xi*xi2; + return x[2] - ( aa + bb*xi + cc*xi2 + dd*xi3 ); + + }else{ + return x[2]; + } +} + +void manifold_gaussian_bump::n( const double *x, double *nn ) +{ + double xf[3]; + xf[0] = x[0]; + xf[1] = x[1]; + xf[2] = 0.0; + nn[2] = 1.0; + + double x2 = dot(xf,xf); + + if( x2 < rc12 ){ + double factor = gaussian_bump_x2(x2); + factor /= (ll*ll); + nn[0] = factor * x[0]; + nn[1] = factor * x[1]; + }else if( x2 < rc22 ){ + double rr = sqrt(x2); + double xi = rr - rc1; + xi *= inv_dr; + double xi2 = x2 * inv_dr*inv_dr; + double der = bb + 2*cc*xi + 3*dd*xi2; + + nn[0] = -der * x[0] / rr; + nn[1] = -der * x[1] / rr; + }else{ + nn[0] = nn[1] = 0.0; + } +} + +double manifold_gaussian_bump::g_and_n( const double *x, double *nn ) +{ + double xf[3]; + xf[0] = x[0]; + xf[1] = x[1]; + xf[2] = 0.0; + nn[2] = 1.0; + + double x2 = dot(xf,xf); + if( x2 < rc12 ){ + double gb = gaussian_bump_x2(x2); + double factor = gb / (ll*ll); + nn[0] = factor * x[0]; + nn[1] = factor * x[1]; + + return x[2] - gb; + }else if( x2 < rc22 ){ + + double rr = sqrt(x2); + double xi = rr - rc1; + xi *= inv_dr; + double xi2 = x2 * inv_dr*inv_dr; + double xi3 = xi*xi2; + + double der = bb + 2*cc*xi + 3*dd*xi2; + + nn[0] = -der * x[0] / rr; + nn[1] = -der * x[1] / rr; + + + return x[2] - ( aa + bb*xi + cc*xi2 + dd*xi3 ); + + }else{ + nn[0] = nn[1] = 0.0; + return x[2]; + } + +} + + +void manifold_gaussian_bump::post_param_init() +{ + // Read in the params: + AA = params[0]; + ll = params[1]; + rc1 = params[2]; + rc2 = params[3]; + + ll2 = 2.0*ll*ll; + + f_at_rc = gaussian_bump_x2 ( rc12 ); + fp_at_rc = gaussian_bump_der( rc12 ); + + rc12 = rc1*rc1; + rc22 = rc2*rc2; + dr = rc2 - rc1; + inv_dr = 1.0 / dr; +} + + +double manifold_gaussian_bump::gaussian_bump( double x ) +{ + double x2 = x*x; + return gaussian_bump_x2( x2 ); +} + +double manifold_gaussian_bump::gaussian_bump_x2( double x2 ) +{ + return AA*exp( -x2 / ll2 ); +} + +double manifold_gaussian_bump::gaussian_bump_der( double x ) +{ + double x2 = x*x; + return gaussian_bump_x2( x2 )*( -x/(ll*ll) ); +} diff --git a/src/USER-MANIFOLD/manifold_gaussian_bump.h b/src/USER-MANIFOLD/manifold_gaussian_bump.h new file mode 100644 index 0000000000..43f69fba18 --- /dev/null +++ b/src/USER-MANIFOLD/manifold_gaussian_bump.h @@ -0,0 +1,79 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + ----------------------------------------------------------------------- + + This file is a part of the USER-MANIFOLD package. + + This package allows LAMMPS to perform MD simulations of particles + constrained on a manifold (i.e., a 2D subspace of the 3D simulation + box). It achieves this using the RATTLE constraint algorithm applied + to single-particle constraint functions g(xi,yi,zi) = 0 and their + derivative (i.e. the normal of the manifold) n = grad(g). + + It is very easy to add your own manifolds to the current zoo + (we now have sphere, a dendritic spine approximation, a 2D plane (for + testing purposes) and a wave-y plane. + See the README file for more info. + + Stefan Paquay, s.paquay@tue.nl + Applied Physics/Theory of Polymers and Soft Matter, + Eindhoven University of Technology (TU/e), The Netherlands + + Thanks to Remy Kusters at TU/e for testing. + + This software is distributed under the GNU General Public License. + +------------------------------------------------------------------------- */ + +#ifndef LMP_MANIFOLD_GAUSSIAN_BUMP_H +#define LMP_MANIFOLD_GAUSSIAN_BUMP_H + +#include "manifold.h" + +namespace LAMMPS_NS { + +namespace user_manifold { + + // A Gaussian bump with a smoothed decay to flat 2D. + class manifold_gaussian_bump : public manifold { + public: + enum { NPARAMS = 4 }; + manifold_gaussian_bump(class LAMMPS*, int, char **) : manifold(lmp) {} + virtual ~manifold_gaussian_bump(){} + + virtual double g( const double * ); + virtual void n( const double *, double * ); + + // Variant of g that computes n at the same time. + virtual double g_and_n( const double *x, double *nn ); + + static const char* type(){ return "gaussian_bump"; } + virtual const char *id() { return type(); } + + virtual int nparams(){ return NPARAMS; } + virtual void post_param_init(); + private: + // Some private constants: + double aa, bb, cc, dd, AA, ll, ll2, f_at_rc, fp_at_rc; + double rc1, rc2, rc12, rc22, dr, inv_dr; + + double gaussian_bump ( double ); + double gaussian_bump_x2 ( double ); + double gaussian_bump_der( double ); + + }; +} + +} + + +#endif // LMP_MANIFOLD_GAUSSIAN_BUMP_H From c5db3ff401260e0277c190329df6c7cfb1caabf5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 12 May 2017 23:27:58 -0400 Subject: [PATCH 004/302] two small doc corrections from Andrew Jewett for pair style gauss and dihedral style spherical --- doc/src/dihedral_spherical.txt | 17 +++++++++-------- doc/src/pair_gauss.txt | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/doc/src/dihedral_spherical.txt b/doc/src/dihedral_spherical.txt index 3f888db01b..c71a319912 100644 --- a/doc/src/dihedral_spherical.txt +++ b/doc/src/dihedral_spherical.txt @@ -14,10 +14,10 @@ dihedral_style spherical :pre [Examples:] -dihedral_coeff 1 1 286.1 1 124 1 1 90.0 0 1 90.0 0 -dihedral_coeff 1 3 286.1 1 114 1 1 90 0 1 90.0 0 & - 17.3 0 0.0 0 1 158 1 0 0.0 0 & - 15.1 0 0.0 0 0 0.0 0 1 167.3 1 :pre +dihedral_coeff 1 1 286.1 1 124 1 1 90.0 0 1 90.0 0 +dihedral_coeff 1 3 69.3 1 93.9 1 1 90 0 1 90 0 & + 49.1 0 0.00 0 1 74.4 1 0 0.00 0 & + 25.2 0 0.00 0 0 0.00 0 1 48.1 1 [Description:] @@ -35,13 +35,14 @@ the dihedral interaction even if it requires adding additional terms to the expansion (as was done in the second example). A careful choice of parameters can prevent singularities that occur with traditional force-fields whenever theta1 or theta2 approach 0 or 180 degrees. + The last example above corresponds to an interaction with a single energy -minima located at phi=114, theta1=158, theta2=167.3 degrees, and it remains +minima located near phi=93.9, theta1=74.4, theta2=48.1 degrees, and it remains numerically stable at all angles (phi, theta1, theta2). In this example, -the coefficients 17.3, and 15.1 can be physically interpreted as the +the coefficients 49.1, and 25.2 can be physically interpreted as the harmonic spring constants for theta1 and theta2 around their minima. -The coefficient 286.1 is the harmonic spring constant for phi after -division by sin(158)*sin(167.3) (the minima positions for theta1 and theta2). +The coefficient 69.3 is the harmonic spring constant for phi after +division by sin(74.4)*sin(48.1) (the minima positions for theta1 and theta2). The following coefficients must be defined for each dihedral type via the "dihedral_coeff"_dihedral_coeff.html command as in the example above, or in diff --git a/doc/src/pair_gauss.txt b/doc/src/pair_gauss.txt index 92d8b51d8b..f6f46a2de8 100644 --- a/doc/src/pair_gauss.txt +++ b/doc/src/pair_gauss.txt @@ -128,7 +128,7 @@ The B parameter is converted to a distance (sigma), before mixing afterwards (using B=sigma^2). Negative A values are converted to positive A values (using abs(A)) before mixing, and converted back after mixing -(by multiplying by sign(Ai)*sign(Aj)). +(by multiplying by min(sign(Ai),sign(Aj))). This way, if either particle is repulsive (if Ai<0 or Aj<0), then the default interaction between both particles will be repulsive. From 6aa0250bc58f4bd15fccc8dcea6b70da340b0eb5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 12 May 2017 23:40:24 -0400 Subject: [PATCH 005/302] corrections to pair style morse/smooth/linear contributed by David R. Heine --- src/USER-MISC/pair_morse_smooth_linear.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/USER-MISC/pair_morse_smooth_linear.cpp b/src/USER-MISC/pair_morse_smooth_linear.cpp index ea33510b58..3857ad47e7 100644 --- a/src/USER-MISC/pair_morse_smooth_linear.cpp +++ b/src/USER-MISC/pair_morse_smooth_linear.cpp @@ -104,7 +104,7 @@ void PairMorseSmoothLinear::compute(int eflag, int vflag) dexp = exp(-alpha[itype][jtype] * dr); fpartial = morse1[itype][jtype] * (dexp*dexp - dexp) / r; - fpair = factor_lj * ( fpartial - der_at_cutoff[itype][jtype] / r); + fpair = factor_lj * ( fpartial + der_at_cutoff[itype][jtype] / r); f[i][0] += delx*fpair; f[i][1] += dely*fpair; @@ -118,7 +118,7 @@ void PairMorseSmoothLinear::compute(int eflag, int vflag) if (eflag) { evdwl = d0[itype][jtype] * (dexp*dexp - 2.0*dexp) - offset[itype][jtype]; - evdwl += ( r - cut[itype][jtype] ) * der_at_cutoff[itype][jtype]; + evdwl -= ( r - cut[itype][jtype] ) * der_at_cutoff[itype][jtype]; evdwl *= factor_lj; } @@ -349,10 +349,11 @@ double PairMorseSmoothLinear::single(int i, int j, int itype, int jtype, double r = sqrt(rsq); dr = r - r0[itype][jtype]; dexp = exp(-alpha[itype][jtype] * dr); - fforce = factor_lj * morse1[itype][jtype] * (dexp*dexp - dexp) / r; + fforce = factor_lj * (morse1[itype][jtype] * (dexp*dexp - dexp) + + der_at_cutoff[itype][jtype]) / r; phi = d0[itype][jtype] * (dexp*dexp - 2.0*dexp) - offset[itype][jtype]; - dr = cut[itype][jtype] - r0[itype][jtype]; + dr = cut[itype][jtype] - r; phi += dr * der_at_cutoff[itype][jtype]; return factor_lj*phi; From 34cc3946b8d94c7c1a38782fab0b6f141fea7b65 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 14 May 2017 18:29:06 -0400 Subject: [PATCH 006/302] first few pieces of pair style python --- examples/python/in.pair_python_hybrid | 60 +++++++ examples/python/in.pair_python_melt | 57 +++++++ examples/python/lj-melt-potential.py | 28 ++++ src/PYTHON/pair_python.cpp | 220 ++++++++++++++++++++++++++ src/PYTHON/pair_python.h | 74 +++++++++ src/PYTHON/python_impl.cpp | 3 +- 6 files changed, 440 insertions(+), 2 deletions(-) create mode 100644 examples/python/in.pair_python_hybrid create mode 100644 examples/python/in.pair_python_melt create mode 100644 examples/python/lj-melt-potential.py create mode 100644 src/PYTHON/pair_python.cpp create mode 100644 src/PYTHON/pair_python.h diff --git a/examples/python/in.pair_python_hybrid b/examples/python/in.pair_python_hybrid new file mode 100644 index 0000000000..e4ea3eb99e --- /dev/null +++ b/examples/python/in.pair_python_hybrid @@ -0,0 +1,60 @@ +# 3d Lennard-Jones hybrid + +units lj +atom_style atomic + +lattice fcc 0.8442 +region box block 0 10 0 10 0 10 +create_box 2 box +create_atoms 1 box +mass * 1.0 + +velocity all create 3.0 87287 + +pair_style hybrid lj/cut 2.5 python 2.5 +pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * 2 lj/cut 1.0 1.0 + +neighbor 0.3 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 + +write_data hybrid.data +write_restart hybrid.restart + +clear + +read_restart hybrid.restart + +pair_style hybrid lj/cut 2.5 python 2.5 +pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * 2 lj/cut 1.0 1.0 + +fix 1 all nve + +thermo 50 +run 250 + +clear + +units lj +atom_style atomic + +read_data hybrid.data + +pair_style hybrid lj/cut 2.5 python 2.5 +pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * 2 lj/cut 1.0 1.0 + +neighbor 0.3 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 + diff --git a/examples/python/in.pair_python_melt b/examples/python/in.pair_python_melt new file mode 100644 index 0000000000..ad6a84c494 --- /dev/null +++ b/examples/python/in.pair_python_melt @@ -0,0 +1,57 @@ +# 3d Lennard-Jones melt + +units lj +atom_style atomic + +lattice fcc 0.8442 +region box block 0 10 0 10 0 10 +create_box 1 box +create_atoms 1 box +mass 1 1.0 + +velocity all create 3.0 87287 + +pair_style python 2.5 +pair_coeff * * lj-melt-potential.py lj + +neighbor 0.3 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 + +write_data melt.data +write_restart melt.restart + +clear + +read_restart melt.restart + +pair_style python 2.5 +pair_coeff * * lj-melt-potential.py lj + +fix 1 all nve + +thermo 50 +run 250 + +clear + +units lj +atom_style atomic + +read_data melt.data + +pair_style python 2.5 +pair_coeff * * lj-melt-potential.py lj + +neighbor 0.3 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 + diff --git a/examples/python/lj-melt-potential.py b/examples/python/lj-melt-potential.py new file mode 100644 index 0000000000..b1360e0ded --- /dev/null +++ b/examples/python/lj-melt-potential.py @@ -0,0 +1,28 @@ +from __future__ import print_function + +class LAMMPSLJCutPotential(object): + + def __init__(self): + self.pmap=dict() + # coefficients: epsilon, sigma + self.coeff = {'lj' : {'lj' : (1.0,1.0), + 'NULL': (0.0,1.0)}, + 'NULL': {'lj' : (0.0,1.0), + 'NULL': (0.0,1.0)}} + + def map_coeff(self,type,name): + if self.coeff.has_key(name): + print("map type %d to name %s" % (type,name)) + self.pmap[type] = name + else: + print("cannot match atom type",name) + + def compute_force(self,r,itype,jtype,factor_lj): + return 0.0 + + def compute_energy(self,r,itype,jtype,factor_lj): + return 0.0 + +lammps_pair_style = LAMMPSLJCutPotential() +print ("lj-melt potential file loaded") + diff --git a/src/PYTHON/pair_python.cpp b/src/PYTHON/pair_python.cpp new file mode 100644 index 0000000000..d951a11d77 --- /dev/null +++ b/src/PYTHON/pair_python.cpp @@ -0,0 +1,220 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer and Richard Berger (Temple U) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_python.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "memory.h" +#include "neigh_list.h" +#include "python.h" +#include "error.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +PairPython::PairPython(LAMMPS *lmp) : Pair(lmp) { + respa_enable = 0; + single_enable = 0; + writedata = 0; + restartinfo = 0; + one_coeff = 1; + reinitflag = 0; + + python->init(); +} + +/* ---------------------------------------------------------------------- */ + +PairPython::~PairPython() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairPython::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double rsq,factor_lj; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + double *special_lj = force->special_lj; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + factor_lj = special_lj[sbmask(j)]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + if (rsq < cutsq[itype][jtype]) { + const double r = sqrt(rsq); + printf("compute f at r=%g for types %d,%d with factor %g\n", + r,itype,jtype,factor_lj); + fpair = 0.0; + fpair *= factor_lj; + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) { + printf("compute e at r=%g for types %d,%d with factor %g\n", + r,itype,jtype,factor_lj); + evdwl = 0.0; + evdwl *= factor_lj; + } + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,0.0,fpair,delx,dely,delz); + } + } + } +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairPython::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairPython::settings(int narg, char **arg) +{ + if (narg != 1) + error->all(FLERR,"Illegal pair_style command"); + + cut_global = force->numeric(FLERR,arg[0]); +} + +/* ---------------------------------------------------------------------- + set coeffs for all type pairs +------------------------------------------------------------------------- */ + +void PairPython::coeff(int narg, char **arg) +{ + const int ntypes = atom->ntypes; + + if (narg != 3+ntypes) + error->all(FLERR,"Incorrect args for pair coefficients"); + + if (!allocated) allocate(); + + // make sure I,J args are * * + + if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0) + error->all(FLERR,"Incorrect args for pair coefficients"); + + // check if potential python file exists + + FILE *fp = fopen(arg[2],"r"); + if (fp == NULL) + error->all(FLERR,"Cannot open python pair potential class file"); + + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject *pModule = PyImport_AddModule("__main__"); + if (!pModule) error->all(FLERR,"Could not initialize embedded Python"); + + int err = PyRun_SimpleFile(fp,arg[2]); + if (err) error->all(FLERR,"Loading python pair style class failure"); + fclose(fp); + + PyObject *py_pair_instance = + PyObject_GetAttrString(pModule,"lammps_pair_style"); + + if (!py_pair_instance) { + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'lammps_pair_style instance'"); + } + + + for (int i = 1; i <= ntypes ; i++) { + for (int j = i; j <= ntypes ; j++) { + if (strcmp(arg[2+i],"NULL") != 0) { + setflag[i][j] = 1; + cutsq[i][j] = cut_global*cut_global; + } + } + } + PyGILState_Release(gstate); +} + +/* ---------------------------------------------------------------------- */ + +double PairPython::init_one(int, int) +{ + return cut_global; +} + diff --git a/src/PYTHON/pair_python.h b/src/PYTHON/pair_python.h new file mode 100644 index 0000000000..acb96de5e3 --- /dev/null +++ b/src/PYTHON/pair_python.h @@ -0,0 +1,74 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Pair zero is a dummy pair interaction useful for requiring a + force cutoff distance in the absense of pair-interactions or + with hybrid/overlay if a larger force cutoff distance is required. + + This can be used in conjunction with bond/create to create bonds + that are longer than the cutoff of a given force field, or to + calculate radial distribution functions for models without + pair interactions. + +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(python,PairPython) + +#else + +#ifndef LMP_PAIR_PYTHON_H +#define LMP_PAIR_PYTHON_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairPython : public Pair { + public: + PairPython(class LAMMPS *); + virtual ~PairPython(); + virtual void compute(int, int); + void settings(int, char **); + void coeff(int, char **); + double init_one(int, int); + + protected: + double cut_global; + + virtual void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair cutoff < Respa interior cutoff + +One or more pairwise cutoffs are too short to use with the specified +rRESPA cutoffs. + +*/ diff --git a/src/PYTHON/python_impl.cpp b/src/PYTHON/python_impl.cpp index 1b9eef9ea6..c66e003228 100644 --- a/src/PYTHON/python_impl.cpp +++ b/src/PYTHON/python_impl.cpp @@ -51,7 +51,7 @@ PythonImpl::PythonImpl(LAMMPS *lmp) : Pointers(lmp) pfuncs = NULL; // one-time initialization of Python interpreter - // pymain stores pointer to main module + // pyMain stores pointer to main module external_interpreter = Py_IsInitialized(); Py_Initialize(); @@ -63,7 +63,6 @@ PythonImpl::PythonImpl(LAMMPS *lmp) : Pointers(lmp) if (!pModule) error->all(FLERR,"Could not initialize embedded Python"); pyMain = (void *) pModule; - PyGILState_Release(gstate); } From 86283c6309adb79f881bf9c86390c619a6d54148 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 15 May 2017 00:13:32 -0400 Subject: [PATCH 007/302] make melt input consistent with melt example again --- examples/python/in.pair_python_melt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/python/in.pair_python_melt b/examples/python/in.pair_python_melt index ad6a84c494..b3205c0534 100644 --- a/examples/python/in.pair_python_melt +++ b/examples/python/in.pair_python_melt @@ -7,7 +7,7 @@ lattice fcc 0.8442 region box block 0 10 0 10 0 10 create_box 1 box create_atoms 1 box -mass 1 1.0 +mass * 1.0 velocity all create 3.0 87287 @@ -15,7 +15,7 @@ pair_style python 2.5 pair_coeff * * lj-melt-potential.py lj neighbor 0.3 bin -neigh_modify every 10 delay 0 check no +neigh_modify every 20 delay 0 check no fix 1 all nve @@ -48,7 +48,7 @@ pair_style python 2.5 pair_coeff * * lj-melt-potential.py lj neighbor 0.3 bin -neigh_modify every 10 delay 0 check no +neigh_modify every 20 delay 0 check no fix 1 all nve From f484ab6dfb9c5376d91e92af2e7eac5bd9788604 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 15 May 2017 00:14:36 -0400 Subject: [PATCH 008/302] completed lj parameter set and compute functions for melt example --- examples/python/lj-melt-potential.py | 33 +++++++++++++++++----------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/examples/python/lj-melt-potential.py b/examples/python/lj-melt-potential.py index b1360e0ded..fb544f90b8 100644 --- a/examples/python/lj-melt-potential.py +++ b/examples/python/lj-melt-potential.py @@ -4,25 +4,32 @@ class LAMMPSLJCutPotential(object): def __init__(self): self.pmap=dict() - # coefficients: epsilon, sigma - self.coeff = {'lj' : {'lj' : (1.0,1.0), - 'NULL': (0.0,1.0)}, - 'NULL': {'lj' : (0.0,1.0), - 'NULL': (0.0,1.0)}} + # set coeffs: eps, sig, 48*eps*sig**12, 24*eps*sig**6, + # 4*eps*sig**12, 4*eps*sig**6 + self.coeff = {'lj' : {'lj' : (1.0,1.0,48.0,24.0,4.0,4.0), + 'NULL': (0.0,1.0, 0.0, 0.0,0.0,0.0)}, + 'NULL': {'lj' : (0.0,1.0, 0.0, 0.0,0.0,0.0), + 'NULL': (0.0,1.0, 0.0, 0.0,0.0,0.0)}} - def map_coeff(self,type,name): + def map_coeff(self,name,type): if self.coeff.has_key(name): - print("map type %d to name %s" % (type,name)) self.pmap[type] = name else: - print("cannot match atom type",name) + raise Exception("cannot match atom type %s" % name) - def compute_force(self,r,itype,jtype,factor_lj): - return 0.0 + def compute_force(self,rsq,itype,jtype): + r2inv = 1.0/rsq + r6inv = r2inv*r2inv*r2inv + lj1 = self.coeff[self.pmap[itype]][self.pmap[jtype]][2] + lj2 = self.coeff[self.pmap[itype]][self.pmap[jtype]][3] + return (r6inv * (lj1*r6inv - lj2)) - def compute_energy(self,r,itype,jtype,factor_lj): - return 0.0 + def compute_energy(self,rsq,itype,jtype): + r2inv = 1.0/rsq + r6inv = r2inv*r2inv*r2inv + lj3 = self.coeff[self.pmap[itype]][self.pmap[jtype]][4] + lj4 = self.coeff[self.pmap[itype]][self.pmap[jtype]][5] + return (r6inv * (lj3*r6inv - lj4)) lammps_pair_style = LAMMPSLJCutPotential() -print ("lj-melt potential file loaded") From 6e113c1eaf5975292f8170eb9e3daf2bb34cf44c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 15 May 2017 00:15:41 -0400 Subject: [PATCH 009/302] basic feature complete version of lj melt example with python interaction function --- src/PYTHON/pair_python.cpp | 150 ++++++++++++++++++++++++++++++++----- src/PYTHON/pair_python.h | 1 + 2 files changed, 133 insertions(+), 18 deletions(-) diff --git a/src/PYTHON/pair_python.cpp b/src/PYTHON/pair_python.cpp index d951a11d77..292fa4be78 100644 --- a/src/PYTHON/pair_python.cpp +++ b/src/PYTHON/pair_python.cpp @@ -30,6 +30,22 @@ using namespace LAMMPS_NS; +// Wrap API changes between Python 2 and 3 using macros +#if PY_MAJOR_VERSION == 2 +#define PY_INT_FROM_LONG(X) PyInt_FromLong(X) +#define PY_INT_AS_LONG(X) PyInt_AsLong(X) +#define PY_STRING_FROM_STRING(X) PyString_FromString(X) +#define PY_VOID_POINTER(X) PyCObject_FromVoidPtr((void *) X, NULL) +#define PY_STRING_AS_STRING(X) PyString_AsString(X) + +#elif PY_MAJOR_VERSION == 3 +#define PY_INT_FROM_LONG(X) PyLong_FromLong(X) +#define PY_INT_AS_LONG(X) PyLong_AsLong(X) +#define PY_STRING_FROM_STRING(X) PyUnicode_FromString(X) +#define PY_VOID_POINTER(X) PyCapsule_New((void *) X, NULL, NULL) +#define PY_STRING_AS_STRING(X) PyUnicode_AsUTF8(X) +#endif + /* ---------------------------------------------------------------------- */ PairPython::PairPython(LAMMPS *lmp) : Pair(lmp) { @@ -78,6 +94,48 @@ void PairPython::compute(int eflag, int vflag) numneigh = list->numneigh; firstneigh = list->firstneigh; + // prepare access to compute_force and compute_energy functions + + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject *py_pair_instance = (PyObject *) py_potential; + PyObject *py_compute_force = PyObject_GetAttrString(py_pair_instance,"compute_force"); + if (!py_compute_force) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'compute_force' method'"); + } + if (!PyCallable_Check(py_compute_force)) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Python 'compute_force' is not callable"); + } + + PyObject *py_compute_energy = PyObject_GetAttrString(py_pair_instance,"compute_energy"); + if (!py_compute_energy) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'compute_energy' method'"); + } + if (!PyCallable_Check(py_compute_energy)) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Python 'compute_energy' is not callable"); + } + + PyObject *py_compute_args = PyTuple_New(3); + if (!py_compute_args) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not create tuple for 'compute' function arguments"); + } + + PyObject *py_rsq, *py_itype, *py_jtype, *py_value; + // loop over neighbors of my atoms for (ii = 0; ii < inum; ii++) { @@ -89,6 +147,9 @@ void PairPython::compute(int eflag, int vflag) jlist = firstneigh[i]; jnum = numneigh[i]; + py_itype = PY_INT_FROM_LONG(itype); + PyTuple_SetItem(py_compute_args,1,py_itype); + for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; factor_lj = special_lj[sbmask(j)]; @@ -100,12 +161,20 @@ void PairPython::compute(int eflag, int vflag) rsq = delx*delx + dely*dely + delz*delz; jtype = type[j]; + py_jtype = PY_INT_FROM_LONG(jtype); + PyTuple_SetItem(py_compute_args,2,py_jtype); + if (rsq < cutsq[itype][jtype]) { - const double r = sqrt(rsq); - printf("compute f at r=%g for types %d,%d with factor %g\n", - r,itype,jtype,factor_lj); - fpair = 0.0; - fpair *= factor_lj; + py_rsq = PyFloat_FromDouble(rsq); + PyTuple_SetItem(py_compute_args,0,py_rsq); + py_value = PyObject_CallObject(py_compute_force,py_compute_args); + if (!py_value) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Calling 'compute_force' function failed"); + } + fpair = factor_lj*PyFloat_AsDouble(py_value)/rsq; f[i][0] += delx*fpair; f[i][1] += dely*fpair; @@ -117,17 +186,19 @@ void PairPython::compute(int eflag, int vflag) } if (eflag) { - printf("compute e at r=%g for types %d,%d with factor %g\n", - r,itype,jtype,factor_lj); - evdwl = 0.0; - evdwl *= factor_lj; - } + py_value = PyObject_CallObject(py_compute_energy,py_compute_args); + evdwl = factor_lj*PyFloat_AsDouble(py_value); + } else evdwl = 0.0; if (evflag) ev_tally(i,j,nlocal,newton_pair, evdwl,0.0,fpair,delx,dely,delz); } } } + Py_DECREF(py_compute_args); + PyGILState_Release(gstate); + + if (vflag_fdotr) virial_fdotr_compute(); } /* ---------------------------------------------------------------------- @@ -177,30 +248,72 @@ void PairPython::coeff(int narg, char **arg) if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0) error->all(FLERR,"Incorrect args for pair coefficients"); - // check if potential python file exists + // check if python potential file exists and source it FILE *fp = fopen(arg[2],"r"); if (fp == NULL) error->all(FLERR,"Cannot open python pair potential class file"); PyGILState_STATE gstate = PyGILState_Ensure(); + + int err = PyRun_SimpleFile(fp,arg[2]); + if (err) { + PyGILState_Release(gstate); + error->all(FLERR,"Loading python pair style class failure"); + } + fclose(fp); + + // create LAMMPS atom type to potential file type mapping in python class + // by calling 'lammps_pair_style.map_coeff(name,type)' + PyObject *pModule = PyImport_AddModule("__main__"); if (!pModule) error->all(FLERR,"Could not initialize embedded Python"); - int err = PyRun_SimpleFile(fp,arg[2]); - if (err) error->all(FLERR,"Loading python pair style class failure"); - fclose(fp); - - PyObject *py_pair_instance = - PyObject_GetAttrString(pModule,"lammps_pair_style"); - + PyObject *py_pair_instance = PyObject_GetAttrString(pModule,"lammps_pair_style"); if (!py_pair_instance) { + PyErr_Print(); + PyErr_Clear(); PyGILState_Release(gstate); error->all(FLERR,"Could not find 'lammps_pair_style instance'"); } + py_potential = (void *) py_pair_instance; // XXX do we need to increment reference counter? + PyObject *py_map_coeff = PyObject_GetAttrString(py_pair_instance,"map_coeff"); + if (!py_map_coeff) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'map_coeff' method'"); + } + if (!PyCallable_Check(py_map_coeff)) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Python 'map_coeff' is not callable"); + } + PyObject *py_map_args = PyTuple_New(2); + if (!py_map_args) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not create tuple for 'map_coeff' function arguments"); + } + + PyObject *py_type, *py_name, *py_value; for (int i = 1; i <= ntypes ; i++) { + py_type = PY_INT_FROM_LONG(i); + py_name = PY_STRING_FROM_STRING(arg[2+i]); + PyTuple_SetItem(py_map_args,0,py_name); + PyTuple_SetItem(py_map_args,1,py_type); + py_value = PyObject_CallObject(py_map_coeff,py_map_args); + if (!py_value) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Calling 'map_coeff' function failed"); + } + for (int j = i; j <= ntypes ; j++) { if (strcmp(arg[2+i],"NULL") != 0) { setflag[i][j] = 1; @@ -208,6 +321,7 @@ void PairPython::coeff(int narg, char **arg) } } } + Py_DECREF(py_map_args); PyGILState_Release(gstate); } diff --git a/src/PYTHON/pair_python.h b/src/PYTHON/pair_python.h index acb96de5e3..e038d9b25e 100644 --- a/src/PYTHON/pair_python.h +++ b/src/PYTHON/pair_python.h @@ -45,6 +45,7 @@ class PairPython : public Pair { protected: double cut_global; + void * py_potential; virtual void allocate(); }; From df55a90ef666551a8d1d55986702908b328cb529 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 15 May 2017 00:22:03 -0400 Subject: [PATCH 010/302] some example input file tweaks --- examples/python/in.pair_python_hybrid | 5 +++-- examples/python/in.pair_python_melt | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/python/in.pair_python_hybrid b/examples/python/in.pair_python_hybrid index e4ea3eb99e..914b840e86 100644 --- a/examples/python/in.pair_python_hybrid +++ b/examples/python/in.pair_python_hybrid @@ -16,7 +16,7 @@ pair_coeff * * python lj-melt-potential.py lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin -neigh_modify every 10 delay 0 check no +neigh_modify every 20 delay 0 check no fix 1 all nve @@ -51,10 +51,11 @@ pair_coeff * * python lj-melt-potential.py lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin -neigh_modify every 10 delay 0 check no +neigh_modify every 20 delay 0 check no fix 1 all nve thermo 50 run 250 +shell rm hybrid.data hybrid.restart diff --git a/examples/python/in.pair_python_melt b/examples/python/in.pair_python_melt index b3205c0534..ae37aafa77 100644 --- a/examples/python/in.pair_python_melt +++ b/examples/python/in.pair_python_melt @@ -55,3 +55,4 @@ fix 1 all nve thermo 50 run 250 +shell rm melt.data melt.restart From d662f5d42969f6ef230ee7520adbcd41125690fa Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 15 May 2017 00:22:22 -0400 Subject: [PATCH 011/302] whitspace cleanup and gitignore update --- src/.gitignore | 2 ++ src/PYTHON/pair_python.cpp | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/.gitignore b/src/.gitignore index df5cea6eb3..6171b29af9 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -852,6 +852,8 @@ /python_impl.h /fix_python.cpp /fix_python.h +/pair_python.cpp +/pair_python.h /reader_molfile.cpp /reader_molfile.h /reaxc_allocate.cpp diff --git a/src/PYTHON/pair_python.cpp b/src/PYTHON/pair_python.cpp index 292fa4be78..1d37a9fd06 100644 --- a/src/PYTHON/pair_python.cpp +++ b/src/PYTHON/pair_python.cpp @@ -133,7 +133,7 @@ void PairPython::compute(int eflag, int vflag) PyGILState_Release(gstate); error->all(FLERR,"Could not create tuple for 'compute' function arguments"); } - + PyObject *py_rsq, *py_itype, *py_jtype, *py_value; // loop over neighbors of my atoms @@ -299,7 +299,7 @@ void PairPython::coeff(int narg, char **arg) PyGILState_Release(gstate); error->all(FLERR,"Could not create tuple for 'map_coeff' function arguments"); } - + PyObject *py_type, *py_name, *py_value; for (int i = 1; i <= ntypes ; i++) { py_type = PY_INT_FROM_LONG(i); @@ -321,7 +321,7 @@ void PairPython::coeff(int narg, char **arg) } } } - Py_DECREF(py_map_args); + Py_DECREF(py_map_args); PyGILState_Release(gstate); } From 6a1f7e61f2af22341abbcee16392808cbe14f05d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 15 May 2017 00:25:11 -0400 Subject: [PATCH 012/302] provide reference output for python pair style inputs --- .../log.4May2017.pair_python_hybrid.g++.1 | 250 ++++++++++++++++++ .../log.4May2017.pair_python_hybrid.g++.4 | 250 ++++++++++++++++++ .../log.4May2017.pair_python_melt.g++.1 | 217 +++++++++++++++ .../log.4May2017.pair_python_melt.g++.4 | 217 +++++++++++++++ 4 files changed, 934 insertions(+) create mode 100644 examples/python/log.4May2017.pair_python_hybrid.g++.1 create mode 100644 examples/python/log.4May2017.pair_python_hybrid.g++.4 create mode 100644 examples/python/log.4May2017.pair_python_melt.g++.1 create mode 100644 examples/python/log.4May2017.pair_python_melt.g++.4 diff --git a/examples/python/log.4May2017.pair_python_hybrid.g++.1 b/examples/python/log.4May2017.pair_python_hybrid.g++.1 new file mode 100644 index 0000000000..b7520754f9 --- /dev/null +++ b/examples/python/log.4May2017.pair_python_hybrid.g++.1 @@ -0,0 +1,250 @@ +LAMMPS (4 May 2017) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones hybrid + +units lj +atom_style atomic + +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 2 box +Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms +mass * 1.0 + +velocity all create 3.0 87287 + +pair_style hybrid lj/cut 2.5 python 2.5 +pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * 2 lj/cut 1.0 1.0 + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 3 neighbor lists, perpetual/occasional/extra = 3 0 0 + (1) pair lj/cut, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (2) pair python, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (3) neighbor class addition, 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.828 | 4.828 | 4.828 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 3 -6.7733681 0 -2.2744931 -3.7033504 + 50 1.6758903 -4.7955425 0 -2.2823355 5.670064 + 100 1.6458363 -4.7492704 0 -2.2811332 5.8691042 + 150 1.6324555 -4.7286791 0 -2.280608 5.9589514 + 200 1.6630725 -4.7750988 0 -2.2811136 5.7364886 + 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 +Loop time of 41.3888 on 1 procs for 250 steps with 4000 atoms + +Performance: 2609.399 tau/day, 6.040 timesteps/s +48.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 | 41.135 | 41.135 | 41.135 | 0.0 | 99.39 +Neigh | 0.17089 | 0.17089 | 0.17089 | 0.0 | 0.41 +Comm | 0.032175 | 0.032175 | 0.032175 | 0.0 | 0.08 +Output | 0.000513 | 0.000513 | 0.000513 | 0.0 | 0.00 +Modify | 0.046448 | 0.046448 | 0.046448 | 0.0 | 0.11 +Other | | 0.003913 | | | 0.01 + +Nlocal: 4000 ave 4000 max 4000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 5499 ave 5499 max 5499 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 0 +Ave neighs/atom = 0 +Neighbor list builds = 12 +Dangerous builds not checked + +write_data hybrid.data +write_restart hybrid.restart + +clear +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task + +read_restart hybrid.restart + orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 1 by 1 MPI processor grid + 4000 atoms + +pair_style hybrid lj/cut 2.5 python 2.5 +pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * 2 lj/cut 1.0 1.0 + +fix 1 all nve + +thermo 50 +run 250 +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 = 12 12 12 + 3 neighbor lists, perpetual/occasional/extra = 3 0 0 + (1) pair lj/cut, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (2) pair python, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (3) neighbor class addition, 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.626 | 4.626 | 4.626 Mbytes +Step Temp E_pair E_mol TotEng Press + 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 + 300 1.645592 -4.7496711 0 -2.2819002 5.8734193 + 350 1.6514972 -4.7580756 0 -2.2814491 5.810167 + 400 1.6540555 -4.7622999 0 -2.281837 5.8200413 + 450 1.6264734 -4.7200865 0 -2.2809863 5.9546991 + 500 1.6366891 -4.7350979 0 -2.2806781 5.9369284 +Loop time of 41.5677 on 1 procs for 250 steps with 4000 atoms + +Performance: 2598.172 tau/day, 6.014 timesteps/s +48.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 | 41.124 | 41.124 | 41.124 | 0.0 | 98.93 +Neigh | 0.35605 | 0.35605 | 0.35605 | 0.0 | 0.86 +Comm | 0.034799 | 0.034799 | 0.034799 | 0.0 | 0.08 +Output | 0.000473 | 0.000473 | 0.000473 | 0.0 | 0.00 +Modify | 0.046841 | 0.046841 | 0.046841 | 0.0 | 0.11 +Other | | 0.005854 | | | 0.01 + +Nlocal: 4000 ave 4000 max 4000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 5472 ave 5472 max 5472 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 0 +Ave neighs/atom = 0 +Neighbor list builds = 25 +Dangerous builds = 25 + +clear +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task + +units lj +atom_style atomic + +read_data hybrid.data + orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 4000 atoms + reading velocities ... + 4000 velocities + +pair_style hybrid lj/cut 2.5 python 2.5 +pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * 2 lj/cut 1.0 1.0 + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 3 neighbor lists, perpetual/occasional/extra = 3 0 0 + (1) pair lj/cut, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (2) pair python, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (3) neighbor class addition, 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.126 | 4.126 | 4.126 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1.6275257 -4.7224992 0 -2.281821 5.9567365 + 50 1.6454666 -4.7497515 0 -2.2821686 5.8729175 + 100 1.6512008 -4.7582693 0 -2.2820874 5.8090548 + 150 1.6537193 -4.7627023 0 -2.2827434 5.8177704 + 200 1.6258731 -4.7205017 0 -2.2823017 5.952511 + 250 1.6370862 -4.7373176 0 -2.2823022 5.925807 +Loop time of 41.7098 on 1 procs for 250 steps with 4000 atoms + +Performance: 2589.318 tau/day, 5.994 timesteps/s +48.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 | 41.458 | 41.458 | 41.458 | 0.0 | 99.40 +Neigh | 0.16992 | 0.16992 | 0.16992 | 0.0 | 0.41 +Comm | 0.031355 | 0.031355 | 0.031355 | 0.0 | 0.08 +Output | 0.000537 | 0.000537 | 0.000537 | 0.0 | 0.00 +Modify | 0.046569 | 0.046569 | 0.046569 | 0.0 | 0.11 +Other | | 0.003735 | | | 0.01 + +Nlocal: 4000 ave 4000 max 4000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 5487 ave 5487 max 5487 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 0 +Ave neighs/atom = 0 +Neighbor list builds = 12 +Dangerous builds not checked + +shell rm hybrid.data hybrid.restart +Total wall time: 0:02:07 diff --git a/examples/python/log.4May2017.pair_python_hybrid.g++.4 b/examples/python/log.4May2017.pair_python_hybrid.g++.4 new file mode 100644 index 0000000000..7e7868c659 --- /dev/null +++ b/examples/python/log.4May2017.pair_python_hybrid.g++.4 @@ -0,0 +1,250 @@ +LAMMPS (4 May 2017) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones hybrid + +units lj +atom_style atomic + +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 2 box +Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 1 by 2 MPI processor grid +create_atoms 1 box +Created 4000 atoms +mass * 1.0 + +velocity all create 3.0 87287 + +pair_style hybrid lj/cut 2.5 python 2.5 +pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * 2 lj/cut 1.0 1.0 + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 3 neighbor lists, perpetual/occasional/extra = 3 0 0 + (1) pair lj/cut, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (2) pair python, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (3) neighbor class addition, 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.044 | 4.044 | 4.044 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 3 -6.7733681 0 -2.2744931 -3.7033504 + 50 1.6758903 -4.7955425 0 -2.2823355 5.670064 + 100 1.6458363 -4.7492704 0 -2.2811332 5.8691042 + 150 1.6324555 -4.7286791 0 -2.280608 5.9589514 + 200 1.6630725 -4.7750988 0 -2.2811136 5.7364886 + 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 +Loop time of 33.3499 on 2 procs for 250 steps with 4000 atoms + +Performance: 3238.386 tau/day, 7.496 timesteps/s +31.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 | 31.739 | 32.45 | 33.16 | 12.5 | 97.30 +Neigh | 0.12882 | 0.1292 | 0.12959 | 0.1 | 0.39 +Comm | 0.04094 | 0.75173 | 1.4625 | 82.0 | 2.25 +Output | 0.000352 | 0.0004115 | 0.000471 | 0.0 | 0.00 +Modify | 0.014923 | 0.01509 | 0.015257 | 0.1 | 0.05 +Other | | 0.003902 | | | 0.01 + +Nlocal: 2000 ave 2006 max 1994 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 3942 ave 3967 max 3917 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 +Neighbor list builds = 12 +Dangerous builds not checked + +write_data hybrid.data +write_restart hybrid.restart + +clear +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task + +read_restart hybrid.restart + orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 1 by 2 MPI processor grid + 4000 atoms + +pair_style hybrid lj/cut 2.5 python 2.5 +pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * 2 lj/cut 1.0 1.0 + +fix 1 all nve + +thermo 50 +run 250 +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 = 12 12 12 + 3 neighbor lists, perpetual/occasional/extra = 3 0 0 + (1) pair lj/cut, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (2) pair python, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (3) neighbor class addition, 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.747 | 3.747 | 3.747 Mbytes +Step Temp E_pair E_mol TotEng Press + 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 + 300 1.645592 -4.7496711 0 -2.2819002 5.8734193 + 350 1.6514972 -4.7580756 0 -2.2814491 5.810167 + 400 1.6540555 -4.7622999 0 -2.281837 5.8200413 + 450 1.6264734 -4.7200865 0 -2.2809863 5.9546991 + 500 1.6366891 -4.7350979 0 -2.2806781 5.9369284 +Loop time of 33.4436 on 2 procs for 250 steps with 4000 atoms + +Performance: 3229.315 tau/day, 7.475 timesteps/s +31.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 | 31.79 | 32.446 | 33.101 | 11.5 | 97.02 +Neigh | 0.26891 | 0.26902 | 0.26912 | 0.0 | 0.80 +Comm | 0.051997 | 0.70764 | 1.3633 | 77.9 | 2.12 +Output | 0.000332 | 0.000396 | 0.00046 | 0.0 | 0.00 +Modify | 0.01539 | 0.015553 | 0.015717 | 0.1 | 0.05 +Other | | 0.005483 | | | 0.02 + +Nlocal: 2000 ave 2000 max 2000 min +Histogram: 2 0 0 0 0 0 0 0 0 0 +Nghost: 3912 ave 3920 max 3904 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 +Neighbor list builds = 25 +Dangerous builds = 25 + +clear +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task + +units lj +atom_style atomic + +read_data hybrid.data + orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 1 by 2 MPI processor grid + reading atoms ... + 4000 atoms + reading velocities ... + 4000 velocities + +pair_style hybrid lj/cut 2.5 python 2.5 +pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * 2 lj/cut 1.0 1.0 + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 3 neighbor lists, perpetual/occasional/extra = 3 0 0 + (1) pair lj/cut, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (2) pair python, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (3) neighbor class addition, 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.247 | 3.247 | 3.247 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1.6275257 -4.7224992 0 -2.281821 5.9567365 + 50 1.6454666 -4.7497515 0 -2.2821686 5.8729175 + 100 1.6512008 -4.7582693 0 -2.2820874 5.8090548 + 150 1.6537193 -4.7627023 0 -2.2827434 5.8177704 + 200 1.6258731 -4.7205017 0 -2.2823017 5.952511 + 250 1.6370862 -4.7373176 0 -2.2823022 5.925807 +Loop time of 33.0043 on 2 procs for 250 steps with 4000 atoms + +Performance: 3272.302 tau/day, 7.575 timesteps/s +31.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 | 31.676 | 32.248 | 32.819 | 10.1 | 97.71 +Neigh | 0.12725 | 0.12751 | 0.12778 | 0.1 | 0.39 +Comm | 0.038764 | 0.60973 | 1.1807 | 73.1 | 1.85 +Output | 0.000359 | 0.000424 | 0.000489 | 0.0 | 0.00 +Modify | 0.015441 | 0.01555 | 0.01566 | 0.1 | 0.05 +Other | | 0.003519 | | | 0.01 + +Nlocal: 2000 ave 2004 max 1996 min +Histogram: 1 0 0 0 0 0 0 0 0 1 +Nghost: 3923.5 ave 3927 max 3920 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 +Neighbor list builds = 12 +Dangerous builds not checked + +shell rm hybrid.data hybrid.restart +Total wall time: 0:01:42 diff --git a/examples/python/log.4May2017.pair_python_melt.g++.1 b/examples/python/log.4May2017.pair_python_melt.g++.1 new file mode 100644 index 0000000000..afcf5cad9c --- /dev/null +++ b/examples/python/log.4May2017.pair_python_melt.g++.1 @@ -0,0 +1,217 @@ +LAMMPS (4 May 2017) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic + +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 1 box +Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms +mass * 1.0 + +velocity all create 3.0 87287 + +pair_style python 2.5 +pair_coeff * * lj-melt-potential.py lj + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair python, 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.184 | 3.184 | 3.184 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 3 -6.7733681 0 -2.2744931 -3.7033504 + 50 1.6758903 -4.7955425 0 -2.2823355 5.670064 + 100 1.6458363 -4.7492704 0 -2.2811332 5.8691042 + 150 1.6324555 -4.7286791 0 -2.280608 5.9589514 + 200 1.6630725 -4.7750988 0 -2.2811136 5.7364886 + 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 +Loop time of 62.2396 on 1 procs for 250 steps with 4000 atoms + +Performance: 1735.231 tau/day, 4.017 timesteps/s +31.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 | 61.865 | 61.865 | 61.865 | 0.0 | 99.40 +Neigh | 0.24651 | 0.24651 | 0.24651 | 0.0 | 0.40 +Comm | 0.049505 | 0.049505 | 0.049505 | 0.0 | 0.08 +Output | 0.000738 | 0.000738 | 0.000738 | 0.0 | 0.00 +Modify | 0.071444 | 0.071444 | 0.071444 | 0.0 | 0.11 +Other | | 0.005964 | | | 0.01 + +Nlocal: 4000 ave 4000 max 4000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 5499 ave 5499 max 5499 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 151513 ave 151513 max 151513 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 151513 +Ave neighs/atom = 37.8783 +Neighbor list builds = 12 +Dangerous builds not checked + +write_data melt.data +write_restart melt.restart + +clear +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task + +read_restart melt.restart + orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 1 by 1 MPI processor grid + 4000 atoms + +pair_style python 2.5 +pair_coeff * * lj-melt-potential.py lj + +fix 1 all nve + +thermo 50 +run 250 +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 = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair python, 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.36 | 3.36 | 3.36 Mbytes +Step Temp E_pair E_mol TotEng Press + 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 + 300 1.645592 -4.7496711 0 -2.2819002 5.8734193 + 350 1.6514972 -4.7580756 0 -2.2814491 5.810167 + 400 1.6540555 -4.7622999 0 -2.281837 5.8200413 + 450 1.6264734 -4.7200865 0 -2.2809863 5.9546991 + 500 1.6366891 -4.7350979 0 -2.2806781 5.9369284 +Loop time of 62.6472 on 1 procs for 250 steps with 4000 atoms + +Performance: 1723.939 tau/day, 3.991 timesteps/s +31.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 | 61.994 | 61.994 | 61.994 | 0.0 | 98.96 +Neigh | 0.519 | 0.519 | 0.519 | 0.0 | 0.83 +Comm | 0.052574 | 0.052574 | 0.052574 | 0.0 | 0.08 +Output | 0.000804 | 0.000804 | 0.000804 | 0.0 | 0.00 +Modify | 0.071878 | 0.071878 | 0.071878 | 0.0 | 0.11 +Other | | 0.009016 | | | 0.01 + +Nlocal: 4000 ave 4000 max 4000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 5472 ave 5472 max 5472 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 151513 ave 151513 max 151513 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 151513 +Ave neighs/atom = 37.8783 +Neighbor list builds = 25 +Dangerous builds = 25 + +clear +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task + +units lj +atom_style atomic + +read_data melt.data + orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 4000 atoms + reading velocities ... + 4000 velocities + +pair_style python 2.5 +pair_coeff * * lj-melt-potential.py lj + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair python, 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) = 2.86 | 2.86 | 2.86 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1.6275257 -4.7224992 0 -2.281821 5.9567365 + 50 1.6454666 -4.7497515 0 -2.2821686 5.8729175 + 100 1.6512008 -4.7582693 0 -2.2820874 5.8090548 + 150 1.6537193 -4.7627023 0 -2.2827434 5.8177704 + 200 1.6258731 -4.7205017 0 -2.2823017 5.952511 + 250 1.6370862 -4.7373176 0 -2.2823022 5.925807 +Loop time of 62.6778 on 1 procs for 250 steps with 4000 atoms + +Performance: 1723.098 tau/day, 3.989 timesteps/s +31.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 | 62.298 | 62.298 | 62.298 | 0.0 | 99.39 +Neigh | 0.25251 | 0.25251 | 0.25251 | 0.0 | 0.40 +Comm | 0.04911 | 0.04911 | 0.04911 | 0.0 | 0.08 +Output | 0.000797 | 0.000797 | 0.000797 | 0.0 | 0.00 +Modify | 0.071729 | 0.071729 | 0.071729 | 0.0 | 0.11 +Other | | 0.005419 | | | 0.01 + +Nlocal: 4000 ave 4000 max 4000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 5487 ave 5487 max 5487 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 151490 ave 151490 max 151490 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 151490 +Ave neighs/atom = 37.8725 +Neighbor list builds = 12 +Dangerous builds not checked + +shell rm melt.data melt.restart +Total wall time: 0:03:12 diff --git a/examples/python/log.4May2017.pair_python_melt.g++.4 b/examples/python/log.4May2017.pair_python_melt.g++.4 new file mode 100644 index 0000000000..e7c6ffa8eb --- /dev/null +++ b/examples/python/log.4May2017.pair_python_melt.g++.4 @@ -0,0 +1,217 @@ +LAMMPS (4 May 2017) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic + +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 1 box +Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 2 by 2 MPI processor grid +create_atoms 1 box +Created 4000 atoms +mass * 1.0 + +velocity all create 3.0 87287 + +pair_style python 2.5 +pair_coeff * * lj-melt-potential.py lj + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair python, 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) = 2.69 | 2.69 | 2.69 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 3 -6.7733681 0 -2.2744931 -3.7033504 + 50 1.6754119 -4.7947589 0 -2.2822693 5.6615925 + 100 1.6503357 -4.756014 0 -2.2811293 5.8050524 + 150 1.6596605 -4.7699432 0 -2.2810749 5.7830138 + 200 1.6371874 -4.7365462 0 -2.2813789 5.9246674 + 250 1.6323462 -4.7292021 0 -2.2812949 5.9762238 +Loop time of 18.0035 on 4 procs for 250 steps with 4000 atoms + +Performance: 5998.838 tau/day, 13.886 timesteps/s +31.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 | 16.784 | 17.18 | 17.611 | 8.9 | 95.43 +Neigh | 0.066257 | 0.066613 | 0.066967 | 0.1 | 0.37 +Comm | 0.31192 | 0.74265 | 1.1386 | 42.7 | 4.13 +Output | 0.000344 | 0.00076 | 0.001983 | 0.0 | 0.00 +Modify | 0.010618 | 0.010763 | 0.010947 | 0.1 | 0.06 +Other | | 0.00278 | | | 0.02 + +Nlocal: 1000 ave 1010 max 982 min +Histogram: 1 0 0 0 0 0 1 0 0 2 +Nghost: 2703.75 ave 2713 max 2689 min +Histogram: 1 0 0 0 0 0 0 2 0 1 +Neighs: 37915.5 ave 39239 max 36193 min +Histogram: 1 0 0 0 0 1 1 0 0 1 + +Total # of neighbors = 151662 +Ave neighs/atom = 37.9155 +Neighbor list builds = 12 +Dangerous builds not checked + +write_data melt.data +write_restart melt.restart + +clear +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task + +read_restart melt.restart + orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 2 by 2 MPI processor grid + 4000 atoms + +pair_style python 2.5 +pair_coeff * * lj-melt-potential.py lj + +fix 1 all nve + +thermo 50 +run 250 +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 = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair python, 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) = 2.815 | 2.816 | 2.816 Mbytes +Step Temp E_pair E_mol TotEng Press + 250 1.6323462 -4.7292062 0 -2.2812991 5.9762168 + 300 1.6451788 -4.7488091 0 -2.2816578 5.8375485 + 350 1.6171909 -4.7064928 0 -2.2813129 6.0094235 + 400 1.6388136 -4.7387093 0 -2.2811035 5.9331084 + 450 1.6431295 -4.7452215 0 -2.2811435 5.8929898 + 500 1.643316 -4.7454222 0 -2.2810644 5.8454817 +Loop time of 17.8516 on 4 procs for 250 steps with 4000 atoms + +Performance: 6049.891 tau/day, 14.004 timesteps/s +31.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 | 16.549 | 17.138 | 17.615 | 9.3 | 96.00 +Neigh | 0.1326 | 0.13573 | 0.13709 | 0.5 | 0.76 +Comm | 0.083467 | 0.56179 | 1.1533 | 51.4 | 3.15 +Output | 0.000353 | 0.000703 | 0.00173 | 0.0 | 0.00 +Modify | 0.011229 | 0.011437 | 0.011847 | 0.2 | 0.06 +Other | | 0.004124 | | | 0.02 + +Nlocal: 1000 ave 1012 max 983 min +Histogram: 1 0 0 0 0 0 2 0 0 1 +Nghost: 2699 ave 2706 max 2693 min +Histogram: 1 1 0 0 0 0 1 0 0 1 +Neighs: 37930.8 ave 39292 max 36264 min +Histogram: 1 0 0 0 1 0 0 1 0 1 + +Total # of neighbors = 151723 +Ave neighs/atom = 37.9308 +Neighbor list builds = 25 +Dangerous builds = 25 + +clear +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task + +units lj +atom_style atomic + +read_data melt.data + orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 4000 atoms + reading velocities ... + 4000 velocities + +pair_style python 2.5 +pair_coeff * * lj-melt-potential.py lj + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair python, 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) = 2.315 | 2.316 | 2.316 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1.6323462 -4.7292062 0 -2.2812991 5.9762168 + 50 1.6450626 -4.7488948 0 -2.2819177 5.8370409 + 100 1.6169004 -4.7066969 0 -2.2819526 6.0082546 + 150 1.6384234 -4.7389689 0 -2.2819482 5.9315273 + 200 1.6428814 -4.7460743 0 -2.2823683 5.8888228 + 250 1.6432631 -4.7466603 0 -2.2823818 5.8398819 +Loop time of 17.5277 on 4 procs for 250 steps with 4000 atoms + +Performance: 6161.664 tau/day, 14.263 timesteps/s +31.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 | 16.46 | 17.032 | 17.348 | 8.3 | 97.17 +Neigh | 0.063784 | 0.06495 | 0.065515 | 0.3 | 0.37 +Comm | 0.10004 | 0.41613 | 0.98807 | 53.0 | 2.37 +Output | 0.000331 | 0.00081525 | 0.002223 | 0.0 | 0.00 +Modify | 0.010998 | 0.011169 | 0.011264 | 0.1 | 0.06 +Other | | 0.002774 | | | 0.02 + +Nlocal: 1000 ave 1013 max 989 min +Histogram: 1 0 0 1 0 1 0 0 0 1 +Nghost: 2695.5 ave 2706 max 2682 min +Histogram: 1 0 0 0 0 0 2 0 0 1 +Neighs: 37927.2 ave 39002 max 36400 min +Histogram: 1 0 0 0 1 0 0 0 0 2 + +Total # of neighbors = 151709 +Ave neighs/atom = 37.9273 +Neighbor list builds = 12 +Dangerous builds not checked + +shell rm melt.data melt.restart +Total wall time: 0:00:55 From 64cf52d3b557e846326951e7d8daecc475232f4f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 15 May 2017 15:55:15 -0400 Subject: [PATCH 013/302] address spline out-of-bounds bug reported in issue #59 and refactor high-level spline code for consistency and efficiency --- src/MANYBODY/pair_airebo.cpp | 297 ++++++++++++++--------------------- 1 file changed, 120 insertions(+), 177 deletions(-) diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index abf75c85c5..95af9d9c4b 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -3094,72 +3094,54 @@ double PairAIREBO::gSpline(double costh, double Nij, int typei, double PairAIREBO::PijSpline(double NijC, double NijH, int typei, int typej, double dN2[2]) { - int x,y,i,done; - double Pij,coeffs[16]; - - for (i = 0; i < 16; i++) coeffs[i]=0.0; + int x,y; + double Pij; x = 0; y = 0; dN2[0] = 0.0; dN2[1] = 0.0; - done = 0; + Pij = 0.0; - // if inputs are out of bounds set them back to a point in bounds + if (typei == 1) return Pij; - if (typei == 0 && typej == 0) { - if (NijC < pCCdom[0][0]) NijC=pCCdom[0][0]; - if (NijC > pCCdom[0][1]) NijC=pCCdom[0][1]; - if (NijH < pCCdom[1][0]) NijH=pCCdom[1][0]; - if (NijH > pCCdom[1][1]) NijH=pCCdom[1][1]; + if (typej == 0) { + + // if inputs are out of bounds set them back to a point in bounds + + if (NijC < pCCdom[0][0]) NijC=pCCdom[0][0]; + if (NijC >= pCCdom[0][1]) NijC=pCCdom[0][1]-TOL; + if (NijH < pCCdom[1][0]) NijH=pCCdom[1][0]; + if (NijH >= pCCdom[1][1]) NijH=pCCdom[1][1]-TOL; + x = (int) floor(NijC); + y = (int) floor(NijH); if (fabs(NijC-floor(NijC)) < TOL && fabs(NijH-floor(NijH)) < TOL) { - Pij = PCCf[(int) NijC][(int) NijH]; - dN2[0] = PCCdfdx[(int) NijC][(int) NijH]; - dN2[1] = PCCdfdy[(int) NijC][(int) NijH]; - done = 1; + Pij = PCCf[x][y]; + dN2[0] = PCCdfdx[x][y]; + dN2[1] = PCCdfdy[x][y]; + } else { + Pij = Spbicubic(NijC,NijH,pCC[x][y],dN2); } - if (done == 0) { - x = (int) (floor(NijC)); - y = (int) (floor(NijH)); - for (i = 0; i<16; i++) coeffs[i] = pCC[x][y][i]; - Pij = Spbicubic(NijC,NijH,coeffs,dN2); - } - } - // if inputs are out of bounds set them back to a point in bounds + } else if (typej == 1) { - if (typei == 0 && typej == 1){ - if (NijC < pCHdom[0][0]) NijC=pCHdom[0][0]; - if (NijC > pCHdom[0][1]) NijC=pCHdom[0][1]; - if (NijH < pCHdom[1][0]) NijH=pCHdom[1][0]; - if (NijH > pCHdom[1][1]) NijH=pCHdom[1][1]; + // if inputs are out of bounds set them back to a point in bounds + + if (NijC < pCHdom[0][0]) NijC=pCHdom[0][0]; + if (NijC >= pCHdom[0][1]) NijC=pCHdom[0][1]-TOL; + if (NijH < pCHdom[1][0]) NijH=pCHdom[1][0]; + if (NijH >= pCHdom[1][1]) NijH=pCHdom[1][1]-TOL; + x = (int) floor(NijC); + y = (int) floor(NijH); if (fabs(NijC-floor(NijC)) < TOL && fabs(NijH-floor(NijH)) < TOL) { - Pij = PCHf[(int) NijC][(int) NijH]; - dN2[0] = PCHdfdx[(int) NijC][(int) NijH]; - dN2[1] = PCHdfdy[(int) NijC][(int) NijH]; - done = 1; + Pij = PCHf[x][y]; + dN2[0] = PCHdfdx[x][y]; + dN2[1] = PCHdfdy[x][y]; + } else { + Pij = Spbicubic(NijC,NijH,pCH[x][y],dN2); } - if (done == 0) { - x = (int) (floor(NijC)); - y = (int) (floor(NijH)); - for (i = 0; i<16; i++) coeffs[i] = pCH[x][y][i]; - Pij = Spbicubic(NijC,NijH,coeffs,dN2); - } - } - - if (typei == 1 && typej == 0) { - Pij = 0.0; - dN2[0] = 0.0; - dN2[1] = 0.0; - } - - - if (typei == 1 && typej == 1) { - Pij = 0.0; - dN2[0] = 0.0; - dN2[1] = 0.0; } return Pij; } @@ -3171,115 +3153,84 @@ double PairAIREBO::PijSpline(double NijC, double NijH, int typei, int typej, double PairAIREBO::piRCSpline(double Nij, double Nji, double Nijconj, int typei, int typej, double dN3[3]) { - int x,y,z,i,done; - double piRC,coeffs[64]; + int x,y,z; + double piRC; x=0; y=0; z=0; - i=0; - - done=0; - - for (i=0; i<64; i++) coeffs[i]=0.0; + dN3[0]=0.0; + dN3[1]=0.0; + dN3[2]=0.0; if (typei==0 && typej==0) { - // if the inputs are out of bounds set them back to a point in bounds - - if (NijpiCCdom[0][1]) Nij=piCCdom[0][1]; - if (NjipiCCdom[1][1]) Nji=piCCdom[1][1]; - if (NijconjpiCCdom[2][1]) Nijconj=piCCdom[2][1]; - - if (fabs(Nij-floor(Nij))=(double) i && Nij<=(double) i+1) x=i; - for (i=0; i=(double) i && Nji<=(double) i+1) y=i; - for (i=0; i=(double) i && Nijconj<=(double) i+1) z=i; - - for (i=0; i<64; i++) coeffs[i]=piCC[x][y][z][i]; - piRC=Sptricubic(Nij,Nji,Nijconj,coeffs,dN3); - } - } - - // CH interaction - - if ((typei==0 && typej==1) || (typei==1 && typej==0)) { + // CC interaction // if the inputs are out of bounds set them back to a point in bounds - if (NijpiCHdom[0][1] || - NjipiCHdom[1][1] || - NijconjpiCHdom[2][1]) { - if (NijpiCHdom[0][1]) Nij=piCHdom[0][1]; - if (NjipiCHdom[1][1]) Nji=piCHdom[1][1]; - if (NijconjpiCHdom[2][1]) Nijconj=piCHdom[2][1]; + if (Nij < piCCdom[0][0]) Nij=piCCdom[0][0]; + if (Nij >= piCCdom[0][1]) Nij=piCCdom[0][1]-TOL; + if (Nji < piCCdom[1][0]) Nji=piCCdom[1][0]; + if (Nji >= piCCdom[1][1]) Nji=piCCdom[1][1]-TOL; + if (Nijconj < piCCdom[2][0]) Nijconj=piCCdom[2][0]; + if (Nijconj >= piCCdom[2][1]) Nijconj=piCCdom[2][1]-TOL; + x = (int) floor(Nij); + y = (int) floor(Nji); + z = (int) floor(Nijconj); + + if (fabs(Nij-floor(Nij)) < TOL && fabs(Nji-floor(Nji)) < TOL + && fabs(Nijconj-floor(Nijconj)) < TOL) { + piRC=piCCf[x][y][z]; + dN3[0]=piCCdfdx[x][y][z]; + dN3[1]=piCCdfdy[x][y][z]; + dN3[2]=piCCdfdz[x][y][z]; + } else { + piRC=Sptricubic(Nij,Nji,Nijconj,piCC[x][y][z],dN3); } + } else if ((typei==0 && typej==1) || (typei==1 && typej==0)) { + + // CH interaction + + // if the inputs are out of bounds set them back to a point in bounds + + if (Nij < piCHdom[0][0]) Nij=piCHdom[0][0]; + if (Nij >= piCHdom[0][1]) Nij=piCHdom[0][1]-TOL; + if (Nji < piCHdom[1][0]) Nji=piCHdom[1][0]; + if (Nji >= piCHdom[1][1]) Nji=piCHdom[1][1]-TOL; + if (Nijconj < piCHdom[2][0]) Nijconj=piCHdom[2][0]; + if (Nijconj >= piCHdom[2][1]) Nijconj=piCHdom[2][1]-TOL; + x = (int) floor(Nij); + y = (int) floor(Nji); + z = (int) floor(Nijconj); + + if (fabs(Nij-floor(Nij)) < TOL && fabs(Nji-floor(Nji)) < TOL + && fabs(Nijconj-floor(Nijconj)) < TOL) { + piRC=piCHf[x][y][z]; + dN3[0]=piCHdfdx[x][y][z]; + dN3[1]=piCHdfdy[x][y][z]; + dN3[2]=piCHdfdz[x][y][z]; + } else { + piRC=Sptricubic(Nij,Nji,Nijconj,piCH[x][y][z],dN3); + } + } else if (typei==1 && typej==1) { + if (Nij < piHHdom[0][0]) Nij=piHHdom[0][0]; + if (Nij >= piHHdom[0][1]) Nij=piHHdom[0][1]-TOL; + if (Nji < piHHdom[1][0]) Nji=piHHdom[1][0]; + if (Nji >= piHHdom[1][1]) Nji=piHHdom[1][1]-TOL; + if (Nijconj < piHHdom[2][0]) Nijconj=piHHdom[2][0]; + if (Nijconj >= piHHdom[2][1]) Nijconj=piHHdom[2][1]-TOL; + x = (int) floor(Nij); + y = (int) floor(Nji); + z = (int) floor(Nijconj); if (fabs(Nij-floor(Nij))=i && Nij<=i+1) x=i; - for (i=0; i=i && Nji<=i+1) y=i; - for (i=0; i=i && Nijconj<=i+1) z=i; - - for (i=0; i<64; i++) coeffs[i]=piCH[x][y][z][i]; - piRC=Sptricubic(Nij,Nji,Nijconj,coeffs,dN3); - } - } - - if (typei==1 && typej==1) { - if (NijpiHHdom[0][1] || - NjipiHHdom[1][1] || - NijconjpiHHdom[2][1]) { - Nij=0.0; - Nji=0.0; - Nijconj=0.0; - } - if (fabs(Nij-floor(Nij))=i && Nij<=i+1) x=i; - for (i=0; i=i && Nji<=i+1) y=i; - for (i=0; i=i && Nijconj<=i+1) z=i; - - for (i=0; i<64; i++) coeffs[i]=piHH[x][y][z][i]; - piRC=Sptricubic(Nij,Nji,Nijconj,coeffs,dN3); + piRC=piHHf[x][y][z]; + dN3[0]=piHHdfdx[x][y][z]; + dN3[1]=piHHdfdy[x][y][z]; + dN3[2]=piHHdfdz[x][y][z]; + } else { + piRC=Sptricubic(Nij,Nji,Nijconj,piHH[x][y][z],dN3); } } @@ -3293,45 +3244,37 @@ double PairAIREBO::piRCSpline(double Nij, double Nji, double Nijconj, double PairAIREBO::TijSpline(double Nij, double Nji, double Nijconj, double dN3[3]) { - int x,y,z,i,done; - double Tijf,coeffs[64]; + int x,y,z; + double Tijf; x=0; y=0; z=0; - i=0; Tijf=0.0; - done=0; - for (i=0; i<64; i++) coeffs[i]=0.0; + dN3[0]=0.0; + dN3[1]=0.0; + dN3[2]=0.0; //if the inputs are out of bounds set them back to a point in bounds - if (NijTijdom[0][1]) Nij=Tijdom[0][1]; - if (NjiTijdom[1][1]) Nji=Tijdom[1][1]; - if (NijconjTijdom[2][1]) Nijconj=Tijdom[2][1]; + if (Nij < Tijdom[0][0]) Nij=Tijdom[0][0]; + if (Nij >= Tijdom[0][1]) Nij=Tijdom[0][1]-TOL; + if (Nji < Tijdom[1][0]) Nji=Tijdom[1][0]; + if (Nji >= Tijdom[1][1]) Nji=Tijdom[1][1]-TOL; + if (Nijconj < Tijdom[2][0]) Nijconj=Tijdom[2][0]; + if (Nijconj >= Tijdom[2][1]) Nijconj=Tijdom[2][1]-TOL; + x = (int) floor(Nij); + y = (int) floor(Nji); + z = (int) floor(Nijconj); - if (fabs(Nij-floor(Nij))=i && Nij<=i+1) x=i; - for (i=0; i=i && Nji<=i+1) y=i; - for (i=0; i=i && Nijconj<=i+1) z=i; - - for (i=0; i<64; i++) coeffs[i]=Tijc[x][y][z][i]; - Tijf=Sptricubic(Nij,Nji,Nijconj,coeffs,dN3); + if (fabs(Nij-floor(Nij)) < TOL && fabs(Nji-floor(Nji)) < TOL + && fabs(Nijconj-floor(Nijconj)) < TOL) { + Tijf=Tf[x][y][z]; + dN3[0]=Tdfdx[x][y][z]; + dN3[1]=Tdfdy[x][y][z]; + dN3[2]=Tdfdz[x][y][z]; + } else { + Tijf=Sptricubic(Nij,Nji,Nijconj,Tijc[x][y][z],dN3); } return Tijf; From fb7164a8110b06656945d400cb739fdc310078b6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 15 May 2017 16:16:01 -0400 Subject: [PATCH 014/302] replace pow(x,-0.5) with 1.0/sqrt(x) --- src/MANYBODY/pair_airebo.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index 95af9d9c4b..71c206883c 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -1335,7 +1335,7 @@ double PairAIREBO::bondorder(int i, int j, double rij[3], dN2[0] = 0.0; dN2[1] = 0.0; PijS = PijSpline(NijC,NijH,itype,jtype,dN2); - pij = pow(1.0+Etmp+PijS,-0.5); + pij = 1.0/sqrt(1.0+Etmp+PijS); tmp = -0.5*cube(pij); // pij forces @@ -1480,7 +1480,7 @@ double PairAIREBO::bondorder(int i, int j, double rij[3], dN2[0] = 0.0; dN2[1] = 0.0; PjiS = PijSpline(NjiC,NjiH,jtype,itype,dN2); - pji = pow(1.0+Etmp+PjiS,-0.5); + pji = 1.0/sqrt(1.0+Etmp+PjiS); tmp = -0.5*cube(pji); REBO_neighs = REBO_firstneigh[j]; @@ -2171,7 +2171,7 @@ double PairAIREBO::bondorderLJ(int i, int j, double rij[3], double rijmag, dN2PIJ[0] = 0.0; dN2PIJ[1] = 0.0; PijS = PijSpline(NijC,NijH,itype,jtype,dN2PIJ); - pij = pow(1.0+Etmp+PijS,-0.5); + pij = 1.0/sqrt(1.0+Etmp+PijS); tmppij = -.5*cube(pij); tmp3pij = tmp3; tmp = 0.0; @@ -2211,7 +2211,7 @@ double PairAIREBO::bondorderLJ(int i, int j, double rij[3], double rijmag, dN2PJI[0] = 0.0; dN2PJI[1] = 0.0; PjiS = PijSpline(NjiC,NjiH,jtype,itype,dN2PJI); - pji = pow(1.0+Etmp+PjiS,-0.5); + pji = 1.0/sqrt(1.0+Etmp+PjiS); tmppji = -.5*cube(pji); tmp3pji = tmp3; From eb6f6a77e5cc1ac1c0cbe4102e1fa88a383068be Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 15 May 2017 16:16:12 -0400 Subject: [PATCH 015/302] dead code removal --- src/MANYBODY/pair_airebo.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index 71c206883c..6c9e7065de 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -2080,9 +2080,7 @@ double PairAIREBO::bondorderLJ(int i, int j, double rij[3], double rijmag, double rikmag,rjlmag,cosjik,cosijl,g,tmp2,tmp3; double Etmp,pij,tmp,wij,dwij,NconjtmpI,NconjtmpJ; double Nki,Nlj,dS,lamdajik,lamdaijl,dgdc,dgdN,pji,Nijconj,piRC; - double dcosjikdri[3],dcosijldri[3],dcosjikdrk[3]; - double dN2[2],dN3[3]; - double dcosijldrj[3],dcosijldrl[3],dcosjikdrj[3],dwjl; + double dN2[2],dN3[3],dwjl; double Tij,crosskij[3],crosskijmag; double crossijl[3],crossijlmag,omkijl; double tmppij,tmppji,dN2PIJ[2],dN2PJI[2],dN3piRC[3],dN3Tij[3]; @@ -2092,16 +2090,16 @@ double PairAIREBO::bondorderLJ(int i, int j, double rij[3], double rijmag, double rlnmag,dwln,r23[3],r23mag,r21[3],r21mag; double w21,dw21,r34[3],r34mag,cos234,w34,dw34; double cross321[3],cross234[3],prefactor,SpN; - double fcijpc,fcikpc,fcjlpc,fcjkpc,fcilpc; - double dt2dik[3],dt2djl[3],dt2dij[3],aa,aaa1,aaa2,at2,cw,cwnum,cwnom; + double fcikpc,fcjlpc,fcjkpc,fcilpc; + double dt2dik[3],dt2djl[3],aa,aaa1,aaa2,at2,cw,cwnum,cwnom; double sin321,sin234,rr,rijrik,rijrjl,rjk2,rik2,ril2,rjl2; - double dctik,dctjk,dctjl,dctij,dctji,dctil,rik2i,rjl2i,sink2i,sinl2i; - double rjk[3],ril[3],dt1dik,dt1djk,dt1djl,dt1dil,dt1dij; + double dctik,dctjk,dctjl,dctil,rik2i,rjl2i,sink2i,sinl2i; + double rjk[3],ril[3],dt1dik,dt1djk,dt1djl,dt1dil; double dNlj; double PijS,PjiS; double rij2,tspjik,dtsjik,tspijl,dtsijl,costmp; int *REBO_neighs,*REBO_neighs_i,*REBO_neighs_j,*REBO_neighs_k,*REBO_neighs_l; - double F12[3],F23[3],F34[3],F31[3],F24[3]; + double F12[3],F34[3],F31[3],F24[3]; double fi[3],fj[3],fk[3],fl[3],f1[3],f2[3],f3[3],f4[4]; double rji[3],rki[3],rlj[3],r13[3],r43[3]; double realrij[3], realrijmag; From 0a40a7af7befd7782ab7d9530271cde7cbcdfa8c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 15 May 2017 17:00:41 -0400 Subject: [PATCH 016/302] whitespace cleanup --- src/MANYBODY/pair_airebo.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index 6c9e7065de..00108e7f2d 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -158,7 +158,7 @@ void PairAIREBO::settings(int narg, char **arg) // this one parameter for C-C interactions is different in AIREBO vs REBO // see Favata, Micheletti, Ryu, Pugno, Comp Phys Comm (2016) - + PCCf_2_0 = -0.0276030; } @@ -2134,7 +2134,7 @@ double PairAIREBO::bondorderLJ(int i, int j, double rij[3], double rijmag, realrij[0] = x[atomi][0] - x[atomj][0]; realrij[1] = x[atomi][1] - x[atomj][1]; realrij[2] = x[atomi][2] - x[atomj][2]; - realrijmag = sqrt(realrij[0] * realrij[0] + realrij[1] * realrij[1] + realrijmag = sqrt(realrij[0] * realrij[0] + realrij[1] * realrij[1] + realrij[2] * realrij[2]); REBO_neighs = REBO_firstneigh[i]; @@ -2479,7 +2479,7 @@ double PairAIREBO::bondorderLJ(int i, int j, double rij[3], double rijmag, fj[1] -= rijmbr * (fil[1] - (realrij[1] * realrij[0] * fil[0] + realrij[1] * realrij[1] * fil[1] + realrij[1] * realrij[2] * fil[2]) / (realrijmag * realrijmag)); fj[2] -= rijmbr * (fil[2] - (realrij[2] * realrij[0] * fil[0] + realrij[2] * realrij[1] * fil[1] + realrij[2] * realrij[2] * fil[2]) / (realrijmag * realrijmag)); - + tmp2 = VA*.5*(tmp*wjl*g*exp(lamdaijl)*4.0*kronecker(jtype,1)); fj[0] += tmp2*(rjl[0]/rjlmag); fj[1] += tmp2*(rjl[1]/rjlmag); From 93cc6f4a5def8e3451d38f937df5aac2b0098adb Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 15 May 2017 17:34:48 -0400 Subject: [PATCH 017/302] Use in syntax for key lookup for Python 3 compatibility --- examples/python/lj-melt-potential.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/python/lj-melt-potential.py b/examples/python/lj-melt-potential.py index fb544f90b8..41fa073ebd 100644 --- a/examples/python/lj-melt-potential.py +++ b/examples/python/lj-melt-potential.py @@ -12,7 +12,7 @@ class LAMMPSLJCutPotential(object): 'NULL': (0.0,1.0, 0.0, 0.0,0.0,0.0)}} def map_coeff(self,name,type): - if self.coeff.has_key(name): + if name in self.coeff: self.pmap[type] = name else: raise Exception("cannot match atom type %s" % name) From d9d4ef17c806e2b620f2e5fe9f83abc1de2f4527 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 15 May 2017 17:44:25 -0400 Subject: [PATCH 018/302] add gao-weber potentials (regular and with ZBL core) with SiC potential files NOTE: documentation is missing --- potentials/SiC.gw | 19 + potentials/SiC.gw.zbl | 19 + src/MANYBODY/pair_gw.cpp | 763 +++++++++++++++++++++++++++++++++++ src/MANYBODY/pair_gw.h | 196 +++++++++ src/MANYBODY/pair_gw_zbl.cpp | 287 +++++++++++++ src/MANYBODY/pair_gw_zbl.h | 72 ++++ 6 files changed, 1356 insertions(+) create mode 100644 potentials/SiC.gw create mode 100644 potentials/SiC.gw.zbl create mode 100644 src/MANYBODY/pair_gw.cpp create mode 100644 src/MANYBODY/pair_gw.h create mode 100644 src/MANYBODY/pair_gw_zbl.cpp create mode 100644 src/MANYBODY/pair_gw_zbl.h diff --git a/potentials/SiC.gw b/potentials/SiC.gw new file mode 100644 index 0000000000..1c14e3a53e --- /dev/null +++ b/potentials/SiC.gw @@ -0,0 +1,19 @@ +# DATE: 2016-05-06 CONTRIBUTOR: German Samolyuk, samolyuk@gmail.com CITATION: ??? +# Gao-Weber parameters for various elements and mixtures +# multiple entries can be added to this file, LAMMPS reads the ones it needs +# these entries are in LAMMPS "metal" units: + +# format of a single entry (one or more lines): +# element 1, element 2, element 3, +# m, gamma, lambda3, c, d, h, n, beta, lambda2, X_ij*B, R, D, lambda1, A + +#E1 E2 E3 m gamma lambda3 c d h n beta lambda2 B R D lambda1 A + +Si Si Si 1 0.013318 0 14 2.1 -1 0.78000 1 1.80821400248640 632.658058300867 2.35 0.15 2.38684248328205 1708.79738703139 +Si Si C 1 0.013318 0 14 2.1 -1 0.78000 1 1.80821400248640 632.658058300867 2.35 0.15 2.38684248328205 1708.79738703139 +Si C Si 1 0.013318 0 14 2.1 -1 0.78000 1 1.96859970919818 428.946015420752 2.35 0.15 3.03361215187440 1820.05673775234 +C Si Si 1 0.011304 0 19 2.5 -1 0.80468 1 1.96859970919818 428.946015420752 2.35 0.15 3.03361215187440 1820.05673775234 +C C Si 1 0.011304 0 19 2.5 -1 0.80469 1 1.76776695296637 203.208547714849 2.35 0.15 2.54558441227157 458.510465798439 +C Si C 1 0.011304 0 19 2.5 -1 0.80469 1 1.96859970919818 428.946015420752 2.35 0.15 3.03361215187440 1820.05673775234 +Si C C 1 0.013318 0 14 2.1 -1 0.78000 1 1.96859970919818 428.946015420752 2.35 0.15 3.03361215187440 1820.05673775234 +C C C 1 0.011304 0 19 2.5 -1 0.80469 1 1.76776695296637 203.208547714849 2.35 0.15 2.54558441227157 458.510465798439 diff --git a/potentials/SiC.gw.zbl b/potentials/SiC.gw.zbl new file mode 100644 index 0000000000..8129763b10 --- /dev/null +++ b/potentials/SiC.gw.zbl @@ -0,0 +1,19 @@ +# DATE: 2016-05-06 CONTRIBUTOR: German Samolyuk, samolyuk@gmail.com CITATION: ??? +# Gao-Weber parameters for various elements and mixtures +# multiple entries can be added to this file, LAMMPS reads the ones it needs +# these entries are in LAMMPS "metal" units: + +# format of a single entry (one or more lines): +# element 1, element 2, element 3, +# m, gamma, lambda3, c, d, h, n, beta, lambda2, X_ij*B, R, D, lambda1, A + +#E1 E2 E3 m gamma lambda3 c d h n beta lambda2 B R D lambda1 A Z_i, Z_j, ZBLcut, ZBLexpscale + +Si Si Si 1 0.013318 0 14 2.1 -1 0.78000 1 1.80821400248640 632.658058300867 2.35 0.15 2.38684248328205 1708.79738703139 14 14 .95 14 +Si Si C 1 0.013318 0 14 2.1 -1 0.78000 1 1.80821400248640 632.658058300867 2.35 0.15 2.38684248328205 1708.79738703139 14 14 .95 14 +Si C Si 1 0.013318 0 14 2.1 -1 0.78000 1 1.96859970919818 428.946015420752 2.35 0.15 3.03361215187440 1820.05673775234 14 6 .95 14 +C Si Si 1 0.011304 0 19 2.5 -1 0.80468 1 1.96859970919818 428.946015420752 2.35 0.15 3.03361215187440 1820.05673775234 6 14 .95 14 +C C Si 1 0.011304 0 19 2.5 -1 0.80469 1 1.76776695296637 203.208547714849 2.35 0.15 2.54558441227157 458.510465798439 6 6 .95 14 +C Si C 1 0.011304 0 19 2.5 -1 0.80469 1 1.96859970919818 428.946015420752 2.35 0.15 3.03361215187440 1820.05673775234 6 14 .95 14 +Si C C 1 0.013318 0 14 2.1 -1 0.78000 1 1.96859970919818 428.946015420752 2.35 0.15 3.03361215187440 1820.05673775234 14 6 .95 14 +C C C 1 0.011304 0 19 2.5 -1 0.80469 1 1.76776695296637 203.208547714849 2.35 0.15 2.54558441227157 458.510465798439 6 6 .95 14 diff --git a/src/MANYBODY/pair_gw.cpp b/src/MANYBODY/pair_gw.cpp new file mode 100644 index 0000000000..e4090dbed2 --- /dev/null +++ b/src/MANYBODY/pair_gw.cpp @@ -0,0 +1,763 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: German Samolyuk (ORNL) + based on PairTersoff by Aidan Thompson (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_gw.h" +#include "atom.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "force.h" +#include "comm.h" +#include "memory.h" +#include "error.h" + +#include "math_const.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define MAXLINE 1024 +#define DELTA 4 + +/* ---------------------------------------------------------------------- */ + +PairGW::PairGW(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 0; + restartinfo = 0; + one_coeff = 1; + manybody_flag = 1; + + nelements = 0; + elements = NULL; + nparams = maxparam = 0; + params = NULL; + elem2param = NULL; + map = NULL; +} + +/* ---------------------------------------------------------------------- + check if allocated, since class can be destructed when incomplete +------------------------------------------------------------------------- */ + +PairGW::~PairGW() +{ + if (elements) + for (int i = 0; i < nelements; i++) delete [] elements[i]; + delete [] elements; + memory->destroy(params); + memory->destroy(elem2param); + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + delete [] map; + } +} + +/* ---------------------------------------------------------------------- */ + +void PairGW::compute(int eflag, int vflag) +{ + int i,j,k,ii,jj,kk,inum,jnum; + int itag,jtag,itype,jtype,ktype,iparam_ij,iparam_ijk; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double rsq,rsq1,rsq2; + double delr1[3],delr2[3],fi[3],fj[3],fk[3]; + double zeta_ij, prefactor; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = vflag_atom = 0; + + double **x = atom->x; + double **f = atom->f; + tagint *tag = atom->tag; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over full neighbor list of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + itag = tag[i]; + itype = map[type[i]]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + // two-body interactions, skip half of them + + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtag = tag[j]; + + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) continue; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) continue; + } else { + if (x[j][2] < x[i][2]) continue; + if (x[j][2] == ztmp && x[j][1] < ytmp) continue; + if (x[j][2] == ztmp && x[j][1] == ytmp && x[j][0] < xtmp) continue; + } + + jtype = map[type[j]]; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + iparam_ij = elem2param[itype][jtype][jtype]; + if (rsq > params[iparam_ij].cutsq) continue; + + repulsive(¶ms[iparam_ij],rsq,fpair,eflag,evdwl); + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,0.0,fpair,delx,dely,delz); + } + + // three-body interactions + // skip immediately if I-J is not within cutoff + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtype = map[type[j]]; + iparam_ij = elem2param[itype][jtype][jtype]; + + delr1[0] = x[j][0] - xtmp; + delr1[1] = x[j][1] - ytmp; + delr1[2] = x[j][2] - ztmp; + rsq1 = delr1[0]*delr1[0] + delr1[1]*delr1[1] + delr1[2]*delr1[2]; + if (rsq1 > params[iparam_ij].cutsq) continue; + + // accumulate bondorder zeta for each i-j interaction via loop over k + + zeta_ij = 1.0; + + for (kk = 0; kk < jnum; kk++) { + if (jj == kk) continue; + k = jlist[kk]; + k &= NEIGHMASK; + ktype = map[type[k]]; + iparam_ijk = elem2param[itype][jtype][ktype]; + + delr2[0] = x[k][0] - xtmp; + delr2[1] = x[k][1] - ytmp; + delr2[2] = x[k][2] - ztmp; + rsq2 = delr2[0]*delr2[0] + delr2[1]*delr2[1] + delr2[2]*delr2[2]; + if (rsq2 > params[iparam_ijk].cutsq) continue; + + zeta_ij += zeta(¶ms[iparam_ijk],rsq1,rsq2,delr1,delr2); + } + + // pairwise force due to zeta + + force_zeta(¶ms[iparam_ij],rsq1,zeta_ij,fpair,prefactor,eflag,evdwl); + + f[i][0] += delr1[0]*fpair; + f[i][1] += delr1[1]*fpair; + f[i][2] += delr1[2]*fpair; + f[j][0] -= delr1[0]*fpair; + f[j][1] -= delr1[1]*fpair; + f[j][2] -= delr1[2]*fpair; + + if (evflag) ev_tally(i,j,nlocal,newton_pair, + evdwl,0.0,-fpair,-delr1[0],-delr1[1],-delr1[2]); + + // attractive term via loop over k + + for (kk = 0; kk < jnum; kk++) { + if (jj == kk) continue; + k = jlist[kk]; + k &= NEIGHMASK; + ktype = map[type[k]]; + iparam_ijk = elem2param[itype][jtype][ktype]; + + delr2[0] = x[k][0] - xtmp; + delr2[1] = x[k][1] - ytmp; + delr2[2] = x[k][2] - ztmp; + rsq2 = delr2[0]*delr2[0] + delr2[1]*delr2[1] + delr2[2]*delr2[2]; + if (rsq2 > params[iparam_ijk].cutsq) continue; + + attractive(¶ms[iparam_ijk],prefactor, + rsq1,rsq2,delr1,delr2,fi,fj,fk); + + f[i][0] += fi[0]; + f[i][1] += fi[1]; + f[i][2] += fi[2]; + f[j][0] += fj[0]; + f[j][1] += fj[1]; + f[j][2] += fj[2]; + f[k][0] += fk[0]; + f[k][1] += fk[1]; + f[k][2] += fk[2]; + + if (vflag_atom) v_tally3(i,j,k,fj,fk,delr1,delr2); + } // kk + } // jj + } // ii + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- */ + +void PairGW::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"); + + map = new int[n+1]; +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairGW::settings(int narg, char **arg) +{ + if (narg != 0) error->all(FLERR,"Illegal pair_style command"); +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairGW::coeff(int narg, char **arg) +{ + int i,j,n; + + if (!allocated) allocate(); + + if (narg != 3 + atom->ntypes) + error->all(FLERR,"Incorrect args for pair coefficients"); + + // insure I,J args are * * + + if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0) + error->all(FLERR,"Incorrect args for pair coefficients"); + + // read args that map atom types to elements in potential file + // map[i] = which element the Ith atom type is, -1 if NULL + // nelements = # of unique elements + // elements = list of element names + + if (elements) { + for (i = 0; i < nelements; i++) delete [] elements[i]; + delete [] elements; + } + elements = new char*[atom->ntypes]; + for (i = 0; i < atom->ntypes; i++) elements[i] = NULL; + + nelements = 0; + for (i = 3; i < narg; i++) { + if (strcmp(arg[i],"NULL") == 0) { + map[i-2] = -1; + continue; + } + for (j = 0; j < nelements; j++) + if (strcmp(arg[i],elements[j]) == 0) break; + map[i-2] = j; + if (j == nelements) { + n = strlen(arg[i]) + 1; + elements[j] = new char[n]; + strcpy(elements[j],arg[i]); + nelements++; + } + } + + // read potential file and initialize potential parameters + + read_file(arg[2]); + setup_params(); + + // clear setflag since coeff() called once with I,J = * * + + n = atom->ntypes; + for (i = 1; i <= n; i++) + for (j = i; j <= n; j++) + setflag[i][j] = 0; + + // set setflag i,j for type pairs where both are mapped to elements + + int count = 0; + for (i = 1; i <= n; i++) + for (j = i; j <= n; j++) + if (map[i] >= 0 && map[j] >= 0) { + setflag[i][j] = 1; + count++; + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairGW::init_style() +{ + if (atom->tag_enable == 0) + error->all(FLERR,"Pair style GW requires atom IDs"); + if (force->newton_pair == 0) + error->all(FLERR,"Pair style GW requires newton pair on"); + + // need a full neighbor list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairGW::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + return cutmax; +} + +/* ---------------------------------------------------------------------- */ + +void PairGW::read_file(char *file) +{ + int params_per_line = 17; + char **words = new char*[params_per_line+1]; + + memory->sfree(params); + params = NULL; + nparams = maxparam = 0; + + // open file on proc 0 + + FILE *fp; + if (comm->me == 0) { + fp = force->open_potential(file); + if (fp == NULL) { + char str[128]; + sprintf(str,"Cannot open GW potential file %s",file); + error->one(FLERR,str); + } + } + + // read each line out of file, skipping blank lines or leading '#' + // store line of params if all 3 element tags are in element list + + int n,nwords,ielement,jelement,kelement; + char line[MAXLINE],*ptr; + int eof = 0; + + while (1) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fp); + if (ptr == NULL) { + eof = 1; + fclose(fp); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + + // strip comment, skip line if blank + + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + if (nwords == 0) continue; + + // concatenate additional lines until have params_per_line words + + while (nwords < params_per_line) { + n = strlen(line); + if (comm->me == 0) { + ptr = fgets(&line[n],MAXLINE-n,fp); + if (ptr == NULL) { + eof = 1; + fclose(fp); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + } + + if (nwords != params_per_line) + error->all(FLERR,"Incorrect format in GW potential file"); + + // words = ptrs to all words in line + + nwords = 0; + words[nwords++] = strtok(line," \t\n\r\f"); + while ((words[nwords++] = strtok(NULL," \t\n\r\f"))) continue; + + // ielement,jelement,kelement = 1st args + // if all 3 args are in element list, then parse this line + // else skip to next line + + for (ielement = 0; ielement < nelements; ielement++) + if (strcmp(words[0],elements[ielement]) == 0) break; + if (ielement == nelements) continue; + for (jelement = 0; jelement < nelements; jelement++) + if (strcmp(words[1],elements[jelement]) == 0) break; + if (jelement == nelements) continue; + for (kelement = 0; kelement < nelements; kelement++) + if (strcmp(words[2],elements[kelement]) == 0) break; + if (kelement == nelements) continue; + + // load up parameter settings and error check their values + + if (nparams == maxparam) { + maxparam += DELTA; + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), + "pair:params"); + } + + params[nparams].ielement = ielement; + params[nparams].jelement = jelement; + params[nparams].kelement = kelement; + params[nparams].powerm = atof(words[3]); + params[nparams].gamma = atof(words[4]); + params[nparams].lam3 = atof(words[5]); + params[nparams].c = atof(words[6]); + params[nparams].d = atof(words[7]); + params[nparams].h = atof(words[8]); + params[nparams].powern = atof(words[9]); + params[nparams].beta = atof(words[10]); + params[nparams].lam2 = atof(words[11]); + params[nparams].bigb = atof(words[12]); + params[nparams].bigr = atof(words[13]); + params[nparams].bigd = atof(words[14]); + params[nparams].lam1 = atof(words[15]); + params[nparams].biga = atof(words[16]); + + // currently only allow m exponent of 1 or 3 + + params[nparams].powermint = int(params[nparams].powerm); + + if (params[nparams].c < 0.0 || params[nparams].d < 0.0 || + params[nparams].powern < 0.0 || params[nparams].beta < 0.0 || + params[nparams].lam2 < 0.0 || params[nparams].bigb < 0.0 || + params[nparams].bigr < 0.0 ||params[nparams].bigd < 0.0 || + params[nparams].bigd > params[nparams].bigr || + params[nparams].lam1 < 0.0 || params[nparams].biga < 0.0 || + params[nparams].powerm - params[nparams].powermint != 0.0 || + (params[nparams].powermint != 3 && params[nparams].powermint != 1) || + params[nparams].gamma < 0.0) + error->all(FLERR,"Illegal GW parameter"); + + nparams++; + } + + delete [] words; +} + +/* ---------------------------------------------------------------------- */ + +void PairGW::setup_params() +{ + int i,j,k,m,n; + + // set elem2param for all element triplet combinations + // must be a single exact match to lines read from file + // do not allow for ACB in place of ABC + + memory->destroy(elem2param); + memory->create(elem2param,nelements,nelements,nelements,"pair:elem2param"); + + for (i = 0; i < nelements; i++) + for (j = 0; j < nelements; j++) + for (k = 0; k < nelements; k++) { + n = -1; + for (m = 0; m < nparams; m++) { + if (i == params[m].ielement && j == params[m].jelement && + k == params[m].kelement) { + if (n >= 0) error->all(FLERR,"Potential file has duplicate entry"); + n = m; + } + } + if (n < 0) error->all(FLERR,"Potential file is missing an entry"); + elem2param[i][j][k] = n; + } + + + // compute parameter values derived from inputs + + for (m = 0; m < nparams; m++) { + params[m].cut = params[m].bigr + params[m].bigd; + params[m].cutsq = params[m].cut*params[m].cut; + + params[m].c1 = pow(2.0*params[m].powern*1.0e-16,-1.0/params[m].powern); + params[m].c2 = pow(2.0*params[m].powern*1.0e-8,-1.0/params[m].powern); + params[m].c3 = 1.0/params[m].c2; + params[m].c4 = 1.0/params[m].c1; + } + + // set cutmax to max of all params + + cutmax = 0.0; + for (m = 0; m < nparams; m++) + if (params[m].cut > cutmax) cutmax = params[m].cut; +} + +/* ---------------------------------------------------------------------- */ + +void PairGW::repulsive(Param *param, double rsq, double &fforce, + int eflag, double &eng) +{ + double r,tmp_fc,tmp_fc_d,tmp_exp; + + r = sqrt(rsq); + tmp_fc = gw_fc(r,param); + tmp_fc_d = gw_fc_d(r,param); + tmp_exp = exp(-param->lam1 * r); + fforce = -param->biga * tmp_exp * (tmp_fc_d - tmp_fc*param->lam1) / r; + if (eflag) eng = tmp_fc * param->biga * tmp_exp; +} + +/* ---------------------------------------------------------------------- */ + +double PairGW::zeta(Param *param, double rsqij, double rsqik, + double *delrij, double *delrik) +{ + double rij,rik,costheta,arg,ex_delr; + + rij = sqrt(rsqij); + rik = sqrt(rsqik); + costheta = (delrij[0]*delrik[0] + delrij[1]*delrik[1] + + delrij[2]*delrik[2]) / (rij*rik); + + if (param->powermint == 3) arg = pow(param->lam3 * (rij-rik),3.0); + else arg = param->lam3 * (rij-rik); + + if (arg > 69.0776) ex_delr = 1.e30; + else if (arg < -69.0776) ex_delr = 0.0; + else ex_delr = exp(arg); + + return gw_fc(rik,param) * gw_gijk(costheta,param) * ex_delr; +} + +/* ---------------------------------------------------------------------- */ + +void PairGW::force_zeta(Param *param_i, double rsq, double zeta_ij, + double &fforce, double &prefactor, + int eflag, double &eng) +{ + double r,fa,fa_d,bij; + + r = sqrt(rsq); + fa = gw_fa(r,param_i); + fa_d = gw_fa_d(r,param_i); + bij = gw_bij(zeta_ij,param_i); + fforce = 0.5*bij*fa_d / r; + prefactor = -0.5*fa * gw_bij_d(zeta_ij,param_i); + if (eflag) eng = 0.5*bij*fa; +} + +/* ---------------------------------------------------------------------- + attractive term + use param_ij cutoff for rij test + use param_ijk cutoff for rik test +------------------------------------------------------------------------- */ + +void PairGW::attractive(Param *param, double prefactor, + double rsqij, double rsqik, + double *delrij, double *delrik, + double *fi, double *fj, double *fk) +{ + double rij_hat[3],rik_hat[3]; + double rij,rijinv,rik,rikinv; + + rij = sqrt(rsqij); + rijinv = 1.0/rij; + vec3_scale(rijinv,delrij,rij_hat); + + rik = sqrt(rsqik); + rikinv = 1.0/rik; + vec3_scale(rikinv,delrik,rik_hat); + + gw_zetaterm_d(prefactor,rij_hat,rij,rik_hat,rik,fi,fj,fk,param); +} + +/* ---------------------------------------------------------------------- */ + +double PairGW::gw_fc(double r, Param *param) +{ + double gw_R = param->bigr; + double gw_D = param->bigd; + + if (r < gw_R-gw_D) return 1.0; + if (r > gw_R+gw_D) return 0.0; + return 0.5*(1.0 - sin(MY_PI2*(r - gw_R)/gw_D)); +} + +/* ---------------------------------------------------------------------- */ + +double PairGW::gw_fc_d(double r, Param *param) +{ + double gw_R = param->bigr; + double gw_D = param->bigd; + + if (r < gw_R-gw_D) return 0.0; + if (r > gw_R+gw_D) return 0.0; + return -(MY_PI4/gw_D) * cos(MY_PI2*(r - gw_R)/gw_D); +} + +/* ---------------------------------------------------------------------- */ + +double PairGW::gw_fa(double r, Param *param) +{ + if (r > param->bigr + param->bigd) return 0.0; + return -param->bigb * exp(-param->lam2 * r) * gw_fc(r,param); +} + +/* ---------------------------------------------------------------------- */ + +double PairGW::gw_fa_d(double r, Param *param) +{ + if (r > param->bigr + param->bigd) return 0.0; + return param->bigb * exp(-param->lam2 * r) * + (param->lam2 * gw_fc(r,param) - gw_fc_d(r,param)); +} + +/* ---------------------------------------------------------------------- */ + +double PairGW::gw_bij(double zeta_ij, Param *param_i) +{ + double tmp = param_i->beta * zeta_ij; + return pow(tmp,-param_i->powern); +} + +/* ---------------------------------------------------------------------- */ + +double PairGW::gw_bij_d(double zeta_ij, Param *param_i) +{ + double tmp = param_i->beta * zeta_ij; + return - param_i->powern * pow(tmp,-param_i->powern-1)*tmp / zeta_ij; +} + +/* ---------------------------------------------------------------------- */ + +void PairGW::gw_zetaterm_d(double prefactor, + double *rij_hat, double rij, + double *rik_hat, double rik, + double *dri, double *drj, double *drk, + Param *param) +{ + double gijk,gijk_d,ex_delr,ex_delr_d,fc,dfc,cos_theta,tmp; + double dcosdri[3],dcosdrj[3],dcosdrk[3]; + + fc = gw_fc(rik,param); + dfc = gw_fc_d(rik,param); + if (param->powermint == 3) tmp = pow(param->lam3 * (rij-rik),3.0); + else tmp = param->lam3 * (rij-rik); + + if (tmp > 69.0776) ex_delr = 1.e30; + else if (tmp < -69.0776) ex_delr = 0.0; + else ex_delr = exp(tmp); + + if (param->powermint == 3) + ex_delr_d = 3.0*pow(param->lam3,3.0) * pow(rij-rik,2.0)*ex_delr; + else ex_delr_d = param->lam3 * ex_delr; + + cos_theta = vec3_dot(rij_hat,rik_hat); + gijk = gw_gijk(cos_theta,param); + gijk_d = gw_gijk_d(cos_theta,param); + costheta_d(rij_hat,rij,rik_hat,rik,dcosdri,dcosdrj,dcosdrk); + + // compute the derivative wrt Ri + // dri = -dfc*gijk*ex_delr*rik_hat; + // dri += fc*gijk_d*ex_delr*dcosdri; + // dri += fc*gijk*ex_delr_d*(rik_hat - rij_hat); + + vec3_scale(-dfc*gijk*ex_delr,rik_hat,dri); + vec3_scaleadd(fc*gijk_d*ex_delr,dcosdri,dri,dri); + vec3_scaleadd(fc*gijk*ex_delr_d,rik_hat,dri,dri); + vec3_scaleadd(-fc*gijk*ex_delr_d,rij_hat,dri,dri); + vec3_scale(prefactor,dri,dri); + + // compute the derivative wrt Rj + // drj = fc*gijk_d*ex_delr*dcosdrj; + // drj += fc*gijk*ex_delr_d*rij_hat; + + vec3_scale(fc*gijk_d*ex_delr,dcosdrj,drj); + vec3_scaleadd(fc*gijk*ex_delr_d,rij_hat,drj,drj); + vec3_scale(prefactor,drj,drj); + + // compute the derivative wrt Rk + // drk = dfc*gijk*ex_delr*rik_hat; + // drk += fc*gijk_d*ex_delr*dcosdrk; + // drk += -fc*gijk*ex_delr_d*rik_hat; + + vec3_scale(dfc*gijk*ex_delr,rik_hat,drk); + vec3_scaleadd(fc*gijk_d*ex_delr,dcosdrk,drk,drk); + vec3_scaleadd(-fc*gijk*ex_delr_d,rik_hat,drk,drk); + vec3_scale(prefactor,drk,drk); +} + +/* ---------------------------------------------------------------------- */ + +void PairGW::costheta_d(double *rij_hat, double rij, + double *rik_hat, double rik, + double *dri, double *drj, double *drk) +{ + // first element is devative wrt Ri, second wrt Rj, third wrt Rk + + double cos_theta = vec3_dot(rij_hat,rik_hat); + + vec3_scaleadd(-cos_theta,rij_hat,rik_hat,drj); + vec3_scale(1.0/rij,drj,drj); + vec3_scaleadd(-cos_theta,rik_hat,rij_hat,drk); + vec3_scale(1.0/rik,drk,drk); + vec3_add(drj,drk,dri); + vec3_scale(-1.0,dri,dri); +} diff --git a/src/MANYBODY/pair_gw.h b/src/MANYBODY/pair_gw.h new file mode 100644 index 0000000000..eedc2a1f9f --- /dev/null +++ b/src/MANYBODY/pair_gw.h @@ -0,0 +1,196 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(gw,PairGW) + +#else + +#ifndef LMP_PAIR_GW_H +#define LMP_PAIR_GW_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairGW : public Pair { + public: + PairGW(class LAMMPS *); + virtual ~PairGW(); + virtual void compute(int, int); + void settings(int, char **); + void coeff(int, char **); + void init_style(); + double init_one(int, int); + + protected: + struct Param { + double lam1,lam2,lam3; + double c,d,h; + double gamma,powerm; + double powern,beta; + double biga,bigb,bigd,bigr; + double cut,cutsq; + double c1,c2,c3,c4; + int ielement,jelement,kelement; + int powermint; + double Z_i,Z_j; + double ZBLcut,ZBLexpscale; + }; + + Param *params; // parameter set for an I-J-K interaction + char **elements; // names of unique elements + int ***elem2param; // mapping from element triplets to paramegw + int *map; // mapping from atom types to elements + double cutmax; // max cutoff for all elements + int nelements; // # of unique elements + int nparams; // # of stored parameter sets + int maxparam; // max # of parameter sets + + int **pages; // neighbor list pages + int maxlocal; // size of numneigh, firstneigh arrays + int maxpage; // # of pages currently allocated + int pgsize; // size of neighbor page + int oneatom; // max # of neighbors for one atom + + + int *GW_numneigh; // # of pair neighbors for each atom + int **GW_firstneigh; // ptr to 1st neighbor of each atom + + void GW_neigh(); + void add_pages(int howmany = 1); + + void allocate(); + virtual void read_file(char *); + void setup_params(); + virtual void repulsive(Param *, double, double &, int, double &); + double zeta(Param *, double, double, double *, double *); + virtual void force_zeta(Param *, double, double, double &, + double &, int, double &); + void attractive(Param *, double, double, double, double *, double *, + double *, double *, double *); + + double gw_fc(double, Param *); + double gw_fc_d(double, Param *); + virtual double gw_fa(double, Param *); + virtual double gw_fa_d(double, Param *); + double gw_bij(double, Param *); + double gw_bij_d(double, Param *); + + void gw_zetaterm_d(double, double *, double, double *, double, + double *, double *, double *, Param *); + void costheta_d(double *, double, double *, double, + double *, double *, double *); + + // inlined functions for efficiency + + inline double gw_gijk(const double costheta, + const Param * const param) const { + const double gw_c = param->c * param->c; + const double gw_d = param->d * param->d; + const double hcth = param->h - costheta; + + //printf("gw_gijk: gw_c=%f gw_d=%f hcth=%f=%f-%f\n", gw_c, gw_d, hcth, param->h, costheta); + + return param->gamma*(1.0 + gw_c/gw_d - gw_c / (gw_d + hcth*hcth)); + } + + inline double gw_gijk_d(const double costheta, + const Param * const param) const { + const double gw_c = param->c * param->c; + const double gw_d = param->d * param->d; + const double hcth = param->h - costheta; + const double numerator = -2.0 * gw_c * hcth; + const double denominator = 1.0/(gw_d + hcth*hcth); + return param->gamma*numerator*denominator*denominator; + } + + inline double vec3_dot(const double x[3], const double y[3]) const { + return x[0]*y[0] + x[1]*y[1] + x[2]*y[2]; + } + + inline void vec3_add(const double x[3], const double y[3], + double * const z) const { + z[0] = x[0]+y[0]; z[1] = x[1]+y[1]; z[2] = x[2]+y[2]; + } + + inline void vec3_scale(const double k, const double x[3], + double y[3]) const { + y[0] = k*x[0]; y[1] = k*x[1]; y[2] = k*x[2]; + } + + inline void vec3_scaleadd(const double k, const double x[3], + const double y[3], double * const z) const { + z[0] = k*x[0]+y[0]; + z[1] = k*x[1]+y[1]; + z[2] = k*x[2]+y[2]; + } +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair style GW requires atom IDs + +This is a requirement to use the GW potential. + +E: Pair style GW requires newton pair on + +See the newton command. This is a restriction to use the GW +potential. + +E: All pair coeffs are not set + +All pair coefficients must be set in the data file or by the +pair_coeff command before running a simulation. + +E: Cannot open GW potential file %s + +The specified GW potential file cannot be opened. Check that the +path and name are correct. + +E: Incorrect format in GW potential file + +Incorrect number of words per line in the potential file. + +E: Illegal GW parameter + +One or more of the coefficients defined in the potential file is +invalid. + +E: Potential file has duplicate entry + +The potential file for a SW or GW potential has more than +one entry for the same 3 ordered elements. + +E: Potential file is missing an entry + +The potential file for a SW or GW potential does not have a +needed entry. + +*/ diff --git a/src/MANYBODY/pair_gw_zbl.cpp b/src/MANYBODY/pair_gw_zbl.cpp new file mode 100644 index 0000000000..a4e1ccb1f9 --- /dev/null +++ b/src/MANYBODY/pair_gw_zbl.cpp @@ -0,0 +1,287 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: German Samolyuk (ORNL) + Based on PairTersoffZBL by Aidan Thompson (SNL) and David Farrell (NWU) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_gw_zbl.h" +#include "atom.h" +#include "update.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "force.h" +#include "comm.h" +#include "memory.h" +#include "error.h" + +#include "math_const.h" +using namespace LAMMPS_NS; +using namespace MathConst; + +#define MAXLINE 1024 +#define DELTA 4 + +/* ---------------------------------------------------------------------- */ + +PairGWZBL::PairGWZBL(LAMMPS *lmp) : PairGW(lmp) +{ + // hard-wired constants in metal or real units + // a0 = Bohr radius + // epsilon0 = permittivity of vacuum = q / energy-distance units + // e = unit charge + // 1 Kcal/mole = 0.043365121 eV + + if (strcmp(update->unit_style,"metal") == 0) { + global_a_0 = 0.529; + global_epsilon_0 = 0.00552635; + global_e = 1.0; + } else if (strcmp(update->unit_style,"real") == 0) { + global_a_0 = 0.529; + global_epsilon_0 = 0.00552635 * 0.043365121; + global_e = 1.0; + } else error->all(FLERR,"Pair gw/zbl requires metal or real units"); +} + +/* ---------------------------------------------------------------------- */ + +void PairGWZBL::read_file(char *file) +{ + int params_per_line = 21; + char **words = new char*[params_per_line+1]; + + memory->sfree(params); + params = NULL; + nparams = maxparam = 0; + + // open file on proc 0 + + FILE *fp; + if (comm->me == 0) { + fp = force->open_potential(file); + if (fp == NULL) { + char str[128]; + sprintf(str,"Cannot open GW potential file %s",file); + error->one(FLERR,str); + } + } + + // read each line out of file, skipping blank lines or leading '#' + // store line of params if all 3 element tags are in element list + + int n,nwords,ielement,jelement,kelement; + char line[MAXLINE],*ptr; + int eof = 0; + + while (1) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fp); + if (ptr == NULL) { + eof = 1; + fclose(fp); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + + // strip comment, skip line if blank + + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + if (nwords == 0) continue; + + // concatenate additional lines until have params_per_line words + + while (nwords < params_per_line) { + n = strlen(line); + if (comm->me == 0) { + ptr = fgets(&line[n],MAXLINE-n,fp); + if (ptr == NULL) { + eof = 1; + fclose(fp); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + } + + if (nwords != params_per_line) + error->all(FLERR,"Incorrect format in GW potential file"); + + // words = ptrs to all words in line + + nwords = 0; + words[nwords++] = strtok(line," \t\n\r\f"); + while ((words[nwords++] = strtok(NULL," \t\n\r\f"))) continue; + + // ielement,jelement,kelement = 1st args + // if all 3 args are in element list, then parse this line + // else skip to next line + + for (ielement = 0; ielement < nelements; ielement++) + if (strcmp(words[0],elements[ielement]) == 0) break; + if (ielement == nelements) continue; + for (jelement = 0; jelement < nelements; jelement++) + if (strcmp(words[1],elements[jelement]) == 0) break; + if (jelement == nelements) continue; + for (kelement = 0; kelement < nelements; kelement++) + if (strcmp(words[2],elements[kelement]) == 0) break; + if (kelement == nelements) continue; + + // load up parameter settings and error check their values + + if (nparams == maxparam) { + maxparam += DELTA; + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), + "pair:params"); + } + + params[nparams].ielement = ielement; + params[nparams].jelement = jelement; + params[nparams].kelement = kelement; + params[nparams].powerm = atof(words[3]); + params[nparams].gamma = atof(words[4]); + params[nparams].lam3 = atof(words[5]); + params[nparams].c = atof(words[6]); + params[nparams].d = atof(words[7]); + params[nparams].h = atof(words[8]); + params[nparams].powern = atof(words[9]); + params[nparams].beta = atof(words[10]); + params[nparams].lam2 = atof(words[11]); + params[nparams].bigb = atof(words[12]); + params[nparams].bigr = atof(words[13]); + params[nparams].bigd = atof(words[14]); + params[nparams].lam1 = atof(words[15]); + params[nparams].biga = atof(words[16]); + params[nparams].Z_i = atof(words[17]); + params[nparams].Z_j = atof(words[18]); + params[nparams].ZBLcut = atof(words[19]); + params[nparams].ZBLexpscale = atof(words[20]); + + // currently only allow m exponent of 1 or 3 + + params[nparams].powermint = int(params[nparams].powerm); + + if ( + params[nparams].lam3 < 0.0 || params[nparams].c < 0.0 || + params[nparams].d < 0.0 || params[nparams].powern < 0.0 || + params[nparams].beta < 0.0 || params[nparams].lam2 < 0.0 || + params[nparams].bigb < 0.0 || params[nparams].bigr < 0.0 || + params[nparams].bigd < 0.0 || + params[nparams].bigd > params[nparams].bigr || + params[nparams].lam3 < 0.0 || params[nparams].biga < 0.0 || + params[nparams].powerm - params[nparams].powermint != 0.0 || + (params[nparams].powermint != 3 && params[nparams].powermint != 1) || + params[nparams].gamma < 0.0 || + params[nparams].Z_i < 1.0 || params[nparams].Z_j < 1.0 || + params[nparams].ZBLcut < 0.0 || params[nparams].ZBLexpscale < 0.0) + error->all(FLERR,"Illegal GW parameter"); + + nparams++; + } + + delete [] words; +} + +/* ---------------------------------------------------------------------- */ + +void PairGWZBL::repulsive(Param *param, double rsq, double &fforce, + int eflag, double &eng) +{ + double r,tmp_fc,tmp_fc_d,tmp_exp; + + // GW repulsive portion + + r = sqrt(rsq); + tmp_fc = gw_fc(r,param); + tmp_fc_d = gw_fc_d(r,param); + tmp_exp = exp(-param->lam1 * r); + double fforce_gw = param->biga * tmp_exp * (tmp_fc_d - tmp_fc*param->lam1); + double eng_gw = tmp_fc * param->biga * tmp_exp; + + // ZBL repulsive portion + + double esq = pow(global_e,2.0); + double a_ij = (0.8854*global_a_0) / + (pow(param->Z_i,0.23) + pow(param->Z_j,0.23)); + double premult = (param->Z_i * param->Z_j * esq)/(4.0*MY_PI*global_epsilon_0); + double r_ov_a = r/a_ij; + double phi = 0.1818*exp(-3.2*r_ov_a) + 0.5099*exp(-0.9423*r_ov_a) + + 0.2802*exp(-0.4029*r_ov_a) + 0.02817*exp(-0.2016*r_ov_a); + double dphi = (1.0/a_ij) * (-3.2*0.1818*exp(-3.2*r_ov_a) - + 0.9423*0.5099*exp(-0.9423*r_ov_a) - + 0.4029*0.2802*exp(-0.4029*r_ov_a) - + 0.2016*0.02817*exp(-0.2016*r_ov_a)); + double fforce_ZBL = premult*-phi/rsq + premult*dphi/r; + double eng_ZBL = premult*(1.0/r)*phi; + + // combine two parts with smoothing by Fermi-like function + + fforce = -(-F_fermi_d(r,param) * eng_ZBL + + (1.0 - F_fermi(r,param))*fforce_ZBL + + F_fermi_d(r,param)*eng_gw + F_fermi(r,param)*fforce_gw) / r; + + if (eflag) + eng = (1.0 - F_fermi(r,param))*eng_ZBL + F_fermi(r,param)*eng_gw; +} + +/* ---------------------------------------------------------------------- */ + +double PairGWZBL::gw_fa(double r, Param *param) +{ + if (r > param->bigr + param->bigd) return 0.0; + return -param->bigb * exp(-param->lam2 * r) * gw_fc(r,param) * + F_fermi(r,param); +} + +/* ---------------------------------------------------------------------- */ + +double PairGWZBL::gw_fa_d(double r, Param *param) +{ + if (r > param->bigr + param->bigd) return 0.0; + return param->bigb * exp(-param->lam2 * r) * + (param->lam2 * gw_fc(r,param) * F_fermi(r,param) - + gw_fc_d(r,param) * F_fermi(r,param) - gw_fc(r,param) * + F_fermi_d(r,param)); +} + +/* ---------------------------------------------------------------------- + Fermi-like smoothing function +------------------------------------------------------------------------- */ + +double PairGWZBL::F_fermi(double r, Param *param) +{ + return 1.0 / (1.0 + exp(-param->ZBLexpscale*(r-param->ZBLcut))); +} + +/* ---------------------------------------------------------------------- + Fermi-like smoothing function derivative with respect to r +------------------------------------------------------------------------- */ + +double PairGWZBL::F_fermi_d(double r, Param *param) +{ + return param->ZBLexpscale*exp(-param->ZBLexpscale*(r-param->ZBLcut)) / + pow(1.0 + exp(-param->ZBLexpscale*(r-param->ZBLcut)),2.0); +} diff --git a/src/MANYBODY/pair_gw_zbl.h b/src/MANYBODY/pair_gw_zbl.h new file mode 100644 index 0000000000..0ed7f1de56 --- /dev/null +++ b/src/MANYBODY/pair_gw_zbl.h @@ -0,0 +1,72 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(gw/zbl,PairGWZBL) + +#else + +#ifndef LMP_PAIR_GW_ZBL_H +#define LMP_PAIR_GW_ZBL_H + +#include "pair_gw.h" + +namespace LAMMPS_NS { + +class PairGWZBL : public PairGW { + public: + PairGWZBL(class LAMMPS *); + ~PairGWZBL() {} + + private: + double global_a_0; // Bohr radius for Coulomb repulsion + double global_epsilon_0; // permittivity of vacuum for Coulomb repulsion + double global_e; // proton charge (negative of electron charge) + + void read_file(char *); + void repulsive(Param *, double, double &, int, double &); + + double gw_fa(double, Param *); + double gw_fa_d(double, Param *); + + double F_fermi(double, Param *); + double F_fermi_d(double, Param *); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Pair GW/zbl requires metal or real units + +This is a current restriction of this pair potential. + +E: Cannot open GW potential file %s + +The specified GW potential file cannot be opened. Check that the +path and name are correct. + +E: Incorrect format in GW potential file + +Incorrect number of words per line in the potential file. + +E: Illegal GW parameter + +One or more of the coefficients defined in the potential file is +invalid. + +*/ From 69ccbd1562525f6825db4a0a1674c835b5290398 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 15 May 2017 17:45:36 -0400 Subject: [PATCH 019/302] Extract common wrappers to Python compatibility header --- src/.gitignore | 1 + src/PYTHON/fix_python.cpp | 12 +++++------- src/PYTHON/pair_python.cpp | 17 +---------------- src/PYTHON/python_compat.h | 33 +++++++++++++++++++++++++++++++++ src/PYTHON/python_impl.cpp | 20 +++++--------------- 5 files changed, 45 insertions(+), 38 deletions(-) create mode 100644 src/PYTHON/python_compat.h diff --git a/src/.gitignore b/src/.gitignore index 6171b29af9..4e5f7d9ebc 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -850,6 +850,7 @@ /prd.h /python_impl.cpp /python_impl.h +/python_compat.h /fix_python.cpp /fix_python.h /pair_python.cpp diff --git a/src/PYTHON/fix_python.cpp b/src/PYTHON/fix_python.cpp index 4f437b7488..e1c0dd1fbc 100644 --- a/src/PYTHON/fix_python.cpp +++ b/src/PYTHON/fix_python.cpp @@ -11,6 +11,10 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer and Richard Berger (Temple U) +------------------------------------------------------------------------- */ + #include #include #include "fix_python.h" @@ -20,17 +24,11 @@ #include "respa.h" #include "error.h" #include "python.h" +#include "python_compat.h" using namespace LAMMPS_NS; using namespace FixConst; -// Wrap API changes between Python 2 and 3 using macros -#if PY_MAJOR_VERSION == 2 -#define PY_VOID_POINTER(X) PyCObject_FromVoidPtr((void *) X, NULL) -#elif PY_MAJOR_VERSION == 3 -#define PY_VOID_POINTER(X) PyCapsule_New((void *) X, NULL, NULL) -#endif - /* ---------------------------------------------------------------------- */ FixPython::FixPython(LAMMPS *lmp, int narg, char **arg) : diff --git a/src/PYTHON/pair_python.cpp b/src/PYTHON/pair_python.cpp index 1d37a9fd06..485efee58d 100644 --- a/src/PYTHON/pair_python.cpp +++ b/src/PYTHON/pair_python.cpp @@ -27,25 +27,10 @@ #include "neigh_list.h" #include "python.h" #include "error.h" +#include "python_compat.h" using namespace LAMMPS_NS; -// Wrap API changes between Python 2 and 3 using macros -#if PY_MAJOR_VERSION == 2 -#define PY_INT_FROM_LONG(X) PyInt_FromLong(X) -#define PY_INT_AS_LONG(X) PyInt_AsLong(X) -#define PY_STRING_FROM_STRING(X) PyString_FromString(X) -#define PY_VOID_POINTER(X) PyCObject_FromVoidPtr((void *) X, NULL) -#define PY_STRING_AS_STRING(X) PyString_AsString(X) - -#elif PY_MAJOR_VERSION == 3 -#define PY_INT_FROM_LONG(X) PyLong_FromLong(X) -#define PY_INT_AS_LONG(X) PyLong_AsLong(X) -#define PY_STRING_FROM_STRING(X) PyUnicode_FromString(X) -#define PY_VOID_POINTER(X) PyCapsule_New((void *) X, NULL, NULL) -#define PY_STRING_AS_STRING(X) PyUnicode_AsUTF8(X) -#endif - /* ---------------------------------------------------------------------- */ PairPython::PairPython(LAMMPS *lmp) : Pair(lmp) { diff --git a/src/PYTHON/python_compat.h b/src/PYTHON/python_compat.h new file mode 100644 index 0000000000..175d797ffa --- /dev/null +++ b/src/PYTHON/python_compat.h @@ -0,0 +1,33 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifndef LMP_PYTHON_COMPAT_H +#define LMP_PYTHON_COMPAT_H + +// Wrap API changes between Python 2 and 3 using macros +#if PY_MAJOR_VERSION == 2 +#define PY_INT_FROM_LONG(X) PyInt_FromLong(X) +#define PY_INT_AS_LONG(X) PyInt_AsLong(X) +#define PY_STRING_FROM_STRING(X) PyString_FromString(X) +#define PY_VOID_POINTER(X) PyCObject_FromVoidPtr((void *) X, NULL) +#define PY_STRING_AS_STRING(X) PyString_AsString(X) + +#elif PY_MAJOR_VERSION == 3 +#define PY_INT_FROM_LONG(X) PyLong_FromLong(X) +#define PY_INT_AS_LONG(X) PyLong_AsLong(X) +#define PY_STRING_FROM_STRING(X) PyUnicode_FromString(X) +#define PY_VOID_POINTER(X) PyCapsule_New((void *) X, NULL, NULL) +#define PY_STRING_AS_STRING(X) PyUnicode_AsUTF8(X) +#endif + +#endif diff --git a/src/PYTHON/python_impl.cpp b/src/PYTHON/python_impl.cpp index c66e003228..dadcbfeade 100644 --- a/src/PYTHON/python_impl.cpp +++ b/src/PYTHON/python_impl.cpp @@ -11,6 +11,10 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + Contributing author: Axel Kohlmeyer and Richard Berger (Temple U) +------------------------------------------------------------------------- */ + #include #include "python.h" #include "force.h" @@ -18,6 +22,7 @@ #include "variable.h" #include "memory.h" #include "error.h" +#include "python_compat.h" using namespace LAMMPS_NS; @@ -25,21 +30,6 @@ enum{NONE,INT,DOUBLE,STRING,PTR}; #define VALUELENGTH 64 // also in variable.cpp -// Wrap API changes between Python 2 and 3 using macros -#if PY_MAJOR_VERSION == 2 -#define PY_INT_FROM_LONG(X) PyInt_FromLong(X) -#define PY_INT_AS_LONG(X) PyInt_AsLong(X) -#define PY_STRING_FROM_STRING(X) PyString_FromString(X) -#define PY_VOID_POINTER(X) PyCObject_FromVoidPtr((void *) X, NULL) -#define PY_STRING_AS_STRING(X) PyString_AsString(X) - -#elif PY_MAJOR_VERSION == 3 -#define PY_INT_FROM_LONG(X) PyLong_FromLong(X) -#define PY_INT_AS_LONG(X) PyLong_AsLong(X) -#define PY_STRING_FROM_STRING(X) PyUnicode_FromString(X) -#define PY_VOID_POINTER(X) PyCapsule_New((void *) X, NULL, NULL) -#define PY_STRING_AS_STRING(X) PyUnicode_AsUTF8(X) -#endif /* ---------------------------------------------------------------------- */ From d66a696a845b62c3dcc19d2e03b38d89f8d09f08 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 15 May 2017 18:02:02 -0400 Subject: [PATCH 020/302] avoid preprocessor warnings, by placing Python.h include file on the top, as suggested by python docs --- src/PYTHON/fix_python.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PYTHON/fix_python.cpp b/src/PYTHON/fix_python.cpp index 4f437b7488..a3ff292f9a 100644 --- a/src/PYTHON/fix_python.cpp +++ b/src/PYTHON/fix_python.cpp @@ -11,6 +11,7 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +#include #include #include #include "fix_python.h" From 14f3deed6b83917269209d27477ee618fa146e0d Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 15 May 2017 18:43:46 -0400 Subject: [PATCH 021/302] Minor coefficient lookup improvement --- examples/python/lj-melt-potential.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/python/lj-melt-potential.py b/examples/python/lj-melt-potential.py index 41fa073ebd..3d7332faa8 100644 --- a/examples/python/lj-melt-potential.py +++ b/examples/python/lj-melt-potential.py @@ -18,17 +18,19 @@ class LAMMPSLJCutPotential(object): raise Exception("cannot match atom type %s" % name) def compute_force(self,rsq,itype,jtype): + coeff = self.coeff[self.pmap[itype]][self.pmap[jtype]] r2inv = 1.0/rsq r6inv = r2inv*r2inv*r2inv - lj1 = self.coeff[self.pmap[itype]][self.pmap[jtype]][2] - lj2 = self.coeff[self.pmap[itype]][self.pmap[jtype]][3] + lj1 = coeff[2] + lj2 = coeff[3] return (r6inv * (lj1*r6inv - lj2)) def compute_energy(self,rsq,itype,jtype): + coeff = self.coeff[self.pmap[itype]][self.pmap[jtype]] r2inv = 1.0/rsq r6inv = r2inv*r2inv*r2inv - lj3 = self.coeff[self.pmap[itype]][self.pmap[jtype]][4] - lj4 = self.coeff[self.pmap[itype]][self.pmap[jtype]][5] + lj3 = coeff[4] + lj4 = coeff[5] return (r6inv * (lj3*r6inv - lj4)) lammps_pair_style = LAMMPSLJCutPotential() From 51fc386e72246be1878a8b3cb1a98aefe2a356f4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 May 2017 00:26:18 -0400 Subject: [PATCH 022/302] correct the inner loop range for resetting cutoffs when redefining a pair style this was reported by frank uhlig on lammps-users for lj/cut, but it applies to many more pair styles --- src/ASPHERE/pair_gayberne.cpp | 2 +- src/ASPHERE/pair_line_lj.cpp | 2 +- src/ASPHERE/pair_resquared.cpp | 2 +- src/ASPHERE/pair_tri_lj.cpp | 2 +- src/BODY/pair_body.cpp | 2 +- src/CLASS2/pair_lj_class2.cpp | 2 +- src/CLASS2/pair_lj_class2_coul_cut.cpp | 2 +- src/CLASS2/pair_lj_class2_coul_long.cpp | 2 +- src/COLLOID/pair_brownian.cpp | 2 +- src/COLLOID/pair_colloid.cpp | 2 +- src/COLLOID/pair_lubricate.cpp | 2 +- src/COLLOID/pair_lubricateU.cpp | 2 +- src/COLLOID/pair_lubricateU_poly.cpp | 2 +- src/DIPOLE/pair_lj_cut_dipole_cut.cpp | 2 +- src/DIPOLE/pair_lj_cut_dipole_long.cpp | 330 +++++++++---------- src/DIPOLE/pair_lj_long_dipole_long.cpp | 26 +- src/KOKKOS/pair_coul_debye_kokkos.cpp | 2 +- src/KSPACE/pair_born_coul_long.cpp | 2 +- src/KSPACE/pair_buck_coul_long.cpp | 2 +- src/KSPACE/pair_buck_long_coul_long.cpp | 2 +- src/KSPACE/pair_lj_cut_coul_long.cpp | 2 +- src/KSPACE/pair_lj_cut_tip4p_long.cpp | 2 +- src/KSPACE/pair_lj_long_coul_long.cpp | 2 +- src/KSPACE/pair_lj_long_tip4p_long.cpp | 4 +- src/MC/pair_dsmc.cpp | 2 +- src/MISC/pair_nm_cut.cpp | 2 +- src/MISC/pair_nm_cut_coul_cut.cpp | 2 +- src/MISC/pair_nm_cut_coul_long.cpp | 2 +- src/MOLECULE/pair_lj_cut_tip4p_cut.cpp | 4 +- src/USER-AWPMD/pair_awpmd_cut.cpp | 12 +- src/USER-CGSDK/pair_lj_sdk.cpp | 2 +- src/USER-CGSDK/pair_lj_sdk_coul_long.cpp | 2 +- src/USER-DPD/pair_dpd_fdt.cpp | 2 +- src/USER-DPD/pair_dpd_fdt_energy.cpp | 2 +- src/USER-DPD/pair_exp6_rx.cpp | 2 +- src/USER-DRUDE/pair_lj_cut_thole_long.cpp | 10 +- src/USER-DRUDE/pair_thole.cpp | 10 +- src/USER-EFF/pair_eff_cut.cpp | 2 +- src/USER-FEP/pair_coul_cut_soft.cpp | 2 +- src/USER-FEP/pair_lj_cut_coul_cut_soft.cpp | 2 +- src/USER-FEP/pair_lj_cut_coul_long_soft.cpp | 2 +- src/USER-FEP/pair_lj_cut_soft.cpp | 2 +- src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp | 2 +- src/USER-FEP/pair_morse_soft.cpp | 2 +- src/USER-MISC/pair_buck_mdf.cpp | 2 +- src/USER-MISC/pair_coul_diel.cpp | 2 +- src/USER-MISC/pair_gauss_cut.cpp | 2 +- src/USER-MISC/pair_kolmogorov_crespi_z.cpp | 2 +- src/USER-MISC/pair_lennard_mdf.cpp | 2 +- src/USER-MISC/pair_lj_mdf.cpp | 2 +- src/USER-MISC/pair_lj_sf.cpp | 2 +- src/USER-MISC/pair_lj_sf_dipole_sf.cpp | 2 +- src/USER-MISC/pair_momb.cpp | 2 +- src/USER-MISC/pair_morse_smooth_linear.cpp | 2 +- src/USER-MISC/pair_srp.cpp | 2 +- src/pair_beck.cpp | 6 +- src/pair_born.cpp | 2 +- src/pair_born_coul_dsf.cpp | 5 +- src/pair_born_coul_wolf.cpp | 2 +- src/pair_buck.cpp | 2 +- src/pair_buck_coul_cut.cpp | 2 +- src/pair_coul_cut.cpp | 2 +- src/pair_coul_debye.cpp | 2 +- src/pair_dpd.cpp | 2 +- src/pair_dpd_tstat.cpp | 2 +- src/pair_gauss.cpp | 2 +- src/pair_lj96_cut.cpp | 2 +- src/pair_lj_cubic.cpp | 10 +- src/pair_lj_cut.cpp | 2 +- src/pair_lj_cut_coul_cut.cpp | 2 +- src/pair_lj_cut_coul_dsf.cpp | 2 +- src/pair_lj_expand.cpp | 2 +- src/pair_lj_gromacs.cpp | 2 +- src/pair_lj_smooth.cpp | 2 +- src/pair_lj_smooth_linear.cpp | 2 +- src/pair_mie_cut.cpp | 2 +- src/pair_morse.cpp | 2 +- src/pair_soft.cpp | 2 +- src/pair_yukawa.cpp | 2 +- 79 files changed, 268 insertions(+), 287 deletions(-) diff --git a/src/ASPHERE/pair_gayberne.cpp b/src/ASPHERE/pair_gayberne.cpp index bdff7a5cd6..25bdae14f1 100644 --- a/src/ASPHERE/pair_gayberne.cpp +++ b/src/ASPHERE/pair_gayberne.cpp @@ -281,7 +281,7 @@ void PairGayBerne::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/ASPHERE/pair_line_lj.cpp b/src/ASPHERE/pair_line_lj.cpp index 4e3df473a3..fc92ed4dc1 100644 --- a/src/ASPHERE/pair_line_lj.cpp +++ b/src/ASPHERE/pair_line_lj.cpp @@ -355,7 +355,7 @@ void PairLineLJ::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/ASPHERE/pair_resquared.cpp b/src/ASPHERE/pair_resquared.cpp index 172516aa49..ed9d9b36c4 100644 --- a/src/ASPHERE/pair_resquared.cpp +++ b/src/ASPHERE/pair_resquared.cpp @@ -253,7 +253,7 @@ void PairRESquared::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/ASPHERE/pair_tri_lj.cpp b/src/ASPHERE/pair_tri_lj.cpp index 773ad2d6a3..4f30b40e9a 100644 --- a/src/ASPHERE/pair_tri_lj.cpp +++ b/src/ASPHERE/pair_tri_lj.cpp @@ -426,7 +426,7 @@ void PairTriLJ::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/BODY/pair_body.cpp b/src/BODY/pair_body.cpp index 2a9edb37cc..b1be997310 100644 --- a/src/BODY/pair_body.cpp +++ b/src/BODY/pair_body.cpp @@ -372,7 +372,7 @@ void PairBody::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/CLASS2/pair_lj_class2.cpp b/src/CLASS2/pair_lj_class2.cpp index ee61aaae1f..e79dc0c6de 100644 --- a/src/CLASS2/pair_lj_class2.cpp +++ b/src/CLASS2/pair_lj_class2.cpp @@ -174,7 +174,7 @@ void PairLJClass2::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/CLASS2/pair_lj_class2_coul_cut.cpp b/src/CLASS2/pair_lj_class2_coul_cut.cpp index 45f0ccfe27..bec7f1da15 100644 --- a/src/CLASS2/pair_lj_class2_coul_cut.cpp +++ b/src/CLASS2/pair_lj_class2_coul_cut.cpp @@ -202,7 +202,7 @@ void PairLJClass2CoulCut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_lj[i][j] = cut_lj_global; cut_coul[i][j] = cut_coul_global; diff --git a/src/CLASS2/pair_lj_class2_coul_long.cpp b/src/CLASS2/pair_lj_class2_coul_long.cpp index b58094713f..5f7d738e92 100644 --- a/src/CLASS2/pair_lj_class2_coul_long.cpp +++ b/src/CLASS2/pair_lj_class2_coul_long.cpp @@ -240,7 +240,7 @@ void PairLJClass2CoulLong::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/COLLOID/pair_brownian.cpp b/src/COLLOID/pair_brownian.cpp index 84fda485a0..2bf01303b4 100644 --- a/src/COLLOID/pair_brownian.cpp +++ b/src/COLLOID/pair_brownian.cpp @@ -403,7 +403,7 @@ void PairBrownian::settings(int narg, char **arg) if (allocated) { for (int i = 1; i <= atom->ntypes; i++) - for (int j = i+1; j <= atom->ntypes; j++) + for (int j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_inner[i][j] = cut_inner_global; cut[i][j] = cut_global; diff --git a/src/COLLOID/pair_colloid.cpp b/src/COLLOID/pair_colloid.cpp index 440d6f9d4f..68150f6eff 100644 --- a/src/COLLOID/pair_colloid.cpp +++ b/src/COLLOID/pair_colloid.cpp @@ -256,7 +256,7 @@ void PairColloid::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/COLLOID/pair_lubricate.cpp b/src/COLLOID/pair_lubricate.cpp index 71e08f3f19..93cb48a15d 100644 --- a/src/COLLOID/pair_lubricate.cpp +++ b/src/COLLOID/pair_lubricate.cpp @@ -489,7 +489,7 @@ void PairLubricate::settings(int narg, char **arg) if (allocated) { for (int i = 1; i <= atom->ntypes; i++) - for (int j = i+1; j <= atom->ntypes; j++) + for (int j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_inner[i][j] = cut_inner_global; cut[i][j] = cut_global; diff --git a/src/COLLOID/pair_lubricateU.cpp b/src/COLLOID/pair_lubricateU.cpp index a50473a194..5d0a4243a7 100644 --- a/src/COLLOID/pair_lubricateU.cpp +++ b/src/COLLOID/pair_lubricateU.cpp @@ -1707,7 +1707,7 @@ void PairLubricateU::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_inner[i][j] = cut_inner_global; cut[i][j] = cut_global; diff --git a/src/COLLOID/pair_lubricateU_poly.cpp b/src/COLLOID/pair_lubricateU_poly.cpp index 29e192cd94..428aa41cb6 100644 --- a/src/COLLOID/pair_lubricateU_poly.cpp +++ b/src/COLLOID/pair_lubricateU_poly.cpp @@ -1104,7 +1104,7 @@ void PairLubricateUPoly::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_inner[i][j] = cut_inner_global; cut[i][j] = cut_global; diff --git a/src/DIPOLE/pair_lj_cut_dipole_cut.cpp b/src/DIPOLE/pair_lj_cut_dipole_cut.cpp index c57eb09e52..addd02e505 100644 --- a/src/DIPOLE/pair_lj_cut_dipole_cut.cpp +++ b/src/DIPOLE/pair_lj_cut_dipole_cut.cpp @@ -307,7 +307,7 @@ void PairLJCutDipoleCut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_lj[i][j] = cut_lj_global; cut_coul[i][j] = cut_coul_global; diff --git a/src/DIPOLE/pair_lj_cut_dipole_long.cpp b/src/DIPOLE/pair_lj_cut_dipole_long.cpp index ae85b55ff7..78922e356f 100644 --- a/src/DIPOLE/pair_lj_cut_dipole_long.cpp +++ b/src/DIPOLE/pair_lj_cut_dipole_long.cpp @@ -140,174 +140,174 @@ void PairLJCutDipoleLong::compute(int eflag, int vflag) jtype = type[j]; if (rsq < cutsq[itype][jtype]) { - r2inv = 1.0/rsq; - rinv = sqrt(r2inv); + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); - if (rsq < cut_coulsq) { - r = sqrt(rsq); - grij = g_ewald * r; - expm2 = exp(-grij*grij); - t = 1.0 / (1.0 + EWALD_P*grij); - erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + if (rsq < cut_coulsq) { + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - pdotp = mu[i][0]*mu[j][0] + mu[i][1]*mu[j][1] + mu[i][2]*mu[j][2]; - pidotr = mu[i][0]*delx + mu[i][1]*dely + mu[i][2]*delz; - pjdotr = mu[j][0]*delx + mu[j][1]*dely + mu[j][2]*delz; + pdotp = mu[i][0]*mu[j][0] + mu[i][1]*mu[j][1] + mu[i][2]*mu[j][2]; + pidotr = mu[i][0]*delx + mu[i][1]*dely + mu[i][2]*delz; + pjdotr = mu[j][0]*delx + mu[j][1]*dely + mu[j][2]*delz; - g0 = qtmp*q[j]; - g1 = qtmp*pjdotr - q[j]*pidotr + pdotp; - g2 = -pidotr*pjdotr; + g0 = qtmp*q[j]; + g1 = qtmp*pjdotr - q[j]*pidotr + pdotp; + g2 = -pidotr*pjdotr; - if (factor_coul > 0.0) { - b0 = erfc * rinv; - b1 = (b0 + pre1*expm2) * r2inv; - b2 = (3.0*b1 + pre2*expm2) * r2inv; - b3 = (5.0*b2 + pre3*expm2) * r2inv; + if (factor_coul > 0.0) { + b0 = erfc * rinv; + b1 = (b0 + pre1*expm2) * r2inv; + b2 = (3.0*b1 + pre2*expm2) * r2inv; + b3 = (5.0*b2 + pre3*expm2) * r2inv; - g0b1_g1b2_g2b3 = g0*b1 + g1*b2 + g2*b3; - fdx = delx * g0b1_g1b2_g2b3 - - b1 * (qtmp*mu[j][0] - q[j]*mu[i][0]) + - b2 * (pjdotr*mu[i][0] + pidotr*mu[j][0]); - fdy = dely * g0b1_g1b2_g2b3 - - b1 * (qtmp*mu[j][1] - q[j]*mu[i][1]) + - b2 * (pjdotr*mu[i][1] + pidotr*mu[j][1]); - fdz = delz * g0b1_g1b2_g2b3 - - b1 * (qtmp*mu[j][2] - q[j]*mu[i][2]) + - b2 * (pjdotr*mu[i][2] + pidotr*mu[j][2]); + g0b1_g1b2_g2b3 = g0*b1 + g1*b2 + g2*b3; + fdx = delx * g0b1_g1b2_g2b3 - + b1 * (qtmp*mu[j][0] - q[j]*mu[i][0]) + + b2 * (pjdotr*mu[i][0] + pidotr*mu[j][0]); + fdy = dely * g0b1_g1b2_g2b3 - + b1 * (qtmp*mu[j][1] - q[j]*mu[i][1]) + + b2 * (pjdotr*mu[i][1] + pidotr*mu[j][1]); + fdz = delz * g0b1_g1b2_g2b3 - + b1 * (qtmp*mu[j][2] - q[j]*mu[i][2]) + + b2 * (pjdotr*mu[i][2] + pidotr*mu[j][2]); - zdix = delx * (q[j]*b1 + b2*pjdotr) - b1*mu[j][0]; - zdiy = dely * (q[j]*b1 + b2*pjdotr) - b1*mu[j][1]; - zdiz = delz * (q[j]*b1 + b2*pjdotr) - b1*mu[j][2]; - zdjx = delx * (-qtmp*b1 + b2*pidotr) - b1*mu[i][0]; - zdjy = dely * (-qtmp*b1 + b2*pidotr) - b1*mu[i][1]; - zdjz = delz * (-qtmp*b1 + b2*pidotr) - b1*mu[i][2]; + zdix = delx * (q[j]*b1 + b2*pjdotr) - b1*mu[j][0]; + zdiy = dely * (q[j]*b1 + b2*pjdotr) - b1*mu[j][1]; + zdiz = delz * (q[j]*b1 + b2*pjdotr) - b1*mu[j][2]; + zdjx = delx * (-qtmp*b1 + b2*pidotr) - b1*mu[i][0]; + zdjy = dely * (-qtmp*b1 + b2*pidotr) - b1*mu[i][1]; + zdjz = delz * (-qtmp*b1 + b2*pidotr) - b1*mu[i][2]; - if (factor_coul < 1.0) { - fdx *= factor_coul; - fdy *= factor_coul; - fdz *= factor_coul; - zdix *= factor_coul; - zdiy *= factor_coul; - zdiz *= factor_coul; - zdjx *= factor_coul; - zdjy *= factor_coul; - zdjz *= factor_coul; - } - } else { - fdx = fdy = fdz = 0.0; - zdix = zdiy = zdiz = 0.0; - zdjx = zdjy = zdjz = 0.0; - } + if (factor_coul < 1.0) { + fdx *= factor_coul; + fdy *= factor_coul; + fdz *= factor_coul; + zdix *= factor_coul; + zdiy *= factor_coul; + zdiz *= factor_coul; + zdjx *= factor_coul; + zdjy *= factor_coul; + zdjz *= factor_coul; + } + } else { + fdx = fdy = fdz = 0.0; + zdix = zdiy = zdiz = 0.0; + zdjx = zdjy = zdjz = 0.0; + } - if (factor_coul < 1.0) { - d0 = (erfc - 1.0) * rinv; - d1 = (d0 + pre1*expm2) * r2inv; - d2 = (3.0*d1 + pre2*expm2) * r2inv; - d3 = (5.0*d2 + pre3*expm2) * r2inv; + if (factor_coul < 1.0) { + d0 = (erfc - 1.0) * rinv; + d1 = (d0 + pre1*expm2) * r2inv; + d2 = (3.0*d1 + pre2*expm2) * r2inv; + d3 = (5.0*d2 + pre3*expm2) * r2inv; - g0d1_g1d2_g2d3 = g0*d1 + g1*d2 + g2*d3; - fax = delx * g0d1_g1d2_g2d3 - - d1 * (qtmp*mu[j][0] - q[j]*mu[i][0]) + - d2 * (pjdotr*mu[i][0] + pidotr*mu[j][0]); - fay = dely * g0d1_g1d2_g2d3 - - d1 * (qtmp*mu[j][1] - q[j]*mu[i][1]) + - d2 * (pjdotr*mu[i][1] + pidotr*mu[j][1]); - faz = delz * g0d1_g1d2_g2d3 - - d1 * (qtmp*mu[j][2] - q[j]*mu[i][2]) + - d2 * (pjdotr*mu[i][2] + pidotr*mu[j][2]); + g0d1_g1d2_g2d3 = g0*d1 + g1*d2 + g2*d3; + fax = delx * g0d1_g1d2_g2d3 - + d1 * (qtmp*mu[j][0] - q[j]*mu[i][0]) + + d2 * (pjdotr*mu[i][0] + pidotr*mu[j][0]); + fay = dely * g0d1_g1d2_g2d3 - + d1 * (qtmp*mu[j][1] - q[j]*mu[i][1]) + + d2 * (pjdotr*mu[i][1] + pidotr*mu[j][1]); + faz = delz * g0d1_g1d2_g2d3 - + d1 * (qtmp*mu[j][2] - q[j]*mu[i][2]) + + d2 * (pjdotr*mu[i][2] + pidotr*mu[j][2]); - zaix = delx * (q[j]*d1 + d2*pjdotr) - d1*mu[j][0]; - zaiy = dely * (q[j]*d1 + d2*pjdotr) - d1*mu[j][1]; - zaiz = delz * (q[j]*d1 + d2*pjdotr) - d1*mu[j][2]; - zajx = delx * (-qtmp*d1 + d2*pidotr) - d1*mu[i][0]; - zajy = dely * (-qtmp*d1 + d2*pidotr) - d1*mu[i][1]; - zajz = delz * (-qtmp*d1 + d2*pidotr) - d1*mu[i][2]; + zaix = delx * (q[j]*d1 + d2*pjdotr) - d1*mu[j][0]; + zaiy = dely * (q[j]*d1 + d2*pjdotr) - d1*mu[j][1]; + zaiz = delz * (q[j]*d1 + d2*pjdotr) - d1*mu[j][2]; + zajx = delx * (-qtmp*d1 + d2*pidotr) - d1*mu[i][0]; + zajy = dely * (-qtmp*d1 + d2*pidotr) - d1*mu[i][1]; + zajz = delz * (-qtmp*d1 + d2*pidotr) - d1*mu[i][2]; - if (factor_coul > 0.0) { - facm1 = 1.0 - factor_coul; - fax *= facm1; - fay *= facm1; - faz *= facm1; - zaix *= facm1; - zaiy *= facm1; - zaiz *= facm1; - zajx *= facm1; - zajy *= facm1; - zajz *= facm1; - } - } else { - fax = fay = faz = 0.0; - zaix = zaiy = zaiz = 0.0; - zajx = zajy = zajz = 0.0; - } + if (factor_coul > 0.0) { + facm1 = 1.0 - factor_coul; + fax *= facm1; + fay *= facm1; + faz *= facm1; + zaix *= facm1; + zaiy *= facm1; + zaiz *= facm1; + zajx *= facm1; + zajy *= facm1; + zajz *= facm1; + } + } else { + fax = fay = faz = 0.0; + zaix = zaiy = zaiz = 0.0; + zajx = zajy = zajz = 0.0; + } - forcecoulx = fdx + fax; - forcecouly = fdy + fay; - forcecoulz = fdz + faz; + forcecoulx = fdx + fax; + forcecouly = fdy + fay; + forcecoulz = fdz + faz; - tixcoul = mu[i][1]*(zdiz + zaiz) - mu[i][2]*(zdiy + zaiy); - tiycoul = mu[i][2]*(zdix + zaix) - mu[i][0]*(zdiz + zaiz); - tizcoul = mu[i][0]*(zdiy + zaiy) - mu[i][1]*(zdix + zaix); - tjxcoul = mu[j][1]*(zdjz + zajz) - mu[j][2]*(zdjy + zajy); - tjycoul = mu[j][2]*(zdjx + zajx) - mu[j][0]*(zdjz + zajz); - tjzcoul = mu[j][0]*(zdjy + zajy) - mu[j][1]*(zdjx + zajx); + tixcoul = mu[i][1]*(zdiz + zaiz) - mu[i][2]*(zdiy + zaiy); + tiycoul = mu[i][2]*(zdix + zaix) - mu[i][0]*(zdiz + zaiz); + tizcoul = mu[i][0]*(zdiy + zaiy) - mu[i][1]*(zdix + zaix); + tjxcoul = mu[j][1]*(zdjz + zajz) - mu[j][2]*(zdjy + zajy); + tjycoul = mu[j][2]*(zdjx + zajx) - mu[j][0]*(zdjz + zajz); + tjzcoul = mu[j][0]*(zdjy + zajy) - mu[j][1]*(zdjx + zajx); - } else { - forcecoulx = forcecouly = forcecoulz = 0.0; - tixcoul = tiycoul = tizcoul = 0.0; - tjxcoul = tjycoul = tjzcoul = 0.0; - } - - // LJ interaction - - if (rsq < cut_ljsq[itype][jtype]) { - r6inv = r2inv*r2inv*r2inv; - forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]); - fforce = factor_lj * forcelj*r2inv; - } else fforce = 0.0; - - // total force - - fx = qqrd2e*forcecoulx + delx*fforce; - fy = qqrd2e*forcecouly + dely*fforce; - fz = qqrd2e*forcecoulz + delz*fforce; - - // force & torque accumulation - - f[i][0] += fx; - f[i][1] += fy; - f[i][2] += fz; - torque[i][0] += qqrd2e*tixcoul; - torque[i][1] += qqrd2e*tiycoul; - torque[i][2] += qqrd2e*tizcoul; - - if (newton_pair || j < nlocal) { - f[j][0] -= fx; - f[j][1] -= fy; - f[j][2] -= fz; - torque[j][0] += qqrd2e*tjxcoul; - torque[j][1] += qqrd2e*tjycoul; - torque[j][2] += qqrd2e*tjzcoul; - } - - if (eflag) { - if (rsq < cut_coulsq && factor_coul > 0.0) { - ecoul = qqrd2e*(b0*g0 + b1*g1 + b2*g2); - if (factor_coul < 1.0) { - ecoul *= factor_coul; - ecoul += (1-factor_coul) * qqrd2e * (d0*g0 + d1*g1 + d2*g2); + } else { + forcecoulx = forcecouly = forcecoulz = 0.0; + tixcoul = tiycoul = tizcoul = 0.0; + tjxcoul = tjycoul = tjzcoul = 0.0; } - } else ecoul = 0.0; - if (rsq < cut_ljsq[itype][jtype]) { - evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) - - offset[itype][jtype]; - evdwl *= factor_lj; - } else evdwl = 0.0; - } + // LJ interaction - if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, - evdwl,ecoul,fx,fy,fz,delx,dely,delz); + if (rsq < cut_ljsq[itype][jtype]) { + r6inv = r2inv*r2inv*r2inv; + forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]); + fforce = factor_lj * forcelj*r2inv; + } else fforce = 0.0; + + // total force + + fx = qqrd2e*forcecoulx + delx*fforce; + fy = qqrd2e*forcecouly + dely*fforce; + fz = qqrd2e*forcecoulz + delz*fforce; + + // force & torque accumulation + + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + torque[i][0] += qqrd2e*tixcoul; + torque[i][1] += qqrd2e*tiycoul; + torque[i][2] += qqrd2e*tizcoul; + + if (newton_pair || j < nlocal) { + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; + torque[j][0] += qqrd2e*tjxcoul; + torque[j][1] += qqrd2e*tjycoul; + torque[j][2] += qqrd2e*tjzcoul; + } + + if (eflag) { + if (rsq < cut_coulsq && factor_coul > 0.0) { + ecoul = qqrd2e*(b0*g0 + b1*g1 + b2*g2); + if (factor_coul < 1.0) { + ecoul *= factor_coul; + ecoul += (1-factor_coul) * qqrd2e * (d0*g0 + d1*g1 + d2*g2); + } + } else ecoul = 0.0; + + if (rsq < cut_ljsq[itype][jtype]) { + evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) - + offset[itype][jtype]; + evdwl *= factor_lj; + } else evdwl = 0.0; + } + + if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, + evdwl,ecoul,fx,fy,fz,delx,dely,delz); } } } @@ -360,8 +360,8 @@ void PairLJCutDipoleLong::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) - if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } @@ -407,7 +407,7 @@ double PairLJCutDipoleLong::init_one(int i, int j) { if (setflag[i][j] == 0) { epsilon[i][j] = mix_energy(epsilon[i][i],epsilon[j][j], - sigma[i][i],sigma[j][j]); + sigma[i][i],sigma[j][j]); sigma[i][j] = mix_distance(sigma[i][i],sigma[j][j]); cut_lj[i][j] = mix_distance(cut_lj[i][i],cut_lj[j][j]); } @@ -472,9 +472,9 @@ void PairLJCutDipoleLong::write_restart(FILE *fp) for (j = i; j <= atom->ntypes; j++) { fwrite(&setflag[i][j],sizeof(int),1,fp); if (setflag[i][j]) { - fwrite(&epsilon[i][j],sizeof(double),1,fp); - fwrite(&sigma[i][j],sizeof(double),1,fp); - fwrite(&cut_lj[i][j],sizeof(double),1,fp); + fwrite(&epsilon[i][j],sizeof(double),1,fp); + fwrite(&sigma[i][j],sizeof(double),1,fp); + fwrite(&cut_lj[i][j],sizeof(double),1,fp); } } } @@ -496,14 +496,14 @@ void PairLJCutDipoleLong::read_restart(FILE *fp) if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); if (setflag[i][j]) { - if (me == 0) { - fread(&epsilon[i][j],sizeof(double),1,fp); - fread(&sigma[i][j],sizeof(double),1,fp); - fread(&cut_lj[i][j],sizeof(double),1,fp); - } - MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&cut_lj[i][j],1,MPI_DOUBLE,0,world); + if (me == 0) { + fread(&epsilon[i][j],sizeof(double),1,fp); + fread(&sigma[i][j],sizeof(double),1,fp); + fread(&cut_lj[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_lj[i][j],1,MPI_DOUBLE,0,world); } } } diff --git a/src/DIPOLE/pair_lj_long_dipole_long.cpp b/src/DIPOLE/pair_lj_long_dipole_long.cpp index ef865b66cd..15ac2e788c 100644 --- a/src/DIPOLE/pair_lj_long_dipole_long.cpp +++ b/src/DIPOLE/pair_lj_long_dipole_long.cpp @@ -102,8 +102,8 @@ void PairLJLongDipoleLong::settings(int narg, char **arg) if (allocated) { // reset explicit cuts int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) - if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } @@ -343,9 +343,9 @@ void PairLJLongDipoleLong::write_restart(FILE *fp) for (j = i; j <= atom->ntypes; j++) { fwrite(&setflag[i][j],sizeof(int),1,fp); if (setflag[i][j]) { - fwrite(&epsilon_read[i][j],sizeof(double),1,fp); - fwrite(&sigma_read[i][j],sizeof(double),1,fp); - fwrite(&cut_lj_read[i][j],sizeof(double),1,fp); + fwrite(&epsilon_read[i][j],sizeof(double),1,fp); + fwrite(&sigma_read[i][j],sizeof(double),1,fp); + fwrite(&cut_lj_read[i][j],sizeof(double),1,fp); } } } @@ -367,14 +367,14 @@ void PairLJLongDipoleLong::read_restart(FILE *fp) if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); if (setflag[i][j]) { - if (me == 0) { - fread(&epsilon_read[i][j],sizeof(double),1,fp); - fread(&sigma_read[i][j],sizeof(double),1,fp); - fread(&cut_lj_read[i][j],sizeof(double),1,fp); - } - MPI_Bcast(&epsilon_read[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&sigma_read[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&cut_lj_read[i][j],1,MPI_DOUBLE,0,world); + if (me == 0) { + fread(&epsilon_read[i][j],sizeof(double),1,fp); + fread(&sigma_read[i][j],sizeof(double),1,fp); + fread(&cut_lj_read[i][j],sizeof(double),1,fp); + } + MPI_Bcast(&epsilon_read[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&sigma_read[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_lj_read[i][j],1,MPI_DOUBLE,0,world); } } } diff --git a/src/KOKKOS/pair_coul_debye_kokkos.cpp b/src/KOKKOS/pair_coul_debye_kokkos.cpp index dc85c39832..0771572e46 100644 --- a/src/KOKKOS/pair_coul_debye_kokkos.cpp +++ b/src/KOKKOS/pair_coul_debye_kokkos.cpp @@ -241,7 +241,7 @@ void PairCoulDebyeKokkos::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } diff --git a/src/KSPACE/pair_born_coul_long.cpp b/src/KSPACE/pair_born_coul_long.cpp index 14d43f4c63..e588a30b55 100644 --- a/src/KSPACE/pair_born_coul_long.cpp +++ b/src/KSPACE/pair_born_coul_long.cpp @@ -250,7 +250,7 @@ void PairBornCoulLong::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/KSPACE/pair_buck_coul_long.cpp b/src/KSPACE/pair_buck_coul_long.cpp index 9cd8485e5c..476e3c716a 100644 --- a/src/KSPACE/pair_buck_coul_long.cpp +++ b/src/KSPACE/pair_buck_coul_long.cpp @@ -240,7 +240,7 @@ void PairBuckCoulLong::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/KSPACE/pair_buck_long_coul_long.cpp b/src/KSPACE/pair_buck_long_coul_long.cpp index 26bcb136b3..8aa4d72083 100644 --- a/src/KSPACE/pair_buck_long_coul_long.cpp +++ b/src/KSPACE/pair_buck_long_coul_long.cpp @@ -104,7 +104,7 @@ void PairBuckLongCoulLong::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_buck[i][j] = cut_buck_global; } } diff --git a/src/KSPACE/pair_lj_cut_coul_long.cpp b/src/KSPACE/pair_lj_cut_coul_long.cpp index 764aebc522..e9799843fc 100644 --- a/src/KSPACE/pair_lj_cut_coul_long.cpp +++ b/src/KSPACE/pair_lj_cut_coul_long.cpp @@ -608,7 +608,7 @@ void PairLJCutCoulLong::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/KSPACE/pair_lj_cut_tip4p_long.cpp b/src/KSPACE/pair_lj_cut_tip4p_long.cpp index 146d4e6f37..588d21ac66 100644 --- a/src/KSPACE/pair_lj_cut_tip4p_long.cpp +++ b/src/KSPACE/pair_lj_cut_tip4p_long.cpp @@ -450,7 +450,7 @@ void PairLJCutTIP4PLong::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/KSPACE/pair_lj_long_coul_long.cpp b/src/KSPACE/pair_lj_long_coul_long.cpp index e474347935..44256a9fbb 100644 --- a/src/KSPACE/pair_lj_long_coul_long.cpp +++ b/src/KSPACE/pair_lj_long_coul_long.cpp @@ -103,7 +103,7 @@ void PairLJLongCoulLong::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/KSPACE/pair_lj_long_tip4p_long.cpp b/src/KSPACE/pair_lj_long_tip4p_long.cpp index c3d95c37a6..fd318fd75b 100644 --- a/src/KSPACE/pair_lj_long_tip4p_long.cpp +++ b/src/KSPACE/pair_lj_long_tip4p_long.cpp @@ -1439,8 +1439,8 @@ void PairLJLongTIP4PLong::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) - if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/MC/pair_dsmc.cpp b/src/MC/pair_dsmc.cpp index 344faf87f6..29ecde2023 100644 --- a/src/MC/pair_dsmc.cpp +++ b/src/MC/pair_dsmc.cpp @@ -230,7 +230,7 @@ void PairDSMC::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/MISC/pair_nm_cut.cpp b/src/MISC/pair_nm_cut.cpp index 467be1b7be..0163cdcf58 100644 --- a/src/MISC/pair_nm_cut.cpp +++ b/src/MISC/pair_nm_cut.cpp @@ -187,7 +187,7 @@ void PairNMCut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/MISC/pair_nm_cut_coul_cut.cpp b/src/MISC/pair_nm_cut_coul_cut.cpp index 86fa09f176..5cb2452906 100644 --- a/src/MISC/pair_nm_cut_coul_cut.cpp +++ b/src/MISC/pair_nm_cut_coul_cut.cpp @@ -213,7 +213,7 @@ void PairNMCutCoulCut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_lj[i][j] = cut_lj_global; cut_coul[i][j] = cut_coul_global; diff --git a/src/MISC/pair_nm_cut_coul_long.cpp b/src/MISC/pair_nm_cut_coul_long.cpp index c186d19539..15d5d03757 100644 --- a/src/MISC/pair_nm_cut_coul_long.cpp +++ b/src/MISC/pair_nm_cut_coul_long.cpp @@ -255,7 +255,7 @@ void PairNMCutCoulLong::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/MOLECULE/pair_lj_cut_tip4p_cut.cpp b/src/MOLECULE/pair_lj_cut_tip4p_cut.cpp index 15f5d52961..e3093e4d10 100644 --- a/src/MOLECULE/pair_lj_cut_tip4p_cut.cpp +++ b/src/MOLECULE/pair_lj_cut_tip4p_cut.cpp @@ -441,7 +441,7 @@ void PairLJCutTIP4PCut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } @@ -596,7 +596,7 @@ void PairLJCutTIP4PCut::write_restart(FILE *fp) for (i = 1; i <= atom->ntypes; i++) { for (j = i; j <= atom->ntypes; j++) { fwrite(&setflag[i][j],sizeof(int),1,fp); - if (setflag[i][j]){ + if (setflag[i][j]) { fwrite(&epsilon[i][j],sizeof(double),1,fp); fwrite(&sigma[i][j],sizeof(double),1,fp); fwrite(&cut_lj[i][j],sizeof(double),1,fp); diff --git a/src/USER-AWPMD/pair_awpmd_cut.cpp b/src/USER-AWPMD/pair_awpmd_cut.cpp index cd89c3984d..2ce1a92684 100644 --- a/src/USER-AWPMD/pair_awpmd_cut.cpp +++ b/src/USER-AWPMD/pair_awpmd_cut.cpp @@ -454,16 +454,6 @@ void PairAWPMDCut::settings(int narg, char **arg){ else if(!strcmp(arg[i],"flex_press")) flexible_pressure_flag = 1; } - - - // reset cutoffs that have been explicitly set - /* - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) - if (setflag[i][j]) cut[i][j] = cut_global; - }*/ } /* ---------------------------------------------------------------------- @@ -489,7 +479,7 @@ void PairAWPMDCut::coeff(int narg, char **arg) else{ int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } diff --git a/src/USER-CGSDK/pair_lj_sdk.cpp b/src/USER-CGSDK/pair_lj_sdk.cpp index 665f188ce9..23b0f47a6d 100644 --- a/src/USER-CGSDK/pair_lj_sdk.cpp +++ b/src/USER-CGSDK/pair_lj_sdk.cpp @@ -248,7 +248,7 @@ void PairLJSDK::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-CGSDK/pair_lj_sdk_coul_long.cpp b/src/USER-CGSDK/pair_lj_sdk_coul_long.cpp index 5e4a0db31c..845c5822a7 100644 --- a/src/USER-CGSDK/pair_lj_sdk_coul_long.cpp +++ b/src/USER-CGSDK/pair_lj_sdk_coul_long.cpp @@ -308,7 +308,7 @@ void PairLJSDKCoulLong::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/USER-DPD/pair_dpd_fdt.cpp b/src/USER-DPD/pair_dpd_fdt.cpp index e7e9febd82..26f5806cf1 100644 --- a/src/USER-DPD/pair_dpd_fdt.cpp +++ b/src/USER-DPD/pair_dpd_fdt.cpp @@ -267,7 +267,7 @@ void PairDPDfdt::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-DPD/pair_dpd_fdt_energy.cpp b/src/USER-DPD/pair_dpd_fdt_energy.cpp index 569588b6fd..c3fc7fb3f5 100644 --- a/src/USER-DPD/pair_dpd_fdt_energy.cpp +++ b/src/USER-DPD/pair_dpd_fdt_energy.cpp @@ -351,7 +351,7 @@ void PairDPDfdtEnergy::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-DPD/pair_exp6_rx.cpp b/src/USER-DPD/pair_exp6_rx.cpp index deff0d34e9..61b62efc53 100644 --- a/src/USER-DPD/pair_exp6_rx.cpp +++ b/src/USER-DPD/pair_exp6_rx.cpp @@ -562,7 +562,7 @@ void PairExp6rx::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } diff --git a/src/USER-DRUDE/pair_lj_cut_thole_long.cpp b/src/USER-DRUDE/pair_lj_cut_thole_long.cpp index 671de7090b..a74f51477c 100644 --- a/src/USER-DRUDE/pair_lj_cut_thole_long.cpp +++ b/src/USER-DRUDE/pair_lj_cut_thole_long.cpp @@ -295,11 +295,11 @@ void PairLJCutTholeLong::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) - if (setflag[i][j]) { - thole[i][j] = thole_global; - cut_lj[i][j] = cut_lj_global; - } + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) { + thole[i][j] = thole_global; + cut_lj[i][j] = cut_lj_global; + } } } diff --git a/src/USER-DRUDE/pair_thole.cpp b/src/USER-DRUDE/pair_thole.cpp index 0ed94ebbc9..abb37b82b7 100644 --- a/src/USER-DRUDE/pair_thole.cpp +++ b/src/USER-DRUDE/pair_thole.cpp @@ -199,11 +199,11 @@ void PairThole::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) - if (setflag[i][j]) { - thole[i][j] = thole_global; - cut[i][j] = cut_global; - } + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) { + thole[i][j] = thole_global; + cut[i][j] = cut_global; + } } } diff --git a/src/USER-EFF/pair_eff_cut.cpp b/src/USER-EFF/pair_eff_cut.cpp index 66f59c86c3..850c523629 100644 --- a/src/USER-EFF/pair_eff_cut.cpp +++ b/src/USER-EFF/pair_eff_cut.cpp @@ -846,7 +846,7 @@ void PairEffCut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-FEP/pair_coul_cut_soft.cpp b/src/USER-FEP/pair_coul_cut_soft.cpp index 2c675c607f..a7ac8004fe 100644 --- a/src/USER-FEP/pair_coul_cut_soft.cpp +++ b/src/USER-FEP/pair_coul_cut_soft.cpp @@ -168,7 +168,7 @@ void PairCoulCutSoft::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-FEP/pair_lj_cut_coul_cut_soft.cpp b/src/USER-FEP/pair_lj_cut_coul_cut_soft.cpp index 16da07a657..b2e781c57b 100644 --- a/src/USER-FEP/pair_lj_cut_coul_cut_soft.cpp +++ b/src/USER-FEP/pair_lj_cut_coul_cut_soft.cpp @@ -211,7 +211,7 @@ void PairLJCutCoulCutSoft::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_lj[i][j] = cut_lj_global; cut_coul[i][j] = cut_coul_global; diff --git a/src/USER-FEP/pair_lj_cut_coul_long_soft.cpp b/src/USER-FEP/pair_lj_cut_coul_long_soft.cpp index 6636e72715..3b80729b0b 100644 --- a/src/USER-FEP/pair_lj_cut_coul_long_soft.cpp +++ b/src/USER-FEP/pair_lj_cut_coul_long_soft.cpp @@ -582,7 +582,7 @@ void PairLJCutCoulLongSoft::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/USER-FEP/pair_lj_cut_soft.cpp b/src/USER-FEP/pair_lj_cut_soft.cpp index 3798b27936..800fdfcde8 100644 --- a/src/USER-FEP/pair_lj_cut_soft.cpp +++ b/src/USER-FEP/pair_lj_cut_soft.cpp @@ -462,7 +462,7 @@ void PairLJCutSoft::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp b/src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp index 5beed08b72..8d9162e564 100644 --- a/src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp +++ b/src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp @@ -436,7 +436,7 @@ void PairLJCutTIP4PLongSoft::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/USER-FEP/pair_morse_soft.cpp b/src/USER-FEP/pair_morse_soft.cpp index 6c86d8916f..1333bc28ca 100644 --- a/src/USER-FEP/pair_morse_soft.cpp +++ b/src/USER-FEP/pair_morse_soft.cpp @@ -222,7 +222,7 @@ void PairMorseSoft::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-MISC/pair_buck_mdf.cpp b/src/USER-MISC/pair_buck_mdf.cpp index 3a433b16bd..6c3dcbd7ee 100644 --- a/src/USER-MISC/pair_buck_mdf.cpp +++ b/src/USER-MISC/pair_buck_mdf.cpp @@ -197,7 +197,7 @@ void PairBuckMDF::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-MISC/pair_coul_diel.cpp b/src/USER-MISC/pair_coul_diel.cpp index a732ace1a0..a62362aa6f 100644 --- a/src/USER-MISC/pair_coul_diel.cpp +++ b/src/USER-MISC/pair_coul_diel.cpp @@ -168,7 +168,7 @@ void PairCoulDiel::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-MISC/pair_gauss_cut.cpp b/src/USER-MISC/pair_gauss_cut.cpp index f44b1bbd2d..3836187a64 100644 --- a/src/USER-MISC/pair_gauss_cut.cpp +++ b/src/USER-MISC/pair_gauss_cut.cpp @@ -175,7 +175,7 @@ void PairGaussCut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-MISC/pair_kolmogorov_crespi_z.cpp b/src/USER-MISC/pair_kolmogorov_crespi_z.cpp index ddb39f6870..15a325e106 100644 --- a/src/USER-MISC/pair_kolmogorov_crespi_z.cpp +++ b/src/USER-MISC/pair_kolmogorov_crespi_z.cpp @@ -209,7 +209,7 @@ void PairKolmogorovCrespiZ::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-MISC/pair_lennard_mdf.cpp b/src/USER-MISC/pair_lennard_mdf.cpp index 3a81955199..b959f513c0 100644 --- a/src/USER-MISC/pair_lennard_mdf.cpp +++ b/src/USER-MISC/pair_lennard_mdf.cpp @@ -197,7 +197,7 @@ void PairLJ_AB_MDF::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_inner[i][j] = cut_inner_global; cut[i][j] = cut_global; diff --git a/src/USER-MISC/pair_lj_mdf.cpp b/src/USER-MISC/pair_lj_mdf.cpp index 3b52cf0b86..ebec1f80e1 100644 --- a/src/USER-MISC/pair_lj_mdf.cpp +++ b/src/USER-MISC/pair_lj_mdf.cpp @@ -197,7 +197,7 @@ void PairLJMDF::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_inner[i][j] = cut_inner_global; cut[i][j] = cut_global; diff --git a/src/USER-MISC/pair_lj_sf.cpp b/src/USER-MISC/pair_lj_sf.cpp index 32f45ff48d..a34119f880 100644 --- a/src/USER-MISC/pair_lj_sf.cpp +++ b/src/USER-MISC/pair_lj_sf.cpp @@ -181,7 +181,7 @@ void PairLJShiftedForce::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-MISC/pair_lj_sf_dipole_sf.cpp b/src/USER-MISC/pair_lj_sf_dipole_sf.cpp index 33f10f2f12..fb63638b52 100644 --- a/src/USER-MISC/pair_lj_sf_dipole_sf.cpp +++ b/src/USER-MISC/pair_lj_sf_dipole_sf.cpp @@ -342,7 +342,7 @@ void PairLJSFDipoleSF::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_lj[i][j] = cut_lj_global; cut_coul[i][j] = cut_coul_global; diff --git a/src/USER-MISC/pair_momb.cpp b/src/USER-MISC/pair_momb.cpp index b7337c17a8..0d8d2e060e 100644 --- a/src/USER-MISC/pair_momb.cpp +++ b/src/USER-MISC/pair_momb.cpp @@ -199,7 +199,7 @@ void PairMomb::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-MISC/pair_morse_smooth_linear.cpp b/src/USER-MISC/pair_morse_smooth_linear.cpp index ea33510b58..4ef86b6b88 100644 --- a/src/USER-MISC/pair_morse_smooth_linear.cpp +++ b/src/USER-MISC/pair_morse_smooth_linear.cpp @@ -171,7 +171,7 @@ void PairMorseSmoothLinear::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/USER-MISC/pair_srp.cpp b/src/USER-MISC/pair_srp.cpp index 18ea4dc332..46c53349fa 100644 --- a/src/USER-MISC/pair_srp.cpp +++ b/src/USER-MISC/pair_srp.cpp @@ -408,7 +408,7 @@ void PairSRP::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= bptype; i++) - for (j = i+1; j <= bptype; j++) + for (j = i; j <= bptype; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_beck.cpp b/src/pair_beck.cpp index e3e8b0c5cc..36e44e5c2e 100644 --- a/src/pair_beck.cpp +++ b/src/pair_beck.cpp @@ -181,10 +181,8 @@ void PairBeck::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) - if (setflag[i][j]) { - cut[i][j] = cut_global; - } + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_born.cpp b/src/pair_born.cpp index 5fc26e2529..6d420fb36b 100644 --- a/src/pair_born.cpp +++ b/src/pair_born.cpp @@ -185,7 +185,7 @@ void PairBorn::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_born_coul_dsf.cpp b/src/pair_born_coul_dsf.cpp index 87c2a14baa..caec95759a 100644 --- a/src/pair_born_coul_dsf.cpp +++ b/src/pair_born_coul_dsf.cpp @@ -226,9 +226,8 @@ void PairBornCoulDSF::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) - if (setflag[i][j]) - cut_lj[i][j] = cut_lj_global; + for (j = i; j <= atom->ntypes; j++) + if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/pair_born_coul_wolf.cpp b/src/pair_born_coul_wolf.cpp index 31c0cc715c..bad0c5ed3e 100644 --- a/src/pair_born_coul_wolf.cpp +++ b/src/pair_born_coul_wolf.cpp @@ -229,7 +229,7 @@ void PairBornCoulWolf::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } } diff --git a/src/pair_buck.cpp b/src/pair_buck.cpp index ac15e82020..e4da772e0a 100644 --- a/src/pair_buck.cpp +++ b/src/pair_buck.cpp @@ -176,7 +176,7 @@ void PairBuck::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_buck_coul_cut.cpp b/src/pair_buck_coul_cut.cpp index 7c948f58a8..c052c3100a 100644 --- a/src/pair_buck_coul_cut.cpp +++ b/src/pair_buck_coul_cut.cpp @@ -205,7 +205,7 @@ void PairBuckCoulCut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_lj[i][j] = cut_lj_global; cut_coul[i][j] = cut_coul_global; diff --git a/src/pair_coul_cut.cpp b/src/pair_coul_cut.cpp index fec592bb19..b505dcb02c 100644 --- a/src/pair_coul_cut.cpp +++ b/src/pair_coul_cut.cpp @@ -155,7 +155,7 @@ void PairCoulCut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_coul_debye.cpp b/src/pair_coul_debye.cpp index dcb84d7e2d..df4555753f 100644 --- a/src/pair_coul_debye.cpp +++ b/src/pair_coul_debye.cpp @@ -126,7 +126,7 @@ void PairCoulDebye::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_dpd.cpp b/src/pair_dpd.cpp index b5b959f85b..61f700a33e 100644 --- a/src/pair_dpd.cpp +++ b/src/pair_dpd.cpp @@ -207,7 +207,7 @@ void PairDPD::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_dpd_tstat.cpp b/src/pair_dpd_tstat.cpp index 6d8f75d95d..0a5ebd33f8 100644 --- a/src/pair_dpd_tstat.cpp +++ b/src/pair_dpd_tstat.cpp @@ -159,7 +159,7 @@ void PairDPDTstat::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_gauss.cpp b/src/pair_gauss.cpp index c8f6afdacc..c66cfc2c80 100644 --- a/src/pair_gauss.cpp +++ b/src/pair_gauss.cpp @@ -173,7 +173,7 @@ void PairGauss::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_lj96_cut.cpp b/src/pair_lj96_cut.cpp index 1f79226e64..f4b2747d40 100644 --- a/src/pair_lj96_cut.cpp +++ b/src/pair_lj96_cut.cpp @@ -442,7 +442,7 @@ void PairLJ96Cut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_lj_cubic.cpp b/src/pair_lj_cubic.cpp index 633c12019e..c96d4490cb 100644 --- a/src/pair_lj_cubic.cpp +++ b/src/pair_lj_cubic.cpp @@ -179,14 +179,8 @@ void PairLJCubic::settings(int narg, char **arg) { if (narg != 0) error->all(FLERR,"Illegal pair_style command"); - // reset cutoffs that have been explicitly set - - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) - if (setflag[i][j]) cut[i][j] = 0.0; - } + // NOTE: lj/cubic has no global cutoff. instead the cutoff is + // inferred from the lj parameters. so we must not reset cutoffs here. } /* ---------------------------------------------------------------------- diff --git a/src/pair_lj_cut.cpp b/src/pair_lj_cut.cpp index bffdd7fff4..a3ebf414c9 100644 --- a/src/pair_lj_cut.cpp +++ b/src/pair_lj_cut.cpp @@ -436,7 +436,7 @@ void PairLJCut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_lj_cut_coul_cut.cpp b/src/pair_lj_cut_coul_cut.cpp index 0d2bff3c9f..0d62c43dc3 100644 --- a/src/pair_lj_cut_coul_cut.cpp +++ b/src/pair_lj_cut_coul_cut.cpp @@ -198,7 +198,7 @@ void PairLJCutCoulCut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_lj[i][j] = cut_lj_global; cut_coul[i][j] = cut_coul_global; diff --git a/src/pair_lj_cut_coul_dsf.cpp b/src/pair_lj_cut_coul_dsf.cpp index 538336d8e6..09293a6f4c 100644 --- a/src/pair_lj_cut_coul_dsf.cpp +++ b/src/pair_lj_cut_coul_dsf.cpp @@ -224,7 +224,7 @@ void PairLJCutCoulDSF::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut_lj[i][j] = cut_lj_global; } diff --git a/src/pair_lj_expand.cpp b/src/pair_lj_expand.cpp index 90f1ae0df2..2fd780472a 100644 --- a/src/pair_lj_expand.cpp +++ b/src/pair_lj_expand.cpp @@ -179,7 +179,7 @@ void PairLJExpand::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_lj_gromacs.cpp b/src/pair_lj_gromacs.cpp index bb0a6e647e..3375c6c4e2 100644 --- a/src/pair_lj_gromacs.cpp +++ b/src/pair_lj_gromacs.cpp @@ -204,7 +204,7 @@ void PairLJGromacs::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_inner[i][j] = cut_inner_global; cut[i][j] = cut_global; diff --git a/src/pair_lj_smooth.cpp b/src/pair_lj_smooth.cpp index c59b35aebf..1afaef9235 100644 --- a/src/pair_lj_smooth.cpp +++ b/src/pair_lj_smooth.cpp @@ -206,7 +206,7 @@ void PairLJSmooth::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) { cut_inner[i][j] = cut_inner_global; cut[i][j] = cut_global; diff --git a/src/pair_lj_smooth_linear.cpp b/src/pair_lj_smooth_linear.cpp index 189475aa71..415ca7b6d3 100644 --- a/src/pair_lj_smooth_linear.cpp +++ b/src/pair_lj_smooth_linear.cpp @@ -175,7 +175,7 @@ void PairLJSmoothLinear::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } diff --git a/src/pair_mie_cut.cpp b/src/pair_mie_cut.cpp index 3c13c19a3b..312fb7bc70 100644 --- a/src/pair_mie_cut.cpp +++ b/src/pair_mie_cut.cpp @@ -447,7 +447,7 @@ void PairMIECut::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_morse.cpp b/src/pair_morse.cpp index 2144ad5008..5f90642065 100644 --- a/src/pair_morse.cpp +++ b/src/pair_morse.cpp @@ -165,7 +165,7 @@ void PairMorse::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_soft.cpp b/src/pair_soft.cpp index 8ffd139307..b05058b4dc 100644 --- a/src/pair_soft.cpp +++ b/src/pair_soft.cpp @@ -158,7 +158,7 @@ void PairSoft::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } diff --git a/src/pair_yukawa.cpp b/src/pair_yukawa.cpp index a38e2aa880..0e5fd36cd6 100644 --- a/src/pair_yukawa.cpp +++ b/src/pair_yukawa.cpp @@ -162,7 +162,7 @@ void PairYukawa::settings(int narg, char **arg) if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } From d807ba1974d548515a2af77c340871c45663b920 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 May 2017 00:26:39 -0400 Subject: [PATCH 023/302] whitespace cleanup --- src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp b/src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp index af19f3eb3b..1e34b06478 100644 --- a/src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp +++ b/src/MOLECULE/pair_lj_charmmfsw_coul_charmmfsh.cpp @@ -393,10 +393,10 @@ void PairLJCharmmfswCoulCharmmfsh::write_restart(FILE *fp) for (j = i; j <= atom->ntypes; j++) { fwrite(&setflag[i][j],sizeof(int),1,fp); if (setflag[i][j]) { - fwrite(&epsilon[i][j],sizeof(double),1,fp); - fwrite(&sigma[i][j],sizeof(double),1,fp); - fwrite(&eps14[i][j],sizeof(double),1,fp); - fwrite(&sigma14[i][j],sizeof(double),1,fp); + fwrite(&epsilon[i][j],sizeof(double),1,fp); + fwrite(&sigma[i][j],sizeof(double),1,fp); + fwrite(&eps14[i][j],sizeof(double),1,fp); + fwrite(&sigma14[i][j],sizeof(double),1,fp); } } } From 66084ad1f41adf9067bcf6c09f3ee0c2deef74b6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 May 2017 04:27:15 -0400 Subject: [PATCH 024/302] fix typo in rerun docs. closes #486 --- doc/src/rerun.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/rerun.txt b/doc/src/rerun.txt index 860ee68033..edf94cc711 100644 --- a/doc/src/rerun.txt +++ b/doc/src/rerun.txt @@ -15,7 +15,7 @@ rerun file1 file2 ... keyword args ... :pre file1,file2,... = dump file(s) to read :ulb,l one or more keywords may be appended, keyword {dump} must appear and be last :l keyword = {first} or {last} or {every} or {skip} or {start} or {stop} or {dump} - {first} args = Nfirts + {first} args = Nfirst Nfirst = dump timestep to start on {last} args = Nlast Nlast = dumptimestep to stop on From ca87e571294f80043840ffab745ae42312891612 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 May 2017 11:58:34 -0400 Subject: [PATCH 025/302] improved version of AIREBO splines based on a suggestion by markus hoehnerbach --- src/MANYBODY/pair_airebo.cpp | 84 +++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 34 deletions(-) diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index 00108e7f2d..e3f23a9997 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -3107,10 +3107,10 @@ double PairAIREBO::PijSpline(double NijC, double NijH, int typei, int typej, // if inputs are out of bounds set them back to a point in bounds - if (NijC < pCCdom[0][0]) NijC=pCCdom[0][0]; - if (NijC >= pCCdom[0][1]) NijC=pCCdom[0][1]-TOL; - if (NijH < pCCdom[1][0]) NijH=pCCdom[1][0]; - if (NijH >= pCCdom[1][1]) NijH=pCCdom[1][1]-TOL; + if (NijC < pCCdom[0][0]) NijC=pCCdom[0][0]; + if (NijC > pCCdom[0][1]) NijC=pCCdom[0][1]; + if (NijH < pCCdom[1][0]) NijH=pCCdom[1][0]; + if (NijH > pCCdom[1][1]) NijH=pCCdom[1][1]; x = (int) floor(NijC); y = (int) floor(NijH); @@ -3119,6 +3119,8 @@ double PairAIREBO::PijSpline(double NijC, double NijH, int typei, int typej, dN2[0] = PCCdfdx[x][y]; dN2[1] = PCCdfdy[x][y]; } else { + if (NijC == pCCdom[0][1]) --x; + if (NijH == pCCdom[1][1]) --y; Pij = Spbicubic(NijC,NijH,pCC[x][y],dN2); } @@ -3126,10 +3128,10 @@ double PairAIREBO::PijSpline(double NijC, double NijH, int typei, int typej, // if inputs are out of bounds set them back to a point in bounds - if (NijC < pCHdom[0][0]) NijC=pCHdom[0][0]; - if (NijC >= pCHdom[0][1]) NijC=pCHdom[0][1]-TOL; - if (NijH < pCHdom[1][0]) NijH=pCHdom[1][0]; - if (NijH >= pCHdom[1][1]) NijH=pCHdom[1][1]-TOL; + if (NijC < pCHdom[0][0]) NijC=pCHdom[0][0]; + if (NijC > pCHdom[0][1]) NijC=pCHdom[0][1]; + if (NijH < pCHdom[1][0]) NijH=pCHdom[1][0]; + if (NijH > pCHdom[1][1]) NijH=pCHdom[1][1]; x = (int) floor(NijC); y = (int) floor(NijH); @@ -3138,6 +3140,8 @@ double PairAIREBO::PijSpline(double NijC, double NijH, int typei, int typej, dN2[0] = PCHdfdx[x][y]; dN2[1] = PCHdfdy[x][y]; } else { + if (NijC == pCHdom[0][1]) --x; + if (NijH == pCHdom[1][1]) --y; Pij = Spbicubic(NijC,NijH,pCH[x][y],dN2); } } @@ -3166,12 +3170,12 @@ double PairAIREBO::piRCSpline(double Nij, double Nji, double Nijconj, // if the inputs are out of bounds set them back to a point in bounds - if (Nij < piCCdom[0][0]) Nij=piCCdom[0][0]; - if (Nij >= piCCdom[0][1]) Nij=piCCdom[0][1]-TOL; - if (Nji < piCCdom[1][0]) Nji=piCCdom[1][0]; - if (Nji >= piCCdom[1][1]) Nji=piCCdom[1][1]-TOL; - if (Nijconj < piCCdom[2][0]) Nijconj=piCCdom[2][0]; - if (Nijconj >= piCCdom[2][1]) Nijconj=piCCdom[2][1]-TOL; + if (Nij < piCCdom[0][0]) Nij=piCCdom[0][0]; + if (Nij > piCCdom[0][1]) Nij=piCCdom[0][1]; + if (Nji < piCCdom[1][0]) Nji=piCCdom[1][0]; + if (Nji > piCCdom[1][1]) Nji=piCCdom[1][1]; + if (Nijconj < piCCdom[2][0]) Nijconj=piCCdom[2][0]; + if (Nijconj > piCCdom[2][1]) Nijconj=piCCdom[2][1]; x = (int) floor(Nij); y = (int) floor(Nji); z = (int) floor(Nijconj); @@ -3183,6 +3187,9 @@ double PairAIREBO::piRCSpline(double Nij, double Nji, double Nijconj, dN3[1]=piCCdfdy[x][y][z]; dN3[2]=piCCdfdz[x][y][z]; } else { + if (Nij == piCCdom[0][1]) --x; + if (Nji == piCCdom[1][1]) --y; + if (Nijconj == piCCdom[2][1]) --z; piRC=Sptricubic(Nij,Nji,Nijconj,piCC[x][y][z],dN3); } } else if ((typei==0 && typej==1) || (typei==1 && typej==0)) { @@ -3191,12 +3198,12 @@ double PairAIREBO::piRCSpline(double Nij, double Nji, double Nijconj, // if the inputs are out of bounds set them back to a point in bounds - if (Nij < piCHdom[0][0]) Nij=piCHdom[0][0]; - if (Nij >= piCHdom[0][1]) Nij=piCHdom[0][1]-TOL; - if (Nji < piCHdom[1][0]) Nji=piCHdom[1][0]; - if (Nji >= piCHdom[1][1]) Nji=piCHdom[1][1]-TOL; - if (Nijconj < piCHdom[2][0]) Nijconj=piCHdom[2][0]; - if (Nijconj >= piCHdom[2][1]) Nijconj=piCHdom[2][1]-TOL; + if (Nij < piCHdom[0][0]) Nij=piCHdom[0][0]; + if (Nij > piCHdom[0][1]) Nij=piCHdom[0][1]; + if (Nji < piCHdom[1][0]) Nji=piCHdom[1][0]; + if (Nji > piCHdom[1][1]) Nji=piCHdom[1][1]; + if (Nijconj < piCHdom[2][0]) Nijconj=piCHdom[2][0]; + if (Nijconj > piCHdom[2][1]) Nijconj=piCHdom[2][1]; x = (int) floor(Nij); y = (int) floor(Nji); z = (int) floor(Nijconj); @@ -3208,26 +3215,32 @@ double PairAIREBO::piRCSpline(double Nij, double Nji, double Nijconj, dN3[1]=piCHdfdy[x][y][z]; dN3[2]=piCHdfdz[x][y][z]; } else { + if (Nij == piCHdom[0][1]) --x; + if (Nji == piCHdom[1][1]) --y; + if (Nijconj == piCHdom[2][1]) --z; piRC=Sptricubic(Nij,Nji,Nijconj,piCH[x][y][z],dN3); } } else if (typei==1 && typej==1) { - if (Nij < piHHdom[0][0]) Nij=piHHdom[0][0]; - if (Nij >= piHHdom[0][1]) Nij=piHHdom[0][1]-TOL; - if (Nji < piHHdom[1][0]) Nji=piHHdom[1][0]; - if (Nji >= piHHdom[1][1]) Nji=piHHdom[1][1]-TOL; - if (Nijconj < piHHdom[2][0]) Nijconj=piHHdom[2][0]; - if (Nijconj >= piHHdom[2][1]) Nijconj=piHHdom[2][1]-TOL; + if (Nij < piHHdom[0][0]) Nij=piHHdom[0][0]; + if (Nij > piHHdom[0][1]) Nij=piHHdom[0][1]; + if (Nji < piHHdom[1][0]) Nji=piHHdom[1][0]; + if (Nji > piHHdom[1][1]) Nji=piHHdom[1][1]; + if (Nijconj < piHHdom[2][0]) Nijconj=piHHdom[2][0]; + if (Nijconj > piHHdom[2][1]) Nijconj=piHHdom[2][1]; x = (int) floor(Nij); y = (int) floor(Nji); z = (int) floor(Nijconj); - if (fabs(Nij-floor(Nij))= Tijdom[0][1]) Nij=Tijdom[0][1]-TOL; - if (Nji < Tijdom[1][0]) Nji=Tijdom[1][0]; - if (Nji >= Tijdom[1][1]) Nji=Tijdom[1][1]-TOL; - if (Nijconj < Tijdom[2][0]) Nijconj=Tijdom[2][0]; - if (Nijconj >= Tijdom[2][1]) Nijconj=Tijdom[2][1]-TOL; + if (Nij < Tijdom[0][0]) Nij=Tijdom[0][0]; + if (Nij > Tijdom[0][1]) Nij=Tijdom[0][1]; + if (Nji < Tijdom[1][0]) Nji=Tijdom[1][0]; + if (Nji > Tijdom[1][1]) Nji=Tijdom[1][1]; + if (Nijconj < Tijdom[2][0]) Nijconj=Tijdom[2][0]; + if (Nijconj > Tijdom[2][1]) Nijconj=Tijdom[2][1]; x = (int) floor(Nij); y = (int) floor(Nji); z = (int) floor(Nijconj); @@ -3272,6 +3285,9 @@ double PairAIREBO::TijSpline(double Nij, double Nji, dN3[1]=Tdfdy[x][y][z]; dN3[2]=Tdfdz[x][y][z]; } else { + if (Nij == Tijdom[0][1]) --x; + if (Nji == Tijdom[1][1]) --y; + if (Nijconj == Tijdom[2][1]) --z; Tijf=Sptricubic(Nij,Nji,Nijconj,Tijc[x][y][z],dN3); } From c11e87618bc8956f97d7cc25108ecae4e1a39039 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 May 2017 14:18:56 -0400 Subject: [PATCH 026/302] implement second bugfix suggestion from @CF17 on issue #59 --- src/MANYBODY/pair_airebo.cpp | 4 ++-- src/USER-OMP/pair_airebo_omp.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index e3f23a9997..cc7efbcaa6 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -1850,7 +1850,7 @@ double PairAIREBO::bondorder(int i, int j, double rij[3], (1.0-tspjik)*(1.0-tspijl); aaa1 = -prefactor*(1.0-square(om1234)) * (1.0-tspjik)*(1.0-tspijl); - aaa2 = aaa1*w21*w34; + aaa2 = -prefactor*(1.0-square(om1234)) * w21*w34; at2 = aa*cwnum; fcijpc = (-dt1dij*at2)+(aaa2*dtsjik*dctij*(1.0-tspijl)) + @@ -2778,7 +2778,7 @@ double PairAIREBO::bondorderLJ(int i, int j, double rij[3], double rijmag, (1.0-tspjik)*(1.0-tspijl); aaa1 = -prefactor*(1.0-square(om1234)) * (1.0-tspjik)*(1.0-tspijl); - aaa2 = aaa1*w21*w34; + aaa2 = -prefactor*(1.0-square(om1234)) * w21*w34; at2 = aa*cwnum; fcikpc = (-dt1dik*at2)+(aaa2*dtsjik*dctik*(1.0-tspijl)); diff --git a/src/USER-OMP/pair_airebo_omp.cpp b/src/USER-OMP/pair_airebo_omp.cpp index 84821f1c8c..f3aa9986fe 100644 --- a/src/USER-OMP/pair_airebo_omp.cpp +++ b/src/USER-OMP/pair_airebo_omp.cpp @@ -1622,7 +1622,7 @@ double PairAIREBOOMP::bondorder_thr(int i, int j, double rij[3], double rijmag, (1.0-tspjik)*(1.0-tspijl); aaa1 = -prefactor*(1.0-square(om1234)) * (1.0-tspjik)*(1.0-tspijl); - aaa2 = aaa1*w21*w34; + aaa2 = -prefactor*(1.0-square(om1234)) * w21*w34; at2 = aa*cwnum; fcijpc = (-dt1dij*at2)+(aaa2*dtsjik*dctij*(1.0-tspijl)) + @@ -2550,7 +2550,7 @@ double PairAIREBOOMP::bondorderLJ_thr(int i, int j, double rij[3], double rijmag (1.0-tspjik)*(1.0-tspijl); aaa1 = -prefactor*(1.0-square(om1234)) * (1.0-tspjik)*(1.0-tspijl); - aaa2 = aaa1*w21*w34; + aaa2 = -prefactor*(1.0-square(om1234)) * w21*w34; at2 = aa*cwnum; fcikpc = (-dt1dik*at2)+(aaa2*dtsjik*dctik*(1.0-tspijl)); From 35e92733e9da4d3dd80721ef827cf97eceaf0382 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 May 2017 17:40:04 -0400 Subject: [PATCH 027/302] import multi-element compatible pair style edip as edip/multi --- doc/src/Section_commands.txt | 1 + doc/src/pair_edip.txt | 18 +- examples/USER/misc/edip/Si.edip | 26 + examples/USER/misc/edip/SiC.edip | 38 + examples/USER/misc/edip/data.SiC | 138 +++ examples/USER/misc/edip/in.edip-Si | 72 ++ examples/USER/misc/edip/in.edip-Si-multi | 72 ++ examples/USER/misc/edip/in.edip-SiC | 33 + .../edip/log.4May2017.g++.edip-Si-multi.1 | 167 ++++ .../edip/log.4May2017.g++.edip-Si-multi.4 | 167 ++++ .../USER/misc/edip/log.4May2017.g++.edip-Si.1 | 167 ++++ .../USER/misc/edip/log.4May2017.g++.edip-Si.4 | 167 ++++ .../misc/edip/log.4May2017.g++.edip-SiC.1 | 92 ++ .../misc/edip/log.4May2017.g++.edip-SiC.4 | 92 ++ src/.gitignore | 2 + src/USER-MISC/pair_edip.cpp | 5 +- src/USER-MISC/pair_edip_multi.cpp | 784 ++++++++++++++++++ src/USER-MISC/pair_edip_multi.h | 113 +++ 18 files changed, 2146 insertions(+), 8 deletions(-) create mode 100644 examples/USER/misc/edip/Si.edip create mode 100644 examples/USER/misc/edip/SiC.edip create mode 100644 examples/USER/misc/edip/data.SiC create mode 100644 examples/USER/misc/edip/in.edip-Si create mode 100644 examples/USER/misc/edip/in.edip-Si-multi create mode 100644 examples/USER/misc/edip/in.edip-SiC create mode 100644 examples/USER/misc/edip/log.4May2017.g++.edip-Si-multi.1 create mode 100644 examples/USER/misc/edip/log.4May2017.g++.edip-Si-multi.4 create mode 100644 examples/USER/misc/edip/log.4May2017.g++.edip-Si.1 create mode 100644 examples/USER/misc/edip/log.4May2017.g++.edip-Si.4 create mode 100644 examples/USER/misc/edip/log.4May2017.g++.edip-SiC.1 create mode 100644 examples/USER/misc/edip/log.4May2017.g++.edip-SiC.4 create mode 100644 src/USER-MISC/pair_edip_multi.cpp create mode 100644 src/USER-MISC/pair_edip_multi.h diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index 771e830841..ed9a8928e8 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -1016,6 +1016,7 @@ package"_Section_start.html#start_3. "dpd/fdt/energy"_pair_dpd_fdt.html, "eam/cd (o)"_pair_eam.html, "edip (o)"_pair_edip.html, +"edip/multi"_pair_edip.html, "eff/cut"_pair_eff.html, "exp6/rx"_pair_exp6_rx.html, "gauss/cut"_pair_gauss.html, diff --git a/doc/src/pair_edip.txt b/doc/src/pair_edip.txt index cdfc265752..d0c90d76dd 100644 --- a/doc/src/pair_edip.txt +++ b/doc/src/pair_edip.txt @@ -12,6 +12,7 @@ pair_style edip command :h3 pair_style edip :pre pair_style edip/omp :pre +pair_style edip/multi :pre [Examples:] @@ -20,11 +21,14 @@ pair_coeff * * Si.edip Si [Description:] -The {edip} style computes a 3-body "EDIP"_#EDIP potential which is -popular for modeling silicon materials where it can have advantages -over other models such as the "Stillinger-Weber"_pair_sw.html or -"Tersoff"_pair_tersoff.html potentials. In EDIP, the energy E of a -system of atoms is +The {edip} and {edip/multi} styles compute a 3-body "EDIP"_#EDIP +potential which is popular for modeling silicon materials where +it can have advantages over other models such as the +"Stillinger-Weber"_pair_sw.html or "Tersoff"_pair_tersoff.html +potentials. The {edip} style has been programmed for single element +potentials, while {edip/multi} supports multi-element EDIP runs. + +In EDIP, the energy E of a system of atoms is :c,image(Eqs/pair_edip.jpg) @@ -142,7 +146,7 @@ This pair style can only be used via the {pair} keyword of the [Restrictions:] -This angle style can only be used if LAMMPS was built with the +This pair style can only be used if LAMMPS was built with the USER-MISC package. See the "Making LAMMPS"_Section_start.html#start_3 section for more info on packages. @@ -151,7 +155,7 @@ for pair interactions. The EDIP potential files provided with LAMMPS (see the potentials directory) are parameterized for metal "units"_units.html. -You can use the SW potential with any LAMMPS units, but you would need +You can use the EDIP potential with any LAMMPS units, but you would need to create your own EDIP potential file with coefficients listed in the appropriate units if your simulation doesn't use "metal" units. diff --git a/examples/USER/misc/edip/Si.edip b/examples/USER/misc/edip/Si.edip new file mode 100644 index 0000000000..b3b960e738 --- /dev/null +++ b/examples/USER/misc/edip/Si.edip @@ -0,0 +1,26 @@ +# DATE: 2011-09-15 CONTRIBUTOR: Unknown CITATION: Justo, Bazant, Kaxiras, Bulatov and Yip, Phys Rev B, 58, 2539 (1998) + +# EDIP parameters for various elements and mixtures +# multiple entries can be added to this file, LAMMPS reads the ones it needs +# these entries are in LAMMPS "metal" units + +# format of a single entry (one or more lines) +# +# element 1, element 2, element 3, +# A B cutoffA cutoffC alpha beta eta +# gamma lambda mu rho sigma Q0 +# u1 u2 u3 u4 +# +# units for each parameters: +# A , lambda are in eV +# B, cutoffA, cutoffC, gamma, sigma are in Angstrom +# alpha, beta, eta, mu, rho, Q0, u1-u4 are pure numbers + +# Here are the original parameters in metal units, for Silicon from: +# J. F. Justo, M. Z. Bazant, E. Kaxiras, V. V. Bulatov, S. Yip +# Phys. Rev. B 58, 2539 (1998) +# + +Si Si Si 7.9821730 1.5075463 3.1213820 2.5609104 3.1083847 0.0070975 0.2523244 + 1.1247945 1.4533108 0.6966326 1.2085196 0.5774108 312.1341346 + -0.165799 32.557 0.286198 0.66 diff --git a/examples/USER/misc/edip/SiC.edip b/examples/USER/misc/edip/SiC.edip new file mode 100644 index 0000000000..0485d345bb --- /dev/null +++ b/examples/USER/misc/edip/SiC.edip @@ -0,0 +1,38 @@ +# DATE: 2017-05-16 CONTRIBUTOR: Laurent Pizzagalli CITATION: G. Lucas, M. Bertolus, and L. Pizzagalli, J. Phys. : Condens. Matter 22, 035802 (2010) +# element 1, element 2, element 3, +# A B cutoffA cutoffC alpha beta eta +# gamma lambda mu rho sigma Q0 +# u1 u2 u3 u4 +# +Si Si Si 5.488043 1.446435 2.941586 2.540193 3.066580 0.008593 0.589390 + 1.135256 2.417497 0.629131 1.343679 0.298443 208.924548 + -0.165799 32.557 0.286198 0.66 + +C C C 10.222599 0.959814 2.212263 1.741598 1.962090 0.025661 0.275605 + 1.084183 3.633621 0.594236 2.827634 0.536561 289.305617 + -0.165799 32.557 0.286198 0.66 + +C Si Si 7.535967 1.177019 2.534972 1.973974 2.507738 0.015347 0.432497 + 1.191567 3.025559 0.611684 2.061835 0.423863 249.115082 + -0.165799 32.557000 0.286198 0.660000 + +Si C C 7.535967 1.177019 2.534972 1.973974 2.507738 0.015347 0.432497 + 1.191567 3.025559 0.611684 2.061835 0.423863 249.115082 + -0.165799 32.557000 0.286198 0.660000 + +Si Si C 5.488043 1.446435 2.941586 2.540193 3.066580 0.008593 0.510944 + 1.135256 2.721528 0.620407 1.343679 0.298443 229.019815 + -0.165799 32.557000 0.286198 0.660000 + +Si C Si 7.535967 1.177019 2.534972 1.973974 2.507738 0.015347 0.510944 + 1.191567 2.721528 0.620407 2.061835 0.423863 229.019815 + -0.165799 32.557000 0.286198 0.660000 + +C C Si 10.222599 0.959814 2.212263 1.741598 1.962090 0.025661 0.354051 + 1.084183 3.329590 0.602960 2.827634 0.536561 269.210350 + -0.165799 32.557000 0.286198 0.660000 + +C Si C 7.535967 1.177019 2.534972 1.973974 2.507738 0.015347 0.354051 + 1.191567 3.329590 0.602960 2.061835 0.423863 269.210350 + -0.165799 32.557000 0.286198 0.660000 + diff --git a/examples/USER/misc/edip/data.SiC b/examples/USER/misc/edip/data.SiC new file mode 100644 index 0000000000..fa50c14803 --- /dev/null +++ b/examples/USER/misc/edip/data.SiC @@ -0,0 +1,138 @@ +Position data for Silicon-Carbon system + + 128 atoms + 2 atom types + -6.00 5.97232152 xlo xhi + -6.00 5.97232152 ylo yhi + -6.00 5.97232152 zlo zhi + + Atoms + +1 2 -2.9378454 -4.4592615 -4.8109196 +2 2 5.6222143 -2.7335026 -1.7157569 +3 2 -2.6614623 -5.5431059 1.6353686 +4 2 -5.4326838 -4.6174577 5.9452279 +5 2 5.8679239 -0.1120535 -3.5839373 +6 2 -3.7174621 -0.6623311 -0.3714789 +7 2 -5.0724728 -2.5671623 4.4103461 +8 2 -3.3951436 0.9341126 4.9310702 +9 2 -5.4347593 1.9523767 -5.6180938 +10 2 -4.5884719 2.2904528 -1.0597739 +11 2 -5.9058662 0.6212406 2.0127574 +12 2 -4.7680660 0.1965740 4.3267764 +13 2 -5.4228882 5.2569673 -4.5162920 +14 2 -5.2683965 -5.9193658 -2.8648668 +15 2 -2.8610884 1.0484664 2.0299077 +16 2 -4.0711084 5.3133026 3.8009514 +17 2 -0.1947147 -4.1677696 -5.6950931 +18 2 -2.9892710 -3.1647368 -1.6173910 +19 2 -0.9129311 -4.3819066 -0.1601859 +20 2 -2.4513693 -5.2466501 4.8882912 +21 2 -2.8879952 -0.1633446 -3.3401150 +22 1 -4.6738762 -1.3807254 -2.2946777 +23 2 -0.6973948 -1.4885343 0.6005156 +24 1 -2.7392164 -2.4774843 0.2387186 +25 2 -2.6551254 -2.7229952 2.6350264 +26 1 -3.4644263 -4.6028144 3.3817786 +27 2 0.7227614 -2.0709446 2.9214737 +28 1 -2.1000577 -3.2131296 5.7273437 +29 2 -3.1057649 2.3204819 -2.2725622 +30 1 -2.2298751 0.7168389 -1.3107201 +31 2 -1.8698261 1.4006751 0.7265108 +32 1 -4.1103409 -0.7093340 1.9341753 +33 2 -0.3505581 3.2707182 -0.2880656 +34 1 -3.4045407 -1.4383961 4.3903527 +35 2 -3.0940529 1.4132478 -5.3635505 +36 1 -4.4560663 1.2072875 -3.7310176 +37 2 -2.6061002 4.6373499 -4.6903941 +38 1 -3.3477444 4.6768137 -2.6284678 +39 2 0.8121697 4.8602418 -4.6710946 +40 1 -2.5756922 3.3740738 -0.2136350 +41 2 -0.3867976 5.8745611 -2.1119905 +42 1 -1.6766249 1.3374292 3.8741477 +43 2 -0.8770613 3.3735941 4.3846975 +44 1 -1.8609254 3.3158245 -5.9786556 +45 1 -5.2732321 -4.6073253 -0.9581754 +46 1 -2.7888697 -5.6910152 -0.7922023 +47 1 -2.4717165 4.5801880 2.5083210 +48 1 -3.8819950 5.8456589 -5.7563384 +49 2 2.2314782 -2.7729214 -5.2356862 +50 2 0.2981976 -3.1385279 -3.1608167 +51 2 2.8810785 -3.4658695 -0.5823196 +52 2 0.2509625 -5.7595229 2.7389761 +53 2 -0.2934120 -0.8029431 -3.3698507 +54 1 -1.0075690 -2.0481922 -1.9419298 +55 2 2.0729069 1.4922441 -2.3898096 +56 1 1.1110944 -3.2004208 0.9491078 +57 2 1.6774298 -0.7901860 2.5158773 +58 1 -0.8342297 -4.3342518 2.0971458 +59 2 3.2747406 -1.3107897 4.7884706 +60 1 1.7126246 -3.3691471 4.5581012 +61 2 0.4770605 1.7769008 -5.3339915 +62 1 0.2944391 0.5892781 -2.2030106 +63 2 2.2039275 3.1557557 -2.0276796 +64 1 -0.0404494 0.4767818 1.0396418 +65 2 1.1395867 2.3763443 2.3481007 +66 1 -0.9738374 -1.6325161 3.7538567 +67 2 -0.3291998 0.2996990 5.2770809 +68 1 -1.6185604 -0.3964274 -5.1771220 +69 2 2.5999949 -5.1977715 5.8230717 +70 1 -1.6270675 2.3210900 -3.6299941 +71 2 3.6532700 4.9282597 -5.4319276 +72 1 0.0788934 4.0241037 -2.5011530 +73 2 2.8556507 2.6168653 2.1125546 +74 1 0.9738989 2.6255364 4.3412121 +75 2 3.7452938 3.4521356 4.5946426 +76 1 2.0805182 4.7039015 5.3280260 +77 1 -1.0324174 -5.8155041 -4.3265820 +78 1 0.7622442 -4.3631629 -1.3156572 +79 1 0.3263684 3.9937357 1.6172321 +80 1 -0.4350105 -5.7997058 4.5959134 +81 2 3.9161132 -4.6052788 -3.3191717 +82 2 1.9240657 5.7345079 -1.9754251 +83 2 -5.9794488 -4.2369359 1.8646522 +84 2 4.3339975 -4.4845227 5.3737440 +85 2 2.2755456 -0.6327737 -5.7931837 +86 1 1.8728190 -1.5504906 -3.4560010 +87 2 3.4558100 -1.1054068 -1.8333071 +88 1 4.3788172 -1.9466494 -0.3284637 +89 2 2.5999235 -3.7548996 2.5740569 +90 1 3.9983910 -4.4856603 1.1968663 +91 2 -5.7295580 -2.1475672 -5.9963645 +92 1 4.2664051 -2.6988975 -5.8005478 +93 2 4.5254685 2.2906832 -3.4765798 +94 1 2.3603088 1.3416442 -4.4173836 +95 2 4.7767057 1.4061217 -0.7524620 +96 1 1.8072666 -0.7835973 -0.4581995 +97 2 4.4745018 0.3736224 2.1068274 +98 1 3.6081170 -1.7315713 2.4019053 +99 2 4.6281423 -0.2865409 4.4756524 +100 1 1.7975239 0.2893530 4.2330830 +101 2 5.8341452 4.4986472 -5.9664541 +102 1 3.2401308 4.1655227 -3.5070029 +103 2 4.8720339 4.8709982 -2.3364366 +104 1 3.5526476 1.2262752 0.6926826 +105 2 -5.8173342 4.5420479 1.5578881 +106 1 3.9683224 1.5441137 3.8284375 +107 2 -5.5349308 1.9067049 3.7504113 +108 1 4.4728615 2.6415574 -5.5952809 +109 1 1.7000950 -4.8115440 -4.1953920 +110 1 1.7221527 4.1878404 -0.3712681 +111 1 3.9218156 4.5935583 1.3263407 +112 1 3.1310195 -5.8922481 3.6001155 +113 1 4.7558719 -2.2877771 -3.4742052 +114 1 -5.5050300 -2.7027381 0.8748867 +115 1 5.8418594 -4.6064370 3.8714113 +116 1 -4.7516868 -3.1691984 -4.4099768 +117 1 3.9404971 0.7188702 -2.2898786 +118 1 -5.6869740 0.2042380 -0.1916738 +119 1 5.8949589 -1.2422560 3.1201292 +120 1 5.9675804 -0.0712572 5.8964022 +121 1 -5.6208517 3.3600036 -2.9493510 +122 1 5.2065263 3.4517912 -0.3800894 +123 1 -4.6994522 2.5489583 1.8297431 +124 1 -4.0758407 3.0726196 5.0647973 +125 1 4.1587591 -5.0896820 -1.1443498 +126 1 -4.6963753 -5.7429833 1.1357818 +127 1 5.5994192 4.6887008 3.5948264 +128 1 5.0988369 -5.3774409 -4.9051267 diff --git a/examples/USER/misc/edip/in.edip-Si b/examples/USER/misc/edip/in.edip-Si new file mode 100644 index 0000000000..b4c6669621 --- /dev/null +++ b/examples/USER/misc/edip/in.edip-Si @@ -0,0 +1,72 @@ + +units metal + +atom_style atomic +atom_modify map array +boundary p p p +atom_modify sort 0 0.0 + +# temperature + +variable t equal 1800.0 + +# coordination number cutoff + +variable r equal 2.835 + +# minimization parameters + +variable etol equal 1.0e-5 +variable ftol equal 1.0e-5 +variable maxiter equal 100 +variable maxeval equal 100 +variable dmax equal 1.0e-1 + +# diamond unit cell + +variable a equal 5.431 +lattice custom $a & + a1 1.0 0.0 0.0 & + a2 0.0 1.0 0.0 & + a3 0.0 0.0 1.0 & + basis 0.0 0.0 0.0 & + basis 0.0 0.5 0.5 & + basis 0.5 0.0 0.5 & + basis 0.5 0.5 0.0 & + basis 0.25 0.25 0.25 & + basis 0.25 0.75 0.75 & + basis 0.75 0.25 0.75 & + basis 0.75 0.75 0.25 + +region myreg block 0 4 & + 0 4 & + 0 4 +create_box 1 myreg +create_atoms 1 region myreg + +mass 1 28.06 + +group Si type 1 + +velocity all create $t 5287287 mom yes rot yes dist gaussian + +# make a vacancy + +group del id 300 +delete_atoms group del + +pair_style edip +pair_coeff * * Si.edip Si + +thermo 10 + +fix 1 all nvt temp $t $t 0.1 + +timestep 1.0e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 10 check yes + +# equilibrate + +run 500 + diff --git a/examples/USER/misc/edip/in.edip-Si-multi b/examples/USER/misc/edip/in.edip-Si-multi new file mode 100644 index 0000000000..73a2e09143 --- /dev/null +++ b/examples/USER/misc/edip/in.edip-Si-multi @@ -0,0 +1,72 @@ + +units metal + +atom_style atomic +atom_modify map array +boundary p p p +atom_modify sort 0 0.0 + +# temperature + +variable t equal 1800.0 + +# coordination number cutoff + +variable r equal 2.835 + +# minimization parameters + +variable etol equal 1.0e-5 +variable ftol equal 1.0e-5 +variable maxiter equal 100 +variable maxeval equal 100 +variable dmax equal 1.0e-1 + +# diamond unit cell + +variable a equal 5.431 +lattice custom $a & + a1 1.0 0.0 0.0 & + a2 0.0 1.0 0.0 & + a3 0.0 0.0 1.0 & + basis 0.0 0.0 0.0 & + basis 0.0 0.5 0.5 & + basis 0.5 0.0 0.5 & + basis 0.5 0.5 0.0 & + basis 0.25 0.25 0.25 & + basis 0.25 0.75 0.75 & + basis 0.75 0.25 0.75 & + basis 0.75 0.75 0.25 + +region myreg block 0 4 & + 0 4 & + 0 4 +create_box 1 myreg +create_atoms 1 region myreg + +mass 1 28.06 + +group Si type 1 + +velocity all create $t 5287287 mom yes rot yes dist gaussian + +# make a vacancy + +group del id 300 +delete_atoms group del + +pair_style edip/multi +pair_coeff * * Si.edip Si + +thermo 10 + +fix 1 all nvt temp $t $t 0.1 + +timestep 1.0e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 10 check yes + +# equilibrate + +run 500 + diff --git a/examples/USER/misc/edip/in.edip-SiC b/examples/USER/misc/edip/in.edip-SiC new file mode 100644 index 0000000000..ac95f6c4d1 --- /dev/null +++ b/examples/USER/misc/edip/in.edip-SiC @@ -0,0 +1,33 @@ +# Test of MEAM potential for SiC system + +units metal +boundary p p p + +atom_style atomic + +read_data data.SiC + +pair_style edip/multi +pair_coeff * * SiC.edip Si C + +mass 1 28.085 +mass 2 12.001 + +neighbor 1.0 bin +neigh_modify delay 1 + +fix 1 all nve +thermo 10 +timestep 0.001 + +#dump 1 all atom 50 dump.meam + +#dump 2 all image 10 image.*.jpg element element & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 element Si C + +#dump 3 all movie 10 movie.mpg element element & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 element Si C + +run 100 diff --git a/examples/USER/misc/edip/log.4May2017.g++.edip-Si-multi.1 b/examples/USER/misc/edip/log.4May2017.g++.edip-Si-multi.1 new file mode 100644 index 0000000000..ab7d339023 --- /dev/null +++ b/examples/USER/misc/edip/log.4May2017.g++.edip-Si-multi.1 @@ -0,0 +1,167 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task + +units metal + +atom_style atomic +atom_modify map array +boundary p p p +atom_modify sort 0 0.0 + +# temperature + +variable t equal 1800.0 + +# coordination number cutoff + +variable r equal 2.835 + +# minimization parameters + +variable etol equal 1.0e-5 +variable ftol equal 1.0e-5 +variable maxiter equal 100 +variable maxeval equal 100 +variable dmax equal 1.0e-1 + +# diamond unit cell + +variable a equal 5.431 +lattice custom $a a1 1.0 0.0 0.0 a2 0.0 1.0 0.0 a3 0.0 0.0 1.0 basis 0.0 0.0 0.0 basis 0.0 0.5 0.5 basis 0.5 0.0 0.5 basis 0.5 0.5 0.0 basis 0.25 0.25 0.25 basis 0.25 0.75 0.75 basis 0.75 0.25 0.75 basis 0.75 0.75 0.25 +lattice custom 5.431 a1 1.0 0.0 0.0 a2 0.0 1.0 0.0 a3 0.0 0.0 1.0 basis 0.0 0.0 0.0 basis 0.0 0.5 0.5 basis 0.5 0.0 0.5 basis 0.5 0.5 0.0 basis 0.25 0.25 0.25 basis 0.25 0.75 0.75 basis 0.75 0.25 0.75 basis 0.75 0.75 0.25 +Lattice spacing in x,y,z = 5.431 5.431 5.431 + +region myreg block 0 4 0 4 0 4 +create_box 1 myreg +Created orthogonal box = (0 0 0) to (21.724 21.724 21.724) + 1 by 1 by 1 MPI processor grid +create_atoms 1 region myreg +Created 512 atoms + +mass 1 28.06 + +group Si type 1 +512 atoms in group Si + +velocity all create $t 5287287 mom yes rot yes dist gaussian +velocity all create 1800 5287287 mom yes rot yes dist gaussian + +# make a vacancy + +group del id 300 +1 atoms in group del +delete_atoms group del +Deleted 1 atoms, new total = 511 + +pair_style edip/multi +pair_coeff * * Si.edip Si +Reading potential file Si.edip with DATE: 2011-09-15 + +thermo 10 + +fix 1 all nvt temp $t $t 0.1 +fix 1 all nvt temp 1800 $t 0.1 +fix 1 all nvt temp 1800 1800 0.1 + +timestep 1.0e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 10 check yes + +# equilibrate + +run 500 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 4.12138 + ghost atom cutoff = 4.12138 + binsize = 2.06069, bins = 11 11 11 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair edip/multi, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.979 | 2.979 | 2.979 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1802.5039 -2372.6618 0 -2253.8359 12261.807 + 10 952.62744 -2316.428 0 -2253.6283 723.08194 + 20 549.13801 -2289.442 0 -2253.2413 -2444.5204 + 30 1047.0106 -2321.1523 0 -2252.1305 9013.201 + 40 663.46141 -2294.2083 0 -2250.4711 2942.5348 + 50 504.74535 -2282.849 0 -2249.5748 -461.44909 + 60 1019.2173 -2315.5639 0 -2248.3744 7706.4286 + 70 844.51195 -2302.5251 0 -2246.8526 3116.8302 + 80 814.90407 -2299.3372 0 -2245.6166 794.77455 + 90 1269.5636 -2327.4775 0 -2243.7845 7729.3968 + 100 977.61563 -2306.1118 0 -2241.6647 2969.9939 + 110 843.08539 -2295.6547 0 -2240.0763 1393.4039 + 120 1161.6968 -2314.6587 0 -2238.0766 7398.3492 + 130 918.19451 -2296.4321 0 -2235.9022 2537.3997 + 140 881.42548 -2292.2768 0 -2234.1709 1550.3339 + 150 1231.1005 -2313.1054 0 -2231.9479 8112.7566 + 160 967.01862 -2293.332 0 -2229.5836 3422.9627 + 170 833.51248 -2282.7489 0 -2227.8015 43.991459 + 180 1240.8488 -2307.3633 0 -2225.5632 6557.8651 + 190 1126.4621 -2297.1922 0 -2222.9328 4289.0067 + 200 947.59571 -2283.29 0 -2220.822 586.2811 + 210 1228.153 -2299.4702 0 -2218.5071 5315.0425 + 220 1215.4104 -2295.9408 0 -2215.8176 4870.3417 + 230 1112.436 -2286.7552 0 -2213.4204 2527.1879 + 240 1300.081 -2296.6013 0 -2210.8965 5738.3708 + 250 1192.5738 -2286.8463 0 -2208.2286 4076.49 + 260 1004.7055 -2272.1753 0 -2205.9424 359.37589 + 270 1241.2018 -2285.3632 0 -2203.5399 4160.5763 + 280 1360.1974 -2290.325 0 -2200.6572 5802.3902 + 290 1151.9365 -2273.9467 0 -2198.008 1418.8887 + 300 1174.3518 -2273.0089 0 -2195.5925 1998.229 + 310 1329.2727 -2280.5049 0 -2192.8757 4721.7297 + 320 1284.4414 -2274.7519 0 -2190.0781 2985.4674 + 330 1328.3761 -2274.9545 0 -2187.3844 4543.2109 + 340 1446.3847 -2279.8693 0 -2184.5198 6254.4059 + 350 1366.2165 -2271.7475 0 -2181.6828 3637.8335 + 360 1358.9609 -2268.5982 0 -2179.0118 3049.5798 + 370 1552.208 -2278.4802 0 -2176.1545 6334.0058 + 380 1562.5295 -2276.1793 0 -2173.1732 5787.5547 + 390 1415.5498 -2263.7824 0 -2170.4655 3438.5766 + 400 1323.1568 -2255.1641 0 -2167.938 2427.2294 + 410 1260.7186 -2248.5373 0 -2165.4273 1208.6299 + 420 1282.1118 -2247.3718 0 -2162.8516 462.65374 + 430 1451.944 -2255.7551 0 -2160.0391 2037.8025 + 440 1568.9415 -2260.417 0 -2156.9882 3531.1602 + 450 1565.8262 -2257.2396 0 -2154.0162 2586.7886 + 460 1677.7143 -2261.7214 0 -2151.122 4112.9756 + 470 1762.9071 -2264.4244 0 -2148.2089 5053.2139 + 480 1704.5898 -2257.8678 0 -2145.4967 4077.4626 + 490 1731.2619 -2257.1048 0 -2142.9753 4710.5263 + 500 1723.9777 -2254.161 0 -2140.5118 4760.7295 +Loop time of 0.679564 on 1 procs for 500 steps with 511 atoms + +Performance: 63.570 ns/day, 0.378 hours/ns, 735.765 timesteps/s +99.7% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.65181 | 0.65181 | 0.65181 | 0.0 | 95.92 +Neigh | 0.013857 | 0.013857 | 0.013857 | 0.0 | 2.04 +Comm | 0.0033884 | 0.0033884 | 0.0033884 | 0.0 | 0.50 +Output | 0.00070739 | 0.00070739 | 0.00070739 | 0.0 | 0.10 +Modify | 0.0083694 | 0.0083694 | 0.0083694 | 0.0 | 1.23 +Other | | 0.001432 | | | 0.21 + +Nlocal: 511 ave 511 max 511 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 845 ave 845 max 845 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 7902 ave 7902 max 7902 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 7902 +Ave neighs/atom = 15.4638 +Neighbor list builds = 19 +Dangerous builds = 0 + +Total wall time: 0:00:00 diff --git a/examples/USER/misc/edip/log.4May2017.g++.edip-Si-multi.4 b/examples/USER/misc/edip/log.4May2017.g++.edip-Si-multi.4 new file mode 100644 index 0000000000..91be601fa8 --- /dev/null +++ b/examples/USER/misc/edip/log.4May2017.g++.edip-Si-multi.4 @@ -0,0 +1,167 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task + +units metal + +atom_style atomic +atom_modify map array +boundary p p p +atom_modify sort 0 0.0 + +# temperature + +variable t equal 1800.0 + +# coordination number cutoff + +variable r equal 2.835 + +# minimization parameters + +variable etol equal 1.0e-5 +variable ftol equal 1.0e-5 +variable maxiter equal 100 +variable maxeval equal 100 +variable dmax equal 1.0e-1 + +# diamond unit cell + +variable a equal 5.431 +lattice custom $a a1 1.0 0.0 0.0 a2 0.0 1.0 0.0 a3 0.0 0.0 1.0 basis 0.0 0.0 0.0 basis 0.0 0.5 0.5 basis 0.5 0.0 0.5 basis 0.5 0.5 0.0 basis 0.25 0.25 0.25 basis 0.25 0.75 0.75 basis 0.75 0.25 0.75 basis 0.75 0.75 0.25 +lattice custom 5.431 a1 1.0 0.0 0.0 a2 0.0 1.0 0.0 a3 0.0 0.0 1.0 basis 0.0 0.0 0.0 basis 0.0 0.5 0.5 basis 0.5 0.0 0.5 basis 0.5 0.5 0.0 basis 0.25 0.25 0.25 basis 0.25 0.75 0.75 basis 0.75 0.25 0.75 basis 0.75 0.75 0.25 +Lattice spacing in x,y,z = 5.431 5.431 5.431 + +region myreg block 0 4 0 4 0 4 +create_box 1 myreg +Created orthogonal box = (0 0 0) to (21.724 21.724 21.724) + 1 by 2 by 2 MPI processor grid +create_atoms 1 region myreg +Created 512 atoms + +mass 1 28.06 + +group Si type 1 +512 atoms in group Si + +velocity all create $t 5287287 mom yes rot yes dist gaussian +velocity all create 1800 5287287 mom yes rot yes dist gaussian + +# make a vacancy + +group del id 300 +1 atoms in group del +delete_atoms group del +Deleted 1 atoms, new total = 511 + +pair_style edip/multi +pair_coeff * * Si.edip Si +Reading potential file Si.edip with DATE: 2011-09-15 + +thermo 10 + +fix 1 all nvt temp $t $t 0.1 +fix 1 all nvt temp 1800 $t 0.1 +fix 1 all nvt temp 1800 1800 0.1 + +timestep 1.0e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 10 check yes + +# equilibrate + +run 500 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 4.12138 + ghost atom cutoff = 4.12138 + binsize = 2.06069, bins = 11 11 11 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair edip/multi, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.955 | 2.955 | 2.955 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1802.3816 -2372.6618 0 -2253.844 12260.967 + 10 938.75954 -2315.5185 0 -2253.6329 558.21646 + 20 534.27233 -2288.4721 0 -2253.2514 -2710.768 + 30 1043.7796 -2320.9485 0 -2252.1398 8679.4381 + 40 658.0916 -2293.8597 0 -2250.4765 2165.3742 + 50 517.93009 -2283.7238 0 -2249.5805 -1124.9373 + 60 1063.3594 -2318.4409 0 -2248.3414 7277.8526 + 70 868.14006 -2304.0134 0 -2246.7832 2050.2848 + 80 826.37805 -2300.0187 0 -2245.5416 91.099408 + 90 1289.6772 -2328.7151 0 -2243.6961 8180.7423 + 100 976.36208 -2305.9371 0 -2241.5727 3614.0499 + 110 810.81713 -2293.4705 0 -2240.0193 1359.368 + 120 1165.707 -2314.9026 0 -2238.056 7336.45 + 130 929.81245 -2297.139 0 -2235.8432 2793.8451 + 140 804.47874 -2287.2074 0 -2234.174 704.92455 + 150 1182.4141 -2310.0266 0 -2232.0787 7822.2337 + 160 979.92391 -2294.2969 0 -2229.6977 3206.7458 + 170 830.14748 -2282.6079 0 -2227.8824 -296.87377 + 180 1271.1133 -2309.4274 0 -2225.6322 7199.614 + 190 1209.6006 -2302.6407 0 -2222.9006 5528.3784 + 200 954.67693 -2283.6621 0 -2220.7273 47.02795 + 210 1260.814 -2301.5582 0 -2218.442 4829.788 + 220 1274.9954 -2299.7285 0 -2215.6774 5518.0597 + 230 1048.0074 -2282.398 0 -2213.3106 1754.4144 + 240 1261.7072 -2294.1108 0 -2210.9356 5233.2712 + 250 1272.6178 -2292.0793 0 -2208.1849 4795.9325 + 260 989.14205 -2271.0278 0 -2205.8209 -820.1828 + 270 1212.0445 -2283.4212 0 -2203.52 3395.8634 + 280 1391.9572 -2292.3809 0 -2200.6194 6666.2451 + 290 1093.1204 -2270.0421 0 -2197.9807 206.94523 + 300 1159.4831 -2272.102 0 -2195.6657 778.53806 + 310 1407.3528 -2285.6228 0 -2192.8463 5223.048 + 320 1236.7163 -2271.5389 0 -2190.0113 1865.3943 + 330 1258.8275 -2270.4611 0 -2187.4758 2333.3209 + 340 1507.9519 -2283.9906 0 -2184.5824 6775.5456 + 350 1366.5116 -2271.7287 0 -2181.6446 3432.115 + 360 1305.2829 -2265.1092 0 -2179.0614 1498.4073 + 370 1581.4335 -2280.4645 0 -2176.2122 6518.5597 + 380 1589.5319 -2277.9428 0 -2173.1567 6334.6506 + 390 1402.6781 -2262.9323 0 -2170.464 3278.3038 + 400 1374.9587 -2258.5717 0 -2167.9307 3608.7284 + 410 1295.7416 -2250.7752 0 -2165.3565 1877.5222 + 420 1278.6727 -2247.1099 0 -2162.8164 1599.4181 + 430 1508.1328 -2259.4245 0 -2160.0044 4300.2224 + 440 1624.2957 -2263.9806 0 -2156.9026 4432.625 + 450 1597.3356 -2259.263 0 -2153.9624 3370.3816 + 460 1772.0922 -2267.9106 0 -2151.0895 5788.3214 + 470 1806.4047 -2267.304 0 -2148.221 5950.1166 + 480 1593.0406 -2250.7469 0 -2145.7294 2518.0576 + 490 1660.9767 -2252.894 0 -2143.398 4282.1643 + 500 1714.283 -2253.9295 0 -2140.9194 5740.0247 +Loop time of 0.205398 on 4 procs for 500 steps with 511 atoms + +Performance: 210.324 ns/day, 0.114 hours/ns, 2434.304 timesteps/s +99.0% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.16285 | 0.1688 | 0.17446 | 1.1 | 82.18 +Neigh | 0.0035172 | 0.0036234 | 0.0038214 | 0.2 | 1.76 +Comm | 0.018727 | 0.024851 | 0.030996 | 2.9 | 12.10 +Output | 0.0013061 | 0.0014012 | 0.0015635 | 0.3 | 0.68 +Modify | 0.0046582 | 0.0048603 | 0.0050988 | 0.2 | 2.37 +Other | | 0.001861 | | | 0.91 + +Nlocal: 127.75 ave 131 max 124 min +Histogram: 1 0 1 0 0 0 0 0 1 1 +Nghost: 433.75 ave 441 max 426 min +Histogram: 1 0 1 0 0 0 0 0 1 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 1979.5 ave 2040 max 1895 min +Histogram: 1 0 0 0 1 0 0 0 0 2 + +Total # of neighbors = 7918 +Ave neighs/atom = 15.4951 +Neighbor list builds = 19 +Dangerous builds = 0 + +Total wall time: 0:00:00 diff --git a/examples/USER/misc/edip/log.4May2017.g++.edip-Si.1 b/examples/USER/misc/edip/log.4May2017.g++.edip-Si.1 new file mode 100644 index 0000000000..f7ce00371f --- /dev/null +++ b/examples/USER/misc/edip/log.4May2017.g++.edip-Si.1 @@ -0,0 +1,167 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task + +units metal + +atom_style atomic +atom_modify map array +boundary p p p +atom_modify sort 0 0.0 + +# temperature + +variable t equal 1800.0 + +# coordination number cutoff + +variable r equal 2.835 + +# minimization parameters + +variable etol equal 1.0e-5 +variable ftol equal 1.0e-5 +variable maxiter equal 100 +variable maxeval equal 100 +variable dmax equal 1.0e-1 + +# diamond unit cell + +variable a equal 5.431 +lattice custom $a a1 1.0 0.0 0.0 a2 0.0 1.0 0.0 a3 0.0 0.0 1.0 basis 0.0 0.0 0.0 basis 0.0 0.5 0.5 basis 0.5 0.0 0.5 basis 0.5 0.5 0.0 basis 0.25 0.25 0.25 basis 0.25 0.75 0.75 basis 0.75 0.25 0.75 basis 0.75 0.75 0.25 +lattice custom 5.431 a1 1.0 0.0 0.0 a2 0.0 1.0 0.0 a3 0.0 0.0 1.0 basis 0.0 0.0 0.0 basis 0.0 0.5 0.5 basis 0.5 0.0 0.5 basis 0.5 0.5 0.0 basis 0.25 0.25 0.25 basis 0.25 0.75 0.75 basis 0.75 0.25 0.75 basis 0.75 0.75 0.25 +Lattice spacing in x,y,z = 5.431 5.431 5.431 + +region myreg block 0 4 0 4 0 4 +create_box 1 myreg +Created orthogonal box = (0 0 0) to (21.724 21.724 21.724) + 1 by 1 by 1 MPI processor grid +create_atoms 1 region myreg +Created 512 atoms + +mass 1 28.06 + +group Si type 1 +512 atoms in group Si + +velocity all create $t 5287287 mom yes rot yes dist gaussian +velocity all create 1800 5287287 mom yes rot yes dist gaussian + +# make a vacancy + +group del id 300 +1 atoms in group del +delete_atoms group del +Deleted 1 atoms, new total = 511 + +pair_style edip +pair_coeff * * Si.edip Si +Reading potential file Si.edip with DATE: 2011-09-15 + +thermo 10 + +fix 1 all nvt temp $t $t 0.1 +fix 1 all nvt temp 1800 $t 0.1 +fix 1 all nvt temp 1800 1800 0.1 + +timestep 1.0e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 10 check yes + +# equilibrate + +run 500 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 4.12138 + ghost atom cutoff = 4.12138 + binsize = 2.06069, bins = 11 11 11 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair edip, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.979 | 2.979 | 2.979 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1802.5039 -2372.6618 0 -2253.8359 12261.807 + 10 952.62744 -2316.428 0 -2253.6283 723.08283 + 20 549.138 -2289.442 0 -2253.2413 -2444.5194 + 30 1047.0106 -2321.1522 0 -2252.1305 9013.2015 + 40 663.46143 -2294.2083 0 -2250.4711 2942.5358 + 50 504.74533 -2282.849 0 -2249.5748 -461.44817 + 60 1019.2173 -2315.5639 0 -2248.3744 7706.429 + 70 844.51197 -2302.5251 0 -2246.8526 3116.8313 + 80 814.90406 -2299.3372 0 -2245.6165 794.77536 + 90 1269.5635 -2327.4775 0 -2243.7845 7729.3971 + 100 977.61566 -2306.1118 0 -2241.6647 2969.9952 + 110 843.08538 -2295.6547 0 -2240.0763 1393.4046 + 120 1161.6968 -2314.6587 0 -2238.0766 7398.3495 + 130 918.19453 -2296.4321 0 -2235.9022 2537.4011 + 140 881.42546 -2292.2768 0 -2234.1709 1550.3345 + 150 1231.1005 -2313.1054 0 -2231.9479 8112.7568 + 160 967.01865 -2293.332 0 -2229.5836 3422.964 + 170 833.51246 -2282.7489 0 -2227.8015 43.99251 + 180 1240.8487 -2307.3633 0 -2225.5632 6557.8652 + 190 1126.4621 -2297.1922 0 -2222.9328 4289.0083 + 200 947.5957 -2283.29 0 -2220.8219 586.28203 + 210 1228.153 -2299.4702 0 -2218.5071 5315.0427 + 220 1215.4104 -2295.9407 0 -2215.8176 4870.343 + 230 1112.436 -2286.7552 0 -2213.4204 2527.1887 + 240 1300.081 -2296.6013 0 -2210.8965 5738.3711 + 250 1192.5739 -2286.8463 0 -2208.2286 4076.4913 + 260 1004.7055 -2272.1753 0 -2205.9424 359.3769 + 270 1241.2018 -2285.3632 0 -2203.5399 4160.5764 + 280 1360.1974 -2290.325 0 -2200.6572 5802.3912 + 290 1151.9366 -2273.9467 0 -2198.008 1418.8905 + 300 1174.3518 -2273.0089 0 -2195.5925 1998.2297 + 310 1329.2726 -2280.5049 0 -2192.8757 4721.7304 + 320 1284.4414 -2274.7519 0 -2190.0781 2985.4687 + 330 1328.3761 -2274.9545 0 -2187.3844 4543.2115 + 340 1446.3847 -2279.8693 0 -2184.5198 6254.4071 + 350 1366.2165 -2271.7475 0 -2181.6828 3637.8351 + 360 1358.9609 -2268.5982 0 -2179.0118 3049.5811 + 370 1552.2079 -2278.4802 0 -2176.1545 6334.0061 + 380 1562.5295 -2276.1793 0 -2173.1731 5787.5565 + 390 1415.5498 -2263.7823 0 -2170.4655 3438.5782 + 400 1323.1568 -2255.1641 0 -2167.938 2427.2311 + 410 1260.7186 -2248.5373 0 -2165.4273 1208.6316 + 420 1282.1118 -2247.3718 0 -2162.8516 462.65508 + 430 1451.9439 -2255.7551 0 -2160.0391 2037.8027 + 440 1568.9415 -2260.417 0 -2156.9882 3531.1613 + 450 1565.8261 -2257.2396 0 -2154.0161 2586.7896 + 460 1677.7143 -2261.7214 0 -2151.122 4112.976 + 470 1762.9071 -2264.4244 0 -2148.2089 5053.2148 + 480 1704.5898 -2257.8678 0 -2145.4966 4077.4649 + 490 1731.2619 -2257.1048 0 -2142.9753 4710.5276 + 500 1723.9777 -2254.161 0 -2140.5118 4760.7316 +Loop time of 0.312472 on 1 procs for 500 steps with 511 atoms + +Performance: 138.252 ns/day, 0.174 hours/ns, 1600.143 timesteps/s +99.6% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.28525 | 0.28525 | 0.28525 | 0.0 | 91.29 +Neigh | 0.013753 | 0.013753 | 0.013753 | 0.0 | 4.40 +Comm | 0.0033333 | 0.0033333 | 0.0033333 | 0.0 | 1.07 +Output | 0.00071096 | 0.00071096 | 0.00071096 | 0.0 | 0.23 +Modify | 0.008044 | 0.008044 | 0.008044 | 0.0 | 2.57 +Other | | 0.001385 | | | 0.44 + +Nlocal: 511 ave 511 max 511 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 845 ave 845 max 845 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 7902 ave 7902 max 7902 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 7902 +Ave neighs/atom = 15.4638 +Neighbor list builds = 19 +Dangerous builds = 0 + +Total wall time: 0:00:00 diff --git a/examples/USER/misc/edip/log.4May2017.g++.edip-Si.4 b/examples/USER/misc/edip/log.4May2017.g++.edip-Si.4 new file mode 100644 index 0000000000..e33f0116f4 --- /dev/null +++ b/examples/USER/misc/edip/log.4May2017.g++.edip-Si.4 @@ -0,0 +1,167 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task + +units metal + +atom_style atomic +atom_modify map array +boundary p p p +atom_modify sort 0 0.0 + +# temperature + +variable t equal 1800.0 + +# coordination number cutoff + +variable r equal 2.835 + +# minimization parameters + +variable etol equal 1.0e-5 +variable ftol equal 1.0e-5 +variable maxiter equal 100 +variable maxeval equal 100 +variable dmax equal 1.0e-1 + +# diamond unit cell + +variable a equal 5.431 +lattice custom $a a1 1.0 0.0 0.0 a2 0.0 1.0 0.0 a3 0.0 0.0 1.0 basis 0.0 0.0 0.0 basis 0.0 0.5 0.5 basis 0.5 0.0 0.5 basis 0.5 0.5 0.0 basis 0.25 0.25 0.25 basis 0.25 0.75 0.75 basis 0.75 0.25 0.75 basis 0.75 0.75 0.25 +lattice custom 5.431 a1 1.0 0.0 0.0 a2 0.0 1.0 0.0 a3 0.0 0.0 1.0 basis 0.0 0.0 0.0 basis 0.0 0.5 0.5 basis 0.5 0.0 0.5 basis 0.5 0.5 0.0 basis 0.25 0.25 0.25 basis 0.25 0.75 0.75 basis 0.75 0.25 0.75 basis 0.75 0.75 0.25 +Lattice spacing in x,y,z = 5.431 5.431 5.431 + +region myreg block 0 4 0 4 0 4 +create_box 1 myreg +Created orthogonal box = (0 0 0) to (21.724 21.724 21.724) + 1 by 2 by 2 MPI processor grid +create_atoms 1 region myreg +Created 512 atoms + +mass 1 28.06 + +group Si type 1 +512 atoms in group Si + +velocity all create $t 5287287 mom yes rot yes dist gaussian +velocity all create 1800 5287287 mom yes rot yes dist gaussian + +# make a vacancy + +group del id 300 +1 atoms in group del +delete_atoms group del +Deleted 1 atoms, new total = 511 + +pair_style edip +pair_coeff * * Si.edip Si +Reading potential file Si.edip with DATE: 2011-09-15 + +thermo 10 + +fix 1 all nvt temp $t $t 0.1 +fix 1 all nvt temp 1800 $t 0.1 +fix 1 all nvt temp 1800 1800 0.1 + +timestep 1.0e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 10 check yes + +# equilibrate + +run 500 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 4.12138 + ghost atom cutoff = 4.12138 + binsize = 2.06069, bins = 11 11 11 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair edip, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.955 | 2.955 | 2.955 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 1802.3816 -2372.6618 0 -2253.8439 12260.967 + 10 938.75954 -2315.5185 0 -2253.6329 558.21736 + 20 534.27232 -2288.4721 0 -2253.2514 -2710.767 + 30 1043.7796 -2320.9485 0 -2252.1398 8679.4385 + 40 658.09162 -2293.8597 0 -2250.4765 2165.3752 + 50 517.93008 -2283.7238 0 -2249.5805 -1124.9362 + 60 1063.3594 -2318.4409 0 -2248.3414 7277.853 + 70 868.14007 -2304.0133 0 -2246.7832 2050.2859 + 80 826.37803 -2300.0187 0 -2245.5416 91.100098 + 90 1289.6772 -2328.7151 0 -2243.6961 8180.7427 + 100 976.36211 -2305.9371 0 -2241.5727 3614.0511 + 110 810.81711 -2293.4705 0 -2240.0193 1359.3687 + 120 1165.707 -2314.9026 0 -2238.056 7336.4505 + 130 929.81248 -2297.139 0 -2235.8432 2793.8463 + 140 804.47872 -2287.2074 0 -2234.174 704.92524 + 150 1182.414 -2310.0266 0 -2232.0787 7822.2339 + 160 979.92395 -2294.2969 0 -2229.6977 3206.7474 + 170 830.14746 -2282.6079 0 -2227.8824 -296.87288 + 180 1271.1133 -2309.4274 0 -2225.6322 7199.614 + 190 1209.6006 -2302.6407 0 -2222.9006 5528.3799 + 200 954.67692 -2283.6621 0 -2220.7272 47.02925 + 210 1260.814 -2301.5582 0 -2218.442 4829.7879 + 220 1274.9954 -2299.7285 0 -2215.6774 5518.0611 + 230 1048.0074 -2282.398 0 -2213.3106 1754.4157 + 240 1261.7071 -2294.1107 0 -2210.9356 5233.2714 + 250 1272.6179 -2292.0793 0 -2208.1849 4795.934 + 260 989.14207 -2271.0278 0 -2205.8209 -820.18098 + 270 1212.0444 -2283.4212 0 -2203.52 3395.8631 + 280 1391.9572 -2292.3809 0 -2200.6194 6666.2464 + 290 1093.1205 -2270.0421 0 -2197.9807 206.94752 + 300 1159.483 -2272.102 0 -2195.6657 778.53823 + 310 1407.3528 -2285.6227 0 -2192.8463 5223.0487 + 320 1236.7164 -2271.5389 0 -2190.0112 1865.3963 + 330 1258.8275 -2270.4611 0 -2187.4758 2333.321 + 340 1507.9519 -2283.9906 0 -2184.5824 6775.546 + 350 1366.5116 -2271.7287 0 -2181.6446 3432.1175 + 360 1305.2828 -2265.1091 0 -2179.0614 1498.4079 + 370 1581.4334 -2280.4645 0 -2176.2122 6518.5598 + 380 1589.5319 -2277.9428 0 -2173.1566 6334.6527 + 390 1402.6782 -2262.9323 0 -2170.464 3278.3048 + 400 1374.9587 -2258.5717 0 -2167.9307 3608.7293 + 410 1295.7416 -2250.7752 0 -2165.3565 1877.5245 + 420 1278.6727 -2247.1099 0 -2162.8164 1599.4189 + 430 1508.1328 -2259.4245 0 -2160.0044 4300.2235 + 440 1624.2957 -2263.9806 0 -2156.9026 4432.6267 + 450 1597.3356 -2259.263 0 -2153.9623 3370.3829 + 460 1772.0921 -2267.9105 0 -2151.0895 5788.3219 + 470 1806.4047 -2267.304 0 -2148.221 5950.1188 + 480 1593.0406 -2250.7469 0 -2145.7294 2518.0601 + 490 1660.9766 -2252.894 0 -2143.398 4282.1654 + 500 1714.2831 -2253.9295 0 -2140.9194 5740.0268 +Loop time of 0.109584 on 4 procs for 500 steps with 511 atoms + +Performance: 394.220 ns/day, 0.061 hours/ns, 4562.726 timesteps/s +99.0% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.074678 | 0.077817 | 0.084705 | 1.4 | 71.01 +Neigh | 0.0036662 | 0.0037943 | 0.0039661 | 0.2 | 3.46 +Comm | 0.013665 | 0.020312 | 0.023178 | 2.7 | 18.54 +Output | 0.0010247 | 0.0010931 | 0.0012922 | 0.3 | 1.00 +Modify | 0.0043213 | 0.0047521 | 0.0051889 | 0.6 | 4.34 +Other | | 0.001814 | | | 1.66 + +Nlocal: 127.75 ave 131 max 124 min +Histogram: 1 0 1 0 0 0 0 0 1 1 +Nghost: 433.75 ave 441 max 426 min +Histogram: 1 0 1 0 0 0 0 0 1 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 1979.5 ave 2040 max 1895 min +Histogram: 1 0 0 0 1 0 0 0 0 2 + +Total # of neighbors = 7918 +Ave neighs/atom = 15.4951 +Neighbor list builds = 19 +Dangerous builds = 0 + +Total wall time: 0:00:00 diff --git a/examples/USER/misc/edip/log.4May2017.g++.edip-SiC.1 b/examples/USER/misc/edip/log.4May2017.g++.edip-SiC.1 new file mode 100644 index 0000000000..125106c504 --- /dev/null +++ b/examples/USER/misc/edip/log.4May2017.g++.edip-SiC.1 @@ -0,0 +1,92 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task +# Test of MEAM potential for SiC system + +units metal +boundary p p p + +atom_style atomic + +read_data data.SiC + orthogonal box = (-6 -6 -6) to (5.97232 5.97232 5.97232) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 128 atoms + +pair_style edip/multi +pair_coeff * * SiC.edip Si C +Reading potential file SiC.edip with DATE: 2017-05-16 + +mass 1 28.085 +mass 2 12.001 + +neighbor 1.0 bin +neigh_modify delay 1 + +fix 1 all nve +thermo 10 +timestep 0.001 + +#dump 1 all atom 50 dump.meam + +#dump 2 all image 10 image.*.jpg element element # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 element Si C + +#dump 3 all movie 10 movie.mpg element element # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 element Si C + +run 100 +Neighbor list info ... + update every 1 steps, delay 1 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.94159 + ghost atom cutoff = 3.94159 + binsize = 1.97079, bins = 7 7 7 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair edip/multi, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.692 | 2.692 | 2.692 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -563.61621 0 -563.61621 -726147.34 + 10 4224.3601 -633.24829 0 -563.90103 -312355.55 + 20 4528.5661 -638.15183 0 -563.81071 -20091.291 + 30 4817.3654 -642.92111 0 -563.83905 106625.5 + 40 4619.4324 -639.6884 0 -563.85562 107180.42 + 50 4783.0025 -642.26961 0 -563.75166 75134.335 + 60 4525.145 -638.06177 0 -563.77681 71591.713 + 70 4685.2578 -640.72377 0 -563.8104 63956.042 + 80 4621.8393 -639.75912 0 -563.88682 18177.383 + 90 4834.7702 -643.34582 0 -563.97805 15282.823 + 100 4424.0589 -636.60208 0 -563.97656 47963.501 +Loop time of 0.0552888 on 1 procs for 100 steps with 128 atoms + +Performance: 156.270 ns/day, 0.154 hours/ns, 1808.685 timesteps/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.051872 | 0.051872 | 0.051872 | 0.0 | 93.82 +Neigh | 0.0023525 | 0.0023525 | 0.0023525 | 0.0 | 4.25 +Comm | 0.0004518 | 0.0004518 | 0.0004518 | 0.0 | 0.82 +Output | 0.00014806 | 0.00014806 | 0.00014806 | 0.0 | 0.27 +Modify | 0.00024796 | 0.00024796 | 0.00024796 | 0.0 | 0.45 +Other | | 0.0002165 | | | 0.39 + +Nlocal: 128 ave 128 max 128 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 473 ave 473 max 473 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 2376 ave 2376 max 2376 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 2376 +Ave neighs/atom = 18.5625 +Neighbor list builds = 11 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/misc/edip/log.4May2017.g++.edip-SiC.4 b/examples/USER/misc/edip/log.4May2017.g++.edip-SiC.4 new file mode 100644 index 0000000000..eb6955703e --- /dev/null +++ b/examples/USER/misc/edip/log.4May2017.g++.edip-SiC.4 @@ -0,0 +1,92 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task +# Test of MEAM potential for SiC system + +units metal +boundary p p p + +atom_style atomic + +read_data data.SiC + orthogonal box = (-6 -6 -6) to (5.97232 5.97232 5.97232) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 128 atoms + +pair_style edip/multi +pair_coeff * * SiC.edip Si C +Reading potential file SiC.edip with DATE: 2017-05-16 + +mass 1 28.085 +mass 2 12.001 + +neighbor 1.0 bin +neigh_modify delay 1 + +fix 1 all nve +thermo 10 +timestep 0.001 + +#dump 1 all atom 50 dump.meam + +#dump 2 all image 10 image.*.jpg element element # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 element Si C + +#dump 3 all movie 10 movie.mpg element element # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 element Si C + +run 100 +Neighbor list info ... + update every 1 steps, delay 1 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.94159 + ghost atom cutoff = 3.94159 + binsize = 1.97079, bins = 7 7 7 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair edip/multi, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 2.686 | 2.686 | 2.686 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -563.61621 0 -563.61621 -726147.34 + 10 4224.3601 -633.24829 0 -563.90103 -312355.55 + 20 4528.5661 -638.15183 0 -563.81071 -20091.291 + 30 4817.3654 -642.92111 0 -563.83905 106625.5 + 40 4619.4324 -639.6884 0 -563.85562 107180.42 + 50 4783.0025 -642.26961 0 -563.75166 75134.335 + 60 4525.145 -638.06177 0 -563.77681 71591.713 + 70 4685.2578 -640.72377 0 -563.8104 63956.042 + 80 4621.8393 -639.75912 0 -563.88682 18177.383 + 90 4834.7702 -643.34582 0 -563.97805 15282.823 + 100 4424.0589 -636.60208 0 -563.97656 47963.501 +Loop time of 0.020755 on 4 procs for 100 steps with 128 atoms + +Performance: 416.285 ns/day, 0.058 hours/ns, 4818.118 timesteps/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.011816 | 0.013825 | 0.016871 | 1.6 | 66.61 +Neigh | 0.00061321 | 0.00066817 | 0.00074816 | 0.0 | 3.22 +Comm | 0.0023363 | 0.0054012 | 0.0075014 | 2.7 | 26.02 +Output | 0.00020909 | 0.00022268 | 0.00025558 | 0.0 | 1.07 +Modify | 8.3208e-05 | 9.346e-05 | 0.00010395 | 0.0 | 0.45 +Other | | 0.0005446 | | | 2.62 + +Nlocal: 32 ave 36 max 25 min +Histogram: 1 0 0 0 0 0 0 1 1 1 +Nghost: 262.75 ave 273 max 255 min +Histogram: 2 0 0 0 0 0 0 1 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 594 ave 687 max 453 min +Histogram: 1 0 0 0 0 0 1 1 0 1 + +Total # of neighbors = 2376 +Ave neighs/atom = 18.5625 +Neighbor list builds = 11 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/src/.gitignore b/src/.gitignore index df5cea6eb3..0b53288247 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -637,6 +637,8 @@ /pair_eam_fs_opt.h /pair_edip.cpp /pair_edip.h +/pair_edip_multi.cpp +/pair_edip_multi.h /pair_eff_cut.cpp /pair_eff_cut.h /pair_eff_inline.h diff --git a/src/USER-MISC/pair_edip.cpp b/src/USER-MISC/pair_edip.cpp index 6ce84ab767..bd58b746b8 100644 --- a/src/USER-MISC/pair_edip.cpp +++ b/src/USER-MISC/pair_edip.cpp @@ -798,6 +798,9 @@ void PairEDIP::coeff(int narg, char **arg) } } + if (nelements != 1) + error->all(FLERR,"Pair style edip only supports single element potentials"); + // read potential file and initialize potential parameters read_file(arg[2]); @@ -836,7 +839,7 @@ void PairEDIP::coeff(int narg, char **arg) void PairEDIP::init_style() { if (force->newton_pair == 0) - error->all(FLERR,"Pair style EDIP requires newton pair on"); + error->all(FLERR,"Pair style edip requires newton pair on"); // need a full neighbor list diff --git a/src/USER-MISC/pair_edip_multi.cpp b/src/USER-MISC/pair_edip_multi.cpp new file mode 100644 index 0000000000..ad6d48eb7f --- /dev/null +++ b/src/USER-MISC/pair_edip_multi.cpp @@ -0,0 +1,784 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Environment Dependent Interatomic Potential + + Contributing author: Chao Jiang +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include "pair_edip_multi.h" +#include "atom.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "force.h" +#include "comm.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +#define MAXLINE 1024 +#define DELTA 4 + +/* ---------------------------------------------------------------------- */ + +PairEDIPMulti::PairEDIPMulti(LAMMPS *lmp) : Pair(lmp) +{ + single_enable = 0; + restartinfo = 0; + one_coeff = 1; + manybody_flag = 1; + + nelements = 0; + elements = NULL; + nparams = maxparam = 0; + params = NULL; + elem2param = NULL; +} + +/* ---------------------------------------------------------------------- + check if allocated, since class can be destructed when incomplete +------------------------------------------------------------------------- */ + +PairEDIPMulti::~PairEDIPMulti() +{ + if (elements) + for (int i = 0; i < nelements; i++) delete [] elements[i]; + delete [] elements; + memory->destroy(params); + memory->destroy(elem2param); + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + delete [] map; + +//XXX deallocateGrids(); + deallocatePreLoops(); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairEDIPMulti::compute(int eflag, int vflag) +{ + int i,j,k,ii,jj,kk,inum,jnum; + int itype,jtype,ktype,ijparam,ikparam,ijkparam; + double xtmp,ytmp,ztmp,evdwl; + int *ilist,*jlist,*numneigh,**firstneigh; + register int preForceCoord_counter; + + double zeta_i; + double dzetair; + double fpair; + double costheta; + double dpairZ,dtripleZ; + + // eflag != 0 means compute energy contributions in this step + // vflag != 0 means compute virial contributions in this step + + evdwl = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum;//total number of atoms in the cell + ilist = list->ilist;//list of atoms + numneigh = list->numneigh;//number of near neighbors + firstneigh = list->firstneigh;//list of neighbors + + // loop over full neighbor list of my atoms + + for (ii = 0; ii < inum; ii++) { + zeta_i = 0.0; + int numForceCoordPairs = 0; + + i = ilist[ii]; + itype = map[type[i]]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + // all the neighbors of atom i + + jlist = firstneigh[i]; + jnum = numneigh[i]; + + // pre-loop to compute environment coordination f(Z) + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + double delx, dely, delz, r_ij; + + delx = x[j][0] - xtmp; + dely = x[j][1] - ytmp; + delz = x[j][2] - ztmp; + r_ij = delx * delx + dely * dely + delz * delz; + + jtype = map[type[j]]; + ijparam = elem2param[itype][jtype][jtype]; + if (r_ij > params[ijparam].cutsq) continue; + + r_ij = sqrt(r_ij); + + // zeta and its derivative dZ/dr + + if (r_ij < params[ijparam].cutoffC) zeta_i += 1.0; + else { + double f, fdr; + edip_fc(r_ij, ¶ms[ijparam], f, fdr); + zeta_i += f; + dzetair = -fdr / r_ij; + + preForceCoord_counter=numForceCoordPairs*5; + preForceCoord[preForceCoord_counter+0]=dzetair; + preForceCoord[preForceCoord_counter+1]=delx; + preForceCoord[preForceCoord_counter+2]=dely; + preForceCoord[preForceCoord_counter+3]=delz; + preForceCoord[preForceCoord_counter+4]=j; + numForceCoordPairs++; + } + } + + // two-body interactions + + dpairZ=0; + dtripleZ=0; + + for (jj = 0; jj < jnum; jj++) { + double dr_ij[3], r_ij, f_ij[3]; + + j = jlist[jj]; + j &= NEIGHMASK; + + dr_ij[0] = x[j][0] - xtmp; + dr_ij[1] = x[j][1] - ytmp; + dr_ij[2] = x[j][2] - ztmp; + r_ij = dr_ij[0]*dr_ij[0] + dr_ij[1]*dr_ij[1] + dr_ij[2]*dr_ij[2]; + + jtype = map[type[j]]; + ijparam = elem2param[itype][jtype][jtype]; + if (r_ij > params[ijparam].cutsq) continue; + + r_ij = sqrt(r_ij); + + // potential energy and force + // since pair i-j is different from pair j-i, double counting is + // already considered in constructing the potential + + double fdr, fdZ; + edip_pair(r_ij, zeta_i, ¶ms[ijparam], evdwl, fdr, fdZ); + fpair = -fdr / r_ij; + dpairZ += fdZ; + + f[i][0] -= fpair * dr_ij[0]; + f[i][1] -= fpair * dr_ij[1]; + f[i][2] -= fpair * dr_ij[2]; + + f[j][0] += fpair * dr_ij[0]; + f[j][1] += fpair * dr_ij[1]; + f[j][2] += fpair * dr_ij[2]; + + if (evflag) ev_tally(i, j, nlocal, newton_pair, evdwl, 0.0, fpair, -dr_ij[0], -dr_ij[1], -dr_ij[2]); + + // three-body Forces + + for (kk = jj + 1; kk < jnum; kk++) { + double dr_ik[3], r_ik, f_ik[3]; + + k = jlist[kk]; + k &= NEIGHMASK; + ktype = map[type[k]]; + ikparam = elem2param[itype][ktype][ktype]; + ijkparam = elem2param[itype][jtype][ktype]; + + dr_ik[0] = x[k][0] - xtmp; + dr_ik[1] = x[k][1] - ytmp; + dr_ik[2] = x[k][2] - ztmp; + r_ik = dr_ik[0]*dr_ik[0] + dr_ik[1]*dr_ik[1] + dr_ik[2]*dr_ik[2]; + + if (r_ik > params[ikparam].cutsq) continue; + + r_ik = sqrt(r_ik); + + costheta=vec3_dot(dr_ij, dr_ik) / r_ij / r_ik; + + double v1, v2, v3, v4, v5, v6, v7; + + edip_fcut3(r_ij, ¶ms[ijparam], v1, v2); + edip_fcut3(r_ik, ¶ms[ikparam], v3, v4); + edip_h(costheta, zeta_i, ¶ms[ijkparam], v5, v6, v7); + + // potential energy and forces + evdwl = v1 * v3 * v5; + dtripleZ += v1 * v3 * v7; + + double dri[3], drj[3], drk[3]; + double dhl, dfr; + + dhl = v1 * v3 * v6; + + costheta_d(dr_ij, r_ij, dr_ik, r_ik, dri, drj, drk); + + f_ij[0] = -dhl * drj[0]; + f_ij[1] = -dhl * drj[1]; + f_ij[2] = -dhl * drj[2]; + f_ik[0] = -dhl * drk[0]; + f_ik[1] = -dhl * drk[1]; + f_ik[2] = -dhl * drk[2]; + + dfr = v2 * v3 * v5; + fpair = -dfr / r_ij; + + f_ij[0] += fpair * dr_ij[0]; + f_ij[1] += fpair * dr_ij[1]; + f_ij[2] += fpair * dr_ij[2]; + + dfr = v1 * v4 * v5; + fpair = -dfr / r_ik; + + f_ik[0] += fpair * dr_ik[0]; + f_ik[1] += fpair * dr_ik[1]; + f_ik[2] += fpair * dr_ik[2]; + + f[j][0] += f_ij[0]; + f[j][1] += f_ij[1]; + f[j][2] += f_ij[2]; + + f[k][0] += f_ik[0]; + f[k][1] += f_ik[1]; + f[k][2] += f_ik[2]; + + f[i][0] -= f_ij[0] + f_ik[0]; + f[i][1] -= f_ij[1] + f_ik[1]; + f[i][2] -= f_ij[2] + f_ik[2]; + + if (evflag) ev_tally3(i,j,k,evdwl,0.0,f_ij,f_ik,dr_ij,dr_ik); + } + } + + // forces due to environment coordination f(Z) + for (int idx = 0; idx < numForceCoordPairs; idx++) { + double delx, dely, delz; + + preForceCoord_counter = idx * 5; + dzetair = preForceCoord[preForceCoord_counter+0]; + delx = preForceCoord[preForceCoord_counter+1]; + dely = preForceCoord[preForceCoord_counter+2]; + delz = preForceCoord[preForceCoord_counter+3]; + j = static_cast (preForceCoord[preForceCoord_counter+4]); + + dzetair *= (dpairZ + dtripleZ); + + f[j][0] += dzetair * delx; + f[j][1] += dzetair * dely; + f[j][2] += dzetair * delz; + + f[i][0] -= dzetair * delx; + f[i][1] -= dzetair * dely; + f[i][2] -= dzetair * delz; + + evdwl = 0.0; + if (evflag) ev_tally(i, j, nlocal, newton_pair, evdwl, 0.0, dzetair, -delx, -dely, -delz); + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +double sqr(double x) +{ + return x * x; +} + +//pair Vij, partial derivatives dVij(r,Z)/dr and dVij(r,Z)/dZ +void PairEDIPMulti::edip_pair(double r, double z, Param *param, double &eng, + double &fdr, double &fZ) +{ + double A = param->A; + double B = param->B; + double rho = param->rho; + double beta = param->beta; + double v1,v2,v3,v4; + + v1 = pow(B / r, rho); + v2 = exp(-beta * z * z); + edip_fcut2(r, param, v3, v4); + + eng = A * (v1 - v2) * v3; + fdr = A * (v1 - v2) * v4 + A * (-rho * v1 / r) * v3; + fZ = A * (2 * beta * z * v2) * v3; +} + +//function fc(r) in calculating coordination Z and derivative fc'(r) +void PairEDIPMulti::edip_fc(double r, Param *param, double &f, double &fdr) +{ + double a = param->cutoffA; + double c = param->cutoffC; + double alpha = param->alpha; + double x; + double v1, v2, v3; + + if(r < c + 1E-6) + { + f=1.0; + fdr=0.0; + return; + } + + if(r > a - 1E-6) + { + f=0.0; + fdr=0.0; + return; + } + + x = (a - c) / (r - c); + v1 = x * x * x; + v2 = 1.0 / (1.0 - v1); + + f = exp(alpha * v2); + fdr = (3.0 * x * v1 / (a - c)) * (-alpha * v2 * v2) * f; +} + +//cut-off function for Vij and its derivative fcut2'(r) +void PairEDIPMulti::edip_fcut2(double r, Param *param, double &f, double &fdr) +{ + double sigma = param->sigma; + double a = param->cutoffA; + double v1; + + if(r > a - 1E-6) + { + f=0.0; + fdr=0.0; + return; + } + + v1 = 1.0 / (r - a); + f = exp(sigma * v1); + fdr = (-sigma * v1 * v1) * f; +} + +//function tau(Z) and its derivative tau'(Z) +void PairEDIPMulti::edip_tau(double z, Param *param, double &f, double &fdZ) +{ + double u1 = param->u1; + double u2 = param->u2; + double u3 = param->u3; + double u4 = param->u4; + double v1, v2; + + v1 = exp(-u4 * z); + v2 = exp(-2.0 * u4 * z); + + f = u1 + u2 * u3 * v1 - u2 * v2; + fdZ = -u2 * u3 * u4 * v1 + 2.0 * u2 * u4 * v2; +} + +//function h(l,Z) and its partial derivatives dh(l,Z)/dl and dh(l,Z)/dZ +void PairEDIPMulti::edip_h(double l, double z, Param *param, double &f, + double &fdl, double &fdZ) +{ + double lambda = param->lambda; + double eta = param->eta; + double Q0 = param->Q0; + double mu = param->mu; + double Q, QdZ, Tau, TaudZ; + double u2, du2l, du2Z; + double v1, v2, v3; + + //function Q(Z) + Q = Q0 * exp(-mu * z); + //derivative Q'(Z) + QdZ= -mu * Q; + + edip_tau(z, param, Tau, TaudZ); + + v1 = sqr(l + Tau); + u2 = Q * v1; + v2 = exp(-u2); + + f = lambda * (1 - v2 + eta * u2); + + //df/du2 + v3 = lambda * (v2 + eta); + + //du2/dl + du2l = Q * 2 * (l + Tau); + fdl = v3 * du2l; + + //du2/dZ + du2Z = QdZ * v1 + Q * 2 * (l + Tau) * TaudZ; + fdZ = v3 * du2Z; +} + +//cut-off function for Vijk and its derivative fcut3'(r) +void PairEDIPMulti::edip_fcut3(double r, Param *param, double &f, double &fdr) +{ + double gamma = param->gamma; + double a = param->cutoffA; + double v1; + + if(r > a - 1E-6) + { + f=0.0; + fdr=0.0; + return; + } + + v1 = 1.0 / (r - a); + f = exp(gamma * v1); + fdr = (-gamma * v1 * v1) * f; +} + +/* ---------------------------------------------------------------------- + pre-calculated structures +------------------------------------------------------------------------- */ + +void PairEDIPMulti::allocatePreLoops(void) +{ + int nthreads = comm->nthreads; + + memory->create(preForceCoord,5*nthreads*leadDimInteractionList,"edip:preForceCoord"); +} + +/* ---------------------------------------------------------------------- + deallocate preLoops +------------------------------------------------------------------------- */ + +void PairEDIPMulti::deallocatePreLoops(void) +{ + memory->destroy(preForceCoord); +} + +/* ---------------------------------------------------------------------- */ + +void PairEDIPMulti::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"); + + map = new int[n+1]; +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairEDIPMulti::settings(int narg, char **arg) +{ + if (narg != 0) error->all(FLERR,"Illegal pair_style command"); +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairEDIPMulti::coeff(int narg, char **arg) +{ + int i,j,n; + + if (!allocated) allocate(); + + if (narg != 3 + atom->ntypes) + error->all(FLERR,"Incorrect args for pair coefficients"); + + // insure I,J args are * * + + if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0) + error->all(FLERR,"Incorrect args for pair coefficients"); + + // read args that map atom types to elements in potential file + // map[i] = which element the Ith atom type is, -1 if NULL + // nelements = # of unique elements + // elements = list of element names + + if (elements) { + for (i = 0; i < nelements; i++) delete [] elements[i]; + delete [] elements; + } + elements = new char*[atom->ntypes]; + for (i = 0; i < atom->ntypes; i++) elements[i] = NULL; + + nelements = 0; + for (i = 3; i < narg; i++) { + if (strcmp(arg[i],"NULL") == 0) { + map[i-2] = -1; + continue; + } + for (j = 0; j < nelements; j++) + if (strcmp(arg[i],elements[j]) == 0) break; + map[i-2] = j; + if (j == nelements) { + n = strlen(arg[i]) + 1; + elements[j] = new char[n]; + strcpy(elements[j],arg[i]); + nelements++; + } + } + + // read potential file and initialize potential parameters + + read_file(arg[2]); + setup(); + + // clear setflag since coeff() called once with I,J = * * + + n = atom->ntypes; + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + // set setflag i,j for type pairs where both are mapped to elements + + int count = 0; + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + if (map[i] >= 0 && map[j] >= 0) { + setflag[i][j] = 1; + count++; + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); + + // allocate tables and internal structures + + allocatePreLoops(); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairEDIPMulti::init_style() +{ + if (atom->tag_enable == 0) + error->all(FLERR,"Pair style edip/multi requires atom IDs"); + if (force->newton_pair == 0) + error->all(FLERR,"Pair style edip/multi requires newton pair on"); + + // need a full neighbor list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairEDIPMulti::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + return cutmax; +} + +/* ---------------------------------------------------------------------- */ + +void PairEDIPMulti::read_file(char *file) +{ + int params_per_line = 20; + char **words = new char*[params_per_line+1]; + + memory->sfree(params); + params = NULL; + nparams = maxparam = 0; + + // open file on proc 0 + + FILE *fp; + if (comm->me == 0) { + fp = force->open_potential(file); + if (fp == NULL) { + char str[128]; + sprintf(str,"Cannot open EDIP potential file %s",file); + error->one(FLERR,str); + } + } + + // read each set of params from potential file + // one set of params can span multiple lines + // store params if all 3 element tags are in element list + + int n,nwords,ielement,jelement,kelement; + char line[MAXLINE],*ptr; + int eof = 0; + + while (1) { + if (comm->me == 0) { + ptr = fgets(line,MAXLINE,fp); + if (ptr == NULL) { + eof = 1; + fclose(fp); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + + // strip comment, skip line if blank + + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + if (nwords == 0) continue; + + // concatenate additional lines until have params_per_line words + + while (nwords < params_per_line) { + n = strlen(line); + if (comm->me == 0) { + ptr = fgets(&line[n],MAXLINE-n,fp); + if (ptr == NULL) { + eof = 1; + fclose(fp); + } else n = strlen(line) + 1; + } + MPI_Bcast(&eof,1,MPI_INT,0,world); + if (eof) break; + MPI_Bcast(&n,1,MPI_INT,0,world); + MPI_Bcast(line,n,MPI_CHAR,0,world); + if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = atom->count_words(line); + } + + if (nwords != params_per_line) + error->all(FLERR,"Incorrect format in EDIP potential file"); + + // words = ptrs to all words in line + + nwords = 0; + words[nwords++] = strtok(line," \t\n\r\f"); + while ((words[nwords++] = strtok(NULL," \t\n\r\f"))) continue; + + // ielement,jelement,kelement = 1st args + // if all 3 args are in element list, then parse this line + // else skip to next entry in file + + for (ielement = 0; ielement < nelements; ielement++) + if (strcmp(words[0],elements[ielement]) == 0) break; + if (ielement == nelements) continue; + for (jelement = 0; jelement < nelements; jelement++) + if (strcmp(words[1],elements[jelement]) == 0) break; + if (jelement == nelements) continue; + for (kelement = 0; kelement < nelements; kelement++) + if (strcmp(words[2],elements[kelement]) == 0) break; + if (kelement == nelements) continue; + + // load up parameter settings and error check their values + + if (nparams == maxparam) { + maxparam += DELTA; + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), + "pair:params"); + } + + params[nparams].ielement = ielement; + params[nparams].jelement = jelement; + params[nparams].kelement = kelement; + params[nparams].A = atof(words[3]); + params[nparams].B = atof(words[4]); + params[nparams].cutoffA = atof(words[5]); + params[nparams].cutoffC = atof(words[6]); + params[nparams].alpha = atof(words[7]); + params[nparams].beta = atof(words[8]); + params[nparams].eta = atof(words[9]); + params[nparams].gamma = atof(words[10]); + params[nparams].lambda = atof(words[11]); + params[nparams].mu = atof(words[12]); + params[nparams].rho = atof(words[13]); + params[nparams].sigma = atof(words[14]); + params[nparams].Q0 = atof(words[15]); + params[nparams].u1 = atof(words[16]); + params[nparams].u2 = atof(words[17]); + params[nparams].u3 = atof(words[18]); + params[nparams].u4 = atof(words[19]); + + if (params[nparams].A < 0.0 || params[nparams].B < 0.0 || + params[nparams].cutoffA < 0.0 || params[nparams].cutoffC < 0.0 || + params[nparams].alpha < 0.0 || params[nparams].beta < 0.0 || + params[nparams].eta < 0.0 || params[nparams].gamma < 0.0 || + params[nparams].lambda < 0.0 || params[nparams].mu < 0.0 || + params[nparams].rho < 0.0 || params[nparams].sigma < 0.0) + error->all(FLERR,"Illegal EDIP parameter"); + + nparams++; + } + + delete [] words; +} + +/* ---------------------------------------------------------------------- */ + +void PairEDIPMulti::setup() +{ + int i,j,k,m,n; + double rtmp; + + // set elem2param for all triplet combinations + // must be a single exact match to lines read from file + // do not allow for ACB in place of ABC + + memory->destroy(elem2param); + memory->create(elem2param,nelements,nelements,nelements,"pair:elem2param"); + + for (i = 0; i < nelements; i++) + for (j = 0; j < nelements; j++) + for (k = 0; k < nelements; k++) { + n = -1; + for (m = 0; m < nparams; m++) { + if (i == params[m].ielement && j == params[m].jelement && + k == params[m].kelement) { + if (n >= 0) error->all(FLERR,"Potential file has duplicate entry"); + n = m; + } + } + if (n < 0) error->all(FLERR,"Potential file is missing an entry"); + elem2param[i][j][k] = n; + } + + // set cutoff square + + for (m = 0; m < nparams; m++) { + params[m].cutsq = params[m].cutoffA*params[m].cutoffA; + } + + // set cutmax to max of all params + + cutmax = 0.0; + for (m = 0; m < nparams; m++) { + rtmp = sqrt(params[m].cutsq); + if (rtmp > cutmax) cutmax = rtmp; + } + +} diff --git a/src/USER-MISC/pair_edip_multi.h b/src/USER-MISC/pair_edip_multi.h new file mode 100644 index 0000000000..e55916f79b --- /dev/null +++ b/src/USER-MISC/pair_edip_multi.h @@ -0,0 +1,113 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(edip/multi,PairEDIPMulti) + +#else + +#ifndef LMP_PAIR_EDIP_MULTI_H +#define LMP_PAIR_EDIP_MULTI_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairEDIPMulti : public Pair { + public: + PairEDIPMulti(class LAMMPS *); + virtual ~PairEDIPMulti(); + virtual void compute(int, int); + void settings(int, char **); + void coeff(int, char **); + double init_one(int, int); + void init_style(); + + protected: + struct Param { + double A, B;//coefficients for pair interaction I-J + double cutoffA;//cut-off distance for pair interaction I-J + double cutoffC;//lower cut-off distance for calculating Z_I + double alpha;//coefficient for calculating Z_I + double beta;//attractive term for pair I-J + double sigma;//cut-off coefficient for pair I-J + double rho;//pair I-J + double gamma;//coefficient for three-body interaction I-J-K + double eta, lambda;//coefficients for function h(l,Z) + double mu, Q0;//coefficients for function Q(Z) + double u1, u2, u3, u4;//coefficients for function tau(Z) + double cutsq; + int ielement,jelement,kelement; + }; + + double *preForceCoord; + + double cutmax; // max cutoff for all elements + int nelements; // # of unique elements + char **elements; // names of unique elements + int ***elem2param; // mapping from element triplets to parameters + int *map; // mapping from atom types to elements + int nparams; // # of stored parameter sets + int maxparam; // max # of parameter sets + Param *params; // parameter set for an I-J-K interaction + + // max number of interaction per atom for f(Z) environment potential + + static const int leadDimInteractionList = 64; + + void allocate(); + void allocatePreLoops(void); + void deallocatePreLoops(void); + + void read_file(char *); + void setup(); + + void edip_pair(double, double, Param *, double &, double &, double &); + void edip_fc(double, Param *, double &, double &); + void edip_fcut2(double, Param *, double &, double &); + void edip_tau(double, Param *, double &, double &); + void edip_h(double, double, Param *, double &, double &, double &); + void edip_fcut3(double, Param *, double &, double &); + + double vec3_dot(double x[3], double y[3]) + { + return x[0]*y[0] + x[1]*y[1] + x[2]*y[2]; + } + + void vec3_add(double k1, double x[3], double k2, double y[3], double *z) + { + z[0] = k1 * x[0] + k2 * y[0]; + z[1] = k1 * x[1] + k2 * y[1]; + z[2] = k1 * x[2] + k2 * y[2]; + } + + //dr_ij=r_j - r_i + //dr_ik=r_k - r_i + void costheta_d(double *dr_ij, double r_ij, double *dr_ik, double r_ik, + double *dri, double *drj, double *drk) + { + double costheta; + + costheta = vec3_dot(dr_ij, dr_ik) / r_ij / r_ik; + vec3_add(1 / r_ij / r_ik, dr_ik, -costheta / r_ij / r_ij, dr_ij, drj); + vec3_add(1 / r_ij / r_ik, dr_ij, -costheta / r_ik / r_ik, dr_ik, drk); + vec3_add(-1, drj, -1, drk, dri); + } + +}; + +} + +#endif +#endif From 7f9a331c73557ddbdce76ea393ddd5f87d346ec1 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 16 May 2017 15:51:41 -0600 Subject: [PATCH 028/302] bugfix for 2 recenty reported neighbor issues, also a ReaxFF fix species issue --- doc/src/pair_yukawa_colloid.txt | 2 +- src/QEQ/fix_qeq.cpp | 3 -- src/USER-DPD/nbin_ssa.cpp | 3 ++ src/USER-DPD/npair_half_bin_newton_ssa.cpp | 2 +- src/USER-OMP/npair_full_bin_ghost_omp.cpp | 2 +- src/USER-OMP/npair_full_bin_omp.cpp | 2 +- src/USER-OMP/npair_full_multi_omp.cpp | 2 +- .../npair_half_bin_newtoff_ghost_omp.cpp | 2 +- src/USER-OMP/npair_half_bin_newtoff_omp.cpp | 2 +- src/USER-OMP/npair_half_bin_newton_omp.cpp | 2 +- .../npair_half_bin_newton_tri_omp.cpp | 2 +- src/USER-OMP/npair_half_multi_newtoff_omp.cpp | 2 +- src/USER-OMP/npair_half_multi_newton_omp.cpp | 2 +- .../npair_half_multi_newton_tri_omp.cpp | 2 +- .../npair_half_respa_bin_newtoff_omp.cpp | 2 +- .../npair_half_respa_bin_newton_omp.cpp | 2 +- .../npair_half_respa_bin_newton_tri_omp.cpp | 2 +- .../npair_half_size_bin_newtoff_omp.cpp | 2 +- .../npair_half_size_bin_newton_omp.cpp | 2 +- .../npair_half_size_bin_newton_tri_omp.cpp | 2 +- src/USER-REAXC/fix_qeq_reax.cpp | 3 -- src/USER-REAXC/fix_reaxc_species.cpp | 2 +- src/nbin.cpp | 9 +++- src/nbin.h | 7 +-- src/nbin_standard.cpp | 3 ++ src/neigh_request.cpp | 1 + src/neighbor.cpp | 22 +++++++- src/npair.cpp | 50 ++----------------- src/npair.h | 2 +- src/npair_full_bin.cpp | 2 +- src/npair_full_bin_atomonly.cpp | 2 +- src/npair_full_bin_ghost.cpp | 2 +- src/npair_full_multi.cpp | 2 +- src/npair_half_bin_atomonly_newton.cpp | 3 +- src/npair_half_bin_newtoff.cpp | 2 +- src/npair_half_bin_newtoff_ghost.cpp | 2 +- src/npair_half_bin_newton.cpp | 2 +- src/npair_half_bin_newton_tri.cpp | 2 +- src/npair_half_multi_newtoff.cpp | 2 +- src/npair_half_multi_newton.cpp | 2 +- src/npair_half_multi_newton_tri.cpp | 2 +- src/npair_half_respa_bin_newtoff.cpp | 2 +- src/npair_half_respa_bin_newton.cpp | 2 +- src/npair_half_respa_bin_newton_tri.cpp | 2 +- src/npair_half_size_bin_newtoff.cpp | 2 +- src/npair_half_size_bin_newton.cpp | 2 +- src/npair_half_size_bin_newton_tri.cpp | 2 +- 47 files changed, 80 insertions(+), 98 deletions(-) diff --git a/doc/src/pair_yukawa_colloid.txt b/doc/src/pair_yukawa_colloid.txt index 3d5294bbdb..ecdc1496ab 100644 --- a/doc/src/pair_yukawa_colloid.txt +++ b/doc/src/pair_yukawa_colloid.txt @@ -35,7 +35,7 @@ cutoff. In contrast to "pair_style yukawa"_pair_yukawa.html, this functional form arises from the Coulombic interaction between two colloid particles, screened due to the presence of an electrolyte, see the -book by "Safran"_#Safran for a derivation in the context of DVLO +book by "Safran"_#Safran for a derivation in the context of DLVO theory. "Pair_style yukawa"_pair_yukawa.html is a screened Coulombic potential between two point-charges and uses no such approximation. diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index 7e8db7632c..c5b566eef7 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -286,9 +286,6 @@ void FixQEq::setup_pre_force(int vflag) if (force->newton_pair == 0) error->all(FLERR,"QEQ with 'newton pair off' not supported"); - // should not be needed - // neighbor->build_one(list); - deallocate_storage(); allocate_storage(); diff --git a/src/USER-DPD/nbin_ssa.cpp b/src/USER-DPD/nbin_ssa.cpp index 73da5e0df3..f65a397e88 100644 --- a/src/USER-DPD/nbin_ssa.cpp +++ b/src/USER-DPD/nbin_ssa.cpp @@ -76,6 +76,7 @@ void NBinSSA::bin_atoms() if (ssaAIR[i] < 2) continue; // skip ghost atoms not in AIR if (mask[i] & bitmask) { ibin = coord2bin(x[i]); + atom2bin[i] = ibin; bins_ssa[i] = gbinhead_ssa[ibin]; gbinhead_ssa[ibin] = i; } @@ -84,12 +85,14 @@ void NBinSSA::bin_atoms() for (i = nall-1; i >= nlocal; i--) { if (ssaAIR[i] < 2) continue; // skip ghost atoms not in AIR ibin = coord2bin(x[i]); + atom2bin[i] = ibin; bins_ssa[i] = gbinhead_ssa[ibin]; gbinhead_ssa[ibin] = i; } } for (i = nlocal-1; i >= 0; i--) { ibin = coord2bin(x[i]); + atom2bin[i] = ibin; bins_ssa[i] = binhead_ssa[ibin]; binhead_ssa[ibin] = i; } diff --git a/src/USER-DPD/npair_half_bin_newton_ssa.cpp b/src/USER-DPD/npair_half_bin_newton_ssa.cpp index 59acbda301..e8e4b20a0a 100644 --- a/src/USER-DPD/npair_half_bin_newton_ssa.cpp +++ b/src/USER-DPD/npair_half_bin_newton_ssa.cpp @@ -141,7 +141,7 @@ void NPairHalfBinNewtonSSA::build(NeighList *list) } } - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; // loop over all local atoms in other bins in "half" stencil diff --git a/src/USER-OMP/npair_full_bin_ghost_omp.cpp b/src/USER-OMP/npair_full_bin_ghost_omp.cpp index 7f7239fe63..b915aca002 100644 --- a/src/USER-OMP/npair_full_bin_ghost_omp.cpp +++ b/src/USER-OMP/npair_full_bin_ghost_omp.cpp @@ -97,7 +97,7 @@ void NPairFullBinGhostOmp::build(NeighList *list) // no molecular test when i = ghost atom if (i < nlocal) { - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { if (i == j) continue; diff --git a/src/USER-OMP/npair_full_bin_omp.cpp b/src/USER-OMP/npair_full_bin_omp.cpp index ad9e48784e..e1f75c06e2 100644 --- a/src/USER-OMP/npair_full_bin_omp.cpp +++ b/src/USER-OMP/npair_full_bin_omp.cpp @@ -90,7 +90,7 @@ void NPairFullBinOmp::build(NeighList *list) // loop over all atoms in surrounding bins in stencil including self // skip i = j - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { diff --git a/src/USER-OMP/npair_full_multi_omp.cpp b/src/USER-OMP/npair_full_multi_omp.cpp index eb0153d63f..9bc196e17a 100644 --- a/src/USER-OMP/npair_full_multi_omp.cpp +++ b/src/USER-OMP/npair_full_multi_omp.cpp @@ -94,7 +94,7 @@ void NPairFullMultiOmp::build(NeighList *list) // skip if i,j neighbor cutoff is less than bin distance // skip i = j - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; s = stencil_multi[itype]; distsq = distsq_multi[itype]; cutsq = cutneighsq[itype]; diff --git a/src/USER-OMP/npair_half_bin_newtoff_ghost_omp.cpp b/src/USER-OMP/npair_half_bin_newtoff_ghost_omp.cpp index e46afebb0d..05763c3d68 100644 --- a/src/USER-OMP/npair_half_bin_newtoff_ghost_omp.cpp +++ b/src/USER-OMP/npair_half_bin_newtoff_ghost_omp.cpp @@ -103,7 +103,7 @@ void NPairHalfBinNewtoffGhostOmp::build(NeighList *list) // no molecular test when i = ghost atom if (i < nlocal) { - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { diff --git a/src/USER-OMP/npair_half_bin_newtoff_omp.cpp b/src/USER-OMP/npair_half_bin_newtoff_omp.cpp index 99698b1d30..ff74b54d7d 100644 --- a/src/USER-OMP/npair_half_bin_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_bin_newtoff_omp.cpp @@ -94,7 +94,7 @@ void NPairHalfBinNewtoffOmp::build(NeighList *list) // stores own/own pairs only once // stores own/ghost pairs on both procs - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { diff --git a/src/USER-OMP/npair_half_bin_newton_omp.cpp b/src/USER-OMP/npair_half_bin_newton_omp.cpp index 33d78fe55a..f7d969ba27 100644 --- a/src/USER-OMP/npair_half_bin_newton_omp.cpp +++ b/src/USER-OMP/npair_half_bin_newton_omp.cpp @@ -130,7 +130,7 @@ void NPairHalfBinNewtonOmp::build(NeighList *list) // loop over all atoms in other bins in stencil, store every pair - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { jtype = type[j]; diff --git a/src/USER-OMP/npair_half_bin_newton_tri_omp.cpp b/src/USER-OMP/npair_half_bin_newton_tri_omp.cpp index 9eb9612235..c843d623cd 100644 --- a/src/USER-OMP/npair_half_bin_newton_tri_omp.cpp +++ b/src/USER-OMP/npair_half_bin_newton_tri_omp.cpp @@ -94,7 +94,7 @@ void NPairHalfBinNewtonTriOmp::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - ibin = coord2bin(x[i]); + 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; diff --git a/src/USER-OMP/npair_half_multi_newtoff_omp.cpp b/src/USER-OMP/npair_half_multi_newtoff_omp.cpp index 37dc805857..705d1b8d9f 100644 --- a/src/USER-OMP/npair_half_multi_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_multi_newtoff_omp.cpp @@ -97,7 +97,7 @@ void NPairHalfMultiNewtoffOmp::build(NeighList *list) // stores own/own pairs only once // stores own/ghost pairs on both procs - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; s = stencil_multi[itype]; distsq = distsq_multi[itype]; cutsq = cutneighsq[itype]; diff --git a/src/USER-OMP/npair_half_multi_newton_omp.cpp b/src/USER-OMP/npair_half_multi_newton_omp.cpp index 9719911afa..f16dd027a0 100644 --- a/src/USER-OMP/npair_half_multi_newton_omp.cpp +++ b/src/USER-OMP/npair_half_multi_newton_omp.cpp @@ -131,7 +131,7 @@ void NPairHalfMultiNewtonOmp::build(NeighList *list) // loop over all atoms in other bins in stencil, store every pair // skip if i,j neighbor cutoff is less than bin distance - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; s = stencil_multi[itype]; distsq = distsq_multi[itype]; cutsq = cutneighsq[itype]; diff --git a/src/USER-OMP/npair_half_multi_newton_tri_omp.cpp b/src/USER-OMP/npair_half_multi_newton_tri_omp.cpp index 717a709386..f66cf194e7 100644 --- a/src/USER-OMP/npair_half_multi_newton_tri_omp.cpp +++ b/src/USER-OMP/npair_half_multi_newton_tri_omp.cpp @@ -99,7 +99,7 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; s = stencil_multi[itype]; distsq = distsq_multi[itype]; cutsq = cutneighsq[itype]; diff --git a/src/USER-OMP/npair_half_respa_bin_newtoff_omp.cpp b/src/USER-OMP/npair_half_respa_bin_newtoff_omp.cpp index 287f11efa7..12780fa4a3 100644 --- a/src/USER-OMP/npair_half_respa_bin_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_respa_bin_newtoff_omp.cpp @@ -117,7 +117,7 @@ void NPairHalfRespaBinNewtoffOmp::build(NeighList *list) xtmp = x[i][0]; ytmp = x[i][1]; ztmp = x[i][2]; - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; if (moltemplate) { imol = molindex[i]; iatom = molatom[i]; diff --git a/src/USER-OMP/npair_half_respa_bin_newton_omp.cpp b/src/USER-OMP/npair_half_respa_bin_newton_omp.cpp index 30256bd20d..b9a6364242 100644 --- a/src/USER-OMP/npair_half_respa_bin_newton_omp.cpp +++ b/src/USER-OMP/npair_half_respa_bin_newton_omp.cpp @@ -176,7 +176,7 @@ void NPairHalfRespaBinNewtonOmp::build(NeighList *list) // loop over all atoms in other bins in stencil, store every pair - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { jtype = type[j]; diff --git a/src/USER-OMP/npair_half_respa_bin_newton_tri_omp.cpp b/src/USER-OMP/npair_half_respa_bin_newton_tri_omp.cpp index 27d02000c5..bc03972d85 100644 --- a/src/USER-OMP/npair_half_respa_bin_newton_tri_omp.cpp +++ b/src/USER-OMP/npair_half_respa_bin_newton_tri_omp.cpp @@ -128,7 +128,7 @@ void NPairHalfRespaBinNewtonTriOmp::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - ibin = coord2bin(x[i]); + 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; diff --git a/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp b/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp index 699d347db5..dbb62e96ef 100644 --- a/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp @@ -113,7 +113,7 @@ void NPairHalfSizeBinNewtoffOmp::build(NeighList *list) ytmp = x[i][1]; ztmp = x[i][2]; radi = radius[i]; - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; // loop over all atoms in surrounding bins in stencil including self // only store pair if i < j diff --git a/src/USER-OMP/npair_half_size_bin_newton_omp.cpp b/src/USER-OMP/npair_half_size_bin_newton_omp.cpp index 0d7e4e68da..2c26c7952c 100644 --- a/src/USER-OMP/npair_half_size_bin_newton_omp.cpp +++ b/src/USER-OMP/npair_half_size_bin_newton_omp.cpp @@ -168,7 +168,7 @@ void NPairHalfSizeBinNewtonOmp::build(NeighList *list) // loop over all atoms in other bins in stencil, store every pair - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { if (exclude && exclusion(i,j,type[i],type[j],mask,molecule)) continue; diff --git a/src/USER-OMP/npair_half_size_bin_newton_tri_omp.cpp b/src/USER-OMP/npair_half_size_bin_newton_tri_omp.cpp index 7463a6aba6..bf273f545f 100644 --- a/src/USER-OMP/npair_half_size_bin_newton_tri_omp.cpp +++ b/src/USER-OMP/npair_half_size_bin_newton_tri_omp.cpp @@ -84,7 +84,7 @@ void NPairHalfSizeBinNewtonTriOmp::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - ibin = coord2bin(x[i]); + 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; diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 01ecd9d399..96df03c668 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -416,9 +416,6 @@ void FixQEqReax::init_taper() void FixQEqReax::setup_pre_force(int vflag) { - // should not be needed - // neighbor->build_one(list); - deallocate_storage(); allocate_storage(); diff --git a/src/USER-REAXC/fix_reaxc_species.cpp b/src/USER-REAXC/fix_reaxc_species.cpp index 672b1e6a56..fe74337128 100644 --- a/src/USER-REAXC/fix_reaxc_species.cpp +++ b/src/USER-REAXC/fix_reaxc_species.cpp @@ -500,7 +500,7 @@ void FixReaxCSpecies::Output_ReaxC_Bonds(bigint ntimestep, FILE *fp) AtomCoord FixReaxCSpecies::chAnchor(AtomCoord in1, AtomCoord in2) { - if (in1.x < in2.x) + if (in1.x <= in2.x) return in1; return in2; } diff --git a/src/nbin.cpp b/src/nbin.cpp index 6aa37a4c43..6bd1ce322f 100644 --- a/src/nbin.cpp +++ b/src/nbin.cpp @@ -29,6 +29,7 @@ NBin::NBin(LAMMPS *lmp) : Pointers(lmp) maxbin = maxatom = 0; binhead = NULL; bins = NULL; + atom2bin = NULL; // geometry settings @@ -42,6 +43,7 @@ NBin::~NBin() { memory->destroy(binhead); memory->destroy(bins); + memory->destroy(atom2bin); } /* ---------------------------------------------------------------------- */ @@ -87,12 +89,15 @@ void NBin::bin_atoms_setup(int nall) memory->create(binhead,maxbin,"neigh:binhead"); } - // bins = per-atom vector + // bins and atom2bin = per-atom vectors + // for both local and ghost atoms if (nall > maxatom) { maxatom = nall; memory->destroy(bins); memory->create(bins,maxatom,"neigh:bins"); + memory->destroy(atom2bin); + memory->create(atom2bin,maxatom,"neigh:atom2bin"); } } @@ -148,6 +153,6 @@ bigint NBin::memory_usage() { bigint bytes = 0; bytes += maxbin*sizeof(int); - bytes += maxatom*sizeof(int); + bytes += 2*maxatom*sizeof(int); return bytes; } diff --git a/src/nbin.h b/src/nbin.h index 9871a229d8..30c74ff295 100644 --- a/src/nbin.h +++ b/src/nbin.h @@ -31,10 +31,11 @@ class NBin : protected Pointers { double binsizex,binsizey,binsizez; // bin sizes and inverse sizes double bininvx,bininvy,bininvz; - int *binhead; // index of first atom in each bin - int *bins; // index of next atom in same bin + int *binhead; // index of first atom in each bin + int *bins; // index of next atom in same bin + int *atom2bin; // bin assignment for each atom (local+ghost) - double cutoff_custom; // cutoff set by requestor + double cutoff_custom; // cutoff set by requestor NBin(class LAMMPS *); ~NBin(); diff --git a/src/nbin_standard.cpp b/src/nbin_standard.cpp index 2a72d996a5..e6941014f9 100644 --- a/src/nbin_standard.cpp +++ b/src/nbin_standard.cpp @@ -211,12 +211,14 @@ void NBinStandard::bin_atoms() for (i = nall-1; i >= nlocal; i--) { if (mask[i] & bitmask) { ibin = coord2bin(x[i]); + atom2bin[i] = ibin; bins[i] = binhead[ibin]; binhead[ibin] = i; } } for (i = atom->nfirst-1; i >= 0; i--) { ibin = coord2bin(x[i]); + atom2bin[i] = ibin; bins[i] = binhead[ibin]; binhead[ibin] = i; } @@ -224,6 +226,7 @@ void NBinStandard::bin_atoms() } else { for (i = nall-1; i >= 0; i--) { ibin = coord2bin(x[i]); + atom2bin[i] = ibin; bins[i] = binhead[ibin]; binhead[ibin] = i; } diff --git a/src/neigh_request.cpp b/src/neigh_request.cpp index 5e77c23077..bb691d00ba 100644 --- a/src/neigh_request.cpp +++ b/src/neigh_request.cpp @@ -50,6 +50,7 @@ NeighRequest::NeighRequest(LAMMPS *lmp) : Pointers(lmp) // default is no Intel-specific neighbor list build // default is no Kokkos neighbor list build // default is no Shardlow Splitting Algorithm (SSA) neighbor list build + // default is no list-specific cutoff // default is no storage of auxiliary floating point values occasional = 0; diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 545c8cf027..62a9143226 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -640,6 +640,24 @@ int Neighbor::init_pair() delete [] neigh_stencil; delete [] neigh_pair; + // error check on requests + // do not allow occasional, ghost, bin list + // b/c it still uses variant of coord2bin() in NPair() method + // instead of atom2bin, this could cause error b/c stoms have + // moved out of proc domain by time occasional list is built + // solution would be to use a different NBin variant + // that used Npair::coord2bin(x,ix,iy,iz) (then delete it from NPair) + // and stored the ix,iy,iz values for all atoms (including ghosts) + // at time of binning when neighbor lists are rebuilt, + // similar to what vanilla Nbin::coord2atom() does now in atom2bin + + if (style == BIN) { + for (i = 0; i < nrequest; i++) + if (requests[i]->occasional && requests[i]->ghost) + error->all(FLERR,"Cannot request an occasional binned neighbor list " + "with ghost info"); + } + // morph requests in various ways // purpose is to avoid duplicate or inefficient builds // may add new requests if a needed request to derive from does not exist @@ -1669,7 +1687,6 @@ int Neighbor::choose_stencil(NeighRequest *rq) else if (rq->newton == 1) newtflag = 1; else if (rq->newton == 2) newtflag = 0; - //printf("STENCIL RQ FLAGS: hff %d %d n %d g %d s %d newtflag %d\n", // rq->half,rq->full,rq->newton,rq->ghost,rq->ssa, // newtflag); @@ -2087,7 +2104,7 @@ void Neighbor::build(int topoflag) } // bin atoms for all NBin instances - // not just NBin associated with perpetual lists + // not just NBin associated with perpetual lists, also occasional lists // b/c cannot wait to bin occasional lists in build_one() call // if bin then, atoms may have moved outside of proc domain & bin extent, // leading to errors or even a crash @@ -2193,6 +2210,7 @@ void Neighbor::build_one(class NeighList *mylist, int preflag) // build the list + if (!mylist->copy) mylist->grow(atom->nlocal,atom->nlocal+atom->nghost); np->build_setup(); np->build(mylist); } diff --git a/src/npair.cpp b/src/npair.cpp index 6c3f8ac05e..3451cd6eae 100644 --- a/src/npair.cpp +++ b/src/npair.cpp @@ -128,6 +128,7 @@ void NPair::copy_bin_info() bininvy = nb->bininvy; bininvz = nb->bininvz; + atom2bin = nb->atom2bin; bins = nb->bins; binhead = nb->binhead; } @@ -198,53 +199,8 @@ int NPair::exclusion(int i, int j, int itype, int jtype, } /* ---------------------------------------------------------------------- - convert atom coords into local bin # - for orthogonal, only ghost atoms will have coord >= bboxhi or coord < bboxlo - take special care to insure ghosts are in correct bins even w/ roundoff - hi ghost atoms = nbin,nbin+1,etc - owned atoms = 0 to nbin-1 - lo ghost atoms = -1,-2,etc - this is necessary so that both procs on either side of PBC - treat a pair of atoms straddling the PBC in a consistent way - for triclinic, doesn't matter since stencil & neigh list built differently -------------------------------------------------------------------------- */ - -int NPair::coord2bin(double *x) -{ - int ix,iy,iz; - - if (!ISFINITE(x[0]) || !ISFINITE(x[1]) || !ISFINITE(x[2])) - error->one(FLERR,"Non-numeric positions - simulation unstable"); - - if (x[0] >= bboxhi[0]) - ix = static_cast ((x[0]-bboxhi[0])*bininvx) + nbinx; - else if (x[0] >= bboxlo[0]) { - ix = static_cast ((x[0]-bboxlo[0])*bininvx); - ix = MIN(ix,nbinx-1); - } else - ix = static_cast ((x[0]-bboxlo[0])*bininvx) - 1; - - if (x[1] >= bboxhi[1]) - iy = static_cast ((x[1]-bboxhi[1])*bininvy) + nbiny; - else if (x[1] >= bboxlo[1]) { - iy = static_cast ((x[1]-bboxlo[1])*bininvy); - iy = MIN(iy,nbiny-1); - } else - iy = static_cast ((x[1]-bboxlo[1])*bininvy) - 1; - - if (x[2] >= bboxhi[2]) - iz = static_cast ((x[2]-bboxhi[2])*bininvz) + nbinz; - else if (x[2] >= bboxlo[2]) { - iz = static_cast ((x[2]-bboxlo[2])*bininvz); - iz = MIN(iz,nbinz-1); - } else - iz = static_cast ((x[2]-bboxlo[2])*bininvz) - 1; - - return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo); -} - -/* ---------------------------------------------------------------------- - same as coord2bin, but also return ix,iy,iz offsets in each dim + same as coord2bin in Nbin, but also return ix,iy,iz offsets in each dim + used by some of the ghost neighbor lists ------------------------------------------------------------------------- */ int NPair::coord2bin(double *x, int &ix, int &iy, int &iz) diff --git a/src/npair.h b/src/npair.h index 8f2bcb13bc..4e5e3f5dfd 100644 --- a/src/npair.h +++ b/src/npair.h @@ -77,7 +77,7 @@ class NPair : protected Pointers { int mbinx,mbiny,mbinz; int mbinxlo,mbinylo,mbinzlo; double bininvx,bininvy,bininvz; - int *bins; + int *atom2bin,*bins; int *binhead; // data from NStencil class diff --git a/src/npair_full_bin.cpp b/src/npair_full_bin.cpp index a29acb67ab..94a6af129c 100644 --- a/src/npair_full_bin.cpp +++ b/src/npair_full_bin.cpp @@ -80,7 +80,7 @@ void NPairFullBin::build(NeighList *list) // loop over all atoms in surrounding bins in stencil including self // skip i = j - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { diff --git a/src/npair_full_bin_atomonly.cpp b/src/npair_full_bin_atomonly.cpp index 8d4fc254b5..db84733f1c 100644 --- a/src/npair_full_bin_atomonly.cpp +++ b/src/npair_full_bin_atomonly.cpp @@ -64,7 +64,7 @@ void NPairFullBinAtomonly::build(NeighList *list) // loop over all atoms in surrounding bins in stencil including self // skip i = j - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { diff --git a/src/npair_full_bin_ghost.cpp b/src/npair_full_bin_ghost.cpp index 1e258cf518..2edd03cc9e 100644 --- a/src/npair_full_bin_ghost.cpp +++ b/src/npair_full_bin_ghost.cpp @@ -87,7 +87,7 @@ void NPairFullBinGhost::build(NeighList *list) // no molecular test when i = ghost atom if (i < nlocal) { - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { if (i == j) continue; diff --git a/src/npair_full_multi.cpp b/src/npair_full_multi.cpp index 628a706e7a..9a2490ac5d 100644 --- a/src/npair_full_multi.cpp +++ b/src/npair_full_multi.cpp @@ -83,7 +83,7 @@ void NPairFullMulti::build(NeighList *list) // skip if i,j neighbor cutoff is less than bin distance // skip i = j - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; s = stencil_multi[itype]; distsq = distsq_multi[itype]; cutsq = cutneighsq[itype]; diff --git a/src/npair_half_bin_atomonly_newton.cpp b/src/npair_half_bin_atomonly_newton.cpp index bc425cd22e..6bbef0700a 100644 --- a/src/npair_half_bin_atomonly_newton.cpp +++ b/src/npair_half_bin_atomonly_newton.cpp @@ -90,7 +90,8 @@ void NPairHalfBinAtomonlyNewton::build(NeighList *list) // loop over all atoms in other bins in stencil, store every pair - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; + for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { jtype = type[j]; diff --git a/src/npair_half_bin_newtoff.cpp b/src/npair_half_bin_newtoff.cpp index dd072508a9..4c44741ffe 100644 --- a/src/npair_half_bin_newtoff.cpp +++ b/src/npair_half_bin_newtoff.cpp @@ -84,7 +84,7 @@ void NPairHalfBinNewtoff::build(NeighList *list) // stores own/own pairs only once // stores own/ghost pairs on both procs - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { diff --git a/src/npair_half_bin_newtoff_ghost.cpp b/src/npair_half_bin_newtoff_ghost.cpp index f486df105a..72ec15e66a 100644 --- a/src/npair_half_bin_newtoff_ghost.cpp +++ b/src/npair_half_bin_newtoff_ghost.cpp @@ -92,7 +92,7 @@ void NPairHalfBinNewtoffGhost::build(NeighList *list) // no molecular test when i = ghost atom if (i < nlocal) { - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { diff --git a/src/npair_half_bin_newton.cpp b/src/npair_half_bin_newton.cpp index f1fc203403..3a387870e3 100644 --- a/src/npair_half_bin_newton.cpp +++ b/src/npair_half_bin_newton.cpp @@ -119,7 +119,7 @@ void NPairHalfBinNewton::build(NeighList *list) // loop over all atoms in other bins in stencil, store every pair - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { jtype = type[j]; diff --git a/src/npair_half_bin_newton_tri.cpp b/src/npair_half_bin_newton_tri.cpp index 3ef8c3260e..169e710e0e 100644 --- a/src/npair_half_bin_newton_tri.cpp +++ b/src/npair_half_bin_newton_tri.cpp @@ -84,7 +84,7 @@ void NPairHalfBinNewtonTri::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - ibin = coord2bin(x[i]); + 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; diff --git a/src/npair_half_multi_newtoff.cpp b/src/npair_half_multi_newtoff.cpp index 11e45d91ff..07b5c87a6c 100644 --- a/src/npair_half_multi_newtoff.cpp +++ b/src/npair_half_multi_newtoff.cpp @@ -87,7 +87,7 @@ void NPairHalfMultiNewtoff::build(NeighList *list) // stores own/own pairs only once // stores own/ghost pairs on both procs - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; s = stencil_multi[itype]; distsq = distsq_multi[itype]; cutsq = cutneighsq[itype]; diff --git a/src/npair_half_multi_newton.cpp b/src/npair_half_multi_newton.cpp index cd3a37821f..3d90979329 100644 --- a/src/npair_half_multi_newton.cpp +++ b/src/npair_half_multi_newton.cpp @@ -121,7 +121,7 @@ void NPairHalfMultiNewton::build(NeighList *list) // loop over all atoms in other bins in stencil, store every pair // skip if i,j neighbor cutoff is less than bin distance - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; s = stencil_multi[itype]; distsq = distsq_multi[itype]; cutsq = cutneighsq[itype]; diff --git a/src/npair_half_multi_newton_tri.cpp b/src/npair_half_multi_newton_tri.cpp index f9aaeb0414..909c69246b 100644 --- a/src/npair_half_multi_newton_tri.cpp +++ b/src/npair_half_multi_newton_tri.cpp @@ -88,7 +88,7 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; s = stencil_multi[itype]; distsq = distsq_multi[itype]; cutsq = cutneighsq[itype]; diff --git a/src/npair_half_respa_bin_newtoff.cpp b/src/npair_half_respa_bin_newtoff.cpp index 39f68a289d..11246b4af8 100644 --- a/src/npair_half_respa_bin_newtoff.cpp +++ b/src/npair_half_respa_bin_newtoff.cpp @@ -101,7 +101,7 @@ void NPairHalfRespaBinNewtoff::build(NeighList *list) xtmp = x[i][0]; ytmp = x[i][1]; ztmp = x[i][2]; - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; if (moltemplate) { imol = molindex[i]; iatom = molatom[i]; diff --git a/src/npair_half_respa_bin_newton.cpp b/src/npair_half_respa_bin_newton.cpp index 537a72d0c1..db76678036 100644 --- a/src/npair_half_respa_bin_newton.cpp +++ b/src/npair_half_respa_bin_newton.cpp @@ -160,7 +160,7 @@ void NPairHalfRespaBinNewton::build(NeighList *list) // loop over all atoms in other bins in stencil, store every pair - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { jtype = type[j]; diff --git a/src/npair_half_respa_bin_newton_tri.cpp b/src/npair_half_respa_bin_newton_tri.cpp index 9c5fd39fbe..38621224c4 100644 --- a/src/npair_half_respa_bin_newton_tri.cpp +++ b/src/npair_half_respa_bin_newton_tri.cpp @@ -113,7 +113,7 @@ void NPairHalfRespaBinNewtonTri::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - ibin = coord2bin(x[i]); + 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; diff --git a/src/npair_half_size_bin_newtoff.cpp b/src/npair_half_size_bin_newtoff.cpp index e98923cd11..571b2484ea 100644 --- a/src/npair_half_size_bin_newtoff.cpp +++ b/src/npair_half_size_bin_newtoff.cpp @@ -105,7 +105,7 @@ void NPairHalfSizeBinNewtoff::build(NeighList *list) ytmp = x[i][1]; ztmp = x[i][2]; radi = radius[i]; - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; // loop over all atoms in surrounding bins in stencil including self // only store pair if i < j diff --git a/src/npair_half_size_bin_newton.cpp b/src/npair_half_size_bin_newton.cpp index 2cd0943ac2..a8be3ce691 100644 --- a/src/npair_half_size_bin_newton.cpp +++ b/src/npair_half_size_bin_newton.cpp @@ -156,7 +156,7 @@ void NPairHalfSizeBinNewton::build(NeighList *list) // loop over all atoms in other bins in stencil, store every pair - ibin = coord2bin(x[i]); + ibin = atom2bin[i]; for (k = 0; k < nstencil; k++) { for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { if (exclude && exclusion(i,j,type[i],type[j],mask,molecule)) continue; diff --git a/src/npair_half_size_bin_newton_tri.cpp b/src/npair_half_size_bin_newton_tri.cpp index 054487d31f..1107f73026 100644 --- a/src/npair_half_size_bin_newton_tri.cpp +++ b/src/npair_half_size_bin_newton_tri.cpp @@ -112,7 +112,7 @@ void NPairHalfSizeBinNewtonTri::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - ibin = coord2bin(x[i]); + 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; From 597f95fb1b29a6e73e8e36533abdecc26ab51280 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 May 2017 17:53:12 -0400 Subject: [PATCH 029/302] fix duplicate reference --- doc/src/pair_meam_spline.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/pair_meam_spline.txt b/doc/src/pair_meam_spline.txt index e4d86521c9..2295a6640b 100644 --- a/doc/src/pair_meam_spline.txt +++ b/doc/src/pair_meam_spline.txt @@ -33,7 +33,7 @@ atoms J, I, and K centered on atom I. The five functions Phi, U, rho, f, and g are represented by cubic splines. The {meam/spline} style also supports a new style multicomponent -modified embedded-atom method (MEAM) potential "(Zhang)"_#Zhang1, where +modified embedded-atom method (MEAM) potential "(Zhang)"_#Zhang4, where the total energy E is given by :c,image(Eqs/pair_meam_spline_multicomponent.jpg) @@ -164,5 +164,5 @@ for more info. Kress, Modelling Simulation Materials Science Engineering, 8, 825 (2000). -:link(Zhang1) +:link(Zhang4) [(Zhang)] Zhang and Trinkle, Computational Materials Science, 124, 204-210 (2016). From d2810f9f837217b667506921deebbde395f24bf8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 May 2017 18:15:13 -0400 Subject: [PATCH 030/302] port thread-safe temperature biasing from LAMMPS-ICMS --- src/ASPHERE/compute_temp_asphere.cpp | 19 ++++++++++++++++ src/ASPHERE/compute_temp_asphere.h | 2 ++ src/USER-MISC/compute_temp_rotate.cpp | 23 +++++++++++++++++++ src/USER-MISC/compute_temp_rotate.h | 3 +++ src/USER-OMP/fix_nh_asphere_omp.cpp | 5 +++-- src/USER-OMP/fix_nh_omp.cpp | 10 +++++---- src/USER-OMP/fix_nh_sphere_omp.cpp | 5 +++-- src/USER-OMP/fix_nvt_sllod_omp.cpp | 6 ++--- src/compute.h | 2 ++ src/compute_temp_com.cpp | 23 +++++++++++++++++++ src/compute_temp_com.h | 2 ++ src/compute_temp_deform.cpp | 32 +++++++++++++++++++++++++++ src/compute_temp_deform.h | 2 ++ src/compute_temp_partial.cpp | 32 +++++++++++++++++++++++++++ src/compute_temp_partial.h | 2 ++ src/compute_temp_profile.cpp | 19 ++++++++++++++++ src/compute_temp_profile.h | 2 ++ src/compute_temp_ramp.cpp | 23 +++++++++++++++++++ src/compute_temp_ramp.h | 2 ++ src/compute_temp_region.cpp | 29 ++++++++++++++++++++++++ src/compute_temp_region.h | 3 +++ src/compute_temp_sphere.cpp | 19 ++++++++++++++++ src/compute_temp_sphere.h | 3 ++- 23 files changed, 256 insertions(+), 12 deletions(-) diff --git a/src/ASPHERE/compute_temp_asphere.cpp b/src/ASPHERE/compute_temp_asphere.cpp index e8d3fcb527..b6d37db6ce 100644 --- a/src/ASPHERE/compute_temp_asphere.cpp +++ b/src/ASPHERE/compute_temp_asphere.cpp @@ -396,6 +396,15 @@ void ComputeTempAsphere::remove_bias(int i, double *v) if (tbias) tbias->remove_bias(i,v); } +/* ---------------------------------------------------------------------- + remove velocity bias from atom I to leave thermal velocity +------------------------------------------------------------------------- */ + +void ComputeTempAsphere::remove_bias_thr(int i, double *v, double *b) +{ + if (tbias) tbias->remove_bias_thr(i,v,b); +} + /* ---------------------------------------------------------------------- add back in velocity bias to atom I removed by remove_bias() assume remove_bias() was previously called @@ -405,3 +414,13 @@ void ComputeTempAsphere::restore_bias(int i, double *v) { if (tbias) tbias->restore_bias(i,v); } + +/* ---------------------------------------------------------------------- + add back in velocity bias to atom I removed by remove_bias_thr() + assume remove_bias_thr() was previously called with the same buffer b +------------------------------------------------------------------------- */ + +void ComputeTempAsphere::restore_bias_thr(int i, double *v, double *b) +{ + if (tbias) tbias->restore_bias_thr(i,v,b); +} diff --git a/src/ASPHERE/compute_temp_asphere.h b/src/ASPHERE/compute_temp_asphere.h index d1cce38025..5ecbf8057a 100644 --- a/src/ASPHERE/compute_temp_asphere.h +++ b/src/ASPHERE/compute_temp_asphere.h @@ -35,6 +35,8 @@ class ComputeTempAsphere : public Compute { void remove_bias(int, double *); void restore_bias(int, double *); + void remove_bias_thr(int, double *, double *); + void restore_bias_thr(int, double *, double *); private: int mode; diff --git a/src/USER-MISC/compute_temp_rotate.cpp b/src/USER-MISC/compute_temp_rotate.cpp index 2210555a7c..b948738e00 100644 --- a/src/USER-MISC/compute_temp_rotate.cpp +++ b/src/USER-MISC/compute_temp_rotate.cpp @@ -221,6 +221,17 @@ void ComputeTempRotate::remove_bias(int i, double *v) v[2] -= vbiasall[i][2]; } +/* ---------------------------------------------------------------------- + remove velocity bias from atom I to leave thermal velocity +------------------------------------------------------------------------- */ + +void ComputeTempRotate::remove_bias_thr(int i, double *v, double *) +{ + v[0] -= vbiasall[i][0]; + v[1] -= vbiasall[i][1]; + v[2] -= vbiasall[i][2]; +} + /* ---------------------------------------------------------------------- remove velocity bias from all atoms to leave thermal velocity ------------------------------------------------------------------------- */ @@ -251,6 +262,18 @@ void ComputeTempRotate::restore_bias(int i, double *v) v[2] += vbiasall[i][2]; } +/* ---------------------------------------------------------------------- + add back in velocity bias to atom I removed by remove_bias_thr() + assume remove_bias_thr() was previously called +------------------------------------------------------------------------- */ + +void ComputeTempRotate::restore_bias_thr(int i, double *v, double *) +{ + v[0] += vbiasall[i][0]; + v[1] += vbiasall[i][1]; + v[2] += vbiasall[i][2]; +} + /* ---------------------------------------------------------------------- add back in velocity bias to all atoms removed by remove_bias_all() assume remove_bias_all() was previously called diff --git a/src/USER-MISC/compute_temp_rotate.h b/src/USER-MISC/compute_temp_rotate.h index 69643b68a5..9590366b15 100644 --- a/src/USER-MISC/compute_temp_rotate.h +++ b/src/USER-MISC/compute_temp_rotate.h @@ -34,9 +34,12 @@ class ComputeTempRotate : public Compute { void compute_vector(); void remove_bias(int, double *); + void remove_bias_thr(int, double *, double *); void remove_bias_all(); void restore_bias(int, double *); void restore_bias_all(); + void restore_bias_thr(int, double *, double *); + double memory_usage(); private: diff --git a/src/USER-OMP/fix_nh_asphere_omp.cpp b/src/USER-OMP/fix_nh_asphere_omp.cpp index f11b1f5e94..e710e6f12e 100644 --- a/src/USER-OMP/fix_nh_asphere_omp.cpp +++ b/src/USER-OMP/fix_nh_asphere_omp.cpp @@ -183,12 +183,13 @@ void FixNHAsphereOMP::nh_v_temp() #pragma omp parallel for default(none) private(i) schedule(static) #endif for (i = 0; i < nlocal; i++) { + double buf[3]; if (mask[i] & groupbit) { - temperature->remove_bias(i,&v[i].x); + temperature->remove_bias_thr(i,&v[i].x,buf); v[i].x *= factor_eta; v[i].y *= factor_eta; v[i].z *= factor_eta; - temperature->restore_bias(i,&v[i].x); + temperature->restore_bias_thr(i,&v[i].x,buf); angmom[i].x *= factor_eta; angmom[i].y *= factor_eta; angmom[i].z *= factor_eta; diff --git a/src/USER-OMP/fix_nh_omp.cpp b/src/USER-OMP/fix_nh_omp.cpp index e77f18304d..ccb6090378 100644 --- a/src/USER-OMP/fix_nh_omp.cpp +++ b/src/USER-OMP/fix_nh_omp.cpp @@ -261,8 +261,9 @@ void FixNHOMP::nh_v_press() #pragma omp parallel for default(none) private(i) schedule(static) #endif for (i = 0; i < nlocal; i++) { + double buf[3]; if (mask[i] & groupbit) { - temperature->remove_bias(i,&v[i].x); + temperature->remove_bias_thr(i,&v[i].x,buf); v[i].x *= factor0; v[i].y *= factor1; v[i].z *= factor2; @@ -273,7 +274,7 @@ void FixNHOMP::nh_v_press() v[i].x *= factor0; v[i].y *= factor1; v[i].z *= factor2; - temperature->restore_bias(i,&v[i].x); + temperature->restore_bias_thr(i,&v[i].x,buf); } } } @@ -373,12 +374,13 @@ void FixNHOMP::nh_v_temp() #pragma omp parallel for default(none) private(i) schedule(static) #endif for (i = 0; i < nlocal; i++) { + double buf[3]; if (mask[i] & groupbit) { - temperature->remove_bias(i,&v[i].x); + temperature->remove_bias_thr(i,&v[i].x,buf); v[i].x *= factor_eta; v[i].y *= factor_eta; v[i].z *= factor_eta; - temperature->restore_bias(i,&v[i].x); + temperature->restore_bias_thr(i,&v[i].x,buf); } } } diff --git a/src/USER-OMP/fix_nh_sphere_omp.cpp b/src/USER-OMP/fix_nh_sphere_omp.cpp index cd06c581ca..dd0530dcfa 100644 --- a/src/USER-OMP/fix_nh_sphere_omp.cpp +++ b/src/USER-OMP/fix_nh_sphere_omp.cpp @@ -137,12 +137,13 @@ void FixNHSphereOMP::nh_v_temp() #pragma omp parallel for default(none) private(i) schedule(static) #endif for (i = 0; i < nlocal; i++) { + double buf[3]; if (mask[i] & groupbit) { - temperature->remove_bias(i,&v[i].x); + temperature->remove_bias_thr(i,&v[i].x,buf); v[i].x *= factor_eta; v[i].y *= factor_eta; v[i].z *= factor_eta; - temperature->restore_bias(i,&v[i].x); + temperature->restore_bias_thr(i,&v[i].x,buf); omega[i].x *= factor_eta; omega[i].y *= factor_eta; omega[i].z *= factor_eta; diff --git a/src/USER-OMP/fix_nvt_sllod_omp.cpp b/src/USER-OMP/fix_nvt_sllod_omp.cpp index f233dc459b..a829d49c0f 100644 --- a/src/USER-OMP/fix_nvt_sllod_omp.cpp +++ b/src/USER-OMP/fix_nvt_sllod_omp.cpp @@ -121,16 +121,16 @@ void FixNVTSllodOMP::nh_v_temp() #pragma omp parallel for default(none) private(i) shared(h_two) schedule(static) #endif for (i = 0; i < nlocal; i++) { - double vdelu0,vdelu1,vdelu2; + double vdelu0,vdelu1,vdelu2,buf[3]; if (mask[i] & groupbit) { vdelu0 = h_two[0]*v[i].x + h_two[5]*v[i].y + h_two[4]*v[i].z; vdelu1 = h_two[1]*v[i].y + h_two[3]*v[i].z; vdelu2 = h_two[2]*v[i].z; - temperature->remove_bias(i,&v[i].x); + temperature->remove_bias_thr(i,&v[i].x,buf); v[i].x = v[i].x*factor_eta - dthalf*vdelu0; v[i].y = v[i].y*factor_eta - dthalf*vdelu1; v[i].z = v[i].z*factor_eta - dthalf*vdelu2; - temperature->restore_bias(i,&v[i].x); + temperature->restore_bias_thr(i,&v[i].x,buf); } } } diff --git a/src/compute.h b/src/compute.h index 18da971f82..7f12cd97e2 100644 --- a/src/compute.h +++ b/src/compute.h @@ -114,9 +114,11 @@ class Compute : protected Pointers { virtual void dof_remove_pre() {} virtual int dof_remove(int) {return 0;} virtual void remove_bias(int, double *) {} + virtual void remove_bias_thr(int, double *, double *) {} virtual void remove_bias_all() {} virtual void reapply_bias_all() {} virtual void restore_bias(int, double *) {} + virtual void restore_bias_thr(int, double *, double *) {} virtual void restore_bias_all() {} virtual void reset_extra_compute_fix(const char *); diff --git a/src/compute_temp_com.cpp b/src/compute_temp_com.cpp index 7e05dcb776..6d64ff5aee 100644 --- a/src/compute_temp_com.cpp +++ b/src/compute_temp_com.cpp @@ -170,6 +170,17 @@ void ComputeTempCOM::remove_bias(int i, double *v) v[2] -= vbias[2]; } +/* ---------------------------------------------------------------------- + remove velocity bias from atom I to leave thermal velocity +------------------------------------------------------------------------- */ + +void ComputeTempCOM::remove_bias_thr(int, double *v, double *) +{ + v[0] -= vbias[0]; + v[1] -= vbias[1]; + v[2] -= vbias[2]; +} + /* ---------------------------------------------------------------------- remove velocity bias from all atoms to leave thermal velocity ------------------------------------------------------------------------- */ @@ -200,6 +211,18 @@ void ComputeTempCOM::restore_bias(int i, double *v) v[2] += vbias[2]; } +/* ---------------------------------------------------------------------- + add back in velocity bias to atom I removed by remove_bias_thr() + assume remove_bias_thr() was previously called +------------------------------------------------------------------------- */ + +void ComputeTempCOM::restore_bias_thr(int, double *v, double *) +{ + v[0] += vbias[0]; + v[1] += vbias[1]; + v[2] += vbias[2]; +} + /* ---------------------------------------------------------------------- add back in velocity bias to all atoms removed by remove_bias_all() assume remove_bias_all() was previously called diff --git a/src/compute_temp_com.h b/src/compute_temp_com.h index 47587ceccc..67bbdc39a9 100644 --- a/src/compute_temp_com.h +++ b/src/compute_temp_com.h @@ -34,9 +34,11 @@ class ComputeTempCOM : public Compute { void compute_vector(); void remove_bias(int, double *); + void remove_bias_thr(int, double *, double *); void remove_bias_all(); void restore_bias(int, double *); void restore_bias_all(); + void restore_bias_thr(int, double *, double *); private: double tfactor,masstotal; diff --git a/src/compute_temp_deform.cpp b/src/compute_temp_deform.cpp index 5af995252c..c8b8200770 100644 --- a/src/compute_temp_deform.cpp +++ b/src/compute_temp_deform.cpp @@ -221,6 +221,26 @@ void ComputeTempDeform::remove_bias(int i, double *v) v[2] -= vbias[2]; } +/* ---------------------------------------------------------------------- + remove velocity bias from atom I to leave thermal velocity +------------------------------------------------------------------------- */ + +void ComputeTempDeform::remove_bias_thr(int i, double *v, double *b) +{ + double lamda[3]; + double *h_rate = domain->h_rate; + double *h_ratelo = domain->h_ratelo; + + domain->x2lamda(atom->x[i],lamda); + b[0] = h_rate[0]*lamda[0] + h_rate[5]*lamda[1] + + h_rate[4]*lamda[2] + h_ratelo[0]; + b[1] = h_rate[1]*lamda[1] + h_rate[3]*lamda[2] + h_ratelo[1]; + b[2] = h_rate[2]*lamda[2] + h_ratelo[2]; + v[0] -= b[0]; + v[1] -= b[1]; + v[2] -= b[2]; +} + /* ---------------------------------------------------------------------- remove velocity bias from all atoms to leave thermal velocity ------------------------------------------------------------------------- */ @@ -266,6 +286,18 @@ void ComputeTempDeform::restore_bias(int i, double *v) v[2] += vbias[2]; } +/* ---------------------------------------------------------------------- + add back in velocity bias to atom I removed by remove_bias_thr() + assume remove_bias_thr() was previously called with the same buffer b +------------------------------------------------------------------------- */ + +void ComputeTempDeform::restore_bias_thr(int i, double *v, double *b) +{ + v[0] += b[0]; + v[1] += b[1]; + v[2] += b[2]; +} + /* ---------------------------------------------------------------------- add back in velocity bias to all atoms removed by remove_bias_all() assume remove_bias_all() was previously called diff --git a/src/compute_temp_deform.h b/src/compute_temp_deform.h index 33ca83c73d..030294e1c8 100644 --- a/src/compute_temp_deform.h +++ b/src/compute_temp_deform.h @@ -34,8 +34,10 @@ class ComputeTempDeform : public Compute { virtual void compute_vector(); void remove_bias(int, double *); + void remove_bias_thr(int, double *, double *); void remove_bias_all(); void restore_bias(int, double *); + void restore_bias_thr(int, double *, double *); void restore_bias_all(); double memory_usage(); diff --git a/src/compute_temp_partial.cpp b/src/compute_temp_partial.cpp index 7678403d88..9df8e8b580 100644 --- a/src/compute_temp_partial.cpp +++ b/src/compute_temp_partial.cpp @@ -185,6 +185,26 @@ void ComputeTempPartial::remove_bias(int i, double *v) } } +/* ---------------------------------------------------------------------- + remove velocity bias from atom I to leave thermal velocity +------------------------------------------------------------------------- */ + +void ComputeTempPartial::remove_bias_thr(int i, double *v, double *b) +{ + if (!xflag) { + b[0] = v[0]; + v[0] = 0.0; + } + if (!yflag) { + b[1] = v[1]; + v[1] = 0.0; + } + if (!zflag) { + b[2] = v[2]; + v[2] = 0.0; + } +} + /* ---------------------------------------------------------------------- remove velocity bias from all atoms to leave thermal velocity ------------------------------------------------------------------------- */ @@ -262,6 +282,18 @@ void ComputeTempPartial::restore_bias(int i, double *v) if (!zflag) v[2] += vbias[2]; } +/* ---------------------------------------------------------------------- + add back in velocity bias to atom I removed by remove_bias_thr() + assume remove_bias_thr() was previously called with the same buffer b +------------------------------------------------------------------------- */ + +void ComputeTempPartial::restore_bias_thr(int i, double *v, double *b) +{ + if (!xflag) v[0] += b[0]; + if (!yflag) v[1] += b[1]; + if (!zflag) v[2] += b[2]; +} + /* ---------------------------------------------------------------------- add back in velocity bias to all atoms removed by remove_bias_all() assume remove_bias_all() was previously called diff --git a/src/compute_temp_partial.h b/src/compute_temp_partial.h index 8a5c260db1..62641d4799 100644 --- a/src/compute_temp_partial.h +++ b/src/compute_temp_partial.h @@ -35,9 +35,11 @@ class ComputeTempPartial : public Compute { int dof_remove(int); void remove_bias(int, double *); + void remove_bias_thr(int, double *, double *); void remove_bias_all(); void reapply_bias_all(); void restore_bias(int, double *); + void restore_bias_thr(int, double *, double *); void restore_bias_all(); double memory_usage(); diff --git a/src/compute_temp_profile.cpp b/src/compute_temp_profile.cpp index 1c6e56359d..236f5bc096 100644 --- a/src/compute_temp_profile.cpp +++ b/src/compute_temp_profile.cpp @@ -359,6 +359,15 @@ void ComputeTempProfile::remove_bias(int i, double *v) if (zflag) v[2] -= binave[ibin][ivz]; } +/* ---------------------------------------------------------------------- + remove velocity bias from atom I to leave thermal velocity +------------------------------------------------------------------------- */ + +void ComputeTempProfile::remove_bias_thr(int i, double *v, double *) +{ + remove_bias(i,v); +} + /* ---------------------------------------------------------------------- remove velocity bias from all atoms to leave thermal velocity ------------------------------------------------------------------------- */ @@ -392,6 +401,16 @@ void ComputeTempProfile::restore_bias(int i, double *v) if (zflag) v[2] += binave[ibin][ivz]; } +/* ---------------------------------------------------------------------- + add back in velocity bias to atom I removed by remove_bias_thr() + assume remove_bias_thr() was previously called +------------------------------------------------------------------------- */ + +void ComputeTempProfile::restore_bias_thr(int i, double *v, double *) +{ + restore_bias(i,v); +} + /* ---------------------------------------------------------------------- add back in velocity bias to all atoms removed by remove_bias_all() assume remove_bias_all() was previously called diff --git a/src/compute_temp_profile.h b/src/compute_temp_profile.h index d78e5396d6..f0c07bbd48 100644 --- a/src/compute_temp_profile.h +++ b/src/compute_temp_profile.h @@ -35,8 +35,10 @@ class ComputeTempProfile : public Compute { void compute_array(); void remove_bias(int, double *); + void remove_bias_thr(int, double *, double *); void remove_bias_all(); void restore_bias(int, double *); + void restore_bias_thr(int, double *, double *); void restore_bias_all(); double memory_usage(); diff --git a/src/compute_temp_ramp.cpp b/src/compute_temp_ramp.cpp index 810d6dd08b..af6a730c9d 100644 --- a/src/compute_temp_ramp.cpp +++ b/src/compute_temp_ramp.cpp @@ -234,6 +234,19 @@ void ComputeTempRamp::remove_bias(int i, double *v) v[v_dim] -= vbias[v_dim]; } +/* ---------------------------------------------------------------------- + remove velocity bias from atom I to leave thermal velocity +------------------------------------------------------------------------- */ + +void ComputeTempRamp::remove_bias_thr(int i, double *v, double *b) +{ + double fraction = (atom->x[i][coord_dim] - coord_lo) / (coord_hi - coord_lo); + fraction = MAX(fraction,0.0); + fraction = MIN(fraction,1.0); + b[v_dim] = v_lo + fraction*(v_hi - v_lo); + v[v_dim] -= b[v_dim]; +} + /* ---------------------------------------------------------------------- remove velocity bias from all atoms to leave thermal velocity ------------------------------------------------------------------------- */ @@ -271,6 +284,16 @@ void ComputeTempRamp::restore_bias(int i, double *v) v[v_dim] += vbias[v_dim]; } +/* ---------------------------------------------------------------------- + add back in velocity bias to atom I removed by remove_bias_thr() + assume remove_bias_thr() was previously called with the same buffer b +------------------------------------------------------------------------- */ + +void ComputeTempRamp::restore_bias_thr(int i, double *v, double *b) +{ + v[v_dim] += b[v_dim]; +} + /* ---------------------------------------------------------------------- add back in velocity bias to all atoms removed by remove_bias_all() assume remove_bias_all() was previously called diff --git a/src/compute_temp_ramp.h b/src/compute_temp_ramp.h index 0e10e519cb..ab888ec31d 100644 --- a/src/compute_temp_ramp.h +++ b/src/compute_temp_ramp.h @@ -35,7 +35,9 @@ class ComputeTempRamp : public Compute { void remove_bias(int, double *); void remove_bias_all(); + void remove_bias_thr(int, double *, double *); void restore_bias(int, double *); + void restore_bias_thr(int, double *, double *); void restore_bias_all(); double memory_usage(); diff --git a/src/compute_temp_region.cpp b/src/compute_temp_region.cpp index e636669344..ed710bc730 100644 --- a/src/compute_temp_region.cpp +++ b/src/compute_temp_region.cpp @@ -199,6 +199,23 @@ void ComputeTempRegion::remove_bias(int i, double *v) } } +/* ---------------------------------------------------------------------- + remove velocity bias from atom I to leave thermal velocity +------------------------------------------------------------------------- */ + +void ComputeTempRegion::remove_bias_thr(int i, double *v, double *b) +{ + double *x = atom->x[i]; + if (domain->regions[iregion]->match(x[0],x[1],x[2])) + b[0] = b[1] = b[2] = 0.0; + else { + b[0] = v[0]; + b[1] = v[1]; + b[2] = v[2]; + v[0] = v[1] = v[2] = 0.0; + } +} + /* ---------------------------------------------------------------------- remove velocity bias from all atoms to leave thermal velocity ------------------------------------------------------------------------- */ @@ -243,6 +260,18 @@ void ComputeTempRegion::restore_bias(int i, double *v) v[2] += vbias[2]; } +/* ---------------------------------------------------------------------- + add back in velocity bias to atom I removed by remove_bias_thr() + assume remove_bias_thr() was previously called with the same buffer b +------------------------------------------------------------------------- */ + +void ComputeTempRegion::restore_bias_thr(int i, double *v, double *b) +{ + v[0] += b[0]; + v[1] += b[1]; + v[2] += b[2]; +} + /* ---------------------------------------------------------------------- add back in velocity bias to all atoms removed by remove_bias_all() assume remove_bias_all() was previously called diff --git a/src/compute_temp_region.h b/src/compute_temp_region.h index 95194d7fdf..fd494ab8d1 100644 --- a/src/compute_temp_region.h +++ b/src/compute_temp_region.h @@ -35,10 +35,13 @@ class ComputeTempRegion : public Compute { void dof_remove_pre(); int dof_remove(int); + void remove_bias(int, double *); + void remove_bias_thr(int, double *, double *); void remove_bias_all(); void restore_bias(int, double *); void restore_bias_all(); + void restore_bias_thr(int, double *, double *); double memory_usage(); protected: diff --git a/src/compute_temp_sphere.cpp b/src/compute_temp_sphere.cpp index febb9339b4..ad5cf565e9 100644 --- a/src/compute_temp_sphere.cpp +++ b/src/compute_temp_sphere.cpp @@ -331,6 +331,15 @@ void ComputeTempSphere::remove_bias(int i, double *v) tbias->remove_bias(i,v); } +/* ---------------------------------------------------------------------- + remove velocity bias from atom I to leave thermal velocity +------------------------------------------------------------------------- */ + +void ComputeTempSphere::remove_bias_thr(int i, double *v, double *b) +{ + tbias->remove_bias_thr(i,v,b); +} + /* ---------------------------------------------------------------------- add back in velocity bias to atom I removed by remove_bias() assume remove_bias() was previously called @@ -340,3 +349,13 @@ void ComputeTempSphere::restore_bias(int i, double *v) { tbias->restore_bias(i,v); } + +/* ---------------------------------------------------------------------- + add back in velocity bias to atom I removed by remove_bias_thr() + assume remove_bias_thr() was previously called with the same buffer b +------------------------------------------------------------------------- */ + +void ComputeTempSphere::restore_bias_thr(int i, double *v, double *b) +{ + tbias->restore_bias_thr(i,v,b); +} diff --git a/src/compute_temp_sphere.h b/src/compute_temp_sphere.h index ae72fe2684..c15e02ffbb 100644 --- a/src/compute_temp_sphere.h +++ b/src/compute_temp_sphere.h @@ -34,12 +34,13 @@ class ComputeTempSphere : public Compute { void compute_vector(); void remove_bias(int, double *); + void remove_bias_thr(int, double *, double *); void restore_bias(int, double *); + void restore_bias_thr(int, double *, double *); private: int mode; double tfactor; - double *inertia; char *id_bias; Compute *tbias; // ptr to additional bias compute From 8936b99e9f894f1346c335026954593c5c3073d0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 16 May 2017 18:15:53 -0400 Subject: [PATCH 031/302] add contributed SiC.edip potential file --- potentials/SiC.edip | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 potentials/SiC.edip diff --git a/potentials/SiC.edip b/potentials/SiC.edip new file mode 100644 index 0000000000..0485d345bb --- /dev/null +++ b/potentials/SiC.edip @@ -0,0 +1,38 @@ +# DATE: 2017-05-16 CONTRIBUTOR: Laurent Pizzagalli CITATION: G. Lucas, M. Bertolus, and L. Pizzagalli, J. Phys. : Condens. Matter 22, 035802 (2010) +# element 1, element 2, element 3, +# A B cutoffA cutoffC alpha beta eta +# gamma lambda mu rho sigma Q0 +# u1 u2 u3 u4 +# +Si Si Si 5.488043 1.446435 2.941586 2.540193 3.066580 0.008593 0.589390 + 1.135256 2.417497 0.629131 1.343679 0.298443 208.924548 + -0.165799 32.557 0.286198 0.66 + +C C C 10.222599 0.959814 2.212263 1.741598 1.962090 0.025661 0.275605 + 1.084183 3.633621 0.594236 2.827634 0.536561 289.305617 + -0.165799 32.557 0.286198 0.66 + +C Si Si 7.535967 1.177019 2.534972 1.973974 2.507738 0.015347 0.432497 + 1.191567 3.025559 0.611684 2.061835 0.423863 249.115082 + -0.165799 32.557000 0.286198 0.660000 + +Si C C 7.535967 1.177019 2.534972 1.973974 2.507738 0.015347 0.432497 + 1.191567 3.025559 0.611684 2.061835 0.423863 249.115082 + -0.165799 32.557000 0.286198 0.660000 + +Si Si C 5.488043 1.446435 2.941586 2.540193 3.066580 0.008593 0.510944 + 1.135256 2.721528 0.620407 1.343679 0.298443 229.019815 + -0.165799 32.557000 0.286198 0.660000 + +Si C Si 7.535967 1.177019 2.534972 1.973974 2.507738 0.015347 0.510944 + 1.191567 2.721528 0.620407 2.061835 0.423863 229.019815 + -0.165799 32.557000 0.286198 0.660000 + +C C Si 10.222599 0.959814 2.212263 1.741598 1.962090 0.025661 0.354051 + 1.084183 3.329590 0.602960 2.827634 0.536561 269.210350 + -0.165799 32.557000 0.286198 0.660000 + +C Si C 7.535967 1.177019 2.534972 1.973974 2.507738 0.015347 0.354051 + 1.191567 3.329590 0.602960 2.061835 0.423863 269.210350 + -0.165799 32.557000 0.286198 0.660000 + From 7caf6cf459d35657c36dd79000c07a65757a9bfe Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Tue, 16 May 2017 23:29:48 -0400 Subject: [PATCH 032/302] Change how a Python pair style is loaded Implements a class loader which takes a fully qualified Python class name, loads the module and creates an object instance. To add flexibility, the current working directory and the directory specified by the LAMMPS_POTENTIALS environment variable are added to the module search path. --- examples/python/in.pair_python_hybrid | 6 +- examples/python/in.pair_python_melt | 6 +- .../{lj-melt-potential.py => potentials.py} | 3 - src/PYTHON/pair_python.cpp | 60 +++++++++++++++---- 4 files changed, 54 insertions(+), 21 deletions(-) rename examples/python/{lj-melt-potential.py => potentials.py} (96%) diff --git a/examples/python/in.pair_python_hybrid b/examples/python/in.pair_python_hybrid index 914b840e86..b917910a29 100644 --- a/examples/python/in.pair_python_hybrid +++ b/examples/python/in.pair_python_hybrid @@ -12,7 +12,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * * python potentials.LAMMPSLJCutPotential lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin @@ -31,7 +31,7 @@ clear read_restart hybrid.restart pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * * python potentials.LAMMPSLJCutPotential lj NULL pair_coeff * 2 lj/cut 1.0 1.0 fix 1 all nve @@ -47,7 +47,7 @@ atom_style atomic read_data hybrid.data pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * * python potentials.LAMMPSLJCutPotential lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin diff --git a/examples/python/in.pair_python_melt b/examples/python/in.pair_python_melt index ae37aafa77..2367ea0026 100644 --- a/examples/python/in.pair_python_melt +++ b/examples/python/in.pair_python_melt @@ -12,7 +12,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style python 2.5 -pair_coeff * * lj-melt-potential.py lj +pair_coeff * * potentials.LAMMPSLJCutPotential lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no @@ -30,7 +30,7 @@ clear read_restart melt.restart pair_style python 2.5 -pair_coeff * * lj-melt-potential.py lj +pair_coeff * * potentials.LAMMPSLJCutPotential lj fix 1 all nve @@ -45,7 +45,7 @@ atom_style atomic read_data melt.data pair_style python 2.5 -pair_coeff * * lj-melt-potential.py lj +pair_coeff * * potentials.LAMMPSLJCutPotential lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no diff --git a/examples/python/lj-melt-potential.py b/examples/python/potentials.py similarity index 96% rename from examples/python/lj-melt-potential.py rename to examples/python/potentials.py index 3d7332faa8..2438a8ba46 100644 --- a/examples/python/lj-melt-potential.py +++ b/examples/python/potentials.py @@ -32,6 +32,3 @@ class LAMMPSLJCutPotential(object): lj3 = coeff[4] lj4 = coeff[5] return (r6inv * (lj3*r6inv - lj4)) - -lammps_pair_style = LAMMPSLJCutPotential() - diff --git a/src/PYTHON/pair_python.cpp b/src/PYTHON/pair_python.cpp index 485efee58d..60f317ee96 100644 --- a/src/PYTHON/pair_python.cpp +++ b/src/PYTHON/pair_python.cpp @@ -42,12 +42,26 @@ PairPython::PairPython(LAMMPS *lmp) : Pair(lmp) { reinitflag = 0; python->init(); + + py_potential = NULL; + + // add current directory to PYTHONPATH + PyObject * py_path = PySys_GetObject("path"); + PyList_Append(py_path, PY_STRING_FROM_STRING(".")); + + // if LAMMPS_POTENTIALS environment variable is set, add it to PYTHONPATH as well + const char * potentials_path = getenv("LAMMPS_POTENTIALS"); + if (potentials_path != NULL) { + PyList_Append(py_path, PY_STRING_FROM_STRING(potentials_path)); + } } /* ---------------------------------------------------------------------- */ PairPython::~PairPython() { + if(py_potential) Py_DECREF((PyObject*) py_potential); + if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); @@ -234,34 +248,56 @@ void PairPython::coeff(int narg, char **arg) error->all(FLERR,"Incorrect args for pair coefficients"); // check if python potential file exists and source it + char * full_cls_name = arg[2]; + char * lastpos = strrchr(full_cls_name, '.'); - FILE *fp = fopen(arg[2],"r"); - if (fp == NULL) - error->all(FLERR,"Cannot open python pair potential class file"); + if (lastpos == NULL) { + error->all(FLERR,"Python pair style requires fully qualified class name"); + } + + size_t module_name_length = strlen(full_cls_name) - strlen(lastpos); + size_t cls_name_length = strlen(lastpos)-1; + + char * module_name = new char[module_name_length+1]; + char * cls_name = new char[cls_name_length+1]; + strncpy(module_name, full_cls_name, module_name_length); + module_name[module_name_length] = 0; + + strcpy(cls_name, lastpos+1); PyGILState_STATE gstate = PyGILState_Ensure(); - int err = PyRun_SimpleFile(fp,arg[2]); - if (err) { + PyObject * pModule = PyImport_ImportModule(module_name); + if (!pModule) { + PyErr_Print(); + PyErr_Clear(); PyGILState_Release(gstate); - error->all(FLERR,"Loading python pair style class failure"); + error->all(FLERR,"Loading python pair style module failure"); } - fclose(fp); // create LAMMPS atom type to potential file type mapping in python class // by calling 'lammps_pair_style.map_coeff(name,type)' - PyObject *pModule = PyImport_AddModule("__main__"); - if (!pModule) error->all(FLERR,"Could not initialize embedded Python"); + PyObject *py_pair_type = PyObject_GetAttrString(pModule, cls_name); + if (!py_pair_type) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find pair style class in module'"); + } - PyObject *py_pair_instance = PyObject_GetAttrString(pModule,"lammps_pair_style"); + delete [] module_name; + delete [] cls_name; + + PyObject * py_pair_instance = PyObject_CallObject(py_pair_type, NULL); if (!py_pair_instance) { PyErr_Print(); PyErr_Clear(); PyGILState_Release(gstate); - error->all(FLERR,"Could not find 'lammps_pair_style instance'"); + error->all(FLERR,"Could not instantiate instance of pair style class'"); } - py_potential = (void *) py_pair_instance; // XXX do we need to increment reference counter? + + py_potential = (void *) py_pair_instance; PyObject *py_map_coeff = PyObject_GetAttrString(py_pair_instance,"map_coeff"); if (!py_map_coeff) { From 96f0a82aa5ad030da3d432ab106ffd9416077ed1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 17 May 2017 07:48:15 -0400 Subject: [PATCH 033/302] simplify class names in pair style python examples. add SPC/E water example --- examples/python/in.pair_python_hybrid | 2 +- examples/python/in.pair_python_melt | 2 +- examples/python/in.pair_python_spce | 28 ++++++++++++++++++ examples/python/potentials.py | 41 ++++++++++++++++++++++++++- 4 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 examples/python/in.pair_python_spce diff --git a/examples/python/in.pair_python_hybrid b/examples/python/in.pair_python_hybrid index b917910a29..dcd1f1e35c 100644 --- a/examples/python/in.pair_python_hybrid +++ b/examples/python/in.pair_python_hybrid @@ -12,7 +12,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python potentials.LAMMPSLJCutPotential lj NULL +pair_coeff * * python potentials.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin diff --git a/examples/python/in.pair_python_melt b/examples/python/in.pair_python_melt index 2367ea0026..2349f080d4 100644 --- a/examples/python/in.pair_python_melt +++ b/examples/python/in.pair_python_melt @@ -12,7 +12,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style python 2.5 -pair_coeff * * potentials.LAMMPSLJCutPotential lj +pair_coeff * * potentials.LJCutMelt lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no diff --git a/examples/python/in.pair_python_spce b/examples/python/in.pair_python_spce new file mode 100644 index 0000000000..d3765ebc33 --- /dev/null +++ b/examples/python/in.pair_python_spce @@ -0,0 +1,28 @@ +units real +atom_style full + +read_data data.spce + +pair_style hybrid/overlay python 12.0 coul/long 12.0 +kspace_style pppm 1.0e-6 + +pair_coeff * * coul/long +pair_coeff * * python potentials.LJCutSPCE OW NULL + +bond_style harmonic +angle_style harmonic +dihedral_style none +improper_style none + +bond_coeff 1 1000.00 1.000 +angle_coeff 1 100.0 109.47 + +special_bonds lj/coul 0.0 0.0 1.0 + +neighbor 2.0 bin + +fix 1 all shake 0.0001 20 0 b 1 a 1 +fix 2 all nvt temp 300.0 300.0 100.0 + +thermo 10 +run 100 diff --git a/examples/python/potentials.py b/examples/python/potentials.py index 2438a8ba46..dbce8cd445 100644 --- a/examples/python/potentials.py +++ b/examples/python/potentials.py @@ -1,6 +1,6 @@ from __future__ import print_function -class LAMMPSLJCutPotential(object): +class LJCutMelt(object): def __init__(self): self.pmap=dict() @@ -32,3 +32,42 @@ class LAMMPSLJCutPotential(object): lj3 = coeff[4] lj4 = coeff[5] return (r6inv * (lj3*r6inv - lj4)) + +class LJCutSPCE(object): + + def __init__(self): + self.pmap=dict() + # SPCE oxygen in real units + eps=0.15535 + sig=3.166 + + # set coeffs: eps, sig, 48*eps*sig**12, 24*eps*sig**6, + # 4*eps*sig**12, 4*eps*sig**6 + self.coeff = {'OW' : {'OW' : (1.0,1.0, + 48.0*eps*sig**12,24.0*eps*sig**6, + 4.0*eps*sig**12, 4.0*eps*sig**6), + 'NULL': (0.0,1.0, 0.0, 0.0,0.0,0.0)}, + 'NULL': {'OW' : (0.0,1.0, 0.0, 0.0,0.0,0.0), + 'NULL': (0.0,1.0, 0.0, 0.0,0.0,0.0)}} + + def map_coeff(self,name,type): + if name in self.coeff: + self.pmap[type] = name + else: + raise Exception("cannot match atom type %s" % name) + + def compute_force(self,rsq,itype,jtype): + coeff = self.coeff[self.pmap[itype]][self.pmap[jtype]] + r2inv = 1.0/rsq + r6inv = r2inv*r2inv*r2inv + lj1 = coeff[2] + lj2 = coeff[3] + return (r6inv * (lj1*r6inv - lj2)) + + def compute_energy(self,rsq,itype,jtype): + coeff = self.coeff[self.pmap[itype]][self.pmap[jtype]] + r2inv = 1.0/rsq + r6inv = r2inv*r2inv*r2inv + lj3 = coeff[4] + lj4 = coeff[5] + return (r6inv * (lj3*r6inv - lj4)) From 13e16dc3f14a53f5071d90c2357d722e26fd4d97 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 17 May 2017 07:52:13 -0400 Subject: [PATCH 034/302] update log files for pair style python examples --- ....1 => log.4May17.pair_python_hybrid.g++.1} | 0 ....4 => log.4May17.pair_python_hybrid.g++.4} | 0 ...++.1 => log.4May17.pair_python_melt.g++.1} | 0 ...++.4 => log.4May17.pair_python_melt.g++.4} | 0 .../python/log.4May17.pair_python_spce.g++.1 | 123 ++++++++++++++++++ .../python/log.4May17.pair_python_spce.g++.4 | 123 ++++++++++++++++++ 6 files changed, 246 insertions(+) rename examples/python/{log.4May2017.pair_python_hybrid.g++.1 => log.4May17.pair_python_hybrid.g++.1} (100%) rename examples/python/{log.4May2017.pair_python_hybrid.g++.4 => log.4May17.pair_python_hybrid.g++.4} (100%) rename examples/python/{log.4May2017.pair_python_melt.g++.1 => log.4May17.pair_python_melt.g++.1} (100%) rename examples/python/{log.4May2017.pair_python_melt.g++.4 => log.4May17.pair_python_melt.g++.4} (100%) create mode 100644 examples/python/log.4May17.pair_python_spce.g++.1 create mode 100644 examples/python/log.4May17.pair_python_spce.g++.4 diff --git a/examples/python/log.4May2017.pair_python_hybrid.g++.1 b/examples/python/log.4May17.pair_python_hybrid.g++.1 similarity index 100% rename from examples/python/log.4May2017.pair_python_hybrid.g++.1 rename to examples/python/log.4May17.pair_python_hybrid.g++.1 diff --git a/examples/python/log.4May2017.pair_python_hybrid.g++.4 b/examples/python/log.4May17.pair_python_hybrid.g++.4 similarity index 100% rename from examples/python/log.4May2017.pair_python_hybrid.g++.4 rename to examples/python/log.4May17.pair_python_hybrid.g++.4 diff --git a/examples/python/log.4May2017.pair_python_melt.g++.1 b/examples/python/log.4May17.pair_python_melt.g++.1 similarity index 100% rename from examples/python/log.4May2017.pair_python_melt.g++.1 rename to examples/python/log.4May17.pair_python_melt.g++.1 diff --git a/examples/python/log.4May2017.pair_python_melt.g++.4 b/examples/python/log.4May17.pair_python_melt.g++.4 similarity index 100% rename from examples/python/log.4May2017.pair_python_melt.g++.4 rename to examples/python/log.4May17.pair_python_melt.g++.4 diff --git a/examples/python/log.4May17.pair_python_spce.g++.1 b/examples/python/log.4May17.pair_python_spce.g++.1 new file mode 100644 index 0000000000..4e429b9cdd --- /dev/null +++ b/examples/python/log.4May17.pair_python_spce.g++.1 @@ -0,0 +1,123 @@ +LAMMPS (4 May 2017) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +units real +atom_style full + +read_data data.spce + orthogonal box = (0.02645 0.02645 0.02641) to (35.5328 35.5328 35.4736) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 4500 atoms + scanning bonds ... + 2 = max bonds/atom + scanning angles ... + 1 = max angles/atom + reading bonds ... + 3000 bonds + reading angles ... + 1500 angles + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + +pair_style hybrid/overlay python 12.0 coul/long 12.0 +kspace_style pppm 1.0e-6 + +pair_coeff * * coul/long +pair_coeff * * python potentials.LJCutSPCE OW NULL + +bond_style harmonic +angle_style harmonic +dihedral_style none +improper_style none + +bond_coeff 1 1000.00 1.000 +angle_coeff 1 100.0 109.47 + +special_bonds lj/coul 0.0 0.0 1.0 + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 2 = max # of special neighbors + +neighbor 2.0 bin + +fix 1 all shake 0.0001 20 0 b 1 a 1 + 0 = # of size 2 clusters + 0 = # of size 3 clusters + 0 = # of size 4 clusters + 1500 = # of frozen angles +fix 2 all nvt temp 300.0 300.0 100.0 + +thermo 10 +run 100 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394674 + estimated relative force accuracy = 1.18855e-06 + using double precision FFTs + 3d grid and FFT values/proc = 103823 64000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair python, perpetual, skip from (2) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (2) pair coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 41.05 | 41.05 | 41.05 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -16692.369 0 -16692.369 -1289.222 + 10 120.56861 -17769.719 0 -16691.902 -4082.7098 + 20 136.08014 -17884.591 0 -16668.109 -5140.7824 + 30 136.97316 -17874.351 0 -16649.887 -5351.3571 + 40 153.37285 -18001.493 0 -16630.424 -5227.0601 + 50 167.70414 -18105.435 0 -16606.252 -4473.2089 + 60 163.08253 -18037.29 0 -16579.422 -3295.8963 + 70 169.60395 -18067.078 0 -16550.912 -2615.7026 + 80 182.94811 -18155.978 0 -16520.523 -2393.3156 + 90 191.29902 -18197.887 0 -16487.779 -2242.7104 + 100 194.70949 -18195.021 0 -16454.425 -1955.2916 +Loop time of 63.3145 on 1 procs for 100 steps with 4500 atoms + +Performance: 0.136 ns/day, 175.874 hours/ns, 1.579 timesteps/s +86.0% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 61.815 | 61.815 | 61.815 | 0.0 | 97.63 +Bond | 0.000132 | 0.000132 | 0.000132 | 0.0 | 0.00 +Kspace | 1.2226 | 1.2226 | 1.2226 | 0.0 | 1.93 +Neigh | 0.21684 | 0.21684 | 0.21684 | 0.0 | 0.34 +Comm | 0.015175 | 0.015175 | 0.015175 | 0.0 | 0.02 +Output | 0.000405 | 0.000405 | 0.000405 | 0.0 | 0.00 +Modify | 0.040088 | 0.040088 | 0.040088 | 0.0 | 0.06 +Other | | 0.003896 | | | 0.01 + +Nlocal: 4500 ave 4500 max 4500 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 21216 ave 21216 max 21216 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1.44594e+06 ave 1.44594e+06 max 1.44594e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1445935 +Ave neighs/atom = 321.319 +Ave special neighs/atom = 2 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:01:05 diff --git a/examples/python/log.4May17.pair_python_spce.g++.4 b/examples/python/log.4May17.pair_python_spce.g++.4 new file mode 100644 index 0000000000..15c11cd376 --- /dev/null +++ b/examples/python/log.4May17.pair_python_spce.g++.4 @@ -0,0 +1,123 @@ +LAMMPS (4 May 2017) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +units real +atom_style full + +read_data data.spce + orthogonal box = (0.02645 0.02645 0.02641) to (35.5328 35.5328 35.4736) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 4500 atoms + scanning bonds ... + 2 = max bonds/atom + scanning angles ... + 1 = max angles/atom + reading bonds ... + 3000 bonds + reading angles ... + 1500 angles + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + +pair_style hybrid/overlay python 12.0 coul/long 12.0 +kspace_style pppm 1.0e-6 + +pair_coeff * * coul/long +pair_coeff * * python potentials.LJCutSPCE OW NULL + +bond_style harmonic +angle_style harmonic +dihedral_style none +improper_style none + +bond_coeff 1 1000.00 1.000 +angle_coeff 1 100.0 109.47 + +special_bonds lj/coul 0.0 0.0 1.0 + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 2 = max # of special neighbors + +neighbor 2.0 bin + +fix 1 all shake 0.0001 20 0 b 1 a 1 + 0 = # of size 2 clusters + 0 = # of size 3 clusters + 0 = # of size 4 clusters + 1500 = # of frozen angles +fix 2 all nvt temp 300.0 300.0 100.0 + +thermo 10 +run 100 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394674 + estimated relative force accuracy = 1.18855e-06 + using double precision FFTs + 3d grid and FFT values/proc = 34263 16000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair python, perpetual, skip from (2) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (2) pair coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 14.59 | 14.59 | 14.59 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -16692.369 0 -16692.369 -1289.222 + 10 120.56861 -17769.719 0 -16691.902 -4082.7098 + 20 136.08014 -17884.591 0 -16668.109 -5140.7824 + 30 136.97316 -17874.351 0 -16649.887 -5351.3571 + 40 153.37285 -18001.493 0 -16630.424 -5227.0601 + 50 167.70414 -18105.435 0 -16606.252 -4473.2089 + 60 163.08253 -18037.29 0 -16579.422 -3295.8963 + 70 169.60395 -18067.078 0 -16550.912 -2615.7026 + 80 182.94811 -18155.978 0 -16520.523 -2393.3156 + 90 191.29902 -18197.887 0 -16487.779 -2242.7104 + 100 194.70949 -18195.021 0 -16454.425 -1955.2916 +Loop time of 29.6024 on 4 procs for 100 steps with 4500 atoms + +Performance: 0.292 ns/day, 82.229 hours/ns, 3.378 timesteps/s +52.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 | 26.631 | 27.507 | 28.649 | 14.3 | 92.92 +Bond | 0.00021 | 0.00022675 | 0.000248 | 0.0 | 0.00 +Kspace | 0.72315 | 1.8708 | 2.7365 | 54.7 | 6.32 +Neigh | 0.10667 | 0.1067 | 0.10674 | 0.0 | 0.36 +Comm | 0.045357 | 0.054035 | 0.064607 | 3.6 | 0.18 +Output | 0.000424 | 0.00086625 | 0.002189 | 0.0 | 0.00 +Modify | 0.056602 | 0.056667 | 0.056763 | 0.0 | 0.19 +Other | | 0.006337 | | | 0.02 + +Nlocal: 1125 ave 1154 max 1092 min +Histogram: 1 0 0 0 1 0 0 1 0 1 +Nghost: 12256.2 ave 12296 max 12213 min +Histogram: 1 0 1 0 0 0 0 0 1 1 +Neighs: 361484 ave 376583 max 347969 min +Histogram: 1 0 0 0 2 0 0 0 0 1 + +Total # of neighbors = 1445935 +Ave neighs/atom = 321.319 +Ave special neighs/atom = 2 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:30 From a34c935e207beec4304fe3907d2b9a603b9af504 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 17 May 2017 08:00:21 -0400 Subject: [PATCH 035/302] update log files in python pair style example --- examples/python/in.pair_python_hybrid | 4 +- examples/python/in.pair_python_melt | 4 +- .../log.4May17.pair_python_hybrid.g++.1 | 62 ++++---- .../log.4May17.pair_python_hybrid.g++.4 | 138 +++++++++--------- .../python/log.4May17.pair_python_melt.g++.1 | 62 ++++---- .../python/log.4May17.pair_python_melt.g++.4 | 60 ++++---- 6 files changed, 165 insertions(+), 165 deletions(-) diff --git a/examples/python/in.pair_python_hybrid b/examples/python/in.pair_python_hybrid index dcd1f1e35c..289de18b00 100644 --- a/examples/python/in.pair_python_hybrid +++ b/examples/python/in.pair_python_hybrid @@ -31,7 +31,7 @@ clear read_restart hybrid.restart pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python potentials.LAMMPSLJCutPotential lj NULL +pair_coeff * * python potentials.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 fix 1 all nve @@ -47,7 +47,7 @@ atom_style atomic read_data hybrid.data pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python potentials.LAMMPSLJCutPotential lj NULL +pair_coeff * * python potentials.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin diff --git a/examples/python/in.pair_python_melt b/examples/python/in.pair_python_melt index 2349f080d4..7b3cbf7c4d 100644 --- a/examples/python/in.pair_python_melt +++ b/examples/python/in.pair_python_melt @@ -30,7 +30,7 @@ clear read_restart melt.restart pair_style python 2.5 -pair_coeff * * potentials.LAMMPSLJCutPotential lj +pair_coeff * * potentials.LJCutMelt lj fix 1 all nve @@ -45,7 +45,7 @@ atom_style atomic read_data melt.data pair_style python 2.5 -pair_coeff * * potentials.LAMMPSLJCutPotential lj +pair_coeff * * potentials.LJCutMelt lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no diff --git a/examples/python/log.4May17.pair_python_hybrid.g++.1 b/examples/python/log.4May17.pair_python_hybrid.g++.1 index b7520754f9..d9d3bf53c0 100644 --- a/examples/python/log.4May17.pair_python_hybrid.g++.1 +++ b/examples/python/log.4May17.pair_python_hybrid.g++.1 @@ -19,7 +19,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * * python potentials.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin @@ -59,20 +59,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6324555 -4.7286791 0 -2.280608 5.9589514 200 1.6630725 -4.7750988 0 -2.2811136 5.7364886 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 -Loop time of 41.3888 on 1 procs for 250 steps with 4000 atoms +Loop time of 43.2436 on 1 procs for 250 steps with 4000 atoms -Performance: 2609.399 tau/day, 6.040 timesteps/s -48.7% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 2497.477 tau/day, 5.781 timesteps/s +31.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 | 41.135 | 41.135 | 41.135 | 0.0 | 99.39 -Neigh | 0.17089 | 0.17089 | 0.17089 | 0.0 | 0.41 -Comm | 0.032175 | 0.032175 | 0.032175 | 0.0 | 0.08 -Output | 0.000513 | 0.000513 | 0.000513 | 0.0 | 0.00 -Modify | 0.046448 | 0.046448 | 0.046448 | 0.0 | 0.11 -Other | | 0.003913 | | | 0.01 +Pair | 42.933 | 42.933 | 42.933 | 0.0 | 99.28 +Neigh | 0.24816 | 0.24816 | 0.24816 | 0.0 | 0.57 +Comm | 0.027748 | 0.027748 | 0.027748 | 0.0 | 0.06 +Output | 0.000519 | 0.000519 | 0.000519 | 0.0 | 0.00 +Modify | 0.028028 | 0.028028 | 0.028028 | 0.0 | 0.06 +Other | | 0.005912 | | | 0.01 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -99,7 +99,7 @@ read_restart hybrid.restart 4000 atoms pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * * python potentials.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 fix 1 all nve @@ -136,20 +136,20 @@ Step Temp E_pair E_mol TotEng Press 400 1.6540555 -4.7622999 0 -2.281837 5.8200413 450 1.6264734 -4.7200865 0 -2.2809863 5.9546991 500 1.6366891 -4.7350979 0 -2.2806781 5.9369284 -Loop time of 41.5677 on 1 procs for 250 steps with 4000 atoms +Loop time of 46.2882 on 1 procs for 250 steps with 4000 atoms -Performance: 2598.172 tau/day, 6.014 timesteps/s -48.7% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 2333.206 tau/day, 5.401 timesteps/s +31.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 | 41.124 | 41.124 | 41.124 | 0.0 | 98.93 -Neigh | 0.35605 | 0.35605 | 0.35605 | 0.0 | 0.86 -Comm | 0.034799 | 0.034799 | 0.034799 | 0.0 | 0.08 -Output | 0.000473 | 0.000473 | 0.000473 | 0.0 | 0.00 -Modify | 0.046841 | 0.046841 | 0.046841 | 0.0 | 0.11 -Other | | 0.005854 | | | 0.01 +Pair | 45.662 | 45.662 | 45.662 | 0.0 | 98.65 +Neigh | 0.55234 | 0.55234 | 0.55234 | 0.0 | 1.19 +Comm | 0.035614 | 0.035614 | 0.035614 | 0.0 | 0.08 +Output | 0.000544 | 0.000544 | 0.000544 | 0.0 | 0.00 +Modify | 0.029269 | 0.029269 | 0.029269 | 0.0 | 0.06 +Other | | 0.008735 | | | 0.02 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -179,7 +179,7 @@ read_data hybrid.data 4000 velocities pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * * python potentials.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin @@ -219,20 +219,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6537193 -4.7627023 0 -2.2827434 5.8177704 200 1.6258731 -4.7205017 0 -2.2823017 5.952511 250 1.6370862 -4.7373176 0 -2.2823022 5.925807 -Loop time of 41.7098 on 1 procs for 250 steps with 4000 atoms +Loop time of 46.4094 on 1 procs for 250 steps with 4000 atoms -Performance: 2589.318 tau/day, 5.994 timesteps/s -48.7% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 2327.115 tau/day, 5.387 timesteps/s +31.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 | 41.458 | 41.458 | 41.458 | 0.0 | 99.40 -Neigh | 0.16992 | 0.16992 | 0.16992 | 0.0 | 0.41 -Comm | 0.031355 | 0.031355 | 0.031355 | 0.0 | 0.08 -Output | 0.000537 | 0.000537 | 0.000537 | 0.0 | 0.00 -Modify | 0.046569 | 0.046569 | 0.046569 | 0.0 | 0.11 -Other | | 0.003735 | | | 0.01 +Pair | 46.066 | 46.066 | 46.066 | 0.0 | 99.26 +Neigh | 0.27099 | 0.27099 | 0.27099 | 0.0 | 0.58 +Comm | 0.033778 | 0.033778 | 0.033778 | 0.0 | 0.07 +Output | 0.000507 | 0.000507 | 0.000507 | 0.0 | 0.00 +Modify | 0.030938 | 0.030938 | 0.030938 | 0.0 | 0.07 +Other | | 0.006695 | | | 0.01 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -247,4 +247,4 @@ Neighbor list builds = 12 Dangerous builds not checked shell rm hybrid.data hybrid.restart -Total wall time: 0:02:07 +Total wall time: 0:02:20 diff --git a/examples/python/log.4May17.pair_python_hybrid.g++.4 b/examples/python/log.4May17.pair_python_hybrid.g++.4 index 7e7868c659..e45514a803 100644 --- a/examples/python/log.4May17.pair_python_hybrid.g++.4 +++ b/examples/python/log.4May17.pair_python_hybrid.g++.4 @@ -11,7 +11,7 @@ Lattice spacing in x,y,z = 1.6796 1.6796 1.6796 region box block 0 10 0 10 0 10 create_box 2 box Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 1 by 1 by 2 MPI processor grid + 1 by 2 by 2 MPI processor grid create_atoms 1 box Created 4000 atoms mass * 1.0 @@ -19,7 +19,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * * python potentials.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin @@ -51,35 +51,35 @@ Neighbor list info ... pair build: half/bin/atomonly/newton stencil: half/bin/3d/newton bin: standard -Per MPI rank memory allocation (min/avg/max) = 4.044 | 4.044 | 4.044 Mbytes +Per MPI rank memory allocation (min/avg/max) = 3.953 | 3.953 | 3.953 Mbytes Step Temp E_pair E_mol TotEng Press 0 3 -6.7733681 0 -2.2744931 -3.7033504 - 50 1.6758903 -4.7955425 0 -2.2823355 5.670064 - 100 1.6458363 -4.7492704 0 -2.2811332 5.8691042 - 150 1.6324555 -4.7286791 0 -2.280608 5.9589514 - 200 1.6630725 -4.7750988 0 -2.2811136 5.7364886 - 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 -Loop time of 33.3499 on 2 procs for 250 steps with 4000 atoms + 50 1.6754119 -4.7947589 0 -2.2822693 5.6615925 + 100 1.6503357 -4.756014 0 -2.2811293 5.8050524 + 150 1.6596605 -4.7699432 0 -2.2810749 5.7830138 + 200 1.6371874 -4.7365462 0 -2.2813789 5.9246674 + 250 1.6323462 -4.7292021 0 -2.2812949 5.9762238 +Loop time of 11.1422 on 4 procs for 250 steps with 4000 atoms -Performance: 3238.386 tau/day, 7.496 timesteps/s -31.8% CPU use with 2 MPI tasks x 1 OpenMP threads +Performance: 9692.888 tau/day, 22.437 timesteps/s +35.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 | 31.739 | 32.45 | 33.16 | 12.5 | 97.30 -Neigh | 0.12882 | 0.1292 | 0.12959 | 0.1 | 0.39 -Comm | 0.04094 | 0.75173 | 1.4625 | 82.0 | 2.25 -Output | 0.000352 | 0.0004115 | 0.000471 | 0.0 | 0.00 -Modify | 0.014923 | 0.01509 | 0.015257 | 0.1 | 0.05 -Other | | 0.003902 | | | 0.01 +Pair | 10.448 | 10.772 | 10.937 | 5.9 | 96.67 +Neigh | 0.062061 | 0.062949 | 0.06439 | 0.4 | 0.56 +Comm | 0.12929 | 0.29444 | 0.61802 | 35.8 | 2.64 +Output | 0.000301 | 0.000684 | 0.001824 | 0.0 | 0.01 +Modify | 0.009803 | 0.0098622 | 0.010014 | 0.1 | 0.09 +Other | | 0.002618 | | | 0.02 -Nlocal: 2000 ave 2006 max 1994 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 3942 ave 3967 max 3917 min -Histogram: 1 0 0 0 0 0 0 0 0 1 +Nlocal: 1000 ave 1010 max 982 min +Histogram: 1 0 0 0 0 0 1 0 0 2 +Nghost: 2703.75 ave 2713 max 2689 min +Histogram: 1 0 0 0 0 0 0 2 0 1 Neighs: 0 ave 0 max 0 min -Histogram: 2 0 0 0 0 0 0 0 0 0 +Histogram: 4 0 0 0 0 0 0 0 0 0 Total # of neighbors = 0 Ave neighs/atom = 0 @@ -95,11 +95,11 @@ OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) read_restart hybrid.restart orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 1 by 1 by 2 MPI processor grid + 1 by 2 by 2 MPI processor grid 4000 atoms pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * * python potentials.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 fix 1 all nve @@ -128,35 +128,35 @@ Neighbor list info ... pair build: half/bin/atomonly/newton stencil: half/bin/3d/newton bin: standard -Per MPI rank memory allocation (min/avg/max) = 3.747 | 3.747 | 3.747 Mbytes +Per MPI rank memory allocation (min/avg/max) = 3.612 | 3.612 | 3.612 Mbytes Step Temp E_pair E_mol TotEng Press - 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 - 300 1.645592 -4.7496711 0 -2.2819002 5.8734193 - 350 1.6514972 -4.7580756 0 -2.2814491 5.810167 - 400 1.6540555 -4.7622999 0 -2.281837 5.8200413 - 450 1.6264734 -4.7200865 0 -2.2809863 5.9546991 - 500 1.6366891 -4.7350979 0 -2.2806781 5.9369284 -Loop time of 33.4436 on 2 procs for 250 steps with 4000 atoms + 250 1.6323462 -4.7292062 0 -2.2812991 5.9762168 + 300 1.6451788 -4.7488091 0 -2.2816578 5.8375485 + 350 1.6171909 -4.7064928 0 -2.2813129 6.0094235 + 400 1.6388136 -4.7387093 0 -2.2811035 5.9331084 + 450 1.6431295 -4.7452215 0 -2.2811435 5.8929898 + 500 1.643316 -4.7454222 0 -2.2810644 5.8454817 +Loop time of 11.287 on 4 procs for 250 steps with 4000 atoms -Performance: 3229.315 tau/day, 7.475 timesteps/s -31.8% CPU use with 2 MPI tasks x 1 OpenMP threads +Performance: 9568.520 tau/day, 22.149 timesteps/s +34.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 | 31.79 | 32.446 | 33.101 | 11.5 | 97.02 -Neigh | 0.26891 | 0.26902 | 0.26912 | 0.0 | 0.80 -Comm | 0.051997 | 0.70764 | 1.3633 | 77.9 | 2.12 -Output | 0.000332 | 0.000396 | 0.00046 | 0.0 | 0.00 -Modify | 0.01539 | 0.015553 | 0.015717 | 0.1 | 0.05 -Other | | 0.005483 | | | 0.02 +Pair | 10.274 | 10.76 | 11.02 | 8.8 | 95.33 +Neigh | 0.12639 | 0.1291 | 0.13056 | 0.5 | 1.14 +Comm | 0.12094 | 0.38226 | 0.87078 | 46.7 | 3.39 +Output | 0.000297 | 0.0006965 | 0.001867 | 0.0 | 0.01 +Modify | 0.010445 | 0.010638 | 0.011054 | 0.2 | 0.09 +Other | | 0.003901 | | | 0.03 -Nlocal: 2000 ave 2000 max 2000 min -Histogram: 2 0 0 0 0 0 0 0 0 0 -Nghost: 3912 ave 3920 max 3904 min -Histogram: 1 0 0 0 0 0 0 0 0 1 +Nlocal: 1000 ave 1012 max 983 min +Histogram: 1 0 0 0 0 0 2 0 0 1 +Nghost: 2699 ave 2706 max 2693 min +Histogram: 1 1 0 0 0 0 1 0 0 1 Neighs: 0 ave 0 max 0 min -Histogram: 2 0 0 0 0 0 0 0 0 0 +Histogram: 4 0 0 0 0 0 0 0 0 0 Total # of neighbors = 0 Ave neighs/atom = 0 @@ -172,14 +172,14 @@ atom_style atomic read_data hybrid.data orthogonal box = (0 0 0) to (16.796 16.796 16.796) - 1 by 1 by 2 MPI processor grid + 1 by 2 by 2 MPI processor grid reading atoms ... 4000 atoms reading velocities ... 4000 velocities pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python lj-melt-potential.py lj NULL +pair_coeff * * python potentials.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin @@ -211,35 +211,35 @@ Neighbor list info ... pair build: half/bin/atomonly/newton stencil: half/bin/3d/newton bin: standard -Per MPI rank memory allocation (min/avg/max) = 3.247 | 3.247 | 3.247 Mbytes +Per MPI rank memory allocation (min/avg/max) = 3.112 | 3.112 | 3.112 Mbytes Step Temp E_pair E_mol TotEng Press - 0 1.6275257 -4.7224992 0 -2.281821 5.9567365 - 50 1.6454666 -4.7497515 0 -2.2821686 5.8729175 - 100 1.6512008 -4.7582693 0 -2.2820874 5.8090548 - 150 1.6537193 -4.7627023 0 -2.2827434 5.8177704 - 200 1.6258731 -4.7205017 0 -2.2823017 5.952511 - 250 1.6370862 -4.7373176 0 -2.2823022 5.925807 -Loop time of 33.0043 on 2 procs for 250 steps with 4000 atoms + 0 1.6323462 -4.7292062 0 -2.2812991 5.9762168 + 50 1.6450626 -4.7488948 0 -2.2819177 5.8370409 + 100 1.6169004 -4.7066969 0 -2.2819526 6.0082546 + 150 1.6384234 -4.7389689 0 -2.2819482 5.9315273 + 200 1.6428814 -4.7460743 0 -2.2823683 5.8888228 + 250 1.6432631 -4.7466603 0 -2.2823818 5.8398819 +Loop time of 11.1573 on 4 procs for 250 steps with 4000 atoms -Performance: 3272.302 tau/day, 7.575 timesteps/s -31.8% CPU use with 2 MPI tasks x 1 OpenMP threads +Performance: 9679.760 tau/day, 22.407 timesteps/s +35.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 | 31.676 | 32.248 | 32.819 | 10.1 | 97.71 -Neigh | 0.12725 | 0.12751 | 0.12778 | 0.1 | 0.39 -Comm | 0.038764 | 0.60973 | 1.1807 | 73.1 | 1.85 -Output | 0.000359 | 0.000424 | 0.000489 | 0.0 | 0.00 -Modify | 0.015441 | 0.01555 | 0.01566 | 0.1 | 0.05 -Other | | 0.003519 | | | 0.01 +Pair | 10.166 | 10.713 | 10.932 | 9.7 | 96.01 +Neigh | 0.060687 | 0.062175 | 0.063163 | 0.4 | 0.56 +Comm | 0.14931 | 0.36938 | 0.91686 | 52.5 | 3.31 +Output | 0.00036 | 0.00058175 | 0.001228 | 0.0 | 0.01 +Modify | 0.009918 | 0.010237 | 0.010388 | 0.2 | 0.09 +Other | | 0.002356 | | | 0.02 -Nlocal: 2000 ave 2004 max 1996 min -Histogram: 1 0 0 0 0 0 0 0 0 1 -Nghost: 3923.5 ave 3927 max 3920 min -Histogram: 1 0 0 0 0 0 0 0 0 1 +Nlocal: 1000 ave 1013 max 989 min +Histogram: 1 0 0 1 0 1 0 0 0 1 +Nghost: 2695.5 ave 2706 max 2682 min +Histogram: 1 0 0 0 0 0 2 0 0 1 Neighs: 0 ave 0 max 0 min -Histogram: 2 0 0 0 0 0 0 0 0 0 +Histogram: 4 0 0 0 0 0 0 0 0 0 Total # of neighbors = 0 Ave neighs/atom = 0 @@ -247,4 +247,4 @@ Neighbor list builds = 12 Dangerous builds not checked shell rm hybrid.data hybrid.restart -Total wall time: 0:01:42 +Total wall time: 0:00:35 diff --git a/examples/python/log.4May17.pair_python_melt.g++.1 b/examples/python/log.4May17.pair_python_melt.g++.1 index afcf5cad9c..3459dd4f87 100644 --- a/examples/python/log.4May17.pair_python_melt.g++.1 +++ b/examples/python/log.4May17.pair_python_melt.g++.1 @@ -19,7 +19,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style python 2.5 -pair_coeff * * lj-melt-potential.py lj +pair_coeff * * potentials.LJCutMelt lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no @@ -48,20 +48,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6324555 -4.7286791 0 -2.280608 5.9589514 200 1.6630725 -4.7750988 0 -2.2811136 5.7364886 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 -Loop time of 62.2396 on 1 procs for 250 steps with 4000 atoms +Loop time of 24.2466 on 1 procs for 250 steps with 4000 atoms -Performance: 1735.231 tau/day, 4.017 timesteps/s -31.8% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 4454.233 tau/day, 10.311 timesteps/s +59.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 | 61.865 | 61.865 | 61.865 | 0.0 | 99.40 -Neigh | 0.24651 | 0.24651 | 0.24651 | 0.0 | 0.40 -Comm | 0.049505 | 0.049505 | 0.049505 | 0.0 | 0.08 -Output | 0.000738 | 0.000738 | 0.000738 | 0.0 | 0.00 -Modify | 0.071444 | 0.071444 | 0.071444 | 0.0 | 0.11 -Other | | 0.005964 | | | 0.01 +Pair | 24.079 | 24.079 | 24.079 | 0.0 | 99.31 +Neigh | 0.13174 | 0.13174 | 0.13174 | 0.0 | 0.54 +Comm | 0.016789 | 0.016789 | 0.016789 | 0.0 | 0.07 +Output | 0.000271 | 0.000271 | 0.000271 | 0.0 | 0.00 +Modify | 0.015073 | 0.015073 | 0.015073 | 0.0 | 0.06 +Other | | 0.003428 | | | 0.01 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -88,7 +88,7 @@ read_restart melt.restart 4000 atoms pair_style python 2.5 -pair_coeff * * lj-melt-potential.py lj +pair_coeff * * potentials.LJCutMelt lj fix 1 all nve @@ -114,20 +114,20 @@ Step Temp E_pair E_mol TotEng Press 400 1.6540555 -4.7622999 0 -2.281837 5.8200413 450 1.6264734 -4.7200865 0 -2.2809863 5.9546991 500 1.6366891 -4.7350979 0 -2.2806781 5.9369284 -Loop time of 62.6472 on 1 procs for 250 steps with 4000 atoms +Loop time of 24.3239 on 1 procs for 250 steps with 4000 atoms -Performance: 1723.939 tau/day, 3.991 timesteps/s -31.8% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 4440.069 tau/day, 10.278 timesteps/s +60.0% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 61.994 | 61.994 | 61.994 | 0.0 | 98.96 -Neigh | 0.519 | 0.519 | 0.519 | 0.0 | 0.83 -Comm | 0.052574 | 0.052574 | 0.052574 | 0.0 | 0.08 -Output | 0.000804 | 0.000804 | 0.000804 | 0.0 | 0.00 -Modify | 0.071878 | 0.071878 | 0.071878 | 0.0 | 0.11 -Other | | 0.009016 | | | 0.01 +Pair | 24.017 | 24.017 | 24.017 | 0.0 | 98.74 +Neigh | 0.26927 | 0.26927 | 0.26927 | 0.0 | 1.11 +Comm | 0.018113 | 0.018113 | 0.018113 | 0.0 | 0.07 +Output | 0.000254 | 0.000254 | 0.000254 | 0.0 | 0.00 +Modify | 0.015259 | 0.015259 | 0.015259 | 0.0 | 0.06 +Other | | 0.004524 | | | 0.02 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -157,7 +157,7 @@ read_data melt.data 4000 velocities pair_style python 2.5 -pair_coeff * * lj-melt-potential.py lj +pair_coeff * * potentials.LJCutMelt lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no @@ -186,20 +186,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6537193 -4.7627023 0 -2.2827434 5.8177704 200 1.6258731 -4.7205017 0 -2.2823017 5.952511 250 1.6370862 -4.7373176 0 -2.2823022 5.925807 -Loop time of 62.6778 on 1 procs for 250 steps with 4000 atoms +Loop time of 22.9051 on 1 procs for 250 steps with 4000 atoms -Performance: 1723.098 tau/day, 3.989 timesteps/s -31.7% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 4715.116 tau/day, 10.915 timesteps/s +60.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 | 62.298 | 62.298 | 62.298 | 0.0 | 99.39 -Neigh | 0.25251 | 0.25251 | 0.25251 | 0.0 | 0.40 -Comm | 0.04911 | 0.04911 | 0.04911 | 0.0 | 0.08 -Output | 0.000797 | 0.000797 | 0.000797 | 0.0 | 0.00 -Modify | 0.071729 | 0.071729 | 0.071729 | 0.0 | 0.11 -Other | | 0.005419 | | | 0.01 +Pair | 22.752 | 22.752 | 22.752 | 0.0 | 99.33 +Neigh | 0.12254 | 0.12254 | 0.12254 | 0.0 | 0.53 +Comm | 0.013385 | 0.013385 | 0.013385 | 0.0 | 0.06 +Output | 0.000254 | 0.000254 | 0.000254 | 0.0 | 0.00 +Modify | 0.014159 | 0.014159 | 0.014159 | 0.0 | 0.06 +Other | | 0.002851 | | | 0.01 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -214,4 +214,4 @@ Neighbor list builds = 12 Dangerous builds not checked shell rm melt.data melt.restart -Total wall time: 0:03:12 +Total wall time: 0:01:13 diff --git a/examples/python/log.4May17.pair_python_melt.g++.4 b/examples/python/log.4May17.pair_python_melt.g++.4 index e7c6ffa8eb..7e4ba25acf 100644 --- a/examples/python/log.4May17.pair_python_melt.g++.4 +++ b/examples/python/log.4May17.pair_python_melt.g++.4 @@ -19,7 +19,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style python 2.5 -pair_coeff * * lj-melt-potential.py lj +pair_coeff * * potentials.LJCutMelt lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no @@ -48,20 +48,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6596605 -4.7699432 0 -2.2810749 5.7830138 200 1.6371874 -4.7365462 0 -2.2813789 5.9246674 250 1.6323462 -4.7292021 0 -2.2812949 5.9762238 -Loop time of 18.0035 on 4 procs for 250 steps with 4000 atoms +Loop time of 12.7083 on 4 procs for 250 steps with 4000 atoms -Performance: 5998.838 tau/day, 13.886 timesteps/s -31.6% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 8498.384 tau/day, 19.672 timesteps/s +31.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 | 16.784 | 17.18 | 17.611 | 8.9 | 95.43 -Neigh | 0.066257 | 0.066613 | 0.066967 | 0.1 | 0.37 -Comm | 0.31192 | 0.74265 | 1.1386 | 42.7 | 4.13 -Output | 0.000344 | 0.00076 | 0.001983 | 0.0 | 0.00 -Modify | 0.010618 | 0.010763 | 0.010947 | 0.1 | 0.06 -Other | | 0.00278 | | | 0.02 +Pair | 11.491 | 11.96 | 12.464 | 10.0 | 94.11 +Neigh | 0.065058 | 0.065956 | 0.067066 | 0.3 | 0.52 +Comm | 0.16288 | 0.66706 | 1.1373 | 42.2 | 5.25 +Output | 0.000416 | 0.00085025 | 0.002121 | 0.0 | 0.01 +Modify | 0.010849 | 0.011123 | 0.011321 | 0.2 | 0.09 +Other | | 0.003005 | | | 0.02 Nlocal: 1000 ave 1010 max 982 min Histogram: 1 0 0 0 0 0 1 0 0 2 @@ -88,7 +88,7 @@ read_restart melt.restart 4000 atoms pair_style python 2.5 -pair_coeff * * lj-melt-potential.py lj +pair_coeff * * potentials.LJCutMelt lj fix 1 all nve @@ -114,20 +114,20 @@ Step Temp E_pair E_mol TotEng Press 400 1.6388136 -4.7387093 0 -2.2811035 5.9331084 450 1.6431295 -4.7452215 0 -2.2811435 5.8929898 500 1.643316 -4.7454222 0 -2.2810644 5.8454817 -Loop time of 17.8516 on 4 procs for 250 steps with 4000 atoms +Loop time of 12.6852 on 4 procs for 250 steps with 4000 atoms -Performance: 6049.891 tau/day, 14.004 timesteps/s +Performance: 8513.855 tau/day, 19.708 timesteps/s 31.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 | 16.549 | 17.138 | 17.615 | 9.3 | 96.00 -Neigh | 0.1326 | 0.13573 | 0.13709 | 0.5 | 0.76 -Comm | 0.083467 | 0.56179 | 1.1533 | 51.4 | 3.15 -Output | 0.000353 | 0.000703 | 0.00173 | 0.0 | 0.00 -Modify | 0.011229 | 0.011437 | 0.011847 | 0.2 | 0.06 -Other | | 0.004124 | | | 0.02 +Pair | 11.653 | 11.92 | 12.472 | 9.6 | 93.97 +Neigh | 0.13284 | 0.13556 | 0.13729 | 0.5 | 1.07 +Comm | 0.051389 | 0.60884 | 0.88175 | 43.0 | 4.80 +Output | 0.000362 | 0.0046985 | 0.008143 | 5.1 | 0.04 +Modify | 0.011007 | 0.011344 | 0.011857 | 0.3 | 0.09 +Other | | 0.004278 | | | 0.03 Nlocal: 1000 ave 1012 max 983 min Histogram: 1 0 0 0 0 0 2 0 0 1 @@ -157,7 +157,7 @@ read_data melt.data 4000 velocities pair_style python 2.5 -pair_coeff * * lj-melt-potential.py lj +pair_coeff * * potentials.LJCutMelt lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no @@ -186,20 +186,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6384234 -4.7389689 0 -2.2819482 5.9315273 200 1.6428814 -4.7460743 0 -2.2823683 5.8888228 250 1.6432631 -4.7466603 0 -2.2823818 5.8398819 -Loop time of 17.5277 on 4 procs for 250 steps with 4000 atoms +Loop time of 12.5324 on 4 procs for 250 steps with 4000 atoms -Performance: 6161.664 tau/day, 14.263 timesteps/s -31.7% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 8617.631 tau/day, 19.948 timesteps/s +31.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 | 16.46 | 17.032 | 17.348 | 8.3 | 97.17 -Neigh | 0.063784 | 0.06495 | 0.065515 | 0.3 | 0.37 -Comm | 0.10004 | 0.41613 | 0.98807 | 53.0 | 2.37 -Output | 0.000331 | 0.00081525 | 0.002223 | 0.0 | 0.00 -Modify | 0.010998 | 0.011169 | 0.011264 | 0.1 | 0.06 -Other | | 0.002774 | | | 0.02 +Pair | 11.648 | 11.918 | 12.387 | 8.3 | 95.10 +Neigh | 0.064038 | 0.06537 | 0.065914 | 0.3 | 0.52 +Comm | 0.065189 | 0.53362 | 0.80384 | 39.4 | 4.26 +Output | 0.000346 | 0.0007525 | 0.001938 | 0.0 | 0.01 +Modify | 0.011255 | 0.01155 | 0.011852 | 0.2 | 0.09 +Other | | 0.002751 | | | 0.02 Nlocal: 1000 ave 1013 max 989 min Histogram: 1 0 0 1 0 1 0 0 0 1 @@ -214,4 +214,4 @@ Neighbor list builds = 12 Dangerous builds not checked shell rm melt.data melt.restart -Total wall time: 0:00:55 +Total wall time: 0:00:39 From 45becfb235d7bf456de19b19add33be07724a700 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 17 May 2017 09:59:01 -0400 Subject: [PATCH 036/302] correct author attributions --- src/PYTHON/fix_python.cpp | 2 +- src/PYTHON/pair_python.cpp | 2 +- src/PYTHON/python_impl.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PYTHON/fix_python.cpp b/src/PYTHON/fix_python.cpp index a7b1edfda1..031bb29764 100644 --- a/src/PYTHON/fix_python.cpp +++ b/src/PYTHON/fix_python.cpp @@ -12,7 +12,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing author: Axel Kohlmeyer and Richard Berger (Temple U) + Contributing author: Richard Berger (Temple U) ------------------------------------------------------------------------- */ #include diff --git a/src/PYTHON/pair_python.cpp b/src/PYTHON/pair_python.cpp index 60f317ee96..381b9050ff 100644 --- a/src/PYTHON/pair_python.cpp +++ b/src/PYTHON/pair_python.cpp @@ -12,7 +12,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing author: Axel Kohlmeyer and Richard Berger (Temple U) + Contributing authors: Axel Kohlmeyer and Richard Berger (Temple U) ------------------------------------------------------------------------- */ #include diff --git a/src/PYTHON/python_impl.cpp b/src/PYTHON/python_impl.cpp index dadcbfeade..55108eb8c7 100644 --- a/src/PYTHON/python_impl.cpp +++ b/src/PYTHON/python_impl.cpp @@ -12,7 +12,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing author: Axel Kohlmeyer and Richard Berger (Temple U) + Contributing author: Richard Berger and Axel Kohlmeyer (Temple U) ------------------------------------------------------------------------- */ #include From 085f3afdfb089a85bd0958fb6436f15c1463c5e2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 17 May 2017 09:59:30 -0400 Subject: [PATCH 037/302] fix typo in docs --- doc/src/velocity.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/velocity.txt b/doc/src/velocity.txt index 70ddb559fa..b8299a5acf 100644 --- a/doc/src/velocity.txt +++ b/doc/src/velocity.txt @@ -61,7 +61,7 @@ keyword/value parameters. Not all options are used by each style. Each option has a default as listed below. The {create} style generates an ensemble of velocities using a random -number generator with the specified seed as the specified temperature. +number generator with the specified seed at the specified temperature. The {set} style sets the velocities of all atoms in the group to the specified values. If any component is specified as NULL, then it is From 278b9f7fba477da3cc235cefb09151330ef2c5b7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 17 May 2017 14:59:46 -0400 Subject: [PATCH 038/302] move pair gw and gw/zbl to USER-MISC package --- doc/src/Section_commands.txt | 2 + doc/src/lammps.book | 1 + doc/src/pair_gw.txt | 118 ++++++++++++++++++++ doc/src/pairs.txt | 1 + src/USER-MISC/README | 2 + src/{MANYBODY => USER-MISC}/pair_gw.cpp | 0 src/{MANYBODY => USER-MISC}/pair_gw.h | 0 src/{MANYBODY => USER-MISC}/pair_gw_zbl.cpp | 0 src/{MANYBODY => USER-MISC}/pair_gw_zbl.h | 0 9 files changed, 124 insertions(+) create mode 100644 doc/src/pair_gw.txt rename src/{MANYBODY => USER-MISC}/pair_gw.cpp (100%) rename src/{MANYBODY => USER-MISC}/pair_gw.h (100%) rename src/{MANYBODY => USER-MISC}/pair_gw_zbl.cpp (100%) rename src/{MANYBODY => USER-MISC}/pair_gw_zbl.h (100%) diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index 771e830841..bf7b48f32b 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -931,6 +931,8 @@ KOKKOS, o = USER-OMP, t = OPT. "gran/hertz/history (o)"_pair_gran.html, "gran/hooke (o)"_pair_gran.html, "gran/hooke/history (o)"_pair_gran.html, +"gw"_pair_gw.html, +"gw/zbl"_pair_gw.html, "hbond/dreiding/lj (o)"_pair_hbond_dreiding.html, "hbond/dreiding/morse (o)"_pair_hbond_dreiding.html, "kim"_pair_kim.html, diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 6b3ca8aa07..2fd953ffaf 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -432,6 +432,7 @@ pair_gauss.html pair_gayberne.html pair_gran.html pair_gromacs.html +pair_gw.html pair_hbond_dreiding.html pair_hybrid.html pair_kim.html diff --git a/doc/src/pair_gw.txt b/doc/src/pair_gw.txt new file mode 100644 index 0000000000..2240dca6f7 --- /dev/null +++ b/doc/src/pair_gw.txt @@ -0,0 +1,118 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +pair_style gw command :h3 +pair_style gw/zbl command :h3 + +[Syntax:] + +pair_style gw :pre + +[Examples:] + +pair_style gw +pair_coeff * * SiC.gw Si C C + +pair_style gw/zbl +pair_coeff * * SiC.gw.zbl C Si :pre + +[Description:] + +The {gw} style computes a 3-body "Gao-Weber"_#Gao potential; +similarly {gw/zbl} combines this potential with a modified +repulsive ZBL core function in a similar fashion as implemented +in the "tersoff/zbl"_pair_tersoff_zbl.html pair style. + +Unfortunately the author of this contributed code has not been +able to submit a suitable documentation explaining the details +of the potentials. The LAMMPS developers thus have finally decided +to release the code anyway with only the technical explanations. +For details of the model and the parameters, please refer to the +linked publication. + +Only a single pair_coeff command is used with the {gw} and {gw/zbl} +styles which specifies a Gao-Weber potential file with parameters +for all needed 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 number of LAMMPS atom types: + +filename +N element names = mapping of GW elements to atom types :ul + +See the "pair_coeff"_pair_coeff.html doc page for alternate ways +to specify the path for the potential file. + +As an example, imagine a file SiC.gw has Gao-Weber values for Si and C. +If your LAMMPS simulation has 4 atoms types and you want the first 3 to +be Si, and the 4th to be C, you would use the following pair_coeff command: + +pair_coeff * * SiC.gw Si Si Si C :pre + +The first 2 arguments must be * * so as to span all LAMMPS atom types. +The first three Si arguments map LAMMPS atom types 1,2,3 to the Si +element in the GW file. The final C argument maps LAMMPS atom type 4 +to the C element in the GW file. If a mapping value is specified as +NULL, the mapping is not performed. This can be used when a {gw} +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. + +Gao-Weber files in the {potentials} directory of the LAMMPS +distribution have a ".gw" suffix. Gao-Weber with ZBL files +have a ".gz.zbl" suffix. The structure of the potential files +is similar to other many-body potentials supported by LAMMPS. +You have to refer to the comments in the files and the literature +to learn more details. + +:line + +[Mixing, shift, table, tail correction, restart, rRESPA info]: + +For atom type pairs I,J and I != J, where types I and J correspond to +two different element types, mixing is performed by LAMMPS as +described above from values in the potential file. + +This pair style does not support the "pair_modify"_pair_modify.html +shift, table, and tail options. + +This pair style does not write its information to "binary restart +files"_restart.html, since it is stored in potential files. Thus, you +need to re-specify the pair_style and pair_coeff commands in an input +script that reads a restart file. + +This pair style can only be used via the {pair} keyword of the +"run_style respa"_run_style.html command. It does not support the +{inner}, {middle}, {outer} keywords. + +:line + +[Restrictions:] + +This pair style is part of the USER-MISC package. It is only enabled +if LAMMPS was built with that package. See +the "Making LAMMPS"_Section_start.html#start_3 section for more info. + +This pair style requires the "newton"_newton.html setting to be "on" +for pair interactions. + +The Gao-Weber potential files provided with LAMMPS (see the +potentials directory) are parameterized for metal "units"_units.html. +You can use the GW potential with any LAMMPS units, but you would need +to create your own GW potential file with coefficients listed in the +appropriate units if your simulation doesn't use "metal" units. + +[Related commands:] + +"pair_coeff"_pair_coeff.html + +[Default:] none + +:line + +:link(Gao) +[(Gao)] Gao and Weber, Nuclear Instruments and Methods in Physics Research B 191 (2012) 504. diff --git a/doc/src/pairs.txt b/doc/src/pairs.txt index 0898906e7c..369c942280 100644 --- a/doc/src/pairs.txt +++ b/doc/src/pairs.txt @@ -36,6 +36,7 @@ Pair Styles :h1 pair_gayberne pair_gran pair_gromacs + pair_gw pair_hbond_dreiding pair_hybrid pair_kim diff --git a/src/USER-MISC/README b/src/USER-MISC/README index cacee41e0c..1e927fdfab 100644 --- a/src/USER-MISC/README +++ b/src/USER-MISC/README @@ -60,6 +60,8 @@ pair_style dipole/sf, Mario Orsi, orsimario at gmail.com, 8 Aug 11 pair_style edip, Luca Ferraro, luca.ferraro at caspur.it, 15 Sep 11 pair_style eam/cd, Alexander Stukowski, stukowski at mm.tu-darmstadt.de, 7 Nov 09 pair_style gauss/cut, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 +pair_style gw, German Samolyuk, samolyuk at gmail.com, 17 May 17 +pair_style gw/zbl, German Samolyuk, samolyuk at gmail.com, 17 May 17 pair_style lennard/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 pair_style list, Axel Kohlmeyer (Temple U), akohlmey at gmail.com, 1 Jun 13 pair_style lj/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 diff --git a/src/MANYBODY/pair_gw.cpp b/src/USER-MISC/pair_gw.cpp similarity index 100% rename from src/MANYBODY/pair_gw.cpp rename to src/USER-MISC/pair_gw.cpp diff --git a/src/MANYBODY/pair_gw.h b/src/USER-MISC/pair_gw.h similarity index 100% rename from src/MANYBODY/pair_gw.h rename to src/USER-MISC/pair_gw.h diff --git a/src/MANYBODY/pair_gw_zbl.cpp b/src/USER-MISC/pair_gw_zbl.cpp similarity index 100% rename from src/MANYBODY/pair_gw_zbl.cpp rename to src/USER-MISC/pair_gw_zbl.cpp diff --git a/src/MANYBODY/pair_gw_zbl.h b/src/USER-MISC/pair_gw_zbl.h similarity index 100% rename from src/MANYBODY/pair_gw_zbl.h rename to src/USER-MISC/pair_gw_zbl.h From 43efe9e417ee120555e6cbb290d73f484efa8b46 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 17 May 2017 17:20:56 -0400 Subject: [PATCH 039/302] adding Pair::single() support to python pair style and examples with the single function, python pair styles can be massively sped up and made compatible to accelerators, as one can translate the analytic force and energy functions through LAMMPS into suitable tables and then simply use the on-the-fly tables for production runs --- examples/python/data.spce | 9029 +++++++++++++++++ examples/python/in.pair_python_coulomb | 45 + examples/python/in.pair_python_table | 32 + .../python/log.4May17.pair_python_coulomb.1 | 178 + .../python/log.4May17.pair_python_coulomb.4 | 178 + .../python/log.4May17.pair_python_table.g++.1 | 99 + .../python/log.4May17.pair_python_table.g++.4 | 99 + src/PYTHON/pair_python.cpp | 84 +- src/PYTHON/pair_python.h | 1 + 9 files changed, 9743 insertions(+), 2 deletions(-) create mode 100644 examples/python/data.spce create mode 100644 examples/python/in.pair_python_coulomb create mode 100644 examples/python/in.pair_python_table create mode 100644 examples/python/log.4May17.pair_python_coulomb.1 create mode 100644 examples/python/log.4May17.pair_python_coulomb.4 create mode 100644 examples/python/log.4May17.pair_python_table.g++.1 create mode 100644 examples/python/log.4May17.pair_python_table.g++.4 diff --git a/examples/python/data.spce b/examples/python/data.spce new file mode 100644 index 0000000000..1e8a4a0913 --- /dev/null +++ b/examples/python/data.spce @@ -0,0 +1,9029 @@ +LAMMPS Atom File + + 4500 atoms + 3000 bonds + 1500 angles + 0 dihedrals + 0 impropers + + 2 atom types + 1 bond types + 1 angle types + + 0.02645 35.53280 xlo xhi + 0.02645 35.53280 ylo yhi + 0.02641 35.47360 zlo zhi + +Masses + + 1 15.9994 + 2 1.00794 + +Atoms + + 1 1 1 -0.8472 12.12456 28.09298 22.27452 0 1 0 + 2 1 2 0.4236 12.53683 28.75606 22.89928 0 1 0 + 3 1 2 0.4236 11.49482 28.56390 21.65678 0 1 0 + 4 2 1 -0.8472 1.17079 29.37777 23.72984 1 -1 0 + 5 2 2 0.4236 1.91804 29.48483 23.07399 1 -1 0 + 6 2 2 0.4236 0.40074 28.91964 23.28586 1 -1 0 + 7 3 1 -0.8472 29.68313 14.73733 21.62793 -1 0 0 + 8 3 2 0.4236 30.54284 14.93741 21.15800 -1 0 0 + 9 3 2 0.4236 29.73135 15.07344 22.56848 -1 0 0 + 10 4 1 -0.8472 10.87272 7.00153 35.10920 0 1 0 + 11 4 2 0.4236 11.11057 6.21663 34.53712 0 1 0 + 12 4 2 0.4236 9.95658 7.32301 34.86983 0 1 0 + 13 5 1 -0.8472 9.46588 6.43648 19.79899 0 1 0 + 14 5 2 0.4236 9.04840 6.32936 18.89668 0 1 0 + 15 5 2 0.4236 10.31722 5.91326 19.83657 0 1 0 + 16 6 1 -0.8472 3.17905 29.69801 22.11922 0 0 0 + 17 6 2 0.4236 3.19240 30.63289 21.76465 0 0 0 + 18 6 2 0.4236 3.38651 29.05797 21.37944 0 0 0 + 19 7 1 -0.8472 23.38618 11.29979 30.78238 0 0 0 + 20 7 2 0.4236 23.69882 10.46688 31.23897 0 0 0 + 21 7 2 0.4236 24.17354 11.79208 30.41132 0 0 0 + 22 8 1 -0.8472 11.03761 10.46106 30.14741 0 1 0 + 23 8 2 0.4236 10.94682 11.45112 30.25464 0 1 0 + 24 8 2 0.4236 11.60678 10.09680 30.88450 0 1 0 + 25 9 1 -0.8472 26.24001 25.40937 21.06754 0 0 0 + 26 9 2 0.4236 25.67045 26.09258 21.52442 0 0 0 + 27 9 2 0.4236 26.22311 25.56759 20.08030 0 0 0 + 28 10 1 -0.8472 10.84087 35.33915 19.78347 0 -1 0 + 29 10 2 0.4236 10.20697 0.54421 19.48018 0 0 0 + 30 10 2 0.4236 11.06253 34.74012 19.01405 0 -1 0 + 31 11 1 -0.8472 20.07383 4.95885 33.62365 0 1 0 + 32 11 2 0.4236 19.77359 5.87080 33.90322 0 1 0 + 33 11 2 0.4236 20.68149 4.57954 34.32139 0 1 0 + 34 12 1 -0.8472 12.43897 28.56656 17.39837 0 0 0 + 35 12 2 0.4236 12.80348 27.99505 18.13354 0 0 0 + 36 12 2 0.4236 11.63887 28.12177 16.99597 0 0 0 + 37 13 1 -0.8472 14.80338 7.14199 1.42116 0 0 0 + 38 13 2 0.4236 14.86001 6.68442 0.53382 0 0 0 + 39 13 2 0.4236 14.13589 6.67036 1.99737 0 0 0 + 40 14 1 -0.8472 15.87968 22.18330 24.13468 1 -1 0 + 41 14 2 0.4236 15.97100 22.71526 23.29285 1 -1 0 + 42 14 2 0.4236 16.69618 22.30846 24.69826 1 -1 0 + 43 15 1 -0.8472 13.29194 18.30473 12.37157 1 0 0 + 44 15 2 0.4236 12.55838 18.63231 12.96701 1 0 0 + 45 15 2 0.4236 13.24823 18.78335 11.49467 1 0 0 + 46 16 1 -0.8472 20.27409 23.94157 15.50212 0 0 0 + 47 16 2 0.4236 20.17851 24.67734 14.83167 0 0 0 + 48 16 2 0.4236 20.62006 23.12024 15.04857 0 0 0 + 49 17 1 -0.8472 30.10203 10.78182 14.24321 1 0 0 + 50 17 2 0.4236 29.40171 11.00523 13.56532 1 0 0 + 51 17 2 0.4236 29.70120 10.21329 14.96159 1 0 0 + 52 18 1 -0.8472 19.71525 12.98975 25.40578 0 0 0 + 53 18 2 0.4236 20.21522 13.35852 26.18938 0 0 0 + 54 18 2 0.4236 18.75253 12.87297 25.64962 0 0 0 + 55 19 1 -0.8472 4.22362 18.99305 32.62946 1 0 0 + 56 19 2 0.4236 4.05067 18.17865 32.07556 1 0 0 + 57 19 2 0.4236 3.38513 19.53353 32.69833 1 0 0 + 58 20 1 -0.8472 17.67279 30.86798 34.86933 1 -1 0 + 59 20 2 0.4236 17.18866 31.74218 34.90528 1 -1 0 + 60 20 2 0.4236 18.18607 30.80612 34.01339 1 -1 0 + 61 21 1 -0.8472 7.49194 27.84024 34.65598 0 0 0 + 62 21 2 0.4236 7.36412 27.37987 33.77752 0 0 0 + 63 21 2 0.4236 7.83650 27.18529 35.32848 0 0 0 + 64 22 1 -0.8472 9.58199 8.75878 28.38767 0 0 0 + 65 22 2 0.4236 8.89931 8.96106 27.68557 0 0 0 + 66 22 2 0.4236 9.61451 9.50981 29.04713 0 0 0 + 67 23 1 -0.8472 18.15447 7.97877 4.02967 1 0 0 + 68 23 2 0.4236 17.65379 8.02465 3.16529 1 0 0 + 69 23 2 0.4236 17.56073 7.59903 4.73904 1 0 0 + 70 24 1 -0.8472 13.45467 10.30195 21.94603 0 0 0 + 71 24 2 0.4236 14.12655 11.01716 21.75366 0 0 0 + 72 24 2 0.4236 13.15542 10.37304 22.89754 0 0 0 + 73 25 1 -0.8472 28.77370 1.83495 6.23711 0 0 0 + 74 25 2 0.4236 29.55410 1.23316 6.06742 0 0 0 + 75 25 2 0.4236 28.43863 1.69170 7.16831 0 0 0 + 76 26 1 -0.8472 21.17410 3.00906 4.56251 0 1 0 + 77 26 2 0.4236 21.00772 2.96011 5.54734 0 1 0 + 78 26 2 0.4236 21.17488 3.96581 4.27178 0 1 0 + 79 27 1 -0.8472 15.86257 20.77629 10.34675 1 -1 0 + 80 27 2 0.4236 15.84751 19.99231 10.96732 1 -1 0 + 81 27 2 0.4236 15.76759 20.45695 9.40393 1 -1 0 + 82 28 1 -0.8472 19.37283 6.41248 28.33230 0 0 0 + 83 28 2 0.4236 19.86925 6.14505 27.50645 0 0 0 + 84 28 2 0.4236 19.23659 7.40311 28.33322 0 0 0 + 85 29 1 -0.8472 19.69874 26.80111 22.56675 -1 -1 0 + 86 29 2 0.4236 20.51873 26.54536 22.05471 -1 -1 0 + 87 29 2 0.4236 19.52519 26.12131 23.27927 -1 -1 0 + 88 30 1 -0.8472 10.44934 1.95847 4.23874 1 1 0 + 89 30 2 0.4236 10.99436 1.49085 4.93460 1 1 0 + 90 30 2 0.4236 10.84502 2.85816 4.05448 1 1 0 + 91 31 1 -0.8472 6.35411 29.19722 23.17920 0 0 0 + 92 31 2 0.4236 5.50252 29.65394 23.43641 0 0 0 + 93 31 2 0.4236 7.01350 29.87731 22.85887 0 0 0 + 94 32 1 -0.8472 27.70305 33.63868 1.45545 0 0 0 + 95 32 2 0.4236 27.45511 34.56848 1.72731 0 0 0 + 96 32 2 0.4236 28.23820 33.21008 2.18338 0 0 0 + 97 33 1 -0.8472 34.54150 25.90721 10.97268 0 0 0 + 98 33 2 0.4236 34.26945 25.07242 10.49403 0 0 0 + 99 33 2 0.4236 34.74630 26.62266 10.30478 0 0 0 + 100 34 1 -0.8472 35.13701 10.35159 32.75388 -1 0 0 + 101 34 2 0.4236 35.31674 9.89658 31.88174 -1 0 0 + 102 34 2 0.4236 35.40693 9.74994 33.50557 -1 0 0 + 103 35 1 -0.8472 19.45549 25.22953 13.06888 1 0 0 + 104 35 2 0.4236 18.63554 25.79082 12.95680 1 0 0 + 105 35 2 0.4236 19.57263 24.64638 12.26505 1 0 0 + 106 36 1 -0.8472 8.76637 34.60601 24.20146 0 0 0 + 107 36 2 0.4236 9.50956 34.70873 24.86259 0 0 0 + 108 36 2 0.4236 9.11640 34.17220 23.37125 0 0 0 + 109 37 1 -0.8472 18.52185 34.00287 24.76220 0 0 0 + 110 37 2 0.4236 19.50193 33.87409 24.61123 0 0 0 + 111 37 2 0.4236 18.00811 33.44318 24.11196 0 0 0 + 112 38 1 -0.8472 5.46879 16.75651 12.09359 0 -1 0 + 113 38 2 0.4236 5.19937 17.67659 11.80934 0 -1 0 + 114 38 2 0.4236 5.65240 16.75172 13.07654 0 -1 0 +115 39 1 -0.8472 26.78187 26.54273 35.17124 1 0 0 +116 39 2 0.4236 27.38399 26.93341 0.42029 1 0 1 +117 39 2 0.4236 27.18089 25.69431 34.82353 1 0 0 + 118 40 1 -0.8472 14.04248 15.27305 12.41517 0 0 0 + 119 40 2 0.4236 14.36157 15.76500 13.22517 0 0 0 + 120 40 2 0.4236 14.30963 15.77579 11.59307 0 0 0 + 121 41 1 -0.8472 6.75576 6.34672 6.04938 1 1 0 + 122 41 2 0.4236 7.58170 5.78427 6.08735 1 1 0 + 123 41 2 0.4236 5.98388 5.83092 6.42094 1 1 0 + 124 42 1 -0.8472 10.86576 34.93065 25.98166 0 0 0 + 125 42 2 0.4236 10.69405 35.32452 26.88460 0 0 0 + 126 42 2 0.4236 11.59169 35.44574 25.52591 0 0 0 + 127 43 1 -0.8472 18.34531 30.51202 26.27445 0 0 0 + 128 43 2 0.4236 18.04166 30.29551 25.34662 0 0 0 + 129 43 2 0.4236 19.17552 31.06784 26.23227 0 0 0 + 130 44 1 -0.8472 13.18486 0.77946 20.62491 -1 1 0 + 131 44 2 0.4236 13.44906 0.56426 21.56501 -1 1 0 + 132 44 2 0.4236 12.29152 0.37510 20.42885 -1 1 0 + 133 45 1 -0.8472 24.47790 24.05885 28.20937 -1 0 0 + 134 45 2 0.4236 24.15706 23.14172 27.97301 -1 0 0 + 135 45 2 0.4236 23.74391 24.71952 28.05213 -1 0 0 +136 46 1 -0.8472 30.79103 15.33785 34.86738 0 0 0 +137 46 2 0.4236 31.17614 15.32312 0.34290 0 0 1 +138 46 2 0.4236 29.97833 14.75605 34.83605 0 0 0 + 139 47 1 -0.8472 18.30892 19.76908 34.23734 0 0 0 + 140 47 2 0.4236 17.75981 20.19846 33.52035 0 0 0 + 141 47 2 0.4236 19.04827 19.24096 33.81970 0 0 0 + 142 48 1 -0.8472 24.18923 16.21113 25.53917 0 0 0 + 143 48 2 0.4236 24.35093 17.17602 25.33219 0 0 0 + 144 48 2 0.4236 24.25573 16.06630 26.52637 0 0 0 + 145 49 1 -0.8472 9.29176 8.02479 32.23837 -1 -1 0 + 146 49 2 0.4236 10.25650 7.88688 32.46243 -1 -1 0 + 147 49 2 0.4236 8.95956 7.24816 31.70319 -1 -1 0 + 148 50 1 -0.8472 5.32982 1.15354 27.64551 0 0 0 + 149 50 2 0.4236 4.51900 0.59091 27.48437 0 0 0 + 150 50 2 0.4236 5.05010 2.09452 27.83594 0 0 0 + 151 51 1 -0.8472 22.89850 21.33836 11.63894 1 0 0 + 152 51 2 0.4236 23.24391 20.51986 12.09802 1 0 0 + 153 51 2 0.4236 22.43572 21.07543 10.79239 1 0 0 + 154 52 1 -0.8472 16.88462 32.60779 23.16332 -1 0 0 + 155 52 2 0.4236 15.90624 32.80151 23.09101 -1 0 0 + 156 52 2 0.4236 17.01667 31.65114 23.42276 -1 0 0 + 157 53 1 -0.8472 29.24409 7.09722 23.70701 -1 0 0 + 158 53 2 0.4236 28.47748 7.53121 24.18023 -1 0 0 + 159 53 2 0.4236 29.54220 7.68009 22.95113 -1 0 0 + 160 54 1 -0.8472 34.29952 6.85677 2.08156 -1 0 0 + 161 54 2 0.4236 34.97347 6.89704 1.34390 -1 0 0 + 162 54 2 0.4236 33.70962 7.66305 2.03849 -1 0 0 + 163 55 1 -0.8472 32.95408 29.26891 19.25970 -1 -1 0 + 164 55 2 0.4236 32.57416 28.37248 19.48784 -1 -1 0 + 165 55 2 0.4236 33.66659 29.16225 18.56621 -1 -1 0 + 166 56 1 -0.8472 9.78186 33.73160 21.96701 0 -1 0 + 167 56 2 0.4236 9.24351 33.11436 21.39330 0 -1 0 + 168 56 2 0.4236 10.15276 34.47066 21.40475 0 -1 0 + 169 57 1 -0.8472 7.86139 6.97451 8.72713 0 0 0 + 170 57 2 0.4236 8.16632 6.08021 9.05452 0 0 0 + 171 57 2 0.4236 7.15204 6.85123 8.03315 0 0 0 + 172 58 1 -0.8472 34.25223 27.81706 31.79312 -1 -1 0 + 173 58 2 0.4236 34.70046 28.60821 31.37704 -1 -1 0 + 174 58 2 0.4236 33.75216 28.10807 32.60872 -1 -1 0 + 175 59 1 -0.8472 34.94048 26.84844 19.52041 -1 -1 0 + 176 59 2 0.4236 35.40459 26.00577 19.79339 -1 -1 0 + 177 59 2 0.4236 34.15050 26.62404 18.94986 -1 -1 0 + 178 60 1 -0.8472 21.76411 32.20568 20.89158 0 0 0 + 179 60 2 0.4236 22.66239 31.82480 21.11072 0 0 0 + 180 60 2 0.4236 21.76667 33.18956 21.07031 0 0 0 + 181 61 1 -0.8472 34.30787 3.43694 14.24158 -1 0 0 + 182 61 2 0.4236 34.88829 2.82261 13.70711 -1 0 0 + 183 61 2 0.4236 34.87977 4.10183 14.72200 -1 0 0 + 184 62 1 -0.8472 17.88110 18.91029 14.42187 0 1 0 + 185 62 2 0.4236 17.92538 18.97676 15.41864 0 1 0 + 186 62 2 0.4236 18.59574 19.48109 14.01766 0 1 0 + 187 63 1 -0.8472 19.08402 14.22906 20.78379 0 0 0 + 188 63 2 0.4236 19.62169 13.82628 21.52446 0 0 0 + 189 63 2 0.4236 18.62450 13.50292 20.27246 0 0 0 + 190 64 1 -0.8472 7.85997 17.97828 9.48138 1 0 0 + 191 64 2 0.4236 7.51843 18.85870 9.15243 1 0 0 + 192 64 2 0.4236 8.12328 17.41050 8.70147 1 0 0 + 193 65 1 -0.8472 0.30367 23.18327 0.38100 1 -1 0 + 194 65 2 0.4236 35.34479 24.06840 0.38922 0 -1 0 + 195 65 2 0.4236 35.13158 22.44974 0.42108 0 -1 0 + 196 66 1 -0.8472 4.53675 21.21621 29.86203 1 0 0 + 197 66 2 0.4236 5.08827 22.03780 29.71779 1 0 0 + 198 66 2 0.4236 5.02017 20.59411 30.47781 1 0 0 + 199 67 1 -0.8472 3.76321 1.66558 34.11622 0 0 0 + 200 67 2 0.4236 4.72980 1.83277 33.92193 0 0 0 + 201 67 2 0.4236 3.56027 1.93821 35.05667 0 0 0 + 202 68 1 -0.8472 35.17951 34.70220 7.53093 0 0 0 + 203 68 2 0.4236 34.22070 34.47397 7.36203 0 0 0 + 204 68 2 0.4236 0.09341 33.98533 8.08720 1 0 0 + 205 69 1 -0.8472 24.82000 8.21485 16.09338 0 0 0 + 206 69 2 0.4236 25.55821 8.87272 15.94450 0 0 0 + 207 69 2 0.4236 25.00950 7.68219 16.91816 0 0 0 + 208 70 1 -0.8472 4.18282 28.52828 29.70840 1 0 0 + 209 70 2 0.4236 5.11675 28.38566 30.03614 1 0 0 + 210 70 2 0.4236 4.20438 29.05790 28.86047 1 0 0 + 211 71 1 -0.8472 26.43717 31.27303 3.91741 -1 0 0 + 212 71 2 0.4236 26.51838 30.56852 3.21243 -1 0 0 + 213 71 2 0.4236 27.32007 31.72670 4.03853 -1 0 0 + 214 72 1 -0.8472 35.11244 7.70363 27.08017 -1 0 0 + 215 72 2 0.4236 35.17419 7.38841 28.02717 -1 0 0 + 216 72 2 0.4236 34.54388 7.07077 26.55463 -1 0 0 + 217 73 1 -0.8472 21.45404 34.05655 2.90167 0 0 0 + 218 73 2 0.4236 21.02487 33.76274 3.75574 0 0 0 + 219 73 2 0.4236 22.28101 34.57992 3.10701 0 0 0 + 220 74 1 -0.8472 31.21242 3.31299 25.80396 -1 1 0 + 221 74 2 0.4236 30.72513 4.00625 25.27307 -1 1 0 + 222 74 2 0.4236 31.51511 3.70889 26.67093 -1 1 0 + 223 75 1 -0.8472 7.36998 1.04818 25.83115 0 0 0 + 224 75 2 0.4236 7.49443 0.23812 25.25822 0 0 0 + 225 75 2 0.4236 6.65222 0.87278 26.50493 0 0 0 + 226 76 1 -0.8472 30.34479 6.09271 15.73480 -1 1 0 + 227 76 2 0.4236 30.87025 5.55980 15.07161 -1 1 0 + 228 76 2 0.4236 30.41783 5.66752 16.63693 -1 1 0 + 229 77 1 -0.8472 34.94002 25.15376 32.03668 -1 0 0 + 230 77 2 0.4236 34.65462 24.57426 32.80000 -1 0 0 + 231 77 2 0.4236 34.57715 26.07671 32.16507 -1 0 0 + 232 78 1 -0.8472 0.48609 26.41083 7.95690 1 0 0 + 233 78 2 0.4236 35.24442 26.06137 7.39276 0 0 0 + 234 78 2 0.4236 0.34398 27.38491 8.13268 1 0 0 + 235 79 1 -0.8472 28.55527 15.83548 29.53063 0 0 0 + 236 79 2 0.4236 28.35434 16.81126 29.61648 0 0 0 + 237 79 2 0.4236 29.51472 15.71387 29.27644 0 0 0 + 238 80 1 -0.8472 18.14783 14.69040 4.78991 0 0 0 + 239 80 2 0.4236 18.53030 15.52266 5.19110 0 0 0 + 240 80 2 0.4236 17.28957 14.90833 4.32534 0 0 0 + 241 81 1 -0.8472 23.98866 17.79905 4.00089 0 0 0 + 242 81 2 0.4236 24.91076 17.80239 3.61409 0 0 0 + 243 81 2 0.4236 23.56034 16.91103 3.83379 0 0 0 + 244 82 1 -0.8472 27.78613 18.39989 29.82640 0 0 0 + 245 82 2 0.4236 27.08378 18.93614 30.29448 0 0 0 + 246 82 2 0.4236 28.35313 19.00694 29.26967 0 0 0 + 247 83 1 -0.8472 32.55865 20.99313 23.15964 -1 0 0 + 248 83 2 0.4236 33.14482 20.54010 22.48798 -1 0 0 + 249 83 2 0.4236 32.46068 21.95876 22.91902 -1 0 0 + 250 84 1 -0.8472 0.52838 10.68840 20.51354 1 0 0 + 251 84 2 0.4236 35.18409 10.69540 21.03922 0 0 0 + 252 84 2 0.4236 1.10279 11.45563 20.79882 1 0 0 + 253 85 1 -0.8472 24.98681 7.82783 20.94061 0 0 0 + 254 85 2 0.4236 25.90983 7.94912 20.57557 0 0 0 + 255 85 2 0.4236 24.31734 8.12211 20.25857 0 0 0 + 256 86 1 -0.8472 22.84393 20.12521 4.77949 -1 0 0 + 257 86 2 0.4236 23.21948 19.20137 4.85318 -1 0 0 + 258 86 2 0.4236 23.56755 20.75818 4.50442 -1 0 0 + 259 87 1 -0.8472 33.53546 10.01481 10.45635 0 1 0 + 260 87 2 0.4236 32.83119 9.35450 10.71703 0 1 0 + 261 87 2 0.4236 34.10172 10.22977 11.25204 0 1 0 + 262 88 1 -0.8472 16.00583 10.01890 6.93528 0 0 0 + 263 88 2 0.4236 16.41480 10.74688 6.38507 0 0 0 + 264 88 2 0.4236 15.01766 10.16046 6.99384 0 0 0 + 265 89 1 -0.8472 29.81145 30.32235 24.40624 0 0 0 + 266 89 2 0.4236 29.91989 30.02878 25.35598 0 0 0 + 267 89 2 0.4236 29.93572 29.53794 23.79868 0 0 0 + 268 90 1 -0.8472 4.63663 9.89409 32.09045 0 0 0 + 269 90 2 0.4236 4.00394 9.69969 31.34088 0 0 0 + 270 90 2 0.4236 5.49457 9.40350 31.93817 0 0 0 + 271 91 1 -0.8472 32.85747 18.79237 15.26420 -1 0 0 + 272 91 2 0.4236 33.07562 17.88380 15.62037 -1 0 0 + 273 91 2 0.4236 33.39393 19.47988 15.75358 -1 0 0 + 274 92 1 -0.8472 0.61908 7.95150 15.25321 1 1 0 + 275 92 2 0.4236 0.05994 7.85361 16.07647 1 1 0 + 276 92 2 0.4236 35.53017 8.04513 14.45519 0 1 0 + 277 93 1 -0.8472 2.41100 1.86682 23.94422 0 0 0 + 278 93 2 0.4236 2.46310 1.85101 22.94575 0 0 0 + 279 93 2 0.4236 2.78298 1.01413 24.31096 0 0 0 + 280 94 1 -0.8472 35.13183 4.79424 16.91501 0 1 0 + 281 94 2 0.4236 34.79462 5.73186 16.83068 0 1 0 + 282 94 2 0.4236 34.48810 4.25622 17.45916 0 1 0 + 283 95 1 -0.8472 0.97118 31.04426 15.17959 1 0 0 + 284 95 2 0.4236 35.51597 31.29963 15.28033 0 0 0 + 285 95 2 0.4236 1.24465 30.46576 15.94801 1 0 0 + 286 96 1 -0.8472 2.19969 4.72227 17.02777 0 0 0 + 287 96 2 0.4236 2.38681 5.64899 17.35356 0 0 0 + 288 96 2 0.4236 1.21985 4.62094 16.85574 0 0 0 + 289 97 1 -0.8472 11.32464 9.43507 18.23393 0 0 0 + 290 97 2 0.4236 11.35628 9.66113 17.26037 0 0 0 + 291 97 2 0.4236 10.41863 9.65219 18.59726 0 0 0 + 292 98 1 -0.8472 1.17633 29.87451 2.30651 1 -1 0 + 293 98 2 0.4236 0.77781 30.54458 1.68034 1 -1 0 + 294 98 2 0.4236 2.08692 30.17937 2.58550 1 -1 0 + 295 99 1 -0.8472 30.89603 1.46693 1.97982 -1 0 0 + 296 99 2 0.4236 31.66382 1.01488 2.43382 -1 0 0 + 297 99 2 0.4236 30.67056 0.97609 1.13828 -1 0 0 + 298 100 1 -0.8472 5.03295 1.93998 10.31545 1 0 0 + 299 100 2 0.4236 4.31256 1.98624 11.00745 1 0 0 + 300 100 2 0.4236 4.62804 2.03388 9.40598 1 0 0 + 301 101 1 -0.8472 12.08877 2.72082 8.77105 0 0 0 + 302 101 2 0.4236 11.73932 2.99595 9.66666 0 0 0 + 303 101 2 0.4236 12.21940 3.53177 8.20074 0 0 0 + 304 102 1 -0.8472 33.01497 6.97472 32.69727 0 1 0 + 305 102 2 0.4236 32.33382 6.98790 31.96528 0 1 0 + 306 102 2 0.4236 33.92894 7.07439 32.30391 0 1 0 + 307 103 1 -0.8472 24.19758 6.71414 6.62083 0 0 0 + 308 103 2 0.4236 24.48496 5.94255 6.05339 0 0 0 + 309 103 2 0.4236 23.34354 7.09140 6.26267 0 0 0 + 310 104 1 -0.8472 11.20786 33.66002 13.73986 0 0 0 + 311 104 2 0.4236 11.08611 33.96434 12.79516 0 0 0 + 312 104 2 0.4236 12.16057 33.79345 14.01284 0 0 0 + 313 105 1 -0.8472 9.04560 20.24739 13.13311 0 0 0 + 314 105 2 0.4236 8.82766 19.47789 13.73338 0 0 0 + 315 105 2 0.4236 9.27855 19.90464 12.22304 0 0 0 + 316 106 1 -0.8472 8.42921 16.29486 7.43324 1 0 0 + 317 106 2 0.4236 9.19124 15.72058 7.13424 1 0 0 + 318 106 2 0.4236 7.64285 15.71749 7.65276 1 0 0 + 319 107 1 -0.8472 8.18016 30.95703 14.07257 0 -1 0 + 320 107 2 0.4236 7.61764 30.47123 14.74149 0 -1 0 + 321 107 2 0.4236 7.67505 31.74583 13.72246 0 -1 0 + 322 108 1 -0.8472 17.76414 27.72204 30.17860 -1 0 0 + 323 108 2 0.4236 17.65280 28.63562 29.78755 -1 0 0 + 324 108 2 0.4236 17.44856 27.72492 31.12746 -1 0 0 + 325 109 1 -0.8472 17.45769 25.85512 16.78307 0 1 0 + 326 109 2 0.4236 18.01645 26.62724 17.08576 0 1 0 + 327 109 2 0.4236 17.96426 25.00368 16.91877 0 1 0 + 328 110 1 -0.8472 28.59997 12.45467 18.30443 0 0 0 + 329 110 2 0.4236 28.86886 12.50061 17.34240 0 0 0 + 330 110 2 0.4236 28.32838 13.36441 18.61842 0 0 0 + 331 111 1 -0.8472 20.03964 19.60707 21.61488 0 -1 0 + 332 111 2 0.4236 19.21429 19.35873 22.12192 0 -1 0 + 333 111 2 0.4236 20.56705 20.27317 22.14227 0 -1 0 + 334 112 1 -0.8472 24.43021 31.08112 15.27434 0 0 0 + 335 112 2 0.4236 24.67230 31.05676 14.30439 0 0 0 + 336 112 2 0.4236 23.62159 31.65540 15.40173 0 0 0 + 337 113 1 -0.8472 14.03481 4.28377 28.23021 0 1 0 + 338 113 2 0.4236 13.71830 5.06061 27.68592 0 1 0 + 339 113 2 0.4236 14.81307 3.85222 27.77408 0 1 0 + 340 114 1 -0.8472 3.18866 1.92022 1.25228 0 1 0 + 341 114 2 0.4236 3.95739 2.04883 1.87873 0 1 0 + 342 114 2 0.4236 2.56934 1.22782 1.62238 0 1 0 + 343 115 1 -0.8472 22.54465 23.60224 9.46826 0 0 0 + 344 115 2 0.4236 22.81528 22.78339 8.96211 0 0 0 + 345 115 2 0.4236 23.34546 23.99391 9.92131 0 0 0 + 346 116 1 -0.8472 6.44525 3.02083 18.87605 1 0 0 + 347 116 2 0.4236 5.96940 2.76314 19.71693 1 0 0 + 348 116 2 0.4236 5.93293 2.68338 18.08636 1 0 0 + 349 117 1 -0.8472 12.31665 10.94306 26.18378 0 0 0 + 350 117 2 0.4236 11.78278 11.60820 26.70581 0 0 0 + 351 117 2 0.4236 12.52820 10.15648 26.76387 0 0 0 + 352 118 1 -0.8472 8.93649 1.70958 18.81431 -1 0 0 + 353 118 2 0.4236 9.43794 2.41836 19.31046 -1 0 0 + 354 118 2 0.4236 8.03395 2.05639 18.55926 -1 0 0 + 355 119 1 -0.8472 2.23387 20.21809 0.67571 0 0 0 + 356 119 2 0.4236 1.96454 19.32973 0.30400 0 0 0 + 357 119 2 0.4236 1.48917 20.87294 0.54693 0 0 0 + 358 120 1 -0.8472 32.34699 18.13646 22.38224 0 0 0 + 359 120 2 0.4236 31.75911 18.90777 22.62608 0 0 0 + 360 120 2 0.4236 32.85409 17.83551 23.18984 0 0 0 + 361 121 1 -0.8472 20.24600 32.09543 18.49475 -1 0 0 + 362 121 2 0.4236 19.37450 32.56379 18.64008 -1 0 0 + 363 121 2 0.4236 20.82295 32.20632 19.30394 -1 0 0 + 364 122 1 -0.8472 32.44396 13.48495 19.54721 0 0 0 + 365 122 2 0.4236 32.49225 14.27437 20.15914 0 0 0 + 366 122 2 0.4236 31.99587 13.75157 18.69393 0 0 0 + 367 123 1 -0.8472 35.26586 18.21614 1.39574 -1 0 0 + 368 123 2 0.4236 0.12239 18.40827 2.30752 0 0 0 + 369 123 2 0.4236 34.49009 17.58963 1.47095 -1 0 0 + 370 124 1 -0.8472 3.39252 26.43728 7.35930 0 1 0 + 371 124 2 0.4236 2.42858 26.42070 7.62480 0 1 0 + 372 124 2 0.4236 3.52347 25.87316 6.54412 0 1 0 + 373 125 1 -0.8472 15.94721 21.75698 15.77077 0 0 0 + 374 125 2 0.4236 16.58200 22.15497 15.10848 0 0 0 + 375 125 2 0.4236 15.22931 21.25758 15.28582 0 0 0 + 376 126 1 -0.8472 20.49377 23.57178 7.41254 0 0 0 + 377 126 2 0.4236 19.70411 23.45223 8.01425 0 0 0 + 378 126 2 0.4236 21.29088 23.83328 7.95669 0 0 0 + 379 127 1 -0.8472 6.64565 4.33685 1.91046 0 1 0 + 380 127 2 0.4236 6.29368 4.91344 1.17318 0 1 0 + 381 127 2 0.4236 7.51811 4.70392 2.23304 0 1 0 + 382 128 1 -0.8472 26.70656 32.89276 9.89051 1 0 0 + 383 128 2 0.4236 26.59749 31.89883 9.88051 1 0 0 + 384 128 2 0.4236 27.36144 33.14912 10.60140 1 0 0 + 385 129 1 -0.8472 5.48704 32.63030 12.93174 0 -1 0 + 386 129 2 0.4236 5.73825 33.49250 13.37160 0 -1 0 + 387 129 2 0.4236 4.53739 32.40792 13.15229 0 -1 0 + 388 130 1 -0.8472 3.37091 5.95470 9.99334 1 1 0 + 389 130 2 0.4236 3.99627 6.57052 10.47252 1 1 0 + 390 130 2 0.4236 3.39679 5.05241 10.42360 1 1 0 + 391 131 1 -0.8472 2.63445 9.37840 30.00842 1 0 0 + 392 131 2 0.4236 2.81625 9.87705 29.16095 1 0 0 + 393 131 2 0.4236 1.69314 9.04098 30.00123 1 0 0 + 394 132 1 -0.8472 0.97785 8.01694 8.99862 1 1 0 + 395 132 2 0.4236 1.85940 8.12605 8.53940 1 1 0 + 396 132 2 0.4236 0.38758 8.79268 8.77566 1 1 0 + 397 133 1 -0.8472 2.73822 11.52983 15.38585 1 1 0 + 398 133 2 0.4236 3.54689 11.84375 15.88332 1 1 0 + 399 133 2 0.4236 2.92713 10.64019 14.97013 1 1 0 + 400 134 1 -0.8472 18.35568 23.16903 17.37047 0 0 0 + 401 134 2 0.4236 17.78374 22.43717 17.00005 0 0 0 + 402 134 2 0.4236 19.06840 23.40230 16.70899 0 0 0 + 403 135 1 -0.8472 9.13053 4.89654 5.72398 1 1 0 + 404 135 2 0.4236 9.75352 5.64004 5.96693 1 1 0 + 405 135 2 0.4236 9.45310 4.04375 6.13467 1 1 0 + 406 136 1 -0.8472 7.31448 35.35133 12.86442 0 0 0 + 407 136 2 0.4236 7.78778 35.16424 13.72519 0 0 0 + 408 136 2 0.4236 6.36291 0.08760 13.05321 0 1 0 + 409 137 1 -0.8472 0.52118 24.39975 19.66486 0 -1 0 + 410 137 2 0.4236 0.83476 23.57085 20.12801 0 -1 0 + 411 137 2 0.4236 0.24832 24.17585 18.72923 0 -1 0 + 412 138 1 -0.8472 11.64306 23.42080 11.52906 0 0 0 + 413 138 2 0.4236 12.61679 23.64677 11.50116 0 0 0 + 414 138 2 0.4236 11.14825 24.13853 12.01894 0 0 0 + 415 139 1 -0.8472 3.45756 3.18529 19.12957 0 0 0 + 416 139 2 0.4236 3.12124 3.74194 18.36997 0 0 0 + 417 139 2 0.4236 3.81274 3.78249 19.84869 0 0 0 + 418 140 1 -0.8472 20.63306 31.64067 26.89364 0 0 0 + 419 140 2 0.4236 21.22839 31.75801 26.09881 0 0 0 + 420 140 2 0.4236 20.82429 32.35914 27.56232 0 0 0 + 421 141 1 -0.8472 27.87238 20.32866 9.33395 0 0 0 + 422 141 2 0.4236 27.02686 20.77238 9.03698 0 0 0 + 423 141 2 0.4236 27.66058 19.63412 10.02149 0 0 0 + 424 142 1 -0.8472 31.29036 11.93464 0.40169 -1 0 0 + 425 142 2 0.4236 31.37881 12.03516 1.39266 -1 0 0 + 426 142 2 0.4236 30.32288 11.95452 0.14970 -1 0 0 + 427 143 1 -0.8472 21.39492 7.42434 2.71837 0 0 0 + 428 143 2 0.4236 22.26919 6.94124 2.67113 0 0 0 + 429 143 2 0.4236 21.01752 7.34108 3.64064 0 0 0 + 430 144 1 -0.8472 20.01912 19.53687 17.16647 0 0 0 + 431 144 2 0.4236 19.03559 19.42765 17.02256 0 0 0 + 432 144 2 0.4236 20.17677 20.10021 17.97747 0 0 0 + 433 145 1 -0.8472 3.61472 34.67433 24.72232 0 -1 0 + 434 145 2 0.4236 3.58465 34.54040 25.71283 0 -1 0 + 435 145 2 0.4236 4.55220 34.54959 24.39742 0 -1 0 + 436 146 1 -0.8472 23.41665 19.55686 18.89810 -1 -1 0 + 437 146 2 0.4236 24.10125 19.00406 18.42300 -1 -1 0 + 438 146 2 0.4236 22.99870 20.19654 18.25307 -1 -1 0 + 439 147 1 -0.8472 13.01993 3.81803 4.38911 1 0 0 + 440 147 2 0.4236 13.38071 3.06814 3.83464 1 0 0 + 441 147 2 0.4236 12.92360 4.63574 3.82163 1 0 0 + 442 148 1 -0.8472 15.28417 28.36986 13.07087 0 -1 0 + 443 148 2 0.4236 15.75033 28.86687 12.33902 0 -1 0 + 444 148 2 0.4236 14.37943 28.08353 12.75556 0 -1 0 + 445 149 1 -0.8472 31.07288 4.64018 29.64410 -1 1 0 + 446 149 2 0.4236 30.89042 5.35240 30.32192 -1 1 0 + 447 149 2 0.4236 31.28496 5.06438 28.76373 -1 1 0 + 448 150 1 -0.8472 18.66998 22.71969 9.28241 0 0 0 + 449 150 2 0.4236 19.43319 22.68014 9.92730 0 0 0 + 450 150 2 0.4236 18.18674 21.84425 9.28383 0 0 0 + 451 151 1 -0.8472 20.67684 4.79499 26.44460 0 0 0 + 452 151 2 0.4236 21.36307 4.90680 25.72591 0 0 0 + 453 151 2 0.4236 19.86562 4.35059 26.06464 0 0 0 + 454 152 1 -0.8472 23.32494 28.59379 34.87592 1 0 0 + 455 152 2 0.4236 22.34422 28.77672 34.80776 1 0 0 + 456 152 2 0.4236 23.47151 27.61801 35.03820 1 0 0 + 457 153 1 -0.8472 19.30434 32.15966 13.01468 0 -1 0 + 458 153 2 0.4236 18.79685 32.17514 13.87616 0 -1 0 + 459 153 2 0.4236 19.74774 33.04469 12.87307 0 -1 0 +460 154 1 -0.8472 34.76355 20.49891 35.24394 -1 0 0 +461 154 2 0.4236 34.80087 20.22981 34.28158 -1 0 0 +462 154 2 0.4236 34.89670 19.69303 0.37358 -1 0 1 + 463 155 1 -0.8472 13.98652 1.37155 3.23039 0 0 0 + 464 155 2 0.4236 13.54990 0.47234 3.25696 0 0 0 + 465 155 2 0.4236 14.88021 1.32142 3.67626 0 0 0 + 466 156 1 -0.8472 24.96125 8.59168 8.51399 0 1 0 + 467 156 2 0.4236 24.90010 7.88536 7.80880 0 1 0 + 468 156 2 0.4236 25.92109 8.74798 8.74688 0 1 0 + 469 157 1 -0.8472 14.17804 14.86661 29.62017 0 1 0 + 470 157 2 0.4236 14.50622 13.96710 29.90836 0 1 0 + 471 157 2 0.4236 13.20875 14.80710 29.38165 0 1 0 + 472 158 1 -0.8472 32.49214 9.01293 2.57301 0 0 0 + 473 158 2 0.4236 31.88516 8.85624 3.35211 0 0 0 + 474 158 2 0.4236 32.99481 9.86668 2.70850 0 0 0 + 475 159 1 -0.8472 33.47883 32.17624 27.46842 0 -1 0 + 476 159 2 0.4236 33.32942 32.21278 28.45647 0 -1 0 + 477 159 2 0.4236 34.06965 31.39983 27.24918 0 -1 0 +478 160 1 -0.8472 31.09621 6.22320 0.75259 0 0 0 +479 160 2 0.4236 31.59348 5.78768 35.44946 0 0 -1 +480 160 2 0.4236 31.36134 7.18545 0.81397 0 0 0 + 481 161 1 -0.8472 14.57216 18.78960 19.08835 1 1 0 + 482 161 2 0.4236 15.51077 18.79497 19.43321 1 1 0 + 483 161 2 0.4236 14.22722 17.85110 19.07534 1 1 0 +484 162 1 -0.8472 34.12274 15.77227 34.76104 0 0 0 +485 162 2 0.4236 34.17490 15.19579 0.12925 0 0 1 +486 162 2 0.4236 33.34160 16.39158 34.84009 0 0 0 + 487 163 1 -0.8472 27.18476 6.31416 11.14438 0 0 0 + 488 163 2 0.4236 27.19357 6.88440 10.32300 0 0 0 + 489 163 2 0.4236 26.82710 6.84346 11.91376 0 0 0 +490 164 1 -0.8472 11.84314 26.77963 35.28640 1 -1 0 +491 164 2 0.4236 10.96567 26.43433 0.17205 1 -1 1 +492 164 2 0.4236 12.49337 26.82363 0.59765 1 -1 1 + 493 165 1 -0.8472 7.69412 20.72079 27.49780 0 0 0 + 494 165 2 0.4236 7.69014 21.70350 27.31291 0 0 0 + 495 165 2 0.4236 7.81598 20.22083 26.64044 0 0 0 + 496 166 1 -0.8472 23.50826 8.78434 32.03012 0 1 0 + 497 166 2 0.4236 23.26862 8.22923 31.23365 0 1 0 + 498 166 2 0.4236 23.39645 8.24013 32.86157 0 1 0 + 499 167 1 -0.8472 15.57156 13.00008 12.60169 -1 1 0 + 500 167 2 0.4236 14.79081 13.54649 12.90466 -1 1 0 + 501 167 2 0.4236 15.45716 12.76130 11.63738 -1 1 0 + 502 168 1 -0.8472 11.29876 27.92926 8.68449 0 0 0 + 503 168 2 0.4236 11.64644 27.07029 8.30868 0 0 0 + 504 168 2 0.4236 11.27909 28.62394 7.96544 0 0 0 + 505 169 1 -0.8472 15.75868 14.55512 3.49819 0 0 0 + 506 169 2 0.4236 16.03520 15.14903 2.74271 0 0 0 + 507 169 2 0.4236 15.61473 13.62638 3.15656 0 0 0 + 508 170 1 -0.8472 29.04153 26.88438 19.85085 0 -1 0 + 509 170 2 0.4236 28.56574 26.75357 18.98108 0 -1 0 + 510 170 2 0.4236 28.97499 27.84337 20.12624 0 -1 0 + 511 171 1 -0.8472 28.02811 8.84491 0.36833 0 1 0 + 512 171 2 0.4236 29.02395 8.89761 0.29466 0 1 0 + 513 171 2 0.4236 27.77104 8.71695 1.32619 0 1 0 + 514 172 1 -0.8472 32.75013 2.39378 21.01859 -1 0 0 + 515 172 2 0.4236 32.14493 1.59871 20.97960 -1 0 0 + 516 172 2 0.4236 33.70131 2.09215 20.95322 -1 0 0 + 517 173 1 -0.8472 16.25250 5.40744 30.72899 -1 0 0 + 518 173 2 0.4236 16.73137 6.28231 30.80113 -1 0 0 + 519 173 2 0.4236 16.60479 4.89842 29.94366 -1 0 0 + 520 174 1 -0.8472 28.57796 22.31517 24.22429 -1 0 0 + 521 174 2 0.4236 28.58470 23.09656 24.84827 -1 0 0 + 522 174 2 0.4236 29.27495 21.65646 24.50755 -1 0 0 + 523 175 1 -0.8472 31.71292 17.98411 9.79888 0 0 0 + 524 175 2 0.4236 32.59827 17.60937 10.07395 0 0 0 + 525 175 2 0.4236 31.02797 17.76528 10.49379 0 0 0 + 526 176 1 -0.8472 28.82118 33.24498 34.59564 0 -1 0 + 527 176 2 0.4236 28.54721 33.97957 33.97493 0 -1 0 + 528 176 2 0.4236 28.33279 33.34188 35.46282 0 -1 0 + 529 177 1 -0.8472 34.60878 19.71536 32.71287 -1 0 0 + 530 177 2 0.4236 34.64592 19.24398 31.83176 -1 0 0 + 531 177 2 0.4236 33.91982 20.43912 32.67487 -1 0 0 + 532 178 1 -0.8472 17.69608 27.65071 3.21742 1 0 0 + 533 178 2 0.4236 18.46713 27.41434 3.80862 1 0 0 + 534 178 2 0.4236 17.78836 28.59848 2.91219 1 0 0 + 535 179 1 -0.8472 26.68813 34.62171 27.49337 -1 0 0 + 536 179 2 0.4236 26.45510 35.44751 28.00690 -1 0 0 + 537 179 2 0.4236 26.59489 34.80084 26.51400 -1 0 0 + 538 180 1 -0.8472 21.33619 26.62475 14.50460 0 0 0 + 539 180 2 0.4236 20.69573 26.16271 13.89115 0 0 0 + 540 180 2 0.4236 22.25918 26.57281 14.12340 0 0 0 + 541 181 1 -0.8472 0.36454 14.16600 2.11556 1 1 0 + 542 181 2 0.4236 0.97624 14.65982 1.49757 1 1 0 + 543 181 2 0.4236 35.11443 13.77344 1.59245 0 1 0 + 544 182 1 -0.8472 23.79319 1.57159 23.81505 0 1 0 + 545 182 2 0.4236 23.00502 1.11432 24.22691 0 1 0 + 546 182 2 0.4236 23.48929 2.12744 23.04135 0 1 0 + 547 183 1 -0.8472 8.54975 33.46239 4.50736 0 0 0 + 548 183 2 0.4236 9.38674 33.19180 4.03176 0 0 0 + 549 183 2 0.4236 7.78193 33.44464 3.86700 0 0 0 + 550 184 1 -0.8472 33.97496 22.17620 28.93863 0 0 0 + 551 184 2 0.4236 33.73550 23.05012 29.36155 0 0 0 + 552 184 2 0.4236 34.53692 22.34106 28.12813 0 0 0 + 553 185 1 -0.8472 14.49504 4.44877 8.81426 0 0 0 + 554 185 2 0.4236 14.11718 4.62743 7.90582 0 0 0 + 555 185 2 0.4236 15.42318 4.81711 8.86750 0 0 0 + 556 186 1 -0.8472 33.79611 24.01791 9.18291 -1 0 0 + 557 186 2 0.4236 33.97006 23.08648 8.86336 -1 0 0 + 558 186 2 0.4236 33.55971 24.59880 8.40407 -1 0 0 + 559 187 1 -0.8472 16.22846 19.00342 12.26604 0 0 0 + 560 187 2 0.4236 16.94871 18.98450 12.95946 0 0 0 + 561 187 2 0.4236 15.35887 18.73631 12.68134 0 0 0 + 562 188 1 -0.8472 31.00840 33.57317 32.25266 -1 -1 0 + 563 188 2 0.4236 30.94716 33.24371 33.19481 -1 -1 0 + 564 188 2 0.4236 30.29274 33.14344 31.70212 -1 -1 0 + 565 189 1 -0.8472 2.10006 7.03828 25.49380 0 -1 0 + 566 189 2 0.4236 1.34846 7.26527 26.11306 0 -1 0 + 567 189 2 0.4236 2.26908 6.05309 25.52187 0 -1 0 +568 190 1 -0.8472 20.39048 7.66788 35.45350 1 1 0 +569 190 2 0.4236 20.32745 7.14917 0.85891 1 1 1 +570 190 2 0.4236 21.31606 7.58937 35.08326 1 1 0 + 571 191 1 -0.8472 29.27392 19.03193 27.68532 -1 0 0 + 572 191 2 0.4236 28.40799 18.61701 27.40610 -1 0 0 + 573 191 2 0.4236 30.00918 18.69729 27.09597 -1 0 0 + 574 192 1 -0.8472 13.93940 22.66146 17.38525 -1 0 0 + 575 192 2 0.4236 14.79020 22.51805 16.87977 -1 0 0 + 576 192 2 0.4236 14.02994 23.46909 17.96790 -1 0 0 + 577 193 1 -0.8472 25.12845 22.92439 17.53845 0 -1 0 + 578 193 2 0.4236 24.27881 22.39854 17.57699 0 -1 0 + 579 193 2 0.4236 25.76341 22.58310 18.23148 0 -1 0 + 580 194 1 -0.8472 14.81424 28.36357 3.79200 0 -1 0 + 581 194 2 0.4236 15.79031 28.28929 3.58772 0 -1 0 + 582 194 2 0.4236 14.69331 28.63885 4.74570 0 -1 0 + 583 195 1 -0.8472 9.41760 1.55572 11.44122 0 0 0 + 584 195 2 0.4236 9.09058 1.02170 12.22084 0 0 0 + 585 195 2 0.4236 9.03168 1.18373 10.59704 0 0 0 + 586 196 1 -0.8472 0.58572 35.29558 12.11489 0 -2 0 + 587 196 2 0.4236 1.04027 34.42603 11.92181 0 -2 0 + 588 196 2 0.4236 35.34646 35.43381 11.46305 -1 -2 0 + 589 197 1 -0.8472 24.99565 27.11368 22.85908 -1 0 0 + 590 197 2 0.4236 24.94466 26.62404 23.72948 -1 0 0 + 591 197 2 0.4236 24.97275 28.09884 23.02901 -1 0 0 + 592 198 1 -0.8472 28.09827 27.08137 14.36745 -1 -1 0 + 593 198 2 0.4236 28.14567 26.09053 14.49365 -1 -1 0 + 594 198 2 0.4236 28.79796 27.36787 13.71303 -1 -1 0 + 595 199 1 -0.8472 29.44158 8.93119 21.38827 0 1 0 + 596 199 2 0.4236 29.92798 9.47643 20.70555 0 1 0 + 597 199 2 0.4236 28.77321 8.34420 20.93150 0 1 0 + 598 200 1 -0.8472 5.82233 14.89623 2.82244 0 0 0 + 599 200 2 0.4236 5.70821 13.97491 3.19408 0 0 0 + 600 200 2 0.4236 5.10567 15.07479 2.14829 0 0 0 + 601 201 1 -0.8472 31.11315 8.01659 27.88429 0 1 0 + 602 201 2 0.4236 31.51235 8.74883 27.33255 0 1 0 + 603 201 2 0.4236 30.79916 7.28065 27.28448 0 1 0 + 604 202 1 -0.8472 24.92095 28.59181 25.96921 0 0 0 + 605 202 2 0.4236 25.90902 28.48362 25.85968 0 0 0 + 606 202 2 0.4236 24.73202 29.09078 26.81495 0 0 0 + 607 203 1 -0.8472 34.86059 10.30036 12.87353 0 0 0 + 608 203 2 0.4236 34.64887 9.32336 12.89739 0 0 0 + 609 203 2 0.4236 34.24783 10.78945 13.49425 0 0 0 + 610 204 1 -0.8472 10.31573 24.57994 6.57007 0 0 0 + 611 204 2 0.4236 9.42999 24.66399 7.02652 0 0 0 + 612 204 2 0.4236 10.17346 24.38675 5.59931 0 0 0 + 613 205 1 -0.8472 4.30063 0.28530 18.84890 0 1 0 + 614 205 2 0.4236 3.76992 0.99348 19.31450 0 1 0 + 615 205 2 0.4236 4.35052 0.49419 17.87226 0 1 0 + 616 206 1 -0.8472 8.41827 15.48929 34.91520 1 1 0 + 617 206 2 0.4236 8.57237 16.15336 34.18361 1 1 0 + 618 206 2 0.4236 8.04251 14.64754 34.52759 1 1 0 + 619 207 1 -0.8472 6.19035 7.54030 24.21894 0 0 0 + 620 207 2 0.4236 5.98782 8.51233 24.33762 0 0 0 + 621 207 2 0.4236 6.98218 7.43584 23.61726 0 0 0 + 622 208 1 -0.8472 1.08041 14.41014 23.75419 -1 0 0 + 623 208 2 0.4236 0.61056 15.08927 23.19030 -1 0 0 + 624 208 2 0.4236 0.47286 13.63227 23.91466 -1 0 0 + 625 209 1 -0.8472 31.67035 8.22586 14.08427 -1 0 0 + 626 209 2 0.4236 31.10235 7.76414 14.76556 -1 0 0 + 627 209 2 0.4236 31.37149 9.17541 13.98941 -1 0 0 + 628 210 1 -0.8472 4.32304 13.16675 34.02448 1 0 0 + 629 210 2 0.4236 4.93961 13.82550 33.59337 1 0 0 + 630 210 2 0.4236 3.51145 13.04635 33.45283 1 0 0 + 631 211 1 -0.8472 22.65976 11.99198 8.47744 0 1 0 + 632 211 2 0.4236 22.58083 11.20406 9.08809 0 1 0 + 633 211 2 0.4236 22.40561 11.72100 7.54908 0 1 0 + 634 212 1 -0.8472 12.56499 8.92537 31.88900 -1 0 0 + 635 212 2 0.4236 12.96543 8.59761 32.74470 -1 0 0 + 636 212 2 0.4236 12.39885 8.14974 31.28016 -1 0 0 + 637 213 1 -0.8472 7.37183 21.64222 6.22392 1 0 0 + 638 213 2 0.4236 7.16919 22.55931 5.88065 1 0 0 + 639 213 2 0.4236 7.30951 20.98418 5.47358 1 0 0 + 640 214 1 -0.8472 27.00762 16.63398 8.08993 -1 0 0 + 641 214 2 0.4236 26.39609 16.89271 8.83762 -1 0 0 + 642 214 2 0.4236 27.41015 15.73918 8.28309 -1 0 0 + 643 215 1 -0.8472 7.19611 3.79417 31.59334 -1 1 0 + 644 215 2 0.4236 7.16103 3.74933 30.59497 -1 1 0 + 645 215 2 0.4236 8.13759 3.95988 31.88666 -1 1 0 + 646 216 1 -0.8472 30.15909 16.21000 7.44433 -1 1 0 + 647 216 2 0.4236 30.11627 17.16629 7.73351 -1 1 0 + 648 216 2 0.4236 29.26380 15.92488 7.10209 -1 1 0 + 649 217 1 -0.8472 10.21667 4.39970 31.89677 1 0 0 + 650 217 2 0.4236 10.61047 4.91898 31.13834 1 0 0 + 651 217 2 0.4236 10.85283 4.40222 32.66827 1 0 0 + 652 218 1 -0.8472 27.50584 28.38786 25.68326 -1 -1 0 + 653 218 2 0.4236 28.38796 27.92670 25.77862 -1 -1 0 + 654 218 2 0.4236 27.53933 29.27126 26.15063 -1 -1 0 + 655 219 1 -0.8472 19.05430 11.89931 31.26655 0 0 0 + 656 219 2 0.4236 18.26304 12.04698 30.67327 0 0 0 + 657 219 2 0.4236 18.74274 11.61302 32.17258 0 0 0 + 658 220 1 -0.8472 3.86618 28.09390 13.01872 0 0 0 + 659 220 2 0.4236 4.51190 27.43345 12.63558 0 0 0 + 660 220 2 0.4236 3.79034 28.88012 12.40552 0 0 0 + 661 221 1 -0.8472 26.59923 23.34113 29.55810 -1 0 0 + 662 221 2 0.4236 25.78847 23.65064 29.06127 -1 0 0 + 663 221 2 0.4236 26.80200 22.39435 29.30823 -1 0 0 + 664 222 1 -0.8472 27.68945 7.40971 19.86110 0 1 0 + 665 222 2 0.4236 27.80506 6.60329 20.44098 0 1 0 + 666 222 2 0.4236 27.26625 7.14029 18.99604 0 1 0 + 667 223 1 -0.8472 20.05157 4.56036 1.84594 1 1 0 + 668 223 2 0.4236 19.09425 4.38304 2.07401 1 1 0 + 669 223 2 0.4236 20.43859 5.20207 2.50804 1 1 0 + 670 224 1 -0.8472 32.60186 15.47413 21.29596 0 0 0 + 671 224 2 0.4236 32.41360 16.44824 21.42099 0 0 0 + 672 224 2 0.4236 32.59763 15.01702 22.18537 0 0 0 + 673 225 1 -0.8472 29.05431 5.06576 32.53287 -1 0 0 + 674 225 2 0.4236 28.15604 4.90289 32.12476 -1 0 0 + 675 225 2 0.4236 28.98490 5.79843 33.20987 -1 0 0 + 676 226 1 -0.8472 18.30583 3.04311 8.64163 0 1 0 + 677 226 2 0.4236 18.05345 4.01062 8.65401 0 1 0 + 678 226 2 0.4236 17.52270 2.49818 8.34211 0 1 0 + 679 227 1 -0.8472 34.73675 1.91251 8.11982 0 0 0 + 680 227 2 0.4236 35.36485 2.28659 7.43753 0 0 0 + 681 227 2 0.4236 34.59568 0.93821 7.94428 0 0 0 + 682 228 1 -0.8472 20.95258 29.30857 14.69084 -1 0 0 + 683 228 2 0.4236 21.18298 28.34078 14.58939 -1 0 0 + 684 228 2 0.4236 19.96366 29.40579 14.80271 -1 0 0 + 685 229 1 -0.8472 31.90522 26.19768 33.54499 -1 -1 0 + 686 229 2 0.4236 32.28670 27.11432 33.42592 -1 -1 0 + 687 229 2 0.4236 31.85789 25.98042 34.51993 -1 -1 0 + 688 230 1 -0.8472 2.97458 9.05586 14.30805 0 1 0 + 689 230 2 0.4236 2.89178 8.93222 13.31921 0 1 0 + 690 230 2 0.4236 2.13650 8.74237 14.75447 0 1 0 + 691 231 1 -0.8472 34.24545 3.69756 9.97076 0 0 0 + 692 231 2 0.4236 34.61539 3.02013 9.33498 0 0 0 + 693 231 2 0.4236 33.24679 3.64650 9.96832 0 0 0 + 694 232 1 -0.8472 19.84819 0.14555 18.90147 0 0 0 + 695 232 2 0.4236 20.70006 0.66545 18.83855 0 0 0 + 696 232 2 0.4236 19.07092 0.77369 18.86563 0 0 0 + 697 233 1 -0.8472 32.25840 30.83726 10.92443 0 -1 0 + 698 233 2 0.4236 32.58236 31.71455 10.57039 0 -1 0 + 699 233 2 0.4236 32.93405 30.46448 11.56043 0 -1 0 + 700 234 1 -0.8472 27.01784 17.94590 11.23453 0 0 0 + 701 234 2 0.4236 26.81191 18.37645 12.11326 0 0 0 + 702 234 2 0.4236 28.00904 17.89236 11.11376 0 0 0 + 703 235 1 -0.8472 20.22992 35.23458 14.58694 0 -1 0 + 704 235 2 0.4236 20.57845 34.95937 13.69095 0 -1 0 + 705 235 2 0.4236 20.52427 34.57303 15.27660 0 -1 0 + 706 236 1 -0.8472 28.13686 28.87373 1.33657 -1 -1 0 + 707 236 2 0.4236 27.46398 29.26717 0.71018 -1 -1 0 + 708 236 2 0.4236 28.92013 28.53560 0.81488 -1 -1 0 + 709 237 1 -0.8472 19.05398 9.09800 19.78995 0 0 0 + 710 237 2 0.4236 18.05441 9.10305 19.81771 0 0 0 + 711 237 2 0.4236 19.38916 10.03413 19.68354 0 0 0 + 712 238 1 -0.8472 28.90831 11.67910 7.13534 -1 0 0 + 713 238 2 0.4236 29.80783 11.81981 6.72185 -1 0 0 + 714 238 2 0.4236 28.34177 11.12904 6.52182 -1 0 0 + 715 239 1 -0.8472 15.67854 27.80087 20.40915 1 -1 0 + 716 239 2 0.4236 15.96525 28.55811 19.82235 1 -1 0 + 717 239 2 0.4236 16.44143 27.16584 20.53048 1 -1 0 + 718 240 1 -0.8472 11.47125 8.69000 1.78828 0 0 0 + 719 240 2 0.4236 10.66305 9.18052 2.11417 0 0 0 + 720 240 2 0.4236 11.21383 8.08927 1.03142 0 0 0 + 721 241 1 -0.8472 35.28908 10.28448 26.21504 -1 0 0 + 722 241 2 0.4236 35.21125 9.44014 26.74512 -1 0 0 + 723 241 2 0.4236 0.39578 10.91856 26.68628 0 0 0 + 724 242 1 -0.8472 15.12386 29.33502 22.69833 1 1 0 + 725 242 2 0.4236 14.19377 29.70191 22.71562 1 1 0 + 726 242 2 0.4236 15.21039 28.68142 21.94649 1 1 0 + 727 243 1 -0.8472 26.35331 6.84545 25.17133 0 0 0 + 728 243 2 0.4236 25.98539 7.64249 24.69244 0 0 0 + 729 243 2 0.4236 26.23230 6.03072 24.60432 0 0 0 + 730 244 1 -0.8472 17.87784 33.07860 31.33496 1 -1 0 + 731 244 2 0.4236 18.25637 33.78489 30.73679 1 -1 0 + 732 244 2 0.4236 17.58626 33.49307 32.19700 1 -1 0 + 733 245 1 -0.8472 3.45206 32.22567 21.06903 0 -1 0 + 734 245 2 0.4236 2.96341 32.50549 20.24269 0 -1 0 + 735 245 2 0.4236 3.44745 32.97659 21.72938 0 -1 0 + 736 246 1 -0.8472 34.68849 28.24157 9.56684 0 0 0 + 737 246 2 0.4236 33.83286 28.24004 9.04931 0 0 0 + 738 246 2 0.4236 35.06650 29.16719 9.58322 0 0 0 + 739 247 1 -0.8472 11.83632 33.77069 34.97656 0 0 0 + 740 247 2 0.4236 12.77309 33.76721 34.62670 0 0 0 + 741 247 2 0.4236 11.57656 32.84252 35.24295 0 0 0 + 742 248 1 -0.8472 27.98976 23.64368 17.28664 -1 0 0 + 743 248 2 0.4236 27.31344 24.27555 17.66514 -1 0 0 + 744 248 2 0.4236 27.85693 22.73581 17.68425 -1 0 0 +745 249 1 -0.8472 30.21555 28.59820 35.32079 -1 0 0 +746 249 2 0.4236 31.13658 28.35743 0.17971 -1 0 1 +747 249 2 0.4236 30.14340 28.45205 34.33419 -1 0 0 + 748 250 1 -0.8472 21.89279 27.37113 7.14605 0 0 0 + 749 250 2 0.4236 22.43085 28.04298 7.65503 0 0 0 + 750 250 2 0.4236 22.50662 26.70858 6.71689 0 0 0 + 751 251 1 -0.8472 1.75662 32.96857 9.67410 0 -1 0 + 752 251 2 0.4236 2.22776 33.08964 8.80040 0 -1 0 + 753 251 2 0.4236 2.24821 33.46509 10.38946 0 -1 0 + 754 252 1 -0.8472 0.21094 25.70035 3.19371 1 -1 0 + 755 252 2 0.4236 0.74244 26.43217 3.62019 1 -1 0 + 756 252 2 0.4236 0.80652 24.91764 3.01303 1 -1 0 + 757 253 1 -0.8472 13.89378 31.51483 7.21453 0 0 0 + 758 253 2 0.4236 14.54187 30.75755 7.13407 0 0 0 + 759 253 2 0.4236 13.61470 31.81312 6.30180 0 0 0 + 760 254 1 -0.8472 1.19622 17.23496 10.17207 1 0 0 + 761 254 2 0.4236 1.84313 16.48876 10.32903 1 0 0 + 762 254 2 0.4236 1.44494 17.72104 9.33431 1 0 0 + 763 255 1 -0.8472 26.39631 29.97190 16.79257 0 0 0 + 764 255 2 0.4236 25.56003 30.21629 16.30184 0 0 0 + 765 255 2 0.4236 27.09337 30.67060 16.63179 0 0 0 + 766 256 1 -0.8472 6.05191 32.39660 30.18509 0 0 0 + 767 256 2 0.4236 6.81186 32.75954 30.72424 0 0 0 + 768 256 2 0.4236 6.40726 31.96924 29.35378 0 0 0 + 769 257 1 -0.8472 26.10814 21.66842 1.29484 -1 0 0 + 770 257 2 0.4236 25.67123 21.86200 2.17324 -1 0 0 + 771 257 2 0.4236 25.60231 22.12525 0.56313 -1 0 0 + 772 258 1 -0.8472 17.44295 21.30487 6.11779 0 0 0 + 773 258 2 0.4236 17.34023 22.27327 6.34498 0 0 0 + 774 258 2 0.4236 17.42293 21.19161 5.12446 0 0 0 + 775 259 1 -0.8472 28.41502 27.09376 17.12429 0 0 0 + 776 259 2 0.4236 29.35136 27.32828 16.86315 0 0 0 + 777 259 2 0.4236 27.82586 27.12578 16.31691 0 0 0 + 778 260 1 -0.8472 31.30417 34.71417 13.44331 0 -1 0 + 779 260 2 0.4236 30.92816 34.87480 14.35586 0 -1 0 + 780 260 2 0.4236 31.33151 33.73110 13.26235 0 -1 0 + 781 261 1 -0.8472 17.83189 30.37504 2.80681 1 0 0 + 782 261 2 0.4236 18.77927 30.61759 2.59797 1 0 0 + 783 261 2 0.4236 17.21440 30.96079 2.28189 1 0 0 + 784 262 1 -0.8472 21.21362 4.88439 14.56061 0 0 0 + 785 262 2 0.4236 21.28865 5.64522 15.20511 0 0 0 + 786 262 2 0.4236 20.95119 5.23403 13.66124 0 0 0 + 787 263 1 -0.8472 2.58160 4.47678 29.57948 0 0 0 + 788 263 2 0.4236 1.78431 3.98285 29.23263 0 0 0 + 789 263 2 0.4236 3.10038 3.88258 30.19406 0 0 0 + 790 264 1 -0.8472 13.99926 19.82145 25.19090 0 0 0 + 791 264 2 0.4236 13.52302 20.12052 26.01778 0 0 0 + 792 264 2 0.4236 14.97235 20.03772 25.27009 0 0 0 + 793 265 1 -0.8472 31.23575 21.27430 20.21443 0 0 0 + 794 265 2 0.4236 30.98824 22.03691 19.61687 0 0 0 + 795 265 2 0.4236 31.77445 21.61562 20.98467 0 0 0 + 796 266 1 -0.8472 5.98967 23.61218 29.50507 0 0 0 + 797 266 2 0.4236 6.97700 23.45436 29.48877 0 0 0 + 798 266 2 0.4236 5.74003 24.23844 28.76653 0 0 0 + 799 267 1 -0.8472 34.97950 3.70445 28.21894 -1 0 0 + 800 267 2 0.4236 34.34909 2.94118 28.07776 -1 0 0 + 801 267 2 0.4236 0.32312 3.53113 27.72144 0 0 0 + 802 268 1 -0.8472 23.90763 26.40710 10.43250 0 0 0 + 803 268 2 0.4236 23.14485 27.05044 10.49733 0 0 0 + 804 268 2 0.4236 24.63427 26.80687 9.87378 0 0 0 + 805 269 1 -0.8472 24.66360 14.21401 8.75088 -1 1 0 + 806 269 2 0.4236 25.55807 13.80139 8.57868 -1 1 0 + 807 269 2 0.4236 23.94424 13.56083 8.51463 -1 1 0 + 808 270 1 -0.8472 26.76202 32.32885 18.59478 -1 -1 0 + 809 270 2 0.4236 27.04977 33.25283 18.34289 -1 -1 0 + 810 270 2 0.4236 25.76632 32.26114 18.53211 -1 -1 0 + 811 271 1 -0.8472 15.81595 4.45782 25.29065 0 0 0 + 812 271 2 0.4236 15.00012 4.36334 24.72016 0 0 0 + 813 271 2 0.4236 16.07252 5.42260 25.34818 0 0 0 + 814 272 1 -0.8472 19.18223 10.06356 23.18200 0 0 0 + 815 272 2 0.4236 18.80611 10.71294 23.84292 0 0 0 + 816 272 2 0.4236 20.15560 10.24987 23.04858 0 0 0 + 817 273 1 -0.8472 16.92076 8.80930 1.39624 0 0 0 + 818 273 2 0.4236 17.48546 8.47710 0.64076 0 0 0 + 819 273 2 0.4236 16.01226 8.39523 1.34044 0 0 0 + 820 274 1 -0.8472 22.40156 16.29663 33.08332 0 -1 0 + 821 274 2 0.4236 21.63917 15.71905 32.79159 0 -1 0 + 822 274 2 0.4236 22.94970 15.80750 33.76171 0 -1 0 + 823 275 1 -0.8472 8.68261 34.48827 6.98529 1 0 0 + 824 275 2 0.4236 9.60677 34.43356 7.36327 1 0 0 + 825 275 2 0.4236 8.71088 34.28969 6.00564 1 0 0 + 826 276 1 -0.8472 23.95137 6.80440 13.70629 0 -1 0 + 827 276 2 0.4236 24.01394 5.80664 13.68403 0 -1 0 + 828 276 2 0.4236 24.04121 7.12303 14.64986 0 -1 0 + 829 277 1 -0.8472 9.01439 30.12792 34.41532 0 0 0 + 830 277 2 0.4236 8.30096 29.42784 34.38629 0 0 0 + 831 277 2 0.4236 9.71944 29.91353 33.73938 0 0 0 + 832 278 1 -0.8472 26.45031 33.55297 7.08366 -1 -1 0 + 833 278 2 0.4236 25.78208 32.93952 6.66283 -1 -1 0 + 834 278 2 0.4236 26.50126 33.36762 8.06498 -1 -1 0 + 835 279 1 -0.8472 30.88800 23.18806 18.39688 0 0 0 + 836 279 2 0.4236 29.93334 23.24008 18.10384 0 0 0 + 837 279 2 0.4236 31.48270 23.16839 17.59322 0 0 0 +838 280 1 -0.8472 10.52809 12.54265 34.90389 0 0 0 +839 280 2 0.4236 11.44533 12.14846 34.96061 0 0 0 +840 280 2 0.4236 10.46670 13.33299 0.06628 0 0 1 + 841 281 1 -0.8472 3.63801 19.43628 9.70987 1 0 0 + 842 281 2 0.4236 2.97661 19.22892 8.98912 1 0 0 + 843 281 2 0.4236 4.55252 19.50946 9.31205 1 0 0 + 844 282 1 -0.8472 24.55168 32.70298 5.53394 1 0 0 + 845 282 2 0.4236 25.10629 32.33979 4.78533 1 0 0 + 846 282 2 0.4236 23.65660 32.25716 5.53235 1 0 0 + 847 283 1 -0.8472 11.81055 0.45139 5.96055 0 1 0 + 848 283 2 0.4236 11.39065 35.39717 6.67428 0 0 0 + 849 283 2 0.4236 12.78463 0.56502 6.15590 0 1 0 +850 284 1 -0.8472 7.05422 31.92915 0.30939 0 -1 0 +851 284 2 0.4236 7.50991 32.81916 0.32211 0 -1 0 +852 284 2 0.4236 7.60255 31.28148 35.22760 0 -1 -1 + 853 285 1 -0.8472 4.88099 2.44705 3.21183 1 1 0 + 854 285 2 0.4236 5.10191 2.23231 4.16317 1 1 0 + 855 285 2 0.4236 5.19600 3.37148 2.99700 1 1 0 + 856 286 1 -0.8472 7.47945 15.15365 10.29372 1 0 0 + 857 286 2 0.4236 7.03313 15.93251 10.73429 1 0 0 + 858 286 2 0.4236 7.09594 15.02313 9.37947 1 0 0 + 859 287 1 -0.8472 6.26659 26.90479 24.54665 0 0 0 + 860 287 2 0.4236 5.54453 27.04075 25.22493 0 0 0 + 861 287 2 0.4236 6.35642 27.72783 23.98591 0 0 0 + 862 288 1 -0.8472 7.15187 18.20123 25.54502 0 0 0 + 863 288 2 0.4236 6.48538 17.85437 26.20487 0 0 0 + 864 288 2 0.4236 7.52394 17.43919 25.01512 0 0 0 + 865 289 1 -0.8472 15.23808 32.91772 4.26238 0 0 0 + 866 289 2 0.4236 14.28204 32.86755 4.55117 0 0 0 + 867 289 2 0.4236 15.32351 32.56635 3.33007 0 0 0 + 868 290 1 -0.8472 13.90041 29.69758 15.32527 -1 0 0 + 869 290 2 0.4236 14.48236 29.05538 14.82643 -1 0 0 + 870 290 2 0.4236 13.21933 29.18973 15.85269 -1 0 0 + 871 291 1 -0.8472 0.23593 14.77991 15.99345 1 0 0 + 872 291 2 0.4236 35.16151 14.00125 16.23084 0 0 0 + 873 291 2 0.4236 35.18896 15.61239 15.96630 0 0 0 + 874 292 1 -0.8472 9.98786 25.23095 12.26937 1 0 0 + 875 292 2 0.4236 10.02909 26.10849 11.79168 1 0 0 + 876 292 2 0.4236 10.18929 25.36950 13.23899 1 0 0 + 877 293 1 -0.8472 21.45982 13.20463 15.01415 0 0 0 + 878 293 2 0.4236 21.82643 13.13504 14.08639 0 0 0 + 879 293 2 0.4236 20.48493 12.98240 15.00483 0 0 0 + 880 294 1 -0.8472 31.10796 22.99984 9.65674 0 0 0 + 881 294 2 0.4236 30.36879 23.52310 10.08072 0 0 0 + 882 294 2 0.4236 31.98714 23.41399 9.89228 0 0 0 + 883 295 1 -0.8472 13.25615 9.90592 3.33739 0 0 0 + 884 295 2 0.4236 13.70857 10.67615 2.88796 0 0 0 + 885 295 2 0.4236 12.62006 9.47384 2.69813 0 0 0 + 886 296 1 -0.8472 10.30305 4.65218 17.64093 1 0 0 + 887 296 2 0.4236 10.46972 4.28256 18.55501 1 0 0 + 888 296 2 0.4236 11.16248 4.67871 17.13035 1 0 0 + 889 297 1 -0.8472 28.87774 21.47687 33.75214 -1 0 0 + 890 297 2 0.4236 28.59667 20.77739 34.40919 -1 0 0 + 891 297 2 0.4236 28.64741 21.17648 32.82658 -1 0 0 + 892 298 1 -0.8472 17.68653 22.52768 26.05691 0 0 0 + 893 298 2 0.4236 18.40542 23.22136 26.01338 0 0 0 + 894 298 2 0.4236 17.66622 22.12564 26.97230 0 0 0 + 895 299 1 -0.8472 35.32860 15.35870 21.60921 0 0 0 + 896 299 2 0.4236 34.37125 15.41320 21.32556 0 0 0 + 897 299 2 0.4236 0.36572 14.95613 20.87262 1 0 0 + 898 300 1 -0.8472 34.81358 9.91603 7.88012 -1 1 0 + 899 300 2 0.4236 34.34643 10.38273 7.12917 -1 1 0 + 900 300 2 0.4236 34.39397 10.17956 8.74872 -1 1 0 + 901 301 1 -0.8472 25.98823 17.72835 34.76824 0 1 0 + 902 301 2 0.4236 25.46157 18.42882 34.28669 0 1 0 + 903 301 2 0.4236 25.38292 16.97587 35.02775 0 1 0 + 904 302 1 -0.8472 1.10644 14.44721 19.28866 0 0 0 + 905 302 2 0.4236 1.56807 13.69242 19.75465 0 0 0 + 906 302 2 0.4236 1.73043 14.86132 18.62601 0 0 0 + 907 303 1 -0.8472 23.07025 7.39359 29.72495 -1 0 0 + 908 303 2 0.4236 22.62092 7.30025 28.83650 -1 0 0 + 909 303 2 0.4236 23.24054 6.48626 30.10931 -1 0 0 + 910 304 1 -0.8472 10.52323 33.05449 2.56148 -1 0 0 + 911 304 2 0.4236 10.82351 34.00113 2.44456 -1 0 0 + 912 304 2 0.4236 10.86668 32.49988 1.80358 -1 0 0 + 913 305 1 -0.8472 32.88033 27.86819 13.04648 -1 0 0 + 914 305 2 0.4236 33.46970 28.54401 12.60392 -1 0 0 + 915 305 2 0.4236 33.12675 26.95244 12.72930 -1 0 0 + 916 306 1 -0.8472 28.86382 12.21670 3.75354 0 0 0 + 917 306 2 0.4236 28.56770 11.49284 4.37666 0 0 0 + 918 306 2 0.4236 28.23838 12.26251 2.97467 0 0 0 + 919 307 1 -0.8472 23.12120 7.48978 34.39303 0 0 0 + 920 307 2 0.4236 23.05104 7.80962 35.33787 0 0 0 + 921 307 2 0.4236 23.94307 6.92935 34.29101 0 0 0 + 922 308 1 -0.8472 23.04919 24.12205 3.43733 0 -1 0 + 923 308 2 0.4236 23.21646 24.95901 3.95832 0 -1 0 + 924 308 2 0.4236 22.43224 23.52672 3.95201 0 -1 0 + 925 309 1 -0.8472 32.92674 24.00762 30.56994 -1 0 0 + 926 309 2 0.4236 33.71882 24.55051 30.84902 -1 0 0 + 927 309 2 0.4236 32.11989 24.59624 30.52056 -1 0 0 + 928 310 1 -0.8472 3.45535 11.74575 10.93216 0 0 0 + 929 310 2 0.4236 2.61810 11.84889 11.46912 0 0 0 + 930 310 2 0.4236 4.12115 12.43525 11.21716 0 0 0 + 931 311 1 -0.8472 18.03058 4.40786 5.24725 0 0 0 + 932 311 2 0.4236 18.51841 3.54031 5.15058 0 0 0 + 933 311 2 0.4236 17.13139 4.24134 5.65181 0 0 0 + 934 312 1 -0.8472 21.91775 10.67527 23.00739 0 0 0 + 935 312 2 0.4236 21.50019 11.47111 23.44584 0 0 0 + 936 312 2 0.4236 22.91139 10.78644 22.99172 0 0 0 + 937 313 1 -0.8472 27.43171 31.48689 23.76096 0 0 0 + 938 313 2 0.4236 27.78240 32.24630 23.21302 0 0 0 + 939 313 2 0.4236 28.19676 30.99143 24.17225 0 0 0 + 940 314 1 -0.8472 31.13317 15.04734 2.15137 -1 0 0 + 941 314 2 0.4236 31.39347 14.25637 2.70508 -1 0 0 + 942 314 2 0.4236 30.55850 15.65965 2.69426 -1 0 0 + 943 315 1 -0.8472 26.48284 26.46164 29.23316 0 -1 0 + 944 315 2 0.4236 26.29994 27.37877 29.58724 0 -1 0 + 945 315 2 0.4236 25.62067 25.96515 29.13256 0 -1 0 + 946 316 1 -0.8472 31.22165 24.17798 24.58738 0 1 0 + 947 316 2 0.4236 31.23699 25.14094 24.31833 0 1 0 + 948 316 2 0.4236 31.44662 23.60757 23.79747 0 1 0 + 949 317 1 -0.8472 2.23033 8.39736 11.70154 1 0 0 + 950 317 2 0.4236 2.21591 7.43318 11.96640 1 0 0 + 951 317 2 0.4236 1.68011 8.52458 10.87630 1 0 0 + 952 318 1 -0.8472 10.30355 13.69355 7.45075 0 0 0 + 953 318 2 0.4236 9.95467 13.20339 6.65202 0 0 0 + 954 318 2 0.4236 11.01804 14.33182 7.16427 0 0 0 + 955 319 1 -0.8472 19.09624 27.27097 33.96412 1 -1 0 + 956 319 2 0.4236 18.28761 27.58882 33.46913 1 -1 0 + 957 319 2 0.4236 19.40262 27.98394 34.59479 1 -1 0 + 958 320 1 -0.8472 21.98400 20.91583 33.60592 -1 0 0 + 959 320 2 0.4236 22.11925 21.66026 32.95210 -1 0 0 + 960 320 2 0.4236 21.87187 21.29511 34.52436 -1 0 0 + 961 321 1 -0.8472 8.05909 10.61317 31.65640 1 0 0 + 962 321 2 0.4236 8.44206 9.70136 31.80450 1 0 0 + 963 321 2 0.4236 7.46372 10.59818 30.85313 1 0 0 + 964 322 1 -0.8472 9.09413 18.32337 0.84811 0 0 0 + 965 322 2 0.4236 9.41231 18.00449 1.74088 0 0 0 + 966 322 2 0.4236 8.81473 17.53907 0.29424 0 0 0 + 967 323 1 -0.8472 13.25569 25.97059 14.21521 0 0 0 + 968 323 2 0.4236 13.55824 26.21604 15.13616 0 0 0 + 969 323 2 0.4236 12.33025 25.59418 14.25764 0 0 0 + 970 324 1 -0.8472 33.13584 9.19316 24.05826 -1 0 0 + 971 324 2 0.4236 32.63026 9.79659 23.44165 -1 0 0 + 972 324 2 0.4236 34.11588 9.27845 23.87875 -1 0 0 + 973 325 1 -0.8472 0.58676 30.79636 7.10521 0 0 0 + 974 325 2 0.4236 0.12738 30.93416 7.98267 0 0 0 + 975 325 2 0.4236 1.25039 30.05311 7.18950 0 0 0 + 976 326 1 -0.8472 16.60852 24.00687 6.45844 0 -1 0 + 977 326 2 0.4236 16.74085 24.60096 5.66503 0 -1 0 + 978 326 2 0.4236 16.73950 24.53616 7.29670 0 -1 0 + 979 327 1 -0.8472 21.78272 18.23485 15.29826 -1 0 0 + 980 327 2 0.4236 21.29209 17.36498 15.24772 -1 0 0 + 981 327 2 0.4236 21.47580 18.74440 16.10210 -1 0 0 + 982 328 1 -0.8472 1.07556 17.90780 22.50149 0 0 0 + 983 328 2 0.4236 0.66446 17.09563 22.08753 0 0 0 + 984 328 2 0.4236 2.00753 18.02178 22.15740 0 0 0 + 985 329 1 -0.8472 8.51481 8.69543 13.44579 1 1 0 + 986 329 2 0.4236 8.03320 7.99947 12.91320 1 1 0 + 987 329 2 0.4236 8.13923 9.59736 13.23261 1 1 0 + 988 330 1 -0.8472 28.35224 22.67556 2.57766 0 0 0 + 989 330 2 0.4236 27.72872 22.28765 1.89891 0 0 0 + 990 330 2 0.4236 28.76046 21.93781 3.11531 0 0 0 + 991 331 1 -0.8472 17.15184 8.01186 31.33613 0 0 0 + 992 331 2 0.4236 16.77891 8.44369 32.15737 0 0 0 + 993 331 2 0.4236 16.96330 8.58870 30.54137 0 0 0 + 994 332 1 -0.8472 29.37145 32.28297 30.40766 0 0 0 + 995 332 2 0.4236 28.59990 31.77818 30.79475 0 0 0 + 996 332 2 0.4236 29.34145 32.22393 29.40986 0 0 0 + 997 333 1 -0.8472 35.30101 34.49612 31.31065 -1 0 0 + 998 333 2 0.4236 0.55375 34.83822 31.86447 0 0 0 + 999 333 2 0.4236 34.45007 34.92923 31.60762 -1 0 0 + 1000 334 1 -0.8472 14.09936 2.13015 18.09005 0 0 0 + 1001 334 2 0.4236 13.86459 1.50779 17.34342 0 0 0 + 1002 334 2 0.4236 14.07709 1.63332 18.95758 0 0 0 + 1003 335 1 -0.8472 23.74810 3.68755 32.95671 0 1 0 + 1004 335 2 0.4236 23.65696 3.88556 31.98078 0 1 0 + 1005 335 2 0.4236 22.86999 3.83831 33.41082 0 1 0 + 1006 336 1 -0.8472 31.09997 21.56673 28.07556 -1 0 0 + 1007 336 2 0.4236 31.85938 21.15085 28.57586 -1 0 0 + 1008 336 2 0.4236 31.35399 22.49164 27.79269 -1 0 0 + 1009 337 1 -0.8472 20.64083 15.69267 14.82107 0 0 0 + 1010 337 2 0.4236 20.01411 15.85195 15.58383 0 0 0 + 1011 337 2 0.4236 21.11190 14.82056 14.95329 0 0 0 + 1012 338 1 -0.8472 20.28701 15.13724 31.94210 0 0 0 + 1013 338 2 0.4236 20.65117 14.38373 31.39480 0 0 0 + 1014 338 2 0.4236 19.30068 15.01933 32.05716 0 0 0 + 1015 339 1 -0.8472 32.47304 33.05421 7.42147 0 -1 0 + 1016 339 2 0.4236 31.48483 33.14393 7.54532 0 -1 0 + 1017 339 2 0.4236 32.72329 32.08609 7.42835 0 -1 0 + 1018 340 1 -0.8472 25.63615 27.76429 13.62009 0 -1 0 + 1019 340 2 0.4236 26.57313 27.51515 13.86499 0 -1 0 + 1020 340 2 0.4236 25.13047 26.94246 13.35778 0 -1 0 + 1021 341 1 -0.8472 0.75304 4.33827 20.97066 1 0 0 + 1022 341 2 0.4236 0.72114 4.46730 19.97956 1 0 0 + 1023 341 2 0.4236 1.06157 5.18343 21.40709 1 0 0 + 1024 342 1 -0.8472 1.15960 21.09656 13.17958 1 1 0 + 1025 342 2 0.4236 1.13952 21.53055 12.27891 1 1 0 + 1026 342 2 0.4236 1.23756 20.10565 13.07037 1 1 0 + 1027 343 1 -0.8472 8.63426 29.66811 25.42818 0 0 0 + 1028 343 2 0.4236 8.28239 30.40249 24.84784 0 0 0 + 1029 343 2 0.4236 8.72735 28.83186 24.88783 0 0 0 + 1030 344 1 -0.8472 30.76174 20.63256 25.14989 0 0 0 + 1031 344 2 0.4236 31.51870 20.90756 24.55714 0 0 0 + 1032 344 2 0.4236 30.99303 20.83502 26.10143 0 0 0 + 1033 345 1 -0.8472 4.24571 30.79640 2.94362 0 0 0 + 1034 345 2 0.4236 4.17270 31.39155 2.14334 0 0 0 + 1035 345 2 0.4236 4.36412 29.84944 2.64506 0 0 0 + 1036 346 1 -0.8472 15.42989 29.35349 26.25283 -1 0 0 + 1037 346 2 0.4236 16.28644 29.25844 25.74568 -1 0 0 + 1038 346 2 0.4236 14.71000 28.83510 25.79131 -1 0 0 + 1039 347 1 -0.8472 15.48947 26.89872 10.36047 0 0 0 + 1040 347 2 0.4236 15.06016 26.08318 10.74851 0 0 0 + 1041 347 2 0.4236 16.47729 26.75709 10.29670 0 0 0 + 1042 348 1 -0.8472 3.69092 24.79802 1.79703 1 -1 0 + 1043 348 2 0.4236 2.92286 24.81460 1.15692 1 -1 0 + 1044 348 2 0.4236 4.44248 24.26962 1.40222 1 -1 0 + 1045 349 1 -0.8472 30.63584 20.42155 0.68360 -1 0 0 + 1046 349 2 0.4236 29.66630 20.49948 0.45154 -1 0 0 + 1047 349 2 0.4236 31.17191 21.00886 0.07726 -1 0 0 + 1048 350 1 -0.8472 23.07817 3.25695 10.19922 0 1 0 + 1049 350 2 0.4236 23.13072 3.67899 9.29418 0 1 0 + 1050 350 2 0.4236 22.12223 3.06798 10.42381 0 1 0 + 1051 351 1 -0.8472 35.17355 13.92467 30.41812 -1 0 0 + 1052 351 2 0.4236 34.42649 13.31598 30.68525 -1 0 0 + 1053 351 2 0.4236 35.48891 13.68248 29.50057 -1 0 0 + 1054 352 1 -0.8472 28.88786 35.07154 21.77560 0 -1 0 + 1055 352 2 0.4236 29.82352 35.08183 22.12833 0 -1 0 + 1056 352 2 0.4236 28.66001 34.14976 21.46196 0 -1 0 + 1057 353 1 -0.8472 11.05103 25.60242 26.28306 0 0 0 + 1058 353 2 0.4236 11.23918 24.62323 26.20763 0 0 0 + 1059 353 2 0.4236 10.10113 25.78009 26.02597 0 0 0 + 1060 354 1 -0.8472 31.63339 18.14090 19.44147 0 0 0 + 1061 354 2 0.4236 31.85189 18.85252 20.10916 0 0 0 + 1062 354 2 0.4236 32.47695 17.81105 19.01777 0 0 0 + 1063 355 1 -0.8472 3.31136 2.63236 12.33445 0 0 0 + 1064 355 2 0.4236 2.41026 2.87346 11.97410 0 0 0 + 1065 355 2 0.4236 3.44117 3.06706 13.22559 0 0 0 + 1066 356 1 -0.8472 12.24600 6.49581 14.08200 1 -1 0 + 1067 356 2 0.4236 13.15730 6.37133 13.68960 1 -1 0 + 1068 356 2 0.4236 12.00228 7.46532 14.05786 1 -1 0 + 1069 357 1 -0.8472 11.50548 16.90283 14.04964 0 0 0 + 1070 357 2 0.4236 12.29833 16.85131 13.44246 0 0 0 + 1071 357 2 0.4236 11.71965 16.45258 14.91643 0 0 0 + 1072 358 1 -0.8472 35.43225 34.57807 0.88602 -1 -1 0 + 1073 358 2 0.4236 34.78145 34.97858 0.24105 -1 -1 0 + 1074 358 2 0.4236 0.05551 33.61013 0.67092 0 -1 0 + 1075 359 1 -0.8472 32.90157 21.64637 32.04479 0 0 0 + 1076 359 2 0.4236 32.92099 22.39953 31.38732 0 0 0 + 1077 359 2 0.4236 32.11375 21.05995 31.85667 0 0 0 + 1078 360 1 -0.8472 28.66651 4.66095 28.42273 -1 0 0 + 1079 360 2 0.4236 29.64436 4.61462 28.62669 -1 0 0 + 1080 360 2 0.4236 28.36393 3.78767 28.04089 -1 0 0 + 1081 361 1 -0.8472 11.79766 16.60969 9.43182 0 0 0 + 1082 361 2 0.4236 12.66888 16.45176 9.89661 0 0 0 + 1083 361 2 0.4236 11.22235 15.79621 9.51672 0 0 0 + 1084 362 1 -0.8472 9.55596 34.02911 10.63320 0 0 0 + 1085 362 2 0.4236 8.61455 34.26813 10.87101 0 0 0 + 1086 362 2 0.4236 9.60738 33.05467 10.41463 0 0 0 + 1087 363 1 -0.8472 22.07096 19.00704 23.45916 0 -1 0 + 1088 363 2 0.4236 22.91480 19.42776 23.12621 0 -1 0 + 1089 363 2 0.4236 21.60867 19.63643 24.08378 0 -1 0 + 1090 364 1 -0.8472 35.05069 19.90937 25.80470 -2 -1 0 + 1091 364 2 0.4236 35.34344 20.47030 25.03040 -2 -1 0 + 1092 364 2 0.4236 34.77122 20.50286 26.55945 -2 -1 0 + 1093 365 1 -0.8472 1.29483 5.44650 7.26933 1 1 0 + 1094 365 2 0.4236 0.45590 5.92938 7.52030 1 1 0 + 1095 365 2 0.4236 1.81961 5.23896 8.09486 1 1 0 + 1096 366 1 -0.8472 33.07892 1.60280 25.15613 0 0 0 + 1097 366 2 0.4236 32.33755 2.22668 25.40327 0 0 0 + 1098 366 2 0.4236 33.70561 2.06250 24.52690 0 0 0 + 1099 367 1 -0.8472 14.22157 33.43622 22.79701 0 0 0 + 1100 367 2 0.4236 14.35642 34.29835 23.28540 0 0 0 + 1101 367 2 0.4236 13.26247 33.16147 22.86432 0 0 0 + 1102 368 1 -0.8472 27.07629 24.91963 8.20535 0 0 0 + 1103 368 2 0.4236 27.19239 24.91058 7.21216 0 0 0 + 1104 368 2 0.4236 26.78492 25.83019 8.49857 0 0 0 + 1105 369 1 -0.8472 7.24937 20.22566 4.06221 0 0 0 + 1106 369 2 0.4236 6.58398 19.52352 4.31566 0 0 0 + 1107 369 2 0.4236 7.35965 20.23706 3.06839 0 0 0 + 1108 370 1 -0.8472 13.41227 1.40249 12.73458 0 0 0 + 1109 370 2 0.4236 13.93745 1.43607 11.88427 0 0 0 + 1110 370 2 0.4236 12.54553 1.88546 12.61030 0 0 0 + 1111 371 1 -0.8472 0.85266 16.38948 27.38175 0 -1 0 + 1112 371 2 0.4236 1.08079 16.82099 28.25450 0 -1 0 + 1113 371 2 0.4236 1.16521 16.97097 26.63066 0 -1 0 + 1114 372 1 -0.8472 4.02418 25.29508 4.78828 1 1 0 + 1115 372 2 0.4236 3.89068 25.61801 3.85137 1 1 0 + 1116 372 2 0.4236 4.33792 24.34571 4.77208 1 1 0 + 1117 373 1 -0.8472 16.59052 15.77188 19.36735 0 0 0 + 1118 373 2 0.4236 16.75530 16.39211 20.13429 0 0 0 + 1119 373 2 0.4236 17.42140 15.24909 19.17700 0 0 0 + 1120 374 1 -0.8472 33.13843 25.82196 3.97841 0 0 0 + 1121 374 2 0.4236 32.77967 24.90515 4.15352 0 0 0 + 1122 374 2 0.4236 34.05286 25.75158 3.57992 0 0 0 + 1123 375 1 -0.8472 31.57661 1.02930 18.56306 -1 1 0 + 1124 375 2 0.4236 31.87941 0.41338 19.29029 -1 1 0 + 1125 375 2 0.4236 31.65157 0.56519 17.68046 -1 1 0 + 1126 376 1 -0.8472 2.96164 16.29354 6.71299 0 0 0 + 1127 376 2 0.4236 3.05881 15.49032 7.30060 0 0 0 + 1128 376 2 0.4236 3.23467 16.05902 5.78005 0 0 0 + 1129 377 1 -0.8472 20.34379 33.69865 7.89455 0 -1 0 + 1130 377 2 0.4236 20.39438 32.70170 7.83518 0 -1 0 + 1131 377 2 0.4236 19.51518 33.96147 8.38879 0 -1 0 + 1132 378 1 -0.8472 19.37439 16.80508 19.73572 0 1 0 + 1133 378 2 0.4236 20.27469 17.21358 19.88587 0 1 0 + 1134 378 2 0.4236 19.36459 15.87542 20.10391 0 1 0 + 1135 379 1 -0.8472 19.23315 9.13979 28.88985 -1 0 0 + 1136 379 2 0.4236 20.13295 9.57333 28.93806 -1 0 0 + 1137 379 2 0.4236 18.76709 9.24056 29.76884 -1 0 0 + 1138 380 1 -0.8472 27.72787 22.91683 10.45990 -1 -1 0 + 1139 380 2 0.4236 27.54902 23.44015 9.62678 -1 -1 0 + 1140 380 2 0.4236 28.28042 22.11378 10.23690 -1 -1 0 + 1141 381 1 -0.8472 6.32840 1.89288 33.44010 0 0 0 + 1142 381 2 0.4236 6.55965 2.59979 32.77171 0 0 0 + 1143 381 2 0.4236 6.96546 1.94041 34.20941 0 0 0 + 1144 382 1 -0.8472 5.63638 5.55085 15.38096 0 1 0 + 1145 382 2 0.4236 6.60617 5.51829 15.62260 0 1 0 + 1146 382 2 0.4236 5.27855 6.46702 15.56128 0 1 0 + 1147 383 1 -0.8472 3.24229 34.95287 10.93468 1 -1 0 + 1148 383 2 0.4236 2.73508 0.26278 11.21110 1 0 0 + 1149 383 2 0.4236 4.13670 34.94890 11.38181 1 -1 0 + 1150 384 1 -0.8472 10.54404 28.17006 5.04204 0 -1 0 + 1151 384 2 0.4236 10.79734 28.87476 5.70473 0 -1 0 + 1152 384 2 0.4236 9.58213 27.92638 5.16590 0 -1 0 + 1153 385 1 -0.8472 17.00917 14.06687 8.09635 1 1 0 + 1154 385 2 0.4236 17.37361 14.76031 8.71785 1 1 0 + 1155 385 2 0.4236 16.55338 14.51499 7.32736 1 1 0 + 1156 386 1 -0.8472 6.62644 33.85271 2.78808 0 -1 0 + 1157 386 2 0.4236 5.73917 34.02559 3.21562 0 -1 0 + 1158 386 2 0.4236 6.61962 34.20458 1.85208 0 -1 0 + 1159 387 1 -0.8472 29.76540 24.76348 2.86127 0 -1 0 + 1160 387 2 0.4236 29.15412 23.97946 2.75344 0 -1 0 + 1161 387 2 0.4236 30.61943 24.46419 3.28677 0 -1 0 + 1162 388 1 -0.8472 13.59066 30.37117 2.31161 0 0 0 + 1163 388 2 0.4236 12.65166 30.51884 2.62207 0 0 0 + 1164 388 2 0.4236 14.05913 29.75730 2.94695 0 0 0 + 1165 389 1 -0.8472 12.39821 27.47130 30.65704 0 -1 0 + 1166 389 2 0.4236 12.99120 27.19012 29.90254 0 -1 0 + 1167 389 2 0.4236 12.45715 26.79959 31.39547 0 -1 0 + 1168 390 1 -0.8472 6.06136 34.05062 23.58964 1 0 0 + 1169 390 2 0.4236 5.93233 34.43746 22.67660 1 0 0 + 1170 390 2 0.4236 7.01612 34.15998 23.86610 1 0 0 + 1171 391 1 -0.8472 14.90784 2.14573 10.34168 0 0 0 + 1172 391 2 0.4236 15.85071 2.06423 10.01876 0 0 0 + 1173 391 2 0.4236 14.45030 2.88711 9.85081 0 0 0 + 1174 392 1 -0.8472 5.95470 23.52370 19.25445 1 0 0 + 1175 392 2 0.4236 6.57166 22.96298 19.80661 1 0 0 + 1176 392 2 0.4236 5.74564 23.04724 18.40053 1 0 0 + 1177 393 1 -0.8472 16.53893 22.97687 33.90825 -1 0 0 + 1178 393 2 0.4236 16.96060 22.22410 33.40285 -1 0 0 + 1179 393 2 0.4236 16.93781 23.02835 34.82378 -1 0 0 + 1180 394 1 -0.8472 19.35884 19.30139 25.91860 1 0 0 + 1181 394 2 0.4236 18.36758 19.43312 25.92172 1 0 0 + 1182 394 2 0.4236 19.60298 18.62496 25.22376 1 0 0 + 1183 395 1 -0.8472 17.84105 26.28435 20.60609 0 0 0 + 1184 395 2 0.4236 18.33356 25.48138 20.27048 0 0 0 + 1185 395 2 0.4236 18.48109 26.89968 21.06619 0 0 0 + 1186 396 1 -0.8472 25.39077 19.85526 30.73839 -1 0 0 + 1187 396 2 0.4236 24.77676 19.15798 31.10824 -1 0 0 + 1188 396 2 0.4236 25.40880 20.64357 31.35332 -1 0 0 + 1189 397 1 -0.8472 32.17283 22.92893 4.21570 0 0 0 + 1190 397 2 0.4236 32.63445 22.40316 3.50127 0 0 0 + 1191 397 2 0.4236 32.09738 22.37237 5.04307 0 0 0 + 1192 398 1 -0.8472 17.29312 0.37281 33.34237 1 0 0 + 1193 398 2 0.4236 16.62031 1.11144 33.38353 1 0 0 + 1194 398 2 0.4236 18.16235 0.73226 33.00297 1 0 0 + 1195 399 1 -0.8472 12.89246 11.41146 34.96369 0 1 0 + 1196 399 2 0.4236 13.81811 11.65819 35.25053 0 1 0 + 1197 399 2 0.4236 12.78729 10.41756 34.99613 0 1 0 + 1198 400 1 -0.8472 6.36277 31.86052 10.27376 2 -1 0 + 1199 400 2 0.4236 6.33011 32.23746 11.19940 2 -1 0 + 1200 400 2 0.4236 7.24273 31.40813 10.12900 2 -1 0 + 1201 401 1 -0.8472 28.38360 3.88865 10.78470 0 1 0 + 1202 401 2 0.4236 28.42858 3.61210 11.74461 0 1 0 + 1203 401 2 0.4236 28.18657 4.86742 10.72869 0 1 0 + 1204 402 1 -0.8472 18.39410 3.79825 25.35360 0 0 0 + 1205 402 2 0.4236 18.47271 2.80161 25.37448 0 0 0 + 1206 402 2 0.4236 17.43266 4.05869 25.44176 0 0 0 + 1207 403 1 -0.8472 30.80900 7.81409 7.07058 0 1 0 + 1208 403 2 0.4236 30.55382 7.48751 7.98062 0 1 0 + 1209 403 2 0.4236 31.80460 7.79968 6.97835 0 1 0 + 1210 404 1 -0.8472 23.51102 5.83799 2.88617 0 0 0 + 1211 404 2 0.4236 23.86573 5.70253 3.81125 0 0 0 + 1212 404 2 0.4236 23.71338 5.03178 2.33025 0 0 0 + 1213 405 1 -0.8472 20.52153 3.94426 31.16343 -1 0 0 + 1214 405 2 0.4236 20.17492 4.52582 31.89939 -1 0 0 + 1215 405 2 0.4236 21.49852 4.11501 31.03575 -1 0 0 +1216 406 1 -0.8472 35.47429 28.06507 0.54549 -1 0 0 +1217 406 2 0.4236 0.72718 27.77804 35.40863 0 0 -1 +1218 406 2 0.4236 0.32616 28.54845 1.34422 0 0 0 + 1219 407 1 -0.8472 25.34340 8.52458 3.30496 0 0 0 + 1220 407 2 0.4236 24.76479 8.25867 4.07597 0 0 0 + 1221 407 2 0.4236 25.95386 7.76826 3.06992 0 0 0 + 1222 408 1 -0.8472 14.03033 20.30541 1.00428 0 0 0 + 1223 408 2 0.4236 14.58182 21.08353 1.30490 0 0 0 + 1224 408 2 0.4236 13.32894 20.10945 1.68953 0 0 0 + 1225 409 1 -0.8472 4.87289 5.75995 12.70282 1 0 0 + 1226 409 2 0.4236 5.73516 6.07464 12.30602 1 0 0 + 1227 409 2 0.4236 5.01108 5.53970 13.66840 1 0 0 + 1228 410 1 -0.8472 13.53566 35.12394 16.50467 1 -1 0 + 1229 410 2 0.4236 13.08941 0.40195 16.07381 1 0 0 + 1230 410 2 0.4236 12.84428 34.53745 16.92657 1 -1 0 + 1231 411 1 -0.8472 31.28347 13.97579 12.16494 0 0 0 + 1232 411 2 0.4236 30.31706 14.04855 12.41123 0 0 0 + 1233 411 2 0.4236 31.39500 14.17310 11.19100 0 0 0 + 1234 412 1 -0.8472 23.72875 25.77285 13.04432 -1 0 0 + 1235 412 2 0.4236 23.54106 26.23908 12.17983 -1 0 0 + 1236 412 2 0.4236 23.97314 24.82029 12.86304 -1 0 0 + 1237 413 1 -0.8472 18.42520 13.29901 12.67620 0 0 0 + 1238 413 2 0.4236 18.76063 12.84318 13.50059 0 0 0 + 1239 413 2 0.4236 17.47850 13.02572 12.50598 0 0 0 + 1240 414 1 -0.8472 24.38139 21.23148 28.52212 -1 0 0 + 1241 414 2 0.4236 24.87887 20.69331 29.20242 -1 0 0 + 1242 414 2 0.4236 24.93945 21.32433 27.69755 -1 0 0 + 1243 415 1 -0.8472 4.76545 3.74972 28.15333 2 0 0 + 1244 415 2 0.4236 3.95303 4.05898 28.64753 2 0 0 + 1245 415 2 0.4236 4.90570 4.32652 27.34861 2 0 0 + 1246 416 1 -0.8472 31.10729 24.42201 27.24570 -1 0 0 + 1247 416 2 0.4236 30.99608 24.27377 26.26307 -1 0 0 + 1248 416 2 0.4236 30.32437 24.93611 27.59596 -1 0 0 + 1249 417 1 -0.8472 17.27764 19.50978 16.96588 0 1 0 + 1250 417 2 0.4236 16.89080 19.37919 17.87871 0 1 0 + 1251 417 2 0.4236 16.81794 20.27508 16.51545 0 1 0 + 1252 418 1 -0.8472 3.72639 18.97644 12.27267 1 0 0 + 1253 418 2 0.4236 3.70512 19.37343 11.35512 1 0 0 + 1254 418 2 0.4236 2.86172 18.50772 12.45316 1 0 0 + 1255 419 1 -0.8472 20.96515 21.23762 26.79063 0 0 0 + 1256 419 2 0.4236 20.35291 20.50701 26.48848 0 0 0 + 1257 419 2 0.4236 20.95957 21.28545 27.78946 0 0 0 + 1258 420 1 -0.8472 32.52779 5.30124 27.39384 0 1 0 + 1259 420 2 0.4236 32.53926 5.99020 26.66919 0 1 0 + 1260 420 2 0.4236 33.40185 5.31374 27.87950 0 1 0 + 1261 421 1 -0.8472 4.50515 19.02032 2.73901 0 0 0 + 1262 421 2 0.4236 4.98200 18.24270 3.14870 0 0 0 + 1263 421 2 0.4236 3.52800 18.95648 2.94164 0 0 0 +1264 422 1 -0.8472 5.79914 17.68163 34.54127 0 0 0 +1265 422 2 0.4236 5.22820 18.24930 33.94824 0 0 0 +1266 422 2 0.4236 5.67665 17.96493 0.04523 0 0 1 + 1267 423 1 -0.8472 2.03112 11.27795 4.67878 0 1 0 + 1268 423 2 0.4236 2.55869 11.86871 4.06838 0 1 0 + 1269 423 2 0.4236 1.30126 10.83107 4.16153 0 1 0 + 1270 424 1 -0.8472 21.63764 11.67562 6.00451 0 1 0 + 1271 424 2 0.4236 22.26518 11.45584 5.25763 0 1 0 + 1272 424 2 0.4236 20.83218 11.08572 5.94754 0 1 0 + 1273 425 1 -0.8472 12.73506 6.22561 3.30400 0 -1 0 + 1274 425 2 0.4236 12.99724 6.93528 3.95793 0 -1 0 + 1275 425 2 0.4236 12.40741 6.65328 2.46157 0 -1 0 + 1276 426 1 -0.8472 8.02014 27.69985 5.68973 1 0 0 + 1277 426 2 0.4236 7.57052 27.13867 6.38461 1 0 0 + 1278 426 2 0.4236 7.73250 28.65199 5.79296 1 0 0 + 1279 427 1 -0.8472 25.07348 29.28113 32.08839 -1 0 0 + 1280 427 2 0.4236 25.90142 29.03034 32.58997 -1 0 0 + 1281 427 2 0.4236 24.38203 29.61190 32.73063 -1 0 0 + 1282 428 1 -0.8472 1.22361 34.16286 23.41071 1 -1 0 + 1283 428 2 0.4236 2.07526 34.49875 23.81300 1 -1 0 + 1284 428 2 0.4236 0.45459 34.41914 23.99626 1 -1 0 + 1285 429 1 -0.8472 32.55982 17.30341 1.33505 -1 0 0 + 1286 429 2 0.4236 32.05627 16.45897 1.51747 -1 0 0 + 1287 429 2 0.4236 32.12518 17.79418 0.57993 -1 0 0 + 1288 430 1 -0.8472 23.56130 32.19165 29.59188 0 0 0 + 1289 430 2 0.4236 23.54642 31.84067 30.52811 0 0 0 + 1290 430 2 0.4236 24.39254 32.72925 29.45063 0 0 0 + 1291 431 1 -0.8472 19.51922 6.96283 31.09761 0 0 0 + 1292 431 2 0.4236 19.36239 6.54737 30.20165 0 0 0 + 1293 431 2 0.4236 18.64261 7.22274 31.50252 0 0 0 + 1294 432 1 -0.8472 4.38539 5.20065 20.84759 0 0 0 + 1295 432 2 0.4236 4.95246 5.86004 20.35406 0 0 0 + 1296 432 2 0.4236 4.14576 5.57251 21.74441 0 0 0 + 1297 433 1 -0.8472 31.40867 11.19859 22.79106 0 0 0 + 1298 433 2 0.4236 30.95869 11.02820 21.91445 0 0 0 + 1299 433 2 0.4236 30.74030 11.11633 23.53034 0 0 0 + 1300 434 1 -0.8472 22.15699 13.64693 17.96846 0 0 0 + 1301 434 2 0.4236 21.97115 13.28502 17.05495 0 0 0 + 1302 434 2 0.4236 22.20251 14.64505 17.92862 0 0 0 + 1303 435 1 -0.8472 27.17581 16.07117 32.82215 -1 0 0 + 1304 435 2 0.4236 26.91651 16.04642 31.85667 -1 0 0 + 1305 435 2 0.4236 26.58410 16.71305 33.30983 -1 0 0 + 1306 436 1 -0.8472 15.66526 24.93973 32.39405 0 -1 0 + 1307 436 2 0.4236 15.85550 24.23681 33.07939 0 -1 0 + 1308 436 2 0.4236 15.76485 24.54877 31.47909 0 -1 0 + 1309 437 1 -0.8472 15.40880 32.12991 30.70836 1 0 0 + 1310 437 2 0.4236 16.32127 32.42798 30.98861 1 0 0 + 1311 437 2 0.4236 15.44004 31.80470 29.76327 1 0 0 + 1312 438 1 -0.8472 16.02646 35.51995 25.85561 1 -1 0 + 1313 438 2 0.4236 16.36022 34.65253 26.22458 1 -1 0 + 1314 438 2 0.4236 15.10674 35.39241 25.48440 1 -1 0 + 1315 439 1 -0.8472 22.60142 17.62162 10.57677 -1 1 0 + 1316 439 2 0.4236 22.16810 17.04837 9.88140 -1 1 0 + 1317 439 2 0.4236 21.98106 17.72970 11.35356 -1 1 0 + 1318 440 1 -0.8472 19.65290 1.47489 32.37803 0 0 0 + 1319 440 2 0.4236 19.94551 2.38837 32.09541 0 0 0 + 1320 440 2 0.4236 19.57422 0.88630 31.57349 0 0 0 + 1321 441 1 -0.8472 29.94701 28.28311 22.62910 -1 0 0 + 1322 441 2 0.4236 29.23937 27.58854 22.75866 -1 0 0 + 1323 441 2 0.4236 30.80353 27.84074 22.36342 -1 0 0 + 1324 442 1 -0.8472 1.27173 25.47080 15.54363 0 -1 0 + 1325 442 2 0.4236 1.03307 25.88871 14.66705 0 -1 0 + 1326 442 2 0.4236 0.46325 25.03048 15.93404 0 -1 0 + 1327 443 1 -0.8472 15.31637 29.31819 6.73777 0 0 0 + 1328 443 2 0.4236 14.94391 28.42485 6.98909 0 0 0 + 1329 443 2 0.4236 16.28023 29.36325 7.00015 0 0 0 + 1330 444 1 -0.8472 32.35725 35.03802 20.71803 0 -1 0 + 1331 444 2 0.4236 33.33712 35.09018 20.91062 0 -1 0 + 1332 444 2 0.4236 31.85345 34.94201 21.57646 0 -1 0 + 1333 445 1 -0.8472 16.00211 9.25317 19.85500 0 0 0 + 1334 445 2 0.4236 16.24217 9.66138 20.73572 0 0 0 + 1335 445 2 0.4236 15.43408 8.44423 20.00632 0 0 0 + 1336 446 1 -0.8472 0.16188 12.47022 34.77387 1 1 0 + 1337 446 2 0.4236 0.18865 12.21972 33.80616 1 1 0 + 1338 446 2 0.4236 1.08690 12.68233 35.08896 1 1 0 + 1339 447 1 -0.8472 10.87982 14.01780 18.67798 0 0 0 + 1340 447 2 0.4236 9.93453 14.26617 18.46646 0 0 0 + 1341 447 2 0.4236 11.22640 14.61264 19.40323 0 0 0 + 1342 448 1 -0.8472 10.15286 18.86839 10.84315 1 1 0 + 1343 448 2 0.4236 11.01993 18.43152 10.60388 1 1 0 + 1344 448 2 0.4236 9.39604 18.33981 10.45869 1 1 0 + 1345 449 1 -0.8472 27.86066 32.50244 21.02022 -1 0 0 + 1346 449 2 0.4236 27.45447 32.35015 20.11922 -1 0 0 + 1347 449 2 0.4236 28.30747 31.66339 21.33052 -1 0 0 + 1348 450 1 -0.8472 22.34922 4.76719 7.82422 0 1 0 + 1349 450 2 0.4236 23.25130 5.11188 7.56461 0 1 0 + 1350 450 2 0.4236 21.98578 5.31750 8.57588 0 1 0 + 1351 451 1 -0.8472 22.17357 31.29434 5.91224 0 -1 0 + 1352 451 2 0.4236 22.16509 30.44936 5.37759 0 -1 0 + 1353 451 2 0.4236 21.33321 31.35654 6.45064 0 -1 0 + 1354 452 1 -0.8472 30.13033 27.20667 12.21095 0 -1 0 + 1355 452 2 0.4236 30.05303 26.22797 12.02082 0 -1 0 + 1356 452 2 0.4236 31.05488 27.41186 12.53189 0 -1 0 + 1357 453 1 -0.8472 5.00071 18.67552 17.14077 0 1 0 + 1358 453 2 0.4236 4.29325 18.76947 17.84121 0 1 0 + 1359 453 2 0.4236 5.79076 19.23659 17.38766 0 1 0 + 1360 454 1 -0.8472 0.50513 15.22995 32.85253 0 -1 0 + 1361 454 2 0.4236 0.06619 14.95304 31.99779 0 -1 0 + 1362 454 2 0.4236 35.32108 15.30810 33.57172 -1 -1 0 + 1363 455 1 -0.8472 0.36336 21.48947 23.88549 1 -1 0 + 1364 455 2 0.4236 35.37583 21.67758 23.03656 0 -1 0 + 1365 455 2 0.4236 1.28632 21.17034 23.67043 1 -1 0 + 1366 456 1 -0.8472 8.03722 15.22335 26.84029 0 0 0 + 1367 456 2 0.4236 8.80880 15.78502 27.13887 0 0 0 + 1368 456 2 0.4236 7.19774 15.55391 27.27151 0 0 0 + 1369 457 1 -0.8472 34.68466 18.85053 10.89189 0 -1 0 + 1370 457 2 0.4236 0.02666 18.33065 10.79225 1 -1 0 + 1371 457 2 0.4236 34.83965 19.79809 10.61246 0 -1 0 + 1372 458 1 -0.8472 31.33961 22.90028 34.29431 0 0 0 + 1373 458 2 0.4236 32.01330 22.72538 33.57632 0 0 0 + 1374 458 2 0.4236 30.42440 22.68898 33.95121 0 0 0 + 1375 459 1 -0.8472 35.12721 20.42790 21.39380 -1 -1 0 + 1376 459 2 0.4236 35.36489 19.72054 22.05946 -1 -1 0 + 1377 459 2 0.4236 35.03195 20.01479 20.48816 -1 -1 0 + 1378 460 1 -0.8472 17.36832 12.96180 29.52925 0 0 0 + 1379 460 2 0.4236 17.38806 13.28729 28.58391 0 0 0 + 1380 460 2 0.4236 16.43280 12.70808 29.77490 0 0 0 + 1381 461 1 -0.8472 16.09606 4.35109 20.46593 0 1 0 + 1382 461 2 0.4236 16.85305 4.93396 20.17069 0 1 0 + 1383 461 2 0.4236 16.41625 3.72234 21.17452 0 1 0 + 1384 462 1 -0.8472 13.66607 33.47244 9.21024 0 -1 0 + 1385 462 2 0.4236 14.22920 33.27612 10.01291 0 -1 0 + 1386 462 2 0.4236 13.83657 32.78258 8.50669 0 -1 0 + 1387 463 1 -0.8472 25.16946 0.64360 29.23443 -1 1 0 + 1388 463 2 0.4236 24.70521 0.11676 29.94639 -1 1 0 + 1389 463 2 0.4236 25.62255 1.43400 29.64665 -1 1 0 +1390 464 1 -0.8472 24.81460 0.43732 0.69087 0 1 0 +1391 464 2 0.4236 25.28418 0.50225 1.57135 0 1 0 +1392 464 2 0.4236 25.37131 0.87260 35.43053 0 1 -1 + 1393 465 1 -0.8472 13.79635 23.63164 5.71664 1 0 0 + 1394 465 2 0.4236 13.80281 24.21398 4.90376 1 0 0 + 1395 465 2 0.4236 14.71198 23.60934 6.11797 1 0 0 + 1396 466 1 -0.8472 7.02681 26.64979 3.02480 0 0 0 + 1397 466 2 0.4236 7.59047 26.86453 3.82234 0 0 0 + 1398 466 2 0.4236 6.50426 25.81556 3.20083 0 0 0 + 1399 467 1 -0.8472 18.31755 10.37524 9.82001 0 -1 0 + 1400 467 2 0.4236 18.76024 10.64686 8.96548 0 -1 0 + 1401 467 2 0.4236 17.38714 10.74099 9.84429 0 -1 0 + 1402 468 1 -0.8472 22.32508 9.87101 1.19557 -2 1 0 + 1403 468 2 0.4236 21.56595 10.42438 0.85287 -2 1 0 + 1404 468 2 0.4236 21.96657 9.12144 1.75194 -2 1 0 + 1405 469 1 -0.8472 10.90773 22.43777 26.25786 0 -1 0 + 1406 469 2 0.4236 10.29364 22.43731 27.04706 0 -1 0 + 1407 469 2 0.4236 11.59943 21.72491 26.37335 0 -1 0 + 1408 470 1 -0.8472 1.31955 18.38600 3.47899 1 0 0 + 1409 470 2 0.4236 1.00358 17.95410 4.32374 1 0 0 + 1410 470 2 0.4236 1.03894 19.34578 3.47019 1 0 0 + 1411 471 1 -0.8472 6.61696 10.28455 21.35803 0 0 0 + 1412 471 2 0.4236 6.47810 10.37783 22.34389 0 0 0 + 1413 471 2 0.4236 6.98271 9.37573 21.15747 0 0 0 +1414 472 1 -0.8472 19.80189 1.74573 35.19601 0 0 0 +1415 472 2 0.4236 19.85469 1.68501 34.19927 0 0 0 +1416 472 2 0.4236 20.62333 2.19562 0.09930 0 0 1 + 1417 473 1 -0.8472 21.99977 23.12994 31.80630 0 0 0 + 1418 473 2 0.4236 21.08623 23.53105 31.73959 0 0 0 + 1419 473 2 0.4236 22.56169 23.68131 32.42287 0 0 0 + 1420 474 1 -0.8472 21.02839 21.40514 14.85156 0 0 0 + 1421 474 2 0.4236 20.68163 20.80512 15.57245 0 0 0 + 1422 474 2 0.4236 20.71991 21.06957 13.96151 0 0 0 + 1423 475 1 -0.8472 29.50475 13.09304 27.02263 -1 0 0 + 1424 475 2 0.4236 29.90288 12.69977 27.85135 -1 0 0 + 1425 475 2 0.4236 28.79000 13.74578 27.27360 -1 0 0 + 1426 476 1 -0.8472 30.76891 14.86132 17.31904 -1 0 0 + 1427 476 2 0.4236 30.43544 15.73971 17.66131 -1 0 0 + 1428 476 2 0.4236 29.99732 14.23769 17.19387 -1 0 0 + 1429 477 1 -0.8472 12.57397 32.15444 27.84788 0 0 0 + 1430 477 2 0.4236 12.58061 33.06419 27.43279 0 0 0 + 1431 477 2 0.4236 13.51414 31.83439 27.96447 0 0 0 + 1432 478 1 -0.8472 15.45030 20.13796 7.83369 0 0 0 + 1433 478 2 0.4236 16.08221 20.61942 7.22641 0 0 0 + 1434 478 2 0.4236 15.42577 19.16878 7.58860 0 0 0 + 1435 479 1 -0.8472 27.25616 6.25533 2.82631 0 1 0 + 1436 479 2 0.4236 27.49530 5.28459 2.80580 0 1 0 + 1437 479 2 0.4236 27.60427 6.66664 3.66868 0 1 0 + 1438 480 1 -0.8472 32.30705 10.32216 17.65366 0 0 0 + 1439 480 2 0.4236 32.98270 10.38259 16.91891 0 0 0 + 1440 480 2 0.4236 32.39596 9.44025 18.11653 0 0 0 + 1441 481 1 -0.8472 17.34936 14.89275 22.47125 0 0 0 + 1442 481 2 0.4236 18.03506 14.70169 21.76894 0 0 0 + 1443 481 2 0.4236 16.97988 15.81190 22.33499 0 0 0 + 1444 482 1 -0.8472 24.79053 15.57468 30.86227 0 1 0 + 1445 482 2 0.4236 23.87781 15.71532 31.24585 0 1 0 + 1446 482 2 0.4236 25.10405 14.65002 31.07836 0 1 0 + 1447 483 1 -0.8472 18.67769 24.83694 24.40387 1 -1 0 + 1448 483 2 0.4236 17.82202 25.24420 24.08463 1 -1 0 + 1449 483 2 0.4236 18.94221 24.09319 23.79003 1 -1 0 + 1450 484 1 -0.8472 4.57794 35.31046 30.69351 1 -1 0 + 1451 484 2 0.4236 4.13322 34.49598 30.32096 1 -1 0 + 1452 484 2 0.4236 5.54325 35.11397 30.86539 1 -1 0 + 1453 485 1 -0.8472 22.13661 7.03626 27.30735 0 0 0 + 1454 485 2 0.4236 21.73532 6.12073 27.28041 0 0 0 + 1455 485 2 0.4236 22.26947 7.36952 26.37395 0 0 0 + 1456 486 1 -0.8472 20.99558 25.62127 2.95624 0 0 0 + 1457 486 2 0.4236 21.65774 24.88498 2.81706 0 0 0 + 1458 486 2 0.4236 20.30686 25.59152 2.23185 0 0 0 + 1459 487 1 -0.8472 19.89257 8.75533 11.55086 -1 0 0 + 1460 487 2 0.4236 19.31087 9.22927 10.88984 -1 0 0 + 1461 487 2 0.4236 20.72914 9.28320 11.69740 -1 0 0 + 1462 488 1 -0.8472 35.31710 7.31729 4.49850 -1 1 0 + 1463 488 2 0.4236 34.87607 7.03125 3.64783 -1 1 0 + 1464 488 2 0.4236 0.48658 6.63223 4.77027 0 1 0 + 1465 489 1 -0.8472 1.93468 20.42936 32.73686 1 -1 0 + 1466 489 2 0.4236 1.67361 20.93781 31.91633 1 -1 0 + 1467 489 2 0.4236 1.21014 19.78158 32.97220 1 -1 0 + 1468 490 1 -0.8472 14.69430 26.31691 16.51917 0 0 0 + 1469 490 2 0.4236 14.31886 26.44843 17.43661 0 0 0 + 1470 490 2 0.4236 15.68539 26.19779 16.57854 0 0 0 + 1471 491 1 -0.8472 34.54384 29.00446 17.20468 -1 -1 0 + 1472 491 2 0.4236 0.02730 29.12415 17.12773 0 -1 0 + 1473 491 2 0.4236 34.29128 28.09553 16.87304 -1 -1 0 + 1474 492 1 -0.8472 19.16846 26.02402 7.57209 0 -1 0 + 1475 492 2 0.4236 19.48670 25.39677 6.86130 0 -1 0 + 1476 492 2 0.4236 19.88068 26.69918 7.76403 0 -1 0 +1477 493 1 -0.8472 5.88702 11.59786 0.07425 0 1 0 +1478 493 2 0.4236 6.66923 11.61288 34.89865 0 1 -1 +1479 493 2 0.4236 5.13610 12.12691 35.12622 0 1 -1 + 1480 494 1 -0.8472 33.54430 10.18553 28.65200 -1 1 0 + 1481 494 2 0.4236 33.04807 10.13149 27.78556 -1 1 0 + 1482 494 2 0.4236 32.90409 10.06601 29.41082 -1 1 0 + 1483 495 1 -0.8472 12.83483 20.75939 27.34453 0 -1 0 + 1484 495 2 0.4236 12.07365 20.74291 27.99282 0 -1 0 + 1485 495 2 0.4236 13.69810 20.81986 27.84554 0 -1 0 + 1486 496 1 -0.8472 30.94510 23.53453 7.01751 -1 0 0 + 1487 496 2 0.4236 30.81962 23.35913 7.99394 -1 0 0 + 1488 496 2 0.4236 30.83904 22.68007 6.50902 -1 0 0 + 1489 497 1 -0.8472 22.37756 28.64677 11.27235 0 0 0 + 1490 497 2 0.4236 23.14439 29.15394 11.66563 0 0 0 + 1491 497 2 0.4236 22.12411 29.05339 10.39464 0 0 0 + 1492 498 1 -0.8472 23.97854 11.36306 13.98019 0 0 0 + 1493 498 2 0.4236 24.09429 11.95722 14.77616 0 0 0 + 1494 498 2 0.4236 23.63647 11.90091 13.20971 0 0 0 + 1495 499 1 -0.8472 19.09521 19.82511 30.39699 1 -1 0 + 1496 499 2 0.4236 19.60036 19.35866 29.67089 1 -1 0 + 1497 499 2 0.4236 19.30682 19.39935 31.27672 1 -1 0 + 1498 500 1 -0.8472 35.19922 30.25080 30.67423 -1 0 0 + 1499 500 2 0.4236 35.11968 30.98319 31.35042 -1 0 0 + 1500 500 2 0.4236 0.64477 29.94936 30.61978 0 0 0 + 1501 501 1 -0.8472 3.50017 19.44054 27.89680 1 -1 0 + 1502 501 2 0.4236 2.76383 19.17197 28.51776 1 -1 0 + 1503 501 2 0.4236 4.10894 20.08431 28.36038 1 -1 0 + 1504 502 1 -0.8472 8.60624 18.32181 15.04127 1 0 0 + 1505 502 2 0.4236 9.52518 17.98407 14.83766 1 0 0 + 1506 502 2 0.4236 8.43680 18.25484 16.02450 1 0 0 + 1507 503 1 -0.8472 15.08821 12.02710 30.35400 0 0 0 + 1508 503 2 0.4236 14.28360 12.09424 30.94394 0 0 0 + 1509 503 2 0.4236 15.19533 11.08291 30.04259 0 0 0 + 1510 504 1 -0.8472 34.24491 30.19634 12.70342 -1 0 0 + 1511 504 2 0.4236 34.09586 30.85828 13.43799 -1 0 0 + 1512 504 2 0.4236 35.13854 29.76330 12.82128 -1 0 0 + 1513 505 1 -0.8472 16.03697 11.37886 34.59742 -1 0 0 + 1514 505 2 0.4236 15.95641 12.21333 34.05231 -1 0 0 + 1515 505 2 0.4236 16.98162 11.05206 34.56895 -1 0 0 + 1516 506 1 -0.8472 12.41504 19.77380 32.35963 0 -1 0 + 1517 506 2 0.4236 11.71571 19.77015 33.07439 0 -1 0 + 1518 506 2 0.4236 12.91731 20.63796 32.38916 0 -1 0 + 1519 507 1 -0.8472 16.36097 1.43366 13.60126 0 0 0 + 1520 507 2 0.4236 16.72807 2.34873 13.76804 0 0 0 + 1521 507 2 0.4236 15.44831 1.50881 13.19951 0 0 0 + 1522 508 1 -0.8472 3.93183 21.98716 35.05791 0 0 0 + 1523 508 2 0.4236 3.31515 22.73755 34.82010 0 0 0 + 1524 508 2 0.4236 3.41155 21.13561 35.12164 0 0 0 + 1525 509 1 -0.8472 3.71439 25.49750 16.61339 1 -1 0 + 1526 509 2 0.4236 3.62537 25.26586 17.58209 1 -1 0 + 1527 509 2 0.4236 2.80596 25.55275 16.19905 1 -1 0 + 1528 510 1 -0.8472 12.49813 4.72433 6.90178 1 1 0 + 1529 510 2 0.4236 12.68152 4.46705 5.95300 1 1 0 + 1530 510 2 0.4236 11.92587 5.54417 6.92011 1 1 0 + 1531 511 1 -0.8472 0.21426 15.49408 12.45830 0 1 0 + 1532 511 2 0.4236 0.76877 15.57901 11.63051 0 1 0 + 1533 511 2 0.4236 0.62502 14.81481 13.06644 0 1 0 + 1534 512 1 -0.8472 18.25090 16.03637 12.30365 0 -1 0 + 1535 512 2 0.4236 18.61740 15.18248 12.67308 0 -1 0 + 1536 512 2 0.4236 17.51187 16.36413 12.89214 0 -1 0 + 1537 513 1 -0.8472 26.90199 18.56808 6.14062 -1 0 0 + 1538 513 2 0.4236 27.18156 17.80093 6.71792 -1 0 0 + 1539 513 2 0.4236 26.92006 18.28708 5.18110 -1 0 0 + 1540 514 1 -0.8472 33.44158 4.98761 23.03192 0 0 0 + 1541 514 2 0.4236 32.49417 4.84516 23.31844 0 0 0 + 1542 514 2 0.4236 33.92571 4.11266 23.03447 0 0 0 + 1543 515 1 -0.8472 26.44129 7.53555 13.32226 1 0 0 + 1544 515 2 0.4236 26.54376 8.50657 13.53799 1 0 0 + 1545 515 2 0.4236 25.48592 7.34289 13.09834 1 0 0 + 1546 516 1 -0.8472 3.43874 25.26348 19.52892 1 0 0 + 1547 516 2 0.4236 4.41198 25.04174 19.46898 1 0 0 + 1548 516 2 0.4236 3.04847 24.83353 20.34304 1 0 0 + 1549 517 1 -0.8472 31.86517 26.77264 18.86319 0 0 0 + 1550 517 2 0.4236 31.00166 26.65635 19.35388 0 0 0 + 1551 517 2 0.4236 31.70046 26.70873 17.87892 0 0 0 + 1552 518 1 -0.8472 27.98216 0.07525 33.15709 -1 1 0 + 1553 518 2 0.4236 27.13107 0.52974 33.41972 -1 1 0 + 1554 518 2 0.4236 27.92184 35.28628 32.20363 -1 0 0 + 1555 519 1 -0.8472 12.50129 14.38728 2.64535 0 0 0 + 1556 519 2 0.4236 13.42438 14.05242 2.45638 0 0 0 + 1557 519 2 0.4236 12.09868 14.74756 1.80389 0 0 0 + 1558 520 1 -0.8472 35.34916 8.99351 30.23560 -1 0 0 + 1559 520 2 0.4236 34.73199 9.60837 29.74473 -1 0 0 + 1560 520 2 0.4236 35.06089 8.04691 30.09137 -1 0 0 + 1561 521 1 -0.8472 7.94220 25.31780 7.96523 0 0 0 + 1562 521 2 0.4236 8.06154 26.26412 8.26558 0 0 0 + 1563 521 2 0.4236 8.26247 24.69786 8.68151 0 0 0 + 1564 522 1 -0.8472 32.03791 28.47932 8.56656 -1 -1 0 + 1565 522 2 0.4236 31.56358 27.84276 7.95846 -1 -1 0 + 1566 522 2 0.4236 31.37036 29.07938 9.00727 -1 -1 0 + 1567 523 1 -0.8472 7.65336 14.67403 31.36041 0 0 0 + 1568 523 2 0.4236 8.40726 14.08956 31.06046 0 0 0 + 1569 523 2 0.4236 7.62694 15.49955 30.79666 0 0 0 + 1570 524 1 -0.8472 30.65441 5.02976 23.14808 0 0 0 + 1571 524 2 0.4236 30.30747 5.93609 23.38933 0 0 0 + 1572 524 2 0.4236 30.83112 4.99145 22.16460 0 0 0 + 1573 525 1 -0.8472 16.76986 18.16132 2.61590 1 0 0 + 1574 525 2 0.4236 17.48560 17.79983 2.01843 1 0 0 + 1575 525 2 0.4236 15.87769 17.83789 2.30066 1 0 0 + 1576 526 1 -0.8472 24.48759 17.42694 17.19380 0 0 0 + 1577 526 2 0.4236 23.53748 17.31084 17.48316 0 0 0 + 1578 526 2 0.4236 24.53815 17.39594 16.19557 0 0 0 + 1579 527 1 -0.8472 26.31972 10.56189 19.05712 0 0 0 + 1580 527 2 0.4236 25.49704 11.05068 19.34736 0 0 0 + 1581 527 2 0.4236 27.11059 11.16987 19.12656 0 0 0 + 1582 528 1 -0.8472 17.38870 17.66427 5.36716 0 0 0 + 1583 528 2 0.4236 17.21689 17.87159 4.40414 0 0 0 + 1584 528 2 0.4236 16.58704 17.91430 5.91011 0 0 0 + 1585 529 1 -0.8472 17.48244 20.84375 3.33225 0 1 0 + 1586 529 2 0.4236 17.37372 19.87819 3.09591 0 1 0 + 1587 529 2 0.4236 16.89165 21.39879 2.74671 0 1 0 +1588 530 1 -0.8472 30.70458 8.90567 0.58378 -1 0 0 +1589 530 2 0.4236 31.24449 8.89895 1.42547 -1 0 0 +1590 530 2 0.4236 31.26259 9.25839 35.27988 -1 0 -1 + 1591 531 1 -0.8472 17.24589 9.51645 26.97577 0 0 0 + 1592 531 2 0.4236 18.13025 9.65560 27.42124 0 0 0 + 1593 531 2 0.4236 17.05643 10.28431 26.36385 0 0 0 + 1594 532 1 -0.8472 26.71341 8.00338 33.00835 0 0 0 + 1595 532 2 0.4236 26.42681 7.26893 33.62347 0 0 0 + 1596 532 2 0.4236 26.31855 7.85233 32.10215 0 0 0 + 1597 533 1 -0.8472 2.78325 32.00510 13.26572 0 0 0 + 1598 533 2 0.4236 2.91507 31.36776 12.50655 0 0 0 + 1599 533 2 0.4236 1.96186 31.75034 13.77598 0 0 0 + 1600 534 1 -0.8472 7.54073 16.08292 21.84320 0 0 0 + 1601 534 2 0.4236 8.23534 16.76123 22.08271 0 0 0 + 1602 534 2 0.4236 6.93634 15.93418 22.62580 0 0 0 + 1603 535 1 -0.8472 3.58628 2.68780 31.31068 0 0 0 + 1604 535 2 0.4236 3.76967 1.76383 30.97517 0 0 0 + 1605 535 2 0.4236 3.86213 2.75509 32.26949 0 0 0 + 1606 536 1 -0.8472 6.00583 6.06839 35.24653 0 0 0 + 1607 536 2 0.4236 6.91369 6.48023 35.16836 0 0 0 + 1608 536 2 0.4236 5.68158 5.80167 34.33894 0 0 0 + 1609 537 1 -0.8472 10.80036 12.61686 27.53722 0 0 0 + 1610 537 2 0.4236 9.97750 12.15361 27.86624 0 0 0 + 1611 537 2 0.4236 10.98382 13.41653 28.10891 0 0 0 + 1612 538 1 -0.8472 5.91944 34.41204 7.66308 0 0 0 + 1613 538 2 0.4236 6.14214 34.84256 8.53770 0 0 0 + 1614 538 2 0.4236 6.75284 34.04363 7.25115 0 0 0 + 1615 539 1 -0.8472 33.12021 4.34118 33.43145 -1 1 0 + 1616 539 2 0.4236 32.94883 5.26438 33.08754 -1 1 0 + 1617 539 2 0.4236 33.99253 4.00863 33.07312 -1 1 0 + 1618 540 1 -0.8472 4.74684 32.25578 32.81988 0 0 0 + 1619 540 2 0.4236 5.05074 32.39468 31.87738 0 0 0 + 1620 540 2 0.4236 4.52930 33.13978 33.23362 0 0 0 + 1621 541 1 -0.8472 16.34368 0.38986 4.83953 0 0 0 + 1622 541 2 0.4236 16.19150 34.99317 4.43792 0 -1 0 + 1623 541 2 0.4236 17.20531 0.76550 4.49828 0 0 0 + 1624 542 1 -0.8472 29.76131 18.49380 11.69187 0 -1 0 + 1625 542 2 0.4236 29.61478 19.43603 11.99302 0 -1 0 + 1626 542 2 0.4236 29.83147 17.89584 12.49028 0 -1 0 + 1627 543 1 -0.8472 6.35805 20.23986 32.10952 1 0 0 + 1628 543 2 0.4236 5.57858 19.70794 32.44031 1 0 0 + 1629 543 2 0.4236 6.41383 21.09997 32.61649 1 0 0 + 1630 544 1 -0.8472 32.38857 33.76647 35.35730 0 -2 0 + 1631 544 2 0.4236 33.17635 34.34873 35.15652 0 -2 0 + 1632 544 2 0.4236 31.56884 34.33269 35.44322 0 -2 0 + 1633 545 1 -0.8472 33.53486 26.82508 15.67907 0 0 0 + 1634 545 2 0.4236 33.37107 27.59386 15.06094 0 0 0 + 1635 545 2 0.4236 33.49807 25.96909 15.16346 0 0 0 + 1636 546 1 -0.8472 10.26907 4.84569 26.02852 1 -1 0 + 1637 546 2 0.4236 9.72405 4.17803 26.53559 1 -1 0 + 1638 546 2 0.4236 9.95023 4.88603 25.08162 1 -1 0 + 1639 547 1 -0.8472 21.28403 12.99635 30.41007 0 0 0 + 1640 547 2 0.4236 20.58214 12.32606 30.65094 0 0 0 + 1641 547 2 0.4236 22.18941 12.60184 30.56679 0 0 0 + 1642 548 1 -0.8472 15.45481 8.34949 23.37232 0 1 0 + 1643 548 2 0.4236 15.34211 7.85035 22.51318 0 1 0 + 1644 548 2 0.4236 15.95691 9.19731 23.20178 0 1 0 + 1645 549 1 -0.8472 6.96958 34.41552 28.25021 0 0 0 + 1646 549 2 0.4236 7.79222 34.25461 28.79553 0 0 0 + 1647 549 2 0.4236 6.60968 35.32665 28.45087 0 0 0 + 1648 550 1 -0.8472 1.81120 22.89329 2.63042 1 0 0 + 1649 550 2 0.4236 1.51110 22.86467 1.67697 1 0 0 + 1650 550 2 0.4236 2.73105 23.28247 2.67879 1 0 0 + 1651 551 1 -0.8472 33.27708 8.93368 34.77738 -1 1 0 + 1652 551 2 0.4236 33.57818 8.11473 34.28892 -1 1 0 + 1653 551 2 0.4236 33.98756 9.21787 35.42114 -1 1 0 + 1654 552 1 -0.8472 11.27199 30.33037 3.53330 0 0 0 + 1655 552 2 0.4236 10.35333 30.48973 3.17189 0 0 0 + 1656 552 2 0.4236 11.25036 29.56038 4.17096 0 0 0 + 1657 553 1 -0.8472 24.96636 2.12275 18.90257 0 0 0 + 1658 553 2 0.4236 25.44410 2.99883 18.83795 0 0 0 + 1659 553 2 0.4236 25.45123 1.52498 19.54094 0 0 0 + 1660 554 1 -0.8472 27.58019 12.91742 22.80616 0 0 0 + 1661 554 2 0.4236 28.29124 13.45090 22.34814 0 0 0 + 1662 554 2 0.4236 26.90451 13.53665 23.20614 0 0 0 + 1663 555 1 -0.8472 34.68260 21.43958 8.60959 -1 0 0 + 1664 555 2 0.4236 35.08744 21.14186 7.74503 -1 0 0 + 1665 555 2 0.4236 35.34813 21.32323 9.34679 -1 0 0 + 1666 556 1 -0.8472 2.65962 24.63473 34.38402 0 0 0 + 1667 556 2 0.4236 2.57897 25.62078 34.23869 0 0 0 + 1668 556 2 0.4236 1.76410 24.25847 34.62159 0 0 0 + 1669 557 1 -0.8472 21.59833 20.27093 9.43207 0 0 0 + 1670 557 2 0.4236 21.32327 19.78101 10.25927 0 0 0 + 1671 557 2 0.4236 21.09950 19.90496 8.64649 0 0 0 + 1672 558 1 -0.8472 17.70144 4.33007 28.81474 0 0 0 + 1673 558 2 0.4236 18.33363 5.07425 28.59897 0 0 0 + 1674 558 2 0.4236 17.03534 4.23363 28.07517 0 0 0 +1675 559 1 -0.8472 33.59561 13.39591 0.69504 0 0 0 +1676 559 2 0.4236 32.66438 13.04141 0.61064 0 0 0 +1677 559 2 0.4236 34.13957 13.09357 35.35950 0 0 -1 + 1678 560 1 -0.8472 14.71291 15.98052 26.96475 1 0 0 + 1679 560 2 0.4236 14.68940 15.38014 27.76408 1 0 0 + 1680 560 2 0.4236 15.50516 16.58746 27.02696 1 0 0 + 1681 561 1 -0.8472 25.20926 21.95638 32.28218 0 0 0 + 1682 561 2 0.4236 25.33609 22.94246 32.17492 0 0 0 + 1683 561 2 0.4236 25.09606 21.73837 33.25152 0 0 0 + 1684 562 1 -0.8472 6.81526 3.83312 8.73036 0 1 0 + 1685 562 2 0.4236 7.62105 3.29226 8.48921 0 1 0 + 1686 562 2 0.4236 6.08089 3.22287 9.02737 0 1 0 + 1687 563 1 -0.8472 9.21702 7.78445 24.95624 0 0 0 + 1688 563 2 0.4236 9.47416 7.18840 25.71687 0 0 0 + 1689 563 2 0.4236 10.02681 8.26676 24.62226 0 0 0 + 1690 564 1 -0.8472 25.76586 24.56681 31.82123 0 0 0 + 1691 564 2 0.4236 25.20099 25.37507 31.65516 0 0 0 + 1692 564 2 0.4236 26.09305 24.20382 30.94877 0 0 0 + 1693 565 1 -0.8472 15.97743 35.01757 18.88740 0 0 0 + 1694 565 2 0.4236 15.03871 35.06053 19.22932 0 0 0 + 1695 565 2 0.4236 16.00030 35.32615 17.93653 0 0 0 + 1696 566 1 -0.8472 13.18216 8.82755 28.56636 0 1 0 + 1697 566 2 0.4236 12.35671 9.24546 28.94568 0 1 0 + 1698 566 2 0.4236 12.95644 7.93180 28.18339 0 1 0 + 1699 567 1 -0.8472 1.80194 1.01226 14.21230 0 1 0 + 1700 567 2 0.4236 2.18788 0.27894 14.77198 0 1 0 + 1701 567 2 0.4236 1.33221 0.61709 13.42293 0 1 0 + 1702 568 1 -0.8472 27.20550 9.56978 16.51573 -1 1 0 + 1703 568 2 0.4236 28.12206 9.17580 16.44728 -1 1 0 + 1704 568 2 0.4236 27.04703 9.88443 17.45157 -1 1 0 + 1705 569 1 -0.8472 22.64424 27.88338 17.70052 0 -1 0 + 1706 569 2 0.4236 23.43078 27.61638 17.14368 0 -1 0 + 1707 569 2 0.4236 22.38629 28.82476 17.48330 0 -1 0 + 1708 570 1 -0.8472 35.02158 17.75754 30.83771 0 0 0 + 1709 570 2 0.4236 35.30041 16.79972 30.90651 0 0 0 + 1710 570 2 0.4236 34.14333 17.81577 30.36307 0 0 0 + 1711 571 1 -0.8472 32.15586 2.34760 15.77797 0 1 0 + 1712 571 2 0.4236 31.26558 2.78947 15.88800 0 1 0 + 1713 571 2 0.4236 32.68395 2.83108 15.07987 0 1 0 +1714 572 1 -0.8472 17.34961 33.61287 35.05546 0 -1 0 +1715 572 2 0.4236 17.10728 34.46054 34.58359 0 -1 0 +1716 572 2 0.4236 18.19587 33.74839 0.12349 0 -1 1 + 1717 573 1 -0.8472 1.64640 29.18838 17.08087 0 0 0 + 1718 573 2 0.4236 2.48391 28.77481 16.72381 0 0 0 + 1719 573 2 0.4236 1.56160 28.98120 18.05545 0 0 0 + 1720 574 1 -0.8472 19.94612 29.25446 0.27014 0 0 0 + 1721 574 2 0.4236 19.17911 29.86414 0.07048 0 0 0 + 1722 574 2 0.4236 20.43600 29.58787 1.07563 0 0 0 + 1723 575 1 -0.8472 27.87603 8.50157 9.36777 -1 1 0 + 1724 575 2 0.4236 28.70979 7.95495 9.29035 -1 1 0 + 1725 575 2 0.4236 28.11733 9.45097 9.56858 -1 1 0 + 1726 576 1 -0.8472 9.83071 27.74860 10.85315 0 -1 0 + 1727 576 2 0.4236 9.99678 28.63555 11.28401 0 -1 0 + 1728 576 2 0.4236 10.41174 27.65689 10.04446 0 -1 0 + 1729 577 1 -0.8472 26.30076 18.46106 21.29522 0 0 0 + 1730 577 2 0.4236 27.23387 18.82014 21.31372 0 0 0 + 1731 577 2 0.4236 25.65252 19.21035 21.43056 0 0 0 + 1732 578 1 -0.8472 14.19228 25.99075 24.74448 0 0 0 + 1733 578 2 0.4236 13.37034 26.52353 24.94578 0 0 0 + 1734 578 2 0.4236 13.97910 25.01532 24.79992 0 0 0 + 1735 579 1 -0.8472 0.68976 8.97160 18.20142 0 0 0 + 1736 579 2 0.4236 1.50615 8.39601 18.15506 0 0 0 + 1737 579 2 0.4236 0.62225 9.38166 19.11096 0 0 0 + 1738 580 1 -0.8472 32.76423 11.76137 33.24131 0 0 0 + 1739 580 2 0.4236 33.62352 11.28392 33.05802 0 0 0 + 1740 580 2 0.4236 32.41726 11.49035 34.13912 0 0 0 + 1741 581 1 -0.8472 11.58373 29.93909 6.86949 0 0 0 + 1742 581 2 0.4236 10.77287 30.52328 6.83510 0 0 0 + 1743 581 2 0.4236 12.37620 30.48458 7.14222 0 0 0 + 1744 582 1 -0.8472 33.74122 13.45829 4.64075 -1 0 0 + 1745 582 2 0.4236 33.22265 14.06928 5.23885 -1 0 0 + 1746 582 2 0.4236 34.30148 14.00090 4.01492 -1 0 0 + 1747 583 1 -0.8472 20.83466 4.12619 19.87995 0 0 0 + 1748 583 2 0.4236 20.90699 4.49091 20.80821 0 0 0 + 1749 583 2 0.4236 21.52331 4.55806 19.29756 0 0 0 + 1750 584 1 -0.8472 25.28194 8.95363 23.55618 -1 0 0 + 1751 584 2 0.4236 25.07171 8.56157 22.66061 -1 0 0 + 1752 584 2 0.4236 26.10167 9.52213 23.48703 -1 0 0 + 1753 585 1 -0.8472 16.33729 1.45574 7.44614 0 0 0 + 1754 585 2 0.4236 15.53044 1.08269 7.90423 0 0 0 + 1755 585 2 0.4236 16.36871 1.12364 6.50346 0 0 0 + 1756 586 1 -0.8472 8.46319 10.81445 34.53439 0 0 0 + 1757 586 2 0.4236 8.54521 10.89899 33.54137 0 0 0 + 1758 586 2 0.4236 9.27543 11.20225 34.97011 0 0 0 + 1759 587 1 -0.8472 5.31409 12.69501 25.27016 0 1 0 + 1760 587 2 0.4236 5.23857 12.42388 26.22972 0 1 0 + 1761 587 2 0.4236 6.23790 13.03342 25.09115 0 1 0 +1762 588 1 -0.8472 28.51799 6.14980 35.24103 0 0 0 +1763 588 2 0.4236 28.05275 6.99734 0.04908 0 0 1 +1764 588 2 0.4236 29.45447 6.16511 0.14421 0 0 1 + 1765 589 1 -0.8472 7.79048 0.69800 16.22464 0 0 0 + 1766 589 2 0.4236 8.07389 0.82781 17.17477 0 0 0 + 1767 589 2 0.4236 8.56353 0.88323 15.61796 0 0 0 + 1768 590 1 -0.8472 21.68103 21.80441 29.46721 0 0 0 + 1769 590 2 0.4236 21.56755 21.92180 30.45375 0 0 0 + 1770 590 2 0.4236 22.63704 21.59233 29.26456 0 0 0 + 1771 591 1 -0.8472 20.54184 13.51645 22.88712 -1 0 0 + 1772 591 2 0.4236 20.07263 13.38529 23.76036 -1 0 0 + 1773 591 2 0.4236 21.43912 13.92704 23.04922 -1 0 0 + 1774 592 1 -0.8472 13.50917 24.41399 28.85132 0 -1 0 + 1775 592 2 0.4236 13.78505 25.37319 28.78968 0 -1 0 + 1776 592 2 0.4236 12.70570 24.26063 28.27612 0 -1 0 + 1777 593 1 -0.8472 10.69717 24.26781 31.92530 0 0 0 + 1778 593 2 0.4236 10.60386 23.69449 32.73927 0 0 0 + 1779 593 2 0.4236 11.64253 24.58417 31.84703 0 0 0 + 1780 594 1 -0.8472 15.95641 28.97606 35.05433 0 0 0 + 1781 594 2 0.4236 15.96032 28.35359 34.27173 0 0 0 + 1782 594 2 0.4236 16.63849 29.69350 34.91293 0 0 0 + 1783 595 1 -0.8472 1.56519 0.69624 33.04969 1 0 0 + 1784 595 2 0.4236 2.41404 1.17829 33.26655 1 0 0 + 1785 595 2 0.4236 1.02145 0.58791 33.88191 1 0 0 + 1786 596 1 -0.8472 26.14808 0.15636 10.03297 -1 0 0 + 1787 596 2 0.4236 25.35902 0.37673 9.45958 -1 0 0 + 1788 596 2 0.4236 26.26507 34.67035 10.07186 -1 -1 0 + 1789 597 1 -0.8472 9.77710 17.72509 3.30862 0 0 0 + 1790 597 2 0.4236 9.87566 17.93734 4.28081 0 0 0 + 1791 597 2 0.4236 9.23151 16.89378 3.20261 0 0 0 + 1792 598 1 -0.8472 8.75437 5.30451 3.09848 0 0 0 + 1793 598 2 0.4236 8.58717 5.03388 4.04651 0 0 0 + 1794 598 2 0.4236 9.12882 6.23147 3.07757 0 0 0 + 1795 599 1 -0.8472 20.48155 15.91696 9.33594 0 1 0 + 1796 599 2 0.4236 20.56631 15.50253 8.42984 0 1 0 + 1797 599 2 0.4236 20.25513 15.21003 10.00593 0 1 0 + 1798 600 1 -0.8472 16.82592 18.58235 26.17211 0 0 0 + 1799 600 2 0.4236 16.58729 18.45481 27.13479 0 0 0 + 1800 600 2 0.4236 17.21880 17.73656 25.81123 0 0 0 + 1801 601 1 -0.8472 13.75988 16.98609 22.32067 0 0 0 + 1802 601 2 0.4236 13.58551 17.90045 21.95528 0 0 0 + 1803 601 2 0.4236 13.59282 16.98375 23.30660 0 0 0 + 1804 602 1 -0.8472 32.62092 30.40547 6.88962 -1 -1 0 + 1805 602 2 0.4236 33.54931 30.43647 6.51938 -1 -1 0 + 1806 602 2 0.4236 32.51760 29.59252 7.46270 -1 -1 0 + 1807 603 1 -0.8472 17.63259 14.60870 27.18186 0 0 0 + 1808 603 2 0.4236 17.90163 15.20858 27.93536 0 0 0 + 1809 603 2 0.4236 17.69519 15.10944 26.31855 0 0 0 + 1810 604 1 -0.8472 11.62304 21.25939 16.47149 0 -1 0 + 1811 604 2 0.4236 11.45555 21.34865 15.48971 0 -1 0 + 1812 604 2 0.4236 12.53275 21.61367 16.68797 0 -1 0 + 1813 605 1 -0.8472 1.37600 22.27800 20.75203 1 -1 0 + 1814 605 2 0.4236 2.16943 21.85760 20.31195 1 -1 0 + 1815 605 2 0.4236 0.71462 21.56840 20.99487 1 -1 0 + 1816 606 1 -0.8472 7.18336 3.26655 24.36441 0 0 0 + 1817 606 2 0.4236 7.73090 3.12923 23.53899 0 0 0 + 1818 606 2 0.4236 6.93062 2.37846 24.74831 0 0 0 + 1819 607 1 -0.8472 17.64928 11.95310 5.42292 0 1 0 + 1820 607 2 0.4236 17.65692 12.93297 5.62238 0 1 0 + 1821 607 2 0.4236 17.41402 11.81051 4.46152 0 1 0 + 1822 608 1 -0.8472 12.84893 11.66550 32.14876 0 0 0 + 1823 608 2 0.4236 12.95939 10.67321 32.09304 0 0 0 + 1824 608 2 0.4236 12.82748 11.94512 33.10860 0 0 0 + 1825 609 1 -0.8472 28.12575 28.57384 6.21194 0 0 0 + 1826 609 2 0.4236 28.72740 27.81667 6.46617 0 0 0 + 1827 609 2 0.4236 28.67723 29.34738 5.89972 0 0 0 + 1828 610 1 -0.8472 9.60709 10.13056 3.09602 1 -1 0 + 1829 610 2 0.4236 9.17047 10.54496 3.89451 1 -1 0 + 1830 610 2 0.4236 8.91309 9.92399 2.40636 1 -1 0 + 1831 611 1 -0.8472 14.42399 9.53487 14.30475 0 1 0 + 1832 611 2 0.4236 13.60791 9.60745 14.87804 0 1 0 + 1833 611 2 0.4236 14.17935 9.71599 13.35221 0 1 0 + 1834 612 1 -0.8472 6.04272 31.14841 20.46104 0 0 0 + 1835 612 2 0.4236 6.17572 30.16410 20.34531 0 0 0 + 1836 612 2 0.4236 5.07705 31.33535 20.64129 0 0 0 + 1837 613 1 -0.8472 8.78576 13.58167 21.88541 0 1 0 + 1838 613 2 0.4236 8.51872 14.54379 21.93947 0 1 0 + 1839 613 2 0.4236 8.23602 13.12187 21.18806 0 1 0 + 1840 614 1 -0.8472 23.47264 35.27453 4.51530 0 -1 0 + 1841 614 2 0.4236 22.72332 35.48142 5.14431 0 -1 0 + 1842 614 2 0.4236 24.07799 34.59518 4.92999 0 -1 0 + 1843 615 1 -0.8472 22.09421 26.54415 21.45579 0 -1 0 + 1844 615 2 0.4236 22.63260 26.42361 22.28983 0 -1 0 + 1845 615 2 0.4236 22.48660 27.28439 20.90987 0 -1 0 + 1846 616 1 -0.8472 1.89433 19.06162 16.66270 0 0 0 + 1847 616 2 0.4236 1.86443 20.00623 16.33594 0 0 0 + 1848 616 2 0.4236 2.02229 19.05590 17.65444 0 0 0 + 1849 617 1 -0.8472 23.96341 29.62000 2.08747 0 -1 0 + 1850 617 2 0.4236 23.99764 29.18700 1.18675 0 -1 0 + 1851 617 2 0.4236 23.53567 30.52040 2.00840 0 -1 0 + 1852 618 1 -0.8472 1.04699 21.68909 30.59706 1 0 0 + 1853 618 2 0.4236 0.06322 21.75332 30.42968 1 0 0 + 1854 618 2 0.4236 1.52221 21.52537 29.73261 1 0 0 + 1855 619 1 -0.8472 13.73343 18.77132 16.05091 0 0 0 + 1856 619 2 0.4236 14.06321 19.15745 16.91235 0 0 0 + 1857 619 2 0.4236 13.14349 17.98673 16.24155 0 0 0 + 1858 620 1 -0.8472 15.02561 6.07506 33.93037 -1 0 0 + 1859 620 2 0.4236 14.69203 5.58795 33.12331 -1 0 0 + 1860 620 2 0.4236 16.00179 5.89373 34.04930 -1 0 0 + 1861 621 1 -0.8472 31.82004 4.72525 13.93145 -1 0 0 + 1862 621 2 0.4236 32.80133 4.70708 14.12290 -1 0 0 + 1863 621 2 0.4236 31.64404 4.28540 13.05084 -1 0 0 + 1864 622 1 -0.8472 24.24718 18.83076 7.32403 0 -1 0 + 1865 622 2 0.4236 24.38484 18.48542 8.25232 0 -1 0 + 1866 622 2 0.4236 25.05566 18.63064 6.77066 0 -1 0 + 1867 623 1 -0.8472 30.09284 6.70704 9.34689 0 1 0 + 1868 623 2 0.4236 30.69726 6.91436 10.11606 0 1 0 + 1869 623 2 0.4236 30.28333 5.78402 9.01266 0 1 0 + 1870 624 1 -0.8472 6.44543 22.20950 16.52672 1 0 0 + 1871 624 2 0.4236 6.63187 21.34098 16.98587 1 0 0 + 1872 624 2 0.4236 6.77340 22.16484 15.58312 1 0 0 + 1873 625 1 -0.8472 26.53478 4.89718 31.49008 0 1 0 + 1874 625 2 0.4236 26.41051 4.03196 31.00435 0 1 0 + 1875 625 2 0.4236 26.22715 5.65186 30.91066 0 1 0 + 1876 626 1 -0.8472 16.62247 30.95933 12.57652 1 0 0 + 1877 626 2 0.4236 17.56488 31.25972 12.42949 1 0 0 + 1878 626 2 0.4236 16.48769 30.74633 13.54423 1 0 0 + 1879 627 1 -0.8472 4.87356 34.61588 34.44684 1 0 0 + 1880 627 2 0.4236 5.82893 34.71196 34.72609 1 0 0 + 1881 627 2 0.4236 4.56619 35.46296 34.01332 1 0 0 + 1882 628 1 -0.8472 2.50288 12.28157 26.08722 0 0 0 + 1883 628 2 0.4236 3.13155 12.43414 25.32471 0 0 0 + 1884 628 2 0.4236 2.99882 11.86718 26.85029 0 0 0 + 1885 629 1 -0.8472 11.00864 34.29008 8.17472 1 0 0 + 1886 629 2 0.4236 10.75288 34.35239 9.13942 1 0 0 + 1887 629 2 0.4236 11.92072 33.88754 8.09702 1 0 0 + 1888 630 1 -0.8472 10.46049 16.76421 26.41355 1 0 0 + 1889 630 2 0.4236 10.39178 17.07209 27.36247 1 0 0 + 1890 630 2 0.4236 11.33817 17.05388 26.03185 1 0 0 + 1891 631 1 -0.8472 17.21021 4.69788 34.67997 0 0 0 + 1892 631 2 0.4236 18.05686 4.48907 34.19055 0 0 0 + 1893 631 2 0.4236 16.82710 3.85507 35.05788 0 0 0 + 1894 632 1 -0.8472 6.97884 35.13516 32.26371 1 0 0 + 1895 632 2 0.4236 7.59758 34.77477 32.96174 1 0 0 + 1896 632 2 0.4236 6.61568 0.51094 32.56360 1 1 0 + 1897 633 1 -0.8472 30.26859 4.69039 18.04698 -1 1 0 + 1898 633 2 0.4236 29.55779 4.00235 17.90097 -1 1 0 + 1899 633 2 0.4236 30.81486 4.44085 18.84653 -1 1 0 + 1900 634 1 -0.8472 14.15940 29.63583 31.68196 0 0 0 + 1901 634 2 0.4236 14.48471 30.44261 31.18878 0 0 0 + 1902 634 2 0.4236 13.52149 29.12674 31.10417 0 0 0 + 1903 635 1 -0.8472 22.40695 9.51538 9.73709 0 -1 0 + 1904 635 2 0.4236 22.71650 9.39313 10.68006 0 -1 0 + 1905 635 2 0.4236 23.02803 9.03544 9.11755 0 -1 0 +1906 636 1 -0.8472 22.24110 0.13405 35.41380 0 1 0 +1907 636 2 0.4236 23.18710 0.36198 0.19705 0 1 1 +1908 636 2 0.4236 21.82447 35.13999 0.72551 0 0 1 + 1909 637 1 -0.8472 30.80385 21.12738 11.62863 -1 0 0 + 1910 637 2 0.4236 31.14074 21.74078 10.91430 -1 0 0 + 1911 637 2 0.4236 31.43501 20.35877 11.73284 -1 0 0 + 1912 638 1 -0.8472 27.44982 5.23264 21.39756 -1 1 0 + 1913 638 2 0.4236 27.87749 4.69834 22.12667 -1 1 0 + 1914 638 2 0.4236 26.53230 5.51030 21.68213 -1 1 0 + 1915 639 1 -0.8472 34.24917 16.52998 18.53573 0 0 0 + 1916 639 2 0.4236 34.91854 15.83455 18.79704 0 0 0 + 1917 639 2 0.4236 33.88140 16.31527 17.63097 0 0 0 + 1918 640 1 -0.8472 32.11496 35.09444 16.48223 -1 -1 0 + 1919 640 2 0.4236 32.98099 34.62132 16.64370 -1 -1 0 + 1920 640 2 0.4236 32.28074 0.41008 15.93745 -1 0 0 + 1921 641 1 -0.8472 5.27734 31.52491 24.59110 0 0 0 + 1922 641 2 0.4236 5.60492 31.56543 25.53502 0 0 0 + 1923 641 2 0.4236 5.51573 32.37348 24.11884 0 0 0 + 1924 642 1 -0.8472 25.79032 25.41548 18.29376 -1 -1 0 + 1925 642 2 0.4236 25.40295 24.65387 17.77428 -1 -1 0 + 1926 642 2 0.4236 25.77416 26.24352 17.73341 -1 -1 0 + 1927 643 1 -0.8472 4.93641 22.51784 12.73054 0 0 0 + 1928 643 2 0.4236 4.69948 21.69044 13.23963 0 0 0 + 1929 643 2 0.4236 4.10361 23.03009 12.52080 0 0 0 + 1930 644 1 -0.8472 12.37112 3.40763 24.86826 0 1 0 + 1931 644 2 0.4236 11.49379 3.77028 25.18239 0 1 0 + 1932 644 2 0.4236 12.78779 4.05198 24.22706 0 1 0 + 1933 645 1 -0.8472 17.22029 21.06776 32.22767 0 -1 0 + 1934 645 2 0.4236 16.31836 21.34141 31.89361 0 -1 0 + 1935 645 2 0.4236 17.79546 20.80136 31.45424 0 -1 0 + 1936 646 1 -0.8472 25.41708 13.65890 27.43081 -1 1 0 + 1937 646 2 0.4236 25.98599 14.41622 27.11030 -1 1 0 + 1938 646 2 0.4236 25.01532 13.18819 26.64533 -1 1 0 + 1939 647 1 -0.8472 31.34632 0.92208 6.09316 0 0 0 + 1940 647 2 0.4236 31.49282 0.15259 5.47156 0 0 0 + 1941 647 2 0.4236 31.97499 1.66376 5.85935 0 0 0 + 1942 648 1 -0.8472 14.52004 27.14727 0.85218 -1 0 0 + 1943 648 2 0.4236 15.06648 27.88580 0.45734 -1 0 0 + 1944 648 2 0.4236 14.58562 27.18061 1.84945 -1 0 0 + 1945 649 1 -0.8472 28.87721 13.80291 31.40189 -1 0 0 + 1946 649 2 0.4236 29.22211 14.24724 32.22866 -1 0 0 + 1947 649 2 0.4236 28.79132 14.47981 30.67082 -1 0 0 + 1948 650 1 -0.8472 32.29796 1.69820 30.01991 0 -1 0 + 1949 650 2 0.4236 33.00137 1.81610 29.31905 0 -1 0 + 1950 650 2 0.4236 31.71924 2.51309 30.05174 0 -1 0 + 1951 651 1 -0.8472 12.62275 8.26297 20.33641 0 0 0 + 1952 651 2 0.4236 12.83214 8.94927 21.03291 0 0 0 + 1953 651 2 0.4236 12.11033 8.68982 19.59131 0 0 0 + 1954 652 1 -0.8472 12.52870 25.44736 7.87215 0 -1 0 + 1955 652 2 0.4236 13.00949 24.63086 8.19160 0 -1 0 + 1956 652 2 0.4236 11.64782 25.18323 7.47946 0 -1 0 + 1957 653 1 -0.8472 1.10135 20.97932 6.76187 1 1 0 + 1958 653 2 0.4236 0.77452 21.00470 5.81713 1 1 0 + 1959 653 2 0.4236 1.95251 21.49916 6.83418 1 1 0 + 1960 654 1 -0.8472 4.82318 0.41033 13.47479 0 0 0 + 1961 654 2 0.4236 4.34431 1.17994 13.05247 0 0 0 + 1962 654 2 0.4236 4.19429 35.42103 14.07377 0 -1 0 + 1963 655 1 -0.8472 7.97884 14.32280 18.39989 0 0 0 + 1964 655 2 0.4236 7.48239 15.14935 18.66497 0 0 0 + 1965 655 2 0.4236 7.76346 13.58505 19.03968 0 0 0 + 1966 656 1 -0.8472 6.57446 10.83838 7.69395 0 0 0 + 1967 656 2 0.4236 6.93009 11.43436 6.97402 0 0 0 + 1968 656 2 0.4236 5.66493 11.15166 7.96697 0 0 0 + 1969 657 1 -0.8472 10.13095 13.45872 3.45462 0 1 0 + 1970 657 2 0.4236 9.41951 14.02714 3.04153 0 1 0 + 1971 657 2 0.4236 11.02593 13.74220 3.11019 0 1 0 + 1972 658 1 -0.8472 2.78532 23.98202 22.68429 0 0 0 + 1973 658 2 0.4236 2.24782 23.30083 22.18728 0 0 0 + 1974 658 2 0.4236 2.17788 24.69474 23.03500 0 0 0 + 1975 659 1 -0.8472 29.67656 34.06660 9.42289 -1 0 0 + 1976 659 2 0.4236 29.37866 33.82615 10.34668 -1 0 0 + 1977 659 2 0.4236 30.23579 34.89486 9.45798 -1 0 0 + 1978 660 1 -0.8472 17.39594 25.01387 9.24906 0 0 0 + 1979 660 2 0.4236 18.05931 25.56908 8.74748 0 0 0 + 1980 660 2 0.4236 17.77142 24.09901 9.39751 0 0 0 + 1981 661 1 -0.8472 11.13962 14.07290 32.95291 1 1 0 + 1982 661 2 0.4236 12.10521 14.31041 33.05855 1 1 0 + 1983 661 2 0.4236 10.89910 13.35632 33.60762 1 1 0 + 1984 662 1 -0.8472 1.12560 32.01749 27.53520 1 -1 0 + 1985 662 2 0.4236 0.50802 31.29622 27.84873 1 -1 0 + 1986 662 2 0.4236 1.59583 31.71636 26.70563 1 -1 0 + 1987 663 1 -0.8472 16.74625 10.36654 22.14588 0 0 0 + 1988 663 2 0.4236 17.64843 10.13447 22.50939 0 0 0 + 1989 663 2 0.4236 16.51070 11.30163 22.41056 0 0 0 + 1990 664 1 -0.8472 3.76112 22.81755 16.72253 1 0 0 + 1991 664 2 0.4236 3.76488 23.70592 16.26345 1 0 0 + 1992 664 2 0.4236 4.62662 22.34826 16.54749 1 0 0 + 1993 665 1 -0.8472 1.85948 2.74210 27.37838 0 0 0 + 1994 665 2 0.4236 2.54531 2.13125 27.77390 0 0 0 + 1995 665 2 0.4236 2.26198 3.24393 26.61279 0 0 0 + 1996 666 1 -0.8472 20.97424 33.57107 23.88091 0 -1 0 + 1997 666 2 0.4236 21.63334 32.88392 24.18640 0 -1 0 + 1998 666 2 0.4236 21.20496 33.86510 22.95340 0 -1 0 + 1999 667 1 -0.8472 14.93408 6.66163 21.35215 0 0 0 + 2000 667 2 0.4236 14.05135 6.86086 20.92664 0 0 0 + 2001 667 2 0.4236 15.24543 5.75568 21.06534 0 0 0 + 2002 668 1 -0.8472 22.24661 5.18993 17.87120 -1 0 0 + 2003 668 2 0.4236 21.88334 5.84047 17.20429 -1 0 0 + 2004 668 2 0.4236 23.18057 5.45019 18.11607 -1 0 0 + 2005 669 1 -0.8472 31.73682 29.92390 26.37363 0 0 0 + 2006 669 2 0.4236 32.14422 30.71878 26.82324 0 0 0 + 2007 669 2 0.4236 32.44996 29.40671 25.90048 0 0 0 + 2008 670 1 -0.8472 24.55434 23.28950 6.20609 0 0 0 + 2009 670 2 0.4236 25.36818 22.74753 5.99656 0 0 0 + 2010 670 2 0.4236 24.07519 22.88402 6.98448 0 0 0 + 2011 671 1 -0.8472 25.88342 13.36903 31.69745 -1 0 0 + 2012 671 2 0.4236 26.03190 12.91533 30.81878 -1 0 0 + 2013 671 2 0.4236 26.76589 13.60848 32.10225 -1 0 0 + 2014 672 1 -0.8472 31.90813 10.22292 30.85168 0 0 0 + 2015 672 2 0.4236 32.27321 10.76208 31.61060 0 0 0 + 2016 672 2 0.4236 31.57679 9.34449 31.19597 0 0 0 + 2017 673 1 -0.8472 0.84917 3.66386 11.68793 1 0 0 + 2018 673 2 0.4236 0.87147 4.59942 12.04035 1 0 0 + 2019 673 2 0.4236 0.11734 3.57978 11.01167 1 0 0 + 2020 674 1 -0.8472 12.64903 6.40652 27.25223 0 0 0 + 2021 674 2 0.4236 11.96507 5.83731 26.79599 0 0 0 + 2022 674 2 0.4236 12.95893 7.12172 26.62584 0 0 0 + 2023 675 1 -0.8472 15.96014 7.99372 15.88506 0 0 0 + 2024 675 2 0.4236 16.82916 7.82162 15.42119 0 0 0 + 2025 675 2 0.4236 15.41302 8.63081 15.34222 0 0 0 + 2026 676 1 -0.8472 20.03414 20.13508 12.66468 0 0 0 + 2027 676 2 0.4236 19.40056 20.36704 11.92663 0 0 0 + 2028 676 2 0.4236 20.38174 19.20773 12.52643 0 0 0 + 2029 677 1 -0.8472 21.35607 6.30596 10.13191 -1 -1 0 + 2030 677 2 0.4236 20.87120 5.49454 10.45802 -1 -1 0 + 2031 677 2 0.4236 21.92900 6.66958 10.86641 -1 -1 0 + 2032 678 1 -0.8472 35.15594 30.93388 9.83376 0 -1 0 + 2033 678 2 0.4236 0.35036 31.64684 9.85606 1 -1 0 + 2034 678 2 0.4236 34.54498 31.04238 10.61796 0 -1 0 + 2035 679 1 -0.8472 4.27599 27.25591 26.29171 1 0 0 + 2036 679 2 0.4236 3.35993 27.34560 25.90091 1 0 0 + 2037 679 2 0.4236 4.46769 28.04433 26.87613 1 0 0 + 2038 680 1 -0.8472 26.85910 19.33388 13.68598 0 0 0 + 2039 680 2 0.4236 25.94374 19.21433 14.07041 0 0 0 + 2040 680 2 0.4236 27.54078 19.00690 14.34044 0 0 0 + 2041 681 1 -0.8472 7.83799 28.18316 15.83373 0 -1 0 + 2042 681 2 0.4236 7.63358 27.28088 16.21326 0 -1 0 + 2043 681 2 0.4236 7.00487 28.73603 15.82129 0 -1 0 + 2044 682 1 -0.8472 32.63008 18.22477 29.78603 0 1 0 + 2045 682 2 0.4236 32.15689 17.45297 29.36130 0 1 0 + 2046 682 2 0.4236 31.95728 18.87141 30.14536 0 1 0 + 2047 683 1 -0.8472 3.25697 33.47986 7.39333 -1 -1 0 + 2048 683 2 0.4236 4.14306 33.83996 7.68509 -1 -1 0 + 2049 683 2 0.4236 3.20470 33.49200 6.39478 -1 -1 0 + 2050 684 1 -0.8472 0.84315 3.50002 3.05779 0 0 0 + 2051 684 2 0.4236 1.36600 4.15296 3.60572 0 0 0 + 2052 684 2 0.4236 1.42306 2.71869 2.82722 0 0 0 + 2053 685 1 -0.8472 25.12323 15.97604 21.47090 0 0 0 + 2054 685 2 0.4236 25.42059 15.67903 22.37827 0 0 0 + 2055 685 2 0.4236 25.51738 16.87233 21.26778 0 0 0 + 2056 686 1 -0.8472 7.27468 22.21053 14.03439 0 0 0 + 2057 686 2 0.4236 7.89057 21.43472 13.89746 0 0 0 + 2058 686 2 0.4236 6.46872 22.10302 13.45235 0 0 0 + 2059 687 1 -0.8472 14.24074 9.72792 11.56220 0 1 0 + 2060 687 2 0.4236 13.63511 9.58057 10.78023 0 1 0 + 2061 687 2 0.4236 15.02007 10.28708 11.27947 0 1 0 + 2062 688 1 -0.8472 24.56624 34.10605 22.50422 0 -1 0 + 2063 688 2 0.4236 24.42631 33.16115 22.20827 0 -1 0 + 2064 688 2 0.4236 24.89936 34.11414 23.44704 0 -1 0 + 2065 689 1 -0.8472 28.18228 24.21568 14.50155 0 0 0 + 2066 689 2 0.4236 28.15529 24.11183 15.49574 0 0 0 + 2067 689 2 0.4236 27.53670 23.57749 14.08211 0 0 0 + 2068 690 1 -0.8472 35.20714 9.78963 0.99118 0 1 0 + 2069 690 2 0.4236 0.60853 10.16753 0.80907 1 1 0 + 2070 690 2 0.4236 34.53749 10.53157 1.02295 0 1 0 + 2071 691 1 -0.8472 0.69131 26.23859 12.99395 0 0 0 + 2072 691 2 0.4236 0.05017 25.81851 12.35175 0 0 0 + 2073 691 2 0.4236 0.86619 27.18423 12.71973 0 0 0 + 2074 692 1 -0.8472 22.19338 29.11773 4.33016 0 -1 0 + 2075 692 2 0.4236 21.46426 28.43597 4.38932 0 -1 0 + 2076 692 2 0.4236 22.95489 28.74612 3.79919 0 -1 0 + 2077 693 1 -0.8472 17.91530 28.67983 14.99455 0 0 0 + 2078 693 2 0.4236 18.48897 28.40781 15.76712 0 0 0 + 2079 693 2 0.4236 17.45208 27.87490 14.62374 0 0 0 + 2080 694 1 -0.8472 12.79492 25.77029 32.65179 0 -1 0 + 2081 694 2 0.4236 13.77749 25.61527 32.75437 0 -1 0 + 2082 694 2 0.4236 12.43237 26.17705 33.49026 0 -1 0 + 2083 695 1 -0.8472 30.87195 23.17070 13.46252 0 0 0 + 2084 695 2 0.4236 30.40061 23.03858 14.33449 0 0 0 + 2085 695 2 0.4236 30.94240 22.29458 12.98565 0 0 0 + 2086 696 1 -0.8472 9.82436 23.58229 1.74889 0 0 0 + 2087 696 2 0.4236 9.70115 23.45578 0.76463 0 0 0 + 2088 696 2 0.4236 10.38990 22.84180 2.11190 0 0 0 + 2089 697 1 -0.8472 6.89586 12.57425 5.59544 1 0 0 + 2090 697 2 0.4236 7.86359 12.41511 5.40009 1 0 0 + 2091 697 2 0.4236 6.36472 12.47100 4.75450 1 0 0 + 2092 698 1 -0.8472 11.02525 29.55403 32.81425 0 -1 0 + 2093 698 2 0.4236 11.59857 29.39549 33.61808 0 -1 0 + 2094 698 2 0.4236 11.36970 29.01280 32.04720 0 -1 0 + 2095 699 1 -0.8472 5.68577 15.11644 32.97163 1 0 0 + 2096 699 2 0.4236 6.45292 15.18049 32.33340 1 0 0 + 2097 699 2 0.4236 5.80866 15.78136 33.70833 1 0 0 + 2098 700 1 -0.8472 21.25974 27.21306 29.97592 0 0 0 + 2099 700 2 0.4236 21.13419 27.98997 30.59288 0 0 0 + 2100 700 2 0.4236 20.57820 27.25410 29.24532 0 0 0 + 2101 701 1 -0.8472 6.19813 8.13823 30.34241 0 0 0 + 2102 701 2 0.4236 7.03828 7.67736 30.05652 0 0 0 + 2103 701 2 0.4236 5.46127 7.46723 30.42450 0 0 0 + 2104 702 1 -0.8472 32.41076 28.40941 3.86814 0 0 0 + 2105 702 2 0.4236 32.55062 27.42269 3.95038 0 0 0 + 2106 702 2 0.4236 31.47031 28.63505 4.12222 0 0 0 + 2107 703 1 -0.8472 23.98855 26.62099 31.21987 0 0 0 + 2108 703 2 0.4236 23.15933 26.86421 30.71666 0 0 0 + 2109 703 2 0.4236 24.52935 27.44488 31.38923 0 0 0 + 2110 704 1 -0.8472 28.50283 29.57437 20.87556 -1 -1 0 + 2111 704 2 0.4236 29.24214 30.01036 20.36250 -1 -1 0 + 2112 704 2 0.4236 28.88225 29.10445 21.67252 -1 -1 0 + 2113 705 1 -0.8472 27.75031 21.27721 18.51655 0 0 0 + 2114 705 2 0.4236 27.38498 20.41242 18.17211 0 0 0 + 2115 705 2 0.4236 28.28475 21.10710 19.34442 0 0 0 + 2116 706 1 -0.8472 25.25588 27.43813 16.54983 0 0 0 + 2117 706 2 0.4236 25.68771 28.33889 16.59591 0 0 0 + 2118 706 2 0.4236 24.90231 27.28485 15.62711 0 0 0 + 2119 707 1 -0.8472 5.61274 2.12353 21.50202 0 1 0 + 2120 707 2 0.4236 4.74517 2.16269 21.99775 0 1 0 + 2121 707 2 0.4236 5.95246 1.18305 21.49858 0 1 0 + 2122 708 1 -0.8472 14.20520 17.29851 2.13547 -1 0 0 + 2123 708 2 0.4236 13.44849 17.62485 1.56903 -1 0 0 + 2124 708 2 0.4236 13.92488 17.29329 3.09534 -1 0 0 +2125 709 1 -0.8472 33.77325 2.92399 0.15598 -1 1 0 +2126 709 2 0.4236 33.43998 3.50499 34.86065 -1 1 -1 +2127 709 2 0.4236 33.65455 3.39756 1.02868 -1 1 0 + 2128 710 1 -0.8472 0.22885 13.68528 9.35288 0 0 0 + 2129 710 2 0.4236 0.61334 13.37045 10.22063 0 0 0 + 2130 710 2 0.4236 0.84262 13.43233 8.60505 0 0 0 + 2131 711 1 -0.8472 27.57011 24.36623 33.91899 0 0 0 + 2132 711 2 0.4236 26.97918 24.28932 33.11594 0 0 0 + 2133 711 2 0.4236 28.12870 23.54099 34.00201 0 0 0 + 2134 712 1 -0.8472 18.75243 23.43472 22.11490 0 1 0 + 2135 712 2 0.4236 17.78133 23.32273 21.90431 0 1 0 + 2136 712 2 0.4236 19.23205 23.77381 21.30561 0 1 0 + 2137 713 1 -0.8472 2.29530 10.87158 1.51153 0 1 0 + 2138 713 2 0.4236 2.47430 11.79162 1.86004 0 1 0 + 2139 713 2 0.4236 2.87595 10.21436 1.99197 0 1 0 + 2140 714 1 -0.8472 25.61886 25.89666 25.24432 0 -1 0 + 2141 714 2 0.4236 25.42787 26.64268 25.88223 0 -1 0 + 2142 714 2 0.4236 26.42453 25.39162 25.55370 0 -1 0 + 2143 715 1 -0.8472 16.92797 16.32560 9.80037 0 0 0 + 2144 715 2 0.4236 17.19604 17.12020 9.25562 0 0 0 + 2145 715 2 0.4236 17.34592 16.38653 10.70675 0 0 0 + 2146 716 1 -0.8472 10.47600 17.21124 29.11058 1 0 0 + 2147 716 2 0.4236 10.94213 18.08313 29.26056 1 0 0 + 2148 716 2 0.4236 10.16834 16.84254 29.98769 1 0 0 + 2149 717 1 -0.8472 16.06644 22.36974 1.69499 0 0 0 + 2150 717 2 0.4236 15.33260 23.01429 1.48056 0 0 0 + 2151 717 2 0.4236 16.89555 22.63246 1.20148 0 0 0 + 2152 718 1 -0.8472 16.33203 27.58130 32.80553 0 0 0 + 2153 718 2 0.4236 15.97264 26.66864 32.61096 0 0 0 + 2154 718 2 0.4236 15.82791 28.25908 32.27034 0 0 0 + 2155 719 1 -0.8472 20.49220 11.62449 35.26514 1 0 0 + 2156 719 2 0.4236 21.01717 12.11061 34.56651 1 0 0 + 2157 719 2 0.4236 19.68795 11.20396 34.84526 1 0 0 + 2158 720 1 -0.8472 30.40952 26.57771 6.51282 0 0 0 + 2159 720 2 0.4236 30.16665 26.78894 5.56606 0 0 0 + 2160 720 2 0.4236 30.45919 25.58598 6.63086 0 0 0 + 2161 721 1 -0.8472 12.37322 16.37428 4.55968 0 0 0 + 2162 721 2 0.4236 12.38784 15.52288 4.03541 0 0 0 + 2163 721 2 0.4236 11.65794 16.97416 4.20127 0 0 0 + 2164 722 1 -0.8472 33.56731 11.90620 21.46299 0 0 0 + 2165 722 2 0.4236 33.23117 12.42030 20.67390 0 0 0 + 2166 722 2 0.4236 32.79888 11.66522 22.05577 0 0 0 + 2167 723 1 -0.8472 31.32107 31.23181 1.41386 -1 0 0 + 2168 723 2 0.4236 31.49725 32.04700 0.86213 -1 0 0 + 2169 723 2 0.4236 31.18817 30.44435 0.81204 -1 0 0 + 2170 724 1 -0.8472 28.87096 19.63852 21.22815 -1 -1 0 + 2171 724 2 0.4236 29.73458 19.39950 20.78432 -1 -1 0 + 2172 724 2 0.4236 28.83879 20.62564 21.38486 -1 -1 0 + 2173 725 1 -0.8472 4.42927 23.17098 25.42492 -1 -1 0 + 2174 725 2 0.4236 3.94617 23.57806 24.64980 -1 -1 0 + 2175 725 2 0.4236 4.55071 22.19140 25.26477 -1 -1 0 + 2176 726 1 -0.8472 24.00712 31.99530 18.18540 -1 0 0 + 2177 726 2 0.4236 23.23226 32.61152 18.04443 -1 0 0 + 2178 726 2 0.4236 23.69523 31.04742 18.12064 -1 0 0 + 2179 727 1 -0.8472 12.59691 11.80803 19.01561 -1 0 0 + 2180 727 2 0.4236 12.20861 11.09527 18.43151 -1 0 0 + 2181 727 2 0.4236 12.30089 12.70527 18.68815 -1 0 0 + 2182 728 1 -0.8472 22.60920 27.90494 24.82016 0 0 0 + 2183 728 2 0.4236 23.54351 28.24544 24.92530 0 0 0 + 2184 728 2 0.4236 22.02693 28.30545 25.52765 0 0 0 + 2185 729 1 -0.8472 10.89154 10.44597 15.79910 0 1 0 + 2186 729 2 0.4236 10.71507 9.97810 14.93312 0 1 0 + 2187 729 2 0.4236 10.96922 11.42960 15.63671 0 1 0 + 2188 730 1 -0.8472 0.08050 9.79588 3.64393 1 0 0 + 2189 730 2 0.4236 35.44276 8.87250 3.99968 0 0 0 + 2190 730 2 0.4236 0.10043 9.76868 2.64453 1 0 0 + 2191 731 1 -0.8472 30.40682 21.08786 5.84641 -1 -1 0 + 2192 731 2 0.4236 30.08055 20.97761 4.90763 -1 -1 0 + 2193 731 2 0.4236 30.13488 20.29333 6.38928 -1 -1 0 + 2194 732 1 -0.8472 24.67265 21.92020 3.54047 0 0 0 + 2195 732 2 0.4236 24.31684 22.84343 3.39577 0 0 0 + 2196 732 2 0.4236 25.25080 21.90987 4.35632 0 0 0 + 2197 733 1 -0.8472 28.95227 32.91147 27.71368 -1 0 0 + 2198 733 2 0.4236 28.22236 33.56969 27.89800 -1 0 0 + 2199 733 2 0.4236 29.69126 33.36429 27.21490 -1 0 0 + 2200 734 1 -0.8472 30.03521 19.21092 7.99937 0 0 0 + 2201 734 2 0.4236 30.75755 18.74029 8.50601 0 0 0 + 2202 734 2 0.4236 29.43004 19.68149 8.64149 0 0 0 + 2203 735 1 -0.8472 24.49927 23.34755 12.15367 0 -1 0 + 2204 735 2 0.4236 25.45013 23.07497 12.30028 0 -1 0 + 2205 735 2 0.4236 23.95535 22.54362 11.91337 0 -1 0 + 2206 736 1 -0.8472 31.77314 12.63461 3.01134 -1 0 0 + 2207 736 2 0.4236 30.89137 12.32301 3.36544 -1 0 0 + 2208 736 2 0.4236 32.34380 12.95066 3.76924 -1 0 0 + 2209 737 1 -0.8472 14.30093 32.51323 11.88551 1 -1 0 + 2210 737 2 0.4236 15.16348 32.00737 11.89441 1 -1 0 + 2211 737 2 0.4236 14.04074 32.74491 12.82281 1 -1 0 + 2212 738 1 -0.8472 29.43476 16.82816 3.26399 1 0 0 + 2213 738 2 0.4236 29.24168 16.37876 4.13619 1 0 0 + 2214 738 2 0.4236 30.06337 17.59119 3.41419 1 0 0 + 2215 739 1 -0.8472 16.93347 0.29074 22.92551 0 1 0 + 2216 739 2 0.4236 17.69583 35.41574 23.44835 0 0 0 + 2217 739 2 0.4236 16.96046 35.44329 21.99062 0 0 0 + 2218 740 1 -0.8472 6.39175 32.07466 27.11458 1 -1 0 + 2219 740 2 0.4236 7.22451 31.66481 27.48671 1 -1 0 + 2220 740 2 0.4236 6.37538 33.05084 27.33071 1 -1 0 + 2221 741 1 -0.8472 11.38564 0.73620 34.44418 0 0 0 + 2222 741 2 0.4236 11.86164 0.78090 33.56590 0 0 0 + 2223 741 2 0.4236 11.33377 35.29097 34.74711 0 -1 0 + 2224 742 1 -0.8472 5.62992 0.95326 5.96640 0 1 0 + 2225 742 2 0.4236 5.57858 0.12421 6.52317 0 1 0 + 2226 742 2 0.4236 6.52933 1.00840 5.53281 0 1 0 + 2227 743 1 -0.8472 31.44385 14.78115 9.52565 0 1 0 + 2228 743 2 0.4236 30.75006 15.29894 9.02517 0 1 0 + 2229 743 2 0.4236 32.31791 15.26482 9.48035 0 1 0 + 2230 744 1 -0.8472 4.14274 30.46651 11.25686 0 0 0 + 2231 744 2 0.4236 4.24418 30.27143 10.28139 0 0 0 + 2232 744 2 0.4236 4.98630 30.87589 11.60442 0 0 0 + 2233 745 1 -0.8472 2.68589 19.08193 19.35984 1 0 0 + 2234 745 2 0.4236 2.25025 18.54564 20.08271 1 0 0 + 2235 745 2 0.4236 2.89396 19.99767 19.70350 1 0 0 + 2236 746 1 -0.8472 22.93007 35.32345 10.64943 0 0 0 + 2237 746 2 0.4236 23.02317 34.50265 11.21294 0 0 0 + 2238 746 2 0.4236 23.03648 35.07981 9.68545 0 0 0 + 2239 747 1 -0.8472 21.42354 28.83286 27.26180 0 0 0 + 2240 747 2 0.4236 20.97399 28.00329 27.59298 0 0 0 + 2241 747 2 0.4236 20.73823 29.54462 27.10803 0 0 0 + 2242 748 1 -0.8472 30.85260 9.03928 4.70154 0 0 0 + 2243 748 2 0.4236 30.83123 8.53171 5.56283 0 0 0 + 2244 748 2 0.4236 30.48394 9.95743 4.84645 0 0 0 + 2245 749 1 -0.8472 4.86366 22.69509 4.35096 0 -1 0 + 2246 749 2 0.4236 5.74042 23.17460 4.38730 0 -1 0 + 2247 749 2 0.4236 4.79229 22.19598 3.48739 0 -1 0 + 2248 750 1 -0.8472 13.44540 3.46032 20.90541 0 0 0 + 2249 750 2 0.4236 14.28871 3.71208 20.43070 0 0 0 + 2250 750 2 0.4236 13.34566 2.46533 20.90261 0 0 0 + 2251 751 1 -0.8472 22.15447 21.84585 0.90028 -1 0 0 + 2252 751 2 0.4236 22.49980 20.96721 1.22992 -1 0 0 + 2253 751 2 0.4236 21.26628 22.03343 1.31967 -1 0 0 + 2254 752 1 -0.8472 9.81374 3.47732 1.49633 0 1 0 + 2255 752 2 0.4236 9.63291 4.24716 2.10834 0 1 0 + 2256 752 2 0.4236 9.29957 2.67749 1.80593 0 1 0 + 2257 753 1 -0.8472 25.04380 17.85028 9.69757 -1 0 0 + 2258 753 2 0.4236 24.14790 17.88394 10.14048 -1 0 0 + 2259 753 2 0.4236 25.75957 17.81957 10.39524 -1 0 0 + 2260 754 1 -0.8472 15.18930 12.41305 1.71036 0 1 0 + 2261 754 2 0.4236 15.50981 12.43400 0.76337 0 1 0 + 2262 754 2 0.4236 15.83054 11.88561 2.26766 0 1 0 + 2263 755 1 -0.8472 10.82347 25.41843 22.69425 0 0 0 + 2264 755 2 0.4236 11.56321 24.78166 22.91154 0 0 0 + 2265 755 2 0.4236 11.20822 26.31734 22.48472 0 0 0 + 2266 756 1 -0.8472 18.25594 35.02978 9.19947 1 -1 0 + 2267 756 2 0.4236 17.84180 0.07856 8.47819 1 0 0 + 2268 756 2 0.4236 17.96845 35.37547 10.09267 1 -1 0 + 2269 757 1 -0.8472 20.67847 9.17313 32.72868 -2 0 0 + 2270 757 2 0.4236 21.62862 9.12414 33.03650 -2 0 0 + 2271 757 2 0.4236 20.51184 8.46081 32.04696 -2 0 0 + 2272 758 1 -0.8472 26.32004 10.13277 13.93904 0 0 0 + 2273 758 2 0.4236 26.65302 10.03054 14.87641 0 0 0 + 2274 758 2 0.4236 25.48681 10.68560 13.93975 0 0 0 + 2275 759 1 -0.8472 0.82292 13.72334 27.81676 0 0 0 + 2276 759 2 0.4236 0.81930 14.69363 27.57501 0 0 0 + 2277 759 2 0.4236 1.36210 13.21465 27.14560 0 0 0 +2278 760 1 -0.8472 21.84848 3.72532 35.36222 1 0 0 +2279 760 2 0.4236 22.80203 3.91962 0.14510 1 0 1 +2280 760 2 0.4236 21.26702 3.93165 0.70199 1 0 1 + 2281 761 1 -0.8472 19.27100 12.35007 7.94418 0 -1 0 + 2282 761 2 0.4236 18.53371 12.99546 7.74468 0 -1 0 + 2283 761 2 0.4236 20.09563 12.62243 7.44845 0 -1 0 + 2284 762 1 -0.8472 29.80637 8.79620 16.49510 0 1 0 + 2285 762 2 0.4236 30.54579 9.39281 16.80697 0 1 0 + 2286 762 2 0.4236 30.06674 7.84108 16.63611 0 1 0 + 2287 763 1 -0.8472 27.86105 15.07042 19.60552 0 0 0 + 2288 763 2 0.4236 28.38626 14.86999 20.43254 0 0 0 + 2289 763 2 0.4236 28.25993 15.86093 19.14081 0 0 0 + 2290 764 1 -0.8472 23.97935 35.02669 31.20469 0 1 0 + 2291 764 2 0.4236 23.16342 35.21431 31.75150 0 1 0 + 2292 764 2 0.4236 24.57607 34.39674 31.70170 0 1 0 + 2293 765 1 -0.8472 28.68895 19.26482 23.89389 0 -1 0 + 2294 765 2 0.4236 29.47375 19.59056 24.42113 0 -1 0 + 2295 765 2 0.4236 28.75893 19.59595 22.95294 0 -1 0 + 2296 766 1 -0.8472 20.73446 23.11914 11.38748 0 -1 0 + 2297 766 2 0.4236 21.15404 22.50279 12.05385 0 -1 0 + 2298 766 2 0.4236 21.43213 23.44527 10.74964 0 -1 0 + 2299 767 1 -0.8472 5.76836 34.80673 20.93589 0 0 0 + 2300 767 2 0.4236 5.91884 33.81987 20.87765 0 0 0 + 2301 767 2 0.4236 5.27138 35.11652 20.12532 0 0 0 + 2302 768 1 -0.8472 26.37188 21.61587 25.72215 -1 -1 0 + 2303 768 2 0.4236 25.53695 21.94736 25.28292 -1 -1 0 + 2304 768 2 0.4236 27.13913 21.70066 25.08644 -1 -1 0 + 2305 769 1 -0.8472 31.19538 33.50312 26.15716 0 0 0 + 2306 769 2 0.4236 31.15565 33.39063 25.16432 0 0 0 + 2307 769 2 0.4236 31.86528 32.86595 26.53821 0 0 0 + 2308 770 1 -0.8472 24.54540 11.80739 22.67823 1 1 0 + 2309 770 2 0.4236 24.18408 12.50615 22.06088 1 1 0 + 2310 770 2 0.4236 25.52601 11.69543 22.51747 1 1 0 + 2311 771 1 -0.8472 5.96311 23.16757 33.38140 1 0 0 + 2312 771 2 0.4236 5.33976 22.81627 34.07999 1 0 0 + 2313 771 2 0.4236 5.56640 23.98337 32.96057 1 0 0 + 2314 772 1 -0.8472 5.02457 11.13969 19.20624 1 0 0 + 2315 772 2 0.4236 5.60681 10.82397 19.95542 1 0 0 + 2316 772 2 0.4236 5.03100 12.13923 19.17757 1 0 0 + 2317 773 1 -0.8472 22.69289 11.29961 3.68803 0 0 0 + 2318 773 2 0.4236 23.22768 12.13699 3.57506 0 0 0 + 2319 773 2 0.4236 22.64169 10.81637 2.81407 0 0 0 + 2320 774 1 -0.8472 13.27284 8.09133 34.27364 0 0 0 + 2321 774 2 0.4236 12.32436 7.84246 34.46966 0 0 0 + 2322 774 2 0.4236 13.86320 7.29815 34.42305 0 0 0 + 2323 775 1 -0.8472 34.14695 7.38518 17.29660 -1 1 0 + 2324 775 2 0.4236 34.85981 8.00973 17.61548 -1 1 0 + 2325 775 2 0.4236 33.33691 7.48069 17.87510 -1 1 0 + 2326 776 1 -0.8472 20.66778 14.07322 27.68068 0 1 0 + 2327 776 2 0.4236 20.85554 15.05125 27.77103 0 1 0 + 2328 776 2 0.4236 20.64343 13.65329 28.58788 0 1 0 + 2329 777 1 -0.8472 6.84647 29.77811 7.44210 0 0 0 + 2330 777 2 0.4236 7.16340 29.12266 8.12754 0 0 0 + 2331 777 2 0.4236 5.94607 30.12533 7.70416 0 0 0 + 2332 778 1 -0.8472 8.84506 31.91105 32.16028 -1 -1 0 + 2333 778 2 0.4236 8.21208 31.23536 32.53808 -1 -1 0 + 2334 778 2 0.4236 9.75068 31.49931 32.05904 -1 -1 0 + 2335 779 1 -0.8472 12.70318 30.32629 23.63215 0 0 0 + 2336 779 2 0.4236 12.38699 31.24576 23.39851 0 0 0 + 2337 779 2 0.4236 12.43482 30.11006 24.57086 0 0 0 + 2338 780 1 -0.8472 21.76695 30.45784 17.16849 0 -1 0 + 2339 780 2 0.4236 21.33757 30.08595 16.34555 0 -1 0 + 2340 780 2 0.4236 21.12138 31.05996 17.63824 0 -1 0 + 2341 781 1 -0.8472 6.27827 16.18969 19.53970 0 0 0 + 2342 781 2 0.4236 6.77621 16.02181 20.39046 0 0 0 + 2343 781 2 0.4236 6.29187 17.16799 19.33300 0 0 0 + 2344 782 1 -0.8472 6.99905 25.03102 14.18710 0 0 0 + 2345 782 2 0.4236 6.99187 24.03133 14.21039 0 0 0 + 2346 782 2 0.4236 7.78825 25.34645 13.66025 0 0 0 +2347 783 1 -0.8472 7.49439 35.07402 0.57318 0 0 0 +2348 783 2 0.4236 7.72721 0.45223 0.97731 0 1 0 +2349 783 2 0.4236 8.10031 34.89152 35.24610 0 0 -1 + 2350 784 1 -0.8472 6.48253 7.54091 20.64983 0 1 0 + 2351 784 2 0.4236 7.23016 7.35251 21.28664 0 1 0 + 2352 784 2 0.4236 6.65080 7.06313 19.78761 0 1 0 + 2353 785 1 -0.8472 5.23939 9.16145 11.08029 1 1 0 + 2354 785 2 0.4236 5.14998 8.69820 10.19862 1 1 0 + 2355 785 2 0.4236 4.33355 9.42580 11.41127 1 1 0 + 2356 786 1 -0.8472 27.63885 15.53268 26.97939 0 0 0 + 2357 786 2 0.4236 27.56862 16.48567 26.68472 0 0 0 + 2358 786 2 0.4236 28.27637 15.46727 27.74700 0 0 0 + 2359 787 1 -0.8472 22.84734 5.25153 24.86060 0 0 0 + 2360 787 2 0.4236 23.62550 4.64803 25.03440 0 0 0 + 2361 787 2 0.4236 23.14815 6.20420 24.90392 0 0 0 + 2362 788 1 -0.8472 29.52317 32.08275 3.42793 0 -1 0 + 2363 788 2 0.4236 29.87256 31.71462 4.28953 0 -1 0 + 2364 788 2 0.4236 30.13165 31.81621 2.68048 0 -1 0 + 2365 789 1 -0.8472 13.98726 20.89644 14.31914 0 1 0 + 2366 789 2 0.4236 13.71170 20.12407 14.89136 0 1 0 + 2367 789 2 0.4236 13.20414 21.20918 13.78169 0 1 0 + 2368 790 1 -0.8472 8.36348 15.60252 2.20981 0 1 0 + 2369 790 2 0.4236 7.40456 15.45392 2.45137 0 1 0 + 2370 790 2 0.4236 8.45076 15.66632 1.21569 0 1 0 + 2371 791 1 -0.8472 25.80754 29.12614 29.49717 0 0 0 + 2372 791 2 0.4236 25.48585 29.29941 30.42801 0 0 0 + 2373 791 2 0.4236 25.18000 29.54909 28.84349 0 0 0 + 2374 792 1 -0.8472 21.33150 23.75797 26.23790 0 0 0 + 2375 792 2 0.4236 21.19338 22.77082 26.31770 0 0 0 + 2376 792 2 0.4236 21.28495 24.17549 27.14535 0 0 0 + 2377 793 1 -0.8472 32.60946 28.83470 33.79971 0 0 0 + 2378 793 2 0.4236 32.86613 29.79320 33.67597 0 0 0 + 2379 793 2 0.4236 32.61258 28.61201 34.77458 0 0 0 + 2380 794 1 -0.8472 22.06496 16.58778 18.19685 0 0 0 + 2381 794 2 0.4236 22.26078 17.03822 19.06789 0 0 0 + 2382 794 2 0.4236 21.18163 16.90294 17.84982 0 0 0 + 2383 795 1 -0.8472 10.53697 29.73866 12.93262 1 1 0 + 2384 795 2 0.4236 9.76680 30.37241 13.00426 1 1 0 + 2385 795 2 0.4236 11.31257 30.20358 12.50573 1 1 0 + 2386 796 1 -0.8472 17.15354 2.96270 22.81665 0 0 0 + 2387 796 2 0.4236 16.88895 2.00964 22.96368 0 0 0 + 2388 796 2 0.4236 17.93997 3.18308 23.39362 0 0 0 + 2389 797 1 -0.8472 2.84564 16.62453 31.83402 1 0 0 + 2390 797 2 0.4236 3.10323 15.76698 31.38884 1 0 0 + 2391 797 2 0.4236 2.03370 16.47622 32.39859 1 0 0 + 2392 798 1 -0.8472 17.81943 7.51506 34.65704 0 0 0 + 2393 798 2 0.4236 18.80665 7.65481 34.73307 0 0 0 + 2394 798 2 0.4236 17.61228 6.54140 34.75225 0 0 0 + 2395 799 1 -0.8472 26.88072 17.82532 18.49156 0 -1 0 + 2396 799 2 0.4236 26.11776 17.51858 17.92256 0 -1 0 + 2397 799 2 0.4236 26.52995 18.16675 19.36352 0 -1 0 + 2398 800 1 -0.8472 19.05473 1.05564 26.01912 0 1 0 + 2399 800 2 0.4236 18.53612 0.26365 25.69698 0 1 0 + 2400 800 2 0.4236 20.00776 0.97065 25.72849 0 1 0 + 2401 801 1 -0.8472 1.10090 34.65231 5.12389 1 -2 0 + 2402 801 2 0.4236 0.88676 33.69453 4.93230 1 -2 0 + 2403 801 2 0.4236 0.81296 34.87856 6.05441 1 -2 0 + 2404 802 1 -0.8472 3.04415 35.09483 27.41560 -1 -1 0 + 2405 802 2 0.4236 2.04659 35.14369 27.46491 -1 -1 0 + 2406 802 2 0.4236 3.36467 34.29913 27.92952 -1 -1 0 + 2407 803 1 -0.8472 14.12553 17.71309 32.84625 1 0 0 + 2408 803 2 0.4236 14.80874 18.03250 33.50288 1 0 0 + 2409 803 2 0.4236 13.54887 18.48031 32.56548 1 0 0 + 2410 804 1 -0.8472 20.95283 30.69605 2.27698 1 -1 0 + 2411 804 2 0.4236 21.43674 31.56358 2.16209 1 -1 0 + 2412 804 2 0.4236 21.10945 30.34685 3.20082 1 -1 0 + 2413 805 1 -0.8472 16.96120 25.71167 27.42127 0 -1 0 + 2414 805 2 0.4236 17.00892 25.25432 26.53332 0 -1 0 + 2415 805 2 0.4236 16.03527 26.05992 27.56749 0 -1 0 + 2416 806 1 -0.8472 28.75134 33.83258 11.82146 0 -1 0 + 2417 806 2 0.4236 29.41268 33.26260 12.30897 0 -1 0 + 2418 806 2 0.4236 28.26501 34.41222 12.47525 0 -1 0 + 2419 807 1 -0.8472 13.89605 4.37296 31.95128 0 0 0 + 2420 807 2 0.4236 13.85063 3.37752 32.03487 0 0 0 + 2421 807 2 0.4236 14.53001 4.61728 31.21756 0 0 0 + 2422 808 1 -0.8472 34.19027 7.66458 13.39454 -1 0 0 + 2423 808 2 0.4236 34.28081 6.84995 12.82167 -1 0 0 + 2424 808 2 0.4236 33.22886 7.79758 13.63529 -1 0 0 + 2425 809 1 -0.8472 2.17980 12.87336 21.40333 0 0 0 + 2426 809 2 0.4236 3.07992 12.88277 20.96786 0 0 0 + 2427 809 2 0.4236 2.18575 13.48520 22.19423 0 0 0 + 2428 810 1 -0.8472 20.02462 29.93870 11.78367 0 -1 0 + 2429 810 2 0.4236 20.80388 29.40100 12.10550 0 -1 0 + 2430 810 2 0.4236 19.99075 30.80637 12.27962 0 -1 0 + 2431 811 1 -0.8472 12.68365 8.32013 9.63150 0 0 0 + 2432 811 2 0.4236 12.61121 7.49198 10.18724 0 0 0 + 2433 811 2 0.4236 11.84641 8.43744 9.09745 0 0 0 + 2434 812 1 -0.8472 27.17613 35.07242 17.94308 0 0 0 + 2435 812 2 0.4236 26.68391 0.14013 17.28876 0 1 0 + 2436 812 2 0.4236 26.95688 35.36482 18.87389 0 0 0 + 2437 813 1 -0.8472 23.49934 14.01290 4.26713 0 0 0 + 2438 813 2 0.4236 22.61339 14.33182 3.93045 0 0 0 + 2439 813 2 0.4236 23.75755 14.53985 5.07682 0 0 0 + 2440 814 1 -0.8472 13.20350 1.23982 26.22755 0 0 0 + 2441 814 2 0.4236 12.88408 2.07198 25.77429 0 0 0 + 2442 814 2 0.4236 13.26656 1.40003 27.21260 0 0 0 + 2443 815 1 -0.8472 32.61237 13.56172 31.22696 0 0 0 + 2444 815 2 0.4236 32.55463 13.01499 32.06223 0 0 0 + 2445 815 2 0.4236 32.54636 14.53225 31.45860 0 0 0 + 2446 816 1 -0.8472 11.36654 10.00604 5.49041 1 0 0 + 2447 816 2 0.4236 11.88120 10.10621 6.34193 1 0 0 + 2448 816 2 0.4236 12.00022 9.99830 4.71689 1 0 0 + 2449 817 1 -0.8472 9.17409 26.41828 20.72491 0 0 0 + 2450 817 2 0.4236 8.20218 26.24356 20.56724 0 0 0 + 2451 817 2 0.4236 9.53423 25.74235 21.36785 0 0 0 + 2452 818 1 -0.8472 9.87087 7.59502 4.03917 0 0 0 + 2453 818 2 0.4236 10.28509 7.32965 4.90975 0 0 0 + 2454 818 2 0.4236 10.18784 8.50846 3.78395 0 0 0 + 2455 819 1 -0.8472 20.55690 13.77494 1.37155 0 0 0 + 2456 819 2 0.4236 20.36111 13.42403 2.28724 0 0 0 + 2457 819 2 0.4236 20.65014 13.00995 0.73433 0 0 0 + 2458 820 1 -0.8472 29.93334 5.93329 4.91025 -1 1 0 + 2459 820 2 0.4236 30.44733 6.10116 5.75141 -1 1 0 + 2460 820 2 0.4236 30.43331 5.28306 4.33824 -1 1 0 + 2461 821 1 -0.8472 12.51631 1.74380 15.29578 -1 0 0 + 2462 821 2 0.4236 12.90148 1.92344 14.39060 -1 0 0 + 2463 821 2 0.4236 12.50505 2.59074 15.82728 -1 0 0 + 2464 822 1 -0.8472 11.62432 32.78866 23.82742 0 0 0 + 2465 822 2 0.4236 11.47814 32.97102 24.79971 0 0 0 + 2466 822 2 0.4236 10.99539 33.34611 23.28551 0 0 0 + 2467 823 1 -0.8472 13.06353 18.99199 9.84223 -1 0 0 + 2468 823 2 0.4236 12.64747 18.31758 9.23233 -1 0 0 + 2469 823 2 0.4236 13.60323 19.63963 9.30439 -1 0 0 + 2470 824 1 -0.8472 26.02381 14.57180 17.78265 0 0 0 + 2471 824 2 0.4236 25.40295 15.34481 17.91249 0 0 0 + 2472 824 2 0.4236 26.77232 14.63089 18.44310 0 0 0 + 2473 825 1 -0.8472 27.04004 16.24973 1.75746 -1 0 0 + 2474 825 2 0.4236 28.02140 16.29883 1.94311 -1 0 0 + 2475 825 2 0.4236 26.63441 15.51478 2.30084 -1 0 0 + 2476 826 1 -0.8472 15.35923 20.72413 28.72655 -1 0 0 + 2477 826 2 0.4236 15.98094 21.50730 28.71864 -1 0 0 + 2478 826 2 0.4236 15.88483 19.88260 28.85111 -1 0 0 + 2479 827 1 -0.8472 27.10562 30.50244 27.42418 0 0 0 + 2480 827 2 0.4236 26.85157 29.94872 28.21717 0 0 0 + 2481 827 2 0.4236 27.49967 31.36762 27.73431 0 0 0 + 2482 828 1 -0.8472 24.97410 18.81542 24.69035 0 -1 0 + 2483 828 2 0.4236 25.47556 19.25392 23.94454 0 -1 0 + 2484 828 2 0.4236 24.12908 19.32039 24.86599 0 -1 0 + 2485 829 1 -0.8472 29.23419 2.55747 15.47922 0 0 0 + 2486 829 2 0.4236 29.50393 2.04589 14.66347 0 0 0 + 2487 829 2 0.4236 28.38704 3.05587 15.29511 0 0 0 + 2488 830 1 -0.8472 23.98692 0.63026 13.05063 0 0 0 + 2489 830 2 0.4236 23.91026 1.62337 13.13896 0 0 0 + 2490 830 2 0.4236 23.75542 0.35991 12.11613 0 0 0 + 2491 831 1 -0.8472 30.84135 19.97655 31.52762 0 0 0 + 2492 831 2 0.4236 30.18071 19.23471 31.64257 0 0 0 + 2493 831 2 0.4236 30.39532 20.75442 31.08499 0 0 0 + 2494 832 1 -0.8472 30.16396 12.12918 29.67611 -1 0 0 + 2495 832 2 0.4236 29.80722 12.67140 30.43684 -1 0 0 + 2496 832 2 0.4236 30.99193 11.65024 29.96762 -1 0 0 + 2497 833 1 -0.8472 8.49954 25.11534 30.47891 0 0 0 + 2498 833 2 0.4236 9.25949 24.81659 31.05610 0 0 0 + 2499 833 2 0.4236 7.88880 25.70294 31.00970 0 0 0 + 2500 834 1 -0.8472 5.73690 9.02997 5.59303 0 0 0 + 2501 834 2 0.4236 6.08273 9.73744 6.20935 0 0 0 + 2502 834 2 0.4236 6.03640 8.13191 5.91504 0 0 0 + 2503 835 1 -0.8472 11.25292 34.76600 31.52106 1 0 0 + 2504 835 2 0.4236 12.23126 34.77144 31.31419 1 0 0 + 2505 835 2 0.4236 10.93027 0.19972 31.63102 1 1 0 + 2506 836 1 -0.8472 5.35443 22.01777 22.23507 1 -1 0 + 2507 836 2 0.4236 5.97242 21.37209 22.68358 1 -1 0 + 2508 836 2 0.4236 5.66259 22.95233 22.41273 1 -1 0 + 2509 837 1 -0.8472 33.55893 31.09610 3.22281 -1 0 0 + 2510 837 2 0.4236 32.83407 31.61340 2.76793 -1 0 0 + 2511 837 2 0.4236 33.28962 30.13559 3.29237 -1 0 0 + 2512 838 1 -0.8472 25.96434 29.58289 7.26377 0 -1 0 + 2513 838 2 0.4236 26.80640 29.16573 6.92195 0 -1 0 + 2514 838 2 0.4236 25.58609 30.19055 6.56546 0 -1 0 + 2515 839 1 -0.8472 33.87842 4.18772 2.43606 0 1 0 + 2516 839 2 0.4236 34.84944 3.98367 2.55999 0 1 0 + 2517 839 2 0.4236 33.75503 5.17533 2.33928 0 1 0 + 2518 840 1 -0.8472 13.81168 25.37248 3.67048 1 0 0 + 2519 840 2 0.4236 13.19977 26.10015 3.36064 1 0 0 + 2520 840 2 0.4236 14.72533 25.52182 3.29245 1 0 0 + 2521 841 1 -0.8472 30.88527 4.38191 2.92050 0 0 0 + 2522 841 2 0.4236 31.38047 3.51892 2.82042 0 0 0 + 2523 841 2 0.4236 30.98738 4.92349 2.08611 0 0 0 + 2524 842 1 -0.8472 12.07003 4.99198 33.85700 1 0 0 + 2525 842 2 0.4236 12.07748 4.21318 34.48420 1 0 0 + 2526 842 2 0.4236 12.88025 4.95661 33.27201 1 0 0 + 2527 843 1 -0.8472 7.37641 22.99672 25.99460 1 -1 0 + 2528 843 2 0.4236 7.72980 23.93199 26.01296 1 -1 0 + 2529 843 2 0.4236 6.39689 23.01440 25.79418 1 -1 0 + 2530 844 1 -0.8472 6.26662 14.45666 7.69016 0 1 0 + 2531 844 2 0.4236 5.26733 14.49397 7.68828 0 1 0 + 2532 844 2 0.4236 6.57485 13.74763 7.05594 0 1 0 + 2533 845 1 -0.8472 3.42084 16.32571 24.55314 0 0 0 + 2534 845 2 0.4236 2.77021 15.56634 24.54874 0 0 0 + 2535 845 2 0.4236 2.94499 17.17090 24.79634 0 0 0 + 2536 846 1 -0.8472 11.89267 13.73016 11.88059 0 0 0 + 2537 846 2 0.4236 11.21898 14.10411 11.24321 0 0 0 + 2538 846 2 0.4236 12.59005 14.42090 12.07165 0 0 0 + 2539 847 1 -0.8472 27.08577 4.13603 19.06782 0 1 0 + 2540 847 2 0.4236 27.68203 3.34019 18.96269 0 1 0 + 2541 847 2 0.4236 27.28308 4.58777 19.93784 0 1 0 + 2542 848 1 -0.8472 27.82810 10.58117 29.11657 0 0 0 + 2543 848 2 0.4236 28.01188 9.59839 29.09796 0 0 0 + 2544 848 2 0.4236 28.69236 11.08086 29.17439 0 0 0 + 2545 849 1 -0.8472 8.69913 11.82528 17.33215 0 0 0 + 2546 849 2 0.4236 8.89196 12.79954 17.21553 0 0 0 + 2547 849 2 0.4236 9.43475 11.28818 16.91944 0 0 0 + 2548 850 1 -0.8472 13.42854 16.97612 24.95943 0 1 0 + 2549 850 2 0.4236 13.93336 16.42101 25.62045 0 1 0 + 2550 850 2 0.4236 13.65180 17.94136 25.09526 0 1 0 + 2551 851 1 -0.8472 25.29362 29.77548 23.45629 0 -1 0 + 2552 851 2 0.4236 24.94292 29.55669 24.36686 0 -1 0 + 2553 851 2 0.4236 26.16750 30.25393 23.54179 0 -1 0 + 2554 852 1 -0.8472 1.80838 18.66945 8.01684 1 0 0 + 2555 852 2 0.4236 2.29523 17.98783 7.47064 1 0 0 + 2556 852 2 0.4236 1.49659 19.41139 7.42331 1 0 0 + 2557 853 1 -0.8472 30.12316 27.61353 26.54594 -1 -1 0 + 2558 853 2 0.4236 30.51614 26.94751 25.91193 -1 -1 0 + 2559 853 2 0.4236 30.70632 28.42514 26.58050 -1 -1 0 + 2560 854 1 -0.8472 33.18420 17.88586 6.35292 0 0 0 + 2561 854 2 0.4236 32.56568 18.63391 6.59328 0 0 0 + 2562 854 2 0.4236 33.30133 17.28346 7.14243 0 0 0 + 2563 855 1 -0.8472 33.27243 21.18032 2.29436 0 0 0 + 2564 855 2 0.4236 32.31035 20.90983 2.25953 0 0 0 + 2565 855 2 0.4236 33.73202 20.88576 1.45652 0 0 0 + 2566 856 1 -0.8472 28.34333 11.53743 12.37493 0 1 0 + 2567 856 2 0.4236 28.30293 11.14523 11.45596 0 1 0 + 2568 856 2 0.4236 27.66669 11.08888 12.95882 0 1 0 + 2569 857 1 -0.8472 28.30112 2.64491 2.85806 -1 1 0 + 2570 857 2 0.4236 28.30594 2.79162 3.84719 -1 1 0 + 2571 857 2 0.4236 29.22236 2.40458 2.55225 -1 1 0 + 2572 858 1 -0.8472 31.44250 35.43431 23.40153 -1 -1 0 + 2573 858 2 0.4236 32.25162 0.43229 23.70308 -1 0 0 + 2574 858 2 0.4236 31.62859 34.45252 23.43896 -1 -1 0 + 2575 859 1 -0.8472 3.71364 28.20102 15.87903 0 0 0 + 2576 859 2 0.4236 3.95001 28.35402 14.91951 0 0 0 + 2577 859 2 0.4236 3.89064 27.24622 16.11777 0 0 0 + 2578 860 1 -0.8472 10.94561 21.02636 2.86138 0 0 0 + 2579 860 2 0.4236 11.66778 20.96916 3.55069 0 0 0 + 2580 860 2 0.4236 10.18759 20.42872 3.12244 0 0 0 + 2581 861 1 -0.8472 15.57876 3.78370 6.21942 0 1 0 + 2582 861 2 0.4236 15.75140 2.89661 6.64741 0 1 0 + 2583 861 2 0.4236 14.68720 3.76754 5.76683 0 1 0 + 2584 862 1 -0.8472 19.64502 9.99145 5.15182 0 0 0 + 2585 862 2 0.4236 18.87851 10.56189 5.44685 0 0 0 + 2586 862 2 0.4236 19.29720 9.19863 4.65138 0 0 0 + 2587 863 1 -0.8472 3.53630 21.94683 7.08827 0 0 0 + 2588 863 2 0.4236 4.17231 22.62170 7.46241 0 0 0 + 2589 863 2 0.4236 3.79062 21.73660 6.14431 0 0 0 + 2590 864 1 -0.8472 12.52461 18.64953 6.43774 0 0 0 + 2591 864 2 0.4236 11.73637 18.38334 5.88299 0 0 0 + 2592 864 2 0.4236 12.89090 19.51724 6.10174 0 0 0 + 2593 865 1 -0.8472 23.94939 18.89381 33.06954 0 0 0 + 2594 865 2 0.4236 23.54241 18.01770 32.81123 0 0 0 + 2595 865 2 0.4236 23.22403 19.55824 33.24918 0 0 0 + 2596 866 1 -0.8472 19.85103 7.44596 22.03046 0 -1 0 + 2597 866 2 0.4236 19.50211 7.83913 22.88113 0 -1 0 + 2598 866 2 0.4236 19.83736 8.14114 21.31177 0 -1 0 + 2599 867 1 -0.8472 8.00029 26.63881 28.43389 1 -1 0 + 2600 867 2 0.4236 8.46716 27.49058 28.67157 1 -1 0 + 2601 867 2 0.4236 8.28274 25.91654 29.06517 1 -1 0 + 2602 868 1 -0.8472 23.83651 15.01649 11.21893 0 0 0 + 2603 868 2 0.4236 24.18952 14.99547 10.28358 0 0 0 + 2604 868 2 0.4236 23.14282 15.73247 11.29737 0 0 0 + 2605 869 1 -0.8472 17.62223 5.88933 12.54249 1 1 0 + 2606 869 2 0.4236 16.72054 6.23868 12.28780 1 1 0 + 2607 869 2 0.4236 17.53364 5.28246 13.33229 1 1 0 + 2608 870 1 -0.8472 33.24750 25.79249 27.99548 0 0 0 + 2609 870 2 0.4236 33.02399 26.03127 28.94043 0 0 0 + 2610 870 2 0.4236 32.68988 25.01397 27.70758 0 0 0 + 2611 871 1 -0.8472 8.52461 32.10974 20.14850 0 0 0 + 2612 871 2 0.4236 8.91213 31.73007 19.30847 0 0 0 + 2613 871 2 0.4236 7.58494 31.78581 20.25814 0 0 0 + 2614 872 1 -0.8472 27.82661 4.07116 5.11535 0 -1 0 + 2615 872 2 0.4236 28.49917 4.80088 4.99256 0 -1 0 + 2616 872 2 0.4236 28.22481 3.34080 5.67031 0 -1 0 + 2617 873 1 -0.8472 26.08680 14.33409 3.52290 -1 0 0 + 2618 873 2 0.4236 26.16612 13.67463 2.77538 -1 0 0 + 2619 873 2 0.4236 25.17681 14.26645 3.93187 -1 0 0 + 2620 874 1 -0.8472 30.17457 24.55253 31.22908 -1 0 0 + 2621 874 2 0.4236 29.87880 25.19861 30.52549 -1 0 0 + 2622 874 2 0.4236 30.45908 25.05559 32.04511 -1 0 0 + 2623 875 1 -0.8472 4.56924 31.17933 8.22970 0 -1 0 + 2624 875 2 0.4236 4.00014 31.89659 7.82770 0 -1 0 + 2625 875 2 0.4236 5.22266 31.58961 8.86584 0 -1 0 + 2626 876 1 -0.8472 6.38127 30.89315 16.11454 0 -1 0 + 2627 876 2 0.4236 5.40346 30.80048 16.30241 0 -1 0 + 2628 876 2 0.4236 6.63635 31.85960 16.14485 0 -1 0 + 2629 877 1 -0.8472 22.93838 32.25635 1.41573 0 -1 0 + 2630 877 2 0.4236 22.70262 32.88541 2.15644 0 -1 0 + 2631 877 2 0.4236 23.77665 32.56766 0.96817 0 -1 0 + 2632 878 1 -0.8472 26.74043 10.53690 34.14043 -1 0 0 + 2633 878 2 0.4236 26.64411 9.85226 33.41798 -1 0 0 + 2634 878 2 0.4236 27.20748 10.12975 34.92534 -1 0 0 + 2635 879 1 -0.8472 18.12890 0.52898 11.63908 0 1 0 + 2636 879 2 0.4236 17.58828 0.63169 12.47404 0 1 0 + 2637 879 2 0.4236 19.06300 0.84452 11.80590 0 1 0 + 2638 880 1 -0.8472 5.04130 17.24838 27.16687 0 0 0 + 2639 880 2 0.4236 4.48860 16.56822 26.68532 0 0 0 + 2640 880 2 0.4236 4.46897 18.03161 27.40961 0 0 0 + 2641 881 1 -0.8472 0.20092 22.73060 26.74870 0 0 0 + 2642 881 2 0.4236 0.46042 22.50399 25.80995 0 0 0 + 2643 881 2 0.4236 0.98848 22.60455 27.35187 0 0 0 + 2644 882 1 -0.8472 6.67370 10.39196 29.12618 0 1 0 + 2645 882 2 0.4236 7.10798 10.06630 28.28636 0 1 0 + 2646 882 2 0.4236 6.37648 9.60922 29.67288 0 1 0 + 2647 883 1 -0.8472 0.36169 3.59757 32.96571 1 1 0 + 2648 883 2 0.4236 0.87742 2.77151 32.73853 1 1 0 + 2649 883 2 0.4236 0.63239 3.92065 33.87249 1 1 0 + 2650 884 1 -0.8472 1.12537 7.04733 21.97028 -1 0 0 + 2651 884 2 0.4236 2.12283 7.02656 21.90261 -1 0 0 + 2652 884 2 0.4236 0.84706 7.80508 22.56044 -1 0 0 + 2653 885 1 -0.8472 20.46699 7.96130 8.20960 0 -1 0 + 2654 885 2 0.4236 20.71352 7.27486 8.89370 0 -1 0 + 2655 885 2 0.4236 20.65472 8.87456 8.57113 0 -1 0 + 2656 886 1 -0.8472 29.22087 8.66749 31.72871 0 1 0 + 2657 886 2 0.4236 28.46753 8.10986 32.07723 0 1 0 + 2658 886 2 0.4236 29.02683 9.63362 31.89868 0 1 0 + 2659 887 1 -0.8472 13.34328 26.47105 19.29320 0 0 0 + 2660 887 2 0.4236 12.39942 26.30189 19.00962 0 0 0 + 2661 887 2 0.4236 13.35088 26.84291 20.22145 0 0 0 + 2662 888 1 -0.8472 19.94676 12.70619 3.72610 0 0 0 + 2663 888 2 0.4236 20.76802 12.44352 4.23254 0 0 0 + 2664 888 2 0.4236 19.38323 13.30678 4.29329 0 0 0 + 2665 889 1 -0.8472 35.23224 31.63158 19.72906 -1 -1 0 + 2666 889 2 0.4236 0.38022 30.95809 19.38525 0 -1 0 + 2667 889 2 0.4236 35.31912 31.70365 20.72264 -1 -1 0 + 2668 890 1 -0.8472 24.90334 4.71897 4.92216 0 -1 0 + 2669 890 2 0.4236 24.54870 3.87726 4.51512 0 -1 0 + 2670 890 2 0.4236 25.89173 4.63677 5.04984 0 -1 0 + 2671 891 1 -0.8472 24.35419 20.38980 21.39334 0 -1 0 + 2672 891 2 0.4236 24.59812 21.35941 21.41149 0 -1 0 + 2673 891 2 0.4236 23.71902 20.21994 20.63991 0 -1 0 + 2674 892 1 -0.8472 27.50765 1.34560 12.13095 0 0 0 + 2675 892 2 0.4236 26.89496 0.89751 11.48000 0 0 0 + 2676 892 2 0.4236 26.98383 1.98011 12.69924 0 0 0 + 2677 893 1 -0.8472 13.13728 1.89420 29.11232 0 0 0 + 2678 893 2 0.4236 13.11182 2.85364 28.83168 0 0 0 + 2679 893 2 0.4236 13.88348 1.75716 29.76377 0 0 0 + 2680 894 1 -0.8472 28.14563 3.96173 23.80406 0 1 0 + 2681 894 2 0.4236 28.04813 2.97062 23.89421 0 1 0 + 2682 894 2 0.4236 29.11641 4.20075 23.78439 0 1 0 + 2683 895 1 -0.8472 18.25055 23.22783 0.51719 -1 0 0 + 2684 895 2 0.4236 18.48570 24.19917 0.55041 -1 0 0 + 2685 895 2 0.4236 18.98979 22.69179 0.92475 -1 0 0 + 2686 896 1 -0.8472 2.51465 29.09014 7.57570 2 -1 0 + 2687 896 2 0.4236 3.10673 29.87007 7.37298 2 -1 0 + 2688 896 2 0.4236 3.07310 28.31692 7.87608 2 -1 0 + 2689 897 1 -0.8472 25.00737 10.68975 1.68683 0 0 0 + 2690 897 2 0.4236 25.28105 9.84935 2.15462 0 0 0 + 2691 897 2 0.4236 24.06560 10.59939 1.36302 0 0 0 + 2692 898 1 -0.8472 0.50800 31.98245 4.59059 0 0 0 + 2693 898 2 0.4236 0.60245 31.58627 5.50388 0 0 0 + 2694 898 2 0.4236 35.23000 31.56962 4.12765 -1 0 0 + 2695 899 1 -0.8472 8.51918 24.05662 22.25963 0 -1 0 + 2696 899 2 0.4236 7.69557 24.41189 22.70173 0 -1 0 + 2697 899 2 0.4236 9.32524 24.50158 22.64980 0 -1 0 + 2698 900 1 -0.8472 3.74077 33.15075 4.30432 1 -1 0 + 2699 900 2 0.4236 2.74523 33.05868 4.28503 1 -1 0 + 2700 900 2 0.4236 4.15286 32.43271 3.74351 1 -1 0 + 2701 901 1 -0.8472 23.70766 3.65644 13.10291 0 1 0 + 2702 901 2 0.4236 22.83186 3.36378 13.48663 0 1 0 + 2703 901 2 0.4236 23.72321 3.46266 12.12202 0 1 0 + 2704 902 1 -0.8472 24.60561 3.76942 1.43568 0 -1 0 + 2705 902 2 0.4236 25.48227 3.58820 0.99007 0 -1 0 + 2706 902 2 0.4236 24.42968 3.06545 2.12375 0 -1 0 + 2707 903 1 -0.8472 19.48773 29.49157 22.01061 0 1 0 + 2708 903 2 0.4236 19.53211 28.50847 22.18799 0 1 0 + 2709 903 2 0.4236 20.40113 29.88825 22.10143 0 1 0 + 2710 904 1 -0.8472 16.23080 13.90116 33.79773 0 0 0 + 2711 904 2 0.4236 16.83015 14.21028 33.05940 0 0 0 + 2712 904 2 0.4236 16.41710 14.43372 34.62333 0 0 0 + 2713 905 1 -0.8472 31.40149 4.69855 20.61956 0 0 0 + 2714 905 2 0.4236 31.88814 3.87342 20.90643 0 0 0 + 2715 905 2 0.4236 31.98877 5.49631 20.75600 0 0 0 + 2716 906 1 -0.8472 11.91330 27.21469 2.83126 0 -1 0 + 2717 906 2 0.4236 11.77039 27.62948 3.72986 0 -1 0 + 2718 906 2 0.4236 11.05540 27.22822 2.31766 0 -1 0 + 2719 907 1 -0.8472 22.29397 12.32624 33.31082 -1 -1 0 + 2720 907 2 0.4236 23.15046 12.43347 33.81570 -1 -1 0 + 2721 907 2 0.4236 22.45521 11.77078 32.49511 -1 -1 0 + 2722 908 1 -0.8472 34.76448 23.65326 16.89257 -1 0 0 + 2723 908 2 0.4236 35.51917 23.16707 16.45207 -1 0 0 + 2724 908 2 0.4236 33.92404 23.11964 16.79832 -1 0 0 + 2725 909 1 -0.8472 1.74181 27.58620 25.60166 0 0 0 + 2726 909 2 0.4236 1.15598 27.69342 26.40493 0 0 0 + 2727 909 2 0.4236 1.52271 28.29593 24.93217 0 0 0 + 2728 910 1 -0.8472 12.89470 5.60990 10.67435 0 0 0 + 2729 910 2 0.4236 12.12215 5.02493 10.92114 0 0 0 + 2730 910 2 0.4236 13.50768 5.11149 10.06133 0 0 0 + 2731 911 1 -0.8472 26.31194 30.23025 9.95928 -1 -1 0 + 2732 911 2 0.4236 26.26983 29.99008 8.98948 -1 -1 0 + 2733 911 2 0.4236 26.89847 29.57778 10.43909 -1 -1 0 + 2734 912 1 -0.8472 2.44644 10.30330 33.95784 0 1 0 + 2735 912 2 0.4236 3.27225 10.40567 33.40331 0 1 0 + 2736 912 2 0.4236 2.65024 10.54393 34.90680 0 1 0 + 2737 913 1 -0.8472 23.59507 21.37553 7.99419 0 0 0 + 2738 913 2 0.4236 22.79284 21.02924 8.48049 0 0 0 + 2739 913 2 0.4236 24.00179 20.63828 7.45479 0 0 0 + 2740 914 1 -0.8472 35.31436 2.94640 23.58373 -1 0 0 + 2741 914 2 0.4236 0.21370 3.41681 22.80009 0 0 0 + 2742 914 2 0.4236 0.53235 2.53576 24.13752 0 0 0 + 2743 915 1 -0.8472 13.99749 14.34449 15.50116 0 0 0 + 2744 915 2 0.4236 14.78839 13.91007 15.93209 0 0 0 + 2745 915 2 0.4236 14.12556 15.33622 15.49251 0 0 0 + 2746 916 1 -0.8472 6.46769 25.98596 20.36657 0 1 0 + 2747 916 2 0.4236 6.61622 25.29763 19.65657 0 1 0 + 2748 916 2 0.4236 6.11029 25.54426 21.18944 0 1 0 + 2749 917 1 -0.8472 13.24177 10.22217 7.85839 1 0 0 + 2750 917 2 0.4236 12.93251 10.97416 8.44047 1 0 0 + 2751 917 2 0.4236 13.34595 9.39473 8.41013 1 0 0 + 2752 918 1 -0.8472 19.88118 15.75995 34.78713 -1 0 0 + 2753 918 2 0.4236 20.21312 15.08235 35.44333 -1 0 0 + 2754 918 2 0.4236 20.26709 15.56722 33.88500 -1 0 0 +2755 919 1 -0.8472 28.06120 14.47494 34.86905 -1 0 0 +2756 919 2 0.4236 27.85061 15.02284 0.23143 -1 0 1 +2757 919 2 0.4236 27.89570 15.01872 34.04632 -1 0 0 + 2758 920 1 -0.8472 19.62699 30.99995 7.02680 0 -1 0 + 2759 920 2 0.4236 18.89452 31.41499 6.48719 0 -1 0 + 2760 920 2 0.4236 19.30945 30.13154 7.40754 0 -1 0 + 2761 921 1 -0.8472 23.51923 19.57951 13.65426 0 0 0 + 2762 921 2 0.4236 23.70354 20.49167 14.02025 0 0 0 + 2763 921 2 0.4236 22.92226 19.08218 14.28373 0 0 0 + 2764 922 1 -0.8472 17.23063 33.39138 27.42826 0 0 0 + 2765 922 2 0.4236 17.91483 33.70380 28.08718 0 0 0 + 2766 922 2 0.4236 17.60174 32.62856 26.89878 0 0 0 +2767 923 1 -0.8472 14.52742 35.08290 34.70376 1 0 0 +2768 923 2 0.4236 14.91728 34.45866 34.02682 1 0 0 +2769 923 2 0.4236 14.84723 34.82725 0.16889 1 0 1 + 2770 924 1 -0.8472 23.44598 32.97673 12.21251 0 0 0 + 2771 924 2 0.4236 24.25669 32.40696 12.34679 0 0 0 + 2772 924 2 0.4236 23.30310 33.54871 13.02021 0 0 0 + 2773 925 1 -0.8472 27.83250 1.81797 26.90445 1 0 0 + 2774 925 2 0.4236 28.40408 1.28779 27.53066 1 0 0 + 2775 925 2 0.4236 27.92130 1.44938 25.97910 1 0 0 + 2776 926 1 -0.8472 33.48976 28.09017 24.91668 -1 0 0 + 2777 926 2 0.4236 33.93640 28.56163 24.15630 -1 0 0 + 2778 926 2 0.4236 33.81589 27.14592 24.96117 -1 0 0 + 2779 927 1 -0.8472 4.51573 24.79905 27.51794 1 -1 0 + 2780 927 2 0.4236 4.61827 24.08055 26.83001 1 -1 0 + 2781 927 2 0.4236 4.53544 25.69346 27.07120 1 -1 0 +2782 928 1 -0.8472 21.98652 18.50956 0.09403 0 0 0 +2783 928 2 0.4236 22.42105 17.88902 34.88847 0 0 -1 +2784 928 2 0.4236 22.64332 18.75754 0.80610 0 0 0 +2785 929 1 -0.8472 1.51311 16.03062 0.14690 0 0 0 +2786 929 2 0.4236 1.10681 16.69203 0.77731 0 0 0 +2787 929 2 0.4236 1.19358 16.21607 34.66487 0 0 -1 + 2788 930 1 -0.8472 15.60223 24.97747 19.15233 0 -1 0 + 2789 930 2 0.4236 16.21656 25.42691 18.50382 0 -1 0 + 2790 930 2 0.4236 14.89182 25.62028 19.43878 0 -1 0 + 2791 931 1 -0.8472 14.89459 26.77828 7.57077 0 0 0 + 2792 931 2 0.4236 15.10000 26.99785 8.52448 0 0 0 + 2793 931 2 0.4236 14.05018 26.24452 7.52604 0 0 0 + 2794 932 1 -0.8472 20.12223 16.99391 24.38823 0 -1 0 + 2795 932 2 0.4236 20.03531 16.23201 23.74646 0 -1 0 + 2796 932 2 0.4236 20.97165 17.48876 24.20508 0 -1 0 + 2797 933 1 -0.8472 31.97095 9.82411 26.24234 0 0 0 + 2798 933 2 0.4236 31.18540 10.35809 25.92973 0 0 0 + 2799 933 2 0.4236 32.47982 9.48527 25.45101 0 0 0 + 2800 934 1 -0.8472 0.38419 34.93068 18.53576 0 -1 0 + 2801 934 2 0.4236 0.38508 0.23464 17.94978 0 0 0 + 2802 934 2 0.4236 35.16957 34.30492 18.23811 -1 -1 0 + 2803 935 1 -0.8472 13.41437 12.33309 24.23677 1 0 0 + 2804 935 2 0.4236 13.12758 11.74937 24.99633 1 0 0 + 2805 935 2 0.4236 12.60873 12.74142 23.80761 1 0 0 + 2806 936 1 -0.8472 5.18744 5.18751 32.87277 1 1 0 + 2807 936 2 0.4236 4.57151 5.77599 32.34907 1 1 0 + 2808 936 2 0.4236 5.82066 4.72905 32.24922 1 1 0 + 2809 937 1 -0.8472 32.42642 26.66747 22.09377 -2 0 0 + 2810 937 2 0.4236 33.12682 27.03535 22.70538 -2 0 0 + 2811 937 2 0.4236 32.68856 25.74768 21.80190 -2 0 0 + 2812 938 1 -0.8472 26.55012 2.70441 29.91123 0 1 0 + 2813 938 2 0.4236 26.41349 3.09573 29.00119 0 1 0 + 2814 938 2 0.4236 27.49214 2.37992 29.99651 0 1 0 + 2815 939 1 -0.8472 31.36066 7.26066 30.58650 -1 0 0 + 2816 939 2 0.4236 31.50950 7.56090 29.64434 -1 0 0 + 2817 939 2 0.4236 30.45500 7.55543 30.89113 -1 0 0 + 2818 940 1 -0.8472 10.17399 14.38777 10.06711 0 -1 0 + 2819 940 2 0.4236 9.26801 14.52344 10.46802 0 -1 0 + 2820 940 2 0.4236 10.08025 13.95584 9.17012 0 -1 0 + 2821 941 1 -0.8472 28.15600 13.94540 15.95737 0 0 0 + 2822 941 2 0.4236 27.27058 14.23684 16.31935 0 0 0 + 2823 941 2 0.4236 28.13899 13.99060 14.95857 0 0 0 + 2824 942 1 -0.8472 8.84083 24.57103 17.24477 -1 0 0 + 2825 942 2 0.4236 7.85233 24.69033 17.33754 -1 0 0 + 2826 942 2 0.4236 9.13305 23.78027 17.78261 -1 0 0 + 2827 943 1 -0.8472 6.95722 20.29000 23.84983 0 1 0 + 2828 943 2 0.4236 7.04815 19.41917 24.33287 0 1 0 + 2829 943 2 0.4236 7.86565 20.64730 23.63296 0 1 0 + 2830 944 1 -0.8472 5.75302 13.11004 29.05447 0 0 0 + 2831 944 2 0.4236 5.97810 12.96788 30.01835 0 0 0 + 2832 944 2 0.4236 4.76843 13.25708 28.96028 0 0 0 + 2833 945 1 -0.8472 30.02928 16.68514 32.84891 0 0 0 + 2834 945 2 0.4236 29.04487 16.85998 32.83002 0 0 0 + 2835 945 2 0.4236 30.27126 16.23411 33.70794 0 0 0 + 2836 946 1 -0.8472 19.41079 24.31013 19.45445 0 -1 0 + 2837 946 2 0.4236 18.91910 23.72864 18.80633 0 -1 0 + 2838 946 2 0.4236 20.21515 24.70141 19.00742 0 -1 0 + 2839 947 1 -0.8472 21.08786 32.52428 34.05522 -1 0 0 + 2840 947 2 0.4236 21.43422 33.32512 33.56665 -1 0 0 + 2841 947 2 0.4236 20.99938 32.73966 35.02771 -1 0 0 + 2842 948 1 -0.8472 27.57938 10.46951 5.09160 0 0 0 + 2843 948 2 0.4236 26.59109 10.61508 5.13655 0 0 0 + 2844 948 2 0.4236 27.76614 9.50420 4.90926 0 0 0 + 2845 949 1 -0.8472 28.73415 28.94644 29.88776 -1 0 0 + 2846 949 2 0.4236 27.74647 28.86939 30.02388 -1 0 0 + 2847 949 2 0.4236 29.09021 28.08186 29.53322 -1 0 0 + 2848 950 1 -0.8472 23.12812 9.19046 12.33250 1 0 0 + 2849 950 2 0.4236 23.47605 8.37982 12.80345 1 0 0 + 2850 950 2 0.4236 23.49814 10.01219 12.76592 1 0 0 +2851 951 1 -0.8472 7.73215 20.48784 35.38931 0 0 0 +2852 951 2 0.4236 7.10638 20.79855 0.65752 0 0 1 +2853 951 2 0.4236 8.34921 19.79575 0.31656 0 0 1 + 2854 952 1 -0.8472 15.75196 1.18543 29.47016 1 0 0 + 2855 952 2 0.4236 16.64637 1.19402 29.91732 1 0 0 + 2856 952 2 0.4236 15.77930 1.76944 28.65891 1 0 0 + 2857 953 1 -0.8472 21.01330 1.65554 12.01507 0 1 0 + 2858 953 2 0.4236 21.26148 1.90066 12.95223 0 1 0 + 2859 953 2 0.4236 21.76578 1.15061 11.59222 0 1 0 + 2860 954 1 -0.8472 17.77139 21.95343 29.40937 -1 0 0 + 2861 954 2 0.4236 18.03328 22.88377 29.66597 -1 0 0 + 2862 954 2 0.4236 18.43500 21.30533 29.78294 -1 0 0 + 2863 955 1 -0.8472 22.46831 13.05746 12.45944 1 0 0 + 2864 955 2 0.4236 23.14396 13.67278 12.05350 1 0 0 + 2865 955 2 0.4236 21.99568 12.55653 11.73444 1 0 0 + 2866 956 1 -0.8472 11.21873 21.74164 13.52771 0 0 0 + 2867 956 2 0.4236 11.52085 22.26841 12.73327 0 0 0 + 2868 956 2 0.4236 10.30802 21.36754 13.35285 0 0 0 + 2869 957 1 -0.8472 21.72722 10.88987 26.22695 0 0 0 + 2870 957 2 0.4236 20.94466 11.47054 26.00254 0 0 0 + 2871 957 2 0.4236 21.66050 10.59424 27.17988 0 0 0 + 2872 958 1 -0.8472 18.46838 8.09516 14.49744 0 0 0 + 2873 958 2 0.4236 19.27863 8.50562 14.07916 0 0 0 + 2874 958 2 0.4236 17.95254 7.59374 13.80289 0 0 0 + 2875 959 1 -0.8472 2.92072 4.40179 25.40986 1 0 0 + 2876 959 2 0.4236 2.92375 3.55851 24.87244 1 0 0 + 2877 959 2 0.4236 3.86068 4.71670 25.54126 1 0 0 + 2878 960 1 -0.8472 5.27077 8.45307 8.47067 0 1 0 + 2879 960 2 0.4236 6.13663 8.79876 8.10908 0 1 0 + 2880 960 2 0.4236 4.51250 8.83717 7.94393 0 1 0 + 2881 961 1 -0.8472 1.76958 24.14716 31.58841 1 1 0 + 2882 961 2 0.4236 1.60567 23.16857 31.46406 1 1 0 + 2883 961 2 0.4236 0.90327 24.60856 31.77958 1 1 0 + 2884 962 1 -0.8472 24.44793 22.66778 34.86292 -1 -1 0 + 2885 962 2 0.4236 24.15877 23.46022 34.32593 -1 -1 0 + 2886 962 2 0.4236 23.64563 22.22751 35.26595 -1 -1 0 + 2887 963 1 -0.8472 4.18215 10.93176 27.72718 0 -1 0 + 2888 963 2 0.4236 4.41887 10.10976 27.20934 0 -1 0 + 2889 963 2 0.4236 4.91894 11.14537 28.36860 0 -1 0 + 2890 964 1 -0.8472 17.69104 23.19157 14.16626 0 -1 0 + 2891 964 2 0.4236 17.12986 23.22868 13.33945 0 -1 0 + 2892 964 2 0.4236 18.57188 23.63143 13.99125 0 -1 0 + 2893 965 1 -0.8472 7.47643 4.12395 28.94377 1 1 0 + 2894 965 2 0.4236 6.53643 4.10965 28.60301 1 1 0 + 2895 965 2 0.4236 8.06807 3.62466 28.31082 1 1 0 + 2896 966 1 -0.8472 24.00375 12.48900 25.21944 0 1 0 + 2897 966 2 0.4236 24.26664 12.12701 24.32514 0 1 0 + 2898 966 2 0.4236 23.24029 11.95566 25.58362 0 1 0 + 2899 967 1 -0.8472 29.91768 1.50145 13.03496 -1 1 0 + 2900 967 2 0.4236 29.05335 1.37915 12.54717 -1 1 0 + 2901 967 2 0.4236 30.45234 0.65805 12.98236 -1 1 0 + 2902 968 1 -0.8472 10.68432 11.21692 11.70509 1 0 0 + 2903 968 2 0.4236 10.03839 11.20065 10.94187 1 0 0 + 2904 968 2 0.4236 10.94732 12.16199 11.89905 1 0 0 + 2905 969 1 -0.8472 26.83864 6.78430 27.89995 0 1 0 + 2906 969 2 0.4236 27.65156 6.22192 28.05128 0 1 0 + 2907 969 2 0.4236 26.70471 6.91923 26.91824 0 1 0 + 2908 970 1 -0.8472 19.45471 27.26305 28.04780 0 -1 0 + 2909 970 2 0.4236 19.04134 26.44985 27.63821 0 -1 0 + 2910 970 2 0.4236 18.84070 27.63413 28.74441 0 -1 0 + 2911 971 1 -0.8472 9.18329 17.54386 23.21323 0 0 0 + 2912 971 2 0.4236 9.75033 18.33292 22.97698 0 0 0 + 2913 971 2 0.4236 9.51723 17.13593 24.06294 0 0 0 + 2914 972 1 -0.8472 18.24866 34.63289 20.65628 1 -1 0 + 2915 972 2 0.4236 17.34524 34.34596 20.33775 1 -1 0 + 2916 972 2 0.4236 18.85770 34.74797 19.87159 1 -1 0 + 2917 973 1 -0.8472 32.52843 32.10108 29.97826 1 -1 0 + 2918 973 2 0.4236 33.25404 32.71935 30.28020 1 -1 0 + 2919 973 2 0.4236 31.64947 32.57665 30.01282 1 -1 0 + 2920 974 1 -0.8472 3.80241 11.49035 8.14956 0 0 0 + 2921 974 2 0.4236 2.91277 11.28906 7.73975 0 0 0 + 2922 974 2 0.4236 3.77571 11.27632 9.12598 0 0 0 + 2923 975 1 -0.8472 19.18653 31.11922 32.50674 0 -1 0 + 2924 975 2 0.4236 19.84180 31.57338 33.11034 0 -1 0 + 2925 975 2 0.4236 18.78222 31.79206 31.88727 0 -1 0 + 2926 976 1 -0.8472 13.34133 28.41424 10.64040 0 -1 0 + 2927 976 2 0.4236 14.24813 28.04636 10.43466 0 -1 0 + 2928 976 2 0.4236 12.65347 27.92404 10.10514 0 -1 0 + 2929 977 1 -0.8472 9.56133 12.05955 5.53720 0 1 0 + 2930 977 2 0.4236 10.08838 11.22096 5.67478 0 1 0 + 2931 977 2 0.4236 9.83717 12.48936 4.67747 0 1 0 + 2932 978 1 -0.8472 7.60177 1.79201 2.09133 0 1 0 + 2933 978 2 0.4236 7.01076 2.58930 1.96898 0 1 0 + 2934 978 2 0.4236 7.51467 1.45316 3.02810 0 1 0 + 2935 979 1 -0.8472 28.78709 11.03509 9.63724 -1 0 0 + 2936 979 2 0.4236 28.90284 11.24252 8.66588 -1 0 0 + 2937 979 2 0.4236 29.64333 11.21599 10.12102 -1 0 0 + 2938 980 1 -0.8472 4.02056 14.84396 0.81996 0 0 0 + 2939 980 2 0.4236 4.39483 14.28239 0.08204 0 0 0 + 2940 980 2 0.4236 3.13862 15.22111 0.53729 0 0 0 + 2941 981 1 -0.8472 28.30108 1.63976 9.02932 -1 0 0 + 2942 981 2 0.4236 28.30413 2.50150 9.53661 -1 0 0 + 2943 981 2 0.4236 27.77598 0.95633 9.53643 -1 0 0 + 2944 982 1 -0.8472 8.86171 20.46625 30.05231 1 0 0 + 2945 982 2 0.4236 8.40488 20.55409 29.16712 1 0 0 + 2946 982 2 0.4236 8.28711 19.93206 30.67235 1 0 0 + 2947 983 1 -0.8472 18.15383 12.23297 19.15095 0 0 0 + 2948 983 2 0.4236 18.65379 11.76439 18.42265 0 0 0 + 2949 983 2 0.4236 17.17857 12.02685 19.07172 0 0 0 + 2950 984 1 -0.8472 30.27019 30.12955 18.83444 1 -1 0 + 2951 984 2 0.4236 31.18072 29.72570 18.74618 1 -1 0 + 2952 984 2 0.4236 29.82132 30.13800 17.94092 1 -1 0 + 2953 985 1 -0.8472 28.72211 14.94210 4.97487 0 1 0 + 2954 985 2 0.4236 29.12355 14.04801 5.17337 0 1 0 + 2955 985 2 0.4236 27.75045 14.83217 4.76577 0 1 0 + 2956 986 1 -0.8472 30.79139 17.34339 25.87787 -1 1 0 + 2957 986 2 0.4236 31.64276 17.65688 25.45739 -1 1 0 + 2958 986 2 0.4236 30.40203 16.60291 25.33010 -1 1 0 + 2959 987 1 -0.8472 20.85050 21.78155 22.79995 0 0 0 + 2960 987 2 0.4236 19.95588 22.19630 22.63385 0 0 0 + 2961 987 2 0.4236 21.56993 22.42549 22.53966 0 0 0 + 2962 988 1 -0.8472 3.21863 15.29262 10.93758 0 0 0 + 2963 988 2 0.4236 3.54765 14.72274 11.69052 0 0 0 + 2964 988 2 0.4236 3.77983 16.11786 10.87424 0 0 0 + 2965 989 1 -0.8472 33.92695 7.67534 6.62621 0 0 0 + 2966 989 2 0.4236 34.05946 8.56683 7.05938 0 0 0 + 2967 989 2 0.4236 34.43072 7.64604 5.76290 0 0 0 + 2968 990 1 -0.8472 33.09880 6.74056 25.13263 0 0 0 + 2969 990 2 0.4236 33.49921 6.29904 24.32971 0 0 0 + 2970 990 2 0.4236 32.69648 7.61622 24.86557 0 0 0 + 2971 991 1 -0.8472 29.48955 24.63672 11.59942 0 0 0 + 2972 991 2 0.4236 29.87987 24.05306 12.31141 0 0 0 + 2973 991 2 0.4236 28.56720 24.32043 11.37763 0 0 0 + 2974 992 1 -0.8472 2.34540 1.81481 21.23390 1 0 0 + 2975 992 2 0.4236 1.37305 1.62113 21.10363 1 0 0 + 2976 992 2 0.4236 2.62003 2.56305 20.63002 1 0 0 +2977 993 1 -0.8472 11.06680 31.42120 0.34581 0 1 0 +2978 993 2 0.4236 10.24429 30.97031 35.44638 0 1 -1 +2979 993 2 0.4236 11.86807 30.86173 0.13383 0 1 0 + 2980 994 1 -0.8472 34.93665 6.07698 11.10142 0 0 0 + 2981 994 2 0.4236 0.18436 6.56576 10.66276 1 0 0 + 2982 994 2 0.4236 34.63985 5.32489 10.51300 0 0 0 + 2983 995 1 -0.8472 20.00992 11.13905 17.51811 0 0 0 + 2984 995 2 0.4236 20.59134 10.54105 16.96644 0 0 0 + 2985 995 2 0.4236 20.46099 11.33089 18.38972 0 0 0 + 2986 996 1 -0.8472 26.63427 15.23996 11.58010 0 0 0 + 2987 996 2 0.4236 25.74658 14.89786 11.27210 0 0 0 + 2988 996 2 0.4236 26.79731 16.14495 11.18720 0 0 0 + 2989 997 1 -0.8472 7.32425 7.27500 11.52314 1 -1 0 + 2990 997 2 0.4236 7.92814 7.17928 10.73188 1 -1 0 + 2991 997 2 0.4236 6.60180 7.93375 11.31325 1 -1 0 + 2992 998 1 -0.8472 8.60862 9.07382 19.34881 1 0 0 + 2993 998 2 0.4236 8.98896 8.19288 19.63037 1 0 0 + 2994 998 2 0.4236 7.76257 8.92345 18.83745 1 0 0 + 2995 999 1 -0.8472 11.21280 13.03889 22.91023 0 0 0 + 2996 999 2 0.4236 10.95126 13.31509 23.83501 0 0 0 + 2997 999 2 0.4236 10.41518 13.08938 22.30919 0 0 0 + 2998 1000 1 -0.8472 15.70634 18.82610 34.73704 0 0 0 + 2999 1000 2 0.4236 15.21674 19.57997 35.17510 0 0 0 + 3000 1000 2 0.4236 16.64346 19.11026 34.53453 0 0 0 + 3001 1001 1 -0.8472 23.12248 30.95440 32.80659 0 -1 0 + 3002 1001 2 0.4236 22.36914 31.30904 33.36034 0 -1 0 + 3003 1001 2 0.4236 23.81237 31.66815 32.68603 0 -1 0 + 3004 1002 1 -0.8472 2.07358 30.68505 32.50823 1 0 0 + 3005 1002 2 0.4236 2.42659 29.78201 32.26368 1 0 0 + 3006 1002 2 0.4236 2.83305 31.27939 32.77274 1 0 0 + 3007 1003 1 -0.8472 12.19941 21.23716 5.42888 1 0 0 + 3008 1003 2 0.4236 11.39729 21.44906 5.98714 1 0 0 + 3009 1003 2 0.4236 12.89772 21.93912 5.56872 1 0 0 + 3010 1004 1 -0.8472 16.49685 26.02267 23.28030 0 -1 0 + 3011 1004 2 0.4236 15.74529 26.37284 23.83930 0 -1 0 + 3012 1004 2 0.4236 16.83643 26.75059 22.68468 0 -1 0 + 3013 1005 1 -0.8472 3.71190 6.69664 23.09349 1 1 0 + 3014 1005 2 0.4236 4.51275 7.22874 23.36821 1 1 0 + 3015 1005 2 0.4236 3.05011 6.67935 23.84295 1 1 0 + 3016 1006 1 -0.8472 23.69417 19.64211 1.85845 0 0 0 + 3017 1006 2 0.4236 23.57866 19.06634 2.66783 0 0 0 + 3018 1006 2 0.4236 24.60178 20.06158 1.87460 0 0 0 + 3019 1007 1 -0.8472 12.49699 4.32659 15.95705 0 0 0 + 3020 1007 2 0.4236 12.08185 4.98442 15.32868 0 0 0 + 3021 1007 2 0.4236 13.47285 4.52425 16.04971 0 0 0 + 3022 1008 1 -0.8472 2.88817 24.31400 12.33073 0 0 0 + 3023 1008 2 0.4236 2.75143 24.30782 11.34016 0 0 0 + 3024 1008 2 0.4236 2.08913 24.71913 12.77495 0 0 0 + 3025 1009 1 -0.8472 4.47007 13.67005 19.84575 0 1 0 + 3026 1009 2 0.4236 4.22969 13.43095 18.90498 0 1 0 + 3027 1009 2 0.4236 4.94923 14.54770 19.85454 0 1 0 + 3028 1010 1 -0.8472 7.11277 19.85870 18.43619 0 0 0 + 3029 1010 2 0.4236 7.43137 20.07081 19.36001 0 0 0 + 3030 1010 2 0.4236 7.65350 19.10536 18.06190 0 0 0 + 3031 1011 1 -0.8472 23.31116 24.86119 33.37442 0 0 0 + 3032 1011 2 0.4236 23.60537 25.39212 32.57973 0 0 0 + 3033 1011 2 0.4236 23.46057 25.39567 34.20626 0 0 0 + 3034 1012 1 -0.8472 6.59172 35.26853 10.29528 0 0 0 + 3035 1012 2 0.4236 6.03345 0.59177 10.30124 0 1 0 + 3036 1012 2 0.4236 6.84495 35.03042 11.23290 0 0 0 + 3037 1013 1 -0.8472 21.58857 3.03691 28.35042 0 -1 0 + 3038 1013 2 0.4236 21.37983 3.73264 27.66317 0 -1 0 + 3039 1013 2 0.4236 20.77001 2.84809 28.89286 0 -1 0 + 3040 1014 1 -0.8472 24.81563 5.45260 22.57323 -1 0 0 + 3041 1014 2 0.4236 24.32945 4.64426 22.24134 -1 0 0 + 3042 1014 2 0.4236 24.64602 6.22053 21.95564 -1 0 0 + 3043 1015 1 -0.8472 34.44382 0.14050 3.28625 -1 1 0 + 3044 1015 2 0.4236 34.61155 35.38786 2.33507 -1 0 0 + 3045 1015 2 0.4236 35.31692 0.29608 3.74826 -1 1 0 + 3046 1016 1 -0.8472 4.27791 2.41161 7.98065 1 1 0 + 3047 1016 2 0.4236 4.66546 1.93228 7.19326 1 1 0 + 3048 1016 2 0.4236 3.77390 3.21600 7.66616 1 1 0 + 3049 1017 1 -0.8472 24.52356 31.65334 21.53988 0 -1 0 + 3050 1017 2 0.4236 24.66693 30.96367 22.24963 0 -1 0 + 3051 1017 2 0.4236 25.23898 31.57129 20.84603 0 -1 0 + 3052 1018 1 -0.8472 34.42078 34.68317 25.27342 0 -1 0 + 3053 1018 2 0.4236 33.95998 0.05744 25.16350 0 0 0 + 3054 1018 2 0.4236 33.89777 34.10967 25.90389 0 -1 0 + 3055 1019 1 -0.8472 11.26425 8.85731 13.25615 0 0 0 + 3056 1019 2 0.4236 11.21883 9.47948 12.47465 0 0 0 + 3057 1019 2 0.4236 10.33767 8.63461 13.55915 0 0 0 +3058 1020 1 -0.8472 17.04930 2.12995 0.32083 0 0 0 +3059 1020 2 0.4236 17.15528 2.34363 1.29194 0 0 0 +3060 1020 2 0.4236 17.87979 1.68577 35.43191 0 0 -1 + 3061 1021 1 -0.8472 24.82320 22.07636 14.94227 0 0 0 + 3062 1021 2 0.4236 25.10356 22.41409 15.84075 0 0 0 + 3063 1021 2 0.4236 24.74082 22.84510 14.30805 0 0 0 + 3064 1022 1 -0.8472 17.77824 29.21423 7.78133 0 0 0 + 3065 1022 2 0.4236 17.50573 29.18071 8.74291 0 0 0 + 3066 1022 2 0.4236 17.68695 28.30413 7.37716 0 0 0 + 3067 1023 1 -0.8472 14.04599 24.76525 11.84064 0 -1 0 + 3068 1023 2 0.4236 14.75054 24.05867 11.90618 0 -1 0 + 3069 1023 2 0.4236 13.88820 25.16342 12.74426 0 -1 0 + 3070 1024 1 -0.8472 24.42854 23.40458 24.83813 -1 0 0 + 3071 1024 2 0.4236 24.80885 24.10174 25.44580 -1 0 0 + 3072 1024 2 0.4236 23.67780 23.79831 24.30777 -1 0 0 +3073 1025 1 -0.8472 11.88653 15.08214 0.29503 1 0 0 +3074 1025 2 0.4236 12.54716 15.05647 34.99198 1 0 -1 +3075 1025 2 0.4236 11.40432 15.95808 0.28467 1 0 0 + 3076 1026 1 -0.8472 11.00548 18.76354 17.70020 1 0 0 + 3077 1026 2 0.4236 11.20683 19.08015 18.62714 1 0 0 + 3078 1026 2 0.4236 11.36832 19.41906 17.03794 1 0 0 + 3079 1027 1 -0.8472 0.21383 34.43335 28.44343 0 -1 0 + 3080 1027 2 0.4236 35.41456 34.46051 29.39515 -1 -1 0 + 3081 1027 2 0.4236 0.52632 33.51015 28.21990 0 -1 0 + 3082 1028 1 -0.8472 27.69776 7.75551 5.28429 0 0 0 + 3083 1028 2 0.4236 28.61915 7.37076 5.22974 0 0 0 + 3084 1028 2 0.4236 27.22506 7.37690 6.08001 0 0 0 + 3085 1029 1 -0.8472 18.57223 5.67473 20.22081 0 0 0 + 3086 1029 2 0.4236 19.11772 6.30191 20.77677 0 0 0 + 3087 1029 2 0.4236 19.17712 5.02379 19.76220 0 0 0 + 3088 1030 1 -0.8472 2.33426 13.17303 32.36357 1 1 0 + 3089 1030 2 0.4236 1.55811 13.79024 32.49242 1 1 0 + 3090 1030 2 0.4236 2.00010 12.26705 32.10388 1 1 0 + 3091 1031 1 -0.8472 35.01515 31.73394 0.97577 0 0 0 + 3092 1031 2 0.4236 34.61233 31.43018 1.83914 0 0 0 + 3093 1031 2 0.4236 34.51750 31.32192 0.21256 0 0 0 + 3094 1032 1 -0.8472 17.16853 3.81647 14.52459 0 1 0 + 3095 1032 2 0.4236 16.50516 3.96386 15.25821 0 1 0 + 3096 1032 2 0.4236 17.89736 3.21428 14.85032 0 1 0 + 3097 1033 1 -0.8472 23.73791 2.45782 3.91262 -1 1 0 + 3098 1033 2 0.4236 23.84521 1.51408 4.22530 -1 1 0 + 3099 1033 2 0.4236 22.76894 2.70462 3.92407 -1 1 0 + 3100 1034 1 -0.8472 22.46593 29.50499 22.79524 -1 1 0 + 3101 1034 2 0.4236 22.76962 29.36450 21.85291 -1 1 0 + 3102 1034 2 0.4236 22.69303 28.69928 23.34222 -1 1 0 + 3103 1035 1 -0.8472 8.33742 6.62626 29.93646 0 0 0 + 3104 1035 2 0.4236 8.89033 7.18506 29.31844 0 0 0 + 3105 1035 2 0.4236 8.14846 5.74280 29.50784 0 0 0 + 3106 1036 1 -0.8472 35.17706 29.80069 28.03160 0 0 0 + 3107 1036 2 0.4236 35.01927 29.87252 29.01643 0 0 0 + 3108 1036 2 0.4236 35.31696 28.84163 27.78553 0 0 0 + 3109 1037 1 -0.8472 30.28414 0.50891 35.01782 0 2 0 + 3110 1037 2 0.4236 29.35072 0.49034 34.65963 0 2 0 + 3111 1037 2 0.4236 30.92912 0.62031 34.26180 0 2 0 + 3112 1038 1 -0.8472 9.04361 33.89809 34.15394 0 -1 0 + 3113 1038 2 0.4236 10.01843 33.94915 34.37094 0 -1 0 + 3114 1038 2 0.4236 8.90680 33.28308 33.37739 0 -1 0 + 3115 1039 1 -0.8472 8.19458 7.90346 34.62935 0 1 0 + 3116 1039 2 0.4236 8.09541 8.76794 35.12211 0 1 0 + 3117 1039 2 0.4236 8.56665 8.08000 33.71811 0 1 0 + 3118 1040 1 -0.8472 16.36566 30.72861 16.14680 0 1 0 + 3119 1040 2 0.4236 15.39278 30.64034 16.36047 0 1 0 + 3120 1040 2 0.4236 16.69757 29.87490 15.74557 0 1 0 + 3121 1041 1 -0.8472 1.38336 21.51866 15.82979 1 -1 0 + 3122 1041 2 0.4236 2.18483 22.02775 16.14354 1 -1 0 + 3123 1041 2 0.4236 1.45028 21.36630 14.84376 1 -1 0 + 3124 1042 1 -0.8472 24.49576 16.91647 14.41347 -1 0 0 + 3125 1042 2 0.4236 24.46970 15.94853 14.16378 -1 0 0 + 3126 1042 2 0.4236 23.81844 17.41789 13.87513 -1 0 0 + 3127 1043 1 -0.8472 6.59665 30.08094 32.96472 1 -1 0 + 3128 1043 2 0.4236 6.38187 29.47645 33.73180 1 -1 0 + 3129 1043 2 0.4236 5.91582 30.81166 32.91541 1 -1 0 + 3130 1044 1 -0.8472 13.78850 1.75258 32.98996 0 1 0 + 3131 1044 2 0.4236 13.86420 0.79825 32.70103 0 1 0 + 3132 1044 2 0.4236 13.84481 1.80443 33.98698 0 1 0 + 3133 1045 1 -0.8472 4.51044 20.46650 25.38327 0 -1 0 + 3134 1045 2 0.4236 4.07148 20.23567 26.25162 0 -1 0 + 3135 1045 2 0.4236 5.12949 19.72804 25.11607 0 -1 0 + 3136 1046 1 -0.8472 8.55000 4.97817 10.53916 -1 0 0 + 3137 1046 2 0.4236 9.43556 4.58181 10.29702 -1 0 0 + 3138 1046 2 0.4236 7.81839 4.44049 10.12007 -1 0 0 + 3139 1047 1 -0.8472 6.56871 13.42917 12.46635 1 0 0 + 3140 1047 2 0.4236 6.84090 14.14672 11.82525 1 0 0 + 3141 1047 2 0.4236 6.79037 13.71379 13.39897 1 0 0 + 3142 1048 1 -0.8472 17.30718 29.56617 18.82292 0 0 0 + 3143 1048 2 0.4236 16.96795 30.09198 18.04294 0 0 0 + 3144 1048 2 0.4236 17.82287 30.16861 19.43211 0 0 0 + 3145 1049 1 -0.8472 7.07716 33.67983 15.88066 1 0 0 + 3146 1049 2 0.4236 8.00388 33.31507 15.97055 1 0 0 + 3147 1049 2 0.4236 7.04393 34.60331 16.26278 1 0 0 + 3148 1050 1 -0.8472 4.32190 32.08805 0.42408 0 0 0 + 3149 1050 2 0.4236 5.29471 32.01881 0.20306 0 0 0 + 3150 1050 2 0.4236 3.99734 33.01036 0.21455 0 0 0 + 3151 1051 1 -0.8472 12.50008 15.43329 7.00231 0 1 0 + 3152 1051 2 0.4236 12.41639 16.01705 7.80983 0 1 0 + 3153 1051 2 0.4236 12.42069 15.99245 6.17710 0 1 0 + 3154 1052 1 -0.8472 20.22282 27.44026 4.69087 -1 0 0 + 3155 1052 2 0.4236 20.73730 27.36336 5.54490 -1 0 0 + 3156 1052 2 0.4236 20.53211 26.73685 4.05097 -1 0 0 + 3157 1053 1 -0.8472 30.00375 27.99420 32.63038 1 1 0 + 3158 1053 2 0.4236 30.47584 28.62820 32.01789 1 1 0 + 3159 1053 2 0.4236 30.56692 27.17887 32.76465 1 1 0 + 3160 1054 1 -0.8472 14.63493 3.86305 1.20786 0 0 0 + 3161 1054 2 0.4236 15.22310 3.05436 1.20241 0 0 0 + 3162 1054 2 0.4236 13.73513 3.62321 0.84348 0 0 0 + 3163 1055 1 -0.8472 4.28675 7.12818 1.70239 1 1 0 + 3164 1055 2 0.4236 4.90666 6.75032 1.01472 1 1 0 + 3165 1055 2 0.4236 4.14189 6.45424 2.42680 1 1 0 + 3166 1056 1 -0.8472 29.16030 26.19530 28.88081 0 -1 0 + 3167 1056 2 0.4236 29.28848 26.91125 28.19459 0 -1 0 + 3168 1056 2 0.4236 28.24711 26.27605 29.28020 0 -1 0 + 3169 1057 1 -0.8472 3.63095 32.78344 28.91318 0 0 0 + 3170 1057 2 0.4236 3.02331 32.00049 28.78007 0 0 0 + 3171 1057 2 0.4236 4.53711 32.45965 29.18516 0 0 0 + 3172 1058 1 -0.8472 23.76056 25.84720 5.67648 0 0 0 + 3173 1058 2 0.4236 23.89776 24.87390 5.86034 0 0 0 + 3174 1058 2 0.4236 24.62472 26.25609 5.38322 0 0 0 + 3175 1059 1 -0.8472 25.38019 33.27871 0.14931 -1 0 0 + 3176 1059 2 0.4236 26.31880 33.35051 0.48664 -1 0 0 + 3177 1059 2 0.4236 24.90181 34.14226 0.30861 -1 0 0 + 3178 1060 1 -0.8472 0.68491 1.52207 17.07190 0 1 0 + 3179 1060 2 0.4236 0.51175 2.44926 17.40397 0 1 0 + 3180 1060 2 0.4236 1.30523 1.55905 16.28844 0 1 0 + 3181 1061 1 -0.8472 23.65181 8.67747 18.77421 0 0 0 + 3182 1061 2 0.4236 22.68856 8.74187 18.51354 0 0 0 + 3183 1061 2 0.4236 24.14900 9.46503 18.41024 0 0 0 + 3184 1062 1 -0.8472 33.05211 15.62986 13.34261 0 0 0 + 3185 1062 2 0.4236 34.00020 15.64431 13.02507 0 0 0 + 3186 1062 2 0.4236 32.54828 14.91657 12.85545 0 0 0 + 3187 1063 1 -0.8472 18.32997 24.65156 30.13550 0 0 0 + 3188 1063 2 0.4236 18.99945 24.85640 30.84948 0 0 0 + 3189 1063 2 0.4236 18.12862 25.48369 29.61879 0 0 0 + 3190 1064 1 -0.8472 5.36408 26.76539 9.70657 1 0 0 + 3191 1064 2 0.4236 4.61487 26.83602 9.04804 1 0 0 + 3192 1064 2 0.4236 5.01332 26.41228 10.57390 1 0 0 + 3193 1065 1 -0.8472 10.10567 10.08061 21.54331 0 0 0 + 3194 1065 2 0.4236 10.54602 10.94036 21.28469 0 0 0 + 3195 1065 2 0.4236 9.48169 9.79389 20.81643 0 0 0 + 3196 1066 1 -0.8472 19.00683 35.07186 29.84480 0 0 0 + 3197 1066 2 0.4236 19.04738 0.45529 29.39029 0 1 0 + 3198 1066 2 0.4236 19.86037 34.57629 29.68408 0 0 0 + 3199 1067 1 -0.8472 29.99711 14.98272 24.72885 -1 0 0 + 3200 1067 2 0.4236 29.69719 14.56470 25.58631 -1 0 0 + 3201 1067 2 0.4236 30.81369 14.51127 24.39589 -1 0 0 + 3202 1068 1 -0.8472 6.63614 29.00766 30.49536 1 0 0 + 3203 1068 2 0.4236 7.11384 29.32519 29.67625 1 0 0 + 3204 1068 2 0.4236 6.90641 29.56908 31.27747 1 0 0 + 3205 1069 1 -0.8472 10.11551 30.29423 18.30231 0 0 0 + 3206 1069 2 0.4236 10.98545 30.70152 18.58028 0 0 0 + 3207 1069 2 0.4236 10.19849 29.93235 17.37380 0 0 0 + 3208 1070 1 -0.8472 32.38903 34.15199 4.78994 0 0 0 + 3209 1070 2 0.4236 33.33485 34.20962 4.47042 0 0 0 + 3210 1070 2 0.4236 32.32473 33.47169 5.51998 0 0 0 + 3211 1071 1 -0.8472 8.26907 25.90440 25.87939 0 0 0 + 3212 1071 2 0.4236 7.44369 26.19768 25.39703 0 0 0 + 3213 1071 2 0.4236 8.21908 26.19751 26.83413 0 0 0 + 3214 1072 1 -0.8472 34.39606 28.76401 22.33914 -1 0 0 + 3215 1072 2 0.4236 34.78287 28.19023 21.61726 -1 0 0 + 3216 1072 2 0.4236 33.95646 29.56347 21.92983 -1 0 0 + 3217 1073 1 -0.8472 26.17808 0.33318 20.75823 0 0 0 + 3218 1073 2 0.4236 27.03602 0.13193 21.23088 0 0 0 + 3219 1073 2 0.4236 25.41800 35.41922 21.25378 0 -1 0 + 3220 1074 1 -0.8472 10.61100 26.37578 18.41595 0 -1 0 + 3221 1074 2 0.4236 10.08330 25.72318 17.87230 0 -1 0 + 3222 1074 2 0.4236 10.12037 26.57693 19.26374 0 -1 0 + 3223 1075 1 -0.8472 8.64359 7.64068 22.40826 1 1 0 + 3224 1075 2 0.4236 9.38042 7.39398 21.77883 1 1 0 + 3225 1075 2 0.4236 9.00778 7.70978 23.33701 1 1 0 + 3226 1076 1 -0.8472 34.94158 6.28899 29.47998 -1 1 0 + 3227 1076 2 0.4236 34.74992 5.34456 29.21292 -1 1 0 + 3228 1076 2 0.4236 35.35594 6.30049 30.38998 -1 1 0 + 3229 1077 1 -0.8472 22.96785 8.26787 24.97489 0 0 0 + 3230 1077 2 0.4236 23.63128 8.57475 24.29249 0 0 0 + 3231 1077 2 0.4236 22.64048 9.05422 25.49872 0 0 0 + 3232 1078 1 -0.8472 11.45410 14.58764 29.16903 -1 -1 0 + 3233 1078 2 0.4236 11.28686 15.56996 29.25265 -1 -1 0 + 3234 1078 2 0.4236 10.98431 14.10543 29.90843 -1 -1 0 + 3235 1079 1 -0.8472 30.98568 28.19268 16.35175 -1 -1 0 + 3236 1079 2 0.4236 30.86407 29.08556 15.91827 -1 -1 0 + 3237 1079 2 0.4236 31.87810 27.81855 16.09965 -1 -1 0 + 3238 1080 1 -0.8472 19.60511 34.63779 0.73034 0 -1 0 + 3239 1080 2 0.4236 20.07181 34.47947 1.60044 0 -1 0 + 3240 1080 2 0.4236 19.65749 0.10212 0.49583 0 0 0 + 3241 1081 1 -0.8472 6.52788 20.20134 8.34657 -1 0 0 + 3242 1081 2 0.4236 6.44859 20.82437 9.12471 -1 0 0 + 3243 1081 2 0.4236 6.75885 20.72214 7.52476 -1 0 0 + 3244 1082 1 -0.8472 2.22359 5.95019 13.03372 1 0 0 + 3245 1082 2 0.4236 3.20048 5.73680 13.04474 1 0 0 + 3246 1082 2 0.4236 1.93257 6.22714 13.94943 1 0 0 + 3247 1083 1 -0.8472 33.54633 3.02522 18.32549 -1 0 0 + 3248 1083 2 0.4236 33.26547 2.84323 19.26782 -1 0 0 + 3249 1083 2 0.4236 32.87661 2.63119 17.69609 -1 0 0 + 3250 1084 1 -0.8472 27.71341 5.53405 14.97739 0 0 0 + 3251 1084 2 0.4236 28.61577 5.86831 15.24942 0 0 0 + 3252 1084 2 0.4236 27.30630 6.16972 14.32155 0 0 0 + 3253 1085 1 -0.8472 15.94416 23.73383 21.56160 0 1 0 + 3254 1085 2 0.4236 15.98176 24.62802 22.00764 0 1 0 + 3255 1085 2 0.4236 15.63717 23.84542 20.61651 0 1 0 + 3256 1086 1 -0.8472 6.69227 14.39868 15.10160 0 0 0 + 3257 1086 2 0.4236 7.68503 14.51748 15.11791 0 0 0 + 3258 1086 2 0.4236 6.25284 15.28527 14.95723 0 0 0 + 3259 1087 1 -0.8472 5.95374 12.14523 3.05261 0 0 0 + 3260 1087 2 0.4236 6.30415 12.22359 2.11933 0 0 0 + 3261 1087 2 0.4236 5.21340 11.47341 3.07535 0 0 0 + 3262 1088 1 -0.8472 12.10252 30.80971 11.22350 1 1 0 + 3263 1088 2 0.4236 12.52277 29.92727 11.01224 1 1 0 + 3264 1088 2 0.4236 12.81790 31.48717 11.39446 1 1 0 + 3265 1089 1 -0.8472 18.93365 2.00832 15.99019 0 -1 0 + 3266 1089 2 0.4236 19.47296 1.23800 15.65004 0 -1 0 + 3267 1089 2 0.4236 18.54763 1.77650 16.88304 0 -1 0 + 3268 1090 1 -0.8472 23.96448 13.72856 20.70151 -1 1 0 + 3269 1090 2 0.4236 24.48869 14.52327 21.00735 -1 1 0 + 3270 1090 2 0.4236 23.44154 13.96884 19.88371 -1 1 0 + 3271 1091 1 -0.8472 8.25157 5.78700 16.02100 0 1 0 + 3272 1091 2 0.4236 8.74962 5.11181 16.56511 0 1 0 + 3273 1091 2 0.4236 8.66944 5.85908 15.11539 0 1 0 + 3274 1092 1 -0.8472 28.35054 22.25648 21.49869 -1 -1 0 + 3275 1092 2 0.4236 29.09362 22.80409 21.11415 -1 -1 0 + 3276 1092 2 0.4236 28.28496 22.42712 22.48181 -1 -1 0 + 3277 1093 1 -0.8472 1.81162 0.06670 2.46594 0 1 0 + 3278 1093 2 0.4236 1.21799 34.98582 1.91575 0 0 0 + 3279 1093 2 0.4236 1.94043 35.16403 3.36929 0 0 0 + 3280 1094 1 -0.8472 35.53166 20.98042 3.82252 -1 0 0 + 3281 1094 2 0.4236 34.63470 21.34595 3.57389 -1 0 0 + 3282 1094 2 0.4236 0.74022 21.58995 3.47998 0 0 0 + 3283 1095 1 -0.8472 11.17694 3.63400 11.43282 0 0 0 + 3284 1095 2 0.4236 10.46131 2.93763 11.37926 0 0 0 + 3285 1095 2 0.4236 11.26616 3.94827 12.37791 0 0 0 + 3286 1096 1 -0.8472 9.92654 28.89578 20.68262 0 0 0 + 3287 1096 2 0.4236 9.98108 29.33694 19.78687 0 0 0 + 3288 1096 2 0.4236 9.37314 28.06585 20.61226 0 0 0 + 3289 1097 1 -0.8472 8.08827 0.98702 4.46142 1 1 0 + 3290 1097 2 0.4236 8.92399 1.53197 4.39386 1 1 0 + 3291 1097 2 0.4236 8.30273 35.53173 4.29053 1 0 0 + 3292 1098 1 -0.8472 2.10866 25.58374 29.35790 0 -1 0 + 3293 1098 2 0.4236 2.19232 25.06311 30.20753 0 -1 0 + 3294 1098 2 0.4236 3.01122 25.90930 29.07623 0 -1 0 + 3295 1099 1 -0.8472 0.21720 17.12702 5.62458 1 0 0 + 3296 1099 2 0.4236 0.72164 16.95368 6.47042 1 0 0 + 3297 1099 2 0.4236 34.80790 17.46284 5.84542 0 0 0 + 3298 1100 1 -0.8472 29.35960 32.88200 7.15034 0 0 0 + 3299 1100 2 0.4236 28.43114 33.02456 6.80738 0 0 0 + 3300 1100 2 0.4236 29.47698 33.37806 8.01064 0 0 0 + 3301 1101 1 -0.8472 33.46143 17.44437 24.98963 1 0 0 + 3302 1101 2 0.4236 33.72538 16.51329 25.24138 1 0 0 + 3303 1101 2 0.4236 33.83439 18.08860 25.65735 1 0 0 + 3304 1102 1 -0.8472 14.63472 31.97268 20.11819 1 -1 0 + 3305 1102 2 0.4236 14.36253 32.40462 20.97800 1 -1 0 + 3306 1102 2 0.4236 15.60752 31.74378 20.15354 1 -1 0 + 3307 1103 1 -0.8472 17.90095 30.19602 29.07393 0 0 0 + 3308 1103 2 0.4236 17.96731 30.36446 28.09048 0 0 0 + 3309 1103 2 0.4236 18.56336 30.76959 29.55576 0 0 0 + 3310 1104 1 -0.8472 29.81731 30.58982 9.54416 -1 -1 0 + 3311 1104 2 0.4236 29.63821 31.39695 8.98161 -1 -1 0 + 3312 1104 2 0.4236 30.53858 30.79746 10.20493 -1 -1 0 + 3313 1105 1 -0.8472 21.82976 0.18004 6.59623 0 1 0 + 3314 1105 2 0.4236 21.32664 34.98930 7.10702 0 0 0 + 3315 1105 2 0.4236 21.47662 1.08550 6.83159 0 1 0 + 3316 1106 1 -0.8472 29.69215 11.04418 25.02770 0 0 0 + 3317 1106 2 0.4236 28.84149 10.53054 24.91587 0 0 0 + 3318 1106 2 0.4236 29.59049 11.69820 25.77727 0 0 0 + 3319 1107 1 -0.8472 7.91759 12.41881 27.49079 1 0 0 + 3320 1107 2 0.4236 7.27216 12.31040 28.24684 1 0 0 + 3321 1107 2 0.4236 8.07535 13.39211 27.32415 1 0 0 + 3322 1108 1 -0.8472 1.58250 18.15258 25.23805 0 0 0 + 3323 1108 2 0.4236 0.92416 18.82419 25.57788 0 0 0 + 3324 1108 2 0.4236 1.37849 17.93983 24.28250 0 0 0 + 3325 1109 1 -0.8472 6.93347 23.53201 2.35517 1 -1 0 + 3326 1109 2 0.4236 6.65652 22.58772 2.17757 1 -1 0 + 3327 1109 2 0.4236 7.76609 23.73748 1.84092 1 -1 0 + 3328 1110 1 -0.8472 4.74464 5.25742 7.60193 0 1 0 + 3329 1110 2 0.4236 5.42640 4.59168 7.90511 0 1 0 + 3330 1110 2 0.4236 4.27163 5.63599 8.39747 0 1 0 + 3331 1111 1 -0.8472 8.12552 1.12029 8.50091 1 0 0 + 3332 1111 2 0.4236 7.73332 0.58543 9.24927 1 0 0 + 3333 1111 2 0.4236 8.35748 0.51169 7.74213 1 0 0 + 3334 1112 1 -0.8472 19.74359 22.07163 2.67622 0 0 0 + 3335 1112 2 0.4236 20.34968 22.23695 3.45421 0 0 0 + 3336 1112 2 0.4236 19.04678 21.40195 2.93298 0 0 0 +3337 1113 1 -0.8472 26.99679 3.40644 0.23973 0 1 0 +3338 1113 2 0.4236 27.37894 4.26925 35.35606 0 1 -1 +3339 1113 2 0.4236 27.54590 3.07037 1.00492 0 1 0 + 3340 1114 1 -0.8472 2.76236 30.72744 25.44148 1 0 0 + 3341 1114 2 0.4236 2.26842 30.38711 24.64140 1 0 0 + 3342 1114 2 0.4236 3.56792 31.23927 25.14305 1 0 0 + 3343 1115 1 -0.8472 32.12430 13.85696 23.83760 -1 0 0 + 3344 1115 2 0.4236 32.83244 14.29542 24.39093 -1 0 0 + 3345 1115 2 0.4236 32.25120 12.86530 23.85869 -1 0 0 + 3346 1116 1 -0.8472 10.21628 20.26624 34.40125 1 0 0 + 3347 1116 2 0.4236 10.71138 21.11413 34.59057 1 0 0 + 3348 1116 2 0.4236 9.23602 20.45695 34.35014 1 0 0 + 3349 1117 1 -0.8472 23.09081 20.87638 25.30398 -1 -1 0 + 3350 1117 2 0.4236 22.37116 20.90702 25.99764 -1 -1 0 + 3351 1117 2 0.4236 23.32969 21.80796 25.03015 -1 -1 0 + 3352 1118 1 -0.8472 29.45887 17.10774 18.22032 0 0 0 + 3353 1118 2 0.4236 30.22190 17.47370 18.75302 0 0 0 + 3354 1118 2 0.4236 28.68228 17.73528 18.27593 0 0 0 + 3355 1119 1 -0.8472 20.05651 13.40407 10.45749 1 1 0 + 3356 1119 2 0.4236 19.47165 13.23293 11.25034 1 1 0 + 3357 1119 2 0.4236 19.78197 12.80508 9.70530 1 1 0 + 3358 1120 1 -0.8472 20.70762 15.06236 6.66545 -1 0 0 + 3359 1120 2 0.4236 21.25889 14.32457 6.27596 -1 0 0 + 3360 1120 2 0.4236 21.16718 15.93745 6.51395 -1 0 0 + 3361 1121 1 -0.8472 18.89325 16.33477 29.01551 0 0 0 + 3362 1121 2 0.4236 19.58381 17.05767 29.03667 0 0 0 + 3363 1121 2 0.4236 18.82390 15.91345 29.91973 0 0 0 + 3364 1122 1 -0.8472 32.53070 22.11236 16.33258 0 0 0 + 3365 1122 2 0.4236 31.61485 21.71487 16.27572 0 0 0 + 3366 1122 2 0.4236 32.95674 22.09858 15.42800 0 0 0 + 3367 1123 1 -0.8472 25.66860 12.05813 29.52616 0 0 0 + 3368 1123 2 0.4236 25.53751 12.57429 28.67979 0 0 0 + 3369 1123 2 0.4236 26.45841 11.45268 29.42833 0 0 0 + 3370 1124 1 -0.8472 17.50953 29.89865 23.74962 0 0 0 + 3371 1124 2 0.4236 18.29724 29.81518 23.13925 0 0 0 + 3372 1124 2 0.4236 16.70119 29.51259 23.30525 0 0 0 + 3373 1125 1 -0.8472 20.42758 5.60773 4.90458 0 0 0 + 3374 1125 2 0.4236 20.79830 5.93925 5.77208 0 0 0 + 3375 1125 2 0.4236 19.45567 5.40009 5.01507 0 0 0 + 3376 1126 1 -0.8472 21.22300 7.21858 16.33609 0 0 0 + 3377 1126 2 0.4236 21.71859 8.08305 16.25232 0 0 0 + 3378 1126 2 0.4236 20.23901 7.39452 16.30900 0 0 0 + 3379 1127 1 -0.8472 8.72497 17.28708 17.55696 -1 -1 0 + 3380 1127 2 0.4236 9.58423 17.79092 17.64519 -1 -1 0 + 3381 1127 2 0.4236 8.91490 16.35639 17.24449 -1 -1 0 + 3382 1128 1 -0.8472 8.76414 18.06755 33.54747 0 1 0 + 3383 1128 2 0.4236 9.30454 18.84130 33.87802 0 1 0 + 3384 1128 2 0.4236 7.81310 18.35231 33.42741 0 1 0 + 3385 1129 1 -0.8472 32.82700 35.52108 32.09864 0 0 0 + 3386 1129 2 0.4236 32.18718 34.75823 32.19162 0 0 0 + 3387 1129 2 0.4236 32.43608 0.70537 31.49022 0 1 0 + 3388 1130 1 -0.8472 9.68869 32.41541 15.80987 0 -2 0 + 3389 1130 2 0.4236 10.32198 32.88836 15.19734 0 -2 0 + 3390 1130 2 0.4236 9.49060 31.50514 15.44640 0 -2 0 + 3391 1131 1 -0.8472 3.13703 9.32361 6.33009 0 0 0 + 3392 1131 2 0.4236 2.73001 10.14381 5.92815 0 0 0 + 3393 1131 2 0.4236 3.81597 8.94572 5.70069 0 0 0 + 3394 1132 1 -0.8472 8.17658 30.34937 28.56505 0 0 0 + 3395 1132 2 0.4236 8.28700 29.89563 27.68082 0 0 0 + 3396 1132 2 0.4236 8.88873 31.04267 28.67515 0 0 0 + 3397 1133 1 -0.8472 5.53061 5.11969 25.83483 1 1 0 + 3398 1133 2 0.4236 6.24983 4.47405 25.57827 1 1 0 + 3399 1133 2 0.4236 5.62889 5.95828 25.29905 1 1 0 + 3400 1134 1 -0.8472 27.96519 26.59699 23.46335 0 0 0 + 3401 1134 2 0.4236 27.46175 26.09209 22.76224 0 0 0 + 3402 1134 2 0.4236 27.32121 27.10484 24.03546 0 0 0 + 3403 1135 1 -0.8472 8.76854 34.46179 30.13004 0 0 0 + 3404 1135 2 0.4236 7.98772 34.69897 30.70797 0 0 0 + 3405 1135 2 0.4236 9.57720 34.32484 30.70212 0 0 0 + 3406 1136 1 -0.8472 6.61675 26.68586 32.41993 0 1 0 + 3407 1136 2 0.4236 6.44110 27.45464 31.80503 0 1 0 + 3408 1136 2 0.4236 5.81960 26.08236 32.43514 0 1 0 + 3409 1137 1 -0.8472 20.61037 1.66831 21.21259 0 1 0 + 3410 1137 2 0.4236 20.46142 2.52558 20.71980 0 1 0 + 3411 1137 2 0.4236 19.80342 1.08529 21.11862 0 1 0 + 3412 1138 1 -0.8472 17.10976 11.94341 25.70251 0 1 0 + 3413 1138 2 0.4236 16.57575 12.22093 24.90392 0 1 0 + 3414 1138 2 0.4236 17.05537 12.65457 26.40341 0 1 0 + 3415 1139 1 -0.8472 35.29388 32.21867 32.51401 -1 -1 0 + 3416 1139 2 0.4236 0.72519 31.87316 32.55062 0 -1 0 + 3417 1139 2 0.4236 35.30112 33.17035 32.20707 -1 -1 0 + 3418 1140 1 -0.8472 18.63749 20.06698 10.24470 -1 0 0 + 3419 1140 2 0.4236 18.71657 19.22662 9.70852 -1 0 0 + 3420 1140 2 0.4236 17.74969 20.08665 10.70452 -1 0 0 + 3421 1141 1 -0.8472 15.67168 16.70914 30.84639 -1 -1 0 + 3422 1141 2 0.4236 15.18511 17.13458 31.60940 -1 -1 0 + 3423 1141 2 0.4236 15.07898 16.03321 30.40844 -1 -1 0 + 3424 1142 1 -0.8472 25.32085 32.99754 32.93324 0 0 0 + 3425 1142 2 0.4236 25.32696 32.97137 33.93285 0 0 0 + 3426 1142 2 0.4236 26.15749 32.57590 32.58366 0 0 0 + 3427 1143 1 -0.8472 21.95911 34.91495 21.68096 0 -1 0 + 3428 1143 2 0.4236 22.86918 35.09934 22.05209 0 -1 0 + 3429 1143 2 0.4236 21.54269 0.26581 21.37813 0 0 0 + 3430 1144 1 -0.8472 9.90943 22.86932 28.54732 0 -1 0 + 3431 1144 2 0.4236 9.65403 22.01433 28.99867 0 -1 0 + 3432 1144 2 0.4236 9.79947 23.62979 29.18729 0 -1 0 + 3433 1145 1 -0.8472 18.92073 1.83062 28.54452 0 0 0 + 3434 1145 2 0.4236 18.77899 1.62596 27.57604 0 0 0 + 3435 1145 2 0.4236 18.45840 2.68673 28.77539 0 0 0 + 3436 1146 1 -0.8472 16.83842 26.30374 13.63728 1 0 0 + 3437 1146 2 0.4236 16.31083 25.83360 14.34480 1 0 0 + 3438 1146 2 0.4236 16.31854 27.08861 13.30007 1 0 0 + 3439 1147 1 -0.8472 23.03513 33.97776 14.66518 -1 0 0 + 3440 1147 2 0.4236 22.86690 33.83634 15.64068 -1 0 0 + 3441 1147 2 0.4236 23.46646 34.86929 14.52711 -1 0 0 +3442 1148 1 -0.8472 26.37468 30.43214 35.25468 0 0 0 +3443 1148 2 0.4236 25.71419 30.35818 34.50752 0 0 0 +3444 1148 2 0.4236 26.42258 31.38172 0.11725 0 0 1 + 3445 1149 1 -0.8472 32.63917 13.78229 28.38877 -1 0 0 + 3446 1149 2 0.4236 32.58013 13.67594 29.38133 -1 0 0 + 3447 1149 2 0.4236 33.03290 12.95516 27.98776 -1 0 0 + 3448 1150 1 -0.8472 1.19545 11.88827 7.42402 0 0 0 + 3449 1150 2 0.4236 1.37418 11.89679 6.44019 0 0 0 + 3450 1150 2 0.4236 0.43544 11.26847 7.61937 0 0 0 + 3451 1151 1 -0.8472 35.00393 34.58219 14.67872 -1 0 0 + 3452 1151 2 0.4236 35.36912 34.75521 13.76404 -1 0 0 + 3453 1151 2 0.4236 35.20028 35.36471 15.26952 -1 0 0 + 3454 1152 1 -0.8472 9.91103 32.33524 28.62464 1 0 0 + 3455 1152 2 0.4236 10.87005 32.22620 28.36321 1 0 0 + 3456 1152 2 0.4236 9.82922 33.07729 29.28991 1 0 0 + 3457 1153 1 -0.8472 6.36330 25.82391 16.66394 1 -1 0 + 3458 1153 2 0.4236 6.42232 25.33261 15.79498 1 -1 0 + 3459 1153 2 0.4236 5.42022 25.80214 16.99576 1 -1 0 + 3460 1154 1 -0.8472 32.81749 28.00308 1.05981 0 0 0 + 3461 1154 2 0.4236 32.64819 27.98472 2.04517 0 0 0 + 3462 1154 2 0.4236 33.80293 27.98990 0.89062 0 0 0 + 3463 1155 1 -0.8472 2.09892 25.00453 9.72837 1 -1 0 + 3464 1155 2 0.4236 1.31233 25.44939 9.30021 1 -1 0 + 3465 1155 2 0.4236 2.79673 24.82249 9.03567 1 -1 0 + 3466 1156 1 -0.8472 3.70573 6.67896 30.88514 1 0 0 + 3467 1156 2 0.4236 3.24241 7.52493 30.62130 1 0 0 + 3468 1156 2 0.4236 3.21166 5.89633 30.50649 1 0 0 + 3469 1157 1 -0.8472 22.91846 23.35707 22.00831 -1 -1 0 + 3470 1157 2 0.4236 23.89673 23.33055 21.80272 -1 -1 0 + 3471 1157 2 0.4236 22.69047 24.23401 22.43137 -1 -1 0 + 3472 1158 1 -0.8472 4.20157 8.41273 26.79776 0 1 0 + 3473 1158 2 0.4236 4.90641 7.70392 26.82417 0 1 0 + 3474 1158 2 0.4236 3.43075 8.09587 26.24514 0 1 0 + 3475 1159 1 -0.8472 27.83257 24.37855 5.10280 0 -1 0 + 3476 1159 2 0.4236 28.60423 24.78261 4.61164 0 -1 0 + 3477 1159 2 0.4236 27.02864 24.96430 5.00022 0 -1 0 + 3478 1160 1 -0.8472 28.25521 34.70625 30.38048 0 0 0 + 3479 1160 2 0.4236 28.81969 33.89251 30.51886 0 0 0 + 3480 1160 2 0.4236 28.61204 35.23210 29.60840 0 0 0 + 3481 1161 1 -0.8472 30.16072 30.72861 15.64472 0 -1 0 + 3482 1161 2 0.4236 29.37415 31.30921 15.85493 0 -1 0 + 3483 1161 2 0.4236 30.99754 31.17198 15.96580 0 -1 0 + 3484 1162 1 -0.8472 14.30036 15.88614 9.70147 1 -1 0 + 3485 1162 2 0.4236 14.12425 15.15890 9.03808 1 -1 0 + 3486 1162 2 0.4236 15.27146 16.12414 9.68516 1 -1 0 + 3487 1163 1 -0.8472 32.30744 26.75439 30.27938 -2 -1 0 + 3488 1163 2 0.4236 31.79334 27.51898 29.89077 -2 -1 0 + 3489 1163 2 0.4236 33.17053 27.09038 30.65636 -2 -1 0 + 3490 1164 1 -0.8472 26.38370 26.69069 5.02854 0 0 0 + 3491 1164 2 0.4236 26.06841 26.98085 4.12499 0 0 0 + 3492 1164 2 0.4236 26.97407 27.39737 5.41835 0 0 0 + 3493 1165 1 -0.8472 20.86392 29.03407 31.88890 0 0 0 + 3494 1165 2 0.4236 21.65113 29.58265 32.17038 0 0 0 + 3495 1165 2 0.4236 20.02838 29.43015 32.26960 0 0 0 + 3496 1166 1 -0.8472 25.81223 29.44957 19.78123 -1 -1 0 + 3497 1166 2 0.4236 26.68614 29.32640 20.25133 -1 -1 0 + 3498 1166 2 0.4236 25.97911 29.70752 18.82962 -1 -1 0 + 3499 1167 1 -0.8472 9.81268 4.84917 23.38536 1 0 0 + 3500 1167 2 0.4236 10.63486 5.32563 23.07407 1 0 0 + 3501 1167 2 0.4236 9.19011 4.71979 22.61361 1 0 0 + 3502 1168 1 -0.8472 27.09504 22.27136 13.03967 1 -1 0 + 3503 1168 2 0.4236 27.07533 21.30935 13.31187 1 -1 0 + 3504 1168 2 0.4236 27.49938 22.35174 12.12861 1 -1 0 + 3505 1169 1 -0.8472 29.74324 0.48259 28.65165 0 1 0 + 3506 1169 2 0.4236 30.70461 0.21026 28.61248 0 1 0 + 3507 1169 2 0.4236 29.63711 1.23896 29.29707 0 1 0 + 3508 1170 1 -0.8472 23.29461 4.02585 30.19760 0 1 0 + 3509 1170 2 0.4236 23.97815 4.36071 29.54906 0 1 0 + 3510 1170 2 0.4236 22.50367 3.67469 29.69656 0 1 0 + 3511 1171 1 -0.8472 10.11973 1.62285 31.79003 0 0 0 + 3512 1171 2 0.4236 10.13259 2.60573 31.97369 0 0 0 + 3513 1171 2 0.4236 9.27443 1.38412 31.31210 0 0 0 + 3514 1172 1 -0.8472 23.98447 35.12348 7.95924 -1 -1 0 + 3515 1172 2 0.4236 23.32600 35.43441 7.27390 -1 -1 0 + 3516 1172 2 0.4236 24.62710 34.48366 7.53784 -1 -1 0 + 3517 1173 1 -0.8472 18.95755 12.21646 15.09912 0 1 0 + 3518 1173 2 0.4236 19.29259 11.86381 15.97282 0 1 0 + 3519 1173 2 0.4236 18.12141 11.73165 14.84259 0 1 0 + 3520 1174 1 -0.8472 20.64435 34.05811 11.96399 0 -1 0 + 3521 1174 2 0.4236 20.04418 34.42348 11.25246 0 -1 0 + 3522 1174 2 0.4236 21.38622 33.53873 11.53994 0 -1 0 + 3523 1175 1 -0.8472 1.02047 25.62099 23.79503 1 0 0 + 3524 1175 2 0.4236 1.42266 26.30733 24.40092 1 0 0 + 3525 1175 2 0.4236 0.53030 24.94115 24.34042 1 0 0 + 3526 1176 1 -0.8472 10.99120 19.54610 23.24843 1 0 0 + 3527 1176 2 0.4236 10.59016 20.42272 23.51428 1 0 0 + 3528 1176 2 0.4236 11.87233 19.70414 22.80279 1 0 0 + 3529 1177 1 -0.8472 27.88427 14.09439 8.71746 0 0 0 + 3530 1177 2 0.4236 28.03205 13.69075 9.62033 0 0 0 + 3531 1177 2 0.4236 28.05850 13.40695 8.01245 0 0 0 + 3532 1178 1 -0.8472 24.85221 12.37059 16.45030 0 0 0 + 3533 1178 2 0.4236 24.81993 11.76201 17.24311 0 0 0 + 3534 1178 2 0.4236 25.21529 13.26013 16.72749 0 0 0 +3535 1179 1 -0.8472 3.37410 29.51426 35.24851 1 0 0 +3536 1179 2 0.4236 3.67043 30.43590 0.05182 1 0 1 +3537 1179 2 0.4236 3.66223 28.86794 0.50788 1 0 1 + 3538 1180 1 -0.8472 0.35240 31.88385 22.28260 0 0 0 + 3539 1180 2 0.4236 0.75035 32.67685 22.74384 0 0 0 + 3540 1180 2 0.4236 0.12386 31.18441 22.95971 0 0 0 + 3541 1181 1 -0.8472 22.09365 22.96551 19.30426 -1 1 0 + 3542 1181 2 0.4236 22.15372 23.84283 18.82824 -1 1 0 + 3543 1181 2 0.4236 22.25424 23.10473 20.28136 -1 1 0 + 3544 1182 1 -0.8472 21.04348 34.07945 16.88194 0 -1 0 + 3545 1182 2 0.4236 20.64076 33.23881 17.24399 0 -1 0 + 3546 1182 2 0.4236 20.84507 34.83819 17.50233 0 -1 0 + 3547 1183 1 -0.8472 33.55073 31.23980 34.07326 -1 -1 0 + 3548 1183 2 0.4236 33.07430 31.97063 34.56197 -1 -1 0 + 3549 1183 2 0.4236 34.22507 31.63882 33.45194 -1 -1 0 + 3550 1184 1 -0.8472 18.03786 31.41193 20.73579 -1 0 0 + 3551 1184 2 0.4236 18.60060 30.70706 21.16754 -1 0 0 + 3552 1184 2 0.4236 17.84513 32.13633 21.39763 -1 0 0 + 3553 1185 1 -0.8472 21.11935 11.51623 20.22975 1 0 0 + 3554 1185 2 0.4236 21.20219 11.22096 21.18154 1 0 0 + 3555 1185 2 0.4236 21.20649 12.51119 20.18069 1 0 0 + 3556 1186 1 -0.8472 2.50377 22.45553 28.26102 0 0 0 + 3557 1186 2 0.4236 2.69363 23.41750 28.06489 0 0 0 + 3558 1186 2 0.4236 3.26130 22.06638 28.78510 0 0 0 + 3559 1187 1 -0.8472 1.89482 15.34996 4.09798 1 0 0 + 3560 1187 2 0.4236 1.58103 16.17698 4.56436 1 0 0 + 3561 1187 2 0.4236 1.10474 14.83228 3.76974 1 0 0 + 3562 1188 1 -0.8472 11.31662 29.94794 26.07063 1 0 0 + 3563 1188 2 0.4236 10.36281 30.18370 25.88446 1 0 0 + 3564 1188 2 0.4236 11.60685 30.38189 26.92349 1 0 0 + 3565 1189 1 -0.8472 10.46187 0.48151 28.47016 0 0 0 + 3566 1189 2 0.4236 11.30710 0.79408 28.90357 0 0 0 + 3567 1189 2 0.4236 9.81615 0.18539 29.17392 0 0 0 + 3568 1190 1 -0.8472 20.01390 21.11502 19.40053 0 0 0 + 3569 1190 2 0.4236 19.92265 20.43003 20.12333 0 0 0 + 3570 1190 2 0.4236 20.72410 21.77249 19.65214 0 0 0 + 3571 1191 1 -0.8472 17.49785 14.90201 31.45641 0 1 0 + 3572 1191 2 0.4236 17.50843 14.17303 30.77203 0 1 0 + 3573 1191 2 0.4236 16.85603 15.61498 31.17410 0 1 0 + 3574 1192 1 -0.8472 23.93241 26.17915 0.41284 -1 -1 0 + 3575 1192 2 0.4236 23.77665 25.45312 1.08259 -1 -1 0 + 3576 1192 2 0.4236 24.91551 26.30253 0.27758 -1 -1 0 + 3577 1193 1 -0.8472 15.48155 12.36384 9.66953 0 0 0 + 3578 1193 2 0.4236 14.53261 12.38191 9.35473 0 0 0 + 3579 1193 2 0.4236 16.05799 12.85827 9.01897 0 0 0 + 3580 1194 1 -0.8472 24.94921 4.70274 28.23684 -1 0 0 + 3581 1194 2 0.4236 25.43668 5.57148 28.32404 -1 0 0 + 3582 1194 2 0.4236 25.25172 4.23253 27.40777 -1 0 0 + 3583 1195 1 -0.8472 7.23520 24.31872 5.42817 0 0 0 + 3584 1195 2 0.4236 7.41578 24.72360 6.32449 0 0 0 + 3585 1195 2 0.4236 8.06583 24.35494 4.87261 0 0 0 + 3586 1196 1 -0.8472 28.58261 14.10891 13.19958 0 1 0 + 3587 1196 2 0.4236 27.78762 14.51354 12.74766 0 1 0 + 3588 1196 2 0.4236 28.68835 13.16021 12.90164 0 1 0 + 3589 1197 1 -0.8472 34.03337 15.87375 9.37663 -1 0 0 + 3590 1197 2 0.4236 34.58744 16.59549 9.79136 -1 0 0 + 3591 1197 2 0.4236 34.53727 15.01038 9.40222 -1 0 0 + 3592 1198 1 -0.8472 31.82828 18.36860 3.71224 -1 -1 0 + 3593 1198 2 0.4236 32.31781 17.82539 4.39432 -1 -1 0 + 3594 1198 2 0.4236 32.15945 18.13334 2.79850 -1 -1 0 + 3595 1199 1 -0.8472 23.59606 11.47870 18.85195 -1 0 0 + 3596 1199 2 0.4236 23.08158 11.20644 19.66507 -1 0 0 + 3597 1199 2 0.4236 23.26663 12.36661 18.53091 -1 0 0 + 3598 1200 1 -0.8472 15.34275 31.40288 27.99920 0 0 0 + 3599 1200 2 0.4236 16.12521 31.94953 27.70102 0 0 0 + 3600 1200 2 0.4236 15.34691 30.52552 27.51943 0 0 0 + 3601 1201 1 -0.8472 13.77256 0.54624 8.10259 0 1 0 + 3602 1201 2 0.4236 13.86377 35.20962 8.63274 0 0 0 + 3603 1201 2 0.4236 13.42179 1.27416 8.69169 0 1 0 + 3604 1202 1 -0.8472 29.74122 21.73816 15.80987 0 0 0 + 3605 1202 2 0.4236 28.91356 22.21483 16.10610 0 0 0 + 3606 1202 2 0.4236 29.58403 20.75090 15.83419 0 0 0 + 3607 1203 1 -0.8472 9.34349 5.53388 13.38007 1 0 0 + 3608 1203 2 0.4236 8.89988 5.78430 12.51959 1 0 0 + 3609 1203 2 0.4236 10.20861 6.02809 13.46529 1 0 0 + 3610 1204 1 -0.8472 33.68754 33.26661 18.34318 0 -1 0 + 3611 1204 2 0.4236 34.19102 32.52776 18.79102 0 -1 0 + 3612 1204 2 0.4236 33.14660 33.76135 19.02330 0 -1 0 + 3613 1205 1 -0.8472 8.49063 30.24622 2.44138 1 1 0 + 3614 1205 2 0.4236 8.21723 31.11119 2.02057 1 1 0 + 3615 1205 2 0.4236 7.88983 30.04774 3.21571 1 1 0 + 3616 1206 1 -0.8472 25.31936 5.99106 34.51443 1 0 0 + 3617 1206 2 0.4236 25.28141 5.19128 33.91538 1 0 0 + 3618 1206 2 0.4236 25.62081 5.71091 35.42578 1 0 0 + 3619 1207 1 -0.8472 26.73560 34.72965 14.29355 0 -1 0 + 3620 1207 2 0.4236 26.80598 35.39294 15.03854 0 -1 0 + 3621 1207 2 0.4236 25.87589 34.86993 13.80250 0 -1 0 + 3622 1208 1 -0.8472 21.83502 2.05714 14.53069 0 0 0 + 3623 1208 2 0.4236 21.33580 1.21622 14.73940 0 0 0 + 3624 1208 2 0.4236 21.32241 2.84341 14.87559 0 0 0 + 3625 1209 1 -0.8472 35.01867 0.23622 21.00335 0 0 0 + 3626 1209 2 0.4236 35.14727 0.04188 20.03089 0 0 0 + 3627 1209 2 0.4236 0.26234 35.33762 21.52623 1 -1 0 + 3628 1210 1 -0.8472 22.35916 9.63134 16.26225 0 0 0 + 3629 1210 2 0.4236 23.23198 9.14331 16.26402 0 0 0 + 3630 1210 2 0.4236 22.39939 10.38390 15.60499 0 0 0 + 3631 1211 1 -0.8472 11.20172 33.59575 17.81686 1 0 0 + 3632 1211 2 0.4236 10.69181 33.24651 17.03074 1 0 0 + 3633 1211 2 0.4236 11.65801 32.83712 18.28189 1 0 0 + 3634 1212 1 -0.8472 31.82608 18.51865 34.56225 0 -1 0 + 3635 1212 2 0.4236 31.28986 19.16910 35.10013 0 -1 0 + 3636 1212 2 0.4236 31.53461 18.55633 33.60645 0 -1 0 + 3637 1213 1 -0.8472 30.88253 31.96225 12.90618 0 -1 0 + 3638 1213 2 0.4236 31.38406 31.32256 12.32378 0 -1 0 + 3639 1213 2 0.4236 30.61549 31.50276 13.75323 0 -1 0 + 3640 1214 1 -0.8472 13.98169 21.39098 19.92118 0 0 0 + 3641 1214 2 0.4236 13.95328 20.40141 19.78017 0 0 0 + 3642 1214 2 0.4236 14.32905 21.83552 19.09554 0 0 0 + 3643 1215 1 -0.8472 4.16081 28.17702 1.92690 1 0 0 + 3644 1215 2 0.4236 5.01126 27.72808 2.20102 1 0 0 + 3645 1215 2 0.4236 3.39356 27.76728 2.42026 1 0 0 + 3646 1216 1 -0.8472 2.61206 16.00836 16.04875 1 0 0 + 3647 1216 2 0.4236 1.74345 15.51304 16.05970 1 0 0 + 3648 1216 2 0.4236 2.43904 16.98712 16.15867 1 0 0 + 3649 1217 1 -0.8472 13.59737 19.95485 22.53633 1 0 0 + 3650 1217 2 0.4236 14.21305 20.60053 22.08473 1 0 0 + 3651 1217 2 0.4236 13.73769 19.99671 23.52552 1 0 0 + 3652 1218 1 -0.8472 7.18982 10.71677 12.05084 1 0 0 + 3653 1218 2 0.4236 6.43794 10.12559 11.75911 1 0 0 + 3654 1218 2 0.4236 6.83195 11.62130 12.28263 1 0 0 + 3655 1219 1 -0.8472 15.07429 14.72118 6.25090 1 0 0 + 3656 1219 2 0.4236 14.14374 14.54507 6.57184 1 0 0 + 3657 1219 2 0.4236 15.07706 14.77984 5.25263 1 0 0 + 3658 1220 1 -0.8472 17.76755 16.08175 24.87563 0 0 0 + 3659 1220 2 0.4236 17.58977 15.62862 24.00214 0 0 0 + 3660 1220 2 0.4236 18.65997 16.53165 24.84217 0 0 0 + 3661 1221 1 -0.8472 17.65901 7.92406 7.74964 1 0 0 + 3662 1221 2 0.4236 18.59311 8.23144 7.93120 1 0 0 + 3663 1221 2 0.4236 17.05661 8.71812 7.66886 1 0 0 + 3664 1222 1 -0.8472 3.05199 13.20694 2.89879 0 0 0 + 3665 1222 2 0.4236 3.57780 13.70311 2.20789 0 0 0 + 3666 1222 2 0.4236 2.63537 13.85891 3.53230 0 0 0 + 3667 1223 1 -0.8472 5.26002 2.13592 16.40436 0 -1 0 + 3668 1223 2 0.4236 6.09694 1.78456 15.98477 0 -1 0 + 3669 1223 2 0.4236 4.80845 2.76476 15.77141 0 -1 0 + 3670 1224 1 -0.8472 12.61256 32.52531 4.71798 0 0 0 + 3671 1224 2 0.4236 11.90890 33.23199 4.79132 0 0 0 + 3672 1224 2 0.4236 12.25715 31.75468 4.18908 0 0 0 + 3673 1225 1 -0.8472 33.05943 19.81815 12.71554 0 1 0 + 3674 1225 2 0.4236 32.86723 19.31471 13.55788 0 1 0 + 3675 1225 2 0.4236 33.70078 19.29557 12.15385 0 1 0 + 3676 1226 1 -0.8472 8.67356 22.94470 34.61606 0 0 0 + 3677 1226 2 0.4236 8.08575 22.17542 34.86632 0 0 0 + 3678 1226 2 0.4236 8.33529 23.36200 33.77263 0 0 0 + 3679 1227 1 -0.8472 0.86965 12.09925 11.68222 1 0 0 + 3680 1227 2 0.4236 0.73608 12.60411 12.53501 1 0 0 + 3681 1227 2 0.4236 0.57426 11.15194 11.80597 1 0 0 + 3682 1228 1 -0.8472 27.29430 18.02558 25.87602 0 0 0 + 3683 1228 2 0.4236 26.33030 18.09609 25.61981 0 0 0 + 3684 1228 2 0.4236 27.85129 18.53772 25.22227 0 0 0 + 3685 1229 1 -0.8472 20.96856 4.94099 22.32248 0 0 0 + 3686 1229 2 0.4236 21.44516 4.83664 23.19537 0 0 0 + 3687 1229 2 0.4236 20.65070 5.88429 22.22695 0 0 0 + 3688 1230 1 -0.8472 22.27256 31.32924 24.77039 0 0 0 + 3689 1230 2 0.4236 22.20439 30.66428 24.02667 0 0 0 + 3690 1230 2 0.4236 23.23365 31.45980 25.01366 0 0 0 + 3691 1231 1 -0.8472 22.66253 15.15411 23.54686 0 0 0 + 3692 1231 2 0.4236 23.07572 15.58551 22.74490 0 0 0 + 3693 1231 2 0.4236 23.21000 15.36328 24.35708 0 0 0 + 3694 1232 1 -0.8472 11.19746 9.41692 24.15577 0 1 0 + 3695 1232 2 0.4236 10.84190 9.88305 23.34570 0 1 0 + 3696 1232 2 0.4236 11.55668 10.09332 24.79875 0 1 0 + 3697 1233 1 -0.8472 11.99905 23.28826 34.33738 0 0 0 + 3698 1233 2 0.4236 12.52234 23.62944 35.11821 0 0 0 + 3699 1233 2 0.4236 12.62467 22.89914 33.66126 0 0 0 + 3700 1234 1 -0.8472 23.22442 18.59940 28.07421 0 0 0 + 3701 1234 2 0.4236 23.49579 19.56080 28.11912 0 0 0 + 3702 1234 2 0.4236 24.00062 18.02181 28.32688 0 0 0 + 3703 1235 1 -0.8472 30.92539 3.09568 32.51957 0 1 0 + 3704 1235 2 0.4236 31.84312 3.44347 32.71134 0 1 0 + 3705 1235 2 0.4236 30.25006 3.80152 32.73328 0 1 0 + 3706 1236 1 -0.8472 1.33811 18.35817 13.38681 1 -1 0 + 3707 1236 2 0.4236 1.22509 18.30768 14.37908 1 -1 0 + 3708 1236 2 0.4236 0.99542 17.51674 12.96910 1 -1 0 + 3709 1237 1 -0.8472 9.40393 27.68480 1.86054 0 0 0 + 3710 1237 2 0.4236 9.19178 28.63569 2.08582 0 0 0 + 3711 1237 2 0.4236 8.65357 27.09582 2.16051 0 0 0 + 3712 1238 1 -0.8472 22.59500 25.15458 24.16226 0 0 0 + 3713 1238 2 0.4236 22.11992 24.61236 24.85525 0 0 0 + 3714 1238 2 0.4236 22.72289 26.08747 24.49890 0 0 0 + 3715 1239 1 -0.8472 34.94268 12.24206 24.23039 0 1 0 + 3716 1239 2 0.4236 34.99080 11.48130 24.87762 0 1 0 + 3717 1239 2 0.4236 34.50585 11.93365 23.38540 0 1 0 + 3718 1240 1 -0.8472 13.66060 32.55204 14.55827 0 0 0 + 3719 1240 2 0.4236 13.52586 31.65916 14.98789 0 0 0 + 3720 1240 2 0.4236 14.30011 33.09209 15.10536 0 0 0 + 3721 1241 1 -0.8472 25.84720 7.64647 30.19310 0 0 0 + 3722 1241 2 0.4236 26.49207 7.44799 29.45506 0 0 0 + 3723 1241 2 0.4236 24.99842 8.00675 29.80616 0 0 0 + 3724 1242 1 -0.8472 31.34937 3.95974 8.27135 -1 0 0 + 3725 1242 2 0.4236 31.73419 4.48651 7.51346 -1 0 0 + 3726 1242 2 0.4236 30.58520 3.40699 7.93900 -1 0 0 + 3727 1243 1 -0.8472 32.08346 7.74273 18.98396 0 1 0 + 3728 1243 2 0.4236 31.48557 6.94437 18.91249 0 1 0 + 3729 1243 2 0.4236 32.68945 7.63585 19.77216 0 1 0 + 3730 1244 1 -0.8472 33.86230 32.04057 14.82923 -1 -1 0 + 3731 1244 2 0.4236 34.19829 32.96445 14.64614 -1 -1 0 + 3732 1244 2 0.4236 33.23522 32.06216 15.60786 -1 -1 0 + 3733 1245 1 -0.8472 15.80498 9.53892 29.22621 0 0 0 + 3734 1245 2 0.4236 16.28878 9.52316 28.35120 0 0 0 + 3735 1245 2 0.4236 14.88959 9.15417 29.10789 0 0 0 + 3736 1246 1 -0.8472 14.75644 31.78471 33.95051 1 -1 0 + 3737 1246 2 0.4236 14.87879 31.63463 32.96947 1 -1 0 + 3738 1246 2 0.4236 14.49184 30.92567 34.38867 1 -1 0 + 3739 1247 1 -0.8472 19.54738 27.88289 17.04095 0 -1 0 + 3740 1247 2 0.4236 19.89389 28.26231 17.89881 0 -1 0 + 3741 1247 2 0.4236 20.31297 27.55072 16.49007 0 -1 0 + 3742 1248 1 -0.8472 29.41360 2.42179 30.27314 0 0 0 + 3743 1248 2 0.4236 29.56706 3.38868 30.06936 0 0 0 + 3744 1248 2 0.4236 29.72219 2.22420 31.20356 0 0 0 + 3745 1249 1 -0.8472 25.21448 16.45875 28.33471 0 1 0 + 3746 1249 2 0.4236 26.21071 16.47683 28.25035 0 1 0 + 3747 1249 2 0.4236 24.95734 15.91164 29.13128 0 1 0 + 3748 1250 1 -0.8472 4.35720 14.20875 17.03220 1 0 0 + 3749 1250 2 0.4236 5.27798 14.24944 16.64433 1 0 0 + 3750 1250 2 0.4236 3.76871 14.86764 16.56366 1 0 0 + 3751 1251 1 -0.8472 29.13693 0.84916 24.77184 -1 1 0 + 3752 1251 2 0.4236 29.74416 1.35202 25.38696 -1 1 0 + 3753 1251 2 0.4236 29.68242 0.27811 24.15840 -1 1 0 + 3754 1252 1 -0.8472 27.62042 10.22750 23.30181 -1 0 0 + 3755 1252 2 0.4236 28.40039 9.89629 22.77089 -1 0 0 + 3756 1252 2 0.4236 27.57125 11.22405 23.23563 -1 0 0 + 3757 1253 1 -0.8472 13.10422 23.78581 22.52010 0 0 0 + 3758 1253 2 0.4236 13.33878 23.51699 23.45427 0 0 0 + 3759 1253 2 0.4236 13.86548 23.56773 21.90941 0 0 0 + 3760 1254 1 -0.8472 33.19233 2.34733 4.32601 0 1 0 + 3761 1254 2 0.4236 33.68352 3.06983 3.83950 0 1 0 + 3762 1254 2 0.4236 33.54114 1.45534 4.03853 0 1 0 + 3763 1255 1 -0.8472 25.94719 28.29984 2.89677 0 1 0 + 3764 1255 2 0.4236 25.07124 28.70411 2.63365 0 1 0 + 3765 1255 2 0.4236 26.66612 28.63786 2.28947 0 1 0 + 3766 1256 1 -0.8472 9.90709 2.77986 7.29641 -1 0 0 + 3767 1256 2 0.4236 9.28065 2.13448 7.73344 -1 0 0 + 3768 1256 2 0.4236 10.84882 2.54552 7.53760 -1 0 0 + 3769 1257 1 -0.8472 16.30796 34.86244 16.12167 1 0 0 + 3770 1257 2 0.4236 16.62176 35.28557 15.27171 1 0 0 + 3771 1257 2 0.4236 15.30895 34.81894 16.12330 1 0 0 + 3772 1258 1 -0.8472 7.61771 9.73779 26.78220 1 1 0 + 3773 1258 2 0.4236 7.47927 10.72185 26.89368 1 1 0 + 3774 1258 2 0.4236 8.00824 9.55632 25.87971 1 1 0 + 3775 1259 1 -0.8472 3.53455 14.19611 8.20227 0 1 0 + 3776 1259 2 0.4236 3.27523 14.50182 9.11836 0 1 0 + 3777 1259 2 0.4236 3.41713 13.20527 8.13587 0 1 0 + 3778 1260 1 -0.8472 17.36729 21.51876 20.34297 0 0 0 + 3779 1260 2 0.4236 18.19977 21.66761 19.80934 0 0 0 + 3780 1260 2 0.4236 16.76176 22.30825 20.24311 0 0 0 + 3781 1261 1 -0.8472 24.85956 10.53353 5.64142 -1 1 0 + 3782 1261 2 0.4236 24.62252 9.97391 6.43551 -1 1 0 + 3783 1261 2 0.4236 24.04025 10.69600 5.09160 -1 1 0 + 3784 1262 1 -0.8472 17.54124 19.88458 23.16534 0 -1 0 + 3785 1262 2 0.4236 18.30863 20.31961 23.63629 0 -1 0 + 3786 1262 2 0.4236 16.71124 20.42236 23.31326 0 -1 0 + 3787 1263 1 -0.8472 9.13809 2.62440 27.30937 0 1 0 + 3788 1263 2 0.4236 9.78967 1.98344 27.71510 0 1 0 + 3789 1263 2 0.4236 8.56054 2.14095 26.65161 0 1 0 + 3790 1264 1 -0.8472 14.26627 24.14780 0.96270 0 0 0 + 3791 1264 2 0.4236 13.73311 24.38448 1.77489 0 0 0 + 3792 1264 2 0.4236 14.80771 24.93859 0.67731 0 0 0 + 3793 1265 1 -0.8472 34.12753 0.60519 34.36017 0 0 0 + 3794 1265 2 0.4236 33.98288 1.43738 34.89542 0 0 0 + 3795 1265 2 0.4236 33.66886 0.69362 33.47601 0 0 0 + 3796 1266 1 -0.8472 12.28580 18.19129 0.67816 0 0 0 + 3797 1266 2 0.4236 12.91440 18.64946 0.04978 0 0 0 + 3798 1266 2 0.4236 11.43961 18.71959 0.74726 0 0 0 + 3799 1267 1 -0.8472 12.16281 6.42562 30.34156 0 0 0 + 3800 1267 2 0.4236 12.59339 5.68077 30.85118 0 0 0 + 3801 1267 2 0.4236 12.60106 6.51449 29.44712 0 0 0 + 3802 1268 1 -0.8472 22.54245 21.32955 17.15786 0 0 0 + 3803 1268 2 0.4236 22.26706 21.46728 16.20646 0 0 0 + 3804 1268 2 0.4236 22.14968 22.05228 17.72650 0 0 0 + 3805 1269 1 -0.8472 16.46941 17.24841 22.22819 0 -1 0 + 3806 1269 2 0.4236 16.69927 18.02693 22.81218 0 -1 0 + 3807 1269 2 0.4236 15.47597 17.13973 22.19338 0 -1 0 + 3808 1270 1 -0.8472 15.89729 2.63284 27.11334 0 1 0 + 3809 1270 2 0.4236 15.95407 1.69174 26.78010 0 1 0 + 3810 1270 2 0.4236 16.01219 3.26519 26.34726 0 1 0 + 3811 1271 1 -0.8472 17.56428 29.20553 10.53540 0 -1 0 + 3812 1271 2 0.4236 16.89516 29.75865 11.03170 0 -1 0 + 3813 1271 2 0.4236 18.48421 29.42333 10.86137 0 -1 0 + 3814 1272 1 -0.8472 14.13472 0.57957 23.40535 0 0 0 + 3815 1272 2 0.4236 15.12428 0.71936 23.37111 0 0 0 + 3816 1272 2 0.4236 13.74827 1.11485 24.15637 0 0 0 + 3817 1273 1 -0.8472 14.94299 16.74046 14.49758 0 0 0 + 3818 1273 2 0.4236 14.51357 17.57578 14.84078 0 0 0 + 3819 1273 2 0.4236 15.77043 16.54983 15.02574 0 0 0 + 3820 1274 1 -0.8472 18.60554 10.10070 33.85186 0 0 0 + 3821 1274 2 0.4236 18.03410 9.28115 33.89305 0 0 0 + 3822 1274 2 0.4236 19.47154 9.88099 33.40267 0 0 0 + 3823 1275 1 -0.8472 21.91949 17.78066 6.96782 -1 0 0 + 3824 1275 2 0.4236 22.76969 18.25566 7.19482 -1 0 0 + 3825 1275 2 0.4236 21.34876 18.37255 6.39871 -1 0 0 + 3826 1276 1 -0.8472 9.21876 31.25393 9.94935 0 0 0 + 3827 1276 2 0.4236 9.97547 30.68146 10.26497 0 0 0 + 3828 1276 2 0.4236 9.23222 31.30335 8.95070 0 0 0 + 3829 1277 1 -0.8472 13.41060 7.95548 25.27966 1 1 0 + 3830 1277 2 0.4236 12.62868 8.49127 24.96117 1 1 0 + 3831 1277 2 0.4236 14.22917 8.22717 24.77362 1 1 0 + 3832 1278 1 -0.8472 12.07574 15.03988 21.04418 0 0 0 + 3833 1278 2 0.4236 11.95903 14.17033 21.52403 0 0 0 + 3834 1278 2 0.4236 12.31435 15.75417 21.70205 0 0 0 + 3835 1279 1 -0.8472 9.88529 18.41150 5.93407 0 0 0 + 3836 1279 2 0.4236 9.71670 19.36165 6.19620 0 0 0 + 3837 1279 2 0.4236 9.38429 17.80224 6.54865 0 0 0 + 3838 1280 1 -0.8472 17.69317 1.78597 18.64760 0 0 0 + 3839 1280 2 0.4236 17.13270 0.95939 18.69861 0 0 0 + 3840 1280 2 0.4236 17.23908 2.52755 19.14138 0 0 0 + 3841 1281 1 -0.8472 31.78581 31.55779 20.70371 0 -1 0 + 3842 1281 2 0.4236 30.92713 31.48884 20.19593 0 -1 0 + 3843 1281 2 0.4236 32.50326 31.06227 20.21415 0 -1 0 + 3844 1282 1 -0.8472 3.88805 14.07173 13.16821 0 0 0 + 3845 1282 2 0.4236 4.86565 13.88586 13.06952 0 0 0 + 3846 1282 2 0.4236 3.59566 13.83494 14.09469 0 0 0 + 3847 1283 1 -0.8472 17.40159 4.33028 2.50015 -1 0 0 + 3848 1283 2 0.4236 16.66174 4.99386 2.38964 -1 0 0 + 3849 1283 2 0.4236 17.65489 4.27123 3.46570 -1 0 0 + 3850 1284 1 -0.8472 32.95401 16.04344 16.03578 0 0 0 + 3851 1284 2 0.4236 32.18345 15.56378 16.45540 0 0 0 + 3852 1284 2 0.4236 33.06983 15.72825 15.09387 0 0 0 + 3853 1285 1 -0.8472 26.81393 18.75179 3.07330 -1 -1 0 + 3854 1285 2 0.4236 26.78553 17.98088 2.43704 -1 -1 0 + 3855 1285 2 0.4236 27.76469 19.01741 3.23286 -1 -1 0 + 3856 1286 1 -0.8472 31.29948 29.38498 30.48980 -1 -1 0 + 3857 1286 2 0.4236 30.36542 29.67830 30.28626 -1 -1 0 + 3858 1286 2 0.4236 31.94439 30.07640 30.16425 -1 -1 0 + 3859 1287 1 -0.8472 7.70452 13.58317 24.43091 0 1 0 + 3860 1287 2 0.4236 8.11380 13.58285 23.51854 0 1 0 + 3861 1287 2 0.4236 8.38876 13.86587 25.10306 0 1 0 + 3862 1288 1 -0.8472 6.40123 28.60910 19.73785 0 0 0 + 3863 1288 2 0.4236 6.93446 28.83300 18.92206 0 0 0 + 3864 1288 2 0.4236 6.51282 27.63896 19.95312 0 0 0 + 3865 1289 1 -0.8472 3.04379 10.50807 22.19377 0 1 0 + 3866 1289 2 0.4236 2.93294 9.89004 21.41549 0 1 0 + 3867 1289 2 0.4236 2.80507 11.43883 21.91689 0 1 0 + 3868 1290 1 -0.8472 14.37599 26.93440 28.59915 0 0 0 + 3869 1290 2 0.4236 13.74025 27.42354 28.00208 0 0 0 + 3870 1290 2 0.4236 15.27401 27.37252 28.56009 0 0 0 + 3871 1291 1 -0.8472 34.12274 21.85242 14.14839 0 -1 0 + 3872 1291 2 0.4236 33.61787 21.07635 13.77045 0 -1 0 + 3873 1291 2 0.4236 35.09050 21.76777 13.91132 0 -1 0 + 3874 1292 1 -0.8472 32.64567 5.25739 5.99940 -1 1 0 + 3875 1292 2 0.4236 33.11844 4.88493 5.20085 -1 1 0 + 3876 1292 2 0.4236 33.08134 6.11426 6.27500 -1 1 0 + 3877 1293 1 -0.8472 23.64858 3.21683 21.36377 0 0 0 + 3878 1293 2 0.4236 22.71597 3.53283 21.18962 0 0 0 + 3879 1293 2 0.4236 23.97889 2.70125 20.57320 0 0 0 + 3880 1294 1 -0.8472 32.64212 16.11772 31.97213 -1 0 0 + 3881 1294 2 0.4236 31.81837 16.41178 32.45680 -1 0 0 + 3882 1294 2 0.4236 33.26061 16.89594 31.86352 -1 0 0 + 3883 1295 1 -0.8472 6.29229 17.36253 3.95587 0 0 0 + 3884 1295 2 0.4236 6.77184 17.44356 4.82957 0 0 0 + 3885 1295 2 0.4236 6.12602 16.39715 3.75517 0 0 0 + 3886 1296 1 -0.8472 31.92486 23.30850 22.00260 0 0 0 + 3887 1296 2 0.4236 31.25077 23.84248 21.49234 0 0 0 + 3888 1296 2 0.4236 32.82945 23.72002 21.89141 0 0 0 + 3889 1297 1 -0.8472 27.33250 28.07000 32.92133 0 0 0 + 3890 1297 2 0.4236 27.07320 27.40863 33.62506 0 0 0 + 3891 1297 2 0.4236 28.29881 27.95187 32.69273 0 0 0 + 3892 1298 1 -0.8472 2.64561 33.53042 18.92001 1 0 0 + 3893 1298 2 0.4236 1.69345 33.79700 18.77078 1 0 0 + 3894 1298 2 0.4236 3.23109 34.33901 18.86227 1 0 0 + 3895 1299 1 -0.8472 20.25726 25.40408 31.93927 -1 0 0 + 3896 1299 2 0.4236 19.93756 25.82497 32.78816 -1 0 0 + 3897 1299 2 0.4236 20.87305 26.03411 31.46615 -1 0 0 + 3898 1300 1 -0.8472 3.04174 13.82425 29.63913 1 0 0 + 3899 1300 2 0.4236 2.19951 13.71557 29.11115 1 0 0 + 3900 1300 2 0.4236 2.90738 13.45836 30.56002 1 0 0 + 3901 1301 1 -0.8472 27.74001 30.99889 32.58650 0 0 0 + 3902 1301 2 0.4236 28.31372 31.33194 33.33475 0 0 0 + 3903 1301 2 0.4236 27.55154 30.02577 32.71868 0 0 0 + 3904 1302 1 -0.8472 31.54537 3.17343 11.48007 -1 0 0 + 3905 1302 2 0.4236 31.00105 2.58309 12.07601 -1 0 0 + 3906 1302 2 0.4236 31.24008 3.06453 10.53409 -1 0 0 +3907 1303 1 -0.8472 12.78374 29.36396 35.25028 0 -1 0 +3908 1303 2 0.4236 12.48790 28.41019 35.19821 0 -1 0 +3909 1303 2 0.4236 13.10919 29.56198 0.72764 0 -1 1 +3910 1304 1 -0.8472 23.77746 14.97626 35.08085 0 0 0 +3911 1304 2 0.4236 23.65699 15.06343 0.62252 0 0 1 +3912 1304 2 0.4236 23.98557 14.02508 34.85299 0 0 0 + 3913 1305 1 -0.8472 9.02720 31.44392 7.07983 1 0 0 + 3914 1305 2 0.4236 8.96368 32.37089 6.71012 1 0 0 + 3915 1305 2 0.4236 8.13255 31.00077 7.02393 1 0 0 + 3916 1306 1 -0.8472 31.36549 11.59481 10.42094 0 0 0 + 3917 1306 2 0.4236 31.65377 12.22675 11.14031 0 0 0 + 3918 1306 2 0.4236 32.09618 10.93542 10.24406 0 0 0 + 3919 1307 1 -0.8472 29.50183 27.32803 3.75836 0 -1 0 + 3920 1307 2 0.4236 29.53439 26.49065 3.21279 0 -1 0 + 3921 1307 2 0.4236 29.08094 28.05932 3.22170 0 -1 0 + 3922 1308 1 -0.8472 33.81990 14.88458 25.76164 0 0 0 + 3923 1308 2 0.4236 34.72524 14.95250 25.34251 0 0 0 + 3924 1308 2 0.4236 33.89155 14.39907 26.63289 0 0 0 + 3925 1309 1 -0.8472 7.98850 21.50658 20.41280 0 0 0 + 3926 1309 2 0.4236 8.56246 21.56801 19.59624 0 0 0 + 3927 1309 2 0.4236 8.56179 21.31560 21.20954 0 0 0 + 3928 1310 1 -0.8472 32.46665 14.83711 6.59392 0 0 0 + 3929 1310 2 0.4236 32.73572 14.17385 7.29220 0 0 0 + 3930 1310 2 0.4236 31.57544 15.22519 6.82865 0 0 0 + 3931 1311 1 -0.8472 19.27221 16.62720 16.91022 0 -1 0 + 3932 1311 2 0.4236 18.39566 16.51808 16.44147 0 -1 0 + 3933 1311 2 0.4236 19.11058 16.84716 17.87223 0 -1 0 + 3934 1312 1 -0.8472 10.75317 25.30896 14.90281 1 -1 0 + 3935 1312 2 0.4236 10.02110 24.75819 15.30365 1 -1 0 + 3936 1312 2 0.4236 10.68350 26.24920 15.23605 1 -1 0 + 3937 1313 1 -0.8472 10.59250 3.58120 20.02809 0 0 0 + 3938 1313 2 0.4236 10.10365 3.59853 20.90027 0 0 0 + 3939 1313 2 0.4236 11.56509 3.41878 20.19430 0 0 0 + 3940 1314 1 -0.8472 23.15667 28.53308 20.17853 0 -1 0 + 3941 1314 2 0.4236 23.99072 29.08474 20.18023 0 -1 0 + 3942 1314 2 0.4236 23.01997 28.13839 19.26998 0 -1 0 + 3943 1315 1 -0.8472 6.61160 15.88142 29.17336 1 0 0 + 3944 1315 2 0.4236 5.96957 16.51911 28.74778 1 0 0 + 3945 1315 2 0.4236 6.23172 14.95687 29.14422 1 0 0 + 3946 1316 1 -0.8472 33.84117 10.87684 5.32296 -1 0 0 + 3947 1316 2 0.4236 34.05499 11.83082 5.11283 -1 0 0 + 3948 1316 2 0.4236 34.38758 10.27642 4.73908 -1 0 0 + 3949 1317 1 -0.8472 5.10908 7.98804 15.75723 0 1 0 + 3950 1317 2 0.4236 5.83685 8.64150 15.96527 0 1 0 + 3951 1317 2 0.4236 4.52699 8.35699 15.03262 0 1 0 + 3952 1318 1 -0.8472 21.73216 9.98499 28.65661 0 0 0 + 3953 1318 2 0.4236 22.11985 9.08867 28.44162 0 0 0 + 3954 1318 2 0.4236 22.22861 10.38703 29.42592 0 0 0 + 3955 1319 1 -0.8472 15.11924 17.54695 6.96555 1 0 0 + 3956 1319 2 0.4236 15.24394 16.65784 6.52526 1 0 0 + 3957 1319 2 0.4236 14.14970 17.79152 6.95414 1 0 0 + 3958 1320 1 -0.8472 9.36217 21.72925 23.47370 0 0 0 + 3959 1320 2 0.4236 9.44785 22.47012 22.80757 0 0 0 + 3960 1320 2 0.4236 9.25579 22.11545 24.38994 0 0 0 + 3961 1321 1 -0.8472 9.43645 15.00189 14.94078 1 0 0 + 3962 1321 2 0.4236 10.25430 14.52785 15.26696 1 0 0 + 3963 1321 2 0.4236 9.65662 15.51329 14.11018 1 0 0 + 3964 1322 1 -0.8472 8.59033 10.76868 9.86814 0 0 0 + 3965 1322 2 0.4236 7.82215 10.93745 9.25058 0 0 0 + 3966 1322 2 0.4236 8.25906 10.73652 10.81111 0 0 0 + 3967 1323 1 -0.8472 11.61768 13.08370 14.89370 0 0 0 + 3968 1323 2 0.4236 11.67363 13.04553 13.89601 0 0 0 + 3969 1323 2 0.4236 12.47416 13.44533 15.26196 0 0 0 + 3970 1324 1 -0.8472 16.11690 13.08391 16.65249 0 0 0 + 3971 1324 2 0.4236 16.28495 12.57915 15.80576 0 0 0 + 3972 1324 2 0.4236 15.93060 12.43894 17.39362 0 0 0 + 3973 1325 1 -0.8472 15.86534 31.96218 1.66332 0 0 0 + 3974 1325 2 0.4236 15.01496 31.44332 1.57625 0 0 0 + 3975 1325 2 0.4236 15.96614 32.57132 0.87672 0 0 0 + 3976 1326 1 -0.8472 24.92119 12.54887 34.11767 0 0 0 + 3977 1326 2 0.4236 25.52292 11.78246 34.34234 0 0 0 + 3978 1326 2 0.4236 25.18156 12.92786 33.22969 0 0 0 + 3979 1327 1 -0.8472 11.53054 35.48053 2.50601 0 -1 0 + 3980 1327 2 0.4236 11.26027 0.86465 2.87208 0 0 0 + 3981 1327 2 0.4236 11.70360 0.05592 1.52453 0 0 0 + 3982 1328 1 -0.8472 30.37646 11.06481 19.98364 -1 1 0 + 3983 1328 2 0.4236 31.07807 10.97906 19.27629 -1 1 0 + 3984 1328 2 0.4236 29.60175 11.58441 19.62339 -1 1 0 + 3985 1329 1 -0.8472 5.33838 10.35688 23.82633 0 1 0 + 3986 1329 2 0.4236 4.49407 10.43102 23.29565 0 1 0 + 3987 1329 2 0.4236 5.42533 11.15151 24.42705 0 1 0 + 3988 1330 1 -0.8472 17.21081 5.64167 9.21177 -1 1 0 + 3989 1330 2 0.4236 17.44537 5.70658 10.18167 -1 1 0 + 3990 1330 2 0.4236 17.43319 6.50384 8.75666 -1 1 0 + 3991 1331 1 -0.8472 8.48413 30.64049 22.56444 0 -1 0 + 3992 1331 2 0.4236 9.06406 29.97286 22.09767 0 -1 0 + 3993 1331 2 0.4236 8.37563 31.44943 21.98669 0 -1 0 + 3994 1332 1 -0.8472 1.13258 13.38927 14.12372 1 1 0 + 3995 1332 2 0.4236 1.00638 14.05274 14.86113 1 1 0 + 3996 1332 2 0.4236 1.57468 12.56864 14.48574 1 1 0 + 3997 1333 1 -0.8472 3.61348 27.78485 20.21784 1 -1 0 + 3998 1333 2 0.4236 3.54423 26.84230 19.89108 1 -1 0 + 3999 1333 2 0.4236 4.49674 28.16750 19.94691 1 -1 0 + 4000 1334 1 -0.8472 34.87963 19.16306 19.16038 -1 1 0 + 4001 1334 2 0.4236 34.72652 18.19533 18.96042 -1 1 0 + 4002 1334 2 0.4236 34.73462 19.70187 18.33056 -1 1 0 + 4003 1335 1 -0.8472 33.17028 25.43707 7.09681 -1 0 0 + 4004 1335 2 0.4236 32.75169 26.26784 6.73000 -1 0 0 + 4005 1335 2 0.4236 32.53585 24.67095 6.99433 -1 0 0 + 4006 1336 1 -0.8472 10.03853 8.39253 8.37546 0 1 0 + 4007 1336 2 0.4236 9.83643 9.29993 8.74386 0 1 0 + 4008 1336 2 0.4236 9.26076 7.78562 8.53887 0 1 0 + 4009 1337 1 -0.8472 8.03214 12.07162 19.93674 1 0 0 + 4010 1337 2 0.4236 7.62829 11.35734 20.50829 1 0 0 + 4011 1337 2 0.4236 8.51882 11.65059 19.17133 1 0 0 + 4012 1338 1 -0.8472 1.41857 21.54262 10.36366 0 0 0 + 4013 1338 2 0.4236 2.20565 20.94132 10.22637 0 0 0 + 4014 1338 2 0.4236 1.66063 22.47502 10.09525 0 0 0 + 4015 1339 1 -0.8472 34.50038 20.54422 16.81189 -1 0 0 + 4016 1339 2 0.4236 35.23362 20.99512 16.30298 -1 0 0 + 4017 1339 2 0.4236 33.70511 21.14879 16.85659 -1 0 0 + 4018 1340 1 -0.8472 9.44547 24.80491 4.00309 1 0 0 + 4019 1340 2 0.4236 10.06637 25.56510 3.81178 1 0 0 + 4020 1340 2 0.4236 9.34559 24.24167 3.18290 1 0 0 + 4021 1341 1 -0.8472 4.73779 28.13530 4.76587 1 0 0 + 4022 1341 2 0.4236 4.64675 27.24203 5.20595 1 0 0 + 4023 1341 2 0.4236 5.38013 28.06692 4.00255 1 0 0 + 4024 1342 1 -0.8472 28.79309 11.26361 32.56261 -1 0 0 + 4025 1342 2 0.4236 28.66814 12.07106 31.98609 -1 0 0 + 4026 1342 2 0.4236 28.00130 11.15780 33.16414 -1 0 0 + 4027 1343 1 -0.8472 29.00688 2.02184 18.32003 0 1 0 + 4028 1343 2 0.4236 29.92131 1.72090 18.59060 0 1 0 + 4029 1343 2 0.4236 28.91878 1.96743 17.32545 0 1 0 + 4030 1344 1 -0.8472 31.38630 11.70534 6.36117 0 1 0 + 4031 1344 2 0.4236 31.72496 12.31115 7.08107 0 1 0 + 4032 1344 2 0.4236 32.14258 11.15776 6.00323 0 1 0 + 4033 1345 1 -0.8472 14.04432 34.74239 31.23302 -1 -1 0 + 4034 1345 2 0.4236 14.42009 35.30378 30.49572 -1 -1 0 + 4035 1345 2 0.4236 14.59804 33.91641 31.33837 -1 -1 0 + 4036 1346 1 -0.8472 11.74166 19.24522 20.21415 0 0 0 + 4037 1346 2 0.4236 12.20073 18.37581 20.39670 0 0 0 + 4038 1346 2 0.4236 11.64250 19.75559 21.06832 0 0 0 + 4039 1347 1 -0.8472 35.52179 6.24067 32.03171 0 0 0 + 4040 1347 2 0.4236 0.50438 6.83174 32.67320 1 0 0 + 4041 1347 2 0.4236 0.29816 5.29165 32.17109 1 0 0 + 4042 1348 1 -0.8472 15.57283 9.26811 33.08255 0 0 0 + 4043 1348 2 0.4236 15.53601 10.10503 33.62861 0 0 0 + 4044 1348 2 0.4236 15.19689 8.50778 33.61220 0 0 0 + 4045 1349 1 -0.8472 17.80359 31.80829 5.14239 1 -1 0 + 4046 1349 2 0.4236 16.85934 32.13019 5.07387 1 -1 0 + 4047 1349 2 0.4236 17.97257 31.11858 4.43838 1 -1 0 + 4048 1350 1 -0.8472 30.38406 19.12162 16.07527 0 0 0 + 4049 1350 2 0.4236 31.29341 19.04947 15.66557 0 0 0 + 4050 1350 2 0.4236 30.08197 18.21753 16.37749 0 0 0 + 4051 1351 1 -0.8472 11.10369 6.99773 6.45008 0 1 0 + 4052 1351 2 0.4236 12.01908 7.37712 6.31577 0 1 0 + 4053 1351 2 0.4236 10.59371 7.57531 7.08745 0 1 0 + 4054 1352 1 -0.8472 12.27206 16.59023 16.74848 1 -1 0 + 4055 1352 2 0.4236 11.81988 17.30736 17.27877 1 -1 0 + 4056 1352 2 0.4236 12.89672 16.08136 17.34073 1 -1 0 + 4057 1353 1 -0.8472 20.33587 18.83981 32.69894 0 1 0 + 4058 1353 2 0.4236 20.70478 19.62858 33.19059 0 1 0 + 4059 1353 2 0.4236 20.73393 18.00044 33.06900 0 1 0 + 4060 1354 1 -0.8472 2.03095 27.60334 3.55915 1 0 0 + 4061 1354 2 0.4236 1.49012 28.34142 3.15579 1 0 0 + 4062 1354 2 0.4236 2.33241 27.87255 4.47382 1 0 0 + 4063 1355 1 -0.8472 18.88135 18.11410 0.87201 0 1 0 + 4064 1355 2 0.4236 19.39275 17.48421 0.28749 0 1 0 + 4065 1355 2 0.4236 18.56634 18.89200 0.32833 0 1 0 + 4066 1356 1 -0.8472 16.25484 6.69873 5.58205 -1 1 0 + 4067 1356 2 0.4236 16.87855 7.00828 6.29978 -1 1 0 + 4068 1356 2 0.4236 16.02398 5.73754 5.73284 -1 1 0 + 4069 1357 1 -0.8472 4.91653 23.82036 8.55004 0 0 0 + 4070 1357 2 0.4236 5.34761 23.21217 9.21648 0 0 0 + 4071 1357 2 0.4236 5.41269 24.68806 8.52083 0 0 0 + 4072 1358 1 -0.8472 33.30943 33.20561 10.09238 -1 0 0 + 4073 1358 2 0.4236 33.26590 34.05918 10.61147 -1 0 0 + 4074 1358 2 0.4236 32.96598 33.36084 9.16618 -1 0 0 + 4075 1359 1 -0.8472 16.61015 7.10659 25.54548 0 0 0 + 4076 1359 2 0.4236 17.06577 7.76016 26.14985 0 0 0 + 4077 1359 2 0.4236 16.33132 7.56921 24.70396 0 0 0 + 4078 1360 1 -0.8472 21.90262 1.55066 18.37026 0 1 0 + 4079 1360 2 0.4236 22.89510 1.63523 18.45827 0 1 0 + 4080 1360 2 0.4236 21.50605 2.45082 18.19019 0 1 0 + 4081 1361 1 -0.8472 3.86501 3.59828 14.83734 0 0 0 + 4082 1361 2 0.4236 4.42352 4.42579 14.89434 0 0 0 + 4083 1361 2 0.4236 3.15744 3.62445 15.54349 0 0 0 + 4084 1362 1 -0.8472 21.92304 8.04648 5.73415 0 0 0 + 4085 1362 2 0.4236 21.15202 8.10038 6.36865 0 0 0 + 4086 1362 2 0.4236 21.92013 8.84868 5.13715 0 0 0 + 4087 1363 1 -0.8472 3.88461 21.70830 19.87333 0 0 0 + 4088 1363 2 0.4236 3.77326 22.48610 19.25477 0 0 0 + 4089 1363 2 0.4236 4.65296 21.88004 20.48982 0 0 0 + 4090 1364 1 -0.8472 12.50665 27.83119 26.83785 0 0 0 + 4091 1364 2 0.4236 11.81736 27.12241 26.68791 0 0 0 + 4092 1364 2 0.4236 12.13096 28.72130 26.57993 0 0 0 + 4093 1365 1 -0.8472 32.46832 31.16200 16.94950 0 0 0 + 4094 1365 2 0.4236 33.05634 30.35349 16.92696 0 0 0 + 4095 1365 2 0.4236 32.80140 31.79707 17.64643 0 0 0 + 4096 1366 1 -0.8472 4.04609 20.23787 14.72111 0 1 0 + 4097 1366 2 0.4236 4.07606 19.71469 15.57277 0 1 0 + 4098 1366 2 0.4236 3.88322 19.61722 13.95421 0 1 0 + 4099 1367 1 -0.8472 13.76311 15.06580 33.41259 0 0 0 + 4100 1367 2 0.4236 14.68056 14.84069 33.74052 0 0 0 + 4101 1367 2 0.4236 13.74788 16.01155 33.08807 0 0 0 + 4102 1368 1 -0.8472 7.97774 4.02759 21.41028 1 1 0 + 4103 1368 2 0.4236 7.63454 3.91294 20.47809 1 1 0 + 4104 1368 2 0.4236 7.20683 4.12630 22.03950 1 1 0 + 4105 1369 1 -0.8472 20.29710 6.13425 12.62094 1 1 0 + 4106 1369 2 0.4236 19.31701 6.01240 12.46433 1 1 0 + 4107 1369 2 0.4236 20.56868 7.05305 12.33463 1 1 0 + 4108 1370 1 -0.8472 5.16656 5.52045 3.92872 1 1 0 + 4109 1370 2 0.4236 5.60269 5.98846 4.69728 1 1 0 + 4110 1370 2 0.4236 5.86909 5.12236 3.33884 1 1 0 + 4111 1371 1 -0.8472 17.27686 18.91878 19.63934 0 0 0 + 4112 1371 2 0.4236 18.05111 18.28992 19.71027 0 0 0 + 4113 1371 2 0.4236 17.49359 19.76961 20.11795 0 0 0 + 4114 1372 1 -0.8472 14.92005 7.12502 11.97112 0 0 0 + 4115 1372 2 0.4236 14.48733 6.58039 11.25271 0 0 0 + 4116 1372 2 0.4236 14.49309 8.02852 12.00724 0 0 0 + 4117 1373 1 -0.8472 1.10019 6.63116 0.49417 0 0 0 + 4118 1373 2 0.4236 1.99111 6.89491 0.86381 0 0 0 + 4119 1373 2 0.4236 1.03948 5.63397 0.45037 0 0 0 + 4120 1374 1 -0.8472 22.59485 0.72080 27.60450 1 1 0 + 4121 1374 2 0.4236 22.17357 1.60200 27.81888 1 1 0 + 4122 1374 2 0.4236 23.51241 0.68494 28.00041 1 1 0 + 4123 1375 1 -0.8472 15.78119 12.79592 23.35569 0 0 0 + 4124 1375 2 0.4236 16.02480 13.73623 23.11820 0 0 0 + 4125 1375 2 0.4236 14.85064 12.77490 23.72119 0 0 0 + 4126 1376 1 -0.8472 33.58141 6.89870 20.97751 -1 1 0 + 4127 1376 2 0.4236 34.40863 7.44824 21.09409 -1 1 0 + 4128 1376 2 0.4236 33.57629 6.15751 21.64870 -1 1 0 + 4129 1377 1 -0.8472 1.92074 17.89289 29.55807 1 0 0 + 4130 1377 2 0.4236 1.00224 17.93553 29.95110 1 0 0 + 4131 1377 2 0.4236 2.57668 17.64257 30.27013 1 0 0 + 4132 1378 1 -0.8472 11.63025 22.33197 20.78411 0 0 0 + 4133 1378 2 0.4236 11.83395 22.71874 21.68347 0 0 0 + 4134 1378 2 0.4236 12.46780 21.96046 20.38359 0 0 0 + 4135 1379 1 -0.8472 18.99923 25.73489 1.07719 0 0 0 + 4136 1379 2 0.4236 19.23105 26.05481 0.15857 0 0 0 + 4137 1379 2 0.4236 18.34556 26.36595 1.49482 0 0 0 + 4138 1380 1 -0.8472 26.73163 0.58642 2.49028 -1 1 0 + 4139 1380 2 0.4236 27.25801 1.43411 2.55567 -1 1 0 + 4140 1380 2 0.4236 26.60863 0.19913 3.40397 -1 1 0 + 4141 1381 1 -0.8472 10.39938 13.91835 25.30518 0 1 0 + 4142 1381 2 0.4236 10.62229 13.45115 26.16077 0 1 0 + 4143 1381 2 0.4236 10.41238 14.90734 25.45229 0 1 0 + 4144 1382 1 -0.8472 21.36317 34.04409 28.83108 0 -1 0 + 4145 1382 2 0.4236 21.78783 34.69929 28.20632 0 -1 0 + 4146 1382 2 0.4236 22.07522 33.53628 29.31593 0 -1 0 + 4147 1383 1 -0.8472 6.60638 30.22876 4.76665 0 -1 0 + 4148 1383 2 0.4236 6.87058 30.19293 5.73043 0 -1 0 + 4149 1383 2 0.4236 5.62090 30.38335 4.69672 0 -1 0 + 4150 1384 1 -0.8472 6.99525 5.86455 18.49351 1 0 0 + 4151 1384 2 0.4236 6.79939 4.89785 18.65820 1 0 0 + 4152 1384 2 0.4236 7.16656 6.00860 17.51892 1 0 0 + 4153 1385 1 -0.8472 27.85100 24.40461 26.76259 -1 0 0 + 4154 1385 2 0.4236 28.16466 23.49121 27.02200 -1 0 0 + 4155 1385 2 0.4236 27.50868 24.88178 27.57192 -1 0 0 + 4156 1386 1 -0.8472 26.18497 0.14061 24.90006 0 0 0 + 4157 1386 2 0.4236 27.13608 0.23417 24.60577 0 0 0 + 4158 1386 2 0.4236 25.60583 0.74498 24.35296 0 0 0 + 4159 1387 1 -0.8472 28.23866 32.55211 16.47504 0 -1 0 + 4160 1387 2 0.4236 27.78773 32.40987 17.35615 0 -1 0 + 4161 1387 2 0.4236 27.95660 33.43281 16.09458 0 -1 0 + 4162 1388 1 -0.8472 3.71190 17.69512 22.13922 0 0 0 + 4163 1388 2 0.4236 4.11270 18.60508 22.24549 0 0 0 + 4164 1388 2 0.4236 3.85950 17.16622 22.97496 0 0 0 + 4165 1389 1 -0.8472 21.99849 17.97835 20.53867 0 -1 0 + 4166 1389 2 0.4236 22.74324 18.54152 20.18072 0 -1 0 + 4167 1389 2 0.4236 21.44970 18.51802 21.17704 0 -1 0 + 4168 1390 1 -0.8472 10.41557 21.36907 9.81845 0 -1 0 + 4169 1390 2 0.4236 10.99340 21.92631 10.41470 0 -1 0 + 4170 1390 2 0.4236 10.29063 20.46447 10.22595 0 -1 0 + 4171 1391 1 -0.8472 26.10008 27.35743 8.93223 -2 0 0 + 4172 1391 2 0.4236 26.71331 27.76259 9.61030 -2 0 0 + 4173 1391 2 0.4236 25.82174 28.05715 8.27430 -2 0 0 + 4174 1392 1 -0.8472 17.35902 11.08757 2.80124 0 1 0 + 4175 1392 2 0.4236 17.01865 10.28022 2.31926 0 1 0 + 4176 1392 2 0.4236 18.34155 11.18187 2.64093 0 1 0 +4177 1393 1 -0.8472 16.76823 15.96965 35.38491 0 0 0 +4178 1393 2 0.4236 16.40681 16.87372 0.16584 0 0 1 +4179 1393 2 0.4236 17.75158 16.03673 35.21615 0 0 0 + 4180 1394 1 -0.8472 5.38571 21.32895 1.85800 0 0 0 + 4181 1394 2 0.4236 4.97998 21.46462 0.95415 0 0 0 + 4182 1394 2 0.4236 5.12424 20.42993 2.20919 0 0 0 + 4183 1395 1 -0.8472 13.98879 4.76207 23.30507 1 0 0 + 4184 1395 2 0.4236 14.66465 5.49461 23.22411 1 0 0 + 4185 1395 2 0.4236 14.11509 4.10815 22.55919 1 0 0 + 4186 1396 1 -0.8472 25.20454 3.81448 25.19998 0 1 0 + 4187 1396 2 0.4236 25.43529 4.37239 24.40284 0 1 0 + 4188 1396 2 0.4236 24.75751 2.97209 24.89910 0 1 0 + 4189 1397 1 -0.8472 34.55435 24.91541 25.79393 0 0 0 + 4190 1397 2 0.4236 35.08581 24.14893 26.15450 0 0 0 + 4191 1397 2 0.4236 33.85857 25.18160 26.46101 0 0 0 + 4192 1398 1 -0.8472 26.21632 33.11524 29.54084 0 0 0 + 4193 1398 2 0.4236 26.88558 33.61308 30.09236 0 0 0 + 4194 1398 2 0.4236 26.05296 33.61059 28.68766 0 0 0 + 4195 1399 1 -0.8472 12.75839 12.33150 9.28135 0 0 0 + 4196 1399 2 0.4236 12.49269 12.46848 10.23559 0 0 0 + 4197 1399 2 0.4236 12.18297 12.89711 8.69066 0 0 0 + 4198 1400 1 -0.8472 30.89915 15.99270 28.39554 -1 0 0 + 4199 1400 2 0.4236 31.44059 15.15457 28.46154 -1 0 0 + 4200 1400 2 0.4236 30.93487 16.33963 27.45835 -1 0 0 + 4201 1401 1 -0.8472 0.81922 11.50629 17.18912 0 0 0 + 4202 1401 2 0.4236 0.61583 10.52916 17.25048 0 0 0 + 4203 1401 2 0.4236 1.64440 11.64122 16.64065 0 0 0 + 4204 1402 1 -0.8472 6.31281 10.44238 16.76762 0 0 0 + 4205 1402 2 0.4236 7.01406 11.14835 16.66862 0 0 0 + 4206 1402 2 0.4236 5.76953 10.62481 17.58709 0 0 0 + 4207 1403 1 -0.8472 0.54456 9.54460 23.55923 0 0 0 + 4208 1403 2 0.4236 0.32188 9.63088 24.53027 0 0 0 + 4209 1403 2 0.4236 1.35608 10.09147 23.35353 0 0 0 + 4210 1404 1 -0.8472 1.24532 29.21899 12.99820 0 -1 0 + 4211 1404 2 0.4236 2.10877 28.72424 12.90008 0 -1 0 + 4212 1404 2 0.4236 1.18386 29.60264 13.91958 0 -1 0 + 4213 1405 1 -0.8472 9.87755 0.56243 14.38546 1 1 0 + 4214 1405 2 0.4236 10.32219 35.29136 13.94064 1 0 0 + 4215 1405 2 0.4236 10.56154 1.10058 14.87789 1 1 0 + 4216 1406 1 -0.8472 20.62159 2.62651 7.23282 1 1 0 + 4217 1406 2 0.4236 21.26312 3.32400 7.55202 1 1 0 + 4218 1406 2 0.4236 19.72502 2.78378 7.64684 1 1 0 + 4219 1407 1 -0.8472 26.24895 1.51497 16.19898 0 0 0 + 4220 1407 2 0.4236 25.40298 1.65532 16.71335 0 0 0 + 4221 1407 2 0.4236 26.29696 2.17550 15.44973 0 0 0 + 4222 1408 1 -0.8472 21.52089 15.53065 3.18350 0 -1 0 + 4223 1408 2 0.4236 21.15454 15.06314 2.37904 0 -1 0 + 4224 1408 2 0.4236 20.93898 16.31204 3.40870 0 -1 0 + 4225 1409 1 -0.8472 9.60116 12.81307 30.75366 0 0 0 + 4226 1409 2 0.4236 10.22636 13.08164 31.48643 0 0 0 + 4227 1409 2 0.4236 9.05604 12.02934 31.05121 0 0 0 + 4228 1410 1 -0.8472 5.23729 9.36348 2.76133 0 1 0 + 4229 1410 2 0.4236 5.49223 9.14952 3.70430 0 1 0 + 4230 1410 2 0.4236 4.82716 8.55685 2.33574 0 1 0 + 4231 1411 1 -0.8472 30.15622 30.86325 5.78803 -1 0 0 + 4232 1411 2 0.4236 31.03997 30.61950 6.18741 -1 0 0 + 4233 1411 2 0.4236 29.77296 31.64556 6.27901 -1 0 0 + 4234 1412 1 -0.8472 3.00118 7.40350 17.66433 1 1 0 + 4235 1412 2 0.4236 3.31933 7.97153 18.42332 1 1 0 + 4236 1412 2 0.4236 3.68758 7.40392 16.93713 1 1 0 + 4237 1413 1 -0.8472 1.27143 7.78395 33.63201 1 0 0 + 4238 1413 2 0.4236 1.04920 7.43066 34.54070 1 0 0 + 4239 1413 2 0.4236 1.85411 8.59165 33.72173 1 0 0 + 4240 1414 1 -0.8472 10.36647 16.58874 31.95040 1 0 0 + 4241 1414 2 0.4236 9.90077 17.17268 32.61532 1 0 0 + 4242 1414 2 0.4236 10.58267 15.70882 32.37335 1 0 0 + 4243 1415 1 -0.8472 2.92649 20.78950 22.99831 0 0 0 + 4244 1415 2 0.4236 3.38630 20.43813 23.81381 0 0 0 + 4245 1415 2 0.4236 3.60510 21.17464 22.37292 0 0 0 + 4246 1416 1 -0.8472 31.24310 32.56486 23.40585 -1 0 0 + 4247 1416 2 0.4236 30.76987 31.83084 23.89290 -1 0 0 + 4248 1416 2 0.4236 31.66708 32.19655 22.57848 -1 0 0 + 4249 1417 1 -0.8472 20.50168 18.67424 3.60469 0 1 0 + 4250 1417 2 0.4236 20.50225 18.74384 2.60714 0 1 0 + 4251 1417 2 0.4236 21.11534 19.36488 3.98731 0 1 0 + 4252 1418 1 -0.8472 29.26181 22.02665 30.81917 0 0 0 + 4253 1418 2 0.4236 29.77498 22.84230 31.08623 0 0 0 + 4254 1418 2 0.4236 28.58254 22.27185 30.12749 0 0 0 + 4255 1419 1 -0.8472 1.85161 27.62341 34.11640 -1 0 0 + 4256 1419 2 0.4236 2.16253 28.55236 34.31717 -1 0 0 + 4257 1419 2 0.4236 1.65257 27.54234 33.13979 -1 0 0 + 4258 1420 1 -0.8472 7.53004 9.50217 1.47002 0 1 0 + 4259 1420 2 0.4236 6.61551 9.21649 1.75623 0 1 0 + 4260 1420 2 0.4236 7.45608 10.27834 0.84390 0 1 0 + 4261 1421 1 -0.8472 16.58285 11.39480 14.39794 0 0 0 + 4262 1421 2 0.4236 16.18969 11.93603 13.65465 0 0 0 + 4263 1421 2 0.4236 16.00811 10.59421 14.56741 0 0 0 + 4264 1422 1 -0.8472 2.10592 5.43627 4.72316 0 1 0 + 4265 1422 2 0.4236 3.08841 5.34757 4.55950 0 1 0 + 4266 1422 2 0.4236 1.92931 5.42178 5.70732 0 1 0 + 4267 1423 1 -0.8472 3.71506 8.98264 20.01685 -1 0 0 + 4268 1423 2 0.4236 3.94387 9.91834 19.74841 -1 0 0 + 4269 1423 2 0.4236 4.50529 8.56072 20.46122 -1 0 0 + 4270 1424 1 -0.8472 1.86906 28.23419 30.94543 0 0 0 + 4271 1424 2 0.4236 2.78640 28.42230 30.59465 0 0 0 + 4272 1424 2 0.4236 1.58999 27.31365 30.67214 0 0 0 + 4273 1425 1 -0.8472 25.91892 1.73795 33.90733 1 1 0 + 4274 1425 2 0.4236 26.38470 2.45005 34.43262 1 1 0 + 4275 1425 2 0.4236 25.22904 2.15669 33.31689 1 1 0 + 4276 1426 1 -0.8472 4.30326 25.01135 31.69404 1 0 0 + 4277 1426 2 0.4236 4.77681 24.60093 30.91477 1 0 0 + 4278 1426 2 0.4236 3.42338 24.55523 31.82725 1 0 0 + 4279 1427 1 -0.8472 19.66466 33.96005 4.92748 0 -1 0 + 4280 1427 2 0.4236 19.99973 33.92475 5.86895 0 -1 0 + 4281 1427 2 0.4236 19.05768 33.18317 4.76034 0 -1 0 + 4282 1428 1 -0.8472 21.52853 24.53570 28.70701 0 -1 0 + 4283 1428 2 0.4236 21.55814 23.79625 29.37955 0 -1 0 + 4284 1428 2 0.4236 21.25506 25.38540 29.15776 0 -1 0 + 4285 1429 1 -0.8472 26.10586 14.96142 24.05624 0 0 0 + 4286 1429 2 0.4236 26.93664 15.23325 24.54190 0 0 0 + 4287 1429 2 0.4236 25.31446 15.40773 24.47395 0 0 0 + 4288 1430 1 -0.8472 8.93989 1.91730 34.66523 0 1 0 + 4289 1430 2 0.4236 9.71720 1.70768 34.07209 0 1 0 + 4290 1430 2 0.4236 9.19437 2.64332 35.30406 0 1 0 + 4291 1431 1 -0.8472 5.49155 24.85029 22.62250 1 0 0 + 4292 1431 2 0.4236 4.52301 24.64929 22.47596 1 0 0 + 4293 1431 2 0.4236 5.58611 25.50776 23.37001 1 0 0 + 4294 1432 1 -0.8472 30.35913 16.66043 13.69265 0 0 0 + 4295 1432 2 0.4236 31.35846 16.64719 13.65890 0 0 0 + 4296 1432 2 0.4236 30.01994 15.73968 13.88523 0 0 0 + 4297 1433 1 -0.8472 23.73905 30.09756 28.00530 0 -1 0 + 4298 1433 2 0.4236 22.88636 29.76565 27.60195 0 -1 0 + 4299 1433 2 0.4236 23.54863 30.89468 28.57831 0 -1 0 + 4300 1434 1 -0.8472 6.27457 22.28510 10.31293 0 0 0 + 4301 1434 2 0.4236 7.20338 22.65451 10.28568 0 0 0 + 4302 1434 2 0.4236 5.87861 22.44520 11.21712 0 0 0 + 4303 1435 1 -0.8472 34.26671 24.67070 21.96499 -1 0 0 + 4304 1435 2 0.4236 34.87274 24.93575 21.21504 -1 0 0 + 4305 1435 2 0.4236 34.76260 24.73063 22.83129 -1 0 0 + 4306 1436 1 -0.8472 18.92162 1.08281 4.46925 -1 -1 0 + 4307 1436 2 0.4236 19.78754 1.54407 4.27592 -1 -1 0 + 4308 1436 2 0.4236 19.09471 0.11779 4.66605 -1 -1 0 + 4309 1437 1 -0.8472 12.57287 31.40153 18.46855 1 0 0 + 4310 1437 2 0.4236 12.50938 30.52513 17.99122 1 0 0 + 4311 1437 2 0.4236 13.40979 31.42337 19.01540 1 0 0 + 4312 1438 1 -0.8472 18.33881 32.50240 15.43232 0 0 0 + 4313 1438 2 0.4236 17.94420 33.42056 15.39759 0 0 0 + 4314 1438 2 0.4236 17.69459 31.87927 15.87577 0 0 0 + 4315 1439 1 -0.8472 7.67654 27.84873 9.04314 0 0 0 + 4316 1439 2 0.4236 8.43198 27.95713 9.68931 0 0 0 + 4317 1439 2 0.4236 6.89338 27.43980 9.51151 0 0 0 + 4318 1440 1 -0.8472 21.65035 35.23355 32.90414 -1 0 0 + 4319 1440 2 0.4236 21.89201 35.27549 33.87358 -1 0 0 + 4320 1440 2 0.4236 21.11552 0.53569 32.65870 -1 1 0 + 4321 1441 1 -0.8472 26.98866 12.66178 1.39463 0 0 0 + 4322 1441 2 0.4236 27.22858 13.05128 0.50543 0 0 0 + 4323 1441 2 0.4236 26.30814 11.93983 1.26961 0 0 0 + 4324 1442 1 -0.8472 33.90498 1.20205 27.79719 -1 0 0 + 4325 1442 2 0.4236 33.57512 1.17136 26.85369 -1 0 0 + 4326 1442 2 0.4236 34.38097 0.34922 28.01175 -1 0 0 + 4327 1443 1 -0.8472 16.09059 23.00449 11.90689 0 -1 0 + 4328 1443 2 0.4236 15.59851 22.16519 11.67591 0 -1 0 + 4329 1443 2 0.4236 16.68248 23.26450 11.14399 0 -1 0 + 4330 1444 1 -0.8472 21.66203 22.49671 5.11467 0 -1 0 + 4331 1444 2 0.4236 21.48400 22.99703 5.96197 0 -1 0 + 4332 1444 2 0.4236 22.09350 21.62052 5.32931 0 -1 0 + 4333 1445 1 -0.8472 28.27062 28.47059 10.54210 0 -1 0 + 4334 1445 2 0.4236 28.73699 29.21139 10.05878 0 -1 0 + 4335 1445 2 0.4236 28.92304 27.99473 11.13191 0 -1 0 + 4336 1446 1 -0.8472 11.81133 6.08344 22.22918 2 0 0 + 4337 1446 2 0.4236 11.98293 6.96727 21.79400 2 0 0 + 4338 1446 2 0.4236 12.67690 5.59722 22.34885 2 0 0 + 4339 1447 1 -0.8472 11.54720 20.00403 29.64998 0 0 0 + 4340 1447 2 0.4236 12.20847 19.94668 30.39788 0 0 0 + 4341 1447 2 0.4236 10.65105 20.25502 30.01590 0 0 0 + 4342 1448 1 -0.8472 23.63295 15.75324 6.26015 -1 0 0 + 4343 1448 2 0.4236 24.01845 15.46731 7.13740 -1 0 0 + 4344 1448 2 0.4236 23.17822 16.63724 6.36819 -1 0 0 + 4345 1449 1 -0.8472 18.59627 17.84478 8.51395 0 0 0 + 4346 1449 2 0.4236 19.30661 17.22786 8.85265 0 0 0 + 4347 1449 2 0.4236 18.88270 18.23432 7.63866 0 0 0 + 4348 1450 1 -0.8472 24.95837 31.64730 25.42719 0 0 0 + 4349 1450 2 0.4236 25.82533 31.64851 24.92884 0 0 0 + 4350 1450 2 0.4236 25.13906 31.67401 26.41036 0 0 0 + 4351 1451 1 -0.8472 16.66874 15.84535 16.59843 0 0 0 + 4352 1451 2 0.4236 16.30160 16.17484 17.46823 0 0 0 + 4353 1451 2 0.4236 16.72463 14.84712 16.61697 0 0 0 + 4354 1452 1 -0.8472 33.01487 0.03301 11.50236 0 1 0 + 4355 1452 2 0.4236 32.49598 0.68423 10.94864 0 1 0 + 4356 1452 2 0.4236 32.63147 35.50688 12.42537 0 0 0 +4357 1453 1 -0.8472 28.05328 19.82767 0.19572 0 0 0 +4358 1453 2 0.4236 27.36733 20.21266 0.81312 0 0 0 +4359 1453 2 0.4236 27.69662 18.99018 35.22901 0 0 -1 + 4360 1454 1 -0.8472 13.82727 16.06989 19.24354 0 0 0 + 4361 1454 2 0.4236 14.79294 15.86683 19.40546 0 0 0 + 4362 1454 2 0.4236 13.26084 15.39722 19.71956 0 0 0 + 4363 1455 1 -0.8472 14.08001 21.97765 33.17988 1 0 0 + 4364 1455 2 0.4236 14.86867 22.09727 33.78291 1 0 0 + 4365 1455 2 0.4236 14.36835 22.08619 32.22855 1 0 0 + 4366 1456 1 -0.8472 16.33725 25.39311 3.01993 0 -1 0 + 4367 1456 2 0.4236 16.78886 26.28499 3.04273 0 -1 0 + 4368 1456 2 0.4236 16.96355 24.71199 2.64072 0 -1 0 + 4369 1457 1 -0.8472 34.41055 25.51007 0.15059 0 0 0 + 4370 1457 2 0.4236 34.86965 26.36478 0.39277 0 0 0 + 4371 1457 2 0.4236 33.46228 25.53993 0.46653 0 0 0 + 4372 1458 1 -0.8472 27.86190 21.35174 28.12153 -1 0 0 + 4373 1458 2 0.4236 28.79121 21.05583 27.90073 -1 0 0 + 4374 1458 2 0.4236 27.23273 21.03009 27.41397 -1 0 0 + 4375 1459 1 -0.8472 0.23515 27.24082 28.00084 1 -1 0 + 4376 1459 2 0.4236 0.82580 26.63370 28.53233 1 -1 0 + 4377 1459 2 0.4236 34.89553 26.76177 27.76667 0 -1 0 + 4378 1460 1 -0.8472 21.68728 25.32330 17.79708 0 0 0 + 4379 1460 2 0.4236 22.01241 26.26845 17.76638 0 0 0 + 4380 1460 2 0.4236 21.31354 25.07022 16.90477 0 0 0 + 4381 1461 1 -0.8472 30.97176 0.89911 8.90394 -1 2 0 + 4382 1461 2 0.4236 31.32718 0.98094 7.97285 -1 2 0 + 4383 1461 2 0.4236 29.99239 1.10098 8.90582 -1 2 0 + 4384 1462 1 -0.8472 25.45716 22.87578 20.99721 0 0 0 + 4385 1462 2 0.4236 26.30239 22.39353 21.22734 0 0 0 + 4386 1462 2 0.4236 25.66033 23.83885 20.82076 0 0 0 + 4387 1463 1 -0.8472 24.87472 30.47978 12.60569 0 0 0 + 4388 1463 2 0.4236 25.65927 30.69811 12.02542 0 0 0 + 4389 1463 2 0.4236 24.98656 29.56166 12.98590 0 0 0 + 4390 1464 1 -0.8472 13.80973 7.99429 5.29049 0 1 0 + 4391 1464 2 0.4236 13.73023 8.76929 4.66357 0 1 0 + 4392 1464 2 0.4236 14.76858 7.86828 5.54475 0 1 0 + 4393 1465 1 -0.8472 33.97510 12.84300 16.82412 -1 0 0 + 4394 1465 2 0.4236 34.81504 12.34044 17.02876 -1 0 0 + 4395 1465 2 0.4236 33.55414 13.15013 17.67758 -1 0 0 + 4396 1466 1 -0.8472 26.59067 21.83864 5.49548 0 0 0 + 4397 1466 2 0.4236 27.17656 22.56826 5.14296 0 0 0 + 4398 1466 2 0.4236 27.14602 21.03034 5.69097 0 0 0 + 4399 1467 1 -0.8472 5.16628 25.92485 12.35774 0 0 0 + 4400 1467 2 0.4236 4.34860 25.35313 12.42442 0 0 0 + 4401 1467 2 0.4236 5.79329 25.69800 13.10298 0 0 0 + 4402 1468 1 -0.8472 26.79149 35.42791 5.15590 -1 0 0 + 4403 1468 2 0.4236 26.57100 34.75869 5.86548 -1 0 0 + 4404 1468 2 0.4236 27.24633 0.70960 5.57074 -1 1 0 + 4405 1469 1 -0.8472 1.20630 3.82773 0.24514 0 0 0 + 4406 1469 2 0.4236 2.07387 3.42063 0.53070 0 0 0 + 4407 1469 2 0.4236 0.45018 3.34497 0.68691 0 0 0 + 4408 1470 1 -0.8472 26.43671 3.26559 13.86247 -1 0 0 + 4409 1470 2 0.4236 26.83179 4.06661 14.31219 -1 0 0 + 4410 1470 2 0.4236 25.70088 3.55590 13.25073 -1 0 0 + 4411 1471 1 -0.8472 33.20618 12.63476 8.22853 0 0 0 + 4412 1471 2 0.4236 32.62856 12.82716 9.02181 0 0 0 + 4413 1471 2 0.4236 34.16325 12.80270 8.46454 0 0 0 + 4414 1472 1 -0.8472 29.90540 24.56808 20.70513 -1 0 0 + 4415 1472 2 0.4236 29.45905 25.46288 20.69386 -1 0 0 + 4416 1472 2 0.4236 30.31745 24.38988 19.81161 -1 0 0 + 4417 1473 1 -0.8472 15.29819 4.02922 16.44477 0 1 0 + 4418 1473 2 0.4236 15.74731 4.67008 17.06729 0 1 0 + 4419 1473 2 0.4236 14.96500 3.24064 16.96159 0 1 0 +4420 1474 1 -0.8472 31.27200 25.18131 0.42504 0 0 0 +4421 1474 2 0.4236 31.06216 24.44154 35.23295 0 0 -1 +4422 1474 2 0.4236 30.72503 25.06997 1.25474 0 0 0 +4423 1475 1 -0.8472 12.12236 3.02649 0.17854 1 1 0 +4424 1475 2 0.4236 11.88057 2.13716 35.23770 1 1 -1 +4425 1475 2 0.4236 11.35234 3.37843 0.71066 1 1 0 + 4426 1476 1 -0.8472 32.84202 11.55156 14.38224 -1 1 0 + 4427 1476 2 0.4236 31.87238 11.54439 14.13797 -1 1 0 + 4428 1476 2 0.4236 33.01945 12.30064 15.02046 -1 1 0 + 4429 1477 1 -0.8472 20.56141 17.44100 12.45462 0 0 0 + 4430 1477 2 0.4236 19.82341 16.87961 12.08022 0 0 0 + 4431 1477 2 0.4236 20.67251 17.23961 13.42779 0 0 0 + 4432 1478 1 -0.8472 15.28058 11.62137 18.81314 0 0 0 + 4433 1478 2 0.4236 14.35106 11.87755 19.07832 0 0 0 + 4434 1478 2 0.4236 15.44910 10.66895 19.06701 0 0 0 + 4435 1479 1 -0.8472 29.74122 20.36633 3.36258 1 0 0 + 4436 1479 2 0.4236 30.50489 19.77988 3.63245 1 0 0 + 4437 1479 2 0.4236 29.83808 20.61761 2.39955 1 0 0 + 4438 1480 1 -0.8472 10.45942 28.09788 15.37735 0 0 0 + 4439 1480 2 0.4236 9.49177 28.21579 15.60027 0 0 0 + 4440 1480 2 0.4236 10.68404 28.64230 14.56918 0 0 0 + 4441 1481 1 -0.8472 16.77284 6.13546 17.93915 -1 1 0 + 4442 1481 2 0.4236 17.27231 6.27930 18.79343 -1 1 0 + 4443 1481 2 0.4236 16.65241 7.01137 17.47196 -1 1 0 + 4444 1482 1 -0.8472 21.51809 0.32169 25.14138 1 0 0 + 4445 1482 2 0.4236 22.25467 0.17201 25.80091 1 0 0 + 4446 1482 2 0.4236 21.38164 34.99836 24.60010 1 -1 0 + 4447 1483 1 -0.8472 8.70687 23.66278 10.13832 1 0 0 + 4448 1483 2 0.4236 9.01094 24.13022 10.96842 1 0 0 + 4449 1483 2 0.4236 9.40929 23.01447 9.84461 1 0 0 + 4450 1484 1 -0.8472 20.24838 3.67061 10.36639 0 1 0 + 4451 1484 2 0.4236 20.42013 3.09249 11.16402 0 1 0 + 4452 1484 2 0.4236 19.45158 3.32583 9.87020 0 1 0 + 4453 1485 1 -0.8472 5.99031 17.08661 14.86595 0 -1 0 + 4454 1485 2 0.4236 6.68059 17.76993 14.62817 0 -1 0 + 4455 1485 2 0.4236 5.51211 17.37098 15.69683 0 -1 0 + 4456 1486 1 -0.8472 9.84126 21.02704 7.17564 1 0 0 + 4457 1486 2 0.4236 9.10851 21.60977 6.82433 1 0 0 + 4458 1486 2 0.4236 9.88717 21.11282 8.17086 1 0 0 + 4459 1487 1 -0.8472 14.27700 22.34872 30.47271 0 -1 0 + 4460 1487 2 0.4236 13.79127 23.17247 30.18038 0 -1 0 + 4461 1487 2 0.4236 14.51549 21.80029 29.67128 0 -1 0 + 4462 1488 1 -0.8472 9.99770 22.36314 18.62254 0 0 0 + 4463 1488 2 0.4236 10.44813 21.95194 17.83008 0 0 0 + 4464 1488 2 0.4236 10.66650 22.49693 19.35385 0 0 0 + 4465 1489 1 -0.8472 13.54588 23.31244 25.33301 0 0 0 + 4466 1489 2 0.4236 13.21038 22.99391 26.21954 0 0 0 + 4467 1489 2 0.4236 14.46674 22.95517 25.17718 0 0 0 + 4468 1490 1 -0.8472 20.37993 18.69129 28.39579 0 0 0 + 4469 1490 2 0.4236 19.95915 18.99234 27.54006 0 0 0 + 4470 1490 2 0.4236 21.36712 18.59759 28.26690 0 0 0 + 4471 1491 1 -0.8472 31.97357 7.21056 11.20401 0 1 0 + 4472 1491 2 0.4236 31.56230 7.14412 12.11308 0 1 0 + 4473 1491 2 0.4236 32.88388 6.79691 11.21900 0 1 0 + 4474 1492 1 -0.8472 3.59839 34.17205 15.10830 1 -1 0 + 4475 1492 2 0.4236 3.17559 33.45078 14.55972 1 -1 0 + 4476 1492 2 0.4236 3.57179 33.91506 16.07431 1 -1 0 + 4477 1493 1 -0.8472 16.75495 18.40965 28.99548 0 0 0 + 4478 1493 2 0.4236 17.67786 18.68610 29.26339 0 0 0 + 4479 1493 2 0.4236 16.49472 17.58541 29.49830 0 0 0 + 4480 1494 1 -0.8472 4.30401 30.00446 27.41270 2 -1 0 + 4481 1494 2 0.4236 5.20242 30.40877 27.24145 2 -1 0 + 4482 1494 2 0.4236 3.66298 30.30545 26.70673 2 -1 0 + 4483 1495 1 -0.8472 6.15115 15.71784 24.07151 1 1 0 + 4484 1495 2 0.4236 5.27191 15.89172 24.51496 1 1 0 + 4485 1495 2 0.4236 6.55767 14.88710 24.45172 1 1 0 + 4486 1496 1 -0.8472 1.16767 28.77477 19.83689 0 0 0 + 4487 1496 2 0.4236 0.50183 28.05644 19.63537 0 0 0 + 4488 1496 2 0.4236 2.07490 28.36794 19.94340 0 0 0 + 4489 1497 1 -0.8472 23.23606 29.74360 8.55284 0 0 0 + 4490 1497 2 0.4236 24.21877 29.83041 8.71618 0 0 0 + 4491 1497 2 0.4236 22.95269 30.40987 7.86311 0 0 0 + 4492 1498 1 -0.8472 19.48056 19.15564 6.41598 0 0 0 + 4493 1498 2 0.4236 18.99884 18.47150 5.86839 0 0 0 + 4494 1498 2 0.4236 18.88774 19.94885 6.55504 0 0 0 + 4495 1499 1 -0.8472 33.04434 24.82100 13.64486 0 0 0 + 4496 1499 2 0.4236 33.83932 24.36499 13.24495 0 0 0 + 4497 1499 2 0.4236 32.21569 24.31265 13.41066 0 0 0 + 4498 1500 1 -0.8472 26.04955 6.03860 17.25587 0 0 0 + 4499 1500 2 0.4236 26.40284 5.43861 17.97360 0 0 0 + 4500 1500 2 0.4236 26.43423 5.76580 16.37409 0 0 0 + +Bonds + + 1 1 1 2 + 2 1 1 3 + 3 1 4 5 + 4 1 4 6 + 5 1 7 8 + 6 1 7 9 + 7 1 10 11 + 8 1 10 12 + 9 1 13 14 + 10 1 13 15 + 11 1 16 17 + 12 1 16 18 + 13 1 19 20 + 14 1 19 21 + 15 1 22 23 + 16 1 22 24 + 17 1 25 26 + 18 1 25 27 + 19 1 28 29 + 20 1 28 30 + 21 1 31 32 + 22 1 31 33 + 23 1 34 35 + 24 1 34 36 + 25 1 37 38 + 26 1 37 39 + 27 1 40 41 + 28 1 40 42 + 29 1 43 44 + 30 1 43 45 + 31 1 46 47 + 32 1 46 48 + 33 1 49 50 + 34 1 49 51 + 35 1 52 53 + 36 1 52 54 + 37 1 55 56 + 38 1 55 57 + 39 1 58 59 + 40 1 58 60 + 41 1 61 62 + 42 1 61 63 + 43 1 64 65 + 44 1 64 66 + 45 1 67 68 + 46 1 67 69 + 47 1 70 71 + 48 1 70 72 + 49 1 73 74 + 50 1 73 75 + 51 1 76 77 + 52 1 76 78 + 53 1 79 80 + 54 1 79 81 + 55 1 82 83 + 56 1 82 84 + 57 1 85 86 + 58 1 85 87 + 59 1 88 89 + 60 1 88 90 + 61 1 91 92 + 62 1 91 93 + 63 1 94 95 + 64 1 94 96 + 65 1 97 98 + 66 1 97 99 + 67 1 100 101 + 68 1 100 102 + 69 1 103 104 + 70 1 103 105 + 71 1 106 107 + 72 1 106 108 + 73 1 109 110 + 74 1 109 111 + 75 1 112 113 + 76 1 112 114 + 77 1 115 116 + 78 1 115 117 + 79 1 118 119 + 80 1 118 120 + 81 1 121 122 + 82 1 121 123 + 83 1 124 125 + 84 1 124 126 + 85 1 127 128 + 86 1 127 129 + 87 1 130 131 + 88 1 130 132 + 89 1 133 134 + 90 1 133 135 + 91 1 136 137 + 92 1 136 138 + 93 1 139 140 + 94 1 139 141 + 95 1 142 143 + 96 1 142 144 + 97 1 145 146 + 98 1 145 147 + 99 1 148 149 + 100 1 148 150 + 101 1 151 152 + 102 1 151 153 + 103 1 154 155 + 104 1 154 156 + 105 1 157 158 + 106 1 157 159 + 107 1 160 161 + 108 1 160 162 + 109 1 163 164 + 110 1 163 165 + 111 1 166 167 + 112 1 166 168 + 113 1 169 170 + 114 1 169 171 + 115 1 172 173 + 116 1 172 174 + 117 1 175 176 + 118 1 175 177 + 119 1 178 179 + 120 1 178 180 + 121 1 181 182 + 122 1 181 183 + 123 1 184 185 + 124 1 184 186 + 125 1 187 188 + 126 1 187 189 + 127 1 190 191 + 128 1 190 192 + 129 1 193 194 + 130 1 193 195 + 131 1 196 197 + 132 1 196 198 + 133 1 199 200 + 134 1 199 201 + 135 1 202 203 + 136 1 202 204 + 137 1 205 206 + 138 1 205 207 + 139 1 208 209 + 140 1 208 210 + 141 1 211 212 + 142 1 211 213 + 143 1 214 215 + 144 1 214 216 + 145 1 217 218 + 146 1 217 219 + 147 1 220 221 + 148 1 220 222 + 149 1 223 224 + 150 1 223 225 + 151 1 226 227 + 152 1 226 228 + 153 1 229 230 + 154 1 229 231 + 155 1 232 233 + 156 1 232 234 + 157 1 235 236 + 158 1 235 237 + 159 1 238 239 + 160 1 238 240 + 161 1 241 242 + 162 1 241 243 + 163 1 244 245 + 164 1 244 246 + 165 1 247 248 + 166 1 247 249 + 167 1 250 251 + 168 1 250 252 + 169 1 253 254 + 170 1 253 255 + 171 1 256 257 + 172 1 256 258 + 173 1 259 260 + 174 1 259 261 + 175 1 262 263 + 176 1 262 264 + 177 1 265 266 + 178 1 265 267 + 179 1 268 269 + 180 1 268 270 + 181 1 271 272 + 182 1 271 273 + 183 1 274 275 + 184 1 274 276 + 185 1 277 278 + 186 1 277 279 + 187 1 280 281 + 188 1 280 282 + 189 1 283 284 + 190 1 283 285 + 191 1 286 287 + 192 1 286 288 + 193 1 289 290 + 194 1 289 291 + 195 1 292 293 + 196 1 292 294 + 197 1 295 296 + 198 1 295 297 + 199 1 298 299 + 200 1 298 300 + 201 1 301 302 + 202 1 301 303 + 203 1 304 305 + 204 1 304 306 + 205 1 307 308 + 206 1 307 309 + 207 1 310 311 + 208 1 310 312 + 209 1 313 314 + 210 1 313 315 + 211 1 316 317 + 212 1 316 318 + 213 1 319 320 + 214 1 319 321 + 215 1 322 323 + 216 1 322 324 + 217 1 325 326 + 218 1 325 327 + 219 1 328 329 + 220 1 328 330 + 221 1 331 332 + 222 1 331 333 + 223 1 334 335 + 224 1 334 336 + 225 1 337 338 + 226 1 337 339 + 227 1 340 341 + 228 1 340 342 + 229 1 343 344 + 230 1 343 345 + 231 1 346 347 + 232 1 346 348 + 233 1 349 350 + 234 1 349 351 + 235 1 352 353 + 236 1 352 354 + 237 1 355 356 + 238 1 355 357 + 239 1 358 359 + 240 1 358 360 + 241 1 361 362 + 242 1 361 363 + 243 1 364 365 + 244 1 364 366 + 245 1 367 368 + 246 1 367 369 + 247 1 370 371 + 248 1 370 372 + 249 1 373 374 + 250 1 373 375 + 251 1 376 377 + 252 1 376 378 + 253 1 379 380 + 254 1 379 381 + 255 1 382 383 + 256 1 382 384 + 257 1 385 386 + 258 1 385 387 + 259 1 388 389 + 260 1 388 390 + 261 1 391 392 + 262 1 391 393 + 263 1 394 395 + 264 1 394 396 + 265 1 397 398 + 266 1 397 399 + 267 1 400 401 + 268 1 400 402 + 269 1 403 404 + 270 1 403 405 + 271 1 406 407 + 272 1 406 408 + 273 1 409 410 + 274 1 409 411 + 275 1 412 413 + 276 1 412 414 + 277 1 415 416 + 278 1 415 417 + 279 1 418 419 + 280 1 418 420 + 281 1 421 422 + 282 1 421 423 + 283 1 424 425 + 284 1 424 426 + 285 1 427 428 + 286 1 427 429 + 287 1 430 431 + 288 1 430 432 + 289 1 433 434 + 290 1 433 435 + 291 1 436 437 + 292 1 436 438 + 293 1 439 440 + 294 1 439 441 + 295 1 442 443 + 296 1 442 444 + 297 1 445 446 + 298 1 445 447 + 299 1 448 449 + 300 1 448 450 + 301 1 451 452 + 302 1 451 453 + 303 1 454 455 + 304 1 454 456 + 305 1 457 458 + 306 1 457 459 + 307 1 460 461 + 308 1 460 462 + 309 1 463 464 + 310 1 463 465 + 311 1 466 467 + 312 1 466 468 + 313 1 469 470 + 314 1 469 471 + 315 1 472 473 + 316 1 472 474 + 317 1 475 476 + 318 1 475 477 + 319 1 478 479 + 320 1 478 480 + 321 1 481 482 + 322 1 481 483 + 323 1 484 485 + 324 1 484 486 + 325 1 487 488 + 326 1 487 489 + 327 1 490 491 + 328 1 490 492 + 329 1 493 494 + 330 1 493 495 + 331 1 496 497 + 332 1 496 498 + 333 1 499 500 + 334 1 499 501 + 335 1 502 503 + 336 1 502 504 + 337 1 505 506 + 338 1 505 507 + 339 1 508 509 + 340 1 508 510 + 341 1 511 512 + 342 1 511 513 + 343 1 514 515 + 344 1 514 516 + 345 1 517 518 + 346 1 517 519 + 347 1 520 521 + 348 1 520 522 + 349 1 523 524 + 350 1 523 525 + 351 1 526 527 + 352 1 526 528 + 353 1 529 530 + 354 1 529 531 + 355 1 532 533 + 356 1 532 534 + 357 1 535 536 + 358 1 535 537 + 359 1 538 539 + 360 1 538 540 + 361 1 541 542 + 362 1 541 543 + 363 1 544 545 + 364 1 544 546 + 365 1 547 548 + 366 1 547 549 + 367 1 550 551 + 368 1 550 552 + 369 1 553 554 + 370 1 553 555 + 371 1 556 557 + 372 1 556 558 + 373 1 559 560 + 374 1 559 561 + 375 1 562 563 + 376 1 562 564 + 377 1 565 566 + 378 1 565 567 + 379 1 568 569 + 380 1 568 570 + 381 1 571 572 + 382 1 571 573 + 383 1 574 575 + 384 1 574 576 + 385 1 577 578 + 386 1 577 579 + 387 1 580 581 + 388 1 580 582 + 389 1 583 584 + 390 1 583 585 + 391 1 586 587 + 392 1 586 588 + 393 1 589 590 + 394 1 589 591 + 395 1 592 593 + 396 1 592 594 + 397 1 595 596 + 398 1 595 597 + 399 1 598 599 + 400 1 598 600 + 401 1 601 602 + 402 1 601 603 + 403 1 604 605 + 404 1 604 606 + 405 1 607 608 + 406 1 607 609 + 407 1 610 611 + 408 1 610 612 + 409 1 613 614 + 410 1 613 615 + 411 1 616 617 + 412 1 616 618 + 413 1 619 620 + 414 1 619 621 + 415 1 622 623 + 416 1 622 624 + 417 1 625 626 + 418 1 625 627 + 419 1 628 629 + 420 1 628 630 + 421 1 631 632 + 422 1 631 633 + 423 1 634 635 + 424 1 634 636 + 425 1 637 638 + 426 1 637 639 + 427 1 640 641 + 428 1 640 642 + 429 1 643 644 + 430 1 643 645 + 431 1 646 647 + 432 1 646 648 + 433 1 649 650 + 434 1 649 651 + 435 1 652 653 + 436 1 652 654 + 437 1 655 656 + 438 1 655 657 + 439 1 658 659 + 440 1 658 660 + 441 1 661 662 + 442 1 661 663 + 443 1 664 665 + 444 1 664 666 + 445 1 667 668 + 446 1 667 669 + 447 1 670 671 + 448 1 670 672 + 449 1 673 674 + 450 1 673 675 + 451 1 676 677 + 452 1 676 678 + 453 1 679 680 + 454 1 679 681 + 455 1 682 683 + 456 1 682 684 + 457 1 685 686 + 458 1 685 687 + 459 1 688 689 + 460 1 688 690 + 461 1 691 692 + 462 1 691 693 + 463 1 694 695 + 464 1 694 696 + 465 1 697 698 + 466 1 697 699 + 467 1 700 701 + 468 1 700 702 + 469 1 703 704 + 470 1 703 705 + 471 1 706 707 + 472 1 706 708 + 473 1 709 710 + 474 1 709 711 + 475 1 712 713 + 476 1 712 714 + 477 1 715 716 + 478 1 715 717 + 479 1 718 719 + 480 1 718 720 + 481 1 721 722 + 482 1 721 723 + 483 1 724 725 + 484 1 724 726 + 485 1 727 728 + 486 1 727 729 + 487 1 730 731 + 488 1 730 732 + 489 1 733 734 + 490 1 733 735 + 491 1 736 737 + 492 1 736 738 + 493 1 739 740 + 494 1 739 741 + 495 1 742 743 + 496 1 742 744 + 497 1 745 746 + 498 1 745 747 + 499 1 748 749 + 500 1 748 750 + 501 1 751 752 + 502 1 751 753 + 503 1 754 755 + 504 1 754 756 + 505 1 757 758 + 506 1 757 759 + 507 1 760 761 + 508 1 760 762 + 509 1 763 764 + 510 1 763 765 + 511 1 766 767 + 512 1 766 768 + 513 1 769 770 + 514 1 769 771 + 515 1 772 773 + 516 1 772 774 + 517 1 775 776 + 518 1 775 777 + 519 1 778 779 + 520 1 778 780 + 521 1 781 782 + 522 1 781 783 + 523 1 784 785 + 524 1 784 786 + 525 1 787 788 + 526 1 787 789 + 527 1 790 791 + 528 1 790 792 + 529 1 793 794 + 530 1 793 795 + 531 1 796 797 + 532 1 796 798 + 533 1 799 800 + 534 1 799 801 + 535 1 802 803 + 536 1 802 804 + 537 1 805 806 + 538 1 805 807 + 539 1 808 809 + 540 1 808 810 + 541 1 811 812 + 542 1 811 813 + 543 1 814 815 + 544 1 814 816 + 545 1 817 818 + 546 1 817 819 + 547 1 820 821 + 548 1 820 822 + 549 1 823 824 + 550 1 823 825 + 551 1 826 827 + 552 1 826 828 + 553 1 829 830 + 554 1 829 831 + 555 1 832 833 + 556 1 832 834 + 557 1 835 836 + 558 1 835 837 + 559 1 838 839 + 560 1 838 840 + 561 1 841 842 + 562 1 841 843 + 563 1 844 845 + 564 1 844 846 + 565 1 847 848 + 566 1 847 849 + 567 1 850 851 + 568 1 850 852 + 569 1 853 854 + 570 1 853 855 + 571 1 856 857 + 572 1 856 858 + 573 1 859 860 + 574 1 859 861 + 575 1 862 863 + 576 1 862 864 + 577 1 865 866 + 578 1 865 867 + 579 1 868 869 + 580 1 868 870 + 581 1 871 872 + 582 1 871 873 + 583 1 874 875 + 584 1 874 876 + 585 1 877 878 + 586 1 877 879 + 587 1 880 881 + 588 1 880 882 + 589 1 883 884 + 590 1 883 885 + 591 1 886 887 + 592 1 886 888 + 593 1 889 890 + 594 1 889 891 + 595 1 892 893 + 596 1 892 894 + 597 1 895 896 + 598 1 895 897 + 599 1 898 899 + 600 1 898 900 + 601 1 901 902 + 602 1 901 903 + 603 1 904 905 + 604 1 904 906 + 605 1 907 908 + 606 1 907 909 + 607 1 910 911 + 608 1 910 912 + 609 1 913 914 + 610 1 913 915 + 611 1 916 917 + 612 1 916 918 + 613 1 919 920 + 614 1 919 921 + 615 1 922 923 + 616 1 922 924 + 617 1 925 926 + 618 1 925 927 + 619 1 928 929 + 620 1 928 930 + 621 1 931 932 + 622 1 931 933 + 623 1 934 935 + 624 1 934 936 + 625 1 937 938 + 626 1 937 939 + 627 1 940 941 + 628 1 940 942 + 629 1 943 944 + 630 1 943 945 + 631 1 946 947 + 632 1 946 948 + 633 1 949 950 + 634 1 949 951 + 635 1 952 953 + 636 1 952 954 + 637 1 955 956 + 638 1 955 957 + 639 1 958 959 + 640 1 958 960 + 641 1 961 962 + 642 1 961 963 + 643 1 964 965 + 644 1 964 966 + 645 1 967 968 + 646 1 967 969 + 647 1 970 971 + 648 1 970 972 + 649 1 973 974 + 650 1 973 975 + 651 1 976 977 + 652 1 976 978 + 653 1 979 980 + 654 1 979 981 + 655 1 982 983 + 656 1 982 984 + 657 1 985 986 + 658 1 985 987 + 659 1 988 989 + 660 1 988 990 + 661 1 991 992 + 662 1 991 993 + 663 1 994 995 + 664 1 994 996 + 665 1 997 998 + 666 1 997 999 + 667 1 1000 1001 + 668 1 1000 1002 + 669 1 1003 1004 + 670 1 1003 1005 + 671 1 1006 1007 + 672 1 1006 1008 + 673 1 1009 1010 + 674 1 1009 1011 + 675 1 1012 1013 + 676 1 1012 1014 + 677 1 1015 1016 + 678 1 1015 1017 + 679 1 1018 1019 + 680 1 1018 1020 + 681 1 1021 1022 + 682 1 1021 1023 + 683 1 1024 1025 + 684 1 1024 1026 + 685 1 1027 1028 + 686 1 1027 1029 + 687 1 1030 1031 + 688 1 1030 1032 + 689 1 1033 1034 + 690 1 1033 1035 + 691 1 1036 1037 + 692 1 1036 1038 + 693 1 1039 1040 + 694 1 1039 1041 + 695 1 1042 1043 + 696 1 1042 1044 + 697 1 1045 1046 + 698 1 1045 1047 + 699 1 1048 1049 + 700 1 1048 1050 + 701 1 1051 1052 + 702 1 1051 1053 + 703 1 1054 1055 + 704 1 1054 1056 + 705 1 1057 1058 + 706 1 1057 1059 + 707 1 1060 1061 + 708 1 1060 1062 + 709 1 1063 1064 + 710 1 1063 1065 + 711 1 1066 1067 + 712 1 1066 1068 + 713 1 1069 1070 + 714 1 1069 1071 + 715 1 1072 1073 + 716 1 1072 1074 + 717 1 1075 1076 + 718 1 1075 1077 + 719 1 1078 1079 + 720 1 1078 1080 + 721 1 1081 1082 + 722 1 1081 1083 + 723 1 1084 1085 + 724 1 1084 1086 + 725 1 1087 1088 + 726 1 1087 1089 + 727 1 1090 1091 + 728 1 1090 1092 + 729 1 1093 1094 + 730 1 1093 1095 + 731 1 1096 1097 + 732 1 1096 1098 + 733 1 1099 1100 + 734 1 1099 1101 + 735 1 1102 1103 + 736 1 1102 1104 + 737 1 1105 1106 + 738 1 1105 1107 + 739 1 1108 1109 + 740 1 1108 1110 + 741 1 1111 1112 + 742 1 1111 1113 + 743 1 1114 1115 + 744 1 1114 1116 + 745 1 1117 1118 + 746 1 1117 1119 + 747 1 1120 1121 + 748 1 1120 1122 + 749 1 1123 1124 + 750 1 1123 1125 + 751 1 1126 1127 + 752 1 1126 1128 + 753 1 1129 1130 + 754 1 1129 1131 + 755 1 1132 1133 + 756 1 1132 1134 + 757 1 1135 1136 + 758 1 1135 1137 + 759 1 1138 1139 + 760 1 1138 1140 + 761 1 1141 1142 + 762 1 1141 1143 + 763 1 1144 1145 + 764 1 1144 1146 + 765 1 1147 1148 + 766 1 1147 1149 + 767 1 1150 1151 + 768 1 1150 1152 + 769 1 1153 1154 + 770 1 1153 1155 + 771 1 1156 1157 + 772 1 1156 1158 + 773 1 1159 1160 + 774 1 1159 1161 + 775 1 1162 1163 + 776 1 1162 1164 + 777 1 1165 1166 + 778 1 1165 1167 + 779 1 1168 1169 + 780 1 1168 1170 + 781 1 1171 1172 + 782 1 1171 1173 + 783 1 1174 1175 + 784 1 1174 1176 + 785 1 1177 1178 + 786 1 1177 1179 + 787 1 1180 1181 + 788 1 1180 1182 + 789 1 1183 1184 + 790 1 1183 1185 + 791 1 1186 1187 + 792 1 1186 1188 + 793 1 1189 1190 + 794 1 1189 1191 + 795 1 1192 1193 + 796 1 1192 1194 + 797 1 1195 1196 + 798 1 1195 1197 + 799 1 1198 1199 + 800 1 1198 1200 + 801 1 1201 1202 + 802 1 1201 1203 + 803 1 1204 1205 + 804 1 1204 1206 + 805 1 1207 1208 + 806 1 1207 1209 + 807 1 1210 1211 + 808 1 1210 1212 + 809 1 1213 1214 + 810 1 1213 1215 + 811 1 1216 1217 + 812 1 1216 1218 + 813 1 1219 1220 + 814 1 1219 1221 + 815 1 1222 1223 + 816 1 1222 1224 + 817 1 1225 1226 + 818 1 1225 1227 + 819 1 1228 1229 + 820 1 1228 1230 + 821 1 1231 1232 + 822 1 1231 1233 + 823 1 1234 1235 + 824 1 1234 1236 + 825 1 1237 1238 + 826 1 1237 1239 + 827 1 1240 1241 + 828 1 1240 1242 + 829 1 1243 1244 + 830 1 1243 1245 + 831 1 1246 1247 + 832 1 1246 1248 + 833 1 1249 1250 + 834 1 1249 1251 + 835 1 1252 1253 + 836 1 1252 1254 + 837 1 1255 1256 + 838 1 1255 1257 + 839 1 1258 1259 + 840 1 1258 1260 + 841 1 1261 1262 + 842 1 1261 1263 + 843 1 1264 1265 + 844 1 1264 1266 + 845 1 1267 1268 + 846 1 1267 1269 + 847 1 1270 1271 + 848 1 1270 1272 + 849 1 1273 1274 + 850 1 1273 1275 + 851 1 1276 1277 + 852 1 1276 1278 + 853 1 1279 1280 + 854 1 1279 1281 + 855 1 1282 1283 + 856 1 1282 1284 + 857 1 1285 1286 + 858 1 1285 1287 + 859 1 1288 1289 + 860 1 1288 1290 + 861 1 1291 1292 + 862 1 1291 1293 + 863 1 1294 1295 + 864 1 1294 1296 + 865 1 1297 1298 + 866 1 1297 1299 + 867 1 1300 1301 + 868 1 1300 1302 + 869 1 1303 1304 + 870 1 1303 1305 + 871 1 1306 1307 + 872 1 1306 1308 + 873 1 1309 1310 + 874 1 1309 1311 + 875 1 1312 1313 + 876 1 1312 1314 + 877 1 1315 1316 + 878 1 1315 1317 + 879 1 1318 1319 + 880 1 1318 1320 + 881 1 1321 1322 + 882 1 1321 1323 + 883 1 1324 1325 + 884 1 1324 1326 + 885 1 1327 1328 + 886 1 1327 1329 + 887 1 1330 1331 + 888 1 1330 1332 + 889 1 1333 1334 + 890 1 1333 1335 + 891 1 1336 1337 + 892 1 1336 1338 + 893 1 1339 1340 + 894 1 1339 1341 + 895 1 1342 1343 + 896 1 1342 1344 + 897 1 1345 1346 + 898 1 1345 1347 + 899 1 1348 1349 + 900 1 1348 1350 + 901 1 1351 1352 + 902 1 1351 1353 + 903 1 1354 1355 + 904 1 1354 1356 + 905 1 1357 1358 + 906 1 1357 1359 + 907 1 1360 1361 + 908 1 1360 1362 + 909 1 1363 1364 + 910 1 1363 1365 + 911 1 1366 1367 + 912 1 1366 1368 + 913 1 1369 1370 + 914 1 1369 1371 + 915 1 1372 1373 + 916 1 1372 1374 + 917 1 1375 1376 + 918 1 1375 1377 + 919 1 1378 1379 + 920 1 1378 1380 + 921 1 1381 1382 + 922 1 1381 1383 + 923 1 1384 1385 + 924 1 1384 1386 + 925 1 1387 1388 + 926 1 1387 1389 + 927 1 1390 1391 + 928 1 1390 1392 + 929 1 1393 1394 + 930 1 1393 1395 + 931 1 1396 1397 + 932 1 1396 1398 + 933 1 1399 1400 + 934 1 1399 1401 + 935 1 1402 1403 + 936 1 1402 1404 + 937 1 1405 1406 + 938 1 1405 1407 + 939 1 1408 1409 + 940 1 1408 1410 + 941 1 1411 1412 + 942 1 1411 1413 + 943 1 1414 1415 + 944 1 1414 1416 + 945 1 1417 1418 + 946 1 1417 1419 + 947 1 1420 1421 + 948 1 1420 1422 + 949 1 1423 1424 + 950 1 1423 1425 + 951 1 1426 1427 + 952 1 1426 1428 + 953 1 1429 1430 + 954 1 1429 1431 + 955 1 1432 1433 + 956 1 1432 1434 + 957 1 1435 1436 + 958 1 1435 1437 + 959 1 1438 1439 + 960 1 1438 1440 + 961 1 1441 1442 + 962 1 1441 1443 + 963 1 1444 1445 + 964 1 1444 1446 + 965 1 1447 1448 + 966 1 1447 1449 + 967 1 1450 1451 + 968 1 1450 1452 + 969 1 1453 1454 + 970 1 1453 1455 + 971 1 1456 1457 + 972 1 1456 1458 + 973 1 1459 1460 + 974 1 1459 1461 + 975 1 1462 1463 + 976 1 1462 1464 + 977 1 1465 1466 + 978 1 1465 1467 + 979 1 1468 1469 + 980 1 1468 1470 + 981 1 1471 1472 + 982 1 1471 1473 + 983 1 1474 1475 + 984 1 1474 1476 + 985 1 1477 1478 + 986 1 1477 1479 + 987 1 1480 1481 + 988 1 1480 1482 + 989 1 1483 1484 + 990 1 1483 1485 + 991 1 1486 1487 + 992 1 1486 1488 + 993 1 1489 1490 + 994 1 1489 1491 + 995 1 1492 1493 + 996 1 1492 1494 + 997 1 1495 1496 + 998 1 1495 1497 + 999 1 1498 1499 + 1000 1 1498 1500 + 1001 1 1501 1502 + 1002 1 1501 1503 + 1003 1 1504 1505 + 1004 1 1504 1506 + 1005 1 1507 1508 + 1006 1 1507 1509 + 1007 1 1510 1511 + 1008 1 1510 1512 + 1009 1 1513 1514 + 1010 1 1513 1515 + 1011 1 1516 1517 + 1012 1 1516 1518 + 1013 1 1519 1520 + 1014 1 1519 1521 + 1015 1 1522 1523 + 1016 1 1522 1524 + 1017 1 1525 1526 + 1018 1 1525 1527 + 1019 1 1528 1529 + 1020 1 1528 1530 + 1021 1 1531 1532 + 1022 1 1531 1533 + 1023 1 1534 1535 + 1024 1 1534 1536 + 1025 1 1537 1538 + 1026 1 1537 1539 + 1027 1 1540 1541 + 1028 1 1540 1542 + 1029 1 1543 1544 + 1030 1 1543 1545 + 1031 1 1546 1547 + 1032 1 1546 1548 + 1033 1 1549 1550 + 1034 1 1549 1551 + 1035 1 1552 1553 + 1036 1 1552 1554 + 1037 1 1555 1556 + 1038 1 1555 1557 + 1039 1 1558 1559 + 1040 1 1558 1560 + 1041 1 1561 1562 + 1042 1 1561 1563 + 1043 1 1564 1565 + 1044 1 1564 1566 + 1045 1 1567 1568 + 1046 1 1567 1569 + 1047 1 1570 1571 + 1048 1 1570 1572 + 1049 1 1573 1574 + 1050 1 1573 1575 + 1051 1 1576 1577 + 1052 1 1576 1578 + 1053 1 1579 1580 + 1054 1 1579 1581 + 1055 1 1582 1583 + 1056 1 1582 1584 + 1057 1 1585 1586 + 1058 1 1585 1587 + 1059 1 1588 1589 + 1060 1 1588 1590 + 1061 1 1591 1592 + 1062 1 1591 1593 + 1063 1 1594 1595 + 1064 1 1594 1596 + 1065 1 1597 1598 + 1066 1 1597 1599 + 1067 1 1600 1601 + 1068 1 1600 1602 + 1069 1 1603 1604 + 1070 1 1603 1605 + 1071 1 1606 1607 + 1072 1 1606 1608 + 1073 1 1609 1610 + 1074 1 1609 1611 + 1075 1 1612 1613 + 1076 1 1612 1614 + 1077 1 1615 1616 + 1078 1 1615 1617 + 1079 1 1618 1619 + 1080 1 1618 1620 + 1081 1 1621 1622 + 1082 1 1621 1623 + 1083 1 1624 1625 + 1084 1 1624 1626 + 1085 1 1627 1628 + 1086 1 1627 1629 + 1087 1 1630 1631 + 1088 1 1630 1632 + 1089 1 1633 1634 + 1090 1 1633 1635 + 1091 1 1636 1637 + 1092 1 1636 1638 + 1093 1 1639 1640 + 1094 1 1639 1641 + 1095 1 1642 1643 + 1096 1 1642 1644 + 1097 1 1645 1646 + 1098 1 1645 1647 + 1099 1 1648 1649 + 1100 1 1648 1650 + 1101 1 1651 1652 + 1102 1 1651 1653 + 1103 1 1654 1655 + 1104 1 1654 1656 + 1105 1 1657 1658 + 1106 1 1657 1659 + 1107 1 1660 1661 + 1108 1 1660 1662 + 1109 1 1663 1664 + 1110 1 1663 1665 + 1111 1 1666 1667 + 1112 1 1666 1668 + 1113 1 1669 1670 + 1114 1 1669 1671 + 1115 1 1672 1673 + 1116 1 1672 1674 + 1117 1 1675 1676 + 1118 1 1675 1677 + 1119 1 1678 1679 + 1120 1 1678 1680 + 1121 1 1681 1682 + 1122 1 1681 1683 + 1123 1 1684 1685 + 1124 1 1684 1686 + 1125 1 1687 1688 + 1126 1 1687 1689 + 1127 1 1690 1691 + 1128 1 1690 1692 + 1129 1 1693 1694 + 1130 1 1693 1695 + 1131 1 1696 1697 + 1132 1 1696 1698 + 1133 1 1699 1700 + 1134 1 1699 1701 + 1135 1 1702 1703 + 1136 1 1702 1704 + 1137 1 1705 1706 + 1138 1 1705 1707 + 1139 1 1708 1709 + 1140 1 1708 1710 + 1141 1 1711 1712 + 1142 1 1711 1713 + 1143 1 1714 1715 + 1144 1 1714 1716 + 1145 1 1717 1718 + 1146 1 1717 1719 + 1147 1 1720 1721 + 1148 1 1720 1722 + 1149 1 1723 1724 + 1150 1 1723 1725 + 1151 1 1726 1727 + 1152 1 1726 1728 + 1153 1 1729 1730 + 1154 1 1729 1731 + 1155 1 1732 1733 + 1156 1 1732 1734 + 1157 1 1735 1736 + 1158 1 1735 1737 + 1159 1 1738 1739 + 1160 1 1738 1740 + 1161 1 1741 1742 + 1162 1 1741 1743 + 1163 1 1744 1745 + 1164 1 1744 1746 + 1165 1 1747 1748 + 1166 1 1747 1749 + 1167 1 1750 1751 + 1168 1 1750 1752 + 1169 1 1753 1754 + 1170 1 1753 1755 + 1171 1 1756 1757 + 1172 1 1756 1758 + 1173 1 1759 1760 + 1174 1 1759 1761 + 1175 1 1762 1763 + 1176 1 1762 1764 + 1177 1 1765 1766 + 1178 1 1765 1767 + 1179 1 1768 1769 + 1180 1 1768 1770 + 1181 1 1771 1772 + 1182 1 1771 1773 + 1183 1 1774 1775 + 1184 1 1774 1776 + 1185 1 1777 1778 + 1186 1 1777 1779 + 1187 1 1780 1781 + 1188 1 1780 1782 + 1189 1 1783 1784 + 1190 1 1783 1785 + 1191 1 1786 1787 + 1192 1 1786 1788 + 1193 1 1789 1790 + 1194 1 1789 1791 + 1195 1 1792 1793 + 1196 1 1792 1794 + 1197 1 1795 1796 + 1198 1 1795 1797 + 1199 1 1798 1799 + 1200 1 1798 1800 + 1201 1 1801 1802 + 1202 1 1801 1803 + 1203 1 1804 1805 + 1204 1 1804 1806 + 1205 1 1807 1808 + 1206 1 1807 1809 + 1207 1 1810 1811 + 1208 1 1810 1812 + 1209 1 1813 1814 + 1210 1 1813 1815 + 1211 1 1816 1817 + 1212 1 1816 1818 + 1213 1 1819 1820 + 1214 1 1819 1821 + 1215 1 1822 1823 + 1216 1 1822 1824 + 1217 1 1825 1826 + 1218 1 1825 1827 + 1219 1 1828 1829 + 1220 1 1828 1830 + 1221 1 1831 1832 + 1222 1 1831 1833 + 1223 1 1834 1835 + 1224 1 1834 1836 + 1225 1 1837 1838 + 1226 1 1837 1839 + 1227 1 1840 1841 + 1228 1 1840 1842 + 1229 1 1843 1844 + 1230 1 1843 1845 + 1231 1 1846 1847 + 1232 1 1846 1848 + 1233 1 1849 1850 + 1234 1 1849 1851 + 1235 1 1852 1853 + 1236 1 1852 1854 + 1237 1 1855 1856 + 1238 1 1855 1857 + 1239 1 1858 1859 + 1240 1 1858 1860 + 1241 1 1861 1862 + 1242 1 1861 1863 + 1243 1 1864 1865 + 1244 1 1864 1866 + 1245 1 1867 1868 + 1246 1 1867 1869 + 1247 1 1870 1871 + 1248 1 1870 1872 + 1249 1 1873 1874 + 1250 1 1873 1875 + 1251 1 1876 1877 + 1252 1 1876 1878 + 1253 1 1879 1880 + 1254 1 1879 1881 + 1255 1 1882 1883 + 1256 1 1882 1884 + 1257 1 1885 1886 + 1258 1 1885 1887 + 1259 1 1888 1889 + 1260 1 1888 1890 + 1261 1 1891 1892 + 1262 1 1891 1893 + 1263 1 1894 1895 + 1264 1 1894 1896 + 1265 1 1897 1898 + 1266 1 1897 1899 + 1267 1 1900 1901 + 1268 1 1900 1902 + 1269 1 1903 1904 + 1270 1 1903 1905 + 1271 1 1906 1907 + 1272 1 1906 1908 + 1273 1 1909 1910 + 1274 1 1909 1911 + 1275 1 1912 1913 + 1276 1 1912 1914 + 1277 1 1915 1916 + 1278 1 1915 1917 + 1279 1 1918 1919 + 1280 1 1918 1920 + 1281 1 1921 1922 + 1282 1 1921 1923 + 1283 1 1924 1925 + 1284 1 1924 1926 + 1285 1 1927 1928 + 1286 1 1927 1929 + 1287 1 1930 1931 + 1288 1 1930 1932 + 1289 1 1933 1934 + 1290 1 1933 1935 + 1291 1 1936 1937 + 1292 1 1936 1938 + 1293 1 1939 1940 + 1294 1 1939 1941 + 1295 1 1942 1943 + 1296 1 1942 1944 + 1297 1 1945 1946 + 1298 1 1945 1947 + 1299 1 1948 1949 + 1300 1 1948 1950 + 1301 1 1951 1952 + 1302 1 1951 1953 + 1303 1 1954 1955 + 1304 1 1954 1956 + 1305 1 1957 1958 + 1306 1 1957 1959 + 1307 1 1960 1961 + 1308 1 1960 1962 + 1309 1 1963 1964 + 1310 1 1963 1965 + 1311 1 1966 1967 + 1312 1 1966 1968 + 1313 1 1969 1970 + 1314 1 1969 1971 + 1315 1 1972 1973 + 1316 1 1972 1974 + 1317 1 1975 1976 + 1318 1 1975 1977 + 1319 1 1978 1979 + 1320 1 1978 1980 + 1321 1 1981 1982 + 1322 1 1981 1983 + 1323 1 1984 1985 + 1324 1 1984 1986 + 1325 1 1987 1988 + 1326 1 1987 1989 + 1327 1 1990 1991 + 1328 1 1990 1992 + 1329 1 1993 1994 + 1330 1 1993 1995 + 1331 1 1996 1997 + 1332 1 1996 1998 + 1333 1 1999 2000 + 1334 1 1999 2001 + 1335 1 2002 2003 + 1336 1 2002 2004 + 1337 1 2005 2006 + 1338 1 2005 2007 + 1339 1 2008 2009 + 1340 1 2008 2010 + 1341 1 2011 2012 + 1342 1 2011 2013 + 1343 1 2014 2015 + 1344 1 2014 2016 + 1345 1 2017 2018 + 1346 1 2017 2019 + 1347 1 2020 2021 + 1348 1 2020 2022 + 1349 1 2023 2024 + 1350 1 2023 2025 + 1351 1 2026 2027 + 1352 1 2026 2028 + 1353 1 2029 2030 + 1354 1 2029 2031 + 1355 1 2032 2033 + 1356 1 2032 2034 + 1357 1 2035 2036 + 1358 1 2035 2037 + 1359 1 2038 2039 + 1360 1 2038 2040 + 1361 1 2041 2042 + 1362 1 2041 2043 + 1363 1 2044 2045 + 1364 1 2044 2046 + 1365 1 2047 2048 + 1366 1 2047 2049 + 1367 1 2050 2051 + 1368 1 2050 2052 + 1369 1 2053 2054 + 1370 1 2053 2055 + 1371 1 2056 2057 + 1372 1 2056 2058 + 1373 1 2059 2060 + 1374 1 2059 2061 + 1375 1 2062 2063 + 1376 1 2062 2064 + 1377 1 2065 2066 + 1378 1 2065 2067 + 1379 1 2068 2069 + 1380 1 2068 2070 + 1381 1 2071 2072 + 1382 1 2071 2073 + 1383 1 2074 2075 + 1384 1 2074 2076 + 1385 1 2077 2078 + 1386 1 2077 2079 + 1387 1 2080 2081 + 1388 1 2080 2082 + 1389 1 2083 2084 + 1390 1 2083 2085 + 1391 1 2086 2087 + 1392 1 2086 2088 + 1393 1 2089 2090 + 1394 1 2089 2091 + 1395 1 2092 2093 + 1396 1 2092 2094 + 1397 1 2095 2096 + 1398 1 2095 2097 + 1399 1 2098 2099 + 1400 1 2098 2100 + 1401 1 2101 2102 + 1402 1 2101 2103 + 1403 1 2104 2105 + 1404 1 2104 2106 + 1405 1 2107 2108 + 1406 1 2107 2109 + 1407 1 2110 2111 + 1408 1 2110 2112 + 1409 1 2113 2114 + 1410 1 2113 2115 + 1411 1 2116 2117 + 1412 1 2116 2118 + 1413 1 2119 2120 + 1414 1 2119 2121 + 1415 1 2122 2123 + 1416 1 2122 2124 + 1417 1 2125 2126 + 1418 1 2125 2127 + 1419 1 2128 2129 + 1420 1 2128 2130 + 1421 1 2131 2132 + 1422 1 2131 2133 + 1423 1 2134 2135 + 1424 1 2134 2136 + 1425 1 2137 2138 + 1426 1 2137 2139 + 1427 1 2140 2141 + 1428 1 2140 2142 + 1429 1 2143 2144 + 1430 1 2143 2145 + 1431 1 2146 2147 + 1432 1 2146 2148 + 1433 1 2149 2150 + 1434 1 2149 2151 + 1435 1 2152 2153 + 1436 1 2152 2154 + 1437 1 2155 2156 + 1438 1 2155 2157 + 1439 1 2158 2159 + 1440 1 2158 2160 + 1441 1 2161 2162 + 1442 1 2161 2163 + 1443 1 2164 2165 + 1444 1 2164 2166 + 1445 1 2167 2168 + 1446 1 2167 2169 + 1447 1 2170 2171 + 1448 1 2170 2172 + 1449 1 2173 2174 + 1450 1 2173 2175 + 1451 1 2176 2177 + 1452 1 2176 2178 + 1453 1 2179 2180 + 1454 1 2179 2181 + 1455 1 2182 2183 + 1456 1 2182 2184 + 1457 1 2185 2186 + 1458 1 2185 2187 + 1459 1 2188 2189 + 1460 1 2188 2190 + 1461 1 2191 2192 + 1462 1 2191 2193 + 1463 1 2194 2195 + 1464 1 2194 2196 + 1465 1 2197 2198 + 1466 1 2197 2199 + 1467 1 2200 2201 + 1468 1 2200 2202 + 1469 1 2203 2204 + 1470 1 2203 2205 + 1471 1 2206 2207 + 1472 1 2206 2208 + 1473 1 2209 2210 + 1474 1 2209 2211 + 1475 1 2212 2213 + 1476 1 2212 2214 + 1477 1 2215 2216 + 1478 1 2215 2217 + 1479 1 2218 2219 + 1480 1 2218 2220 + 1481 1 2221 2222 + 1482 1 2221 2223 + 1483 1 2224 2225 + 1484 1 2224 2226 + 1485 1 2227 2228 + 1486 1 2227 2229 + 1487 1 2230 2231 + 1488 1 2230 2232 + 1489 1 2233 2234 + 1490 1 2233 2235 + 1491 1 2236 2237 + 1492 1 2236 2238 + 1493 1 2239 2240 + 1494 1 2239 2241 + 1495 1 2242 2243 + 1496 1 2242 2244 + 1497 1 2245 2246 + 1498 1 2245 2247 + 1499 1 2248 2249 + 1500 1 2248 2250 + 1501 1 2251 2252 + 1502 1 2251 2253 + 1503 1 2254 2255 + 1504 1 2254 2256 + 1505 1 2257 2258 + 1506 1 2257 2259 + 1507 1 2260 2261 + 1508 1 2260 2262 + 1509 1 2263 2264 + 1510 1 2263 2265 + 1511 1 2266 2267 + 1512 1 2266 2268 + 1513 1 2269 2270 + 1514 1 2269 2271 + 1515 1 2272 2273 + 1516 1 2272 2274 + 1517 1 2275 2276 + 1518 1 2275 2277 + 1519 1 2278 2279 + 1520 1 2278 2280 + 1521 1 2281 2282 + 1522 1 2281 2283 + 1523 1 2284 2285 + 1524 1 2284 2286 + 1525 1 2287 2288 + 1526 1 2287 2289 + 1527 1 2290 2291 + 1528 1 2290 2292 + 1529 1 2293 2294 + 1530 1 2293 2295 + 1531 1 2296 2297 + 1532 1 2296 2298 + 1533 1 2299 2300 + 1534 1 2299 2301 + 1535 1 2302 2303 + 1536 1 2302 2304 + 1537 1 2305 2306 + 1538 1 2305 2307 + 1539 1 2308 2309 + 1540 1 2308 2310 + 1541 1 2311 2312 + 1542 1 2311 2313 + 1543 1 2314 2315 + 1544 1 2314 2316 + 1545 1 2317 2318 + 1546 1 2317 2319 + 1547 1 2320 2321 + 1548 1 2320 2322 + 1549 1 2323 2324 + 1550 1 2323 2325 + 1551 1 2326 2327 + 1552 1 2326 2328 + 1553 1 2329 2330 + 1554 1 2329 2331 + 1555 1 2332 2333 + 1556 1 2332 2334 + 1557 1 2335 2336 + 1558 1 2335 2337 + 1559 1 2338 2339 + 1560 1 2338 2340 + 1561 1 2341 2342 + 1562 1 2341 2343 + 1563 1 2344 2345 + 1564 1 2344 2346 + 1565 1 2347 2348 + 1566 1 2347 2349 + 1567 1 2350 2351 + 1568 1 2350 2352 + 1569 1 2353 2354 + 1570 1 2353 2355 + 1571 1 2356 2357 + 1572 1 2356 2358 + 1573 1 2359 2360 + 1574 1 2359 2361 + 1575 1 2362 2363 + 1576 1 2362 2364 + 1577 1 2365 2366 + 1578 1 2365 2367 + 1579 1 2368 2369 + 1580 1 2368 2370 + 1581 1 2371 2372 + 1582 1 2371 2373 + 1583 1 2374 2375 + 1584 1 2374 2376 + 1585 1 2377 2378 + 1586 1 2377 2379 + 1587 1 2380 2381 + 1588 1 2380 2382 + 1589 1 2383 2384 + 1590 1 2383 2385 + 1591 1 2386 2387 + 1592 1 2386 2388 + 1593 1 2389 2390 + 1594 1 2389 2391 + 1595 1 2392 2393 + 1596 1 2392 2394 + 1597 1 2395 2396 + 1598 1 2395 2397 + 1599 1 2398 2399 + 1600 1 2398 2400 + 1601 1 2401 2402 + 1602 1 2401 2403 + 1603 1 2404 2405 + 1604 1 2404 2406 + 1605 1 2407 2408 + 1606 1 2407 2409 + 1607 1 2410 2411 + 1608 1 2410 2412 + 1609 1 2413 2414 + 1610 1 2413 2415 + 1611 1 2416 2417 + 1612 1 2416 2418 + 1613 1 2419 2420 + 1614 1 2419 2421 + 1615 1 2422 2423 + 1616 1 2422 2424 + 1617 1 2425 2426 + 1618 1 2425 2427 + 1619 1 2428 2429 + 1620 1 2428 2430 + 1621 1 2431 2432 + 1622 1 2431 2433 + 1623 1 2434 2435 + 1624 1 2434 2436 + 1625 1 2437 2438 + 1626 1 2437 2439 + 1627 1 2440 2441 + 1628 1 2440 2442 + 1629 1 2443 2444 + 1630 1 2443 2445 + 1631 1 2446 2447 + 1632 1 2446 2448 + 1633 1 2449 2450 + 1634 1 2449 2451 + 1635 1 2452 2453 + 1636 1 2452 2454 + 1637 1 2455 2456 + 1638 1 2455 2457 + 1639 1 2458 2459 + 1640 1 2458 2460 + 1641 1 2461 2462 + 1642 1 2461 2463 + 1643 1 2464 2465 + 1644 1 2464 2466 + 1645 1 2467 2468 + 1646 1 2467 2469 + 1647 1 2470 2471 + 1648 1 2470 2472 + 1649 1 2473 2474 + 1650 1 2473 2475 + 1651 1 2476 2477 + 1652 1 2476 2478 + 1653 1 2479 2480 + 1654 1 2479 2481 + 1655 1 2482 2483 + 1656 1 2482 2484 + 1657 1 2485 2486 + 1658 1 2485 2487 + 1659 1 2488 2489 + 1660 1 2488 2490 + 1661 1 2491 2492 + 1662 1 2491 2493 + 1663 1 2494 2495 + 1664 1 2494 2496 + 1665 1 2497 2498 + 1666 1 2497 2499 + 1667 1 2500 2501 + 1668 1 2500 2502 + 1669 1 2503 2504 + 1670 1 2503 2505 + 1671 1 2506 2507 + 1672 1 2506 2508 + 1673 1 2509 2510 + 1674 1 2509 2511 + 1675 1 2512 2513 + 1676 1 2512 2514 + 1677 1 2515 2516 + 1678 1 2515 2517 + 1679 1 2518 2519 + 1680 1 2518 2520 + 1681 1 2521 2522 + 1682 1 2521 2523 + 1683 1 2524 2525 + 1684 1 2524 2526 + 1685 1 2527 2528 + 1686 1 2527 2529 + 1687 1 2530 2531 + 1688 1 2530 2532 + 1689 1 2533 2534 + 1690 1 2533 2535 + 1691 1 2536 2537 + 1692 1 2536 2538 + 1693 1 2539 2540 + 1694 1 2539 2541 + 1695 1 2542 2543 + 1696 1 2542 2544 + 1697 1 2545 2546 + 1698 1 2545 2547 + 1699 1 2548 2549 + 1700 1 2548 2550 + 1701 1 2551 2552 + 1702 1 2551 2553 + 1703 1 2554 2555 + 1704 1 2554 2556 + 1705 1 2557 2558 + 1706 1 2557 2559 + 1707 1 2560 2561 + 1708 1 2560 2562 + 1709 1 2563 2564 + 1710 1 2563 2565 + 1711 1 2566 2567 + 1712 1 2566 2568 + 1713 1 2569 2570 + 1714 1 2569 2571 + 1715 1 2572 2573 + 1716 1 2572 2574 + 1717 1 2575 2576 + 1718 1 2575 2577 + 1719 1 2578 2579 + 1720 1 2578 2580 + 1721 1 2581 2582 + 1722 1 2581 2583 + 1723 1 2584 2585 + 1724 1 2584 2586 + 1725 1 2587 2588 + 1726 1 2587 2589 + 1727 1 2590 2591 + 1728 1 2590 2592 + 1729 1 2593 2594 + 1730 1 2593 2595 + 1731 1 2596 2597 + 1732 1 2596 2598 + 1733 1 2599 2600 + 1734 1 2599 2601 + 1735 1 2602 2603 + 1736 1 2602 2604 + 1737 1 2605 2606 + 1738 1 2605 2607 + 1739 1 2608 2609 + 1740 1 2608 2610 + 1741 1 2611 2612 + 1742 1 2611 2613 + 1743 1 2614 2615 + 1744 1 2614 2616 + 1745 1 2617 2618 + 1746 1 2617 2619 + 1747 1 2620 2621 + 1748 1 2620 2622 + 1749 1 2623 2624 + 1750 1 2623 2625 + 1751 1 2626 2627 + 1752 1 2626 2628 + 1753 1 2629 2630 + 1754 1 2629 2631 + 1755 1 2632 2633 + 1756 1 2632 2634 + 1757 1 2635 2636 + 1758 1 2635 2637 + 1759 1 2638 2639 + 1760 1 2638 2640 + 1761 1 2641 2642 + 1762 1 2641 2643 + 1763 1 2644 2645 + 1764 1 2644 2646 + 1765 1 2647 2648 + 1766 1 2647 2649 + 1767 1 2650 2651 + 1768 1 2650 2652 + 1769 1 2653 2654 + 1770 1 2653 2655 + 1771 1 2656 2657 + 1772 1 2656 2658 + 1773 1 2659 2660 + 1774 1 2659 2661 + 1775 1 2662 2663 + 1776 1 2662 2664 + 1777 1 2665 2666 + 1778 1 2665 2667 + 1779 1 2668 2669 + 1780 1 2668 2670 + 1781 1 2671 2672 + 1782 1 2671 2673 + 1783 1 2674 2675 + 1784 1 2674 2676 + 1785 1 2677 2678 + 1786 1 2677 2679 + 1787 1 2680 2681 + 1788 1 2680 2682 + 1789 1 2683 2684 + 1790 1 2683 2685 + 1791 1 2686 2687 + 1792 1 2686 2688 + 1793 1 2689 2690 + 1794 1 2689 2691 + 1795 1 2692 2693 + 1796 1 2692 2694 + 1797 1 2695 2696 + 1798 1 2695 2697 + 1799 1 2698 2699 + 1800 1 2698 2700 + 1801 1 2701 2702 + 1802 1 2701 2703 + 1803 1 2704 2705 + 1804 1 2704 2706 + 1805 1 2707 2708 + 1806 1 2707 2709 + 1807 1 2710 2711 + 1808 1 2710 2712 + 1809 1 2713 2714 + 1810 1 2713 2715 + 1811 1 2716 2717 + 1812 1 2716 2718 + 1813 1 2719 2720 + 1814 1 2719 2721 + 1815 1 2722 2723 + 1816 1 2722 2724 + 1817 1 2725 2726 + 1818 1 2725 2727 + 1819 1 2728 2729 + 1820 1 2728 2730 + 1821 1 2731 2732 + 1822 1 2731 2733 + 1823 1 2734 2735 + 1824 1 2734 2736 + 1825 1 2737 2738 + 1826 1 2737 2739 + 1827 1 2740 2741 + 1828 1 2740 2742 + 1829 1 2743 2744 + 1830 1 2743 2745 + 1831 1 2746 2747 + 1832 1 2746 2748 + 1833 1 2749 2750 + 1834 1 2749 2751 + 1835 1 2752 2753 + 1836 1 2752 2754 + 1837 1 2755 2756 + 1838 1 2755 2757 + 1839 1 2758 2759 + 1840 1 2758 2760 + 1841 1 2761 2762 + 1842 1 2761 2763 + 1843 1 2764 2765 + 1844 1 2764 2766 + 1845 1 2767 2768 + 1846 1 2767 2769 + 1847 1 2770 2771 + 1848 1 2770 2772 + 1849 1 2773 2774 + 1850 1 2773 2775 + 1851 1 2776 2777 + 1852 1 2776 2778 + 1853 1 2779 2780 + 1854 1 2779 2781 + 1855 1 2782 2783 + 1856 1 2782 2784 + 1857 1 2785 2786 + 1858 1 2785 2787 + 1859 1 2788 2789 + 1860 1 2788 2790 + 1861 1 2791 2792 + 1862 1 2791 2793 + 1863 1 2794 2795 + 1864 1 2794 2796 + 1865 1 2797 2798 + 1866 1 2797 2799 + 1867 1 2800 2801 + 1868 1 2800 2802 + 1869 1 2803 2804 + 1870 1 2803 2805 + 1871 1 2806 2807 + 1872 1 2806 2808 + 1873 1 2809 2810 + 1874 1 2809 2811 + 1875 1 2812 2813 + 1876 1 2812 2814 + 1877 1 2815 2816 + 1878 1 2815 2817 + 1879 1 2818 2819 + 1880 1 2818 2820 + 1881 1 2821 2822 + 1882 1 2821 2823 + 1883 1 2824 2825 + 1884 1 2824 2826 + 1885 1 2827 2828 + 1886 1 2827 2829 + 1887 1 2830 2831 + 1888 1 2830 2832 + 1889 1 2833 2834 + 1890 1 2833 2835 + 1891 1 2836 2837 + 1892 1 2836 2838 + 1893 1 2839 2840 + 1894 1 2839 2841 + 1895 1 2842 2843 + 1896 1 2842 2844 + 1897 1 2845 2846 + 1898 1 2845 2847 + 1899 1 2848 2849 + 1900 1 2848 2850 + 1901 1 2851 2852 + 1902 1 2851 2853 + 1903 1 2854 2855 + 1904 1 2854 2856 + 1905 1 2857 2858 + 1906 1 2857 2859 + 1907 1 2860 2861 + 1908 1 2860 2862 + 1909 1 2863 2864 + 1910 1 2863 2865 + 1911 1 2866 2867 + 1912 1 2866 2868 + 1913 1 2869 2870 + 1914 1 2869 2871 + 1915 1 2872 2873 + 1916 1 2872 2874 + 1917 1 2875 2876 + 1918 1 2875 2877 + 1919 1 2878 2879 + 1920 1 2878 2880 + 1921 1 2881 2882 + 1922 1 2881 2883 + 1923 1 2884 2885 + 1924 1 2884 2886 + 1925 1 2887 2888 + 1926 1 2887 2889 + 1927 1 2890 2891 + 1928 1 2890 2892 + 1929 1 2893 2894 + 1930 1 2893 2895 + 1931 1 2896 2897 + 1932 1 2896 2898 + 1933 1 2899 2900 + 1934 1 2899 2901 + 1935 1 2902 2903 + 1936 1 2902 2904 + 1937 1 2905 2906 + 1938 1 2905 2907 + 1939 1 2908 2909 + 1940 1 2908 2910 + 1941 1 2911 2912 + 1942 1 2911 2913 + 1943 1 2914 2915 + 1944 1 2914 2916 + 1945 1 2917 2918 + 1946 1 2917 2919 + 1947 1 2920 2921 + 1948 1 2920 2922 + 1949 1 2923 2924 + 1950 1 2923 2925 + 1951 1 2926 2927 + 1952 1 2926 2928 + 1953 1 2929 2930 + 1954 1 2929 2931 + 1955 1 2932 2933 + 1956 1 2932 2934 + 1957 1 2935 2936 + 1958 1 2935 2937 + 1959 1 2938 2939 + 1960 1 2938 2940 + 1961 1 2941 2942 + 1962 1 2941 2943 + 1963 1 2944 2945 + 1964 1 2944 2946 + 1965 1 2947 2948 + 1966 1 2947 2949 + 1967 1 2950 2951 + 1968 1 2950 2952 + 1969 1 2953 2954 + 1970 1 2953 2955 + 1971 1 2956 2957 + 1972 1 2956 2958 + 1973 1 2959 2960 + 1974 1 2959 2961 + 1975 1 2962 2963 + 1976 1 2962 2964 + 1977 1 2965 2966 + 1978 1 2965 2967 + 1979 1 2968 2969 + 1980 1 2968 2970 + 1981 1 2971 2972 + 1982 1 2971 2973 + 1983 1 2974 2975 + 1984 1 2974 2976 + 1985 1 2977 2978 + 1986 1 2977 2979 + 1987 1 2980 2981 + 1988 1 2980 2982 + 1989 1 2983 2984 + 1990 1 2983 2985 + 1991 1 2986 2987 + 1992 1 2986 2988 + 1993 1 2989 2990 + 1994 1 2989 2991 + 1995 1 2992 2993 + 1996 1 2992 2994 + 1997 1 2995 2996 + 1998 1 2995 2997 + 1999 1 2998 2999 + 2000 1 2998 3000 + 2001 1 3001 3002 + 2002 1 3001 3003 + 2003 1 3004 3005 + 2004 1 3004 3006 + 2005 1 3007 3008 + 2006 1 3007 3009 + 2007 1 3010 3011 + 2008 1 3010 3012 + 2009 1 3013 3014 + 2010 1 3013 3015 + 2011 1 3016 3017 + 2012 1 3016 3018 + 2013 1 3019 3020 + 2014 1 3019 3021 + 2015 1 3022 3023 + 2016 1 3022 3024 + 2017 1 3025 3026 + 2018 1 3025 3027 + 2019 1 3028 3029 + 2020 1 3028 3030 + 2021 1 3031 3032 + 2022 1 3031 3033 + 2023 1 3034 3035 + 2024 1 3034 3036 + 2025 1 3037 3038 + 2026 1 3037 3039 + 2027 1 3040 3041 + 2028 1 3040 3042 + 2029 1 3043 3044 + 2030 1 3043 3045 + 2031 1 3046 3047 + 2032 1 3046 3048 + 2033 1 3049 3050 + 2034 1 3049 3051 + 2035 1 3052 3053 + 2036 1 3052 3054 + 2037 1 3055 3056 + 2038 1 3055 3057 + 2039 1 3058 3059 + 2040 1 3058 3060 + 2041 1 3061 3062 + 2042 1 3061 3063 + 2043 1 3064 3065 + 2044 1 3064 3066 + 2045 1 3067 3068 + 2046 1 3067 3069 + 2047 1 3070 3071 + 2048 1 3070 3072 + 2049 1 3073 3074 + 2050 1 3073 3075 + 2051 1 3076 3077 + 2052 1 3076 3078 + 2053 1 3079 3080 + 2054 1 3079 3081 + 2055 1 3082 3083 + 2056 1 3082 3084 + 2057 1 3085 3086 + 2058 1 3085 3087 + 2059 1 3088 3089 + 2060 1 3088 3090 + 2061 1 3091 3092 + 2062 1 3091 3093 + 2063 1 3094 3095 + 2064 1 3094 3096 + 2065 1 3097 3098 + 2066 1 3097 3099 + 2067 1 3100 3101 + 2068 1 3100 3102 + 2069 1 3103 3104 + 2070 1 3103 3105 + 2071 1 3106 3107 + 2072 1 3106 3108 + 2073 1 3109 3110 + 2074 1 3109 3111 + 2075 1 3112 3113 + 2076 1 3112 3114 + 2077 1 3115 3116 + 2078 1 3115 3117 + 2079 1 3118 3119 + 2080 1 3118 3120 + 2081 1 3121 3122 + 2082 1 3121 3123 + 2083 1 3124 3125 + 2084 1 3124 3126 + 2085 1 3127 3128 + 2086 1 3127 3129 + 2087 1 3130 3131 + 2088 1 3130 3132 + 2089 1 3133 3134 + 2090 1 3133 3135 + 2091 1 3136 3137 + 2092 1 3136 3138 + 2093 1 3139 3140 + 2094 1 3139 3141 + 2095 1 3142 3143 + 2096 1 3142 3144 + 2097 1 3145 3146 + 2098 1 3145 3147 + 2099 1 3148 3149 + 2100 1 3148 3150 + 2101 1 3151 3152 + 2102 1 3151 3153 + 2103 1 3154 3155 + 2104 1 3154 3156 + 2105 1 3157 3158 + 2106 1 3157 3159 + 2107 1 3160 3161 + 2108 1 3160 3162 + 2109 1 3163 3164 + 2110 1 3163 3165 + 2111 1 3166 3167 + 2112 1 3166 3168 + 2113 1 3169 3170 + 2114 1 3169 3171 + 2115 1 3172 3173 + 2116 1 3172 3174 + 2117 1 3175 3176 + 2118 1 3175 3177 + 2119 1 3178 3179 + 2120 1 3178 3180 + 2121 1 3181 3182 + 2122 1 3181 3183 + 2123 1 3184 3185 + 2124 1 3184 3186 + 2125 1 3187 3188 + 2126 1 3187 3189 + 2127 1 3190 3191 + 2128 1 3190 3192 + 2129 1 3193 3194 + 2130 1 3193 3195 + 2131 1 3196 3197 + 2132 1 3196 3198 + 2133 1 3199 3200 + 2134 1 3199 3201 + 2135 1 3202 3203 + 2136 1 3202 3204 + 2137 1 3205 3206 + 2138 1 3205 3207 + 2139 1 3208 3209 + 2140 1 3208 3210 + 2141 1 3211 3212 + 2142 1 3211 3213 + 2143 1 3214 3215 + 2144 1 3214 3216 + 2145 1 3217 3218 + 2146 1 3217 3219 + 2147 1 3220 3221 + 2148 1 3220 3222 + 2149 1 3223 3224 + 2150 1 3223 3225 + 2151 1 3226 3227 + 2152 1 3226 3228 + 2153 1 3229 3230 + 2154 1 3229 3231 + 2155 1 3232 3233 + 2156 1 3232 3234 + 2157 1 3235 3236 + 2158 1 3235 3237 + 2159 1 3238 3239 + 2160 1 3238 3240 + 2161 1 3241 3242 + 2162 1 3241 3243 + 2163 1 3244 3245 + 2164 1 3244 3246 + 2165 1 3247 3248 + 2166 1 3247 3249 + 2167 1 3250 3251 + 2168 1 3250 3252 + 2169 1 3253 3254 + 2170 1 3253 3255 + 2171 1 3256 3257 + 2172 1 3256 3258 + 2173 1 3259 3260 + 2174 1 3259 3261 + 2175 1 3262 3263 + 2176 1 3262 3264 + 2177 1 3265 3266 + 2178 1 3265 3267 + 2179 1 3268 3269 + 2180 1 3268 3270 + 2181 1 3271 3272 + 2182 1 3271 3273 + 2183 1 3274 3275 + 2184 1 3274 3276 + 2185 1 3277 3278 + 2186 1 3277 3279 + 2187 1 3280 3281 + 2188 1 3280 3282 + 2189 1 3283 3284 + 2190 1 3283 3285 + 2191 1 3286 3287 + 2192 1 3286 3288 + 2193 1 3289 3290 + 2194 1 3289 3291 + 2195 1 3292 3293 + 2196 1 3292 3294 + 2197 1 3295 3296 + 2198 1 3295 3297 + 2199 1 3298 3299 + 2200 1 3298 3300 + 2201 1 3301 3302 + 2202 1 3301 3303 + 2203 1 3304 3305 + 2204 1 3304 3306 + 2205 1 3307 3308 + 2206 1 3307 3309 + 2207 1 3310 3311 + 2208 1 3310 3312 + 2209 1 3313 3314 + 2210 1 3313 3315 + 2211 1 3316 3317 + 2212 1 3316 3318 + 2213 1 3319 3320 + 2214 1 3319 3321 + 2215 1 3322 3323 + 2216 1 3322 3324 + 2217 1 3325 3326 + 2218 1 3325 3327 + 2219 1 3328 3329 + 2220 1 3328 3330 + 2221 1 3331 3332 + 2222 1 3331 3333 + 2223 1 3334 3335 + 2224 1 3334 3336 + 2225 1 3337 3338 + 2226 1 3337 3339 + 2227 1 3340 3341 + 2228 1 3340 3342 + 2229 1 3343 3344 + 2230 1 3343 3345 + 2231 1 3346 3347 + 2232 1 3346 3348 + 2233 1 3349 3350 + 2234 1 3349 3351 + 2235 1 3352 3353 + 2236 1 3352 3354 + 2237 1 3355 3356 + 2238 1 3355 3357 + 2239 1 3358 3359 + 2240 1 3358 3360 + 2241 1 3361 3362 + 2242 1 3361 3363 + 2243 1 3364 3365 + 2244 1 3364 3366 + 2245 1 3367 3368 + 2246 1 3367 3369 + 2247 1 3370 3371 + 2248 1 3370 3372 + 2249 1 3373 3374 + 2250 1 3373 3375 + 2251 1 3376 3377 + 2252 1 3376 3378 + 2253 1 3379 3380 + 2254 1 3379 3381 + 2255 1 3382 3383 + 2256 1 3382 3384 + 2257 1 3385 3386 + 2258 1 3385 3387 + 2259 1 3388 3389 + 2260 1 3388 3390 + 2261 1 3391 3392 + 2262 1 3391 3393 + 2263 1 3394 3395 + 2264 1 3394 3396 + 2265 1 3397 3398 + 2266 1 3397 3399 + 2267 1 3400 3401 + 2268 1 3400 3402 + 2269 1 3403 3404 + 2270 1 3403 3405 + 2271 1 3406 3407 + 2272 1 3406 3408 + 2273 1 3409 3410 + 2274 1 3409 3411 + 2275 1 3412 3413 + 2276 1 3412 3414 + 2277 1 3415 3416 + 2278 1 3415 3417 + 2279 1 3418 3419 + 2280 1 3418 3420 + 2281 1 3421 3422 + 2282 1 3421 3423 + 2283 1 3424 3425 + 2284 1 3424 3426 + 2285 1 3427 3428 + 2286 1 3427 3429 + 2287 1 3430 3431 + 2288 1 3430 3432 + 2289 1 3433 3434 + 2290 1 3433 3435 + 2291 1 3436 3437 + 2292 1 3436 3438 + 2293 1 3439 3440 + 2294 1 3439 3441 + 2295 1 3442 3443 + 2296 1 3442 3444 + 2297 1 3445 3446 + 2298 1 3445 3447 + 2299 1 3448 3449 + 2300 1 3448 3450 + 2301 1 3451 3452 + 2302 1 3451 3453 + 2303 1 3454 3455 + 2304 1 3454 3456 + 2305 1 3457 3458 + 2306 1 3457 3459 + 2307 1 3460 3461 + 2308 1 3460 3462 + 2309 1 3463 3464 + 2310 1 3463 3465 + 2311 1 3466 3467 + 2312 1 3466 3468 + 2313 1 3469 3470 + 2314 1 3469 3471 + 2315 1 3472 3473 + 2316 1 3472 3474 + 2317 1 3475 3476 + 2318 1 3475 3477 + 2319 1 3478 3479 + 2320 1 3478 3480 + 2321 1 3481 3482 + 2322 1 3481 3483 + 2323 1 3484 3485 + 2324 1 3484 3486 + 2325 1 3487 3488 + 2326 1 3487 3489 + 2327 1 3490 3491 + 2328 1 3490 3492 + 2329 1 3493 3494 + 2330 1 3493 3495 + 2331 1 3496 3497 + 2332 1 3496 3498 + 2333 1 3499 3500 + 2334 1 3499 3501 + 2335 1 3502 3503 + 2336 1 3502 3504 + 2337 1 3505 3506 + 2338 1 3505 3507 + 2339 1 3508 3509 + 2340 1 3508 3510 + 2341 1 3511 3512 + 2342 1 3511 3513 + 2343 1 3514 3515 + 2344 1 3514 3516 + 2345 1 3517 3518 + 2346 1 3517 3519 + 2347 1 3520 3521 + 2348 1 3520 3522 + 2349 1 3523 3524 + 2350 1 3523 3525 + 2351 1 3526 3527 + 2352 1 3526 3528 + 2353 1 3529 3530 + 2354 1 3529 3531 + 2355 1 3532 3533 + 2356 1 3532 3534 + 2357 1 3535 3536 + 2358 1 3535 3537 + 2359 1 3538 3539 + 2360 1 3538 3540 + 2361 1 3541 3542 + 2362 1 3541 3543 + 2363 1 3544 3545 + 2364 1 3544 3546 + 2365 1 3547 3548 + 2366 1 3547 3549 + 2367 1 3550 3551 + 2368 1 3550 3552 + 2369 1 3553 3554 + 2370 1 3553 3555 + 2371 1 3556 3557 + 2372 1 3556 3558 + 2373 1 3559 3560 + 2374 1 3559 3561 + 2375 1 3562 3563 + 2376 1 3562 3564 + 2377 1 3565 3566 + 2378 1 3565 3567 + 2379 1 3568 3569 + 2380 1 3568 3570 + 2381 1 3571 3572 + 2382 1 3571 3573 + 2383 1 3574 3575 + 2384 1 3574 3576 + 2385 1 3577 3578 + 2386 1 3577 3579 + 2387 1 3580 3581 + 2388 1 3580 3582 + 2389 1 3583 3584 + 2390 1 3583 3585 + 2391 1 3586 3587 + 2392 1 3586 3588 + 2393 1 3589 3590 + 2394 1 3589 3591 + 2395 1 3592 3593 + 2396 1 3592 3594 + 2397 1 3595 3596 + 2398 1 3595 3597 + 2399 1 3598 3599 + 2400 1 3598 3600 + 2401 1 3601 3602 + 2402 1 3601 3603 + 2403 1 3604 3605 + 2404 1 3604 3606 + 2405 1 3607 3608 + 2406 1 3607 3609 + 2407 1 3610 3611 + 2408 1 3610 3612 + 2409 1 3613 3614 + 2410 1 3613 3615 + 2411 1 3616 3617 + 2412 1 3616 3618 + 2413 1 3619 3620 + 2414 1 3619 3621 + 2415 1 3622 3623 + 2416 1 3622 3624 + 2417 1 3625 3626 + 2418 1 3625 3627 + 2419 1 3628 3629 + 2420 1 3628 3630 + 2421 1 3631 3632 + 2422 1 3631 3633 + 2423 1 3634 3635 + 2424 1 3634 3636 + 2425 1 3637 3638 + 2426 1 3637 3639 + 2427 1 3640 3641 + 2428 1 3640 3642 + 2429 1 3643 3644 + 2430 1 3643 3645 + 2431 1 3646 3647 + 2432 1 3646 3648 + 2433 1 3649 3650 + 2434 1 3649 3651 + 2435 1 3652 3653 + 2436 1 3652 3654 + 2437 1 3655 3656 + 2438 1 3655 3657 + 2439 1 3658 3659 + 2440 1 3658 3660 + 2441 1 3661 3662 + 2442 1 3661 3663 + 2443 1 3664 3665 + 2444 1 3664 3666 + 2445 1 3667 3668 + 2446 1 3667 3669 + 2447 1 3670 3671 + 2448 1 3670 3672 + 2449 1 3673 3674 + 2450 1 3673 3675 + 2451 1 3676 3677 + 2452 1 3676 3678 + 2453 1 3679 3680 + 2454 1 3679 3681 + 2455 1 3682 3683 + 2456 1 3682 3684 + 2457 1 3685 3686 + 2458 1 3685 3687 + 2459 1 3688 3689 + 2460 1 3688 3690 + 2461 1 3691 3692 + 2462 1 3691 3693 + 2463 1 3694 3695 + 2464 1 3694 3696 + 2465 1 3697 3698 + 2466 1 3697 3699 + 2467 1 3700 3701 + 2468 1 3700 3702 + 2469 1 3703 3704 + 2470 1 3703 3705 + 2471 1 3706 3707 + 2472 1 3706 3708 + 2473 1 3709 3710 + 2474 1 3709 3711 + 2475 1 3712 3713 + 2476 1 3712 3714 + 2477 1 3715 3716 + 2478 1 3715 3717 + 2479 1 3718 3719 + 2480 1 3718 3720 + 2481 1 3721 3722 + 2482 1 3721 3723 + 2483 1 3724 3725 + 2484 1 3724 3726 + 2485 1 3727 3728 + 2486 1 3727 3729 + 2487 1 3730 3731 + 2488 1 3730 3732 + 2489 1 3733 3734 + 2490 1 3733 3735 + 2491 1 3736 3737 + 2492 1 3736 3738 + 2493 1 3739 3740 + 2494 1 3739 3741 + 2495 1 3742 3743 + 2496 1 3742 3744 + 2497 1 3745 3746 + 2498 1 3745 3747 + 2499 1 3748 3749 + 2500 1 3748 3750 + 2501 1 3751 3752 + 2502 1 3751 3753 + 2503 1 3754 3755 + 2504 1 3754 3756 + 2505 1 3757 3758 + 2506 1 3757 3759 + 2507 1 3760 3761 + 2508 1 3760 3762 + 2509 1 3763 3764 + 2510 1 3763 3765 + 2511 1 3766 3767 + 2512 1 3766 3768 + 2513 1 3769 3770 + 2514 1 3769 3771 + 2515 1 3772 3773 + 2516 1 3772 3774 + 2517 1 3775 3776 + 2518 1 3775 3777 + 2519 1 3778 3779 + 2520 1 3778 3780 + 2521 1 3781 3782 + 2522 1 3781 3783 + 2523 1 3784 3785 + 2524 1 3784 3786 + 2525 1 3787 3788 + 2526 1 3787 3789 + 2527 1 3790 3791 + 2528 1 3790 3792 + 2529 1 3793 3794 + 2530 1 3793 3795 + 2531 1 3796 3797 + 2532 1 3796 3798 + 2533 1 3799 3800 + 2534 1 3799 3801 + 2535 1 3802 3803 + 2536 1 3802 3804 + 2537 1 3805 3806 + 2538 1 3805 3807 + 2539 1 3808 3809 + 2540 1 3808 3810 + 2541 1 3811 3812 + 2542 1 3811 3813 + 2543 1 3814 3815 + 2544 1 3814 3816 + 2545 1 3817 3818 + 2546 1 3817 3819 + 2547 1 3820 3821 + 2548 1 3820 3822 + 2549 1 3823 3824 + 2550 1 3823 3825 + 2551 1 3826 3827 + 2552 1 3826 3828 + 2553 1 3829 3830 + 2554 1 3829 3831 + 2555 1 3832 3833 + 2556 1 3832 3834 + 2557 1 3835 3836 + 2558 1 3835 3837 + 2559 1 3838 3839 + 2560 1 3838 3840 + 2561 1 3841 3842 + 2562 1 3841 3843 + 2563 1 3844 3845 + 2564 1 3844 3846 + 2565 1 3847 3848 + 2566 1 3847 3849 + 2567 1 3850 3851 + 2568 1 3850 3852 + 2569 1 3853 3854 + 2570 1 3853 3855 + 2571 1 3856 3857 + 2572 1 3856 3858 + 2573 1 3859 3860 + 2574 1 3859 3861 + 2575 1 3862 3863 + 2576 1 3862 3864 + 2577 1 3865 3866 + 2578 1 3865 3867 + 2579 1 3868 3869 + 2580 1 3868 3870 + 2581 1 3871 3872 + 2582 1 3871 3873 + 2583 1 3874 3875 + 2584 1 3874 3876 + 2585 1 3877 3878 + 2586 1 3877 3879 + 2587 1 3880 3881 + 2588 1 3880 3882 + 2589 1 3883 3884 + 2590 1 3883 3885 + 2591 1 3886 3887 + 2592 1 3886 3888 + 2593 1 3889 3890 + 2594 1 3889 3891 + 2595 1 3892 3893 + 2596 1 3892 3894 + 2597 1 3895 3896 + 2598 1 3895 3897 + 2599 1 3898 3899 + 2600 1 3898 3900 + 2601 1 3901 3902 + 2602 1 3901 3903 + 2603 1 3904 3905 + 2604 1 3904 3906 + 2605 1 3907 3908 + 2606 1 3907 3909 + 2607 1 3910 3911 + 2608 1 3910 3912 + 2609 1 3913 3914 + 2610 1 3913 3915 + 2611 1 3916 3917 + 2612 1 3916 3918 + 2613 1 3919 3920 + 2614 1 3919 3921 + 2615 1 3922 3923 + 2616 1 3922 3924 + 2617 1 3925 3926 + 2618 1 3925 3927 + 2619 1 3928 3929 + 2620 1 3928 3930 + 2621 1 3931 3932 + 2622 1 3931 3933 + 2623 1 3934 3935 + 2624 1 3934 3936 + 2625 1 3937 3938 + 2626 1 3937 3939 + 2627 1 3940 3941 + 2628 1 3940 3942 + 2629 1 3943 3944 + 2630 1 3943 3945 + 2631 1 3946 3947 + 2632 1 3946 3948 + 2633 1 3949 3950 + 2634 1 3949 3951 + 2635 1 3952 3953 + 2636 1 3952 3954 + 2637 1 3955 3956 + 2638 1 3955 3957 + 2639 1 3958 3959 + 2640 1 3958 3960 + 2641 1 3961 3962 + 2642 1 3961 3963 + 2643 1 3964 3965 + 2644 1 3964 3966 + 2645 1 3967 3968 + 2646 1 3967 3969 + 2647 1 3970 3971 + 2648 1 3970 3972 + 2649 1 3973 3974 + 2650 1 3973 3975 + 2651 1 3976 3977 + 2652 1 3976 3978 + 2653 1 3979 3980 + 2654 1 3979 3981 + 2655 1 3982 3983 + 2656 1 3982 3984 + 2657 1 3985 3986 + 2658 1 3985 3987 + 2659 1 3988 3989 + 2660 1 3988 3990 + 2661 1 3991 3992 + 2662 1 3991 3993 + 2663 1 3994 3995 + 2664 1 3994 3996 + 2665 1 3997 3998 + 2666 1 3997 3999 + 2667 1 4000 4001 + 2668 1 4000 4002 + 2669 1 4003 4004 + 2670 1 4003 4005 + 2671 1 4006 4007 + 2672 1 4006 4008 + 2673 1 4009 4010 + 2674 1 4009 4011 + 2675 1 4012 4013 + 2676 1 4012 4014 + 2677 1 4015 4016 + 2678 1 4015 4017 + 2679 1 4018 4019 + 2680 1 4018 4020 + 2681 1 4021 4022 + 2682 1 4021 4023 + 2683 1 4024 4025 + 2684 1 4024 4026 + 2685 1 4027 4028 + 2686 1 4027 4029 + 2687 1 4030 4031 + 2688 1 4030 4032 + 2689 1 4033 4034 + 2690 1 4033 4035 + 2691 1 4036 4037 + 2692 1 4036 4038 + 2693 1 4039 4040 + 2694 1 4039 4041 + 2695 1 4042 4043 + 2696 1 4042 4044 + 2697 1 4045 4046 + 2698 1 4045 4047 + 2699 1 4048 4049 + 2700 1 4048 4050 + 2701 1 4051 4052 + 2702 1 4051 4053 + 2703 1 4054 4055 + 2704 1 4054 4056 + 2705 1 4057 4058 + 2706 1 4057 4059 + 2707 1 4060 4061 + 2708 1 4060 4062 + 2709 1 4063 4064 + 2710 1 4063 4065 + 2711 1 4066 4067 + 2712 1 4066 4068 + 2713 1 4069 4070 + 2714 1 4069 4071 + 2715 1 4072 4073 + 2716 1 4072 4074 + 2717 1 4075 4076 + 2718 1 4075 4077 + 2719 1 4078 4079 + 2720 1 4078 4080 + 2721 1 4081 4082 + 2722 1 4081 4083 + 2723 1 4084 4085 + 2724 1 4084 4086 + 2725 1 4087 4088 + 2726 1 4087 4089 + 2727 1 4090 4091 + 2728 1 4090 4092 + 2729 1 4093 4094 + 2730 1 4093 4095 + 2731 1 4096 4097 + 2732 1 4096 4098 + 2733 1 4099 4100 + 2734 1 4099 4101 + 2735 1 4102 4103 + 2736 1 4102 4104 + 2737 1 4105 4106 + 2738 1 4105 4107 + 2739 1 4108 4109 + 2740 1 4108 4110 + 2741 1 4111 4112 + 2742 1 4111 4113 + 2743 1 4114 4115 + 2744 1 4114 4116 + 2745 1 4117 4118 + 2746 1 4117 4119 + 2747 1 4120 4121 + 2748 1 4120 4122 + 2749 1 4123 4124 + 2750 1 4123 4125 + 2751 1 4126 4127 + 2752 1 4126 4128 + 2753 1 4129 4130 + 2754 1 4129 4131 + 2755 1 4132 4133 + 2756 1 4132 4134 + 2757 1 4135 4136 + 2758 1 4135 4137 + 2759 1 4138 4139 + 2760 1 4138 4140 + 2761 1 4141 4142 + 2762 1 4141 4143 + 2763 1 4144 4145 + 2764 1 4144 4146 + 2765 1 4147 4148 + 2766 1 4147 4149 + 2767 1 4150 4151 + 2768 1 4150 4152 + 2769 1 4153 4154 + 2770 1 4153 4155 + 2771 1 4156 4157 + 2772 1 4156 4158 + 2773 1 4159 4160 + 2774 1 4159 4161 + 2775 1 4162 4163 + 2776 1 4162 4164 + 2777 1 4165 4166 + 2778 1 4165 4167 + 2779 1 4168 4169 + 2780 1 4168 4170 + 2781 1 4171 4172 + 2782 1 4171 4173 + 2783 1 4174 4175 + 2784 1 4174 4176 + 2785 1 4177 4178 + 2786 1 4177 4179 + 2787 1 4180 4181 + 2788 1 4180 4182 + 2789 1 4183 4184 + 2790 1 4183 4185 + 2791 1 4186 4187 + 2792 1 4186 4188 + 2793 1 4189 4190 + 2794 1 4189 4191 + 2795 1 4192 4193 + 2796 1 4192 4194 + 2797 1 4195 4196 + 2798 1 4195 4197 + 2799 1 4198 4199 + 2800 1 4198 4200 + 2801 1 4201 4202 + 2802 1 4201 4203 + 2803 1 4204 4205 + 2804 1 4204 4206 + 2805 1 4207 4208 + 2806 1 4207 4209 + 2807 1 4210 4211 + 2808 1 4210 4212 + 2809 1 4213 4214 + 2810 1 4213 4215 + 2811 1 4216 4217 + 2812 1 4216 4218 + 2813 1 4219 4220 + 2814 1 4219 4221 + 2815 1 4222 4223 + 2816 1 4222 4224 + 2817 1 4225 4226 + 2818 1 4225 4227 + 2819 1 4228 4229 + 2820 1 4228 4230 + 2821 1 4231 4232 + 2822 1 4231 4233 + 2823 1 4234 4235 + 2824 1 4234 4236 + 2825 1 4237 4238 + 2826 1 4237 4239 + 2827 1 4240 4241 + 2828 1 4240 4242 + 2829 1 4243 4244 + 2830 1 4243 4245 + 2831 1 4246 4247 + 2832 1 4246 4248 + 2833 1 4249 4250 + 2834 1 4249 4251 + 2835 1 4252 4253 + 2836 1 4252 4254 + 2837 1 4255 4256 + 2838 1 4255 4257 + 2839 1 4258 4259 + 2840 1 4258 4260 + 2841 1 4261 4262 + 2842 1 4261 4263 + 2843 1 4264 4265 + 2844 1 4264 4266 + 2845 1 4267 4268 + 2846 1 4267 4269 + 2847 1 4270 4271 + 2848 1 4270 4272 + 2849 1 4273 4274 + 2850 1 4273 4275 + 2851 1 4276 4277 + 2852 1 4276 4278 + 2853 1 4279 4280 + 2854 1 4279 4281 + 2855 1 4282 4283 + 2856 1 4282 4284 + 2857 1 4285 4286 + 2858 1 4285 4287 + 2859 1 4288 4289 + 2860 1 4288 4290 + 2861 1 4291 4292 + 2862 1 4291 4293 + 2863 1 4294 4295 + 2864 1 4294 4296 + 2865 1 4297 4298 + 2866 1 4297 4299 + 2867 1 4300 4301 + 2868 1 4300 4302 + 2869 1 4303 4304 + 2870 1 4303 4305 + 2871 1 4306 4307 + 2872 1 4306 4308 + 2873 1 4309 4310 + 2874 1 4309 4311 + 2875 1 4312 4313 + 2876 1 4312 4314 + 2877 1 4315 4316 + 2878 1 4315 4317 + 2879 1 4318 4319 + 2880 1 4318 4320 + 2881 1 4321 4322 + 2882 1 4321 4323 + 2883 1 4324 4325 + 2884 1 4324 4326 + 2885 1 4327 4328 + 2886 1 4327 4329 + 2887 1 4330 4331 + 2888 1 4330 4332 + 2889 1 4333 4334 + 2890 1 4333 4335 + 2891 1 4336 4337 + 2892 1 4336 4338 + 2893 1 4339 4340 + 2894 1 4339 4341 + 2895 1 4342 4343 + 2896 1 4342 4344 + 2897 1 4345 4346 + 2898 1 4345 4347 + 2899 1 4348 4349 + 2900 1 4348 4350 + 2901 1 4351 4352 + 2902 1 4351 4353 + 2903 1 4354 4355 + 2904 1 4354 4356 + 2905 1 4357 4358 + 2906 1 4357 4359 + 2907 1 4360 4361 + 2908 1 4360 4362 + 2909 1 4363 4364 + 2910 1 4363 4365 + 2911 1 4366 4367 + 2912 1 4366 4368 + 2913 1 4369 4370 + 2914 1 4369 4371 + 2915 1 4372 4373 + 2916 1 4372 4374 + 2917 1 4375 4376 + 2918 1 4375 4377 + 2919 1 4378 4379 + 2920 1 4378 4380 + 2921 1 4381 4382 + 2922 1 4381 4383 + 2923 1 4384 4385 + 2924 1 4384 4386 + 2925 1 4387 4388 + 2926 1 4387 4389 + 2927 1 4390 4391 + 2928 1 4390 4392 + 2929 1 4393 4394 + 2930 1 4393 4395 + 2931 1 4396 4397 + 2932 1 4396 4398 + 2933 1 4399 4400 + 2934 1 4399 4401 + 2935 1 4402 4403 + 2936 1 4402 4404 + 2937 1 4405 4406 + 2938 1 4405 4407 + 2939 1 4408 4409 + 2940 1 4408 4410 + 2941 1 4411 4412 + 2942 1 4411 4413 + 2943 1 4414 4415 + 2944 1 4414 4416 + 2945 1 4417 4418 + 2946 1 4417 4419 + 2947 1 4420 4421 + 2948 1 4420 4422 + 2949 1 4423 4424 + 2950 1 4423 4425 + 2951 1 4426 4427 + 2952 1 4426 4428 + 2953 1 4429 4430 + 2954 1 4429 4431 + 2955 1 4432 4433 + 2956 1 4432 4434 + 2957 1 4435 4436 + 2958 1 4435 4437 + 2959 1 4438 4439 + 2960 1 4438 4440 + 2961 1 4441 4442 + 2962 1 4441 4443 + 2963 1 4444 4445 + 2964 1 4444 4446 + 2965 1 4447 4448 + 2966 1 4447 4449 + 2967 1 4450 4451 + 2968 1 4450 4452 + 2969 1 4453 4454 + 2970 1 4453 4455 + 2971 1 4456 4457 + 2972 1 4456 4458 + 2973 1 4459 4460 + 2974 1 4459 4461 + 2975 1 4462 4463 + 2976 1 4462 4464 + 2977 1 4465 4466 + 2978 1 4465 4467 + 2979 1 4468 4469 + 2980 1 4468 4470 + 2981 1 4471 4472 + 2982 1 4471 4473 + 2983 1 4474 4475 + 2984 1 4474 4476 + 2985 1 4477 4478 + 2986 1 4477 4479 + 2987 1 4480 4481 + 2988 1 4480 4482 + 2989 1 4483 4484 + 2990 1 4483 4485 + 2991 1 4486 4487 + 2992 1 4486 4488 + 2993 1 4489 4490 + 2994 1 4489 4491 + 2995 1 4492 4493 + 2996 1 4492 4494 + 2997 1 4495 4496 + 2998 1 4495 4497 + 2999 1 4498 4499 + 3000 1 4498 4500 + +Angles + + 1 1 2 1 3 + 2 1 5 4 6 + 3 1 8 7 9 + 4 1 11 10 12 + 5 1 14 13 15 + 6 1 17 16 18 + 7 1 20 19 21 + 8 1 23 22 24 + 9 1 26 25 27 + 10 1 29 28 30 + 11 1 32 31 33 + 12 1 35 34 36 + 13 1 38 37 39 + 14 1 41 40 42 + 15 1 44 43 45 + 16 1 47 46 48 + 17 1 50 49 51 + 18 1 53 52 54 + 19 1 56 55 57 + 20 1 59 58 60 + 21 1 62 61 63 + 22 1 65 64 66 + 23 1 68 67 69 + 24 1 71 70 72 + 25 1 74 73 75 + 26 1 77 76 78 + 27 1 80 79 81 + 28 1 83 82 84 + 29 1 86 85 87 + 30 1 89 88 90 + 31 1 92 91 93 + 32 1 95 94 96 + 33 1 98 97 99 + 34 1 101 100 102 + 35 1 104 103 105 + 36 1 107 106 108 + 37 1 110 109 111 + 38 1 113 112 114 + 39 1 116 115 117 + 40 1 119 118 120 + 41 1 122 121 123 + 42 1 125 124 126 + 43 1 128 127 129 + 44 1 131 130 132 + 45 1 134 133 135 + 46 1 137 136 138 + 47 1 140 139 141 + 48 1 143 142 144 + 49 1 146 145 147 + 50 1 149 148 150 + 51 1 152 151 153 + 52 1 155 154 156 + 53 1 158 157 159 + 54 1 161 160 162 + 55 1 164 163 165 + 56 1 167 166 168 + 57 1 170 169 171 + 58 1 173 172 174 + 59 1 176 175 177 + 60 1 179 178 180 + 61 1 182 181 183 + 62 1 185 184 186 + 63 1 188 187 189 + 64 1 191 190 192 + 65 1 194 193 195 + 66 1 197 196 198 + 67 1 200 199 201 + 68 1 203 202 204 + 69 1 206 205 207 + 70 1 209 208 210 + 71 1 212 211 213 + 72 1 215 214 216 + 73 1 218 217 219 + 74 1 221 220 222 + 75 1 224 223 225 + 76 1 227 226 228 + 77 1 230 229 231 + 78 1 233 232 234 + 79 1 236 235 237 + 80 1 239 238 240 + 81 1 242 241 243 + 82 1 245 244 246 + 83 1 248 247 249 + 84 1 251 250 252 + 85 1 254 253 255 + 86 1 257 256 258 + 87 1 260 259 261 + 88 1 263 262 264 + 89 1 266 265 267 + 90 1 269 268 270 + 91 1 272 271 273 + 92 1 275 274 276 + 93 1 278 277 279 + 94 1 281 280 282 + 95 1 284 283 285 + 96 1 287 286 288 + 97 1 290 289 291 + 98 1 293 292 294 + 99 1 296 295 297 + 100 1 299 298 300 + 101 1 302 301 303 + 102 1 305 304 306 + 103 1 308 307 309 + 104 1 311 310 312 + 105 1 314 313 315 + 106 1 317 316 318 + 107 1 320 319 321 + 108 1 323 322 324 + 109 1 326 325 327 + 110 1 329 328 330 + 111 1 332 331 333 + 112 1 335 334 336 + 113 1 338 337 339 + 114 1 341 340 342 + 115 1 344 343 345 + 116 1 347 346 348 + 117 1 350 349 351 + 118 1 353 352 354 + 119 1 356 355 357 + 120 1 359 358 360 + 121 1 362 361 363 + 122 1 365 364 366 + 123 1 368 367 369 + 124 1 371 370 372 + 125 1 374 373 375 + 126 1 377 376 378 + 127 1 380 379 381 + 128 1 383 382 384 + 129 1 386 385 387 + 130 1 389 388 390 + 131 1 392 391 393 + 132 1 395 394 396 + 133 1 398 397 399 + 134 1 401 400 402 + 135 1 404 403 405 + 136 1 407 406 408 + 137 1 410 409 411 + 138 1 413 412 414 + 139 1 416 415 417 + 140 1 419 418 420 + 141 1 422 421 423 + 142 1 425 424 426 + 143 1 428 427 429 + 144 1 431 430 432 + 145 1 434 433 435 + 146 1 437 436 438 + 147 1 440 439 441 + 148 1 443 442 444 + 149 1 446 445 447 + 150 1 449 448 450 + 151 1 452 451 453 + 152 1 455 454 456 + 153 1 458 457 459 + 154 1 461 460 462 + 155 1 464 463 465 + 156 1 467 466 468 + 157 1 470 469 471 + 158 1 473 472 474 + 159 1 476 475 477 + 160 1 479 478 480 + 161 1 482 481 483 + 162 1 485 484 486 + 163 1 488 487 489 + 164 1 491 490 492 + 165 1 494 493 495 + 166 1 497 496 498 + 167 1 500 499 501 + 168 1 503 502 504 + 169 1 506 505 507 + 170 1 509 508 510 + 171 1 512 511 513 + 172 1 515 514 516 + 173 1 518 517 519 + 174 1 521 520 522 + 175 1 524 523 525 + 176 1 527 526 528 + 177 1 530 529 531 + 178 1 533 532 534 + 179 1 536 535 537 + 180 1 539 538 540 + 181 1 542 541 543 + 182 1 545 544 546 + 183 1 548 547 549 + 184 1 551 550 552 + 185 1 554 553 555 + 186 1 557 556 558 + 187 1 560 559 561 + 188 1 563 562 564 + 189 1 566 565 567 + 190 1 569 568 570 + 191 1 572 571 573 + 192 1 575 574 576 + 193 1 578 577 579 + 194 1 581 580 582 + 195 1 584 583 585 + 196 1 587 586 588 + 197 1 590 589 591 + 198 1 593 592 594 + 199 1 596 595 597 + 200 1 599 598 600 + 201 1 602 601 603 + 202 1 605 604 606 + 203 1 608 607 609 + 204 1 611 610 612 + 205 1 614 613 615 + 206 1 617 616 618 + 207 1 620 619 621 + 208 1 623 622 624 + 209 1 626 625 627 + 210 1 629 628 630 + 211 1 632 631 633 + 212 1 635 634 636 + 213 1 638 637 639 + 214 1 641 640 642 + 215 1 644 643 645 + 216 1 647 646 648 + 217 1 650 649 651 + 218 1 653 652 654 + 219 1 656 655 657 + 220 1 659 658 660 + 221 1 662 661 663 + 222 1 665 664 666 + 223 1 668 667 669 + 224 1 671 670 672 + 225 1 674 673 675 + 226 1 677 676 678 + 227 1 680 679 681 + 228 1 683 682 684 + 229 1 686 685 687 + 230 1 689 688 690 + 231 1 692 691 693 + 232 1 695 694 696 + 233 1 698 697 699 + 234 1 701 700 702 + 235 1 704 703 705 + 236 1 707 706 708 + 237 1 710 709 711 + 238 1 713 712 714 + 239 1 716 715 717 + 240 1 719 718 720 + 241 1 722 721 723 + 242 1 725 724 726 + 243 1 728 727 729 + 244 1 731 730 732 + 245 1 734 733 735 + 246 1 737 736 738 + 247 1 740 739 741 + 248 1 743 742 744 + 249 1 746 745 747 + 250 1 749 748 750 + 251 1 752 751 753 + 252 1 755 754 756 + 253 1 758 757 759 + 254 1 761 760 762 + 255 1 764 763 765 + 256 1 767 766 768 + 257 1 770 769 771 + 258 1 773 772 774 + 259 1 776 775 777 + 260 1 779 778 780 + 261 1 782 781 783 + 262 1 785 784 786 + 263 1 788 787 789 + 264 1 791 790 792 + 265 1 794 793 795 + 266 1 797 796 798 + 267 1 800 799 801 + 268 1 803 802 804 + 269 1 806 805 807 + 270 1 809 808 810 + 271 1 812 811 813 + 272 1 815 814 816 + 273 1 818 817 819 + 274 1 821 820 822 + 275 1 824 823 825 + 276 1 827 826 828 + 277 1 830 829 831 + 278 1 833 832 834 + 279 1 836 835 837 + 280 1 839 838 840 + 281 1 842 841 843 + 282 1 845 844 846 + 283 1 848 847 849 + 284 1 851 850 852 + 285 1 854 853 855 + 286 1 857 856 858 + 287 1 860 859 861 + 288 1 863 862 864 + 289 1 866 865 867 + 290 1 869 868 870 + 291 1 872 871 873 + 292 1 875 874 876 + 293 1 878 877 879 + 294 1 881 880 882 + 295 1 884 883 885 + 296 1 887 886 888 + 297 1 890 889 891 + 298 1 893 892 894 + 299 1 896 895 897 + 300 1 899 898 900 + 301 1 902 901 903 + 302 1 905 904 906 + 303 1 908 907 909 + 304 1 911 910 912 + 305 1 914 913 915 + 306 1 917 916 918 + 307 1 920 919 921 + 308 1 923 922 924 + 309 1 926 925 927 + 310 1 929 928 930 + 311 1 932 931 933 + 312 1 935 934 936 + 313 1 938 937 939 + 314 1 941 940 942 + 315 1 944 943 945 + 316 1 947 946 948 + 317 1 950 949 951 + 318 1 953 952 954 + 319 1 956 955 957 + 320 1 959 958 960 + 321 1 962 961 963 + 322 1 965 964 966 + 323 1 968 967 969 + 324 1 971 970 972 + 325 1 974 973 975 + 326 1 977 976 978 + 327 1 980 979 981 + 328 1 983 982 984 + 329 1 986 985 987 + 330 1 989 988 990 + 331 1 992 991 993 + 332 1 995 994 996 + 333 1 998 997 999 + 334 1 1001 1000 1002 + 335 1 1004 1003 1005 + 336 1 1007 1006 1008 + 337 1 1010 1009 1011 + 338 1 1013 1012 1014 + 339 1 1016 1015 1017 + 340 1 1019 1018 1020 + 341 1 1022 1021 1023 + 342 1 1025 1024 1026 + 343 1 1028 1027 1029 + 344 1 1031 1030 1032 + 345 1 1034 1033 1035 + 346 1 1037 1036 1038 + 347 1 1040 1039 1041 + 348 1 1043 1042 1044 + 349 1 1046 1045 1047 + 350 1 1049 1048 1050 + 351 1 1052 1051 1053 + 352 1 1055 1054 1056 + 353 1 1058 1057 1059 + 354 1 1061 1060 1062 + 355 1 1064 1063 1065 + 356 1 1067 1066 1068 + 357 1 1070 1069 1071 + 358 1 1073 1072 1074 + 359 1 1076 1075 1077 + 360 1 1079 1078 1080 + 361 1 1082 1081 1083 + 362 1 1085 1084 1086 + 363 1 1088 1087 1089 + 364 1 1091 1090 1092 + 365 1 1094 1093 1095 + 366 1 1097 1096 1098 + 367 1 1100 1099 1101 + 368 1 1103 1102 1104 + 369 1 1106 1105 1107 + 370 1 1109 1108 1110 + 371 1 1112 1111 1113 + 372 1 1115 1114 1116 + 373 1 1118 1117 1119 + 374 1 1121 1120 1122 + 375 1 1124 1123 1125 + 376 1 1127 1126 1128 + 377 1 1130 1129 1131 + 378 1 1133 1132 1134 + 379 1 1136 1135 1137 + 380 1 1139 1138 1140 + 381 1 1142 1141 1143 + 382 1 1145 1144 1146 + 383 1 1148 1147 1149 + 384 1 1151 1150 1152 + 385 1 1154 1153 1155 + 386 1 1157 1156 1158 + 387 1 1160 1159 1161 + 388 1 1163 1162 1164 + 389 1 1166 1165 1167 + 390 1 1169 1168 1170 + 391 1 1172 1171 1173 + 392 1 1175 1174 1176 + 393 1 1178 1177 1179 + 394 1 1181 1180 1182 + 395 1 1184 1183 1185 + 396 1 1187 1186 1188 + 397 1 1190 1189 1191 + 398 1 1193 1192 1194 + 399 1 1196 1195 1197 + 400 1 1199 1198 1200 + 401 1 1202 1201 1203 + 402 1 1205 1204 1206 + 403 1 1208 1207 1209 + 404 1 1211 1210 1212 + 405 1 1214 1213 1215 + 406 1 1217 1216 1218 + 407 1 1220 1219 1221 + 408 1 1223 1222 1224 + 409 1 1226 1225 1227 + 410 1 1229 1228 1230 + 411 1 1232 1231 1233 + 412 1 1235 1234 1236 + 413 1 1238 1237 1239 + 414 1 1241 1240 1242 + 415 1 1244 1243 1245 + 416 1 1247 1246 1248 + 417 1 1250 1249 1251 + 418 1 1253 1252 1254 + 419 1 1256 1255 1257 + 420 1 1259 1258 1260 + 421 1 1262 1261 1263 + 422 1 1265 1264 1266 + 423 1 1268 1267 1269 + 424 1 1271 1270 1272 + 425 1 1274 1273 1275 + 426 1 1277 1276 1278 + 427 1 1280 1279 1281 + 428 1 1283 1282 1284 + 429 1 1286 1285 1287 + 430 1 1289 1288 1290 + 431 1 1292 1291 1293 + 432 1 1295 1294 1296 + 433 1 1298 1297 1299 + 434 1 1301 1300 1302 + 435 1 1304 1303 1305 + 436 1 1307 1306 1308 + 437 1 1310 1309 1311 + 438 1 1313 1312 1314 + 439 1 1316 1315 1317 + 440 1 1319 1318 1320 + 441 1 1322 1321 1323 + 442 1 1325 1324 1326 + 443 1 1328 1327 1329 + 444 1 1331 1330 1332 + 445 1 1334 1333 1335 + 446 1 1337 1336 1338 + 447 1 1340 1339 1341 + 448 1 1343 1342 1344 + 449 1 1346 1345 1347 + 450 1 1349 1348 1350 + 451 1 1352 1351 1353 + 452 1 1355 1354 1356 + 453 1 1358 1357 1359 + 454 1 1361 1360 1362 + 455 1 1364 1363 1365 + 456 1 1367 1366 1368 + 457 1 1370 1369 1371 + 458 1 1373 1372 1374 + 459 1 1376 1375 1377 + 460 1 1379 1378 1380 + 461 1 1382 1381 1383 + 462 1 1385 1384 1386 + 463 1 1388 1387 1389 + 464 1 1391 1390 1392 + 465 1 1394 1393 1395 + 466 1 1397 1396 1398 + 467 1 1400 1399 1401 + 468 1 1403 1402 1404 + 469 1 1406 1405 1407 + 470 1 1409 1408 1410 + 471 1 1412 1411 1413 + 472 1 1415 1414 1416 + 473 1 1418 1417 1419 + 474 1 1421 1420 1422 + 475 1 1424 1423 1425 + 476 1 1427 1426 1428 + 477 1 1430 1429 1431 + 478 1 1433 1432 1434 + 479 1 1436 1435 1437 + 480 1 1439 1438 1440 + 481 1 1442 1441 1443 + 482 1 1445 1444 1446 + 483 1 1448 1447 1449 + 484 1 1451 1450 1452 + 485 1 1454 1453 1455 + 486 1 1457 1456 1458 + 487 1 1460 1459 1461 + 488 1 1463 1462 1464 + 489 1 1466 1465 1467 + 490 1 1469 1468 1470 + 491 1 1472 1471 1473 + 492 1 1475 1474 1476 + 493 1 1478 1477 1479 + 494 1 1481 1480 1482 + 495 1 1484 1483 1485 + 496 1 1487 1486 1488 + 497 1 1490 1489 1491 + 498 1 1493 1492 1494 + 499 1 1496 1495 1497 + 500 1 1499 1498 1500 + 501 1 1502 1501 1503 + 502 1 1505 1504 1506 + 503 1 1508 1507 1509 + 504 1 1511 1510 1512 + 505 1 1514 1513 1515 + 506 1 1517 1516 1518 + 507 1 1520 1519 1521 + 508 1 1523 1522 1524 + 509 1 1526 1525 1527 + 510 1 1529 1528 1530 + 511 1 1532 1531 1533 + 512 1 1535 1534 1536 + 513 1 1538 1537 1539 + 514 1 1541 1540 1542 + 515 1 1544 1543 1545 + 516 1 1547 1546 1548 + 517 1 1550 1549 1551 + 518 1 1553 1552 1554 + 519 1 1556 1555 1557 + 520 1 1559 1558 1560 + 521 1 1562 1561 1563 + 522 1 1565 1564 1566 + 523 1 1568 1567 1569 + 524 1 1571 1570 1572 + 525 1 1574 1573 1575 + 526 1 1577 1576 1578 + 527 1 1580 1579 1581 + 528 1 1583 1582 1584 + 529 1 1586 1585 1587 + 530 1 1589 1588 1590 + 531 1 1592 1591 1593 + 532 1 1595 1594 1596 + 533 1 1598 1597 1599 + 534 1 1601 1600 1602 + 535 1 1604 1603 1605 + 536 1 1607 1606 1608 + 537 1 1610 1609 1611 + 538 1 1613 1612 1614 + 539 1 1616 1615 1617 + 540 1 1619 1618 1620 + 541 1 1622 1621 1623 + 542 1 1625 1624 1626 + 543 1 1628 1627 1629 + 544 1 1631 1630 1632 + 545 1 1634 1633 1635 + 546 1 1637 1636 1638 + 547 1 1640 1639 1641 + 548 1 1643 1642 1644 + 549 1 1646 1645 1647 + 550 1 1649 1648 1650 + 551 1 1652 1651 1653 + 552 1 1655 1654 1656 + 553 1 1658 1657 1659 + 554 1 1661 1660 1662 + 555 1 1664 1663 1665 + 556 1 1667 1666 1668 + 557 1 1670 1669 1671 + 558 1 1673 1672 1674 + 559 1 1676 1675 1677 + 560 1 1679 1678 1680 + 561 1 1682 1681 1683 + 562 1 1685 1684 1686 + 563 1 1688 1687 1689 + 564 1 1691 1690 1692 + 565 1 1694 1693 1695 + 566 1 1697 1696 1698 + 567 1 1700 1699 1701 + 568 1 1703 1702 1704 + 569 1 1706 1705 1707 + 570 1 1709 1708 1710 + 571 1 1712 1711 1713 + 572 1 1715 1714 1716 + 573 1 1718 1717 1719 + 574 1 1721 1720 1722 + 575 1 1724 1723 1725 + 576 1 1727 1726 1728 + 577 1 1730 1729 1731 + 578 1 1733 1732 1734 + 579 1 1736 1735 1737 + 580 1 1739 1738 1740 + 581 1 1742 1741 1743 + 582 1 1745 1744 1746 + 583 1 1748 1747 1749 + 584 1 1751 1750 1752 + 585 1 1754 1753 1755 + 586 1 1757 1756 1758 + 587 1 1760 1759 1761 + 588 1 1763 1762 1764 + 589 1 1766 1765 1767 + 590 1 1769 1768 1770 + 591 1 1772 1771 1773 + 592 1 1775 1774 1776 + 593 1 1778 1777 1779 + 594 1 1781 1780 1782 + 595 1 1784 1783 1785 + 596 1 1787 1786 1788 + 597 1 1790 1789 1791 + 598 1 1793 1792 1794 + 599 1 1796 1795 1797 + 600 1 1799 1798 1800 + 601 1 1802 1801 1803 + 602 1 1805 1804 1806 + 603 1 1808 1807 1809 + 604 1 1811 1810 1812 + 605 1 1814 1813 1815 + 606 1 1817 1816 1818 + 607 1 1820 1819 1821 + 608 1 1823 1822 1824 + 609 1 1826 1825 1827 + 610 1 1829 1828 1830 + 611 1 1832 1831 1833 + 612 1 1835 1834 1836 + 613 1 1838 1837 1839 + 614 1 1841 1840 1842 + 615 1 1844 1843 1845 + 616 1 1847 1846 1848 + 617 1 1850 1849 1851 + 618 1 1853 1852 1854 + 619 1 1856 1855 1857 + 620 1 1859 1858 1860 + 621 1 1862 1861 1863 + 622 1 1865 1864 1866 + 623 1 1868 1867 1869 + 624 1 1871 1870 1872 + 625 1 1874 1873 1875 + 626 1 1877 1876 1878 + 627 1 1880 1879 1881 + 628 1 1883 1882 1884 + 629 1 1886 1885 1887 + 630 1 1889 1888 1890 + 631 1 1892 1891 1893 + 632 1 1895 1894 1896 + 633 1 1898 1897 1899 + 634 1 1901 1900 1902 + 635 1 1904 1903 1905 + 636 1 1907 1906 1908 + 637 1 1910 1909 1911 + 638 1 1913 1912 1914 + 639 1 1916 1915 1917 + 640 1 1919 1918 1920 + 641 1 1922 1921 1923 + 642 1 1925 1924 1926 + 643 1 1928 1927 1929 + 644 1 1931 1930 1932 + 645 1 1934 1933 1935 + 646 1 1937 1936 1938 + 647 1 1940 1939 1941 + 648 1 1943 1942 1944 + 649 1 1946 1945 1947 + 650 1 1949 1948 1950 + 651 1 1952 1951 1953 + 652 1 1955 1954 1956 + 653 1 1958 1957 1959 + 654 1 1961 1960 1962 + 655 1 1964 1963 1965 + 656 1 1967 1966 1968 + 657 1 1970 1969 1971 + 658 1 1973 1972 1974 + 659 1 1976 1975 1977 + 660 1 1979 1978 1980 + 661 1 1982 1981 1983 + 662 1 1985 1984 1986 + 663 1 1988 1987 1989 + 664 1 1991 1990 1992 + 665 1 1994 1993 1995 + 666 1 1997 1996 1998 + 667 1 2000 1999 2001 + 668 1 2003 2002 2004 + 669 1 2006 2005 2007 + 670 1 2009 2008 2010 + 671 1 2012 2011 2013 + 672 1 2015 2014 2016 + 673 1 2018 2017 2019 + 674 1 2021 2020 2022 + 675 1 2024 2023 2025 + 676 1 2027 2026 2028 + 677 1 2030 2029 2031 + 678 1 2033 2032 2034 + 679 1 2036 2035 2037 + 680 1 2039 2038 2040 + 681 1 2042 2041 2043 + 682 1 2045 2044 2046 + 683 1 2048 2047 2049 + 684 1 2051 2050 2052 + 685 1 2054 2053 2055 + 686 1 2057 2056 2058 + 687 1 2060 2059 2061 + 688 1 2063 2062 2064 + 689 1 2066 2065 2067 + 690 1 2069 2068 2070 + 691 1 2072 2071 2073 + 692 1 2075 2074 2076 + 693 1 2078 2077 2079 + 694 1 2081 2080 2082 + 695 1 2084 2083 2085 + 696 1 2087 2086 2088 + 697 1 2090 2089 2091 + 698 1 2093 2092 2094 + 699 1 2096 2095 2097 + 700 1 2099 2098 2100 + 701 1 2102 2101 2103 + 702 1 2105 2104 2106 + 703 1 2108 2107 2109 + 704 1 2111 2110 2112 + 705 1 2114 2113 2115 + 706 1 2117 2116 2118 + 707 1 2120 2119 2121 + 708 1 2123 2122 2124 + 709 1 2126 2125 2127 + 710 1 2129 2128 2130 + 711 1 2132 2131 2133 + 712 1 2135 2134 2136 + 713 1 2138 2137 2139 + 714 1 2141 2140 2142 + 715 1 2144 2143 2145 + 716 1 2147 2146 2148 + 717 1 2150 2149 2151 + 718 1 2153 2152 2154 + 719 1 2156 2155 2157 + 720 1 2159 2158 2160 + 721 1 2162 2161 2163 + 722 1 2165 2164 2166 + 723 1 2168 2167 2169 + 724 1 2171 2170 2172 + 725 1 2174 2173 2175 + 726 1 2177 2176 2178 + 727 1 2180 2179 2181 + 728 1 2183 2182 2184 + 729 1 2186 2185 2187 + 730 1 2189 2188 2190 + 731 1 2192 2191 2193 + 732 1 2195 2194 2196 + 733 1 2198 2197 2199 + 734 1 2201 2200 2202 + 735 1 2204 2203 2205 + 736 1 2207 2206 2208 + 737 1 2210 2209 2211 + 738 1 2213 2212 2214 + 739 1 2216 2215 2217 + 740 1 2219 2218 2220 + 741 1 2222 2221 2223 + 742 1 2225 2224 2226 + 743 1 2228 2227 2229 + 744 1 2231 2230 2232 + 745 1 2234 2233 2235 + 746 1 2237 2236 2238 + 747 1 2240 2239 2241 + 748 1 2243 2242 2244 + 749 1 2246 2245 2247 + 750 1 2249 2248 2250 + 751 1 2252 2251 2253 + 752 1 2255 2254 2256 + 753 1 2258 2257 2259 + 754 1 2261 2260 2262 + 755 1 2264 2263 2265 + 756 1 2267 2266 2268 + 757 1 2270 2269 2271 + 758 1 2273 2272 2274 + 759 1 2276 2275 2277 + 760 1 2279 2278 2280 + 761 1 2282 2281 2283 + 762 1 2285 2284 2286 + 763 1 2288 2287 2289 + 764 1 2291 2290 2292 + 765 1 2294 2293 2295 + 766 1 2297 2296 2298 + 767 1 2300 2299 2301 + 768 1 2303 2302 2304 + 769 1 2306 2305 2307 + 770 1 2309 2308 2310 + 771 1 2312 2311 2313 + 772 1 2315 2314 2316 + 773 1 2318 2317 2319 + 774 1 2321 2320 2322 + 775 1 2324 2323 2325 + 776 1 2327 2326 2328 + 777 1 2330 2329 2331 + 778 1 2333 2332 2334 + 779 1 2336 2335 2337 + 780 1 2339 2338 2340 + 781 1 2342 2341 2343 + 782 1 2345 2344 2346 + 783 1 2348 2347 2349 + 784 1 2351 2350 2352 + 785 1 2354 2353 2355 + 786 1 2357 2356 2358 + 787 1 2360 2359 2361 + 788 1 2363 2362 2364 + 789 1 2366 2365 2367 + 790 1 2369 2368 2370 + 791 1 2372 2371 2373 + 792 1 2375 2374 2376 + 793 1 2378 2377 2379 + 794 1 2381 2380 2382 + 795 1 2384 2383 2385 + 796 1 2387 2386 2388 + 797 1 2390 2389 2391 + 798 1 2393 2392 2394 + 799 1 2396 2395 2397 + 800 1 2399 2398 2400 + 801 1 2402 2401 2403 + 802 1 2405 2404 2406 + 803 1 2408 2407 2409 + 804 1 2411 2410 2412 + 805 1 2414 2413 2415 + 806 1 2417 2416 2418 + 807 1 2420 2419 2421 + 808 1 2423 2422 2424 + 809 1 2426 2425 2427 + 810 1 2429 2428 2430 + 811 1 2432 2431 2433 + 812 1 2435 2434 2436 + 813 1 2438 2437 2439 + 814 1 2441 2440 2442 + 815 1 2444 2443 2445 + 816 1 2447 2446 2448 + 817 1 2450 2449 2451 + 818 1 2453 2452 2454 + 819 1 2456 2455 2457 + 820 1 2459 2458 2460 + 821 1 2462 2461 2463 + 822 1 2465 2464 2466 + 823 1 2468 2467 2469 + 824 1 2471 2470 2472 + 825 1 2474 2473 2475 + 826 1 2477 2476 2478 + 827 1 2480 2479 2481 + 828 1 2483 2482 2484 + 829 1 2486 2485 2487 + 830 1 2489 2488 2490 + 831 1 2492 2491 2493 + 832 1 2495 2494 2496 + 833 1 2498 2497 2499 + 834 1 2501 2500 2502 + 835 1 2504 2503 2505 + 836 1 2507 2506 2508 + 837 1 2510 2509 2511 + 838 1 2513 2512 2514 + 839 1 2516 2515 2517 + 840 1 2519 2518 2520 + 841 1 2522 2521 2523 + 842 1 2525 2524 2526 + 843 1 2528 2527 2529 + 844 1 2531 2530 2532 + 845 1 2534 2533 2535 + 846 1 2537 2536 2538 + 847 1 2540 2539 2541 + 848 1 2543 2542 2544 + 849 1 2546 2545 2547 + 850 1 2549 2548 2550 + 851 1 2552 2551 2553 + 852 1 2555 2554 2556 + 853 1 2558 2557 2559 + 854 1 2561 2560 2562 + 855 1 2564 2563 2565 + 856 1 2567 2566 2568 + 857 1 2570 2569 2571 + 858 1 2573 2572 2574 + 859 1 2576 2575 2577 + 860 1 2579 2578 2580 + 861 1 2582 2581 2583 + 862 1 2585 2584 2586 + 863 1 2588 2587 2589 + 864 1 2591 2590 2592 + 865 1 2594 2593 2595 + 866 1 2597 2596 2598 + 867 1 2600 2599 2601 + 868 1 2603 2602 2604 + 869 1 2606 2605 2607 + 870 1 2609 2608 2610 + 871 1 2612 2611 2613 + 872 1 2615 2614 2616 + 873 1 2618 2617 2619 + 874 1 2621 2620 2622 + 875 1 2624 2623 2625 + 876 1 2627 2626 2628 + 877 1 2630 2629 2631 + 878 1 2633 2632 2634 + 879 1 2636 2635 2637 + 880 1 2639 2638 2640 + 881 1 2642 2641 2643 + 882 1 2645 2644 2646 + 883 1 2648 2647 2649 + 884 1 2651 2650 2652 + 885 1 2654 2653 2655 + 886 1 2657 2656 2658 + 887 1 2660 2659 2661 + 888 1 2663 2662 2664 + 889 1 2666 2665 2667 + 890 1 2669 2668 2670 + 891 1 2672 2671 2673 + 892 1 2675 2674 2676 + 893 1 2678 2677 2679 + 894 1 2681 2680 2682 + 895 1 2684 2683 2685 + 896 1 2687 2686 2688 + 897 1 2690 2689 2691 + 898 1 2693 2692 2694 + 899 1 2696 2695 2697 + 900 1 2699 2698 2700 + 901 1 2702 2701 2703 + 902 1 2705 2704 2706 + 903 1 2708 2707 2709 + 904 1 2711 2710 2712 + 905 1 2714 2713 2715 + 906 1 2717 2716 2718 + 907 1 2720 2719 2721 + 908 1 2723 2722 2724 + 909 1 2726 2725 2727 + 910 1 2729 2728 2730 + 911 1 2732 2731 2733 + 912 1 2735 2734 2736 + 913 1 2738 2737 2739 + 914 1 2741 2740 2742 + 915 1 2744 2743 2745 + 916 1 2747 2746 2748 + 917 1 2750 2749 2751 + 918 1 2753 2752 2754 + 919 1 2756 2755 2757 + 920 1 2759 2758 2760 + 921 1 2762 2761 2763 + 922 1 2765 2764 2766 + 923 1 2768 2767 2769 + 924 1 2771 2770 2772 + 925 1 2774 2773 2775 + 926 1 2777 2776 2778 + 927 1 2780 2779 2781 + 928 1 2783 2782 2784 + 929 1 2786 2785 2787 + 930 1 2789 2788 2790 + 931 1 2792 2791 2793 + 932 1 2795 2794 2796 + 933 1 2798 2797 2799 + 934 1 2801 2800 2802 + 935 1 2804 2803 2805 + 936 1 2807 2806 2808 + 937 1 2810 2809 2811 + 938 1 2813 2812 2814 + 939 1 2816 2815 2817 + 940 1 2819 2818 2820 + 941 1 2822 2821 2823 + 942 1 2825 2824 2826 + 943 1 2828 2827 2829 + 944 1 2831 2830 2832 + 945 1 2834 2833 2835 + 946 1 2837 2836 2838 + 947 1 2840 2839 2841 + 948 1 2843 2842 2844 + 949 1 2846 2845 2847 + 950 1 2849 2848 2850 + 951 1 2852 2851 2853 + 952 1 2855 2854 2856 + 953 1 2858 2857 2859 + 954 1 2861 2860 2862 + 955 1 2864 2863 2865 + 956 1 2867 2866 2868 + 957 1 2870 2869 2871 + 958 1 2873 2872 2874 + 959 1 2876 2875 2877 + 960 1 2879 2878 2880 + 961 1 2882 2881 2883 + 962 1 2885 2884 2886 + 963 1 2888 2887 2889 + 964 1 2891 2890 2892 + 965 1 2894 2893 2895 + 966 1 2897 2896 2898 + 967 1 2900 2899 2901 + 968 1 2903 2902 2904 + 969 1 2906 2905 2907 + 970 1 2909 2908 2910 + 971 1 2912 2911 2913 + 972 1 2915 2914 2916 + 973 1 2918 2917 2919 + 974 1 2921 2920 2922 + 975 1 2924 2923 2925 + 976 1 2927 2926 2928 + 977 1 2930 2929 2931 + 978 1 2933 2932 2934 + 979 1 2936 2935 2937 + 980 1 2939 2938 2940 + 981 1 2942 2941 2943 + 982 1 2945 2944 2946 + 983 1 2948 2947 2949 + 984 1 2951 2950 2952 + 985 1 2954 2953 2955 + 986 1 2957 2956 2958 + 987 1 2960 2959 2961 + 988 1 2963 2962 2964 + 989 1 2966 2965 2967 + 990 1 2969 2968 2970 + 991 1 2972 2971 2973 + 992 1 2975 2974 2976 + 993 1 2978 2977 2979 + 994 1 2981 2980 2982 + 995 1 2984 2983 2985 + 996 1 2987 2986 2988 + 997 1 2990 2989 2991 + 998 1 2993 2992 2994 + 999 1 2996 2995 2997 + 1000 1 2999 2998 3000 + 1001 1 3002 3001 3003 + 1002 1 3005 3004 3006 + 1003 1 3008 3007 3009 + 1004 1 3011 3010 3012 + 1005 1 3014 3013 3015 + 1006 1 3017 3016 3018 + 1007 1 3020 3019 3021 + 1008 1 3023 3022 3024 + 1009 1 3026 3025 3027 + 1010 1 3029 3028 3030 + 1011 1 3032 3031 3033 + 1012 1 3035 3034 3036 + 1013 1 3038 3037 3039 + 1014 1 3041 3040 3042 + 1015 1 3044 3043 3045 + 1016 1 3047 3046 3048 + 1017 1 3050 3049 3051 + 1018 1 3053 3052 3054 + 1019 1 3056 3055 3057 + 1020 1 3059 3058 3060 + 1021 1 3062 3061 3063 + 1022 1 3065 3064 3066 + 1023 1 3068 3067 3069 + 1024 1 3071 3070 3072 + 1025 1 3074 3073 3075 + 1026 1 3077 3076 3078 + 1027 1 3080 3079 3081 + 1028 1 3083 3082 3084 + 1029 1 3086 3085 3087 + 1030 1 3089 3088 3090 + 1031 1 3092 3091 3093 + 1032 1 3095 3094 3096 + 1033 1 3098 3097 3099 + 1034 1 3101 3100 3102 + 1035 1 3104 3103 3105 + 1036 1 3107 3106 3108 + 1037 1 3110 3109 3111 + 1038 1 3113 3112 3114 + 1039 1 3116 3115 3117 + 1040 1 3119 3118 3120 + 1041 1 3122 3121 3123 + 1042 1 3125 3124 3126 + 1043 1 3128 3127 3129 + 1044 1 3131 3130 3132 + 1045 1 3134 3133 3135 + 1046 1 3137 3136 3138 + 1047 1 3140 3139 3141 + 1048 1 3143 3142 3144 + 1049 1 3146 3145 3147 + 1050 1 3149 3148 3150 + 1051 1 3152 3151 3153 + 1052 1 3155 3154 3156 + 1053 1 3158 3157 3159 + 1054 1 3161 3160 3162 + 1055 1 3164 3163 3165 + 1056 1 3167 3166 3168 + 1057 1 3170 3169 3171 + 1058 1 3173 3172 3174 + 1059 1 3176 3175 3177 + 1060 1 3179 3178 3180 + 1061 1 3182 3181 3183 + 1062 1 3185 3184 3186 + 1063 1 3188 3187 3189 + 1064 1 3191 3190 3192 + 1065 1 3194 3193 3195 + 1066 1 3197 3196 3198 + 1067 1 3200 3199 3201 + 1068 1 3203 3202 3204 + 1069 1 3206 3205 3207 + 1070 1 3209 3208 3210 + 1071 1 3212 3211 3213 + 1072 1 3215 3214 3216 + 1073 1 3218 3217 3219 + 1074 1 3221 3220 3222 + 1075 1 3224 3223 3225 + 1076 1 3227 3226 3228 + 1077 1 3230 3229 3231 + 1078 1 3233 3232 3234 + 1079 1 3236 3235 3237 + 1080 1 3239 3238 3240 + 1081 1 3242 3241 3243 + 1082 1 3245 3244 3246 + 1083 1 3248 3247 3249 + 1084 1 3251 3250 3252 + 1085 1 3254 3253 3255 + 1086 1 3257 3256 3258 + 1087 1 3260 3259 3261 + 1088 1 3263 3262 3264 + 1089 1 3266 3265 3267 + 1090 1 3269 3268 3270 + 1091 1 3272 3271 3273 + 1092 1 3275 3274 3276 + 1093 1 3278 3277 3279 + 1094 1 3281 3280 3282 + 1095 1 3284 3283 3285 + 1096 1 3287 3286 3288 + 1097 1 3290 3289 3291 + 1098 1 3293 3292 3294 + 1099 1 3296 3295 3297 + 1100 1 3299 3298 3300 + 1101 1 3302 3301 3303 + 1102 1 3305 3304 3306 + 1103 1 3308 3307 3309 + 1104 1 3311 3310 3312 + 1105 1 3314 3313 3315 + 1106 1 3317 3316 3318 + 1107 1 3320 3319 3321 + 1108 1 3323 3322 3324 + 1109 1 3326 3325 3327 + 1110 1 3329 3328 3330 + 1111 1 3332 3331 3333 + 1112 1 3335 3334 3336 + 1113 1 3338 3337 3339 + 1114 1 3341 3340 3342 + 1115 1 3344 3343 3345 + 1116 1 3347 3346 3348 + 1117 1 3350 3349 3351 + 1118 1 3353 3352 3354 + 1119 1 3356 3355 3357 + 1120 1 3359 3358 3360 + 1121 1 3362 3361 3363 + 1122 1 3365 3364 3366 + 1123 1 3368 3367 3369 + 1124 1 3371 3370 3372 + 1125 1 3374 3373 3375 + 1126 1 3377 3376 3378 + 1127 1 3380 3379 3381 + 1128 1 3383 3382 3384 + 1129 1 3386 3385 3387 + 1130 1 3389 3388 3390 + 1131 1 3392 3391 3393 + 1132 1 3395 3394 3396 + 1133 1 3398 3397 3399 + 1134 1 3401 3400 3402 + 1135 1 3404 3403 3405 + 1136 1 3407 3406 3408 + 1137 1 3410 3409 3411 + 1138 1 3413 3412 3414 + 1139 1 3416 3415 3417 + 1140 1 3419 3418 3420 + 1141 1 3422 3421 3423 + 1142 1 3425 3424 3426 + 1143 1 3428 3427 3429 + 1144 1 3431 3430 3432 + 1145 1 3434 3433 3435 + 1146 1 3437 3436 3438 + 1147 1 3440 3439 3441 + 1148 1 3443 3442 3444 + 1149 1 3446 3445 3447 + 1150 1 3449 3448 3450 + 1151 1 3452 3451 3453 + 1152 1 3455 3454 3456 + 1153 1 3458 3457 3459 + 1154 1 3461 3460 3462 + 1155 1 3464 3463 3465 + 1156 1 3467 3466 3468 + 1157 1 3470 3469 3471 + 1158 1 3473 3472 3474 + 1159 1 3476 3475 3477 + 1160 1 3479 3478 3480 + 1161 1 3482 3481 3483 + 1162 1 3485 3484 3486 + 1163 1 3488 3487 3489 + 1164 1 3491 3490 3492 + 1165 1 3494 3493 3495 + 1166 1 3497 3496 3498 + 1167 1 3500 3499 3501 + 1168 1 3503 3502 3504 + 1169 1 3506 3505 3507 + 1170 1 3509 3508 3510 + 1171 1 3512 3511 3513 + 1172 1 3515 3514 3516 + 1173 1 3518 3517 3519 + 1174 1 3521 3520 3522 + 1175 1 3524 3523 3525 + 1176 1 3527 3526 3528 + 1177 1 3530 3529 3531 + 1178 1 3533 3532 3534 + 1179 1 3536 3535 3537 + 1180 1 3539 3538 3540 + 1181 1 3542 3541 3543 + 1182 1 3545 3544 3546 + 1183 1 3548 3547 3549 + 1184 1 3551 3550 3552 + 1185 1 3554 3553 3555 + 1186 1 3557 3556 3558 + 1187 1 3560 3559 3561 + 1188 1 3563 3562 3564 + 1189 1 3566 3565 3567 + 1190 1 3569 3568 3570 + 1191 1 3572 3571 3573 + 1192 1 3575 3574 3576 + 1193 1 3578 3577 3579 + 1194 1 3581 3580 3582 + 1195 1 3584 3583 3585 + 1196 1 3587 3586 3588 + 1197 1 3590 3589 3591 + 1198 1 3593 3592 3594 + 1199 1 3596 3595 3597 + 1200 1 3599 3598 3600 + 1201 1 3602 3601 3603 + 1202 1 3605 3604 3606 + 1203 1 3608 3607 3609 + 1204 1 3611 3610 3612 + 1205 1 3614 3613 3615 + 1206 1 3617 3616 3618 + 1207 1 3620 3619 3621 + 1208 1 3623 3622 3624 + 1209 1 3626 3625 3627 + 1210 1 3629 3628 3630 + 1211 1 3632 3631 3633 + 1212 1 3635 3634 3636 + 1213 1 3638 3637 3639 + 1214 1 3641 3640 3642 + 1215 1 3644 3643 3645 + 1216 1 3647 3646 3648 + 1217 1 3650 3649 3651 + 1218 1 3653 3652 3654 + 1219 1 3656 3655 3657 + 1220 1 3659 3658 3660 + 1221 1 3662 3661 3663 + 1222 1 3665 3664 3666 + 1223 1 3668 3667 3669 + 1224 1 3671 3670 3672 + 1225 1 3674 3673 3675 + 1226 1 3677 3676 3678 + 1227 1 3680 3679 3681 + 1228 1 3683 3682 3684 + 1229 1 3686 3685 3687 + 1230 1 3689 3688 3690 + 1231 1 3692 3691 3693 + 1232 1 3695 3694 3696 + 1233 1 3698 3697 3699 + 1234 1 3701 3700 3702 + 1235 1 3704 3703 3705 + 1236 1 3707 3706 3708 + 1237 1 3710 3709 3711 + 1238 1 3713 3712 3714 + 1239 1 3716 3715 3717 + 1240 1 3719 3718 3720 + 1241 1 3722 3721 3723 + 1242 1 3725 3724 3726 + 1243 1 3728 3727 3729 + 1244 1 3731 3730 3732 + 1245 1 3734 3733 3735 + 1246 1 3737 3736 3738 + 1247 1 3740 3739 3741 + 1248 1 3743 3742 3744 + 1249 1 3746 3745 3747 + 1250 1 3749 3748 3750 + 1251 1 3752 3751 3753 + 1252 1 3755 3754 3756 + 1253 1 3758 3757 3759 + 1254 1 3761 3760 3762 + 1255 1 3764 3763 3765 + 1256 1 3767 3766 3768 + 1257 1 3770 3769 3771 + 1258 1 3773 3772 3774 + 1259 1 3776 3775 3777 + 1260 1 3779 3778 3780 + 1261 1 3782 3781 3783 + 1262 1 3785 3784 3786 + 1263 1 3788 3787 3789 + 1264 1 3791 3790 3792 + 1265 1 3794 3793 3795 + 1266 1 3797 3796 3798 + 1267 1 3800 3799 3801 + 1268 1 3803 3802 3804 + 1269 1 3806 3805 3807 + 1270 1 3809 3808 3810 + 1271 1 3812 3811 3813 + 1272 1 3815 3814 3816 + 1273 1 3818 3817 3819 + 1274 1 3821 3820 3822 + 1275 1 3824 3823 3825 + 1276 1 3827 3826 3828 + 1277 1 3830 3829 3831 + 1278 1 3833 3832 3834 + 1279 1 3836 3835 3837 + 1280 1 3839 3838 3840 + 1281 1 3842 3841 3843 + 1282 1 3845 3844 3846 + 1283 1 3848 3847 3849 + 1284 1 3851 3850 3852 + 1285 1 3854 3853 3855 + 1286 1 3857 3856 3858 + 1287 1 3860 3859 3861 + 1288 1 3863 3862 3864 + 1289 1 3866 3865 3867 + 1290 1 3869 3868 3870 + 1291 1 3872 3871 3873 + 1292 1 3875 3874 3876 + 1293 1 3878 3877 3879 + 1294 1 3881 3880 3882 + 1295 1 3884 3883 3885 + 1296 1 3887 3886 3888 + 1297 1 3890 3889 3891 + 1298 1 3893 3892 3894 + 1299 1 3896 3895 3897 + 1300 1 3899 3898 3900 + 1301 1 3902 3901 3903 + 1302 1 3905 3904 3906 + 1303 1 3908 3907 3909 + 1304 1 3911 3910 3912 + 1305 1 3914 3913 3915 + 1306 1 3917 3916 3918 + 1307 1 3920 3919 3921 + 1308 1 3923 3922 3924 + 1309 1 3926 3925 3927 + 1310 1 3929 3928 3930 + 1311 1 3932 3931 3933 + 1312 1 3935 3934 3936 + 1313 1 3938 3937 3939 + 1314 1 3941 3940 3942 + 1315 1 3944 3943 3945 + 1316 1 3947 3946 3948 + 1317 1 3950 3949 3951 + 1318 1 3953 3952 3954 + 1319 1 3956 3955 3957 + 1320 1 3959 3958 3960 + 1321 1 3962 3961 3963 + 1322 1 3965 3964 3966 + 1323 1 3968 3967 3969 + 1324 1 3971 3970 3972 + 1325 1 3974 3973 3975 + 1326 1 3977 3976 3978 + 1327 1 3980 3979 3981 + 1328 1 3983 3982 3984 + 1329 1 3986 3985 3987 + 1330 1 3989 3988 3990 + 1331 1 3992 3991 3993 + 1332 1 3995 3994 3996 + 1333 1 3998 3997 3999 + 1334 1 4001 4000 4002 + 1335 1 4004 4003 4005 + 1336 1 4007 4006 4008 + 1337 1 4010 4009 4011 + 1338 1 4013 4012 4014 + 1339 1 4016 4015 4017 + 1340 1 4019 4018 4020 + 1341 1 4022 4021 4023 + 1342 1 4025 4024 4026 + 1343 1 4028 4027 4029 + 1344 1 4031 4030 4032 + 1345 1 4034 4033 4035 + 1346 1 4037 4036 4038 + 1347 1 4040 4039 4041 + 1348 1 4043 4042 4044 + 1349 1 4046 4045 4047 + 1350 1 4049 4048 4050 + 1351 1 4052 4051 4053 + 1352 1 4055 4054 4056 + 1353 1 4058 4057 4059 + 1354 1 4061 4060 4062 + 1355 1 4064 4063 4065 + 1356 1 4067 4066 4068 + 1357 1 4070 4069 4071 + 1358 1 4073 4072 4074 + 1359 1 4076 4075 4077 + 1360 1 4079 4078 4080 + 1361 1 4082 4081 4083 + 1362 1 4085 4084 4086 + 1363 1 4088 4087 4089 + 1364 1 4091 4090 4092 + 1365 1 4094 4093 4095 + 1366 1 4097 4096 4098 + 1367 1 4100 4099 4101 + 1368 1 4103 4102 4104 + 1369 1 4106 4105 4107 + 1370 1 4109 4108 4110 + 1371 1 4112 4111 4113 + 1372 1 4115 4114 4116 + 1373 1 4118 4117 4119 + 1374 1 4121 4120 4122 + 1375 1 4124 4123 4125 + 1376 1 4127 4126 4128 + 1377 1 4130 4129 4131 + 1378 1 4133 4132 4134 + 1379 1 4136 4135 4137 + 1380 1 4139 4138 4140 + 1381 1 4142 4141 4143 + 1382 1 4145 4144 4146 + 1383 1 4148 4147 4149 + 1384 1 4151 4150 4152 + 1385 1 4154 4153 4155 + 1386 1 4157 4156 4158 + 1387 1 4160 4159 4161 + 1388 1 4163 4162 4164 + 1389 1 4166 4165 4167 + 1390 1 4169 4168 4170 + 1391 1 4172 4171 4173 + 1392 1 4175 4174 4176 + 1393 1 4178 4177 4179 + 1394 1 4181 4180 4182 + 1395 1 4184 4183 4185 + 1396 1 4187 4186 4188 + 1397 1 4190 4189 4191 + 1398 1 4193 4192 4194 + 1399 1 4196 4195 4197 + 1400 1 4199 4198 4200 + 1401 1 4202 4201 4203 + 1402 1 4205 4204 4206 + 1403 1 4208 4207 4209 + 1404 1 4211 4210 4212 + 1405 1 4214 4213 4215 + 1406 1 4217 4216 4218 + 1407 1 4220 4219 4221 + 1408 1 4223 4222 4224 + 1409 1 4226 4225 4227 + 1410 1 4229 4228 4230 + 1411 1 4232 4231 4233 + 1412 1 4235 4234 4236 + 1413 1 4238 4237 4239 + 1414 1 4241 4240 4242 + 1415 1 4244 4243 4245 + 1416 1 4247 4246 4248 + 1417 1 4250 4249 4251 + 1418 1 4253 4252 4254 + 1419 1 4256 4255 4257 + 1420 1 4259 4258 4260 + 1421 1 4262 4261 4263 + 1422 1 4265 4264 4266 + 1423 1 4268 4267 4269 + 1424 1 4271 4270 4272 + 1425 1 4274 4273 4275 + 1426 1 4277 4276 4278 + 1427 1 4280 4279 4281 + 1428 1 4283 4282 4284 + 1429 1 4286 4285 4287 + 1430 1 4289 4288 4290 + 1431 1 4292 4291 4293 + 1432 1 4295 4294 4296 + 1433 1 4298 4297 4299 + 1434 1 4301 4300 4302 + 1435 1 4304 4303 4305 + 1436 1 4307 4306 4308 + 1437 1 4310 4309 4311 + 1438 1 4313 4312 4314 + 1439 1 4316 4315 4317 + 1440 1 4319 4318 4320 + 1441 1 4322 4321 4323 + 1442 1 4325 4324 4326 + 1443 1 4328 4327 4329 + 1444 1 4331 4330 4332 + 1445 1 4334 4333 4335 + 1446 1 4337 4336 4338 + 1447 1 4340 4339 4341 + 1448 1 4343 4342 4344 + 1449 1 4346 4345 4347 + 1450 1 4349 4348 4350 + 1451 1 4352 4351 4353 + 1452 1 4355 4354 4356 + 1453 1 4358 4357 4359 + 1454 1 4361 4360 4362 + 1455 1 4364 4363 4365 + 1456 1 4367 4366 4368 + 1457 1 4370 4369 4371 + 1458 1 4373 4372 4374 + 1459 1 4376 4375 4377 + 1460 1 4379 4378 4380 + 1461 1 4382 4381 4383 + 1462 1 4385 4384 4386 + 1463 1 4388 4387 4389 + 1464 1 4391 4390 4392 + 1465 1 4394 4393 4395 + 1466 1 4397 4396 4398 + 1467 1 4400 4399 4401 + 1468 1 4403 4402 4404 + 1469 1 4406 4405 4407 + 1470 1 4409 4408 4410 + 1471 1 4412 4411 4413 + 1472 1 4415 4414 4416 + 1473 1 4418 4417 4419 + 1474 1 4421 4420 4422 + 1475 1 4424 4423 4425 + 1476 1 4427 4426 4428 + 1477 1 4430 4429 4431 + 1478 1 4433 4432 4434 + 1479 1 4436 4435 4437 + 1480 1 4439 4438 4440 + 1481 1 4442 4441 4443 + 1482 1 4445 4444 4446 + 1483 1 4448 4447 4449 + 1484 1 4451 4450 4452 + 1485 1 4454 4453 4455 + 1486 1 4457 4456 4458 + 1487 1 4460 4459 4461 + 1488 1 4463 4462 4464 + 1489 1 4466 4465 4467 + 1490 1 4469 4468 4470 + 1491 1 4472 4471 4473 + 1492 1 4475 4474 4476 + 1493 1 4478 4477 4479 + 1494 1 4481 4480 4482 + 1495 1 4484 4483 4485 + 1496 1 4487 4486 4488 + 1497 1 4490 4489 4491 + 1498 1 4493 4492 4494 + 1499 1 4496 4495 4497 + 1500 1 4499 4498 4500 diff --git a/examples/python/in.pair_python_coulomb b/examples/python/in.pair_python_coulomb new file mode 100644 index 0000000000..87a8fa69ce --- /dev/null +++ b/examples/python/in.pair_python_coulomb @@ -0,0 +1,45 @@ +units real +atom_style full + +read_data data.spce + +pair_style hybrid/overlay python 12.0 coul/long 12.0 +kspace_style pppm 1.0e-6 + +pair_coeff * * coul/long +pair_coeff * * python potentials.LJCutSPCE OW NULL + +pair_modify table 0 + +bond_style harmonic +angle_style harmonic +dihedral_style none +improper_style none + +bond_coeff 1 1000.00 1.000 +angle_coeff 1 100.0 109.47 + +special_bonds lj/coul 0.0 0.0 1.0 + +neighbor 2.0 bin + +fix 1 all shake 0.0001 20 0 b 1 a 1 +fix 2 all nvt temp 300.0 300.0 100.0 + +# create combined lj/coul table for all atom types +# generate tabulated potential from python variant +pair_write 1 1 2000 rsq 0.1 12 spce.table OW-OW -0.8472 -0.8472 +pair_write 1 2 2000 rsq 0.1 12 spce.table OW-HW -0.8472 0.4236 +pair_write 2 2 2000 rsq 0.1 12 spce.table HW-HW 0.4236 0.4236 + +# switch to tabulated potential +pair_style table linear 2000 pppm +pair_coeff 1 1 spce.table OW-OW +pair_coeff 1 2 spce.table OW-HW +pair_coeff 2 2 spce.table HW-HW + +thermo 10 +run 100 + +shell rm spce.table + diff --git a/examples/python/in.pair_python_table b/examples/python/in.pair_python_table new file mode 100644 index 0000000000..87dad849cc --- /dev/null +++ b/examples/python/in.pair_python_table @@ -0,0 +1,32 @@ +# 3d Lennard-Jones melt + +units lj +atom_style atomic + +lattice fcc 0.8442 +region box block 0 10 0 10 0 10 +create_box 1 box +create_atoms 1 box +mass * 1.0 + +velocity all create 3.0 87287 + +pair_style python 2.5 +pair_coeff * * potentials.LJCutMelt lj + +# generate tabulated potential from python variant +pair_write 1 1 10000 rsq 0.01 2.5 lj_1_1.table LJ + +pair_style table linear 10000 +pair_coeff 1 1 lj_1_1.table LJ + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 + +shell rm lj_1_1.table + diff --git a/examples/python/log.4May17.pair_python_coulomb.1 b/examples/python/log.4May17.pair_python_coulomb.1 new file mode 100644 index 0000000000..97826eda47 --- /dev/null +++ b/examples/python/log.4May17.pair_python_coulomb.1 @@ -0,0 +1,178 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task +units real +atom_style full + +read_data data.spce + orthogonal box = (0.02645 0.02645 0.02641) to (35.5328 35.5328 35.4736) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 4500 atoms + scanning bonds ... + 2 = max bonds/atom + scanning angles ... + 1 = max angles/atom + reading bonds ... + 3000 bonds + reading angles ... + 1500 angles + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + +pair_style hybrid/overlay python 12.0 coul/long 12.0 +kspace_style pppm 1.0e-6 + +pair_coeff * * coul/long +pair_coeff * * python potentials.LJCutSPCE OW NULL + +pair_modify table 0 + +bond_style harmonic +angle_style harmonic +dihedral_style none +improper_style none + +bond_coeff 1 1000.00 1.000 +angle_coeff 1 100.0 109.47 + +special_bonds lj/coul 0.0 0.0 1.0 + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 2 = max # of special neighbors + +neighbor 2.0 bin + +fix 1 all shake 0.0001 20 0 b 1 a 1 + 0 = # of size 2 clusters + 0 = # of size 3 clusters + 0 = # of size 4 clusters + 1500 = # of frozen angles +fix 2 all nvt temp 300.0 300.0 100.0 + +# create combined lj/coul table for all atom types +# generate tabulated potential from python variant +pair_write 1 1 2000 rsq 0.1 12 spce.table OW-OW -0.8472 -0.8472 +PPPM initialization ... +WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394206 + estimated relative force accuracy = 1.18714e-06 + using double precision FFTs + 3d grid and FFT values/proc = 103823 64000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair python, perpetual, skip from (2) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (2) pair coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +pair_write 1 2 2000 rsq 0.1 12 spce.table OW-HW -0.8472 0.4236 +PPPM initialization ... +WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394206 + estimated relative force accuracy = 1.18714e-06 + using double precision FFTs + 3d grid and FFT values/proc = 103823 64000 +pair_write 2 2 2000 rsq 0.1 12 spce.table HW-HW 0.4236 0.4236 +PPPM initialization ... +WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394206 + estimated relative force accuracy = 1.18714e-06 + using double precision FFTs + 3d grid and FFT values/proc = 103823 64000 + +# switch to tabulated potential +pair_style table linear 2000 pppm +pair_coeff 1 1 spce.table OW-OW +pair_coeff 1 2 spce.table OW-HW +pair_coeff 2 2 spce.table HW-HW + +thermo 10 +run 100 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394674 + estimated relative force accuracy = 1.18855e-06 + using double precision FFTs + 3d grid and FFT values/proc = 103823 64000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 6 6 6 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair table, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 35.26 | 35.26 | 35.26 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -100272.97 0 -100272.97 -1282.0708 + 10 120.61568 -101350.63 0 -100272.39 -4077.5051 + 20 136.11379 -101465.43 0 -100248.65 -5136.5677 + 30 137.01602 -101455.3 0 -100230.46 -5347.8311 + 40 153.424 -101582.46 0 -100210.93 -5223.1676 + 50 167.73654 -101686.24 0 -100186.77 -4468.6687 + 60 163.11642 -101618.16 0 -100159.99 -3291.7815 + 70 169.64512 -101647.89 0 -100131.35 -2611.638 + 80 182.9979 -101737.01 0 -100101.11 -2390.6293 + 90 191.33873 -101778.71 0 -100068.24 -2239.386 + 100 194.7458 -101775.84 0 -100034.92 -1951.9128 +Loop time of 7.60221 on 1 procs for 100 steps with 4500 atoms + +Performance: 1.137 ns/day, 21.117 hours/ns, 13.154 timesteps/s +99.7% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 5.7401 | 5.7401 | 5.7401 | 0.0 | 75.51 +Bond | 0.00017881 | 0.00017881 | 0.00017881 | 0.0 | 0.00 +Kspace | 1.5387 | 1.5387 | 1.5387 | 0.0 | 20.24 +Neigh | 0.2299 | 0.2299 | 0.2299 | 0.0 | 3.02 +Comm | 0.024311 | 0.024311 | 0.024311 | 0.0 | 0.32 +Output | 0.00057936 | 0.00057936 | 0.00057936 | 0.0 | 0.01 +Modify | 0.063158 | 0.063158 | 0.063158 | 0.0 | 0.83 +Other | | 0.005243 | | | 0.07 + +Nlocal: 4500 ave 4500 max 4500 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 21216 ave 21216 max 21216 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 2.60177e+06 ave 2.60177e+06 max 2.60177e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 2601766 +Ave neighs/atom = 578.17 +Ave special neighs/atom = 2 +Neighbor list builds = 3 +Dangerous builds = 0 + +shell rm spce.table + +Total wall time: 0:00:07 diff --git a/examples/python/log.4May17.pair_python_coulomb.4 b/examples/python/log.4May17.pair_python_coulomb.4 new file mode 100644 index 0000000000..a3b13cfbaf --- /dev/null +++ b/examples/python/log.4May17.pair_python_coulomb.4 @@ -0,0 +1,178 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task +units real +atom_style full + +read_data data.spce + orthogonal box = (0.02645 0.02645 0.02641) to (35.5328 35.5328 35.4736) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 4500 atoms + scanning bonds ... + 2 = max bonds/atom + scanning angles ... + 1 = max angles/atom + reading bonds ... + 3000 bonds + reading angles ... + 1500 angles + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + +pair_style hybrid/overlay python 12.0 coul/long 12.0 +kspace_style pppm 1.0e-6 + +pair_coeff * * coul/long +pair_coeff * * python potentials.LJCutSPCE OW NULL + +pair_modify table 0 + +bond_style harmonic +angle_style harmonic +dihedral_style none +improper_style none + +bond_coeff 1 1000.00 1.000 +angle_coeff 1 100.0 109.47 + +special_bonds lj/coul 0.0 0.0 1.0 + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 2 = max # of special neighbors + +neighbor 2.0 bin + +fix 1 all shake 0.0001 20 0 b 1 a 1 + 0 = # of size 2 clusters + 0 = # of size 3 clusters + 0 = # of size 4 clusters + 1500 = # of frozen angles +fix 2 all nvt temp 300.0 300.0 100.0 + +# create combined lj/coul table for all atom types +# generate tabulated potential from python variant +pair_write 1 1 2000 rsq 0.1 12 spce.table OW-OW -0.8472 -0.8472 +PPPM initialization ... +WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394206 + estimated relative force accuracy = 1.18714e-06 + using double precision FFTs + 3d grid and FFT values/proc = 34263 16000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair python, perpetual, skip from (2) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (2) pair coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +pair_write 1 2 2000 rsq 0.1 12 spce.table OW-HW -0.8472 0.4236 +PPPM initialization ... +WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394206 + estimated relative force accuracy = 1.18714e-06 + using double precision FFTs + 3d grid and FFT values/proc = 34263 16000 +pair_write 2 2 2000 rsq 0.1 12 spce.table HW-HW 0.4236 0.4236 +PPPM initialization ... +WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394206 + estimated relative force accuracy = 1.18714e-06 + using double precision FFTs + 3d grid and FFT values/proc = 34263 16000 + +# switch to tabulated potential +pair_style table linear 2000 pppm +pair_coeff 1 1 spce.table OW-OW +pair_coeff 1 2 spce.table OW-HW +pair_coeff 2 2 spce.table HW-HW + +thermo 10 +run 100 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394674 + estimated relative force accuracy = 1.18855e-06 + using double precision FFTs + 3d grid and FFT values/proc = 34263 16000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 6 6 6 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair table, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 13.05 | 13.05 | 13.05 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -100272.97 0 -100272.97 -1282.0708 + 10 120.61568 -101350.63 0 -100272.39 -4077.5051 + 20 136.11379 -101465.43 0 -100248.65 -5136.5677 + 30 137.01602 -101455.3 0 -100230.46 -5347.8311 + 40 153.424 -101582.46 0 -100210.93 -5223.1676 + 50 167.73654 -101686.24 0 -100186.77 -4468.6687 + 60 163.11642 -101618.16 0 -100159.99 -3291.7815 + 70 169.64512 -101647.89 0 -100131.35 -2611.638 + 80 182.9979 -101737.01 0 -100101.11 -2390.6293 + 90 191.33873 -101778.71 0 -100068.24 -2239.386 + 100 194.7458 -101775.84 0 -100034.92 -1951.9128 +Loop time of 2.38392 on 4 procs for 100 steps with 4500 atoms + +Performance: 3.624 ns/day, 6.622 hours/ns, 41.948 timesteps/s +99.1% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.4377 | 1.5465 | 1.6848 | 7.3 | 64.87 +Bond | 0.00010276 | 0.00012648 | 0.0001452 | 0.0 | 0.01 +Kspace | 0.53311 | 0.66842 | 0.77484 | 10.9 | 28.04 +Neigh | 0.066 | 0.066074 | 0.066101 | 0.0 | 2.77 +Comm | 0.045355 | 0.048344 | 0.050747 | 1.0 | 2.03 +Output | 0.00042391 | 0.00044996 | 0.00052667 | 0.0 | 0.02 +Modify | 0.049891 | 0.050191 | 0.050336 | 0.1 | 2.11 +Other | | 0.003771 | | | 0.16 + +Nlocal: 1125 ave 1154 max 1092 min +Histogram: 1 0 0 0 1 0 0 1 0 1 +Nghost: 12256.2 ave 12296 max 12213 min +Histogram: 1 0 1 0 0 0 0 0 1 1 +Neighs: 650442 ave 678824 max 626375 min +Histogram: 1 0 0 0 2 0 0 0 0 1 + +Total # of neighbors = 2601766 +Ave neighs/atom = 578.17 +Ave special neighs/atom = 2 +Neighbor list builds = 3 +Dangerous builds = 0 + +shell rm spce.table + +Total wall time: 0:00:02 diff --git a/examples/python/log.4May17.pair_python_table.g++.1 b/examples/python/log.4May17.pair_python_table.g++.1 new file mode 100644 index 0000000000..21d42693ba --- /dev/null +++ b/examples/python/log.4May17.pair_python_table.g++.1 @@ -0,0 +1,99 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic + +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 1 box +Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 1 by 1 MPI processor grid +create_atoms 1 box +Created 4000 atoms +mass * 1.0 + +velocity all create 3.0 87287 + +pair_style python 2.5 +pair_coeff * * potentials.LJCutMelt lj + +# generate tabulated potential from python variant +pair_write 1 1 10000 rsq 0.01 2.5 lj_1_1.table LJ +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 = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair python, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard + +pair_style table linear 10000 +pair_coeff 1 1 lj_1_1.table LJ +WARNING: 1 of 1000 force values in table are inconsistent with -dE/dr. + Should only be flagged at inflection points (../pair_table.cpp:476) + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair table, 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.184 | 3.184 | 3.184 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 3 -6.7733675 0 -2.2744925 -3.7033435 + 50 1.6758875 -4.7951764 0 -2.2819736 5.6705794 + 100 1.6458266 -4.7488945 0 -2.2807717 5.8696895 + 150 1.6324439 -4.7283321 0 -2.2802784 5.9594952 + 200 1.6630547 -4.7746809 0 -2.2807225 5.7372657 + 250 1.6278968 -4.7226363 0 -2.2814016 5.9559236 +Loop time of 1.0498 on 1 procs for 250 steps with 4000 atoms + +Performance: 102877.190 tau/day, 238.142 timesteps/s +99.7% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.93242 | 0.93242 | 0.93242 | 0.0 | 88.82 +Neigh | 0.088495 | 0.088495 | 0.088495 | 0.0 | 8.43 +Comm | 0.012153 | 0.012153 | 0.012153 | 0.0 | 1.16 +Output | 0.00013924 | 0.00013924 | 0.00013924 | 0.0 | 0.01 +Modify | 0.013729 | 0.013729 | 0.013729 | 0.0 | 1.31 +Other | | 0.002855 | | | 0.27 + +Nlocal: 4000 ave 4000 max 4000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 5504 ave 5504 max 5504 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 151497 ave 151497 max 151497 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 151497 +Ave neighs/atom = 37.8743 +Neighbor list builds = 12 +Dangerous builds not checked + +shell rm lj_1_1.table + +Total wall time: 0:00:01 diff --git a/examples/python/log.4May17.pair_python_table.g++.4 b/examples/python/log.4May17.pair_python_table.g++.4 new file mode 100644 index 0000000000..a64ebd6631 --- /dev/null +++ b/examples/python/log.4May17.pair_python_table.g++.4 @@ -0,0 +1,99 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task +# 3d Lennard-Jones melt + +units lj +atom_style atomic + +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 1 box +Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) + 1 by 2 by 2 MPI processor grid +create_atoms 1 box +Created 4000 atoms +mass * 1.0 + +velocity all create 3.0 87287 + +pair_style python 2.5 +pair_coeff * * potentials.LJCutMelt lj + +# generate tabulated potential from python variant +pair_write 1 1 10000 rsq 0.01 2.5 lj_1_1.table LJ +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 = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair python, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard + +pair_style table linear 10000 +pair_coeff 1 1 lj_1_1.table LJ +WARNING: 1 of 10000 force values in table are inconsistent with -dE/dr. + Should only be flagged at inflection points (../pair_table.cpp:476) + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve + +thermo 50 +run 250 +Neighbor list info ... + update every 20 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 12 12 12 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair table, 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) = 2.69 | 2.69 | 2.69 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 3 -6.7733675 0 -2.2744925 -3.7033435 + 50 1.6754092 -4.794723 0 -2.2822376 5.6616601 + 100 1.6503295 -4.7559815 0 -2.2811061 5.8051261 + 150 1.6596603 -4.7699379 0 -2.2810699 5.7830168 + 200 1.6371948 -4.7365549 0 -2.2813766 5.9245585 + 250 1.6321199 -4.7288017 0 -2.2812339 5.9776124 +Loop time of 0.313548 on 4 procs for 250 steps with 4000 atoms + +Performance: 344444.576 tau/day, 797.325 timesteps/s +99.1% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.24963 | 0.25443 | 0.2632 | 1.1 | 81.15 +Neigh | 0.023249 | 0.023735 | 0.024497 | 0.3 | 7.57 +Comm | 0.020689 | 0.030402 | 0.035249 | 3.4 | 9.70 +Output | 0.00020766 | 0.00021476 | 0.00023031 | 0.0 | 0.07 +Modify | 0.0034959 | 0.0035564 | 0.0036762 | 0.1 | 1.13 +Other | | 0.001206 | | | 0.38 + +Nlocal: 1000 ave 1010 max 982 min +Histogram: 1 0 0 0 0 0 1 0 0 2 +Nghost: 2703.75 ave 2713 max 2689 min +Histogram: 1 0 0 0 0 0 0 2 0 1 +Neighs: 37915.5 ave 39231 max 36202 min +Histogram: 1 0 0 0 0 1 1 0 0 1 + +Total # of neighbors = 151662 +Ave neighs/atom = 37.9155 +Neighbor list builds = 12 +Dangerous builds not checked + +shell rm lj_1_1.table + +Total wall time: 0:00:00 diff --git a/src/PYTHON/pair_python.cpp b/src/PYTHON/pair_python.cpp index 381b9050ff..1d80145c58 100644 --- a/src/PYTHON/pair_python.cpp +++ b/src/PYTHON/pair_python.cpp @@ -35,7 +35,7 @@ using namespace LAMMPS_NS; PairPython::PairPython(LAMMPS *lmp) : Pair(lmp) { respa_enable = 0; - single_enable = 0; + single_enable = 1; writedata = 0; restartinfo = 0; one_coeff = 1; @@ -46,7 +46,7 @@ PairPython::PairPython(LAMMPS *lmp) : Pair(lmp) { py_potential = NULL; // add current directory to PYTHONPATH - PyObject * py_path = PySys_GetObject("path"); + PyObject * py_path = PySys_GetObject((char *)"path"); PyList_Append(py_path, PY_STRING_FROM_STRING(".")); // if LAMMPS_POTENTIALS environment variable is set, add it to PYTHONPATH as well @@ -353,3 +353,83 @@ double PairPython::init_one(int, int) return cut_global; } +/* ---------------------------------------------------------------------- */ + +double PairPython::single(int i, int j, int itype, int jtype, double rsq, + double factor_coul, double factor_lj, + double &fforce) +{ + + // prepare access to compute_force and compute_energy functions + + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject *py_pair_instance = (PyObject *) py_potential; + PyObject *py_compute_force + = PyObject_GetAttrString(py_pair_instance,"compute_force"); + if (!py_compute_force) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'compute_force' method'"); + } + if (!PyCallable_Check(py_compute_force)) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Python 'compute_force' is not callable"); + } + + PyObject *py_compute_energy + = PyObject_GetAttrString(py_pair_instance,"compute_energy"); + if (!py_compute_energy) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'compute_energy' method'"); + } + if (!PyCallable_Check(py_compute_energy)) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Python 'compute_energy' is not callable"); + } + + PyObject *py_rsq, *py_itype, *py_jtype, *py_value; + PyObject *py_compute_args = PyTuple_New(3); + if (!py_compute_args) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not create tuple for 'compute' function arguments"); + } + + py_itype = PY_INT_FROM_LONG(itype); + PyTuple_SetItem(py_compute_args,1,py_itype); + py_jtype = PY_INT_FROM_LONG(jtype); + PyTuple_SetItem(py_compute_args,2,py_jtype); + py_rsq = PyFloat_FromDouble(rsq); + PyTuple_SetItem(py_compute_args,0,py_rsq); + + py_value = PyObject_CallObject(py_compute_force,py_compute_args); + if (!py_value) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Calling 'compute_force' function failed"); + } + fforce = factor_lj*PyFloat_AsDouble(py_value)/rsq; + + py_value = PyObject_CallObject(py_compute_energy,py_compute_args); + if (!py_value) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Calling 'compute_energy' function failed"); + } + double evdwl = factor_lj*PyFloat_AsDouble(py_value); + + Py_DECREF(py_compute_args); + PyGILState_Release(gstate); + + return evdwl; +} diff --git a/src/PYTHON/pair_python.h b/src/PYTHON/pair_python.h index e038d9b25e..3c9c34fbdf 100644 --- a/src/PYTHON/pair_python.h +++ b/src/PYTHON/pair_python.h @@ -42,6 +42,7 @@ class PairPython : public Pair { void settings(int, char **); void coeff(int, char **); double init_one(int, int); + double single(int, int, int, int, double, double, double, double &); protected: double cut_global; From 1d48f287f00acc5bbf6d922cd30e9305ce455ee7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 17 May 2017 19:05:18 -0400 Subject: [PATCH 040/302] add partial documentation for pair style python --- doc/src/Section_python.txt | 2 + doc/src/lammps.book | 2 + doc/src/pair_python.txt | 137 +++++++++++++++++++ doc/src/pairs.txt | 1 + examples/python/{potentials.py => py_pot.py} | 0 5 files changed, 142 insertions(+) create mode 100644 doc/src/pair_python.txt rename examples/python/{potentials.py => py_pot.py} (100%) diff --git a/doc/src/Section_python.txt b/doc/src/Section_python.txt index 5d366f6b6c..7b62f7e948 100644 --- a/doc/src/Section_python.txt +++ b/doc/src/Section_python.txt @@ -157,6 +157,8 @@ doc page for its python-style variables for more info, including examples of Python code you can write for both pure Python operations and callbacks to LAMMPS. See "fix python"_fix_python.html to learn about possibilities to execute Python code during each time step. +Through the "python pair style"_pair_python.html it is also possible +to define potential functions as python code. To run pure Python code from LAMMPS, you only need to build LAMMPS with the PYTHON package installed: diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 6b3ca8aa07..6fbdbb9e78 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -237,6 +237,7 @@ fix_pour.html fix_press_berendsen.html fix_print.html fix_property_atom.html +fix_python.html fix_qbmsst.html fix_qeq.html fix_qeq_comb.html @@ -467,6 +468,7 @@ pair_oxdna.html pair_oxdna2.html pair_peri.html pair_polymorphic.html +pair_python.html pair_quip.html pair_reax.html pair_reaxc.html diff --git a/doc/src/pair_python.txt b/doc/src/pair_python.txt new file mode 100644 index 0000000000..2f034031f1 --- /dev/null +++ b/doc/src/pair_python.txt @@ -0,0 +1,137 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +pair_style python command :h3 + +[Syntax:] + +pair_style python cutoff :pre + +cutoff = global cutoff for interactions in python potential classes + +[Examples:] + +pair_style python 2.5 +pair_coeff * * py_pot.LJCutMelt lj :pre + +pair_style hybrid/overlay coul/long 12.0 python 12.0 +pair_coeff * * coul/long +pair_coeff * * python py_pot.LJCutSPCE OW NULL :pre + +[Description:] + +The {python} pair style provides a way to define pairwise additive +potential functions as scripted python script code that is loaded +into LAMMPS from a python file which must contain specific python +class definitions. This allows to model potentials, that are not +currently available in LAMMPS without having to program a new +pair style or modify an existing one and recompile LAMMPS. Due to +python being an interpreted language, the performance of this pair +style is going to be significantly slower (often between 20x and 100x), +but this penalty can be significantly reduced through generating +tabulations from the python code through the "pair_write"_pair_write.html +command. + +Only a single pair_coeff command is used with the {python} pair style +which specifies a python class inside a python module that LAMMPS will +look up either in the current directory, the folder pointed to by the +LAMMPS_POTENTIALS environment variable or somewhere in your python path. +The class definition has to follow specific rules as explained below. + +Atom types in the python class are specified through symbolic constants, +typically strings. These are mapped to LAMMPS atom types by specifying +N additional arguments after the filename in the pair_coeff command, +where N is the number of LAMMPS atom types: + +module.class +N element names = mapping of python atom types to LAMMPS atom types :ul + +As an example, imagine a file py_pot.py has a python class LJCutMelt +with parameters and potential functions for a two Lennard-Jones +atom types labeled as 'LJ1' and 'LJ2', and you would have defined +4 atom types in LAMMPS, out which the first three are supposed to be +using the 'LJ1' parameters and the fourth the 'LJ2' parameters, then +you would use the following pair_coeff command: + +pair_coeff * * py_pot.LJCutMelt LJ1 LJ1 LJ1 LJ2 :pre + +The 1st 2 arguments must be * * so as to span all LAMMPS atom types. +The first three LJ1 arguments map LAMMPS atom types 1,2,3 to the LJ1 +atom type in the py_pot.py file. The final LJ2 argument maps LAMMPS +atom type 4 to the LJ2 atom type the python file. If a mapping value +is specified as NULL, the mapping is not performed. This can be used +when a {python} 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. + +The python potential file has to provide classes for the computation +of the potential energy and forces, which have to contain three methods: +{map_coeff}, {compute_force}, and {compute_energy}. For details please +see the provided examples in the examples/python folder. + +:line + +IMPORTANT NOTE: The evaluation of scripted python code will slow down +the computation pair-wise interactions very significantly. However, +this can be largely worked around through using the python pair style +to generate tabulated potentials on the fly. Please see below for an +example of how to build the table file: + +pair_style python 2.5 +pair_coeff * * py_pot.LJCutMelt LJ1 LJ2 LJ2 +shell rm -f lj1_lj2.table +pair_write 1 1 10000 rsq 0.01 2.5 lj1_lj2.table LJ1-LJ1 +pair_write 1 2 10000 rsq 0.01 2.5 lj1_lj2.table LJ1-LJ2 +pair_write 2 2 10000 rsq 0.01 2.5 lj1_lj2.table LJ2-LJ2 :pre + +After switching the pair style to {table}, the various potential +function tables need to be assigned to the LAMMPS atom types: + +pair_style table linear 10000 +pair_coeff 1 1 lj1_lj2.table LJ1-LJ1 +pair_coeff 1 2* lj1_lj2.table LJ1-LJ2 +pair_coeff 2* 2* lj1_lj2.table LJ2-LJ2 :pre + +:line + +[Mixing, shift, table, tail correction, restart, rRESPA info]: + +Mixing of potential parameters has to be handled inside the +provided python module. The python pair style assumes that force +and energy computation can be correctly performed for all +pairs of atom types as they are mapped to the atom type labels +inside the python potential class. + +This pair style does not support the "pair_modify"_pair_modify.html +shift, table, and tail options. + +This pair style does not write its information to "binary restart +files"_restart.html, since it is stored in potential files. Thus, you +need to re-specify the pair_style and pair_coeff commands in an input +script that reads a restart file. + +This pair style can only be used via the {pair} keyword of the +"run_style respa"_run_style.html command. It does not support the +{inner}, {middle}, {outer} keywords. + +:line + +[Restrictions:] + +This pair style is part of the PYTHON package. It is only enabled +if LAMMPS was built with that package. See +the "Making LAMMPS"_Section_start.html#start_3 section for more info. + +[Related commands:] + +"pair_coeff"_pair_coeff.html, "pair_write"_pair_write.html, +"pair style table"_pair_table.html + +[Default:] none + + diff --git a/doc/src/pairs.txt b/doc/src/pairs.txt index 0898906e7c..b74d25502a 100644 --- a/doc/src/pairs.txt +++ b/doc/src/pairs.txt @@ -71,6 +71,7 @@ Pair Styles :h1 pair_oxdna2 pair_peri pair_polymorphic + pair_python pair_quip pair_reax pair_reaxc diff --git a/examples/python/potentials.py b/examples/python/py_pot.py similarity index 100% rename from examples/python/potentials.py rename to examples/python/py_pot.py From 67962b15fc07fce7eec058ab406229e5ef017455 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 17 May 2017 20:55:48 -0400 Subject: [PATCH 041/302] a bunch refactoring changes in the python pair style and the examples - make all python potential classes derived from LAMMPSPairPotential which contains shared functionality. We currently don't check for supported atom types. may want to add that again later. - keep track of skipped atom types in the C++ code. - add test against units setting. must set self.units='...' in constructor - make compute_force method consistent with Pair::single() in LAMMPS and return force/r instead of force. - rename potentials.py to py_pot.py - update test runs. some small tweaks. --- examples/python/in.pair_python_coulomb | 4 +- examples/python/in.pair_python_hybrid | 6 +- examples/python/in.pair_python_melt | 6 +- examples/python/in.pair_python_spce | 4 +- examples/python/in.pair_python_table | 6 +- .../log.4May17.pair_python_coulomb.g++.1 | 178 ++++++++++++++++++ ...4 => log.4May17.pair_python_coulomb.g++.4} | 38 ++-- .../log.4May17.pair_python_hybrid.g++.1 | 65 +++---- .../log.4May17.pair_python_hybrid.g++.4 | 65 +++---- .../python/log.4May17.pair_python_melt.g++.1 | 65 +++---- .../python/log.4May17.pair_python_melt.g++.4 | 65 +++---- .../python/log.4May17.pair_python_spce.g++.1 | 47 +++-- .../python/log.4May17.pair_python_spce.g++.4 | 47 +++-- .../python/log.4May17.pair_python_table.g++.1 | 46 ++--- .../python/log.4May17.pair_python_table.g++.4 | 50 ++--- examples/python/py_pot.py | 74 ++++---- src/PYTHON/pair_python.cpp | 70 +++++-- src/PYTHON/pair_python.h | 1 + 18 files changed, 521 insertions(+), 316 deletions(-) create mode 100644 examples/python/log.4May17.pair_python_coulomb.g++.1 rename examples/python/{log.4May17.pair_python_coulomb.4 => log.4May17.pair_python_coulomb.g++.4} (86%) diff --git a/examples/python/in.pair_python_coulomb b/examples/python/in.pair_python_coulomb index 87a8fa69ce..5944592473 100644 --- a/examples/python/in.pair_python_coulomb +++ b/examples/python/in.pair_python_coulomb @@ -3,11 +3,11 @@ atom_style full read_data data.spce -pair_style hybrid/overlay python 12.0 coul/long 12.0 +pair_style hybrid/overlay coul/long 12.0 python 12.0 kspace_style pppm 1.0e-6 pair_coeff * * coul/long -pair_coeff * * python potentials.LJCutSPCE OW NULL +pair_coeff * * python py_pot.LJCutSPCE OW NULL pair_modify table 0 diff --git a/examples/python/in.pair_python_hybrid b/examples/python/in.pair_python_hybrid index 289de18b00..d5db729bda 100644 --- a/examples/python/in.pair_python_hybrid +++ b/examples/python/in.pair_python_hybrid @@ -12,7 +12,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python potentials.LJCutMelt lj NULL +pair_coeff * * python py_pot.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin @@ -31,7 +31,7 @@ clear read_restart hybrid.restart pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python potentials.LJCutMelt lj NULL +pair_coeff * * python py_pot.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 fix 1 all nve @@ -47,7 +47,7 @@ atom_style atomic read_data hybrid.data pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python potentials.LJCutMelt lj NULL +pair_coeff * * python py_pot.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin diff --git a/examples/python/in.pair_python_melt b/examples/python/in.pair_python_melt index 7b3cbf7c4d..3f775e6651 100644 --- a/examples/python/in.pair_python_melt +++ b/examples/python/in.pair_python_melt @@ -12,7 +12,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style python 2.5 -pair_coeff * * potentials.LJCutMelt lj +pair_coeff * * py_pot.LJCutMelt lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no @@ -30,7 +30,7 @@ clear read_restart melt.restart pair_style python 2.5 -pair_coeff * * potentials.LJCutMelt lj +pair_coeff * * py_pot.LJCutMelt lj fix 1 all nve @@ -45,7 +45,7 @@ atom_style atomic read_data melt.data pair_style python 2.5 -pair_coeff * * potentials.LJCutMelt lj +pair_coeff * * py_pot.LJCutMelt lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no diff --git a/examples/python/in.pair_python_spce b/examples/python/in.pair_python_spce index d3765ebc33..5bd9e1e23a 100644 --- a/examples/python/in.pair_python_spce +++ b/examples/python/in.pair_python_spce @@ -3,11 +3,11 @@ atom_style full read_data data.spce -pair_style hybrid/overlay python 12.0 coul/long 12.0 +pair_style hybrid/overlay coul/long 12.0 python 12.0 kspace_style pppm 1.0e-6 pair_coeff * * coul/long -pair_coeff * * python potentials.LJCutSPCE OW NULL +pair_coeff * * python py_pot.LJCutSPCE OW NULL bond_style harmonic angle_style harmonic diff --git a/examples/python/in.pair_python_table b/examples/python/in.pair_python_table index 87dad849cc..761a6efd78 100644 --- a/examples/python/in.pair_python_table +++ b/examples/python/in.pair_python_table @@ -12,12 +12,12 @@ mass * 1.0 velocity all create 3.0 87287 pair_style python 2.5 -pair_coeff * * potentials.LJCutMelt lj +pair_coeff * * py_pot.LJCutMelt lj # generate tabulated potential from python variant -pair_write 1 1 10000 rsq 0.01 2.5 lj_1_1.table LJ +pair_write 1 1 2000 rsq 0.01 2.5 lj_1_1.table LJ -pair_style table linear 10000 +pair_style table linear 2000 pair_coeff 1 1 lj_1_1.table LJ neighbor 0.3 bin diff --git a/examples/python/log.4May17.pair_python_coulomb.g++.1 b/examples/python/log.4May17.pair_python_coulomb.g++.1 new file mode 100644 index 0000000000..67bb3b3496 --- /dev/null +++ b/examples/python/log.4May17.pair_python_coulomb.g++.1 @@ -0,0 +1,178 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task +units real +atom_style full + +read_data data.spce + orthogonal box = (0.02645 0.02645 0.02641) to (35.5328 35.5328 35.4736) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 4500 atoms + scanning bonds ... + 2 = max bonds/atom + scanning angles ... + 1 = max angles/atom + reading bonds ... + 3000 bonds + reading angles ... + 1500 angles + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + +pair_style hybrid/overlay coul/long 12.0 python 12.0 +kspace_style pppm 1.0e-6 + +pair_coeff * * coul/long +pair_coeff * * python py_pot.LJCutSPCE OW NULL + +pair_modify table 0 + +bond_style harmonic +angle_style harmonic +dihedral_style none +improper_style none + +bond_coeff 1 1000.00 1.000 +angle_coeff 1 100.0 109.47 + +special_bonds lj/coul 0.0 0.0 1.0 + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 2 = max # of special neighbors + +neighbor 2.0 bin + +fix 1 all shake 0.0001 20 0 b 1 a 1 + 0 = # of size 2 clusters + 0 = # of size 3 clusters + 0 = # of size 4 clusters + 1500 = # of frozen angles +fix 2 all nvt temp 300.0 300.0 100.0 + +# create combined lj/coul table for all atom types +# generate tabulated potential from python variant +pair_write 1 1 2000 rsq 0.1 12 spce.table OW-OW -0.8472 -0.8472 +PPPM initialization ... +WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394206 + estimated relative force accuracy = 1.18714e-06 + using double precision FFTs + 3d grid and FFT values/proc = 103823 64000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard + (2) pair python, perpetual, skip from (1) + attributes: half, newton on + pair build: skip + stencil: none + bin: none +pair_write 1 2 2000 rsq 0.1 12 spce.table OW-HW -0.8472 0.4236 +PPPM initialization ... +WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394206 + estimated relative force accuracy = 1.18714e-06 + using double precision FFTs + 3d grid and FFT values/proc = 103823 64000 +pair_write 2 2 2000 rsq 0.1 12 spce.table HW-HW 0.4236 0.4236 +PPPM initialization ... +WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394206 + estimated relative force accuracy = 1.18714e-06 + using double precision FFTs + 3d grid and FFT values/proc = 103823 64000 + +# switch to tabulated potential +pair_style table linear 2000 pppm +pair_coeff 1 1 spce.table OW-OW +pair_coeff 1 2 spce.table OW-HW +pair_coeff 2 2 spce.table HW-HW + +thermo 10 +run 100 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394674 + estimated relative force accuracy = 1.18855e-06 + using double precision FFTs + 3d grid and FFT values/proc = 103823 64000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 6 6 6 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair table, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 35.26 | 35.26 | 35.26 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -100272.97 0 -100272.97 -1282.0708 + 10 120.61568 -101350.63 0 -100272.39 -4077.5051 + 20 136.11379 -101465.43 0 -100248.65 -5136.5677 + 30 137.01602 -101455.3 0 -100230.46 -5347.8311 + 40 153.424 -101582.46 0 -100210.93 -5223.1676 + 50 167.73654 -101686.24 0 -100186.77 -4468.6687 + 60 163.11642 -101618.16 0 -100159.99 -3291.7815 + 70 169.64512 -101647.89 0 -100131.35 -2611.638 + 80 182.9979 -101737.01 0 -100101.11 -2390.6293 + 90 191.33873 -101778.71 0 -100068.24 -2239.386 + 100 194.7458 -101775.84 0 -100034.92 -1951.9128 +Loop time of 7.63869 on 1 procs for 100 steps with 4500 atoms + +Performance: 1.131 ns/day, 21.219 hours/ns, 13.091 timesteps/s +99.6% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 5.7777 | 5.7777 | 5.7777 | 0.0 | 75.64 +Bond | 0.00017595 | 0.00017595 | 0.00017595 | 0.0 | 0.00 +Kspace | 1.5385 | 1.5385 | 1.5385 | 0.0 | 20.14 +Neigh | 0.22962 | 0.22962 | 0.22962 | 0.0 | 3.01 +Comm | 0.024123 | 0.024123 | 0.024123 | 0.0 | 0.32 +Output | 0.00061131 | 0.00061131 | 0.00061131 | 0.0 | 0.01 +Modify | 0.062444 | 0.062444 | 0.062444 | 0.0 | 0.82 +Other | | 0.005466 | | | 0.07 + +Nlocal: 4500 ave 4500 max 4500 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 21216 ave 21216 max 21216 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 2.60177e+06 ave 2.60177e+06 max 2.60177e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 2601766 +Ave neighs/atom = 578.17 +Ave special neighs/atom = 2 +Neighbor list builds = 3 +Dangerous builds = 0 + +shell rm spce.table + +Total wall time: 0:00:07 diff --git a/examples/python/log.4May17.pair_python_coulomb.4 b/examples/python/log.4May17.pair_python_coulomb.g++.4 similarity index 86% rename from examples/python/log.4May17.pair_python_coulomb.4 rename to examples/python/log.4May17.pair_python_coulomb.g++.4 index a3b13cfbaf..d5fd15ccd3 100644 --- a/examples/python/log.4May17.pair_python_coulomb.4 +++ b/examples/python/log.4May17.pair_python_coulomb.g++.4 @@ -21,11 +21,11 @@ read_data data.spce 1 = max # of 1-4 neighbors 2 = max # of special neighbors -pair_style hybrid/overlay python 12.0 coul/long 12.0 +pair_style hybrid/overlay coul/long 12.0 python 12.0 kspace_style pppm 1.0e-6 pair_coeff * * coul/long -pair_coeff * * python potentials.LJCutSPCE OW NULL +pair_coeff * * python py_pot.LJCutSPCE OW NULL pair_modify table 0 @@ -70,16 +70,16 @@ Neighbor list info ... ghost atom cutoff = 14 binsize = 7, bins = 6 6 6 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair python, perpetual, skip from (2) - attributes: half, newton on - pair build: skip - stencil: none - bin: none - (2) pair coul/long, perpetual + (1) pair coul/long, perpetual attributes: half, newton on pair build: half/bin/newton stencil: half/bin/3d/newton bin: standard + (2) pair python, perpetual, skip from (1) + attributes: half, newton on + pair build: skip + stencil: none + bin: none pair_write 1 2 2000 rsq 0.1 12 spce.table OW-HW -0.8472 0.4236 PPPM initialization ... WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) @@ -143,22 +143,22 @@ Step Temp E_pair E_mol TotEng Press 80 182.9979 -101737.01 0 -100101.11 -2390.6293 90 191.33873 -101778.71 0 -100068.24 -2239.386 100 194.7458 -101775.84 0 -100034.92 -1951.9128 -Loop time of 2.38392 on 4 procs for 100 steps with 4500 atoms +Loop time of 2.35848 on 4 procs for 100 steps with 4500 atoms -Performance: 3.624 ns/day, 6.622 hours/ns, 41.948 timesteps/s -99.1% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 3.663 ns/day, 6.551 hours/ns, 42.400 timesteps/s +99.0% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.4377 | 1.5465 | 1.6848 | 7.3 | 64.87 -Bond | 0.00010276 | 0.00012648 | 0.0001452 | 0.0 | 0.01 -Kspace | 0.53311 | 0.66842 | 0.77484 | 10.9 | 28.04 -Neigh | 0.066 | 0.066074 | 0.066101 | 0.0 | 2.77 -Comm | 0.045355 | 0.048344 | 0.050747 | 1.0 | 2.03 -Output | 0.00042391 | 0.00044996 | 0.00052667 | 0.0 | 0.02 -Modify | 0.049891 | 0.050191 | 0.050336 | 0.1 | 2.11 -Other | | 0.003771 | | | 0.16 +Pair | 1.5061 | 1.5612 | 1.6879 | 5.9 | 66.20 +Bond | 9.5129e-05 | 0.00012672 | 0.00014567 | 0.0 | 0.01 +Kspace | 0.52033 | 0.64456 | 0.69933 | 9.1 | 27.33 +Neigh | 0.066265 | 0.066342 | 0.06644 | 0.0 | 2.81 +Comm | 0.03394 | 0.036139 | 0.038043 | 0.8 | 1.53 +Output | 0.00040889 | 0.00044978 | 0.00056887 | 0.0 | 0.02 +Modify | 0.04557 | 0.045813 | 0.046082 | 0.1 | 1.94 +Other | | 0.003826 | | | 0.16 Nlocal: 1125 ave 1154 max 1092 min Histogram: 1 0 0 0 1 0 0 1 0 1 diff --git a/examples/python/log.4May17.pair_python_hybrid.g++.1 b/examples/python/log.4May17.pair_python_hybrid.g++.1 index d9d3bf53c0..497943d4fd 100644 --- a/examples/python/log.4May17.pair_python_hybrid.g++.1 +++ b/examples/python/log.4May17.pair_python_hybrid.g++.1 @@ -1,5 +1,4 @@ LAMMPS (4 May 2017) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task # 3d Lennard-Jones hybrid @@ -19,7 +18,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python potentials.LJCutMelt lj NULL +pair_coeff * * python py_pot.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin @@ -59,20 +58,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6324555 -4.7286791 0 -2.280608 5.9589514 200 1.6630725 -4.7750988 0 -2.2811136 5.7364886 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 -Loop time of 43.2436 on 1 procs for 250 steps with 4000 atoms +Loop time of 21.9463 on 1 procs for 250 steps with 4000 atoms -Performance: 2497.477 tau/day, 5.781 timesteps/s -31.7% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 4921.114 tau/day, 11.391 timesteps/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 | 42.933 | 42.933 | 42.933 | 0.0 | 99.28 -Neigh | 0.24816 | 0.24816 | 0.24816 | 0.0 | 0.57 -Comm | 0.027748 | 0.027748 | 0.027748 | 0.0 | 0.06 -Output | 0.000519 | 0.000519 | 0.000519 | 0.0 | 0.00 -Modify | 0.028028 | 0.028028 | 0.028028 | 0.0 | 0.06 -Other | | 0.005912 | | | 0.01 +Pair | 21.819 | 21.819 | 21.819 | 0.0 | 99.42 +Neigh | 0.094718 | 0.094718 | 0.094718 | 0.0 | 0.43 +Comm | 0.01407 | 0.01407 | 0.01407 | 0.0 | 0.06 +Output | 0.00024915 | 0.00024915 | 0.00024915 | 0.0 | 0.00 +Modify | 0.015002 | 0.015002 | 0.015002 | 0.0 | 0.07 +Other | | 0.003232 | | | 0.01 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -90,7 +89,6 @@ write_data hybrid.data write_restart hybrid.restart clear -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task read_restart hybrid.restart @@ -99,7 +97,7 @@ read_restart hybrid.restart 4000 atoms pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python potentials.LJCutMelt lj NULL +pair_coeff * * python py_pot.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 fix 1 all nve @@ -136,20 +134,20 @@ Step Temp E_pair E_mol TotEng Press 400 1.6540555 -4.7622999 0 -2.281837 5.8200413 450 1.6264734 -4.7200865 0 -2.2809863 5.9546991 500 1.6366891 -4.7350979 0 -2.2806781 5.9369284 -Loop time of 46.2882 on 1 procs for 250 steps with 4000 atoms +Loop time of 21.9098 on 1 procs for 250 steps with 4000 atoms -Performance: 2333.206 tau/day, 5.401 timesteps/s -31.7% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 4929.303 tau/day, 11.410 timesteps/s +98.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 | 45.662 | 45.662 | 45.662 | 0.0 | 98.65 -Neigh | 0.55234 | 0.55234 | 0.55234 | 0.0 | 1.19 -Comm | 0.035614 | 0.035614 | 0.035614 | 0.0 | 0.08 -Output | 0.000544 | 0.000544 | 0.000544 | 0.0 | 0.00 -Modify | 0.029269 | 0.029269 | 0.029269 | 0.0 | 0.06 -Other | | 0.008735 | | | 0.02 +Pair | 21.68 | 21.68 | 21.68 | 0.0 | 98.95 +Neigh | 0.19625 | 0.19625 | 0.19625 | 0.0 | 0.90 +Comm | 0.014877 | 0.014877 | 0.014877 | 0.0 | 0.07 +Output | 0.00027227 | 0.00027227 | 0.00027227 | 0.0 | 0.00 +Modify | 0.013663 | 0.013663 | 0.013663 | 0.0 | 0.06 +Other | | 0.004371 | | | 0.02 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -164,7 +162,6 @@ Neighbor list builds = 25 Dangerous builds = 25 clear -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task units lj @@ -179,7 +176,7 @@ read_data hybrid.data 4000 velocities pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python potentials.LJCutMelt lj NULL +pair_coeff * * python py_pot.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin @@ -219,20 +216,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6537193 -4.7627023 0 -2.2827434 5.8177704 200 1.6258731 -4.7205017 0 -2.2823017 5.952511 250 1.6370862 -4.7373176 0 -2.2823022 5.925807 -Loop time of 46.4094 on 1 procs for 250 steps with 4000 atoms +Loop time of 22.091 on 1 procs for 250 steps with 4000 atoms -Performance: 2327.115 tau/day, 5.387 timesteps/s -31.6% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 4888.868 tau/day, 11.317 timesteps/s +98.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 | 46.066 | 46.066 | 46.066 | 0.0 | 99.26 -Neigh | 0.27099 | 0.27099 | 0.27099 | 0.0 | 0.58 -Comm | 0.033778 | 0.033778 | 0.033778 | 0.0 | 0.07 -Output | 0.000507 | 0.000507 | 0.000507 | 0.0 | 0.00 -Modify | 0.030938 | 0.030938 | 0.030938 | 0.0 | 0.07 -Other | | 0.006695 | | | 0.01 +Pair | 21.966 | 21.966 | 21.966 | 0.0 | 99.43 +Neigh | 0.094647 | 0.094647 | 0.094647 | 0.0 | 0.43 +Comm | 0.013071 | 0.013071 | 0.013071 | 0.0 | 0.06 +Output | 0.00027871 | 0.00027871 | 0.00027871 | 0.0 | 0.00 +Modify | 0.013882 | 0.013882 | 0.013882 | 0.0 | 0.06 +Other | | 0.003102 | | | 0.01 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -247,4 +244,4 @@ Neighbor list builds = 12 Dangerous builds not checked shell rm hybrid.data hybrid.restart -Total wall time: 0:02:20 +Total wall time: 0:01:07 diff --git a/examples/python/log.4May17.pair_python_hybrid.g++.4 b/examples/python/log.4May17.pair_python_hybrid.g++.4 index e45514a803..0331f34a5e 100644 --- a/examples/python/log.4May17.pair_python_hybrid.g++.4 +++ b/examples/python/log.4May17.pair_python_hybrid.g++.4 @@ -1,5 +1,4 @@ LAMMPS (4 May 2017) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task # 3d Lennard-Jones hybrid @@ -19,7 +18,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python potentials.LJCutMelt lj NULL +pair_coeff * * python py_pot.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin @@ -59,20 +58,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6596605 -4.7699432 0 -2.2810749 5.7830138 200 1.6371874 -4.7365462 0 -2.2813789 5.9246674 250 1.6323462 -4.7292021 0 -2.2812949 5.9762238 -Loop time of 11.1422 on 4 procs for 250 steps with 4000 atoms +Loop time of 6.01723 on 4 procs for 250 steps with 4000 atoms -Performance: 9692.888 tau/day, 22.437 timesteps/s -35.1% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 17948.472 tau/day, 41.547 timesteps/s +98.2% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 10.448 | 10.772 | 10.937 | 5.9 | 96.67 -Neigh | 0.062061 | 0.062949 | 0.06439 | 0.4 | 0.56 -Comm | 0.12929 | 0.29444 | 0.61802 | 35.8 | 2.64 -Output | 0.000301 | 0.000684 | 0.001824 | 0.0 | 0.01 -Modify | 0.009803 | 0.0098622 | 0.010014 | 0.1 | 0.09 -Other | | 0.002618 | | | 0.02 +Pair | 5.1507 | 5.4989 | 5.9629 | 13.1 | 91.39 +Neigh | 0.024123 | 0.024877 | 0.025959 | 0.5 | 0.41 +Comm | 0.02258 | 0.48785 | 0.83691 | 44.1 | 8.11 +Output | 0.00039768 | 0.00045246 | 0.00052929 | 0.0 | 0.01 +Modify | 0.0036325 | 0.0037773 | 0.0038905 | 0.2 | 0.06 +Other | | 0.001357 | | | 0.02 Nlocal: 1000 ave 1010 max 982 min Histogram: 1 0 0 0 0 0 1 0 0 2 @@ -90,7 +89,6 @@ write_data hybrid.data write_restart hybrid.restart clear -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task read_restart hybrid.restart @@ -99,7 +97,7 @@ read_restart hybrid.restart 4000 atoms pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python potentials.LJCutMelt lj NULL +pair_coeff * * python py_pot.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 fix 1 all nve @@ -136,20 +134,20 @@ Step Temp E_pair E_mol TotEng Press 400 1.6388136 -4.7387093 0 -2.2811035 5.9331084 450 1.6431295 -4.7452215 0 -2.2811435 5.8929898 500 1.643316 -4.7454222 0 -2.2810644 5.8454817 -Loop time of 11.287 on 4 procs for 250 steps with 4000 atoms +Loop time of 6.09991 on 4 procs for 250 steps with 4000 atoms -Performance: 9568.520 tau/day, 22.149 timesteps/s -34.9% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 17705.179 tau/day, 40.984 timesteps/s +98.2% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 10.274 | 10.76 | 11.02 | 8.8 | 95.33 -Neigh | 0.12639 | 0.1291 | 0.13056 | 0.5 | 1.14 -Comm | 0.12094 | 0.38226 | 0.87078 | 46.7 | 3.39 -Output | 0.000297 | 0.0006965 | 0.001867 | 0.0 | 0.01 -Modify | 0.010445 | 0.010638 | 0.011054 | 0.2 | 0.09 -Other | | 0.003901 | | | 0.03 +Pair | 5.2315 | 5.5179 | 6.0183 | 13.7 | 90.46 +Neigh | 0.049134 | 0.051424 | 0.053837 | 0.8 | 0.84 +Comm | 0.021671 | 0.52455 | 0.8132 | 44.5 | 8.60 +Output | 0.00019336 | 0.00026017 | 0.00032115 | 0.0 | 0.00 +Modify | 0.0036032 | 0.0036635 | 0.0038021 | 0.1 | 0.06 +Other | | 0.002068 | | | 0.03 Nlocal: 1000 ave 1012 max 983 min Histogram: 1 0 0 0 0 0 2 0 0 1 @@ -164,7 +162,6 @@ Neighbor list builds = 25 Dangerous builds = 25 clear -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task units lj @@ -179,7 +176,7 @@ read_data hybrid.data 4000 velocities pair_style hybrid lj/cut 2.5 python 2.5 -pair_coeff * * python potentials.LJCutMelt lj NULL +pair_coeff * * python py_pot.LJCutMelt lj NULL pair_coeff * 2 lj/cut 1.0 1.0 neighbor 0.3 bin @@ -219,20 +216,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6384234 -4.7389689 0 -2.2819482 5.9315273 200 1.6428814 -4.7460743 0 -2.2823683 5.8888228 250 1.6432631 -4.7466603 0 -2.2823818 5.8398819 -Loop time of 11.1573 on 4 procs for 250 steps with 4000 atoms +Loop time of 6.04476 on 4 procs for 250 steps with 4000 atoms -Performance: 9679.760 tau/day, 22.407 timesteps/s -35.0% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 17866.705 tau/day, 41.358 timesteps/s +98.3% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 10.166 | 10.713 | 10.932 | 9.7 | 96.01 -Neigh | 0.060687 | 0.062175 | 0.063163 | 0.4 | 0.56 -Comm | 0.14931 | 0.36938 | 0.91686 | 52.5 | 3.31 -Output | 0.00036 | 0.00058175 | 0.001228 | 0.0 | 0.01 -Modify | 0.009918 | 0.010237 | 0.010388 | 0.2 | 0.09 -Other | | 0.002356 | | | 0.02 +Pair | 5.2589 | 5.5841 | 5.9788 | 11.1 | 92.38 +Neigh | 0.023942 | 0.024705 | 0.025509 | 0.4 | 0.41 +Comm | 0.034946 | 0.43056 | 0.75671 | 40.0 | 7.12 +Output | 0.00022149 | 0.00029725 | 0.0003593 | 0.0 | 0.00 +Modify | 0.003613 | 0.0037647 | 0.003829 | 0.1 | 0.06 +Other | | 0.001313 | | | 0.02 Nlocal: 1000 ave 1013 max 989 min Histogram: 1 0 0 1 0 1 0 0 0 1 @@ -247,4 +244,4 @@ Neighbor list builds = 12 Dangerous builds not checked shell rm hybrid.data hybrid.restart -Total wall time: 0:00:35 +Total wall time: 0:00:18 diff --git a/examples/python/log.4May17.pair_python_melt.g++.1 b/examples/python/log.4May17.pair_python_melt.g++.1 index 3459dd4f87..fcb902fb3c 100644 --- a/examples/python/log.4May17.pair_python_melt.g++.1 +++ b/examples/python/log.4May17.pair_python_melt.g++.1 @@ -1,5 +1,4 @@ LAMMPS (4 May 2017) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task # 3d Lennard-Jones melt @@ -19,7 +18,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style python 2.5 -pair_coeff * * potentials.LJCutMelt lj +pair_coeff * * py_pot.LJCutMelt lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no @@ -48,20 +47,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6324555 -4.7286791 0 -2.280608 5.9589514 200 1.6630725 -4.7750988 0 -2.2811136 5.7364886 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 -Loop time of 24.2466 on 1 procs for 250 steps with 4000 atoms +Loop time of 21.6481 on 1 procs for 250 steps with 4000 atoms -Performance: 4454.233 tau/day, 10.311 timesteps/s -59.9% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 4988.899 tau/day, 11.548 timesteps/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 | 24.079 | 24.079 | 24.079 | 0.0 | 99.31 -Neigh | 0.13174 | 0.13174 | 0.13174 | 0.0 | 0.54 -Comm | 0.016789 | 0.016789 | 0.016789 | 0.0 | 0.07 -Output | 0.000271 | 0.000271 | 0.000271 | 0.0 | 0.00 -Modify | 0.015073 | 0.015073 | 0.015073 | 0.0 | 0.06 -Other | | 0.003428 | | | 0.01 +Pair | 21.529 | 21.529 | 21.529 | 0.0 | 99.45 +Neigh | 0.08819 | 0.08819 | 0.08819 | 0.0 | 0.41 +Comm | 0.013276 | 0.013276 | 0.013276 | 0.0 | 0.06 +Output | 0.00025654 | 0.00025654 | 0.00025654 | 0.0 | 0.00 +Modify | 0.014466 | 0.014466 | 0.014466 | 0.0 | 0.07 +Other | | 0.003143 | | | 0.01 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -79,7 +78,6 @@ write_data melt.data write_restart melt.restart clear -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task read_restart melt.restart @@ -88,7 +86,7 @@ read_restart melt.restart 4000 atoms pair_style python 2.5 -pair_coeff * * potentials.LJCutMelt lj +pair_coeff * * py_pot.LJCutMelt lj fix 1 all nve @@ -114,20 +112,20 @@ Step Temp E_pair E_mol TotEng Press 400 1.6540555 -4.7622999 0 -2.281837 5.8200413 450 1.6264734 -4.7200865 0 -2.2809863 5.9546991 500 1.6366891 -4.7350979 0 -2.2806781 5.9369284 -Loop time of 24.3239 on 1 procs for 250 steps with 4000 atoms +Loop time of 21.9592 on 1 procs for 250 steps with 4000 atoms -Performance: 4440.069 tau/day, 10.278 timesteps/s -60.0% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 4918.203 tau/day, 11.385 timesteps/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 | 24.017 | 24.017 | 24.017 | 0.0 | 98.74 -Neigh | 0.26927 | 0.26927 | 0.26927 | 0.0 | 1.11 -Comm | 0.018113 | 0.018113 | 0.018113 | 0.0 | 0.07 -Output | 0.000254 | 0.000254 | 0.000254 | 0.0 | 0.00 -Modify | 0.015259 | 0.015259 | 0.015259 | 0.0 | 0.06 -Other | | 0.004524 | | | 0.02 +Pair | 21.74 | 21.74 | 21.74 | 0.0 | 99.00 +Neigh | 0.18588 | 0.18588 | 0.18588 | 0.0 | 0.85 +Comm | 0.01476 | 0.01476 | 0.01476 | 0.0 | 0.07 +Output | 0.00022244 | 0.00022244 | 0.00022244 | 0.0 | 0.00 +Modify | 0.01356 | 0.01356 | 0.01356 | 0.0 | 0.06 +Other | | 0.004382 | | | 0.02 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -142,7 +140,6 @@ Neighbor list builds = 25 Dangerous builds = 25 clear -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task units lj @@ -157,7 +154,7 @@ read_data melt.data 4000 velocities pair_style python 2.5 -pair_coeff * * potentials.LJCutMelt lj +pair_coeff * * py_pot.LJCutMelt lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no @@ -186,20 +183,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6537193 -4.7627023 0 -2.2827434 5.8177704 200 1.6258731 -4.7205017 0 -2.2823017 5.952511 250 1.6370862 -4.7373176 0 -2.2823022 5.925807 -Loop time of 22.9051 on 1 procs for 250 steps with 4000 atoms +Loop time of 21.8255 on 1 procs for 250 steps with 4000 atoms -Performance: 4715.116 tau/day, 10.915 timesteps/s -60.1% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 4948.331 tau/day, 11.454 timesteps/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 | 22.752 | 22.752 | 22.752 | 0.0 | 99.33 -Neigh | 0.12254 | 0.12254 | 0.12254 | 0.0 | 0.53 -Comm | 0.013385 | 0.013385 | 0.013385 | 0.0 | 0.06 -Output | 0.000254 | 0.000254 | 0.000254 | 0.0 | 0.00 -Modify | 0.014159 | 0.014159 | 0.014159 | 0.0 | 0.06 -Other | | 0.002851 | | | 0.01 +Pair | 21.707 | 21.707 | 21.707 | 0.0 | 99.46 +Neigh | 0.088455 | 0.088455 | 0.088455 | 0.0 | 0.41 +Comm | 0.01311 | 0.01311 | 0.01311 | 0.0 | 0.06 +Output | 0.00025082 | 0.00025082 | 0.00025082 | 0.0 | 0.00 +Modify | 0.013836 | 0.013836 | 0.013836 | 0.0 | 0.06 +Other | | 0.003096 | | | 0.01 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -214,4 +211,4 @@ Neighbor list builds = 12 Dangerous builds not checked shell rm melt.data melt.restart -Total wall time: 0:01:13 +Total wall time: 0:01:07 diff --git a/examples/python/log.4May17.pair_python_melt.g++.4 b/examples/python/log.4May17.pair_python_melt.g++.4 index 7e4ba25acf..d504efc4ac 100644 --- a/examples/python/log.4May17.pair_python_melt.g++.4 +++ b/examples/python/log.4May17.pair_python_melt.g++.4 @@ -1,5 +1,4 @@ LAMMPS (4 May 2017) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task # 3d Lennard-Jones melt @@ -19,7 +18,7 @@ mass * 1.0 velocity all create 3.0 87287 pair_style python 2.5 -pair_coeff * * potentials.LJCutMelt lj +pair_coeff * * py_pot.LJCutMelt lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no @@ -48,20 +47,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6596605 -4.7699432 0 -2.2810749 5.7830138 200 1.6371874 -4.7365462 0 -2.2813789 5.9246674 250 1.6323462 -4.7292021 0 -2.2812949 5.9762238 -Loop time of 12.7083 on 4 procs for 250 steps with 4000 atoms +Loop time of 5.83903 on 4 procs for 250 steps with 4000 atoms -Performance: 8498.384 tau/day, 19.672 timesteps/s -31.5% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 18496.226 tau/day, 42.815 timesteps/s +98.2% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 11.491 | 11.96 | 12.464 | 10.0 | 94.11 -Neigh | 0.065058 | 0.065956 | 0.067066 | 0.3 | 0.52 -Comm | 0.16288 | 0.66706 | 1.1373 | 42.2 | 5.25 -Output | 0.000416 | 0.00085025 | 0.002121 | 0.0 | 0.01 -Modify | 0.010849 | 0.011123 | 0.011321 | 0.2 | 0.09 -Other | | 0.003005 | | | 0.02 +Pair | 5.152 | 5.5209 | 5.7679 | 9.6 | 94.55 +Neigh | 0.022809 | 0.023364 | 0.023891 | 0.3 | 0.40 +Comm | 0.041927 | 0.28952 | 0.65893 | 42.2 | 4.96 +Output | 0.0002389 | 0.00024772 | 0.00026727 | 0.0 | 0.00 +Modify | 0.0036368 | 0.0036796 | 0.0037563 | 0.1 | 0.06 +Other | | 0.001328 | | | 0.02 Nlocal: 1000 ave 1010 max 982 min Histogram: 1 0 0 0 0 0 1 0 0 2 @@ -79,7 +78,6 @@ write_data melt.data write_restart melt.restart clear -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task read_restart melt.restart @@ -88,7 +86,7 @@ read_restart melt.restart 4000 atoms pair_style python 2.5 -pair_coeff * * potentials.LJCutMelt lj +pair_coeff * * py_pot.LJCutMelt lj fix 1 all nve @@ -114,20 +112,20 @@ Step Temp E_pair E_mol TotEng Press 400 1.6388136 -4.7387093 0 -2.2811035 5.9331084 450 1.6431295 -4.7452215 0 -2.2811435 5.8929898 500 1.643316 -4.7454222 0 -2.2810644 5.8454817 -Loop time of 12.6852 on 4 procs for 250 steps with 4000 atoms +Loop time of 5.85683 on 4 procs for 250 steps with 4000 atoms -Performance: 8513.855 tau/day, 19.708 timesteps/s -31.6% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 18440.001 tau/day, 42.685 timesteps/s +98.4% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 11.653 | 11.92 | 12.472 | 9.6 | 93.97 -Neigh | 0.13284 | 0.13556 | 0.13729 | 0.5 | 1.07 -Comm | 0.051389 | 0.60884 | 0.88175 | 43.0 | 4.80 -Output | 0.000362 | 0.0046985 | 0.008143 | 5.1 | 0.04 -Modify | 0.011007 | 0.011344 | 0.011857 | 0.3 | 0.09 -Other | | 0.004278 | | | 0.03 +Pair | 5.2483 | 5.5095 | 5.7744 | 8.0 | 94.07 +Neigh | 0.047228 | 0.047998 | 0.049293 | 0.4 | 0.82 +Comm | 0.027134 | 0.29341 | 0.55554 | 34.6 | 5.01 +Output | 0.00020003 | 0.00021219 | 0.0002358 | 0.0 | 0.00 +Modify | 0.0035472 | 0.0036988 | 0.0038681 | 0.2 | 0.06 +Other | | 0.001984 | | | 0.03 Nlocal: 1000 ave 1012 max 983 min Histogram: 1 0 0 0 0 0 2 0 0 1 @@ -142,7 +140,6 @@ Neighbor list builds = 25 Dangerous builds = 25 clear -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task units lj @@ -157,7 +154,7 @@ read_data melt.data 4000 velocities pair_style python 2.5 -pair_coeff * * potentials.LJCutMelt lj +pair_coeff * * py_pot.LJCutMelt lj neighbor 0.3 bin neigh_modify every 20 delay 0 check no @@ -186,20 +183,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6384234 -4.7389689 0 -2.2819482 5.9315273 200 1.6428814 -4.7460743 0 -2.2823683 5.8888228 250 1.6432631 -4.7466603 0 -2.2823818 5.8398819 -Loop time of 12.5324 on 4 procs for 250 steps with 4000 atoms +Loop time of 5.86684 on 4 procs for 250 steps with 4000 atoms -Performance: 8617.631 tau/day, 19.948 timesteps/s -31.6% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 18408.545 tau/day, 42.612 timesteps/s +98.4% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 11.648 | 11.918 | 12.387 | 8.3 | 95.10 -Neigh | 0.064038 | 0.06537 | 0.065914 | 0.3 | 0.52 -Comm | 0.065189 | 0.53362 | 0.80384 | 39.4 | 4.26 -Output | 0.000346 | 0.0007525 | 0.001938 | 0.0 | 0.01 -Modify | 0.011255 | 0.01155 | 0.011852 | 0.2 | 0.09 -Other | | 0.002751 | | | 0.02 +Pair | 5.3207 | 5.5695 | 5.8071 | 7.6 | 94.93 +Neigh | 0.023073 | 0.023405 | 0.023834 | 0.2 | 0.40 +Comm | 0.030558 | 0.2686 | 0.51789 | 34.7 | 4.58 +Output | 0.00028825 | 0.00036758 | 0.00042987 | 0.0 | 0.01 +Modify | 0.0034878 | 0.0036733 | 0.0039375 | 0.3 | 0.06 +Other | | 0.001259 | | | 0.02 Nlocal: 1000 ave 1013 max 989 min Histogram: 1 0 0 1 0 1 0 0 0 1 @@ -214,4 +211,4 @@ Neighbor list builds = 12 Dangerous builds not checked shell rm melt.data melt.restart -Total wall time: 0:00:39 +Total wall time: 0:00:18 diff --git a/examples/python/log.4May17.pair_python_spce.g++.1 b/examples/python/log.4May17.pair_python_spce.g++.1 index 4e429b9cdd..1a535df0e9 100644 --- a/examples/python/log.4May17.pair_python_spce.g++.1 +++ b/examples/python/log.4May17.pair_python_spce.g++.1 @@ -1,5 +1,4 @@ LAMMPS (4 May 2017) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task units real atom_style full @@ -22,11 +21,11 @@ read_data data.spce 1 = max # of 1-4 neighbors 2 = max # of special neighbors -pair_style hybrid/overlay python 12.0 coul/long 12.0 +pair_style hybrid/overlay coul/long 12.0 python 12.0 kspace_style pppm 1.0e-6 pair_coeff * * coul/long -pair_coeff * * python potentials.LJCutSPCE OW NULL +pair_coeff * * python py_pot.LJCutSPCE OW NULL bond_style harmonic angle_style harmonic @@ -68,16 +67,16 @@ Neighbor list info ... ghost atom cutoff = 14 binsize = 7, bins = 6 6 6 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair python, perpetual, skip from (2) - attributes: half, newton on - pair build: skip - stencil: none - bin: none - (2) pair coul/long, perpetual + (1) pair coul/long, perpetual attributes: half, newton on pair build: half/bin/newton stencil: half/bin/3d/newton bin: standard + (2) pair python, perpetual, skip from (1) + attributes: half, newton on + pair build: skip + stencil: none + bin: none Per MPI rank memory allocation (min/avg/max) = 41.05 | 41.05 | 41.05 Mbytes Step Temp E_pair E_mol TotEng Press 0 0 -16692.369 0 -16692.369 -1289.222 @@ -91,33 +90,33 @@ Step Temp E_pair E_mol TotEng Press 80 182.94811 -18155.978 0 -16520.523 -2393.3156 90 191.29902 -18197.887 0 -16487.779 -2242.7104 100 194.70949 -18195.021 0 -16454.425 -1955.2916 -Loop time of 63.3145 on 1 procs for 100 steps with 4500 atoms +Loop time of 23.0818 on 1 procs for 100 steps with 4500 atoms -Performance: 0.136 ns/day, 175.874 hours/ns, 1.579 timesteps/s -86.0% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 0.374 ns/day, 64.116 hours/ns, 4.332 timesteps/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 | 61.815 | 61.815 | 61.815 | 0.0 | 97.63 -Bond | 0.000132 | 0.000132 | 0.000132 | 0.0 | 0.00 -Kspace | 1.2226 | 1.2226 | 1.2226 | 0.0 | 1.93 -Neigh | 0.21684 | 0.21684 | 0.21684 | 0.0 | 0.34 -Comm | 0.015175 | 0.015175 | 0.015175 | 0.0 | 0.02 -Output | 0.000405 | 0.000405 | 0.000405 | 0.0 | 0.00 -Modify | 0.040088 | 0.040088 | 0.040088 | 0.0 | 0.06 -Other | | 0.003896 | | | 0.01 +Pair | 21.186 | 21.186 | 21.186 | 0.0 | 91.79 +Bond | 0.00022054 | 0.00022054 | 0.00022054 | 0.0 | 0.00 +Kspace | 1.5442 | 1.5442 | 1.5442 | 0.0 | 6.69 +Neigh | 0.25672 | 0.25672 | 0.25672 | 0.0 | 1.11 +Comm | 0.023787 | 0.023787 | 0.023787 | 0.0 | 0.10 +Output | 0.00060248 | 0.00060248 | 0.00060248 | 0.0 | 0.00 +Modify | 0.064809 | 0.064809 | 0.064809 | 0.0 | 0.28 +Other | | 0.005301 | | | 0.02 Nlocal: 4500 ave 4500 max 4500 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 21216 ave 21216 max 21216 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1.44594e+06 ave 1.44594e+06 max 1.44594e+06 min +Neighs: 2.60176e+06 ave 2.60176e+06 max 2.60176e+06 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 1445935 -Ave neighs/atom = 321.319 +Total # of neighbors = 2601762 +Ave neighs/atom = 578.169 Ave special neighs/atom = 2 Neighbor list builds = 3 Dangerous builds = 0 -Total wall time: 0:01:05 +Total wall time: 0:00:23 diff --git a/examples/python/log.4May17.pair_python_spce.g++.4 b/examples/python/log.4May17.pair_python_spce.g++.4 index 15c11cd376..c277663287 100644 --- a/examples/python/log.4May17.pair_python_spce.g++.4 +++ b/examples/python/log.4May17.pair_python_spce.g++.4 @@ -1,5 +1,4 @@ LAMMPS (4 May 2017) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) using 1 OpenMP thread(s) per MPI task units real atom_style full @@ -22,11 +21,11 @@ read_data data.spce 1 = max # of 1-4 neighbors 2 = max # of special neighbors -pair_style hybrid/overlay python 12.0 coul/long 12.0 +pair_style hybrid/overlay coul/long 12.0 python 12.0 kspace_style pppm 1.0e-6 pair_coeff * * coul/long -pair_coeff * * python potentials.LJCutSPCE OW NULL +pair_coeff * * python py_pot.LJCutSPCE OW NULL bond_style harmonic angle_style harmonic @@ -68,16 +67,16 @@ Neighbor list info ... ghost atom cutoff = 14 binsize = 7, bins = 6 6 6 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair python, perpetual, skip from (2) - attributes: half, newton on - pair build: skip - stencil: none - bin: none - (2) pair coul/long, perpetual + (1) pair coul/long, perpetual attributes: half, newton on pair build: half/bin/newton stencil: half/bin/3d/newton bin: standard + (2) pair python, perpetual, skip from (1) + attributes: half, newton on + pair build: skip + stencil: none + bin: none Per MPI rank memory allocation (min/avg/max) = 14.59 | 14.59 | 14.59 Mbytes Step Temp E_pair E_mol TotEng Press 0 0 -16692.369 0 -16692.369 -1289.222 @@ -91,33 +90,33 @@ Step Temp E_pair E_mol TotEng Press 80 182.94811 -18155.978 0 -16520.523 -2393.3156 90 191.29902 -18197.887 0 -16487.779 -2242.7104 100 194.70949 -18195.021 0 -16454.425 -1955.2916 -Loop time of 29.6024 on 4 procs for 100 steps with 4500 atoms +Loop time of 6.588 on 4 procs for 100 steps with 4500 atoms -Performance: 0.292 ns/day, 82.229 hours/ns, 3.378 timesteps/s -52.5% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 1.311 ns/day, 18.300 hours/ns, 15.179 timesteps/s +98.4% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 26.631 | 27.507 | 28.649 | 14.3 | 92.92 -Bond | 0.00021 | 0.00022675 | 0.000248 | 0.0 | 0.00 -Kspace | 0.72315 | 1.8708 | 2.7365 | 54.7 | 6.32 -Neigh | 0.10667 | 0.1067 | 0.10674 | 0.0 | 0.36 -Comm | 0.045357 | 0.054035 | 0.064607 | 3.6 | 0.18 -Output | 0.000424 | 0.00086625 | 0.002189 | 0.0 | 0.00 -Modify | 0.056602 | 0.056667 | 0.056763 | 0.0 | 0.19 -Other | | 0.006337 | | | 0.02 +Pair | 5.3756 | 5.5417 | 5.8745 | 8.3 | 84.12 +Bond | 0.0001049 | 0.00013965 | 0.0001812 | 0.0 | 0.00 +Kspace | 0.54765 | 0.87786 | 1.042 | 20.8 | 13.33 +Neigh | 0.072695 | 0.072884 | 0.072973 | 0.0 | 1.11 +Comm | 0.04138 | 0.043576 | 0.045475 | 0.7 | 0.66 +Output | 0.00041032 | 0.00043947 | 0.00052142 | 0.0 | 0.01 +Modify | 0.047381 | 0.047567 | 0.047745 | 0.1 | 0.72 +Other | | 0.003845 | | | 0.06 Nlocal: 1125 ave 1154 max 1092 min Histogram: 1 0 0 0 1 0 0 1 0 1 Nghost: 12256.2 ave 12296 max 12213 min Histogram: 1 0 1 0 0 0 0 0 1 1 -Neighs: 361484 ave 376583 max 347969 min +Neighs: 650440 ave 678828 max 626375 min Histogram: 1 0 0 0 2 0 0 0 0 1 -Total # of neighbors = 1445935 -Ave neighs/atom = 321.319 +Total # of neighbors = 2601762 +Ave neighs/atom = 578.169 Ave special neighs/atom = 2 Neighbor list builds = 3 Dangerous builds = 0 -Total wall time: 0:00:30 +Total wall time: 0:00:06 diff --git a/examples/python/log.4May17.pair_python_table.g++.1 b/examples/python/log.4May17.pair_python_table.g++.1 index 21d42693ba..bd3e86501b 100644 --- a/examples/python/log.4May17.pair_python_table.g++.1 +++ b/examples/python/log.4May17.pair_python_table.g++.1 @@ -18,10 +18,10 @@ mass * 1.0 velocity all create 3.0 87287 pair_style python 2.5 -pair_coeff * * potentials.LJCutMelt lj +pair_coeff * * py_pot.LJCutMelt lj # generate tabulated potential from python variant -pair_write 1 1 10000 rsq 0.01 2.5 lj_1_1.table LJ +pair_write 1 1 2000 rsq 0.01 2.5 lj_1_1.table LJ Neighbor list info ... update every 1 steps, delay 10 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -35,9 +35,9 @@ Neighbor list info ... stencil: half/bin/3d/newton bin: standard -pair_style table linear 10000 +pair_style table linear 2000 pair_coeff 1 1 lj_1_1.table LJ -WARNING: 1 of 1000 force values in table are inconsistent with -dE/dr. +WARNING: 2 of 2000 force values in table are inconsistent with -dE/dr. Should only be flagged at inflection points (../pair_table.cpp:476) neighbor 0.3 bin @@ -61,36 +61,36 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 3.184 | 3.184 | 3.184 Mbytes Step Temp E_pair E_mol TotEng Press - 0 3 -6.7733675 0 -2.2744925 -3.7033435 - 50 1.6758875 -4.7951764 0 -2.2819736 5.6705794 - 100 1.6458266 -4.7488945 0 -2.2807717 5.8696895 - 150 1.6324439 -4.7283321 0 -2.2802784 5.9594952 - 200 1.6630547 -4.7746809 0 -2.2807225 5.7372657 - 250 1.6278968 -4.7226363 0 -2.2814016 5.9559236 -Loop time of 1.0498 on 1 procs for 250 steps with 4000 atoms + 0 3 -6.7733629 0 -2.2744879 -3.7032813 + 50 1.6758731 -4.7953067 0 -2.2821255 5.6706553 + 100 1.6458118 -4.7490281 0 -2.2809276 5.8697466 + 150 1.632425 -4.7284533 0 -2.2804279 5.9595684 + 200 1.6631578 -4.7749889 0 -2.2808759 5.7365839 + 250 1.6277062 -4.7224727 0 -2.2815238 5.9572913 +Loop time of 0.996652 on 1 procs for 250 steps with 4000 atoms -Performance: 102877.190 tau/day, 238.142 timesteps/s -99.7% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 108362.785 tau/day, 250.840 timesteps/s +99.8% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.93242 | 0.93242 | 0.93242 | 0.0 | 88.82 -Neigh | 0.088495 | 0.088495 | 0.088495 | 0.0 | 8.43 -Comm | 0.012153 | 0.012153 | 0.012153 | 0.0 | 1.16 -Output | 0.00013924 | 0.00013924 | 0.00013924 | 0.0 | 0.01 -Modify | 0.013729 | 0.013729 | 0.013729 | 0.0 | 1.31 -Other | | 0.002855 | | | 0.27 +Pair | 0.87999 | 0.87999 | 0.87999 | 0.0 | 88.29 +Neigh | 0.087921 | 0.087921 | 0.087921 | 0.0 | 8.82 +Comm | 0.012098 | 0.012098 | 0.012098 | 0.0 | 1.21 +Output | 0.00013614 | 0.00013614 | 0.00013614 | 0.0 | 0.01 +Modify | 0.01363 | 0.01363 | 0.01363 | 0.0 | 1.37 +Other | | 0.002882 | | | 0.29 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 5504 ave 5504 max 5504 min +Nghost: 5500 ave 5500 max 5500 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 151497 ave 151497 max 151497 min +Neighs: 151496 ave 151496 max 151496 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 151497 -Ave neighs/atom = 37.8743 +Total # of neighbors = 151496 +Ave neighs/atom = 37.874 Neighbor list builds = 12 Dangerous builds not checked diff --git a/examples/python/log.4May17.pair_python_table.g++.4 b/examples/python/log.4May17.pair_python_table.g++.4 index a64ebd6631..8dfe82097e 100644 --- a/examples/python/log.4May17.pair_python_table.g++.4 +++ b/examples/python/log.4May17.pair_python_table.g++.4 @@ -18,10 +18,10 @@ mass * 1.0 velocity all create 3.0 87287 pair_style python 2.5 -pair_coeff * * potentials.LJCutMelt lj +pair_coeff * * py_pot.LJCutMelt lj # generate tabulated potential from python variant -pair_write 1 1 10000 rsq 0.01 2.5 lj_1_1.table LJ +pair_write 1 1 2000 rsq 0.01 2.5 lj_1_1.table LJ Neighbor list info ... update every 1 steps, delay 10 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -35,9 +35,9 @@ Neighbor list info ... stencil: half/bin/3d/newton bin: standard -pair_style table linear 10000 +pair_style table linear 2000 pair_coeff 1 1 lj_1_1.table LJ -WARNING: 1 of 10000 force values in table are inconsistent with -dE/dr. +WARNING: 2 of 2000 force values in table are inconsistent with -dE/dr. Should only be flagged at inflection points (../pair_table.cpp:476) neighbor 0.3 bin @@ -61,36 +61,36 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 2.69 | 2.69 | 2.69 Mbytes Step Temp E_pair E_mol TotEng Press - 0 3 -6.7733675 0 -2.2744925 -3.7033435 - 50 1.6754092 -4.794723 0 -2.2822376 5.6616601 - 100 1.6503295 -4.7559815 0 -2.2811061 5.8051261 - 150 1.6596603 -4.7699379 0 -2.2810699 5.7830168 - 200 1.6371948 -4.7365549 0 -2.2813766 5.9245585 - 250 1.6321199 -4.7288017 0 -2.2812339 5.9776124 -Loop time of 0.313548 on 4 procs for 250 steps with 4000 atoms + 0 3 -6.7733629 0 -2.2744879 -3.7032813 + 50 1.675395 -4.7945736 0 -2.2821094 5.6620623 + 100 1.6503067 -4.7558145 0 -2.2809733 5.8055967 + 150 1.6595852 -4.7697199 0 -2.2809644 5.7837898 + 200 1.6371471 -4.7363942 0 -2.2812874 5.924977 + 250 1.6315623 -4.7278268 0 -2.2810951 5.9807196 +Loop time of 0.300176 on 4 procs for 250 steps with 4000 atoms -Performance: 344444.576 tau/day, 797.325 timesteps/s -99.1% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 359789.395 tau/day, 832.846 timesteps/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 | 0.24963 | 0.25443 | 0.2632 | 1.1 | 81.15 -Neigh | 0.023249 | 0.023735 | 0.024497 | 0.3 | 7.57 -Comm | 0.020689 | 0.030402 | 0.035249 | 3.4 | 9.70 -Output | 0.00020766 | 0.00021476 | 0.00023031 | 0.0 | 0.07 -Modify | 0.0034959 | 0.0035564 | 0.0036762 | 0.1 | 1.13 -Other | | 0.001206 | | | 0.38 +Pair | 0.23104 | 0.23876 | 0.2451 | 1.2 | 79.54 +Neigh | 0.022763 | 0.023687 | 0.024305 | 0.4 | 7.89 +Comm | 0.025416 | 0.032499 | 0.041304 | 3.7 | 10.83 +Output | 0.00015378 | 0.00016057 | 0.00017667 | 0.0 | 0.05 +Modify | 0.0035894 | 0.0036637 | 0.0037456 | 0.1 | 1.22 +Other | | 0.001409 | | | 0.47 -Nlocal: 1000 ave 1010 max 982 min +Nlocal: 1000 ave 1010 max 981 min Histogram: 1 0 0 0 0 0 1 0 0 2 -Nghost: 2703.75 ave 2713 max 2689 min -Histogram: 1 0 0 0 0 0 0 2 0 1 -Neighs: 37915.5 ave 39231 max 36202 min +Nghost: 2703 ave 2715 max 2688 min Histogram: 1 0 0 0 0 1 1 0 0 1 +Neighs: 37915.2 ave 39191 max 36151 min +Histogram: 1 0 0 0 0 1 0 1 0 1 -Total # of neighbors = 151662 -Ave neighs/atom = 37.9155 +Total # of neighbors = 151661 +Ave neighs/atom = 37.9153 Neighbor list builds = 12 Dangerous builds not checked diff --git a/examples/python/py_pot.py b/examples/python/py_pot.py index dbce8cd445..5699bd082c 100644 --- a/examples/python/py_pot.py +++ b/examples/python/py_pot.py @@ -1,73 +1,65 @@ from __future__ import print_function -class LJCutMelt(object): - +class LAMMPSPairPotential(object): def __init__(self): self.pmap=dict() - # set coeffs: eps, sig, 48*eps*sig**12, 24*eps*sig**6, - # 4*eps*sig**12, 4*eps*sig**6 - self.coeff = {'lj' : {'lj' : (1.0,1.0,48.0,24.0,4.0,4.0), - 'NULL': (0.0,1.0, 0.0, 0.0,0.0,0.0)}, - 'NULL': {'lj' : (0.0,1.0, 0.0, 0.0,0.0,0.0), - 'NULL': (0.0,1.0, 0.0, 0.0,0.0,0.0)}} + self.units='lj' + def map_coeff(self,name,ltype): + self.pmap[ltype]=name + def check_units(self,units): + if (units != self.units): + raise Exception("Conflicting units: %s vs. %s" % (self.units,units)) - def map_coeff(self,name,type): - if name in self.coeff: - self.pmap[type] = name - else: - raise Exception("cannot match atom type %s" % name) +class LJCutMelt(LAMMPSPairPotential): + def __init__(self): + super(LJCutMelt,self).__init__() + # set coeffs: 48*eps*sig**12, 24*eps*sig**6, + # 4*eps*sig**12, 4*eps*sig**6 + self.units = 'lj' + self.coeff = {'lj' : {'lj' : (48.0,24.0,4.0,4.0)}} def compute_force(self,rsq,itype,jtype): coeff = self.coeff[self.pmap[itype]][self.pmap[jtype]] r2inv = 1.0/rsq r6inv = r2inv*r2inv*r2inv - lj1 = coeff[2] - lj2 = coeff[3] - return (r6inv * (lj1*r6inv - lj2)) + lj1 = coeff[0] + lj2 = coeff[1] + return (r6inv * (lj1*r6inv - lj2))*r2inv def compute_energy(self,rsq,itype,jtype): coeff = self.coeff[self.pmap[itype]][self.pmap[jtype]] r2inv = 1.0/rsq r6inv = r2inv*r2inv*r2inv - lj3 = coeff[4] - lj4 = coeff[5] + lj3 = coeff[2] + lj4 = coeff[3] return (r6inv * (lj3*r6inv - lj4)) -class LJCutSPCE(object): +class LJCutSPCE(LAMMPSPairPotential): def __init__(self): - self.pmap=dict() - # SPCE oxygen in real units + super(LJCutSPCE,self).__init__() + self.units='real' + # SPCE oxygen LJ parameters in real units eps=0.15535 sig=3.166 - - # set coeffs: eps, sig, 48*eps*sig**12, 24*eps*sig**6, - # 4*eps*sig**12, 4*eps*sig**6 - self.coeff = {'OW' : {'OW' : (1.0,1.0, - 48.0*eps*sig**12,24.0*eps*sig**6, - 4.0*eps*sig**12, 4.0*eps*sig**6), - 'NULL': (0.0,1.0, 0.0, 0.0,0.0,0.0)}, - 'NULL': {'OW' : (0.0,1.0, 0.0, 0.0,0.0,0.0), - 'NULL': (0.0,1.0, 0.0, 0.0,0.0,0.0)}} - - def map_coeff(self,name,type): - if name in self.coeff: - self.pmap[type] = name - else: - raise Exception("cannot match atom type %s" % name) + self.coeff = {'OW' : {'OW' : (48.0*eps*sig**12,24.0*eps*sig**6, + 4.0*eps*sig**12, 4.0*eps*sig**6), + 'HW' : (0.0,0.0, 0.0,0.0)}, + 'HW' : {'OW' : (0.0,0.0, 0.0,0.0), + 'HW' : (0.0,0.0, 0.0,0.0)}} def compute_force(self,rsq,itype,jtype): coeff = self.coeff[self.pmap[itype]][self.pmap[jtype]] r2inv = 1.0/rsq r6inv = r2inv*r2inv*r2inv - lj1 = coeff[2] - lj2 = coeff[3] - return (r6inv * (lj1*r6inv - lj2)) + lj1 = coeff[0] + lj2 = coeff[1] + return (r6inv * (lj1*r6inv - lj2))*r2inv def compute_energy(self,rsq,itype,jtype): coeff = self.coeff[self.pmap[itype]][self.pmap[jtype]] r2inv = 1.0/rsq r6inv = r2inv*r2inv*r2inv - lj3 = coeff[4] - lj4 = coeff[5] + lj3 = coeff[2] + lj4 = coeff[3] return (r6inv * (lj3*r6inv - lj4)) diff --git a/src/PYTHON/pair_python.cpp b/src/PYTHON/pair_python.cpp index 1d80145c58..384aa5a94b 100644 --- a/src/PYTHON/pair_python.cpp +++ b/src/PYTHON/pair_python.cpp @@ -24,6 +24,7 @@ #include "comm.h" #include "force.h" #include "memory.h" +#include "update.h" #include "neigh_list.h" #include "python.h" #include "error.h" @@ -41,9 +42,10 @@ PairPython::PairPython(LAMMPS *lmp) : Pair(lmp) { one_coeff = 1; reinitflag = 0; - python->init(); - py_potential = NULL; + skip_types = NULL; + + python->init(); // add current directory to PYTHONPATH PyObject * py_path = PySys_GetObject((char *)"path"); @@ -60,7 +62,8 @@ PairPython::PairPython(LAMMPS *lmp) : Pair(lmp) { PairPython::~PairPython() { - if(py_potential) Py_DECREF((PyObject*) py_potential); + if (py_potential) Py_DECREF((PyObject*) py_potential); + delete[] skip_types; if (allocated) { memory->destroy(setflag); @@ -160,6 +163,9 @@ void PairPython::compute(int eflag, int vflag) rsq = delx*delx + dely*dely + delz*delz; jtype = type[j]; + // with hybrid/overlay we might get called for skipped types + if (skip_types[itype] || skip_types[jtype]) continue; + py_jtype = PY_INT_FROM_LONG(jtype); PyTuple_SetItem(py_compute_args,2,py_jtype); @@ -173,7 +179,7 @@ void PairPython::compute(int eflag, int vflag) PyGILState_Release(gstate); error->all(FLERR,"Calling 'compute_force' function failed"); } - fpair = factor_lj*PyFloat_AsDouble(py_value)/rsq; + fpair = factor_lj*PyFloat_AsDouble(py_value); f[i][0] += delx*fpair; f[i][1] += dely*fpair; @@ -299,6 +305,39 @@ void PairPython::coeff(int narg, char **arg) py_potential = (void *) py_pair_instance; + PyObject *py_check_units = PyObject_GetAttrString(py_pair_instance,"check_units"); + if (!py_check_units) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not find 'check_units' method'"); + } + if (!PyCallable_Check(py_check_units)) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Python 'check_units' is not callable"); + } + PyObject *py_units_args = PyTuple_New(1); + if (!py_units_args) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Could not create tuple for 'check_units' function arguments"); + } + + PyObject *py_name = PY_STRING_FROM_STRING(update->unit_style); + PyTuple_SetItem(py_units_args,0,py_name); + PyObject *py_value = PyObject_CallObject(py_check_units,py_units_args); + if (!py_value) { + PyErr_Print(); + PyErr_Clear(); + PyGILState_Release(gstate); + error->all(FLERR,"Calling 'check_units' function failed"); + } + Py_DECREF(py_units_args); + + PyObject *py_map_coeff = PyObject_GetAttrString(py_pair_instance,"map_coeff"); if (!py_map_coeff) { PyErr_Print(); @@ -321,9 +360,15 @@ void PairPython::coeff(int narg, char **arg) error->all(FLERR,"Could not create tuple for 'map_coeff' function arguments"); } - PyObject *py_type, *py_name, *py_value; + delete[] skip_types; + skip_types = new int[ntypes+1]; + skip_types[0] = 1; for (int i = 1; i <= ntypes ; i++) { - py_type = PY_INT_FROM_LONG(i); + if (strcmp(arg[2+i],"NULL") == 0) { + skip_types[i] = 1; + continue; + } else skip_types[i] = 0; + PyObject *py_type = PY_INT_FROM_LONG(i); py_name = PY_STRING_FROM_STRING(arg[2+i]); PyTuple_SetItem(py_map_args,0,py_name); PyTuple_SetItem(py_map_args,1,py_type); @@ -336,10 +381,8 @@ void PairPython::coeff(int narg, char **arg) } for (int j = i; j <= ntypes ; j++) { - if (strcmp(arg[2+i],"NULL") != 0) { - setflag[i][j] = 1; - cutsq[i][j] = cut_global*cut_global; - } + setflag[i][j] = 1; + cutsq[i][j] = cut_global*cut_global; } } Py_DECREF(py_map_args); @@ -359,6 +402,11 @@ double PairPython::single(int i, int j, int itype, int jtype, double rsq, double factor_coul, double factor_lj, double &fforce) { + // with hybrid/overlay we might get called for skipped types + if (skip_types[itype] || skip_types[jtype]) { + fforce = 0.0; + return 0.0; + } // prepare access to compute_force and compute_energy functions @@ -417,7 +465,7 @@ double PairPython::single(int i, int j, int itype, int jtype, double rsq, PyGILState_Release(gstate); error->all(FLERR,"Calling 'compute_force' function failed"); } - fforce = factor_lj*PyFloat_AsDouble(py_value)/rsq; + fforce = factor_lj*PyFloat_AsDouble(py_value); py_value = PyObject_CallObject(py_compute_energy,py_compute_args); if (!py_value) { diff --git a/src/PYTHON/pair_python.h b/src/PYTHON/pair_python.h index 3c9c34fbdf..440b39e482 100644 --- a/src/PYTHON/pair_python.h +++ b/src/PYTHON/pair_python.h @@ -47,6 +47,7 @@ class PairPython : public Pair { protected: double cut_global; void * py_potential; + int * skip_types; virtual void allocate(); }; From 9725708b90b9e9c3106ed0fa3c065a4c8cf2c0b1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 00:29:02 -0400 Subject: [PATCH 042/302] update pair style python docs --- doc/src/pair_python.txt | 187 ++++++++++++++++++++++++++++------------ 1 file changed, 131 insertions(+), 56 deletions(-) diff --git a/doc/src/pair_python.txt b/doc/src/pair_python.txt index 2f034031f1..2e2a528b7f 100644 --- a/doc/src/pair_python.txt +++ b/doc/src/pair_python.txt @@ -26,86 +26,161 @@ pair_coeff * * python py_pot.LJCutSPCE OW NULL :pre [Description:] The {python} pair style provides a way to define pairwise additive -potential functions as scripted python script code that is loaded -into LAMMPS from a python file which must contain specific python -class definitions. This allows to model potentials, that are not -currently available in LAMMPS without having to program a new -pair style or modify an existing one and recompile LAMMPS. Due to -python being an interpreted language, the performance of this pair -style is going to be significantly slower (often between 20x and 100x), -but this penalty can be significantly reduced through generating -tabulations from the python code through the "pair_write"_pair_write.html -command. +potential functions as python script code that is loaded into LAMMPS +from a python file which must contain specific python class definitions. +This allows to rapidly evaluate different potential functions without +having to modify and recompile LAMMPS. Due to python being an +interpreted language, however, the performance of this pair style is +going to be significantly slower (often between 20x and 100x) than +corresponding compiled code. This penalty can be significantly reduced +through generating tabulations from the python code through the +"pair_write"_pair_write.html command, which is supported by this style. Only a single pair_coeff command is used with the {python} pair style -which specifies a python class inside a python module that LAMMPS will -look up either in the current directory, the folder pointed to by the -LAMMPS_POTENTIALS environment variable or somewhere in your python path. -The class definition has to follow specific rules as explained below. +which specifies a python class inside a python module or file that +LAMMPS will look up in the current directory, the folder pointed to by +the LAMMPS_POTENTIALS environment variable or somewhere in your python +path. A single python module can hold multiple python pair class +definitions. The class definitions itself have to follow specific rules +that are explained below. Atom types in the python class are specified through symbolic constants, typically strings. These are mapped to LAMMPS atom types by specifying -N additional arguments after the filename in the pair_coeff command, -where N is the number of LAMMPS atom types: +N additional arguments after the class name in the pair_coeff command, +where N must be the number of currently defined atom types: -module.class -N element names = mapping of python atom types to LAMMPS atom types :ul +As an example, imagine a file {py_pot.py} has a python potential class +names {LJCutMelt} with parameters and potential functions for a two +Lennard-Jones atom types labeled as 'LJ1' and 'LJ2'. In your LAMMPS +input and you would have defined 3 atom types, out of which the first +two are supposed to be using the 'LJ1' parameters and the third +the 'LJ2' parameters, then you would use the following pair_coeff +command: -As an example, imagine a file py_pot.py has a python class LJCutMelt -with parameters and potential functions for a two Lennard-Jones -atom types labeled as 'LJ1' and 'LJ2', and you would have defined -4 atom types in LAMMPS, out which the first three are supposed to be -using the 'LJ1' parameters and the fourth the 'LJ2' parameters, then -you would use the following pair_coeff command: +pair_coeff * * py_pot.LJCutMelt LJ1 LJ1 LJ2 :pre -pair_coeff * * py_pot.LJCutMelt LJ1 LJ1 LJ1 LJ2 :pre +The first two arguments [must] be * * so as to span all LAMMPS atom types. +The first two LJ1 arguments map LAMMPS atom types 1 and 2 to the LJ1 +atom type in the LJCutMelt class of the py_pot.py file. The final LJ2 +argument maps LAMMPS atom type 3 to the LJ2 atom type the python file. +If a mapping value is specified as NULL, the mapping is not performed, +any pair interaction with this atom type will be skipped. This can be +used when a {python} potential is used as part of the {hybrid} or +{hybrid/overlay} pair style. The NULL values are then placeholders for +atom types that will be used with other potentials. -The 1st 2 arguments must be * * so as to span all LAMMPS atom types. -The first three LJ1 arguments map LAMMPS atom types 1,2,3 to the LJ1 -atom type in the py_pot.py file. The final LJ2 argument maps LAMMPS -atom type 4 to the LJ2 atom type the python file. If a mapping value -is specified as NULL, the mapping is not performed. This can be used -when a {python} 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. +:line -The python potential file has to provide classes for the computation -of the potential energy and forces, which have to contain three methods: -{map_coeff}, {compute_force}, and {compute_energy}. For details please -see the provided examples in the examples/python folder. +The python potential file has to start with the following code: + +from __future__ import print_function + +class LAMMPSPairPotential(object): + def __init__(self): + self.pmap=dict() + self.units='lj' + def map_coeff(self,name,ltype): + self.pmap[ltype]=name + def check_units(self,units): + if (units != self.units): + raise Exception("Conflicting units: %s vs. %s" % (self.units,units)) +:pre + +Any classes with definitions of specific potentials have to be derived +from this class and should be initialize in a similar fashion to the +example given below. NOTE: The class constructor has to set up a data +structure containing the potential parameters supported by this class. +It should also define a variable {self.units} containing a string +matching one of the options of LAMMPS' "units command"_units.html, which +is used to verify, that the potential definition in the python class and +in the LAMMPS input match. Example for a single type Lennard-Jones +potential class {LJCutMelt} in reducted units, which defines an atom +type {lj} for which the parameters epsilon and sigma are both 1.0: + +class LJCutMelt(LAMMPSPairPotential): + def __init__(self): + super(LJCutMelt,self).__init__() + # set coeffs: 48*eps*sig**12, 24*eps*sig**6, + # 4*eps*sig**12, 4*eps*sig**6 + self.units = 'lj' + self.coeff = {'lj' : {'lj' : (48.0,24.0,4.0,4.0)}} +:pre + +The class also has to provide two methods for the computation of the +potential energy and forces, which have be named {compute_force}, +and {compute_energy}, which both take 3 numerical arguments: + + rsq = the square of the distance between a pair of atoms (float) :li + itype = the (numerical) type of the first atom :li + jtype = the (numerical) type of the second atom :ul + +This functions need to compute the force and the energy, respectively, +and use the result as return value. The functions need to use the +{pmap} dictionary to convert the LAMMPS atom type number to the symbolic +value of the internal potential parameter data structure. Following +the {LJCutMelt} example, here are the two functions: + + def compute_force(self,rsq,itype,jtype): + coeff = self.coeff[self.pmap[itype]][self.pmap[jtype]] + r2inv = 1.0/rsq + r6inv = r2inv*r2inv*r2inv + lj1 = coeff[0] + lj2 = coeff[1] + return (r6inv * (lj1*r6inv - lj2))*r2inv :pre + + def compute_energy(self,rsq,itype,jtype): + coeff = self.coeff[self.pmap[itype]][self.pmap[jtype]] + r2inv = 1.0/rsq + r6inv = r2inv*r2inv*r2inv + lj3 = coeff[2] + lj4 = coeff[3] + return (r6inv * (lj3*r6inv - lj4)) :pre + +IMPORTANT NOTE: for consistency with the C++ pair styles in LAMMPS, +the {compute_force} function follows the conventions of the Pair::single() +methods and does not return the full force, but the force scaled by +the distance between the two atoms, so this value only needs to be +multiplied by delta x, delta y, and delta z to conveniently obtain +the three components of the force vector between these two atoms. :line IMPORTANT NOTE: The evaluation of scripted python code will slow down -the computation pair-wise interactions very significantly. However, +the computation pair-wise interactions quite significantly. However, this can be largely worked around through using the python pair style -to generate tabulated potentials on the fly. Please see below for an -example of how to build the table file: +not for the actual simulation, but to generate tabulated potentials +on the fly using the "pair_write command"_pair_write.html . Please +see below for an example LAMMPS input of how to build a table file: pair_style python 2.5 -pair_coeff * * py_pot.LJCutMelt LJ1 LJ2 LJ2 -shell rm -f lj1_lj2.table -pair_write 1 1 10000 rsq 0.01 2.5 lj1_lj2.table LJ1-LJ1 -pair_write 1 2 10000 rsq 0.01 2.5 lj1_lj2.table LJ1-LJ2 -pair_write 2 2 10000 rsq 0.01 2.5 lj1_lj2.table LJ2-LJ2 :pre +pair_coeff * * py_pot.LJCutMelt lj +shell rm -f melt.table +pair_write 1 1 2000 rsq 0.01 2.5 lj1_lj2.table lj :pre -After switching the pair style to {table}, the various potential -function tables need to be assigned to the LAMMPS atom types: +Note, that it is strong recommended to try to [delete] the potential +table file before generating it. Since the {pair_write} command will +always append to a table file, which pair style table will use the first +match. Thus when changing the potential function in the python class, +the table pair style will still read the old variant. -pair_style table linear 10000 -pair_coeff 1 1 lj1_lj2.table LJ1-LJ1 -pair_coeff 1 2* lj1_lj2.table LJ1-LJ2 -pair_coeff 2* 2* lj1_lj2.table LJ2-LJ2 :pre +After switching the pair style to {table}, the potential tables need +to be assigned to the LAMMPS atom types like this: + +pair_style table linear 2000 +pair_coeff 1 1 melt.table lj :pre + +This can also be done for more complex systems. Please see the +{examples/python} folders for a few more examples. :line [Mixing, shift, table, tail correction, restart, rRESPA info]: -Mixing of potential parameters has to be handled inside the -provided python module. The python pair style assumes that force -and energy computation can be correctly performed for all -pairs of atom types as they are mapped to the atom type labels -inside the python potential class. +Mixing of potential parameters has to be handled inside the provided +python module. The python pair style simply assumes that force and +energy computation can be correctly performed for all pairs of atom +types as they are mapped to the atom type labels inside the python +potential class. This pair style does not support the "pair_modify"_pair_modify.html shift, table, and tail options. From 9833f38499a06fadc1861d3270ec88bcea54dbbc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 00:30:19 -0400 Subject: [PATCH 043/302] change coulomb example to use cutoff coulomb --- examples/python/in.pair_python_coulomb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/examples/python/in.pair_python_coulomb b/examples/python/in.pair_python_coulomb index 5944592473..7eb8599ac2 100644 --- a/examples/python/in.pair_python_coulomb +++ b/examples/python/in.pair_python_coulomb @@ -3,14 +3,11 @@ atom_style full read_data data.spce -pair_style hybrid/overlay coul/long 12.0 python 12.0 -kspace_style pppm 1.0e-6 +pair_style hybrid/overlay coul/cut 12.0 python 12.0 -pair_coeff * * coul/long +pair_coeff * * coul/cut pair_coeff * * python py_pot.LJCutSPCE OW NULL -pair_modify table 0 - bond_style harmonic angle_style harmonic dihedral_style none From 436d3fd761881b402e68acaf76cb1913848fbf90 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 00:30:41 -0400 Subject: [PATCH 044/302] make hybrid example use half the atoms with python, half with lj/cut --- examples/python/in.pair_python_hybrid | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/python/in.pair_python_hybrid b/examples/python/in.pair_python_hybrid index d5db729bda..5d5157ae6d 100644 --- a/examples/python/in.pair_python_hybrid +++ b/examples/python/in.pair_python_hybrid @@ -8,6 +8,8 @@ region box block 0 10 0 10 0 10 create_box 2 box create_atoms 1 box mass * 1.0 +region half block -0.1 4.9 0 10 0 10 +set region half type 2 velocity all create 3.0 87287 From 09f3b687f7d76fa407ffccb00fb43ea00fbbf43d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 00:31:15 -0400 Subject: [PATCH 045/302] new long-rance example with using hybrid/overlay and table only for lj part --- examples/python/in.pair_python_long | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 examples/python/in.pair_python_long diff --git a/examples/python/in.pair_python_long b/examples/python/in.pair_python_long new file mode 100644 index 0000000000..a600e824df --- /dev/null +++ b/examples/python/in.pair_python_long @@ -0,0 +1,38 @@ +units real +atom_style full + +read_data data.spce + +pair_style python 12.0 +pair_coeff * * py_pot.LJCutSPCE OW HW + +bond_style harmonic +angle_style harmonic +dihedral_style none +improper_style none + +bond_coeff 1 1000.00 1.000 +angle_coeff 1 100.0 109.47 + +special_bonds lj/coul 0.0 0.0 1.0 + +neighbor 2.0 bin + +fix 1 all shake 0.0001 20 0 b 1 a 1 +fix 2 all nvt temp 300.0 300.0 100.0 + +# create only lj/cut table for the oxygen atoms from python +shell rm -f spce.table +pair_write 1 1 2000 rsq 0.1 12 spce.table OW-OW + +# switch to tabulated potential with long-range coulomb as overlay +pair_style hybrid/overlay coul/long 12.0 table linear 2000 +kspace_style pppm 1.0e-6 +pair_coeff * * coul/long +pair_coeff 1 1 table spce.table OW-OW + +thermo 10 +run 100 + +shell rm spce.table + From 8d46aa605606a5ac047077c4827fc87ea4da98f0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 00:31:54 -0400 Subject: [PATCH 046/302] add readme file to discuss various python pair style usage examples --- examples/python/README.pair_python | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 examples/python/README.pair_python diff --git a/examples/python/README.pair_python b/examples/python/README.pair_python new file mode 100644 index 0000000000..3844a2676e --- /dev/null +++ b/examples/python/README.pair_python @@ -0,0 +1,41 @@ +This folder contains several LAMMPS input scripts and a python module +file py_pot.py to demonstrate the use of the pair style python. + +in.pair_python_melt: +This is a version of the melt example using the python pair style. The first +part of the output should have identical energies, temperature and pressure +than the melt example. The following two sections then demonstrate how to +restart with pair style python from a restart file and a data file. + +in.pair_python_hybrid: +This versions shows how to mix regular pair styles with a python pair style. +However, in this case both potentials are the same, so the energies and +pressure in the output should be identical to that of the previous example. + +in.pair_python_spce: +This input shows a simulation of small bulk water system with the SPC/E +water potential. Since the python pair style does not support computing +coulomb contributions, pair style hybrid/overload is used to combine +the python style containing the Lennard-Jones part with the long-range coulomb. +Same as for the previous example, it also showcases restarting. + +in.pair_python_table: +This input demonstrates the use of using the python pair style to build +a table file for use with pair style table. This will run much faster +than the python pair style. This example tabulates the melt example from +above. Note that tabulation is approximative, so the output will only +agree with the melt result to some degree. + +in.pair_python_coulomb: +This is another tabulation example, this time for the SPC/E water example +with cutoff coulomb interactions. +Please note, that tabulating long-range coulomb has a systematic error in +forces and energies for all systems with bonds, angle and dihedrals. +In this case, this will only affect the energies, since the water molecules +are held rigid with fix shake. To enable long-range coulomb the coul/cut +style needs to be replaced with coul/long, a suitable kspace style added +and the pppm keyword added to the table pair style definition. + +in.pair_python_long: +The final example shows how to combine long-range coulomb with tabulation +for only the short range interactions via pair style hybrid/overlay. From 24654ad28f378ecfbe7b321369bf1fc5e414fcc2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 00:38:36 -0400 Subject: [PATCH 047/302] small formatting corrections to pair python style --- doc/src/pair_python.txt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/src/pair_python.txt b/doc/src/pair_python.txt index 2e2a528b7f..84927e52d9 100644 --- a/doc/src/pair_python.txt +++ b/doc/src/pair_python.txt @@ -80,7 +80,7 @@ class LAMMPSPairPotential(object): self.pmap=dict() self.units='lj' def map_coeff(self,name,ltype): - self.pmap[ltype]=name + self.pmap\[ltype\]=name def check_units(self,units): if (units != self.units): raise Exception("Conflicting units: %s vs. %s" % (self.units,units)) @@ -91,7 +91,7 @@ from this class and should be initialize in a similar fashion to the example given below. NOTE: The class constructor has to set up a data structure containing the potential parameters supported by this class. It should also define a variable {self.units} containing a string -matching one of the options of LAMMPS' "units command"_units.html, which +matching one of the options of LAMMPS' "units"_units.html command, which is used to verify, that the potential definition in the python class and in the LAMMPS input match. Example for a single type Lennard-Jones potential class {LJCutMelt} in reducted units, which defines an atom @@ -121,19 +121,19 @@ value of the internal potential parameter data structure. Following the {LJCutMelt} example, here are the two functions: def compute_force(self,rsq,itype,jtype): - coeff = self.coeff[self.pmap[itype]][self.pmap[jtype]] + coeff = self.coeff\[self.pmap\[itype\]\]\[self.pmap\[jtype\]\] r2inv = 1.0/rsq r6inv = r2inv*r2inv*r2inv - lj1 = coeff[0] - lj2 = coeff[1] + lj1 = coeff\[0\] + lj2 = coeff\[1\] return (r6inv * (lj1*r6inv - lj2))*r2inv :pre def compute_energy(self,rsq,itype,jtype): - coeff = self.coeff[self.pmap[itype]][self.pmap[jtype]] + coeff = self.coeff\[self.pmap\[itype\]\]\[self.pmap\[jtype\]\] r2inv = 1.0/rsq r6inv = r2inv*r2inv*r2inv - lj3 = coeff[2] - lj4 = coeff[3] + lj3 = coeff\[2\] + lj4 = coeff\[3\] return (r6inv * (lj3*r6inv - lj4)) :pre IMPORTANT NOTE: for consistency with the C++ pair styles in LAMMPS, @@ -149,7 +149,7 @@ IMPORTANT NOTE: The evaluation of scripted python code will slow down the computation pair-wise interactions quite significantly. However, this can be largely worked around through using the python pair style not for the actual simulation, but to generate tabulated potentials -on the fly using the "pair_write command"_pair_write.html . Please +on the fly using the "pair_write"_pair_write.html command. Please see below for an example LAMMPS input of how to build a table file: pair_style python 2.5 From 0208fe9996be246d389fd05d0a7d3be995dc324d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 00:46:49 -0400 Subject: [PATCH 048/302] update example outputs --- .../log.4May17.pair_python_coulomb.g++.1 | 100 ++++-------- .../log.4May17.pair_python_coulomb.g++.4 | 108 ++++--------- .../log.4May17.pair_python_hybrid.g++.1 | 81 +++++----- .../log.4May17.pair_python_hybrid.g++.4 | 83 +++++----- .../python/log.4May17.pair_python_long.g++.1 | 146 ++++++++++++++++++ .../python/log.4May17.pair_python_long.g++.4 | 146 ++++++++++++++++++ .../python/log.4May17.pair_python_melt.g++.1 | 54 +++---- .../python/log.4May17.pair_python_melt.g++.4 | 56 +++---- .../python/log.4May17.pair_python_spce.g++.1 | 22 +-- .../python/log.4May17.pair_python_spce.g++.4 | 22 +-- .../python/log.4May17.pair_python_table.g++.1 | 16 +- .../python/log.4May17.pair_python_table.g++.4 | 18 +-- 12 files changed, 535 insertions(+), 317 deletions(-) create mode 100644 examples/python/log.4May17.pair_python_long.g++.1 create mode 100644 examples/python/log.4May17.pair_python_long.g++.4 diff --git a/examples/python/log.4May17.pair_python_coulomb.g++.1 b/examples/python/log.4May17.pair_python_coulomb.g++.1 index 67bb3b3496..b08d4b939c 100644 --- a/examples/python/log.4May17.pair_python_coulomb.g++.1 +++ b/examples/python/log.4May17.pair_python_coulomb.g++.1 @@ -21,14 +21,11 @@ read_data data.spce 1 = max # of 1-4 neighbors 2 = max # of special neighbors -pair_style hybrid/overlay coul/long 12.0 python 12.0 -kspace_style pppm 1.0e-6 +pair_style hybrid/overlay coul/cut 12.0 python 12.0 -pair_coeff * * coul/long +pair_coeff * * coul/cut pair_coeff * * python py_pot.LJCutSPCE OW NULL -pair_modify table 0 - bond_style harmonic angle_style harmonic dihedral_style none @@ -54,15 +51,6 @@ fix 2 all nvt temp 300.0 300.0 100.0 # create combined lj/coul table for all atom types # generate tabulated potential from python variant pair_write 1 1 2000 rsq 0.1 12 spce.table OW-OW -0.8472 -0.8472 -PPPM initialization ... -WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) - G vector (1/distance) = 0.279652 - grid = 40 40 40 - stencil order = 5 - estimated absolute RMS force accuracy = 0.000394206 - estimated relative force accuracy = 1.18714e-06 - using double precision FFTs - 3d grid and FFT values/proc = 103823 64000 Neighbor list info ... update every 1 steps, delay 10 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -70,7 +58,7 @@ Neighbor list info ... ghost atom cutoff = 14 binsize = 7, bins = 6 6 6 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair coul/long, perpetual + (1) pair coul/cut, perpetual attributes: half, newton on pair build: half/bin/newton stencil: half/bin/3d/newton @@ -81,25 +69,7 @@ Neighbor list info ... stencil: none bin: none pair_write 1 2 2000 rsq 0.1 12 spce.table OW-HW -0.8472 0.4236 -PPPM initialization ... -WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) - G vector (1/distance) = 0.279652 - grid = 40 40 40 - stencil order = 5 - estimated absolute RMS force accuracy = 0.000394206 - estimated relative force accuracy = 1.18714e-06 - using double precision FFTs - 3d grid and FFT values/proc = 103823 64000 pair_write 2 2 2000 rsq 0.1 12 spce.table HW-HW 0.4236 0.4236 -PPPM initialization ... -WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) - G vector (1/distance) = 0.279652 - grid = 40 40 40 - stencil order = 5 - estimated absolute RMS force accuracy = 0.000394206 - estimated relative force accuracy = 1.18714e-06 - using double precision FFTs - 3d grid and FFT values/proc = 103823 64000 # switch to tabulated potential pair_style table linear 2000 pppm @@ -109,15 +79,6 @@ pair_coeff 2 2 spce.table HW-HW thermo 10 run 100 -PPPM initialization ... -WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) - G vector (1/distance) = 0.279652 - grid = 40 40 40 - stencil order = 5 - estimated absolute RMS force accuracy = 0.000394674 - estimated relative force accuracy = 1.18855e-06 - using double precision FFTs - 3d grid and FFT values/proc = 103823 64000 Neighbor list info ... update every 1 steps, delay 10 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -130,49 +91,48 @@ Neighbor list info ... pair build: half/bin/newton stencil: half/bin/3d/newton bin: standard -Per MPI rank memory allocation (min/avg/max) = 35.26 | 35.26 | 35.26 Mbytes +Per MPI rank memory allocation (min/avg/max) = 25.08 | 25.08 | 25.08 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0 -100272.97 0 -100272.97 -1282.0708 - 10 120.61568 -101350.63 0 -100272.39 -4077.5051 - 20 136.11379 -101465.43 0 -100248.65 -5136.5677 - 30 137.01602 -101455.3 0 -100230.46 -5347.8311 - 40 153.424 -101582.46 0 -100210.93 -5223.1676 - 50 167.73654 -101686.24 0 -100186.77 -4468.6687 - 60 163.11642 -101618.16 0 -100159.99 -3291.7815 - 70 169.64512 -101647.89 0 -100131.35 -2611.638 - 80 182.9979 -101737.01 0 -100101.11 -2390.6293 - 90 191.33873 -101778.71 0 -100068.24 -2239.386 - 100 194.7458 -101775.84 0 -100034.92 -1951.9128 -Loop time of 7.63869 on 1 procs for 100 steps with 4500 atoms + 0 0 -18284.922 0 -18284.922 -2080.7739 + 10 146.83806 -19552.072 0 -18239.421 -4865.31 + 20 183.15761 -18706.872 0 -17069.543 -4865.6695 + 30 205.96203 -18901.541 0 -17060.354 -4454.8634 + 40 241.62768 -18323.117 0 -16163.099 -3269.1475 + 50 265.98384 -19883.562 0 -17505.813 -2788.5194 + 60 274.01897 -21320.575 0 -18870.996 -2387.0708 + 70 288.7601 -19849.269 0 -17267.913 -1235.818 + 80 300.64724 -20958.602 0 -18270.981 -1714.7988 + 90 304.19113 -21580.4 0 -18861.099 -2144.1614 + 100 304.22027 -21239.014 0 -18519.452 -2092.6759 +Loop time of 6.01861 on 1 procs for 100 steps with 4500 atoms -Performance: 1.131 ns/day, 21.219 hours/ns, 13.091 timesteps/s -99.6% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 1.436 ns/day, 16.718 hours/ns, 16.615 timesteps/s +99.7% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.7777 | 5.7777 | 5.7777 | 0.0 | 75.64 -Bond | 0.00017595 | 0.00017595 | 0.00017595 | 0.0 | 0.00 -Kspace | 1.5385 | 1.5385 | 1.5385 | 0.0 | 20.14 -Neigh | 0.22962 | 0.22962 | 0.22962 | 0.0 | 3.01 -Comm | 0.024123 | 0.024123 | 0.024123 | 0.0 | 0.32 -Output | 0.00061131 | 0.00061131 | 0.00061131 | 0.0 | 0.01 -Modify | 0.062444 | 0.062444 | 0.062444 | 0.0 | 0.82 -Other | | 0.005466 | | | 0.07 +Pair | 5.698 | 5.698 | 5.698 | 0.0 | 94.67 +Bond | 0.0001626 | 0.0001626 | 0.0001626 | 0.0 | 0.00 +Neigh | 0.23235 | 0.23235 | 0.23235 | 0.0 | 3.86 +Comm | 0.018961 | 0.018961 | 0.018961 | 0.0 | 0.32 +Output | 0.00058126 | 0.00058126 | 0.00058126 | 0.0 | 0.01 +Modify | 0.063452 | 0.063452 | 0.063452 | 0.0 | 1.05 +Other | | 0.005146 | | | 0.09 Nlocal: 4500 ave 4500 max 4500 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 21216 ave 21216 max 21216 min +Nghost: 21285 ave 21285 max 21285 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 2.60177e+06 ave 2.60177e+06 max 2.60177e+06 min +Neighs: 2.59766e+06 ave 2.59766e+06 max 2.59766e+06 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 2601766 -Ave neighs/atom = 578.17 +Total # of neighbors = 2597662 +Ave neighs/atom = 577.258 Ave special neighs/atom = 2 Neighbor list builds = 3 Dangerous builds = 0 shell rm spce.table -Total wall time: 0:00:07 +Total wall time: 0:00:06 diff --git a/examples/python/log.4May17.pair_python_coulomb.g++.4 b/examples/python/log.4May17.pair_python_coulomb.g++.4 index d5fd15ccd3..b002d5c1ab 100644 --- a/examples/python/log.4May17.pair_python_coulomb.g++.4 +++ b/examples/python/log.4May17.pair_python_coulomb.g++.4 @@ -21,14 +21,11 @@ read_data data.spce 1 = max # of 1-4 neighbors 2 = max # of special neighbors -pair_style hybrid/overlay coul/long 12.0 python 12.0 -kspace_style pppm 1.0e-6 +pair_style hybrid/overlay coul/cut 12.0 python 12.0 -pair_coeff * * coul/long +pair_coeff * * coul/cut pair_coeff * * python py_pot.LJCutSPCE OW NULL -pair_modify table 0 - bond_style harmonic angle_style harmonic dihedral_style none @@ -54,15 +51,6 @@ fix 2 all nvt temp 300.0 300.0 100.0 # create combined lj/coul table for all atom types # generate tabulated potential from python variant pair_write 1 1 2000 rsq 0.1 12 spce.table OW-OW -0.8472 -0.8472 -PPPM initialization ... -WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) - G vector (1/distance) = 0.279652 - grid = 40 40 40 - stencil order = 5 - estimated absolute RMS force accuracy = 0.000394206 - estimated relative force accuracy = 1.18714e-06 - using double precision FFTs - 3d grid and FFT values/proc = 34263 16000 Neighbor list info ... update every 1 steps, delay 10 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -70,7 +58,7 @@ Neighbor list info ... ghost atom cutoff = 14 binsize = 7, bins = 6 6 6 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair coul/long, perpetual + (1) pair coul/cut, perpetual attributes: half, newton on pair build: half/bin/newton stencil: half/bin/3d/newton @@ -81,25 +69,7 @@ Neighbor list info ... stencil: none bin: none pair_write 1 2 2000 rsq 0.1 12 spce.table OW-HW -0.8472 0.4236 -PPPM initialization ... -WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) - G vector (1/distance) = 0.279652 - grid = 40 40 40 - stencil order = 5 - estimated absolute RMS force accuracy = 0.000394206 - estimated relative force accuracy = 1.18714e-06 - using double precision FFTs - 3d grid and FFT values/proc = 34263 16000 pair_write 2 2 2000 rsq 0.1 12 spce.table HW-HW 0.4236 0.4236 -PPPM initialization ... -WARNING: Using polynomial approximation for long-range coulomb (../kspace.cpp:321) - G vector (1/distance) = 0.279652 - grid = 40 40 40 - stencil order = 5 - estimated absolute RMS force accuracy = 0.000394206 - estimated relative force accuracy = 1.18714e-06 - using double precision FFTs - 3d grid and FFT values/proc = 34263 16000 # switch to tabulated potential pair_style table linear 2000 pppm @@ -109,15 +79,6 @@ pair_coeff 2 2 spce.table HW-HW thermo 10 run 100 -PPPM initialization ... -WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) - G vector (1/distance) = 0.279652 - grid = 40 40 40 - stencil order = 5 - estimated absolute RMS force accuracy = 0.000394674 - estimated relative force accuracy = 1.18855e-06 - using double precision FFTs - 3d grid and FFT values/proc = 34263 16000 Neighbor list info ... update every 1 steps, delay 10 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -130,49 +91,48 @@ Neighbor list info ... pair build: half/bin/newton stencil: half/bin/3d/newton bin: standard -Per MPI rank memory allocation (min/avg/max) = 13.05 | 13.05 | 13.05 Mbytes +Per MPI rank memory allocation (min/avg/max) = 9.962 | 9.963 | 9.963 Mbytes Step Temp E_pair E_mol TotEng Press - 0 0 -100272.97 0 -100272.97 -1282.0708 - 10 120.61568 -101350.63 0 -100272.39 -4077.5051 - 20 136.11379 -101465.43 0 -100248.65 -5136.5677 - 30 137.01602 -101455.3 0 -100230.46 -5347.8311 - 40 153.424 -101582.46 0 -100210.93 -5223.1676 - 50 167.73654 -101686.24 0 -100186.77 -4468.6687 - 60 163.11642 -101618.16 0 -100159.99 -3291.7815 - 70 169.64512 -101647.89 0 -100131.35 -2611.638 - 80 182.9979 -101737.01 0 -100101.11 -2390.6293 - 90 191.33873 -101778.71 0 -100068.24 -2239.386 - 100 194.7458 -101775.84 0 -100034.92 -1951.9128 -Loop time of 2.35848 on 4 procs for 100 steps with 4500 atoms + 0 0 -18284.922 0 -18284.922 -2080.7739 + 10 146.83806 -19552.072 0 -18239.421 -4865.31 + 20 183.15761 -18706.872 0 -17069.543 -4865.6695 + 30 205.96203 -18901.541 0 -17060.354 -4454.8634 + 40 241.62768 -18323.117 0 -16163.099 -3269.1475 + 50 265.98384 -19883.562 0 -17505.813 -2788.5194 + 60 274.01897 -21320.575 0 -18870.996 -2387.0708 + 70 288.7601 -19849.269 0 -17267.913 -1235.818 + 80 300.64724 -20958.602 0 -18270.981 -1714.7988 + 90 304.19113 -21580.4 0 -18861.099 -2144.1614 + 100 304.22027 -21239.014 0 -18519.452 -2092.6759 +Loop time of 1.7361 on 4 procs for 100 steps with 4500 atoms -Performance: 3.663 ns/day, 6.551 hours/ns, 42.400 timesteps/s -99.0% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 4.977 ns/day, 4.823 hours/ns, 57.600 timesteps/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 | 1.5061 | 1.5612 | 1.6879 | 5.9 | 66.20 -Bond | 9.5129e-05 | 0.00012672 | 0.00014567 | 0.0 | 0.01 -Kspace | 0.52033 | 0.64456 | 0.69933 | 9.1 | 27.33 -Neigh | 0.066265 | 0.066342 | 0.06644 | 0.0 | 2.81 -Comm | 0.03394 | 0.036139 | 0.038043 | 0.8 | 1.53 -Output | 0.00040889 | 0.00044978 | 0.00056887 | 0.0 | 0.02 -Modify | 0.04557 | 0.045813 | 0.046082 | 0.1 | 1.94 -Other | | 0.003826 | | | 0.16 +Pair | 1.4424 | 1.5149 | 1.6066 | 5.3 | 87.26 +Bond | 8.9407e-05 | 0.00010258 | 0.00012374 | 0.0 | 0.01 +Neigh | 0.064205 | 0.064241 | 0.064295 | 0.0 | 3.70 +Comm | 0.023643 | 0.1155 | 0.18821 | 19.2 | 6.65 +Output | 0.00038004 | 0.00042355 | 0.00054145 | 0.0 | 0.02 +Modify | 0.037507 | 0.037787 | 0.038042 | 0.1 | 2.18 +Other | | 0.003148 | | | 0.18 -Nlocal: 1125 ave 1154 max 1092 min -Histogram: 1 0 0 0 1 0 0 1 0 1 -Nghost: 12256.2 ave 12296 max 12213 min -Histogram: 1 0 1 0 0 0 0 0 1 1 -Neighs: 650442 ave 678824 max 626375 min -Histogram: 1 0 0 0 2 0 0 0 0 1 +Nlocal: 1125 ave 1162 max 1098 min +Histogram: 1 1 0 0 0 1 0 0 0 1 +Nghost: 12267.8 ave 12302 max 12238 min +Histogram: 2 0 0 0 0 0 0 0 1 1 +Neighs: 649416 ave 681458 max 630541 min +Histogram: 1 0 2 0 0 0 0 0 0 1 -Total # of neighbors = 2601766 -Ave neighs/atom = 578.17 +Total # of neighbors = 2597662 +Ave neighs/atom = 577.258 Ave special neighs/atom = 2 Neighbor list builds = 3 Dangerous builds = 0 shell rm spce.table -Total wall time: 0:00:02 +Total wall time: 0:00:01 diff --git a/examples/python/log.4May17.pair_python_hybrid.g++.1 b/examples/python/log.4May17.pair_python_hybrid.g++.1 index 497943d4fd..718f794a57 100644 --- a/examples/python/log.4May17.pair_python_hybrid.g++.1 +++ b/examples/python/log.4May17.pair_python_hybrid.g++.1 @@ -14,6 +14,9 @@ Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) create_atoms 1 box Created 4000 atoms mass * 1.0 +region half block -0.1 4.9 0 10 0 10 +set region half type 2 + 2000 settings made for type velocity all create 3.0 87287 @@ -50,7 +53,7 @@ Neighbor list info ... pair build: half/bin/atomonly/newton stencil: half/bin/3d/newton bin: standard -Per MPI rank memory allocation (min/avg/max) = 4.828 | 4.828 | 4.828 Mbytes +Per MPI rank memory allocation (min/avg/max) = 4.446 | 4.446 | 4.446 Mbytes Step Temp E_pair E_mol TotEng Press 0 3 -6.7733681 0 -2.2744931 -3.7033504 50 1.6758903 -4.7955425 0 -2.2823355 5.670064 @@ -58,30 +61,30 @@ Step Temp E_pair E_mol TotEng Press 150 1.6324555 -4.7286791 0 -2.280608 5.9589514 200 1.6630725 -4.7750988 0 -2.2811136 5.7364886 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 -Loop time of 21.9463 on 1 procs for 250 steps with 4000 atoms +Loop time of 10.0384 on 1 procs for 250 steps with 4000 atoms -Performance: 4921.114 tau/day, 11.391 timesteps/s -98.6% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 10758.705 tau/day, 24.904 timesteps/s +98.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 | 21.819 | 21.819 | 21.819 | 0.0 | 99.42 -Neigh | 0.094718 | 0.094718 | 0.094718 | 0.0 | 0.43 -Comm | 0.01407 | 0.01407 | 0.01407 | 0.0 | 0.06 -Output | 0.00024915 | 0.00024915 | 0.00024915 | 0.0 | 0.00 -Modify | 0.015002 | 0.015002 | 0.015002 | 0.0 | 0.07 -Other | | 0.003232 | | | 0.01 +Pair | 9.913 | 9.913 | 9.913 | 0.0 | 98.75 +Neigh | 0.095569 | 0.095569 | 0.095569 | 0.0 | 0.95 +Comm | 0.012686 | 0.012686 | 0.012686 | 0.0 | 0.13 +Output | 0.00027537 | 0.00027537 | 0.00027537 | 0.0 | 0.00 +Modify | 0.01386 | 0.01386 | 0.01386 | 0.0 | 0.14 +Other | | 0.003027 | | | 0.03 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 5499 ave 5499 max 5499 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 0 ave 0 max 0 min +Neighs: 85978 ave 85978 max 85978 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 0 -Ave neighs/atom = 0 +Total # of neighbors = 85978 +Ave neighs/atom = 21.4945 Neighbor list builds = 12 Dangerous builds not checked @@ -126,7 +129,7 @@ Neighbor list info ... pair build: half/bin/atomonly/newton stencil: half/bin/3d/newton bin: standard -Per MPI rank memory allocation (min/avg/max) = 4.626 | 4.626 | 4.626 Mbytes +Per MPI rank memory allocation (min/avg/max) = 4.245 | 4.245 | 4.245 Mbytes Step Temp E_pair E_mol TotEng Press 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 300 1.645592 -4.7496711 0 -2.2819002 5.8734193 @@ -134,30 +137,30 @@ Step Temp E_pair E_mol TotEng Press 400 1.6540555 -4.7622999 0 -2.281837 5.8200413 450 1.6264734 -4.7200865 0 -2.2809863 5.9546991 500 1.6366891 -4.7350979 0 -2.2806781 5.9369284 -Loop time of 21.9098 on 1 procs for 250 steps with 4000 atoms +Loop time of 10.0803 on 1 procs for 250 steps with 4000 atoms -Performance: 4929.303 tau/day, 11.410 timesteps/s -98.8% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 10713.932 tau/day, 24.801 timesteps/s +98.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 | 21.68 | 21.68 | 21.68 | 0.0 | 98.95 -Neigh | 0.19625 | 0.19625 | 0.19625 | 0.0 | 0.90 -Comm | 0.014877 | 0.014877 | 0.014877 | 0.0 | 0.07 -Output | 0.00027227 | 0.00027227 | 0.00027227 | 0.0 | 0.00 -Modify | 0.013663 | 0.013663 | 0.013663 | 0.0 | 0.06 -Other | | 0.004371 | | | 0.02 +Pair | 9.8479 | 9.8479 | 9.8479 | 0.0 | 97.69 +Neigh | 0.20002 | 0.20002 | 0.20002 | 0.0 | 1.98 +Comm | 0.01437 | 0.01437 | 0.01437 | 0.0 | 0.14 +Output | 0.00024033 | 0.00024033 | 0.00024033 | 0.0 | 0.00 +Modify | 0.013422 | 0.013422 | 0.013422 | 0.0 | 0.13 +Other | | 0.004348 | | | 0.04 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 5472 ave 5472 max 5472 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 0 ave 0 max 0 min +Neighs: 86930 ave 86930 max 86930 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 0 -Ave neighs/atom = 0 +Total # of neighbors = 86930 +Ave neighs/atom = 21.7325 Neighbor list builds = 25 Dangerous builds = 25 @@ -208,7 +211,7 @@ Neighbor list info ... pair build: half/bin/atomonly/newton stencil: half/bin/3d/newton bin: standard -Per MPI rank memory allocation (min/avg/max) = 4.126 | 4.126 | 4.126 Mbytes +Per MPI rank memory allocation (min/avg/max) = 3.745 | 3.745 | 3.745 Mbytes Step Temp E_pair E_mol TotEng Press 0 1.6275257 -4.7224992 0 -2.281821 5.9567365 50 1.6454666 -4.7497515 0 -2.2821686 5.8729175 @@ -216,32 +219,32 @@ Step Temp E_pair E_mol TotEng Press 150 1.6537193 -4.7627023 0 -2.2827434 5.8177704 200 1.6258731 -4.7205017 0 -2.2823017 5.952511 250 1.6370862 -4.7373176 0 -2.2823022 5.925807 -Loop time of 22.091 on 1 procs for 250 steps with 4000 atoms +Loop time of 9.93686 on 1 procs for 250 steps with 4000 atoms -Performance: 4888.868 tau/day, 11.317 timesteps/s +Performance: 10868.626 tau/day, 25.159 timesteps/s 98.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 | 21.966 | 21.966 | 21.966 | 0.0 | 99.43 -Neigh | 0.094647 | 0.094647 | 0.094647 | 0.0 | 0.43 -Comm | 0.013071 | 0.013071 | 0.013071 | 0.0 | 0.06 -Output | 0.00027871 | 0.00027871 | 0.00027871 | 0.0 | 0.00 -Modify | 0.013882 | 0.013882 | 0.013882 | 0.0 | 0.06 -Other | | 0.003102 | | | 0.01 +Pair | 9.8119 | 9.8119 | 9.8119 | 0.0 | 98.74 +Neigh | 0.096041 | 0.096041 | 0.096041 | 0.0 | 0.97 +Comm | 0.01243 | 0.01243 | 0.01243 | 0.0 | 0.13 +Output | 0.00028133 | 0.00028133 | 0.00028133 | 0.0 | 0.00 +Modify | 0.013261 | 0.013261 | 0.013261 | 0.0 | 0.13 +Other | | 0.002994 | | | 0.03 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 5487 ave 5487 max 5487 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 0 ave 0 max 0 min +Neighs: 86831 ave 86831 max 86831 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 0 -Ave neighs/atom = 0 +Total # of neighbors = 86831 +Ave neighs/atom = 21.7078 Neighbor list builds = 12 Dangerous builds not checked shell rm hybrid.data hybrid.restart -Total wall time: 0:01:07 +Total wall time: 0:00:30 diff --git a/examples/python/log.4May17.pair_python_hybrid.g++.4 b/examples/python/log.4May17.pair_python_hybrid.g++.4 index 0331f34a5e..32d9fc1740 100644 --- a/examples/python/log.4May17.pair_python_hybrid.g++.4 +++ b/examples/python/log.4May17.pair_python_hybrid.g++.4 @@ -14,6 +14,9 @@ Created orthogonal box = (0 0 0) to (16.796 16.796 16.796) create_atoms 1 box Created 4000 atoms mass * 1.0 +region half block -0.1 4.9 0 10 0 10 +set region half type 2 + 2000 settings made for type velocity all create 3.0 87287 @@ -58,30 +61,30 @@ Step Temp E_pair E_mol TotEng Press 150 1.6596605 -4.7699432 0 -2.2810749 5.7830138 200 1.6371874 -4.7365462 0 -2.2813789 5.9246674 250 1.6323462 -4.7292021 0 -2.2812949 5.9762238 -Loop time of 6.01723 on 4 procs for 250 steps with 4000 atoms +Loop time of 2.71748 on 4 procs for 250 steps with 4000 atoms -Performance: 17948.472 tau/day, 41.547 timesteps/s -98.2% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 39742.745 tau/day, 91.997 timesteps/s +98.4% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.1507 | 5.4989 | 5.9629 | 13.1 | 91.39 -Neigh | 0.024123 | 0.024877 | 0.025959 | 0.5 | 0.41 -Comm | 0.02258 | 0.48785 | 0.83691 | 44.1 | 8.11 -Output | 0.00039768 | 0.00045246 | 0.00052929 | 0.0 | 0.01 -Modify | 0.0036325 | 0.0037773 | 0.0038905 | 0.2 | 0.06 -Other | | 0.001357 | | | 0.02 +Pair | 2.4777 | 2.5639 | 2.6253 | 3.9 | 94.35 +Neigh | 0.024626 | 0.025331 | 0.02598 | 0.3 | 0.93 +Comm | 0.061933 | 0.12297 | 0.20987 | 18.0 | 4.53 +Output | 0.00026131 | 0.00027591 | 0.00031352 | 0.0 | 0.01 +Modify | 0.0036087 | 0.0036573 | 0.0037553 | 0.1 | 0.13 +Other | | 0.001337 | | | 0.05 Nlocal: 1000 ave 1010 max 982 min Histogram: 1 0 0 0 0 0 1 0 0 2 Nghost: 2703.75 ave 2713 max 2689 min Histogram: 1 0 0 0 0 0 0 2 0 1 -Neighs: 0 ave 0 max 0 min -Histogram: 4 0 0 0 0 0 0 0 0 0 +Neighs: 21469.8 ave 22167 max 20546 min +Histogram: 1 0 0 0 0 1 1 0 0 1 -Total # of neighbors = 0 -Ave neighs/atom = 0 +Total # of neighbors = 85879 +Ave neighs/atom = 21.4698 Neighbor list builds = 12 Dangerous builds not checked @@ -134,30 +137,30 @@ Step Temp E_pair E_mol TotEng Press 400 1.6388136 -4.7387093 0 -2.2811035 5.9331084 450 1.6431295 -4.7452215 0 -2.2811435 5.8929898 500 1.643316 -4.7454222 0 -2.2810644 5.8454817 -Loop time of 6.09991 on 4 procs for 250 steps with 4000 atoms +Loop time of 2.75827 on 4 procs for 250 steps with 4000 atoms -Performance: 17705.179 tau/day, 40.984 timesteps/s -98.2% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 39155.038 tau/day, 90.637 timesteps/s +98.3% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.2315 | 5.5179 | 6.0183 | 13.7 | 90.46 -Neigh | 0.049134 | 0.051424 | 0.053837 | 0.8 | 0.84 -Comm | 0.021671 | 0.52455 | 0.8132 | 44.5 | 8.60 -Output | 0.00019336 | 0.00026017 | 0.00032115 | 0.0 | 0.00 -Modify | 0.0036032 | 0.0036635 | 0.0038021 | 0.1 | 0.06 -Other | | 0.002068 | | | 0.03 +Pair | 2.3631 | 2.5412 | 2.6672 | 7.2 | 92.13 +Neigh | 0.050358 | 0.052316 | 0.053312 | 0.5 | 1.90 +Comm | 0.032793 | 0.15893 | 0.33904 | 29.1 | 5.76 +Output | 0.00018525 | 0.00020212 | 0.00024509 | 0.0 | 0.01 +Modify | 0.0034482 | 0.0035321 | 0.0036578 | 0.1 | 0.13 +Other | | 0.002039 | | | 0.07 Nlocal: 1000 ave 1012 max 983 min Histogram: 1 0 0 0 0 0 2 0 0 1 Nghost: 2699 ave 2706 max 2693 min Histogram: 1 1 0 0 0 0 1 0 0 1 -Neighs: 0 ave 0 max 0 min -Histogram: 4 0 0 0 0 0 0 0 0 0 +Neighs: 21802 ave 22700 max 21236 min +Histogram: 1 1 0 1 0 0 0 0 0 1 -Total # of neighbors = 0 -Ave neighs/atom = 0 +Total # of neighbors = 87208 +Ave neighs/atom = 21.802 Neighbor list builds = 25 Dangerous builds = 25 @@ -216,32 +219,32 @@ Step Temp E_pair E_mol TotEng Press 150 1.6384234 -4.7389689 0 -2.2819482 5.9315273 200 1.6428814 -4.7460743 0 -2.2823683 5.8888228 250 1.6432631 -4.7466603 0 -2.2823818 5.8398819 -Loop time of 6.04476 on 4 procs for 250 steps with 4000 atoms +Loop time of 2.71936 on 4 procs for 250 steps with 4000 atoms -Performance: 17866.705 tau/day, 41.358 timesteps/s -98.3% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 39715.257 tau/day, 91.933 timesteps/s +98.4% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.2589 | 5.5841 | 5.9788 | 11.1 | 92.38 -Neigh | 0.023942 | 0.024705 | 0.025509 | 0.4 | 0.41 -Comm | 0.034946 | 0.43056 | 0.75671 | 40.0 | 7.12 -Output | 0.00022149 | 0.00029725 | 0.0003593 | 0.0 | 0.00 -Modify | 0.003613 | 0.0037647 | 0.003829 | 0.1 | 0.06 -Other | | 0.001313 | | | 0.02 +Pair | 2.3769 | 2.5432 | 2.6447 | 6.6 | 93.52 +Neigh | 0.024088 | 0.025093 | 0.025748 | 0.4 | 0.92 +Comm | 0.044614 | 0.14598 | 0.31339 | 27.5 | 5.37 +Output | 0.00026488 | 0.00028872 | 0.00034189 | 0.0 | 0.01 +Modify | 0.0034099 | 0.0035709 | 0.0036535 | 0.2 | 0.13 +Other | | 0.001215 | | | 0.04 Nlocal: 1000 ave 1013 max 989 min Histogram: 1 0 0 1 0 1 0 0 0 1 Nghost: 2695.5 ave 2706 max 2682 min Histogram: 1 0 0 0 0 0 2 0 0 1 -Neighs: 0 ave 0 max 0 min -Histogram: 4 0 0 0 0 0 0 0 0 0 +Neighs: 21792 ave 22490 max 21457 min +Histogram: 2 0 1 0 0 0 0 0 0 1 -Total # of neighbors = 0 -Ave neighs/atom = 0 +Total # of neighbors = 87168 +Ave neighs/atom = 21.792 Neighbor list builds = 12 Dangerous builds not checked shell rm hybrid.data hybrid.restart -Total wall time: 0:00:18 +Total wall time: 0:00:08 diff --git a/examples/python/log.4May17.pair_python_long.g++.1 b/examples/python/log.4May17.pair_python_long.g++.1 new file mode 100644 index 0000000000..e2d7cf1bde --- /dev/null +++ b/examples/python/log.4May17.pair_python_long.g++.1 @@ -0,0 +1,146 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task +units real +atom_style full + +read_data data.spce + orthogonal box = (0.02645 0.02645 0.02641) to (35.5328 35.5328 35.4736) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 4500 atoms + scanning bonds ... + 2 = max bonds/atom + scanning angles ... + 1 = max angles/atom + reading bonds ... + 3000 bonds + reading angles ... + 1500 angles + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + +pair_style python 12.0 +pair_coeff * * py_pot.LJCutSPCE OW HW + +bond_style harmonic +angle_style harmonic +dihedral_style none +improper_style none + +bond_coeff 1 1000.00 1.000 +angle_coeff 1 100.0 109.47 + +special_bonds lj/coul 0.0 0.0 1.0 + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 2 = max # of special neighbors + +neighbor 2.0 bin + +fix 1 all shake 0.0001 20 0 b 1 a 1 + 0 = # of size 2 clusters + 0 = # of size 3 clusters + 0 = # of size 4 clusters + 1500 = # of frozen angles +fix 2 all nvt temp 300.0 300.0 100.0 + +# create only lj/cut table for the oxygen atoms from python +shell rm -f spce.table +WARNING: Shell command 'rm' failed with error 'No such file or directory' (../input.cpp:1285) +WARNING: Shell command 'rm' failed with error 'No such file or directory' (../input.cpp:1285) +pair_write 1 1 2000 rsq 0.1 12 spce.table OW-OW +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 6 6 6 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair python, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard + +# switch to tabulated potential with long-range coulomb as overlay +pair_style hybrid/overlay coul/long 12.0 table linear 2000 +kspace_style pppm 1.0e-6 +pair_coeff * * coul/long +pair_coeff 1 1 table spce.table OW-OW + +thermo 10 +run 100 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394674 + estimated relative force accuracy = 1.18855e-06 + using double precision FFTs + 3d grid and FFT values/proc = 103823 64000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard + (2) pair table, perpetual, skip from (1) + attributes: half, newton on + pair build: skip + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 36.47 | 36.47 | 36.47 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -16690.032 0 -16690.032 -1268.9538 + 10 120.58553 -17767.504 0 -16689.536 -4063.8589 + 20 136.11736 -17882.557 0 -16665.742 -5124.6758 + 30 137.00764 -17872.318 0 -16647.545 -5337.2022 + 40 153.38868 -17999.269 0 -16628.059 -5213.6001 + 50 167.70342 -18103.06 0 -16603.883 -4460.6632 + 60 163.07134 -18034.856 0 -16577.088 -3285.0037 + 70 169.59286 -18064.636 0 -16548.57 -2606.407 + 80 182.92893 -18153.499 0 -16518.215 -2385.5152 + 90 191.2793 -18195.356 0 -16485.425 -2235.3701 + 100 194.68587 -18192.458 0 -16452.073 -1948.3746 +Loop time of 7.90705 on 1 procs for 100 steps with 4500 atoms + +Performance: 1.093 ns/day, 21.964 hours/ns, 12.647 timesteps/s +99.6% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 6.0343 | 6.0343 | 6.0343 | 0.0 | 76.32 +Bond | 0.00019622 | 0.00019622 | 0.00019622 | 0.0 | 0.00 +Kspace | 1.5311 | 1.5311 | 1.5311 | 0.0 | 19.36 +Neigh | 0.246 | 0.246 | 0.246 | 0.0 | 3.11 +Comm | 0.023937 | 0.023937 | 0.023937 | 0.0 | 0.30 +Output | 0.00060368 | 0.00060368 | 0.00060368 | 0.0 | 0.01 +Modify | 0.065543 | 0.065543 | 0.065543 | 0.0 | 0.83 +Other | | 0.005364 | | | 0.07 + +Nlocal: 4500 ave 4500 max 4500 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 21216 ave 21216 max 21216 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 2.60177e+06 ave 2.60177e+06 max 2.60177e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 2601769 +Ave neighs/atom = 578.171 +Ave special neighs/atom = 2 +Neighbor list builds = 3 +Dangerous builds = 0 + +shell rm spce.table + +Total wall time: 0:00:08 diff --git a/examples/python/log.4May17.pair_python_long.g++.4 b/examples/python/log.4May17.pair_python_long.g++.4 new file mode 100644 index 0000000000..35347da713 --- /dev/null +++ b/examples/python/log.4May17.pair_python_long.g++.4 @@ -0,0 +1,146 @@ +LAMMPS (4 May 2017) + using 1 OpenMP thread(s) per MPI task +units real +atom_style full + +read_data data.spce + orthogonal box = (0.02645 0.02645 0.02641) to (35.5328 35.5328 35.4736) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 4500 atoms + scanning bonds ... + 2 = max bonds/atom + scanning angles ... + 1 = max angles/atom + reading bonds ... + 3000 bonds + reading angles ... + 1500 angles + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 1 = max # of 1-4 neighbors + 2 = max # of special neighbors + +pair_style python 12.0 +pair_coeff * * py_pot.LJCutSPCE OW HW + +bond_style harmonic +angle_style harmonic +dihedral_style none +improper_style none + +bond_coeff 1 1000.00 1.000 +angle_coeff 1 100.0 109.47 + +special_bonds lj/coul 0.0 0.0 1.0 + 2 = max # of 1-2 neighbors + 1 = max # of 1-3 neighbors + 2 = max # of special neighbors + +neighbor 2.0 bin + +fix 1 all shake 0.0001 20 0 b 1 a 1 + 0 = # of size 2 clusters + 0 = # of size 3 clusters + 0 = # of size 4 clusters + 1500 = # of frozen angles +fix 2 all nvt temp 300.0 300.0 100.0 + +# create only lj/cut table for the oxygen atoms from python +shell rm -f spce.table +WARNING: Shell command 'rm' failed with error 'No such file or directory' (../input.cpp:1285) +WARNING: Shell command 'rm' failed with error 'No such file or directory' (../input.cpp:1285) +pair_write 1 1 2000 rsq 0.1 12 spce.table OW-OW +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 6 6 6 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair python, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard + +# switch to tabulated potential with long-range coulomb as overlay +pair_style hybrid/overlay coul/long 12.0 table linear 2000 +kspace_style pppm 1.0e-6 +pair_coeff * * coul/long +pair_coeff 1 1 table spce.table OW-OW + +thermo 10 +run 100 +PPPM initialization ... +WARNING: Using 12-bit tables for long-range coulomb (../kspace.cpp:321) + G vector (1/distance) = 0.279652 + grid = 40 40 40 + stencil order = 5 + estimated absolute RMS force accuracy = 0.000394674 + estimated relative force accuracy = 1.18855e-06 + using double precision FFTs + 3d grid and FFT values/proc = 34263 16000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 14 + ghost atom cutoff = 14 + binsize = 7, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard + (2) pair table, perpetual, skip from (1) + attributes: half, newton on + pair build: skip + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 13.45 | 13.45 | 13.45 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 0 -16690.032 0 -16690.032 -1268.9538 + 10 120.58553 -17767.504 0 -16689.536 -4063.8589 + 20 136.11736 -17882.557 0 -16665.742 -5124.6758 + 30 137.00764 -17872.318 0 -16647.545 -5337.2022 + 40 153.38868 -17999.269 0 -16628.059 -5213.6001 + 50 167.70342 -18103.06 0 -16603.883 -4460.6632 + 60 163.07134 -18034.856 0 -16577.088 -3285.0037 + 70 169.59286 -18064.636 0 -16548.57 -2606.407 + 80 182.92893 -18153.499 0 -16518.215 -2385.5152 + 90 191.2793 -18195.356 0 -16485.425 -2235.3701 + 100 194.68587 -18192.458 0 -16452.073 -1948.3746 +Loop time of 2.36748 on 4 procs for 100 steps with 4500 atoms + +Performance: 3.649 ns/day, 6.576 hours/ns, 42.239 timesteps/s +99.4% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.5309 | 1.5977 | 1.6926 | 4.7 | 67.49 +Bond | 9.9182e-05 | 0.00012749 | 0.00016403 | 0.0 | 0.01 +Kspace | 0.52158 | 0.61232 | 0.67676 | 7.3 | 25.86 +Neigh | 0.066937 | 0.06702 | 0.067093 | 0.0 | 2.83 +Comm | 0.035882 | 0.039862 | 0.042244 | 1.2 | 1.68 +Output | 0.0004003 | 0.00044602 | 0.00057578 | 0.0 | 0.02 +Modify | 0.046088 | 0.046227 | 0.046315 | 0.0 | 1.95 +Other | | 0.003775 | | | 0.16 + +Nlocal: 1125 ave 1154 max 1092 min +Histogram: 1 0 0 0 1 0 0 1 0 1 +Nghost: 12256.2 ave 12296 max 12213 min +Histogram: 1 0 1 0 0 0 0 0 1 1 +Neighs: 650442 ave 678831 max 626373 min +Histogram: 1 0 0 0 2 0 0 0 0 1 + +Total # of neighbors = 2601769 +Ave neighs/atom = 578.171 +Ave special neighs/atom = 2 +Neighbor list builds = 3 +Dangerous builds = 0 + +shell rm spce.table + +Total wall time: 0:00:02 diff --git a/examples/python/log.4May17.pair_python_melt.g++.1 b/examples/python/log.4May17.pair_python_melt.g++.1 index fcb902fb3c..d234ce93b5 100644 --- a/examples/python/log.4May17.pair_python_melt.g++.1 +++ b/examples/python/log.4May17.pair_python_melt.g++.1 @@ -47,20 +47,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6324555 -4.7286791 0 -2.280608 5.9589514 200 1.6630725 -4.7750988 0 -2.2811136 5.7364886 250 1.6275257 -4.7224992 0 -2.281821 5.9567365 -Loop time of 21.6481 on 1 procs for 250 steps with 4000 atoms +Loop time of 20.9283 on 1 procs for 250 steps with 4000 atoms -Performance: 4988.899 tau/day, 11.548 timesteps/s -98.5% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 5160.475 tau/day, 11.946 timesteps/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 | 21.529 | 21.529 | 21.529 | 0.0 | 99.45 -Neigh | 0.08819 | 0.08819 | 0.08819 | 0.0 | 0.41 -Comm | 0.013276 | 0.013276 | 0.013276 | 0.0 | 0.06 -Output | 0.00025654 | 0.00025654 | 0.00025654 | 0.0 | 0.00 -Modify | 0.014466 | 0.014466 | 0.014466 | 0.0 | 0.07 -Other | | 0.003143 | | | 0.01 +Pair | 20.809 | 20.809 | 20.809 | 0.0 | 99.43 +Neigh | 0.088638 | 0.088638 | 0.088638 | 0.0 | 0.42 +Comm | 0.013424 | 0.013424 | 0.013424 | 0.0 | 0.06 +Output | 0.0002737 | 0.0002737 | 0.0002737 | 0.0 | 0.00 +Modify | 0.014334 | 0.014334 | 0.014334 | 0.0 | 0.07 +Other | | 0.003089 | | | 0.01 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -112,20 +112,20 @@ Step Temp E_pair E_mol TotEng Press 400 1.6540555 -4.7622999 0 -2.281837 5.8200413 450 1.6264734 -4.7200865 0 -2.2809863 5.9546991 500 1.6366891 -4.7350979 0 -2.2806781 5.9369284 -Loop time of 21.9592 on 1 procs for 250 steps with 4000 atoms +Loop time of 21.1422 on 1 procs for 250 steps with 4000 atoms -Performance: 4918.203 tau/day, 11.385 timesteps/s +Performance: 5108.279 tau/day, 11.825 timesteps/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 | 21.74 | 21.74 | 21.74 | 0.0 | 99.00 -Neigh | 0.18588 | 0.18588 | 0.18588 | 0.0 | 0.85 -Comm | 0.01476 | 0.01476 | 0.01476 | 0.0 | 0.07 -Output | 0.00022244 | 0.00022244 | 0.00022244 | 0.0 | 0.00 -Modify | 0.01356 | 0.01356 | 0.01356 | 0.0 | 0.06 -Other | | 0.004382 | | | 0.02 +Pair | 20.925 | 20.925 | 20.925 | 0.0 | 98.97 +Neigh | 0.18452 | 0.18452 | 0.18452 | 0.0 | 0.87 +Comm | 0.014836 | 0.014836 | 0.014836 | 0.0 | 0.07 +Output | 0.00027108 | 0.00027108 | 0.00027108 | 0.0 | 0.00 +Modify | 0.01366 | 0.01366 | 0.01366 | 0.0 | 0.06 +Other | | 0.004355 | | | 0.02 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -183,20 +183,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6537193 -4.7627023 0 -2.2827434 5.8177704 200 1.6258731 -4.7205017 0 -2.2823017 5.952511 250 1.6370862 -4.7373176 0 -2.2823022 5.925807 -Loop time of 21.8255 on 1 procs for 250 steps with 4000 atoms +Loop time of 21.1026 on 1 procs for 250 steps with 4000 atoms -Performance: 4948.331 tau/day, 11.454 timesteps/s -98.6% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 5117.845 tau/day, 11.847 timesteps/s +98.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 | 21.707 | 21.707 | 21.707 | 0.0 | 99.46 -Neigh | 0.088455 | 0.088455 | 0.088455 | 0.0 | 0.41 -Comm | 0.01311 | 0.01311 | 0.01311 | 0.0 | 0.06 -Output | 0.00025082 | 0.00025082 | 0.00025082 | 0.0 | 0.00 -Modify | 0.013836 | 0.013836 | 0.013836 | 0.0 | 0.06 -Other | | 0.003096 | | | 0.01 +Pair | 20.984 | 20.984 | 20.984 | 0.0 | 99.44 +Neigh | 0.088639 | 0.088639 | 0.088639 | 0.0 | 0.42 +Comm | 0.012881 | 0.012881 | 0.012881 | 0.0 | 0.06 +Output | 0.00028563 | 0.00028563 | 0.00028563 | 0.0 | 0.00 +Modify | 0.013523 | 0.013523 | 0.013523 | 0.0 | 0.06 +Other | | 0.003033 | | | 0.01 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -211,4 +211,4 @@ Neighbor list builds = 12 Dangerous builds not checked shell rm melt.data melt.restart -Total wall time: 0:01:07 +Total wall time: 0:01:05 diff --git a/examples/python/log.4May17.pair_python_melt.g++.4 b/examples/python/log.4May17.pair_python_melt.g++.4 index d504efc4ac..58dae340bd 100644 --- a/examples/python/log.4May17.pair_python_melt.g++.4 +++ b/examples/python/log.4May17.pair_python_melt.g++.4 @@ -47,20 +47,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6596605 -4.7699432 0 -2.2810749 5.7830138 200 1.6371874 -4.7365462 0 -2.2813789 5.9246674 250 1.6323462 -4.7292021 0 -2.2812949 5.9762238 -Loop time of 5.83903 on 4 procs for 250 steps with 4000 atoms +Loop time of 5.65922 on 4 procs for 250 steps with 4000 atoms -Performance: 18496.226 tau/day, 42.815 timesteps/s -98.2% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 19083.895 tau/day, 44.176 timesteps/s +98.3% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.152 | 5.5209 | 5.7679 | 9.6 | 94.55 -Neigh | 0.022809 | 0.023364 | 0.023891 | 0.3 | 0.40 -Comm | 0.041927 | 0.28952 | 0.65893 | 42.2 | 4.96 -Output | 0.0002389 | 0.00024772 | 0.00026727 | 0.0 | 0.00 -Modify | 0.0036368 | 0.0036796 | 0.0037563 | 0.1 | 0.06 -Other | | 0.001328 | | | 0.02 +Pair | 5.4529 | 5.5207 | 5.5575 | 1.7 | 97.55 +Neigh | 0.023164 | 0.023376 | 0.023883 | 0.2 | 0.41 +Comm | 0.073318 | 0.1099 | 0.17804 | 12.2 | 1.94 +Output | 0.00023365 | 0.00026143 | 0.00030684 | 0.0 | 0.00 +Modify | 0.0036483 | 0.0037143 | 0.003896 | 0.2 | 0.07 +Other | | 0.001274 | | | 0.02 Nlocal: 1000 ave 1010 max 982 min Histogram: 1 0 0 0 0 0 1 0 0 2 @@ -112,20 +112,20 @@ Step Temp E_pair E_mol TotEng Press 400 1.6388136 -4.7387093 0 -2.2811035 5.9331084 450 1.6431295 -4.7452215 0 -2.2811435 5.8929898 500 1.643316 -4.7454222 0 -2.2810644 5.8454817 -Loop time of 5.85683 on 4 procs for 250 steps with 4000 atoms +Loop time of 5.70169 on 4 procs for 250 steps with 4000 atoms -Performance: 18440.001 tau/day, 42.685 timesteps/s -98.4% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 18941.760 tau/day, 43.847 timesteps/s +98.3% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.2483 | 5.5095 | 5.7744 | 8.0 | 94.07 -Neigh | 0.047228 | 0.047998 | 0.049293 | 0.4 | 0.82 -Comm | 0.027134 | 0.29341 | 0.55554 | 34.6 | 5.01 -Output | 0.00020003 | 0.00021219 | 0.0002358 | 0.0 | 0.00 -Modify | 0.0035472 | 0.0036988 | 0.0038681 | 0.2 | 0.06 -Other | | 0.001984 | | | 0.03 +Pair | 5.3919 | 5.4905 | 5.6136 | 3.7 | 96.30 +Neigh | 0.046791 | 0.047817 | 0.048795 | 0.3 | 0.84 +Comm | 0.034221 | 0.1575 | 0.25635 | 22.1 | 2.76 +Output | 0.00020409 | 0.00023448 | 0.00026131 | 0.0 | 0.00 +Modify | 0.0035028 | 0.0035674 | 0.0036926 | 0.1 | 0.06 +Other | | 0.002079 | | | 0.04 Nlocal: 1000 ave 1012 max 983 min Histogram: 1 0 0 0 0 0 2 0 0 1 @@ -183,20 +183,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6384234 -4.7389689 0 -2.2819482 5.9315273 200 1.6428814 -4.7460743 0 -2.2823683 5.8888228 250 1.6432631 -4.7466603 0 -2.2823818 5.8398819 -Loop time of 5.86684 on 4 procs for 250 steps with 4000 atoms +Loop time of 5.69568 on 4 procs for 250 steps with 4000 atoms -Performance: 18408.545 tau/day, 42.612 timesteps/s -98.4% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 18961.751 tau/day, 43.893 timesteps/s +98.3% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.3207 | 5.5695 | 5.8071 | 7.6 | 94.93 -Neigh | 0.023073 | 0.023405 | 0.023834 | 0.2 | 0.40 -Comm | 0.030558 | 0.2686 | 0.51789 | 34.7 | 4.58 -Output | 0.00028825 | 0.00036758 | 0.00042987 | 0.0 | 0.01 -Modify | 0.0034878 | 0.0036733 | 0.0039375 | 0.3 | 0.06 -Other | | 0.001259 | | | 0.02 +Pair | 5.4041 | 5.5245 | 5.6139 | 3.2 | 96.99 +Neigh | 0.022658 | 0.022986 | 0.023398 | 0.2 | 0.40 +Comm | 0.053521 | 0.14309 | 0.26385 | 20.2 | 2.51 +Output | 0.00027037 | 0.00029504 | 0.00033665 | 0.0 | 0.01 +Modify | 0.0035288 | 0.0035585 | 0.0035827 | 0.0 | 0.06 +Other | | 0.001275 | | | 0.02 Nlocal: 1000 ave 1013 max 989 min Histogram: 1 0 0 1 0 1 0 0 0 1 @@ -211,4 +211,4 @@ Neighbor list builds = 12 Dangerous builds not checked shell rm melt.data melt.restart -Total wall time: 0:00:18 +Total wall time: 0:00:17 diff --git a/examples/python/log.4May17.pair_python_spce.g++.1 b/examples/python/log.4May17.pair_python_spce.g++.1 index 1a535df0e9..540c06853f 100644 --- a/examples/python/log.4May17.pair_python_spce.g++.1 +++ b/examples/python/log.4May17.pair_python_spce.g++.1 @@ -90,22 +90,22 @@ Step Temp E_pair E_mol TotEng Press 80 182.94811 -18155.978 0 -16520.523 -2393.3156 90 191.29902 -18197.887 0 -16487.779 -2242.7104 100 194.70949 -18195.021 0 -16454.425 -1955.2916 -Loop time of 23.0818 on 1 procs for 100 steps with 4500 atoms +Loop time of 23.5385 on 1 procs for 100 steps with 4500 atoms -Performance: 0.374 ns/day, 64.116 hours/ns, 4.332 timesteps/s +Performance: 0.367 ns/day, 65.385 hours/ns, 4.248 timesteps/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 | 21.186 | 21.186 | 21.186 | 0.0 | 91.79 -Bond | 0.00022054 | 0.00022054 | 0.00022054 | 0.0 | 0.00 -Kspace | 1.5442 | 1.5442 | 1.5442 | 0.0 | 6.69 -Neigh | 0.25672 | 0.25672 | 0.25672 | 0.0 | 1.11 -Comm | 0.023787 | 0.023787 | 0.023787 | 0.0 | 0.10 -Output | 0.00060248 | 0.00060248 | 0.00060248 | 0.0 | 0.00 -Modify | 0.064809 | 0.064809 | 0.064809 | 0.0 | 0.28 -Other | | 0.005301 | | | 0.02 +Pair | 21.642 | 21.642 | 21.642 | 0.0 | 91.94 +Bond | 0.00021696 | 0.00021696 | 0.00021696 | 0.0 | 0.00 +Kspace | 1.5436 | 1.5436 | 1.5436 | 0.0 | 6.56 +Neigh | 0.25623 | 0.25623 | 0.25623 | 0.0 | 1.09 +Comm | 0.024325 | 0.024325 | 0.024325 | 0.0 | 0.10 +Output | 0.00064301 | 0.00064301 | 0.00064301 | 0.0 | 0.00 +Modify | 0.065919 | 0.065919 | 0.065919 | 0.0 | 0.28 +Other | | 0.005401 | | | 0.02 Nlocal: 4500 ave 4500 max 4500 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -119,4 +119,4 @@ Ave neighs/atom = 578.169 Ave special neighs/atom = 2 Neighbor list builds = 3 Dangerous builds = 0 -Total wall time: 0:00:23 +Total wall time: 0:00:24 diff --git a/examples/python/log.4May17.pair_python_spce.g++.4 b/examples/python/log.4May17.pair_python_spce.g++.4 index c277663287..332c079ec1 100644 --- a/examples/python/log.4May17.pair_python_spce.g++.4 +++ b/examples/python/log.4May17.pair_python_spce.g++.4 @@ -90,22 +90,22 @@ Step Temp E_pair E_mol TotEng Press 80 182.94811 -18155.978 0 -16520.523 -2393.3156 90 191.29902 -18197.887 0 -16487.779 -2242.7104 100 194.70949 -18195.021 0 -16454.425 -1955.2916 -Loop time of 6.588 on 4 procs for 100 steps with 4500 atoms +Loop time of 6.4942 on 4 procs for 100 steps with 4500 atoms -Performance: 1.311 ns/day, 18.300 hours/ns, 15.179 timesteps/s -98.4% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 1.330 ns/day, 18.039 hours/ns, 15.398 timesteps/s +98.7% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 5.3756 | 5.5417 | 5.8745 | 8.3 | 84.12 -Bond | 0.0001049 | 0.00013965 | 0.0001812 | 0.0 | 0.00 -Kspace | 0.54765 | 0.87786 | 1.042 | 20.8 | 13.33 -Neigh | 0.072695 | 0.072884 | 0.072973 | 0.0 | 1.11 -Comm | 0.04138 | 0.043576 | 0.045475 | 0.7 | 0.66 -Output | 0.00041032 | 0.00043947 | 0.00052142 | 0.0 | 0.01 -Modify | 0.047381 | 0.047567 | 0.047745 | 0.1 | 0.72 -Other | | 0.003845 | | | 0.06 +Pair | 5.4084 | 5.572 | 5.8013 | 7.2 | 85.80 +Bond | 0.00012994 | 0.0001421 | 0.00016356 | 0.0 | 0.00 +Kspace | 0.52942 | 0.75773 | 0.92078 | 19.5 | 11.67 +Neigh | 0.071055 | 0.07116 | 0.071278 | 0.0 | 1.10 +Comm | 0.040311 | 0.041255 | 0.041817 | 0.3 | 0.64 +Output | 0.00040603 | 0.00048071 | 0.00058675 | 0.0 | 0.01 +Modify | 0.047507 | 0.047629 | 0.047772 | 0.1 | 0.73 +Other | | 0.003771 | | | 0.06 Nlocal: 1125 ave 1154 max 1092 min Histogram: 1 0 0 0 1 0 0 1 0 1 diff --git a/examples/python/log.4May17.pair_python_table.g++.1 b/examples/python/log.4May17.pair_python_table.g++.1 index bd3e86501b..c594a8e90a 100644 --- a/examples/python/log.4May17.pair_python_table.g++.1 +++ b/examples/python/log.4May17.pair_python_table.g++.1 @@ -67,20 +67,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.632425 -4.7284533 0 -2.2804279 5.9595684 200 1.6631578 -4.7749889 0 -2.2808759 5.7365839 250 1.6277062 -4.7224727 0 -2.2815238 5.9572913 -Loop time of 0.996652 on 1 procs for 250 steps with 4000 atoms +Loop time of 0.996739 on 1 procs for 250 steps with 4000 atoms -Performance: 108362.785 tau/day, 250.840 timesteps/s +Performance: 108353.298 tau/day, 250.818 timesteps/s 99.8% CPU use with 1 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.87999 | 0.87999 | 0.87999 | 0.0 | 88.29 -Neigh | 0.087921 | 0.087921 | 0.087921 | 0.0 | 8.82 -Comm | 0.012098 | 0.012098 | 0.012098 | 0.0 | 1.21 -Output | 0.00013614 | 0.00013614 | 0.00013614 | 0.0 | 0.01 -Modify | 0.01363 | 0.01363 | 0.01363 | 0.0 | 1.37 -Other | | 0.002882 | | | 0.29 +Pair | 0.87985 | 0.87985 | 0.87985 | 0.0 | 88.27 +Neigh | 0.08799 | 0.08799 | 0.08799 | 0.0 | 8.83 +Comm | 0.012301 | 0.012301 | 0.012301 | 0.0 | 1.23 +Output | 0.00013161 | 0.00013161 | 0.00013161 | 0.0 | 0.01 +Modify | 0.013656 | 0.013656 | 0.013656 | 0.0 | 1.37 +Other | | 0.002808 | | | 0.28 Nlocal: 4000 ave 4000 max 4000 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/python/log.4May17.pair_python_table.g++.4 b/examples/python/log.4May17.pair_python_table.g++.4 index 8dfe82097e..e509fc7f6a 100644 --- a/examples/python/log.4May17.pair_python_table.g++.4 +++ b/examples/python/log.4May17.pair_python_table.g++.4 @@ -67,20 +67,20 @@ Step Temp E_pair E_mol TotEng Press 150 1.6595852 -4.7697199 0 -2.2809644 5.7837898 200 1.6371471 -4.7363942 0 -2.2812874 5.924977 250 1.6315623 -4.7278268 0 -2.2810951 5.9807196 -Loop time of 0.300176 on 4 procs for 250 steps with 4000 atoms +Loop time of 0.291846 on 4 procs for 250 steps with 4000 atoms -Performance: 359789.395 tau/day, 832.846 timesteps/s -99.3% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 370058.286 tau/day, 856.616 timesteps/s +99.4% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.23104 | 0.23876 | 0.2451 | 1.2 | 79.54 -Neigh | 0.022763 | 0.023687 | 0.024305 | 0.4 | 7.89 -Comm | 0.025416 | 0.032499 | 0.041304 | 3.7 | 10.83 -Output | 0.00015378 | 0.00016057 | 0.00017667 | 0.0 | 0.05 -Modify | 0.0035894 | 0.0036637 | 0.0037456 | 0.1 | 1.22 -Other | | 0.001409 | | | 0.47 +Pair | 0.22586 | 0.23364 | 0.24085 | 1.3 | 80.06 +Neigh | 0.022808 | 0.023235 | 0.023602 | 0.2 | 7.96 +Comm | 0.022573 | 0.030065 | 0.038092 | 3.9 | 10.30 +Output | 0.00013423 | 0.00014067 | 0.00015759 | 0.0 | 0.05 +Modify | 0.0035079 | 0.0035501 | 0.0036008 | 0.1 | 1.22 +Other | | 0.001211 | | | 0.42 Nlocal: 1000 ave 1010 max 981 min Histogram: 1 0 0 0 0 0 1 0 0 2 From bd11479a16880c55e89dcc8ee65b886f8baf9eb5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 00:50:35 -0400 Subject: [PATCH 049/302] lock the sphinx command to version 1.5.6, since version 1.6.x seems to break one of the extensions we use --- doc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Makefile b/doc/Makefile index fd087f0344..a1f76d7041 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -158,7 +158,7 @@ $(VENV): @( \ virtualenv -p $(PYTHON) $(VENV); \ . $(VENV)/bin/activate; \ - pip install Sphinx; \ + pip install Sphinx==1.5.6; \ pip install sphinxcontrib-images; \ deactivate;\ ) From 4b1914aa1f29a85bb5e4341d5f66be694732ecdc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 01:07:52 -0400 Subject: [PATCH 050/302] update citations for multi-element edip potential --- potentials/SiC.edip | 2 +- src/USER-MISC/pair_edip_multi.cpp | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/potentials/SiC.edip b/potentials/SiC.edip index 0485d345bb..a38f30d974 100644 --- a/potentials/SiC.edip +++ b/potentials/SiC.edip @@ -1,4 +1,4 @@ -# DATE: 2017-05-16 CONTRIBUTOR: Laurent Pizzagalli CITATION: G. Lucas, M. Bertolus, and L. Pizzagalli, J. Phys. : Condens. Matter 22, 035802 (2010) +# DATE: 2017-05-16 CONTRIBUTOR: Chao Jiang , Phys. Rev. B 86, 144118 (2012) # element 1, element 2, element 3, # A B cutoffA cutoffC alpha beta eta # gamma lambda mu rho sigma Q0 diff --git a/src/USER-MISC/pair_edip_multi.cpp b/src/USER-MISC/pair_edip_multi.cpp index ad6d48eb7f..d52b2e4a47 100644 --- a/src/USER-MISC/pair_edip_multi.cpp +++ b/src/USER-MISC/pair_edip_multi.cpp @@ -31,16 +31,39 @@ #include "comm.h" #include "memory.h" #include "error.h" +#include "citeme.h" using namespace LAMMPS_NS; #define MAXLINE 1024 #define DELTA 4 + +static const char cite_pair_edip[] = + "@article{cjiang2012\n" + " author = {Jian, Chao and Morgan, Dane, and Szlufarska, Izabella},\n" + " title = {Carbon tri-interstitial defect: A model for DII center},\n" + " journal = {Physical Review B},\n" + " volume = {86},\n" + " pages = {144118},\n" + " year = {2012},\n" + "}\n\n" + "@article{lpizzagalli2010,\n" + " author = {G. Lucas, M. Bertolus, and L. Pizzagalli},\n" + " journal = {J. Phys. : Condens. Matter 22},\n" + " volume = {22},\n" + " pages = {035802},\n" + " year = {2010},\n" + "}\n\n"; + + + /* ---------------------------------------------------------------------- */ PairEDIPMulti::PairEDIPMulti(LAMMPS *lmp) : Pair(lmp) { + if (lmp->citeme) lmp->citeme->add(cite_pair_edip); + single_enable = 0; restartinfo = 0; one_coeff = 1; From 640edbc1d40e6571d25b02d9f4e892d95a9c4008 Mon Sep 17 00:00:00 2001 From: Emile Maras Date: Thu, 18 May 2017 11:08:08 +0200 Subject: [PATCH 051/302] added several features to the NEB --- doc/src/fix_neb.txt | 133 +++++--- doc/src/neb.txt | 110 +++--- src/REPLICA/fix_neb.cpp | 720 +++++++++++++++++++++++++++++++++------- src/REPLICA/fix_neb.h | 20 +- src/REPLICA/neb.cpp | 77 ++++- src/REPLICA/neb.h | 5 +- 6 files changed, 820 insertions(+), 245 deletions(-) diff --git a/doc/src/fix_neb.txt b/doc/src/fix_neb.txt index 9d11b7289e..aaec960dd2 100644 --- a/doc/src/fix_neb.txt +++ b/doc/src/fix_neb.txt @@ -1,3 +1,11 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" + "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c :link(lws,http://lammps.sandia.gov) @@ -10,68 +18,90 @@ fix neb command :h3 [Syntax:] -fix ID group-ID neb Kspring :pre - +fix ID group-ID neb Kspring keyword value :pre + ID, group-ID are documented in "fix"_fix.html command neb = style name of this fix command -Kspring = inter-replica spring constant (force/distance units) :ul +Kspring = parallel spring constant (force/distance units) :ul +keyword = {idealpos} or {nearestneigh} or {PerpSpring} or {freeend} + {idealpos} value = none = each replica is attached with a spring to its interpolated ideal position (default value) + {nearestneigh} value = none = each replica is attached with a spring with the previous and next replica. + {PerpSpring} value = KspringPerpend + {freeend} value = ini or final or finalWithRespToIni or finalAndInterWithRespToIni + + [Examples:] fix 1 active neb 10.0 :pre +fix 2 all neb 1.0 PerpSpring 1.0 freeend final :pre +fix 1 all neb 1.0 nearestneigh freeend finalAndInterWithRespToIni :pre [Description:] -Add inter-replica forces to atoms in the group for a multi-replica -simulation run via the "neb"_neb.html command to perform a nudged -elastic band (NEB) calculation for transition state finding. Hi-level -explanations of NEB are given with the "neb"_neb.html command and in -"Section 6.5"_Section_howto.html#howto_5 of the manual. The fix -neb command must be used with the "neb" command to define how -inter-replica forces are computed. +Add a nudging force to atoms in the group for a multi-replica simulation run via the "neb"_neb.html command to perform a nudged elastic band (NEB) calculation for finding the transition state. Hi-level +explanations of NEB are given with the "neb"_neb.html command and in "Section_howto 5"_Section_howto.html#howto_5 of the manual. The fix neb command must be used with the "neb" command and defines how +nudging inter-replica forces are computed. +A NEB calculation is divided in two stages. In the first stage n replicas are relaxed toward a MEP and in a second stage, the climbing image scheme (see "(Henkelman2)"_#Henkelman2) is turned on so that the replica having the highest energy relaxes toward the saddle point (i.e. the point of highest energy along the MEP). -Only the N atoms in the fix group experience inter-replica forces. -Atoms in the two end-point replicas do not experience these forces, -but those in intermediate replicas do. During the initial stage of -NEB, the 3N-length vector of interatomic forces Fi = -Grad(V) acting -on the atoms of each intermediate replica I is altered, as described -in the "(Henkelman1)"_#Henkelman1 paper, to become: +One purpose of the nudging forces is to keep the replicas equally spaced. +During the NEB, the 3N-length vector of interatomic force Fi = -Grad(V) of replicas i is altered. For all intermediate replicas (i.e. for 1 0 + +where E is the energy of the free end replica and ETarget is the target energy. + +When the value {ini} ({final}) is used after the keyword {freeend}, the first (last) replica is considered as a free end. The target energy is set to the energy of the replica at starting of the NEB calculation. When the value {finalWithRespToIni} or {finalAndInterWithRespToIni} is used the last image is considered as a free end and the target energy is equal to the energy of the first replica (which can evolve during the NEB relaxation). +With the value {finalWithRespToIni}, when the initial path is too far from the MEP, an intermediate repilica might relax "faster" and get a lower energy than the last replica. The benefit of the free end is then lost since this intermediate replica will relax toward a local minima. This behavior can be prevented by using the value {finalAndInterWithRespToIni} which remove entirely the contribution of the gradient for all intermediate replica which have a lower energy than the initial one thus preventing these replicae to over-relax. After converging a NEB with the {finalAndInterWithRespToIni} value it +is recommended to check that all intermediate replica have a larger energy than the initial replica. Finally note that if the last replica converges toward a local minimum with a larger energy than the energy of the first replica, a free end neb calculation with the value {finalWithRespToIni} or {finalAndInterWithRespToIni} cannot reach the convergence criteria. + +:line + + +The keywords {idealpos} and {nearestneigh} allow to specify how to parallel spring force is computed. +If the keyword {idealpos} is used or by default, the spring force is computed as suggested in "(E)"_#E : + +Fspringparallel=-{Kspring}* (RD-RDideal)/(2 meanDist) + +where RD is the "reaction coordinate" see "neb"_neb.html section, and RDideal is the ideal RD for which all the images are equally spaced (i.e. RDideal = (i-1)*meanDist when the climbing image is off, where i is the replica number). The meanDist is the average distance between replicas. + +If the keyword {nearestneigh} is used, the parallel spring force is computed as in "(Henkelman1)"_#Henkelman1 by connecting each intermediate replica with the previous and the next image: + +Fspringparallel= {Kspring}* (|Ri+1 - Ri| - |Ri - Ri-1|) + +The parallel spring force associated with the key word idealpos should usually be more efficient at keeping the images equally spaced. + +:line + +The keyword {PerpSpring} allows to add a spring force perpendicular to the path in order to prevent the path from becoming too kinky. It can improve significantly the convergence of the NEB when the resolution is poor (i.e. when too few images are used) (see "(Maras)"_#Maras). +The perpendicular spring force is given by + +Fspringperp = {Kspringperp} * f(Ri-1,Ri,Ri+1) (Ri+1 + Ri-1 - 2 Ri) + + f(Ri-1 Ri R+1) is a smooth scalar function of the angle Ri-1 Ri Ri+1. It is equal to 0 when the path is straight and is equal to 1 when the angle Ri-1 Ri Ri+1 is accute. f(Ri-1 Ri R+1) is defined in "(Jonsson)"_#Jonsson + +:line [Restart, fix_modify, output, run start/stop, minimize info:] @@ -98,9 +128,18 @@ for more info on packages. [Default:] none -:link(Henkelman1) +:link(Henkelman) [(Henkelman1)] Henkelman and Jonsson, J Chem Phys, 113, 9978-9985 (2000). -:link(Henkelman2) +:link(Henkelman) [(Henkelman2)] Henkelman, Uberuaga, Jonsson, J Chem Phys, 113, 9901-9904 (2000). + +:link(E) +[(E)] E, Ren, Vanden-Eijnden, Phys Rev B, 66, 052301 (2002) + +:link(Jonsson) +[(Jonsson)] Jonsson, Mills and Jacobsen, in Classical and Quantum Dynamics in Condensed Phase Simulations, edited by Berne, Ciccotti, and Coker ͑World Scientific, Singapore, 1998͒, p. 385 + +:link(Maras) +[(Maras)] Maras, Trushin, Stukowski, Ala-Nissila, Jonsson, Comp Phys Comm, 205, 13-21 (2016) diff --git a/doc/src/neb.txt b/doc/src/neb.txt index 3a62a77a6e..b0be171eda 100644 --- a/doc/src/neb.txt +++ b/doc/src/neb.txt @@ -10,7 +10,7 @@ neb command :h3 [Syntax:] -neb etol ftol N1 N2 Nevery file-style arg :pre +neb etol ftol N1 N2 Nevery file-style arg keyword :pre etol = stopping tolerance for energy (energy units) :ulb,l ftol = stopping tolerance for force (force units) :l @@ -25,13 +25,14 @@ file-style= {final} or {each} or {none} :l filename = unique filename for each replica (except first) with its initial coords {none} arg = no argument all replicas assumed to already have their initial coords :pre +keyword = {verbose} :pre :ule [Examples:] neb 0.1 0.0 1000 500 50 final coords.final neb 0.0 0.001 1000 500 50 each coords.initial.$i -neb 0.0 0.001 1000 500 50 none :pre +neb 0.0 0.001 1000 500 50 none verbose :pre [Description:] @@ -43,8 +44,8 @@ NEB is a method for finding both the atomic configurations and height of the energy barrier associated with a transition state, e.g. for an atom to perform a diffusive hop from one energy basin to another in a coordinated fashion with its neighbors. The implementation in LAMMPS -follows the discussion in these 3 papers: "(HenkelmanA)"_#HenkelmanA, -"(HenkelmanB)"_#HenkelmanB, and "(Nakano)"_#Nakano3. +follows the discussion in these 4 papers: "(HenkelmanA)"_#HenkelmanA, +"(HenkelmanB)"_#HenkelmanB, "(Nakano)"_#Nakano and "(Maras)"_#Maras. Each replica runs on a partition of one or more processors. Processor partitions are defined at run-time using the -partition command-line @@ -58,7 +59,7 @@ would see with one or more physical processors per replica. See discussion. NOTE: As explained below, a NEB calculation perfoms a damped dynamics -minimization across all the replicas. The minimizer uses whatever +minimization across all the replicas. The mimimizer uses whatever timestep you have defined in your input script, via the "timestep"_timestep.html command. Often NEB will converge more quickly if you use a timestep about 10x larger than you would normally @@ -70,9 +71,8 @@ I.e. the simulation domain, the number of atoms, the interaction potentials, and the starting configuration when the neb command is issued should be the same for every replica. -In a NEB calculation each atom in a replica is connected to the same -atom in adjacent replicas by springs, which induce inter-replica -forces. These forces are imposed by the "fix neb"_fix_neb.html +In a NEB calculation each replica is connected to other replicas by inter-replica +nudging forces. These forces are imposed by the "fix neb"_fix_neb.html command, which must be used in conjunction with the neb command. The group used to define the fix neb command defines the NEB atoms which are the only ones that inter-replica springs are applied to. If the @@ -81,7 +81,7 @@ inter-replica springs and the forces they feel and their motion is computed in the usual way due only to other atoms within their replica. Conceptually, the non-NEB atoms provide a background force field for the NEB atoms. They can be allowed to move during the NEB -minimization procedure (which will typically induce different +minimiation procedure (which will typically induce different coordinates for non-NEB atoms in different replicas), or held fixed using other LAMMPS commands such as "fix setforce"_fix_setforce.html. Note that the "partition"_partition.html command can be used to invoke @@ -93,31 +93,16 @@ specified in different manners via the {file-style} setting, as discussed below. Only atoms whose initial coordinates should differ from the current configuration need be specified. -Conceptually, the initial configuration for the first replica should -be a state with all the atoms (NEB and non-NEB) having coordinates on -one side of the energy barrier. A perfect energy minimum is not -required, since atoms in the first replica experience no spring forces -from the 2nd replica. Thus the damped dynamics minimization will -drive the first replica to an energy minimum if it is not already -there. However, you will typically get better convergence if the -initial state is already at a minimum. For example, for a system with -a free surface, the surface should be fully relaxed before attempting -a NEB calculation. - -Likewise, the initial configuration of the final replica should be a -state with all the atoms (NEB and non-NEB) on the other side of the -energy barrier. Again, a perfect energy minimum is not required, -since the atoms in the last replica also experience no spring forces -from the next-to-last replica, and thus the damped dynamics -minimization will drive it to an energy minimum. +Conceptually, the initial and final configurations for the first replica should +be states on either side of an energy barrier. As explained below, the initial configurations of intermediate replicas can be atomic coordinates interpolated in a linear fashion -between the first and last replicas. This is often adequate state for +between the first and last replicas. This is often adequate for simple transitions. For more complex transitions, it may lead to slow convergence or even bad results if the minimum energy path (MEP, see below) of states over the barrier cannot be correctly converged to -from such an initial configuration. In this case, you will want to +from such an initial path. In this case, you will want to generate initial states for the intermediate replicas that are geometrically closer to the MEP and read them in. @@ -135,7 +120,7 @@ is assigned to be a fraction of the distance. E.g. if there are 10 replicas, the 2nd replica will assign a position that is 10% of the distance along a line between the starting and final point, and the 9th replica will assign a position that is 90% of the distance along -the line. Note that this procedure to produce consistent coordinates +the line. Note that for this procedure to produce consistent coordinates across all the replicas, the current coordinates need to be the same in all replicas. LAMMPS does not check for this, but invalid initial configurations will likely result if it is not the case. @@ -163,7 +148,7 @@ world-, universe-, or uloop-style variables. Each replica (except the first replica) will read its file, formatted as described below, and for any atom that appears in the file, assign -the specified coordinates to its atom. The various files do not need +the specified coordinates to this atom. The various files do not need to contain the same set of atoms. For a {file-style} setting of {none}, no filename is specified. Each @@ -197,12 +182,11 @@ The minimizer tolerances for energy and force are set by {etol} and A non-zero {etol} means that the NEB calculation will terminate if the energy criterion is met by every replica. The energies being compared -to {etol} do not include any contribution from the inter-replica +to {etol} do not include any contribution from the inter-replica nudging forces, since these are non-conservative. A non-zero {ftol} means that the NEB calculation will terminate if the force criterion is met by every replica. The forces being compared to {ftol} include the -inter-replica forces between an atom and its images in adjacent -replicas. +inter-replica nudging forces. The maximum number of iterations in each stage is set by {N1} and {N2}. These are effectively timestep counts since each iteration of @@ -220,12 +204,12 @@ finding a good energy barrier. {N1} and {N2} must both be multiples of {Nevery}. In the first stage of NEB, the set of replicas should converge toward -the minimum energy path (MEP) of conformational states that transition -over the barrier. The MEP for a barrier is defined as a sequence of -3N-dimensional states that cross the barrier at its saddle point, each -of which has a potential energy gradient parallel to the MEP itself. +a minimum energy path (MEP) of conformational states that transition +over a barrier. The MEP for a transition is defined as a sequence of +3N-dimensional states, each of which has a potential energy gradient parallel to the MEP itself. +The configuration of highest energy along a MEP corresponds to a saddle point. The replica states will also be roughly equally spaced along the MEP -due to the inter-replica spring force added by the "fix +due to the inter-replica nugding force added by the "fix neb"_fix_neb.html command. In the second stage of NEB, the replica with the highest energy @@ -235,12 +219,10 @@ the barrier, via the barrier-climbing calculation described in "(HenkelmanB)"_#HenkelmanB. As before, the other replicas rearrange themselves along the MEP so as to be roughly equally spaced. -When both stages are complete, if the NEB calculation was successful, -one of the replicas should be an atomic configuration at the top or -saddle point of the barrier, the potential energies for the set of -replicas should represent the energy profile of the barrier along the -MEP, and the configurations of the replicas should be a sequence of -configurations along the MEP. +When both stages are complete, if the NEB calculation was successful, the configurations of the replicas should be along (close to) the MEP and the replica with the highest energy should be an atomic configuration at (close to) the saddle point of +the transition. The potential energies for the set of +replicas represents the energy profile of the transition along the +MEP. :line @@ -321,14 +303,7 @@ is checking against. In this case, N is all the atoms in each replica. The "maximum force per atom" is the maximum force component of any atom in any replica. The potential gradients are the two-norm of the 3N-length force vector solely due to the interaction potential i.e. -without adding in inter-replica forces. Note that inter-replica forces -are zero in the initial and final replicas, and only affect -the direction in the climbing replica. For this reason, the "maximum -force per replica" is often equal to the potential gradient in the -climbing replica. In the first stage of NEB, there is no climbing -replica, and so the potential gradient in the highest energy replica -is reported, since this replica will become the climbing replica -in the second stage of NEB. +without adding in inter-replica forces. The "reaction coordinate" (RD) for each replica is the two-norm of the 3N-length vector of distances between @@ -343,6 +318,27 @@ being operated on by the fix neb command. The forward (reverse) energy barrier is the potential energy of the highest replica minus the energy of the first (last) replica. +Supplementary informations for all replicas can be printed out to the screen and master +log.lammps file by adding the verbose keyword. These informations include the following. +The "path angle" (pathangle) for the replica i which is the angle +between the 3N-length vectors (Ri-1 - Ri) and (Ri+1 - Ri) (where Ri is the +atomic coordinates of replica i). A "path angle" of 180 indicates that replicas +i-1, i and i+1 are aligned. + "angletangrad" is the angle between the 3N-length tangent vector and +the 3N-length force vector at image i. The tangent vector is calculated as in "(HenkelmanA)"_#HenkelmanA for all intermediate replicas and at R2 - R1 and RM - RM-1 for the first and last replica, respectively. +"anglegrad" is the angle between the 3N-length energy gradient vector of replica i and that of +replica i+1. It is not defined for the final replica and reads nan. +gradV is the norm of the energy gradient of image i. +ReplicaForce is the two-norm of the 3N-length force vector (including nudging forces) for replica i. +MaxAtomForce is the maximum force component of any atom in replica i. + +When a NEB calculation does not converge properly, these suplementary +informations can help understanding what is going wrong. For instance when the +path angle becomes accute the definition of tangent used in the NEB +calculation is questionable and the NEB cannot may diverge +"(Maras)"_#Maras. + + When running on multiple partitions, LAMMPS produces additional log files for each partition, e.g. log.lammps.0, log.lammps.1, etc. For a NEB calculation, these contain the thermodynamic output for each @@ -366,7 +362,7 @@ parameters. There are 2 Python scripts provided in the tools/python directory, neb_combine.py and neb_final.py, which are useful in analyzing output from a NEB calculation. Assume a NEB simulation with M replicas, and -the NEB atoms labeled with a specific atom type. +the NEB atoms labelled with a specific atom type. The neb_combine.py script extracts atom coords for the NEB atoms from all M dump files and creates a single dump file where each snapshot @@ -396,6 +392,9 @@ This command can only be used if LAMMPS was built with the REPLICA package. See the "Making LAMMPS"_Section_start.html#start_3 section for more info on packages. +:line + + [Related commands:] "prd"_prd.html, "temper"_temper.html, "fix @@ -412,5 +411,8 @@ langevin"_fix_langevin.html, "fix viscous"_fix_viscous.html [(HenkelmanB)] Henkelman, Uberuaga, Jonsson, J Chem Phys, 113, 9901-9904 (2000). -:link(Nakano3) +:link(Nakano) [(Nakano)] Nakano, Comp Phys Comm, 178, 280-289 (2008). + +:link(Maras) +[(Maras)] Maras, Trushin, Stukowski, Ala-Nissila, Jonsson, Comp Phys Comm, 205, 13-21 (2016) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index 249339191a..2087df46e0 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -32,38 +32,90 @@ using namespace LAMMPS_NS; using namespace FixConst; enum{SINGLE_PROC_DIRECT,SINGLE_PROC_MAP,MULTI_PROC}; - /* ---------------------------------------------------------------------- */ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), id_pe(NULL), pe(NULL), xprev(NULL), xnext(NULL), - tangent(NULL), xsend(NULL), xrecv(NULL), tagsend(NULL), tagrecv(NULL), - xsendall(NULL), xrecvall(NULL), tagsendall(NULL), tagrecvall(NULL), - counts(NULL), displacements(NULL) + Fix(lmp, narg, arg), id_pe(NULL), pe(NULL), xprev(NULL), xnext(NULL), fnext(NULL), + tangent(NULL),springF(NULL), xsend(NULL), xrecv(NULL),fsend(NULL),frecv(NULL), tagsend(NULL), tagrecv(NULL), xsendall(NULL), xrecvall(NULL),fsendall(NULL), frecvall(NULL), tagsendall(NULL), tagrecvall(NULL), counts(NULL), displacements(NULL),nlenall(NULL) { - if (narg != 4) error->all(FLERR,"Illegal fix neb command"); + + + StandardNEB=false; + NEBLongRange=true; + PerpSpring=false; + FreeEndIni=false; + FreeEndFinal=false; + FreeEndFinalWithRespToEIni =false; + FinalAndInterWithRespToEIni = false; + kspringPerp=0; + if (narg < 4) error->all(FLERR,"Illegal fix neb command, argument missing"); kspring = force->numeric(FLERR,arg[3]); - if (kspring <= 0.0) error->all(FLERR,"Illegal fix neb command"); + if (kspring <= 0.0) error->all(FLERR,"Illegal fix neb command. The spring force was not provided properly"); + + int iarg =4; + while (iarg < narg){ + if (strcmp (arg[iarg],"idealpos")==0) + {NEBLongRange = true; + iarg+=1;} + else if (strcmp (arg[iarg],"nearestneigh")==0) + {NEBLongRange = false; + StandardNEB = true; + iarg+=1;} + else if (strcmp (arg[iarg],"PerpSpring")==0) + {PerpSpring=true; + kspringPerp = force->numeric(FLERR,arg[iarg+1]); + if (kspringPerp < 0.0) error->all(FLERR,"Illegal fix neb command. The perpendicular spring force was not provided properly"); + iarg+=2; + } + else if (strcmp (arg[iarg],"freeend")==0) + { + if (strcmp (arg[iarg+1],"ini")==0) + FreeEndIni=true; + else if (strcmp (arg[iarg+1],"final")==0) + FreeEndFinal=true; + else if (strcmp (arg[iarg+1],"final")==0) + FreeEndFinal=true; + else if (strcmp (arg[iarg+1],"finalWithRespToIni")==0) + FreeEndFinalWithRespToEIni=true; + else if (strcmp (arg[iarg+1],"finalAndInterWithRespToIni")==0) + {FinalAndInterWithRespToEIni=true; + FreeEndFinalWithRespToEIni=true;} + iarg+=2;} + else {error->all(FLERR,"Illegal fix neb command. Unknown keyword");} + } // nreplica = number of partitions // ireplica = which world I am in universe // nprocs_universe = # of procs in all replicase // procprev,procnext = root proc in adjacent replicas + me = comm->me; nprocs = comm->nprocs; nprocs_universe = universe->nprocs; nreplica = universe->nworlds; ireplica = universe->iworld; - + if (ireplica > 0) procprev = universe->root_proc[ireplica-1]; else procprev = -1; if (ireplica < nreplica-1) procnext = universe->root_proc[ireplica+1]; else procnext = -1; uworld = universe->uworld; - + int *iroots = new int[nreplica]; + MPI_Group uworldgroup,rootgroup; + if (NEBLongRange ){ + for (int iIm =0; iIm < nreplica;iIm++) + { + iroots[iIm]=universe->root_proc[iIm]; + } + MPI_Comm_group(uworld, &uworldgroup); + MPI_Group_incl(uworldgroup, nreplica, iroots, &rootgroup); + + // MPI_Comm_create_group(uworld, rootgroup, 0, &rootworld); + MPI_Comm_create(uworld, rootgroup, &rootworld); + } // create a new compute pe style // id = fix-ID + pe, compute group = all @@ -84,12 +136,19 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : maxlocal = 0; ntotal = 0; - xprev = xnext = tangent = NULL; + xprev = xnext = tangent = springF= NULL; + fnext = NULL; xsend = xrecv = NULL; + fsend = frecv = NULL; tagsend = tagrecv = NULL; xsendall = xrecvall = NULL; + fsendall = frecvall = NULL; tagsendall = tagrecvall = NULL; counts = displacements = NULL; + + + if (NEBLongRange) + {nlenall=NULL;} } /* ---------------------------------------------------------------------- */ @@ -102,19 +161,27 @@ FixNEB::~FixNEB() memory->destroy(xprev); memory->destroy(xnext); memory->destroy(tangent); - + memory->destroy(springF); memory->destroy(xsend); memory->destroy(xrecv); + memory->destroy(fsend); + memory->destroy(frecv); memory->destroy(tagsend); memory->destroy(tagrecv); memory->destroy(xsendall); memory->destroy(xrecvall); + memory->destroy(fsendall); + memory->destroy(frecvall); memory->destroy(tagsendall); memory->destroy(tagrecvall); memory->destroy(counts); memory->destroy(displacements); + + if (NEBLongRange) + memory->destroy(nlenall); + } /* ---------------------------------------------------------------------- */ @@ -139,6 +206,7 @@ void FixNEB::init() rclimber = -1; + // nebatoms = # of atoms in fix group = atoms with inter-replica forces bigint count = group->count(igroup); @@ -163,11 +231,18 @@ void FixNEB::init() if (MULTI_PROC && counts == NULL) { memory->create(xsendall,ntotal,3,"neb:xsendall"); memory->create(xrecvall,ntotal,3,"neb:xrecvall"); + memory->create(fsendall,ntotal,3,"neb:fsendall"); + memory->create(frecvall,ntotal,3,"neb:frecvall"); memory->create(tagsendall,ntotal,"neb:tagsendall"); memory->create(tagrecvall,ntotal,"neb:tagrecvall"); memory->create(counts,nprocs,"neb:counts"); memory->create(displacements,nprocs,"neb:displacements"); } + + + + + } /* ---------------------------------------------------------------------- */ @@ -186,140 +261,284 @@ void FixNEB::min_setup(int vflag) void FixNEB::min_post_force(int vflag) { double vprev,vnext,vmax,vmin; - double delx,dely,delz; + double delxp,delyp,delzp,delxn,delyn,delzn; double delta1[3],delta2[3]; - + MPI_Status status; + MPI_Request request; + double vIni =0.0; // veng = PE of this replica // vprev,vnext = PEs of adjacent replicas // only proc 0 in each replica communicates - vprev = vnext = veng = pe->compute_scalar(); + vprev=vnext=veng = pe->compute_scalar(); - if (ireplica < nreplica-1 && me == 0) + if (ireplica < nreplica-1 && me ==0) MPI_Send(&veng,1,MPI_DOUBLE,procnext,0,uworld); - if (ireplica > 0 && me == 0) - MPI_Recv(&vprev,1,MPI_DOUBLE,procprev,0,uworld,MPI_STATUS_IGNORE); + if (ireplica > 0 && me ==0) + MPI_Recv(&vprev,1,MPI_DOUBLE,procprev,0,uworld,&status); if (ireplica > 0 && me == 0) MPI_Send(&veng,1,MPI_DOUBLE,procprev,0,uworld); if (ireplica < nreplica-1 && me == 0) - MPI_Recv(&vnext,1,MPI_DOUBLE,procnext,0,uworld,MPI_STATUS_IGNORE); + MPI_Recv(&vnext,1,MPI_DOUBLE,procnext,0,uworld,&status); if (cmode == MULTI_PROC) { MPI_Bcast(&vprev,1,MPI_DOUBLE,0,world); MPI_Bcast(&vnext,1,MPI_DOUBLE,0,world); } - // communicate atoms to/from adjacent replicas to fill xprev,xnext + if (FreeEndFinal) + { + if (update->ntimestep==0) + {EFinalIni = veng;} + } + + if (ireplica==0) + vIni=veng; + + if (FreeEndFinalWithRespToEIni ) { + if ( me ==0){ + int procFirst; + procFirst=universe->root_proc[0]; + MPI_Bcast(&vIni,1,MPI_DOUBLE,procFirst,uworld); //MPI_Recv(&vIni,1,MPI_DOUBLE,procFirst,0,uworld,&status); + } + if (cmode == MULTI_PROC) { + MPI_Bcast(&vIni,1,MPI_DOUBLE,0,world); + } + } + if (FreeEndIni && ireplica==0 ) + { + if (me == 0 ) + if (update->ntimestep==0) + { + EIniIni = veng; + if (cmode == MULTI_PROC) + MPI_Bcast(&EIniIni,1,MPI_DOUBLE,0,world); + } + } + + // communicate atoms to/from adjacent replicas to fill xprev,xnext + inter_replica_comm(); // trigger potential energy computation on next timestep pe->addstep(update->ntimestep+1); - // compute norm of GradV for log output + /* ALL THIS SHOULD BE DONE IN inter_replica_comm() + // xprev,xnext = atom coords of adjacent replicas + // assume order of atoms in all replicas is the same + // check that number of atoms hasn't changed + + double **x = atom->x; + int *mask = atom->mask; + int nlocal = atom->nlocal; + double dot = 0.0; + double prefactor; + + if (nlocal != nebatoms) error->one(FLERR,"Atom count changed in fix neb"); + + if (ireplica > 0) + MPI_Irecv(xprev[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld,&request); + if (ireplica < nreplica-1) + MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld); + if (ireplica > 0) MPI_Wait(&request,&status); + + + + + if (ireplica < nreplica-1) + MPI_Irecv(xnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); + if (ireplica > 0) + MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); + if (ireplica < nreplica-1) MPI_Wait(&request,&status); + */ + + + + + + double **x = atom->x; + int *mask = atom->mask; + double dot = 0.0; + double prefactor; double **f = atom->f; int nlocal = atom->nlocal; - double fsq = 0.0; - for (int i = 0; i < nlocal; i++) - fsq += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + /* SHOULD BE DONE IN inter_replica_comm() + if (ireplica < nreplica-1) + MPI_Irecv(fnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); + if (ireplica > 0) + MPI_Send(f[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); + if (ireplica < nreplica-1) MPI_Wait(&request,&status); + */ - MPI_Allreduce(&fsq,&gradvnorm,1,MPI_DOUBLE,MPI_SUM,world); - gradvnorm = sqrt(gradvnorm); - // first or last replica has no change to forces, just return - - if (ireplica == 0 || ireplica == nreplica-1) { - plen = nlen = 0.0; - return; - } - - // tangent = unit tangent vector in 3N space - // based on delta vectors between atoms and their images in adjacent replicas - // use one or two delta vecs to compute tangent, - // depending on relative PEs of 3 replicas - // see Henkelman & Jonsson 2000 paper, eqs 8-11 - - double **x = atom->x; - int *mask = atom->mask; - - if (vnext > veng && veng > vprev) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - tangent[i][0] = xnext[i][0] - x[i][0]; - tangent[i][1] = xnext[i][1] - x[i][1]; - tangent[i][2] = xnext[i][2] - x[i][2]; - domain->minimum_image(tangent[i]); - } - } else if (vnext < veng && veng < vprev) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - tangent[i][0] = x[i][0] - xprev[i][0]; - tangent[i][1] = x[i][1] - xprev[i][1]; - tangent[i][2] = x[i][2] - xprev[i][2]; - domain->minimum_image(tangent[i]); - } - } else { - vmax = MAX(fabs(vnext-veng),fabs(vprev-veng)); - vmin = MIN(fabs(vnext-veng),fabs(vprev-veng)); - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - delta1[0] = xnext[i][0] - x[i][0]; - delta1[1] = xnext[i][1] - x[i][1]; - delta1[2] = xnext[i][2] - x[i][2]; - domain->minimum_image(delta1); - delta2[0] = x[i][0] - xprev[i][0]; - delta2[1] = x[i][1] - xprev[i][1]; - delta2[2] = x[i][2] - xprev[i][2]; - domain->minimum_image(delta2); - if (vnext > vprev) { - tangent[i][0] = vmax*delta1[0] + vmin*delta2[0]; - tangent[i][1] = vmax*delta1[1] + vmin*delta2[1]; - tangent[i][2] = vmax*delta1[2] + vmin*delta2[2]; - } else { - tangent[i][0] = vmin*delta1[0] + vmax*delta2[0]; - tangent[i][1] = vmin*delta1[1] + vmax*delta2[1]; - tangent[i][2] = vmin*delta1[2] + vmax*delta2[2]; - } - } - } - - // tlen,plen,nlen = lengths of tangent, prev, next vectors - - double tlen = 0.0; + //calculating separation between images plen = 0.0; nlen = 0.0; + double tlen = 0.0; + double gradnextlen = 0.0; + double dotFreeEndIniOld=0.0; + double dotFreeEndFinalOld=0.0; - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + - tangent[i][2]*tangent[i][2]; + dotgrad = 0.0; - delx = x[i][0] - xprev[i][0]; - dely = x[i][1] - xprev[i][1]; - delz = x[i][2] - xprev[i][2]; - domain->minimum_image(delx,dely,delz); - plen += delx*delx + dely*dely + delz*delz; + gradlen = 0.0; - delx = xnext[i][0] - x[i][0]; - dely = xnext[i][1] - x[i][1]; - delz = xnext[i][2] - x[i][2]; - domain->minimum_image(delx,dely,delz); - nlen += delx*delx + dely*dely + delz*delz; + + dotpath = 0.0; + dottangrad = 0.0; + + + + + if (ireplica ==nreplica-1){ + + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + + delxp = x[i][0] - xprev[i][0]; + delyp = x[i][1] - xprev[i][1]; + delzp = x[i][2] - xprev[i][2]; + domain->minimum_image(delxp,delyp,delzp); + plen += delxp*delxp + delyp*delyp + delzp*delzp; + dottangrad += delxp* f[i][0]+ delyp*f[i][1]+delzp*f[i][2]; + gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + + if (FreeEndFinal||FreeEndFinalWithRespToEIni){ + tangent[i][0]=delxp; + tangent[i][1]=delyp; + tangent[i][2]=delzp; + tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + + tangent[i][2]*tangent[i][2]; + dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + f[i][2]*tangent[i][2]; + } + } + } + + + else if (ireplica == 0){ + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + delxn = xnext[i][0] - x[i][0]; + delyn = xnext[i][1] - x[i][1]; + delzn = xnext[i][2] - x[i][2]; + domain->minimum_image(delxn,delyn,delzn); + nlen += delxn*delxn + delyn*delyn + delzn*delzn; + gradnextlen += fnext[i][0]*fnext[i][0] + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; + dotgrad += f[i][0]*fnext[i][0] + f[i][1]*fnext[i][1] + + f[i][2]*fnext[i][2]; + dottangrad += delxn* f[i][0]+ delyn*f[i][1]+delzn*f[i][2]; + gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + if (FreeEndIni) + { + tangent[i][0]=delxn; + tangent[i][1]=delyn; + tangent[i][2]=delzn; + tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + + tangent[i][2]*tangent[i][2]; + dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + f[i][2]*tangent[i][2]; + } + } + } + else //not the first or last replica + { + vmax = MAX(fabs(vnext-veng),fabs(vprev-veng)); + vmin = MIN(fabs(vnext-veng),fabs(vprev-veng)); + + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + delxp = x[i][0] - xprev[i][0]; + delyp = x[i][1] - xprev[i][1]; + delzp = x[i][2] - xprev[i][2]; + domain->minimum_image(delxp,delyp,delzp); + plen += delxp*delxp + delyp*delyp + delzp*delzp; + + delxn = xnext[i][0] - x[i][0]; + delyn = xnext[i][1] - x[i][1]; + delzn = xnext[i][2] - x[i][2]; + domain->minimum_image(delxn,delyn,delzn); domain->minimum_image(delxn,delyn,delzn); + + if (vnext > veng && veng > vprev) { + tangent[i][0]=delxn; + tangent[i][1]=delyn; + tangent[i][2]=delzn; + } + else if (vnext < veng && veng < vprev) { + tangent[i][0]=delxp; + tangent[i][1]=delyp; + tangent[i][2]=delzp; + } + else { + if (vnext > vprev) { + tangent[i][0] = vmax*delxn + vmin*delxp; + tangent[i][1] = vmax*delyn + vmin*delyp; + tangent[i][2] = vmax*delzn + vmin*delzp; + } else { + tangent[i][0] = vmin*delxn + vmax*delxp; + tangent[i][1] = vmin*delyn + vmax*delyp; + tangent[i][2] = vmin*delzn + vmax*delzp; + } + + } + + nlen += delxn*delxn + delyn*delyn + delzn*delzn; + tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + + tangent[i][2]*tangent[i][2]; + gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + dotpath += delxp*delxn + delyp*delyn + delzp*delzn; + dottangrad += tangent[i][0]* f[i][0]+ tangent[i][1]*f[i][1]+tangent[i][2]*f[i][2]; + + + + gradnextlen += fnext[i][0]*fnext[i][0] + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; + dotgrad += f[i][0]*fnext[i][0] + f[i][1]*fnext[i][1] + + f[i][2]*fnext[i][2]; + + + springF[i][0]=kspringPerp*(delxn-delxp); + springF[i][1]=kspringPerp*(delyn-delyp); + springF[i][2]=kspringPerp*(delzn-delzp); + + } } double lenall; - MPI_Allreduce(&tlen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); - tlen = sqrt(lenall); + MPI_Allreduce(&nlen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); + nlen = sqrt(lenall); MPI_Allreduce(&plen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); plen = sqrt(lenall); - MPI_Allreduce(&nlen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); - nlen = sqrt(lenall); + MPI_Allreduce(&tlen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); + tlen = sqrt(lenall); + + MPI_Allreduce(&gradlen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); + gradlen = sqrt(lenall); + + MPI_Allreduce(&gradnextlen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); + gradnextlen = sqrt(lenall); + + + + + double dotpathall; + double dottangradall; + double dotgradall; + + MPI_Allreduce(&dotpath,&dotpathall,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&dottangrad,&dottangradall,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&dotgrad,&dotgradall,1,MPI_DOUBLE,MPI_SUM,world); + + + dotpath=dotpathall; + dottangrad=dottangradall; + dotgrad=dotgradall; // normalize tangent vector @@ -333,38 +552,237 @@ void FixNEB::min_post_force(int vflag) } } - // reset force on each atom in this replica - // regular NEB for all replicas except rclimber does hill-climbing NEB - // currently have F = -Grad(V) = -Grad(V)_perp - Grad(V)_parallel - // want F = -Grad(V)_perp + Fspring for regular NEB - // thus Fdelta = Grad(V)_parallel + Fspring for regular NEB - // want F = -Grad(V) + 2 Grad(V)_parallel for hill-climbing NEB - // thus Fdelta = 2 Grad(V)_parallel for hill-climbing NEB - // Grad(V)_parallel = (Grad(V) . utan) * utangent = -(F . utan) * utangent - // Fspring = k (nlen - plen) * utangent - // see Henkelman & Jonsson 2000 paper, eqs 3,4,12 - // see Henkelman & Jonsson 2000a paper, eq 5 - double dot = 0.0; + // first or last replica has no change to forces, just return + + if(ireplica >0 && ireplica 0.0) { + double dotall; + MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); + dot=dotall; + + double tleninv = 1.0/tlen; + dot *= tleninv; + if (dot<0) + prefactor = -dot - (veng-EIniIni); + else prefactor = -dot + (veng-EIniIni); + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + f[i][0] += prefactor *tangent[i][0]; + f[i][1] += prefactor *tangent[i][1]; + f[i][2] += prefactor *tangent[i][2]; + } + + } + + + } + + + + + + + if(FreeEndFinal&&ireplica == nreplica -1) + {if (tlen > 0.0) { + double dotall; + MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); + dot=dotall; + double tleninv = 1.0/tlen; + dot *= tleninv; + if (dot<0) + prefactor = -dot - (veng-EFinalIni); + else prefactor = -dot + (veng-EFinalIni); + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + f[i][0] += prefactor *tangent[i][0]; + f[i][1] += prefactor *tangent[i][1]; + f[i][2] += prefactor *tangent[i][2]; + } + + } + } + + if(FreeEndFinalWithRespToEIni&&ireplica == nreplica -1) + {if (tlen > 0.0) { + double dotall; + MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); + dot=dotall; + double tleninv = 1.0/tlen; + dot *= tleninv; + if (dot<0) + prefactor = -dot - (veng-vIni); + else prefactor = -dot + (veng-vIni); + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + f[i][0] += prefactor *tangent[i][0]; + f[i][1] += prefactor *tangent[i][1]; + f[i][2] += prefactor *tangent[i][2]; + } + + } + } + + double lentot = 0; + + double meanDist,idealPos,lenuntilIm,lenuntilClimber; + lenuntilClimber=0; + if(NEBLongRange) + { + if (cmode == SINGLE_PROC_DIRECT or cmode == SINGLE_PROC_MAP) + {MPI_Allgather(&nlen,1,MPI_DOUBLE,&nlenall[0],1,MPI_DOUBLE,uworld);} + else + { + /* int procRootiIm; + double nlentmp; + + for (int iIm = 0; i < nreplica; i++) + { + procRootiIm=universe->root_proc[iIm]; + if (ireplica == iIm && me ==0) + { nlentmp=nlen; + MPI_Bcast(&nlentmp,1,MPI_DOUBLE,procRootiIm,uworld); + } + else + { + MPI_Bcast(&nlentmp,1,MPI_DOUBLE,procRootiIm,uworld); + } + nlenall[iIm]=nlen; + } + */ + if (me == 0) + MPI_Allgather(&nlen,1,MPI_DOUBLE,&nlenall[0],1,MPI_DOUBLE,rootworld); + + MPI_Bcast(nlenall,nreplica,MPI_DOUBLE,0,world); + + } + + + + lenuntilIm = 0; + for (int i = 0; i < ireplica; i++) + lenuntilIm += nlenall[i]; + + + for (int i = 0; i < nreplica; i++) + lentot += nlenall[i]; + + meanDist = lentot/(nreplica -1); + + if (rclimber>0) + { + for (int i = 0; i < rclimber; i++) + lenuntilClimber += nlenall[i]; + + double meanDistBeforeClimber = lenuntilClimber/rclimber; + double meanDistAfterClimber = (lentot-lenuntilClimber)/(nreplica-rclimber-1); + + + if (ireplicanlocal > maxlocal) reallocate(); double **x = atom->x; + double **f = atom->f; tagint *tag = atom->tag; int *mask = atom->mask; int nlocal = atom->nlocal; @@ -395,7 +815,7 @@ void FixNEB::inter_replica_comm() // ----------------------------------------------------- // single proc per replica - // all atoms are NEB atoms and no atom sorting is enabled + // all atoms are NEB atoms and no atom sorting // direct comm of x -> xprev and x -> xnext if (cmode == SINGLE_PROC_DIRECT) { @@ -411,6 +831,13 @@ void FixNEB::inter_replica_comm() MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); if (ireplica < nreplica-1) MPI_Wait(&request,MPI_STATUS_IGNORE); + if (ireplica < nreplica-1) + MPI_Irecv(fnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); + if (ireplica > 0) + MPI_Send(f[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); + if (ireplica < nreplica-1) MPI_Wait(&request,MPI_STATUS_IGNORE); + + return; } @@ -427,6 +854,9 @@ void FixNEB::inter_replica_comm() xsend[m][0] = x[i][0]; xsend[m][1] = x[i][1]; xsend[m][2] = x[i][2]; + fsend[m][0] = f[i][0]; + fsend[m][1] = f[i][1]; + fsend[m][2] = f[i][2]; m++; } @@ -451,10 +881,12 @@ void FixNEB::inter_replica_comm() if (ireplica < nreplica-1) { MPI_Irecv(xrecv[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); + MPI_Irecv(frecv[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); MPI_Irecv(tagrecv,nebatoms,MPI_LMP_TAGINT,procnext,0,uworld,&requests[1]); } if (ireplica > 0) { MPI_Send(xsend[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); + MPI_Send(fsend[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); MPI_Send(tagsend,nebatoms,MPI_LMP_TAGINT,procprev,0,uworld); } @@ -465,6 +897,9 @@ void FixNEB::inter_replica_comm() xnext[m][0] = xrecv[i][0]; xnext[m][1] = xrecv[i][1]; xnext[m][2] = xrecv[i][2]; + fnext[m][0] = frecv[i][0]; + fnext[m][1] = frecv[i][1]; + fnext[m][2] = frecv[i][2]; } } @@ -484,6 +919,9 @@ void FixNEB::inter_replica_comm() xsend[m][0] = x[i][0]; xsend[m][1] = x[i][1]; xsend[m][2] = x[i][2]; + fsend[m][0] = f[i][0]; + fsend[m][1] = f[i][1]; + fsend[m][2] = f[i][2]; m++; } @@ -496,12 +934,18 @@ void FixNEB::inter_replica_comm() for (i = 0; i < nprocs; i++) counts[i] *= 3; for (i = 0; i < nprocs-1; i++) displacements[i+1] = displacements[i] + counts[i]; - if (xsend) + if (xsend){ MPI_Gatherv(xsend[0],3*m,MPI_DOUBLE, xsendall[0],counts,displacements,MPI_DOUBLE,0,world); - else + MPI_Gatherv(fsend[0],3*m,MPI_DOUBLE, + fsendall[0],counts,displacements,MPI_DOUBLE,0,world); + } + else { MPI_Gatherv(NULL,3*m,MPI_DOUBLE, xsendall[0],counts,displacements,MPI_DOUBLE,0,world); + MPI_Gatherv(NULL,3*m,MPI_DOUBLE, + fsendall[0],counts,displacements,MPI_DOUBLE,0,world); + } if (ireplica > 0 && me == 0) { MPI_Irecv(xrecvall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld,&requests[0]); @@ -530,11 +974,13 @@ void FixNEB::inter_replica_comm() if (ireplica < nreplica-1 && me == 0) { MPI_Irecv(xrecvall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); + MPI_Irecv(frecvall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); MPI_Irecv(tagrecvall,nebatoms,MPI_LMP_TAGINT,procnext,0,uworld, &requests[1]); } if (ireplica > 0 && me == 0) { MPI_Send(xsendall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); + MPI_Send(fsendall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); MPI_Send(tagsendall,nebatoms,MPI_LMP_TAGINT,procprev,0,uworld); } @@ -543,6 +989,7 @@ void FixNEB::inter_replica_comm() MPI_Bcast(tagrecvall,nebatoms,MPI_INT,0,world); MPI_Bcast(xrecvall[0],3*nebatoms,MPI_DOUBLE,0,world); + MPI_Bcast(frecvall[0],3*nebatoms,MPI_DOUBLE,0,world); for (i = 0; i < nebatoms; i++) { m = atom->map(tagrecvall[i]); @@ -550,10 +997,14 @@ void FixNEB::inter_replica_comm() xnext[m][0] = xrecvall[i][0]; xnext[m][1] = xrecvall[i][1]; xnext[m][2] = xrecvall[i][2]; + fnext[m][0] = frecvall[i][0]; + fnext[m][1] = frecvall[i][1]; + fnext[m][2] = frecvall[i][2]; } } } + /* ---------------------------------------------------------------------- reallocate xprev,xnext,tangent arrays if necessary reallocate communication arrays if necessary @@ -561,13 +1012,25 @@ void FixNEB::inter_replica_comm() void FixNEB::reallocate() { + memory->destroy(xprev); memory->destroy(xnext); memory->destroy(tangent); + memory->destroy(fnext); + memory->destroy(springF); + + if (NEBLongRange) + {memory->destroy(nlenall); + memory->create(nlenall,nreplica,"neb:nlenall"); + } + + if (cmode != SINGLE_PROC_DIRECT) { memory->destroy(xsend); + memory->destroy(fsend); memory->destroy(xrecv); + memory->destroy(frecv); memory->destroy(tagsend); memory->destroy(tagrecv); } @@ -577,10 +1040,15 @@ void FixNEB::reallocate() memory->create(xprev,maxlocal,3,"neb:xprev"); memory->create(xnext,maxlocal,3,"neb:xnext"); memory->create(tangent,maxlocal,3,"neb:tangent"); + memory->create(fnext,maxlocal,3,"neb:fnext"); + memory->create(springF,maxlocal,3,"neb:springF"); + if (cmode != SINGLE_PROC_DIRECT) { memory->create(xsend,maxlocal,3,"neb:xsend"); + memory->create(fsend,maxlocal,3,"neb:fsend"); memory->create(xrecv,maxlocal,3,"neb:xrecv"); + memory->create(frecv,maxlocal,3,"neb:frecv"); memory->create(tagsend,maxlocal,"neb:tagsend"); memory->create(tagrecv,maxlocal,"neb:tagrecv"); } diff --git a/src/REPLICA/fix_neb.h b/src/REPLICA/fix_neb.h index 4026f84f15..5280e9064a 100644 --- a/src/REPLICA/fix_neb.h +++ b/src/REPLICA/fix_neb.h @@ -26,9 +26,8 @@ namespace LAMMPS_NS { class FixNEB : public Fix { public: - double veng,plen,nlen; + double veng,plen,nlen,dotpath, dottangrad,gradlen,dotgrad ; int rclimber; - double gradvnorm; FixNEB(class LAMMPS *, int, char **); ~FixNEB(); @@ -39,33 +38,38 @@ class FixNEB : public Fix { private: int me,nprocs,nprocs_universe; - double kspring; + double kspring, kspringPerp,EIniIni,EFinalIni; + bool StandardNEB, NEBLongRange,PerpSpring, FreeEndIni,FreeEndFinal,FreeEndFinalWithRespToEIni,FinalAndInterWithRespToEIni ; int ireplica,nreplica; int procnext,procprev; int cmode; MPI_Comm uworld; + MPI_Comm rootworld; + char *id_pe; class Compute *pe; - int nebatoms; // # of active NEB atoms + int nebatoms; int ntotal; // total # of atoms, NEB or not int maxlocal; // size of xprev,xnext,tangent arrays - - double **xprev,**xnext; // coords of my owned atoms in neighbor replicas - double **tangent; // work vector for inter-replica forces - + double *nlenall; + double **xprev,**xnext,**fnext,**springF; + double **tangent; double **xsend,**xrecv; // coords to send/recv to/from other replica + double **fsend,**frecv; // coords to send/recv to/from other replica tagint *tagsend,*tagrecv; // ditto for atom IDs // info gathered from all procs in my replica double **xsendall,**xrecvall; // coords to send/recv to/from other replica + double **fsendall,**frecvall; // force to send/recv to/from other replica tagint *tagsendall,*tagrecvall; // ditto for atom IDs int *counts,*displacements; // used for MPI_Gather void inter_replica_comm(); void reallocate(); + }; } diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index 03bd0b61e1..8610860253 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -143,17 +143,19 @@ void NEB::command(int narg, char **arg) // process file-style setting to setup initial configs for all replicas if (strcmp(arg[5],"final") == 0) { - if (narg != 7) error->universe_all(FLERR,"Illegal NEB command"); + if (narg != 7 and narg !=8) error->universe_all(FLERR,"Illegal NEB command"); infile = arg[6]; readfile(infile,0); } else if (strcmp(arg[5],"each") == 0) { - if (narg != 7) error->universe_all(FLERR,"Illegal NEB command"); + if (narg != 7 and narg !=8) error->universe_all(FLERR,"Illegal NEB command"); infile = arg[6]; readfile(infile,1); } else if (strcmp(arg[5],"none") == 0) { - if (narg != 6) error->universe_all(FLERR,"Illegal NEB command"); + if (narg != 6 and narg !=7) error->universe_all(FLERR,"Illegal NEB command"); } else error->universe_all(FLERR,"Illegal NEB command"); - + + Verbose=false; + if (strcmp(arg[narg-1],"verbose") == 0) Verbose=true; // run the NEB calculation run(); @@ -178,7 +180,8 @@ void NEB::run() if (ineb == modify->nfix) error->all(FLERR,"NEB requires use of fix neb"); fneb = (FixNEB *) modify->fix[ineb]; - nall = 4; + if (Verbose) nall =7; + else nall = 4; memory->create(all,nreplica,nall,"neb:all"); rdist = new double[nreplica]; @@ -210,11 +213,25 @@ void NEB::run() if (me_universe == 0) { if (universe->uscreen) + if (Verbose) + fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); + else + fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " "GradV0 GradV1 GradVc " "EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN\n"); if (universe->ulogfile) + if (Verbose) + fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); + else + fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " "GradV0 GradV1 GradVc " "EBF EBR RDT " @@ -280,11 +297,24 @@ void NEB::run() if (me_universe == 0) { if (universe->uscreen) - fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " + if (Verbose) + fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); + else + fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " "GradV0 GradV1 GradVc " "EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN\n"); if (universe->ulogfile) + if (Verbose) + fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); + else + fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " "GradV0 GradV1 GradVc " "EBF EBR RDT " @@ -538,12 +568,28 @@ void NEB::print_status() double fnorminf = update->minimize->fnorm_inf(); double fmaxatom; MPI_Allreduce(&fnorminf,&fmaxatom,1,MPI_DOUBLE,MPI_MAX,roots); + + if (Verbose) + { + freplica = new double[nreplica]; + MPI_Allgather(&fnorm2,1,MPI_DOUBLE,&freplica[0],1,MPI_DOUBLE,roots); + fmaxatomInRepl = new double[nreplica]; + MPI_Allgather(&fnorminf,1,MPI_DOUBLE,&fmaxatomInRepl[0],1,MPI_DOUBLE,roots); + } - double one[4]; + double one[nall]; one[0] = fneb->veng; one[1] = fneb->plen; one[2] = fneb->nlen; - one[nall-1] = fneb->gradvnorm; + one[3] = fneb->gradlen; + + if (Verbose) + { + one[4] = fneb->dotpath; + one[5] = fneb->dottangrad; + one[6] = fneb->dotgrad; + + } if (output->thermo->normflag) one[0] /= atom->natoms; if (me == 0) @@ -586,7 +632,7 @@ void NEB::print_status() ebf = all[irep][0]-all[0][0]; ebr = all[irep][0]-all[nreplica-1][0]; } - + double pi=3.14159265; if (me_universe == 0) { if (universe->uscreen) { fprintf(universe->uscreen,BIGINT_FORMAT " %12.8g %12.8g ", @@ -596,8 +642,15 @@ void NEB::print_status() fprintf(universe->uscreen,"%12.8g %12.8g %12.8g ",ebf,ebr,endpt); for (int i = 0; i < nreplica; i++) fprintf(universe->uscreen,"%12.8g %12.8g ",rdist[i],all[i][0]); + if (Verbose) + {fprintf(universe->uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[0][5])*180/pi,180-acos(all[0][6])*180/pi,all[0][3],freplica[0],fmaxatomInRepl[0]); + for (int i = 1; i < nreplica-1; i++) + fprintf(universe->uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",180-acos(all[i][4])*180/pi,180-acos(all[i][5])*180/pi,180-acos(all[i][6])*180/pi,all[i][3],freplica[i],fmaxatomInRepl[i]); + fprintf(universe->uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[nreplica-1][5])*180/pi,NAN,all[nreplica-1][3],freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); + } fprintf(universe->uscreen,"\n"); } + if (universe->ulogfile) { fprintf(universe->ulogfile,BIGINT_FORMAT " %12.8g %12.8g ", update->ntimestep,fmaxreplica,fmaxatom); @@ -606,6 +659,12 @@ void NEB::print_status() fprintf(universe->ulogfile,"%12.8g %12.8g %12.8g ",ebf,ebr,endpt); for (int i = 0; i < nreplica; i++) fprintf(universe->ulogfile,"%12.8g %12.8g ",rdist[i],all[i][0]); + if (Verbose) + {fprintf(universe->ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[0][5])*180/pi,180-acos(all[0][6])*180/pi,all[0][3],freplica[0],fmaxatomInRepl[0]); + for (int i = 1; i < nreplica-1; i++) + fprintf(universe->ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",180-acos(all[i][4])*180/pi,180-acos(all[i][5])*180/pi,180-acos(all[i][6])*180/pi,all[i][3],freplica[i],fmaxatomInRepl[i]); + fprintf(universe->ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[nreplica-1][5])*180/pi,NAN,all[nreplica-1][3],freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); + } fprintf(universe->ulogfile,"\n"); fflush(universe->ulogfile); } diff --git a/src/REPLICA/neb.h b/src/REPLICA/neb.h index afedf0cdc5..bd60efe961 100644 --- a/src/REPLICA/neb.h +++ b/src/REPLICA/neb.h @@ -38,6 +38,7 @@ class NEB : protected Pointers { private: int me,me_universe; // my proc ID in world and universe int ireplica,nreplica; + bool Verbose; MPI_Comm uworld; MPI_Comm roots; // MPI comm with 1 root proc from each world FILE *fp; @@ -52,6 +53,8 @@ class NEB : protected Pointers { int nall; // per-replica dimension of array all double **all; // PE,plen,nlen,gradvnorm from each replica double *rdist; // normalize reaction distance, 0 to 1 + double *freplica; // force on an image + double *fmaxatomInRepl; // force on an image void readfile(char *, int); void open(char *); @@ -106,7 +109,7 @@ for NEB. E: Too many timesteps -The cumulative timesteps must fit in a 64-bit integer. +The cummulative timesteps must fit in a 64-bit integer. E: Unexpected end of neb file From 8daba01151423437699eba44d50dca0bccda0eef Mon Sep 17 00:00:00 2001 From: Emile Maras Date: Thu, 18 May 2017 16:48:20 +0200 Subject: [PATCH 052/302] some small formating change but does not work anymore --- doc/src/fix_neb.txt | 172 +++++++----- doc/src/neb.txt | 578 ++++++++++++++++++---------------------- src/REPLICA/fix_neb.cpp | 520 ++++++++++++++++-------------------- src/REPLICA/neb.cpp | 112 ++++---- 4 files changed, 647 insertions(+), 735 deletions(-) diff --git a/doc/src/fix_neb.txt b/doc/src/fix_neb.txt index aaec960dd2..3d6f3de540 100644 --- a/doc/src/fix_neb.txt +++ b/doc/src/fix_neb.txt @@ -1,15 +1,6 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Free Software Foundation, Inc. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) +:link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) :link(lc,Section_commands.html#comm) :line @@ -20,107 +11,145 @@ fix neb command :h3 fix ID group-ID neb Kspring keyword value :pre -ID, group-ID are documented in "fix"_fix.html command -neb = style name of this fix command -Kspring = parallel spring constant (force/distance units) :ul -keyword = {idealpos} or {nearestneigh} or {PerpSpring} or {freeend} - {idealpos} value = none = each replica is attached with a spring to its interpolated ideal position (default value) - {nearestneigh} value = none = each replica is attached with a spring with the previous and next replica. - {PerpSpring} value = KspringPerpend - {freeend} value = ini or final or finalWithRespToIni or finalAndInterWithRespToIni +ID, group-ID are documented in "fix"_fix.html command neb = style name of this +fix command Kspring = parallel spring constant (force/distance units) :ul +keyword = {idealpos} or {neigh} or {perp} or {freeend} {idealpos} value = none = +each replica is attached with a spring to its interpolated ideal position +(default value) {neigh} value = none = each replica is attached with a spring +with the previous and next replica. {perp} value = spring constant for the +perpendicular spring {freeend} value = ini or final or finaleini or final2eini [Examples:] -fix 1 active neb 10.0 :pre -fix 2 all neb 1.0 PerpSpring 1.0 freeend final :pre -fix 1 all neb 1.0 nearestneigh freeend finalAndInterWithRespToIni :pre +fix 1 active neb 10.0 :pre fix 2 all neb 1.0 perp 1.0 freeend final :pre fix 1 +all neb 1.0 neigh freeend final2eini :pre [Description:] -Add a nudging force to atoms in the group for a multi-replica simulation run via the "neb"_neb.html command to perform a nudged elastic band (NEB) calculation for finding the transition state. Hi-level -explanations of NEB are given with the "neb"_neb.html command and in "Section_howto 5"_Section_howto.html#howto_5 of the manual. The fix neb command must be used with the "neb" command and defines how -nudging inter-replica forces are computed. -A NEB calculation is divided in two stages. In the first stage n replicas are relaxed toward a MEP and in a second stage, the climbing image scheme (see "(Henkelman2)"_#Henkelman2) is turned on so that the replica having the highest energy relaxes toward the saddle point (i.e. the point of highest energy along the MEP). +Add a nudging force to atoms in the group for a multi-replica simulation run via +the "neb"_neb.html command to perform a nudged elastic band (NEB) calculation +for finding the transition state. Hi-level explanations of NEB are given with +the "neb"_neb.html command and in "Section_howto 5"_Section_howto.html#howto_5 +of the manual. The fix neb command must be used with the "neb" command and +defines how nudging inter-replica forces are computed. A NEB calculation is +divided in two stages. In the first stage n replicas are relaxed toward a MEP +and in a second stage, the climbing image scheme (see +"(Henkelman2)"_#Henkelman2) is turned on so that the replica having the highest +energy relaxes toward the saddle point (i.e. the point of highest energy along +the MEP). -One purpose of the nudging forces is to keep the replicas equally spaced. -During the NEB, the 3N-length vector of interatomic force Fi = -Grad(V) of replicas i is altered. For all intermediate replicas (i.e. for 1 0 +Fi = -Grad(V)+ (Grad(V) dot That + E-ETarget) That when Grad(V) dot That < 0 Fi += -Grad(V)+ (Grad(V) dot That + ETarget- E) That when Grad(V) dot That > 0 where E is the energy of the free end replica and ETarget is the target energy. -When the value {ini} ({final}) is used after the keyword {freeend}, the first (last) replica is considered as a free end. The target energy is set to the energy of the replica at starting of the NEB calculation. When the value {finalWithRespToIni} or {finalAndInterWithRespToIni} is used the last image is considered as a free end and the target energy is equal to the energy of the first replica (which can evolve during the NEB relaxation). -With the value {finalWithRespToIni}, when the initial path is too far from the MEP, an intermediate repilica might relax "faster" and get a lower energy than the last replica. The benefit of the free end is then lost since this intermediate replica will relax toward a local minima. This behavior can be prevented by using the value {finalAndInterWithRespToIni} which remove entirely the contribution of the gradient for all intermediate replica which have a lower energy than the initial one thus preventing these replicae to over-relax. After converging a NEB with the {finalAndInterWithRespToIni} value it -is recommended to check that all intermediate replica have a larger energy than the initial replica. Finally note that if the last replica converges toward a local minimum with a larger energy than the energy of the first replica, a free end neb calculation with the value {finalWithRespToIni} or {finalAndInterWithRespToIni} cannot reach the convergence criteria. +When the value {ini} ({final}) is used after the keyword {freeend}, the first +(last) replica is considered as a free end. The target energy is set to the +energy of the replica at starting of the NEB calculation. When the value +{finaleini} or {final2eini} is used the last image is considered as a free end +and the target energy is equal to the energy of the first replica (which can +evolve during the NEB relaxation). With the value {finaleini}, when the initial +path is too far from the MEP, an intermediate repilica might relax "faster" and +get a lower energy than the last replica. The benefit of the free end is then +lost since this intermediate replica will relax toward a local minima. This +behavior can be prevented by using the value {final2eini} which remove entirely +the contribution of the gradient for all intermediate replica which have a lower +energy than the initial one thus preventing these replicae to over-relax. After +converging a NEB with the {final2eini} value it is recommended to check that all +intermediate replica have a larger energy than the initial replica. Finally note +that if the last replica converges toward a local minimum with a larger energy +than the energy of the first replica, a free end neb calculation with the value +{finaleini} or {final2eini} cannot reach the convergence criteria. :line -The keywords {idealpos} and {nearestneigh} allow to specify how to parallel spring force is computed. -If the keyword {idealpos} is used or by default, the spring force is computed as suggested in "(E)"_#E : +The keywords {idealpos} and {neigh} allow to specify how to parallel spring +force is computed. If the keyword {idealpos} is used or by default, the spring +force is computed as suggested in "(E)"_#E : Fspringparallel=-{Kspring}* (RD-RDideal)/(2 meanDist) -where RD is the "reaction coordinate" see "neb"_neb.html section, and RDideal is the ideal RD for which all the images are equally spaced (i.e. RDideal = (i-1)*meanDist when the climbing image is off, where i is the replica number). The meanDist is the average distance between replicas. +where RD is the "reaction coordinate" see "neb"_neb.html section, and RDideal is +the ideal RD for which all the images are equally spaced (i.e. RDideal = +(i-1)*meanDist when the climbing image is off, where i is the replica +number). The meanDist is the average distance between replicas. -If the keyword {nearestneigh} is used, the parallel spring force is computed as in "(Henkelman1)"_#Henkelman1 by connecting each intermediate replica with the previous and the next image: +If the keyword {neigh} is used, the parallel spring force is computed as in +"(Henkelman1)"_#Henkelman1 by connecting each intermediate replica with the +previous and the next image: Fspringparallel= {Kspring}* (|Ri+1 - Ri| - |Ri - Ri-1|) -The parallel spring force associated with the key word idealpos should usually be more efficient at keeping the images equally spaced. +The parallel spring force associated with the key word idealpos should usually +be more efficient at keeping the images equally spaced. :line -The keyword {PerpSpring} allows to add a spring force perpendicular to the path in order to prevent the path from becoming too kinky. It can improve significantly the convergence of the NEB when the resolution is poor (i.e. when too few images are used) (see "(Maras)"_#Maras). -The perpendicular spring force is given by +The keyword {perp} allows to add a spring force perpendicular to the path in +order to prevent the path from becoming too kinky. It can improve significantly +the convergence of the NEB when the resolution is poor (i.e. when too few images +are used) (see "(Maras)"_#Maras). The perpendicular spring force is given by Fspringperp = {Kspringperp} * f(Ri-1,Ri,Ri+1) (Ri+1 + Ri-1 - 2 Ri) - f(Ri-1 Ri R+1) is a smooth scalar function of the angle Ri-1 Ri Ri+1. It is equal to 0 when the path is straight and is equal to 1 when the angle Ri-1 Ri Ri+1 is accute. f(Ri-1 Ri R+1) is defined in "(Jonsson)"_#Jonsson + f(Ri-1 Ri R+1) is a smooth scalar function of the angle Ri-1 Ri Ri+1. It is + equal to 0 when the path is straight and is equal to 1 when the angle Ri-1 Ri + Ri+1 is accute. f(Ri-1 Ri R+1) is defined in "(Jonsson)"_#Jonsson :line [Restart, fix_modify, output, run start/stop, minimize info:] -No information about this fix is written to "binary restart -files"_restart.html. None of the "fix_modify"_fix_modify.html options -are relevant to this fix. No global or per-atom quantities are stored -by this fix for access by various "output -commands"_Section_howto.html#howto_15. No parameter of this fix can -be used with the {start/stop} keywords of the "run"_run.html command. +No information about this fix is written to "binary restart files"_restart.html. +None of the "fix_modify"_fix_modify.html options are relevant to this fix. No +global or per-atom quantities are stored by this fix for access by various +"output commands"_Section_howto.html#howto_15. No parameter of this fix can be +used with the {start/stop} keywords of the "run"_run.html command. -The forces due to this fix are imposed during an energy minimization, -as invoked by the "minimize"_minimize.html command via the -"neb"_neb.html command. +The forces due to this fix are imposed during an energy minimization, as invoked +by the "minimize"_minimize.html command via the "neb"_neb.html command. [Restrictions:] -This command can only be used if LAMMPS was built with the REPLICA -package. See the "Making LAMMPS"_Section_start.html#start_3 section -for more info on packages. +This command can only be used if LAMMPS was built with the REPLICA package. See +the "Making LAMMPS"_Section_start.html#start_3 section for more info on +packages. [Related commands:] @@ -128,18 +157,17 @@ for more info on packages. [Default:] none -:link(Henkelman) -[(Henkelman1)] Henkelman and Jonsson, J Chem Phys, 113, 9978-9985 (2000). +:link(Henkelman1) [(Henkelman1)] Henkelman and Jonsson, J Chem Phys, 113, +9978-9985 (2000). -:link(Henkelman) -[(Henkelman2)] Henkelman, Uberuaga, Jonsson, J Chem Phys, 113, +:link(Henkelman2) [(Henkelman2)] Henkelman, Uberuaga, Jonsson, J Chem Phys, 113, 9901-9904 (2000). -:link(E) -[(E)] E, Ren, Vanden-Eijnden, Phys Rev B, 66, 052301 (2002) +:link(E) [(E)] E, Ren, Vanden-Eijnden, Phys Rev B, 66, 052301 (2002) -:link(Jonsson) -[(Jonsson)] Jonsson, Mills and Jacobsen, in Classical and Quantum Dynamics in Condensed Phase Simulations, edited by Berne, Ciccotti, and Coker ͑World Scientific, Singapore, 1998͒, p. 385 +:link(Jonsson) [(Jonsson)] Jonsson, Mills and Jacobsen, in Classical and Quantum +Dynamics in Condensed Phase Simulations, edited by Berne, Ciccotti, and Coker +͑World Scientific, Singapore, 1998͒, p. 385 -:link(Maras) -[(Maras)] Maras, Trushin, Stukowski, Ala-Nissila, Jonsson, Comp Phys Comm, 205, 13-21 (2016) +:link(Maras) [(Maras)] Maras, Trushin, Stukowski, Ala-Nissila, Jonsson, Comp +Phys Comm, 205, 13-21 (2016) diff --git a/doc/src/neb.txt b/doc/src/neb.txt index b0be171eda..964291bfcf 100644 --- a/doc/src/neb.txt +++ b/doc/src/neb.txt @@ -1,7 +1,6 @@ "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) +:link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) :link(lc,Section_commands.html#comm) :line @@ -12,407 +11,362 @@ neb command :h3 neb etol ftol N1 N2 Nevery file-style arg keyword :pre -etol = stopping tolerance for energy (energy units) :ulb,l -ftol = stopping tolerance for force (force units) :l -N1 = max # of iterations (timesteps) to run initial NEB :l -N2 = max # of iterations (timesteps) to run barrier-climbing NEB :l -Nevery = print replica energies and reaction coordinates every this many timesteps :l -file-style= {final} or {each} or {none} :l - {final} arg = filename - filename = file with initial coords for final replica - coords for intermediate replicas are linearly interpolated between first and last replica - {each} arg = filename - filename = unique filename for each replica (except first) with its initial coords - {none} arg = no argument - all replicas assumed to already have their initial coords :pre -keyword = {verbose} :pre -:ule +etol = stopping tolerance for energy (energy units) :ulb,l ftol = stopping +tolerance for force (force units) :l N1 = max # of iterations (timesteps) to run +initial NEB :l N2 = max # of iterations (timesteps) to run barrier-climbing NEB +:l Nevery = print replica energies and reaction coordinates every this many +timesteps :l file-style= {final} or {each} or {none} :l {final} arg = filename +filename = file with initial coords for final replica coords for intermediate +replicas are linearly interpolated between first and last replica {each} arg = +filename filename = unique filename for each replica (except first) with its +initial coords {none} arg = no argument all replicas assumed to already have +their initial coords :pre keyword = {verbose} :pre :ule [Examples:] -neb 0.1 0.0 1000 500 50 final coords.final -neb 0.0 0.001 1000 500 50 each coords.initial.$i -neb 0.0 0.001 1000 500 50 none verbose :pre +neb 0.1 0.0 1000 500 50 final coords.final neb 0.0 0.001 1000 500 50 each +coords.initial.$i neb 0.0 0.001 1000 500 50 none verbose :pre [Description:] -Perform a nudged elastic band (NEB) calculation using multiple -replicas of a system. Two or more replicas must be used; the first -and last are the end points of the transition path. +Perform a nudged elastic band (NEB) calculation using multiple replicas of a +system. Two or more replicas must be used; the first and last are the end +points of the transition path. -NEB is a method for finding both the atomic configurations and height -of the energy barrier associated with a transition state, e.g. for an -atom to perform a diffusive hop from one energy basin to another in a -coordinated fashion with its neighbors. The implementation in LAMMPS -follows the discussion in these 4 papers: "(HenkelmanA)"_#HenkelmanA, -"(HenkelmanB)"_#HenkelmanB, "(Nakano)"_#Nakano and "(Maras)"_#Maras. +NEB is a method for finding both the atomic configurations and height of the +energy barrier associated with a transition state, e.g. for an atom to perform a +diffusive hop from one energy basin to another in a coordinated fashion with its +neighbors. The implementation in LAMMPS follows the discussion in these 4 +papers: "(HenkelmanA)"_#HenkelmanA, "(HenkelmanB)"_#HenkelmanB, +"(Nakano)"_#Nakano3 and "(Maras)"_#Maras. Each replica runs on a partition of one or more processors. Processor -partitions are defined at run-time using the -partition command-line -switch; see "Section 2.7"_Section_start.html#start_7 of the manual. -Note that if you have MPI installed, you can run a multi-replica -simulation with more replicas (partitions) than you have physical -processors, e.g you can run a 10-replica simulation on just one or two -processors. You will simply not get the performance speed-up you -would see with one or more physical processors per replica. See -"Section 6.5"_Section_howto.html#howto_5 of the manual for further +partitions are defined at run-time using the -partition command-line switch; see +"Section 2.7"_Section_start.html#start_7 of the manual. Note that if you have +MPI installed, you can run a multi-replica simulation with more replicas +(partitions) than you have physical processors, e.g you can run a 10-replica +simulation on just one or two processors. You will simply not get the +performance speed-up you would see with one or more physical processors per +replica. See "Section 6.5"_Section_howto.html#howto_5 of the manual for further discussion. NOTE: As explained below, a NEB calculation perfoms a damped dynamics -minimization across all the replicas. The mimimizer uses whatever -timestep you have defined in your input script, via the -"timestep"_timestep.html command. Often NEB will converge more -quickly if you use a timestep about 10x larger than you would normally -use for dynamics simulations. +minimization across all the replicas. The mimimizer uses whatever timestep you +have defined in your input script, via the "timestep"_timestep.html command. +Often NEB will converge more quickly if you use a timestep about 10x larger than +you would normally use for dynamics simulations. -When a NEB calculation is performed, it is assumed that each replica -is running the same system, though LAMMPS does not check for this. -I.e. the simulation domain, the number of atoms, the interaction -potentials, and the starting configuration when the neb command is -issued should be the same for every replica. +When a NEB calculation is performed, it is assumed that each replica is running +the same system, though LAMMPS does not check for this. I.e. the simulation +domain, the number of atoms, the interaction potentials, and the starting +configuration when the neb command is issued should be the same for every +replica. -In a NEB calculation each replica is connected to other replicas by inter-replica -nudging forces. These forces are imposed by the "fix neb"_fix_neb.html -command, which must be used in conjunction with the neb command. The -group used to define the fix neb command defines the NEB atoms which -are the only ones that inter-replica springs are applied to. If the -group does not include all atoms, then non-NEB atoms have no -inter-replica springs and the forces they feel and their motion is -computed in the usual way due only to other atoms within their -replica. Conceptually, the non-NEB atoms provide a background force -field for the NEB atoms. They can be allowed to move during the NEB -minimiation procedure (which will typically induce different -coordinates for non-NEB atoms in different replicas), or held fixed -using other LAMMPS commands such as "fix setforce"_fix_setforce.html. -Note that the "partition"_partition.html command can be used to invoke -a command on a subset of the replicas, e.g. if you wish to hold NEB or -non-NEB atoms fixed in only the end-point replicas. +In a NEB calculation each replica is connected to other replicas by +inter-replica nudging forces. These forces are imposed by the "fix +neb"_fix_neb.html command, which must be used in conjunction with the neb +command. The group used to define the fix neb command defines the NEB atoms +which are the only ones that inter-replica springs are applied to. If the group +does not include all atoms, then non-NEB atoms have no inter-replica springs and +the forces they feel and their motion is computed in the usual way due only to +other atoms within their replica. Conceptually, the non-NEB atoms provide a +background force field for the NEB atoms. They can be allowed to move during +the NEB minimization procedure (which will typically induce different +coordinates for non-NEB atoms in different replicas), or held fixed using other +LAMMPS commands such as "fix setforce"_fix_setforce.html. Note that the +"partition"_partition.html command can be used to invoke a command on a subset +of the replicas, e.g. if you wish to hold NEB or non-NEB atoms fixed in only the +end-point replicas. -The initial atomic configuration for each of the replicas can be -specified in different manners via the {file-style} setting, as -discussed below. Only atoms whose initial coordinates should differ -from the current configuration need be specified. +The initial atomic configuration for each of the replicas can be specified in +different manners via the {file-style} setting, as discussed below. Only atoms +whose initial coordinates should differ from the current configuration need be +specified. Conceptually, the initial and final configurations for the first replica should -be states on either side of an energy barrier. +be states on either side of an energy barrier. -As explained below, the initial configurations of intermediate -replicas can be atomic coordinates interpolated in a linear fashion -between the first and last replicas. This is often adequate for -simple transitions. For more complex transitions, it may lead to slow -convergence or even bad results if the minimum energy path (MEP, see -below) of states over the barrier cannot be correctly converged to -from such an initial path. In this case, you will want to -generate initial states for the intermediate replicas that are -geometrically closer to the MEP and read them in. +As explained below, the initial configurations of intermediate replicas can be +atomic coordinates interpolated in a linear fashion between the first and last +replicas. This is often adequate for simple transitions. For more complex +transitions, it may lead to slow convergence or even bad results if the minimum +energy path (MEP, see below) of states over the barrier cannot be correctly +converged to from such an initial path. In this case, you will want to generate +initial states for the intermediate replicas that are geometrically closer to +the MEP and read them in. :line -For a {file-style} setting of {final}, a filename is specified which -contains atomic coordinates for zero or more atoms, in the format -described below. For each atom that appears in the file, the new -coordinates are assigned to that atom in the final replica. Each -intermediate replica also assigns a new position to that atom in an -interpolated manner. This is done by using the current position of -the atom as the starting point and the read-in position as the final -point. The distance between them is calculated, and the new position -is assigned to be a fraction of the distance. E.g. if there are 10 -replicas, the 2nd replica will assign a position that is 10% of the -distance along a line between the starting and final point, and the -9th replica will assign a position that is 90% of the distance along -the line. Note that for this procedure to produce consistent coordinates -across all the replicas, the current coordinates need to be the same -in all replicas. LAMMPS does not check for this, but invalid initial -configurations will likely result if it is not the case. +For a {file-style} setting of {final}, a filename is specified which contains +atomic coordinates for zero or more atoms, in the format described below. For +each atom that appears in the file, the new coordinates are assigned to that +atom in the final replica. Each intermediate replica also assigns a new +position to that atom in an interpolated manner. This is done by using the +current position of the atom as the starting point and the read-in position as +the final point. The distance between them is calculated, and the new position +is assigned to be a fraction of the distance. E.g. if there are 10 replicas, +the 2nd replica will assign a position that is 10% of the distance along a line +between the starting and final point, and the 9th replica will assign a position +that is 90% of the distance along the line. Note that for this procedure to +produce consistent coordinates across all the replicas, the current coordinates +need to be the same in all replicas. LAMMPS does not check for this, but +invalid initial configurations will likely result if it is not the case. -NOTE: The "distance" between the starting and final point is -calculated in a minimum-image sense for a periodic simulation box. -This means that if the two positions are on opposite sides of a box -(periodic in that dimension), the distance between them will be small, -because the periodic image of one of the atoms is close to the other. -Similarly, even if the assigned position resulting from the -interpolation is outside the periodic box, the atom will be wrapped +NOTE: The "distance" between the starting and final point is calculated in a +minimum-image sense for a periodic simulation box. This means that if the two +positions are on opposite sides of a box (periodic in that dimension), the +distance between them will be small, because the periodic image of one of the +atoms is close to the other. Similarly, even if the assigned position resulting +from the interpolation is outside the periodic box, the atom will be wrapped back into the box when the NEB calculation begins. -For a {file-style} setting of {each}, a filename is specified which is -assumed to be unique to each replica. This can be done by -using a variable in the filename, e.g. +For a {file-style} setting of {each}, a filename is specified which is assumed +to be unique to each replica. This can be done by using a variable in the +filename, e.g. -variable i equal part -neb 0.0 0.001 1000 500 50 each coords.initial.$i :pre +variable i equal part neb 0.0 0.001 1000 500 50 each coords.initial.$i :pre -which in this case will substitute the partition ID (0 to N-1) for the -variable I, which is also effectively the replica ID. See the -"variable"_variable.html command for other options, such as using -world-, universe-, or uloop-style variables. +which in this case will substitute the partition ID (0 to N-1) for the variable +I, which is also effectively the replica ID. See the "variable"_variable.html +command for other options, such as using world-, universe-, or uloop-style +variables. -Each replica (except the first replica) will read its file, formatted -as described below, and for any atom that appears in the file, assign -the specified coordinates to this atom. The various files do not need -to contain the same set of atoms. +Each replica (except the first replica) will read its file, formatted as +described below, and for any atom that appears in the file, assign the specified +coordinates to this atom. The various files do not need to contain the same set +of atoms. -For a {file-style} setting of {none}, no filename is specified. Each -replica is assumed to already be in its initial configuration at the -time the neb command is issued. This allows each replica to define -its own configuration by reading a replica-specific data or restart or -dump file, via the "read_data"_read_data.html, -"read_restart"_read_restart.html, or "read_dump"_read_dump.html -commands. The replica-specific names of these files can be specified -as in the discussion above for the {each} file-style. Also see the -section below for how a NEB calculation can produce restart files, so -that a long calculation can be restarted if needed. +For a {file-style} setting of {none}, no filename is specified. Each replica is +assumed to already be in its initial configuration at the time the neb command +is issued. This allows each replica to define its own configuration by reading +a replica-specific data or restart or dump file, via the +"read_data"_read_data.html, "read_restart"_read_restart.html, or +"read_dump"_read_dump.html commands. The replica-specific names of these files +can be specified as in the discussion above for the {each} file-style. Also see +the section below for how a NEB calculation can produce restart files, so that a +long calculation can be restarted if needed. -NOTE: None of the {file-style} settings change the initial -configuration of any atom in the first replica. The first replica -must thus be in the correct initial configuration at the time the neb -command is issued. +NOTE: None of the {file-style} settings change the initial configuration of any +atom in the first replica. The first replica must thus be in the correct +initial configuration at the time the neb command is issued. :line -A NEB calculation proceeds in two stages, each of which is a -minimization procedure, performed via damped dynamics. To enable -this, you must first define a damped dynamics -"min_style"_min_style.html, such as {quickmin} or {fire}. The {cg}, -{sd}, and {hftn} styles cannot be used, since they perform iterative -line searches in their inner loop, which cannot be easily synchronized -across multiple replicas. +A NEB calculation proceeds in two stages, each of which is a minimization +procedure, performed via damped dynamics. To enable this, you must first define +a damped dynamics "min_style"_min_style.html, such as {quickmin} or {fire}. The +{cg}, {sd}, and {hftn} styles cannot be used, since they perform iterative line +searches in their inner loop, which cannot be easily synchronized across +multiple replicas. -The minimizer tolerances for energy and force are set by {etol} and -{ftol}, the same as for the "minimize"_minimize.html command. +The minimizer tolerances for energy and force are set by {etol} and {ftol}, the +same as for the "minimize"_minimize.html command. -A non-zero {etol} means that the NEB calculation will terminate if the -energy criterion is met by every replica. The energies being compared -to {etol} do not include any contribution from the inter-replica nudging -forces, since these are non-conservative. A non-zero {ftol} means -that the NEB calculation will terminate if the force criterion is met -by every replica. The forces being compared to {ftol} include the -inter-replica nudging forces. +A non-zero {etol} means that the NEB calculation will terminate if the energy +criterion is met by every replica. The energies being compared to {etol} do not +include any contribution from the inter-replica nudging forces, since these are +non-conservative. A non-zero {ftol} means that the NEB calculation will +terminate if the force criterion is met by every replica. The forces being +compared to {ftol} include the inter-replica nudging forces. -The maximum number of iterations in each stage is set by {N1} and -{N2}. These are effectively timestep counts since each iteration of -damped dynamics is like a single timestep in a dynamics -"run"_run.html. During both stages, the potential energy of each -replica and its normalized distance along the reaction path (reaction -coordinate RD) will be printed to the screen and log file every -{Nevery} timesteps. The RD is 0 and 1 for the first and last replica. -For intermediate replicas, it is the cumulative distance (normalized -by the total cumulative distance) between adjacent replicas, where -"distance" is defined as the length of the 3N-vector of differences in -atomic coordinates, where N is the number of NEB atoms involved in the -transition. These outputs allow you to monitor NEB's progress in -finding a good energy barrier. {N1} and {N2} must both be multiples -of {Nevery}. +The maximum number of iterations in each stage is set by {N1} and {N2}. These +are effectively timestep counts since each iteration of damped dynamics is like +a single timestep in a dynamics "run"_run.html. During both stages, the +potential energy of each replica and its normalized distance along the reaction +path (reaction coordinate RD) will be printed to the screen and log file every +{Nevery} timesteps. The RD is 0 and 1 for the first and last replica. For +intermediate replicas, it is the cumulative distance (normalized by the total +cumulative distance) between adjacent replicas, where "distance" is defined as +the length of the 3N-vector of differences in atomic coordinates, where N is the +number of NEB atoms involved in the transition. These outputs allow you to +monitor NEB's progress in finding a good energy barrier. {N1} and {N2} must +both be multiples of {Nevery}. -In the first stage of NEB, the set of replicas should converge toward -a minimum energy path (MEP) of conformational states that transition -over a barrier. The MEP for a transition is defined as a sequence of -3N-dimensional states, each of which has a potential energy gradient parallel to the MEP itself. -The configuration of highest energy along a MEP corresponds to a saddle point. -The replica states will also be roughly equally spaced along the MEP -due to the inter-replica nugding force added by the "fix -neb"_fix_neb.html command. +In the first stage of NEB, the set of replicas should converge toward a minimum +energy path (MEP) of conformational states that transition over a barrier. The +MEP for a transition is defined as a sequence of 3N-dimensional states, each of +which has a potential energy gradient parallel to the MEP itself. The +configuration of highest energy along a MEP corresponds to a saddle point. The +replica states will also be roughly equally spaced along the MEP due to the +inter-replica nugding force added by the "fix neb"_fix_neb.html command. -In the second stage of NEB, the replica with the highest energy -is selected and the inter-replica forces on it are converted to a -force that drives its atom coordinates to the top or saddle point of -the barrier, via the barrier-climbing calculation described in -"(HenkelmanB)"_#HenkelmanB. As before, the other replicas rearrange -themselves along the MEP so as to be roughly equally spaced. +In the second stage of NEB, the replica with the highest energy is selected and +the inter-replica forces on it are converted to a force that drives its atom +coordinates to the top or saddle point of the barrier, via the barrier-climbing +calculation described in "(HenkelmanB)"_#HenkelmanB. As before, the other +replicas rearrange themselves along the MEP so as to be roughly equally spaced. -When both stages are complete, if the NEB calculation was successful, the configurations of the replicas should be along (close to) the MEP and the replica with the highest energy should be an atomic configuration at (close to) the saddle point of -the transition. The potential energies for the set of -replicas represents the energy profile of the transition along the -MEP. +When both stages are complete, if the NEB calculation was successful, the +configurations of the replicas should be along (close to) the MEP and the +replica with the highest energy should be an atomic configuration at (close to) +the saddle point of the transition. The potential energies for the set of +replicas represents the energy profile of the transition along the MEP. :line -A few other settings in your input script are required or advised to -perform a NEB calculation. See the NOTE about the choice of timestep -at the beginning of this doc page. +A few other settings in your input script are required or advised to perform a +NEB calculation. See the NOTE about the choice of timestep at the beginning of +this doc page. An atom map must be defined which it is not by default for "atom_style -atomic"_atom_style.html problems. The "atom_modify -map"_atom_modify.html command can be used to do this. +atomic"_atom_style.html problems. The "atom_modify map"_atom_modify.html +command can be used to do this. -The minimizers in LAMMPS operate on all atoms in your system, even -non-NEB atoms, as defined above. To prevent non-NEB atoms from moving -during the minimization, you should use the "fix -setforce"_fix_setforce.html command to set the force on each of those -atoms to 0.0. This is not required, and may not even be desired in -some cases, but if those atoms move too far (e.g. because the initial -state of your system was not well-minimized), it can cause problems -for the NEB procedure. +The minimizers in LAMMPS operate on all atoms in your system, even non-NEB +atoms, as defined above. To prevent non-NEB atoms from moving during the +minimization, you should use the "fix setforce"_fix_setforce.html command to set +the force on each of those atoms to 0.0. This is not required, and may not even +be desired in some cases, but if those atoms move too far (e.g. because the +initial state of your system was not well-minimized), it can cause problems for +the NEB procedure. -The damped dynamics "minimizers"_min_style.html, such as {quickmin} -and {fire}), adjust the position and velocity of the atoms via an -Euler integration step. Thus you must define an appropriate -"timestep"_timestep.html to use with NEB. As mentioned above, NEB -will often converge more quickly if you use a timestep about 10x -larger than you would normally use for dynamics simulations. +The damped dynamics "minimizers"_min_style.html, such as {quickmin} and {fire}), +adjust the position and velocity of the atoms via an Euler integration step. +Thus you must define an appropriate "timestep"_timestep.html to use with NEB. +As mentioned above, NEB will often converge more quickly if you use a timestep +about 10x larger than you would normally use for dynamics simulations. :line -Each file read by the neb command containing atomic coordinates used -to initialize one or more replicas must be formatted as follows. +Each file read by the neb command containing atomic coordinates used to +initialize one or more replicas must be formatted as follows. -The file can be ASCII text or a gzipped text file (detected by a .gz -suffix). The file can contain initial blank lines or comment lines -starting with "#" which are ignored. The first non-blank, non-comment -line should list N = the number of lines to follow. The N successive -lines contain the following information: +The file can be ASCII text or a gzipped text file (detected by a .gz suffix). +The file can contain initial blank lines or comment lines starting with "#" +which are ignored. The first non-blank, non-comment line should list N = the +number of lines to follow. The N successive lines contain the following +information: -ID1 x1 y1 z1 -ID2 x2 y2 z2 -... -IDN xN yN zN :pre +ID1 x1 y1 z1 ID2 x2 y2 z2 ... IDN xN yN zN :pre -The fields are the atom ID, followed by the x,y,z coordinates. -The lines can be listed in any order. Additional trailing information -on the line is OK, such as a comment. +The fields are the atom ID, followed by the x,y,z coordinates. The lines can be +listed in any order. Additional trailing information on the line is OK, such as +a comment. -Note that for a typical NEB calculation you do not need to specify -initial coordinates for very many atoms to produce differing starting -and final replicas whose intermediate replicas will converge to the -energy barrier. Typically only new coordinates for atoms -geometrically near the barrier need be specified. +Note that for a typical NEB calculation you do not need to specify initial +coordinates for very many atoms to produce differing starting and final replicas +whose intermediate replicas will converge to the energy barrier. Typically only +new coordinates for atoms geometrically near the barrier need be specified. -Also note there is no requirement that the atoms in the file -correspond to the NEB atoms in the group defined by the "fix -neb"_fix_neb.html command. Not every NEB atom need be in the file, -and non-NEB atoms can be listed in the file. +Also note there is no requirement that the atoms in the file correspond to the +NEB atoms in the group defined by the "fix neb"_fix_neb.html command. Not every +NEB atom need be in the file, and non-NEB atoms can be listed in the file. :line -Four kinds of output can be generated during a NEB calculation: energy -barrier statistics, thermodynamic output by each replica, dump files, -and restart files. +Four kinds of output can be generated during a NEB calculation: energy barrier +statistics, thermodynamic output by each replica, dump files, and restart files. -When running with multiple partitions (each of which is a replica in -this case), the print-out to the screen and master log.lammps file -contains a line of output, printed once every {Nevery} timesteps. It -contains the timestep, the maximum force per replica, the maximum -force per atom (in any replica), potential gradients in the initial, -final, and climbing replicas, the forward and backward energy barriers, -the total reaction coordinate (RDT), and the normalized reaction -coordinate and potential energy of each replica. +When running with multiple partitions (each of which is a replica in this case), +the print-out to the screen and master log.lammps file contains a line of +output, printed once every {Nevery} timesteps. It contains the timestep, the +maximum force per replica, the maximum force per atom (in any replica), +potential gradients in the initial, final, and climbing replicas, the forward +and backward energy barriers, the total reaction coordinate (RDT), and the +normalized reaction coordinate and potential energy of each replica. -The "maximum force per replica" is -the two-norm of the 3N-length force vector for the atoms in each -replica, maximized across replicas, which is what the {ftol} setting -is checking against. In this case, N is all the atoms in each -replica. The "maximum force per atom" is the maximum force component -of any atom in any replica. The potential gradients are the two-norm -of the 3N-length force vector solely due to the interaction potential i.e. -without adding in inter-replica forces. +The "maximum force per replica" is the two-norm of the 3N-length force vector +for the atoms in each replica, maximized across replicas, which is what the +{ftol} setting is checking against. In this case, N is all the atoms in each +replica. The "maximum force per atom" is the maximum force component of any +atom in any replica. The potential gradients are the two-norm of the 3N-length +force vector solely due to the interaction potential i.e. without adding in +inter-replica forces. -The "reaction coordinate" (RD) for each -replica is the two-norm of the 3N-length vector of distances between -its atoms and the preceding replica's atoms, added to the RD of the -preceding replica. The RD of the first replica RD1 = 0.0; -the RD of the final replica RDN = RDT, the total reaction coordinate. -The normalized RDs are divided by RDT, -so that they form a monotonically increasing sequence -from zero to one. When computing RD, N only includes the atoms -being operated on by the fix neb command. +The "reaction coordinate" (RD) for each replica is the two-norm of the 3N-length +vector of distances between its atoms and the preceding replica's atoms, added +to the RD of the preceding replica. The RD of the first replica RD1 = 0.0; the +RD of the final replica RDN = RDT, the total reaction coordinate. The +normalized RDs are divided by RDT, so that they form a monotonically increasing +sequence from zero to one. When computing RD, N only includes the atoms being +operated on by the fix neb command. The forward (reverse) energy barrier is the potential energy of the highest replica minus the energy of the first (last) replica. -Supplementary informations for all replicas can be printed out to the screen and master -log.lammps file by adding the verbose keyword. These informations include the following. -The "path angle" (pathangle) for the replica i which is the angle -between the 3N-length vectors (Ri-1 - Ri) and (Ri+1 - Ri) (where Ri is the +Supplementary informations for all replicas can be printed out to the screen and +master log.lammps file by adding the verbose keyword. These informations include +the following. The "path angle" (pathangle) for the replica i which is the +angle between the 3N-length vectors (Ri-1 - Ri) and (Ri+1 - Ri) (where Ri is the atomic coordinates of replica i). A "path angle" of 180 indicates that replicas -i-1, i and i+1 are aligned. - "angletangrad" is the angle between the 3N-length tangent vector and -the 3N-length force vector at image i. The tangent vector is calculated as in "(HenkelmanA)"_#HenkelmanA for all intermediate replicas and at R2 - R1 and RM - RM-1 for the first and last replica, respectively. -"anglegrad" is the angle between the 3N-length energy gradient vector of replica i and that of -replica i+1. It is not defined for the final replica and reads nan. -gradV is the norm of the energy gradient of image i. -ReplicaForce is the two-norm of the 3N-length force vector (including nudging forces) for replica i. -MaxAtomForce is the maximum force component of any atom in replica i. +i-1, i and i+1 are aligned. "angletangrad" is the angle between the 3N-length +tangent vector and the 3N-length force vector at image i. The tangent vector is +calculated as in "(HenkelmanA)"_#HenkelmanA for all intermediate replicas and at +R2 - R1 and RM - RM-1 for the first and last replica, respectively. "anglegrad" +is the angle between the 3N-length energy gradient vector of replica i and that +of replica i+1. It is not defined for the final replica and reads nan. gradV is +the norm of the energy gradient of image i. ReplicaForce is the two-norm of the +3N-length force vector (including nudging forces) for replica i. MaxAtomForce +is the maximum force component of any atom in replica i. When a NEB calculation does not converge properly, these suplementary informations can help understanding what is going wrong. For instance when the -path angle becomes accute the definition of tangent used in the NEB -calculation is questionable and the NEB cannot may diverge -"(Maras)"_#Maras. +path angle becomes accute the definition of tangent used in the NEB calculation +is questionable and the NEB cannot may diverge "(Maras)"_#Maras. -When running on multiple partitions, LAMMPS produces additional log -files for each partition, e.g. log.lammps.0, log.lammps.1, etc. For a -NEB calculation, these contain the thermodynamic output for each -replica. +When running on multiple partitions, LAMMPS produces additional log files for +each partition, e.g. log.lammps.0, log.lammps.1, etc. For a NEB calculation, +these contain the thermodynamic output for each replica. -If "dump"_dump.html commands in the input script define a filename -that includes a {universe} or {uloop} style "variable"_variable.html, -then one dump file (per dump command) will be created for each -replica. At the end of the NEB calculation, the final snapshot in -each file will contain the sequence of snapshots that transition the -system over the energy barrier. Earlier snapshots will show the -convergence of the replicas to the MEP. +If "dump"_dump.html commands in the input script define a filename that includes +a {universe} or {uloop} style "variable"_variable.html, then one dump file (per +dump command) will be created for each replica. At the end of the NEB +calculation, the final snapshot in each file will contain the sequence of +snapshots that transition the system over the energy barrier. Earlier snapshots +will show the convergence of the replicas to the MEP. -Likewise, "restart"_restart.html filenames can be specified with a -{universe} or {uloop} style "variable"_variable.html, to generate -restart files for each replica. These may be useful if the NEB -calculation fails to converge properly to the MEP, and you wish to -restart the calculation from an intermediate point with altered -parameters. +Likewise, "restart"_restart.html filenames can be specified with a {universe} or +{uloop} style "variable"_variable.html, to generate restart files for each +replica. These may be useful if the NEB calculation fails to converge properly +to the MEP, and you wish to restart the calculation from an intermediate point +with altered parameters. There are 2 Python scripts provided in the tools/python directory, -neb_combine.py and neb_final.py, which are useful in analyzing output -from a NEB calculation. Assume a NEB simulation with M replicas, and -the NEB atoms labelled with a specific atom type. +neb_combine.py and neb_final.py, which are useful in analyzing output from a NEB +calculation. Assume a NEB simulation with M replicas, and the NEB atoms labeled +with a specific atom type. -The neb_combine.py script extracts atom coords for the NEB atoms from -all M dump files and creates a single dump file where each snapshot -contains the NEB atoms from all the replicas and one copy of non-NEB -atoms from the first replica (presumed to be identical in other -replicas). This can be visualized/animated to see how the NEB atoms -relax as the NEB calculation proceeds. +The neb_combine.py script extracts atom coords for the NEB atoms from all M dump +files and creates a single dump file where each snapshot contains the NEB atoms +from all the replicas and one copy of non-NEB atoms from the first replica +(presumed to be identical in other replicas). This can be visualized/animated +to see how the NEB atoms relax as the NEB calculation proceeds. -The neb_final.py script extracts the final snapshot from each of the M -dump files to create a single dump file with M snapshots. This can be -visualized to watch the system make its transition over the energy -barrier. +The neb_final.py script extracts the final snapshot from each of the M dump +files to create a single dump file with M snapshots. This can be visualized to +watch the system make its transition over the energy barrier. To illustrate, here are images from the final snapshot produced by the -neb_combine.py script run on the dump files produced by the two -example input scripts in examples/neb. Click on them to see a larger -image. +neb_combine.py script run on the dump files produced by the two example input +scripts in examples/neb. Click on them to see a larger image. -:image(JPG/hop1_small.jpg,JPG/hop1.jpg) -:image(JPG/hop2_small.jpg,JPG/hop2.jpg) +:image(JPG/hop1_small.jpg,JPG/hop1.jpg) :image(JPG/hop2_small.jpg,JPG/hop2.jpg) :line [Restrictions:] -This command can only be used if LAMMPS was built with the REPLICA -package. See the "Making LAMMPS"_Section_start.html#start_3 section -for more info on packages. +This command can only be used if LAMMPS was built with the REPLICA package. See +the "Making LAMMPS"_Section_start.html#start_3 section for more info on +packages. -:line +:line [Related commands:] - -[Related commands:] - -"prd"_prd.html, "temper"_temper.html, "fix -langevin"_fix_langevin.html, "fix viscous"_fix_viscous.html +"prd"_prd.html, "temper"_temper.html, "fix langevin"_fix_langevin.html, "fix +viscous"_fix_viscous.html [Default:] none :line -:link(HenkelmanA) -[(HenkelmanA)] Henkelman and Jonsson, J Chem Phys, 113, 9978-9985 (2000). +:link(HenkelmanA) [(HenkelmanA)] Henkelman and Jonsson, J Chem Phys, 113, +9978-9985 (2000). -:link(HenkelmanB) -[(HenkelmanB)] Henkelman, Uberuaga, Jonsson, J Chem Phys, 113, +:link(HenkelmanB) [(HenkelmanB)] Henkelman, Uberuaga, Jonsson, J Chem Phys, 113, 9901-9904 (2000). -:link(Nakano) -[(Nakano)] Nakano, Comp Phys Comm, 178, 280-289 (2008). +:link(Nakano3) [(Nakano)] Nakano, Comp Phys Comm, 178, 280-289 (2008). -:link(Maras) -[(Maras)] Maras, Trushin, Stukowski, Ala-Nissila, Jonsson, Comp Phys Comm, 205, 13-21 (2016) +:link(Maras) [(Maras)] Maras, Trushin, Stukowski, Ala-Nissila, Jonsson, Comp +Phys Comm, 205, 13-21 (2016) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index 2087df46e0..4c243274d1 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -27,9 +27,11 @@ #include "memory.h" #include "error.h" #include "force.h" +#include "math_const.h" using namespace LAMMPS_NS; using namespace FixConst; +using namespace MathConst; enum{SINGLE_PROC_DIRECT,SINGLE_PROC_MAP,MULTI_PROC}; /* ---------------------------------------------------------------------- */ @@ -55,35 +57,34 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : int iarg =4; while (iarg < narg){ - if (strcmp (arg[iarg],"idealpos")==0) - {NEBLongRange = true; - iarg+=1;} - else if (strcmp (arg[iarg],"nearestneigh")==0) - {NEBLongRange = false; - StandardNEB = true; - iarg+=1;} - else if (strcmp (arg[iarg],"PerpSpring")==0) - {PerpSpring=true; - kspringPerp = force->numeric(FLERR,arg[iarg+1]); - if (kspringPerp < 0.0) error->all(FLERR,"Illegal fix neb command. The perpendicular spring force was not provided properly"); + if (strcmp (arg[iarg],"idealpos")==0){ + NEBLongRange = true; + iarg+=1;} + else if (strcmp (arg[iarg],"neigh")==0){ + NEBLongRange = false; + StandardNEB = true; + iarg+=1;} + else if (strcmp (arg[iarg],"perp")==0){ + PerpSpring=true; + kspringPerp = force->numeric(FLERR,arg[iarg+1]); + if (kspringPerp < 0.0) error->all(FLERR,"Illegal fix neb command. The perpendicular spring force was not provided properly"); iarg+=2; - } - else if (strcmp (arg[iarg],"freeend")==0) - { - if (strcmp (arg[iarg+1],"ini")==0) - FreeEndIni=true; - else if (strcmp (arg[iarg+1],"final")==0) - FreeEndFinal=true; - else if (strcmp (arg[iarg+1],"final")==0) - FreeEndFinal=true; - else if (strcmp (arg[iarg+1],"finalWithRespToIni")==0) - FreeEndFinalWithRespToEIni=true; - else if (strcmp (arg[iarg+1],"finalAndInterWithRespToIni")==0) - {FinalAndInterWithRespToEIni=true; - FreeEndFinalWithRespToEIni=true;} - iarg+=2;} - else {error->all(FLERR,"Illegal fix neb command. Unknown keyword");} - } + } + else if (strcmp (arg[iarg],"freeend")==0){ + if (strcmp (arg[iarg+1],"ini")==0) + FreeEndIni=true; + else if (strcmp (arg[iarg+1],"final")==0) + FreeEndFinal=true; + else if (strcmp (arg[iarg+1],"final")==0) + FreeEndFinal=true; + else if (strcmp (arg[iarg+1],"finaleini")==0) + FreeEndFinalWithRespToEIni=true; + else if (strcmp (arg[iarg+1],"final2eini")==0){ + FinalAndInterWithRespToEIni=true; + FreeEndFinalWithRespToEIni=true;} + iarg+=2;} + else {error->all(FLERR,"Illegal fix neb command. Unknown keyword");} + } // nreplica = number of partitions // ireplica = which world I am in universe @@ -97,7 +98,7 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : nprocs_universe = universe->nprocs; nreplica = universe->nworlds; ireplica = universe->iworld; - + if (ireplica > 0) procprev = universe->root_proc[ireplica-1]; else procprev = -1; if (ireplica < nreplica-1) procnext = universe->root_proc[ireplica+1]; @@ -106,13 +107,10 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : int *iroots = new int[nreplica]; MPI_Group uworldgroup,rootgroup; if (NEBLongRange ){ - for (int iIm =0; iIm < nreplica;iIm++) - { - iroots[iIm]=universe->root_proc[iIm]; - } + for (int iIm =0; iIm < nreplica;iIm++){ + iroots[iIm]=universe->root_proc[iIm];} MPI_Comm_group(uworld, &uworldgroup); MPI_Group_incl(uworldgroup, nreplica, iroots, &rootgroup); - // MPI_Comm_create_group(uworld, rootgroup, 0, &rootworld); MPI_Comm_create(uworld, rootgroup, &rootworld); } @@ -179,7 +177,7 @@ FixNEB::~FixNEB() memory->destroy(counts); memory->destroy(displacements); - if (NEBLongRange) + if (NEBLongRange) memory->destroy(nlenall); } @@ -216,7 +214,7 @@ void FixNEB::init() // comm mode for inter-replica exchange of coords if (nreplica == nprocs_universe && - nebatoms == atom->natoms && atom->sortfreq == 0) + nebatoms == atom->natoms && atom->sortfreq == 0) cmode = SINGLE_PROC_DIRECT; else if (nreplica == nprocs_universe) cmode = SINGLE_PROC_MAP; else cmode = MULTI_PROC; @@ -266,15 +264,12 @@ void FixNEB::min_post_force(int vflag) MPI_Status status; MPI_Request request; double vIni =0.0; - // veng = PE of this replica - // vprev,vnext = PEs of adjacent replicas - // only proc 0 in each replica communicates vprev=vnext=veng = pe->compute_scalar(); if (ireplica < nreplica-1 && me ==0) MPI_Send(&veng,1,MPI_DOUBLE,procnext,0,uworld); - if (ireplica > 0 && me ==0) + if (ireplica > 0 && me ==0) MPI_Recv(&vprev,1,MPI_DOUBLE,procprev,0,uworld,&status); if (ireplica > 0 && me == 0) @@ -287,39 +282,32 @@ void FixNEB::min_post_force(int vflag) MPI_Bcast(&vnext,1,MPI_DOUBLE,0,world); } - if (FreeEndFinal) - { - if (update->ntimestep==0) - {EFinalIni = veng;} - } + if (FreeEndFinal){ + if (update->ntimestep==0){EFinalIni = veng;} + } - if (ireplica==0) vIni=veng; - - if (FreeEndFinalWithRespToEIni ) { + if (FreeEndFinalWithRespToEIni ){ if ( me ==0){ int procFirst; procFirst=universe->root_proc[0]; - MPI_Bcast(&vIni,1,MPI_DOUBLE,procFirst,uworld); //MPI_Recv(&vIni,1,MPI_DOUBLE,procFirst,0,uworld,&status); + MPI_Bcast(&vIni,1,MPI_DOUBLE,procFirst,uworld); //MPI_Recv(&vIni,1,MPI_DOUBLE,procFirst,0,uworld,&status); } if (cmode == MULTI_PROC) { MPI_Bcast(&vIni,1,MPI_DOUBLE,0,world); } } - if (FreeEndIni && ireplica==0 ) - { - if (me == 0 ) - if (update->ntimestep==0) - { - EIniIni = veng; - if (cmode == MULTI_PROC) - MPI_Bcast(&EIniIni,1,MPI_DOUBLE,0,world); - } + if (FreeEndIni && ireplica==0 ){ + if (me == 0 ) + if (update->ntimestep==0){ + EIniIni = veng; + if (cmode == MULTI_PROC) + MPI_Bcast(&EIniIni,1,MPI_DOUBLE,0,world); + } } // communicate atoms to/from adjacent replicas to fill xprev,xnext - inter_replica_comm(); // trigger potential energy computation on next timestep @@ -349,7 +337,7 @@ void FixNEB::min_post_force(int vflag) if (ireplica < nreplica-1) - MPI_Irecv(xnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); + MMY_PI_Irecv(xnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); if (ireplica > 0) MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); if (ireplica < nreplica-1) MPI_Wait(&request,&status); @@ -392,57 +380,52 @@ void FixNEB::min_post_force(int vflag) dotpath = 0.0; dottangrad = 0.0; - - if (ireplica ==nreplica-1){ - for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { - delxp = x[i][0] - xprev[i][0]; - delyp = x[i][1] - xprev[i][1]; - delzp = x[i][2] - xprev[i][2]; - domain->minimum_image(delxp,delyp,delzp); - plen += delxp*delxp + delyp*delyp + delzp*delzp; - dottangrad += delxp* f[i][0]+ delyp*f[i][1]+delzp*f[i][2]; - gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; - - if (FreeEndFinal||FreeEndFinalWithRespToEIni){ - tangent[i][0]=delxp; - tangent[i][1]=delyp; - tangent[i][2]=delzp; - tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + - tangent[i][2]*tangent[i][2]; - dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + f[i][2]*tangent[i][2]; - } - } + delxp = x[i][0] - xprev[i][0]; + delyp = x[i][1] - xprev[i][1]; + delzp = x[i][2] - xprev[i][2]; + domain->minimum_image(delxp,delyp,delzp); + plen += delxp*delxp + delyp*delyp + delzp*delzp; + dottangrad += delxp* f[i][0]+ delyp*f[i][1]+delzp*f[i][2]; + gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + if (FreeEndFinal||FreeEndFinalWithRespToEIni){ + tangent[i][0]=delxp; + tangent[i][1]=delyp; + tangent[i][2]=delzp; + tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + + tangent[i][2]*tangent[i][2]; + dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + f[i][2]*tangent[i][2]; + } } + } - else if (ireplica == 0){ for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { - delxn = xnext[i][0] - x[i][0]; - delyn = xnext[i][1] - x[i][1]; - delzn = xnext[i][2] - x[i][2]; - domain->minimum_image(delxn,delyn,delzn); - nlen += delxn*delxn + delyn*delyn + delzn*delzn; - gradnextlen += fnext[i][0]*fnext[i][0] + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; - dotgrad += f[i][0]*fnext[i][0] + f[i][1]*fnext[i][1] + - f[i][2]*fnext[i][2]; - dottangrad += delxn* f[i][0]+ delyn*f[i][1]+delzn*f[i][2]; - gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; - if (FreeEndIni) - { - tangent[i][0]=delxn; - tangent[i][1]=delyn; - tangent[i][2]=delzn; - tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + - tangent[i][2]*tangent[i][2]; - dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + f[i][2]*tangent[i][2]; - } + delxn = xnext[i][0] - x[i][0]; + delyn = xnext[i][1] - x[i][1]; + delzn = xnext[i][2] - x[i][2]; + domain->minimum_image(delxn,delyn,delzn); + nlen += delxn*delxn + delyn*delyn + delzn*delzn; + gradnextlen += fnext[i][0]*fnext[i][0] + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; + dotgrad += f[i][0]*fnext[i][0] + f[i][1]*fnext[i][1] + + f[i][2]*fnext[i][2]; + dottangrad += delxn* f[i][0]+ delyn*f[i][1]+delzn*f[i][2]; + gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + if (FreeEndIni) + { + tangent[i][0]=delxn; + tangent[i][1]=delyn; + tangent[i][2]=delzn; + tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + + tangent[i][2]*tangent[i][2]; + dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + f[i][2]*tangent[i][2]; + } } } else //not the first or last replica @@ -452,61 +435,59 @@ void FixNEB::min_post_force(int vflag) for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - delxp = x[i][0] - xprev[i][0]; - delyp = x[i][1] - xprev[i][1]; - delzp = x[i][2] - xprev[i][2]; - domain->minimum_image(delxp,delyp,delzp); - plen += delxp*delxp + delyp*delyp + delzp*delzp; + if (mask[i] & groupbit) { + delxp = x[i][0] - xprev[i][0]; + delyp = x[i][1] - xprev[i][1]; + delzp = x[i][2] - xprev[i][2]; + domain->minimum_image(delxp,delyp,delzp); + plen += delxp*delxp + delyp*delyp + delzp*delzp; - delxn = xnext[i][0] - x[i][0]; - delyn = xnext[i][1] - x[i][1]; - delzn = xnext[i][2] - x[i][2]; - domain->minimum_image(delxn,delyn,delzn); domain->minimum_image(delxn,delyn,delzn); + delxn = xnext[i][0] - x[i][0]; + delyn = xnext[i][1] - x[i][1]; + delzn = xnext[i][2] - x[i][2]; + domain->minimum_image(delxn,delyn,delzn); domain->minimum_image(delxn,delyn,delzn); - if (vnext > veng && veng > vprev) { - tangent[i][0]=delxn; - tangent[i][1]=delyn; - tangent[i][2]=delzn; - } - else if (vnext < veng && veng < vprev) { - tangent[i][0]=delxp; - tangent[i][1]=delyp; - tangent[i][2]=delzp; - } - else { - if (vnext > vprev) { - tangent[i][0] = vmax*delxn + vmin*delxp; - tangent[i][1] = vmax*delyn + vmin*delyp; - tangent[i][2] = vmax*delzn + vmin*delzp; - } else { - tangent[i][0] = vmin*delxn + vmax*delxp; - tangent[i][1] = vmin*delyn + vmax*delyp; - tangent[i][2] = vmin*delzn + vmax*delzp; - } + if (vnext > veng && veng > vprev) { + tangent[i][0]=delxn; + tangent[i][1]=delyn; + tangent[i][2]=delzn; + } + else if (vnext < veng && veng < vprev) { + tangent[i][0]=delxp; + tangent[i][1]=delyp; + tangent[i][2]=delzp; + } + else { + if (vnext > vprev) { + tangent[i][0] = vmax*delxn + vmin*delxp; + tangent[i][1] = vmax*delyn + vmin*delyp; + tangent[i][2] = vmax*delzn + vmin*delzp; + } else { + tangent[i][0] = vmin*delxn + vmax*delxp; + tangent[i][1] = vmin*delyn + vmax*delyp; + tangent[i][2] = vmin*delzn + vmax*delzp; + } - } + } - nlen += delxn*delxn + delyn*delyn + delzn*delzn; - tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + - tangent[i][2]*tangent[i][2]; - gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; - dotpath += delxp*delxn + delyp*delyn + delzp*delzn; - dottangrad += tangent[i][0]* f[i][0]+ tangent[i][1]*f[i][1]+tangent[i][2]*f[i][2]; + nlen += delxn*delxn + delyn*delyn + delzn*delzn; + tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + + tangent[i][2]*tangent[i][2]; + gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + dotpath += delxp*delxn + delyp*delyn + delzp*delzn; + dottangrad += tangent[i][0]* f[i][0]+ tangent[i][1]*f[i][1]+tangent[i][2]*f[i][2]; - gradnextlen += fnext[i][0]*fnext[i][0] + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; - dotgrad += f[i][0]*fnext[i][0] + f[i][1]*fnext[i][1] + - f[i][2]*fnext[i][2]; + gradnextlen += fnext[i][0]*fnext[i][0] + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; + dotgrad += f[i][0]*fnext[i][0] + f[i][1]*fnext[i][1] + + f[i][2]*fnext[i][2]; - - springF[i][0]=kspringPerp*(delxn-delxp); - springF[i][1]=kspringPerp*(delyn-delyp); - springF[i][2]=kspringPerp*(delzn-delzp); - - } - } + springF[i][0]=kspringPerp*(delxn-delxp); + springF[i][1]=kspringPerp*(delyn-delyp); + springF[i][2]=kspringPerp*(delzn-delzp); + } + } double lenall; MPI_Allreduce(&nlen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); @@ -525,7 +506,6 @@ void FixNEB::min_post_force(int vflag) gradnextlen = sqrt(lenall); - double dotpathall; double dottangradall; @@ -561,146 +541,109 @@ void FixNEB::min_post_force(int vflag) } if(ireplica==0) dottangrad = dottangrad/(nlen*gradlen); if(ireplica==nreplica-1) dottangrad = dottangrad/(plen*gradlen); - if(ireplica < nreplica-1) - { - dotgrad = dotgrad /(gradlen*gradnextlen); - } - + if(ireplica < nreplica-1){ + dotgrad = dotgrad /(gradlen*gradnextlen); + } - if(FreeEndIni&&ireplica == 0) - { - if (tlen > 0.0) { - double dotall; - MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); - dot=dotall; - - double tleninv = 1.0/tlen; - dot *= tleninv; - if (dot<0) - prefactor = -dot - (veng-EIniIni); - else prefactor = -dot + (veng-EIniIni); - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - f[i][0] += prefactor *tangent[i][0]; - f[i][1] += prefactor *tangent[i][1]; - f[i][2] += prefactor *tangent[i][2]; - } - - } - - + if(FreeEndIni&&ireplica == 0) { + if (tlen > 0.0) { + double dotall; + MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); + dot=dotall; + double tleninv = 1.0/tlen; + dot *= tleninv; + if (dot<0) + prefactor = -dot - (veng-EIniIni); + else prefactor = -dot + (veng-EIniIni); + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + f[i][0] += prefactor *tangent[i][0]; + f[i][1] += prefactor *tangent[i][1]; + f[i][2] += prefactor *tangent[i][2]; + } } - - - + } - if(FreeEndFinal&&ireplica == nreplica -1) - {if (tlen > 0.0) { - double dotall; - MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); - dot=dotall; - double tleninv = 1.0/tlen; - dot *= tleninv; - if (dot<0) - prefactor = -dot - (veng-EFinalIni); - else prefactor = -dot + (veng-EFinalIni); - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - f[i][0] += prefactor *tangent[i][0]; - f[i][1] += prefactor *tangent[i][1]; - f[i][2] += prefactor *tangent[i][2]; - } + if(FreeEndFinal&&ireplica == nreplica -1){ + if (tlen > 0.0) { + double dotall; + MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); + dot=dotall; + double tleninv = 1.0/tlen; + dot *= tleninv; + if (dot<0) + prefactor = -dot - (veng-EFinalIni); + else prefactor = -dot + (veng-EFinalIni); + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + f[i][0] += prefactor *tangent[i][0]; + f[i][1] += prefactor *tangent[i][1]; + f[i][2] += prefactor *tangent[i][2]; + } - } } + } - if(FreeEndFinalWithRespToEIni&&ireplica == nreplica -1) - {if (tlen > 0.0) { - double dotall; - MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); - dot=dotall; - double tleninv = 1.0/tlen; - dot *= tleninv; - if (dot<0) - prefactor = -dot - (veng-vIni); - else prefactor = -dot + (veng-vIni); - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - f[i][0] += prefactor *tangent[i][0]; - f[i][1] += prefactor *tangent[i][1]; - f[i][2] += prefactor *tangent[i][2]; - } + if(FreeEndFinalWithRespToEIni&&ireplica == nreplica -1){ + if (tlen > 0.0) { + double dotall; + MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); + dot=dotall; + double tleninv = 1.0/tlen; + dot *= tleninv; + if (dot<0) + prefactor = -dot - (veng-vIni); + else prefactor = -dot + (veng-vIni); + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + f[i][0] += prefactor *tangent[i][0]; + f[i][1] += prefactor *tangent[i][1]; + f[i][2] += prefactor *tangent[i][2]; + } - } } - + } double lentot = 0; double meanDist,idealPos,lenuntilIm,lenuntilClimber; lenuntilClimber=0; if(NEBLongRange) { - if (cmode == SINGLE_PROC_DIRECT or cmode == SINGLE_PROC_MAP) - {MPI_Allgather(&nlen,1,MPI_DOUBLE,&nlenall[0],1,MPI_DOUBLE,uworld);} - else - { - /* int procRootiIm; - double nlentmp; + if (cmode == SINGLE_PROC_DIRECT or cmode == SINGLE_PROC_MAP) + {MPI_Allgather(&nlen,1,MPI_DOUBLE,&nlenall[0],1,MPI_DOUBLE,uworld);} + else{ + if (me == 0) + MPI_Allgather(&nlen,1,MPI_DOUBLE,&nlenall[0],1,MPI_DOUBLE,rootworld); - for (int iIm = 0; i < nreplica; i++) - { - procRootiIm=universe->root_proc[iIm]; - if (ireplica == iIm && me ==0) - { nlentmp=nlen; - MPI_Bcast(&nlentmp,1,MPI_DOUBLE,procRootiIm,uworld); - } - else - { - MPI_Bcast(&nlentmp,1,MPI_DOUBLE,procRootiIm,uworld); - } - nlenall[iIm]=nlen; - } - */ - if (me == 0) - MPI_Allgather(&nlen,1,MPI_DOUBLE,&nlenall[0],1,MPI_DOUBLE,rootworld); - - MPI_Bcast(nlenall,nreplica,MPI_DOUBLE,0,world); - - } + MPI_Bcast(nlenall,nreplica,MPI_DOUBLE,0,world); + } lenuntilIm = 0; for (int i = 0; i < ireplica; i++) - lenuntilIm += nlenall[i]; - + lenuntilIm += nlenall[i]; for (int i = 0; i < nreplica; i++) - lentot += nlenall[i]; - + lentot += nlenall[i]; + meanDist = lentot/(nreplica -1); - if (rclimber>0) - { - for (int i = 0; i < rclimber; i++) - lenuntilClimber += nlenall[i]; - - double meanDistBeforeClimber = lenuntilClimber/rclimber; - double meanDistAfterClimber = (lentot-lenuntilClimber)/(nreplica-rclimber-1); - - - if (ireplica0) { + for (int i = 0; i < rclimber; i++) + lenuntilClimber += nlenall[i]; + double meanDistBeforeClimber = lenuntilClimber/rclimber; + double meanDistAfterClimber = (lentot-lenuntilClimber)/(nreplica-rclimber-1); + if (ireplica 0) MPI_Wait(&request,MPI_STATUS_IGNORE); - if (ireplica < nreplica-1) MPI_Irecv(xnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); if (ireplica > 0) @@ -878,7 +808,6 @@ void FixNEB::inter_replica_comm() xprev[m][2] = xrecv[i][2]; } } - if (ireplica < nreplica-1) { MPI_Irecv(xrecv[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); MPI_Irecv(frecv[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); @@ -1019,11 +948,10 @@ void FixNEB::reallocate() memory->destroy(fnext); memory->destroy(springF); - if (NEBLongRange) - {memory->destroy(nlenall); - memory->create(nlenall,nreplica,"neb:nlenall"); - } - + if (NEBLongRange){ + memory->destroy(nlenall); + memory->create(nlenall,nreplica,"neb:nlenall"); + } if (cmode != SINGLE_PROC_DIRECT) { diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index 8610860253..a0feedf13f 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -9,7 +9,7 @@ the GNU General Public License. See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ + ------------------------------------------------------------------------- */ // lmptype.h must be first b/c this file uses MAXBIGINT and includes mpi.h // due to OpenMPI bug which sets INT64_MAX via its mpi.h @@ -37,8 +37,10 @@ #include "memory.h" #include "error.h" #include "force.h" +#include "math_const.h" using namespace LAMMPS_NS; +using namespace MathConst; #define MAXLINE 256 #define CHUNK 1024 @@ -50,7 +52,7 @@ NEB::NEB(LAMMPS *lmp) : Pointers(lmp) {} /* ---------------------------------------------------------------------- internal NEB constructor, called from TAD -------------------------------------------------------------------------- */ + ------------------------------------------------------------------------- */ NEB::NEB(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, int n2steps_in, int nevery_in, double *buf_init, double *buf_final) @@ -103,7 +105,7 @@ NEB::~NEB() /* ---------------------------------------------------------------------- perform NEB on multiple replicas -------------------------------------------------------------------------- */ + ------------------------------------------------------------------------- */ void NEB::command(int narg, char **arg) { @@ -153,7 +155,7 @@ void NEB::command(int narg, char **arg) } else if (strcmp(arg[5],"none") == 0) { if (narg != 6 and narg !=7) error->universe_all(FLERR,"Illegal NEB command"); } else error->universe_all(FLERR,"Illegal NEB command"); - + Verbose=false; if (strcmp(arg[narg-1],"verbose") == 0) Verbose=true; // run the NEB calculation @@ -163,7 +165,7 @@ void NEB::command(int narg, char **arg) /* ---------------------------------------------------------------------- run NEB on multiple replicas -------------------------------------------------------------------------- */ + ------------------------------------------------------------------------- */ void NEB::run() { @@ -215,27 +217,27 @@ void NEB::run() if (universe->uscreen) if (Verbose) fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); else - fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN\n"); + fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN\n"); if (universe->ulogfile) if (Verbose) fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); else - fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN\n"); + fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN\n"); } print_status(); @@ -299,26 +301,26 @@ void NEB::run() if (universe->uscreen) if (Verbose) fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); else fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN\n"); + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN\n"); if (universe->ulogfile) if (Verbose) fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); else - fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN\n"); + fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN\n"); } print_status(); @@ -351,17 +353,17 @@ void NEB::run() /* ---------------------------------------------------------------------- read initial config atom coords from file flag = 0 - only first replica opens file and reads it - first replica bcasts lines to all replicas - final replica stores coords - intermediate replicas interpolate from coords - new coord = replica fraction between current and final state - initial replica does nothing + only first replica opens file and reads it + first replica bcasts lines to all replicas + final replica stores coords + intermediate replicas interpolate from coords + new coord = replica fraction between current and final state + initial replica does nothing flag = 1 - each replica (except first) opens file and reads it - each replica stores coords - initial replica does nothing -------------------------------------------------------------------------- */ + each replica (except first) opens file and reads it + each replica stores coords + initial replica does nothing + ------------------------------------------------------------------------- */ void NEB::readfile(char *file, int flag) { @@ -524,7 +526,7 @@ void NEB::readfile(char *file, int flag) /* ---------------------------------------------------------------------- universe proc 0 opens NEB data file test if gzipped -------------------------------------------------------------------------- */ + ------------------------------------------------------------------------- */ void NEB::open(char *file) { @@ -558,7 +560,7 @@ void NEB::open(char *file) /* ---------------------------------------------------------------------- query fix NEB for info on each replica universe proc 0 prints current NEB status -------------------------------------------------------------------------- */ + ------------------------------------------------------------------------- */ void NEB::print_status() { @@ -568,7 +570,7 @@ void NEB::print_status() double fnorminf = update->minimize->fnorm_inf(); double fmaxatom; MPI_Allreduce(&fnorminf,&fmaxatom,1,MPI_DOUBLE,MPI_MAX,roots); - + if (Verbose) { freplica = new double[nreplica]; @@ -585,9 +587,9 @@ void NEB::print_status() if (Verbose) { - one[4] = fneb->dotpath; - one[5] = fneb->dottangrad; - one[6] = fneb->dotgrad; + one[4] = fneb->dotpath; + one[5] = fneb->dottangrad; + one[6] = fneb->dotgrad; } @@ -632,7 +634,7 @@ void NEB::print_status() ebf = all[irep][0]-all[0][0]; ebr = all[irep][0]-all[nreplica-1][0]; } - double pi=3.14159265; + if (me_universe == 0) { if (universe->uscreen) { fprintf(universe->uscreen,BIGINT_FORMAT " %12.8g %12.8g ", @@ -643,10 +645,10 @@ void NEB::print_status() for (int i = 0; i < nreplica; i++) fprintf(universe->uscreen,"%12.8g %12.8g ",rdist[i],all[i][0]); if (Verbose) - {fprintf(universe->uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[0][5])*180/pi,180-acos(all[0][6])*180/pi,all[0][3],freplica[0],fmaxatomInRepl[0]); + {fprintf(universe->uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[0][5])*180/MY_PI,180-acos(all[0][6])*180/MY_PI,all[0][3],freplica[0],fmaxatomInRepl[0]); for (int i = 1; i < nreplica-1; i++) - fprintf(universe->uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",180-acos(all[i][4])*180/pi,180-acos(all[i][5])*180/pi,180-acos(all[i][6])*180/pi,all[i][3],freplica[i],fmaxatomInRepl[i]); - fprintf(universe->uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[nreplica-1][5])*180/pi,NAN,all[nreplica-1][3],freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); + fprintf(universe->uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",180-acos(all[i][4])*180/MY_PI,180-acos(all[i][5])*180/MY_PI,180-acos(all[i][6])*180/MY_PI,all[i][3],freplica[i],fmaxatomInRepl[i]); + fprintf(universe->uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[nreplica-1][5])*180/MY_PI,NAN,all[nreplica-1][3],freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); } fprintf(universe->uscreen,"\n"); } @@ -660,10 +662,10 @@ void NEB::print_status() for (int i = 0; i < nreplica; i++) fprintf(universe->ulogfile,"%12.8g %12.8g ",rdist[i],all[i][0]); if (Verbose) - {fprintf(universe->ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[0][5])*180/pi,180-acos(all[0][6])*180/pi,all[0][3],freplica[0],fmaxatomInRepl[0]); + {fprintf(universe->ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[0][5])*180/MY_PI,180-acos(all[0][6])*180/MY_PI,all[0][3],freplica[0],fmaxatomInRepl[0]); for (int i = 1; i < nreplica-1; i++) - fprintf(universe->ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",180-acos(all[i][4])*180/pi,180-acos(all[i][5])*180/pi,180-acos(all[i][6])*180/pi,all[i][3],freplica[i],fmaxatomInRepl[i]); - fprintf(universe->ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[nreplica-1][5])*180/pi,NAN,all[nreplica-1][3],freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); + fprintf(universe->ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",180-acos(all[i][4])*180/MY_PI,180-acos(all[i][5])*180/MY_PI,180-acos(all[i][6])*180/MY_PI,all[i][3],freplica[i],fmaxatomInRepl[i]); + fprintf(universe->ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[nreplica-1][5])*180/MY_PI,NAN,all[nreplica-1][3],freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); } fprintf(universe->ulogfile,"\n"); fflush(universe->ulogfile); From 65eacb6b9060bf630ae039aa909e100052fcf94f Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Thu, 18 May 2017 12:20:39 -0400 Subject: [PATCH 053/302] Fix compilation warnings in fix_python --- src/PYTHON/fix_python.cpp | 4 ++-- src/PYTHON/fix_python.h | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/PYTHON/fix_python.cpp b/src/PYTHON/fix_python.cpp index 031bb29764..88a1a5088d 100644 --- a/src/PYTHON/fix_python.cpp +++ b/src/PYTHON/fix_python.cpp @@ -86,7 +86,7 @@ void FixPython::end_of_step() PyObject * ptr = PY_VOID_POINTER(lmp); PyObject * arglist = Py_BuildValue("(O)", ptr); - PyObject * result = PyEval_CallObject(pFunc, arglist); + PyObject * result = PyEval_CallObject((PyObject*)pFunc, arglist); Py_DECREF(arglist); PyGILState_Release(gstate); @@ -103,7 +103,7 @@ void FixPython::post_force(int vflag) PyObject * ptr = PY_VOID_POINTER(lmp); PyObject * arglist = Py_BuildValue("(Oi)", ptr, vflag); - PyObject * result = PyEval_CallObject(pFunc, arglist); + PyObject * result = PyEval_CallObject((PyObject*)pFunc, arglist); Py_DECREF(arglist); PyGILState_Release(gstate); diff --git a/src/PYTHON/fix_python.h b/src/PYTHON/fix_python.h index 534cd74cfb..2e740dedcd 100644 --- a/src/PYTHON/fix_python.h +++ b/src/PYTHON/fix_python.h @@ -21,7 +21,6 @@ FixStyle(python,FixPython) #define LMP_FIX_PYTHON_H #include "fix.h" -#include namespace LAMMPS_NS { @@ -34,7 +33,7 @@ class FixPython : public Fix { virtual void post_force(int); private: - PyObject * pFunc; + void * pFunc; int selected_callback; }; From 26d71b66e413dfb58635597835cc0fe047510e01 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 12:41:48 -0400 Subject: [PATCH 054/302] convert bigint values for bonds/angles/dihedrals/impropers to doubles when evaluating those keywords in variable expressions --- src/thermo.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/thermo.cpp b/src/thermo.cpp index dbbeff4998..fa18b7de78 100644 --- a/src/thermo.cpp +++ b/src/thermo.cpp @@ -1145,6 +1145,22 @@ int Thermo::evaluate_keyword(char *word, double *answer) compute_atoms(); dvalue = bivalue; + } else if (strcmp(word,"bonds") == 0) { + compute_bonds(); + dvalue = bivalue; + + } else if (strcmp(word,"angles") == 0) { + compute_angles(); + dvalue = bivalue; + + } else if (strcmp(word,"dihedrals") == 0) { + compute_dihedrals(); + dvalue = bivalue; + + } else if (strcmp(word,"impropers") == 0) { + compute_impropers(); + dvalue = bivalue; + } else if (strcmp(word,"temp") == 0) { if (!temperature) error->all(FLERR,"Thermo keyword in variable requires " From 34dbf6b225acc97b1dd8a14d803d432873fd3b05 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 12:45:43 -0400 Subject: [PATCH 055/302] do not compute properties twice --- src/thermo.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/thermo.cpp b/src/thermo.cpp index fa18b7de78..18deecb1a8 100644 --- a/src/thermo.cpp +++ b/src/thermo.cpp @@ -1385,11 +1385,6 @@ int Thermo::evaluate_keyword(char *word, double *answer) else if (strcmp(word,"ylat") == 0) compute_ylat(); else if (strcmp(word,"zlat") == 0) compute_zlat(); - else if (strcmp(word,"bonds") == 0) compute_bonds(); - else if (strcmp(word,"angles") == 0) compute_angles(); - else if (strcmp(word,"dihedrals") == 0) compute_dihedrals(); - else if (strcmp(word,"impropers") == 0) compute_impropers(); - else if (strcmp(word,"pxx") == 0) { if (!pressure) error->all(FLERR,"Thermo keyword in variable requires " From b28ecd44c25d7059d20c9b4317ca438c5ffc1934 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 18 May 2017 13:14:47 -0600 Subject: [PATCH 056/302] update docs before patch release --- doc/src/Section_commands.txt | 2 + doc/src/Section_python.txt | 39 ++++++--- doc/src/fix_reax_bonds.txt | 15 +++- doc/src/pair_edip.txt | 9 +- doc/src/pair_gw.txt | 4 +- doc/src/pair_python.txt | 94 +++++++++++---------- doc/src/pair_tersoff.txt | 2 +- src/{USER-MISC => MANYBODY}/pair_gw.cpp | 0 src/{USER-MISC => MANYBODY}/pair_gw.h | 0 src/{USER-MISC => MANYBODY}/pair_gw_zbl.cpp | 0 src/{USER-MISC => MANYBODY}/pair_gw_zbl.h | 0 src/USER-MISC/README | 2 - 12 files changed, 100 insertions(+), 67 deletions(-) rename src/{USER-MISC => MANYBODY}/pair_gw.cpp (100%) rename src/{USER-MISC => MANYBODY}/pair_gw.h (100%) rename src/{USER-MISC => MANYBODY}/pair_gw_zbl.cpp (100%) rename src/{USER-MISC => MANYBODY}/pair_gw_zbl.h (100%) diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index ae13c87cb8..dc7ddebe58 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -618,6 +618,7 @@ USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. "press/berendsen"_fix_press_berendsen.html, "print"_fix_print.html, "property/atom"_fix_property_atom.html, +"python"_fix_python.html, "qeq/comb (o)"_fix_qeq_comb.html, "qeq/dynamic"_fix_qeq.html, "qeq/fire"_fix_qeq.html, @@ -984,6 +985,7 @@ KOKKOS, o = USER-OMP, t = OPT. "peri/pmb (o)"_pair_peri.html, "peri/ves"_pair_peri.html, "polymorphic"_pair_polymorphic.html, +"python"_pair_python.html, "reax"_pair_reax.html, "rebo (o)"_pair_airebo.html, "resquared (go)"_pair_resquared.html, diff --git a/doc/src/Section_python.txt b/doc/src/Section_python.txt index 7b62f7e948..718e9e229c 100644 --- a/doc/src/Section_python.txt +++ b/doc/src/Section_python.txt @@ -118,13 +118,21 @@ check which version of Python you have installed, by simply typing 11.2 Overview of using Python from a LAMMPS script :link(py_2),h4 -LAMMPS has a "python"_python.html command which can be used in an -input script to define and execute a Python function that you write -the code for. The Python function can also be assigned to a LAMMPS -python-style variable via the "variable"_variable.html command. Each -time the variable is evaluated, either in the LAMMPS input script -itself, or by another LAMMPS command that uses the variable, this will -trigger the Python function to be invoked. +LAMMPS has several commands which can be used to invoke Python +code directly from an input script: + +"python"_python.html +"variable python"_variable.html +"fix python"_fix_python.html +"pair_style python"_pair_python.html :ul + +The "python"_python.html command which can be used to define and +execute a Python function that you write the code for. The Python +function can also be assigned to a LAMMPS python-style variable via +the "variable"_variable.html command. Each time the variable is +evaluated, either in the LAMMPS input script itself, or by another +LAMMPS command that uses the variable, this will trigger the Python +function to be invoked. The Python code for the function can be included directly in the input script or in an auxiliary file. The function can have arguments which @@ -155,13 +163,18 @@ commands. See the "python"_python.html doc page and the "variable"_variable.html doc page for its python-style variables for more info, including examples of Python code you can write for both pure Python operations -and callbacks to LAMMPS. See "fix python"_fix_python.html to learn about -possibilities to execute Python code during each time step. -Through the "python pair style"_pair_python.html it is also possible -to define potential functions as python code. +and callbacks to LAMMPS. -To run pure Python code from LAMMPS, you only need to build LAMMPS -with the PYTHON package installed: +The "fix python"_fix_python.html command can execute +Python code at selected timesteps during a simulation run. + +The "pair_style python"_pair_python command allows you to define +pairwise potentials as python code which encodes a single pairwise +interaction. This is useful for rapid-developement and debugging of a +new potential. + +To use any of these commands, you only need to build LAMMPS with the +PYTHON package installed: make yes-python make machine :pre diff --git a/doc/src/fix_reax_bonds.txt b/doc/src/fix_reax_bonds.txt index a874fa3d16..aadb0a9cbc 100644 --- a/doc/src/fix_reax_bonds.txt +++ b/doc/src/fix_reax_bonds.txt @@ -34,7 +34,20 @@ written to {filename} on timesteps that are multiples of {Nevery}, including timestep 0. For time-averaged chemical species analysis, please see the "fix reaxc/c/species"_fix_reaxc_species.html command. -The format of the output file should be self-explanatory. +The format of the output file should be reasonably self-explanatory. +The meaning of the column header abbreviations is as follows: + +id = atom id +type = atom type +nb = number of bonds +id_1 = atom id of first bond +id_nb = atom id of Nth bond +mol = molecule id +bo_1 = bond order of first bond +bo_nb = bond order of Nth bond +abo = atom bond order (sum of all bonds) +nlp = number of lone pairs +q = atomic charge :ul If the filename ends with ".gz", the output file is written in gzipped format. A gzipped dump file will be about 3x smaller than the text diff --git a/doc/src/pair_edip.txt b/doc/src/pair_edip.txt index d0c90d76dd..86453859d3 100644 --- a/doc/src/pair_edip.txt +++ b/doc/src/pair_edip.txt @@ -7,12 +7,13 @@ :line pair_style edip command :h3 +pair_style edip/multi command :h3 [Syntax:] -pair_style edip :pre -pair_style edip/omp :pre -pair_style edip/multi :pre +pair_style style :pre + +style = {edip} or {edip/multi} :ul [Examples:] @@ -168,4 +169,4 @@ appropriate units if your simulation doesn't use "metal" units. :line :link(EDIP) -[(EDIP)] J. F. Justo et al., Phys. Rev. B 58, 2539 (1998). +[(EDIP)] J F Justo et al, Phys Rev B 58, 2539 (1998). diff --git a/doc/src/pair_gw.txt b/doc/src/pair_gw.txt index 2240dca6f7..fcf63b1bc4 100644 --- a/doc/src/pair_gw.txt +++ b/doc/src/pair_gw.txt @@ -11,7 +11,9 @@ pair_style gw/zbl command :h3 [Syntax:] -pair_style gw :pre +pair_style style :pre + +style = {gw} or {gw/zbl} :ul [Examples:] diff --git a/doc/src/pair_python.txt b/doc/src/pair_python.txt index 84927e52d9..af6d08cb56 100644 --- a/doc/src/pair_python.txt +++ b/doc/src/pair_python.txt @@ -40,34 +40,34 @@ Only a single pair_coeff command is used with the {python} pair style which specifies a python class inside a python module or file that LAMMPS will look up in the current directory, the folder pointed to by the LAMMPS_POTENTIALS environment variable or somewhere in your python -path. A single python module can hold multiple python pair class -definitions. The class definitions itself have to follow specific rules -that are explained below. +path. A single python module can hold multiple python pair class +definitions. The class definitions itself have to follow specific +rules that are explained below. -Atom types in the python class are specified through symbolic constants, -typically strings. These are mapped to LAMMPS atom types by specifying -N additional arguments after the class name in the pair_coeff command, -where N must be the number of currently defined atom types: +Atom types in the python class are specified through symbolic +constants, typically strings. These are mapped to LAMMPS atom types by +specifying N additional arguments after the class name in the +pair_coeff command, where N must be the number of currently defined +atom types: As an example, imagine a file {py_pot.py} has a python potential class names {LJCutMelt} with parameters and potential functions for a two Lennard-Jones atom types labeled as 'LJ1' and 'LJ2'. In your LAMMPS input and you would have defined 3 atom types, out of which the first -two are supposed to be using the 'LJ1' parameters and the third -the 'LJ2' parameters, then you would use the following pair_coeff -command: +two are supposed to be using the 'LJ1' parameters and the third the +'LJ2' parameters, then you would use the following pair_coeff command: pair_coeff * * py_pot.LJCutMelt LJ1 LJ1 LJ2 :pre -The first two arguments [must] be * * so as to span all LAMMPS atom types. -The first two LJ1 arguments map LAMMPS atom types 1 and 2 to the LJ1 -atom type in the LJCutMelt class of the py_pot.py file. The final LJ2 -argument maps LAMMPS atom type 3 to the LJ2 atom type the python file. -If a mapping value is specified as NULL, the mapping is not performed, -any pair interaction with this atom type will be skipped. This can be -used when a {python} potential is used as part of the {hybrid} or -{hybrid/overlay} pair style. The NULL values are then placeholders for -atom types that will be used with other potentials. +The first two arguments [must] be * * so as to span all LAMMPS atom +types. The first two LJ1 arguments map LAMMPS atom types 1 and 2 to +the LJ1 atom type in the LJCutMelt class of the py_pot.py file. The +final LJ2 argument maps LAMMPS atom type 3 to the LJ2 atom type the +python file. If a mapping value is specified as NULL, the mapping is +not performed, any pair interaction with this atom type will be +skipped. This can be used when a {python} potential is used as part of +the {hybrid} or {hybrid/overlay} pair style. The NULL values are then +placeholders for atom types that will be used with other potentials. :line @@ -88,14 +88,18 @@ class LAMMPSPairPotential(object): Any classes with definitions of specific potentials have to be derived from this class and should be initialize in a similar fashion to the -example given below. NOTE: The class constructor has to set up a data -structure containing the potential parameters supported by this class. -It should also define a variable {self.units} containing a string -matching one of the options of LAMMPS' "units"_units.html command, which -is used to verify, that the potential definition in the python class and -in the LAMMPS input match. Example for a single type Lennard-Jones -potential class {LJCutMelt} in reducted units, which defines an atom -type {lj} for which the parameters epsilon and sigma are both 1.0: +example given below. + +NOTE: The class constructor has to set up a data structure containing +the potential parameters supported by this class. It should also +define a variable {self.units} containing a string matching one of the +options of LAMMPS' "units"_units.html command, which is used to +verify, that the potential definition in the python class and in the +LAMMPS input match. + +Here is an example for a single type Lennard-Jones potential class +{LJCutMelt} in reducted units, which defines an atom type {lj} for +which the parameters epsilon and sigma are both 1.0: class LJCutMelt(LAMMPSPairPotential): def __init__(self): @@ -136,32 +140,32 @@ the {LJCutMelt} example, here are the two functions: lj4 = coeff\[3\] return (r6inv * (lj3*r6inv - lj4)) :pre -IMPORTANT NOTE: for consistency with the C++ pair styles in LAMMPS, -the {compute_force} function follows the conventions of the Pair::single() +NOTE: for consistency with the C++ pair styles in LAMMPS, the +{compute_force} function follows the conventions of the Pair::single() methods and does not return the full force, but the force scaled by the distance between the two atoms, so this value only needs to be -multiplied by delta x, delta y, and delta z to conveniently obtain -the three components of the force vector between these two atoms. +multiplied by delta x, delta y, and delta z to conveniently obtain the +three components of the force vector between these two atoms. :line -IMPORTANT NOTE: The evaluation of scripted python code will slow down -the computation pair-wise interactions quite significantly. However, -this can be largely worked around through using the python pair style -not for the actual simulation, but to generate tabulated potentials -on the fly using the "pair_write"_pair_write.html command. Please -see below for an example LAMMPS input of how to build a table file: +NOTE: The evaluation of scripted python code will slow down the +computation pair-wise interactions quite significantly. However, this +can be largely worked around through using the python pair style not +for the actual simulation, but to generate tabulated potentials on the +fly using the "pair_write"_pair_write.html command. Please see below +for an example LAMMPS input of how to build a table file: pair_style python 2.5 pair_coeff * * py_pot.LJCutMelt lj shell rm -f melt.table pair_write 1 1 2000 rsq 0.01 2.5 lj1_lj2.table lj :pre -Note, that it is strong recommended to try to [delete] the potential +Note that it is strongly recommended to try to [delete] the potential table file before generating it. Since the {pair_write} command will -always append to a table file, which pair style table will use the first -match. Thus when changing the potential function in the python class, -the table pair style will still read the old variant. +always append to a table file, which pair style table will use the +first match. Thus when changing the potential function in the python +class, the table pair style will still read the old variant. After switching the pair style to {table}, the potential tables need to be assigned to the LAMMPS atom types like this: @@ -169,7 +173,7 @@ to be assigned to the LAMMPS atom types like this: pair_style table linear 2000 pair_coeff 1 1 melt.table lj :pre -This can also be done for more complex systems. Please see the +This can also be done for more complex systems. Please see the {examples/python} folders for a few more examples. :line @@ -198,9 +202,9 @@ This pair style can only be used via the {pair} keyword of the [Restrictions:] -This pair style is part of the PYTHON package. It is only enabled -if LAMMPS was built with that package. See -the "Making LAMMPS"_Section_start.html#start_3 section for more info. +This pair style is part of the PYTHON package. It is only enabled if +LAMMPS was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. [Related commands:] diff --git a/doc/src/pair_tersoff.txt b/doc/src/pair_tersoff.txt index eb4a8993cf..23a20ad0fd 100644 --- a/doc/src/pair_tersoff.txt +++ b/doc/src/pair_tersoff.txt @@ -18,7 +18,7 @@ pair_style tersoff/table/omp command :h3 pair_style style :pre -style = {tersoff} or {tersoff/table} or {tersoff/gpu} or {tersoff/omp} or {tersoff/table/omp} +style = {tersoff} or {tersoff/table} or {tersoff/gpu} or {tersoff/omp} or {tersoff/table/omp} :ul [Examples:] diff --git a/src/USER-MISC/pair_gw.cpp b/src/MANYBODY/pair_gw.cpp similarity index 100% rename from src/USER-MISC/pair_gw.cpp rename to src/MANYBODY/pair_gw.cpp diff --git a/src/USER-MISC/pair_gw.h b/src/MANYBODY/pair_gw.h similarity index 100% rename from src/USER-MISC/pair_gw.h rename to src/MANYBODY/pair_gw.h diff --git a/src/USER-MISC/pair_gw_zbl.cpp b/src/MANYBODY/pair_gw_zbl.cpp similarity index 100% rename from src/USER-MISC/pair_gw_zbl.cpp rename to src/MANYBODY/pair_gw_zbl.cpp diff --git a/src/USER-MISC/pair_gw_zbl.h b/src/MANYBODY/pair_gw_zbl.h similarity index 100% rename from src/USER-MISC/pair_gw_zbl.h rename to src/MANYBODY/pair_gw_zbl.h diff --git a/src/USER-MISC/README b/src/USER-MISC/README index 1e927fdfab..cacee41e0c 100644 --- a/src/USER-MISC/README +++ b/src/USER-MISC/README @@ -60,8 +60,6 @@ pair_style dipole/sf, Mario Orsi, orsimario at gmail.com, 8 Aug 11 pair_style edip, Luca Ferraro, luca.ferraro at caspur.it, 15 Sep 11 pair_style eam/cd, Alexander Stukowski, stukowski at mm.tu-darmstadt.de, 7 Nov 09 pair_style gauss/cut, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 -pair_style gw, German Samolyuk, samolyuk at gmail.com, 17 May 17 -pair_style gw/zbl, German Samolyuk, samolyuk at gmail.com, 17 May 17 pair_style lennard/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 pair_style list, Axel Kohlmeyer (Temple U), akohlmey at gmail.com, 1 Jun 13 pair_style lj/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 From 069f3e746b46e0655fa648d864734424704fc273 Mon Sep 17 00:00:00 2001 From: Emile Maras Date: Thu, 18 May 2017 21:23:29 +0200 Subject: [PATCH 057/302] small formating changes --- src/REPLICA/fix_neb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index 4c243274d1..fed2934b70 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -337,7 +337,7 @@ void FixNEB::min_post_force(int vflag) if (ireplica < nreplica-1) - MMY_PI_Irecv(xnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); + MPI_Irecv(xnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); if (ireplica > 0) MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); if (ireplica < nreplica-1) MPI_Wait(&request,&status); From d4ee03c778df8a7405fed6f78ab7a1703e41728c Mon Sep 17 00:00:00 2001 From: Emile Maras Date: Thu, 18 May 2017 21:31:39 +0200 Subject: [PATCH 058/302] changed doc links --- doc/src/fix_neb.txt | 5 +++-- doc/src/neb.txt | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/doc/src/fix_neb.txt b/doc/src/fix_neb.txt index 3d6f3de540..0250a40d8c 100644 --- a/doc/src/fix_neb.txt +++ b/doc/src/fix_neb.txt @@ -1,7 +1,8 @@ "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c -:link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) -:link(lc,Section_commands.html#comm) +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) + :line diff --git a/doc/src/neb.txt b/doc/src/neb.txt index 964291bfcf..966d1574a4 100644 --- a/doc/src/neb.txt +++ b/doc/src/neb.txt @@ -1,7 +1,7 @@ "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c -:link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) -:link(lc,Section_commands.html#comm) +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) :line From 8751850ecaa8ddfbd87d5ccbd63530e29c551b65 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 18:34:03 -0400 Subject: [PATCH 059/302] a few formatting fixes for pair style python --- doc/src/pair_python.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/pair_python.txt b/doc/src/pair_python.txt index af6d08cb56..557db37bbb 100644 --- a/doc/src/pair_python.txt +++ b/doc/src/pair_python.txt @@ -107,15 +107,15 @@ class LJCutMelt(LAMMPSPairPotential): # set coeffs: 48*eps*sig**12, 24*eps*sig**6, # 4*eps*sig**12, 4*eps*sig**6 self.units = 'lj' - self.coeff = {'lj' : {'lj' : (48.0,24.0,4.0,4.0)}} + self.coeff = \{'lj' : \{'lj' : (48.0,24.0,4.0,4.0)\}\} :pre The class also has to provide two methods for the computation of the potential energy and forces, which have be named {compute_force}, and {compute_energy}, which both take 3 numerical arguments: - rsq = the square of the distance between a pair of atoms (float) :li - itype = the (numerical) type of the first atom :li + rsq = the square of the distance between a pair of atoms (float) :l + itype = the (numerical) type of the first atom :l jtype = the (numerical) type of the second atom :ul This functions need to compute the force and the energy, respectively, From 654e09e999b8b894acf5a292f01f9363054fd670 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 18 May 2017 18:34:27 -0400 Subject: [PATCH 060/302] correct input examples affected by the Pair::settings() bugfix --- examples/ASPHERE/poly/in.poly | 1 + examples/ASPHERE/poly/in.poly.mp | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/ASPHERE/poly/in.poly b/examples/ASPHERE/poly/in.poly index 77df095e15..3496a774bb 100644 --- a/examples/ASPHERE/poly/in.poly +++ b/examples/ASPHERE/poly/in.poly @@ -62,6 +62,7 @@ pair_coeff 3 3 1.0 1.5 pair_coeff 1 4 0.0 1.0 0.5 pair_coeff 2 4 0.0 1.0 1.0 pair_coeff 3 4 0.0 1.0 0.75 +pair_coeff 4 4 0.0 1.0 0.0 delete_atoms overlap 1.0 small big diff --git a/examples/ASPHERE/poly/in.poly.mp b/examples/ASPHERE/poly/in.poly.mp index 5ced616e7c..1c6a1faee3 100644 --- a/examples/ASPHERE/poly/in.poly.mp +++ b/examples/ASPHERE/poly/in.poly.mp @@ -62,6 +62,7 @@ pair_coeff 3 3 1.0 1.5 pair_coeff 1 4 0.0 1.0 0.5 pair_coeff 2 4 0.0 1.0 1.0 pair_coeff 3 4 0.0 1.0 0.75 +pair_coeff 4 4 0.0 1.0 0.0 delete_atoms overlap 1.0 small big From 9593e05c9ec55ddd0d97ea019b08ccfdf7f2c42d Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Thu, 18 May 2017 19:37:08 -0400 Subject: [PATCH 061/302] Force PDF documentation build to fail on first error --- doc/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/Makefile b/doc/Makefile index a1f76d7041..2274ca5550 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -100,6 +100,7 @@ epub: $(OBJECTS) pdf: utils/txt2html/txt2html.exe @(\ + set -e; \ cd src; \ ../utils/txt2html/txt2html.exe -b *.txt; \ htmldoc --batch lammps.book; \ From 2225fce94eee9334316349799ad198ec35cab5c2 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 19 May 2017 07:35:36 -0600 Subject: [PATCH 062/302] patch 19May17 --- doc/src/Manual.txt | 4 ++-- src/version.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index bceb174017..dd24f8465a 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -1,7 +1,7 @@ LAMMPS Users Manual - + @@ -21,7 +21,7 @@

LAMMPS Documentation :c,h3 -4 May 2017 version :c,h4 +19 May 2017 version :c,h4 Version info: :h4 diff --git a/src/version.h b/src/version.h index 7ae7ec4872..dc0ebe76b8 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "4 May 2017" +#define LAMMPS_VERSION "19 May 2017" From a5110d81ea6133a74b79d5bf1be433a3d4625995 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 19 May 2017 12:13:23 -0400 Subject: [PATCH 063/302] correct a bunch of documentation formatting issues for updated neb and fix neb commands --- doc/src/fix_neb.txt | 238 ++++++++++-------- doc/src/neb.txt | 599 ++++++++++++++++++++++++-------------------- 2 files changed, 456 insertions(+), 381 deletions(-) diff --git a/doc/src/fix_neb.txt b/doc/src/fix_neb.txt index 0250a40d8c..a5c4bf4396 100644 --- a/doc/src/fix_neb.txt +++ b/doc/src/fix_neb.txt @@ -1,8 +1,8 @@ "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c -:link(lws,http://lammps.sandia.gov) +:link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) - +:link(lc,Section_commands.html#comm) :line @@ -11,164 +11,184 @@ fix neb command :h3 [Syntax:] fix ID group-ID neb Kspring keyword value :pre - -ID, group-ID are documented in "fix"_fix.html command neb = style name of this -fix command Kspring = parallel spring constant (force/distance units) :ul -keyword = {idealpos} or {neigh} or {perp} or {freeend} {idealpos} value = none = -each replica is attached with a spring to its interpolated ideal position -(default value) {neigh} value = none = each replica is attached with a spring -with the previous and next replica. {perp} value = spring constant for the -perpendicular spring {freeend} value = ini or final or finaleini or final2eini - +ID, group-ID are documented in "fix"_fix.html command +neb = style name of this fix command +Kspring = parallel spring constant (force/distance units) +keyword = {idealpos} or {neigh} or {perp} or {freeend} :ul + {idealpos} = each replica is attached with a spring to its interpolated ideal position (default) + {neigh} = each replica is connected with spring to the previous and next replica. + {perp} value = set spring constant for the perpendicular spring to {value} + {freeend} flag = set behavior for the end points + flag = {ini} or {final} or {finaleini} or {final2eini} + :pre [Examples:] -fix 1 active neb 10.0 :pre fix 2 all neb 1.0 perp 1.0 freeend final :pre fix 1 -all neb 1.0 neigh freeend final2eini :pre +fix 1 active neb 10.0 +fix 2 all neb 1.0 perp 1.0 freeend final +fix 1 all neb 1.0 neigh freeend final2eini :pre [Description:] -Add a nudging force to atoms in the group for a multi-replica simulation run via -the "neb"_neb.html command to perform a nudged elastic band (NEB) calculation -for finding the transition state. Hi-level explanations of NEB are given with -the "neb"_neb.html command and in "Section_howto 5"_Section_howto.html#howto_5 -of the manual. The fix neb command must be used with the "neb" command and -defines how nudging inter-replica forces are computed. A NEB calculation is -divided in two stages. In the first stage n replicas are relaxed toward a MEP -and in a second stage, the climbing image scheme (see -"(Henkelman2)"_#Henkelman2) is turned on so that the replica having the highest -energy relaxes toward the saddle point (i.e. the point of highest energy along -the MEP). +Add a nudging force to atoms in the group for a multi-replica +simulation run via the "neb"_neb.html command to perform a nudged +elastic band (NEB) calculation for finding the transition state. +Hi-level explanations of NEB are given with the "neb"_neb.html command +and in "Section_howto 5"_Section_howto.html#howto_5 of the manual. +The fix neb command must be used with the "neb" command and defines +how nudging inter-replica forces are computed. A NEB calculation is +divided in two stages. In the first stage n replicas are relaxed +toward a MEP and in a second stage, the climbing image scheme (see +"(Henkelman2)"_#Henkelman2) is turned on so that the replica having +the highest energy relaxes toward the saddle point (i.e. the point of +highest energy along the MEP). -One purpose of the nudging forces is to keep the replicas equally spaced. -During the NEB, the 3N-length vector of interatomic force Fi = -Grad(V) of -replicas i is altered. For all intermediate replicas (i.e. for 1 0 +:pre -Fi = -Grad(V)+ (Grad(V) dot That + E-ETarget) That when Grad(V) dot That < 0 Fi -= -Grad(V)+ (Grad(V) dot That + ETarget- E) That when Grad(V) dot That > 0 +where E is the energy of the free end replica and ETarget is the +target energy. -where E is the energy of the free end replica and ETarget is the target energy. - -When the value {ini} ({final}) is used after the keyword {freeend}, the first -(last) replica is considered as a free end. The target energy is set to the -energy of the replica at starting of the NEB calculation. When the value -{finaleini} or {final2eini} is used the last image is considered as a free end -and the target energy is equal to the energy of the first replica (which can -evolve during the NEB relaxation). With the value {finaleini}, when the initial -path is too far from the MEP, an intermediate repilica might relax "faster" and -get a lower energy than the last replica. The benefit of the free end is then -lost since this intermediate replica will relax toward a local minima. This -behavior can be prevented by using the value {final2eini} which remove entirely -the contribution of the gradient for all intermediate replica which have a lower -energy than the initial one thus preventing these replicae to over-relax. After -converging a NEB with the {final2eini} value it is recommended to check that all -intermediate replica have a larger energy than the initial replica. Finally note -that if the last replica converges toward a local minimum with a larger energy -than the energy of the first replica, a free end neb calculation with the value -{finaleini} or {final2eini} cannot reach the convergence criteria. +When the value {ini} ({final}) is used after the keyword {freeend}, +the first (last) replica is considered as a free end. The target +energy is set to the energy of the replica at starting of the NEB +calculation. When the value {finaleini} or {final2eini} is used the +last image is considered as a free end and the target energy is equal +to the energy of the first replica (which can evolve during the NEB +relaxation). With the value {finaleini}, when the initial path is too +far from the MEP, an intermediate repilica might relax "faster" and +get a lower energy than the last replica. The benefit of the free end +is then lost since this intermediate replica will relax toward a local +minima. This behavior can be prevented by using the value {final2eini} +which remove entirely the contribution of the gradient for all +intermediate replica which have a lower energy than the initial one +thus preventing these replicae to over-relax. After converging a NEB +with the {final2eini} value it is recommended to check that all +intermediate replica have a larger energy than the initial +replica. Finally note that if the last replica converges toward a +local minimum with a larger energy than the energy of the first +replica, a free end neb calculation with the value {finaleini} or +{final2eini} cannot reach the convergence criteria. :line - -The keywords {idealpos} and {neigh} allow to specify how to parallel spring -force is computed. If the keyword {idealpos} is used or by default, the spring -force is computed as suggested in "(E)"_#E : +The keywords {idealpos} and {neigh} allow to specify how to parallel +spring force is computed. If the keyword {idealpos} is used or by +default, the spring force is computed as suggested in "(E)"_#E : -Fspringparallel=-{Kspring}* (RD-RDideal)/(2 meanDist) +Fspringparallel=-{Kspring}* (RD-RDideal)/(2 meanDist) :pre -where RD is the "reaction coordinate" see "neb"_neb.html section, and RDideal is -the ideal RD for which all the images are equally spaced (i.e. RDideal = -(i-1)*meanDist when the climbing image is off, where i is the replica -number). The meanDist is the average distance between replicas. +where RD is the "reaction coordinate" see "neb"_neb.html section, and +RDideal is the ideal RD for which all the images are equally spaced +(i.e. RDideal = (i-1)*meanDist when the climbing image is off, where i +is the replica number). The meanDist is the average distance between +replicas. -If the keyword {neigh} is used, the parallel spring force is computed as in -"(Henkelman1)"_#Henkelman1 by connecting each intermediate replica with the -previous and the next image: +If the keyword {neigh} is used, the parallel spring force is computed +as in "(Henkelman1)"_#Henkelman1 by connecting each intermediate +replica with the previous and the next image: -Fspringparallel= {Kspring}* (|Ri+1 - Ri| - |Ri - Ri-1|) +Fspringparallel= {Kspring}* (|Ri+1 - Ri| - |Ri - Ri-1|) :pre -The parallel spring force associated with the key word idealpos should usually -be more efficient at keeping the images equally spaced. +The parallel spring force associated with the key word idealpos should +usually be more efficient at keeping the images equally spaced. :line -The keyword {perp} allows to add a spring force perpendicular to the path in -order to prevent the path from becoming too kinky. It can improve significantly -the convergence of the NEB when the resolution is poor (i.e. when too few images -are used) (see "(Maras)"_#Maras). The perpendicular spring force is given by +The keyword {perp} allows to add a spring force perpendicular to the +path in order to prevent the path from becoming too kinky. It can +improve significantly the convergence of the NEB when the resolution +is poor (i.e. when too few images are used) (see "(Maras)"_#Maras1). +The perpendicular spring force is given by -Fspringperp = {Kspringperp} * f(Ri-1,Ri,Ri+1) (Ri+1 + Ri-1 - 2 Ri) +Fspringperp = {Kspringperp} * f(Ri-1,Ri,Ri+1) (Ri+1 + Ri-1 - 2 Ri) :pre - f(Ri-1 Ri R+1) is a smooth scalar function of the angle Ri-1 Ri Ri+1. It is - equal to 0 when the path is straight and is equal to 1 when the angle Ri-1 Ri - Ri+1 is accute. f(Ri-1 Ri R+1) is defined in "(Jonsson)"_#Jonsson +f(Ri-1 Ri R+1) is a smooth scalar function of the angle Ri-1 Ri +Ri+1. It is equal to 0 when the path is straight and is equal to 1 +when the angle Ri-1 Ri Ri+1 is accute. f(Ri-1 Ri R+1) is defined in +"(Jonsson)"_#Jonsson :line [Restart, fix_modify, output, run start/stop, minimize info:] -No information about this fix is written to "binary restart files"_restart.html. -None of the "fix_modify"_fix_modify.html options are relevant to this fix. No -global or per-atom quantities are stored by this fix for access by various -"output commands"_Section_howto.html#howto_15. No parameter of this fix can be -used with the {start/stop} keywords of the "run"_run.html command. +No information about this fix is written to "binary restart +files"_restart.html. None of the "fix_modify"_fix_modify.html options +are relevant to this fix. No global or per-atom quantities are stored +by this fix for access by various "output +commands"_Section_howto.html#howto_15. No parameter of this fix can +be used with the {start/stop} keywords of the "run"_run.html command. -The forces due to this fix are imposed during an energy minimization, as invoked -by the "minimize"_minimize.html command via the "neb"_neb.html command. +The forces due to this fix are imposed during an energy minimization, +as invoked by the "minimize"_minimize.html command via the +"neb"_neb.html command. [Restrictions:] -This command can only be used if LAMMPS was built with the REPLICA package. See -the "Making LAMMPS"_Section_start.html#start_3 section for more info on -packages. +This command can only be used if LAMMPS was built with the REPLICA +package. See the "Making LAMMPS"_Section_start.html#start_3 section +for more info on packages. [Related commands:] "neb"_neb.html -[Default:] none +[Default:] -:link(Henkelman1) [(Henkelman1)] Henkelman and Jonsson, J Chem Phys, 113, -9978-9985 (2000). +none -:link(Henkelman2) [(Henkelman2)] Henkelman, Uberuaga, Jonsson, J Chem Phys, 113, +:link(Henkelman1) +[(Henkelman1)] Henkelman and Jonsson, J Chem Phys, 113, 9978-9985 (2000). + +:link(Henkelman2) +[(Henkelman2)] Henkelman, Uberuaga, Jonsson, J Chem Phys, 113, 9901-9904 (2000). -:link(E) [(E)] E, Ren, Vanden-Eijnden, Phys Rev B, 66, 052301 (2002) +:link(E) +[(E)] E, Ren, Vanden-Eijnden, Phys Rev B, 66, 052301 (2002) -:link(Jonsson) [(Jonsson)] Jonsson, Mills and Jacobsen, in Classical and Quantum +:link(Jonsson) +[(Jonsson)] Jonsson, Mills and Jacobsen, in Classical and Quantum Dynamics in Condensed Phase Simulations, edited by Berne, Ciccotti, and Coker -͑World Scientific, Singapore, 1998͒, p. 385 +World Scientific, Singapore, 1998, p. 385 -:link(Maras) [(Maras)] Maras, Trushin, Stukowski, Ala-Nissila, Jonsson, Comp -Phys Comm, 205, 13-21 (2016) +:link(Maras1) +[(Maras)] Maras, Trushin, Stukowski, Ala-Nissila, Jonsson, +Comp Phys Comm, 205, 13-21 (2016) diff --git a/doc/src/neb.txt b/doc/src/neb.txt index 966d1574a4..294bbdeb09 100644 --- a/doc/src/neb.txt +++ b/doc/src/neb.txt @@ -2,6 +2,7 @@ :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) +:link(lc,Section_commands.html#comm) :line @@ -11,362 +12,416 @@ neb command :h3 neb etol ftol N1 N2 Nevery file-style arg keyword :pre -etol = stopping tolerance for energy (energy units) :ulb,l ftol = stopping -tolerance for force (force units) :l N1 = max # of iterations (timesteps) to run -initial NEB :l N2 = max # of iterations (timesteps) to run barrier-climbing NEB -:l Nevery = print replica energies and reaction coordinates every this many -timesteps :l file-style= {final} or {each} or {none} :l {final} arg = filename -filename = file with initial coords for final replica coords for intermediate -replicas are linearly interpolated between first and last replica {each} arg = -filename filename = unique filename for each replica (except first) with its -initial coords {none} arg = no argument all replicas assumed to already have -their initial coords :pre keyword = {verbose} :pre :ule +etol = stopping tolerance for energy (energy units) :ulb,l +ftol = stopping tolerance for force (force units) :l +N1 = max # of iterations (timesteps) to run initial NEB :l +N2 = max # of iterations (timesteps) to run barrier-climbing NEB :l +Nevery = print replica energies and reaction coordinates every this many timesteps :l +file-style = {final} or {each} or {none} :l + {final} arg = filename + filename = file with initial coords for final replica + coords for intermediate replicas are linearly interpolated + between first and last replica + {each} arg = filename + filename = unique filename for each replica (except first) + with its initial coords + {none} arg = no argument all replicas assumed to already have + their initial coords :pre +keyword = {verbose} +:ule [Examples:] -neb 0.1 0.0 1000 500 50 final coords.final neb 0.0 0.001 1000 500 50 each -coords.initial.$i neb 0.0 0.001 1000 500 50 none verbose :pre +neb 0.1 0.0 1000 500 50 final coords.final +neb 0.0 0.001 1000 500 50 each coords.initial.$i +neb 0.0 0.001 1000 500 50 none verbose :pre [Description:] -Perform a nudged elastic band (NEB) calculation using multiple replicas of a -system. Two or more replicas must be used; the first and last are the end -points of the transition path. +Perform a nudged elastic band (NEB) calculation using multiple +replicas of a system. Two or more replicas must be used; the first +and last are the end points of the transition path. -NEB is a method for finding both the atomic configurations and height of the -energy barrier associated with a transition state, e.g. for an atom to perform a -diffusive hop from one energy basin to another in a coordinated fashion with its -neighbors. The implementation in LAMMPS follows the discussion in these 4 -papers: "(HenkelmanA)"_#HenkelmanA, "(HenkelmanB)"_#HenkelmanB, -"(Nakano)"_#Nakano3 and "(Maras)"_#Maras. +NEB is a method for finding both the atomic configurations and height +of the energy barrier associated with a transition state, e.g. for an +atom to perform a diffusive hop from one energy basin to another in a +coordinated fashion with its neighbors. The implementation in LAMMPS +follows the discussion in these 4 papers: "(HenkelmanA)"_#HenkelmanA, +"(HenkelmanB)"_#HenkelmanB, "(Nakano)"_#Nakano3 and "(Maras)"_#Maras2. Each replica runs on a partition of one or more processors. Processor -partitions are defined at run-time using the -partition command-line switch; see -"Section 2.7"_Section_start.html#start_7 of the manual. Note that if you have -MPI installed, you can run a multi-replica simulation with more replicas -(partitions) than you have physical processors, e.g you can run a 10-replica -simulation on just one or two processors. You will simply not get the -performance speed-up you would see with one or more physical processors per -replica. See "Section 6.5"_Section_howto.html#howto_5 of the manual for further +partitions are defined at run-time using the -partition command-line +switch; see "Section 2.7"_Section_start.html#start_7 of the manual. +Note that if you have MPI installed, you can run a multi-replica +simulation with more replicas (partitions) than you have physical +processors, e.g you can run a 10-replica simulation on just one or two +processors. You will simply not get the performance speed-up you +would see with one or more physical processors per replica. See +"Section 6.5"_Section_howto.html#howto_5 of the manual for further discussion. NOTE: As explained below, a NEB calculation perfoms a damped dynamics -minimization across all the replicas. The mimimizer uses whatever timestep you -have defined in your input script, via the "timestep"_timestep.html command. -Often NEB will converge more quickly if you use a timestep about 10x larger than -you would normally use for dynamics simulations. +minimization across all the replicas. The mimimizer uses whatever +timestep you have defined in your input script, via the +"timestep"_timestep.html command. Often NEB will converge more +quickly if you use a timestep about 10x larger than you would normally +use for dynamics simulations. -When a NEB calculation is performed, it is assumed that each replica is running -the same system, though LAMMPS does not check for this. I.e. the simulation -domain, the number of atoms, the interaction potentials, and the starting -configuration when the neb command is issued should be the same for every -replica. +When a NEB calculation is performed, it is assumed that each replica +is running the same system, though LAMMPS does not check for this. +I.e. the simulation domain, the number of atoms, the interaction +potentials, and the starting configuration when the neb command is +issued should be the same for every replica. In a NEB calculation each replica is connected to other replicas by inter-replica nudging forces. These forces are imposed by the "fix -neb"_fix_neb.html command, which must be used in conjunction with the neb -command. The group used to define the fix neb command defines the NEB atoms -which are the only ones that inter-replica springs are applied to. If the group -does not include all atoms, then non-NEB atoms have no inter-replica springs and -the forces they feel and their motion is computed in the usual way due only to -other atoms within their replica. Conceptually, the non-NEB atoms provide a -background force field for the NEB atoms. They can be allowed to move during -the NEB minimization procedure (which will typically induce different -coordinates for non-NEB atoms in different replicas), or held fixed using other -LAMMPS commands such as "fix setforce"_fix_setforce.html. Note that the -"partition"_partition.html command can be used to invoke a command on a subset -of the replicas, e.g. if you wish to hold NEB or non-NEB atoms fixed in only the -end-point replicas. +neb"_fix_neb.html command, which must be used in conjunction with the +neb command. The group used to define the fix neb command defines the +NEB atoms which are the only ones that inter-replica springs are +applied to. If the group does not include all atoms, then non-NEB +atoms have no inter-replica springs and the forces they feel and their +motion is computed in the usual way due only to other atoms within +their replica. Conceptually, the non-NEB atoms provide a background +force field for the NEB atoms. They can be allowed to move during the +NEB minimization procedure (which will typically induce different +coordinates for non-NEB atoms in different replicas), or held fixed +using other LAMMPS commands such as "fix setforce"_fix_setforce.html. +Note that the "partition"_partition.html command can be used to invoke +a command on a subset of the replicas, e.g. if you wish to hold NEB or +non-NEB atoms fixed in only the end-point replicas. -The initial atomic configuration for each of the replicas can be specified in -different manners via the {file-style} setting, as discussed below. Only atoms -whose initial coordinates should differ from the current configuration need be -specified. +The initial atomic configuration for each of the replicas can be +specified in different manners via the {file-style} setting, as +discussed below. Only atoms whose initial coordinates should differ +from the current configuration need be specified. -Conceptually, the initial and final configurations for the first replica should -be states on either side of an energy barrier. +Conceptually, the initial and final configurations for the first +replica should be states on either side of an energy barrier. -As explained below, the initial configurations of intermediate replicas can be -atomic coordinates interpolated in a linear fashion between the first and last -replicas. This is often adequate for simple transitions. For more complex -transitions, it may lead to slow convergence or even bad results if the minimum -energy path (MEP, see below) of states over the barrier cannot be correctly -converged to from such an initial path. In this case, you will want to generate -initial states for the intermediate replicas that are geometrically closer to -the MEP and read them in. +As explained below, the initial configurations of intermediate +replicas can be atomic coordinates interpolated in a linear fashion +between the first and last replicas. This is often adequate for +simple transitions. For more complex transitions, it may lead to slow +convergence or even bad results if the minimum energy path (MEP, see +below) of states over the barrier cannot be correctly converged to +from such an initial path. In this case, you will want to generate +initial states for the intermediate replicas that are geometrically +closer to the MEP and read them in. :line -For a {file-style} setting of {final}, a filename is specified which contains -atomic coordinates for zero or more atoms, in the format described below. For -each atom that appears in the file, the new coordinates are assigned to that -atom in the final replica. Each intermediate replica also assigns a new -position to that atom in an interpolated manner. This is done by using the -current position of the atom as the starting point and the read-in position as -the final point. The distance between them is calculated, and the new position -is assigned to be a fraction of the distance. E.g. if there are 10 replicas, -the 2nd replica will assign a position that is 10% of the distance along a line -between the starting and final point, and the 9th replica will assign a position -that is 90% of the distance along the line. Note that for this procedure to -produce consistent coordinates across all the replicas, the current coordinates -need to be the same in all replicas. LAMMPS does not check for this, but -invalid initial configurations will likely result if it is not the case. +For a {file-style} setting of {final}, a filename is specified which +contains atomic coordinates for zero or more atoms, in the format +described below. For each atom that appears in the file, the new +coordinates are assigned to that atom in the final replica. Each +intermediate replica also assigns a new position to that atom in an +interpolated manner. This is done by using the current position of +the atom as the starting point and the read-in position as the final +point. The distance between them is calculated, and the new position +is assigned to be a fraction of the distance. E.g. if there are 10 +replicas, the 2nd replica will assign a position that is 10% of the +distance along a line between the starting and final point, and the +9th replica will assign a position that is 90% of the distance along +the line. Note that for this procedure to produce consistent +coordinates across all the replicas, the current coordinates need to +be the same in all replicas. LAMMPS does not check for this, but +invalid initial configurations will likely result if it is not the +case. -NOTE: The "distance" between the starting and final point is calculated in a -minimum-image sense for a periodic simulation box. This means that if the two -positions are on opposite sides of a box (periodic in that dimension), the -distance between them will be small, because the periodic image of one of the -atoms is close to the other. Similarly, even if the assigned position resulting -from the interpolation is outside the periodic box, the atom will be wrapped +NOTE: The "distance" between the starting and final point is +calculated in a minimum-image sense for a periodic simulation box. +This means that if the two positions are on opposite sides of a box +(periodic in that dimension), the distance between them will be small, +because the periodic image of one of the atoms is close to the other. +Similarly, even if the assigned position resulting from the +interpolation is outside the periodic box, the atom will be wrapped back into the box when the NEB calculation begins. -For a {file-style} setting of {each}, a filename is specified which is assumed -to be unique to each replica. This can be done by using a variable in the -filename, e.g. +For a {file-style} setting of {each}, a filename is specified which is +assumed to be unique to each replica. This can be done by using a +variable in the filename, e.g. -variable i equal part neb 0.0 0.001 1000 500 50 each coords.initial.$i :pre +variable i equal part +neb 0.0 0.001 1000 500 50 each coords.initial.$i :pre -which in this case will substitute the partition ID (0 to N-1) for the variable -I, which is also effectively the replica ID. See the "variable"_variable.html -command for other options, such as using world-, universe-, or uloop-style -variables. +which in this case will substitute the partition ID (0 to N-1) for the +variable I, which is also effectively the replica ID. See the +"variable"_variable.html command for other options, such as using +world-, universe-, or uloop-style variables. -Each replica (except the first replica) will read its file, formatted as -described below, and for any atom that appears in the file, assign the specified -coordinates to this atom. The various files do not need to contain the same set -of atoms. +Each replica (except the first replica) will read its file, formatted +as described below, and for any atom that appears in the file, assign +the specified coordinates to this atom. The various files do not need +to contain the same set of atoms. -For a {file-style} setting of {none}, no filename is specified. Each replica is -assumed to already be in its initial configuration at the time the neb command -is issued. This allows each replica to define its own configuration by reading -a replica-specific data or restart or dump file, via the -"read_data"_read_data.html, "read_restart"_read_restart.html, or -"read_dump"_read_dump.html commands. The replica-specific names of these files -can be specified as in the discussion above for the {each} file-style. Also see -the section below for how a NEB calculation can produce restart files, so that a -long calculation can be restarted if needed. +For a {file-style} setting of {none}, no filename is specified. Each +replica is assumed to already be in its initial configuration at the +time the neb command is issued. This allows each replica to define +its own configuration by reading a replica-specific data or restart or +dump file, via the "read_data"_read_data.html, +"read_restart"_read_restart.html, or "read_dump"_read_dump.html +commands. The replica-specific names of these files can be specified +as in the discussion above for the {each} file-style. Also see the +section below for how a NEB calculation can produce restart files, so +that a long calculation can be restarted if needed. -NOTE: None of the {file-style} settings change the initial configuration of any -atom in the first replica. The first replica must thus be in the correct -initial configuration at the time the neb command is issued. +NOTE: None of the {file-style} settings change the initial +configuration of any atom in the first replica. The first replica +must thus be in the correct initial configuration at the time the neb +command is issued. :line -A NEB calculation proceeds in two stages, each of which is a minimization -procedure, performed via damped dynamics. To enable this, you must first define -a damped dynamics "min_style"_min_style.html, such as {quickmin} or {fire}. The -{cg}, {sd}, and {hftn} styles cannot be used, since they perform iterative line -searches in their inner loop, which cannot be easily synchronized across -multiple replicas. +A NEB calculation proceeds in two stages, each of which is a +minimization procedure, performed via damped dynamics. To enable +this, you must first define a damped dynamics +"min_style"_min_style.html, such as {quickmin} or {fire}. The {cg}, +{sd}, and {hftn} styles cannot be used, since they perform iterative +line searches in their inner loop, which cannot be easily synchronized +across multiple replicas. -The minimizer tolerances for energy and force are set by {etol} and {ftol}, the -same as for the "minimize"_minimize.html command. +The minimizer tolerances for energy and force are set by {etol} and +{ftol}, the same as for the "minimize"_minimize.html command. -A non-zero {etol} means that the NEB calculation will terminate if the energy -criterion is met by every replica. The energies being compared to {etol} do not -include any contribution from the inter-replica nudging forces, since these are -non-conservative. A non-zero {ftol} means that the NEB calculation will -terminate if the force criterion is met by every replica. The forces being -compared to {ftol} include the inter-replica nudging forces. +A non-zero {etol} means that the NEB calculation will terminate if the +energy criterion is met by every replica. The energies being compared +to {etol} do not include any contribution from the inter-replica +nudging forces, since these are non-conservative. A non-zero {ftol} +means that the NEB calculation will terminate if the force criterion +is met by every replica. The forces being compared to {ftol} include +the inter-replica nudging forces. -The maximum number of iterations in each stage is set by {N1} and {N2}. These -are effectively timestep counts since each iteration of damped dynamics is like -a single timestep in a dynamics "run"_run.html. During both stages, the -potential energy of each replica and its normalized distance along the reaction -path (reaction coordinate RD) will be printed to the screen and log file every -{Nevery} timesteps. The RD is 0 and 1 for the first and last replica. For -intermediate replicas, it is the cumulative distance (normalized by the total -cumulative distance) between adjacent replicas, where "distance" is defined as -the length of the 3N-vector of differences in atomic coordinates, where N is the -number of NEB atoms involved in the transition. These outputs allow you to -monitor NEB's progress in finding a good energy barrier. {N1} and {N2} must -both be multiples of {Nevery}. +The maximum number of iterations in each stage is set by {N1} and +{N2}. These are effectively timestep counts since each iteration of +damped dynamics is like a single timestep in a dynamics +"run"_run.html. During both stages, the potential energy of each +replica and its normalized distance along the reaction path (reaction +coordinate RD) will be printed to the screen and log file every +{Nevery} timesteps. The RD is 0 and 1 for the first and last replica. +For intermediate replicas, it is the cumulative distance (normalized +by the total cumulative distance) between adjacent replicas, where +"distance" is defined as the length of the 3N-vector of differences in +atomic coordinates, where N is the number of NEB atoms involved in the +transition. These outputs allow you to monitor NEB's progress in +finding a good energy barrier. {N1} and {N2} must both be multiples +of {Nevery}. -In the first stage of NEB, the set of replicas should converge toward a minimum -energy path (MEP) of conformational states that transition over a barrier. The -MEP for a transition is defined as a sequence of 3N-dimensional states, each of -which has a potential energy gradient parallel to the MEP itself. The -configuration of highest energy along a MEP corresponds to a saddle point. The -replica states will also be roughly equally spaced along the MEP due to the -inter-replica nugding force added by the "fix neb"_fix_neb.html command. +In the first stage of NEB, the set of replicas should converge toward +a minimum energy path (MEP) of conformational states that transition +over a barrier. The MEP for a transition is defined as a sequence of +3N-dimensional states, each of which has a potential energy gradient +parallel to the MEP itself. The configuration of highest energy along +a MEP corresponds to a saddle point. The replica states will also be +roughly equally spaced along the MEP due to the inter-replica nugding +force added by the "fix neb"_fix_neb.html command. -In the second stage of NEB, the replica with the highest energy is selected and -the inter-replica forces on it are converted to a force that drives its atom -coordinates to the top or saddle point of the barrier, via the barrier-climbing -calculation described in "(HenkelmanB)"_#HenkelmanB. As before, the other -replicas rearrange themselves along the MEP so as to be roughly equally spaced. +In the second stage of NEB, the replica with the highest energy is +selected and the inter-replica forces on it are converted to a force +that drives its atom coordinates to the top or saddle point of the +barrier, via the barrier-climbing calculation described in +"(HenkelmanB)"_#HenkelmanB. As before, the other replicas rearrange +themselves along the MEP so as to be roughly equally spaced. -When both stages are complete, if the NEB calculation was successful, the -configurations of the replicas should be along (close to) the MEP and the -replica with the highest energy should be an atomic configuration at (close to) -the saddle point of the transition. The potential energies for the set of -replicas represents the energy profile of the transition along the MEP. +When both stages are complete, if the NEB calculation was successful, +the configurations of the replicas should be along (close to) the MEP +and the replica with the highest energy should be an atomic +configuration at (close to) the saddle point of the transition. The +potential energies for the set of replicas represents the energy +profile of the transition along the MEP. :line -A few other settings in your input script are required or advised to perform a -NEB calculation. See the NOTE about the choice of timestep at the beginning of -this doc page. +A few other settings in your input script are required or advised to +perform a NEB calculation. See the NOTE about the choice of timestep +at the beginning of this doc page. An atom map must be defined which it is not by default for "atom_style -atomic"_atom_style.html problems. The "atom_modify map"_atom_modify.html -command can be used to do this. +atomic"_atom_style.html problems. The "atom_modify +map"_atom_modify.html command can be used to do this. -The minimizers in LAMMPS operate on all atoms in your system, even non-NEB -atoms, as defined above. To prevent non-NEB atoms from moving during the -minimization, you should use the "fix setforce"_fix_setforce.html command to set -the force on each of those atoms to 0.0. This is not required, and may not even -be desired in some cases, but if those atoms move too far (e.g. because the -initial state of your system was not well-minimized), it can cause problems for -the NEB procedure. +The minimizers in LAMMPS operate on all atoms in your system, even +non-NEB atoms, as defined above. To prevent non-NEB atoms from moving +during the minimization, you should use the "fix +setforce"_fix_setforce.html command to set the force on each of those +atoms to 0.0. This is not required, and may not even be desired in +some cases, but if those atoms move too far (e.g. because the initial +state of your system was not well-minimized), it can cause problems +for the NEB procedure. -The damped dynamics "minimizers"_min_style.html, such as {quickmin} and {fire}), -adjust the position and velocity of the atoms via an Euler integration step. -Thus you must define an appropriate "timestep"_timestep.html to use with NEB. -As mentioned above, NEB will often converge more quickly if you use a timestep -about 10x larger than you would normally use for dynamics simulations. +The damped dynamics "minimizers"_min_style.html, such as {quickmin} +and {fire}), adjust the position and velocity of the atoms via an +Euler integration step. Thus you must define an appropriate +"timestep"_timestep.html to use with NEB. As mentioned above, NEB +will often converge more quickly if you use a timestep about 10x +larger than you would normally use for dynamics simulations. :line -Each file read by the neb command containing atomic coordinates used to -initialize one or more replicas must be formatted as follows. +Each file read by the neb command containing atomic coordinates used +to initialize one or more replicas must be formatted as follows. -The file can be ASCII text or a gzipped text file (detected by a .gz suffix). -The file can contain initial blank lines or comment lines starting with "#" -which are ignored. The first non-blank, non-comment line should list N = the -number of lines to follow. The N successive lines contain the following -information: +The file can be ASCII text or a gzipped text file (detected by a .gz +suffix). The file can contain initial blank lines or comment lines +starting with "#" which are ignored. The first non-blank, non-comment +line should list N = the number of lines to follow. The N successive +lines contain the following information: -ID1 x1 y1 z1 ID2 x2 y2 z2 ... IDN xN yN zN :pre +ID1 x1 y1 z1 +ID2 x2 y2 z2 +... +IDN xN yN zN :pre -The fields are the atom ID, followed by the x,y,z coordinates. The lines can be -listed in any order. Additional trailing information on the line is OK, such as -a comment. +The fields are the atom ID, followed by the x,y,z coordinates. The +lines can be listed in any order. Additional trailing information on +the line is OK, such as a comment. -Note that for a typical NEB calculation you do not need to specify initial -coordinates for very many atoms to produce differing starting and final replicas -whose intermediate replicas will converge to the energy barrier. Typically only -new coordinates for atoms geometrically near the barrier need be specified. +Note that for a typical NEB calculation you do not need to specify +initial coordinates for very many atoms to produce differing starting +and final replicas whose intermediate replicas will converge to the +energy barrier. Typically only new coordinates for atoms +geometrically near the barrier need be specified. -Also note there is no requirement that the atoms in the file correspond to the -NEB atoms in the group defined by the "fix neb"_fix_neb.html command. Not every -NEB atom need be in the file, and non-NEB atoms can be listed in the file. +Also note there is no requirement that the atoms in the file +correspond to the NEB atoms in the group defined by the "fix +neb"_fix_neb.html command. Not every NEB atom need be in the file, +and non-NEB atoms can be listed in the file. :line -Four kinds of output can be generated during a NEB calculation: energy barrier -statistics, thermodynamic output by each replica, dump files, and restart files. +Four kinds of output can be generated during a NEB calculation: energy +barrier statistics, thermodynamic output by each replica, dump files, +and restart files. -When running with multiple partitions (each of which is a replica in this case), -the print-out to the screen and master log.lammps file contains a line of -output, printed once every {Nevery} timesteps. It contains the timestep, the -maximum force per replica, the maximum force per atom (in any replica), -potential gradients in the initial, final, and climbing replicas, the forward -and backward energy barriers, the total reaction coordinate (RDT), and the -normalized reaction coordinate and potential energy of each replica. +When running with multiple partitions (each of which is a replica in +this case), the print-out to the screen and master log.lammps file +contains a line of output, printed once every {Nevery} timesteps. It +contains the timestep, the maximum force per replica, the maximum +force per atom (in any replica), potential gradients in the initial, +final, and climbing replicas, the forward and backward energy +barriers, the total reaction coordinate (RDT), and the normalized +reaction coordinate and potential energy of each replica. -The "maximum force per replica" is the two-norm of the 3N-length force vector -for the atoms in each replica, maximized across replicas, which is what the -{ftol} setting is checking against. In this case, N is all the atoms in each -replica. The "maximum force per atom" is the maximum force component of any -atom in any replica. The potential gradients are the two-norm of the 3N-length -force vector solely due to the interaction potential i.e. without adding in -inter-replica forces. +The "maximum force per replica" is the two-norm of the 3N-length force +vector for the atoms in each replica, maximized across replicas, which +is what the {ftol} setting is checking against. In this case, N is +all the atoms in each replica. The "maximum force per atom" is the +maximum force component of any atom in any replica. The potential +gradients are the two-norm of the 3N-length force vector solely due to +the interaction potential i.e. without adding in inter-replica +forces. -The "reaction coordinate" (RD) for each replica is the two-norm of the 3N-length -vector of distances between its atoms and the preceding replica's atoms, added -to the RD of the preceding replica. The RD of the first replica RD1 = 0.0; the -RD of the final replica RDN = RDT, the total reaction coordinate. The -normalized RDs are divided by RDT, so that they form a monotonically increasing -sequence from zero to one. When computing RD, N only includes the atoms being -operated on by the fix neb command. +The "reaction coordinate" (RD) for each replica is the two-norm of the +3N-length vector of distances between its atoms and the preceding +replica's atoms, added to the RD of the preceding replica. The RD of +the first replica RD1 = 0.0; the RD of the final replica RDN = RDT, +the total reaction coordinate. The normalized RDs are divided by RDT, +so that they form a monotonically increasing sequence from zero to +one. When computing RD, N only includes the atoms being operated on by +the fix neb command. -The forward (reverse) energy barrier is the potential energy of the highest -replica minus the energy of the first (last) replica. +The forward (reverse) energy barrier is the potential energy of the +highest replica minus the energy of the first (last) replica. -Supplementary informations for all replicas can be printed out to the screen and -master log.lammps file by adding the verbose keyword. These informations include -the following. The "path angle" (pathangle) for the replica i which is the -angle between the 3N-length vectors (Ri-1 - Ri) and (Ri+1 - Ri) (where Ri is the -atomic coordinates of replica i). A "path angle" of 180 indicates that replicas -i-1, i and i+1 are aligned. "angletangrad" is the angle between the 3N-length -tangent vector and the 3N-length force vector at image i. The tangent vector is -calculated as in "(HenkelmanA)"_#HenkelmanA for all intermediate replicas and at -R2 - R1 and RM - RM-1 for the first and last replica, respectively. "anglegrad" -is the angle between the 3N-length energy gradient vector of replica i and that -of replica i+1. It is not defined for the final replica and reads nan. gradV is -the norm of the energy gradient of image i. ReplicaForce is the two-norm of the -3N-length force vector (including nudging forces) for replica i. MaxAtomForce -is the maximum force component of any atom in replica i. +Supplementary informations for all replicas can be printed out to the +screen and master log.lammps file by adding the verbose keyword. These +informations include the following. The "path angle" (pathangle) for +the replica i which is the angle between the 3N-length vectors (Ri-1 - +Ri) and (Ri+1 - Ri) (where Ri is the atomic coordinates of replica +i). A "path angle" of 180 indicates that replicas i-1, i and i+1 are +aligned. "angletangrad" is the angle between the 3N-length tangent +vector and the 3N-length force vector at image i. The tangent vector +is calculated as in "(HenkelmanA)"_#HenkelmanA for all intermediate +replicas and at R2 - R1 and RM - RM-1 for the first and last replica, +respectively. "anglegrad" is the angle between the 3N-length energy +gradient vector of replica i and that of replica i+1. It is not +defined for the final replica and reads nan. gradV is the norm of the +energy gradient of image i. ReplicaForce is the two-norm of the +3N-length force vector (including nudging forces) for replica i. +MaxAtomForce is the maximum force component of any atom in replica i. When a NEB calculation does not converge properly, these suplementary -informations can help understanding what is going wrong. For instance when the -path angle becomes accute the definition of tangent used in the NEB calculation -is questionable and the NEB cannot may diverge "(Maras)"_#Maras. +informations can help understanding what is going wrong. For instance +when the path angle becomes accute the definition of tangent used in +the NEB calculation is questionable and the NEB cannot may diverge +"(Maras)"_#Maras2. -When running on multiple partitions, LAMMPS produces additional log files for -each partition, e.g. log.lammps.0, log.lammps.1, etc. For a NEB calculation, -these contain the thermodynamic output for each replica. +When running on multiple partitions, LAMMPS produces additional log +files for each partition, e.g. log.lammps.0, log.lammps.1, etc. For a +NEB calculation, these contain the thermodynamic output for each +replica. -If "dump"_dump.html commands in the input script define a filename that includes -a {universe} or {uloop} style "variable"_variable.html, then one dump file (per -dump command) will be created for each replica. At the end of the NEB -calculation, the final snapshot in each file will contain the sequence of -snapshots that transition the system over the energy barrier. Earlier snapshots -will show the convergence of the replicas to the MEP. +If "dump"_dump.html commands in the input script define a filename +that includes a {universe} or {uloop} style "variable"_variable.html, +then one dump file (per dump command) will be created for each +replica. At the end of the NEB calculation, the final snapshot in +each file will contain the sequence of snapshots that transition the +system over the energy barrier. Earlier snapshots will show the +convergence of the replicas to the MEP. -Likewise, "restart"_restart.html filenames can be specified with a {universe} or -{uloop} style "variable"_variable.html, to generate restart files for each -replica. These may be useful if the NEB calculation fails to converge properly -to the MEP, and you wish to restart the calculation from an intermediate point -with altered parameters. +Likewise, "restart"_restart.html filenames can be specified with a +{universe} or {uloop} style "variable"_variable.html, to generate +restart files for each replica. These may be useful if the NEB +calculation fails to converge properly to the MEP, and you wish to +restart the calculation from an intermediate point with altered +parameters. There are 2 Python scripts provided in the tools/python directory, -neb_combine.py and neb_final.py, which are useful in analyzing output from a NEB -calculation. Assume a NEB simulation with M replicas, and the NEB atoms labeled -with a specific atom type. +neb_combine.py and neb_final.py, which are useful in analyzing output +from a NEB calculation. Assume a NEB simulation with M replicas, and +the NEB atoms labeled with a specific atom type. -The neb_combine.py script extracts atom coords for the NEB atoms from all M dump -files and creates a single dump file where each snapshot contains the NEB atoms -from all the replicas and one copy of non-NEB atoms from the first replica -(presumed to be identical in other replicas). This can be visualized/animated -to see how the NEB atoms relax as the NEB calculation proceeds. +The neb_combine.py script extracts atom coords for the NEB atoms from +all M dump files and creates a single dump file where each snapshot +contains the NEB atoms from all the replicas and one copy of non-NEB +atoms from the first replica (presumed to be identical in other +replicas). This can be visualized/animated to see how the NEB atoms +relax as the NEB calculation proceeds. -The neb_final.py script extracts the final snapshot from each of the M dump -files to create a single dump file with M snapshots. This can be visualized to -watch the system make its transition over the energy barrier. +The neb_final.py script extracts the final snapshot from each of the M +dump files to create a single dump file with M snapshots. This can be +visualized to watch the system make its transition over the energy +barrier. To illustrate, here are images from the final snapshot produced by the -neb_combine.py script run on the dump files produced by the two example input -scripts in examples/neb. Click on them to see a larger image. +neb_combine.py script run on the dump files produced by the two +example input scripts in examples/neb. Click on them to see a larger +image. -:image(JPG/hop1_small.jpg,JPG/hop1.jpg) :image(JPG/hop2_small.jpg,JPG/hop2.jpg) +:image(JPG/hop1_small.jpg,JPG/hop1.jpg) +:image(JPG/hop2_small.jpg,JPG/hop2.jpg) :line [Restrictions:] -This command can only be used if LAMMPS was built with the REPLICA package. See -the "Making LAMMPS"_Section_start.html#start_3 section for more info on -packages. - -:line [Related commands:] - -"prd"_prd.html, "temper"_temper.html, "fix langevin"_fix_langevin.html, "fix -viscous"_fix_viscous.html - -[Default:] none +This command can only be used if LAMMPS was built with the REPLICA +package. See the "Making LAMMPS"_Section_start.html#start_3 section +for more info on packages. :line -:link(HenkelmanA) [(HenkelmanA)] Henkelman and Jonsson, J Chem Phys, 113, -9978-9985 (2000). +[Related commands:] -:link(HenkelmanB) [(HenkelmanB)] Henkelman, Uberuaga, Jonsson, J Chem Phys, 113, +"prd"_prd.html, "temper"_temper.html, "fix langevin"_fix_langevin.html, +"fix viscous"_fix_viscous.html + +[Default:] + +none + +:line + +:link(HenkelmanA) +[(HenkelmanA)] Henkelman and Jonsson, J Chem Phys, 113, 9978-9985 (2000). + +:link(HenkelmanB) +[(HenkelmanB)] Henkelman, Uberuaga, Jonsson, J Chem Phys, 113, 9901-9904 (2000). -:link(Nakano3) [(Nakano)] Nakano, Comp Phys Comm, 178, 280-289 (2008). +:link(Nakano3) +[(Nakano)] Nakano, Comp Phys Comm, 178, 280-289 (2008). -:link(Maras) [(Maras)] Maras, Trushin, Stukowski, Ala-Nissila, Jonsson, Comp -Phys Comm, 205, 13-21 (2016) +:link(Maras2) +[(Maras)] Maras, Trushin, Stukowski, Ala-Nissila, Jonsson, +Comp Phys Comm, 205, 13-21 (2016) From aca16745e4cce43bb29e0473ec8f2c3676f13e67 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 19 May 2017 12:17:19 -0400 Subject: [PATCH 064/302] restore spelling fix and semantic fix from upstream --- doc/src/neb.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/neb.txt b/doc/src/neb.txt index 294bbdeb09..a4afc2fe6d 100644 --- a/doc/src/neb.txt +++ b/doc/src/neb.txt @@ -61,7 +61,7 @@ would see with one or more physical processors per replica. See discussion. NOTE: As explained below, a NEB calculation perfoms a damped dynamics -minimization across all the replicas. The mimimizer uses whatever +minimization across all the replicas. The minimizer uses whatever timestep you have defined in your input script, via the "timestep"_timestep.html command. Often NEB will converge more quickly if you use a timestep about 10x larger than you would normally @@ -151,7 +151,7 @@ world-, universe-, or uloop-style variables. Each replica (except the first replica) will read its file, formatted as described below, and for any atom that appears in the file, assign -the specified coordinates to this atom. The various files do not need +the specified coordinates to its atom. The various files do not need to contain the same set of atoms. For a {file-style} setting of {none}, no filename is specified. Each From c2bf3269acf4893be8ac7896c21561c90ff51ac8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 19 May 2017 15:02:29 -0400 Subject: [PATCH 065/302] formatting cleanup. combine 8 MPI_Allreduce() calls into 1 --- src/REPLICA/fix_neb.cpp | 602 +++++++++++++++++----------------------- src/REPLICA/fix_neb.h | 9 +- src/REPLICA/neb.cpp | 14 +- src/REPLICA/neb.h | 4 +- 4 files changed, 263 insertions(+), 366 deletions(-) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index fed2934b70..23b9297017 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -37,54 +37,58 @@ enum{SINGLE_PROC_DIRECT,SINGLE_PROC_MAP,MULTI_PROC}; /* ---------------------------------------------------------------------- */ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), id_pe(NULL), pe(NULL), xprev(NULL), xnext(NULL), fnext(NULL), - tangent(NULL),springF(NULL), xsend(NULL), xrecv(NULL),fsend(NULL),frecv(NULL), tagsend(NULL), tagrecv(NULL), xsendall(NULL), xrecvall(NULL),fsendall(NULL), frecvall(NULL), tagsendall(NULL), tagrecvall(NULL), counts(NULL), displacements(NULL),nlenall(NULL) + Fix(lmp, narg, arg), + id_pe(NULL), pe(NULL), xprev(NULL), xnext(NULL), fnext(NULL), + tangent(NULL), springF(NULL), xsend(NULL), xrecv(NULL), + fsend(NULL), frecv(NULL), tagsend(NULL), tagrecv(NULL), + xsendall(NULL), xrecvall(NULL), fsendall(NULL), frecvall(NULL), + tagsendall(NULL), tagrecvall(NULL), counts(NULL), + displacements(NULL),nlenall(NULL) { - StandardNEB=false; - NEBLongRange=true; - PerpSpring=false; - FreeEndIni=false; - FreeEndFinal=false; - FreeEndFinalWithRespToEIni =false; - FinalAndInterWithRespToEIni = false; - kspringPerp=0; - if (narg < 4) error->all(FLERR,"Illegal fix neb command, argument missing"); + StandardNEB=NEBLongRange=PerpSpring=FreeEndIni=FreeEndFinal=false; + FreeEndFinalWithRespToEIni=FinalAndInterWithRespToEIni=false; + + kspringPerp=0.0; + + if (narg < 4) + error->all(FLERR,"Illegal fix neb command, argument missing"); kspring = force->numeric(FLERR,arg[3]); - if (kspring <= 0.0) error->all(FLERR,"Illegal fix neb command. The spring force was not provided properly"); + if (kspring <= 0.0) + error->all(FLERR,"Illegal fix neb command." + " The spring force was not provided properly"); int iarg =4; - while (iarg < narg){ - if (strcmp (arg[iarg],"idealpos")==0){ + while (iarg < narg) { + if (strcmp (arg[iarg],"idealpos")==0) { NEBLongRange = true; - iarg+=1;} - else if (strcmp (arg[iarg],"neigh")==0){ + iarg+=1; + } else if (strcmp (arg[iarg],"neigh")==0) { NEBLongRange = false; StandardNEB = true; - iarg+=1;} - else if (strcmp (arg[iarg],"perp")==0){ + iarg+=1; + } else if (strcmp (arg[iarg],"perp")==0) { PerpSpring=true; kspringPerp = force->numeric(FLERR,arg[iarg+1]); - if (kspringPerp < 0.0) error->all(FLERR,"Illegal fix neb command. The perpendicular spring force was not provided properly"); + if (kspringPerp < 0.0) + error->all(FLERR,"Illegal fix neb command. " + "The perpendicular spring force was not provided properly"); iarg+=2; - } - else if (strcmp (arg[iarg],"freeend")==0){ + } else if (strcmp (arg[iarg],"freeend")==0) { if (strcmp (arg[iarg+1],"ini")==0) FreeEndIni=true; else if (strcmp (arg[iarg+1],"final")==0) FreeEndFinal=true; - else if (strcmp (arg[iarg+1],"final")==0) - FreeEndFinal=true; else if (strcmp (arg[iarg+1],"finaleini")==0) - FreeEndFinalWithRespToEIni=true; - else if (strcmp (arg[iarg+1],"final2eini")==0){ + FreeEndFinalWithRespToEIni=true; + else if (strcmp (arg[iarg+1],"final2eini")==0) { FinalAndInterWithRespToEIni=true; FreeEndFinalWithRespToEIni=true;} - iarg+=2;} - else {error->all(FLERR,"Illegal fix neb command. Unknown keyword");} - } + iarg+=2; + } else error->all(FLERR,"Illegal fix neb command. Unknown keyword"); + } // nreplica = number of partitions // ireplica = which world I am in universe @@ -99,16 +103,20 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : nreplica = universe->nworlds; ireplica = universe->iworld; - if (ireplica > 0) procprev = universe->root_proc[ireplica-1]; + if (ireplica > 0) + procprev = universe->root_proc[ireplica-1]; else procprev = -1; - if (ireplica < nreplica-1) procnext = universe->root_proc[ireplica+1]; + + if (ireplica < nreplica-1) + procnext = universe->root_proc[ireplica+1]; else procnext = -1; + uworld = universe->uworld; int *iroots = new int[nreplica]; MPI_Group uworldgroup,rootgroup; - if (NEBLongRange ){ - for (int iIm =0; iIm < nreplica;iIm++){ - iroots[iIm]=universe->root_proc[iIm];} + if (NEBLongRange) { + for (int iIm =0; iIm < nreplica;iIm++) + iroots[iIm]=universe->root_proc[iIm]; MPI_Comm_group(uworld, &uworldgroup); MPI_Group_incl(uworldgroup, nreplica, iroots, &rootgroup); // MPI_Comm_create_group(uworld, rootgroup, 0, &rootworld); @@ -133,20 +141,6 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : maxlocal = 0; ntotal = 0; - - xprev = xnext = tangent = springF= NULL; - fnext = NULL; - xsend = xrecv = NULL; - fsend = frecv = NULL; - tagsend = tagrecv = NULL; - xsendall = xrecvall = NULL; - fsendall = frecvall = NULL; - tagsendall = tagrecvall = NULL; - counts = displacements = NULL; - - - if (NEBLongRange) - {nlenall=NULL;} } /* ---------------------------------------------------------------------- */ @@ -204,7 +198,6 @@ void FixNEB::init() rclimber = -1; - // nebatoms = # of atoms in fix group = atoms with inter-replica forces bigint count = group->count(igroup); @@ -236,11 +229,6 @@ void FixNEB::init() memory->create(counts,nprocs,"neb:counts"); memory->create(displacements,nprocs,"neb:displacements"); } - - - - - } /* ---------------------------------------------------------------------- */ @@ -261,8 +249,6 @@ void FixNEB::min_post_force(int vflag) double vprev,vnext,vmax,vmin; double delxp,delyp,delzp,delxn,delyn,delzn; double delta1[3],delta2[3]; - MPI_Status status; - MPI_Request request; double vIni =0.0; vprev=vnext=veng = pe->compute_scalar(); @@ -270,42 +256,42 @@ void FixNEB::min_post_force(int vflag) if (ireplica < nreplica-1 && me ==0) MPI_Send(&veng,1,MPI_DOUBLE,procnext,0,uworld); if (ireplica > 0 && me ==0) - MPI_Recv(&vprev,1,MPI_DOUBLE,procprev,0,uworld,&status); + MPI_Recv(&vprev,1,MPI_DOUBLE,procprev,0,uworld,MPI_STATUS_IGNORE); if (ireplica > 0 && me == 0) MPI_Send(&veng,1,MPI_DOUBLE,procprev,0,uworld); if (ireplica < nreplica-1 && me == 0) - MPI_Recv(&vnext,1,MPI_DOUBLE,procnext,0,uworld,&status); + MPI_Recv(&vnext,1,MPI_DOUBLE,procnext,0,uworld,MPI_STATUS_IGNORE); if (cmode == MULTI_PROC) { MPI_Bcast(&vprev,1,MPI_DOUBLE,0,world); MPI_Bcast(&vnext,1,MPI_DOUBLE,0,world); } - if (FreeEndFinal){ - if (update->ntimestep==0){EFinalIni = veng;} + if (FreeEndFinal) { + if (update->ntimestep == 0) {EFinalIni = veng;} } - if (ireplica==0) + if (ireplica == 0) vIni=veng; - if (FreeEndFinalWithRespToEIni ){ - if ( me ==0){ + if (FreeEndFinalWithRespToEIni) { + if (me == 0) { int procFirst; procFirst=universe->root_proc[0]; - MPI_Bcast(&vIni,1,MPI_DOUBLE,procFirst,uworld); //MPI_Recv(&vIni,1,MPI_DOUBLE,procFirst,0,uworld,&status); + MPI_Bcast(&vIni,1,MPI_DOUBLE,procFirst,uworld); } if (cmode == MULTI_PROC) { MPI_Bcast(&vIni,1,MPI_DOUBLE,0,world); } } - if (FreeEndIni && ireplica==0 ){ - if (me == 0 ) - if (update->ntimestep==0){ - EIniIni = veng; - if (cmode == MULTI_PROC) - MPI_Bcast(&EIniIni,1,MPI_DOUBLE,0,world); - } - } + if (FreeEndIni && ireplica == 0) { + if (me == 0 ) + if (update->ntimestep == 0) { + EIniIni = veng; + if (cmode == MULTI_PROC) + MPI_Bcast(&EIniIni,1,MPI_DOUBLE,0,world); + } + } // communicate atoms to/from adjacent replicas to fill xprev,xnext inter_replica_comm(); @@ -314,39 +300,6 @@ void FixNEB::min_post_force(int vflag) pe->addstep(update->ntimestep+1); - /* ALL THIS SHOULD BE DONE IN inter_replica_comm() - // xprev,xnext = atom coords of adjacent replicas - // assume order of atoms in all replicas is the same - // check that number of atoms hasn't changed - - double **x = atom->x; - int *mask = atom->mask; - int nlocal = atom->nlocal; - double dot = 0.0; - double prefactor; - - if (nlocal != nebatoms) error->one(FLERR,"Atom count changed in fix neb"); - - if (ireplica > 0) - MPI_Irecv(xprev[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld,&request); - if (ireplica < nreplica-1) - MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld); - if (ireplica > 0) MPI_Wait(&request,&status); - - - - - if (ireplica < nreplica-1) - MPI_Irecv(xnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); - if (ireplica > 0) - MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); - if (ireplica < nreplica-1) MPI_Wait(&request,&status); - */ - - - - - double **x = atom->x; int *mask = atom->mask; double dot = 0.0; @@ -355,33 +308,18 @@ void FixNEB::min_post_force(int vflag) double **f = atom->f; int nlocal = atom->nlocal; - /* SHOULD BE DONE IN inter_replica_comm() - if (ireplica < nreplica-1) - MPI_Irecv(fnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); - if (ireplica > 0) - MPI_Send(f[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); - if (ireplica < nreplica-1) MPI_Wait(&request,&status); - */ - - //calculating separation between images + plen = 0.0; nlen = 0.0; double tlen = 0.0; - double gradnextlen = 0.0; - double dotFreeEndIniOld=0.0; - double dotFreeEndFinalOld=0.0; + double gradnextlen = 0.0; + double dotFreeEndIniOld = 0.0; + double dotFreeEndFinalOld = 0.0; - dotgrad = 0.0; + dotgrad = gradlen = dotpath = dottangrad = 0.0; - gradlen = 0.0; - - - dotpath = 0.0; - dottangrad = 0.0; - - - if (ireplica ==nreplica-1){ + if (ireplica ==nreplica-1) { for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { @@ -393,18 +331,18 @@ void FixNEB::min_post_force(int vflag) plen += delxp*delxp + delyp*delyp + delzp*delzp; dottangrad += delxp* f[i][0]+ delyp*f[i][1]+delzp*f[i][2]; gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; - if (FreeEndFinal||FreeEndFinalWithRespToEIni){ + if (FreeEndFinal||FreeEndFinalWithRespToEIni) { tangent[i][0]=delxp; tangent[i][1]=delyp; tangent[i][2]=delzp; - tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + - tangent[i][2]*tangent[i][2]; - dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + f[i][2]*tangent[i][2]; + tlen += tangent[i][0]*tangent[i][0] + + tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; + dot += f[i][0]*tangent[i][0] + + f[i][1]*tangent[i][1] + f[i][2]*tangent[i][2]; } - } - } + } - else if (ireplica == 0){ + } else if (ireplica == 0) { for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { delxn = xnext[i][0] - x[i][0]; @@ -412,113 +350,98 @@ void FixNEB::min_post_force(int vflag) delzn = xnext[i][2] - x[i][2]; domain->minimum_image(delxn,delyn,delzn); nlen += delxn*delxn + delyn*delyn + delzn*delzn; - gradnextlen += fnext[i][0]*fnext[i][0] + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; - dotgrad += f[i][0]*fnext[i][0] + f[i][1]*fnext[i][1] + - f[i][2]*fnext[i][2]; - dottangrad += delxn* f[i][0]+ delyn*f[i][1]+delzn*f[i][2]; + gradnextlen += fnext[i][0]*fnext[i][0] + + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; + dotgrad += f[i][0]*fnext[i][0] + + f[i][1]*fnext[i][1] + f[i][2]*fnext[i][2]; + dottangrad += delxn*f[i][0]+ delyn*f[i][1] + delzn*f[i][2]; gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; - if (FreeEndIni) - { - tangent[i][0]=delxn; - tangent[i][1]=delyn; - tangent[i][2]=delzn; - tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + - tangent[i][2]*tangent[i][2]; - dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + f[i][2]*tangent[i][2]; + if (FreeEndIni) { + tangent[i][0]=delxn; + tangent[i][1]=delyn; + tangent[i][2]=delzn; + tlen += tangent[i][0]*tangent[i][0] + + tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; + dot += f[i][0]*tangent[i][0] + + f[i][1]*tangent[i][1] + f[i][2]*tangent[i][2]; + } + } + } else { + //not the first or last replica + vmax = MAX(fabs(vnext-veng),fabs(vprev-veng)); + vmin = MIN(fabs(vnext-veng),fabs(vprev-veng)); + + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + delxp = x[i][0] - xprev[i][0]; + delyp = x[i][1] - xprev[i][1]; + delzp = x[i][2] - xprev[i][2]; + domain->minimum_image(delxp,delyp,delzp); + plen += delxp*delxp + delyp*delyp + delzp*delzp; + + delxn = xnext[i][0] - x[i][0]; + delyn = xnext[i][1] - x[i][1]; + delzn = xnext[i][2] - x[i][2]; + domain->minimum_image(delxn,delyn,delzn); + + if (vnext > veng && veng > vprev) { + tangent[i][0]=delxn; + tangent[i][1]=delyn; + tangent[i][2]=delzn; + } else if (vnext < veng && veng < vprev) { + tangent[i][0]=delxp; + tangent[i][1]=delyp; + tangent[i][2]=delzp; + } else { + if (vnext > vprev) { + tangent[i][0] = vmax*delxn + vmin*delxp; + tangent[i][1] = vmax*delyn + vmin*delyp; + tangent[i][2] = vmax*delzn + vmin*delzp; + } else { + tangent[i][0] = vmin*delxn + vmax*delxp; + tangent[i][1] = vmin*delyn + vmax*delyp; + tangent[i][2] = vmin*delzn + vmax*delzp; } + } + + nlen += delxn*delxn + delyn*delyn + delzn*delzn; + tlen += tangent[i][0]*tangent[i][0] + + tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; + gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + dotpath += delxp*delxn + delyp*delyn + delzp*delzn; + dottangrad += tangent[i][0]* f[i][0] + + tangent[i][1]*f[i][1] + tangent[i][2]*f[i][2]; + gradnextlen += fnext[i][0]*fnext[i][0] + + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; + dotgrad += f[i][0]*fnext[i][0] + + f[i][1]*fnext[i][1] + f[i][2]*fnext[i][2]; + + springF[i][0]=kspringPerp*(delxn-delxp); + springF[i][1]=kspringPerp*(delyn-delyp); + springF[i][2]=kspringPerp*(delzn-delzp); } } - else //not the first or last replica - { - vmax = MAX(fabs(vnext-veng),fabs(vprev-veng)); - vmin = MIN(fabs(vnext-veng),fabs(vprev-veng)); - - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - delxp = x[i][0] - xprev[i][0]; - delyp = x[i][1] - xprev[i][1]; - delzp = x[i][2] - xprev[i][2]; - domain->minimum_image(delxp,delyp,delzp); - plen += delxp*delxp + delyp*delyp + delzp*delzp; - - delxn = xnext[i][0] - x[i][0]; - delyn = xnext[i][1] - x[i][1]; - delzn = xnext[i][2] - x[i][2]; - domain->minimum_image(delxn,delyn,delzn); domain->minimum_image(delxn,delyn,delzn); - - if (vnext > veng && veng > vprev) { - tangent[i][0]=delxn; - tangent[i][1]=delyn; - tangent[i][2]=delzn; - } - else if (vnext < veng && veng < vprev) { - tangent[i][0]=delxp; - tangent[i][1]=delyp; - tangent[i][2]=delzp; - } - else { - if (vnext > vprev) { - tangent[i][0] = vmax*delxn + vmin*delxp; - tangent[i][1] = vmax*delyn + vmin*delyp; - tangent[i][2] = vmax*delzn + vmin*delzp; - } else { - tangent[i][0] = vmin*delxn + vmax*delxp; - tangent[i][1] = vmin*delyn + vmax*delyp; - tangent[i][2] = vmin*delzn + vmax*delzp; - } - - } - - nlen += delxn*delxn + delyn*delyn + delzn*delzn; - tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + - tangent[i][2]*tangent[i][2]; - gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; - dotpath += delxp*delxn + delyp*delyn + delzp*delzn; - dottangrad += tangent[i][0]* f[i][0]+ tangent[i][1]*f[i][1]+tangent[i][2]*f[i][2]; - - - - gradnextlen += fnext[i][0]*fnext[i][0] + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; - dotgrad += f[i][0]*fnext[i][0] + f[i][1]*fnext[i][1] + - f[i][2]*fnext[i][2]; - - springF[i][0]=kspringPerp*(delxn-delxp); - springF[i][1]=kspringPerp*(delyn-delyp); - springF[i][2]=kspringPerp*(delzn-delzp); - } - } - - double lenall; - MPI_Allreduce(&nlen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); - nlen = sqrt(lenall); - - MPI_Allreduce(&plen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); - plen = sqrt(lenall); - - MPI_Allreduce(&tlen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); - tlen = sqrt(lenall); - - MPI_Allreduce(&gradlen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); - gradlen = sqrt(lenall); - - MPI_Allreduce(&gradnextlen,&lenall,1,MPI_DOUBLE,MPI_SUM,world); - gradnextlen = sqrt(lenall); - - - - double dotpathall; - double dottangradall; - double dotgradall; - - MPI_Allreduce(&dotpath,&dotpathall,1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&dottangrad,&dottangradall,1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&dotgrad,&dotgradall,1,MPI_DOUBLE,MPI_SUM,world); - - - dotpath=dotpathall; - dottangrad=dottangradall; - dotgrad=dotgradall; +#define BUFSIZE 8 + double bufin[BUFSIZE], bufout[BUFSIZE]; + bufin[0] = nlen; + bufin[1] = plen; + bufin[2] = tlen; + bufin[3] = gradlen; + bufin[4] = gradnextlen; + bufin[5] = dotpath; + bufin[6] = dottangrad; + bufin[7] = dotgrad; + MPI_Allreduce(bufin,bufout,BUFSIZE,MPI_DOUBLE,MPI_SUM,world); + nlen = sqrt(bufout[0]); + plen = sqrt(bufout[1]); + tlen = sqrt(bufout[2]); + gradlen = sqrt(bufout[3]); + gradnextlen = sqrt(bufout[4]); + dotpath = bufout[5]; + dottangrag = bufout[6]; + dotgrad = bufout[7]; // normalize tangent vector @@ -532,146 +455,123 @@ void FixNEB::min_post_force(int vflag) } } - // first or last replica has no change to forces, just return - if(ireplica >0 && ireplica0 && ireplica 0.0) { double dotall; MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); - dot=dotall; - double tleninv = 1.0/tlen; - dot *= tleninv; - if (dot<0) - prefactor = -dot - (veng-EIniIni); - else prefactor = -dot + (veng-EIniIni); + dot=dotall/tlen; + + if (dot<0) prefactor = -dot - (veng-EIniIni); + else prefactor = -dot + (veng-EIniIni); + for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { f[i][0] += prefactor *tangent[i][0]; - f[i][1] += prefactor *tangent[i][1]; + f[i][1] += prefactor *tangent[i][1]; f[i][2] += prefactor *tangent[i][2]; } } - } - - if(FreeEndFinal&&ireplica == nreplica -1){ + if (FreeEndFinal&&ireplica == nreplica -1) { if (tlen > 0.0) { double dotall; MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); - dot=dotall; - double tleninv = 1.0/tlen; - dot *= tleninv; - if (dot<0) - prefactor = -dot - (veng-EFinalIni); - else prefactor = -dot + (veng-EFinalIni); - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - f[i][0] += prefactor *tangent[i][0]; - f[i][1] += prefactor *tangent[i][1]; - f[i][2] += prefactor *tangent[i][2]; - } + dot=dotall/tlen; + if (dot<0) prefactor = -dot - (veng-EFinalIni); + else prefactor = -dot + (veng-EFinalIni); + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + f[i][0] += prefactor *tangent[i][0]; + f[i][1] += prefactor *tangent[i][1]; + f[i][2] += prefactor *tangent[i][2]; + } } } - if(FreeEndFinalWithRespToEIni&&ireplica == nreplica -1){ + if (FreeEndFinalWithRespToEIni&&ireplica == nreplica -1) { if (tlen > 0.0) { double dotall; MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); - dot=dotall; - double tleninv = 1.0/tlen; - dot *= tleninv; - if (dot<0) - prefactor = -dot - (veng-vIni); - else prefactor = -dot + (veng-vIni); - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - f[i][0] += prefactor *tangent[i][0]; - f[i][1] += prefactor *tangent[i][1]; - f[i][2] += prefactor *tangent[i][2]; - } + dot=dotall/tlen; + if (dot<0) prefactor = -dot - (veng-vIni); + else prefactor = -dot + (veng-vIni); + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + f[i][0] += prefactor *tangent[i][0]; + f[i][1] += prefactor *tangent[i][1]; + f[i][2] += prefactor *tangent[i][2]; + } } } + double lentot = 0; - double meanDist,idealPos,lenuntilIm,lenuntilClimber; lenuntilClimber=0; - if(NEBLongRange) - { - if (cmode == SINGLE_PROC_DIRECT or cmode == SINGLE_PROC_MAP) - {MPI_Allgather(&nlen,1,MPI_DOUBLE,&nlenall[0],1,MPI_DOUBLE,uworld);} - else{ - if (me == 0) - MPI_Allgather(&nlen,1,MPI_DOUBLE,&nlenall[0],1,MPI_DOUBLE,rootworld); - - MPI_Bcast(nlenall,nreplica,MPI_DOUBLE,0,world); - } - - - - lenuntilIm = 0; - for (int i = 0; i < ireplica; i++) - lenuntilIm += nlenall[i]; - - for (int i = 0; i < nreplica; i++) - lentot += nlenall[i]; - - meanDist = lentot/(nreplica -1); - - if (rclimber>0) { - for (int i = 0; i < rclimber; i++) - lenuntilClimber += nlenall[i]; - double meanDistBeforeClimber = lenuntilClimber/rclimber; - double meanDistAfterClimber = (lentot-lenuntilClimber)/(nreplica-rclimber-1); - if (ireplica0) { + for (int i = 0; i < rclimber; i++) + lenuntilClimber += nlenall[i]; + double meanDistBeforeClimber = lenuntilClimber/rclimber; + double meanDistAfterClimber = + (lentot-lenuntilClimber)/(nreplica-rclimber-1); + if (ireplicadestroy(fnext); memory->destroy(springF); - if (NEBLongRange){ + if (NEBLongRange) { memory->destroy(nlenall); memory->create(nlenall,nreplica,"neb:nlenall"); } diff --git a/src/REPLICA/fix_neb.h b/src/REPLICA/fix_neb.h index 5280e9064a..290494bef4 100644 --- a/src/REPLICA/fix_neb.h +++ b/src/REPLICA/fix_neb.h @@ -26,7 +26,7 @@ namespace LAMMPS_NS { class FixNEB : public Fix { public: - double veng,plen,nlen,dotpath, dottangrad,gradlen,dotgrad ; + double veng,plen,nlen,dotpath,dottangrad,gradlen,dotgrad; int rclimber; FixNEB(class LAMMPS *, int, char **); @@ -38,14 +38,15 @@ class FixNEB : public Fix { private: int me,nprocs,nprocs_universe; - double kspring, kspringPerp,EIniIni,EFinalIni; - bool StandardNEB, NEBLongRange,PerpSpring, FreeEndIni,FreeEndFinal,FreeEndFinalWithRespToEIni,FinalAndInterWithRespToEIni ; + double kspring,kspringPerp,EIniIni,EFinalIni; + bool StandardNEB,NEBLongRange,PerpSpring,FreeEndIni,FreeEndFinal; + bool FreeEndFinalWithRespToEIni,FinalAndInterWithRespToEIni; int ireplica,nreplica; int procnext,procprev; int cmode; MPI_Comm uworld; MPI_Comm rootworld; - + char *id_pe; class Compute *pe; diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index a0feedf13f..671ad9215c 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -9,7 +9,7 @@ the GNU General Public License. See the README file in the top-level LAMMPS directory. - ------------------------------------------------------------------------- */ +------------------------------------------------------------------------- */ // lmptype.h must be first b/c this file uses MAXBIGINT and includes mpi.h // due to OpenMPI bug which sets INT64_MAX via its mpi.h @@ -52,7 +52,7 @@ NEB::NEB(LAMMPS *lmp) : Pointers(lmp) {} /* ---------------------------------------------------------------------- internal NEB constructor, called from TAD - ------------------------------------------------------------------------- */ +------------------------------------------------------------------------- */ NEB::NEB(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, int n2steps_in, int nevery_in, double *buf_init, double *buf_final) @@ -105,7 +105,7 @@ NEB::~NEB() /* ---------------------------------------------------------------------- perform NEB on multiple replicas - ------------------------------------------------------------------------- */ +------------------------------------------------------------------------- */ void NEB::command(int narg, char **arg) { @@ -165,7 +165,7 @@ void NEB::command(int narg, char **arg) /* ---------------------------------------------------------------------- run NEB on multiple replicas - ------------------------------------------------------------------------- */ +------------------------------------------------------------------------- */ void NEB::run() { @@ -363,7 +363,7 @@ void NEB::run() each replica (except first) opens file and reads it each replica stores coords initial replica does nothing - ------------------------------------------------------------------------- */ +------------------------------------------------------------------------- */ void NEB::readfile(char *file, int flag) { @@ -526,7 +526,7 @@ void NEB::readfile(char *file, int flag) /* ---------------------------------------------------------------------- universe proc 0 opens NEB data file test if gzipped - ------------------------------------------------------------------------- */ +------------------------------------------------------------------------- */ void NEB::open(char *file) { @@ -560,7 +560,7 @@ void NEB::open(char *file) /* ---------------------------------------------------------------------- query fix NEB for info on each replica universe proc 0 prints current NEB status - ------------------------------------------------------------------------- */ +------------------------------------------------------------------------- */ void NEB::print_status() { diff --git a/src/REPLICA/neb.h b/src/REPLICA/neb.h index bd60efe961..12a103284f 100644 --- a/src/REPLICA/neb.h +++ b/src/REPLICA/neb.h @@ -53,8 +53,8 @@ class NEB : protected Pointers { int nall; // per-replica dimension of array all double **all; // PE,plen,nlen,gradvnorm from each replica double *rdist; // normalize reaction distance, 0 to 1 - double *freplica; // force on an image - double *fmaxatomInRepl; // force on an image + double *freplica; // force on an image + double *fmaxatomInRepl; // force on an image void readfile(char *, int); void open(char *); From 6ef79d371541742278bca75638924d6c6d44cafd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 19 May 2017 15:13:19 -0400 Subject: [PATCH 066/302] silence several compiler warnings --- src/REPLICA/fix_neb.cpp | 14 ++++------- src/REPLICA/neb.cpp | 51 ++++++++++++++++++++++------------------- 2 files changed, 31 insertions(+), 34 deletions(-) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index 23b9297017..ea98431fdd 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -38,12 +38,12 @@ enum{SINGLE_PROC_DIRECT,SINGLE_PROC_MAP,MULTI_PROC}; FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), - id_pe(NULL), pe(NULL), xprev(NULL), xnext(NULL), fnext(NULL), - tangent(NULL), springF(NULL), xsend(NULL), xrecv(NULL), + id_pe(NULL), pe(NULL), nlenall(NULL), xprev(NULL), xnext(NULL), + fnext(NULL), springF(NULL), tangent(NULL), xsend(NULL), xrecv(NULL), fsend(NULL), frecv(NULL), tagsend(NULL), tagrecv(NULL), xsendall(NULL), xrecvall(NULL), fsendall(NULL), frecvall(NULL), tagsendall(NULL), tagrecvall(NULL), counts(NULL), - displacements(NULL),nlenall(NULL) + displacements(NULL) { @@ -248,7 +248,6 @@ void FixNEB::min_post_force(int vflag) { double vprev,vnext,vmax,vmin; double delxp,delyp,delzp,delxn,delyn,delzn; - double delta1[3],delta2[3]; double vIni =0.0; vprev=vnext=veng = pe->compute_scalar(); @@ -314,8 +313,6 @@ void FixNEB::min_post_force(int vflag) nlen = 0.0; double tlen = 0.0; double gradnextlen = 0.0; - double dotFreeEndIniOld = 0.0; - double dotFreeEndFinalOld = 0.0; dotgrad = gradlen = dotpath = dottangrad = 0.0; @@ -440,7 +437,7 @@ void FixNEB::min_post_force(int vflag) gradlen = sqrt(bufout[3]); gradnextlen = sqrt(bufout[4]); dotpath = bufout[5]; - dottangrag = bufout[6]; + dottangrad = bufout[6]; dotgrad = bufout[7]; // normalize tangent vector @@ -557,7 +554,6 @@ void FixNEB::min_post_force(int vflag) if (ireplica == 0 || ireplica == nreplica-1) return ; double AngularContr; - double thetapath; dotpath = dotpath/(plen*nlen); AngularContr = 0.5 *(1+cos(MY_PI * dotpath)); @@ -579,8 +575,6 @@ void FixNEB::min_post_force(int vflag) MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); dot=dotall; - // double prefactor, prefSpring; - double ToDisp; if (ireplica == rclimber) prefactor = -2.0*dot; else { diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index 671ad9215c..c1bd6191bf 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -214,30 +214,33 @@ void NEB::run() update->minimize->setup(); if (me_universe == 0) { - if (universe->uscreen) - if (Verbose) - fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); - else - - fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN\n"); - if (universe->ulogfile) - if (Verbose) - fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); - else - - fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN\n"); + if (universe->uscreen) { + if (Verbose) { + fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " + "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " + "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " + "... ReplicaForceN MaxAtomForceN\n"); + } else { + fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " + "RDN PEN\n"); + } + } + + if (universe->ulogfile) { + if (Verbose) { + fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " + "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " + "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " + "... ReplicaForceN MaxAtomForceN\n"); + } else { + fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " + "RDN PEN\n"); + } + } } print_status(); From 546aed7ccde80f17456f65a60099ee752c9315a3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 19 May 2017 16:14:59 -0400 Subject: [PATCH 067/302] plug some memory leaks --- src/REPLICA/fix_neb.cpp | 61 ++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index ea98431fdd..216d5a6202 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -115,13 +115,14 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : int *iroots = new int[nreplica]; MPI_Group uworldgroup,rootgroup; if (NEBLongRange) { - for (int iIm =0; iIm < nreplica;iIm++) - iroots[iIm]=universe->root_proc[iIm]; + for (int i=0; iroot_proc[i]; MPI_Comm_group(uworld, &uworldgroup); MPI_Group_incl(uworldgroup, nreplica, iroots, &rootgroup); - // MPI_Comm_create_group(uworld, rootgroup, 0, &rootworld); MPI_Comm_create(uworld, rootgroup, &rootworld); } + delete[] iroots; + // create a new compute pe style // id = fix-ID + pe, compute group = all @@ -139,8 +140,8 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : // initialize local storage - maxlocal = 0; - ntotal = 0; + maxlocal = -1; + ntotal = -1; } /* ---------------------------------------------------------------------- */ @@ -153,6 +154,7 @@ FixNEB::~FixNEB() memory->destroy(xprev); memory->destroy(xnext); memory->destroy(tangent); + memory->destroy(fnext); memory->destroy(springF); memory->destroy(xsend); memory->destroy(xrecv); @@ -171,9 +173,10 @@ FixNEB::~FixNEB() memory->destroy(counts); memory->destroy(displacements); - if (NEBLongRange) + if (NEBLongRange) { + MPI_Comm_free(&rootworld); memory->destroy(nlenall); - + } } /* ---------------------------------------------------------------------- */ @@ -246,11 +249,11 @@ void FixNEB::min_setup(int vflag) void FixNEB::min_post_force(int vflag) { - double vprev,vnext,vmax,vmin; + double vprev,vnext; double delxp,delyp,delzp,delxn,delyn,delzn; - double vIni =0.0; + double vIni=0.0; - vprev=vnext=veng = pe->compute_scalar(); + vprev=vnext=veng=pe->compute_scalar(); if (ireplica < nreplica-1 && me ==0) MPI_Send(&veng,1,MPI_DOUBLE,procnext,0,uworld); @@ -302,7 +305,7 @@ void FixNEB::min_post_force(int vflag) double **x = atom->x; int *mask = atom->mask; double dot = 0.0; - double prefactor; + double prefactor = 0.0; double **f = atom->f; int nlocal = atom->nlocal; @@ -364,9 +367,9 @@ void FixNEB::min_post_force(int vflag) } } } else { - //not the first or last replica - vmax = MAX(fabs(vnext-veng),fabs(vprev-veng)); - vmin = MIN(fabs(vnext-veng),fabs(vprev-veng)); + // not the first or last replica + double vmax = MAX(fabs(vnext-veng),fabs(vprev-veng)); + double vmin = MIN(fabs(vnext-veng),fabs(vprev-veng)); for (int i = 0; i < nlocal; i++) @@ -658,7 +661,6 @@ void FixNEB::inter_replica_comm() MPI_Send(f[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); if (ireplica < nreplica-1) MPI_Wait(&request,MPI_STATUS_IGNORE); - return; } @@ -832,17 +834,19 @@ void FixNEB::inter_replica_comm() void FixNEB::reallocate() { + maxlocal = atom->nmax; + memory->destroy(xprev); memory->destroy(xnext); memory->destroy(tangent); memory->destroy(fnext); memory->destroy(springF); - if (NEBLongRange) { - memory->destroy(nlenall); - memory->create(nlenall,nreplica,"neb:nlenall"); - } - + memory->create(xprev,maxlocal,3,"neb:xprev"); + memory->create(xnext,maxlocal,3,"neb:xnext"); + memory->create(tangent,maxlocal,3,"neb:tangent"); + memory->create(fnext,maxlocal,3,"neb:fnext"); + memory->create(springF,maxlocal,3,"neb:springF"); if (cmode != SINGLE_PROC_DIRECT) { memory->destroy(xsend); @@ -851,18 +855,6 @@ void FixNEB::reallocate() memory->destroy(frecv); memory->destroy(tagsend); memory->destroy(tagrecv); - } - - maxlocal = atom->nmax; - - memory->create(xprev,maxlocal,3,"neb:xprev"); - memory->create(xnext,maxlocal,3,"neb:xnext"); - memory->create(tangent,maxlocal,3,"neb:tangent"); - memory->create(fnext,maxlocal,3,"neb:fnext"); - memory->create(springF,maxlocal,3,"neb:springF"); - - - if (cmode != SINGLE_PROC_DIRECT) { memory->create(xsend,maxlocal,3,"neb:xsend"); memory->create(fsend,maxlocal,3,"neb:fsend"); memory->create(xrecv,maxlocal,3,"neb:xrecv"); @@ -870,4 +862,9 @@ void FixNEB::reallocate() memory->create(tagsend,maxlocal,"neb:tagsend"); memory->create(tagrecv,maxlocal,"neb:tagrecv"); } + + if (NEBLongRange) { + memory->destroy(nlenall); + memory->create(nlenall,nreplica,"neb:nlenall"); + } } From 97d3c843c44afd97125ce166c7d0a6b46a53a483 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 21 May 2017 11:13:47 -0400 Subject: [PATCH 068/302] small documentation fixes to fix typos and formatting issues --- doc/src/compute_saed.txt | 40 +++++++++++++++++----------------- doc/src/dihedral_spherical.txt | 1 + doc/src/fix_gle.txt | 2 +- doc/src/fix_langevin_drude.txt | 4 ++-- doc/src/package.txt | 6 ++--- doc/src/pair_python.txt | 9 ++++---- doc/src/pair_snap.txt | 7 +++--- doc/src/pair_zero.txt | 2 +- doc/src/tutorial_pylammps.txt | 1 + 9 files changed, 38 insertions(+), 34 deletions(-) diff --git a/doc/src/compute_saed.txt b/doc/src/compute_saed.txt index aadda49533..020f72f565 100644 --- a/doc/src/compute_saed.txt +++ b/doc/src/compute_saed.txt @@ -111,26 +111,26 @@ Coefficients parameterized by "(Fox)"_#Fox are assigned for each atom type designating the chemical symbol and charge of each atom type. Valid chemical symbols for compute saed are: - 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:tb(c=5,s=:) +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:tb(c=5,s=:) If the {echo} keyword is specified, compute saed will provide extra diff --git a/doc/src/dihedral_spherical.txt b/doc/src/dihedral_spherical.txt index c71a319912..7c17fbf5ef 100644 --- a/doc/src/dihedral_spherical.txt +++ b/doc/src/dihedral_spherical.txt @@ -18,6 +18,7 @@ dihedral_coeff 1 1 286.1 1 124 1 1 90.0 0 1 90.0 0 dihedral_coeff 1 3 69.3 1 93.9 1 1 90 0 1 90 0 & 49.1 0 0.00 0 1 74.4 1 0 0.00 0 & 25.2 0 0.00 0 0 0.00 0 1 48.1 1 +:pre [Description:] diff --git a/doc/src/fix_gle.txt b/doc/src/fix_gle.txt index b8d3cc9b34..6568060f0c 100644 --- a/doc/src/fix_gle.txt +++ b/doc/src/fix_gle.txt @@ -68,7 +68,7 @@ matrix that gives canonical sampling for a given A is computed automatically. However, the GLE framework also allow for non-equilibrium sampling, that can be used for instance to model inexpensively zero-point energy effects "(Ceriotti2)"_#Ceriotti2. This is achieved specifying the {noneq} - keyword followed by the name of the file that contains the static covariance +keyword followed by the name of the file that contains the static covariance matrix for the non-equilibrium dynamics. Please note, that the covariance matrix is expected to be given in [temperature units]. diff --git a/doc/src/fix_langevin_drude.txt b/doc/src/fix_langevin_drude.txt index 04437e7f36..afc9c5f257 100644 --- a/doc/src/fix_langevin_drude.txt +++ b/doc/src/fix_langevin_drude.txt @@ -67,11 +67,11 @@ The Langevin forces are computed as \(F_r'\) is a random force proportional to \(\sqrt \{ \frac \{2\, k_B \mathtt\{Tcom\}\, m'\} \{\mathrm dt\, \mathtt\{damp\_com\} \} - \} \). :b + \} \). \(f_r'\) is a random force proportional to \(\sqrt \{ \frac \{2\, k_B \mathtt\{Tdrude\}\, m'\} \{\mathrm dt\, \mathtt\{damp\_drude\} \} - \} \). :b + \} \). Then the real forces acting on the particles are computed from the inverse transform: \begin\{equation\} F = \frac M \{M'\}\, F' - f' \end\{equation\} diff --git a/doc/src/package.txt b/doc/src/package.txt index a0894b3128..18a26bd55c 100644 --- a/doc/src/package.txt +++ b/doc/src/package.txt @@ -574,9 +574,9 @@ is used. If it is not used, you must invoke the package intel command in your input script or or via the "-pk intel" "command-line switch"_Section_start.html#start_7. -For the KOKKOS package, the option defaults neigh = full, neigh/qeq - = full, newton = off, binsize = 0.0, and comm = device. These settings - are made automatically by the required "-k on" "command-line +For the KOKKOS package, the option defaults neigh = full, +neigh/qeq = full, newton = off, binsize = 0.0, and comm = device. +These settings are made automatically by the required "-k on" "command-line switch"_Section_start.html#start_7. You can change them bu using the package kokkos command in your input script or via the "-pk kokkos" "command-line switch"_Section_start.html#start_7. diff --git a/doc/src/pair_python.txt b/doc/src/pair_python.txt index 557db37bbb..2f8ed7a27c 100644 --- a/doc/src/pair_python.txt +++ b/doc/src/pair_python.txt @@ -74,7 +74,7 @@ placeholders for atom types that will be used with other potentials. The python potential file has to start with the following code: from __future__ import print_function - +# class LAMMPSPairPotential(object): def __init__(self): self.pmap=dict() @@ -163,9 +163,10 @@ pair_write 1 1 2000 rsq 0.01 2.5 lj1_lj2.table lj :pre Note that it is strongly recommended to try to [delete] the potential table file before generating it. Since the {pair_write} command will -always append to a table file, which pair style table will use the -first match. Thus when changing the potential function in the python -class, the table pair style will still read the old variant. +always [append] to a table file, while pair style table will use the +[first match]. Thus when changing the potential function in the python +class, the table pair style will still read the old variant unless the +table file is first deleted. After switching the pair style to {table}, the potential tables need to be assigned to the LAMMPS atom types like this: diff --git a/doc/src/pair_snap.txt b/doc/src/pair_snap.txt index ab7313832c..4e3546481d 100644 --- a/doc/src/pair_snap.txt +++ b/doc/src/pair_snap.txt @@ -10,7 +10,8 @@ pair_style snap command :h3 [Syntax:] -pair_style snap :pre +pair_style snap +:pre [Examples:] @@ -19,11 +20,11 @@ pair_coeff * * InP.snapcoeff In P InP.snapparam In In P P :pre [Description:] -Style {snap} computes interactions +Pair style {snap} computes interactions using the spectral neighbor analysis potential (SNAP) "(Thompson)"_#Thompson20142. Like the GAP framework of Bartok et al. "(Bartok2010)"_#Bartok20102, "(Bartok2013)"_#Bartok2013 -it uses bispectrum components +which uses bispectrum components to characterize the local neighborhood of each atom in a very general way. The mathematical definition of the bispectrum calculation used by SNAP is identical diff --git a/doc/src/pair_zero.txt b/doc/src/pair_zero.txt index ffd40a977d..e58b33c75f 100644 --- a/doc/src/pair_zero.txt +++ b/doc/src/pair_zero.txt @@ -14,7 +14,7 @@ pair_style zero cutoff {nocoeff} :pre zero = style name of this pair style cutoff = global cutoff (distance units) -nocoeff = ignore all pair_coeff parameters (optional) :l +nocoeff = ignore all pair_coeff parameters (optional) :ul [Examples:] diff --git a/doc/src/tutorial_pylammps.txt b/doc/src/tutorial_pylammps.txt index a4a7a4041e..0b4fb32ed2 100644 --- a/doc/src/tutorial_pylammps.txt +++ b/doc/src/tutorial_pylammps.txt @@ -10,6 +10,7 @@ PyLammps Tutorial :h1 Overview :h2 From 8bc829c7f19ed87a0560fb7bae76705571873b0e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 May 2017 14:40:01 -0400 Subject: [PATCH 069/302] change example inputs to be backward compatible --- examples/neb/in.neb.hop1 | 2 +- examples/neb/in.neb.hop2 | 2 +- examples/neb/in.neb.sivac | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/neb/in.neb.hop1 b/examples/neb/in.neb.hop1 index 9a3d7579f3..495b2faa93 100644 --- a/examples/neb/in.neb.hop1 +++ b/examples/neb/in.neb.hop1 @@ -51,7 +51,7 @@ set group nebatoms type 3 group nonneb subtract all nebatoms fix 1 lower setforce 0.0 0.0 0.0 -fix 2 nebatoms neb 1.0 +fix 2 nebatoms neb 1.0 neigh fix 3 all enforce2d thermo 100 diff --git a/examples/neb/in.neb.hop2 b/examples/neb/in.neb.hop2 index 3eb16248e1..9a8986f454 100644 --- a/examples/neb/in.neb.hop2 +++ b/examples/neb/in.neb.hop2 @@ -53,7 +53,7 @@ set group nebatoms type 3 group nonneb subtract all nebatoms fix 1 lower setforce 0.0 0.0 0.0 -fix 2 nebatoms neb 1.0 +fix 2 nebatoms neb 1.0 neigh fix 3 all enforce2d thermo 100 diff --git a/examples/neb/in.neb.sivac b/examples/neb/in.neb.sivac index 566a380627..2fdf46f9d5 100644 --- a/examples/neb/in.neb.sivac +++ b/examples/neb/in.neb.sivac @@ -66,7 +66,7 @@ minimize 1.0e-6 1.0e-4 1000 10000 reset_timestep 0 -fix 1 all neb 1.0 +fix 1 all neb 1.0 neigh thermo 100 From 3fd91a239ff0a93149a0fc1e3b0bb2ed56b06ab4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 May 2017 14:41:01 -0400 Subject: [PATCH 070/302] avoid use '&&' and '||' instead of 'and' and 'or' for consistency --- src/REPLICA/fix_neb.cpp | 12 +++++------- src/REPLICA/neb.cpp | 6 +++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index 216d5a6202..62a46b5bda 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -270,12 +270,10 @@ void FixNEB::min_post_force(int vflag) MPI_Bcast(&vnext,1,MPI_DOUBLE,0,world); } - if (FreeEndFinal) { - if (update->ntimestep == 0) {EFinalIni = veng;} - } + if (FreeEndFinal && (update->ntimestep == 0)) EFinalIni = veng; + + if (ireplica == 0) vIni=veng; - if (ireplica == 0) - vIni=veng; if (FreeEndFinalWithRespToEIni) { if (me == 0) { int procFirst; @@ -484,7 +482,7 @@ void FixNEB::min_post_force(int vflag) } } - if (FreeEndFinal&&ireplica == nreplica -1) { + if (FreeEndFinal && ireplica == nreplica -1) { if (tlen > 0.0) { double dotall; MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); @@ -524,7 +522,7 @@ void FixNEB::min_post_force(int vflag) double meanDist,idealPos,lenuntilIm,lenuntilClimber; lenuntilClimber=0; if (NEBLongRange) { - if (cmode == SINGLE_PROC_DIRECT or cmode == SINGLE_PROC_MAP) { + if (cmode == SINGLE_PROC_DIRECT || cmode == SINGLE_PROC_MAP) { MPI_Allgather(&nlen,1,MPI_DOUBLE,&nlenall[0],1,MPI_DOUBLE,uworld); } else { if (me == 0) diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index c1bd6191bf..9401b4a3f4 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -145,15 +145,15 @@ void NEB::command(int narg, char **arg) // process file-style setting to setup initial configs for all replicas if (strcmp(arg[5],"final") == 0) { - if (narg != 7 and narg !=8) error->universe_all(FLERR,"Illegal NEB command"); + if (narg != 7 && narg !=8) error->universe_all(FLERR,"Illegal NEB command"); infile = arg[6]; readfile(infile,0); } else if (strcmp(arg[5],"each") == 0) { - if (narg != 7 and narg !=8) error->universe_all(FLERR,"Illegal NEB command"); + if (narg != 7 && narg !=8) error->universe_all(FLERR,"Illegal NEB command"); infile = arg[6]; readfile(infile,1); } else if (strcmp(arg[5],"none") == 0) { - if (narg != 6 and narg !=7) error->universe_all(FLERR,"Illegal NEB command"); + if (narg != 6 && narg !=7) error->universe_all(FLERR,"Illegal NEB command"); } else error->universe_all(FLERR,"Illegal NEB command"); Verbose=false; From 4780d72809c006485f2a6032d38b2d74d2ac58c3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 May 2017 14:42:42 -0400 Subject: [PATCH 071/302] use '&&' and '||' instead of 'and' and 'or' operators for consistency --- src/MC/pair_dsmc.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/MC/pair_dsmc.cpp b/src/MC/pair_dsmc.cpp index 29ecde2023..d3327eea29 100644 --- a/src/MC/pair_dsmc.cpp +++ b/src/MC/pair_dsmc.cpp @@ -93,9 +93,9 @@ void PairDSMC::compute(int eflag, int vflag) int ycell = static_cast((x[i][1] - domain->boxlo[1])/celly); int zcell = static_cast((x[i][2] - domain->boxlo[2])/cellz); - if ((xcell < 0) or (xcell > ncellsx-1) or - (ycell < 0) or (ycell > ncellsy-1) or - (zcell < 0) or (zcell > ncellsz-1)) continue; + if ((xcell < 0) || (xcell > ncellsx-1) || + (ycell < 0) || (ycell > ncellsy-1) || + (zcell < 0) || (zcell > ncellsz-1)) continue; int icell = xcell + ycell*ncellsx + zcell*ncellsx*ncellsy; itype = type[i]; @@ -146,7 +146,7 @@ void PairDSMC::compute(int eflag, int vflag) double num_of_collisions_double = number_of_A * number_of_B * weighting * Vs_max * update->dt / vol; - if ((itype == jtype) and number_of_B) + if ((itype == jtype) && number_of_B) num_of_collisions_double *= 0.5 * double(number_of_B - 1) / double(number_of_B); @@ -161,8 +161,8 @@ void PairDSMC::compute(int eflag, int vflag) // perform collisions on pairs of particles in icell for (int k = 0; k < num_of_collisions; k++) { - if ((number_of_A < 1) or (number_of_B < 1)) break; - if ((itype == jtype) and (number_of_A < 2)) break; + if ((number_of_A < 1) || (number_of_B < 1)) break; + if ((itype == jtype) && (number_of_A < 2)) break; int ith_A = static_cast(random->uniform()*number_of_A); int jth_B = static_cast(random->uniform()*number_of_B); int i = particle_list[itype][ith_A]; From 7185db98b4c78843b8aca73f9fc55f2bb8f046b8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 May 2017 17:13:38 -0400 Subject: [PATCH 072/302] NEBLongRange was incorrectly set to false by default. revert to true. --- src/REPLICA/fix_neb.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index 62a46b5bda..695f7ff224 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -46,8 +46,8 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : displacements(NULL) { - - StandardNEB=NEBLongRange=PerpSpring=FreeEndIni=FreeEndFinal=false; + NEBLongRange=true; + StandardNEB=PerpSpring=FreeEndIni=FreeEndFinal=false; FreeEndFinalWithRespToEIni=FinalAndInterWithRespToEIni=false; kspringPerp=0.0; From f73fd0625d53e1631cbc8fd9f3990595f00d45ea Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 May 2017 17:14:38 -0400 Subject: [PATCH 073/302] rename nall class member to numall to avoid confusion with the common convention nall = atom->nlocal+atom->nghost --- src/REPLICA/neb.cpp | 12 ++++++------ src/REPLICA/neb.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index 9401b4a3f4..aaa7f35691 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -182,9 +182,9 @@ void NEB::run() if (ineb == modify->nfix) error->all(FLERR,"NEB requires use of fix neb"); fneb = (FixNEB *) modify->fix[ineb]; - if (Verbose) nall =7; - else nall = 4; - memory->create(all,nreplica,nall,"neb:all"); + if (Verbose) numall =7; + else numall = 4; + memory->create(all,nreplica,numall,"neb:all"); rdist = new double[nreplica]; // initialize LAMMPS @@ -582,7 +582,7 @@ void NEB::print_status() MPI_Allgather(&fnorminf,1,MPI_DOUBLE,&fmaxatomInRepl[0],1,MPI_DOUBLE,roots); } - double one[nall]; + double one[numall]; one[0] = fneb->veng; one[1] = fneb->plen; one[2] = fneb->nlen; @@ -598,8 +598,8 @@ void NEB::print_status() if (output->thermo->normflag) one[0] /= atom->natoms; if (me == 0) - MPI_Allgather(one,nall,MPI_DOUBLE,&all[0][0],nall,MPI_DOUBLE,roots); - MPI_Bcast(&all[0][0],nall*nreplica,MPI_DOUBLE,0,world); + MPI_Allgather(one,numall,MPI_DOUBLE,&all[0][0],numall,MPI_DOUBLE,roots); + MPI_Bcast(&all[0][0],numall*nreplica,MPI_DOUBLE,0,world); rdist[0] = 0.0; for (int i = 1; i < nreplica; i++) diff --git a/src/REPLICA/neb.h b/src/REPLICA/neb.h index 12a103284f..2a03496e59 100644 --- a/src/REPLICA/neb.h +++ b/src/REPLICA/neb.h @@ -50,7 +50,7 @@ class NEB : protected Pointers { char *infile; // name of file containing final state class FixNEB *fneb; - int nall; // per-replica dimension of array all + int numall; // per-replica dimension of array all double **all; // PE,plen,nlen,gradvnorm from each replica double *rdist; // normalize reaction distance, 0 to 1 double *freplica; // force on an image From 081910adbc410fd559587df65fc30973b67eb738 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 May 2017 17:15:14 -0400 Subject: [PATCH 074/302] do not try to free null communicators --- src/REPLICA/fix_neb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index 695f7ff224..da08133134 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -174,7 +174,7 @@ FixNEB::~FixNEB() memory->destroy(displacements); if (NEBLongRange) { - MPI_Comm_free(&rootworld); + if (rootworld != MPI_COMM_NULL) MPI_Comm_free(&rootworld); memory->destroy(nlenall); } } From 62601678cddebab94eff8eae4474380b3248f29a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 May 2017 17:16:19 -0400 Subject: [PATCH 075/302] when growing arrays with reallocate, always check against atom->nmax and not atom->nlocal or else these arrays may be of inconsistent size and communication can lead to data corruption --- src/REPLICA/fix_neb.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index da08133134..c6c68e6cab 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -220,7 +220,7 @@ void FixNEB::init() if (atom->natoms > MAXSMALLINT) error->all(FLERR,"Too many atoms for NEB"); ntotal = atom->natoms; - if (atom->nlocal > maxlocal) reallocate(); + if (atom->nmax > maxlocal) reallocate(); if (MULTI_PROC && counts == NULL) { memory->create(xsendall,ntotal,3,"neb:xsendall"); @@ -624,7 +624,7 @@ void FixNEB::inter_replica_comm() // reallocate memory if necessary - if (atom->nlocal > maxlocal) reallocate(); + if (atom->nmax > maxlocal) reallocate(); double **x = atom->x; double **f = atom->f; From 617ca4e0c89be716530fa48b99fc4e643d872b2c Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 22 May 2017 17:30:46 -0400 Subject: [PATCH 076/302] Fixes coverity issue CID 179436 --- src/PYTHON/python_impl.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/PYTHON/python_impl.cpp b/src/PYTHON/python_impl.cpp index 55108eb8c7..25536e55d5 100644 --- a/src/PYTHON/python_impl.cpp +++ b/src/PYTHON/python_impl.cpp @@ -35,6 +35,12 @@ enum{NONE,INT,DOUBLE,STRING,PTR}; PythonImpl::PythonImpl(LAMMPS *lmp) : Pointers(lmp) { + ninput = noutput = 0; + istr = NULL; + ostr = NULL; + format = NULL; + length_longstr = 0; + // pfuncs stores interface info for each Python function nfunc = 0; From 8a630ff4ec8aef64668046f28e87a68de84bf843 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 22 May 2017 17:32:07 -0400 Subject: [PATCH 077/302] Fixes coverity issue CID 179440 --- src/PYTHON/fix_python.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/PYTHON/fix_python.cpp b/src/PYTHON/fix_python.cpp index 88a1a5088d..ffca66e77c 100644 --- a/src/PYTHON/fix_python.cpp +++ b/src/PYTHON/fix_python.cpp @@ -47,6 +47,8 @@ FixPython::FixPython(LAMMPS *lmp, int narg, char **arg) : selected_callback = POST_FORCE; } else if (strcmp(arg[4],"end_of_step") == 0) { selected_callback = END_OF_STEP; + } else { + error->all(FLERR,"Unsupported callback name for fix/python"); } // get Python function From a7d790a82778093c15cc0264046e1e2035bc6521 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 22 May 2017 17:33:47 -0400 Subject: [PATCH 078/302] Fixes coverity issue CID 179439 --- src/PYTHON/pair_python.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PYTHON/pair_python.cpp b/src/PYTHON/pair_python.cpp index 384aa5a94b..fcec2baaa9 100644 --- a/src/PYTHON/pair_python.cpp +++ b/src/PYTHON/pair_python.cpp @@ -41,6 +41,7 @@ PairPython::PairPython(LAMMPS *lmp) : Pair(lmp) { restartinfo = 0; one_coeff = 1; reinitflag = 0; + cut_global = 0.0; py_potential = NULL; skip_types = NULL; From 084626e60b43596ed612f6ea340392a802c1cf3b Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 22 May 2017 17:36:16 -0400 Subject: [PATCH 079/302] Fixes coverity issue CID 179426 --- src/PYTHON/python_impl.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/PYTHON/python_impl.cpp b/src/PYTHON/python_impl.cpp index 25536e55d5..daa4952665 100644 --- a/src/PYTHON/python_impl.cpp +++ b/src/PYTHON/python_impl.cpp @@ -313,6 +313,9 @@ void PythonImpl::invoke_function(int ifunc, char *result) } } else if (itype == PTR) { pValue = PY_VOID_POINTER(lmp); + } else { + PyGILState_Release(gstate); + error->all(FLERR,"Unsupported variable type"); } PyTuple_SetItem(pArgs,i,pValue); } From bdfb7c69ea3f0a98066af51551ade6dc8aa920f9 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 22 May 2017 17:51:40 -0400 Subject: [PATCH 080/302] Remove unused code detected by coverity CID 177700 --- src/neigh_request.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/neigh_request.cpp b/src/neigh_request.cpp index bb691d00ba..8d720e766c 100644 --- a/src/neigh_request.cpp +++ b/src/neigh_request.cpp @@ -228,7 +228,6 @@ void NeighRequest::copy_request(NeighRequest *other, int skipflag) dnum = other->dnum; - iskip = other->iskip; iskip = NULL; ijskip = NULL; From 9008a3119009c84f9f641aa1881f84ebbbec4c82 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 May 2017 21:55:55 -0400 Subject: [PATCH 081/302] more formatting cleanup This cleans up and simplifies the neb command code some more --- src/REPLICA/neb.cpp | 183 ++++++++++++++++++++++++-------------------- src/REPLICA/neb.h | 4 +- 2 files changed, 104 insertions(+), 83 deletions(-) diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index aaa7f35691..efcea08fb4 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -156,8 +156,8 @@ void NEB::command(int narg, char **arg) if (narg != 6 && narg !=7) error->universe_all(FLERR,"Illegal NEB command"); } else error->universe_all(FLERR,"Illegal NEB command"); - Verbose=false; - if (strcmp(arg[narg-1],"verbose") == 0) Verbose=true; + verbose=false; + if (strcmp(arg[narg-1],"verbose") == 0) verbose=true; // run the NEB calculation run(); @@ -182,7 +182,7 @@ void NEB::run() if (ineb == modify->nfix) error->all(FLERR,"NEB requires use of fix neb"); fneb = (FixNEB *) modify->fix[ineb]; - if (Verbose) numall =7; + if (verbose) numall =7; else numall = 4; memory->create(all,nreplica,numall,"neb:all"); rdist = new double[nreplica]; @@ -200,9 +200,11 @@ void NEB::run() error->all(FLERR,"NEB requires damped dynamics minimizer"); // setup regular NEB minimization + FILE *uscreen = universe->uscreen; + FILE *ulogfile = universe->ulogfile; - if (me_universe == 0 && universe->uscreen) - fprintf(universe->uscreen,"Setting up regular NEB ...\n"); + if (me_universe == 0 && uscreen) + fprintf(uscreen,"Setting up regular NEB ...\n"); update->beginstep = update->firststep = update->ntimestep; update->endstep = update->laststep = update->firststep + n1steps; @@ -214,29 +216,29 @@ void NEB::run() update->minimize->setup(); if (me_universe == 0) { - if (universe->uscreen) { - if (Verbose) { - fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " + if (uscreen) { + if (verbose) { + fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " "... ReplicaForceN MaxAtomForceN\n"); } else { - fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " + fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " "RDN PEN\n"); } } - if (universe->ulogfile) { - if (Verbose) { - fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " + if (ulogfile) { + if (verbose) { + fprintf(ulogfile,"Step MaxReplicaForce MaxAtomForce " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " "... ReplicaForceN MaxAtomForceN\n"); } else { - fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " + fprintf(ulogfile,"Step MaxReplicaForce MaxAtomForce " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " "RDN PEN\n"); } @@ -279,14 +281,14 @@ void NEB::run() // setup climbing NEB minimization // must reinitialize minimizer so it re-creates its fix MINIMIZE - if (me_universe == 0 && universe->uscreen) - fprintf(universe->uscreen,"Setting up climbing ...\n"); + if (me_universe == 0 && uscreen) + fprintf(uscreen,"Setting up climbing ...\n"); if (me_universe == 0) { - if (universe->uscreen) - fprintf(universe->uscreen,"Climbing replica = %d\n",top+1); - if (universe->ulogfile) - fprintf(universe->ulogfile,"Climbing replica = %d\n",top+1); + if (uscreen) + fprintf(uscreen,"Climbing replica = %d\n",top+1); + if (ulogfile) + fprintf(ulogfile,"Climbing replica = %d\n",top+1); } update->beginstep = update->firststep = update->ntimestep; @@ -301,29 +303,34 @@ void NEB::run() update->minimize->setup(); if (me_universe == 0) { - if (universe->uscreen) - if (Verbose) - fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); - else - fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN\n"); - if (universe->ulogfile) - if (Verbose) - fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 ... ReplicaForceN MaxAtomForceN\n"); - else - - fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce " - "GradV0 GradV1 GradVc " - "EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN\n"); + if (uscreen) + if (verbose) { + fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN " + "pathangle1 angletangrad1 anglegrad1 gradV1 " + "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " + "... ReplicaForceN MaxAtomForceN\n"); + } else { + fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN\n"); + } + if (ulogfile) + if (verbose) { + fprintf(ulogfile,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN " + "pathangle1 angletangrad1 anglegrad1 gradV1 " + "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " + "... ReplicaForceN MaxAtomForceN\n"); + } else { + fprintf(ulogfile,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN\n"); + } } print_status(); @@ -574,13 +581,12 @@ void NEB::print_status() double fmaxatom; MPI_Allreduce(&fnorminf,&fmaxatom,1,MPI_DOUBLE,MPI_MAX,roots); - if (Verbose) - { - freplica = new double[nreplica]; - MPI_Allgather(&fnorm2,1,MPI_DOUBLE,&freplica[0],1,MPI_DOUBLE,roots); - fmaxatomInRepl = new double[nreplica]; - MPI_Allgather(&fnorminf,1,MPI_DOUBLE,&fmaxatomInRepl[0],1,MPI_DOUBLE,roots); - } + if (verbose) { + freplica = new double[nreplica]; + MPI_Allgather(&fnorm2,1,MPI_DOUBLE,&freplica[0],1,MPI_DOUBLE,roots); + fmaxatomInRepl = new double[nreplica]; + MPI_Allgather(&fnorminf,1,MPI_DOUBLE,&fmaxatomInRepl[0],1,MPI_DOUBLE,roots); + } double one[numall]; one[0] = fneb->veng; @@ -588,13 +594,11 @@ void NEB::print_status() one[2] = fneb->nlen; one[3] = fneb->gradlen; - if (Verbose) - { - one[4] = fneb->dotpath; - one[5] = fneb->dottangrad; - one[6] = fneb->dotgrad; - - } + if (verbose) { + one[4] = fneb->dotpath; + one[5] = fneb->dottangrad; + one[6] = fneb->dotgrad; + } if (output->thermo->normflag) one[0] /= atom->natoms; if (me == 0) @@ -639,39 +643,56 @@ void NEB::print_status() } if (me_universe == 0) { - if (universe->uscreen) { - fprintf(universe->uscreen,BIGINT_FORMAT " %12.8g %12.8g ", + const double todeg=180.0/MY_PI; + FILE *uscreen = universe->uscreen; + FILE *ulogfile = universe->ulogfile; + if (uscreen) { + fprintf(uscreen,BIGINT_FORMAT " %12.8g %12.8g ", update->ntimestep,fmaxreplica,fmaxatom); - fprintf(universe->uscreen,"%12.8g %12.8g %12.8g ", + fprintf(uscreen,"%12.8g %12.8g %12.8g ", gradvnorm0,gradvnorm1,gradvnormc); - fprintf(universe->uscreen,"%12.8g %12.8g %12.8g ",ebf,ebr,endpt); + fprintf(uscreen,"%12.8g %12.8g %12.8g ",ebf,ebr,endpt); for (int i = 0; i < nreplica; i++) - fprintf(universe->uscreen,"%12.8g %12.8g ",rdist[i],all[i][0]); - if (Verbose) - {fprintf(universe->uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[0][5])*180/MY_PI,180-acos(all[0][6])*180/MY_PI,all[0][3],freplica[0],fmaxatomInRepl[0]); - for (int i = 1; i < nreplica-1; i++) - fprintf(universe->uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",180-acos(all[i][4])*180/MY_PI,180-acos(all[i][5])*180/MY_PI,180-acos(all[i][6])*180/MY_PI,all[i][3],freplica[i],fmaxatomInRepl[i]); - fprintf(universe->uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[nreplica-1][5])*180/MY_PI,NAN,all[nreplica-1][3],freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); - } - fprintf(universe->uscreen,"\n"); + fprintf(uscreen,"%12.8g %12.8g ",rdist[i],all[i][0]); + if (verbose) { + fprintf(uscreen,"NaN %12.5g %12.5g %12.5g %12.5g %12.5g", + 180-acos(all[0][5])*todeg,180-acos(all[0][6])*todeg, + all[0][3],freplica[0],fmaxatomInRepl[0]); + for (int i = 1; i < nreplica-1; i++) + fprintf(uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", + 180-acos(all[i][4])*todeg,180-acos(all[i][5])*todeg, + 180-acos(all[i][6])*todeg,all[i][3],freplica[i], + fmaxatomInRepl[i]); + fprintf(uscreen,"NaN %12.5g NaN %12.5g %12.5g %12.5g", + 180-acos(all[nreplica-1][5])*todeg,all[nreplica-1][3], + freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); + } + fprintf(uscreen,"\n"); } - if (universe->ulogfile) { - fprintf(universe->ulogfile,BIGINT_FORMAT " %12.8g %12.8g ", + if (ulogfile) { + fprintf(ulogfile,BIGINT_FORMAT " %12.8g %12.8g ", update->ntimestep,fmaxreplica,fmaxatom); - fprintf(universe->ulogfile,"%12.8g %12.8g %12.8g ", + fprintf(ulogfile,"%12.8g %12.8g %12.8g ", gradvnorm0,gradvnorm1,gradvnormc); - fprintf(universe->ulogfile,"%12.8g %12.8g %12.8g ",ebf,ebr,endpt); + fprintf(ulogfile,"%12.8g %12.8g %12.8g ",ebf,ebr,endpt); for (int i = 0; i < nreplica; i++) - fprintf(universe->ulogfile,"%12.8g %12.8g ",rdist[i],all[i][0]); - if (Verbose) - {fprintf(universe->ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[0][5])*180/MY_PI,180-acos(all[0][6])*180/MY_PI,all[0][3],freplica[0],fmaxatomInRepl[0]); - for (int i = 1; i < nreplica-1; i++) - fprintf(universe->ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",180-acos(all[i][4])*180/MY_PI,180-acos(all[i][5])*180/MY_PI,180-acos(all[i][6])*180/MY_PI,all[i][3],freplica[i],fmaxatomInRepl[i]); - fprintf(universe->ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g",NAN,180-acos(all[nreplica-1][5])*180/MY_PI,NAN,all[nreplica-1][3],freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); - } - fprintf(universe->ulogfile,"\n"); - fflush(universe->ulogfile); + fprintf(ulogfile,"%12.8g %12.8g ",rdist[i],all[i][0]); + if (verbose) { + fprintf(ulogfile,"NaN %12.5g %12.5g %12.5g %12.5g %12.5g", + 180-acos(all[0][5])*todeg,180-acos(all[0][6])*todeg, + all[0][3],freplica[0],fmaxatomInRepl[0]); + for (int i = 1; i < nreplica-1; i++) + fprintf(ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", + 180-acos(all[i][4])*todeg,180-acos(all[i][5])*todeg, + 180-acos(all[i][6])*todeg,all[i][3],freplica[i], + fmaxatomInRepl[i]); + fprintf(ulogfile,"NaN %12.5g NaN %12.5g %12.5g %12.5g", + 180-acos(all[nreplica-1][5])*todeg,all[nreplica-1][3], + freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); + } + fprintf(ulogfile,"\n"); + fflush(ulogfile); } } } diff --git a/src/REPLICA/neb.h b/src/REPLICA/neb.h index 2a03496e59..8c2bcf9b16 100644 --- a/src/REPLICA/neb.h +++ b/src/REPLICA/neb.h @@ -38,7 +38,7 @@ class NEB : protected Pointers { private: int me,me_universe; // my proc ID in world and universe int ireplica,nreplica; - bool Verbose; + bool verbose; MPI_Comm uworld; MPI_Comm roots; // MPI comm with 1 root proc from each world FILE *fp; @@ -109,7 +109,7 @@ for NEB. E: Too many timesteps -The cummulative timesteps must fit in a 64-bit integer. +The cumulative timesteps must fit in a 64-bit integer. E: Unexpected end of neb file From c801cdd81fe05d1ecf1c727b524ea82e69d67e25 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 May 2017 22:33:14 -0400 Subject: [PATCH 082/302] some more formatting cleanup in fix neb --- src/REPLICA/fix_neb.cpp | 18 +++++++----------- src/REPLICA/fix_neb.h | 1 - 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index c6c68e6cab..726d300d66 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -95,7 +95,6 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : // nprocs_universe = # of procs in all replicase // procprev,procnext = root proc in adjacent replicas - me = comm->me; nprocs = comm->nprocs; @@ -103,12 +102,9 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : nreplica = universe->nworlds; ireplica = universe->iworld; - if (ireplica > 0) - procprev = universe->root_proc[ireplica-1]; + if (ireplica > 0) procprev = universe->root_proc[ireplica-1]; else procprev = -1; - - if (ireplica < nreplica-1) - procnext = universe->root_proc[ireplica+1]; + if (ireplica < nreplica-1) procnext = universe->root_proc[ireplica+1]; else procnext = -1; uworld = universe->uworld; @@ -317,11 +313,10 @@ void FixNEB::min_post_force(int vflag) dotgrad = gradlen = dotpath = dottangrad = 0.0; - if (ireplica ==nreplica-1) { + if (ireplica == nreplica-1) { for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { - delxp = x[i][0] - xprev[i][0]; delyp = x[i][1] - xprev[i][1]; delzp = x[i][2] - xprev[i][2]; @@ -365,7 +360,9 @@ void FixNEB::min_post_force(int vflag) } } } else { + // not the first or last replica + double vmax = MAX(fabs(vnext-veng),fabs(vprev-veng)); double vmin = MIN(fabs(vnext-veng),fabs(vprev-veng)); @@ -464,6 +461,7 @@ void FixNEB::min_post_force(int vflag) if (ireplica < nreplica-1) dotgrad = dotgrad /(gradlen*gradnextlen); + dot = 0.0; if (FreeEndIni && ireplica == 0) { if (tlen > 0.0) { double dotall; @@ -576,8 +574,7 @@ void FixNEB::min_post_force(int vflag) MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); dot=dotall; - if (ireplica == rclimber) - prefactor = -2.0*dot; + if (ireplica == rclimber) prefactor = -2.0*dot; else { if (NEBLongRange) { prefactor = -dot - kspring*(lenuntilIm-idealPos)/(2*meanDist); @@ -831,7 +828,6 @@ void FixNEB::inter_replica_comm() void FixNEB::reallocate() { - maxlocal = atom->nmax; memory->destroy(xprev); diff --git a/src/REPLICA/fix_neb.h b/src/REPLICA/fix_neb.h index 290494bef4..1582912dac 100644 --- a/src/REPLICA/fix_neb.h +++ b/src/REPLICA/fix_neb.h @@ -70,7 +70,6 @@ class FixNEB : public Fix { void inter_replica_comm(); void reallocate(); - }; } From 4002dce63984aa906214990d06b6f121c80134c0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 22 May 2017 22:39:52 -0400 Subject: [PATCH 083/302] restore explicit NAN constants in output --- src/REPLICA/neb.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index efcea08fb4..1388a260ea 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -655,16 +655,16 @@ void NEB::print_status() for (int i = 0; i < nreplica; i++) fprintf(uscreen,"%12.8g %12.8g ",rdist[i],all[i][0]); if (verbose) { - fprintf(uscreen,"NaN %12.5g %12.5g %12.5g %12.5g %12.5g", - 180-acos(all[0][5])*todeg,180-acos(all[0][6])*todeg, + fprintf(uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", + NAN,180-acos(all[0][5])*todeg,180-acos(all[0][6])*todeg, all[0][3],freplica[0],fmaxatomInRepl[0]); for (int i = 1; i < nreplica-1; i++) fprintf(uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", 180-acos(all[i][4])*todeg,180-acos(all[i][5])*todeg, 180-acos(all[i][6])*todeg,all[i][3],freplica[i], fmaxatomInRepl[i]); - fprintf(uscreen,"NaN %12.5g NaN %12.5g %12.5g %12.5g", - 180-acos(all[nreplica-1][5])*todeg,all[nreplica-1][3], + fprintf(uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", + NAN,180-acos(all[nreplica-1][5])*todeg,NAN,all[nreplica-1][3], freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); } fprintf(uscreen,"\n"); @@ -679,16 +679,16 @@ void NEB::print_status() for (int i = 0; i < nreplica; i++) fprintf(ulogfile,"%12.8g %12.8g ",rdist[i],all[i][0]); if (verbose) { - fprintf(ulogfile,"NaN %12.5g %12.5g %12.5g %12.5g %12.5g", - 180-acos(all[0][5])*todeg,180-acos(all[0][6])*todeg, + fprintf(ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", + NAN,180-acos(all[0][5])*todeg,180-acos(all[0][6])*todeg, all[0][3],freplica[0],fmaxatomInRepl[0]); for (int i = 1; i < nreplica-1; i++) fprintf(ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", 180-acos(all[i][4])*todeg,180-acos(all[i][5])*todeg, 180-acos(all[i][6])*todeg,all[i][3],freplica[i], fmaxatomInRepl[i]); - fprintf(ulogfile,"NaN %12.5g NaN %12.5g %12.5g %12.5g", - 180-acos(all[nreplica-1][5])*todeg,all[nreplica-1][3], + fprintf(ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", + NAN,180-acos(all[nreplica-1][5])*todeg,NAN,all[nreplica-1][3], freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); } fprintf(ulogfile,"\n"); From bb890941ca401edb9d5ecbb9a665cbb6b685b1fa Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 May 2017 00:19:36 -0400 Subject: [PATCH 084/302] first chunk of code from USER-REAXC-OMP imported and adapted into USER-REAXC --- src/USER-REAXC/fix_qeq_reax.cpp | 106 ++++++++++++++++++++++++------ src/USER-REAXC/fix_qeq_reax.h | 39 ++++++----- src/USER-REAXC/fix_reaxc.h | 1 + src/USER-REAXC/pair_reaxc.cpp | 8 ++- src/USER-REAXC/pair_reaxc.h | 29 ++++---- src/USER-REAXC/reaxc_allocate.cpp | 62 +++++++++++++++-- src/USER-REAXC/reaxc_control.cpp | 1 + src/USER-REAXC/reaxc_types.h | 43 ++++++++++++ 8 files changed, 231 insertions(+), 58 deletions(-) diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 96df03c668..22b5382727 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -68,7 +68,7 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : { if (lmp->citeme) lmp->citeme->add(cite_fix_qeq_reax); - if (narg != 8) error->all(FLERR,"Illegal fix qeq/reax command"); + if (narg < 8 || narg > 9) error->all(FLERR,"Illegal fix qeq/reax command"); nevery = force->inumeric(FLERR,arg[3]); if (nevery <= 0) error->all(FLERR,"Illegal fix qeq/reax command"); @@ -78,6 +78,9 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : tolerance = force->numeric(FLERR,arg[6]); pertype_parameters(arg[7]); + // dual CG support only available for USER-OMP variant + dual_enabled = 0; + shld = NULL; n = n_cap = 0; @@ -111,16 +114,21 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : // perform initial allocation of atom-based arrays // register with Atom class - s_hist = t_hist = NULL; - grow_arrays(atom->nmax); - atom->add_callback(0); - for( int i = 0; i < atom->nmax; i++ ) - for (int j = 0; j < nprev; ++j ) - s_hist[i][j] = t_hist[i][j] = 0; - reaxc = NULL; reaxc = (PairReaxC *) force->pair_match("reax/c",1); + if (reaxc) { + s_hist = t_hist = NULL; + grow_arrays(atom->nmax); + atom->add_callback(0); + for( int i = 0; i < atom->nmax; i++ ) + for (int j = 0; j < nprev; ++j ) + s_hist[i][j] = t_hist[i][j] = 0; + } + + // dual CG support + // Update comm sizes for this fix + if (dual_enabled) comm_forward = comm_reverse = 2; } /* ---------------------------------------------------------------------- */ @@ -180,6 +188,10 @@ void FixQEqReax::pertype_parameters(char *arg) return; } + // OMP style will use it's own pertype_parameters() + Pair * pair = force->pair_match("reax/c/omp",1); + if (pair) return; + int i,itype,ntypes; double v1,v2,v3; FILE *pf; @@ -227,10 +239,14 @@ void FixQEqReax::allocate_storage() memory->create(b_prc,nmax,"qeq:b_prc"); memory->create(b_prm,nmax,"qeq:b_prm"); - memory->create(p,nmax,"qeq:p"); - memory->create(q,nmax,"qeq:q"); - memory->create(r,nmax,"qeq:r"); - memory->create(d,nmax,"qeq:d"); + // dual CG support + int size = nmax; + if (dual_enabled) size*= 2; + + memory->create(p,size,"qeq:p"); + memory->create(q,size,"qeq:q"); + memory->create(r,size,"qeq:r"); + memory->create(d,size,"qeq:d"); } /* ---------------------------------------------------------------------- */ @@ -437,6 +453,13 @@ void FixQEqReax::setup_pre_force_respa(int vflag, int ilevel) /* ---------------------------------------------------------------------- */ +void FixQEqReax::min_setup_pre_force(int vflag) +{ + setup_pre_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + void FixQEqReax::init_storage() { int NN; @@ -476,11 +499,14 @@ void FixQEqReax::pre_force(int vflag) reallocate_matrix(); init_matvec(); - matvecs = CG(b_s, s); // CG on s - parallel - matvecs += CG(b_t, t); // CG on t - parallel + + matvecs_s = CG(b_s, s); // CG on s - parallel + matvecs_t = CG(b_t, t); // CG on t - parallel + matvecs = matvecs_s + matvecs_t; + calculate_Q(); - if( comm->me == 0 ) { + if (comm->me == 0) { t_end = MPI_Wtime(); qeq_time = t_end - t_start; } @@ -702,7 +728,6 @@ int FixQEqReax::CG( double *b, double *x ) beta = sig_new / sig_old; vector_sum( d, 1., p, beta, d, nn ); - } if (i >= imax && comm->me == 0) { @@ -816,7 +841,15 @@ int FixQEqReax::pack_forward_comm(int n, int *list, double *buf, for(m = 0; m < n; m++) buf[m] = t[list[m]]; else if( pack_flag == 4 ) for(m = 0; m < n; m++) buf[m] = atom->q[list[m]]; - + else if( pack_flag == 5) { + m = 0; + for(int i = 0; i < n; i++) { + int j = 2 * list[i]; + buf[m++] = d[j ]; + buf[m++] = d[j+1]; + } + return m; + } return n; } @@ -834,6 +867,15 @@ void FixQEqReax::unpack_forward_comm(int n, int first, double *buf) for(m = 0, i = first; m < n; m++, i++) t[i] = buf[m]; else if( pack_flag == 4) for(m = 0, i = first; m < n; m++, i++) atom->q[i] = buf[m]; + else if( pack_flag == 5) { + int last = first + n; + m = 0; + for(i = first; i < last; i++) { + int j = 2 * i; + d[j ] = buf[m++]; + d[j+1] = buf[m++]; + } + } } /* ---------------------------------------------------------------------- */ @@ -841,15 +883,35 @@ void FixQEqReax::unpack_forward_comm(int n, int first, double *buf) int FixQEqReax::pack_reverse_comm(int n, int first, double *buf) { int i, m; - for(m = 0, i = first; m < n; m++, i++) buf[m] = q[i]; - return n; + if (pack_flag == 5) { + m = 0; + int last = first + n; + for(i = first; i < last; i++) { + int indxI = 2 * i; + buf[m++] = q[indxI ]; + buf[m++] = q[indxI+1]; + } + return m; + } else { + for (m = 0, i = first; m < n; m++, i++) buf[m] = q[i]; + return n; + } } /* ---------------------------------------------------------------------- */ void FixQEqReax::unpack_reverse_comm(int n, int *list, double *buf) { - for(int m = 0; m < n; m++) q[list[m]] += buf[m]; + if (pack_flag == 5) { + int m = 0; + for(int i = 0; i < n; i++) { + int indxI = 2 * list[i]; + q[indxI ] += buf[m++]; + q[indxI+1] += buf[m++]; + } + } else { + for (int m = 0; m < n; m++) q[list[m]] += buf[m]; + } } /* ---------------------------------------------------------------------- @@ -866,6 +928,9 @@ double FixQEqReax::memory_usage() bytes += m_cap * sizeof(int); bytes += m_cap * sizeof(double); + if (dual_enabled) + bytes += atom->nmax*4 * sizeof(double); // double size for q, d, r, and p + return bytes; } @@ -1034,5 +1099,4 @@ void FixQEqReax::vector_add( double* dest, double c, double* v, int k ) if (atom->mask[kk] & groupbit) dest[kk] += c * v[kk]; } - } diff --git a/src/USER-REAXC/fix_qeq_reax.h b/src/USER-REAXC/fix_qeq_reax.h index 7c3e8a8f96..d82232576a 100644 --- a/src/USER-REAXC/fix_qeq_reax.h +++ b/src/USER-REAXC/fix_qeq_reax.h @@ -39,15 +39,16 @@ class FixQEqReax : public Fix { FixQEqReax(class LAMMPS *, int, char **); ~FixQEqReax(); int setmask(); - void init(); + virtual void init(); void init_list(int,class NeighList *); - void init_storage(); + virtual void init_storage(); void setup_pre_force(int); - void pre_force(int); + virtual void pre_force(int); void setup_pre_force_respa(int, int); void pre_force_respa(int, int, int); + void min_setup_pre_force(int); void min_pre_force(int); int matvecs; @@ -99,25 +100,25 @@ class FixQEqReax : public Fix { //double **h; //double *hc, *hs; - void pertype_parameters(char*); + virtual void pertype_parameters(char*); void init_shielding(); void init_taper(); - void allocate_storage(); - void deallocate_storage(); + virtual void allocate_storage(); + virtual void deallocate_storage(); void reallocate_storage(); - void allocate_matrix(); + virtual void allocate_matrix(); void deallocate_matrix(); void reallocate_matrix(); - void init_matvec(); + virtual void init_matvec(); void init_H(); - void compute_H(); + virtual void compute_H(); double calculate_H(double,double); - void calculate_Q(); + virtual void calculate_Q(); - int CG(double*,double*); + virtual int CG(double*,double*); //int GMRES(double*,double*); - void sparse_matvec(sparse_matrix*,double*,double*); + virtual void sparse_matvec(sparse_matrix*,double*,double*); int pack_forward_comm(int, int *, double *, int, int *); void unpack_forward_comm(int, int, double *); @@ -129,12 +130,16 @@ class FixQEqReax : public Fix { int pack_exchange(int, double *); int unpack_exchange(int, double *); - double parallel_norm( double*, int ); - double parallel_dot( double*, double*, int ); - double parallel_vector_acc( double*, int ); + virtual double parallel_norm( double*, int ); + virtual double parallel_dot( double*, double*, int ); + virtual double parallel_vector_acc( double*, int ); - void vector_sum(double*,double,double*,double,double*,int); - void vector_add(double*, double, double*,int); + virtual void vector_sum(double*,double,double*,double,double*,int); + virtual void vector_add(double*, double, double*,int); + + // dual CG support + int dual_enabled; // 0: Original, separate s & t optimization; 1: dual optimization + int matvecs_s, matvecs_t; // Iteration count for each system }; } diff --git a/src/USER-REAXC/fix_reaxc.h b/src/USER-REAXC/fix_reaxc.h index e51a94e4a9..0e173f5ece 100644 --- a/src/USER-REAXC/fix_reaxc.h +++ b/src/USER-REAXC/fix_reaxc.h @@ -36,6 +36,7 @@ namespace LAMMPS_NS { class FixReaxC : public Fix { friend class PairReaxC; + friend class PairReaxCOMP; public: FixReaxC(class LAMMPS *,int, char **); diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index d51b0fc2f8..b520fc14c7 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -211,6 +211,9 @@ void PairReaxC::settings(int narg, char **arg) control->thb_cutsq = 0.00001; control->bg_cut = 0.3; + // Initialize for when omp style included + control->nthreads = 1; + out_control->write_steps = 0; out_control->traj_method = 0; strcpy( out_control->traj_title, "default_title" ); @@ -256,7 +259,7 @@ void PairReaxC::settings(int narg, char **arg) system->safezone = force->numeric(FLERR,arg[iarg+1]); if (system->safezone < 0.0) error->all(FLERR,"Illegal pair_style reax/c safezone command"); - system->saferzone = system->safezone*1.2; + system->saferzone = system->safezone*1.2 + 0.2; iarg += 2; } else if (strcmp(arg[iarg],"mincap") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reax/c command"); @@ -457,6 +460,9 @@ void PairReaxC::setup( ) ReAllocate( system, control, data, workspace, &lists, mpi_data ); } + + bigint local_ngroup = list->inum; + MPI_Allreduce( &local_ngroup, &ngroup, 1, MPI_LMP_BIGINT, MPI_SUM, world ); } /* ---------------------------------------------------------------------- */ diff --git a/src/USER-REAXC/pair_reaxc.h b/src/USER-REAXC/pair_reaxc.h index e3c9e63bdc..5658648db6 100644 --- a/src/USER-REAXC/pair_reaxc.h +++ b/src/USER-REAXC/pair_reaxc.h @@ -37,20 +37,6 @@ namespace LAMMPS_NS { class PairReaxC : public Pair { public: - int fixbond_flag, fixspecies_flag; - int **tmpid; - double **tmpbo,**tmpr; - double *chi,*eta,*gamma; - - int *map; - control_params *control; - reax_system *system; - output_controls *out_control; - simulation_data *data; - storage *workspace; - reax_list *lists; - mpi_datatypes *mpi_data; - PairReaxC(class LAMMPS *); ~PairReaxC(); void compute(int, int); @@ -59,13 +45,28 @@ class PairReaxC : public Pair { void init_style(); double init_one(int, int); void *extract(const char *, int &); + int fixbond_flag, fixspecies_flag; + int **tmpid; + double **tmpbo,**tmpr; + + control_params *control; + reax_system *system; + output_controls *out_control; + simulation_data *data; + storage *workspace; + reax_list *lists; + mpi_datatypes *mpi_data; + + bigint ngroup; protected: double cutmax; int nelements; // # of unique elements char **elements; // names of unique elements + int *map; class FixReaxC *fix_reax; + double *chi,*eta,*gamma; int qeqflag; int setup_flag; int firstwarn; diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 969912e082..ac835e7ce3 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -31,6 +31,10 @@ #include "reaxc_tool_box.h" #include "reaxc_vector.h" +#if defined(_OPENMP) +#include +#endif + /* allocate space for my_atoms important: we cannot know the exact number of atoms that will fall into a process's box throughout the whole simulation. therefore @@ -49,6 +53,15 @@ int PreAllocate_Space( reax_system *system, control_params *control, system->my_atoms = (reax_atom*) scalloc( system->total_cap, sizeof(reax_atom), "my_atoms", comm ); + // Nullify some arrays only used in omp styles + // Should be safe to do here since called in pair->setup(); +#ifdef LMP_USER_OMP + workspace->CdDeltaReduction = NULL; + workspace->forceReduction = NULL; + workspace->valence_angle_atom_myoffset = NULL; + workspace->my_ext_pressReduction = NULL; +#endif + return SUCCESS; } @@ -174,13 +187,21 @@ void DeAllocate_Workspace( control_params *control, storage *workspace ) sfree( workspace->q2, "q2" ); sfree( workspace->p2, "p2" ); - /* integrator */ + /* integrator storage */ sfree( workspace->v_const, "v_const" ); /* force related storage */ sfree( workspace->f, "f" ); sfree( workspace->CdDelta, "CdDelta" ); + /* reductions */ +#ifdef LMP_USER_OMP + if(workspace->CdDeltaReduction) sfree( workspace->CdDeltaReduction, "cddelta_reduce" ); + if(workspace->forceReduction) sfree( workspace->forceReduction, "f_reduce" ); + if(workspace->valence_angle_atom_myoffset) sfree( workspace->valence_angle_atom_myoffset, "valence_angle_atom_myoffset"); + + if (control->virial && workspace->my_ext_pressReduction) sfree( workspace->my_ext_pressReduction, "ext_press_reduce"); +#endif } @@ -272,10 +293,24 @@ int Allocate_Workspace( reax_system *system, control_params *control, /* integrator storage */ workspace->v_const = (rvec*) smalloc( local_rvec, "v_const", comm ); - // /* force related storage */ + /* force related storage */ workspace->f = (rvec*) scalloc( total_cap, sizeof(rvec), "f", comm ); workspace->CdDelta = (double*) scalloc( total_cap, sizeof(double), "CdDelta", comm ); + + // storage for reductions with multiple threads +#ifdef LMP_USER_OMP + workspace->CdDeltaReduction = (double *) scalloc(sizeof(double), total_cap*control->nthreads, + "cddelta_reduce", comm); + + workspace->forceReduction = (rvec *) scalloc(sizeof(rvec), total_cap*control->nthreads, + "forceReduction", comm); + + workspace->valence_angle_atom_myoffset = (int *) scalloc(sizeof(int), total_cap, "valence_angle_atom_myoffset", comm); + + if (control->virial) + workspace->my_ext_pressReduction = (rvec *) calloc(sizeof(rvec), control->nthreads); +#endif return SUCCESS; } @@ -333,13 +368,30 @@ static int Reallocate_Bonds_List( reax_system *system, reax_list *bonds, *total_bonds += system->my_atoms[i].num_bonds; } *total_bonds = (int)(MAX( *total_bonds * safezone, mincap*MIN_BONDS )); - + +#ifdef LMP_USER_OMP + for (i = 0; i < bonds->num_intrs; ++i) + sfree(bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); +#endif + Delete_List( bonds, comm ); if(!Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds, comm)) { fprintf( stderr, "not enough space for bonds list. terminating!\n" ); MPI_Abort( comm, INSUFFICIENT_MEMORY ); } - + +#ifdef LMP_USER_OMP +#if defined(_OPENMP) + int nthreads = omp_get_num_threads(); +#else + int nthreads = 1; +#endif + + for (i = 0; i < bonds->num_intrs; ++i) + bonds->select.bond_list[i].bo_data.CdboReduction = + (double*) smalloc(sizeof(double)*nthreads, "CdboReduction", comm); +#endif + return SUCCESS; } @@ -438,7 +490,7 @@ void ReAllocate( reax_system *system, control_params *control, Reallocate_Bonds_List( system, (*lists)+BONDS, &num_bonds, &est_3body, comm ); realloc->bonds = 0; - realloc->num_3body = MAX( realloc->num_3body, est_3body ); + realloc->num_3body = MAX( realloc->num_3body, est_3body ) * 2; } /* 3-body list */ diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index 4def41bc8c..11a89020b8 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -48,6 +48,7 @@ char Read_Control_File( char *control_file, control_params* control, control->nsteps = 0; control->dt = 0.25; control->nprocs = 1; + control->nthreads = 1; control->procs_by_dim[0] = 1; control->procs_by_dim[1] = 1; control->procs_by_dim[2] = 1; diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index b3e2f40f02..1b9ce63dc2 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -38,6 +38,40 @@ #include "sys/time.h" #include +#if defined LMP_USER_OMP +#define OMP_TIMING 1 + +#ifdef OMP_TIMING +// pkcoff timing fields +enum { + COMPUTEINDEX=0, + COMPUTEWLINDEX, + COMPUTEBFINDEX, + COMPUTEQEQINDEX, + COMPUTENBFINDEX, + COMPUTEIFINDEX, + COMPUTETFINDEX, + COMPUTEBOINDEX, + COMPUTEBONDSINDEX, + COMPUTEATOMENERGYINDEX, + COMPUTEVALENCEANGLESBOINDEX, + COMPUTETORSIONANGLESBOINDEX, + COMPUTEHBONDSINDEX, + COMPUTECG1INDEX, + COMPUTECG2INDEX, + COMPUTECGCOMPUTEINDEX, + COMPUTECALCQINDEX, + COMPUTEINITMVINDEX, + COMPUTEMVCOMPINDEX, + LASTTIMINGINDEX +}; + +extern double ompTimingData[LASTTIMINGINDEX]; +extern int ompTimingCount[LASTTIMINGINDEX]; +extern int ompTimingCGCount[LASTTIMINGINDEX]; +#endif +#endif + /************* SOME DEFS - crucial for reax_types.h *********/ #define LAMMPS_REAX @@ -391,6 +425,7 @@ typedef struct { char sim_name[REAX_MAX_STR]; int nprocs; + int nthreads; ivec procs_by_dim; /* ensemble values: 0 : NVE @@ -616,6 +651,7 @@ typedef struct{ double C1dbopi, C2dbopi, C3dbopi, C4dbopi; double C1dbopi2, C2dbopi2, C3dbopi2, C4dbopi2; rvec dBOp, dln_BOp_s, dln_BOp_pi, dln_BOp_pi2; + double *CdboReduction; } bond_order_data; typedef struct { @@ -702,6 +738,13 @@ typedef struct double *CdDelta; // coefficient of dDelta rvec *f; + /* omp */ + rvec *forceReduction; + rvec *my_ext_pressReduction; + double *CdDeltaReduction; + int *valence_angle_atom_myoffset; + + reallocate_data realloc; } storage; From 4f9e7cbd161ffea53510f78c6666b8d2548afaad Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Wed, 24 May 2017 13:36:14 -0400 Subject: [PATCH 085/302] Cleaned up docs for pair_mores, a missing :pre ruined formatting. --- doc/src/pair_morse.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/pair_morse.txt b/doc/src/pair_morse.txt index c5e3a3c399..5fbb6d5c0a 100644 --- a/doc/src/pair_morse.txt +++ b/doc/src/pair_morse.txt @@ -26,7 +26,7 @@ args = list of arguments for a particular style :ul {morse/smooth/linear} args = cutoff cutoff = global cutoff for Morse interactions (distance units) {morse/soft} args = n lf cutoff - n = soft-core parameter + n = soft-core parameter lf = transformation range is lf < lambda < 1 cutoff = global cutoff for Morse interactions (distance units) :pre @@ -36,7 +36,7 @@ args = list of arguments for a particular style :ul pair_style morse 2.5 pair_style morse/smooth/linear 2.5 pair_coeff * * 100.0 2.0 1.5 -pair_coeff 1 1 100.0 2.0 1.5 3.0 +pair_coeff 1 1 100.0 2.0 1.5 3.0 :pre pair_style morse/soft 4 0.9 10.0 pair_coeff * * 100.0 2.0 1.5 1.0 From 5345ad2da7bd5dc9419f2b547acf6206d6cd73ca Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 May 2017 16:24:43 -0400 Subject: [PATCH 086/302] merge in the remainder of the USER-REAXC-OMP code. still a lot of work to do. compiles only with -fopenmp active --- src/Depend.sh | 1 + src/USER-OMP/fix_qeq_reax_omp.cpp | 1300 +++++++++++++++++++++ src/USER-OMP/fix_qeq_reax_omp.h | 84 ++ src/USER-OMP/fix_reaxc_species_omp.cpp | 83 ++ src/USER-OMP/fix_reaxc_species_omp.h | 44 + src/USER-OMP/pair_reaxc_omp.cpp | 584 +++++++++ src/USER-OMP/pair_reaxc_omp.h | 113 ++ src/USER-OMP/reaxc_bond_orders_omp.cpp | 711 +++++++++++ src/USER-OMP/reaxc_bond_orders_omp.h | 43 + src/USER-OMP/reaxc_bonds_omp.cpp | 174 +++ src/USER-OMP/reaxc_bonds_omp.h | 35 + src/USER-OMP/reaxc_forces_omp.cpp | 637 ++++++++++ src/USER-OMP/reaxc_forces_omp.h | 36 + src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp | 242 ++++ src/USER-OMP/reaxc_hydrogen_bonds_omp.h | 35 + src/USER-OMP/reaxc_init_md_omp.cpp | 188 +++ src/USER-OMP/reaxc_init_md_omp.h | 34 + src/USER-OMP/reaxc_multi_body_omp.cpp | 285 +++++ src/USER-OMP/reaxc_multi_body_omp.h | 35 + src/USER-OMP/reaxc_nonbonded_omp.cpp | 383 ++++++ src/USER-OMP/reaxc_nonbonded_omp.h | 38 + src/USER-OMP/reaxc_torsion_angles_omp.cpp | 467 ++++++++ src/USER-OMP/reaxc_torsion_angles_omp.h | 36 + src/USER-OMP/reaxc_valence_angles_omp.cpp | 613 ++++++++++ src/USER-OMP/reaxc_valence_angles_omp.h | 37 + src/USER-REAXC/fix_qeq_reax.cpp | 15 +- src/USER-REAXC/fix_qeq_reax.h | 2 + src/USER-REAXC/pair_reaxc.h | 2 +- 28 files changed, 6254 insertions(+), 3 deletions(-) create mode 100644 src/USER-OMP/fix_qeq_reax_omp.cpp create mode 100644 src/USER-OMP/fix_qeq_reax_omp.h create mode 100644 src/USER-OMP/fix_reaxc_species_omp.cpp create mode 100644 src/USER-OMP/fix_reaxc_species_omp.h create mode 100644 src/USER-OMP/pair_reaxc_omp.cpp create mode 100644 src/USER-OMP/pair_reaxc_omp.h create mode 100644 src/USER-OMP/reaxc_bond_orders_omp.cpp create mode 100644 src/USER-OMP/reaxc_bond_orders_omp.h create mode 100644 src/USER-OMP/reaxc_bonds_omp.cpp create mode 100644 src/USER-OMP/reaxc_bonds_omp.h create mode 100644 src/USER-OMP/reaxc_forces_omp.cpp create mode 100644 src/USER-OMP/reaxc_forces_omp.h create mode 100644 src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp create mode 100644 src/USER-OMP/reaxc_hydrogen_bonds_omp.h create mode 100644 src/USER-OMP/reaxc_init_md_omp.cpp create mode 100644 src/USER-OMP/reaxc_init_md_omp.h create mode 100644 src/USER-OMP/reaxc_multi_body_omp.cpp create mode 100644 src/USER-OMP/reaxc_multi_body_omp.h create mode 100644 src/USER-OMP/reaxc_nonbonded_omp.cpp create mode 100644 src/USER-OMP/reaxc_nonbonded_omp.h create mode 100644 src/USER-OMP/reaxc_torsion_angles_omp.cpp create mode 100644 src/USER-OMP/reaxc_torsion_angles_omp.h create mode 100644 src/USER-OMP/reaxc_valence_angles_omp.cpp create mode 100644 src/USER-OMP/reaxc_valence_angles_omp.h diff --git a/src/Depend.sh b/src/Depend.sh index 520d9ae2bf..0962dace51 100644 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -126,4 +126,5 @@ fi if (test $1 = "USER-REAXC") then depend KOKKOS + depend USER-OMP fi diff --git a/src/USER-OMP/fix_qeq_reax_omp.cpp b/src/USER-OMP/fix_qeq_reax_omp.cpp new file mode 100644 index 0000000000..c8e5e3cb93 --- /dev/null +++ b/src/USER-OMP/fix_qeq_reax_omp.cpp @@ -0,0 +1,1300 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hasan Metin Aktulga, Purdue University + (now at Lawrence Berkeley National Laboratory, hmaktulga@lbl.gov) + + Hybrid and sub-group capabilities: Ray Shan (Sandia) +------------------------------------------------------------------------- */ + +#include "math.h" +#include "stdio.h" +#include "stdlib.h" +#include "string.h" +#include "fix_qeq_reax_omp.h" +#include "pair_reaxc_omp.h" +#include "atom.h" +#include "comm.h" +#include "domain.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "update.h" +#include "force.h" +#include "group.h" +#include "pair.h" +#include "respa.h" +#include "memory.h" +#include "citeme.h" +#include "error.h" +#include "reaxc_defs.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +#define EV_TO_KCAL_PER_MOL 14.4 +//#define DANGER_ZONE 0.95 +//#define LOOSE_ZONE 0.7 +#define SQR(x) ((x)*(x)) +#define CUBE(x) ((x)*(x)*(x)) +#define MIN_NBRS 100 + +/* ---------------------------------------------------------------------- */ + +FixQEqReaxOMP::FixQEqReaxOMP(LAMMPS *lmp, int narg, char **arg) : + FixQEqReax(lmp, narg, arg) +{ + if (narg < 8 || narg > 9) error->all(FLERR,"Illegal fix qeq/reax/omp command"); + + nevery = force->inumeric(FLERR,arg[3]); + swa = force->numeric(FLERR,arg[4]); + swb = force->numeric(FLERR,arg[5]); + tolerance = force->numeric(FLERR,arg[6]); + + // dual CG support + dual_enabled = 0; + if(narg == 9) + if(strcmp(arg[8],"dual") == 0) dual_enabled = 1; + else error->all(FLERR,"Unknown fix qeq/reax argument in location 9"); + + // perform initial allocation of atom-based arrays + // register with Atom class + + s_hist = t_hist = NULL; + grow_arrays(atom->nmax); + atom->add_callback(0); + for( int i = 0; i < atom->nmax; i++ ) + for (int j = 0; j < nprev; ++j ) + s_hist[i][j] = t_hist[i][j] = 0; + + reaxc = NULL; + reaxc = (PairReaxCOMP *) force->pair_match("reax/c/omp",1); + + b_temp = NULL; + + // ASPC: Kolafa, J. Comp. Chem., 25(3), 335 (2003) + do_aspc = 0; + aspc_order = 1; + aspc_order_max = nprev - 2; // Must be consistent with nprev to store history: nprev = aspc_order + 2 + aspc_omega = 0.0; + aspc_b = NULL; +} + +FixQEqReaxOMP::~FixQEqReaxOMP() +{ + memory->destroy(b_temp); +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::post_constructor() +{ + pertype_parameters(pertype_option); +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::pertype_parameters(char *arg) +{ + if (strcmp(arg,"reax/c") == 0) { + reaxflag = 1; + Pair *pair = force->pair_match("reax/c",0); + if (pair == NULL) error->all(FLERR,"No pair reax/c for fix qeq/reax/omp"); + int tmp; + chi = (double *) pair->extract("chi",tmp); + eta = (double *) pair->extract("eta",tmp); + gamma = (double *) pair->extract("gamma",tmp); + if (chi == NULL || eta == NULL || gamma == NULL) + error->all(FLERR, + "Fix qeq/reax/omp could not extract params from pair reax/c"); + return; + } + + int i,itype,ntypes; + double v1,v2,v3; + FILE *pf; + + reaxflag = 0; + ntypes = atom->ntypes; + + memory->create(chi,ntypes+1,"qeq/reax:chi"); + memory->create(eta,ntypes+1,"qeq/reax:eta"); + memory->create(gamma,ntypes+1,"qeq/reax:gamma"); + + if (comm->me == 0) { + if ((pf = fopen(arg,"r")) == NULL) + error->one(FLERR,"Fix qeq/reax/omp parameter file could not be found"); + + for (i = 1; i <= ntypes && !feof(pf); i++) { + fscanf(pf,"%d %lg %lg %lg",&itype,&v1,&v2,&v3); + if (itype < 1 || itype > ntypes) + error->one(FLERR,"Fix qeq/reax/omp invalid atom type in param file"); + chi[itype] = v1; + eta[itype] = v2; + gamma[itype] = v3; + } + if (i <= ntypes) error->one(FLERR,"Invalid param file for fix qeq/reax/omp"); + fclose(pf); + } + + MPI_Bcast(&chi[1],ntypes,MPI_DOUBLE,0,world); + MPI_Bcast(&eta[1],ntypes,MPI_DOUBLE,0,world); + MPI_Bcast(&gamma[1],ntypes,MPI_DOUBLE,0,world); +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::allocate_storage() +{ + FixQEqReax::allocate_storage(); + + // dual CG support + int size = nmax; + if(dual_enabled) size*= 2; + memory->create(b_temp, comm->nthreads, size, "qeq/reax/omp:b_temp"); +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::deallocate_storage() +{ + memory->destroy(b_temp); + + FixQEqReax::deallocate_storage(); +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::allocate_matrix() +{ + int i,ii,inum,m; + int *ilist, *numneigh; + + int mincap; + double safezone; + + if( reaxflag ) { + mincap = reaxc->system->mincap; + safezone = reaxc->system->safezone; + } else { + mincap = MIN_CAP; + safezone = SAFE_ZONE; + } + + n = atom->nlocal; + n_cap = MAX( (int)(n * safezone), mincap ); + + // determine the total space for the H matrix + + if (reaxc) { + inum = reaxc->list->inum; + ilist = reaxc->list->ilist; + numneigh = reaxc->list->numneigh; + } else { + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + } + + m = 0; + for( ii = 0; ii < inum; ii++ ) { + i = ilist[ii]; + m += numneigh[i]; + } + m_cap = MAX( (int)(m * safezone), mincap * MIN_NBRS ); + + H.n = n_cap; + H.m = m_cap; + memory->create(H.firstnbr,n_cap,"qeq:H.firstnbr"); + memory->create(H.numnbrs,n_cap,"qeq:H.numnbrs"); + memory->create(H.jlist,m_cap,"qeq:H.jlist"); + memory->create(H.val,m_cap,"qeq:H.val"); +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::init() +{ + if (!atom->q_flag) error->all(FLERR,"Fix qeq/reax/omp requires atom attribute q"); + + ngroup = group->count(igroup); + if (ngroup == 0) error->all(FLERR,"Fix qeq/reax group has no atoms"); + + if (!force->pair_match("reax/c/omp",1)) + error->all(FLERR,"Must use pair_style reax/c/omp with fix qeq/reax/omp"); + + // need a half neighbor list w/ Newton off and ghost neighbors + // built whenever re-neighboring occurs + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->pair = 0; + neighbor->requests[irequest]->fix = 1; + neighbor->requests[irequest]->newton = 2; + neighbor->requests[irequest]->ghost = 1; + + init_shielding(); + init_taper(); + + if (strstr(update->integrate_style,"respa")) + nlevels_respa = ((Respa *) update->integrate)->nlevels; + + // APSC setup + if(do_aspc) { + memory->create(aspc_b, aspc_order_max+2, "qeq/reax/aspc_b"); + + // Calculate damping factor + double o = double(aspc_order); + aspc_omega = (o+2.0) / (2*o+3.0); + + // Calculate B coefficients + double c = (4.0 * o + 6.0) / (o + 3.0); + aspc_b[0] = c; + + double n = 1.0; + double d = 4.0; + double s = -1.0; + double f = 2.0; + + for(int i=1; iall(FLERR,"Early Termination"); + } +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::compute_H() +{ + int inum, *ilist, *numneigh, **firstneigh; + double SMALL = 0.0001; + + int *type = atom->type; + tagint * tag = atom->tag; + double **x = atom->x; + int *mask = atom->mask; + + if(reaxc) { + inum = reaxc->list->inum; + ilist = reaxc->list->ilist; + numneigh = reaxc->list->numneigh; + firstneigh = reaxc->list->firstneigh; + } else { + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + } + int ai, num_nbrs; + + // sumscan of the number of neighbors per atom to determine the offsets + // most likely, we are overallocating. desirable to work on this part + // to reduce the memory footprint of the far_nbrs list. + + num_nbrs = 0; + + for (int itr_i = 0; itr_i < inum; ++itr_i) { + ai = ilist[itr_i]; + H.firstnbr[ai] = num_nbrs; + num_nbrs += numneigh[ai]; + } + + // fill in the H matrix + +#pragma omp parallel default(shared) + { + int i, j, ii, jj, mfill, jnum, flag; + int *jlist; + double dx, dy, dz, r_sqr; + + mfill = 0; + + //#pragma omp for schedule(dynamic,50) +#pragma omp for schedule(guided) + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + if(mask[i] & groupbit) { + jlist = firstneigh[i]; + jnum = numneigh[i]; + mfill = H.firstnbr[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + + dx = x[j][0] - x[i][0]; + dy = x[j][1] - x[i][1]; + dz = x[j][2] - x[i][2]; + r_sqr = SQR(dx) + SQR(dy) + SQR(dz); + + flag = 0; + if (r_sqr <= SQR(swb)) { + if (j < n) flag = 1; + else if (tag[i] < tag[j]) flag = 1; + else if (tag[i] == tag[j]) { + if (dz > SMALL) flag = 1; + else if (fabs(dz) < SMALL) { + if (dy > SMALL) flag = 1; + else if (fabs(dy) < SMALL && dx > SMALL) flag = 1; + } + } + } + + if( flag ) { + H.jlist[mfill] = j; + H.val[mfill] = calculate_H( sqrt(r_sqr), shld[type[i]][type[j]] ); + mfill++; + } + } + + H.numnbrs[i] = mfill - H.firstnbr[i]; + } + } + + if (mfill >= H.m) { + char str[128]; + sprintf(str,"H matrix size has been exceeded: mfill=%d H.m=%d\n", + mfill, H.m ); + error->warning(FLERR,str); + error->all(FLERR,"Fix qeq/reax/omp has insufficient QEq matrix size"); + } + } // omp + +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::init_storage() +{ + int NN; + + if(reaxc) NN = reaxc->list->inum + reaxc->list->gnum; + else NN = list->inum + list->gnum; + +#pragma omp parallel for schedule(static) + for (int i = 0; i < NN; i++) { + Hdia_inv[i] = 1. / eta[atom->type[i]]; + b_s[i] = -chi[atom->type[i]]; + b_t[i] = -1.0; + b_prc[i] = 0; + b_prm[i] = 0; + s[i] = t[i] = 0; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::pre_force(int vflag) +{ + +#ifdef OMP_TIMING + double endTimeBase, startTimeBase, funcstartTimeBase; + funcstartTimeBase = MPI_Wtime(); +#endif + + double t_start, t_end; + + if (update->ntimestep % nevery) return; + if( comm->me == 0 ) t_start = MPI_Wtime(); + + n = atom->nlocal; + N = atom->nlocal + atom->nghost; + + // grow arrays if necessary + // need to be atom->nmax in length + + if( atom->nmax > nmax ) reallocate_storage(); + if( n > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE ) + reallocate_matrix(); + +#ifdef OMP_TIMING + startTimeBase = MPI_Wtime(); +#endif + + init_matvec(); + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTEINITMVINDEX] += (endTimeBase-startTimeBase); + startTimeBase = endTimeBase; +#endif + + if(dual_enabled) matvecs = dual_CG(b_s, b_t, s, t); // OMP_TIMING inside dual_CG + else { + + matvecs_s = CG(b_s, s); // CG on s - parallel + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTECG1INDEX] += (endTimeBase-startTimeBase); + ompTimingCount[COMPUTECG1INDEX]++; + ompTimingCGCount[COMPUTECG1INDEX]+= matvecs_s; + startTimeBase = endTimeBase; +#endif + + matvecs_t = CG(b_t, t); // CG on t - parallel + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTECG2INDEX] += (endTimeBase-startTimeBase); + ompTimingCount[COMPUTECG2INDEX]++; + ompTimingCGCount[COMPUTECG2INDEX]+= matvecs_t; + startTimeBase = endTimeBase; +#endif + + } // if(dual_enabled) + + // if(comm->me == 0) fprintf(stdout,"matvecs= %i %i\n",matvecs_s,matvecs_t); + +#ifdef OMP_TIMING + startTimeBase = MPI_Wtime(); +#endif + + calculate_Q(); + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTECALCQINDEX] += (endTimeBase-startTimeBase); +#endif + + if( comm->me == 0 ) { + t_end = MPI_Wtime(); + qeq_time = t_end - t_start; + } + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTEQEQINDEX] += (endTimeBase-funcstartTimeBase); +#endif +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::init_matvec() +{ +#ifdef OMP_TIMING + long endTimeBase, startTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + /* fill-in H matrix */ + compute_H(); + + int nn,i; + int *ilist; + + if(reaxc) { + nn = reaxc->list->inum; + ilist = reaxc->list->ilist; + } else { + nn = list->inum; + ilist = list->ilist; + } + + // Should really be more careful with initialization and first (aspc_order+2) MD steps + if(do_aspc) { + + double m_aspc_omega = 1.0 - aspc_omega; +#pragma omp parallel for schedule(dynamic,50) private(i) + for(int ii = 0; ii < nn; ++ii ) { + i = ilist[ii]; + if(atom->mask[i] & groupbit) { + + /* init pre-conditioner for H and init solution vectors */ + Hdia_inv[i] = 1. / eta[ atom->type[i] ]; + b_s[i] = -chi[ atom->type[i] ]; + b_t[i] = -1.0; + + // Predictor Step + double tp = 0.0; + double sp = 0.0; + for(int j=0; jmask[i] & groupbit) { + + /* init pre-conditioner for H and init solution vectors */ + Hdia_inv[i] = 1. / eta[ atom->type[i] ]; + b_s[i] = -chi[ atom->type[i] ]; + b_t[i] = -1.0; + + /* linear extrapolation for s & t from previous solutions */ + //s[i] = 2 * s_hist[i][0] - s_hist[i][1]; + //t[i] = 2 * t_hist[i][0] - t_hist[i][1]; + + /* quadratic extrapolation for s & t from previous solutions */ + //s[i] = s_hist[i][2] + 3 * ( s_hist[i][0] - s_hist[i][1] ); + t[i] = t_hist[i][2] + 3 * ( t_hist[i][0] - t_hist[i][1] ); + + /* cubic extrapolation for s & t from previous solutions */ + s[i] = 4*(s_hist[i][0]+s_hist[i][2])-(6*s_hist[i][1]+s_hist[i][3]); + //t[i] = 4*(t_hist[i][0]+t_hist[i][2])-(6*t_hist[i][1]+t_hist[i][3]); + } + } + } + + pack_flag = 2; + comm->forward_comm_fix(this); //Dist_vector( s ); + pack_flag = 3; + comm->forward_comm_fix(this); //Dist_vector( t ); + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTEMVCOMPINDEX] += (long) (endTimeBase-startTimeBase); +#endif +} + +/* ---------------------------------------------------------------------- */ + +int FixQEqReaxOMP::CG( double *b, double *x ) +{ + int i, ii, j, imax; + double tmp, alpha, beta, b_norm; + double sig_old, sig_new; + + double my_buf[2], buf[2]; + + int nn, jj; + int *ilist; + if (reaxc) { + nn = reaxc->list->inum; + ilist = reaxc->list->ilist; + } else { + nn = list->inum; + ilist = list->ilist; + } + + imax = 200; + + pack_flag = 1; + sparse_matvec( &H, x, q ); + comm->reverse_comm_fix( this ); //Coll_Vector( q ); + + double tmp1, tmp2; + tmp1 = tmp2 = 0.0; + +#pragma omp parallel for schedule(dynamic,50) private(i) reduction(+:tmp1,tmp2) + for( jj = 0; jj < nn; ++jj ) { + i = ilist[jj]; + if (atom->mask[i] & groupbit) { + r[i] = b[i] - q[i]; + d[i] = r[i] * Hdia_inv[i]; //pre-condition + + tmp1 += b[i] * b[i]; + tmp2 += r[i] * d[i]; + } + } + + my_buf[0] = tmp1; + my_buf[1] = tmp2; + + MPI_Allreduce(&my_buf, &buf, 2, MPI_DOUBLE, MPI_SUM, world); + + b_norm = sqrt(buf[0]); + sig_new = buf[1]; + + for( i = 1; i < imax && sqrt(sig_new) / b_norm > tolerance; ++i ) { + comm->forward_comm_fix(this); //Dist_vector( d ); + sparse_matvec( &H, d, q ); + comm->reverse_comm_fix(this); //Coll_vector( q ); + + tmp1 = 0.0; +#pragma omp parallel + { + +#pragma omp for schedule(dynamic,50) private(ii) reduction(+:tmp1) + for( jj = 0; jj < nn; jj++) { + ii = ilist[jj]; + if(atom->mask[ii] & groupbit) tmp1 += d[ii] * q[ii]; + } + +#pragma omp barrier +#pragma omp master + { + MPI_Allreduce(&tmp1, &tmp2, 1, MPI_DOUBLE, MPI_SUM, world); + + alpha = sig_new / tmp2; + tmp1 = 0.0; + } + +#pragma omp barrier +#pragma omp for schedule(dynamic,50) private(ii) reduction(+:tmp1) + for( jj = 0; jj < nn; jj++) { + ii = ilist[jj]; + if(atom->mask[ii] & groupbit) { + x[ii] += alpha * d[ii]; + r[ii] -= alpha * q[ii]; + + // pre-conditioning + p[ii] = r[ii] * Hdia_inv[ii]; + tmp1 += r[ii] * p[ii]; + } + } + } // omp parallel + + sig_old = sig_new; + + MPI_Allreduce(&tmp1, &tmp2, 1, MPI_DOUBLE, MPI_SUM, world); + + sig_new = tmp2; + beta = sig_new / sig_old; + +#pragma omp for schedule(dynamic,50) private(ii) + for( jj = 0; jj < nn; jj++) { + ii = ilist[jj]; + if(atom->mask[ii] & groupbit) d[ii] = p[ii] + beta * d[ii]; + } + } + + if (i >= imax && comm->me == 0) { + char str[128]; + sprintf(str,"Fix qeq/reax CG convergence failed after %d iterations " + "at " BIGINT_FORMAT " step",i,update->ntimestep); + error->warning(FLERR,str); + } + + return i; +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::sparse_matvec( sparse_matrix *A, double *x, double *b ) +{ +#pragma omp parallel default(shared) + { + int i, j, itr_j; + int nn, NN, ii; + int *ilist; + int nthreads = comm->nthreads; + int tid = omp_get_thread_num(); + + if(reaxc) { + nn = reaxc->list->inum; + NN = reaxc->list->inum + reaxc->list->gnum; + ilist = reaxc->list->ilist; + } else { + nn = list->inum; + NN = list->inum + list->gnum; + ilist = list->ilist; + } + +#pragma omp for schedule(dynamic,50) + for (ii = 0; ii < nn; ++ii) { + i = ilist[ii]; + if(atom->mask[i] & groupbit) b[i] = eta[ atom->type[i] ] * x[i]; + } + +#pragma omp for schedule(dynamic,50) + for (ii = nn; ii < NN; ++ii) { + i = ilist[ii]; + if(atom->mask[i] & groupbit) b[i] = 0; + } + +#pragma omp for schedule(dynamic,50) + for (i = 0; i < NN; ++i) + for(int t=0; tmask[i] & groupbit) { + for (itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { + j = A->jlist[itr_j]; + b[i] += A->val[itr_j] * x[j]; + + b_temp[tid][j] += A->val[itr_j] * x[i]; + } + } + } + + // Wait till b_temp accumulated +#pragma omp barrier + +#pragma omp for schedule(dynamic,50) + for (i = 0; i < NN; ++i) + for (int t = 0; t < nthreads; ++t) b[i] += b_temp[t][i]; + + } //end omp parallel +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::calculate_Q() +{ + int i; + double *q = atom->q; + + int nn; + int *ilist; + + if (reaxc) { + nn = reaxc->list->inum; + ilist = reaxc->list->ilist; + } else { + nn = list->inum; + ilist = list->ilist; + } + + double tmp1, tmp2; + tmp1 = tmp2 = 0.0; +#pragma omp parallel for schedule(dynamic,50) private(i) reduction(+:tmp1,tmp2) + for(int ii = 0; ii < nn; ii++) { + i = ilist[ii]; + if(atom->mask[i] & groupbit) { + tmp1 += s[i]; + tmp2 += t[i]; + } + } + + double my_buf[2], buf[2]; + buf[0] = 0.0; + buf[1] = 0.0; + + my_buf[0] = tmp1; + my_buf[1] = tmp2; + + MPI_Allreduce(&my_buf,&buf,2,MPI_DOUBLE,MPI_SUM,world); + + double u = buf[0] / buf[1]; + +#pragma omp parallel for schedule(static) private(i) + for (int ii = 0; ii < nn; ++ii) { + i = ilist[ii]; + if(atom->mask[i] & groupbit) { + q[i] = s[i] - u * t[i]; + + // backup s & t + for (int k = 4; k > 0; --k) { + s_hist[i][k] = s_hist[i][k-1]; + t_hist[i][k] = t_hist[i][k-1]; + } + s_hist[i][0] = s[i]; + t_hist[i][0] = t[i]; + } + } + + pack_flag = 4; + comm->forward_comm_fix( this ); //Dist_vector( atom->q ); +} + +/* ---------------------------------------------------------------------- */ + +// double FixQEqReaxOMP::parallel_norm( double *v, int n ) +// { +// int i; +// double my_sum, norm_sqr; + +// int *ilist; + +// if (reaxc) ilist = reaxc->list->ilist; +// else ilist = list->ilist; + +// my_sum = 0.0; +// norm_sqr = 0.0; + +// #pragma omp parallel for schedule(static) private(i) reduction(+:my_sum) +// for (int ii = 0; ii < n; ++ii) { +// i = ilist[ii]; +// if(atom->mask[i] & groupbit) my_sum += SQR( v[i] ); +// } + +// MPI_Allreduce( &my_sum, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + +// return sqrt( norm_sqr ); +// } + +// /* ---------------------------------------------------------------------- */ + +// double FixQEqReaxOMP::parallel_dot( double *v1, double *v2, int n ) +// { +// int i; +// double my_dot, res; + +// int *ilist; + +// if (reaxc) ilist = reaxc->list->ilist; +// else ilist = list->ilist; + +// my_dot = 0.0; +// res = 0.0; + +// #pragma omp parallel for schedule(static) private(i) reduction(+:my_dot) +// for (int ii = 0; ii < n; ++ii) { +// i = ilist[ii]; +// if(atom->mask[i] & groupbit) my_dot += v1[i] * v2[i]; +// } + +// MPI_Allreduce( &my_dot, &res, 1, MPI_DOUBLE, MPI_SUM, world ); + +// return res; +// } + +// /* ---------------------------------------------------------------------- */ + +// double FixQEqReaxOMP::parallel_vector_acc( double *v, int n ) +// { +// int i; +// double my_acc, res; + +// int *ilist; + +// if (reaxc) ilist = reaxc->list->ilist; +// else ilist = list->ilist; + +// my_acc = 0.0; +// res = 0.0; + +// #pragma omp parallel for schedule(static) private(i) reduction(+:my_acc) +// for (int ii = 0; ii < n; ++ii) { +// i = ilist[ii]; +// if(atom->mask[i] & groupbit) my_acc += v[i]; +// } + +// MPI_Allreduce( &my_acc, &res, 1, MPI_DOUBLE, MPI_SUM, world ); + +// return res; +// } + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::vector_sum( double* dest, double c, double* v, + double d, double* y, int k ) +{ + int i; + int *ilist; + + if (reaxc) ilist = reaxc->list->ilist; + else ilist = list->ilist; + +#pragma omp parallel for schedule(static) private(i) + for (int ii=0; iimask[i] & groupbit) dest[i] = c * v[i] + d * y[i]; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::vector_add( double* dest, double c, double* v, int k ) +{ + int i; + int *ilist; + + if (reaxc) ilist = reaxc->list->ilist; + else ilist = list->ilist; + +#pragma omp parallel for schedule(static) private(i) + for (int ii=0; iimask[i] & groupbit) dest[i] += c * v[i]; + } +} + +/* ---------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- */ +/* dual CG support */ +/* ---------------------------------------------------------------------- */ + +int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) +{ + +#ifdef OMP_TIMING + double endTimeBase, startTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + int i, j, imax; + double tmp, alpha_s, alpha_t, beta_s, beta_t, b_norm_s, b_norm_t; + double sig_old_s, sig_old_t, sig_new_s, sig_new_t; + + double my_buf[4], buf[4]; + + int nn, ii, jj; + int *ilist; + if (reaxc) { + nn = reaxc->list->inum; + ilist = reaxc->list->ilist; + } else { + nn = list->inum; + ilist = list->ilist; + } + + imax = 200; + + pack_flag = 5; // forward 2x d and reverse 2x q + dual_sparse_matvec( &H, x1, x2, q ); + comm->reverse_comm_fix( this ); //Coll_Vector( q ); + + double tmp1, tmp2, tmp3, tmp4; + tmp1 = tmp2 = tmp3 = tmp4 = 0.0; + +#pragma omp parallel for schedule(dynamic,50) private(i) reduction(+:tmp1,tmp2,tmp3,tmp4) + for( jj = 0; jj < nn; ++jj ) { + i = ilist[jj]; + if (atom->mask[i] & groupbit) { + int indxI = 2 * i; + r[indxI ] = b1[i] - q[indxI ]; + r[indxI+1] = b2[i] - q[indxI+1]; + + d[indxI ] = r[indxI ] * Hdia_inv[i]; //pre-condition + d[indxI+1] = r[indxI+1] * Hdia_inv[i]; + + tmp1 += b1[i] * b1[i]; + tmp2 += b2[i] * b2[i]; + + tmp3 += r[indxI ] * d[indxI ]; + tmp4 += r[indxI+1] * d[indxI+1]; + } + } + + my_buf[0] = tmp1; + my_buf[1] = tmp2; + my_buf[2] = tmp3; + my_buf[3] = tmp4; + + MPI_Allreduce(&my_buf, &buf, 4, MPI_DOUBLE, MPI_SUM, world); + + b_norm_s = sqrt(buf[0]); + b_norm_t = sqrt(buf[1]); + + sig_new_s = buf[2]; + sig_new_t = buf[3]; + + for( i = 1; i < imax; ++i ) { + comm->forward_comm_fix(this); //Dist_vector( d ); + dual_sparse_matvec( &H, d, q ); + comm->reverse_comm_fix(this); //Coll_vector( q ); + + tmp1 = tmp2 = 0.0; +#pragma omp parallel + { + +#pragma omp for schedule(dynamic,50) private(ii) reduction(+:tmp1,tmp2) + for( jj = 0; jj < nn; jj++) { + ii = ilist[jj]; + if(atom->mask[ii] & groupbit) { + int indxI = 2 * ii; + tmp1 += d[indxI ] * q[indxI ]; + tmp2 += d[indxI+1] * q[indxI+1]; + } + } + +#pragma omp barrier +#pragma omp master + { + my_buf[0] = tmp1; + my_buf[1] = tmp2; + + MPI_Allreduce(&my_buf, &buf, 2, MPI_DOUBLE, MPI_SUM, world); + + alpha_s = sig_new_s / buf[0]; + alpha_t = sig_new_t / buf[1]; + + tmp1 = tmp2 = 0.0; + } + +#pragma omp barrier +#pragma omp for schedule(dynamic,50) private(ii) reduction(+:tmp1,tmp2) + for( jj = 0; jj < nn; jj++) { + ii = ilist[jj]; + if(atom->mask[ii] & groupbit) { + int indxI = 2 * ii; + x1[ii] += alpha_s * d[indxI ]; + x2[ii] += alpha_t * d[indxI+1]; + + r[indxI ] -= alpha_s * q[indxI ]; + r[indxI+1] -= alpha_t * q[indxI+1]; + + // pre-conditioning + p[indxI ] = r[indxI ] * Hdia_inv[ii]; + p[indxI+1] = r[indxI+1] * Hdia_inv[ii]; + + tmp1 += r[indxI ] * p[indxI ]; + tmp2 += r[indxI+1] * p[indxI+1]; + } + } + } // omp parallel + + my_buf[0] = tmp1; + my_buf[1] = tmp2; + + sig_old_s = sig_new_s; + sig_old_t = sig_new_t; + + MPI_Allreduce(&my_buf, &buf, 2, MPI_DOUBLE, MPI_SUM, world); + + sig_new_s = buf[0]; + sig_new_t = buf[1]; + + if( sqrt(sig_new_s)/b_norm_s <= tolerance || sqrt(sig_new_t)/b_norm_t <= tolerance) break; + + beta_s = sig_new_s / sig_old_s; + beta_t = sig_new_t / sig_old_t; + +#pragma omp for schedule(dynamic,50) private(ii) + for( jj = 0; jj < nn; jj++) { + ii = ilist[jj]; + if(atom->mask[ii] & groupbit) { + int indxI = 2 * ii; + + d[indxI ] = p[indxI ] + beta_s * d[indxI ]; + d[indxI+1] = p[indxI+1] + beta_t * d[indxI+1]; + } + } + } + + i++; + matvecs_s = matvecs_t = i; // The plus one makes consistent with count from CG() + matvecs = i; + + // Timing info for iterating s&t together +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTECG1INDEX] += (endTimeBase-startTimeBase); + ompTimingCount[COMPUTECG1INDEX]++; + ompTimingCGCount[COMPUTECG1INDEX]+= i; + startTimeBase = endTimeBase; +#endif + + // If necessary, converge other system + if(sqrt(sig_new_s)/b_norm_s > tolerance) { + pack_flag = 2; + comm->forward_comm_fix(this); // x1 => s + + i+= CG(b1, x1); + matvecs_s = i; + } + else if(sqrt(sig_new_t)/b_norm_t > tolerance) { + pack_flag = 3; + comm->forward_comm_fix(this); // x2 => t + + i+= CG(b2, x2); + matvecs_t = i; + } + + // Timing info for remainder of s or t +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTECG2INDEX] += (endTimeBase-startTimeBase); + ompTimingCount[COMPUTECG2INDEX]++; + ompTimingCGCount[COMPUTECG2INDEX]+= i - matvecs; + startTimeBase = endTimeBase; +#endif + + if ( i >= imax && comm->me == 0) { + char str[128]; + sprintf(str,"Fix qeq/reax CG convergence failed after %d iterations " + "at " BIGINT_FORMAT " step",i,update->ntimestep); + error->warning(FLERR,str); + } + + return i; +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2, double *b ) +{ +#pragma omp parallel default(shared) + { + int i, j, itr_j; + int nn, NN, ii; + int *ilist; + int indxI, indxJ; + + int nthreads = comm->nthreads; + int tid = omp_get_thread_num(); + + if (reaxc) { + nn = reaxc->list->inum; + NN = reaxc->list->inum + reaxc->list->gnum; + ilist = reaxc->list->ilist; + } else { + nn = list->inum; + NN = list->inum + list->gnum; + ilist = list->ilist; + } + +#pragma omp for schedule(dynamic,50) + for( ii = 0; ii < nn; ++ii ) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + indxI = 2 * i; + b[indxI ] = eta[ atom->type[i] ] * x1[i]; + b[indxI+1] = eta[ atom->type[i] ] * x2[i]; + } + } + +#pragma omp for schedule(dynamic,50) + for( ii = nn; ii < NN; ++ii ) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + indxI = 2 * i; + b[indxI] = 0; + b[indxI+1] = 0; + } + } + +#pragma omp for schedule(dynamic,50) + for (i = 0; i < NN; ++i) { + indxI = 2 * i; + for(int t=0; tmask[i] & groupbit) { + indxI = 2 * i; + for( itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { + j = A->jlist[itr_j]; + indxJ = 2 * j; + b[indxI ] += A->val[itr_j] * x1[j]; + b[indxI+1] += A->val[itr_j] * x2[j]; + + b_temp[tid][indxJ ] += A->val[itr_j] * x1[i]; + b_temp[tid][indxJ+1] += A->val[itr_j] * x2[i]; + } + } + } + + // Wait till b_temp accumulated +#pragma omp barrier +#pragma omp for schedule(dynamic,50) + for (i = 0; i < NN; ++i) { + indxI = 2 * i; + for (int t = 0; t < nthreads; ++t) { + b[indxI ] += b_temp[t][indxI ]; + b[indxI+1] += b_temp[t][indxI+1]; + } + } + + } // omp parallel +} + +/* ---------------------------------------------------------------------- */ + +void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) +{ +#pragma omp parallel default(shared) + { + int i, j, itr_j; + int nn, NN, ii; + int *ilist; + int indxI, indxJ; + + int nthreads = comm->nthreads; + int tid = omp_get_thread_num(); + + if (reaxc) { + nn = reaxc->list->inum; + NN = reaxc->list->inum + reaxc->list->gnum; + ilist = reaxc->list->ilist; + } else { + nn = list->inum; + NN = list->inum + list->gnum; + ilist = list->ilist; + } + +#pragma omp for schedule(dynamic,50) + for( ii = 0; ii < nn; ++ii ) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + indxI = 2 * i; + b[indxI ] = eta[ atom->type[i] ] * x[indxI ]; + b[indxI+1] = eta[ atom->type[i] ] * x[indxI+1]; + } + } + +#pragma omp for schedule(dynamic,50) + for( ii = nn; ii < NN; ++ii ) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + indxI = 2 * i; + b[indxI] = 0; + b[indxI+1] = 0; + } + } + +#pragma omp for schedule(dynamic,50) + for (i = 0; i < NN; ++i) { + indxI = 2 * i; + for(int t=0; tmask[i] & groupbit) { + indxI = 2 * i; + for( itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { + j = A->jlist[itr_j]; + indxJ = 2 * j; + b[indxI ] += A->val[itr_j] * x[indxJ ]; + b[indxI+1] += A->val[itr_j] * x[indxJ+1]; + + b_temp[tid][indxJ ] += A->val[itr_j] * x[indxI ]; + b_temp[tid][indxJ+1] += A->val[itr_j] * x[indxI+1]; + } + } + } + + // Wait till b_temp accumulated +#pragma omp barrier +#pragma omp for schedule(dynamic,50) + for (i = 0; i < NN; ++i) { + indxI = 2 * i; + for (int t = 0; t < nthreads; ++t) { + b[indxI ] += b_temp[t][indxI ]; + b[indxI+1] += b_temp[t][indxI+1]; + } + } + + } // omp parallel +} diff --git a/src/USER-OMP/fix_qeq_reax_omp.h b/src/USER-OMP/fix_qeq_reax_omp.h new file mode 100644 index 0000000000..c06185ca2e --- /dev/null +++ b/src/USER-OMP/fix_qeq_reax_omp.h @@ -0,0 +1,84 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hasan Metin Aktulga, Purdue University + (now at Lawrence Berkeley National Laboratory, hmaktulga@lbl.gov) + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(qeq/reax/omp,FixQEqReaxOMP) + +#else + +#ifndef LMP_FIX_QEQ_REAX_OMP_H +#define LMP_FIX_QEQ_REAX_OMP_H + +#include "fix_qeq_reax.h" + +namespace LAMMPS_NS { + +class FixQEqReaxOMP : public FixQEqReax { + + public: + FixQEqReaxOMP(class LAMMPS *, int, char **); + ~FixQEqReaxOMP(); + virtual void init(); + virtual void init_storage(); + virtual void pre_force(int); + virtual void post_constructor(); + + protected: + double **b_temp; + + class PairReaxCOMP *reaxc; + + int do_aspc; + int aspc_order, aspc_order_max; + double aspc_omega; + double * aspc_b; + + virtual void pertype_parameters(char*); + virtual void allocate_storage(); + virtual void deallocate_storage(); + virtual void allocate_matrix(); + virtual void init_matvec(); + virtual void compute_H(); + + virtual int CG(double*,double*); + virtual void sparse_matvec(sparse_matrix*,double*,double*); + virtual void calculate_Q(); + + /* virtual double parallel_norm( double*, int ); */ + /* virtual double parallel_dot( double*, double*, int ); */ + /* virtual double parallel_vector_acc( double*, int ); */ + + virtual void vector_sum(double*,double,double*,double,double*,int); + virtual void vector_add(double*, double, double*,int); + + // dual CG support + virtual int dual_CG(double*,double*,double*,double*); + virtual void dual_sparse_matvec(sparse_matrix*,double*,double*,double*); + virtual void dual_sparse_matvec(sparse_matrix*,double*,double*); +}; + +} + +#endif +#endif diff --git a/src/USER-OMP/fix_reaxc_species_omp.cpp b/src/USER-OMP/fix_reaxc_species_omp.cpp new file mode 100644 index 0000000000..e9ac388252 --- /dev/null +++ b/src/USER-OMP/fix_reaxc_species_omp.cpp @@ -0,0 +1,83 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Ray Shan (Sandia, tnshan@sandia.gov) + Oleg Sergeev (VNIIA, sergeev@vniia.ru) +------------------------------------------------------------------------- */ + +#include "lmptype.h" +#include "stdlib.h" +#include "math.h" +#include "atom.h" +#include "string.h" +#include "fix_ave_atom.h" +#include "fix_reaxc_species_omp.h" +#include "domain.h" +#include "update.h" +#include "pair_reaxc_omp.h" +#include "modify.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "comm.h" +#include "force.h" +#include "compute.h" +#include "input.h" +#include "variable.h" +#include "memory.h" +#include "error.h" +#include "reaxc_list.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +/* ---------------------------------------------------------------------- */ + +FixReaxCSpeciesOMP::FixReaxCSpeciesOMP(LAMMPS *lmp, int narg, char **arg) : + FixReaxCSpecies(lmp, narg, arg) +{ +} + +/* ---------------------------------------------------------------------- */ + +void FixReaxCSpeciesOMP::init() +{ + if (atom->tag_enable == 0) + error->all(FLERR,"Cannot use fix reax/c/species unless atoms have IDs"); + + reaxc = (PairReaxCOMP *) force->pair_match("reax/c/omp",1); + if (reaxc == NULL) error->all(FLERR,"Cannot use fix reax/c/species/omp without " + "pair_style reax/c/omp"); + + reaxc->fixspecies_flag = 1; + nvalid = update->ntimestep+nfreq; + + // check if this fix has been called twice + int count = 0; + for (int i = 0; i < modify->nfix; i++) + if (strcmp(modify->fix[i]->style,"reax/c/species/omp") == 0) count++; + if (count > 1 && comm->me == 0) + error->warning(FLERR,"More than one fix reax/c/species"); + + if (!setupflag) { + // create a compute to store properties + create_compute(); + + // create a fix to point to fix_ave_atom for averaging stored properties + create_fix(); + + setupflag = 1; + } + +} diff --git a/src/USER-OMP/fix_reaxc_species_omp.h b/src/USER-OMP/fix_reaxc_species_omp.h new file mode 100644 index 0000000000..006bb3e87a --- /dev/null +++ b/src/USER-OMP/fix_reaxc_species_omp.h @@ -0,0 +1,44 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(reax/c/species/omp,FixReaxCSpeciesOMP) + +#else + +#ifndef LMP_FIX_REAXC_SPECIES_OMP_H +#define LMP_FIX_REAXC_SPECIES_OMP_H + +#include "pair_reaxc_omp.h" +#include "fix_reaxc_species.h" + +#define BUFLEN 1000 + +namespace LAMMPS_NS { + + class FixReaxCSpeciesOMP : public FixReaxCSpecies { + + public: + FixReaxCSpeciesOMP(class LAMMPS *, int, char **); + ~FixReaxCSpeciesOMP(){}; + virtual void init(); + + private: + class PairReaxCOMP *reaxc; + + }; +} + +#endif +#endif diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp new file mode 100644 index 0000000000..c7a6c27f48 --- /dev/null +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -0,0 +1,584 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hasan Metin Aktulga, Purdue University + (now at Lawrence Berkeley National Laboratory, hmaktulga@lbl.gov) + Per-atom energy/virial added by Ray Shan (Sandia) + Fix reax/c/bonds and fix reax/c/species for pair_style reax/c added by + Ray Shan (Sandia) +------------------------------------------------------------------------- */ + +#include "pair_reaxc_omp.h" +#include "atom.h" +#include "update.h" +#include "force.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "modify.h" +#include "fix.h" +#include "fix_reaxc.h" +#include "citeme.h" +#include "memory.h" +#include "error.h" + +#include "reaxc_types.h" +#include "reaxc_allocate.h" +#include "reaxc_control.h" +#include "reaxc_ffield.h" +#include "reaxc_forces_omp.h" +#include "reaxc_init_md_omp.h" +#include "reaxc_io_tools.h" +#include "reaxc_list.h" +#include "reaxc_lookup.h" +#include "reaxc_reset_tools.h" +#include "reaxc_tool_box.h" +#include "reaxc_traj.h" +#include "reaxc_vector.h" +#include "fix_reaxc_bonds.h" + +using namespace LAMMPS_NS; + +#ifdef OMP_TIMING +double ompTimingData[LASTTIMINGINDEX]; +int ompTimingCount[LASTTIMINGINDEX]; +int ompTimingCGCount[LASTTIMINGINDEX]; +#endif + +/* ---------------------------------------------------------------------- */ + +PairReaxCOMP::PairReaxCOMP(LAMMPS *lmp) : PairReaxC(lmp), ThrOMP(lmp, THR_PAIR) +{ + suffix_flag |= Suffix::OMP; + system->pair_ptr = this; + + num_nbrs_offset = NULL; + +#ifdef OMP_TIMING + for (int i=0;inum_intrs; ++i) + sfree(bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); + + memory->destroy(num_nbrs_offset); + +#ifdef OMP_TIMING + int myrank; + + MPI_Comm_rank(mpi_data->world,&myrank); + + // Write screen output + if (myrank == 0 && screen) { + fprintf(screen,"\n\nWrite_Lists took %11.3lf seconds", ompTimingData[COMPUTEWLINDEX]); + + fprintf(screen,"\n\nCompute_Forces took %11.3lf seconds:", ompTimingData[COMPUTEINDEX]); + fprintf(screen,"\n ->Initial Forces: %11.3lf seconds", ompTimingData[COMPUTEIFINDEX]); + fprintf(screen,"\n ->Bond Order: %11.3lf seconds", ompTimingData[COMPUTEBOINDEX]); + fprintf(screen,"\n ->Atom Energy: %11.3lf seconds", ompTimingData[COMPUTEATOMENERGYINDEX]); + fprintf(screen,"\n ->Bond: %11.3lf seconds", ompTimingData[COMPUTEBONDSINDEX]); + fprintf(screen,"\n ->Hydrogen bonds: %11.3lf seconds", ompTimingData[COMPUTEHBONDSINDEX]); + fprintf(screen,"\n ->Torsion Angles: %11.3lf seconds", ompTimingData[COMPUTETORSIONANGLESBOINDEX]); + fprintf(screen,"\n ->Valence Angles: %11.3lf seconds", ompTimingData[COMPUTEVALENCEANGLESBOINDEX]); + fprintf(screen,"\n ->Non-Bonded For: %11.3lf seconds", ompTimingData[COMPUTENBFINDEX]); + fprintf(screen,"\n ->Total Forces: %11.3lf seconds", ompTimingData[COMPUTETFINDEX]); + + fprintf(screen,"\n\nfixQEQ: %11.3lf seconds", ompTimingData[COMPUTEQEQINDEX]); + fprintf(screen,"\n ->QEQ init: %11.3lf seconds", ompTimingData[COMPUTEINITMVINDEX]); + + double avg = double(ompTimingCGCount[COMPUTECG1INDEX]) / double(ompTimingCount[COMPUTECG1INDEX]); + fprintf(screen,"\n ->QEQ CG1: %11.3lf seconds with %4.1lf iterations on average.", ompTimingData[COMPUTECG1INDEX], avg); + + avg = double(ompTimingCGCount[COMPUTECG2INDEX]) / double(ompTimingCount[COMPUTECG2INDEX]); + fprintf(screen,"\n ->QEQ CG2: %11.3lf seconds with %4.1lf iterations on average.", ompTimingData[COMPUTECG2INDEX], avg); + fprintf(screen,"\n ->QEQ CalcQ: %11.3lf seconds\n", ompTimingData[COMPUTECALCQINDEX]); + } + + // Write logfile output + if (myrank == 0 && logfile) { + fprintf(logfile,"\n\nWrite_Lists took %11.3lf seconds", ompTimingData[COMPUTEWLINDEX]); + + fprintf(logfile,"\n\nCompute_Forces took %11.3lf seconds:", ompTimingData[COMPUTEINDEX]); + fprintf(logfile,"\n ->Initial Forces: %11.3lf seconds", ompTimingData[COMPUTEIFINDEX]); + fprintf(logfile,"\n ->Bond Order: %11.3lf seconds", ompTimingData[COMPUTEBOINDEX]); + fprintf(logfile,"\n ->Atom Energy: %11.3lf seconds", ompTimingData[COMPUTEATOMENERGYINDEX]); + fprintf(logfile,"\n ->Bond: %11.3lf seconds", ompTimingData[COMPUTEBONDSINDEX]); + fprintf(logfile,"\n ->Hydrogen bonds: %11.3lf seconds", ompTimingData[COMPUTEHBONDSINDEX]); + fprintf(logfile,"\n ->Torsion Angles: %11.3lf seconds", ompTimingData[COMPUTETORSIONANGLESBOINDEX]); + fprintf(logfile,"\n ->Valence Angles: %11.3lf seconds", ompTimingData[COMPUTEVALENCEANGLESBOINDEX]); + fprintf(logfile,"\n ->Non-Bonded For: %11.3lf seconds", ompTimingData[COMPUTENBFINDEX]); + fprintf(logfile,"\n ->Total Forces: %11.3lf seconds", ompTimingData[COMPUTETFINDEX]); + + fprintf(logfile,"\n\nfixQEQ: %11.3lf seconds", ompTimingData[COMPUTEQEQINDEX]); + fprintf(logfile,"\n ->QEQ init: %11.3lf seconds", ompTimingData[COMPUTEINITMVINDEX]); + + double avg = double(ompTimingCGCount[COMPUTECG1INDEX]) / double(ompTimingCount[COMPUTECG1INDEX]); + fprintf(logfile,"\n ->QEQ CG1: %11.3lf seconds with %4.1lf iterations on average.", ompTimingData[COMPUTECG1INDEX], avg); + + avg = double(ompTimingCGCount[COMPUTECG2INDEX]) / double(ompTimingCount[COMPUTECG2INDEX]); + fprintf(logfile,"\n ->QEQ CG2: %11.3lf seconds with %4.1lf iterations on average.", ompTimingData[COMPUTECG2INDEX], avg); + fprintf(logfile,"\n ->QEQ CalcQ: %11.3lf seconds\n", ompTimingData[COMPUTECALCQINDEX]); + } +#endif +} + +/* ---------------------------------------------------------------------- */ + +void PairReaxCOMP::compute(int eflag, int vflag) +{ + double evdwl,ecoul; + double t_start, t_end; + + // communicate num_bonds once every reneighboring + // 2 num arrays stored by fix, grab ptr to them + + if (neighbor->ago == 0) comm->forward_comm_fix(fix_reax); + int *num_bonds = fix_reax->num_bonds; + int *num_hbonds = fix_reax->num_hbonds; + + evdwl = ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else ev_unset(); + + if (vflag_global) control->virial = 1; + else control->virial = 0; + + system->n = atom->nlocal; // my atoms + system->N = atom->nlocal + atom->nghost; // mine + ghosts + system->bigN = static_cast (atom->natoms); // all atoms in the system + + system->big_box.V = 0; + system->big_box.box_norms[0] = 0; + system->big_box.box_norms[1] = 0; + system->big_box.box_norms[2] = 0; + if( comm->me == 0 ) t_start = MPI_Wtime(); + // setup data structures + + setup(); + + Reset( system, control, data, workspace, &lists, world ); + + // Why not update workspace like in MPI-only code? + // Using the MPI-only way messes up the hb energy + //workspace->realloc.num_far = write_reax_lists(); + write_reax_lists(); + + // timing for filling in the reax lists + if( comm->me == 0 ) { + t_end = MPI_Wtime(); + data->timing.nbrs = t_end - t_start; + } + + // forces + +#ifdef OMP_TIMING + double startTimeBase,endTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + Compute_ForcesOMP(system,control,data,workspace,&lists,out_control,mpi_data); + read_reax_forces(vflag); + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTEINDEX] += (endTimeBase-startTimeBase); +#endif + +#pragma omp parallel for schedule(static) + for(int k = 0; k < system->N; ++k) { + num_bonds[k] = system->my_atoms[k].num_bonds; + num_hbonds[k] = system->my_atoms[k].num_hbonds; + } + + // energies and pressure + + if (eflag_global) { + evdwl += data->my_en.e_bond; + evdwl += data->my_en.e_ov; + evdwl += data->my_en.e_un; + evdwl += data->my_en.e_lp; + evdwl += data->my_en.e_ang; + evdwl += data->my_en.e_pen; + evdwl += data->my_en.e_coa; + evdwl += data->my_en.e_hb; + evdwl += data->my_en.e_tor; + evdwl += data->my_en.e_con; + evdwl += data->my_en.e_vdW; + + ecoul += data->my_en.e_ele; + ecoul += data->my_en.e_pol; + + // Store the different parts of the energy + // in a list for output by compute pair command + + pvector[0] = data->my_en.e_bond; + pvector[1] = data->my_en.e_ov + data->my_en.e_un; + pvector[2] = data->my_en.e_lp; + pvector[3] = 0.0; + pvector[4] = data->my_en.e_ang; + pvector[5] = data->my_en.e_pen; + pvector[6] = data->my_en.e_coa; + pvector[7] = data->my_en.e_hb; + pvector[8] = data->my_en.e_tor; + pvector[9] = data->my_en.e_con; + pvector[10] = data->my_en.e_vdW; + pvector[11] = data->my_en.e_ele; + pvector[12] = 0.0; + pvector[13] = data->my_en.e_pol; + } + + if (vflag_fdotr) virial_fdotr_compute(); + +// Set internal timestep counter to that of LAMMPS + + data->step = update->ntimestep; + + Output_Results( system, control, data, &lists, out_control, mpi_data ); + + // populate tmpid and tmpbo arrays for fix reax/c/species + int i, j; + + if(fixspecies_flag) { + if (system->N > nmax) { + memory->destroy(tmpid); + memory->destroy(tmpbo); + nmax = system->N; + memory->create(tmpid,nmax,MAXSPECBOND,"pair:tmpid"); + memory->create(tmpbo,nmax,MAXSPECBOND,"pair:tmpbo"); + } + +#pragma omp parallel for collapse(2) schedule(static) default(shared) + for (i = 0; i < system->N; i ++) + for (j = 0; j < MAXSPECBOND; j ++) { + tmpbo[i][j] = 0.0; + tmpid[i][j] = 0; + } + + FindBond(); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairReaxCOMP::init_style( ) +{ + if (!atom->q_flag) + error->all(FLERR,"Pair reax/c/omp requires atom attribute q"); + + // firstwarn = 1; + + int iqeq = modify->find_fix_by_style("qeq/reax/omp"); + if (iqeq < 0 && qeqflag == 1) + error->all(FLERR,"Pair reax/c/omp requires use of fix qeq/reax/omp"); + + system->n = atom->nlocal; // my atoms + system->N = atom->nlocal + atom->nghost; // mine + ghosts + system->bigN = static_cast (atom->natoms); // all atoms in the system + system->wsize = comm->nprocs; + + system->big_box.V = 0; + system->big_box.box_norms[0] = 0; + system->big_box.box_norms[1] = 0; + system->big_box.box_norms[2] = 0; + + if (atom->tag_enable == 0) + error->all(FLERR,"Pair style reax/c/omp requires atom IDs"); + if (force->newton_pair == 0) + error->all(FLERR,"Pair style reax/c/omp requires newton pair on"); + + // need a half neighbor list w/ Newton off and ghost neighbors + // built whenever re-neighboring occurs + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->newton = 2; + neighbor->requests[irequest]->ghost = 1; + + cutmax = MAX3(control->nonb_cut, control->hbond_cut, 2*control->bond_cut); + + for( int i = 0; i < LIST_N; ++i ) + lists[i].allocated = 0; + + if (fix_reax == NULL) { + char **fixarg = new char*[3]; + fixarg[0] = (char *) "REAXC"; + fixarg[1] = (char *) "all"; + fixarg[2] = (char *) "REAXC"; + modify->add_fix(3,fixarg); + delete [] fixarg; + fix_reax = (FixReaxC *) modify->fix[modify->nfix-1]; + } + +#pragma omp parallel + { control->nthreads = omp_get_num_threads(); } +} + +/* ---------------------------------------------------------------------- */ + +void PairReaxCOMP::setup( ) +{ + int oldN; + int mincap = system->mincap; + double safezone = system->safezone; + + system->n = atom->nlocal; // my atoms + system->N = atom->nlocal + atom->nghost; // mine + ghosts + oldN = system->N; + system->bigN = static_cast (atom->natoms); // all atoms in the system + + if (system->N > nmax) { + memory->destroy(num_nbrs_offset); + // Don't update nmax here. It is updated at end of compute(). + memory->create(num_nbrs_offset, system->N, "pair:num_nbrs_offset"); + } + + if (setup_flag == 0) { + + setup_flag = 1; + + int *num_bonds = fix_reax->num_bonds; + int *num_hbonds = fix_reax->num_hbonds; + + control->vlist_cut = neighbor->cutneighmax; + + // determine the local and total capacity + + system->local_cap = MAX( (int)(system->n * safezone), mincap ); + system->total_cap = MAX( (int)(system->N * safezone), mincap ); + + // initialize my data structures + + PreAllocate_Space( system, control, workspace, world ); + write_reax_atoms(); + + int num_nbrs = estimate_reax_lists(); + if(!Make_List(system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, + lists+FAR_NBRS, world)) + error->all(FLERR,"Pair reax/c problem in far neighbor list"); + + write_reax_lists(); + + InitializeOMP( system, control, data, workspace, &lists, out_control, + mpi_data, world ); + + for( int k = 0; k < system->N; ++k ) { + num_bonds[k] = system->my_atoms[k].num_bonds; + num_hbonds[k] = system->my_atoms[k].num_hbonds; + } + + } else { + + // fill in reax datastructures + + write_reax_atoms(); + + // reset the bond list info for new atoms + + for(int k = oldN; k < system->N; ++k) + Set_End_Index( k, Start_Index( k, lists+BONDS ), lists+BONDS ); + + // estimate far neighbor list size + // Not present in MPI-only version + workspace->realloc.num_far = estimate_reax_lists(); + + // check if I need to shrink/extend my data-structs + + ReAllocate( system, control, data, workspace, &lists, mpi_data ); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairReaxCOMP::write_reax_atoms() +{ + int *num_bonds = fix_reax->num_bonds; + int *num_hbonds = fix_reax->num_hbonds; + + if (system->N > system->total_cap) + error->all(FLERR,"Too many ghost atoms"); + +#pragma omp parallel for schedule(static) default(shared) + for( int i = 0; i < system->N; ++i ){ + system->my_atoms[i].orig_id = atom->tag[i]; + system->my_atoms[i].type = map[atom->type[i]]; + system->my_atoms[i].x[0] = atom->x[i][0]; + system->my_atoms[i].x[1] = atom->x[i][1]; + system->my_atoms[i].x[2] = atom->x[i][2]; + system->my_atoms[i].q = atom->q[i]; + system->my_atoms[i].num_bonds = num_bonds[i]; + system->my_atoms[i].num_hbonds = num_hbonds[i]; + } +} + +/* ---------------------------------------------------------------------- */ + +int PairReaxCOMP::estimate_reax_lists() +{ + int i; + int *ilist = list->ilist; + int *numneigh = list->numneigh; + int numall = list->inum + list->gnum; + int mincap = system->mincap; + + // for good performance in the OpenMP implementation, each thread needs + // to know where to place the neighbors of the atoms it is responsible for. + // The sumscan values for the list->numneigh will be used to determine the + // neighbor offset of each atom. Note that this may cause some significant + // memory overhead if delayed neighboring is used - so it may be desirable + // to work on this part to reduce the memory footprint of the far_nbrs list. + + int num_nbrs = 0; + + for (int itr_i = 0; itr_i < numall; ++itr_i) { + i = ilist[itr_i]; + num_nbrs += numneigh[i]; + } + + int new_estimate = MAX (num_nbrs, mincap*MIN_NBRS); + + return new_estimate; +} + +/* ---------------------------------------------------------------------- */ + +int PairReaxCOMP::write_reax_lists() +{ +#ifdef OMP_TIMING + double startTimeBase, endTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + int itr_i, itr_j, i, j, num_mynbrs; + int *jlist; + double d_sqr, dist, cutoff_sqr; + rvec dvec; + + double **x = atom->x; + int *ilist = list->ilist; + int *numneigh = list->numneigh; + int **firstneigh = list->firstneigh; + reax_list *far_nbrs = lists + FAR_NBRS; + far_neighbor_data *far_list = far_nbrs->select.far_nbr_list; + + int num_nbrs = 0; + int inum = list->inum; + int gnum = list->gnum; + int numall = inum + gnum; + + // sumscan of the number of neighbors per atom to determine the offsets + // most likely, we are overallocating. desirable to work on this part + // to reduce the memory footprint of the far_nbrs list. + + num_nbrs = 0; + + for (itr_i = 0; itr_i < numall; ++itr_i) { + i = ilist[itr_i]; + num_nbrs_offset[i] = num_nbrs; + num_nbrs += numneigh[i]; + } + +//#pragma omp parallel for schedule(guided) default(shared) +#pragma omp parallel for schedule(dynamic,50) default(shared) \ + private(itr_i, itr_j, i, j, jlist, cutoff_sqr, num_mynbrs, d_sqr, dvec, dist) + for (itr_i = 0; itr_i < numall; ++itr_i) { + i = ilist[itr_i]; + jlist = firstneigh[i]; + Set_Start_Index( i, num_nbrs_offset[i], far_nbrs ); + + if (i < inum) + cutoff_sqr = control->nonb_cut*control->nonb_cut; + else + cutoff_sqr = control->bond_cut*control->bond_cut; + + num_mynbrs = 0; + + for (itr_j = 0; itr_j < numneigh[i]; ++itr_j) { + j = jlist[itr_j]; + j &= NEIGHMASK; + get_distance( x[j], x[i], &d_sqr, &dvec ); + + if (d_sqr <= cutoff_sqr) { + dist = sqrt( d_sqr ); + set_far_nbr( &far_list[num_nbrs_offset[i] + num_mynbrs], j, dist, dvec ); + ++num_mynbrs; + } + } + Set_End_Index( i, num_nbrs_offset[i] + num_mynbrs, far_nbrs ); + } + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTEWLINDEX] += (endTimeBase-startTimeBase); +#endif + + return num_nbrs; +} + +/* ---------------------------------------------------------------------- */ + +void PairReaxCOMP::read_reax_forces(int vflag) +{ +#pragma omp parallel for schedule(static) default(shared) + for( int i = 0; i < system->N; ++i ) { + system->my_atoms[i].f[0] = workspace->f[i][0]; + system->my_atoms[i].f[1] = workspace->f[i][1]; + system->my_atoms[i].f[2] = workspace->f[i][2]; + + atom->f[i][0] = -workspace->f[i][0]; + atom->f[i][1] = -workspace->f[i][1]; + atom->f[i][2] = -workspace->f[i][2]; + } +} + +/* ---------------------------------------------------------------------- */ + +void PairReaxCOMP::FindBond() +{ + int i, ii, j, pj, jtag, nj, jtmp, jj; + double bo_tmp, bo_cut, rij, rsq; + + bond_data *bo_ij; + bo_cut = 0.10; + +#pragma omp parallel for schedule(static) default(shared) \ + private(i, nj, pj, bo_ij, j, bo_tmp) + for (i = 0; i < system->n; i++) { + nj = 0; + for( pj = Start_Index(i, lists); pj < End_Index(i, lists); ++pj ) { + bo_ij = &( lists->select.bond_list[pj] ); + j = bo_ij->nbr; + if (j < i) continue; + + bo_tmp = bo_ij->bo_data.BO; + + if (bo_tmp >= bo_cut ) { + tmpid[i][nj] = j; + tmpbo[i][nj] = bo_tmp; + nj ++; + if (nj > MAXSPECBOND) error->all(FLERR,"Increase MAXSPECBOND in fix_reaxc_species.h"); + } + } + } +} + diff --git a/src/USER-OMP/pair_reaxc_omp.h b/src/USER-OMP/pair_reaxc_omp.h new file mode 100644 index 0000000000..5d5c7e145b --- /dev/null +++ b/src/USER-OMP/pair_reaxc_omp.h @@ -0,0 +1,113 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hasan Metin Aktulga, Purdue University + (now at Lawrence Berkeley National Laboratory, hmaktulga@lbl.gov) + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS + +PairStyle(reax/c/omp,PairReaxCOMP) + +#else + +#ifndef LMP_PAIR_REAXC_OMP_H +#define LMP_PAIR_REAXC_OMP_H + +#include "pair_reaxc.h" +#include "thr_omp.h" +#include "suffix.h" + +namespace LAMMPS_NS { + +class PairReaxCOMP : public PairReaxC, public ThrOMP { + public: + PairReaxCOMP(class LAMMPS *); + ~PairReaxCOMP(); + virtual void compute(int, int); + virtual void init_style(); + + inline FixOMP *getFixOMP() { + return fix; + }; + + inline void ev_setup_thr_proxy(int eflagparm, int vflagparm, int nallparm, + double *eatomparm, double **vatomparm, ThrData *thrparm) { + ev_setup_thr(eflagparm, vflagparm, nallparm, eatomparm, vatomparm, thrparm); + }; + + // reduce per thread data as needed + inline void reduce_thr_proxy(void * const styleparm, const int eflagparm, + const int vflagparm, ThrData * const thrparm) { + reduce_thr(styleparm, eflagparm, vflagparm, thrparm); + } + + inline void ev_tally_thr_proxy(Pair * const pairparm, const int iparm, const int jparm, + const int nlocalparm, const int newton_pairparm, + const double evdwlparm, const double ecoulparm, + const double fpairparm, const double delxparm, + const double delyparm, const double delzparm, + ThrData * const thrparm) { + ev_tally_thr(pairparm, iparm, jparm, nlocalparm, newton_pairparm, + evdwlparm, ecoulparm, fpairparm, delxparm, delyparm, delzparm, thrparm); + } + + inline void ev_tally_xyz_thr_proxy(Pair * const pairparm, const int iparm, const int jparm, + const int nlocalparm, const int newton_pairparm, + const double evdwlparm, const double ecoulparm, + const double fxparm, const double fyparm, const double fzparm, + const double delxparm, const double delyparm, + const double delzparm, ThrData * const thrparm) { + ev_tally_xyz_thr(pairparm, iparm, jparm, nlocalparm, newton_pairparm, + evdwlparm, ecoulparm, fxparm, fyparm, fzparm, + delxparm, delyparm, delzparm, thrparm); + } + + inline void ev_tally3_thr_proxy(Pair * const pairparm,int i, int j, int k, + double evdwl, double ecoul, double *fj, double *fk, + double *drji, double *drki, ThrData * const thrparm) { + ev_tally3_thr(pairparm, i, j, k, evdwl, ecoul, fj, fk, drji, drki, thrparm); + } + + protected: + virtual void setup(); + virtual void write_reax_atoms(); + virtual int estimate_reax_lists(); + virtual int write_reax_lists(); + virtual void read_reax_forces(int); + virtual void FindBond(); + + // work array used in write_reax_lists() + int * num_nbrs_offset; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Too many ghost atoms + +Number of ghost atoms has increased too much during simulation and has exceeded +the size of reax/c arrays. Increase safe_zone and min_cap in pair_style reax/c +command + +*/ diff --git a/src/USER-OMP/reaxc_bond_orders_omp.cpp b/src/USER-OMP/reaxc_bond_orders_omp.cpp new file mode 100644 index 0000000000..1d32cbd34f --- /dev/null +++ b/src/USER-OMP/reaxc_bond_orders_omp.cpp @@ -0,0 +1,711 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#include +#include "pair_reaxc_omp.h" +#include "reaxc_types.h" +#include "reaxc_bond_orders_omp.h" +#include "reaxc_list.h" +#include "reaxc_vector.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +void Add_dBond_to_ForcesOMP( reax_system *system, int i, int pj, + storage *workspace, reax_list **lists ) { + reax_list *bonds = (*lists) + BONDS; + bond_data *nbr_j, *nbr_k; + bond_order_data *bo_ij, *bo_ji; + dbond_coefficients coef; + int pk, k, j; + + PairReaxCOMP *pair_reax_ptr = static_cast(system->pair_ptr); + + int tid = omp_get_thread_num(); + ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + long reductionOffset = (system->N * tid); + + /* Virial Tallying variables */ + double f_scaler; + rvec fi_tmp, fj_tmp, fk_tmp, delij, delji, delki, delkj, temp; + + /* Initializations */ + nbr_j = &(bonds->select.bond_list[pj]); + j = nbr_j->nbr; + bo_ij = &(nbr_j->bo_data); + bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); + + double c = bo_ij->Cdbo + bo_ji->Cdbo; + coef.C1dbo = bo_ij->C1dbo * c; + coef.C2dbo = bo_ij->C2dbo * c; + coef.C3dbo = bo_ij->C3dbo * c; + + c = bo_ij->Cdbopi + bo_ji->Cdbopi; + coef.C1dbopi = bo_ij->C1dbopi * c; + coef.C2dbopi = bo_ij->C2dbopi * c; + coef.C3dbopi = bo_ij->C3dbopi * c; + coef.C4dbopi = bo_ij->C4dbopi * c; + + c = bo_ij->Cdbopi2 + bo_ji->Cdbopi2; + coef.C1dbopi2 = bo_ij->C1dbopi2 * c; + coef.C2dbopi2 = bo_ij->C2dbopi2 * c; + coef.C3dbopi2 = bo_ij->C3dbopi2 * c; + coef.C4dbopi2 = bo_ij->C4dbopi2 * c; + + c = workspace->CdDelta[i] + workspace->CdDelta[j]; + coef.C1dDelta = bo_ij->C1dbo * c; + coef.C2dDelta = bo_ij->C2dbo * c; + coef.C3dDelta = bo_ij->C3dbo * c; + + // The same "c" refactoring here can be replicated below in Add_dBond_to_Forces_NPTOMP(), but + // I'd prefer to wait for a test to verify changes before doing so (just to be safe). + + // forces on i + // rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp ); + // rvec_ScaledAdd( temp, coef.C2dbo, workspace->dDeltap_self[i] ); + // rvec_ScaledAdd( temp, coef.C1dDelta, bo_ij->dBOp ); + // rvec_ScaledAdd( temp, coef.C2dDelta, workspace->dDeltap_self[i] ); + // rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); + // rvec_ScaledAdd( temp, coef.C2dbopi, bo_ij->dBOp ); + // rvec_ScaledAdd( temp, coef.C3dbopi, workspace->dDeltap_self[i]); + // rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); + // rvec_ScaledAdd( temp, coef.C2dbopi2, bo_ij->dBOp ); + // rvec_ScaledAdd( temp, coef.C3dbopi2, workspace->dDeltap_self[i] ); + + c = (coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); + rvec_Scale( temp, c, bo_ij->dBOp ); + + c = (coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); + rvec_ScaledAdd( temp, c, workspace->dDeltap_self[i] ); + + rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); + rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); + + rvec_Add(workspace->forceReduction[reductionOffset+i],temp ); + + if( system->pair_ptr->vflag_atom) { + rvec_Scale(fi_tmp, -1.0, temp); + rvec_ScaledSum( delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x ); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,i,j,system->N,0,0,0, + fi_tmp[0],fi_tmp[1],fi_tmp[2], + delij[0],delij[1],delij[2],thr); + } + + // forces on j + // rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp ); + // rvec_ScaledAdd( temp, coef.C3dbo, workspace->dDeltap_self[j] ); + // rvec_ScaledAdd( temp, -coef.C1dDelta, bo_ij->dBOp ); + // rvec_ScaledAdd( temp, coef.C3dDelta, workspace->dDeltap_self[j]); + // rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); + // rvec_ScaledAdd( temp, -coef.C2dbopi, bo_ij->dBOp ); + // rvec_ScaledAdd( temp, coef.C4dbopi, workspace->dDeltap_self[j]); + // rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); + // rvec_ScaledAdd( temp, -coef.C2dbopi2, bo_ij->dBOp ); + // rvec_ScaledAdd( temp, coef.C4dbopi2, workspace->dDeltap_self[j]); + + + c = -(coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); + rvec_Scale( temp, c, bo_ij->dBOp ); + + c = (coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); + rvec_ScaledAdd( temp, c, workspace->dDeltap_self[j] ); + + rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); + rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); + + + rvec_Add(workspace->forceReduction[reductionOffset+j],temp ); + + if( system->pair_ptr->vflag_atom) { + rvec_Scale(fj_tmp, -1.0, temp); + rvec_ScaledSum( delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x ); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,j,i,system->N,0,0,0, + fj_tmp[0],fj_tmp[1],fj_tmp[2], + delji[0],delji[1],delji[2],thr); + } + + // forces on k: i neighbor + for( pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk ) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; + + // rvec_Scale( temp, -coef.C2dbo, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd( temp, -coef.C2dDelta, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd( temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd( temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp); + + const double c = -(coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); + rvec_Scale(temp, c, nbr_k->bo_data.dBOp); + + rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + + if( system->pair_ptr->vflag_atom ) { + rvec_Scale(fk_tmp, -1.0, temp); + rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, + fk_tmp[0],fk_tmp[1],fk_tmp[2], + delki[0],delki[1],delki[2],thr); + rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, + fk_tmp[0],fk_tmp[1],fk_tmp[2], + delkj[0],delkj[1],delkj[2],thr); + } + } + + // forces on k: j neighbor + for( pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk ) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; + + // rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); + // rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp); + + const double c = -(coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); + rvec_Scale(temp, c, nbr_k->bo_data.dBOp); + + rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + + if( system->pair_ptr->vflag_atom ) { + rvec_Scale(fk_tmp, -1.0, temp); + rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, + fk_tmp[0],fk_tmp[1],fk_tmp[2], + delki[0],delki[1],delki[2],thr); + + rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, + fk_tmp[0],fk_tmp[1],fk_tmp[2], + delkj[0],delkj[1],delkj[2],thr); + } + } +} + +/* ---------------------------------------------------------------------- */ + +void Add_dBond_to_Forces_NPTOMP( reax_system *system, int i, int pj, simulation_data *data, + storage *workspace, reax_list **lists ) { + reax_list *bonds = (*lists) + BONDS; + bond_data *nbr_j, *nbr_k; + bond_order_data *bo_ij, *bo_ji; + dbond_coefficients coef; + rvec temp, ext_press; + ivec rel_box; + int pk, k, j; + + PairReaxCOMP *pair_reax_ptr = static_cast(system->pair_ptr); + + int tid = omp_get_thread_num(); + ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + long reductionOffset = (system->N * tid); + + /* Initializations */ + nbr_j = &(bonds->select.bond_list[pj]); + j = nbr_j->nbr; + bo_ij = &(nbr_j->bo_data); + bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); + + coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); + coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); + coef.C3dbo = bo_ij->C3dbo * (bo_ij->Cdbo + bo_ji->Cdbo); + + coef.C1dbopi = bo_ij->C1dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C2dbopi = bo_ij->C2dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C3dbopi = bo_ij->C3dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C4dbopi = bo_ij->C4dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + + coef.C1dbopi2 = bo_ij->C1dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C2dbopi2 = bo_ij->C2dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C3dbopi2 = bo_ij->C3dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C4dbopi2 = bo_ij->C4dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + + coef.C1dDelta = bo_ij->C1dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + coef.C2dDelta = bo_ij->C2dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + coef.C3dDelta = bo_ij->C3dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + + + /************************************ + * forces related to atom i * + * first neighbors of atom i * + ************************************/ + for( pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk ) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; + + rvec_Scale(temp, -coef.C2dbo, nbr_k->bo_data.dBOp); /*2nd, dBO*/ + rvec_ScaledAdd(temp, -coef.C2dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ + rvec_ScaledAdd(temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); /*3rd, dBOpi*/ + rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp);/*3rd, dBOpi2*/ + + /* force */ + rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + + /* pressure */ + rvec_iMultiply( ext_press, nbr_k->rel_box, temp ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + } + + /* then atom i itself */ + rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp ); /*1st,dBO*/ + rvec_ScaledAdd( temp, coef.C2dbo, workspace->dDeltap_self[i] ); /*2nd,dBO*/ + rvec_ScaledAdd( temp, coef.C1dDelta, bo_ij->dBOp ); /*1st,dBO*/ + rvec_ScaledAdd( temp, coef.C2dDelta, workspace->dDeltap_self[i] );/*2nd,dBO*/ + rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ + rvec_ScaledAdd( temp, coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ + rvec_ScaledAdd( temp, coef.C3dbopi, workspace->dDeltap_self[i]);/*3rd,dBOpi*/ + + rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBO_pi2*/ + rvec_ScaledAdd( temp, coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBO_pi2*/ + rvec_ScaledAdd( temp, coef.C3dbopi2, workspace->dDeltap_self[i] );/*3rd*/ + + /* force */ + rvec_Add(workspace->forceReduction[reductionOffset+i],temp ); + + for( pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk ) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; + + rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); /*3rd,dBO*/ + rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ + rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); /*4th,dBOpi*/ + rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp);/*4th,dBOpi2*/ + + /* force */ + rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + + /* pressure */ + if( k != i ) { + ivec_Sum( rel_box, nbr_k->rel_box, nbr_j->rel_box ); //rel_box(k, i) + rvec_iMultiply( ext_press, rel_box, temp ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + } + } + + /* then atom j itself */ + rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp ); /*1st, dBO*/ + rvec_ScaledAdd( temp, coef.C3dbo, workspace->dDeltap_self[j] ); /*2nd, dBO*/ + rvec_ScaledAdd( temp, -coef.C1dDelta, bo_ij->dBOp ); /*1st, dBO*/ + rvec_ScaledAdd( temp, coef.C3dDelta, workspace->dDeltap_self[j]);/*2nd, dBO*/ + + rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ + rvec_ScaledAdd( temp, -coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ + rvec_ScaledAdd( temp, coef.C4dbopi, workspace->dDeltap_self[j]);/*3rd,dBOpi*/ + + rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBOpi2*/ + rvec_ScaledAdd( temp, -coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBOpi2*/ + rvec_ScaledAdd( temp,coef.C4dbopi2,workspace->dDeltap_self[j]);/*3rd,dBOpi2*/ + + /* force */ + rvec_Add(workspace->forceReduction[reductionOffset+j],temp ); + + /* pressure */ + rvec_iMultiply( ext_press, nbr_j->rel_box, temp ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); +} + +/* ---------------------------------------------------------------------- */ + +int BOp_OMP( storage *workspace, reax_list *bonds, double bo_cut, + int i, int btop_i, far_neighbor_data *nbr_pj, + single_body_parameters *sbp_i, single_body_parameters *sbp_j, + two_body_parameters *twbp, + int btop_j, double C12, double C34, double C56, double BO, double BO_s, double BO_pi, double BO_pi2) { + int j; + double rr2; + double Cln_BOp_s, Cln_BOp_pi, Cln_BOp_pi2; + bond_data *ibond, *jbond; + bond_order_data *bo_ij, *bo_ji; + + j = nbr_pj->nbr; + rr2 = 1.0 / SQR(nbr_pj->d); + + // Top portion of BOp() moved to reaxc_forces_omp.cpp::Init_Forces_noQEq_OMP() + + /* Initially BO values are the uncorrected ones, page 1 */ + + /****** bonds i-j and j-i ******/ + ibond = &( bonds->select.bond_list[btop_i] ); + jbond = &( bonds->select.bond_list[btop_j] ); + + ibond->nbr = j; + jbond->nbr = i; + ibond->d = nbr_pj->d; + jbond->d = nbr_pj->d; + rvec_Copy( ibond->dvec, nbr_pj->dvec ); + rvec_Scale( jbond->dvec, -1, nbr_pj->dvec ); + ivec_Copy( ibond->rel_box, nbr_pj->rel_box ); + ivec_Scale( jbond->rel_box, -1, nbr_pj->rel_box ); + ibond->dbond_index = btop_i; + jbond->dbond_index = btop_i; + ibond->sym_index = btop_j; + jbond->sym_index = btop_i; + + bo_ij = &( ibond->bo_data ); + bo_ji = &( jbond->bo_data ); + bo_ji->BO = bo_ij->BO = BO; + bo_ji->BO_s = bo_ij->BO_s = BO_s; + bo_ji->BO_pi = bo_ij->BO_pi = BO_pi; + bo_ji->BO_pi2 = bo_ij->BO_pi2 = BO_pi2; + + /* Bond Order page2-3, derivative of total bond order prime */ + Cln_BOp_s = twbp->p_bo2 * C12 * rr2; + Cln_BOp_pi = twbp->p_bo4 * C34 * rr2; + Cln_BOp_pi2 = twbp->p_bo6 * C56 * rr2; + + /* Only dln_BOp_xx wrt. dr_i is stored here, note that + dln_BOp_xx/dr_i = -dln_BOp_xx/dr_j and all others are 0 */ + rvec_Scale(bo_ij->dln_BOp_s,-bo_ij->BO_s*Cln_BOp_s,ibond->dvec); + rvec_Scale(bo_ij->dln_BOp_pi,-bo_ij->BO_pi*Cln_BOp_pi,ibond->dvec); + rvec_Scale(bo_ij->dln_BOp_pi2, + -bo_ij->BO_pi2*Cln_BOp_pi2,ibond->dvec); + rvec_Scale(bo_ji->dln_BOp_s, -1., bo_ij->dln_BOp_s); + rvec_Scale(bo_ji->dln_BOp_pi, -1., bo_ij->dln_BOp_pi ); + rvec_Scale(bo_ji->dln_BOp_pi2, -1., bo_ij->dln_BOp_pi2 ); + + rvec_Scale( bo_ij->dBOp, + -(bo_ij->BO_s * Cln_BOp_s + + bo_ij->BO_pi * Cln_BOp_pi + + bo_ij->BO_pi2 * Cln_BOp_pi2), ibond->dvec ); + rvec_Scale( bo_ji->dBOp, -1., bo_ij->dBOp ); + + bo_ij->BO_s -= bo_cut; + bo_ij->BO -= bo_cut; + bo_ji->BO_s -= bo_cut; + bo_ji->BO -= bo_cut; + + bo_ij->Cdbo = bo_ij->Cdbopi = bo_ij->Cdbopi2 = 0.0; + bo_ji->Cdbo = bo_ji->Cdbopi = bo_ji->Cdbopi2 = 0.0; + + return 1; +} + +/* ---------------------------------------------------------------------- */ + +void BOOMP( reax_system *system, control_params *control, simulation_data *data, + storage *workspace, reax_list **lists, output_controls *out_control ) +{ +#ifdef OMP_TIMING + double endTimeBase, startTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + double p_lp1 = system->reax_param.gp.l[15]; + int num_bonds = 0; + double p_boc1 = system->reax_param.gp.l[0]; + double p_boc2 = system->reax_param.gp.l[1]; + reax_list *bonds = (*lists) + BONDS; + int natoms = system->N; + int nthreads = control->nthreads; + +#pragma omp parallel default(shared) + { + int i, j, pj, type_i, type_j; + int start_i, end_i, sym_index; + double val_i, Deltap_i, Deltap_boc_i; + double val_j, Deltap_j, Deltap_boc_j; + double f1, f2, f3, f4, f5, f4f5, exp_f4, exp_f5; + double exp_p1i, exp_p2i, exp_p1j, exp_p2j, explp1; + double temp, u1_ij, u1_ji, Cf1A_ij, Cf1B_ij, Cf1_ij, Cf1_ji; + double Cf45_ij, Cf45_ji; //u_ij, u_ji + double A0_ij, A1_ij, A2_ij, A2_ji, A3_ij, A3_ji; + single_body_parameters *sbp_i, *sbp_j; + two_body_parameters *twbp; + bond_order_data *bo_ij, *bo_ji; + + int tid = omp_get_thread_num(); + + /* Calculate Deltaprime, Deltaprime_boc values */ +#pragma omp for schedule(static) + for (i = 0; i < system->N; ++i) { + type_i = system->my_atoms[i].type; + if(type_i < 0) continue; + sbp_i = &(system->reax_param.sbp[type_i]); + workspace->Deltap[i] = workspace->total_bond_order[i] - sbp_i->valency; + workspace->Deltap_boc[i] = + workspace->total_bond_order[i] - sbp_i->valency_val; + + workspace->total_bond_order[i] = 0; + } + + // Wait till initialization complete +#pragma omp barrier + + /* Corrected Bond Order calculations */ +//#pragma omp for schedule(dynamic,50) +#pragma omp for schedule(guided) + for (i = 0; i < system->N; ++i) { + type_i = system->my_atoms[i].type; + if(type_i < 0) continue; + sbp_i = &(system->reax_param.sbp[type_i]); + val_i = sbp_i->valency; + Deltap_i = workspace->Deltap[i]; + Deltap_boc_i = workspace->Deltap_boc[i]; + start_i = Start_Index(i, bonds); + end_i = End_Index(i, bonds); + + for (pj = start_i; pj < end_i; ++pj) { + j = bonds->select.bond_list[pj].nbr; + type_j = system->my_atoms[j].type; + if(type_j < 0) continue; + bo_ij = &( bonds->select.bond_list[pj].bo_data ); + + if( i < j || workspace->bond_mark[j] > 3) { + twbp = &( system->reax_param.tbp[type_i][type_j] ); + + if( twbp->ovc < 0.001 && twbp->v13cor < 0.001 ) { + bo_ij->C1dbo = 1.000000; + bo_ij->C2dbo = 0.000000; + bo_ij->C3dbo = 0.000000; + + bo_ij->C1dbopi = bo_ij->BO_pi; + bo_ij->C2dbopi = 0.000000; + bo_ij->C3dbopi = 0.000000; + bo_ij->C4dbopi = 0.000000; + + bo_ij->C1dbopi2 = bo_ij->BO_pi2; + bo_ij->C2dbopi2 = 0.000000; + bo_ij->C3dbopi2 = 0.000000; + bo_ij->C4dbopi2 = 0.000000; + + } + else { + val_j = system->reax_param.sbp[type_j].valency; + Deltap_j = workspace->Deltap[j]; + Deltap_boc_j = workspace->Deltap_boc[j]; + + /* on page 1 */ + if( twbp->ovc >= 0.001 ) { + /* Correction for overcoordination */ + exp_p1i = exp( -p_boc1 * Deltap_i ); + exp_p2i = exp( -p_boc2 * Deltap_i ); + exp_p1j = exp( -p_boc1 * Deltap_j ); + exp_p2j = exp( -p_boc2 * Deltap_j ); + + f2 = exp_p1i + exp_p1j; + f3 = -1.0 / p_boc2 * log( 0.5 * ( exp_p2i + exp_p2j ) ); + f1 = 0.5 * ( ( val_i + f2 )/( val_i + f2 + f3 ) + + ( val_j + f2 )/( val_j + f2 + f3 ) ); + + /* Now come the derivates */ + /* Bond Order pages 5-7, derivative of f1 */ + temp = f2 + f3; + u1_ij = val_i + temp; + u1_ji = val_j + temp; + Cf1A_ij = 0.5 * f3 * (1.0 / SQR( u1_ij ) + + 1.0 / SQR( u1_ji )); + Cf1B_ij = -0.5 * (( u1_ij - f3 ) / SQR( u1_ij ) + + ( u1_ji - f3 ) / SQR( u1_ji )); + + Cf1_ij = 0.50 * ( -p_boc1 * exp_p1i / u1_ij - + ((val_i+f2) / SQR(u1_ij)) * + ( -p_boc1 * exp_p1i + + exp_p2i / ( exp_p2i + exp_p2j ) ) + + -p_boc1 * exp_p1i / u1_ji - + ((val_j+f2) / SQR(u1_ji)) * + ( -p_boc1 * exp_p1i + + exp_p2i / ( exp_p2i + exp_p2j ) )); + + + Cf1_ji = -Cf1A_ij * p_boc1 * exp_p1j + + Cf1B_ij * exp_p2j / ( exp_p2i + exp_p2j ); + } + else { + /* No overcoordination correction! */ + f1 = 1.0; + Cf1_ij = Cf1_ji = 0.0; + } + + if( twbp->v13cor >= 0.001 ) { + /* Correction for 1-3 bond orders */ + exp_f4 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - + Deltap_boc_i) * twbp->p_boc3 + twbp->p_boc5); + exp_f5 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - + Deltap_boc_j) * twbp->p_boc3 + twbp->p_boc5); + + f4 = 1. / (1. + exp_f4); + f5 = 1. / (1. + exp_f5); + f4f5 = f4 * f5; + + /* Bond Order pages 8-9, derivative of f4 and f5 */ + Cf45_ij = -f4 * exp_f4; + Cf45_ji = -f5 * exp_f5; + } + else { + f4 = f5 = f4f5 = 1.0; + Cf45_ij = Cf45_ji = 0.0; + } + + /* Bond Order page 10, derivative of total bond order */ + A0_ij = f1 * f4f5; + A1_ij = -2 * twbp->p_boc3 * twbp->p_boc4 * bo_ij->BO * + (Cf45_ij + Cf45_ji); + A2_ij = Cf1_ij / f1 + twbp->p_boc3 * Cf45_ij; + A2_ji = Cf1_ji / f1 + twbp->p_boc3 * Cf45_ji; + A3_ij = A2_ij + Cf1_ij / f1; + A3_ji = A2_ji + Cf1_ji / f1; + + /* find corrected bond orders and their derivative coef */ + bo_ij->BO = bo_ij->BO * A0_ij; + bo_ij->BO_pi = bo_ij->BO_pi * A0_ij *f1; + bo_ij->BO_pi2= bo_ij->BO_pi2* A0_ij *f1; + bo_ij->BO_s = bo_ij->BO - ( bo_ij->BO_pi + bo_ij->BO_pi2 ); + + bo_ij->C1dbo = A0_ij + bo_ij->BO * A1_ij; + bo_ij->C2dbo = bo_ij->BO * A2_ij; + bo_ij->C3dbo = bo_ij->BO * A2_ji; + + bo_ij->C1dbopi = f1*f1*f4*f5; + bo_ij->C2dbopi = bo_ij->BO_pi * A1_ij; + bo_ij->C3dbopi = bo_ij->BO_pi * A3_ij; + bo_ij->C4dbopi = bo_ij->BO_pi * A3_ji; + + bo_ij->C1dbopi2 = f1*f1*f4*f5; + bo_ij->C2dbopi2 = bo_ij->BO_pi2 * A1_ij; + bo_ij->C3dbopi2 = bo_ij->BO_pi2 * A3_ij; + bo_ij->C4dbopi2 = bo_ij->BO_pi2 * A3_ji; + } + + /* neglect bonds that are < 1e-10 */ + if( bo_ij->BO < 1e-10 ) + bo_ij->BO = 0.0; + if( bo_ij->BO_s < 1e-10 ) + bo_ij->BO_s = 0.0; + if( bo_ij->BO_pi < 1e-10 ) + bo_ij->BO_pi = 0.0; + if( bo_ij->BO_pi2 < 1e-10 ) + bo_ij->BO_pi2 = 0.0; + + workspace->total_bond_order[i] += bo_ij->BO; //now keeps total_BO + } + // else { + // /* We only need to update bond orders from bo_ji + // everything else is set in uncorrected_bo calculations */ + // sym_index = bonds->select.bond_list[pj].sym_index; + // bo_ji = &(bonds->select.bond_list[ sym_index ].bo_data); + // bo_ij->BO = bo_ji->BO; + // bo_ij->BO_s = bo_ji->BO_s; + // bo_ij->BO_pi = bo_ji->BO_pi; + // bo_ij->BO_pi2 = bo_ji->BO_pi2; + + // workspace->total_bond_order[i] += bo_ij->BO;// now keeps total_BO + // } + } + + } + + // Wait for bo_ij to be updated +#pragma omp barrier + + // Try to combine the following for-loop back into the for-loop above + /*-------------------------*/ +#pragma omp for schedule(guided) + for (i = 0; i < system->N; ++i) { + type_i = system->my_atoms[i].type; + if(type_i < 0) continue; + start_i = Start_Index(i, bonds); + end_i = End_Index(i, bonds); + + for (pj = start_i; pj < end_i; ++pj) { + j = bonds->select.bond_list[pj].nbr; + type_j = system->my_atoms[j].type; + if(type_j < 0) continue; + + if( i < j || workspace->bond_mark[j] > 3) { + // Computed in previous for-loop + } else { + /* We only need to update bond orders from bo_ji + everything else is set in uncorrected_bo calculations */ + sym_index = bonds->select.bond_list[pj].sym_index; + + bo_ij = &( bonds->select.bond_list[pj].bo_data ); + bo_ji = &(bonds->select.bond_list[ sym_index ].bo_data); + bo_ij->BO = bo_ji->BO; + bo_ij->BO_s = bo_ji->BO_s; + bo_ij->BO_pi = bo_ji->BO_pi; + bo_ij->BO_pi2 = bo_ji->BO_pi2; + + workspace->total_bond_order[i] += bo_ij->BO;// now keeps total_BO + } + } + + } + + /*-------------------------*/ + + // Need to wait for total_bond_order to be accumulated. +#pragma omp barrier + + /* Calculate some helper variables that are used at many places + throughout force calculations */ +#pragma omp for schedule(guided) + for(j = 0; j < system->N; ++j ) { + type_j = system->my_atoms[j].type; + if(type_j < 0) continue; + sbp_j = &(system->reax_param.sbp[ type_j ]); + + workspace->Delta[j] = workspace->total_bond_order[j] - sbp_j->valency; + workspace->Delta_e[j] = workspace->total_bond_order[j] - sbp_j->valency_e; + workspace->Delta_boc[j] = workspace->total_bond_order[j] - + sbp_j->valency_boc; + workspace->Delta_val[j] = workspace->total_bond_order[j] - + sbp_j->valency_val; + + workspace->vlpex[j] = workspace->Delta_e[j] - + 2.0 * (int)(workspace->Delta_e[j]/2.0); + explp1 = exp(-p_lp1 * SQR(2.0 + workspace->vlpex[j])); + workspace->nlp[j] = explp1 - (int)(workspace->Delta_e[j] / 2.0); + workspace->Delta_lp[j] = sbp_j->nlp_opt - workspace->nlp[j]; + workspace->Clp[j] = 2.0 * p_lp1 * explp1 * (2.0 + workspace->vlpex[j]); + workspace->dDelta_lp[j] = workspace->Clp[j]; + + if( sbp_j->mass > 21.0 ) { + workspace->nlp_temp[j] = 0.5 * (sbp_j->valency_e - sbp_j->valency); + workspace->Delta_lp_temp[j] = sbp_j->nlp_opt - workspace->nlp_temp[j]; + workspace->dDelta_lp_temp[j] = 0.; + } + else { + workspace->nlp_temp[j] = workspace->nlp[j]; + workspace->Delta_lp_temp[j] = sbp_j->nlp_opt - workspace->nlp_temp[j]; + workspace->dDelta_lp_temp[j] = workspace->Clp[j]; + } + } + + } // parallel region + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTEBOINDEX] += (endTimeBase-startTimeBase); + +#endif +} diff --git a/src/USER-OMP/reaxc_bond_orders_omp.h b/src/USER-OMP/reaxc_bond_orders_omp.h new file mode 100644 index 0000000000..272309cadd --- /dev/null +++ b/src/USER-OMP/reaxc_bond_orders_omp.h @@ -0,0 +1,43 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#ifndef __BOND_ORDERS_OMP_H_ +#define __BOND_ORDERS_OMP_H_ + +#include "reaxc_types.h" +#include "reaxc_bond_orders.h" + +void Add_dBond_to_ForcesOMP( reax_system*, int, int, storage*, reax_list** ); +void Add_dBond_to_Forces_NPTOMP( reax_system *system, int, int, simulation_data*, + storage*, reax_list** ); + +int BOp_OMP(storage*, reax_list*, double, int, int, far_neighbor_data*, + single_body_parameters*, single_body_parameters*, two_body_parameters*, + int, double, double, double, double, double, double, double); + +void BOOMP( reax_system*, control_params*, simulation_data*, + storage*, reax_list**, output_controls* ); +#endif diff --git a/src/USER-OMP/reaxc_bonds_omp.cpp b/src/USER-OMP/reaxc_bonds_omp.cpp new file mode 100644 index 0000000000..4dc666b3ee --- /dev/null +++ b/src/USER-OMP/reaxc_bonds_omp.cpp @@ -0,0 +1,174 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#include "pair_reaxc_omp.h" +#include + +#include "reaxc_bonds_omp.h" +#include "reaxc_bond_orders_omp.h" +#include "reaxc_list.h" +#include "reaxc_tool_box.h" +#include "reaxc_vector.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +void BondsOMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, reax_list **lists, + output_controls *out_control ) +{ +#ifdef OMP_TIMING + double endTimeBase, startTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + int natoms = system->n; + int nthreads = control->nthreads; + reax_list *bonds = (*lists) + BONDS; + double gp3 = system->reax_param.gp.l[3]; + double gp4 = system->reax_param.gp.l[4]; + double gp7 = system->reax_param.gp.l[7]; + double gp10 = system->reax_param.gp.l[10]; + double gp37 = (int) system->reax_param.gp.l[37]; + double total_Ebond = 0.0; + +#pragma omp parallel default(shared) reduction(+: total_Ebond) + { + int i, j, pj; + int start_i, end_i; + int type_i, type_j; + double ebond, ebond_thr=0.0, pow_BOs_be2, exp_be12, CEbo; + double gp3, gp4, gp7, gp10, gp37; + double exphu, exphua1, exphub1, exphuov, hulpov, estriph, estriph_thr=0.0; + double decobdbo, decobdboua, decobdboub; + single_body_parameters *sbp_i, *sbp_j; + two_body_parameters *twbp; + bond_order_data *bo_ij; + int tid = omp_get_thread_num(); + long reductionOffset = (system->N * tid); + + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, natoms, + system->pair_ptr->eatom, system->pair_ptr->vatom, thr); + +#pragma omp for schedule(guided) + for (i = 0; i < natoms; ++i) { + start_i = Start_Index(i, bonds); + end_i = End_Index(i, bonds); + + for (pj = start_i; pj < end_i; ++pj) { + j = bonds->select.bond_list[pj].nbr; + + if( system->my_atoms[i].orig_id > system->my_atoms[j].orig_id ) continue; + + if( system->my_atoms[i].orig_id == system->my_atoms[j].orig_id ) { + if (system->my_atoms[j].x[2] < system->my_atoms[i].x[2]) continue; + if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && + system->my_atoms[j].x[1] < system->my_atoms[i].x[1]) continue; + if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && + system->my_atoms[j].x[1] == system->my_atoms[i].x[1] && + system->my_atoms[j].x[0] < system->my_atoms[i].x[0]) continue; + } + + /* set the pointers */ + type_i = system->my_atoms[i].type; + type_j = system->my_atoms[j].type; + sbp_i = &( system->reax_param.sbp[type_i] ); + sbp_j = &( system->reax_param.sbp[type_j] ); + twbp = &( system->reax_param.tbp[type_i][type_j] ); + bo_ij = &( bonds->select.bond_list[pj].bo_data ); + + /* calculate the constants */ + pow_BOs_be2 = pow( bo_ij->BO_s, twbp->p_be2 ); + exp_be12 = exp( twbp->p_be1 * ( 1.0 - pow_BOs_be2 ) ); + CEbo = -twbp->De_s * exp_be12 * + ( 1.0 - twbp->p_be1 * twbp->p_be2 * pow_BOs_be2 ); + + /* calculate the Bond Energy */ + total_Ebond += ebond = + -twbp->De_s * bo_ij->BO_s * exp_be12 + -twbp->De_p * bo_ij->BO_pi + -twbp->De_pp * bo_ij->BO_pi2; + + /* tally into per-atom energy */ + if (system->pair_ptr->evflag) + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, + ebond, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + + /* calculate derivatives of Bond Orders */ + bo_ij->Cdbo += CEbo; + bo_ij->Cdbopi -= (CEbo + twbp->De_p); + bo_ij->Cdbopi2 -= (CEbo + twbp->De_pp); + + /* Stabilisation terminal triple bond */ + if (bo_ij->BO >= 1.00) { + if (gp37 == 2 || + (sbp_i->mass == 12.0000 && sbp_j->mass == 15.9990) || + (sbp_j->mass == 12.0000 && sbp_i->mass == 15.9990)) { + exphu = exp( -gp7 * SQR(bo_ij->BO - 2.50) ); + exphua1 = exp(-gp3 * (workspace->total_bond_order[i]-bo_ij->BO)); + exphub1 = exp(-gp3 * (workspace->total_bond_order[j]-bo_ij->BO)); + exphuov = exp(gp4 * (workspace->Delta[i] + workspace->Delta[j])); + hulpov = 1.0 / (1.0 + 25.0 * exphuov); + + estriph = gp10 * exphu * hulpov * (exphua1 + exphub1); + total_Ebond += estriph; + + decobdbo = gp10 * exphu * hulpov * (exphua1 + exphub1) * + ( gp3 - 2.0 * gp7 * (bo_ij->BO-2.50) ); + decobdboua = -gp10 * exphu * hulpov * + (gp3*exphua1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); + decobdboub = -gp10 * exphu * hulpov * + (gp3*exphub1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); + + /* tally into per-atom energy */ + if (system->pair_ptr->evflag) + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, + estriph, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + + bo_ij->Cdbo += decobdbo; + workspace->CdDelta[i] += decobdboua; + workspace->CdDeltaReduction[reductionOffset+j] += decobdboub; + } + } + } + } // for(i) + + } // omp + + data->my_en.e_bond += total_Ebond; + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTEBONDSINDEX] += (endTimeBase-startTimeBase); +#endif + +} diff --git a/src/USER-OMP/reaxc_bonds_omp.h b/src/USER-OMP/reaxc_bonds_omp.h new file mode 100644 index 0000000000..8c07fd8957 --- /dev/null +++ b/src/USER-OMP/reaxc_bonds_omp.h @@ -0,0 +1,35 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#ifndef __BONDS_OMP_H_ +#define __BONDS_OMP_H_ + +#include "reaxc_types.h" + +void BondsOMP( reax_system*, control_params*, simulation_data*, + storage*, reax_list**, output_controls* ); + +#endif diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp new file mode 100644 index 0000000000..1bf04129e0 --- /dev/null +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -0,0 +1,637 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#include "pair_reaxc_omp.h" +#include "omp.h" +#include "thr_data.h" + +#include "reaxc_forces_omp.h" +#include "reaxc_bond_orders_omp.h" +#include "reaxc_bonds_omp.h" +#include "reaxc_hydrogen_bonds_omp.h" +#include "reaxc_io_tools.h" +#include "reaxc_list.h" +#include "reaxc_lookup.h" +#include "reaxc_multi_body_omp.h" +#include "reaxc_nonbonded_omp.h" +#include "reaxc_tool_box.h" +#include "reaxc_torsion_angles_omp.h" +#include "reaxc_valence_angles_omp.h" +#include "reaxc_vector.h" + +using namespace LAMMPS_NS; + +// Functions defined in reaxc_forces.cpp +extern interaction_function Interaction_Functions[]; +extern double Compute_H(double, double, double*); +extern double Compute_tabH(double, int, int); +extern void Dummy_Interaction(reax_system*, control_params*, simulation_data*, storage*, reax_list**, output_controls*); + +/* ---------------------------------------------------------------------- */ + +void Init_Force_FunctionsOMP( control_params *control ) +{ + Interaction_Functions[0] = BOOMP; + Interaction_Functions[1] = BondsOMP; //Dummy_Interaction; + Interaction_Functions[2] = Atom_EnergyOMP; //Dummy_Interaction; + Interaction_Functions[3] = Valence_AnglesOMP; //Dummy_Interaction; + Interaction_Functions[4] = Torsion_AnglesOMP; //Dummy_Interaction; + if( control->hbond_cut > 0 ) + Interaction_Functions[5] = Hydrogen_BondsOMP; + else Interaction_Functions[5] = Dummy_Interaction; + Interaction_Functions[6] = Dummy_Interaction; //empty + Interaction_Functions[7] = Dummy_Interaction; //empty + Interaction_Functions[8] = Dummy_Interaction; //empty + Interaction_Functions[9] = Dummy_Interaction; //empty +} + +/* ---------------------------------------------------------------------- */ + +// Only difference with MPI-only version is inclusion of OMP_TIMING statements +void Compute_Bonded_ForcesOMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control, + MPI_Comm comm ) +{ + int i; + +#ifdef OMP_TIMING + double startTimeBase, endTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + /* Implement all force calls as function pointers */ + for( i = 0; i < NUM_INTRS; i++ ) { + (Interaction_Functions[i])( system, control, data, workspace, + lists, out_control ); + } + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTEBFINDEX] += (endTimeBase-startTimeBase); +#endif + +} + +// Only difference with MPI-only version is inclusion of OMP_TIMING statements +void Compute_NonBonded_ForcesOMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control, + MPI_Comm comm ) +{ + /* van der Waals and Coulomb interactions */ +#ifdef OMP_TIMING + double endTimeBase, startTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + if( control->tabulate == 0 ) + vdW_Coulomb_Energy_OMP( system, control, data, workspace, + lists, out_control ); + else + Tabulated_vdW_Coulomb_Energy_OMP( system, control, data, workspace, + lists, out_control ); + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTENBFINDEX] += (endTimeBase-startTimeBase); +#endif +} + +/* ---------------------------------------------------------------------- */ + +/* this version of Compute_Total_Force computes forces from + coefficients accumulated by all interaction functions. + Saves enormous time & space! */ +void Compute_Total_ForceOMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, mpi_datatypes *mpi_data ) +{ +#ifdef OMP_TIMING + double startTimeBase,endTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + int natoms = system->N; + int nthreads = control->nthreads; + long totalReductionSize = system->N * nthreads; + reax_list *bonds = (*lists) + BONDS; + +#pragma omp parallel default(shared) //default(none) + { + int i, j, k, pj, pk, start_j, end_j; + int tid = omp_get_thread_num(); + bond_order_data *bo_jk; + + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + + pair_reax_ptr->ev_setup_thr_proxy(0, 1, natoms, system->pair_ptr->eatom, + system->pair_ptr->vatom, thr); + +#pragma omp for schedule(guided) + for (i = 0; i < system->N; ++i) { + for (j = 0; j < nthreads; ++j) + workspace->CdDelta[i] += workspace->CdDeltaReduction[system->N*j+i]; + } + +#pragma omp for schedule(dynamic,50) + for (j = 0; j < system->N; ++j) { + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); + + for (pk = start_j; pk < end_j; ++pk) { + bo_jk = &( bonds->select.bond_list[pk].bo_data ); + for (k = 0; k < nthreads; ++k) + bo_jk->Cdbo += bo_jk->CdboReduction[k]; + } + } + +// #pragma omp for schedule(guided) //(dynamic,50) +// for (i = 0; i < system->N; ++i) +// for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) +// if (i < bonds->select.bond_list[pj].nbr) { +// if (control->virial == 0) +// Add_dBond_to_ForcesOMP( system, i, pj, workspace, lists ); +// else +// Add_dBond_to_Forces_NPTOMP(system, i, pj, data, workspace, lists ); +// } + + if(control->virial == 0) { + +#pragma omp for schedule(dynamic,50) + for (i = 0; i < system->N; ++i) { + const int startj = Start_Index(i, bonds); + const int endj = End_Index(i, bonds); + for (pj = startj; pj < endj; ++pj) + if (i < bonds->select.bond_list[pj].nbr) + Add_dBond_to_ForcesOMP( system, i, pj, workspace, lists ); + } + + } else { + +#pragma omp for schedule(dynamic,50) + for (i = 0; i < system->N; ++i) { + const int startj = Start_Index(i, bonds); + const int endj = End_Index(i, bonds); + for (pj = startj; pj < endj; ++pj) + if (i < bonds->select.bond_list[pj].nbr) + Add_dBond_to_Forces_NPTOMP(system, i, pj, data, workspace, lists ); + } + + } // if(virial == 0) + + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, 0, 1, thr); + +#pragma omp for schedule(guided) + for (i = 0; i < system->N; ++i) { + for (j = 0; j < nthreads; ++j) + rvec_Add( workspace->f[i], workspace->forceReduction[system->N*j+i] ); + } + + +#pragma omp for schedule(guided) + for (i = 0; i < totalReductionSize; i++) { + workspace->forceReduction[i][0] = 0; + workspace->forceReduction[i][1] = 0; + workspace->forceReduction[i][2] = 0; + workspace->CdDeltaReduction[i] = 0; + } + } // parallel region + + if (control->virial) + for (int i=0; i < nthreads; ++i) { + rvec_Add(data->my_ext_press, workspace->my_ext_pressReduction[i]); + workspace->my_ext_pressReduction[i][0] = 0; + workspace->my_ext_pressReduction[i][1] = 0; + workspace->my_ext_pressReduction[i][2] = 0; + } + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTETFINDEX] += (endTimeBase-startTimeBase); +#endif +} + +/* ---------------------------------------------------------------------- */ + +void Validate_ListsOMP( reax_system *system, storage *workspace, reax_list **lists, + int step, int n, int N, int numH, MPI_Comm comm ) +{ + int i, comp, Hindex; + reax_list *bonds, *hbonds; + reallocate_data *realloc = &(workspace->realloc); + double saferzone = system->saferzone; + +#pragma omp parallel default(shared) private(i, comp, Hindex) + { + + /* bond list */ + if( N > 0 ) { + bonds = *lists + BONDS; + +#pragma omp for schedule(guided) + for( i = 0; i < N; ++i ) { + system->my_atoms[i].num_bonds = MAX(Num_Entries(i,bonds)*2, MIN_BONDS); + + if( i < N-1 ) + comp = Start_Index(i+1, bonds); + else comp = bonds->num_intrs; + + if( End_Index(i, bonds) > comp ) { + fprintf( stderr, "step%d-bondchk failed: i=%d end(i)=%d str(i+1)=%d\n", + step, i, End_Index(i,bonds), comp ); + MPI_Abort( comm, INSUFFICIENT_MEMORY ); + } + } + } + + + /* hbonds list */ + if( numH > 0 ) { + hbonds = *lists + HBONDS; + +#pragma omp for schedule(guided) + for( i = 0; i < n; ++i ) { + Hindex = system->my_atoms[i].Hindex; + if( Hindex > -1 ) { + system->my_atoms[i].num_hbonds = + (int)(MAX( Num_Entries(Hindex, hbonds)*saferzone, MIN_HBONDS )); + + if( Hindex < numH-1 ) + comp = Start_Index(Hindex+1, hbonds); + else comp = hbonds->num_intrs; + + if( End_Index(Hindex, hbonds) > comp ) { + fprintf(stderr,"step%d-hbondchk failed: H=%d end(H)=%d str(H+1)=%d\n", + step, Hindex, End_Index(Hindex,hbonds), comp ); + MPI_Abort( comm, INSUFFICIENT_MEMORY ); + } + } + } + } + + } // omp parallel +} + + +void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control, + MPI_Comm comm ) { +#ifdef OMP_TIMING + double startTimeBase, endTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + int i, j, pi, pj; + int start_i, end_i, start_j, end_j; + int type_i, type_j; + int ihb, jhb, ihb_top, jhb_top; + int local, flag; + double r_ij, cutoff; + single_body_parameters *sbp_i, *sbp_j; + two_body_parameters *twbp; + far_neighbor_data *nbr_pj; + reax_atom *atom_i, *atom_j; + bond_data *ibond, *jbond; + reax_list *far_nbrs = *lists + FAR_NBRS; + reax_list *bonds = *lists + BONDS; + reax_list *hbonds = *lists + HBONDS; + int num_bonds = 0; + int num_hbonds = 0; + int btop_i = 0; + int btop_j = 0; + int renbr = (data->step-data->prev_steps) % control->reneighbor == 0; + + // We will use CdDeltaReduction as a temporary (double) buffer to accumulate total_bond_order + // This is safe because CdDeltaReduction is currently zeroed and its accumulation doesn't start until BondsOMP() + double * tmp_bond_order = workspace->CdDeltaReduction; + + // We do the same with forceReduction as a temporary (rvec) buffer to accumulate dDeltap_self + // This is safe because forceReduction is currently zeroed and its accumulation does start until Hydrogen_BondsOMP() + rvec * tmp_ddelta = workspace->forceReduction; + + /* uncorrected bond orders */ + cutoff = control->bond_cut; + +#pragma omp parallel default(shared) \ + private(i, atom_i, type_i, pi, start_i, end_i, sbp_i, btop_i, ibond, ihb, ihb_top, \ + j, atom_j, type_j, pj, start_j, end_j, sbp_j, nbr_pj, jbond, jhb, twbp) + { + + int nthreads = control->nthreads; + int tid = omp_get_thread_num(); + long reductionOffset = system->N * tid; + long totalReductionSize = system->N * nthreads; + +#pragma omp for schedule(dynamic,50) reduction(+ : num_bonds) +//#pragma omp for schedule(guided) reduction(+ : num_bonds) + for (i = 0; i < system->N; ++i) { + atom_i = &(system->my_atoms[i]); + type_i = atom_i->type; + sbp_i = &(system->reax_param.sbp[type_i]); + + start_i = Start_Index(i, far_nbrs); + end_i = End_Index(i, far_nbrs); + + for( pj = start_i; pj < end_i; ++pj ) { + nbr_pj = &( far_nbrs->select.far_nbr_list[pj] ); + if (nbr_pj->d <= cutoff) { + j = nbr_pj->nbr; + atom_j = &(system->my_atoms[j]); + type_j = atom_j->type; + sbp_j = &(system->reax_param.sbp[type_j]); + twbp = &(system->reax_param.tbp[type_i][type_j]); + +// #pragma omp critical +// { +// btop_i = End_Index(i, bonds); +// if( BOp(workspace, bonds, control->bo_cut, i, btop_i, nbr_pj, sbp_i, sbp_j, twbp) ) { +// num_bonds++; +// btop_i++; +// Set_End_Index(i, btop_i, bonds); +// } + +// } + + // Trying to minimize time spent in critical section by moving initial part of BOp() + // outside of critical section. + + // Start top portion of BOp() + int jj = nbr_pj->nbr; + double C12, C34, C56; + double BO, BO_s, BO_pi, BO_pi2; + double bo_cut = control->bo_cut; + + if( sbp_i->r_s > 0.0 && sbp_j->r_s > 0.0 ) { + C12 = twbp->p_bo1 * pow( nbr_pj->d / twbp->r_s, twbp->p_bo2 ); + BO_s = (1.0 + bo_cut) * exp( C12 ); + } + else BO_s = C12 = 0.0; + + if( sbp_i->r_pi > 0.0 && sbp_j->r_pi > 0.0 ) { + C34 = twbp->p_bo3 * pow( nbr_pj->d / twbp->r_p, twbp->p_bo4 ); + BO_pi = exp( C34 ); + } + else BO_pi = C34 = 0.0; + + if( sbp_i->r_pi_pi > 0.0 && sbp_j->r_pi_pi > 0.0 ) { + C56 = twbp->p_bo5 * pow( nbr_pj->d / twbp->r_pp, twbp->p_bo6 ); + BO_pi2= exp( C56 ); + } + else BO_pi2 = C56 = 0.0; + + /* Initially BO values are the uncorrected ones, page 1 */ + BO = BO_s + BO_pi + BO_pi2; + // End top portion of BOp() + + if(BO >= bo_cut) { + int btop_j; + + // Update indices in critical section +#pragma omp critical + { + btop_i = End_Index( i, bonds ); + btop_j = End_Index( j, bonds ); + Set_End_Index( j, btop_j+1, bonds ); + Set_End_Index( i, btop_i+1, bonds ); + } // omp critical + + // Finish remaining BOp() work + BOp_OMP(workspace, bonds, bo_cut, + i , btop_i, nbr_pj, sbp_i, sbp_j, twbp, btop_j, + C12, C34, C56, BO, BO_s, BO_pi, BO_pi2); + + bond_data * ibond = &(bonds->select.bond_list[btop_i]); + bond_order_data * bo_ij = &(ibond->bo_data); + + bond_data * jbond = &(bonds->select.bond_list[btop_j]); + bond_order_data * bo_ji = &(jbond->bo_data); + + workspace->total_bond_order[i] += bo_ij->BO; + tmp_bond_order[reductionOffset + j] += bo_ji->BO; + + rvec_Add(workspace->dDeltap_self[i], bo_ij->dBOp); + rvec_Add(tmp_ddelta[reductionOffset + j], bo_ji->dBOp); + + btop_i++; + num_bonds++; + } // if(BO>=bo_cut) + + } // if(cutoff) + + } // for(pj) + } // for(i) + + // Need to wait for all indices and tmp arrays accumulated. +#pragma omp barrier + +#pragma omp for schedule(dynamic,50) + for(i=0; iN; i++) + for(int t=0; tN + i; + workspace->dDeltap_self[i][0] += tmp_ddelta[indx][0]; + workspace->dDeltap_self[i][1] += tmp_ddelta[indx][1]; + workspace->dDeltap_self[i][2] += tmp_ddelta[indx][2]; + workspace->total_bond_order[i] += tmp_bond_order[indx]; + } + + // Not needed anymore with newest BOp_OMP()? + //#pragma omp for schedule(guided) +// #pragma omp for schedule(dynamic,50) +// for (i = 0; i < system->N; ++i) { +// start_i = Start_Index(i, bonds); +// end_i = End_Index(i, bonds); + +// for (pi = start_i; pi < end_i; ++pi) { +// ibond = &(bonds->select.bond_list[pi]); +// j = ibond->nbr; + +// if (i < j) { +// start_j = Start_Index(j, bonds); +// end_j = End_Index(j, bonds); + +// for (pj = start_j; pj < end_j; ++pj) { +// jbond = &(bonds->select.bond_list[pj]); + +// if (jbond->nbr == i) { +// ibond->sym_index = pj; +// jbond->sym_index = pi; +// break; +// } +// } +// } +// } +// } + + /* hydrogen bond list */ + if (control->hbond_cut > 0) { + cutoff = control->hbond_cut; + +//#pragma omp for schedule(guided) reduction(+ : num_hbonds) +#pragma omp for schedule(dynamic,50) reduction(+ : num_hbonds) + for (i = 0; i < system->n; ++i) { + atom_i = &(system->my_atoms[i]); + type_i = atom_i->type; + sbp_i = &(system->reax_param.sbp[type_i]); + ihb = sbp_i->p_hbond; + +#pragma omp critical + { + + if (ihb == 1 || ihb == 2) { + start_i = Start_Index(i, far_nbrs); + end_i = End_Index(i, far_nbrs); + + for (pj = start_i; pj < end_i; ++pj) { + nbr_pj = &( far_nbrs->select.far_nbr_list[pj] ); + j = nbr_pj->nbr; + atom_j = &(system->my_atoms[j]); + type_j = atom_j->type; + if(type_j < 0) continue; + sbp_j = &(system->reax_param.sbp[type_j]); + jhb = sbp_j->p_hbond; + + if (nbr_pj->d <= control->hbond_cut) { + int iflag = 0; + int jflag = 0; + + if(ihb==1 && jhb==2) iflag = 1; + else if(jn && ihb == 2 && jhb == 1) jflag = 1; + + if(iflag || jflag) { + + // This critical section enforces H-bonds to be added by threads one at a time. +// #pragma omp critical +// { + if(iflag) { + ihb_top = End_Index(atom_i->Hindex, hbonds); + Set_End_Index(atom_i->Hindex, ihb_top+1, hbonds); + } else if(jflag) { + jhb_top = End_Index(atom_j->Hindex, hbonds); + Set_End_Index(atom_j->Hindex, jhb_top+1, hbonds); + } + // } // omp critical + + if(iflag) { + hbonds->select.hbond_list[ihb_top].nbr = j; + hbonds->select.hbond_list[ihb_top].scl = 1; + hbonds->select.hbond_list[ihb_top].ptr = nbr_pj; + } else if(jflag) { + hbonds->select.hbond_list[jhb_top].nbr = i; + hbonds->select.hbond_list[jhb_top].scl = -1; + hbonds->select.hbond_list[jhb_top].ptr = nbr_pj; + } + + num_hbonds++; + } // if(iflag || jflag) + + } + } + } + + } // omp critical + } + + } // if(control->hbond > 0) + + // Zero buffers for others to use as intended. +#pragma omp for schedule(guided) + for(i=0; irealloc.num_bonds = num_bonds; + workspace->realloc.num_hbonds = num_hbonds; + + Validate_ListsOMP( system, workspace, lists, data->step, + system->n, system->N, system->numH, comm ); + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTEIFINDEX] += (endTimeBase-startTimeBase); +#endif +} + +/* ---------------------------------------------------------------------- */ + +void Compute_ForcesOMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control, + mpi_datatypes *mpi_data ) +{ + int qeq_flag; + MPI_Comm comm = mpi_data->world; + + // Init Forces +#if defined(LOG_PERFORMANCE) + double t_start = 0; + if( system->my_rank == MASTER_NODE ) + t_start = Get_Time( ); +#endif + + Init_Forces_noQEq_OMP( system, control, data, workspace, + lists, out_control, comm ); + +#if defined(LOG_PERFORMANCE) + //MPI_Barrier( comm ); + if( system->my_rank == MASTER_NODE ) + Update_Timing_Info( &t_start, &(data->timing.init_forces) ); +#endif + + // Bonded Interactions + Compute_Bonded_ForcesOMP( system, control, data, workspace, + lists, out_control, mpi_data->world ); + +#if defined(LOG_PERFORMANCE) + if( system->my_rank == MASTER_NODE ) + Update_Timing_Info( &t_start, &(data->timing.bonded) ); +#endif + + // Nonbonded Interactions + Compute_NonBonded_ForcesOMP( system, control, data, workspace, + lists, out_control, mpi_data->world ); + +#if defined(LOG_PERFORMANCE) + if( system->my_rank == MASTER_NODE ) + Update_Timing_Info( &t_start, &(data->timing.nonb) ); +#endif + + // Total Force + Compute_Total_ForceOMP( system, control, data, workspace, lists, mpi_data ); + +#if defined(LOG_PERFORMANCE) + if( system->my_rank == MASTER_NODE ) + Update_Timing_Info( &t_start, &(data->timing.bonded) ); +#endif +} diff --git a/src/USER-OMP/reaxc_forces_omp.h b/src/USER-OMP/reaxc_forces_omp.h new file mode 100644 index 0000000000..f4941fc7fa --- /dev/null +++ b/src/USER-OMP/reaxc_forces_omp.h @@ -0,0 +1,36 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#ifndef __FORCES_OMP_H_ +#define __FORCES_OMP_H_ + +#include "reaxc_types.h" +#include "reaxc_defs.h" + +void Init_Force_FunctionsOMP( control_params* ); +void Compute_ForcesOMP( reax_system*, control_params*, simulation_data*, + storage*, reax_list**, output_controls*, mpi_datatypes* ); +#endif diff --git a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp new file mode 100644 index 0000000000..5047e2775e --- /dev/null +++ b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp @@ -0,0 +1,242 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#include "pair_reaxc_omp.h" +#include + +#include "reaxc_hydrogen_bonds_omp.h" +#include "reaxc_bond_orders_omp.h" +#include "reaxc_list.h" +#include "reaxc_valence_angles.h" // To access Calculate_Theta() +#include "reaxc_valence_angles_omp.h" // To access Calculate_dCos_ThetaOMP() +#include "reaxc_vector.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +void Hydrogen_BondsOMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control ) +{ +#ifdef OMP_TIMING + double endTimeBase, startTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + const int nthreads = control->nthreads; + long totalReductionSize = system->N; + +#pragma omp parallel default(shared) //default(none) + { + int i, j, k, pi, pk; + int type_i, type_j, type_k; + int start_j, end_j, hb_start_j, hb_end_j; + int hblist[MAX_BONDS]; + int itr, top; + int num_hb_intrs = 0; + ivec rel_jk; + double r_jk, theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2; + double e_hb, e_hb_thr = 0.0, exp_hb2, exp_hb3, CEhb1, CEhb2, CEhb3; + rvec dcos_theta_di, dcos_theta_dj, dcos_theta_dk; + rvec dvec_jk, force, ext_press; + hbond_parameters *hbp; + bond_order_data *bo_ij; + bond_data *pbond_ij; + far_neighbor_data *nbr_jk; + reax_list *bonds, *hbonds; + bond_data *bond_list; + hbond_data *hbond_list; + + // tally variables + double fi_tmp[3], fk_tmp[3], delij[3], delkj[3]; + + bonds = (*lists) + BONDS; + bond_list = bonds->select.bond_list; + hbonds = (*lists) + HBONDS; + hbond_list = hbonds->select.hbond_list; + + int natoms = system->n; + int tid = omp_get_thread_num(); + const int idelta = 1 + natoms/nthreads; + int ifrom = tid*idelta; + int ito = ((ifrom + idelta) > natoms) ? natoms : ifrom + idelta; + + long reductionOffset = (system->N * tid); + + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, + natoms, system->pair_ptr->eatom, + system->pair_ptr->vatom, thr); + + /* loops below discover the Hydrogen bonds between i-j-k triplets. + here j is H atom and there has to be some bond between i and j. + Hydrogen bond is between j and k. + so in this function i->X, j->H, k->Z when we map + variables onto the ones in the handout.*/ + // for( j = 0; j < system->n; ++j ) + for( j = ifrom; j < ito; ++j ) { + /* j has to be of type H */ + if( system->reax_param.sbp[system->my_atoms[j].type].p_hbond == 1 ) { + /*set j's variables */ + type_j = system->my_atoms[j].type; + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); + hb_start_j = Start_Index( system->my_atoms[j].Hindex, hbonds ); + hb_end_j = End_Index( system->my_atoms[j].Hindex, hbonds ); + if(type_j < 0) continue; + + top = 0; + for( pi = start_j; pi < end_j; ++pi ) { + pbond_ij = &( bond_list[pi] ); + i = pbond_ij->nbr; + type_i = system->my_atoms[i].type; + if(type_i < 0) continue; + bo_ij = &(pbond_ij->bo_data); + + if( system->reax_param.sbp[type_i].p_hbond == 2 && + bo_ij->BO >= HB_THRESHOLD ) + hblist[top++] = pi; + } + + for( pk = hb_start_j; pk < hb_end_j; ++pk ) { + /* set k's varibles */ + k = hbond_list[pk].nbr; + type_k = system->my_atoms[k].type; + if(type_k < 0) continue; + nbr_jk = hbond_list[pk].ptr; + r_jk = nbr_jk->d; + rvec_Scale( dvec_jk, hbond_list[pk].scl, nbr_jk->dvec ); + + for( itr = 0; itr < top; ++itr ) { + pi = hblist[itr]; + pbond_ij = &( bonds->select.bond_list[pi] ); + i = pbond_ij->nbr; + + if( system->my_atoms[i].orig_id != system->my_atoms[k].orig_id ) { + bo_ij = &(pbond_ij->bo_data); + type_i = system->my_atoms[i].type; + if(type_i < 0) continue; + hbp = &(system->reax_param.hbp[ type_i ][ type_j ][ type_k ]); + ++num_hb_intrs; + + Calculate_Theta( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, + &theta, &cos_theta ); + /* the derivative of cos(theta) */ + Calculate_dCos_ThetaOMP( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, + &dcos_theta_di, &dcos_theta_dj, + &dcos_theta_dk ); + + /* hydrogen bond energy*/ + sin_theta2 = sin( theta/2.0 ); + sin_xhz4 = SQR(sin_theta2); + sin_xhz4 *= sin_xhz4; + cos_xhz1 = ( 1.0 - cos_theta ); + exp_hb2 = exp( -hbp->p_hb2 * bo_ij->BO ); + exp_hb3 = exp( -hbp->p_hb3 * ( hbp->r0_hb / r_jk + + r_jk / hbp->r0_hb - 2.0 ) ); + + e_hb_thr += e_hb = hbp->p_hb1 * (1.0 - exp_hb2) * exp_hb3 * sin_xhz4; + + CEhb1 = hbp->p_hb1 * hbp->p_hb2 * exp_hb2 * exp_hb3 * sin_xhz4; + CEhb2 = -hbp->p_hb1/2.0 * (1.0 - exp_hb2) * exp_hb3 * cos_xhz1; + CEhb3 = -hbp->p_hb3 * + (-hbp->r0_hb / SQR(r_jk) + 1.0 / hbp->r0_hb) * e_hb; + + /* hydrogen bond forces */ + bo_ij->Cdbo += CEhb1; // dbo term + + if( control->virial == 0 ) { + // dcos terms + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], +CEhb2, dcos_theta_di ); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj ); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb2, dcos_theta_dk ); + // dr terms + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], -CEhb3/r_jk, dvec_jk ); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb3/r_jk, dvec_jk ); + } + else { + /* for pressure coupling, terms that are not related to bond order + derivatives are added directly into pressure vector/tensor */ + rvec_Scale( force, +CEhb2, dcos_theta_di ); // dcos terms + rvec_Add(workspace->forceReduction[reductionOffset+i], force ); + rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); + rvec_ScaledAdd( workspace->my_ext_pressReduction[tid],1.0, ext_press ); + + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj ); + + ivec_Scale( rel_jk, hbond_list[pk].scl, nbr_jk->rel_box ); + rvec_Scale( force, +CEhb2, dcos_theta_dk ); + rvec_Add(workspace->forceReduction[reductionOffset+k], force ); + rvec_iMultiply( ext_press, rel_jk, force ); + rvec_ScaledAdd( workspace->my_ext_pressReduction[tid],1.0, ext_press ); + // dr terms + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j],-CEhb3/r_jk, dvec_jk ); + + rvec_Scale( force, CEhb3/r_jk, dvec_jk ); + rvec_Add(workspace->forceReduction[reductionOffset+k], force ); + rvec_iMultiply( ext_press, rel_jk, force ); + rvec_ScaledAdd( workspace->my_ext_pressReduction[tid],1.0, ext_press ); + } + + /* tally into per-atom virials */ + if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + rvec_ScaledSum( delij, 1., system->my_atoms[j].x, + -1., system->my_atoms[i].x ); + rvec_ScaledSum( delkj, 1., system->my_atoms[j].x, + -1., system->my_atoms[k].x ); + + rvec_Scale(fi_tmp, CEhb2, dcos_theta_di); + rvec_Scale(fk_tmp, CEhb2, dcos_theta_dk); + rvec_ScaledAdd(fk_tmp, CEhb3/r_jk, dvec_jk); + + pair_reax_ptr->ev_tally3_thr_proxy(system->pair_ptr,i,j,k,e_hb,0.0,fi_tmp,fk_tmp,delij,delkj,thr); + } + } + } + } + + } + } +#pragma omp critical + { + data->my_en.e_hb += e_hb_thr; + } + + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, thr); +} + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTEHBONDSINDEX] += (endTimeBase-startTimeBase); +#endif +} diff --git a/src/USER-OMP/reaxc_hydrogen_bonds_omp.h b/src/USER-OMP/reaxc_hydrogen_bonds_omp.h new file mode 100644 index 0000000000..b4a2d78dbb --- /dev/null +++ b/src/USER-OMP/reaxc_hydrogen_bonds_omp.h @@ -0,0 +1,35 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#ifndef __HBONDS_OMP_H_ +#define __HBONDS_OMP_H_ + +#include "reaxc_types.h" + +void Hydrogen_BondsOMP( reax_system*, control_params*, simulation_data*, + storage*, reax_list**, output_controls* ); + +#endif diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp new file mode 100644 index 0000000000..1584d5e53e --- /dev/null +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -0,0 +1,188 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#include "pair_reaxc_omp.h" +#include "reaxc_init_md_omp.h" +#include "reaxc_allocate.h" +#include "reaxc_forces.h" +#include "reaxc_forces_omp.h" +#include "reaxc_io_tools.h" +#include "reaxc_list.h" +#include "reaxc_lookup.h" +#include "reaxc_reset_tools.h" +#include "reaxc_system_props.h" +#include "reaxc_tool_box.h" +#include "reaxc_vector.h" +#include "omp.h" + +// Functions definedd in reaxc_init_md.cpp +extern int Init_MPI_Datatypes(reax_system*, storage*, mpi_datatypes*, MPI_Comm, char*); +extern int Init_System(reax_system*, control_params*, char*); +extern int Init_Simulation_Data(reax_system*, control_params*, simulation_data*, char*); +extern int Init_Workspace(reax_system*, control_params*, storage*, MPI_Comm, char*); + +/* ---------------------------------------------------------------------- */ + +int Init_ListsOMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, reax_list **lists, + mpi_datatypes *mpi_data, char *msg ) +{ + int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; + int *hb_top, *bond_top; + MPI_Comm comm; + + int TWICE = 2; + int mincap = system->mincap; + double safezone = system->safezone; + double saferzone = system->saferzone; + + comm = mpi_data->world; + bond_top = (int*) calloc( system->total_cap, sizeof(int) ); + hb_top = (int*) calloc( system->local_cap, sizeof(int) ); + Estimate_Storages( system, control, lists, + &Htop, hb_top, bond_top, &num_3body, comm ); + + if( control->hbond_cut > 0 ) { + /* init H indexes */ + total_hbonds = 0; + for( i = 0; i < system->n; ++i ) { + system->my_atoms[i].num_hbonds = hb_top[i]; + total_hbonds += hb_top[i]; + } + total_hbonds = (int)(MAX( total_hbonds*saferzone, mincap*MIN_HBONDS )); + + if( !Make_List( system->Hcap, total_hbonds, TYP_HBOND, + *lists+HBONDS, comm ) ) { + fprintf( stderr, "not enough space for hbonds list. terminating!\n" ); + MPI_Abort( comm, INSUFFICIENT_MEMORY ); + } + } + + total_bonds = 0; + for( i = 0; i < system->N; ++i ) { + system->my_atoms[i].num_bonds = bond_top[i]; + total_bonds += bond_top[i]; + } + bond_cap = (int)(MAX( total_bonds*safezone, mincap*MIN_BONDS )); + + if( !Make_List( system->total_cap, bond_cap, TYP_BOND, + *lists+BONDS, comm ) ) { + fprintf( stderr, "not enough space for bonds list. terminating!\n" ); + MPI_Abort( comm, INSUFFICIENT_MEMORY ); + } + + int nthreads = control->nthreads; + reax_list *bonds = (*lists)+BONDS; + + for (i = 0; i < bonds->num_intrs; ++i) + bonds->select.bond_list[i].bo_data.CdboReduction = + (double*) smalloc(sizeof(double)*nthreads, "CdboReduction", comm); + + /* 3bodies list */ + cap_3body = (int)(MAX( num_3body*safezone, MIN_3BODIES )); + if( !Make_List( bond_cap, cap_3body, TYP_THREE_BODY, + *lists+THREE_BODIES, comm ) ){ + + fprintf( stderr, "Problem in initializing angles list. Terminating!\n" ); + MPI_Abort( comm, INSUFFICIENT_MEMORY ); + } + + free( hb_top ); + free( bond_top ); + + return SUCCESS; +} + +/* ---------------------------------------------------------------------- */ + +// The only difference with the MPI-only function is calls to Init_ListsOMP and Init_Force_FunctionsOMP(). +void InitializeOMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control, + mpi_datatypes *mpi_data, MPI_Comm comm ) +{ + char msg[MAX_STR]; + + + if( Init_MPI_Datatypes(system, workspace, mpi_data, comm, msg) == FAILURE ) { + fprintf( stderr, "p%d: init_mpi_datatypes: could not create datatypes\n", + system->my_rank ); + fprintf( stderr, "p%d: mpi_data couldn't be initialized! terminating.\n", + system->my_rank ); + MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + } + + if( Init_System(system, control, msg) == FAILURE ){ + fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); + fprintf( stderr, "p%d: system could not be initialized! terminating.\n", + system->my_rank ); + MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + } + + if( Init_Simulation_Data( system, control, data, msg ) == FAILURE ) { + fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); + fprintf( stderr, "p%d: sim_data couldn't be initialized! terminating.\n", + system->my_rank ); + MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + } + + if( Init_Workspace( system, control, workspace, mpi_data->world, msg ) == + FAILURE ) { + fprintf( stderr, "p%d:init_workspace: not enough memory\n", + system->my_rank ); + fprintf( stderr, "p%d:workspace couldn't be initialized! terminating.\n", + system->my_rank ); + MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + } + + if( Init_ListsOMP( system, control, data, workspace, lists, mpi_data, msg ) == + FAILURE ) { + fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); + fprintf( stderr, "p%d: system could not be initialized! terminating.\n", + system->my_rank ); + MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + } + + if( Init_Output_Files(system,control,out_control,mpi_data,msg)== FAILURE) { + fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); + fprintf( stderr, "p%d: could not open output files! terminating...\n", + system->my_rank ); + MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + } + + if( control->tabulate ) { + if( Init_Lookup_Tables( system, control, workspace, mpi_data, msg ) == FAILURE ) { + fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); + fprintf( stderr, "p%d: couldn't create lookup table! terminating.\n", + system->my_rank ); + MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + } + } + + + Init_Force_FunctionsOMP( control ); +} + diff --git a/src/USER-OMP/reaxc_init_md_omp.h b/src/USER-OMP/reaxc_init_md_omp.h new file mode 100644 index 0000000000..bb4e9c7061 --- /dev/null +++ b/src/USER-OMP/reaxc_init_md_omp.h @@ -0,0 +1,34 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#ifndef __INIT_MD_OMP_H_ +#define __INIT_MD_OMP_H_ + +#include "reaxc_types.h" + +void InitializeOMP( reax_system*, control_params*, simulation_data*, storage*, + reax_list**, output_controls*, mpi_datatypes*, MPI_Comm ); +#endif diff --git a/src/USER-OMP/reaxc_multi_body_omp.cpp b/src/USER-OMP/reaxc_multi_body_omp.cpp new file mode 100644 index 0000000000..a355ce8609 --- /dev/null +++ b/src/USER-OMP/reaxc_multi_body_omp.cpp @@ -0,0 +1,285 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#include "pair_reaxc_omp.h" +#include +#include "thr_data.h" + +#include "reaxc_multi_body_omp.h" +#include "reaxc_bond_orders_omp.h" +#include "reaxc_list.h" +#include "reaxc_vector.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +void Atom_EnergyOMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, reax_list **lists, + output_controls *out_control ) +{ +#ifdef OMP_TIMING + double endTimeBase, startTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + /* Initialize parameters */ + double p_lp1 = system->reax_param.gp.l[15]; + double p_lp3 = system->reax_param.gp.l[5]; + double p_ovun3 = system->reax_param.gp.l[32]; + double p_ovun4 = system->reax_param.gp.l[31]; + double p_ovun6 = system->reax_param.gp.l[6]; + double p_ovun7 = system->reax_param.gp.l[8]; + double p_ovun8 = system->reax_param.gp.l[9]; + + int natoms = system->n; + int nthreads = control->nthreads; + reax_list *bonds = (*lists) + BONDS; + + double total_Elp = 0.0; + double total_Eun = 0.0; + double total_Eov = 0.0; + +#pragma omp parallel default(shared) reduction(+:total_Elp, total_Eun, total_Eov) +{ + int i, j, pj, type_i, type_j; + double Delta_lpcorr, dfvl; + double e_lp, expvd2, inv_expvd2, dElp, CElp, DlpVi; + double e_lph, Di, vov3, deahu2dbo, deahu2dsbo; + double e_ov, CEover1, CEover2, CEover3, CEover4; + double exp_ovun1, exp_ovun2, sum_ovun1, sum_ovun2; + double exp_ovun2n, exp_ovun6, exp_ovun8; + double inv_exp_ovun1, inv_exp_ovun2, inv_exp_ovun2n, inv_exp_ovun8; + double e_un, CEunder1, CEunder2, CEunder3, CEunder4; + double eng_tmp, f_tmp; + double p_lp2, p_ovun2, p_ovun5; + int numbonds; + + single_body_parameters *sbp_i, *sbp_j; + two_body_parameters *twbp; + bond_data *pbond; + bond_order_data *bo_ij; + + int tid = omp_get_thread_num(); + + long reductionOffset = (system->N * tid); + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, natoms, + system->pair_ptr->eatom, system->pair_ptr->vatom, thr); + +#pragma omp for schedule(guided) + for ( i = 0; i < system->n; ++i) { + type_i = system->my_atoms[i].type; + if(type_i < 0) continue; + sbp_i = &(system->reax_param.sbp[ type_i ]); + + /* lone-pair Energy */ + p_lp2 = sbp_i->p_lp2; + expvd2 = exp( -75 * workspace->Delta_lp[i] ); + inv_expvd2 = 1. / (1. + expvd2 ); + + numbonds = 0; + e_lp = 0.0; + for( pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj ) + numbonds ++; + + /* calculate the energy */ + if(numbonds > 0) + total_Elp += e_lp = + p_lp2 * workspace->Delta_lp[i] * inv_expvd2; + + dElp = p_lp2 * inv_expvd2 + + 75 * p_lp2 * workspace->Delta_lp[i] * expvd2 * SQR(inv_expvd2); + CElp = dElp * workspace->dDelta_lp[i]; + + if(numbonds > 0) workspace->CdDelta[i] += CElp; // lp - 1st term + + /* tally into per-atom energy */ + if( system->pair_ptr->evflag) + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, i, system->n, 1, + e_lp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + + /* correction for C2 */ + if( p_lp3 > 0.001 && !strcmp(system->reax_param.sbp[type_i].name, "C") ) + for( pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj ) { + j = bonds->select.bond_list[pj].nbr; + type_j = system->my_atoms[j].type; + if(type_j < 0) continue; + + if( !strcmp( system->reax_param.sbp[type_j].name, "C" ) ) { + twbp = &( system->reax_param.tbp[type_i][type_j]); + bo_ij = &( bonds->select.bond_list[pj].bo_data ); + Di = workspace->Delta[i]; + vov3 = bo_ij->BO - Di - 0.040*pow(Di, 4.); + + if( vov3 > 3. ) { + total_Elp += e_lph = p_lp3 * SQR(vov3-3.0); + + deahu2dbo = 2.*p_lp3*(vov3 - 3.); + deahu2dsbo = 2.*p_lp3*(vov3 - 3.)*(-1. - 0.16*pow(Di, 3.)); + + bo_ij->Cdbo += deahu2dbo; + workspace->CdDelta[i] += deahu2dsbo; + + /* tally into per-atom energy */ + if( system->pair_ptr->evflag) + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, system->n, 1, + e_lph, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + } + } + } + } +#pragma omp barrier + +#pragma omp for schedule(guided) + for (i = 0; i < system->n; ++i) { + type_i = system->my_atoms[i].type; + if(type_i < 0) continue; + sbp_i = &(system->reax_param.sbp[ type_i ]); + + /* over-coordination energy */ + if( sbp_i->mass > 21.0 ) + dfvl = 0.0; + else dfvl = 1.0; // only for 1st-row elements + + p_ovun2 = sbp_i->p_ovun2; + sum_ovun1 = sum_ovun2 = 0; + for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { + j = bonds->select.bond_list[pj].nbr; + type_j = system->my_atoms[j].type; + if(type_j < 0) continue; + bo_ij = &(bonds->select.bond_list[pj].bo_data); + twbp = &(system->reax_param.tbp[ type_i ][ type_j ]); + + sum_ovun1 += twbp->p_ovun1 * twbp->De_s * bo_ij->BO; + sum_ovun2 += (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j])* + ( bo_ij->BO_pi + bo_ij->BO_pi2 ); + } + + exp_ovun1 = p_ovun3 * exp( p_ovun4 * sum_ovun2 ); + inv_exp_ovun1 = 1.0 / (1 + exp_ovun1); + Delta_lpcorr = workspace->Delta[i] - + (dfvl * workspace->Delta_lp_temp[i]) * inv_exp_ovun1; + + exp_ovun2 = exp( p_ovun2 * Delta_lpcorr ); + inv_exp_ovun2 = 1.0 / (1.0 + exp_ovun2); + + DlpVi = 1.0 / (Delta_lpcorr + sbp_i->valency + 1e-8); + CEover1 = Delta_lpcorr * DlpVi * inv_exp_ovun2; + + total_Eov += e_ov = sum_ovun1 * CEover1; + + CEover2 = sum_ovun1 * DlpVi * inv_exp_ovun2 * + (1.0 - Delta_lpcorr * ( DlpVi + p_ovun2 * exp_ovun2 * inv_exp_ovun2 )); + + CEover3 = CEover2 * (1.0 - dfvl * workspace->dDelta_lp[i] * inv_exp_ovun1 ); + + CEover4 = CEover2 * (dfvl * workspace->Delta_lp_temp[i]) * + p_ovun4 * exp_ovun1 * SQR(inv_exp_ovun1); + + + /* under-coordination potential */ + p_ovun2 = sbp_i->p_ovun2; + p_ovun5 = sbp_i->p_ovun5; + + exp_ovun2n = 1.0 / exp_ovun2; + exp_ovun6 = exp( p_ovun6 * Delta_lpcorr ); + exp_ovun8 = p_ovun7 * exp(p_ovun8 * sum_ovun2); + inv_exp_ovun2n = 1.0 / (1.0 + exp_ovun2n); + inv_exp_ovun8 = 1.0 / (1.0 + exp_ovun8); + + numbonds = 0; + e_un = 0.0; + for( pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj ) + numbonds ++; + + if(numbonds > 0) total_Eun += e_un = + -p_ovun5 * (1.0 - exp_ovun6) * inv_exp_ovun2n * inv_exp_ovun8; + + CEunder1 = inv_exp_ovun2n * + ( p_ovun5 * p_ovun6 * exp_ovun6 * inv_exp_ovun8 + + p_ovun2 * e_un * exp_ovun2n ); + CEunder2 = -e_un * p_ovun8 * exp_ovun8 * inv_exp_ovun8; + CEunder3 = CEunder1 * (1.0 - dfvl*workspace->dDelta_lp[i]*inv_exp_ovun1); + CEunder4 = CEunder1 * (dfvl*workspace->Delta_lp_temp[i]) * + p_ovun4 * exp_ovun1 * SQR(inv_exp_ovun1) + CEunder2; + + /* tally into per-atom energy */ + if (system->pair_ptr->evflag) { + eng_tmp = e_ov; + if(numbonds > 0) eng_tmp+= e_un; + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, i, system->n, 1, + eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + } + + /* forces */ + workspace->CdDelta[i] += CEover3; // OvCoor - 2nd term + if(numbonds > 0) workspace->CdDelta[i] += CEunder3; // UnCoor - 1st term + + for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { + pbond = &(bonds->select.bond_list[pj]); + j = pbond->nbr; + bo_ij = &(pbond->bo_data); + twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] + [system->my_atoms[pbond->nbr].type]); + + bo_ij->Cdbo += CEover1 * twbp->p_ovun1 * twbp->De_s; // OvCoor-1st + workspace->CdDeltaReduction[reductionOffset+j] += + CEover4 * (1.0 - dfvl*workspace->dDelta_lp[j]) * (bo_ij->BO_pi + bo_ij->BO_pi2); // OvCoor-3a + + bo_ij->Cdbopi += CEover4 * + (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // OvCoor-3b + bo_ij->Cdbopi2 += CEover4 * + (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // OvCoor-3b + + workspace->CdDeltaReduction[reductionOffset+j] += + CEunder4 * (1.0 - dfvl*workspace->dDelta_lp[j]) * (bo_ij->BO_pi + bo_ij->BO_pi2); // UnCoor - 2a + + bo_ij->Cdbopi += CEunder4 * + (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // UnCoor-2b + bo_ij->Cdbopi2 += CEunder4 * + (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // UnCoor-2b + } + } + + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, thr); + + } + + data->my_en.e_lp += total_Elp; + data->my_en.e_ov += total_Eov; + data->my_en.e_un += total_Eun; + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTEATOMENERGYINDEX] += (endTimeBase-startTimeBase); +#endif +} diff --git a/src/USER-OMP/reaxc_multi_body_omp.h b/src/USER-OMP/reaxc_multi_body_omp.h new file mode 100644 index 0000000000..b0746569ca --- /dev/null +++ b/src/USER-OMP/reaxc_multi_body_omp.h @@ -0,0 +1,35 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#ifndef __MULTI_BODY_OMP_H_ +#define __MULTI_BODY_OMP_H_ + +#include "reaxc_types.h" + +void Atom_EnergyOMP( reax_system*, control_params*, simulation_data*, + storage*, reax_list**, output_controls* ); + +#endif diff --git a/src/USER-OMP/reaxc_nonbonded_omp.cpp b/src/USER-OMP/reaxc_nonbonded_omp.cpp new file mode 100644 index 0000000000..73dbc1dda4 --- /dev/null +++ b/src/USER-OMP/reaxc_nonbonded_omp.cpp @@ -0,0 +1,383 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#include "pair_reaxc_omp.h" +#include +#include "thr_data.h" + +#include "reaxc_types.h" + +#include "reaxc_nonbonded.h" +#include "reaxc_nonbonded_omp.h" +#include "reaxc_bond_orders_omp.h" +#include "reaxc_list.h" +#include "reaxc_vector.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control ) { + + int natoms = system->n; + int nthreads = control->nthreads; + long totalReductionSize = system->N * nthreads; + reax_list *far_nbrs = (*lists) + FAR_NBRS; + double p_vdW1 = system->reax_param.gp.l[28]; + double p_vdW1i = 1.0 / p_vdW1; + double total_EvdW = 0.; + double total_Eele = 0.; + +#pragma omp parallel default(shared) reduction(+: total_EvdW, total_Eele) //default(none) + { + int tid = omp_get_thread_num(); + int i, j, pj; + int start_i, end_i, orig_i, orig_j, flag; + double powr_vdW1, powgi_vdW1; + double tmp, r_ij, fn13, exp1, exp2; + double Tap, dTap, dfn13, CEvd, CEclmb, de_core; + double dr3gamij_1, dr3gamij_3; + double e_ele, e_ele_thr, e_vdW, e_vdW_thr, e_core, SMALL = 0.0001; + double e_lg, de_lg, r_ij5, r_ij6, re6; + rvec temp, ext_press; + two_body_parameters *twbp; + far_neighbor_data *nbr_pj; + + // Tallying variables: + double pe_vdw, f_tmp, delij[3]; + + long reductionOffset = (system->N * tid); + + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, + natoms, system->pair_ptr->eatom, + system->pair_ptr->vatom, thr); + e_core = 0; + e_vdW = 0; + e_vdW_thr = 0; + e_lg = 0; + de_lg = 0.0; + +//#pragma omp for schedule(dynamic,50) +#pragma omp for schedule(guided) + for( i = 0; i < natoms; ++i ) { + if(system->my_atoms[i].type < 0) continue; + start_i = Start_Index(i, far_nbrs); + end_i = End_Index(i, far_nbrs); + orig_i = system->my_atoms[i].orig_id; + + for( pj = start_i; pj < end_i; ++pj ) { + nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); + j = nbr_pj->nbr; + orig_j = system->my_atoms[j].orig_id; + + flag = 0; + if(nbr_pj->d <= control->nonb_cut) { + if(j < natoms) flag = 1; + else if (orig_i < orig_j) flag = 1; + else if (orig_i == orig_j) { + if (nbr_pj->dvec[2] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[2]) < SMALL) { + if (nbr_pj->dvec[1] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[1]) < SMALL && nbr_pj->dvec[0] > SMALL) + flag = 1; + } + } + } + + if (flag) { + + r_ij = nbr_pj->d; + twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] + [ system->my_atoms[j].type ]); + + /* Calculate Taper and its derivative */ + // Tap = nbr_pj->Tap; -- precomputed during compte_H + Tap = workspace->Tap[7] * r_ij + workspace->Tap[6]; + Tap = Tap * r_ij + workspace->Tap[5]; + Tap = Tap * r_ij + workspace->Tap[4]; + Tap = Tap * r_ij + workspace->Tap[3]; + Tap = Tap * r_ij + workspace->Tap[2]; + Tap = Tap * r_ij + workspace->Tap[1]; + Tap = Tap * r_ij + workspace->Tap[0]; + + dTap = 7*workspace->Tap[7] * r_ij + 6*workspace->Tap[6]; + dTap = dTap * r_ij + 5*workspace->Tap[5]; + dTap = dTap * r_ij + 4*workspace->Tap[4]; + dTap = dTap * r_ij + 3*workspace->Tap[3]; + dTap = dTap * r_ij + 2*workspace->Tap[2]; + dTap += workspace->Tap[1]/r_ij; + + /*vdWaals Calculations*/ + if(system->reax_param.gp.vdw_type==1 || system->reax_param.gp.vdw_type==3) + { // shielding + powr_vdW1 = pow(r_ij, p_vdW1); + powgi_vdW1 = pow( 1.0 / twbp->gamma_w, p_vdW1); + + fn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i ); + exp1 = exp( twbp->alpha * (1.0 - fn13 / twbp->r_vdW) ); + exp2 = exp( 0.5 * twbp->alpha * (1.0 - fn13 / twbp->r_vdW) ); + + e_vdW = twbp->D * (exp1 - 2.0 * exp2); + total_EvdW += Tap * e_vdW; + + dfn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i - 1.0) * + pow(r_ij, p_vdW1 - 2.0); + + CEvd = dTap * e_vdW - + Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) * dfn13; + } + else{ // no shielding + exp1 = exp( twbp->alpha * (1.0 - r_ij / twbp->r_vdW) ); + exp2 = exp( 0.5 * twbp->alpha * (1.0 - r_ij / twbp->r_vdW) ); + + e_vdW = twbp->D * (exp1 - 2.0 * exp2); + total_EvdW += Tap * e_vdW; + + CEvd = dTap * e_vdW - + Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) / r_ij; + } + + if(system->reax_param.gp.vdw_type==2 || system->reax_param.gp.vdw_type==3) + { // innner wall + e_core = twbp->ecore * exp(twbp->acore * (1.0-(r_ij/twbp->rcore))); + total_EvdW += Tap * e_core; + + de_core = -(twbp->acore/twbp->rcore) * e_core; + CEvd += dTap * e_core + Tap * de_core / r_ij; + + // lg correction, only if lgvdw is yes + if (control->lgflag) { + r_ij5 = pow( r_ij, 5.0 ); + r_ij6 = pow( r_ij, 6.0 ); + re6 = pow( twbp->lgre, 6.0 ); + + e_lg = -(twbp->lgcij/( r_ij6 + re6 )); + total_EvdW += Tap * e_lg; + + de_lg = -6.0 * e_lg * r_ij5 / ( r_ij6 + re6 ) ; + CEvd += dTap * e_lg + Tap * de_lg / r_ij; + } + + } + + /*Coulomb Calculations*/ + dr3gamij_1 = ( r_ij * r_ij * r_ij + twbp->gamma ); + dr3gamij_3 = pow( dr3gamij_1 , 0.33333333333333 ); + + tmp = Tap / dr3gamij_3; + total_Eele += e_ele = + C_ele * system->my_atoms[i].q * system->my_atoms[j].q * tmp; + + CEclmb = C_ele * system->my_atoms[i].q * system->my_atoms[j].q * + ( dTap - Tap * r_ij / dr3gamij_1 ) / dr3gamij_3; + + /* tally into per-atom energy */ + if( system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { + pe_vdw = Tap * (e_vdW + e_core + e_lg); + rvec_ScaledSum( delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x ); + f_tmp = -(CEvd + CEclmb); + pair_reax_ptr->ev_tally_thr_proxy( system->pair_ptr, i, j, natoms, + 1, pe_vdw, e_ele, f_tmp, + delij[0], delij[1], delij[2], thr); + } + + if( control->virial == 0 ) { + rvec_ScaledAdd( workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec ); + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+j], + +(CEvd + CEclmb), nbr_pj->dvec ); + } + else { /* NPT, iNPT or sNPT */ + /* for pressure coupling, terms not related to bond order + derivatives are added directly into pressure vector/tensor */ + + rvec_Scale( temp, CEvd + CEclmb, nbr_pj->dvec ); + rvec_ScaledAdd( workspace->f[reductionOffset+i], -1., temp ); + rvec_Add( workspace->forceReduction[reductionOffset+j], temp); + + rvec_iMultiply( ext_press, nbr_pj->rel_box, temp ); + + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + } + } + } + } + + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, thr); + } // parallel region + + data->my_en.e_vdW = total_EvdW; + data->my_en.e_ele = total_Eele; + + Compute_Polarization_Energy( system, data ); +} + +/* ---------------------------------------------------------------------- */ + +void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, + output_controls *out_control ) { + + double SMALL = 0.0001; + int natoms = system->n; + reax_list *far_nbrs = (*lists) + FAR_NBRS; + int nthreads = control->nthreads; + long totalReductionSize = system->N * nthreads; + double total_EvdW = 0.; + double total_Eele = 0.; + +#pragma omp parallel default(shared) reduction(+:total_EvdW, total_Eele) + { + int i, j, pj, r; + int type_i, type_j, tmin, tmax; + int start_i, end_i, orig_i, orig_j, flag; + double r_ij, base, dif; + double e_vdW, e_ele; + double CEvd, CEclmb; + double f_tmp, delij[3]; + rvec temp, ext_press; + far_neighbor_data *nbr_pj; + LR_lookup_table *t; + int tid = omp_get_thread_num(); + long froffset = (system->N * tid); + + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, + natoms, system->pair_ptr->eatom, + system->pair_ptr->vatom, thr); + +//#pragma omp for schedule(dynamic,50) +#pragma omp for schedule(guided) + for (i = 0; i < natoms; ++i) { + type_i = system->my_atoms[i].type; + if(type_i < 0) continue; + start_i = Start_Index(i,far_nbrs); + end_i = End_Index(i,far_nbrs); + orig_i = system->my_atoms[i].orig_id; + + for (pj = start_i; pj < end_i; ++pj) { + nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); + j = nbr_pj->nbr; + type_j = system->my_atoms[j].type; + if(type_j < 0) continue; + orig_j = system->my_atoms[j].orig_id; + + flag = 0; + if(nbr_pj->d <= control->nonb_cut) { + if(j < natoms) flag = 1; + else if (orig_i < orig_j) flag = 1; + else if (orig_i == orig_j) { + if (nbr_pj->dvec[2] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[2]) < SMALL) { + if (nbr_pj->dvec[1] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[1]) < SMALL && nbr_pj->dvec[0] > SMALL) + flag = 1; + } + } + + } + + if (flag) { + + r_ij = nbr_pj->d; + tmin = MIN( type_i, type_j ); + tmax = MAX( type_i, type_j ); + t = &( LR[tmin][tmax] ); + + /* Cubic Spline Interpolation */ + r = (int)(r_ij * t->inv_dx); + if( r == 0 ) ++r; + base = (double)(r+1) * t->dx; + dif = r_ij - base; + + e_vdW = ((t->vdW[r].d*dif + t->vdW[r].c)*dif + t->vdW[r].b)*dif + + t->vdW[r].a; + + e_ele = ((t->ele[r].d*dif + t->ele[r].c)*dif + t->ele[r].b)*dif + + t->ele[r].a; + e_ele *= system->my_atoms[i].q * system->my_atoms[j].q; + + total_EvdW += e_vdW; + total_Eele += e_ele; + + CEvd = ((t->CEvd[r].d*dif + t->CEvd[r].c)*dif + t->CEvd[r].b)*dif + + t->CEvd[r].a; + + CEclmb = ((t->CEclmb[r].d*dif+t->CEclmb[r].c)*dif+t->CEclmb[r].b)*dif + + t->CEclmb[r].a; + CEclmb *= system->my_atoms[i].q * system->my_atoms[j].q; + + /* tally into per-atom energy */ + if( system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { + rvec_ScaledSum( delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x ); + f_tmp = -(CEvd + CEclmb); + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, e_vdW, e_ele, + f_tmp, delij[0], delij[1], delij[2], thr); + } + + if( control->virial == 0 ) { + rvec_ScaledAdd( workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec ); + rvec_ScaledAdd( workspace->forceReduction[froffset+j], + +(CEvd + CEclmb), nbr_pj->dvec ); + } + else { // NPT, iNPT or sNPT + /* for pressure coupling, terms not related to bond order derivatives + are added directly into pressure vector/tensor */ + rvec_Scale( temp, CEvd + CEclmb, nbr_pj->dvec ); + + rvec_ScaledAdd( workspace->f[i], -1., temp ); + rvec_Add( workspace->forceReduction[froffset+j], temp ); + + rvec_iMultiply( ext_press, nbr_pj->rel_box, temp ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + } + } + } + } + + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, thr); + } // end omp parallel + + data->my_en.e_vdW = total_EvdW; + data->my_en.e_ele = total_Eele; + + Compute_Polarization_Energy( system, data ); +} diff --git a/src/USER-OMP/reaxc_nonbonded_omp.h b/src/USER-OMP/reaxc_nonbonded_omp.h new file mode 100644 index 0000000000..1ea51257cf --- /dev/null +++ b/src/USER-OMP/reaxc_nonbonded_omp.h @@ -0,0 +1,38 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#ifndef __NONBONDED_OMP_H_ +#define __NONBONDED_OMP_H_ + +#include "reaxc_types.h" + +void vdW_Coulomb_Energy_OMP( reax_system*, control_params*, simulation_data*, + storage*, reax_list**, output_controls* ); + +void Tabulated_vdW_Coulomb_Energy_OMP( reax_system*, control_params*, + simulation_data*, storage*, + reax_list**, output_controls* ); +#endif diff --git a/src/USER-OMP/reaxc_torsion_angles_omp.cpp b/src/USER-OMP/reaxc_torsion_angles_omp.cpp new file mode 100644 index 0000000000..294eeb9544 --- /dev/null +++ b/src/USER-OMP/reaxc_torsion_angles_omp.cpp @@ -0,0 +1,467 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#include "pair_reaxc_omp.h" +#include +#include "thr_data.h" + +#include "reaxc_types.h" +#include "reaxc_torsion_angles_omp.h" +#include "reaxc_bond_orders_omp.h" +#include "reaxc_list.h" +#include "reaxc_tool_box.h" +#include "reaxc_vector.h" + +#define MIN_SINE 1e-10 + +using namespace LAMMPS_NS; + +// Functions defined in reaxc_torsion_angles.cpp +extern double Calculate_Omega(rvec, double, rvec, double, rvec, double, rvec, double, + three_body_interaction_data*, three_body_interaction_data*, + rvec, rvec, rvec, rvec, output_controls*); + +/* ---------------------------------------------------------------------- */ + +void Torsion_AnglesOMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control ) +{ +#ifdef OMP_TIMING + double endTimeBase, startTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + int natoms = system->n; + reax_list *bonds = (*lists) + BONDS; + reax_list *thb_intrs = (*lists) + THREE_BODIES; + double p_tor2 = system->reax_param.gp.l[23]; + double p_tor3 = system->reax_param.gp.l[24]; + double p_tor4 = system->reax_param.gp.l[25]; + double p_cot2 = system->reax_param.gp.l[27]; + double total_Etor = 0; + double total_Econ = 0; + int nthreads = control->nthreads; + +#pragma omp parallel default(shared) reduction(+: total_Etor, total_Econ) + { + int i, j, k, l, pi, pj, pk, pl, pij, plk; + int type_i, type_j, type_k, type_l; + int start_j, end_j, start_k, end_k; + int start_pj, end_pj, start_pk, end_pk; + int num_frb_intrs = 0; + + double Delta_j, Delta_k; + double r_ij, r_jk, r_kl, r_li; + double BOA_ij, BOA_jk, BOA_kl; + + double exp_tor2_ij, exp_tor2_jk, exp_tor2_kl; + double exp_tor1, exp_tor3_DjDk, exp_tor4_DjDk, exp_tor34_inv; + double exp_cot2_jk, exp_cot2_ij, exp_cot2_kl; + double fn10, f11_DjDk, dfn11, fn12; + double theta_ijk, theta_jkl; + double sin_ijk, sin_jkl; + double cos_ijk, cos_jkl; + double tan_ijk_i, tan_jkl_i; + double omega, cos_omega, cos2omega, cos3omega; + rvec dcos_omega_di, dcos_omega_dj, dcos_omega_dk, dcos_omega_dl; + double CV, cmn, CEtors1, CEtors2, CEtors3, CEtors4; + double CEtors5, CEtors6, CEtors7, CEtors8, CEtors9; + double Cconj, CEconj1, CEconj2, CEconj3; + double CEconj4, CEconj5, CEconj6; + double e_tor, e_con; + rvec dvec_li; + rvec force, ext_press; + ivec rel_box_jl; + // rtensor total_rtensor, temp_rtensor; + four_body_header *fbh; + four_body_parameters *fbp; + bond_data *pbond_ij, *pbond_jk, *pbond_kl; + bond_order_data *bo_ij, *bo_jk, *bo_kl; + three_body_interaction_data *p_ijk, *p_jkl; + + // Virial tallying variables + double delil[3], deljl[3], delkl[3]; + double eng_tmp, f_scaler, fi_tmp[3], fj_tmp[3], fk_tmp[3]; + + int tid = omp_get_thread_num(); + long reductionOffset = (system->N * tid); + int num_thb_intrs = 0; + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, + system->N, system->pair_ptr->eatom, + system->pair_ptr->vatom, thr); + +#pragma omp for schedule(static) + for (j = 0; j < system->N; ++j) { + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); + + for (pk = start_j; pk < end_j; ++pk) { + bo_jk = &( bonds->select.bond_list[pk].bo_data ); + for (k = 0; k < nthreads; ++k) + bo_jk->CdboReduction[k] = 0.; + } + } + +#pragma omp for schedule(dynamic,50) + for (j = 0; j < natoms; ++j) { + type_j = system->my_atoms[j].type; + Delta_j = workspace->Delta_boc[j]; + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); + + for (pk = start_j; pk < end_j; ++pk) { + pbond_jk = &( bonds->select.bond_list[pk] ); + k = pbond_jk->nbr; + bo_jk = &( pbond_jk->bo_data ); + BOA_jk = bo_jk->BO - control->thb_cut; + + /* see if there are any 3-body interactions involving j&k + where j is the central atom. Otherwise there is no point in + trying to form a 4-body interaction out of this neighborhood */ + if (system->my_atoms[j].orig_id < system->my_atoms[k].orig_id && + bo_jk->BO > control->thb_cut/*0*/ && Num_Entries(pk, thb_intrs)) { + start_k = Start_Index(k, bonds); + end_k = End_Index(k, bonds); + pj = pbond_jk->sym_index; // pj points to j on k's list + + /* do the same check as above: + are there any 3-body interactions involving k&j + where k is the central atom */ + if (Num_Entries(pj, thb_intrs)) { + type_k = system->my_atoms[k].type; + Delta_k = workspace->Delta_boc[k]; + r_jk = pbond_jk->d; + + start_pk = Start_Index(pk, thb_intrs ); + end_pk = End_Index(pk, thb_intrs ); + start_pj = Start_Index(pj, thb_intrs ); + end_pj = End_Index(pj, thb_intrs ); + + exp_tor2_jk = exp( -p_tor2 * BOA_jk ); + exp_cot2_jk = exp( -p_cot2 * SQR(BOA_jk - 1.5) ); + exp_tor3_DjDk = exp( -p_tor3 * (Delta_j + Delta_k) ); + exp_tor4_DjDk = exp( p_tor4 * (Delta_j + Delta_k) ); + exp_tor34_inv = 1.0 / (1.0 + exp_tor3_DjDk + exp_tor4_DjDk); + f11_DjDk = (2.0 + exp_tor3_DjDk) * exp_tor34_inv; + + + /* pick i up from j-k interaction where j is the central atom */ + for (pi = start_pk; pi < end_pk; ++pi) { + p_ijk = &( thb_intrs->select.three_body_list[pi] ); + pij = p_ijk->pthb; // pij is pointer to i on j's bond_list + pbond_ij = &( bonds->select.bond_list[pij] ); + bo_ij = &( pbond_ij->bo_data ); + + if (bo_ij->BO > control->thb_cut/*0*/) { + i = p_ijk->thb; + type_i = system->my_atoms[i].type; + r_ij = pbond_ij->d; + BOA_ij = bo_ij->BO - control->thb_cut; + + theta_ijk = p_ijk->theta; + sin_ijk = sin( theta_ijk ); + cos_ijk = cos( theta_ijk ); + //tan_ijk_i = 1. / tan( theta_ijk ); + if( sin_ijk >= 0 && sin_ijk <= MIN_SINE ) + tan_ijk_i = cos_ijk / MIN_SINE; + else if( sin_ijk <= 0 && sin_ijk >= -MIN_SINE ) + tan_ijk_i = cos_ijk / -MIN_SINE; + else tan_ijk_i = cos_ijk / sin_ijk; + + exp_tor2_ij = exp( -p_tor2 * BOA_ij ); + exp_cot2_ij = exp( -p_cot2 * SQR(BOA_ij -1.5) ); + + + /* pick l up from j-k interaction where k is the central atom */ + for (pl = start_pj; pl < end_pj; ++pl) { + p_jkl = &( thb_intrs->select.three_body_list[pl] ); + l = p_jkl->thb; + plk = p_jkl->pthb; //pointer to l on k's bond_list! + pbond_kl = &( bonds->select.bond_list[plk] ); + bo_kl = &( pbond_kl->bo_data ); + type_l = system->my_atoms[l].type; + fbh = &(system->reax_param.fbp[type_i][type_j] + [type_k][type_l]); + fbp = &(system->reax_param.fbp[type_i][type_j] + [type_k][type_l].prm[0]); + + if (i != l && fbh->cnt && + bo_kl->BO > control->thb_cut/*0*/ && + bo_ij->BO * bo_jk->BO * bo_kl->BO > control->thb_cut/*0*/) { + ++num_frb_intrs; + //fprintf(stderr, + // "%5d: %6d %6d %6d %6d\n", num_frb_intrs, + // system->my_atoms[i].orig_id,system->my_atoms[j].orig_id, + // system->my_atoms[k].orig_id,system->my_atoms[l].orig_id); + + r_kl = pbond_kl->d; + BOA_kl = bo_kl->BO - control->thb_cut; + + theta_jkl = p_jkl->theta; + sin_jkl = sin( theta_jkl ); + cos_jkl = cos( theta_jkl ); + //tan_jkl_i = 1. / tan( theta_jkl ); + if( sin_jkl >= 0 && sin_jkl <= MIN_SINE ) + tan_jkl_i = cos_jkl / MIN_SINE; + else if( sin_jkl <= 0 && sin_jkl >= -MIN_SINE ) + tan_jkl_i = cos_jkl / -MIN_SINE; + else tan_jkl_i = cos_jkl /sin_jkl; + + rvec_ScaledSum( dvec_li, 1., system->my_atoms[i].x, + -1., system->my_atoms[l].x ); + r_li = rvec_Norm( dvec_li ); + + + /* omega and its derivative */ + omega = Calculate_Omega( pbond_ij->dvec, r_ij, + pbond_jk->dvec, r_jk, + pbond_kl->dvec, r_kl, + dvec_li, r_li, + p_ijk, p_jkl, + dcos_omega_di, dcos_omega_dj, + dcos_omega_dk, dcos_omega_dl, + out_control ); + + cos_omega = cos( omega ); + cos2omega = cos( 2. * omega ); + cos3omega = cos( 3. * omega ); + /* end omega calculations */ + + /* torsion energy */ + exp_tor1 = exp( fbp->p_tor1 * + SQR(2.0 - bo_jk->BO_pi - f11_DjDk) ); + exp_tor2_kl = exp( -p_tor2 * BOA_kl ); + exp_cot2_kl = exp( -p_cot2 * SQR(BOA_kl - 1.5) ); + fn10 = (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jk) * + (1.0 - exp_tor2_kl); + + CV = 0.5 * ( fbp->V1 * (1.0 + cos_omega) + + fbp->V2 * exp_tor1 * (1.0 - cos2omega) + + fbp->V3 * (1.0 + cos3omega) ); + + total_Etor += e_tor = fn10 * sin_ijk * sin_jkl * CV; + + dfn11 = (-p_tor3 * exp_tor3_DjDk + + (p_tor3 * exp_tor3_DjDk - p_tor4 * exp_tor4_DjDk) * + (2.0 + exp_tor3_DjDk) * exp_tor34_inv) * + exp_tor34_inv; + + CEtors1 = sin_ijk * sin_jkl * CV; + + CEtors2 = -fn10 * 2.0 * fbp->p_tor1 * fbp->V2 * exp_tor1 * + (2.0 - bo_jk->BO_pi - f11_DjDk) * (1.0 - SQR(cos_omega)) * + sin_ijk * sin_jkl; + CEtors3 = CEtors2 * dfn11; + + CEtors4 = CEtors1 * p_tor2 * exp_tor2_ij * + (1.0 - exp_tor2_jk) * (1.0 - exp_tor2_kl); + CEtors5 = CEtors1 * p_tor2 * + (1.0 - exp_tor2_ij) * exp_tor2_jk * (1.0 - exp_tor2_kl); + CEtors6 = CEtors1 * p_tor2 * + (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jk) * exp_tor2_kl; + + cmn = -fn10 * CV; + CEtors7 = cmn * sin_jkl * tan_ijk_i; + CEtors8 = cmn * sin_ijk * tan_jkl_i; + + CEtors9 = fn10 * sin_ijk * sin_jkl * + (0.5 * fbp->V1 - 2.0 * fbp->V2 * exp_tor1 * cos_omega + + 1.5 * fbp->V3 * (cos2omega + 2.0 * SQR(cos_omega))); + /* end of torsion energy */ + + + /* 4-body conjugation energy */ + fn12 = exp_cot2_ij * exp_cot2_jk * exp_cot2_kl; + //data->my_en.e_con += e_con = + total_Econ += e_con = + fbp->p_cot1 * fn12 * + (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jkl); + + Cconj = -2.0 * fn12 * fbp->p_cot1 * p_cot2 * + (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jkl); + + CEconj1 = Cconj * (BOA_ij - 1.5e0); + CEconj2 = Cconj * (BOA_jk - 1.5e0); + CEconj3 = Cconj * (BOA_kl - 1.5e0); + + CEconj4 = -fbp->p_cot1 * fn12 * + (SQR(cos_omega) - 1.0) * sin_jkl * tan_ijk_i; + CEconj5 = -fbp->p_cot1 * fn12 * + (SQR(cos_omega) - 1.0) * sin_ijk * tan_jkl_i; + CEconj6 = 2.0 * fbp->p_cot1 * fn12 * + cos_omega * sin_ijk * sin_jkl; + /* end 4-body conjugation energy */ + + /* FORCES */ + bo_jk->Cdbopi += CEtors2; + workspace->CdDelta[j] += CEtors3; + //workspace->CdDelta[k] += CEtors3; + workspace->CdDeltaReduction[reductionOffset+k] += CEtors3; + bo_ij->Cdbo += (CEtors4 + CEconj1); + bo_jk->Cdbo += (CEtors5 + CEconj2); + //bo_kl->Cdbo += (CEtors6 + CEconj3); + bo_kl->CdboReduction[tid] += (CEtors6 + CEconj3); + + if( control->virial == 0 ) { + /* dcos_theta_ijk */ + rvec_ScaledAdd( workspace->f[j], + CEtors7 + CEconj4, p_ijk->dcos_dj ); + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+i], + CEtors7 + CEconj4, p_ijk->dcos_dk ); + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+k], + CEtors7 + CEconj4, p_ijk->dcos_di ); + + /* dcos_theta_jkl */ + rvec_ScaledAdd( workspace->f[j], + CEtors8 + CEconj5, p_jkl->dcos_di ); + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+k], + CEtors8 + CEconj5, p_jkl->dcos_dj ); + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+l], + CEtors8 + CEconj5, p_jkl->dcos_dk ); + + /* dcos_omega */ + rvec_ScaledAdd( workspace->f[j], + CEtors9 + CEconj6, dcos_omega_dj ); + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+i], + CEtors9 + CEconj6, dcos_omega_di ); + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+k], + CEtors9 + CEconj6, dcos_omega_dk ); + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+l], + CEtors9 + CEconj6, dcos_omega_dl ); + } + else { + ivec_Sum(rel_box_jl, pbond_jk->rel_box, pbond_kl->rel_box); + + /* dcos_theta_ijk */ + rvec_Scale( force, CEtors7 + CEconj4, p_ijk->dcos_dk ); + rvec_Add( workspace->forceReduction[reductionOffset+i], force ); + rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + + rvec_ScaledAdd( workspace->f[j], + CEtors7 + CEconj4, p_ijk->dcos_dj ); + + rvec_Scale( force, CEtors7 + CEconj4, p_ijk->dcos_di ); + rvec_Add( workspace->forceReduction[reductionOffset+k], force ); + rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + + /* dcos_theta_jkl */ + rvec_ScaledAdd( workspace->f[j], + CEtors8 + CEconj5, p_jkl->dcos_di ); + + rvec_Scale( force, CEtors8 + CEconj5, p_jkl->dcos_dj ); + rvec_Add( workspace->forceReduction[reductionOffset+k], force ); + rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + + rvec_Scale( force, CEtors8 + CEconj5, p_jkl->dcos_dk ); + rvec_Add( workspace->forceReduction[reductionOffset+l], force ); + rvec_iMultiply( ext_press, rel_box_jl, force ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + + /* dcos_omega */ + rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_di ); + rvec_Add( workspace->forceReduction[reductionOffset+i], force ); + rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + + rvec_ScaledAdd( workspace->f[j], + CEtors9 + CEconj6, dcos_omega_dj ); + + rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_dk ); + rvec_Add( workspace->forceReduction[reductionOffset+k], force ); + rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + + rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_dl ); + rvec_Add( workspace->forceReduction[reductionOffset+i], force ); + rvec_iMultiply( ext_press, rel_box_jl, force ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + } + + /* tally into per-atom virials */ + if( system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + + // acquire vectors + rvec_ScaledSum( delil, 1., system->my_atoms[l].x, + -1., system->my_atoms[i].x ); + rvec_ScaledSum( deljl, 1., system->my_atoms[l].x, + -1., system->my_atoms[j].x ); + rvec_ScaledSum( delkl, 1., system->my_atoms[l].x, + -1., system->my_atoms[k].x ); + // dcos_theta_ijk + rvec_Scale( fi_tmp, CEtors7 + CEconj4, p_ijk->dcos_dk ); + rvec_Scale( fj_tmp, CEtors7 + CEconj4, p_ijk->dcos_dj ); + rvec_Scale( fk_tmp, CEtors7 + CEconj4, p_ijk->dcos_di ); + + // dcos_theta_jkl + rvec_ScaledAdd( fj_tmp, CEtors8 + CEconj5, p_jkl->dcos_di ); + rvec_ScaledAdd( fk_tmp, CEtors8 + CEconj5, p_jkl->dcos_dj ); + + // dcos_omega + rvec_ScaledAdd( fi_tmp, CEtors9 + CEconj6, dcos_omega_di ); + rvec_ScaledAdd( fj_tmp, CEtors9 + CEconj6, dcos_omega_dj ); + rvec_ScaledAdd( fk_tmp, CEtors9 + CEconj6, dcos_omega_dk ); + + // tally + eng_tmp = e_tor + e_con; + + if (system->pair_ptr->evflag) + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, k, system->n, 1, + eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + + // NEED TO MAKE AN OMP VERSION OF THIS CALL! + if (system->pair_ptr->vflag_atom) + system->pair_ptr->v_tally4(i, j, k, l, fi_tmp, fj_tmp, fk_tmp, + delil, deljl, delkl ); + } + + } // pl check ends + } // pl loop ends + } // pi check ends + } // pi loop ends + } // k-j neighbor check ends + } // jmy_en.e_tor = total_Etor; + data->my_en.e_con = total_Econ; + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTETORSIONANGLESBOINDEX] += (endTimeBase-startTimeBase); +#endif +} diff --git a/src/USER-OMP/reaxc_torsion_angles_omp.h b/src/USER-OMP/reaxc_torsion_angles_omp.h new file mode 100644 index 0000000000..51b05f7ae1 --- /dev/null +++ b/src/USER-OMP/reaxc_torsion_angles_omp.h @@ -0,0 +1,36 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#ifndef __TORSION_ANGLES_OMP_H_ +#define __TORSION_ANGLES_OMP_H_ + +#include "reaxc_types.h" +#include "reaxc_torsion_angles.h" + +void Torsion_AnglesOMP( reax_system*, control_params*, simulation_data*, + storage*, reax_list**, output_controls* ); + +#endif diff --git a/src/USER-OMP/reaxc_valence_angles_omp.cpp b/src/USER-OMP/reaxc_valence_angles_omp.cpp new file mode 100644 index 0000000000..7c45db1493 --- /dev/null +++ b/src/USER-OMP/reaxc_valence_angles_omp.cpp @@ -0,0 +1,613 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#include "pair_reaxc_omp.h" +#include +#include "thr_data.h" + +#include "reaxc_types.h" +#include "reaxc_valence_angles.h" +#include "reaxc_valence_angles_omp.h" +#include "reaxc_bond_orders_omp.h" +#include "reaxc_list.h" +#include "reaxc_vector.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +void Calculate_dCos_ThetaOMP( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, + rvec* dcos_theta_di, + rvec* dcos_theta_dj, + rvec* dcos_theta_dk ) +{ + int t; + double sqr_d_ji = SQR(d_ji); + double sqr_d_jk = SQR(d_jk); + double inv_dists = 1.0 / (d_ji * d_jk); + double inv_dists3 = inv_dists * inv_dists * inv_dists; + double dot_dvecs = dvec_ji[0]*dvec_jk[0] + dvec_ji[1]*dvec_jk[1] + dvec_ji[2]*dvec_jk[2]; + double Cdot_inv3 = dot_dvecs * inv_dists3; + + double csqr_jk = Cdot_inv3 * sqr_d_jk; + double csqr_ji = Cdot_inv3 * sqr_d_ji; + + // Try to help compiler out by unrolling + // x-component + double dinv_jk = dvec_jk[0] * inv_dists; + double dinv_ji = dvec_ji[0] * inv_dists; + + double cdev_ji = csqr_jk * dvec_ji[0]; + double cdev_jk = csqr_ji * dvec_jk[0]; + + (*dcos_theta_di)[0] = dinv_jk - cdev_ji; + (*dcos_theta_dj)[0] = -(dinv_jk + dinv_ji) + cdev_ji + cdev_jk; + (*dcos_theta_dk)[0] = dinv_ji - cdev_jk; + + // y-component + dinv_jk = dvec_jk[1] * inv_dists; + dinv_ji = dvec_ji[1] * inv_dists; + + cdev_ji = csqr_jk * dvec_ji[1]; + cdev_jk = csqr_ji * dvec_jk[1]; + + (*dcos_theta_di)[1] = dinv_jk - cdev_ji; + (*dcos_theta_dj)[1] = -(dinv_jk + dinv_ji) + cdev_ji + cdev_jk; + (*dcos_theta_dk)[1] = dinv_ji - cdev_jk; + + // z-component + dinv_jk = dvec_jk[2] * inv_dists; + dinv_ji = dvec_ji[2] * inv_dists; + + cdev_ji = csqr_jk * dvec_ji[2]; + cdev_jk = csqr_ji * dvec_jk[2]; + + (*dcos_theta_di)[2] = dinv_jk - cdev_ji; + (*dcos_theta_dj)[2] = -(dinv_jk + dinv_ji) + cdev_ji + cdev_jk; + (*dcos_theta_dk)[2] = dinv_ji - cdev_jk; +} + +/* ---------------------------------------------------------------------- */ + +/* this is a 3-body interaction in which the main role is + played by j which sits in the middle of the other two. */ +void Valence_AnglesOMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control ) +{ + +#ifdef OMP_TIMING + double endTimeBase, startTimeBase; + startTimeBase = MPI_Wtime(); +#endif + + reax_list *bonds = (*lists) + BONDS; + reax_list *thb_intrs = (*lists) + THREE_BODIES; + + // Precompute and store valence_angle offsets for OpenMP code. + int * _my_offset = workspace->valence_angle_atom_myoffset; + + /* global parameters used in these calculations */ + double p_val6 = system->reax_param.gp.l[14]; + double p_val8 = system->reax_param.gp.l[33]; + double p_val9 = system->reax_param.gp.l[16]; + double p_val10 = system->reax_param.gp.l[17]; + double total_Eang = 0; + double total_Epen = 0; + double total_Ecoa = 0; + + int per_atom = (thb_intrs->num_intrs / system->N); + int nthreads = control->nthreads; + int chunksize = system->N/(nthreads*10); + int num_thb_intrs = 0; + int TWICE = 2; + +#pragma omp parallel default(shared) reduction(+:total_Eang, total_Epen, total_Ecoa, num_thb_intrs) + { + int i, j, pi, k, pk, t; + int type_i, type_j, type_k; + int start_j, end_j, start_pk, end_pk; + int cnt, my_offset, mark; + + double temp, temp_bo_jt, pBOjt7; + double p_val1, p_val2, p_val3, p_val4, p_val5, p_val7; + double p_pen1, p_pen2, p_pen3, p_pen4; + double p_coa1, p_coa2, p_coa3, p_coa4; + double trm8, expval6, expval7, expval2theta, expval12theta, exp3ij, exp3jk; + double exp_pen2ij, exp_pen2jk, exp_pen3, exp_pen4, trm_pen34, exp_coa2; + double dSBO1, dSBO2, SBO, SBO2, CSBO2, SBOp, prod_SBO, vlpadj; + double CEval1, CEval2, CEval3, CEval4, CEval5, CEval6, CEval7, CEval8; + double CEpen1, CEpen2, CEpen3; + double e_ang, e_coa, e_pen; + double CEcoa1, CEcoa2, CEcoa3, CEcoa4, CEcoa5; + double Cf7ij, Cf7jk, Cf8j, Cf9j; + double f7_ij, f7_jk, f8_Dj, f9_Dj; + double Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; + double r_ij, r_jk; + double BOA_ij, BOA_jk; + rvec force, ext_press; + // rtensor temp_rtensor, total_rtensor; + + // Tallying variables + double eng_tmp, f_scaler, fi_tmp[3], fj_tmp[3], fk_tmp[3]; + double delij[3], delkj[3]; + + three_body_header *thbh; + three_body_parameters *thbp; + three_body_interaction_data *p_ijk, *p_kji; + bond_data *pbond_ij, *pbond_jk, *pbond_jt; + bond_order_data *bo_ij, *bo_jk, *bo_jt; + + int tid = omp_get_thread_num(); + long reductionOffset = (system->N * tid); + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, + system->N, system->pair_ptr->eatom, + system->pair_ptr->vatom, thr); + + + // Run through a minimal for(jnum_intrs / nthreads; + +#pragma omp for schedule(dynamic,50) + for (j = 0; j < system->N; ++j) { + type_j = system->my_atoms[j].type; + _my_offset[j] = 0; + if(type_j < 0) continue; + + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); + + // Always point to start of workspace to count angles + my_offset = tid * per_thread; + + for (pi = start_j; pi < end_j; ++pi) { + Set_Start_Index( pi, my_offset, thb_intrs ); + pbond_ij = &(bonds->select.bond_list[pi]); + bo_ij = &(pbond_ij->bo_data); + BOA_ij = bo_ij->BO - control->thb_cut; + + if (BOA_ij > 0.0) { + i = pbond_ij->nbr; + + /* first copy 3-body intrs from previously computed ones where i>k. + in the second for-loop below, + we compute only new 3-body intrs where i < k */ + for (pk = start_j; pk < pi; ++pk) { + start_pk = Start_Index( pk, thb_intrs ); + end_pk = End_Index( pk, thb_intrs ); + + for (t = start_pk; t < end_pk; ++t) + if (thb_intrs->select.three_body_list[t].thb == i) { + + p_ijk = &(thb_intrs->select.three_body_list[my_offset] ); + p_ijk->thb = bonds->select.bond_list[pk].nbr; + + ++my_offset; + break; + } + } // for(pk) + + /* and this is the second for loop mentioned above */ + for (pk = pi+1; pk < end_j; ++pk) { + pbond_jk = &(bonds->select.bond_list[pk]); + k = pbond_jk->nbr; + + if (j >= system->n && i >= system->n && k >= system->n) continue; + + p_ijk = &( thb_intrs->select.three_body_list[my_offset] ); + p_ijk->thb = k; + + ++my_offset; // add this to the list of 3-body interactions + } // for(pk) + } // if() + + Set_End_Index(pi, my_offset, thb_intrs ); + } // for(pi) + + // Confirm that thb_intrs->num_intrs / nthreads is enough to hold all angles from a single atom + if(my_offset >= (tid+1)*per_thread) { + int me; + MPI_Comm_rank(MPI_COMM_WORLD,&me); + fprintf( stderr, "step%d-ran out of space on angle_list on proc %i for atom %i:", data->step, me, j); + fprintf( stderr, " nthreads= %d, tid=%d, my_offset=%d, per_thread=%d\n", nthreads, tid, my_offset, per_thread); + fprintf( stderr, " num_intrs= %i N= %i\n",thb_intrs->num_intrs , system->N); + MPI_Abort( MPI_COMM_WORLD, INSUFFICIENT_MEMORY ); + } + + // Number of angles owned by this atom + _my_offset[j] = my_offset - tid * per_thread; + } // for(j) + + // Wait for all threads to finish counting angles +#pragma omp barrier + + // Master thread uses angle counts to compute offsets + // This can be threaded +#pragma omp master + { + int current_count = 0; + int m = _my_offset[0]; + _my_offset[0] = current_count; + for(j=1; jN; j++) { + current_count+= m; + m = _my_offset[j]; + _my_offset[j] = current_count; + } + _my_offset[system->N] = current_count + m; // Used to test if last particle has any angles + } + + // All threads wait till master thread finished computing offsets +#pragma omp barrier + + // Original loop, but now using precomputed offsets + // Safe to use all threads available, regardless of threads tasked above + // We also now skip over atoms that have no angles assigned +#pragma omp for schedule(dynamic,50)//(dynamic,chunksize)//(guided) + for (j = 0; j < system->N; ++j) { // Ray: the first one with system->N + type_j = system->my_atoms[j].type; + if(type_j < 0) continue; + + // Skip if no angles for this atom + if(_my_offset[j] == _my_offset[j+1]) continue; + + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); + + type_j = system->my_atoms[j].type; + + my_offset = _my_offset[j]; + + p_val3 = system->reax_param.sbp[ type_j ].p_val3; + p_val5 = system->reax_param.sbp[ type_j ].p_val5; + + SBOp = 0, prod_SBO = 1; + for (t = start_j; t < end_j; ++t) { + bo_jt = &(bonds->select.bond_list[t].bo_data); + SBOp += (bo_jt->BO_pi + bo_jt->BO_pi2); + temp = SQR( bo_jt->BO ); + temp *= temp; + temp *= temp; + prod_SBO *= exp( -temp ); + } + + // modifications to match Adri's code - 09/01/09 + if( workspace->vlpex[j] >= 0 ){ + vlpadj = 0; + dSBO2 = prod_SBO - 1; + } + else{ + vlpadj = workspace->nlp[j]; + dSBO2 = (prod_SBO - 1) * (1 - p_val8 * workspace->dDelta_lp[j]); + } + + SBO = SBOp + (1 - prod_SBO) * (-workspace->Delta_boc[j] - p_val8 * vlpadj); + dSBO1 = -8 * prod_SBO * ( workspace->Delta_boc[j] + p_val8 * vlpadj ); + + if( SBO <= 0 ) + SBO2 = 0, CSBO2 = 0; + else if( SBO > 0 && SBO <= 1 ) { + SBO2 = pow( SBO, p_val9 ); + CSBO2 = p_val9 * pow( SBO, p_val9 - 1 ); + } + else if( SBO > 1 && SBO < 2 ) { + SBO2 = 2 - pow( 2-SBO, p_val9 ); + CSBO2 = p_val9 * pow( 2 - SBO, p_val9 - 1 ); + } + else + SBO2 = 2, CSBO2 = 0; + + expval6 = exp( p_val6 * workspace->Delta_boc[j] ); + + for (pi = start_j; pi < end_j; ++pi) { + Set_Start_Index( pi, my_offset, thb_intrs ); + pbond_ij = &(bonds->select.bond_list[pi]); + bo_ij = &(pbond_ij->bo_data); + BOA_ij = bo_ij->BO - control->thb_cut; + + + if (BOA_ij > 0.0) { + i = pbond_ij->nbr; + r_ij = pbond_ij->d; + type_i = system->my_atoms[i].type; + + + /* first copy 3-body intrs from previously computed ones where i>k. + in the second for-loop below, + we compute only new 3-body intrs where i < k */ + for (pk = start_j; pk < pi; ++pk) { + start_pk = Start_Index( pk, thb_intrs ); + end_pk = End_Index( pk, thb_intrs ); + + for (t = start_pk; t < end_pk; ++t) + if (thb_intrs->select.three_body_list[t].thb == i) { + p_ijk = &(thb_intrs->select.three_body_list[my_offset] ); + p_kji = &(thb_intrs->select.three_body_list[t]); + + p_ijk->thb = bonds->select.bond_list[pk].nbr; + p_ijk->pthb = pk; + p_ijk->theta = p_kji->theta; + rvec_Copy( p_ijk->dcos_di, p_kji->dcos_dk ); + rvec_Copy( p_ijk->dcos_dj, p_kji->dcos_dj ); + rvec_Copy( p_ijk->dcos_dk, p_kji->dcos_di ); + + ++my_offset; + ++num_thb_intrs; + break; + } + } // for(pk) + + + /* and this is the second for loop mentioned above */ + for (pk = pi+1; pk < end_j; ++pk) { + pbond_jk = &(bonds->select.bond_list[pk]); + bo_jk = &(pbond_jk->bo_data); + BOA_jk = bo_jk->BO - control->thb_cut; + k = pbond_jk->nbr; + type_k = system->my_atoms[k].type; + p_ijk = &( thb_intrs->select.three_body_list[my_offset] ); + + // Fix by Sudhir + // if (BOA_jk <= 0) continue; + if (j >= system->n && i >= system->n && k >= system->n) continue; + + Calculate_Theta( pbond_ij->dvec, pbond_ij->d, + pbond_jk->dvec, pbond_jk->d, + &theta, &cos_theta ); + + Calculate_dCos_ThetaOMP( pbond_ij->dvec, pbond_ij->d, + pbond_jk->dvec, pbond_jk->d, + &(p_ijk->dcos_di), &(p_ijk->dcos_dj), + &(p_ijk->dcos_dk) ); + p_ijk->thb = k; + p_ijk->pthb = pk; + p_ijk->theta = theta; + + sin_theta = sin( theta ); + if( sin_theta < 1.0e-5 ) + sin_theta = 1.0e-5; + + ++my_offset; // add this to the list of 3-body interactions + ++num_thb_intrs; + + if ((j < system->n) && (BOA_jk > 0.0) && + (bo_ij->BO > control->thb_cut) && + (bo_jk->BO > control->thb_cut) && + (bo_ij->BO * bo_jk->BO > control->thb_cutsq)) { + r_jk = pbond_jk->d; + thbh = &( system->reax_param.thbp[ type_i ][ type_j ][ type_k ] ); + + for (cnt = 0; cnt < thbh->cnt; ++cnt) { + + if( fabs(thbh->prm[cnt].p_val1) > 0.001 ) { + thbp = &( thbh->prm[cnt] ); + + /* ANGLE ENERGY */ + p_val1 = thbp->p_val1; + p_val2 = thbp->p_val2; + p_val4 = thbp->p_val4; + p_val7 = thbp->p_val7; + theta_00 = thbp->theta_00; + + exp3ij = exp( -p_val3 * pow( BOA_ij, p_val4 ) ); + f7_ij = 1.0 - exp3ij; + Cf7ij = p_val3 * p_val4 * pow( BOA_ij, p_val4 - 1.0 ) * exp3ij; + + exp3jk = exp( -p_val3 * pow( BOA_jk, p_val4 ) ); + f7_jk = 1.0 - exp3jk; + Cf7jk = p_val3 * p_val4 * pow( BOA_jk, p_val4 - 1.0 ) * exp3jk; + + expval7 = exp( -p_val7 * workspace->Delta_boc[j] ); + trm8 = 1.0 + expval6 + expval7; + f8_Dj = p_val5 - ( (p_val5 - 1.0) * (2.0 + expval6) / trm8 ); + Cf8j = ( (1.0 - p_val5) / SQR(trm8) ) * + ( p_val6 * expval6 * trm8 - + (2.0 + expval6) * ( p_val6*expval6 - p_val7*expval7 ) ); + + theta_0 = 180.0 - theta_00 * (1.0 - + exp(-p_val10 * (2.0 - SBO2))); + theta_0 = DEG2RAD( theta_0 ); + + expval2theta = exp( -p_val2 * SQR(theta_0 - theta) ); + if (p_val1 >= 0) + expval12theta = p_val1 * (1.0 - expval2theta); + else // To avoid linear Me-H-Me angles (6/6/06) + expval12theta = p_val1 * -expval2theta; + + CEval1 = Cf7ij * f7_jk * f8_Dj * expval12theta; + CEval2 = Cf7jk * f7_ij * f8_Dj * expval12theta; + CEval3 = Cf8j * f7_ij * f7_jk * expval12theta; + CEval4 = -2.0 * p_val1 * p_val2 * f7_ij * f7_jk * f8_Dj * + expval2theta * (theta_0 - theta); + + Ctheta_0 = p_val10 * DEG2RAD(theta_00) * + exp( -p_val10 * (2.0 - SBO2) ); + + CEval5 = -CEval4 * Ctheta_0 * CSBO2; + CEval6 = CEval5 * dSBO1; + CEval7 = CEval5 * dSBO2; + CEval8 = -CEval4 / sin_theta; + + total_Eang += e_ang = + f7_ij * f7_jk * f8_Dj * expval12theta; + /* END ANGLE ENERGY*/ + + + /* PENALTY ENERGY */ + p_pen1 = thbp->p_pen1; + p_pen2 = system->reax_param.gp.l[19]; + p_pen3 = system->reax_param.gp.l[20]; + p_pen4 = system->reax_param.gp.l[21]; + + exp_pen2ij = exp( -p_pen2 * SQR( BOA_ij - 2.0 ) ); + exp_pen2jk = exp( -p_pen2 * SQR( BOA_jk - 2.0 ) ); + exp_pen3 = exp( -p_pen3 * workspace->Delta[j] ); + exp_pen4 = exp( p_pen4 * workspace->Delta[j] ); + trm_pen34 = 1.0 + exp_pen3 + exp_pen4; + f9_Dj = ( 2.0 + exp_pen3 ) / trm_pen34; + Cf9j = ( -p_pen3 * exp_pen3 * trm_pen34 - + (2.0 + exp_pen3) * ( -p_pen3 * exp_pen3 + + p_pen4 * exp_pen4 ) ) / + SQR( trm_pen34 ); + + total_Epen += e_pen = + p_pen1 * f9_Dj * exp_pen2ij * exp_pen2jk; + + CEpen1 = e_pen * Cf9j / f9_Dj; + temp = -2.0 * p_pen2 * e_pen; + CEpen2 = temp * (BOA_ij - 2.0); + CEpen3 = temp * (BOA_jk - 2.0); + /* END PENALTY ENERGY */ + + + /* COALITION ENERGY */ + p_coa1 = thbp->p_coa1; + p_coa2 = system->reax_param.gp.l[2]; + p_coa3 = system->reax_param.gp.l[38]; + p_coa4 = system->reax_param.gp.l[30]; + + exp_coa2 = exp( p_coa2 * workspace->Delta_val[j] ); + total_Ecoa += e_coa = + p_coa1 / (1. + exp_coa2) * + exp( -p_coa3 * SQR(workspace->total_bond_order[i]-BOA_ij) ) * + exp( -p_coa3 * SQR(workspace->total_bond_order[k]-BOA_jk) ) * + exp( -p_coa4 * SQR(BOA_ij - 1.5) ) * + exp( -p_coa4 * SQR(BOA_jk - 1.5) ); + + CEcoa1 = -2 * p_coa4 * (BOA_ij - 1.5) * e_coa; + CEcoa2 = -2 * p_coa4 * (BOA_jk - 1.5) * e_coa; + CEcoa3 = -p_coa2 * exp_coa2 * e_coa / (1 + exp_coa2); + CEcoa4 = -2 * p_coa3 * + (workspace->total_bond_order[i]-BOA_ij) * e_coa; + CEcoa5 = -2 * p_coa3 * + (workspace->total_bond_order[k]-BOA_jk) * e_coa; + /* END COALITION ENERGY */ + + + /* FORCES */ + bo_ij->Cdbo += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); + bo_jk->Cdbo += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); + workspace->CdDelta[j] += ((CEval3 + CEval7) + CEpen1 + CEcoa3); + workspace->CdDeltaReduction[reductionOffset+i] += CEcoa4; + workspace->CdDeltaReduction[reductionOffset+k] += CEcoa5; + + for (t = start_j; t < end_j; ++t) { + pbond_jt = &( bonds->select.bond_list[t] ); + bo_jt = &(pbond_jt->bo_data); + temp_bo_jt = bo_jt->BO; + temp = CUBE( temp_bo_jt ); + pBOjt7 = temp * temp * temp_bo_jt; + + bo_jt->Cdbo += (CEval6 * pBOjt7); + bo_jt->Cdbopi += CEval5; + bo_jt->Cdbopi2 += CEval5; + } + + if( control->virial == 0 ) { + rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+i], + CEval8, p_ijk->dcos_di ); + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+k], + CEval8, p_ijk->dcos_dk ); + } + else { + /* terms not related to bond order derivatives are + added directly into forces and pressure vector/tensor */ + rvec_Scale( force, CEval8, p_ijk->dcos_di ); + rvec_Add( workspace->forceReduction[reductionOffset+i], force ); + + rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + + rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); + + rvec_Scale( force, CEval8, p_ijk->dcos_dk ); + rvec_Add( workspace->forceReduction[reductionOffset+k], force ); + + rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + } + + /* tally into per-atom virials */ + if( system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + + /* Acquire vectors */ + rvec_ScaledSum( delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x ); + rvec_ScaledSum( delkj, 1., system->my_atoms[k].x, + -1., system->my_atoms[j].x ); + + rvec_Scale( fi_tmp, -CEval8, p_ijk->dcos_di ); + rvec_Scale( fj_tmp, -CEval8, p_ijk->dcos_dj ); + rvec_Scale( fk_tmp, -CEval8, p_ijk->dcos_dk ); + + eng_tmp = e_ang + e_pen + e_coa; + + if( system->pair_ptr->evflag) + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, j, system->N, 1, + eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + if( system->pair_ptr->vflag_atom) + // NEED TO MAKE AN OMP VERSION OF THIS CALL! + system->pair_ptr->v_tally3( i, j, k, fi_tmp, fk_tmp, delij, delkj); + } + + } // if(p_val1>0.001) + } // for(cnt) + } // if(j0) + } // for(pk) + } // if(BOA_ij>0) + + Set_End_Index(pi, my_offset, thb_intrs ); + } // for(pi) + } // for(j) + + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, thr); + } // end omp parallel + + data->my_en.e_ang = total_Eang; + data->my_en.e_pen = total_Epen; + data->my_en.e_coa = total_Ecoa; + + if( num_thb_intrs >= thb_intrs->num_intrs * DANGER_ZONE ) { + workspace->realloc.num_3body = num_thb_intrs * TWICE; + if( num_thb_intrs > thb_intrs->num_intrs ) { + fprintf( stderr, "step%d-ran out of space on angle_list: top=%d, max=%d", + data->step, num_thb_intrs, thb_intrs->num_intrs ); + MPI_Abort( MPI_COMM_WORLD, INSUFFICIENT_MEMORY ); + } + } + +#ifdef OMP_TIMING + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTEVALENCEANGLESBOINDEX] += (endTimeBase-startTimeBase); +#endif +} diff --git a/src/USER-OMP/reaxc_valence_angles_omp.h b/src/USER-OMP/reaxc_valence_angles_omp.h new file mode 100644 index 0000000000..ce304acced --- /dev/null +++ b/src/USER-OMP/reaxc_valence_angles_omp.h @@ -0,0 +1,37 @@ +/*---------------------------------------------------------------------- + PuReMD - Purdue ReaxFF Molecular Dynamics Program + + Copyright (2010) Purdue University + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu + + Please cite the related publication: + H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, + "Parallel Reactive Molecular Dynamics: Numerical Methods and + Algorithmic Techniques", Parallel Computing, in press. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details: + . + ----------------------------------------------------------------------*/ + +#ifndef __VALENCE_ANGLES_OMP_H_ +#define __VALENCE_ANGLES_OMP_H_ + +#include "reaxc_types.h" + +void Valence_AnglesOMP( reax_system*, control_params*, simulation_data*, + storage*, reax_list**, output_controls* ); + +void Calculate_dCos_ThetaOMP( rvec, double, rvec, double, rvec*, rvec*, rvec* ); + +#endif diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 22b5382727..5f171c8768 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -64,7 +64,7 @@ static const char cite_fix_qeq_reax[] = /* ---------------------------------------------------------------------- */ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg) + Fix(lmp, narg, arg), pertype_option(NULL) { if (lmp->citeme) lmp->citeme->add(cite_fix_qeq_reax); @@ -76,7 +76,9 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : swa = force->numeric(FLERR,arg[4]); swb = force->numeric(FLERR,arg[5]); tolerance = force->numeric(FLERR,arg[6]); - pertype_parameters(arg[7]); + int len = strlen(arg[7]) + 1; + pertype_option = new char[len]; + strcpy(pertype_option,arg[7]); // dual CG support only available for USER-OMP variant dual_enabled = 0; @@ -135,6 +137,8 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : FixQEqReax::~FixQEqReax() { + delete[] pertype_option; + // unregister callbacks to this fix from Atom class if (copymode) return; @@ -158,6 +162,13 @@ FixQEqReax::~FixQEqReax() /* ---------------------------------------------------------------------- */ +void FixQEqReax::post_constructor() +{ + pertype_parameters(pertype_option); +} + +/* ---------------------------------------------------------------------- */ + int FixQEqReax::setmask() { int mask = 0; diff --git a/src/USER-REAXC/fix_qeq_reax.h b/src/USER-REAXC/fix_qeq_reax.h index d82232576a..19efcd2b03 100644 --- a/src/USER-REAXC/fix_qeq_reax.h +++ b/src/USER-REAXC/fix_qeq_reax.h @@ -39,6 +39,7 @@ class FixQEqReax : public Fix { FixQEqReax(class LAMMPS *, int, char **); ~FixQEqReax(); int setmask(); + virtual void post_constructor(); virtual void init(); void init_list(int,class NeighList *); virtual void init_storage(); @@ -100,6 +101,7 @@ class FixQEqReax : public Fix { //double **h; //double *hc, *hs; + char *pertype_option; // argument to determine how per-type info is obtained virtual void pertype_parameters(char*); void init_shielding(); void init_taper(); diff --git a/src/USER-REAXC/pair_reaxc.h b/src/USER-REAXC/pair_reaxc.h index 5658648db6..91b44be661 100644 --- a/src/USER-REAXC/pair_reaxc.h +++ b/src/USER-REAXC/pair_reaxc.h @@ -42,7 +42,7 @@ class PairReaxC : public Pair { void compute(int, int); void settings(int, char **); void coeff(int, char **); - void init_style(); + virtual void init_style(); double init_one(int, int); void *extract(const char *, int &); int fixbond_flag, fixspecies_flag; From 0e3cfbc007c88d6ecfbbd6e03cca7f5bb5efbd27 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 May 2017 16:29:26 -0400 Subject: [PATCH 087/302] remove trailing whitespace --- src/USER-OMP/angle_dipole_omp.cpp | 8 +- src/USER-OMP/fix_qeq_reax_omp.cpp | 114 ++++++++++----------- src/USER-OMP/fix_qeq_reax_omp.h | 8 +- src/USER-OMP/fix_reaxc_species_omp.cpp | 2 +- src/USER-OMP/fix_reaxc_species_omp.h | 10 +- src/USER-OMP/pair_reaxc_omp.cpp | 116 +++++++++++----------- src/USER-OMP/pair_reaxc_omp.h | 34 +++---- src/USER-OMP/reaxc_bond_orders_omp.cpp | 102 +++++++++---------- src/USER-OMP/reaxc_bonds_omp.cpp | 54 +++++----- src/USER-OMP/reaxc_forces_omp.cpp | 112 ++++++++++----------- src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp | 18 ++-- src/USER-OMP/reaxc_init_md_omp.cpp | 6 +- src/USER-OMP/reaxc_multi_body_omp.cpp | 94 +++++++++--------- src/USER-OMP/reaxc_nonbonded_omp.cpp | 98 +++++++++--------- src/USER-OMP/reaxc_torsion_angles_omp.cpp | 74 +++++++------- src/USER-OMP/reaxc_valence_angles_omp.cpp | 100 +++++++++---------- src/USER-REAXC/pair_reaxc.cpp | 2 +- src/USER-REAXC/reaxc_allocate.cpp | 18 ++-- src/USER-REAXC/reaxc_types.h | 2 +- 19 files changed, 486 insertions(+), 486 deletions(-) diff --git a/src/USER-OMP/angle_dipole_omp.cpp b/src/USER-OMP/angle_dipole_omp.cpp index 9a646e04b0..f582ce4c41 100644 --- a/src/USER-OMP/angle_dipole_omp.cpp +++ b/src/USER-OMP/angle_dipole_omp.cpp @@ -122,14 +122,14 @@ void AngleDipoleOMP::eval(int nfrom, int nto, ThrData * const thr) delTx = tangle * (dely*mu[iDip][2] - delz*mu[iDip][1]); delTy = tangle * (delz*mu[iDip][0] - delx*mu[iDip][2]); delTz = tangle * (delx*mu[iDip][1] - dely*mu[iDip][0]); - + torque[iDip][0] += delTx; torque[iDip][1] += delTy; torque[iDip][2] += delTz; // Force couple that counterbalances dipolar torque fx = dely*delTz - delz*delTy; // direction (fi): - r x (-T) - fy = delz*delTx - delx*delTz; + fy = delz*delTx - delx*delTz; fz = delx*delTy - dely*delTx; fmod = sqrt(delTx*delTx + delTy*delTy + delTz*delTz) / r; // magnitude @@ -142,11 +142,11 @@ void AngleDipoleOMP::eval(int nfrom, int nto, ThrData * const thr) fj[0] = -fi[0]; fj[1] = -fi[1]; fj[2] = -fi[2]; - + f[iDip][0] += fj[0]; f[iDip][1] += fj[1]; f[iDip][2] += fj[2]; - + f[iRef][0] += fi[0]; f[iRef][1] += fi[1]; f[iRef][2] += fi[2]; diff --git a/src/USER-OMP/fix_qeq_reax_omp.cpp b/src/USER-OMP/fix_qeq_reax_omp.cpp index c8e5e3cb93..a43d6cfdd1 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.cpp +++ b/src/USER-OMP/fix_qeq_reax_omp.cpp @@ -168,10 +168,10 @@ void FixQEqReaxOMP::allocate_storage() /* ---------------------------------------------------------------------- */ void FixQEqReaxOMP::deallocate_storage() -{ +{ memory->destroy(b_temp); - - FixQEqReax::deallocate_storage(); + + FixQEqReax::deallocate_storage(); } /* ---------------------------------------------------------------------- */ @@ -275,7 +275,7 @@ void FixQEqReaxOMP::init() n -= 1.0; d += 1.0; } - + // fprintf(stdout,"aspc_omega= %f\n",aspc_omega); // for(int i=0; iall(FLERR,"Early Termination"); @@ -306,21 +306,21 @@ void FixQEqReaxOMP::compute_H() firstneigh = list->firstneigh; } int ai, num_nbrs; - + // sumscan of the number of neighbors per atom to determine the offsets // most likely, we are overallocating. desirable to work on this part // to reduce the memory footprint of the far_nbrs list. - + num_nbrs = 0; - + for (int itr_i = 0; itr_i < inum; ++itr_i) { ai = ilist[itr_i]; H.firstnbr[ai] = num_nbrs; num_nbrs += numneigh[ai]; } - + // fill in the H matrix - + #pragma omp parallel default(shared) { int i, j, ii, jj, mfill, jnum, flag; @@ -328,7 +328,7 @@ void FixQEqReaxOMP::compute_H() double dx, dy, dz, r_sqr; mfill = 0; - + //#pragma omp for schedule(dynamic,50) #pragma omp for schedule(guided) for (ii = 0; ii < inum; ii++) { @@ -340,12 +340,12 @@ void FixQEqReaxOMP::compute_H() for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; - + dx = x[j][0] - x[i][0]; dy = x[j][1] - x[i][1]; dz = x[j][2] - x[i][2]; r_sqr = SQR(dx) + SQR(dy) + SQR(dz); - + flag = 0; if (r_sqr <= SQR(swb)) { if (j < n) flag = 1; @@ -358,7 +358,7 @@ void FixQEqReaxOMP::compute_H() } } } - + if( flag ) { H.jlist[mfill] = j; H.val[mfill] = calculate_H( sqrt(r_sqr), shld[type[i]][type[j]] ); @@ -378,7 +378,7 @@ void FixQEqReaxOMP::compute_H() error->all(FLERR,"Fix qeq/reax/omp has insufficient QEq matrix size"); } } // omp - + } /* ---------------------------------------------------------------------- */ @@ -386,10 +386,10 @@ void FixQEqReaxOMP::compute_H() void FixQEqReaxOMP::init_storage() { int NN; - + if(reaxc) NN = reaxc->list->inum + reaxc->list->gnum; else NN = list->inum + list->gnum; - + #pragma omp parallel for schedule(static) for (int i = 0; i < NN; i++) { Hdia_inv[i] = 1. / eta[atom->type[i]]; @@ -450,9 +450,9 @@ void FixQEqReaxOMP::pre_force(int vflag) ompTimingCGCount[COMPUTECG1INDEX]+= matvecs_s; startTimeBase = endTimeBase; #endif - + matvecs_t = CG(b_t, t); // CG on t - parallel - + #ifdef OMP_TIMING endTimeBase = MPI_Wtime(); ompTimingData[COMPUTECG2INDEX] += (endTimeBase-startTimeBase); @@ -495,7 +495,7 @@ void FixQEqReaxOMP::init_matvec() long endTimeBase, startTimeBase; startTimeBase = MPI_Wtime(); #endif - + /* fill-in H matrix */ compute_H(); @@ -611,12 +611,12 @@ int FixQEqReaxOMP::CG( double *b, double *x ) if (atom->mask[i] & groupbit) { r[i] = b[i] - q[i]; d[i] = r[i] * Hdia_inv[i]; //pre-condition - + tmp1 += b[i] * b[i]; tmp2 += r[i] * d[i]; } } - + my_buf[0] = tmp1; my_buf[1] = tmp2; @@ -633,7 +633,7 @@ int FixQEqReaxOMP::CG( double *b, double *x ) tmp1 = 0.0; #pragma omp parallel { - + #pragma omp for schedule(dynamic,50) private(ii) reduction(+:tmp1) for( jj = 0; jj < nn; jj++) { ii = ilist[jj]; @@ -656,7 +656,7 @@ int FixQEqReaxOMP::CG( double *b, double *x ) if(atom->mask[ii] & groupbit) { x[ii] += alpha * d[ii]; r[ii] -= alpha * q[ii]; - + // pre-conditioning p[ii] = r[ii] * Hdia_inv[ii]; tmp1 += r[ii] * p[ii]; @@ -665,12 +665,12 @@ int FixQEqReaxOMP::CG( double *b, double *x ) } // omp parallel sig_old = sig_new; - + MPI_Allreduce(&tmp1, &tmp2, 1, MPI_DOUBLE, MPI_SUM, world); - + sig_new = tmp2; beta = sig_new / sig_old; - + #pragma omp for schedule(dynamic,50) private(ii) for( jj = 0; jj < nn; jj++) { ii = ilist[jj]; @@ -699,7 +699,7 @@ void FixQEqReaxOMP::sparse_matvec( sparse_matrix *A, double *x, double *b ) int *ilist; int nthreads = comm->nthreads; int tid = omp_get_thread_num(); - + if(reaxc) { nn = reaxc->list->inum; NN = reaxc->list->inum + reaxc->list->gnum; @@ -709,21 +709,21 @@ void FixQEqReaxOMP::sparse_matvec( sparse_matrix *A, double *x, double *b ) NN = list->inum + list->gnum; ilist = list->ilist; } - + #pragma omp for schedule(dynamic,50) for (ii = 0; ii < nn; ++ii) { i = ilist[ii]; if(atom->mask[i] & groupbit) b[i] = eta[ atom->type[i] ] * x[i]; } - + #pragma omp for schedule(dynamic,50) for (ii = nn; ii < NN; ++ii) { i = ilist[ii]; if(atom->mask[i] & groupbit) b[i] = 0; } - + #pragma omp for schedule(dynamic,50) - for (i = 0; i < NN; ++i) + for (i = 0; i < NN; ++i) for(int t=0; tmask[i] & groupbit) { q[i] = s[i] - u * t[i]; - + // backup s & t for (int k = 4; k > 0; --k) { s_hist[i][k] = s_hist[i][k-1]; @@ -817,7 +817,7 @@ void FixQEqReaxOMP::calculate_Q() // double FixQEqReaxOMP::parallel_norm( double *v, int n ) // { // int i; -// double my_sum, norm_sqr; +// double my_sum, norm_sqr; // int *ilist; @@ -911,7 +911,7 @@ void FixQEqReaxOMP::vector_sum( double* dest, double c, double* v, /* ---------------------------------------------------------------------- */ void FixQEqReaxOMP::vector_add( double* dest, double c, double* v, int k ) -{ +{ int i; int *ilist; @@ -971,18 +971,18 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) int indxI = 2 * i; r[indxI ] = b1[i] - q[indxI ]; r[indxI+1] = b2[i] - q[indxI+1]; - + d[indxI ] = r[indxI ] * Hdia_inv[i]; //pre-condition d[indxI+1] = r[indxI+1] * Hdia_inv[i]; - + tmp1 += b1[i] * b1[i]; tmp2 += b2[i] * b2[i]; - + tmp3 += r[indxI ] * d[indxI ]; tmp4 += r[indxI+1] * d[indxI+1]; } } - + my_buf[0] = tmp1; my_buf[1] = tmp2; my_buf[2] = tmp3; @@ -1004,7 +1004,7 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) tmp1 = tmp2 = 0.0; #pragma omp parallel { - + #pragma omp for schedule(dynamic,50) private(ii) reduction(+:tmp1,tmp2) for( jj = 0; jj < nn; jj++) { ii = ilist[jj]; @@ -1037,14 +1037,14 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) int indxI = 2 * ii; x1[ii] += alpha_s * d[indxI ]; x2[ii] += alpha_t * d[indxI+1]; - + r[indxI ] -= alpha_s * q[indxI ]; r[indxI+1] -= alpha_t * q[indxI+1]; - + // pre-conditioning p[indxI ] = r[indxI ] * Hdia_inv[ii]; p[indxI+1] = r[indxI+1] * Hdia_inv[ii]; - + tmp1 += r[indxI ] * p[indxI ]; tmp2 += r[indxI+1] * p[indxI+1]; } @@ -1053,20 +1053,20 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) my_buf[0] = tmp1; my_buf[1] = tmp2; - + sig_old_s = sig_new_s; sig_old_t = sig_new_t; - + MPI_Allreduce(&my_buf, &buf, 2, MPI_DOUBLE, MPI_SUM, world); - + sig_new_s = buf[0]; sig_new_t = buf[1]; if( sqrt(sig_new_s)/b_norm_s <= tolerance || sqrt(sig_new_t)/b_norm_t <= tolerance) break; - + beta_s = sig_new_s / sig_old_s; beta_t = sig_new_t / sig_old_t; - + #pragma omp for schedule(dynamic,50) private(ii) for( jj = 0; jj < nn; jj++) { ii = ilist[jj]; @@ -1082,7 +1082,7 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) i++; matvecs_s = matvecs_t = i; // The plus one makes consistent with count from CG() matvecs = i; - + // Timing info for iterating s&t together #ifdef OMP_TIMING endTimeBase = MPI_Wtime(); @@ -1140,7 +1140,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 int nthreads = comm->nthreads; int tid = omp_get_thread_num(); - + if (reaxc) { nn = reaxc->list->inum; NN = reaxc->list->inum + reaxc->list->gnum; @@ -1150,7 +1150,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 NN = list->inum + list->gnum; ilist = list->ilist; } - + #pragma omp for schedule(dynamic,50) for( ii = 0; ii < nn; ++ii ) { i = ilist[ii]; @@ -1160,7 +1160,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 b[indxI+1] = eta[ atom->type[i] ] * x2[i]; } } - + #pragma omp for schedule(dynamic,50) for( ii = nn; ii < NN; ++ii ) { i = ilist[ii]; @@ -1179,7 +1179,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 b_temp[t][indxI+1] = 0.0; } } - + // Wait for b accumulated and b_temp zeroed #pragma omp barrier #pragma omp for schedule(dynamic,50) @@ -1226,7 +1226,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) int nthreads = comm->nthreads; int tid = omp_get_thread_num(); - + if (reaxc) { nn = reaxc->list->inum; NN = reaxc->list->inum + reaxc->list->gnum; @@ -1236,7 +1236,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) NN = list->inum + list->gnum; ilist = list->ilist; } - + #pragma omp for schedule(dynamic,50) for( ii = 0; ii < nn; ++ii ) { i = ilist[ii]; @@ -1246,7 +1246,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) b[indxI+1] = eta[ atom->type[i] ] * x[indxI+1]; } } - + #pragma omp for schedule(dynamic,50) for( ii = nn; ii < NN; ++ii ) { i = ilist[ii]; @@ -1265,7 +1265,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) b_temp[t][indxI+1] = 0.0; } } - + // Wait for b accumulated and b_temp zeroed #pragma omp barrier #pragma omp for schedule(dynamic,50) diff --git a/src/USER-OMP/fix_qeq_reax_omp.h b/src/USER-OMP/fix_qeq_reax_omp.h index c06185ca2e..6d8719857d 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.h +++ b/src/USER-OMP/fix_qeq_reax_omp.h @@ -43,7 +43,7 @@ class FixQEqReaxOMP : public FixQEqReax { virtual void init_storage(); virtual void pre_force(int); virtual void post_constructor(); - + protected: double **b_temp; @@ -53,7 +53,7 @@ class FixQEqReaxOMP : public FixQEqReax { int aspc_order, aspc_order_max; double aspc_omega; double * aspc_b; - + virtual void pertype_parameters(char*); virtual void allocate_storage(); virtual void deallocate_storage(); @@ -64,7 +64,7 @@ class FixQEqReaxOMP : public FixQEqReax { virtual int CG(double*,double*); virtual void sparse_matvec(sparse_matrix*,double*,double*); virtual void calculate_Q(); - + /* virtual double parallel_norm( double*, int ); */ /* virtual double parallel_dot( double*, double*, int ); */ /* virtual double parallel_vector_acc( double*, int ); */ @@ -72,7 +72,7 @@ class FixQEqReaxOMP : public FixQEqReax { virtual void vector_sum(double*,double,double*,double,double*,int); virtual void vector_add(double*, double, double*,int); - // dual CG support + // dual CG support virtual int dual_CG(double*,double*,double*,double*); virtual void dual_sparse_matvec(sparse_matrix*,double*,double*,double*); virtual void dual_sparse_matvec(sparse_matrix*,double*,double*); diff --git a/src/USER-OMP/fix_reaxc_species_omp.cpp b/src/USER-OMP/fix_reaxc_species_omp.cpp index e9ac388252..786ba9824b 100644 --- a/src/USER-OMP/fix_reaxc_species_omp.cpp +++ b/src/USER-OMP/fix_reaxc_species_omp.cpp @@ -5,7 +5,7 @@ Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under + certain rights in this software. This software is distributed under the GNU General Public License. See the README file in the top-level LAMMPS directory. diff --git a/src/USER-OMP/fix_reaxc_species_omp.h b/src/USER-OMP/fix_reaxc_species_omp.h index 006bb3e87a..f2ef3fb266 100644 --- a/src/USER-OMP/fix_reaxc_species_omp.h +++ b/src/USER-OMP/fix_reaxc_species_omp.h @@ -5,7 +5,7 @@ Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under + certain rights in this software. This software is distributed under the GNU General Public License. See the README file in the top-level LAMMPS directory. @@ -26,17 +26,17 @@ FixStyle(reax/c/species/omp,FixReaxCSpeciesOMP) #define BUFLEN 1000 namespace LAMMPS_NS { - + class FixReaxCSpeciesOMP : public FixReaxCSpecies { - + public: FixReaxCSpeciesOMP(class LAMMPS *, int, char **); ~FixReaxCSpeciesOMP(){}; virtual void init(); - + private: class PairReaxCOMP *reaxc; - + }; } diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index c7a6c27f48..f216b47665 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -89,7 +89,7 @@ PairReaxCOMP::~PairReaxCOMP() int myrank; MPI_Comm_rank(mpi_data->world,&myrank); - + // Write screen output if (myrank == 0 && screen) { fprintf(screen,"\n\nWrite_Lists took %11.3lf seconds", ompTimingData[COMPUTEWLINDEX]); @@ -98,11 +98,11 @@ PairReaxCOMP::~PairReaxCOMP() fprintf(screen,"\n ->Initial Forces: %11.3lf seconds", ompTimingData[COMPUTEIFINDEX]); fprintf(screen,"\n ->Bond Order: %11.3lf seconds", ompTimingData[COMPUTEBOINDEX]); fprintf(screen,"\n ->Atom Energy: %11.3lf seconds", ompTimingData[COMPUTEATOMENERGYINDEX]); - fprintf(screen,"\n ->Bond: %11.3lf seconds", ompTimingData[COMPUTEBONDSINDEX]); + fprintf(screen,"\n ->Bond: %11.3lf seconds", ompTimingData[COMPUTEBONDSINDEX]); fprintf(screen,"\n ->Hydrogen bonds: %11.3lf seconds", ompTimingData[COMPUTEHBONDSINDEX]); fprintf(screen,"\n ->Torsion Angles: %11.3lf seconds", ompTimingData[COMPUTETORSIONANGLESBOINDEX]); fprintf(screen,"\n ->Valence Angles: %11.3lf seconds", ompTimingData[COMPUTEVALENCEANGLESBOINDEX]); - fprintf(screen,"\n ->Non-Bonded For: %11.3lf seconds", ompTimingData[COMPUTENBFINDEX]); + fprintf(screen,"\n ->Non-Bonded For: %11.3lf seconds", ompTimingData[COMPUTENBFINDEX]); fprintf(screen,"\n ->Total Forces: %11.3lf seconds", ompTimingData[COMPUTETFINDEX]); fprintf(screen,"\n\nfixQEQ: %11.3lf seconds", ompTimingData[COMPUTEQEQINDEX]); @@ -124,11 +124,11 @@ PairReaxCOMP::~PairReaxCOMP() fprintf(logfile,"\n ->Initial Forces: %11.3lf seconds", ompTimingData[COMPUTEIFINDEX]); fprintf(logfile,"\n ->Bond Order: %11.3lf seconds", ompTimingData[COMPUTEBOINDEX]); fprintf(logfile,"\n ->Atom Energy: %11.3lf seconds", ompTimingData[COMPUTEATOMENERGYINDEX]); - fprintf(logfile,"\n ->Bond: %11.3lf seconds", ompTimingData[COMPUTEBONDSINDEX]); + fprintf(logfile,"\n ->Bond: %11.3lf seconds", ompTimingData[COMPUTEBONDSINDEX]); fprintf(logfile,"\n ->Hydrogen bonds: %11.3lf seconds", ompTimingData[COMPUTEHBONDSINDEX]); fprintf(logfile,"\n ->Torsion Angles: %11.3lf seconds", ompTimingData[COMPUTETORSIONANGLESBOINDEX]); fprintf(logfile,"\n ->Valence Angles: %11.3lf seconds", ompTimingData[COMPUTEVALENCEANGLESBOINDEX]); - fprintf(logfile,"\n ->Non-Bonded For: %11.3lf seconds", ompTimingData[COMPUTENBFINDEX]); + fprintf(logfile,"\n ->Non-Bonded For: %11.3lf seconds", ompTimingData[COMPUTENBFINDEX]); fprintf(logfile,"\n ->Total Forces: %11.3lf seconds", ompTimingData[COMPUTETFINDEX]); fprintf(logfile,"\n\nfixQEQ: %11.3lf seconds", ompTimingData[COMPUTEQEQINDEX]); @@ -150,41 +150,41 @@ void PairReaxCOMP::compute(int eflag, int vflag) { double evdwl,ecoul; double t_start, t_end; - + // communicate num_bonds once every reneighboring // 2 num arrays stored by fix, grab ptr to them - + if (neighbor->ago == 0) comm->forward_comm_fix(fix_reax); int *num_bonds = fix_reax->num_bonds; int *num_hbonds = fix_reax->num_hbonds; - + evdwl = ecoul = 0.0; if (eflag || vflag) ev_setup(eflag,vflag); else ev_unset(); - + if (vflag_global) control->virial = 1; else control->virial = 0; - + system->n = atom->nlocal; // my atoms system->N = atom->nlocal + atom->nghost; // mine + ghosts system->bigN = static_cast (atom->natoms); // all atoms in the system - + system->big_box.V = 0; system->big_box.box_norms[0] = 0; system->big_box.box_norms[1] = 0; system->big_box.box_norms[2] = 0; if( comm->me == 0 ) t_start = MPI_Wtime(); // setup data structures - + setup(); - + Reset( system, control, data, workspace, &lists, world ); - + // Why not update workspace like in MPI-only code? - // Using the MPI-only way messes up the hb energy + // Using the MPI-only way messes up the hb energy //workspace->realloc.num_far = write_reax_lists(); write_reax_lists(); - + // timing for filling in the reax lists if( comm->me == 0 ) { t_end = MPI_Wtime(); @@ -192,7 +192,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) } // forces - + #ifdef OMP_TIMING double startTimeBase,endTimeBase; startTimeBase = MPI_Wtime(); @@ -200,20 +200,20 @@ void PairReaxCOMP::compute(int eflag, int vflag) Compute_ForcesOMP(system,control,data,workspace,&lists,out_control,mpi_data); read_reax_forces(vflag); - + #ifdef OMP_TIMING endTimeBase = MPI_Wtime(); ompTimingData[COMPUTEINDEX] += (endTimeBase-startTimeBase); #endif - + #pragma omp parallel for schedule(static) for(int k = 0; k < system->N; ++k) { num_bonds[k] = system->my_atoms[k].num_bonds; num_hbonds[k] = system->my_atoms[k].num_hbonds; } - + // energies and pressure - + if (eflag_global) { evdwl += data->my_en.e_bond; evdwl += data->my_en.e_ov; @@ -226,13 +226,13 @@ void PairReaxCOMP::compute(int eflag, int vflag) evdwl += data->my_en.e_tor; evdwl += data->my_en.e_con; evdwl += data->my_en.e_vdW; - + ecoul += data->my_en.e_ele; ecoul += data->my_en.e_pol; - + // Store the different parts of the energy // in a list for output by compute pair command - + pvector[0] = data->my_en.e_bond; pvector[1] = data->my_en.e_ov + data->my_en.e_un; pvector[2] = data->my_en.e_lp; @@ -250,16 +250,16 @@ void PairReaxCOMP::compute(int eflag, int vflag) } if (vflag_fdotr) virial_fdotr_compute(); - + // Set internal timestep counter to that of LAMMPS - + data->step = update->ntimestep; Output_Results( system, control, data, &lists, out_control, mpi_data ); - + // populate tmpid and tmpbo arrays for fix reax/c/species int i, j; - + if(fixspecies_flag) { if (system->N > nmax) { memory->destroy(tmpid); @@ -268,14 +268,14 @@ void PairReaxCOMP::compute(int eflag, int vflag) memory->create(tmpid,nmax,MAXSPECBOND,"pair:tmpid"); memory->create(tmpbo,nmax,MAXSPECBOND,"pair:tmpbo"); } - + #pragma omp parallel for collapse(2) schedule(static) default(shared) for (i = 0; i < system->N; i ++) for (j = 0; j < MAXSPECBOND; j ++) { tmpbo[i][j] = 0.0; tmpid[i][j] = 0; } - + FindBond(); } } @@ -284,7 +284,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) void PairReaxCOMP::init_style( ) { - if (!atom->q_flag) + if (!atom->q_flag) error->all(FLERR,"Pair reax/c/omp requires atom attribute q"); // firstwarn = 1; @@ -330,7 +330,7 @@ void PairReaxCOMP::init_style( ) fix_reax = (FixReaxC *) modify->fix[modify->nfix-1]; } -#pragma omp parallel +#pragma omp parallel { control->nthreads = omp_get_num_threads(); } } @@ -397,11 +397,11 @@ void PairReaxCOMP::setup( ) for(int k = oldN; k < system->N; ++k) Set_End_Index( k, Start_Index( k, lists+BONDS ), lists+BONDS ); - + // estimate far neighbor list size // Not present in MPI-only version workspace->realloc.num_far = estimate_reax_lists(); - + // check if I need to shrink/extend my data-structs ReAllocate( system, control, data, workspace, &lists, mpi_data ); @@ -414,10 +414,10 @@ void PairReaxCOMP::write_reax_atoms() { int *num_bonds = fix_reax->num_bonds; int *num_hbonds = fix_reax->num_hbonds; - + if (system->N > system->total_cap) error->all(FLERR,"Too many ghost atoms"); - + #pragma omp parallel for schedule(static) default(shared) for( int i = 0; i < system->N; ++i ){ system->my_atoms[i].orig_id = atom->tag[i]; @@ -435,28 +435,28 @@ void PairReaxCOMP::write_reax_atoms() int PairReaxCOMP::estimate_reax_lists() { - int i; + int i; int *ilist = list->ilist; int *numneigh = list->numneigh; int numall = list->inum + list->gnum; int mincap = system->mincap; - + // for good performance in the OpenMP implementation, each thread needs // to know where to place the neighbors of the atoms it is responsible for. // The sumscan values for the list->numneigh will be used to determine the - // neighbor offset of each atom. Note that this may cause some significant - // memory overhead if delayed neighboring is used - so it may be desirable + // neighbor offset of each atom. Note that this may cause some significant + // memory overhead if delayed neighboring is used - so it may be desirable // to work on this part to reduce the memory footprint of the far_nbrs list. - + int num_nbrs = 0; - + for (int itr_i = 0; itr_i < numall; ++itr_i) { i = ilist[itr_i]; num_nbrs += numneigh[i]; } - + int new_estimate = MAX (num_nbrs, mincap*MIN_NBRS); - + return new_estimate; } @@ -473,51 +473,51 @@ int PairReaxCOMP::write_reax_lists() int *jlist; double d_sqr, dist, cutoff_sqr; rvec dvec; - + double **x = atom->x; int *ilist = list->ilist; int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; reax_list *far_nbrs = lists + FAR_NBRS; far_neighbor_data *far_list = far_nbrs->select.far_nbr_list; - + int num_nbrs = 0; int inum = list->inum; int gnum = list->gnum; int numall = inum + gnum; - + // sumscan of the number of neighbors per atom to determine the offsets // most likely, we are overallocating. desirable to work on this part // to reduce the memory footprint of the far_nbrs list. - + num_nbrs = 0; - + for (itr_i = 0; itr_i < numall; ++itr_i) { i = ilist[itr_i]; num_nbrs_offset[i] = num_nbrs; num_nbrs += numneigh[i]; } -//#pragma omp parallel for schedule(guided) default(shared) +//#pragma omp parallel for schedule(guided) default(shared) #pragma omp parallel for schedule(dynamic,50) default(shared) \ private(itr_i, itr_j, i, j, jlist, cutoff_sqr, num_mynbrs, d_sqr, dvec, dist) for (itr_i = 0; itr_i < numall; ++itr_i) { i = ilist[itr_i]; jlist = firstneigh[i]; Set_Start_Index( i, num_nbrs_offset[i], far_nbrs ); - - if (i < inum) + + if (i < inum) cutoff_sqr = control->nonb_cut*control->nonb_cut; - else - cutoff_sqr = control->bond_cut*control->bond_cut; - + else + cutoff_sqr = control->bond_cut*control->bond_cut; + num_mynbrs = 0; - + for (itr_j = 0; itr_j < numneigh[i]; ++itr_j) { j = jlist[itr_j]; j &= NEIGHMASK; get_distance( x[j], x[i], &d_sqr, &dvec ); - + if (d_sqr <= cutoff_sqr) { dist = sqrt( d_sqr ); set_far_nbr( &far_list[num_nbrs_offset[i] + num_mynbrs], j, dist, dvec ); @@ -531,7 +531,7 @@ int PairReaxCOMP::write_reax_lists() endTimeBase = MPI_Wtime(); ompTimingData[COMPUTEWLINDEX] += (endTimeBase-startTimeBase); #endif - + return num_nbrs; } diff --git a/src/USER-OMP/pair_reaxc_omp.h b/src/USER-OMP/pair_reaxc_omp.h index 5d5c7e145b..a5e077c309 100644 --- a/src/USER-OMP/pair_reaxc_omp.h +++ b/src/USER-OMP/pair_reaxc_omp.h @@ -47,40 +47,40 @@ class PairReaxCOMP : public PairReaxC, public ThrOMP { return fix; }; - inline void ev_setup_thr_proxy(int eflagparm, int vflagparm, int nallparm, + inline void ev_setup_thr_proxy(int eflagparm, int vflagparm, int nallparm, double *eatomparm, double **vatomparm, ThrData *thrparm) { ev_setup_thr(eflagparm, vflagparm, nallparm, eatomparm, vatomparm, thrparm); }; - + // reduce per thread data as needed - inline void reduce_thr_proxy(void * const styleparm, const int eflagparm, + inline void reduce_thr_proxy(void * const styleparm, const int eflagparm, const int vflagparm, ThrData * const thrparm) { reduce_thr(styleparm, eflagparm, vflagparm, thrparm); } - inline void ev_tally_thr_proxy(Pair * const pairparm, const int iparm, const int jparm, - const int nlocalparm, const int newton_pairparm, + inline void ev_tally_thr_proxy(Pair * const pairparm, const int iparm, const int jparm, + const int nlocalparm, const int newton_pairparm, const double evdwlparm, const double ecoulparm, - const double fpairparm, const double delxparm, - const double delyparm, const double delzparm, + const double fpairparm, const double delxparm, + const double delyparm, const double delzparm, ThrData * const thrparm) { - ev_tally_thr(pairparm, iparm, jparm, nlocalparm, newton_pairparm, + ev_tally_thr(pairparm, iparm, jparm, nlocalparm, newton_pairparm, evdwlparm, ecoulparm, fpairparm, delxparm, delyparm, delzparm, thrparm); } - inline void ev_tally_xyz_thr_proxy(Pair * const pairparm, const int iparm, const int jparm, - const int nlocalparm, const int newton_pairparm, - const double evdwlparm, const double ecoulparm, + inline void ev_tally_xyz_thr_proxy(Pair * const pairparm, const int iparm, const int jparm, + const int nlocalparm, const int newton_pairparm, + const double evdwlparm, const double ecoulparm, const double fxparm, const double fyparm, const double fzparm, - const double delxparm, const double delyparm, + const double delxparm, const double delyparm, const double delzparm, ThrData * const thrparm) { - ev_tally_xyz_thr(pairparm, iparm, jparm, nlocalparm, newton_pairparm, - evdwlparm, ecoulparm, fxparm, fyparm, fzparm, + ev_tally_xyz_thr(pairparm, iparm, jparm, nlocalparm, newton_pairparm, + evdwlparm, ecoulparm, fxparm, fyparm, fzparm, delxparm, delyparm, delzparm, thrparm); } - - inline void ev_tally3_thr_proxy(Pair * const pairparm,int i, int j, int k, - double evdwl, double ecoul, double *fj, double *fk, + + inline void ev_tally3_thr_proxy(Pair * const pairparm,int i, int j, int k, + double evdwl, double ecoul, double *fj, double *fk, double *drji, double *drki, ThrData * const thrparm) { ev_tally3_thr(pairparm, i, j, k, evdwl, ecoul, fj, fk, drji, drki, thrparm); } diff --git a/src/USER-OMP/reaxc_bond_orders_omp.cpp b/src/USER-OMP/reaxc_bond_orders_omp.cpp index 1d32cbd34f..aaa311640e 100644 --- a/src/USER-OMP/reaxc_bond_orders_omp.cpp +++ b/src/USER-OMP/reaxc_bond_orders_omp.cpp @@ -44,11 +44,11 @@ void Add_dBond_to_ForcesOMP( reax_system *system, int i, int pj, int pk, k, j; PairReaxCOMP *pair_reax_ptr = static_cast(system->pair_ptr); - + int tid = omp_get_thread_num(); ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); long reductionOffset = (system->N * tid); - + /* Virial Tallying variables */ double f_scaler; rvec fi_tmp, fj_tmp, fk_tmp, delij, delji, delki, delkj, temp; @@ -154,7 +154,7 @@ void Add_dBond_to_ForcesOMP( reax_system *system, int i, int pj, for( pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk ) { nbr_k = &(bonds->select.bond_list[pk]); k = nbr_k->nbr; - + // rvec_Scale( temp, -coef.C2dbo, nbr_k->bo_data.dBOp); // rvec_ScaledAdd( temp, -coef.C2dDelta, nbr_k->bo_data.dBOp); // rvec_ScaledAdd( temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); @@ -179,12 +179,12 @@ void Add_dBond_to_ForcesOMP( reax_system *system, int i, int pj, delkj[0],delkj[1],delkj[2],thr); } } - + // forces on k: j neighbor for( pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk ) { nbr_k = &(bonds->select.bond_list[pk]); k = nbr_k->nbr; - + // rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); // rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp); // rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); @@ -202,7 +202,7 @@ void Add_dBond_to_ForcesOMP( reax_system *system, int i, int pj, pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, fk_tmp[0],fk_tmp[1],fk_tmp[2], delki[0],delki[1],delki[2],thr); - + rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, @@ -357,7 +357,7 @@ int BOp_OMP( storage *workspace, reax_list *bonds, double bo_cut, /****** bonds i-j and j-i ******/ ibond = &( bonds->select.bond_list[btop_i] ); jbond = &( bonds->select.bond_list[btop_j] ); - + ibond->nbr = j; jbond->nbr = i; ibond->d = nbr_pj->d; @@ -370,19 +370,19 @@ int BOp_OMP( storage *workspace, reax_list *bonds, double bo_cut, jbond->dbond_index = btop_i; ibond->sym_index = btop_j; jbond->sym_index = btop_i; - + bo_ij = &( ibond->bo_data ); bo_ji = &( jbond->bo_data ); bo_ji->BO = bo_ij->BO = BO; bo_ji->BO_s = bo_ij->BO_s = BO_s; bo_ji->BO_pi = bo_ij->BO_pi = BO_pi; bo_ji->BO_pi2 = bo_ij->BO_pi2 = BO_pi2; - + /* Bond Order page2-3, derivative of total bond order prime */ Cln_BOp_s = twbp->p_bo2 * C12 * rr2; Cln_BOp_pi = twbp->p_bo4 * C34 * rr2; Cln_BOp_pi2 = twbp->p_bo6 * C56 * rr2; - + /* Only dln_BOp_xx wrt. dr_i is stored here, note that dln_BOp_xx/dr_i = -dln_BOp_xx/dr_j and all others are 0 */ rvec_Scale(bo_ij->dln_BOp_s,-bo_ij->BO_s*Cln_BOp_s,ibond->dvec); @@ -392,34 +392,34 @@ int BOp_OMP( storage *workspace, reax_list *bonds, double bo_cut, rvec_Scale(bo_ji->dln_BOp_s, -1., bo_ij->dln_BOp_s); rvec_Scale(bo_ji->dln_BOp_pi, -1., bo_ij->dln_BOp_pi ); rvec_Scale(bo_ji->dln_BOp_pi2, -1., bo_ij->dln_BOp_pi2 ); - + rvec_Scale( bo_ij->dBOp, -(bo_ij->BO_s * Cln_BOp_s + bo_ij->BO_pi * Cln_BOp_pi + bo_ij->BO_pi2 * Cln_BOp_pi2), ibond->dvec ); rvec_Scale( bo_ji->dBOp, -1., bo_ij->dBOp ); - + bo_ij->BO_s -= bo_cut; bo_ij->BO -= bo_cut; bo_ji->BO_s -= bo_cut; bo_ji->BO -= bo_cut; - + bo_ij->Cdbo = bo_ij->Cdbopi = bo_ij->Cdbopi2 = 0.0; bo_ji->Cdbo = bo_ji->Cdbopi = bo_ji->Cdbopi2 = 0.0; - + return 1; } /* ---------------------------------------------------------------------- */ void BOOMP( reax_system *system, control_params *control, simulation_data *data, - storage *workspace, reax_list **lists, output_controls *out_control ) + storage *workspace, reax_list **lists, output_controls *out_control ) { #ifdef OMP_TIMING double endTimeBase, startTimeBase; startTimeBase = MPI_Wtime(); #endif - + double p_lp1 = system->reax_param.gp.l[15]; int num_bonds = 0; double p_boc1 = system->reax_param.gp.l[0]; @@ -427,7 +427,7 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, reax_list *bonds = (*lists) + BONDS; int natoms = system->N; int nthreads = control->nthreads; - + #pragma omp parallel default(shared) { int i, j, pj, type_i, type_j; @@ -442,9 +442,9 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, single_body_parameters *sbp_i, *sbp_j; two_body_parameters *twbp; bond_order_data *bo_ij, *bo_ji; - + int tid = omp_get_thread_num(); - + /* Calculate Deltaprime, Deltaprime_boc values */ #pragma omp for schedule(static) for (i = 0; i < system->N; ++i) { @@ -460,7 +460,7 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, // Wait till initialization complete #pragma omp barrier - + /* Corrected Bond Order calculations */ //#pragma omp for schedule(dynamic,50) #pragma omp for schedule(guided) @@ -473,7 +473,7 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, Deltap_boc_i = workspace->Deltap_boc[i]; start_i = Start_Index(i, bonds); end_i = End_Index(i, bonds); - + for (pj = start_i; pj < end_i; ++pj) { j = bonds->select.bond_list[pj].nbr; type_j = system->my_atoms[j].type; @@ -487,23 +487,23 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, bo_ij->C1dbo = 1.000000; bo_ij->C2dbo = 0.000000; bo_ij->C3dbo = 0.000000; - + bo_ij->C1dbopi = bo_ij->BO_pi; bo_ij->C2dbopi = 0.000000; bo_ij->C3dbopi = 0.000000; bo_ij->C4dbopi = 0.000000; - + bo_ij->C1dbopi2 = bo_ij->BO_pi2; bo_ij->C2dbopi2 = 0.000000; bo_ij->C3dbopi2 = 0.000000; bo_ij->C4dbopi2 = 0.000000; - + } else { val_j = system->reax_param.sbp[type_j].valency; Deltap_j = workspace->Deltap[j]; Deltap_boc_j = workspace->Deltap_boc[j]; - + /* on page 1 */ if( twbp->ovc >= 0.001 ) { /* Correction for overcoordination */ @@ -511,12 +511,12 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, exp_p2i = exp( -p_boc2 * Deltap_i ); exp_p1j = exp( -p_boc1 * Deltap_j ); exp_p2j = exp( -p_boc2 * Deltap_j ); - + f2 = exp_p1i + exp_p1j; f3 = -1.0 / p_boc2 * log( 0.5 * ( exp_p2i + exp_p2j ) ); f1 = 0.5 * ( ( val_i + f2 )/( val_i + f2 + f3 ) + ( val_j + f2 )/( val_j + f2 + f3 ) ); - + /* Now come the derivates */ /* Bond Order pages 5-7, derivative of f1 */ temp = f2 + f3; @@ -526,7 +526,7 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, 1.0 / SQR( u1_ji )); Cf1B_ij = -0.5 * (( u1_ij - f3 ) / SQR( u1_ij ) + ( u1_ji - f3 ) / SQR( u1_ji )); - + Cf1_ij = 0.50 * ( -p_boc1 * exp_p1i / u1_ij - ((val_i+f2) / SQR(u1_ij)) * ( -p_boc1 * exp_p1i + @@ -535,8 +535,8 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, ((val_j+f2) / SQR(u1_ji)) * ( -p_boc1 * exp_p1i + exp_p2i / ( exp_p2i + exp_p2j ) )); - - + + Cf1_ji = -Cf1A_ij * p_boc1 * exp_p1j + Cf1B_ij * exp_p2j / ( exp_p2i + exp_p2j ); } @@ -552,11 +552,11 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, Deltap_boc_i) * twbp->p_boc3 + twbp->p_boc5); exp_f5 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - Deltap_boc_j) * twbp->p_boc3 + twbp->p_boc5); - + f4 = 1. / (1. + exp_f4); f5 = 1. / (1. + exp_f5); f4f5 = f4 * f5; - + /* Bond Order pages 8-9, derivative of f4 and f5 */ Cf45_ij = -f4 * exp_f4; Cf45_ji = -f5 * exp_f5; @@ -565,7 +565,7 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, f4 = f5 = f4f5 = 1.0; Cf45_ij = Cf45_ji = 0.0; } - + /* Bond Order page 10, derivative of total bond order */ A0_ij = f1 * f4f5; A1_ij = -2 * twbp->p_boc3 * twbp->p_boc4 * bo_ij->BO * @@ -574,28 +574,28 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, A2_ji = Cf1_ji / f1 + twbp->p_boc3 * Cf45_ji; A3_ij = A2_ij + Cf1_ij / f1; A3_ji = A2_ji + Cf1_ji / f1; - + /* find corrected bond orders and their derivative coef */ bo_ij->BO = bo_ij->BO * A0_ij; bo_ij->BO_pi = bo_ij->BO_pi * A0_ij *f1; bo_ij->BO_pi2= bo_ij->BO_pi2* A0_ij *f1; bo_ij->BO_s = bo_ij->BO - ( bo_ij->BO_pi + bo_ij->BO_pi2 ); - + bo_ij->C1dbo = A0_ij + bo_ij->BO * A1_ij; bo_ij->C2dbo = bo_ij->BO * A2_ij; bo_ij->C3dbo = bo_ij->BO * A2_ji; - + bo_ij->C1dbopi = f1*f1*f4*f5; bo_ij->C2dbopi = bo_ij->BO_pi * A1_ij; bo_ij->C3dbopi = bo_ij->BO_pi * A3_ij; bo_ij->C4dbopi = bo_ij->BO_pi * A3_ji; - + bo_ij->C1dbopi2 = f1*f1*f4*f5; bo_ij->C2dbopi2 = bo_ij->BO_pi2 * A1_ij; bo_ij->C3dbopi2 = bo_ij->BO_pi2 * A3_ij; bo_ij->C4dbopi2 = bo_ij->BO_pi2 * A3_ji; } - + /* neglect bonds that are < 1e-10 */ if( bo_ij->BO < 1e-10 ) bo_ij->BO = 0.0; @@ -605,7 +605,7 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, bo_ij->BO_pi = 0.0; if( bo_ij->BO_pi2 < 1e-10 ) bo_ij->BO_pi2 = 0.0; - + workspace->total_bond_order[i] += bo_ij->BO; //now keeps total_BO } // else { @@ -617,11 +617,11 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, // bo_ij->BO_s = bo_ji->BO_s; // bo_ij->BO_pi = bo_ji->BO_pi; // bo_ij->BO_pi2 = bo_ji->BO_pi2; - + // workspace->total_bond_order[i] += bo_ij->BO;// now keeps total_BO // } } - + } // Wait for bo_ij to be updated @@ -635,7 +635,7 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, if(type_i < 0) continue; start_i = Start_Index(i, bonds); end_i = End_Index(i, bonds); - + for (pj = start_i; pj < end_i; ++pj) { j = bonds->select.bond_list[pj].nbr; type_j = system->my_atoms[j].type; @@ -647,25 +647,25 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, /* We only need to update bond orders from bo_ji everything else is set in uncorrected_bo calculations */ sym_index = bonds->select.bond_list[pj].sym_index; - + bo_ij = &( bonds->select.bond_list[pj].bo_data ); bo_ji = &(bonds->select.bond_list[ sym_index ].bo_data); bo_ij->BO = bo_ji->BO; bo_ij->BO_s = bo_ji->BO_s; bo_ij->BO_pi = bo_ji->BO_pi; bo_ij->BO_pi2 = bo_ji->BO_pi2; - + workspace->total_bond_order[i] += bo_ij->BO;// now keeps total_BO } } - + } /*-------------------------*/ - + // Need to wait for total_bond_order to be accumulated. #pragma omp barrier - + /* Calculate some helper variables that are used at many places throughout force calculations */ #pragma omp for schedule(guided) @@ -673,14 +673,14 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, type_j = system->my_atoms[j].type; if(type_j < 0) continue; sbp_j = &(system->reax_param.sbp[ type_j ]); - + workspace->Delta[j] = workspace->total_bond_order[j] - sbp_j->valency; workspace->Delta_e[j] = workspace->total_bond_order[j] - sbp_j->valency_e; workspace->Delta_boc[j] = workspace->total_bond_order[j] - sbp_j->valency_boc; workspace->Delta_val[j] = workspace->total_bond_order[j] - sbp_j->valency_val; - + workspace->vlpex[j] = workspace->Delta_e[j] - 2.0 * (int)(workspace->Delta_e[j]/2.0); explp1 = exp(-p_lp1 * SQR(2.0 + workspace->vlpex[j])); @@ -688,7 +688,7 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, workspace->Delta_lp[j] = sbp_j->nlp_opt - workspace->nlp[j]; workspace->Clp[j] = 2.0 * p_lp1 * explp1 * (2.0 + workspace->vlpex[j]); workspace->dDelta_lp[j] = workspace->Clp[j]; - + if( sbp_j->mass > 21.0 ) { workspace->nlp_temp[j] = 0.5 * (sbp_j->valency_e - sbp_j->valency); workspace->Delta_lp_temp[j] = sbp_j->nlp_opt - workspace->nlp_temp[j]; @@ -700,7 +700,7 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, workspace->dDelta_lp_temp[j] = workspace->Clp[j]; } } - + } // parallel region #ifdef OMP_TIMING diff --git a/src/USER-OMP/reaxc_bonds_omp.cpp b/src/USER-OMP/reaxc_bonds_omp.cpp index 4dc666b3ee..19433ce2e3 100644 --- a/src/USER-OMP/reaxc_bonds_omp.cpp +++ b/src/USER-OMP/reaxc_bonds_omp.cpp @@ -45,7 +45,7 @@ void BondsOMP( reax_system *system, control_params *control, double endTimeBase, startTimeBase; startTimeBase = MPI_Wtime(); #endif - + int natoms = system->n; int nthreads = control->nthreads; reax_list *bonds = (*lists) + BONDS; @@ -57,7 +57,7 @@ void BondsOMP( reax_system *system, control_params *control, double total_Ebond = 0.0; #pragma omp parallel default(shared) reduction(+: total_Ebond) - { + { int i, j, pj; int start_i, end_i; int type_i, type_j; @@ -70,31 +70,31 @@ void BondsOMP( reax_system *system, control_params *control, bond_order_data *bo_ij; int tid = omp_get_thread_num(); long reductionOffset = (system->N * tid); - + class PairReaxCOMP *pair_reax_ptr; pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - - pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, - system->pair_ptr->vflag_either, natoms, + + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, natoms, system->pair_ptr->eatom, system->pair_ptr->vatom, thr); - + #pragma omp for schedule(guided) for (i = 0; i < natoms; ++i) { start_i = Start_Index(i, bonds); end_i = End_Index(i, bonds); - + for (pj = start_i; pj < end_i; ++pj) { j = bonds->select.bond_list[pj].nbr; - + if( system->my_atoms[i].orig_id > system->my_atoms[j].orig_id ) continue; if( system->my_atoms[i].orig_id == system->my_atoms[j].orig_id ) { if (system->my_atoms[j].x[2] < system->my_atoms[i].x[2]) continue; - if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && + if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && system->my_atoms[j].x[1] < system->my_atoms[i].x[1]) continue; - if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && - system->my_atoms[j].x[1] == system->my_atoms[i].x[1] && + if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && + system->my_atoms[j].x[1] == system->my_atoms[i].x[1] && system->my_atoms[j].x[0] < system->my_atoms[i].x[0]) continue; } @@ -105,29 +105,29 @@ void BondsOMP( reax_system *system, control_params *control, sbp_j = &( system->reax_param.sbp[type_j] ); twbp = &( system->reax_param.tbp[type_i][type_j] ); bo_ij = &( bonds->select.bond_list[pj].bo_data ); - + /* calculate the constants */ pow_BOs_be2 = pow( bo_ij->BO_s, twbp->p_be2 ); exp_be12 = exp( twbp->p_be1 * ( 1.0 - pow_BOs_be2 ) ); CEbo = -twbp->De_s * exp_be12 * ( 1.0 - twbp->p_be1 * twbp->p_be2 * pow_BOs_be2 ); - - /* calculate the Bond Energy */ + + /* calculate the Bond Energy */ total_Ebond += ebond = -twbp->De_s * bo_ij->BO_s * exp_be12 -twbp->De_p * bo_ij->BO_pi -twbp->De_pp * bo_ij->BO_pi2; - + /* tally into per-atom energy */ if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, ebond, 0.0, 0.0, 0.0, 0.0, 0.0, thr); - + /* calculate derivatives of Bond Orders */ bo_ij->Cdbo += CEbo; bo_ij->Cdbopi -= (CEbo + twbp->De_p); bo_ij->Cdbopi2 -= (CEbo + twbp->De_pp); - + /* Stabilisation terminal triple bond */ if (bo_ij->BO >= 1.00) { if (gp37 == 2 || @@ -138,22 +138,22 @@ void BondsOMP( reax_system *system, control_params *control, exphub1 = exp(-gp3 * (workspace->total_bond_order[j]-bo_ij->BO)); exphuov = exp(gp4 * (workspace->Delta[i] + workspace->Delta[j])); hulpov = 1.0 / (1.0 + 25.0 * exphuov); - + estriph = gp10 * exphu * hulpov * (exphua1 + exphub1); total_Ebond += estriph; - + decobdbo = gp10 * exphu * hulpov * (exphua1 + exphub1) * ( gp3 - 2.0 * gp7 * (bo_ij->BO-2.50) ); decobdboua = -gp10 * exphu * hulpov * (gp3*exphua1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); decobdboub = -gp10 * exphu * hulpov * (gp3*exphub1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); - + /* tally into per-atom energy */ if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, estriph, 0.0, 0.0, 0.0, 0.0, 0.0, thr); - + bo_ij->Cdbo += decobdbo; workspace->CdDelta[i] += decobdboua; workspace->CdDeltaReduction[reductionOffset+j] += decobdboub; @@ -163,12 +163,12 @@ void BondsOMP( reax_system *system, control_params *control, } // for(i) } // omp - + data->my_en.e_bond += total_Ebond; - + #ifdef OMP_TIMING endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEBONDSINDEX] += (endTimeBase-startTimeBase); + ompTimingData[COMPUTEBONDSINDEX] += (endTimeBase-startTimeBase); #endif } diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index 1bf04129e0..47e439a3f7 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -77,7 +77,7 @@ void Compute_Bonded_ForcesOMP( reax_system *system, control_params *control, MPI_Comm comm ) { int i; - + #ifdef OMP_TIMING double startTimeBase, endTimeBase; startTimeBase = MPI_Wtime(); @@ -114,7 +114,7 @@ void Compute_NonBonded_ForcesOMP( reax_system *system, control_params *control, else Tabulated_vdW_Coulomb_Energy_OMP( system, control, data, workspace, lists, out_control ); - + #ifdef OMP_TIMING endTimeBase = MPI_Wtime(); ompTimingData[COMPUTENBFINDEX] += (endTimeBase-startTimeBase); @@ -129,48 +129,48 @@ void Compute_NonBonded_ForcesOMP( reax_system *system, control_params *control, void Compute_Total_ForceOMP( reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, mpi_datatypes *mpi_data ) -{ +{ #ifdef OMP_TIMING double startTimeBase,endTimeBase; startTimeBase = MPI_Wtime(); #endif - + int natoms = system->N; int nthreads = control->nthreads; - long totalReductionSize = system->N * nthreads; + long totalReductionSize = system->N * nthreads; reax_list *bonds = (*lists) + BONDS; - -#pragma omp parallel default(shared) //default(none) + +#pragma omp parallel default(shared) //default(none) { int i, j, k, pj, pk, start_j, end_j; int tid = omp_get_thread_num(); bond_order_data *bo_jk; - + class PairReaxCOMP *pair_reax_ptr; pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - - pair_reax_ptr->ev_setup_thr_proxy(0, 1, natoms, system->pair_ptr->eatom, + + pair_reax_ptr->ev_setup_thr_proxy(0, 1, natoms, system->pair_ptr->eatom, system->pair_ptr->vatom, thr); - + #pragma omp for schedule(guided) for (i = 0; i < system->N; ++i) { for (j = 0; j < nthreads; ++j) workspace->CdDelta[i] += workspace->CdDeltaReduction[system->N*j+i]; } - + #pragma omp for schedule(dynamic,50) for (j = 0; j < system->N; ++j) { start_j = Start_Index(j, bonds); end_j = End_Index(j, bonds); - + for (pk = start_j; pk < end_j; ++pk) { bo_jk = &( bonds->select.bond_list[pk].bo_data ); for (k = 0; k < nthreads; ++k) bo_jk->Cdbo += bo_jk->CdboReduction[k]; } } - + // #pragma omp for schedule(guided) //(dynamic,50) // for (i = 0; i < system->N; ++i) // for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) @@ -188,7 +188,7 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, const int startj = Start_Index(i, bonds); const int endj = End_Index(i, bonds); for (pj = startj; pj < endj; ++pj) - if (i < bonds->select.bond_list[pj].nbr) + if (i < bonds->select.bond_list[pj].nbr) Add_dBond_to_ForcesOMP( system, i, pj, workspace, lists ); } @@ -199,7 +199,7 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, const int startj = Start_Index(i, bonds); const int endj = End_Index(i, bonds); for (pj = startj; pj < endj; ++pj) - if (i < bonds->select.bond_list[pj].nbr) + if (i < bonds->select.bond_list[pj].nbr) Add_dBond_to_Forces_NPTOMP(system, i, pj, data, workspace, lists ); } @@ -213,8 +213,8 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, rvec_Add( workspace->f[i], workspace->forceReduction[system->N*j+i] ); } - -#pragma omp for schedule(guided) + +#pragma omp for schedule(guided) for (i = 0; i < totalReductionSize; i++) { workspace->forceReduction[i][0] = 0; workspace->forceReduction[i][1] = 0; @@ -222,7 +222,7 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, workspace->CdDeltaReduction[i] = 0; } } // parallel region - + if (control->virial) for (int i=0; i < nthreads; ++i) { rvec_Add(data->my_ext_press, workspace->my_ext_pressReduction[i]); @@ -249,7 +249,7 @@ void Validate_ListsOMP( reax_system *system, storage *workspace, reax_list **lis #pragma omp parallel default(shared) private(i, comp, Hindex) { - + /* bond list */ if( N > 0 ) { bonds = *lists + BONDS; @@ -269,8 +269,8 @@ void Validate_ListsOMP( reax_system *system, storage *workspace, reax_list **lis } } } - - + + /* hbonds list */ if( numH > 0 ) { hbonds = *lists + HBONDS; @@ -294,7 +294,7 @@ void Validate_ListsOMP( reax_system *system, storage *workspace, reax_list **lis } } } - + } // omp parallel } @@ -307,7 +307,7 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, double startTimeBase, endTimeBase; startTimeBase = MPI_Wtime(); #endif - + int i, j, pi, pj; int start_i, end_i, start_j, end_j; int type_i, type_j; @@ -338,7 +338,7 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, /* uncorrected bond orders */ cutoff = control->bond_cut; - + #pragma omp parallel default(shared) \ private(i, atom_i, type_i, pi, start_i, end_i, sbp_i, btop_i, ibond, ihb, ihb_top, \ j, atom_j, type_j, pj, start_j, end_j, sbp_j, nbr_pj, jbond, jhb, twbp) @@ -376,7 +376,7 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, // btop_i++; // Set_End_Index(i, btop_i, bonds); // } - + // } // Trying to minimize time spent in critical section by moving initial part of BOp() @@ -412,7 +412,7 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, if(BO >= bo_cut) { int btop_j; - + // Update indices in critical section #pragma omp critical { @@ -421,30 +421,30 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, Set_End_Index( j, btop_j+1, bonds ); Set_End_Index( i, btop_i+1, bonds ); } // omp critical - + // Finish remaining BOp() work BOp_OMP(workspace, bonds, bo_cut, i , btop_i, nbr_pj, sbp_i, sbp_j, twbp, btop_j, C12, C34, C56, BO, BO_s, BO_pi, BO_pi2); - + bond_data * ibond = &(bonds->select.bond_list[btop_i]); bond_order_data * bo_ij = &(ibond->bo_data); - + bond_data * jbond = &(bonds->select.bond_list[btop_j]); bond_order_data * bo_ji = &(jbond->bo_data); - + workspace->total_bond_order[i] += bo_ij->BO; tmp_bond_order[reductionOffset + j] += bo_ji->BO; - + rvec_Add(workspace->dDeltap_self[i], bo_ij->dBOp); rvec_Add(tmp_ddelta[reductionOffset + j], bo_ji->dBOp); - + btop_i++; num_bonds++; } // if(BO>=bo_cut) } // if(cutoff) - + } // for(pj) } // for(i) @@ -452,7 +452,7 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, #pragma omp barrier #pragma omp for schedule(dynamic,50) - for(i=0; iN; i++) + for(i=0; iN; i++) for(int t=0; tN + i; workspace->dDeltap_self[i][0] += tmp_ddelta[indx][0]; @@ -467,18 +467,18 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, // for (i = 0; i < system->N; ++i) { // start_i = Start_Index(i, bonds); // end_i = End_Index(i, bonds); - + // for (pi = start_i; pi < end_i; ++pi) { // ibond = &(bonds->select.bond_list[pi]); // j = ibond->nbr; - + // if (i < j) { // start_j = Start_Index(j, bonds); // end_j = End_Index(j, bonds); // for (pj = start_j; pj < end_j; ++pj) { // jbond = &(bonds->select.bond_list[pj]); - + // if (jbond->nbr == i) { // ibond->sym_index = pj; // jbond->sym_index = pi; @@ -488,13 +488,13 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, // } // } // } - + /* hydrogen bond list */ if (control->hbond_cut > 0) { cutoff = control->hbond_cut; -//#pragma omp for schedule(guided) reduction(+ : num_hbonds) -#pragma omp for schedule(dynamic,50) reduction(+ : num_hbonds) +//#pragma omp for schedule(guided) reduction(+ : num_hbonds) +#pragma omp for schedule(dynamic,50) reduction(+ : num_hbonds) for (i = 0; i < system->n; ++i) { atom_i = &(system->my_atoms[i]); type_i = atom_i->type; @@ -503,11 +503,11 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, #pragma omp critical { - + if (ihb == 1 || ihb == 2) { start_i = Start_Index(i, far_nbrs); end_i = End_Index(i, far_nbrs); - + for (pj = start_i; pj < end_i; ++pj) { nbr_pj = &( far_nbrs->select.far_nbr_list[pj] ); j = nbr_pj->nbr; @@ -520,12 +520,12 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, if (nbr_pj->d <= control->hbond_cut) { int iflag = 0; int jflag = 0; - + if(ihb==1 && jhb==2) iflag = 1; else if(jn && ihb == 2 && jhb == 1) jflag = 1; - + if(iflag || jflag) { - + // This critical section enforces H-bonds to be added by threads one at a time. // #pragma omp critical // { @@ -547,14 +547,14 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, hbonds->select.hbond_list[jhb_top].scl = -1; hbonds->select.hbond_list[jhb_top].ptr = nbr_pj; } - + num_hbonds++; } // if(iflag || jflag) } } } - + } // omp critical } @@ -592,8 +592,8 @@ void Compute_ForcesOMP( reax_system *system, control_params *control, { int qeq_flag; MPI_Comm comm = mpi_data->world; - - // Init Forces + + // Init Forces #if defined(LOG_PERFORMANCE) double t_start = 0; if( system->my_rank == MASTER_NODE ) @@ -602,13 +602,13 @@ void Compute_ForcesOMP( reax_system *system, control_params *control, Init_Forces_noQEq_OMP( system, control, data, workspace, lists, out_control, comm ); - + #if defined(LOG_PERFORMANCE) //MPI_Barrier( comm ); if( system->my_rank == MASTER_NODE ) Update_Timing_Info( &t_start, &(data->timing.init_forces) ); #endif - + // Bonded Interactions Compute_Bonded_ForcesOMP( system, control, data, workspace, lists, out_control, mpi_data->world ); @@ -617,19 +617,19 @@ void Compute_ForcesOMP( reax_system *system, control_params *control, if( system->my_rank == MASTER_NODE ) Update_Timing_Info( &t_start, &(data->timing.bonded) ); #endif - + // Nonbonded Interactions Compute_NonBonded_ForcesOMP( system, control, data, workspace, lists, out_control, mpi_data->world ); - + #if defined(LOG_PERFORMANCE) if( system->my_rank == MASTER_NODE ) Update_Timing_Info( &t_start, &(data->timing.nonb) ); #endif - + // Total Force Compute_Total_ForceOMP( system, control, data, workspace, lists, mpi_data ); - + #if defined(LOG_PERFORMANCE) if( system->my_rank == MASTER_NODE ) Update_Timing_Info( &t_start, &(data->timing.bonded) ); diff --git a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp index 5047e2775e..00ecb58de1 100644 --- a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp +++ b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp @@ -46,10 +46,10 @@ void Hydrogen_BondsOMP( reax_system *system, control_params *control, double endTimeBase, startTimeBase; startTimeBase = MPI_Wtime(); #endif - + const int nthreads = control->nthreads; long totalReductionSize = system->N; - + #pragma omp parallel default(shared) //default(none) { int i, j, k, pi, pk; @@ -92,11 +92,11 @@ void Hydrogen_BondsOMP( reax_system *system, control_params *control, class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, - system->pair_ptr->vflag_either, - natoms, system->pair_ptr->eatom, + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, + natoms, system->pair_ptr->eatom, system->pair_ptr->vatom, thr); - + /* loops below discover the Hydrogen bonds between i-j-k triplets. here j is H atom and there has to be some bond between i and j. Hydrogen bond is between j and k. @@ -113,7 +113,7 @@ void Hydrogen_BondsOMP( reax_system *system, control_params *control, hb_start_j = Start_Index( system->my_atoms[j].Hindex, hbonds ); hb_end_j = End_Index( system->my_atoms[j].Hindex, hbonds ); if(type_j < 0) continue; - + top = 0; for( pi = start_j; pi < end_j; ++pi ) { pbond_ij = &( bond_list[pi] ); @@ -230,8 +230,8 @@ void Hydrogen_BondsOMP( reax_system *system, control_params *control, { data->my_en.e_hb += e_hb_thr; } - - pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, + + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, system->pair_ptr->vflag_either, thr); } diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index 1584d5e53e..9e01280545 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -53,7 +53,7 @@ int Init_ListsOMP( reax_system *system, control_params *control, int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; int *hb_top, *bond_top; MPI_Comm comm; - + int TWICE = 2; int mincap = system->mincap; double safezone = system->safezone; @@ -96,9 +96,9 @@ int Init_ListsOMP( reax_system *system, control_params *control, int nthreads = control->nthreads; reax_list *bonds = (*lists)+BONDS; - + for (i = 0; i < bonds->num_intrs; ++i) - bonds->select.bond_list[i].bo_data.CdboReduction = + bonds->select.bond_list[i].bo_data.CdboReduction = (double*) smalloc(sizeof(double)*nthreads, "CdboReduction", comm); /* 3bodies list */ diff --git a/src/USER-OMP/reaxc_multi_body_omp.cpp b/src/USER-OMP/reaxc_multi_body_omp.cpp index a355ce8609..7922d7fd0d 100644 --- a/src/USER-OMP/reaxc_multi_body_omp.cpp +++ b/src/USER-OMP/reaxc_multi_body_omp.cpp @@ -45,7 +45,7 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, double endTimeBase, startTimeBase; startTimeBase = MPI_Wtime(); #endif - + /* Initialize parameters */ double p_lp1 = system->reax_param.gp.l[15]; double p_lp3 = system->reax_param.gp.l[5]; @@ -58,11 +58,11 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, int natoms = system->n; int nthreads = control->nthreads; reax_list *bonds = (*lists) + BONDS; - + double total_Elp = 0.0; double total_Eun = 0.0; double total_Eov = 0.0; - + #pragma omp parallel default(shared) reduction(+:total_Elp, total_Eun, total_Eov) { int i, j, pj, type_i, type_j; @@ -77,29 +77,29 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, double eng_tmp, f_tmp; double p_lp2, p_ovun2, p_ovun5; int numbonds; - + single_body_parameters *sbp_i, *sbp_j; two_body_parameters *twbp; bond_data *pbond; bond_order_data *bo_ij; - + int tid = omp_get_thread_num(); - + long reductionOffset = (system->N * tid); class PairReaxCOMP *pair_reax_ptr; pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - - pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, - system->pair_ptr->vflag_either, natoms, + + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, natoms, system->pair_ptr->eatom, system->pair_ptr->vatom, thr); - + #pragma omp for schedule(guided) for ( i = 0; i < system->n; ++i) { type_i = system->my_atoms[i].type; if(type_i < 0) continue; sbp_i = &(system->reax_param.sbp[ type_i ]); - + /* lone-pair Energy */ p_lp2 = sbp_i->p_lp2; expvd2 = exp( -75 * workspace->Delta_lp[i] ); @@ -111,21 +111,21 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, numbonds ++; /* calculate the energy */ - if(numbonds > 0) + if(numbonds > 0) total_Elp += e_lp = p_lp2 * workspace->Delta_lp[i] * inv_expvd2; - + dElp = p_lp2 * inv_expvd2 + 75 * p_lp2 * workspace->Delta_lp[i] * expvd2 * SQR(inv_expvd2); CElp = dElp * workspace->dDelta_lp[i]; - + if(numbonds > 0) workspace->CdDelta[i] += CElp; // lp - 1st term - + /* tally into per-atom energy */ if( system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, i, system->n, 1, + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, i, system->n, 1, e_lp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); - + /* correction for C2 */ if( p_lp3 > 0.001 && !strcmp(system->reax_param.sbp[type_i].name, "C") ) for( pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj ) { @@ -138,19 +138,19 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, bo_ij = &( bonds->select.bond_list[pj].bo_data ); Di = workspace->Delta[i]; vov3 = bo_ij->BO - Di - 0.040*pow(Di, 4.); - + if( vov3 > 3. ) { total_Elp += e_lph = p_lp3 * SQR(vov3-3.0); deahu2dbo = 2.*p_lp3*(vov3 - 3.); deahu2dsbo = 2.*p_lp3*(vov3 - 3.)*(-1. - 0.16*pow(Di, 3.)); - + bo_ij->Cdbo += deahu2dbo; workspace->CdDelta[i] += deahu2dsbo; - + /* tally into per-atom energy */ if( system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, system->n, 1, + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, system->n, 1, e_lph, 0.0, 0.0, 0.0, 0.0, 0.0, thr); } } @@ -163,12 +163,12 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, type_i = system->my_atoms[i].type; if(type_i < 0) continue; sbp_i = &(system->reax_param.sbp[ type_i ]); - + /* over-coordination energy */ if( sbp_i->mass > 21.0 ) dfvl = 0.0; else dfvl = 1.0; // only for 1st-row elements - + p_ovun2 = sbp_i->p_ovun2; sum_ovun1 = sum_ovun2 = 0; for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { @@ -177,20 +177,20 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, if(type_j < 0) continue; bo_ij = &(bonds->select.bond_list[pj].bo_data); twbp = &(system->reax_param.tbp[ type_i ][ type_j ]); - + sum_ovun1 += twbp->p_ovun1 * twbp->De_s * bo_ij->BO; sum_ovun2 += (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j])* ( bo_ij->BO_pi + bo_ij->BO_pi2 ); } - + exp_ovun1 = p_ovun3 * exp( p_ovun4 * sum_ovun2 ); inv_exp_ovun1 = 1.0 / (1 + exp_ovun1); Delta_lpcorr = workspace->Delta[i] - (dfvl * workspace->Delta_lp_temp[i]) * inv_exp_ovun1; - + exp_ovun2 = exp( p_ovun2 * Delta_lpcorr ); inv_exp_ovun2 = 1.0 / (1.0 + exp_ovun2); - + DlpVi = 1.0 / (Delta_lpcorr + sbp_i->valency + 1e-8); CEover1 = Delta_lpcorr * DlpVi * inv_exp_ovun2; @@ -198,17 +198,17 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, CEover2 = sum_ovun1 * DlpVi * inv_exp_ovun2 * (1.0 - Delta_lpcorr * ( DlpVi + p_ovun2 * exp_ovun2 * inv_exp_ovun2 )); - + CEover3 = CEover2 * (1.0 - dfvl * workspace->dDelta_lp[i] * inv_exp_ovun1 ); - + CEover4 = CEover2 * (dfvl * workspace->Delta_lp_temp[i]) * p_ovun4 * exp_ovun1 * SQR(inv_exp_ovun1); - - + + /* under-coordination potential */ p_ovun2 = sbp_i->p_ovun2; p_ovun5 = sbp_i->p_ovun5; - + exp_ovun2n = 1.0 / exp_ovun2; exp_ovun6 = exp( p_ovun6 * Delta_lpcorr ); exp_ovun8 = p_ovun7 * exp(p_ovun8 * sum_ovun2); @@ -222,7 +222,7 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, if(numbonds > 0) total_Eun += e_un = -p_ovun5 * (1.0 - exp_ovun6) * inv_exp_ovun2n * inv_exp_ovun8; - + CEunder1 = inv_exp_ovun2n * ( p_ovun5 * p_ovun6 * exp_ovun6 * inv_exp_ovun8 + p_ovun2 * e_un * exp_ovun2n ); @@ -230,15 +230,15 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, CEunder3 = CEunder1 * (1.0 - dfvl*workspace->dDelta_lp[i]*inv_exp_ovun1); CEunder4 = CEunder1 * (dfvl*workspace->Delta_lp_temp[i]) * p_ovun4 * exp_ovun1 * SQR(inv_exp_ovun1) + CEunder2; - + /* tally into per-atom energy */ if (system->pair_ptr->evflag) { eng_tmp = e_ov; if(numbonds > 0) eng_tmp+= e_un; - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, i, system->n, 1, + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, i, system->n, 1, eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); } - + /* forces */ workspace->CdDelta[i] += CEover3; // OvCoor - 2nd term if(numbonds > 0) workspace->CdDelta[i] += CEunder3; // UnCoor - 1st term @@ -249,35 +249,35 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, bo_ij = &(pbond->bo_data); twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] [system->my_atoms[pbond->nbr].type]); - + bo_ij->Cdbo += CEover1 * twbp->p_ovun1 * twbp->De_s; // OvCoor-1st - workspace->CdDeltaReduction[reductionOffset+j] += + workspace->CdDeltaReduction[reductionOffset+j] += CEover4 * (1.0 - dfvl*workspace->dDelta_lp[j]) * (bo_ij->BO_pi + bo_ij->BO_pi2); // OvCoor-3a - + bo_ij->Cdbopi += CEover4 * (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // OvCoor-3b bo_ij->Cdbopi2 += CEover4 * (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // OvCoor-3b - - workspace->CdDeltaReduction[reductionOffset+j] += + + workspace->CdDeltaReduction[reductionOffset+j] += CEunder4 * (1.0 - dfvl*workspace->dDelta_lp[j]) * (bo_ij->BO_pi + bo_ij->BO_pi2); // UnCoor - 2a - + bo_ij->Cdbopi += CEunder4 * (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // UnCoor-2b bo_ij->Cdbopi2 += CEunder4 * (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // UnCoor-2b } } - - pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, + + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, system->pair_ptr->vflag_either, thr); - + } - + data->my_en.e_lp += total_Elp; data->my_en.e_ov += total_Eov; data->my_en.e_un += total_Eun; - + #ifdef OMP_TIMING endTimeBase = MPI_Wtime(); ompTimingData[COMPUTEATOMENERGYINDEX] += (endTimeBase-startTimeBase); diff --git a/src/USER-OMP/reaxc_nonbonded_omp.cpp b/src/USER-OMP/reaxc_nonbonded_omp.cpp index 73dbc1dda4..583c02bd08 100644 --- a/src/USER-OMP/reaxc_nonbonded_omp.cpp +++ b/src/USER-OMP/reaxc_nonbonded_omp.cpp @@ -44,7 +44,7 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, output_controls *out_control ) { - int natoms = system->n; + int natoms = system->n; int nthreads = control->nthreads; long totalReductionSize = system->N * nthreads; reax_list *far_nbrs = (*lists) + FAR_NBRS; @@ -52,7 +52,7 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, double p_vdW1i = 1.0 / p_vdW1; double total_EvdW = 0.; double total_Eele = 0.; - + #pragma omp parallel default(shared) reduction(+: total_EvdW, total_Eele) //default(none) { int tid = omp_get_thread_num(); @@ -67,20 +67,20 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, rvec temp, ext_press; two_body_parameters *twbp; far_neighbor_data *nbr_pj; - + // Tallying variables: double pe_vdw, f_tmp, delij[3]; - + long reductionOffset = (system->N * tid); - + class PairReaxCOMP *pair_reax_ptr; pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - - pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, - system->pair_ptr->vflag_either, + + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, natoms, system->pair_ptr->eatom, - system->pair_ptr->vatom, thr); + system->pair_ptr->vatom, thr); e_core = 0; e_vdW = 0; e_vdW_thr = 0; @@ -94,12 +94,12 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, start_i = Start_Index(i, far_nbrs); end_i = End_Index(i, far_nbrs); orig_i = system->my_atoms[i].orig_id; - + for( pj = start_i; pj < end_i; ++pj ) { nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); j = nbr_pj->nbr; orig_j = system->my_atoms[j].orig_id; - + flag = 0; if(nbr_pj->d <= control->nonb_cut) { if(j < natoms) flag = 1; @@ -113,7 +113,7 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, } } } - + if (flag) { r_ij = nbr_pj->d; @@ -142,14 +142,14 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, { // shielding powr_vdW1 = pow(r_ij, p_vdW1); powgi_vdW1 = pow( 1.0 / twbp->gamma_w, p_vdW1); - + fn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i ); exp1 = exp( twbp->alpha * (1.0 - fn13 / twbp->r_vdW) ); exp2 = exp( 0.5 * twbp->alpha * (1.0 - fn13 / twbp->r_vdW) ); - + e_vdW = twbp->D * (exp1 - 2.0 * exp2); total_EvdW += Tap * e_vdW; - + dfn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i - 1.0) * pow(r_ij, p_vdW1 - 2.0); @@ -159,10 +159,10 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, else{ // no shielding exp1 = exp( twbp->alpha * (1.0 - r_ij / twbp->r_vdW) ); exp2 = exp( 0.5 * twbp->alpha * (1.0 - r_ij / twbp->r_vdW) ); - + e_vdW = twbp->D * (exp1 - 2.0 * exp2); total_EvdW += Tap * e_vdW; - + CEvd = dTap * e_vdW - Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) / r_ij; } @@ -171,23 +171,23 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, { // innner wall e_core = twbp->ecore * exp(twbp->acore * (1.0-(r_ij/twbp->rcore))); total_EvdW += Tap * e_core; - + de_core = -(twbp->acore/twbp->rcore) * e_core; CEvd += dTap * e_core + Tap * de_core / r_ij; - + // lg correction, only if lgvdw is yes if (control->lgflag) { r_ij5 = pow( r_ij, 5.0 ); r_ij6 = pow( r_ij, 6.0 ); re6 = pow( twbp->lgre, 6.0 ); - + e_lg = -(twbp->lgcij/( r_ij6 + re6 )); total_EvdW += Tap * e_lg; - + de_lg = -6.0 * e_lg * r_ij5 / ( r_ij6 + re6 ) ; CEvd += dTap * e_lg + Tap * de_lg / r_ij; } - + } /*Coulomb Calculations*/ @@ -207,44 +207,44 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, rvec_ScaledSum( delij, 1., system->my_atoms[i].x, -1., system->my_atoms[j].x ); f_tmp = -(CEvd + CEclmb); - pair_reax_ptr->ev_tally_thr_proxy( system->pair_ptr, i, j, natoms, - 1, pe_vdw, e_ele, f_tmp, + pair_reax_ptr->ev_tally_thr_proxy( system->pair_ptr, i, j, natoms, + 1, pe_vdw, e_ele, f_tmp, delij[0], delij[1], delij[2], thr); } - + if( control->virial == 0 ) { rvec_ScaledAdd( workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+j], + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+j], +(CEvd + CEclmb), nbr_pj->dvec ); } else { /* NPT, iNPT or sNPT */ /* for pressure coupling, terms not related to bond order derivatives are added directly into pressure vector/tensor */ - + rvec_Scale( temp, CEvd + CEclmb, nbr_pj->dvec ); rvec_ScaledAdd( workspace->f[reductionOffset+i], -1., temp ); rvec_Add( workspace->forceReduction[reductionOffset+j], temp); - + rvec_iMultiply( ext_press, nbr_pj->rel_box, temp ); - + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); } } } } - pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, - system->pair_ptr->vflag_either, thr); + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, thr); } // parallel region - + data->my_en.e_vdW = total_EvdW; data->my_en.e_ele = total_Eele; - + Compute_Polarization_Energy( system, data ); -} +} /* ---------------------------------------------------------------------- */ - + void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *control, simulation_data *data, storage *workspace, reax_list **lists, @@ -257,7 +257,7 @@ void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *contro long totalReductionSize = system->N * nthreads; double total_EvdW = 0.; double total_Eele = 0.; - + #pragma omp parallel default(shared) reduction(+:total_EvdW, total_Eele) { int i, j, pj, r; @@ -276,12 +276,12 @@ void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *contro class PairReaxCOMP *pair_reax_ptr; pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - - pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, - system->pair_ptr->vflag_either, + + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, natoms, system->pair_ptr->eatom, system->pair_ptr->vatom, thr); - + //#pragma omp for schedule(dynamic,50) #pragma omp for schedule(guided) for (i = 0; i < natoms; ++i) { @@ -290,7 +290,7 @@ void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *contro start_i = Start_Index(i,far_nbrs); end_i = End_Index(i,far_nbrs); orig_i = system->my_atoms[i].orig_id; - + for (pj = start_i; pj < end_i; ++pj) { nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); j = nbr_pj->nbr; @@ -310,7 +310,7 @@ void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *contro flag = 1; } } - + } if (flag) { @@ -354,30 +354,30 @@ void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *contro if( control->virial == 0 ) { rvec_ScaledAdd( workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec ); - rvec_ScaledAdd( workspace->forceReduction[froffset+j], + rvec_ScaledAdd( workspace->forceReduction[froffset+j], +(CEvd + CEclmb), nbr_pj->dvec ); } else { // NPT, iNPT or sNPT /* for pressure coupling, terms not related to bond order derivatives are added directly into pressure vector/tensor */ rvec_Scale( temp, CEvd + CEclmb, nbr_pj->dvec ); - + rvec_ScaledAdd( workspace->f[i], -1., temp ); rvec_Add( workspace->forceReduction[froffset+j], temp ); - + rvec_iMultiply( ext_press, nbr_pj->rel_box, temp ); rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); } } } } - + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, - system->pair_ptr->vflag_either, thr); + system->pair_ptr->vflag_either, thr); } // end omp parallel - + data->my_en.e_vdW = total_EvdW; data->my_en.e_ele = total_Eele; - + Compute_Polarization_Energy( system, data ); } diff --git a/src/USER-OMP/reaxc_torsion_angles_omp.cpp b/src/USER-OMP/reaxc_torsion_angles_omp.cpp index 294eeb9544..bb8bbe1cd7 100644 --- a/src/USER-OMP/reaxc_torsion_angles_omp.cpp +++ b/src/USER-OMP/reaxc_torsion_angles_omp.cpp @@ -65,7 +65,7 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, double total_Etor = 0; double total_Econ = 0; int nthreads = control->nthreads; - + #pragma omp parallel default(shared) reduction(+: total_Etor, total_Econ) { int i, j, k, l, pi, pj, pk, pl, pij, plk; @@ -73,11 +73,11 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, int start_j, end_j, start_k, end_k; int start_pj, end_pj, start_pk, end_pk; int num_frb_intrs = 0; - + double Delta_j, Delta_k; double r_ij, r_jk, r_kl, r_li; double BOA_ij, BOA_jk, BOA_kl; - + double exp_tor2_ij, exp_tor2_jk, exp_tor2_kl; double exp_tor1, exp_tor3_DjDk, exp_tor4_DjDk, exp_tor34_inv; double exp_cot2_jk, exp_cot2_ij, exp_cot2_kl; @@ -102,7 +102,7 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, bond_data *pbond_ij, *pbond_jk, *pbond_kl; bond_order_data *bo_ij, *bo_jk, *bo_kl; three_body_interaction_data *p_ijk, *p_jkl; - + // Virial tallying variables double delil[3], deljl[3], delkl[3]; double eng_tmp, f_scaler, fi_tmp[3], fj_tmp[3], fk_tmp[3]; @@ -123,27 +123,27 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, for (j = 0; j < system->N; ++j) { start_j = Start_Index(j, bonds); end_j = End_Index(j, bonds); - + for (pk = start_j; pk < end_j; ++pk) { bo_jk = &( bonds->select.bond_list[pk].bo_data ); for (k = 0; k < nthreads; ++k) bo_jk->CdboReduction[k] = 0.; } } - + #pragma omp for schedule(dynamic,50) for (j = 0; j < natoms; ++j) { type_j = system->my_atoms[j].type; Delta_j = workspace->Delta_boc[j]; start_j = Start_Index(j, bonds); end_j = End_Index(j, bonds); - + for (pk = start_j; pk < end_j; ++pk) { pbond_jk = &( bonds->select.bond_list[pk] ); k = pbond_jk->nbr; bo_jk = &( pbond_jk->bo_data ); BOA_jk = bo_jk->BO - control->thb_cut; - + /* see if there are any 3-body interactions involving j&k where j is the central atom. Otherwise there is no point in trying to form a 4-body interaction out of this neighborhood */ @@ -160,27 +160,27 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, type_k = system->my_atoms[k].type; Delta_k = workspace->Delta_boc[k]; r_jk = pbond_jk->d; - + start_pk = Start_Index(pk, thb_intrs ); end_pk = End_Index(pk, thb_intrs ); start_pj = Start_Index(pj, thb_intrs ); end_pj = End_Index(pj, thb_intrs ); - + exp_tor2_jk = exp( -p_tor2 * BOA_jk ); exp_cot2_jk = exp( -p_cot2 * SQR(BOA_jk - 1.5) ); exp_tor3_DjDk = exp( -p_tor3 * (Delta_j + Delta_k) ); exp_tor4_DjDk = exp( p_tor4 * (Delta_j + Delta_k) ); exp_tor34_inv = 1.0 / (1.0 + exp_tor3_DjDk + exp_tor4_DjDk); f11_DjDk = (2.0 + exp_tor3_DjDk) * exp_tor34_inv; - - + + /* pick i up from j-k interaction where j is the central atom */ for (pi = start_pk; pi < end_pk; ++pi) { p_ijk = &( thb_intrs->select.three_body_list[pi] ); pij = p_ijk->pthb; // pij is pointer to i on j's bond_list pbond_ij = &( bonds->select.bond_list[pij] ); bo_ij = &( pbond_ij->bo_data ); - + if (bo_ij->BO > control->thb_cut/*0*/) { i = p_ijk->thb; type_i = system->my_atoms[i].type; @@ -219,13 +219,13 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, bo_ij->BO * bo_jk->BO * bo_kl->BO > control->thb_cut/*0*/) { ++num_frb_intrs; //fprintf(stderr, - // "%5d: %6d %6d %6d %6d\n", num_frb_intrs, + // "%5d: %6d %6d %6d %6d\n", num_frb_intrs, // system->my_atoms[i].orig_id,system->my_atoms[j].orig_id, // system->my_atoms[k].orig_id,system->my_atoms[l].orig_id); r_kl = pbond_kl->d; BOA_kl = bo_kl->BO - control->thb_cut; - + theta_jkl = p_jkl->theta; sin_jkl = sin( theta_jkl ); cos_jkl = cos( theta_jkl ); @@ -235,12 +235,12 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, else if( sin_jkl <= 0 && sin_jkl >= -MIN_SINE ) tan_jkl_i = cos_jkl / -MIN_SINE; else tan_jkl_i = cos_jkl /sin_jkl; - + rvec_ScaledSum( dvec_li, 1., system->my_atoms[i].x, -1., system->my_atoms[l].x ); r_li = rvec_Norm( dvec_li ); - - + + /* omega and its derivative */ omega = Calculate_Omega( pbond_ij->dvec, r_ij, pbond_jk->dvec, r_jk, @@ -255,7 +255,7 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, cos2omega = cos( 2. * omega ); cos3omega = cos( 3. * omega ); /* end omega calculations */ - + /* torsion energy */ exp_tor1 = exp( fbp->p_tor1 * SQR(2.0 - bo_jk->BO_pi - f11_DjDk) ); @@ -360,35 +360,35 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, } else { ivec_Sum(rel_box_jl, pbond_jk->rel_box, pbond_kl->rel_box); - + /* dcos_theta_ijk */ rvec_Scale( force, CEtors7 + CEconj4, p_ijk->dcos_dk ); rvec_Add( workspace->forceReduction[reductionOffset+i], force ); rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); - + rvec_ScaledAdd( workspace->f[j], CEtors7 + CEconj4, p_ijk->dcos_dj ); - + rvec_Scale( force, CEtors7 + CEconj4, p_ijk->dcos_di ); rvec_Add( workspace->forceReduction[reductionOffset+k], force ); rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); - + /* dcos_theta_jkl */ rvec_ScaledAdd( workspace->f[j], CEtors8 + CEconj5, p_jkl->dcos_di ); - + rvec_Scale( force, CEtors8 + CEconj5, p_jkl->dcos_dj ); rvec_Add( workspace->forceReduction[reductionOffset+k], force ); rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); - + rvec_Scale( force, CEtors8 + CEconj5, p_jkl->dcos_dk ); rvec_Add( workspace->forceReduction[reductionOffset+l], force ); rvec_iMultiply( ext_press, rel_box_jl, force ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); - + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + /* dcos_omega */ rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_di ); rvec_Add( workspace->forceReduction[reductionOffset+i], force ); @@ -411,7 +411,7 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, /* tally into per-atom virials */ if( system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - + // acquire vectors rvec_ScaledSum( delil, 1., system->my_atoms[l].x, -1., system->my_atoms[i].x ); @@ -423,21 +423,21 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, rvec_Scale( fi_tmp, CEtors7 + CEconj4, p_ijk->dcos_dk ); rvec_Scale( fj_tmp, CEtors7 + CEconj4, p_ijk->dcos_dj ); rvec_Scale( fk_tmp, CEtors7 + CEconj4, p_ijk->dcos_di ); - + // dcos_theta_jkl rvec_ScaledAdd( fj_tmp, CEtors8 + CEconj5, p_jkl->dcos_di ); rvec_ScaledAdd( fk_tmp, CEtors8 + CEconj5, p_jkl->dcos_dj ); - + // dcos_omega rvec_ScaledAdd( fi_tmp, CEtors9 + CEconj6, dcos_omega_di ); rvec_ScaledAdd( fj_tmp, CEtors9 + CEconj6, dcos_omega_dj ); rvec_ScaledAdd( fk_tmp, CEtors9 + CEconj6, dcos_omega_dk ); - + // tally eng_tmp = e_tor + e_con; - + if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, k, system->n, 1, + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, k, system->n, 1, eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); // NEED TO MAKE AN OMP VERSION OF THIS CALL! @@ -445,7 +445,7 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, system->pair_ptr->v_tally4(i, j, k, l, fi_tmp, fj_tmp, fk_tmp, delil, deljl, delkl ); } - + } // pl check ends } // pl loop ends } // pi check ends @@ -454,12 +454,12 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, } // jmy_en.e_tor = total_Etor; data->my_en.e_con = total_Econ; - + #ifdef OMP_TIMING endTimeBase = MPI_Wtime(); ompTimingData[COMPUTETORSIONANGLESBOINDEX] += (endTimeBase-startTimeBase); diff --git a/src/USER-OMP/reaxc_valence_angles_omp.cpp b/src/USER-OMP/reaxc_valence_angles_omp.cpp index 7c45db1493..c83e5de852 100644 --- a/src/USER-OMP/reaxc_valence_angles_omp.cpp +++ b/src/USER-OMP/reaxc_valence_angles_omp.cpp @@ -54,7 +54,7 @@ void Calculate_dCos_ThetaOMP( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_ double csqr_jk = Cdot_inv3 * sqr_d_jk; double csqr_ji = Cdot_inv3 * sqr_d_ji; - + // Try to help compiler out by unrolling // x-component double dinv_jk = dvec_jk[0] * inv_dists; @@ -103,7 +103,7 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, double endTimeBase, startTimeBase; startTimeBase = MPI_Wtime(); #endif - + reax_list *bonds = (*lists) + BONDS; reax_list *thb_intrs = (*lists) + THREE_BODIES; @@ -118,20 +118,20 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, double total_Eang = 0; double total_Epen = 0; double total_Ecoa = 0; - + int per_atom = (thb_intrs->num_intrs / system->N); int nthreads = control->nthreads; int chunksize = system->N/(nthreads*10); int num_thb_intrs = 0; int TWICE = 2; -#pragma omp parallel default(shared) reduction(+:total_Eang, total_Epen, total_Ecoa, num_thb_intrs) +#pragma omp parallel default(shared) reduction(+:total_Eang, total_Epen, total_Ecoa, num_thb_intrs) { int i, j, pi, k, pk, t; int type_i, type_j, type_k; int start_j, end_j, start_pk, end_pk; int cnt, my_offset, mark; - + double temp, temp_bo_jt, pBOjt7; double p_val1, p_val2, p_val3, p_val4, p_val5, p_val7; double p_pen1, p_pen2, p_pen3, p_pen4; @@ -150,17 +150,17 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, double BOA_ij, BOA_jk; rvec force, ext_press; // rtensor temp_rtensor, total_rtensor; - + // Tallying variables double eng_tmp, f_scaler, fi_tmp[3], fj_tmp[3], fk_tmp[3]; double delij[3], delkj[3]; - + three_body_header *thbh; three_body_parameters *thbp; three_body_interaction_data *p_ijk, *p_kji; bond_data *pbond_ij, *pbond_jk, *pbond_jt; bond_order_data *bo_ij, *bo_jk, *bo_jt; - + int tid = omp_get_thread_num(); long reductionOffset = (system->N * tid); class PairReaxCOMP *pair_reax_ptr; @@ -174,7 +174,7 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, // Run through a minimal for(jnum_intrs / nthreads; #pragma omp for schedule(dynamic,50) @@ -188,7 +188,7 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, // Always point to start of workspace to count angles my_offset = tid * per_thread; - + for (pi = start_j; pi < end_j; ++pi) { Set_Start_Index( pi, my_offset, thb_intrs ); pbond_ij = &(bonds->select.bond_list[pi]); @@ -196,7 +196,7 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, BOA_ij = bo_ij->BO - control->thb_cut; if (BOA_ij > 0.0) { - i = pbond_ij->nbr; + i = pbond_ij->nbr; /* first copy 3-body intrs from previously computed ones where i>k. in the second for-loop below, @@ -204,13 +204,13 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, for (pk = start_j; pk < pi; ++pk) { start_pk = Start_Index( pk, thb_intrs ); end_pk = End_Index( pk, thb_intrs ); - + for (t = start_pk; t < end_pk; ++t) if (thb_intrs->select.three_body_list[t].thb == i) { p_ijk = &(thb_intrs->select.three_body_list[my_offset] ); p_ijk->thb = bonds->select.bond_list[pk].nbr; - + ++my_offset; break; } @@ -225,11 +225,11 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, p_ijk = &( thb_intrs->select.three_body_list[my_offset] ); p_ijk->thb = k; - + ++my_offset; // add this to the list of 3-body interactions } // for(pk) } // if() - + Set_End_Index(pi, my_offset, thb_intrs ); } // for(pi) @@ -246,7 +246,7 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, // Number of angles owned by this atom _my_offset[j] = my_offset - tid * per_thread; } // for(j) - + // Wait for all threads to finish counting angles #pragma omp barrier @@ -271,7 +271,7 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, // Original loop, but now using precomputed offsets // Safe to use all threads available, regardless of threads tasked above // We also now skip over atoms that have no angles assigned -#pragma omp for schedule(dynamic,50)//(dynamic,chunksize)//(guided) +#pragma omp for schedule(dynamic,50)//(dynamic,chunksize)//(guided) for (j = 0; j < system->N; ++j) { // Ray: the first one with system->N type_j = system->my_atoms[j].type; if(type_j < 0) continue; @@ -281,14 +281,14 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, start_j = Start_Index(j, bonds); end_j = End_Index(j, bonds); - + type_j = system->my_atoms[j].type; my_offset = _my_offset[j]; p_val3 = system->reax_param.sbp[ type_j ].p_val3; p_val5 = system->reax_param.sbp[ type_j ].p_val5; - + SBOp = 0, prod_SBO = 1; for (t = start_j; t < end_j; ++t) { bo_jt = &(bonds->select.bond_list[t].bo_data); @@ -298,7 +298,7 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, temp *= temp; prod_SBO *= exp( -temp ); } - + // modifications to match Adri's code - 09/01/09 if( workspace->vlpex[j] >= 0 ){ vlpadj = 0; @@ -308,10 +308,10 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, vlpadj = workspace->nlp[j]; dSBO2 = (prod_SBO - 1) * (1 - p_val8 * workspace->dDelta_lp[j]); } - + SBO = SBOp + (1 - prod_SBO) * (-workspace->Delta_boc[j] - p_val8 * vlpadj); dSBO1 = -8 * prod_SBO * ( workspace->Delta_boc[j] + p_val8 * vlpadj ); - + if( SBO <= 0 ) SBO2 = 0, CSBO2 = 0; else if( SBO > 0 && SBO <= 1 ) { @@ -324,16 +324,16 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, } else SBO2 = 2, CSBO2 = 0; - + expval6 = exp( p_val6 * workspace->Delta_boc[j] ); - + for (pi = start_j; pi < end_j; ++pi) { Set_Start_Index( pi, my_offset, thb_intrs ); pbond_ij = &(bonds->select.bond_list[pi]); bo_ij = &(pbond_ij->bo_data); BOA_ij = bo_ij->BO - control->thb_cut; - - + + if (BOA_ij > 0.0) { i = pbond_ij->nbr; r_ij = pbond_ij->d; @@ -346,19 +346,19 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, for (pk = start_j; pk < pi; ++pk) { start_pk = Start_Index( pk, thb_intrs ); end_pk = End_Index( pk, thb_intrs ); - + for (t = start_pk; t < end_pk; ++t) if (thb_intrs->select.three_body_list[t].thb == i) { p_ijk = &(thb_intrs->select.three_body_list[my_offset] ); p_kji = &(thb_intrs->select.three_body_list[t]); - + p_ijk->thb = bonds->select.bond_list[pk].nbr; p_ijk->pthb = pk; p_ijk->theta = p_kji->theta; rvec_Copy( p_ijk->dcos_di, p_kji->dcos_dk ); rvec_Copy( p_ijk->dcos_dj, p_kji->dcos_dj ); rvec_Copy( p_ijk->dcos_dk, p_kji->dcos_di ); - + ++my_offset; ++num_thb_intrs; break; @@ -374,15 +374,15 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, k = pbond_jk->nbr; type_k = system->my_atoms[k].type; p_ijk = &( thb_intrs->select.three_body_list[my_offset] ); - + // Fix by Sudhir // if (BOA_jk <= 0) continue; if (j >= system->n && i >= system->n && k >= system->n) continue; - + Calculate_Theta( pbond_ij->dvec, pbond_ij->d, pbond_jk->dvec, pbond_jk->d, &theta, &cos_theta ); - + Calculate_dCos_ThetaOMP( pbond_ij->dvec, pbond_ij->d, pbond_jk->dvec, pbond_jk->d, &(p_ijk->dcos_di), &(p_ijk->dcos_dj), @@ -390,23 +390,23 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, p_ijk->thb = k; p_ijk->pthb = pk; p_ijk->theta = theta; - + sin_theta = sin( theta ); if( sin_theta < 1.0e-5 ) sin_theta = 1.0e-5; - + ++my_offset; // add this to the list of 3-body interactions ++num_thb_intrs; - + if ((j < system->n) && (BOA_jk > 0.0) && (bo_ij->BO > control->thb_cut) && (bo_jk->BO > control->thb_cut) && (bo_ij->BO * bo_jk->BO > control->thb_cutsq)) { r_jk = pbond_jk->d; thbh = &( system->reax_param.thbp[ type_i ][ type_j ][ type_k ] ); - + for (cnt = 0; cnt < thbh->cnt; ++cnt) { - + if( fabs(thbh->prm[cnt].p_val1) > 0.001 ) { thbp = &( thbh->prm[cnt] ); @@ -456,7 +456,7 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, CEval7 = CEval5 * dSBO2; CEval8 = -CEval4 / sin_theta; - total_Eang += e_ang = + total_Eang += e_ang = f7_ij * f7_jk * f8_Dj * expval12theta; /* END ANGLE ENERGY*/ @@ -533,9 +533,9 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, if( control->virial == 0 ) { rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+i], + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+i], CEval8, p_ijk->dcos_di ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+k], + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+k], CEval8, p_ijk->dcos_dk ); } else { @@ -543,36 +543,36 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, added directly into forces and pressure vector/tensor */ rvec_Scale( force, CEval8, p_ijk->dcos_di ); rvec_Add( workspace->forceReduction[reductionOffset+i], force ); - + rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); - + rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); - + rvec_Scale( force, CEval8, p_ijk->dcos_dk ); rvec_Add( workspace->forceReduction[reductionOffset+k], force ); - + rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); } /* tally into per-atom virials */ if( system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - + /* Acquire vectors */ rvec_ScaledSum( delij, 1., system->my_atoms[i].x, -1., system->my_atoms[j].x ); rvec_ScaledSum( delkj, 1., system->my_atoms[k].x, -1., system->my_atoms[j].x ); - + rvec_Scale( fi_tmp, -CEval8, p_ijk->dcos_di ); rvec_Scale( fj_tmp, -CEval8, p_ijk->dcos_dj ); rvec_Scale( fk_tmp, -CEval8, p_ijk->dcos_dk ); - + eng_tmp = e_ang + e_pen + e_coa; - + if( system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, j, system->N, 1, + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, j, system->N, 1, eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); if( system->pair_ptr->vflag_atom) // NEED TO MAKE AN OMP VERSION OF THIS CALL! @@ -588,7 +588,7 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, Set_End_Index(pi, my_offset, thb_intrs ); } // for(pi) } // for(j) - + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, system->pair_ptr->vflag_either, thr); } // end omp parallel diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index b520fc14c7..bf3b2e4467 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -230,7 +230,7 @@ void PairReaxC::settings(int narg, char **arg) system->mincap = MIN_CAP; system->safezone = SAFE_ZONE; system->saferzone = SAFER_ZONE; - + // process optional keywords int iarg = 1; diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index ac835e7ce3..0d9c51c878 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -199,7 +199,7 @@ void DeAllocate_Workspace( control_params *control, storage *workspace ) if(workspace->CdDeltaReduction) sfree( workspace->CdDeltaReduction, "cddelta_reduce" ); if(workspace->forceReduction) sfree( workspace->forceReduction, "f_reduce" ); if(workspace->valence_angle_atom_myoffset) sfree( workspace->valence_angle_atom_myoffset, "valence_angle_atom_myoffset"); - + if (control->virial && workspace->my_ext_pressReduction) sfree( workspace->my_ext_pressReduction, "ext_press_reduce"); #endif } @@ -297,12 +297,12 @@ int Allocate_Workspace( reax_system *system, control_params *control, workspace->f = (rvec*) scalloc( total_cap, sizeof(rvec), "f", comm ); workspace->CdDelta = (double*) scalloc( total_cap, sizeof(double), "CdDelta", comm ); - + // storage for reductions with multiple threads #ifdef LMP_USER_OMP workspace->CdDeltaReduction = (double *) scalloc(sizeof(double), total_cap*control->nthreads, "cddelta_reduce", comm); - + workspace->forceReduction = (rvec *) scalloc(sizeof(rvec), total_cap*control->nthreads, "forceReduction", comm); @@ -368,30 +368,30 @@ static int Reallocate_Bonds_List( reax_system *system, reax_list *bonds, *total_bonds += system->my_atoms[i].num_bonds; } *total_bonds = (int)(MAX( *total_bonds * safezone, mincap*MIN_BONDS )); - + #ifdef LMP_USER_OMP for (i = 0; i < bonds->num_intrs; ++i) sfree(bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); #endif - + Delete_List( bonds, comm ); if(!Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds, comm)) { fprintf( stderr, "not enough space for bonds list. terminating!\n" ); MPI_Abort( comm, INSUFFICIENT_MEMORY ); } - + #ifdef LMP_USER_OMP #if defined(_OPENMP) int nthreads = omp_get_num_threads(); #else int nthreads = 1; #endif - + for (i = 0; i < bonds->num_intrs; ++i) - bonds->select.bond_list[i].bo_data.CdboReduction = + bonds->select.bond_list[i].bo_data.CdboReduction = (double*) smalloc(sizeof(double)*nthreads, "CdboReduction", comm); #endif - + return SUCCESS; } diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 1b9ce63dc2..547602feb4 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -486,7 +486,7 @@ typedef struct int lgflag; int enobondsflag; - + } control_params; From 88d4150d2bf84fb5418d4ba14371081d03473a93 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 May 2017 16:29:56 -0400 Subject: [PATCH 088/302] remove trailing whitespace --- src/USER-OMP/fix_nve_sphere_omp.cpp | 48 +++++++++---------- src/USER-OMP/npair_full_bin_ghost_omp.h | 2 +- src/USER-OMP/npair_full_bin_omp.h | 2 +- src/USER-OMP/npair_full_multi_omp.h | 2 +- src/USER-OMP/npair_full_nsq_ghost_omp.h | 2 +- src/USER-OMP/npair_full_nsq_omp.h | 2 +- .../npair_half_bin_newtoff_ghost_omp.cpp | 2 +- .../npair_half_bin_newtoff_ghost_omp.h | 2 +- .../npair_half_multi_newton_tri_omp.cpp | 2 +- .../npair_half_nsq_newtoff_ghost_omp.cpp | 2 +- .../npair_half_nsq_newtoff_ghost_omp.h | 2 +- .../npair_half_respa_bin_newtoff_omp.cpp | 2 +- .../npair_half_respa_bin_newtoff_omp.h | 2 +- .../npair_half_respa_bin_newton_omp.cpp | 2 +- .../npair_half_respa_bin_newton_tri_omp.cpp | 2 +- .../npair_half_respa_nsq_newtoff_omp.cpp | 2 +- .../npair_half_respa_nsq_newtoff_omp.h | 2 +- .../npair_half_respa_nsq_newton_omp.cpp | 2 +- .../npair_half_respa_nsq_newton_omp.h | 2 +- .../npair_half_size_bin_newtoff_omp.cpp | 2 +- .../npair_half_size_bin_newtoff_omp.h | 2 +- .../npair_half_size_bin_newton_omp.cpp | 4 +- .../npair_half_size_bin_newton_tri_omp.cpp | 2 +- .../npair_half_size_nsq_newtoff_omp.cpp | 2 +- .../npair_half_size_nsq_newtoff_omp.h | 2 +- .../npair_half_size_nsq_newton_omp.cpp | 2 +- src/USER-OMP/npair_half_size_nsq_newton_omp.h | 2 +- src/USER-OMP/npair_halffull_newtoff_omp.h | 2 +- src/USER-OMP/npair_halffull_newton_omp.h | 2 +- src/USER-OMP/pair_airebo_omp.cpp | 2 +- src/USER-OMP/pair_lj_cut_thole_long_omp.cpp | 8 ++-- 31 files changed, 58 insertions(+), 58 deletions(-) diff --git a/src/USER-OMP/fix_nve_sphere_omp.cpp b/src/USER-OMP/fix_nve_sphere_omp.cpp index 2367e34878..43ecc99868 100644 --- a/src/USER-OMP/fix_nve_sphere_omp.cpp +++ b/src/USER-OMP/fix_nve_sphere_omp.cpp @@ -110,18 +110,18 @@ void FixNVESphereOMP::initial_integrate(int vflag) matrix Q, Q_temp, R; if (mask[i] & groupbit && mu[i][3] > 0.0) { - + // Construct Q from dipole: // Q is the rotation matrix from space frame to body frame // i.e. v_b = Q.v_s - + // Define mu to lie along the z axis in the body frame // We take the unit dipole to avoid getting a scaling matrix const double inv_len_mu = 1.0/mu[i][3]; a[0] = mu[i][0]*inv_len_mu; a[1] = mu[i][1]*inv_len_mu; a[2] = mu[i][2]*inv_len_mu; - + // v = a x [0 0 1] - cross product of mu in space and body frames // s = |v| // c = a.[0 0 1] = a[2] @@ -130,11 +130,11 @@ void FixNVESphereOMP::initial_integrate(int vflag) // -v[1] v[0] 0 ] // then // Q = I + vx + vx^2 * (1-c)/s^2 - + const double s2 = a[0]*a[0] + a[1]*a[1]; if (s2 != 0.0){ // i.e. the vectors are not parallel const double scale = (1.0 - a[2])/s2; - + Q[0][0] = 1.0 - scale*a[0]*a[0]; Q[0][1] = -scale*a[0]*a[1]; Q[0][2] = -a[0]; Q[1][0] = -scale*a[0]*a[1]; Q[1][1] = 1.0 - scale*a[1]*a[1]; Q[1][2] = -a[1]; Q[2][0] = a[0]; Q[2][1] = a[1]; Q[2][2] = 1.0 - scale*(a[0]*a[0] + a[1]*a[1]); @@ -143,62 +143,62 @@ void FixNVESphereOMP::initial_integrate(int vflag) Q[1][0] = 0.0; Q[1][1] = 1.0/a[2]; Q[1][2] = 0.0; Q[2][0] = 0.0; Q[2][1] = 0.0; Q[2][2] = 1.0/a[2]; } - + // Local copy of this particle's angular velocity (in space frame) w[0] = omega[i][0]; w[1] = omega[i][1]; w[2] = omega[i][2]; - + // Transform omega into body frame: w_temp= Q.w matvec(Q,w,w_temp); - + // Construct rotation R1 BuildRxMatrix(R, dtf/force->ftm2v*w_temp[0]); - + // Apply R1 to w: w = R.w_temp matvec(R,w_temp,w); - + // Apply R1 to Q: Q_temp = R^T.Q transpose_times3(R,Q,Q_temp); - + // Construct rotation R2 BuildRyMatrix(R, dtf/force->ftm2v*w[1]); - + // Apply R2 to w: w_temp = R.w matvec(R,w,w_temp); - + // Apply R2 to Q: Q = R^T.Q_temp transpose_times3(R,Q_temp,Q); - + // Construct rotation R3 BuildRzMatrix(R, 2.0*dtf/force->ftm2v*w_temp[2]); - + // Apply R3 to w: w = R.w_temp matvec(R,w_temp,w); - + // Apply R3 to Q: Q_temp = R^T.Q transpose_times3(R,Q,Q_temp); - + // Construct rotation R4 BuildRyMatrix(R, dtf/force->ftm2v*w[1]); - + // Apply R4 to w: w_temp = R.w matvec(R,w,w_temp); - + // Apply R4 to Q: Q = R^T.Q_temp transpose_times3(R,Q_temp,Q); - + // Construct rotation R5 BuildRxMatrix(R, dtf/force->ftm2v*w_temp[0]); - + // Apply R5 to w: w = R.w_temp matvec(R,w_temp,w); - + // Apply R5 to Q: Q_temp = R^T.Q transpose_times3(R,Q,Q_temp); - + // Transform w back into space frame w_temp = Q^T.w transpose_matvec(Q_temp,w,w_temp); omega[i][0] = w_temp[0]; omega[i][1] = w_temp[1]; omega[i][2] = w_temp[2]; - + // Set dipole according to updated Q: mu = Q^T.[0 0 1] * |mu| mu[i][0] = Q_temp[2][0] * mu[i][3]; mu[i][1] = Q_temp[2][1] * mu[i][3]; diff --git a/src/USER-OMP/npair_full_bin_ghost_omp.h b/src/USER-OMP/npair_full_bin_ghost_omp.h index ed1580ac3b..afc2eaef9d 100644 --- a/src/USER-OMP/npair_full_bin_ghost_omp.h +++ b/src/USER-OMP/npair_full_bin_ghost_omp.h @@ -15,7 +15,7 @@ NPairStyle(full/bin/ghost/omp, NPairFullBinGhostOmp, - NP_FULL | NP_BIN | NP_GHOST | NP_OMP | NP_NEWTON | NP_NEWTOFF | + NP_FULL | NP_BIN | NP_GHOST | NP_OMP | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_full_bin_omp.h b/src/USER-OMP/npair_full_bin_omp.h index 5aa17310e2..832fb82c49 100644 --- a/src/USER-OMP/npair_full_bin_omp.h +++ b/src/USER-OMP/npair_full_bin_omp.h @@ -15,7 +15,7 @@ NPairStyle(full/bin/omp, NPairFullBinOmp, - NP_FULL | NP_BIN | NP_OMP | NP_NEWTON | NP_NEWTOFF | + NP_FULL | NP_BIN | NP_OMP | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_full_multi_omp.h b/src/USER-OMP/npair_full_multi_omp.h index 36a8d02e28..882e649183 100644 --- a/src/USER-OMP/npair_full_multi_omp.h +++ b/src/USER-OMP/npair_full_multi_omp.h @@ -15,7 +15,7 @@ NPairStyle(full/multi/omp, NPairFullMultiOmp, - NP_FULL | NP_MULTI | NP_OMP | + NP_FULL | NP_MULTI | NP_OMP | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_full_nsq_ghost_omp.h b/src/USER-OMP/npair_full_nsq_ghost_omp.h index dbf7f81bcc..a080c17804 100644 --- a/src/USER-OMP/npair_full_nsq_ghost_omp.h +++ b/src/USER-OMP/npair_full_nsq_ghost_omp.h @@ -15,7 +15,7 @@ NPairStyle(full/nsq/ghost/omp, NPairFullNsqGhostOmp, - NP_FULL | NP_NSQ | NP_GHOST | NP_OMP | NP_NEWTON | NP_NEWTOFF | + NP_FULL | NP_NSQ | NP_GHOST | NP_OMP | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_full_nsq_omp.h b/src/USER-OMP/npair_full_nsq_omp.h index 2adcb8e1bd..251d059d1c 100644 --- a/src/USER-OMP/npair_full_nsq_omp.h +++ b/src/USER-OMP/npair_full_nsq_omp.h @@ -15,7 +15,7 @@ NPairStyle(full/nsq/omp, NPairFullNsqOmp, - NP_FULL | NP_NSQ | NP_OMP | NP_NEWTON | NP_NEWTOFF | + NP_FULL | NP_NSQ | NP_OMP | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_half_bin_newtoff_ghost_omp.cpp b/src/USER-OMP/npair_half_bin_newtoff_ghost_omp.cpp index 05763c3d68..24fe75ec55 100644 --- a/src/USER-OMP/npair_half_bin_newtoff_ghost_omp.cpp +++ b/src/USER-OMP/npair_half_bin_newtoff_ghost_omp.cpp @@ -26,7 +26,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfBinNewtoffGhostOmp::NPairHalfBinNewtoffGhostOmp(LAMMPS *lmp) : +NPairHalfBinNewtoffGhostOmp::NPairHalfBinNewtoffGhostOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/USER-OMP/npair_half_bin_newtoff_ghost_omp.h b/src/USER-OMP/npair_half_bin_newtoff_ghost_omp.h index 4974c407eb..9b75abbb8b 100644 --- a/src/USER-OMP/npair_half_bin_newtoff_ghost_omp.h +++ b/src/USER-OMP/npair_half_bin_newtoff_ghost_omp.h @@ -15,7 +15,7 @@ NPairStyle(half/bin/newtoff/ghost/omp, NPairHalfBinNewtoffGhostOmp, - NP_HALF | NP_BIN | NP_NEWTOFF | NP_GHOST | NP_OMP | + NP_HALF | NP_BIN | NP_NEWTOFF | NP_GHOST | NP_OMP | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_half_multi_newton_tri_omp.cpp b/src/USER-OMP/npair_half_multi_newton_tri_omp.cpp index f66cf194e7..ce93e85485 100644 --- a/src/USER-OMP/npair_half_multi_newton_tri_omp.cpp +++ b/src/USER-OMP/npair_half_multi_newton_tri_omp.cpp @@ -26,7 +26,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfMultiNewtonTriOmp::NPairHalfMultiNewtonTriOmp(LAMMPS *lmp) : +NPairHalfMultiNewtonTriOmp::NPairHalfMultiNewtonTriOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/USER-OMP/npair_half_nsq_newtoff_ghost_omp.cpp b/src/USER-OMP/npair_half_nsq_newtoff_ghost_omp.cpp index 0294658aa0..add4c44d9e 100644 --- a/src/USER-OMP/npair_half_nsq_newtoff_ghost_omp.cpp +++ b/src/USER-OMP/npair_half_nsq_newtoff_ghost_omp.cpp @@ -27,7 +27,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfNsqNewtoffGhostOmp::NPairHalfNsqNewtoffGhostOmp(LAMMPS *lmp) : +NPairHalfNsqNewtoffGhostOmp::NPairHalfNsqNewtoffGhostOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/USER-OMP/npair_half_nsq_newtoff_ghost_omp.h b/src/USER-OMP/npair_half_nsq_newtoff_ghost_omp.h index 6b565d9dd8..4294ab5f1f 100644 --- a/src/USER-OMP/npair_half_nsq_newtoff_ghost_omp.h +++ b/src/USER-OMP/npair_half_nsq_newtoff_ghost_omp.h @@ -15,7 +15,7 @@ NPairStyle(half/nsq/newtoff/ghost/omp, NPairHalfNsqNewtoffGhostOmp, - NP_HALF | NP_NSQ | NP_NEWTOFF | NP_GHOST | NP_OMP | + NP_HALF | NP_NSQ | NP_NEWTOFF | NP_GHOST | NP_OMP | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_half_respa_bin_newtoff_omp.cpp b/src/USER-OMP/npair_half_respa_bin_newtoff_omp.cpp index 12780fa4a3..45add87092 100644 --- a/src/USER-OMP/npair_half_respa_bin_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_respa_bin_newtoff_omp.cpp @@ -26,7 +26,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfRespaBinNewtoffOmp::NPairHalfRespaBinNewtoffOmp(LAMMPS *lmp) : +NPairHalfRespaBinNewtoffOmp::NPairHalfRespaBinNewtoffOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/USER-OMP/npair_half_respa_bin_newtoff_omp.h b/src/USER-OMP/npair_half_respa_bin_newtoff_omp.h index 257aa8fdaa..f4c7c69355 100644 --- a/src/USER-OMP/npair_half_respa_bin_newtoff_omp.h +++ b/src/USER-OMP/npair_half_respa_bin_newtoff_omp.h @@ -15,7 +15,7 @@ NPairStyle(half/respa/bin/newtoff/omp, NPairHalfRespaBinNewtoffOmp, - NP_HALF | NP_RESPA | NP_BIN | NP_NEWTOFF | NP_OMP | + NP_HALF | NP_RESPA | NP_BIN | NP_NEWTOFF | NP_OMP | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_half_respa_bin_newton_omp.cpp b/src/USER-OMP/npair_half_respa_bin_newton_omp.cpp index b9a6364242..ee6b9b7501 100644 --- a/src/USER-OMP/npair_half_respa_bin_newton_omp.cpp +++ b/src/USER-OMP/npair_half_respa_bin_newton_omp.cpp @@ -26,7 +26,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfRespaBinNewtonOmp::NPairHalfRespaBinNewtonOmp(LAMMPS *lmp) : +NPairHalfRespaBinNewtonOmp::NPairHalfRespaBinNewtonOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/USER-OMP/npair_half_respa_bin_newton_tri_omp.cpp b/src/USER-OMP/npair_half_respa_bin_newton_tri_omp.cpp index bc03972d85..fbb512ba64 100644 --- a/src/USER-OMP/npair_half_respa_bin_newton_tri_omp.cpp +++ b/src/USER-OMP/npair_half_respa_bin_newton_tri_omp.cpp @@ -26,7 +26,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfRespaBinNewtonTriOmp::NPairHalfRespaBinNewtonTriOmp(LAMMPS *lmp) : +NPairHalfRespaBinNewtonTriOmp::NPairHalfRespaBinNewtonTriOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/USER-OMP/npair_half_respa_nsq_newtoff_omp.cpp b/src/USER-OMP/npair_half_respa_nsq_newtoff_omp.cpp index 80826ffa42..5ee71bebad 100644 --- a/src/USER-OMP/npair_half_respa_nsq_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_respa_nsq_newtoff_omp.cpp @@ -27,7 +27,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfRespaNsqNewtoffOmp::NPairHalfRespaNsqNewtoffOmp(LAMMPS *lmp) : +NPairHalfRespaNsqNewtoffOmp::NPairHalfRespaNsqNewtoffOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/USER-OMP/npair_half_respa_nsq_newtoff_omp.h b/src/USER-OMP/npair_half_respa_nsq_newtoff_omp.h index ebd8691635..c1d8fbc91a 100644 --- a/src/USER-OMP/npair_half_respa_nsq_newtoff_omp.h +++ b/src/USER-OMP/npair_half_respa_nsq_newtoff_omp.h @@ -15,7 +15,7 @@ NPairStyle(half/respa/nsq/newtoff/omp, NPairHalfRespaNsqNewtoffOmp, - NP_HALF | NP_RESPA | NP_NSQ | NP_NEWTOFF | NP_OMP | + NP_HALF | NP_RESPA | NP_NSQ | NP_NEWTOFF | NP_OMP | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_half_respa_nsq_newton_omp.cpp b/src/USER-OMP/npair_half_respa_nsq_newton_omp.cpp index 18319dc1ae..89cff732c9 100644 --- a/src/USER-OMP/npair_half_respa_nsq_newton_omp.cpp +++ b/src/USER-OMP/npair_half_respa_nsq_newton_omp.cpp @@ -27,7 +27,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfRespaNsqNewtonOmp::NPairHalfRespaNsqNewtonOmp(LAMMPS *lmp) : +NPairHalfRespaNsqNewtonOmp::NPairHalfRespaNsqNewtonOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/USER-OMP/npair_half_respa_nsq_newton_omp.h b/src/USER-OMP/npair_half_respa_nsq_newton_omp.h index cf39ad8d6e..b3f06fb170 100644 --- a/src/USER-OMP/npair_half_respa_nsq_newton_omp.h +++ b/src/USER-OMP/npair_half_respa_nsq_newton_omp.h @@ -15,7 +15,7 @@ NPairStyle(half/respa/nsq/newton/omp, NPairHalfRespaNsqNewtonOmp, - NP_HALF | NP_RESPA | NP_NSQ | NP_NEWTON | NP_OMP | + NP_HALF | NP_RESPA | NP_NSQ | NP_NEWTON | NP_OMP | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp b/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp index dbb62e96ef..120658b714 100644 --- a/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_size_bin_newtoff_omp.cpp @@ -28,7 +28,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfSizeBinNewtoffOmp::NPairHalfSizeBinNewtoffOmp(LAMMPS *lmp) : +NPairHalfSizeBinNewtoffOmp::NPairHalfSizeBinNewtoffOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/USER-OMP/npair_half_size_bin_newtoff_omp.h b/src/USER-OMP/npair_half_size_bin_newtoff_omp.h index 7b71aa0ea7..891df55278 100644 --- a/src/USER-OMP/npair_half_size_bin_newtoff_omp.h +++ b/src/USER-OMP/npair_half_size_bin_newtoff_omp.h @@ -15,7 +15,7 @@ NPairStyle(half/size/bin/newtoff/omp, NPairHalfSizeBinNewtoffOmp, - NP_HALF | NP_SIZE | NP_BIN | NP_NEWTOFF | NP_OMP | + NP_HALF | NP_SIZE | NP_BIN | NP_NEWTOFF | NP_OMP | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_half_size_bin_newton_omp.cpp b/src/USER-OMP/npair_half_size_bin_newton_omp.cpp index 2c26c7952c..cf0c6d20fe 100644 --- a/src/USER-OMP/npair_half_size_bin_newton_omp.cpp +++ b/src/USER-OMP/npair_half_size_bin_newton_omp.cpp @@ -28,7 +28,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfSizeBinNewtonOmp::NPairHalfSizeBinNewtonOmp(LAMMPS *lmp) : +NPairHalfSizeBinNewtonOmp::NPairHalfSizeBinNewtonOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- @@ -202,7 +202,7 @@ void NPairHalfSizeBinNewtonOmp::build(NeighList *list) nn += dnum; } } - + n++; } } diff --git a/src/USER-OMP/npair_half_size_bin_newton_tri_omp.cpp b/src/USER-OMP/npair_half_size_bin_newton_tri_omp.cpp index bf273f545f..da04eebd1e 100644 --- a/src/USER-OMP/npair_half_size_bin_newton_tri_omp.cpp +++ b/src/USER-OMP/npair_half_size_bin_newton_tri_omp.cpp @@ -26,7 +26,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfSizeBinNewtonTriOmp::NPairHalfSizeBinNewtonTriOmp(LAMMPS *lmp) : +NPairHalfSizeBinNewtonTriOmp::NPairHalfSizeBinNewtonTriOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp b/src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp index 70caa23527..f898ec3828 100644 --- a/src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp +++ b/src/USER-OMP/npair_half_size_nsq_newtoff_omp.cpp @@ -29,7 +29,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfSizeNsqNewtoffOmp::NPairHalfSizeNsqNewtoffOmp(LAMMPS *lmp) : +NPairHalfSizeNsqNewtoffOmp::NPairHalfSizeNsqNewtoffOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/USER-OMP/npair_half_size_nsq_newtoff_omp.h b/src/USER-OMP/npair_half_size_nsq_newtoff_omp.h index 793c49335a..95eb5d0d7a 100644 --- a/src/USER-OMP/npair_half_size_nsq_newtoff_omp.h +++ b/src/USER-OMP/npair_half_size_nsq_newtoff_omp.h @@ -15,7 +15,7 @@ NPairStyle(half/size/nsq/newtoff/omp, NPairHalfSizeNsqNewtoffOmp, - NP_HALF | NP_SIZE | NP_NSQ | NP_NEWTOFF | NP_OMP | + NP_HALF | NP_SIZE | NP_NSQ | NP_NEWTOFF | NP_OMP | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_half_size_nsq_newton_omp.cpp b/src/USER-OMP/npair_half_size_nsq_newton_omp.cpp index f2aa807981..a7caac372a 100644 --- a/src/USER-OMP/npair_half_size_nsq_newton_omp.cpp +++ b/src/USER-OMP/npair_half_size_nsq_newton_omp.cpp @@ -29,7 +29,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfSizeNsqNewtonOmp::NPairHalfSizeNsqNewtonOmp(LAMMPS *lmp) : +NPairHalfSizeNsqNewtonOmp::NPairHalfSizeNsqNewtonOmp(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/USER-OMP/npair_half_size_nsq_newton_omp.h b/src/USER-OMP/npair_half_size_nsq_newton_omp.h index 9abdb75db0..6f8343d260 100644 --- a/src/USER-OMP/npair_half_size_nsq_newton_omp.h +++ b/src/USER-OMP/npair_half_size_nsq_newton_omp.h @@ -15,7 +15,7 @@ NPairStyle(half/size/nsq/newton/omp, NPairHalfSizeNsqNewtonOmp, - NP_HALF | NP_SIZE | NP_NSQ | NP_NEWTON | NP_OMP | + NP_HALF | NP_SIZE | NP_NSQ | NP_NEWTON | NP_OMP | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_halffull_newtoff_omp.h b/src/USER-OMP/npair_halffull_newtoff_omp.h index 2df055af35..508efff277 100644 --- a/src/USER-OMP/npair_halffull_newtoff_omp.h +++ b/src/USER-OMP/npair_halffull_newtoff_omp.h @@ -15,7 +15,7 @@ NPairStyle(halffull/newtoff/omp, NPairHalffullNewtoffOmp, - NP_HALF_FULL | NP_NEWTOFF | NP_OMP | NP_HALF | + NP_HALF_FULL | NP_NEWTOFF | NP_OMP | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/npair_halffull_newton_omp.h b/src/USER-OMP/npair_halffull_newton_omp.h index 968aa53e14..87f05e2a40 100644 --- a/src/USER-OMP/npair_halffull_newton_omp.h +++ b/src/USER-OMP/npair_halffull_newton_omp.h @@ -15,7 +15,7 @@ NPairStyle(halffull/newton/omp, NPairHalffullNewtonOmp, - NP_HALF_FULL | NP_NEWTON | NP_OMP | NP_HALF | + NP_HALF_FULL | NP_NEWTON | NP_OMP | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI) #else diff --git a/src/USER-OMP/pair_airebo_omp.cpp b/src/USER-OMP/pair_airebo_omp.cpp index f3aa9986fe..95f9d8b401 100644 --- a/src/USER-OMP/pair_airebo_omp.cpp +++ b/src/USER-OMP/pair_airebo_omp.cpp @@ -1907,7 +1907,7 @@ double PairAIREBOOMP::bondorderLJ_thr(int i, int j, double rij[3], double rijmag realrij[0] = x[atomi][0] - x[atomj][0]; realrij[1] = x[atomi][1] - x[atomj][1]; realrij[2] = x[atomi][2] - x[atomj][2]; - realrijmag = sqrt(realrij[0] * realrij[0] + realrij[1] * realrij[1] + realrijmag = sqrt(realrij[0] * realrij[0] + realrij[1] * realrij[1] + realrij[2] * realrij[2]); REBO_neighs = REBO_firstneigh[i]; diff --git a/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp b/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp index 71791e3460..85c7e44f8c 100644 --- a/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_thole_long_omp.cpp @@ -44,7 +44,7 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -PairLJCutTholeLongOMP::PairLJCutTholeLongOMP(LAMMPS *lmp) : +PairLJCutTholeLongOMP::PairLJCutTholeLongOMP(LAMMPS *lmp) : PairLJCutTholeLong(lmp), ThrOMP(lmp, THR_PAIR) { suffix_flag |= Suffix::OMP; @@ -108,9 +108,9 @@ void PairLJCutTholeLongOMP::eval(int iifrom, int iito, ThrData * const thr) const tagint * _noalias const drudeid = fix_drude->drudeid; double xtmp,ytmp,ztmp,delx,dely,delz,fxtmp,fytmp,fztmp; - + const int nlocal = atom->nlocal; - + int j,jj,jnum,jtype,itable; double ecoul,fpair,evdwl; double r,rsq,r2inv,forcecoul,factor_coul,forcelj,factor_lj,r6inv; @@ -137,7 +137,7 @@ void PairLJCutTholeLongOMP::eval(int iifrom, int iito, ThrData * const thr) const double * _noalias const lj2i = lj2[itype]; const double * _noalias const lj3i = lj3[itype]; const double * _noalias const lj4i = lj4[itype]; - + xtmp = x[i].x; ytmp = x[i].y; ztmp = x[i].z; From 271431ab1834d6990a4137a1dcceef9d183b5eb1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 24 May 2017 17:25:57 -0400 Subject: [PATCH 089/302] clean up code so it can be compiled with and without OpenMP enabled regardless of whether the USER-OMP package is installed --- src/USER-OMP/fix_qeq_reax_omp.cpp | 399 +++++++++++----------- src/USER-OMP/pair_reaxc_omp.cpp | 38 ++- src/USER-OMP/reaxc_bond_orders_omp.cpp | 39 ++- src/USER-OMP/reaxc_bonds_omp.cpp | 18 +- src/USER-OMP/reaxc_forces_omp.cpp | 88 ++--- src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp | 15 +- src/USER-OMP/reaxc_init_md_omp.cpp | 1 - src/USER-OMP/reaxc_multi_body_omp.cpp | 16 +- src/USER-OMP/reaxc_nonbonded_omp.cpp | 29 +- src/USER-OMP/reaxc_torsion_angles_omp.cpp | 11 +- src/USER-OMP/reaxc_valence_angles_omp.cpp | 11 +- 11 files changed, 398 insertions(+), 267 deletions(-) diff --git a/src/USER-OMP/fix_qeq_reax_omp.cpp b/src/USER-OMP/fix_qeq_reax_omp.cpp index a43d6cfdd1..2603d649a3 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.cpp +++ b/src/USER-OMP/fix_qeq_reax_omp.cpp @@ -18,10 +18,11 @@ Hybrid and sub-group capabilities: Ray Shan (Sandia) ------------------------------------------------------------------------- */ -#include "math.h" -#include "stdio.h" -#include "stdlib.h" -#include "string.h" +#include +#include +#include +#include + #include "fix_qeq_reax_omp.h" #include "pair_reaxc_omp.h" #include "atom.h" @@ -74,7 +75,7 @@ FixQEqReaxOMP::FixQEqReaxOMP(LAMMPS *lmp, int narg, char **arg) : s_hist = t_hist = NULL; grow_arrays(atom->nmax); atom->add_callback(0); - for( int i = 0; i < atom->nmax; i++ ) + for (int i = 0; i < atom->nmax; i++ ) for (int j = 0; j < nprev; ++j ) s_hist[i][j] = t_hist[i][j] = 0; @@ -208,7 +209,7 @@ void FixQEqReaxOMP::allocate_matrix() } m = 0; - for( ii = 0; ii < inum; ii++ ) { + for (ii = 0; ii < inum; ii++ ) { i = ilist[ii]; m += numneigh[i]; } @@ -321,7 +322,9 @@ void FixQEqReaxOMP::compute_H() // fill in the H matrix +#if defined(_OPENMP) #pragma omp parallel default(shared) +#endif { int i, j, ii, jj, mfill, jnum, flag; int *jlist; @@ -329,8 +332,9 @@ void FixQEqReaxOMP::compute_H() mfill = 0; - //#pragma omp for schedule(dynamic,50) +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for (ii = 0; ii < inum; ii++) { i = ilist[ii]; if(mask[i] & groupbit) { @@ -390,7 +394,9 @@ void FixQEqReaxOMP::init_storage() if(reaxc) NN = reaxc->list->inum + reaxc->list->gnum; else NN = list->inum + list->gnum; +#if defined(_OPENMP) #pragma omp parallel for schedule(static) +#endif for (int i = 0; i < NN; i++) { Hdia_inv[i] = 1. / eta[atom->type[i]]; b_s[i] = -chi[atom->type[i]]; @@ -514,7 +520,9 @@ void FixQEqReaxOMP::init_matvec() if(do_aspc) { double m_aspc_omega = 1.0 - aspc_omega; +#if defined(_OPENMP) #pragma omp parallel for schedule(dynamic,50) private(i) +#endif for(int ii = 0; ii < nn; ++ii ) { i = ilist[ii]; if(atom->mask[i] & groupbit) { @@ -540,7 +548,9 @@ void FixQEqReaxOMP::init_matvec() } else { +#if defined(_OPENMP) #pragma omp parallel for schedule(dynamic,50) private(i) +#endif for(int ii = 0; ii < nn; ++ii ) { i = ilist[ii]; if(atom->mask[i] & groupbit) { @@ -605,8 +615,10 @@ int FixQEqReaxOMP::CG( double *b, double *x ) double tmp1, tmp2; tmp1 = tmp2 = 0.0; +#if defined(_OPENMP) #pragma omp parallel for schedule(dynamic,50) private(i) reduction(+:tmp1,tmp2) - for( jj = 0; jj < nn; ++jj ) { +#endif + for (jj = 0; jj < nn; ++jj ) { i = ilist[jj]; if (atom->mask[i] & groupbit) { r[i] = b[i] - q[i]; @@ -625,42 +637,50 @@ int FixQEqReaxOMP::CG( double *b, double *x ) b_norm = sqrt(buf[0]); sig_new = buf[1]; - for( i = 1; i < imax && sqrt(sig_new) / b_norm > tolerance; ++i ) { + for (i = 1; i < imax && sqrt(sig_new) / b_norm > tolerance; ++i ) { comm->forward_comm_fix(this); //Dist_vector( d ); sparse_matvec( &H, d, q ); comm->reverse_comm_fix(this); //Coll_vector( q ); tmp1 = 0.0; +#if defined(_OPENMP) #pragma omp parallel +#endif { +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) private(ii) reduction(+:tmp1) - for( jj = 0; jj < nn; jj++) { - ii = ilist[jj]; - if(atom->mask[ii] & groupbit) tmp1 += d[ii] * q[ii]; +#endif + for (jj = 0; jj < nn; jj++) { + ii = ilist[jj]; + if(atom->mask[ii] & groupbit) tmp1 += d[ii] * q[ii]; } +#if defined(_OPENMP) #pragma omp barrier #pragma omp master +#endif { - MPI_Allreduce(&tmp1, &tmp2, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&tmp1, &tmp2, 1, MPI_DOUBLE, MPI_SUM, world); - alpha = sig_new / tmp2; - tmp1 = 0.0; + alpha = sig_new / tmp2; + tmp1 = 0.0; } +#if defined(_OPENMP) #pragma omp barrier #pragma omp for schedule(dynamic,50) private(ii) reduction(+:tmp1) - for( jj = 0; jj < nn; jj++) { - ii = ilist[jj]; - if(atom->mask[ii] & groupbit) { - x[ii] += alpha * d[ii]; - r[ii] -= alpha * q[ii]; +#endif + for (jj = 0; jj < nn; jj++) { + ii = ilist[jj]; + if(atom->mask[ii] & groupbit) { + x[ii] += alpha * d[ii]; + r[ii] -= alpha * q[ii]; - // pre-conditioning - p[ii] = r[ii] * Hdia_inv[ii]; - tmp1 += r[ii] * p[ii]; - } + // pre-conditioning + p[ii] = r[ii] * Hdia_inv[ii]; + tmp1 += r[ii] * p[ii]; + } } } // omp parallel @@ -671,8 +691,10 @@ int FixQEqReaxOMP::CG( double *b, double *x ) sig_new = tmp2; beta = sig_new / sig_old; +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) private(ii) - for( jj = 0; jj < nn; jj++) { +#endif + for (jj = 0; jj < nn; jj++) { ii = ilist[jj]; if(atom->mask[ii] & groupbit) d[ii] = p[ii] + beta * d[ii]; } @@ -692,13 +714,19 @@ int FixQEqReaxOMP::CG( double *b, double *x ) void FixQEqReaxOMP::sparse_matvec( sparse_matrix *A, double *x, double *b ) { +#if defined(_OPENMP) #pragma omp parallel default(shared) +#endif { int i, j, itr_j; int nn, NN, ii; int *ilist; int nthreads = comm->nthreads; +#if defined(_OPENMP) int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif if(reaxc) { nn = reaxc->list->inum; @@ -710,42 +738,50 @@ void FixQEqReaxOMP::sparse_matvec( sparse_matrix *A, double *x, double *b ) ilist = list->ilist; } +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) +#endif for (ii = 0; ii < nn; ++ii) { i = ilist[ii]; if(atom->mask[i] & groupbit) b[i] = eta[ atom->type[i] ] * x[i]; } +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) +#endif for (ii = nn; ii < NN; ++ii) { i = ilist[ii]; if(atom->mask[i] & groupbit) b[i] = 0; } +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) +#endif for (i = 0; i < NN; ++i) for(int t=0; tmask[i] & groupbit) { - for (itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { - j = A->jlist[itr_j]; - b[i] += A->val[itr_j] * x[j]; + for (itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { + j = A->jlist[itr_j]; + b[i] += A->val[itr_j] * x[j]; - b_temp[tid][j] += A->val[itr_j] * x[i]; - } + b_temp[tid][j] += A->val[itr_j] * x[i]; + } } } // Wait till b_temp accumulated +#if defined(_OPENMP) #pragma omp barrier - #pragma omp for schedule(dynamic,50) +#endif for (i = 0; i < NN; ++i) for (int t = 0; t < nthreads; ++t) b[i] += b_temp[t][i]; @@ -772,7 +808,9 @@ void FixQEqReaxOMP::calculate_Q() double tmp1, tmp2; tmp1 = tmp2 = 0.0; +#if defined(_OPENMP) #pragma omp parallel for schedule(dynamic,50) private(i) reduction(+:tmp1,tmp2) +#endif for(int ii = 0; ii < nn; ii++) { i = ilist[ii]; if(atom->mask[i] & groupbit) { @@ -792,7 +830,9 @@ void FixQEqReaxOMP::calculate_Q() double u = buf[0] / buf[1]; +#if defined(_OPENMP) #pragma omp parallel for schedule(static) private(i) +#endif for (int ii = 0; ii < nn; ++ii) { i = ilist[ii]; if(atom->mask[i] & groupbit) { @@ -800,8 +840,8 @@ void FixQEqReaxOMP::calculate_Q() // backup s & t for (int k = 4; k > 0; --k) { - s_hist[i][k] = s_hist[i][k-1]; - t_hist[i][k] = t_hist[i][k-1]; + s_hist[i][k] = s_hist[i][k-1]; + t_hist[i][k] = t_hist[i][k-1]; } s_hist[i][0] = s[i]; t_hist[i][0] = t[i]; @@ -814,84 +854,6 @@ void FixQEqReaxOMP::calculate_Q() /* ---------------------------------------------------------------------- */ -// double FixQEqReaxOMP::parallel_norm( double *v, int n ) -// { -// int i; -// double my_sum, norm_sqr; - -// int *ilist; - -// if (reaxc) ilist = reaxc->list->ilist; -// else ilist = list->ilist; - -// my_sum = 0.0; -// norm_sqr = 0.0; - -// #pragma omp parallel for schedule(static) private(i) reduction(+:my_sum) -// for (int ii = 0; ii < n; ++ii) { -// i = ilist[ii]; -// if(atom->mask[i] & groupbit) my_sum += SQR( v[i] ); -// } - -// MPI_Allreduce( &my_sum, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); - -// return sqrt( norm_sqr ); -// } - -// /* ---------------------------------------------------------------------- */ - -// double FixQEqReaxOMP::parallel_dot( double *v1, double *v2, int n ) -// { -// int i; -// double my_dot, res; - -// int *ilist; - -// if (reaxc) ilist = reaxc->list->ilist; -// else ilist = list->ilist; - -// my_dot = 0.0; -// res = 0.0; - -// #pragma omp parallel for schedule(static) private(i) reduction(+:my_dot) -// for (int ii = 0; ii < n; ++ii) { -// i = ilist[ii]; -// if(atom->mask[i] & groupbit) my_dot += v1[i] * v2[i]; -// } - -// MPI_Allreduce( &my_dot, &res, 1, MPI_DOUBLE, MPI_SUM, world ); - -// return res; -// } - -// /* ---------------------------------------------------------------------- */ - -// double FixQEqReaxOMP::parallel_vector_acc( double *v, int n ) -// { -// int i; -// double my_acc, res; - -// int *ilist; - -// if (reaxc) ilist = reaxc->list->ilist; -// else ilist = list->ilist; - -// my_acc = 0.0; -// res = 0.0; - -// #pragma omp parallel for schedule(static) private(i) reduction(+:my_acc) -// for (int ii = 0; ii < n; ++ii) { -// i = ilist[ii]; -// if(atom->mask[i] & groupbit) my_acc += v[i]; -// } - -// MPI_Allreduce( &my_acc, &res, 1, MPI_DOUBLE, MPI_SUM, world ); - -// return res; -// } - -/* ---------------------------------------------------------------------- */ - void FixQEqReaxOMP::vector_sum( double* dest, double c, double* v, double d, double* y, int k ) { @@ -901,7 +863,9 @@ void FixQEqReaxOMP::vector_sum( double* dest, double c, double* v, if (reaxc) ilist = reaxc->list->ilist; else ilist = list->ilist; +#if defined(_OPENMP) #pragma omp parallel for schedule(static) private(i) +#endif for (int ii=0; iimask[i] & groupbit) dest[i] = c * v[i] + d * y[i]; @@ -918,7 +882,9 @@ void FixQEqReaxOMP::vector_add( double* dest, double c, double* v, int k ) if (reaxc) ilist = reaxc->list->ilist; else ilist = list->ilist; +#if defined(_OPENMP) #pragma omp parallel for schedule(static) private(i) +#endif for (int ii=0; iimask[i] & groupbit) dest[i] += c * v[i]; @@ -964,8 +930,10 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) double tmp1, tmp2, tmp3, tmp4; tmp1 = tmp2 = tmp3 = tmp4 = 0.0; +#if defined(_OPENMP) #pragma omp parallel for schedule(dynamic,50) private(i) reduction(+:tmp1,tmp2,tmp3,tmp4) - for( jj = 0; jj < nn; ++jj ) { +#endif + for (jj = 0; jj < nn; ++jj ) { i = ilist[jj]; if (atom->mask[i] & groupbit) { int indxI = 2 * i; @@ -996,58 +964,66 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) sig_new_s = buf[2]; sig_new_t = buf[3]; - for( i = 1; i < imax; ++i ) { + for (i = 1; i < imax; ++i ) { comm->forward_comm_fix(this); //Dist_vector( d ); dual_sparse_matvec( &H, d, q ); comm->reverse_comm_fix(this); //Coll_vector( q ); tmp1 = tmp2 = 0.0; +#if defined(_OPENMP) #pragma omp parallel +#endif { +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) private(ii) reduction(+:tmp1,tmp2) - for( jj = 0; jj < nn; jj++) { - ii = ilist[jj]; - if(atom->mask[ii] & groupbit) { - int indxI = 2 * ii; - tmp1 += d[indxI ] * q[indxI ]; - tmp2 += d[indxI+1] * q[indxI+1]; - } +#endif + for (jj = 0; jj < nn; jj++) { + ii = ilist[jj]; + if(atom->mask[ii] & groupbit) { + int indxI = 2 * ii; + tmp1 += d[indxI ] * q[indxI ]; + tmp2 += d[indxI+1] * q[indxI+1]; + } } +#if defined(_OPENMP) #pragma omp barrier #pragma omp master +#endif { - my_buf[0] = tmp1; - my_buf[1] = tmp2; + my_buf[0] = tmp1; + my_buf[1] = tmp2; - MPI_Allreduce(&my_buf, &buf, 2, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&my_buf, &buf, 2, MPI_DOUBLE, MPI_SUM, world); - alpha_s = sig_new_s / buf[0]; - alpha_t = sig_new_t / buf[1]; + alpha_s = sig_new_s / buf[0]; + alpha_t = sig_new_t / buf[1]; - tmp1 = tmp2 = 0.0; + tmp1 = tmp2 = 0.0; } +#if defined(_OPENMP) #pragma omp barrier #pragma omp for schedule(dynamic,50) private(ii) reduction(+:tmp1,tmp2) - for( jj = 0; jj < nn; jj++) { - ii = ilist[jj]; - if(atom->mask[ii] & groupbit) { - int indxI = 2 * ii; - x1[ii] += alpha_s * d[indxI ]; - x2[ii] += alpha_t * d[indxI+1]; +#endif + for (jj = 0; jj < nn; jj++) { + ii = ilist[jj]; + if(atom->mask[ii] & groupbit) { + int indxI = 2 * ii; + x1[ii] += alpha_s * d[indxI ]; + x2[ii] += alpha_t * d[indxI+1]; - r[indxI ] -= alpha_s * q[indxI ]; - r[indxI+1] -= alpha_t * q[indxI+1]; + r[indxI ] -= alpha_s * q[indxI ]; + r[indxI+1] -= alpha_t * q[indxI+1]; - // pre-conditioning - p[indxI ] = r[indxI ] * Hdia_inv[ii]; - p[indxI+1] = r[indxI+1] * Hdia_inv[ii]; + // pre-conditioning + p[indxI ] = r[indxI ] * Hdia_inv[ii]; + p[indxI+1] = r[indxI+1] * Hdia_inv[ii]; - tmp1 += r[indxI ] * p[indxI ]; - tmp2 += r[indxI+1] * p[indxI+1]; - } + tmp1 += r[indxI ] * p[indxI ]; + tmp2 += r[indxI+1] * p[indxI+1]; + } } } // omp parallel @@ -1067,14 +1043,16 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) beta_s = sig_new_s / sig_old_s; beta_t = sig_new_t / sig_old_t; +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) private(ii) - for( jj = 0; jj < nn; jj++) { +#endif + for (jj = 0; jj < nn; jj++) { ii = ilist[jj]; if(atom->mask[ii] & groupbit) { - int indxI = 2 * ii; + int indxI = 2 * ii; - d[indxI ] = p[indxI ] + beta_s * d[indxI ]; - d[indxI+1] = p[indxI+1] + beta_t * d[indxI+1]; + d[indxI ] = p[indxI ] + beta_s * d[indxI ]; + d[indxI+1] = p[indxI+1] + beta_t * d[indxI+1]; } } } @@ -1110,11 +1088,11 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) // Timing info for remainder of s or t #ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTECG2INDEX] += (endTimeBase-startTimeBase); - ompTimingCount[COMPUTECG2INDEX]++; - ompTimingCGCount[COMPUTECG2INDEX]+= i - matvecs; - startTimeBase = endTimeBase; + endTimeBase = MPI_Wtime(); + ompTimingData[COMPUTECG2INDEX] += (endTimeBase-startTimeBase); + ompTimingCount[COMPUTECG2INDEX]++; + ompTimingCGCount[COMPUTECG2INDEX]+= i - matvecs; + startTimeBase = endTimeBase; #endif if ( i >= imax && comm->me == 0) { @@ -1131,7 +1109,9 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2, double *b ) { +#if defined(_OPENMP) #pragma omp parallel default(shared) +#endif { int i, j, itr_j; int nn, NN, ii; @@ -1139,7 +1119,11 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 int indxI, indxJ; int nthreads = comm->nthreads; +#if defined(_OPENMP) int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif if (reaxc) { nn = reaxc->list->inum; @@ -1151,62 +1135,72 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 ilist = list->ilist; } +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) - for( ii = 0; ii < nn; ++ii ) { +#endif + for (ii = 0; ii < nn; ++ii ) { i = ilist[ii]; if (atom->mask[i] & groupbit) { - indxI = 2 * i; - b[indxI ] = eta[ atom->type[i] ] * x1[i]; - b[indxI+1] = eta[ atom->type[i] ] * x2[i]; + indxI = 2 * i; + b[indxI ] = eta[ atom->type[i] ] * x1[i]; + b[indxI+1] = eta[ atom->type[i] ] * x2[i]; } } +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) - for( ii = nn; ii < NN; ++ii ) { +#endif + for (ii = nn; ii < NN; ++ii ) { i = ilist[ii]; if (atom->mask[i] & groupbit) { - indxI = 2 * i; - b[indxI] = 0; - b[indxI+1] = 0; + indxI = 2 * i; + b[indxI] = 0; + b[indxI+1] = 0; } } +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) +#endif for (i = 0; i < NN; ++i) { indxI = 2 * i; for(int t=0; tmask[i] & groupbit) { - indxI = 2 * i; - for( itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { - j = A->jlist[itr_j]; - indxJ = 2 * j; - b[indxI ] += A->val[itr_j] * x1[j]; - b[indxI+1] += A->val[itr_j] * x2[j]; + indxI = 2 * i; + for (itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { + j = A->jlist[itr_j]; + indxJ = 2 * j; + b[indxI ] += A->val[itr_j] * x1[j]; + b[indxI+1] += A->val[itr_j] * x2[j]; - b_temp[tid][indxJ ] += A->val[itr_j] * x1[i]; - b_temp[tid][indxJ+1] += A->val[itr_j] * x2[i]; - } + b_temp[tid][indxJ ] += A->val[itr_j] * x1[i]; + b_temp[tid][indxJ+1] += A->val[itr_j] * x2[i]; + } } } // Wait till b_temp accumulated +#if defined(_OPENMP) #pragma omp barrier #pragma omp for schedule(dynamic,50) +#endif for (i = 0; i < NN; ++i) { indxI = 2 * i; for (int t = 0; t < nthreads; ++t) { - b[indxI ] += b_temp[t][indxI ]; - b[indxI+1] += b_temp[t][indxI+1]; + b[indxI ] += b_temp[t][indxI ]; + b[indxI+1] += b_temp[t][indxI+1]; } } @@ -1217,7 +1211,9 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) { +#if defined(_OPENMP) #pragma omp parallel default(shared) +#endif { int i, j, itr_j; int nn, NN, ii; @@ -1225,7 +1221,11 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) int indxI, indxJ; int nthreads = comm->nthreads; +#if defined(_OPENMP) int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif if (reaxc) { nn = reaxc->list->inum; @@ -1237,64 +1237,73 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) ilist = list->ilist; } +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) - for( ii = 0; ii < nn; ++ii ) { +#endif + for (ii = 0; ii < nn; ++ii ) { i = ilist[ii]; if (atom->mask[i] & groupbit) { - indxI = 2 * i; - b[indxI ] = eta[ atom->type[i] ] * x[indxI ]; - b[indxI+1] = eta[ atom->type[i] ] * x[indxI+1]; + indxI = 2 * i; + b[indxI ] = eta[ atom->type[i] ] * x[indxI ]; + b[indxI+1] = eta[ atom->type[i] ] * x[indxI+1]; } } +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) - for( ii = nn; ii < NN; ++ii ) { +#endif + for (ii = nn; ii < NN; ++ii ) { i = ilist[ii]; if (atom->mask[i] & groupbit) { - indxI = 2 * i; - b[indxI] = 0; - b[indxI+1] = 0; + indxI = 2 * i; + b[indxI] = 0; + b[indxI+1] = 0; } } +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) +#endif for (i = 0; i < NN; ++i) { indxI = 2 * i; for(int t=0; tmask[i] & groupbit) { - indxI = 2 * i; - for( itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { - j = A->jlist[itr_j]; - indxJ = 2 * j; - b[indxI ] += A->val[itr_j] * x[indxJ ]; - b[indxI+1] += A->val[itr_j] * x[indxJ+1]; + indxI = 2 * i; + for (itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { + j = A->jlist[itr_j]; + indxJ = 2 * j; + b[indxI ] += A->val[itr_j] * x[indxJ ]; + b[indxI+1] += A->val[itr_j] * x[indxJ+1]; - b_temp[tid][indxJ ] += A->val[itr_j] * x[indxI ]; - b_temp[tid][indxJ+1] += A->val[itr_j] * x[indxI+1]; - } + b_temp[tid][indxJ ] += A->val[itr_j] * x[indxI ]; + b_temp[tid][indxJ+1] += A->val[itr_j] * x[indxI+1]; + } } } // Wait till b_temp accumulated +#if defined(_OPENMP) #pragma omp barrier #pragma omp for schedule(dynamic,50) +#endif for (i = 0; i < NN; ++i) { indxI = 2 * i; for (int t = 0; t < nthreads; ++t) { - b[indxI ] += b_temp[t][indxI ]; - b[indxI+1] += b_temp[t][indxI+1]; + b[indxI ] += b_temp[t][indxI ]; + b[indxI+1] += b_temp[t][indxI+1]; } } - } // omp parallel } diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index f216b47665..e716188949 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -49,6 +49,10 @@ #include "reaxc_vector.h" #include "fix_reaxc_bonds.h" +#if defined(_OPENMP) +#include +#endif + using namespace LAMMPS_NS; #ifdef OMP_TIMING @@ -206,7 +210,9 @@ void PairReaxCOMP::compute(int eflag, int vflag) ompTimingData[COMPUTEINDEX] += (endTimeBase-startTimeBase); #endif +#if defined(_OPENMP) #pragma omp parallel for schedule(static) +#endif for(int k = 0; k < system->N; ++k) { num_bonds[k] = system->my_atoms[k].num_bonds; num_hbonds[k] = system->my_atoms[k].num_hbonds; @@ -269,7 +275,9 @@ void PairReaxCOMP::compute(int eflag, int vflag) memory->create(tmpbo,nmax,MAXSPECBOND,"pair:tmpbo"); } +#if defined(_OPENMP) #pragma omp parallel for collapse(2) schedule(static) default(shared) +#endif for (i = 0; i < system->N; i ++) for (j = 0; j < MAXSPECBOND; j ++) { tmpbo[i][j] = 0.0; @@ -330,8 +338,11 @@ void PairReaxCOMP::init_style( ) fix_reax = (FixReaxC *) modify->fix[modify->nfix-1]; } -#pragma omp parallel - { control->nthreads = omp_get_num_threads(); } +#if defined(_OPENMP) + control->nthreads = omp_get_max_threads(); +#else + control->nthreads = 1; +#endif } /* ---------------------------------------------------------------------- */ @@ -418,7 +429,9 @@ void PairReaxCOMP::write_reax_atoms() if (system->N > system->total_cap) error->all(FLERR,"Too many ghost atoms"); +#if defined(_OPENMP) #pragma omp parallel for schedule(static) default(shared) +#endif for( int i = 0; i < system->N; ++i ){ system->my_atoms[i].orig_id = atom->tag[i]; system->my_atoms[i].type = map[atom->type[i]]; @@ -498,9 +511,10 @@ int PairReaxCOMP::write_reax_lists() num_nbrs += numneigh[i]; } -//#pragma omp parallel for schedule(guided) default(shared) -#pragma omp parallel for schedule(dynamic,50) default(shared) \ - private(itr_i, itr_j, i, j, jlist, cutoff_sqr, num_mynbrs, d_sqr, dvec, dist) +#if defined(_OPENMP) +#pragma omp parallel for schedule(dynamic,50) default(shared) \ + private(itr_i, itr_j, i, j, jlist, cutoff_sqr, num_mynbrs, d_sqr, dvec, dist) +#endif for (itr_i = 0; itr_i < numall; ++itr_i) { i = ilist[itr_i]; jlist = firstneigh[i]; @@ -539,7 +553,9 @@ int PairReaxCOMP::write_reax_lists() void PairReaxCOMP::read_reax_forces(int vflag) { +#if defined(_OPENMP) #pragma omp parallel for schedule(static) default(shared) +#endif for( int i = 0; i < system->N; ++i ) { system->my_atoms[i].f[0] = workspace->f[i][0]; system->my_atoms[i].f[1] = workspace->f[i][1]; @@ -561,8 +577,10 @@ void PairReaxCOMP::FindBond() bond_data *bo_ij; bo_cut = 0.10; -#pragma omp parallel for schedule(static) default(shared) \ +#if defined(_OPENMP) +#pragma omp parallel for schedule(static) default(shared) \ private(i, nj, pj, bo_ij, j, bo_tmp) +#endif for (i = 0; i < system->n; i++) { nj = 0; for( pj = Start_Index(i, lists); pj < End_Index(i, lists); ++pj ) { @@ -573,10 +591,10 @@ void PairReaxCOMP::FindBond() bo_tmp = bo_ij->bo_data.BO; if (bo_tmp >= bo_cut ) { - tmpid[i][nj] = j; - tmpbo[i][nj] = bo_tmp; - nj ++; - if (nj > MAXSPECBOND) error->all(FLERR,"Increase MAXSPECBOND in fix_reaxc_species.h"); + tmpid[i][nj] = j; + tmpbo[i][nj] = bo_tmp; + nj ++; + if (nj > MAXSPECBOND) error->all(FLERR,"Increase MAXSPECBOND in fix_reaxc_species.h"); } } } diff --git a/src/USER-OMP/reaxc_bond_orders_omp.cpp b/src/USER-OMP/reaxc_bond_orders_omp.cpp index aaa311640e..1000954f6e 100644 --- a/src/USER-OMP/reaxc_bond_orders_omp.cpp +++ b/src/USER-OMP/reaxc_bond_orders_omp.cpp @@ -24,13 +24,16 @@ . ----------------------------------------------------------------------*/ -#include #include "pair_reaxc_omp.h" #include "reaxc_types.h" #include "reaxc_bond_orders_omp.h" #include "reaxc_list.h" #include "reaxc_vector.h" +#if defined(_OPENMP) +#include +#endif + using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ @@ -45,7 +48,11 @@ void Add_dBond_to_ForcesOMP( reax_system *system, int i, int pj, PairReaxCOMP *pair_reax_ptr = static_cast(system->pair_ptr); +#if defined(_OPENMP) int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); long reductionOffset = (system->N * tid); @@ -226,7 +233,11 @@ void Add_dBond_to_Forces_NPTOMP( reax_system *system, int i, int pj, simulation_ PairReaxCOMP *pair_reax_ptr = static_cast(system->pair_ptr); +#if defined(_OPENMP) int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); long reductionOffset = (system->N * tid); @@ -428,7 +439,9 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, int natoms = system->N; int nthreads = control->nthreads; +#if defined(_OPENMP) #pragma omp parallel default(shared) +#endif { int i, j, pj, type_i, type_j; int start_i, end_i, sym_index; @@ -443,10 +456,15 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, two_body_parameters *twbp; bond_order_data *bo_ij, *bo_ji; +#if defined(_OPENMP) int tid = omp_get_thread_num(); - +#else + int tid = 0; +#endif /* Calculate Deltaprime, Deltaprime_boc values */ +#if defined(_OPENMP) #pragma omp for schedule(static) +#endif for (i = 0; i < system->N; ++i) { type_i = system->my_atoms[i].type; if(type_i < 0) continue; @@ -459,11 +477,14 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, } // Wait till initialization complete +#if defined(_OPENMP) #pragma omp barrier - +#endif + /* Corrected Bond Order calculations */ -//#pragma omp for schedule(dynamic,50) +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for (i = 0; i < system->N; ++i) { type_i = system->my_atoms[i].type; if(type_i < 0) continue; @@ -625,11 +646,14 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, } // Wait for bo_ij to be updated +#if defined(_OPENMP) #pragma omp barrier - +#endif // Try to combine the following for-loop back into the for-loop above /*-------------------------*/ +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for (i = 0; i < system->N; ++i) { type_i = system->my_atoms[i].type; if(type_i < 0) continue; @@ -664,11 +688,14 @@ void BOOMP( reax_system *system, control_params *control, simulation_data *data, /*-------------------------*/ // Need to wait for total_bond_order to be accumulated. +#if defined(_OPENMP) #pragma omp barrier - +#endif /* Calculate some helper variables that are used at many places throughout force calculations */ +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for(j = 0; j < system->N; ++j ) { type_j = system->my_atoms[j].type; if(type_j < 0) continue; diff --git a/src/USER-OMP/reaxc_bonds_omp.cpp b/src/USER-OMP/reaxc_bonds_omp.cpp index 19433ce2e3..dcf788a79c 100644 --- a/src/USER-OMP/reaxc_bonds_omp.cpp +++ b/src/USER-OMP/reaxc_bonds_omp.cpp @@ -25,7 +25,6 @@ ----------------------------------------------------------------------*/ #include "pair_reaxc_omp.h" -#include #include "reaxc_bonds_omp.h" #include "reaxc_bond_orders_omp.h" @@ -33,6 +32,10 @@ #include "reaxc_tool_box.h" #include "reaxc_vector.h" +#if defined(_OPENMP) +#include +#endif + using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ @@ -56,8 +59,10 @@ void BondsOMP( reax_system *system, control_params *control, double gp37 = (int) system->reax_param.gp.l[37]; double total_Ebond = 0.0; +#if defined(_OPENMP) #pragma omp parallel default(shared) reduction(+: total_Ebond) - { +#endif + { int i, j, pj; int start_i, end_i; int type_i, type_j; @@ -68,7 +73,12 @@ void BondsOMP( reax_system *system, control_params *control, single_body_parameters *sbp_i, *sbp_j; two_body_parameters *twbp; bond_order_data *bo_ij; - int tid = omp_get_thread_num(); + +#if defined(_OPENMP) + int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif long reductionOffset = (system->N * tid); class PairReaxCOMP *pair_reax_ptr; @@ -79,7 +89,9 @@ void BondsOMP( reax_system *system, control_params *control, system->pair_ptr->vflag_either, natoms, system->pair_ptr->eatom, system->pair_ptr->vatom, thr); +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for (i = 0; i < natoms; ++i) { start_i = Start_Index(i, bonds); end_i = End_Index(i, bonds); diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index 47e439a3f7..4e37dac38d 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -25,7 +25,6 @@ ----------------------------------------------------------------------*/ #include "pair_reaxc_omp.h" -#include "omp.h" #include "thr_data.h" #include "reaxc_forces_omp.h" @@ -42,6 +41,10 @@ #include "reaxc_valence_angles_omp.h" #include "reaxc_vector.h" +#if defined(_OPENMP) +#include +#endif + using namespace LAMMPS_NS; // Functions defined in reaxc_forces.cpp @@ -140,10 +143,16 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, long totalReductionSize = system->N * nthreads; reax_list *bonds = (*lists) + BONDS; +#if defined(_OPENMP) #pragma omp parallel default(shared) //default(none) +#endif { int i, j, k, pj, pk, start_j, end_j; +#if defined(_OPENMP) int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif bond_order_data *bo_jk; class PairReaxCOMP *pair_reax_ptr; @@ -153,13 +162,17 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, pair_reax_ptr->ev_setup_thr_proxy(0, 1, natoms, system->pair_ptr->eatom, system->pair_ptr->vatom, thr); +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for (i = 0; i < system->N; ++i) { for (j = 0; j < nthreads; ++j) workspace->CdDelta[i] += workspace->CdDeltaReduction[system->N*j+i]; } +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) +#endif for (j = 0; j < system->N; ++j) { start_j = Start_Index(j, bonds); end_j = End_Index(j, bonds); @@ -183,7 +196,9 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, if(control->virial == 0) { +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) +#endif for (i = 0; i < system->N; ++i) { const int startj = Start_Index(i, bonds); const int endj = End_Index(i, bonds); @@ -194,7 +209,9 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, } else { +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) +#endif for (i = 0; i < system->N; ++i) { const int startj = Start_Index(i, bonds); const int endj = End_Index(i, bonds); @@ -207,14 +224,18 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, 0, 1, thr); +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for (i = 0; i < system->N; ++i) { for (j = 0; j < nthreads; ++j) rvec_Add( workspace->f[i], workspace->forceReduction[system->N*j+i] ); } +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for (i = 0; i < totalReductionSize; i++) { workspace->forceReduction[i][0] = 0; workspace->forceReduction[i][1] = 0; @@ -247,14 +268,18 @@ void Validate_ListsOMP( reax_system *system, storage *workspace, reax_list **lis reallocate_data *realloc = &(workspace->realloc); double saferzone = system->saferzone; +#if defined(_OPENMP) #pragma omp parallel default(shared) private(i, comp, Hindex) +#endif { /* bond list */ if( N > 0 ) { bonds = *lists + BONDS; +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for( i = 0; i < N; ++i ) { system->my_atoms[i].num_bonds = MAX(Num_Entries(i,bonds)*2, MIN_BONDS); @@ -275,7 +300,9 @@ void Validate_ListsOMP( reax_system *system, storage *workspace, reax_list **lis if( numH > 0 ) { hbonds = *lists + HBONDS; +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for( i = 0; i < n; ++i ) { Hindex = system->my_atoms[i].Hindex; if( Hindex > -1 ) { @@ -339,18 +366,25 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, /* uncorrected bond orders */ cutoff = control->bond_cut; -#pragma omp parallel default(shared) \ +#if defined(_OPENMP) +#pragma omp parallel default(shared) \ private(i, atom_i, type_i, pi, start_i, end_i, sbp_i, btop_i, ibond, ihb, ihb_top, \ - j, atom_j, type_j, pj, start_j, end_j, sbp_j, nbr_pj, jbond, jhb, twbp) + j, atom_j, type_j, pj, start_j, end_j, sbp_j, nbr_pj, jbond, jhb, twbp) +#endif { int nthreads = control->nthreads; +#if defined(_OPENMP) int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif long reductionOffset = system->N * tid; long totalReductionSize = system->N * nthreads; +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) reduction(+ : num_bonds) -//#pragma omp for schedule(guided) reduction(+ : num_bonds) +#endif for (i = 0; i < system->N; ++i) { atom_i = &(system->my_atoms[i]); type_i = atom_i->type; @@ -414,7 +448,9 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, int btop_j; // Update indices in critical section +#if defined(_OPENMP) #pragma omp critical +#endif { btop_i = End_Index( i, bonds ); btop_j = End_Index( j, bonds ); @@ -449,9 +485,13 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, } // for(i) // Need to wait for all indices and tmp arrays accumulated. +#if defined(_OPENMP) #pragma omp barrier +#endif +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) +#endif for(i=0; iN; i++) for(int t=0; tN + i; @@ -461,47 +501,22 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, workspace->total_bond_order[i] += tmp_bond_order[indx]; } - // Not needed anymore with newest BOp_OMP()? - //#pragma omp for schedule(guided) -// #pragma omp for schedule(dynamic,50) -// for (i = 0; i < system->N; ++i) { -// start_i = Start_Index(i, bonds); -// end_i = End_Index(i, bonds); - -// for (pi = start_i; pi < end_i; ++pi) { -// ibond = &(bonds->select.bond_list[pi]); -// j = ibond->nbr; - -// if (i < j) { -// start_j = Start_Index(j, bonds); -// end_j = End_Index(j, bonds); - -// for (pj = start_j; pj < end_j; ++pj) { -// jbond = &(bonds->select.bond_list[pj]); - -// if (jbond->nbr == i) { -// ibond->sym_index = pj; -// jbond->sym_index = pi; -// break; -// } -// } -// } -// } -// } - /* hydrogen bond list */ if (control->hbond_cut > 0) { cutoff = control->hbond_cut; -//#pragma omp for schedule(guided) reduction(+ : num_hbonds) +#if defined(_OPENMP) #pragma omp for schedule(dynamic,50) reduction(+ : num_hbonds) +#endif for (i = 0; i < system->n; ++i) { atom_i = &(system->my_atoms[i]); type_i = atom_i->type; sbp_i = &(system->reax_param.sbp[type_i]); ihb = sbp_i->p_hbond; +#if defined(_OPENMP) #pragma omp critical +#endif { if (ihb == 1 || ihb == 2) { @@ -525,10 +540,6 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, else if(jn && ihb == 2 && jhb == 1) jflag = 1; if(iflag || jflag) { - - // This critical section enforces H-bonds to be added by threads one at a time. -// #pragma omp critical -// { if(iflag) { ihb_top = End_Index(atom_i->Hindex, hbonds); Set_End_Index(atom_i->Hindex, ihb_top+1, hbonds); @@ -536,7 +547,6 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, jhb_top = End_Index(atom_j->Hindex, hbonds); Set_End_Index(atom_j->Hindex, jhb_top+1, hbonds); } - // } // omp critical if(iflag) { hbonds->select.hbond_list[ihb_top].nbr = j; @@ -561,7 +571,9 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, } // if(control->hbond > 0) // Zero buffers for others to use as intended. +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for(i=0; i #include "reaxc_hydrogen_bonds_omp.h" #include "reaxc_bond_orders_omp.h" @@ -34,6 +33,10 @@ #include "reaxc_valence_angles_omp.h" // To access Calculate_dCos_ThetaOMP() #include "reaxc_vector.h" +#if defined(_OPENMP) +#include +#endif + using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ @@ -50,8 +53,10 @@ void Hydrogen_BondsOMP( reax_system *system, control_params *control, const int nthreads = control->nthreads; long totalReductionSize = system->N; +#if defined(_OPENMP) #pragma omp parallel default(shared) //default(none) - { +#endif + { int i, j, k, pi, pk; int type_i, type_j, type_k; int start_j, end_j, hb_start_j, hb_end_j; @@ -80,7 +85,11 @@ void Hydrogen_BondsOMP( reax_system *system, control_params *control, hbond_list = hbonds->select.hbond_list; int natoms = system->n; +#if defined(_OPENMP) int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif const int idelta = 1 + natoms/nthreads; int ifrom = tid*idelta; int ito = ((ifrom + idelta) > natoms) ? natoms : ifrom + idelta; @@ -226,7 +235,9 @@ void Hydrogen_BondsOMP( reax_system *system, control_params *control, } } +#if defined(_OPENMP) #pragma omp critical +#endif { data->my_en.e_hb += e_hb_thr; } diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index 9e01280545..3ccd2fff64 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -36,7 +36,6 @@ #include "reaxc_system_props.h" #include "reaxc_tool_box.h" #include "reaxc_vector.h" -#include "omp.h" // Functions definedd in reaxc_init_md.cpp extern int Init_MPI_Datatypes(reax_system*, storage*, mpi_datatypes*, MPI_Comm, char*); diff --git a/src/USER-OMP/reaxc_multi_body_omp.cpp b/src/USER-OMP/reaxc_multi_body_omp.cpp index 7922d7fd0d..acbe4ec268 100644 --- a/src/USER-OMP/reaxc_multi_body_omp.cpp +++ b/src/USER-OMP/reaxc_multi_body_omp.cpp @@ -25,7 +25,6 @@ ----------------------------------------------------------------------*/ #include "pair_reaxc_omp.h" -#include #include "thr_data.h" #include "reaxc_multi_body_omp.h" @@ -33,6 +32,10 @@ #include "reaxc_list.h" #include "reaxc_vector.h" +#if defined(_OPENMP) +#include +#endif + using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ @@ -63,7 +66,9 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, double total_Eun = 0.0; double total_Eov = 0.0; +#if defined(_OPENMP) #pragma omp parallel default(shared) reduction(+:total_Elp, total_Eun, total_Eov) +#endif { int i, j, pj, type_i, type_j; double Delta_lpcorr, dfvl; @@ -83,7 +88,11 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, bond_data *pbond; bond_order_data *bo_ij; +#if defined(_OPENMP) int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif long reductionOffset = (system->N * tid); class PairReaxCOMP *pair_reax_ptr; @@ -94,7 +103,9 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, system->pair_ptr->vflag_either, natoms, system->pair_ptr->eatom, system->pair_ptr->vatom, thr); +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for ( i = 0; i < system->n; ++i) { type_i = system->my_atoms[i].type; if(type_i < 0) continue; @@ -156,9 +167,10 @@ void Atom_EnergyOMP( reax_system *system, control_params *control, } } } +#if defined(_OPENMP) #pragma omp barrier - #pragma omp for schedule(guided) +#endif for (i = 0; i < system->n; ++i) { type_i = system->my_atoms[i].type; if(type_i < 0) continue; diff --git a/src/USER-OMP/reaxc_nonbonded_omp.cpp b/src/USER-OMP/reaxc_nonbonded_omp.cpp index 583c02bd08..38a6d9e860 100644 --- a/src/USER-OMP/reaxc_nonbonded_omp.cpp +++ b/src/USER-OMP/reaxc_nonbonded_omp.cpp @@ -25,7 +25,6 @@ ----------------------------------------------------------------------*/ #include "pair_reaxc_omp.h" -#include #include "thr_data.h" #include "reaxc_types.h" @@ -36,6 +35,10 @@ #include "reaxc_list.h" #include "reaxc_vector.h" +#if defined(_OPENMP) +#include +#endif + using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ @@ -53,9 +56,15 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, double total_EvdW = 0.; double total_Eele = 0.; -#pragma omp parallel default(shared) reduction(+: total_EvdW, total_Eele) //default(none) +#if defined(_OPENMP) +#pragma omp parallel default(shared) reduction(+: total_EvdW, total_Eele) +#endif { - int tid = omp_get_thread_num(); +#if defined(_OPENMP) + int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif int i, j, pj; int start_i, end_i, orig_i, orig_j, flag; double powr_vdW1, powgi_vdW1; @@ -87,8 +96,9 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, e_lg = 0; de_lg = 0.0; -//#pragma omp for schedule(dynamic,50) +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for( i = 0; i < natoms; ++i ) { if(system->my_atoms[i].type < 0) continue; start_i = Start_Index(i, far_nbrs); @@ -258,7 +268,9 @@ void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *contro double total_EvdW = 0.; double total_Eele = 0.; +#if defined(_OPENMP) #pragma omp parallel default(shared) reduction(+:total_EvdW, total_Eele) +#endif { int i, j, pj, r; int type_i, type_j, tmin, tmax; @@ -270,7 +282,11 @@ void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *contro rvec temp, ext_press; far_neighbor_data *nbr_pj; LR_lookup_table *t; - int tid = omp_get_thread_num(); +#if defined(_OPENMP) + int tid = omp_get_thread_num(); + #else + int tid = 0; +#endif long froffset = (system->N * tid); class PairReaxCOMP *pair_reax_ptr; @@ -282,8 +298,9 @@ void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *contro natoms, system->pair_ptr->eatom, system->pair_ptr->vatom, thr); -//#pragma omp for schedule(dynamic,50) +#if defined(_OPENMP) #pragma omp for schedule(guided) +#endif for (i = 0; i < natoms; ++i) { type_i = system->my_atoms[i].type; if(type_i < 0) continue; diff --git a/src/USER-OMP/reaxc_torsion_angles_omp.cpp b/src/USER-OMP/reaxc_torsion_angles_omp.cpp index bb8bbe1cd7..a7b98f16b1 100644 --- a/src/USER-OMP/reaxc_torsion_angles_omp.cpp +++ b/src/USER-OMP/reaxc_torsion_angles_omp.cpp @@ -25,7 +25,6 @@ ----------------------------------------------------------------------*/ #include "pair_reaxc_omp.h" -#include #include "thr_data.h" #include "reaxc_types.h" @@ -35,6 +34,10 @@ #include "reaxc_tool_box.h" #include "reaxc_vector.h" +#if defined(_OPENMP) +#include +#endif + #define MIN_SINE 1e-10 using namespace LAMMPS_NS; @@ -107,7 +110,11 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, double delil[3], deljl[3], delkl[3]; double eng_tmp, f_scaler, fi_tmp[3], fj_tmp[3], fk_tmp[3]; - int tid = omp_get_thread_num(); +#if defined(_OPENMP) + int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif long reductionOffset = (system->N * tid); int num_thb_intrs = 0; class PairReaxCOMP *pair_reax_ptr; diff --git a/src/USER-OMP/reaxc_valence_angles_omp.cpp b/src/USER-OMP/reaxc_valence_angles_omp.cpp index c83e5de852..4ea1953fcf 100644 --- a/src/USER-OMP/reaxc_valence_angles_omp.cpp +++ b/src/USER-OMP/reaxc_valence_angles_omp.cpp @@ -25,7 +25,6 @@ ----------------------------------------------------------------------*/ #include "pair_reaxc_omp.h" -#include #include "thr_data.h" #include "reaxc_types.h" @@ -35,6 +34,10 @@ #include "reaxc_list.h" #include "reaxc_vector.h" +#if defined(_OPENMP) +#include +#endif + using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ @@ -161,7 +164,11 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, bond_data *pbond_ij, *pbond_jk, *pbond_jt; bond_order_data *bo_ij, *bo_jk, *bo_jt; - int tid = omp_get_thread_num(); +#if defined(_OPENMP) + int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif long reductionOffset = (system->N * tid); class PairReaxCOMP *pair_reax_ptr; pair_reax_ptr = static_cast(system->pair_ptr); From 99a68e487f0770b0972b38010c354193b71027b8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 25 May 2017 02:01:04 -0400 Subject: [PATCH 090/302] fix suffix style handling bug for adding fixes and computes --- src/GRANULAR/pair_gran_hooke_history.cpp | 2 +- src/input.cpp | 4 ++-- src/modify.cpp | 28 +++++++++++++++++------- src/modify.h | 4 ++-- src/output.cpp | 6 ++--- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index 6f2d3d69ce..e9662c9e73 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -424,7 +424,7 @@ void PairGranHookeHistory::init_style() fixarg[1] = (char *) "all"; fixarg[2] = (char *) "SHEAR_HISTORY"; fixarg[3] = dnumstr; - modify->add_fix(4,fixarg,1); + modify->add_fix(4,fixarg); delete [] fixarg; fix_history = (FixShearHistory *) modify->fix[modify->nfix-1]; fix_history->pair = this; diff --git a/src/input.cpp b/src/input.cpp index 76aba3d87e..570560373a 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -1478,7 +1478,7 @@ void Input::comm_style() void Input::compute() { - modify->add_compute(narg,arg,1); + modify->add_compute(narg,arg); } /* ---------------------------------------------------------------------- */ @@ -1556,7 +1556,7 @@ void Input::dump_modify() void Input::fix() { - modify->add_fix(narg,arg,1); + modify->add_fix(narg,arg); } /* ---------------------------------------------------------------------- */ diff --git a/src/modify.cpp b/src/modify.cpp index e24a2120ef..7af4576038 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -819,20 +819,26 @@ void Modify::add_fix(int narg, char **arg, int trysuffix) if (trysuffix && lmp->suffix_enable) { if (lmp->suffix) { - char estyle[256]; + int n = strlen(arg[2])+strlen(lmp->suffix)+2; + char *estyle = new char[n]; sprintf(estyle,"%s/%s",arg[2],lmp->suffix); if (fix_map->find(estyle) != fix_map->end()) { FixCreator fix_creator = (*fix_map)[estyle]; fix[ifix] = fix_creator(lmp,narg,arg); - } + delete[] fix[ifix]->style; + fix[ifix]->style = estyle; + } else delete[] estyle; } if (fix[ifix] == NULL && lmp->suffix2) { - char estyle[256]; + int n = strlen(arg[2])+strlen(lmp->suffix2)+2; + char *estyle = new char[n]; sprintf(estyle,"%s/%s",arg[2],lmp->suffix2); if (fix_map->find(estyle) != fix_map->end()) { FixCreator fix_creator = (*fix_map)[estyle]; fix[ifix] = fix_creator(lmp,narg,arg); - } + delete[] fix[ifix]->style; + fix[ifix]->style = estyle; + } else delete[] estyle; } } @@ -1018,20 +1024,26 @@ void Modify::add_compute(int narg, char **arg, int trysuffix) if (trysuffix && lmp->suffix_enable) { if (lmp->suffix) { - char estyle[256]; + int n = strlen(arg[2])+strlen(lmp->suffix)+2; + char *estyle = new char[n]; sprintf(estyle,"%s/%s",arg[2],lmp->suffix); if (compute_map->find(estyle) != compute_map->end()) { ComputeCreator compute_creator = (*compute_map)[estyle]; compute[ncompute] = compute_creator(lmp,narg,arg); - } + delete[] compute[ncompute]->style; + compute[ncompute]->style = estyle; + } else delete[] estyle; } if (compute[ncompute] == NULL && lmp->suffix2) { - char estyle[256]; + int n = strlen(arg[2])+strlen(lmp->suffix2)+2; + char *estyle = new char[n]; sprintf(estyle,"%s/%s",arg[2],lmp->suffix2); if (compute_map->find(estyle) != compute_map->end()) { ComputeCreator compute_creator = (*compute_map)[estyle]; compute[ncompute] = compute_creator(lmp,narg,arg); - } + delete[] compute[ncompute]->style; + compute[ncompute]->style = estyle; + } else delete[] estyle; } } diff --git a/src/modify.h b/src/modify.h index a1362241b6..3ded3cbab6 100644 --- a/src/modify.h +++ b/src/modify.h @@ -92,14 +92,14 @@ class Modify : protected Pointers { virtual int min_dof(); virtual int min_reset_ref(); - void add_fix(int, char **, int trysuffix=0); + void add_fix(int, char **, int trysuffix=1); void modify_fix(int, char **); void delete_fix(const char *); int find_fix(const char *); int find_fix_by_style(const char *); int check_package(const char *); - void add_compute(int, char **, int trysuffix=0); + void add_compute(int, char **, int trysuffix=1); void modify_compute(int, char **); void delete_compute(const char *); int find_compute(const char *); diff --git a/src/output.cpp b/src/output.cpp index 5e56ccfebc..ce7fcb7cca 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -49,18 +49,18 @@ Output::Output(LAMMPS *lmp) : Pointers(lmp) newarg[0] = (char *) "thermo_temp"; newarg[1] = (char *) "all"; newarg[2] = (char *) "temp"; - modify->add_compute(3,newarg,1); + modify->add_compute(3,newarg); newarg[0] = (char *) "thermo_press"; newarg[1] = (char *) "all"; newarg[2] = (char *) "pressure"; newarg[3] = (char *) "thermo_temp"; - modify->add_compute(4,newarg,1); + modify->add_compute(4,newarg); newarg[0] = (char *) "thermo_pe"; newarg[1] = (char *) "all"; newarg[2] = (char *) "pe"; - modify->add_compute(3,newarg,1); + modify->add_compute(3,newarg); delete [] newarg; From 5291f2ed6e8db047cb1195feb8e84afce2cd0d82 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 25 May 2017 10:11:24 -0400 Subject: [PATCH 091/302] fix bug in fix shear/history reported by kevin hanley. see #500 --- src/fix_shear_history.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fix_shear_history.cpp b/src/fix_shear_history.cpp index 21942d753f..17e78830f4 100644 --- a/src/fix_shear_history.cpp +++ b/src/fix_shear_history.cpp @@ -389,7 +389,7 @@ void FixShearHistory::pre_exchange_newton() maxtouch = 0; for (i = 0; i < nlocal_neigh; i++) maxtouch = MAX(maxtouch,npartner[i]); - comm->maxexchange_fix = MAX(comm->maxexchange_fix,4*maxtouch+1); + comm->maxexchange_fix = MAX(comm->maxexchange_fix,(dnum+1)*maxtouch+1); // zero npartner values from previous nlocal_neigh to current nlocal @@ -590,7 +590,7 @@ int FixShearHistory::pack_reverse_comm_size(int n, int first) last = first + n; for (i = first; i < last; i++) - m += 1 + 4*npartner[i]; + m += 1 + (dnum+1)*npartner[i]; return m; } From 0a2fe705114c3f7b54e74a4f2e84b128bbb97ebf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 25 May 2017 16:31:31 -0400 Subject: [PATCH 092/302] remove redundant code from fix qeq/reax and qeq/reax/omp --- src/USER-OMP/fix_qeq_reax_omp.cpp | 292 ++++++++---------------------- src/USER-OMP/fix_qeq_reax_omp.h | 8 - src/USER-REAXC/fix_qeq_reax.cpp | 185 +++++++++---------- 3 files changed, 161 insertions(+), 324 deletions(-) diff --git a/src/USER-OMP/fix_qeq_reax_omp.cpp b/src/USER-OMP/fix_qeq_reax_omp.cpp index 2603d649a3..3ca193be74 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.cpp +++ b/src/USER-OMP/fix_qeq_reax_omp.cpp @@ -22,7 +22,6 @@ #include #include #include - #include "fix_qeq_reax_omp.h" #include "pair_reaxc_omp.h" #include "atom.h" @@ -56,38 +55,15 @@ using namespace FixConst; FixQEqReaxOMP::FixQEqReaxOMP(LAMMPS *lmp, int narg, char **arg) : FixQEqReax(lmp, narg, arg) { - if (narg < 8 || narg > 9) error->all(FLERR,"Illegal fix qeq/reax/omp command"); - - nevery = force->inumeric(FLERR,arg[3]); - swa = force->numeric(FLERR,arg[4]); - swb = force->numeric(FLERR,arg[5]); - tolerance = force->numeric(FLERR,arg[6]); - - // dual CG support - dual_enabled = 0; - if(narg == 9) - if(strcmp(arg[8],"dual") == 0) dual_enabled = 1; - else error->all(FLERR,"Unknown fix qeq/reax argument in location 9"); - - // perform initial allocation of atom-based arrays - // register with Atom class - - s_hist = t_hist = NULL; - grow_arrays(atom->nmax); - atom->add_callback(0); - for (int i = 0; i < atom->nmax; i++ ) - for (int j = 0; j < nprev; ++j ) - s_hist[i][j] = t_hist[i][j] = 0; - - reaxc = NULL; - reaxc = (PairReaxCOMP *) force->pair_match("reax/c/omp",1); + if (narg<8 || narg>9) error->all(FLERR,"Illegal fix qeq/reax/omp command"); b_temp = NULL; // ASPC: Kolafa, J. Comp. Chem., 25(3), 335 (2003) do_aspc = 0; aspc_order = 1; - aspc_order_max = nprev - 2; // Must be consistent with nprev to store history: nprev = aspc_order + 2 + // Must be consistent with nprev to store history: nprev = aspc_order + 2 + aspc_order_max = nprev - 2; aspc_omega = 0.0; aspc_b = NULL; } @@ -106,63 +82,13 @@ void FixQEqReaxOMP::post_constructor() /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::pertype_parameters(char *arg) -{ - if (strcmp(arg,"reax/c") == 0) { - reaxflag = 1; - Pair *pair = force->pair_match("reax/c",0); - if (pair == NULL) error->all(FLERR,"No pair reax/c for fix qeq/reax/omp"); - int tmp; - chi = (double *) pair->extract("chi",tmp); - eta = (double *) pair->extract("eta",tmp); - gamma = (double *) pair->extract("gamma",tmp); - if (chi == NULL || eta == NULL || gamma == NULL) - error->all(FLERR, - "Fix qeq/reax/omp could not extract params from pair reax/c"); - return; - } - - int i,itype,ntypes; - double v1,v2,v3; - FILE *pf; - - reaxflag = 0; - ntypes = atom->ntypes; - - memory->create(chi,ntypes+1,"qeq/reax:chi"); - memory->create(eta,ntypes+1,"qeq/reax:eta"); - memory->create(gamma,ntypes+1,"qeq/reax:gamma"); - - if (comm->me == 0) { - if ((pf = fopen(arg,"r")) == NULL) - error->one(FLERR,"Fix qeq/reax/omp parameter file could not be found"); - - for (i = 1; i <= ntypes && !feof(pf); i++) { - fscanf(pf,"%d %lg %lg %lg",&itype,&v1,&v2,&v3); - if (itype < 1 || itype > ntypes) - error->one(FLERR,"Fix qeq/reax/omp invalid atom type in param file"); - chi[itype] = v1; - eta[itype] = v2; - gamma[itype] = v3; - } - if (i <= ntypes) error->one(FLERR,"Invalid param file for fix qeq/reax/omp"); - fclose(pf); - } - - MPI_Bcast(&chi[1],ntypes,MPI_DOUBLE,0,world); - MPI_Bcast(&eta[1],ntypes,MPI_DOUBLE,0,world); - MPI_Bcast(&gamma[1],ntypes,MPI_DOUBLE,0,world); -} - -/* ---------------------------------------------------------------------- */ - void FixQEqReaxOMP::allocate_storage() { FixQEqReax::allocate_storage(); // dual CG support int size = nmax; - if(dual_enabled) size*= 2; + if (dual_enabled) size*= 2; memory->create(b_temp, comm->nthreads, size, "qeq/reax/omp:b_temp"); } @@ -177,81 +103,12 @@ void FixQEqReaxOMP::deallocate_storage() /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::allocate_matrix() -{ - int i,ii,inum,m; - int *ilist, *numneigh; - - int mincap; - double safezone; - - if( reaxflag ) { - mincap = reaxc->system->mincap; - safezone = reaxc->system->safezone; - } else { - mincap = MIN_CAP; - safezone = SAFE_ZONE; - } - - n = atom->nlocal; - n_cap = MAX( (int)(n * safezone), mincap ); - - // determine the total space for the H matrix - - if (reaxc) { - inum = reaxc->list->inum; - ilist = reaxc->list->ilist; - numneigh = reaxc->list->numneigh; - } else { - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - } - - m = 0; - for (ii = 0; ii < inum; ii++ ) { - i = ilist[ii]; - m += numneigh[i]; - } - m_cap = MAX( (int)(m * safezone), mincap * MIN_NBRS ); - - H.n = n_cap; - H.m = m_cap; - memory->create(H.firstnbr,n_cap,"qeq:H.firstnbr"); - memory->create(H.numnbrs,n_cap,"qeq:H.numnbrs"); - memory->create(H.jlist,m_cap,"qeq:H.jlist"); - memory->create(H.val,m_cap,"qeq:H.val"); -} - -/* ---------------------------------------------------------------------- */ - void FixQEqReaxOMP::init() { - if (!atom->q_flag) error->all(FLERR,"Fix qeq/reax/omp requires atom attribute q"); - - ngroup = group->count(igroup); - if (ngroup == 0) error->all(FLERR,"Fix qeq/reax group has no atoms"); - - if (!force->pair_match("reax/c/omp",1)) - error->all(FLERR,"Must use pair_style reax/c/omp with fix qeq/reax/omp"); - - // need a half neighbor list w/ Newton off and ghost neighbors - // built whenever re-neighboring occurs - - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->pair = 0; - neighbor->requests[irequest]->fix = 1; - neighbor->requests[irequest]->newton = 2; - neighbor->requests[irequest]->ghost = 1; - - init_shielding(); - init_taper(); - - if (strstr(update->integrate_style,"respa")) - nlevels_respa = ((Respa *) update->integrate)->nlevels; + FixQEqReax::init(); // APSC setup - if(do_aspc) { + if (do_aspc) { memory->create(aspc_b, aspc_order_max+2, "qeq/reax/aspc_b"); // Calculate damping factor @@ -267,7 +124,7 @@ void FixQEqReaxOMP::init() double s = -1.0; double f = 2.0; - for(int i=1; iall(FLERR,"Early Termination"); } } @@ -295,7 +148,7 @@ void FixQEqReaxOMP::compute_H() double **x = atom->x; int *mask = atom->mask; - if(reaxc) { + if (reaxc) { inum = reaxc->list->inum; ilist = reaxc->list->ilist; numneigh = reaxc->list->numneigh; @@ -337,7 +190,7 @@ void FixQEqReaxOMP::compute_H() #endif for (ii = 0; ii < inum; ii++) { i = ilist[ii]; - if(mask[i] & groupbit) { + if (mask[i] & groupbit) { jlist = firstneigh[i]; jnum = numneigh[i]; mfill = H.firstnbr[i]; @@ -363,7 +216,7 @@ void FixQEqReaxOMP::compute_H() } } - if( flag ) { + if (flag) { H.jlist[mfill] = j; H.val[mfill] = calculate_H( sqrt(r_sqr), shld[type[i]][type[j]] ); mfill++; @@ -377,7 +230,7 @@ void FixQEqReaxOMP::compute_H() if (mfill >= H.m) { char str[128]; sprintf(str,"H matrix size has been exceeded: mfill=%d H.m=%d\n", - mfill, H.m ); + mfill, H.m); error->warning(FLERR,str); error->all(FLERR,"Fix qeq/reax/omp has insufficient QEq matrix size"); } @@ -391,7 +244,7 @@ void FixQEqReaxOMP::init_storage() { int NN; - if(reaxc) NN = reaxc->list->inum + reaxc->list->gnum; + if (reaxc) NN = reaxc->list->inum + reaxc->list->gnum; else NN = list->inum + list->gnum; #if defined(_OPENMP) @@ -420,7 +273,7 @@ void FixQEqReaxOMP::pre_force(int vflag) double t_start, t_end; if (update->ntimestep % nevery) return; - if( comm->me == 0 ) t_start = MPI_Wtime(); + if (comm->me == 0) t_start = MPI_Wtime(); n = atom->nlocal; N = atom->nlocal + atom->nghost; @@ -428,8 +281,8 @@ void FixQEqReaxOMP::pre_force(int vflag) // grow arrays if necessary // need to be atom->nmax in length - if( atom->nmax > nmax ) reallocate_storage(); - if( n > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE ) + if (atom->nmax > nmax) reallocate_storage(); + if (n > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE) reallocate_matrix(); #ifdef OMP_TIMING @@ -444,9 +297,9 @@ void FixQEqReaxOMP::pre_force(int vflag) startTimeBase = endTimeBase; #endif - if(dual_enabled) matvecs = dual_CG(b_s, b_t, s, t); // OMP_TIMING inside dual_CG - else { - + if (dual_enabled) { + matvecs = dual_CG(b_s, b_t, s, t); // OMP_TIMING inside dual_CG + } else { matvecs_s = CG(b_s, s); // CG on s - parallel #ifdef OMP_TIMING @@ -467,9 +320,7 @@ void FixQEqReaxOMP::pre_force(int vflag) startTimeBase = endTimeBase; #endif - } // if(dual_enabled) - - // if(comm->me == 0) fprintf(stdout,"matvecs= %i %i\n",matvecs_s,matvecs_t); + } // if (dual_enabled) #ifdef OMP_TIMING startTimeBase = MPI_Wtime(); @@ -482,7 +333,7 @@ void FixQEqReaxOMP::pre_force(int vflag) ompTimingData[COMPUTECALCQINDEX] += (endTimeBase-startTimeBase); #endif - if( comm->me == 0 ) { + if (comm->me == 0) { t_end = MPI_Wtime(); qeq_time = t_end - t_start; } @@ -508,7 +359,7 @@ void FixQEqReaxOMP::init_matvec() int nn,i; int *ilist; - if(reaxc) { + if (reaxc) { nn = reaxc->list->inum; ilist = reaxc->list->ilist; } else { @@ -517,15 +368,15 @@ void FixQEqReaxOMP::init_matvec() } // Should really be more careful with initialization and first (aspc_order+2) MD steps - if(do_aspc) { + if (do_aspc) { double m_aspc_omega = 1.0 - aspc_omega; #if defined(_OPENMP) #pragma omp parallel for schedule(dynamic,50) private(i) #endif - for(int ii = 0; ii < nn; ++ii ) { + for (int ii = 0; ii < nn; ++ii) { i = ilist[ii]; - if(atom->mask[i] & groupbit) { + if (atom->mask[i] & groupbit) { /* init pre-conditioner for H and init solution vectors */ Hdia_inv[i] = 1. / eta[ atom->type[i] ]; @@ -535,7 +386,7 @@ void FixQEqReaxOMP::init_matvec() // Predictor Step double tp = 0.0; double sp = 0.0; - for(int j=0; jmask[i] & groupbit) { + if (atom->mask[i] & groupbit) { /* init pre-conditioner for H and init solution vectors */ Hdia_inv[i] = 1. / eta[ atom->type[i] ]; @@ -588,10 +439,10 @@ void FixQEqReaxOMP::init_matvec() /* ---------------------------------------------------------------------- */ -int FixQEqReaxOMP::CG( double *b, double *x ) +int FixQEqReaxOMP::CG( double *b, double *x) { - int i, ii, j, imax; - double tmp, alpha, beta, b_norm; + int i, ii, imax; + double alpha, beta, b_norm; double sig_old, sig_new; double my_buf[2], buf[2]; @@ -610,7 +461,7 @@ int FixQEqReaxOMP::CG( double *b, double *x ) pack_flag = 1; sparse_matvec( &H, x, q ); - comm->reverse_comm_fix( this ); //Coll_Vector( q ); + comm->reverse_comm_fix( this); //Coll_Vector( q ); double tmp1, tmp2; tmp1 = tmp2 = 0.0; @@ -618,7 +469,7 @@ int FixQEqReaxOMP::CG( double *b, double *x ) #if defined(_OPENMP) #pragma omp parallel for schedule(dynamic,50) private(i) reduction(+:tmp1,tmp2) #endif - for (jj = 0; jj < nn; ++jj ) { + for (jj = 0; jj < nn; ++jj) { i = ilist[jj]; if (atom->mask[i] & groupbit) { r[i] = b[i] - q[i]; @@ -637,7 +488,7 @@ int FixQEqReaxOMP::CG( double *b, double *x ) b_norm = sqrt(buf[0]); sig_new = buf[1]; - for (i = 1; i < imax && sqrt(sig_new) / b_norm > tolerance; ++i ) { + for (i = 1; i < imax && sqrt(sig_new) / b_norm > tolerance; ++i) { comm->forward_comm_fix(this); //Dist_vector( d ); sparse_matvec( &H, d, q ); comm->reverse_comm_fix(this); //Coll_vector( q ); @@ -653,7 +504,7 @@ int FixQEqReaxOMP::CG( double *b, double *x ) #endif for (jj = 0; jj < nn; jj++) { ii = ilist[jj]; - if(atom->mask[ii] & groupbit) tmp1 += d[ii] * q[ii]; + if (atom->mask[ii] & groupbit) tmp1 += d[ii] * q[ii]; } #if defined(_OPENMP) @@ -673,7 +524,7 @@ int FixQEqReaxOMP::CG( double *b, double *x ) #endif for (jj = 0; jj < nn; jj++) { ii = ilist[jj]; - if(atom->mask[ii] & groupbit) { + if (atom->mask[ii] & groupbit) { x[ii] += alpha * d[ii]; r[ii] -= alpha * q[ii]; @@ -696,7 +547,7 @@ int FixQEqReaxOMP::CG( double *b, double *x ) #endif for (jj = 0; jj < nn; jj++) { ii = ilist[jj]; - if(atom->mask[ii] & groupbit) d[ii] = p[ii] + beta * d[ii]; + if (atom->mask[ii] & groupbit) d[ii] = p[ii] + beta * d[ii]; } } @@ -712,7 +563,7 @@ int FixQEqReaxOMP::CG( double *b, double *x ) /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::sparse_matvec( sparse_matrix *A, double *x, double *b ) +void FixQEqReaxOMP::sparse_matvec( sparse_matrix *A, double *x, double *b) { #if defined(_OPENMP) #pragma omp parallel default(shared) @@ -728,7 +579,7 @@ void FixQEqReaxOMP::sparse_matvec( sparse_matrix *A, double *x, double *b ) int tid = 0; #endif - if(reaxc) { + if (reaxc) { nn = reaxc->list->inum; NN = reaxc->list->inum + reaxc->list->gnum; ilist = reaxc->list->ilist; @@ -743,7 +594,7 @@ void FixQEqReaxOMP::sparse_matvec( sparse_matrix *A, double *x, double *b ) #endif for (ii = 0; ii < nn; ++ii) { i = ilist[ii]; - if(atom->mask[i] & groupbit) b[i] = eta[ atom->type[i] ] * x[i]; + if (atom->mask[i] & groupbit) b[i] = eta[ atom->type[i] ] * x[i]; } #if defined(_OPENMP) @@ -751,14 +602,14 @@ void FixQEqReaxOMP::sparse_matvec( sparse_matrix *A, double *x, double *b ) #endif for (ii = nn; ii < NN; ++ii) { i = ilist[ii]; - if(atom->mask[i] & groupbit) b[i] = 0; + if (atom->mask[i] & groupbit) b[i] = 0; } #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif for (i = 0; i < NN; ++i) - for(int t=0; tmask[i] & groupbit) { + if (atom->mask[i] & groupbit) { for (itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { j = A->jlist[itr_j]; b[i] += A->val[itr_j] * x[j]; @@ -811,9 +662,9 @@ void FixQEqReaxOMP::calculate_Q() #if defined(_OPENMP) #pragma omp parallel for schedule(dynamic,50) private(i) reduction(+:tmp1,tmp2) #endif - for(int ii = 0; ii < nn; ii++) { + for (int ii = 0; ii < nn; ii++) { i = ilist[ii]; - if(atom->mask[i] & groupbit) { + if (atom->mask[i] & groupbit) { tmp1 += s[i]; tmp2 += t[i]; } @@ -835,7 +686,7 @@ void FixQEqReaxOMP::calculate_Q() #endif for (int ii = 0; ii < nn; ++ii) { i = ilist[ii]; - if(atom->mask[i] & groupbit) { + if (atom->mask[i] & groupbit) { q[i] = s[i] - u * t[i]; // backup s & t @@ -849,13 +700,13 @@ void FixQEqReaxOMP::calculate_Q() } pack_flag = 4; - comm->forward_comm_fix( this ); //Dist_vector( atom->q ); + comm->forward_comm_fix( this); //Dist_vector( atom->q ); } /* ---------------------------------------------------------------------- */ void FixQEqReaxOMP::vector_sum( double* dest, double c, double* v, - double d, double* y, int k ) + double d, double* y, int k) { int i; int *ilist; @@ -868,13 +719,13 @@ void FixQEqReaxOMP::vector_sum( double* dest, double c, double* v, #endif for (int ii=0; iimask[i] & groupbit) dest[i] = c * v[i] + d * y[i]; + if (atom->mask[i] & groupbit) dest[i] = c * v[i] + d * y[i]; } } /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::vector_add( double* dest, double c, double* v, int k ) +void FixQEqReaxOMP::vector_add( double* dest, double c, double* v, int k) { int i; int *ilist; @@ -887,7 +738,7 @@ void FixQEqReaxOMP::vector_add( double* dest, double c, double* v, int k ) #endif for (int ii=0; iimask[i] & groupbit) dest[i] += c * v[i]; + if (atom->mask[i] & groupbit) dest[i] += c * v[i]; } } @@ -897,7 +748,7 @@ void FixQEqReaxOMP::vector_add( double* dest, double c, double* v, int k ) /* dual CG support */ /* ---------------------------------------------------------------------- */ -int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) +int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) { #ifdef OMP_TIMING @@ -905,8 +756,8 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) startTimeBase = MPI_Wtime(); #endif - int i, j, imax; - double tmp, alpha_s, alpha_t, beta_s, beta_t, b_norm_s, b_norm_t; + int i, imax; + double alpha_s, alpha_t, beta_s, beta_t, b_norm_s, b_norm_t; double sig_old_s, sig_old_t, sig_new_s, sig_new_t; double my_buf[4], buf[4]; @@ -925,7 +776,7 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) pack_flag = 5; // forward 2x d and reverse 2x q dual_sparse_matvec( &H, x1, x2, q ); - comm->reverse_comm_fix( this ); //Coll_Vector( q ); + comm->reverse_comm_fix( this); //Coll_Vector( q ); double tmp1, tmp2, tmp3, tmp4; tmp1 = tmp2 = tmp3 = tmp4 = 0.0; @@ -933,7 +784,7 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) #if defined(_OPENMP) #pragma omp parallel for schedule(dynamic,50) private(i) reduction(+:tmp1,tmp2,tmp3,tmp4) #endif - for (jj = 0; jj < nn; ++jj ) { + for (jj = 0; jj < nn; ++jj) { i = ilist[jj]; if (atom->mask[i] & groupbit) { int indxI = 2 * i; @@ -964,7 +815,7 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) sig_new_s = buf[2]; sig_new_t = buf[3]; - for (i = 1; i < imax; ++i ) { + for (i = 1; i < imax; ++i) { comm->forward_comm_fix(this); //Dist_vector( d ); dual_sparse_matvec( &H, d, q ); comm->reverse_comm_fix(this); //Coll_vector( q ); @@ -980,7 +831,7 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) #endif for (jj = 0; jj < nn; jj++) { ii = ilist[jj]; - if(atom->mask[ii] & groupbit) { + if (atom->mask[ii] & groupbit) { int indxI = 2 * ii; tmp1 += d[indxI ] * q[indxI ]; tmp2 += d[indxI+1] * q[indxI+1]; @@ -1009,7 +860,7 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) #endif for (jj = 0; jj < nn; jj++) { ii = ilist[jj]; - if(atom->mask[ii] & groupbit) { + if (atom->mask[ii] & groupbit) { int indxI = 2 * ii; x1[ii] += alpha_s * d[indxI ]; x2[ii] += alpha_t * d[indxI+1]; @@ -1038,7 +889,8 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) sig_new_s = buf[0]; sig_new_t = buf[1]; - if( sqrt(sig_new_s)/b_norm_s <= tolerance || sqrt(sig_new_t)/b_norm_t <= tolerance) break; + if (sqrt(sig_new_s)/b_norm_s <= tolerance + || sqrt(sig_new_t)/b_norm_t <= tolerance) break; beta_s = sig_new_s / sig_old_s; beta_t = sig_new_t / sig_old_t; @@ -1048,7 +900,7 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) #endif for (jj = 0; jj < nn; jj++) { ii = ilist[jj]; - if(atom->mask[ii] & groupbit) { + if (atom->mask[ii] & groupbit) { int indxI = 2 * ii; d[indxI ] = p[indxI ] + beta_s * d[indxI ]; @@ -1071,14 +923,14 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) #endif // If necessary, converge other system - if(sqrt(sig_new_s)/b_norm_s > tolerance) { + if (sqrt(sig_new_s)/b_norm_s > tolerance) { pack_flag = 2; comm->forward_comm_fix(this); // x1 => s i+= CG(b1, x1); matvecs_s = i; } - else if(sqrt(sig_new_t)/b_norm_t > tolerance) { + else if (sqrt(sig_new_t)/b_norm_t > tolerance) { pack_flag = 3; comm->forward_comm_fix(this); // x2 => t @@ -1107,7 +959,7 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2 ) /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2, double *b ) +void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2, double *b) { #if defined(_OPENMP) #pragma omp parallel default(shared) @@ -1138,7 +990,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (ii = 0; ii < nn; ++ii ) { + for (ii = 0; ii < nn; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) { indxI = 2 * i; @@ -1150,7 +1002,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (ii = nn; ii < NN; ++ii ) { + for (ii = nn; ii < NN; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) { indxI = 2 * i; @@ -1164,7 +1016,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 #endif for (i = 0; i < NN; ++i) { indxI = 2 * i; - for(int t=0; tmask[i] & groupbit) { indxI = 2 * i; @@ -1240,7 +1092,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (ii = 0; ii < nn; ++ii ) { + for (ii = 0; ii < nn; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) { indxI = 2 * i; @@ -1252,7 +1104,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (ii = nn; ii < NN; ++ii ) { + for (ii = nn; ii < NN; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) { indxI = 2 * i; @@ -1266,7 +1118,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) #endif for (i = 0; i < NN; ++i) { indxI = 2 * i; - for(int t=0; tmask[i] & groupbit) { indxI = 2 * i; diff --git a/src/USER-OMP/fix_qeq_reax_omp.h b/src/USER-OMP/fix_qeq_reax_omp.h index 6d8719857d..078ba3b9af 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.h +++ b/src/USER-OMP/fix_qeq_reax_omp.h @@ -47,17 +47,13 @@ class FixQEqReaxOMP : public FixQEqReax { protected: double **b_temp; - class PairReaxCOMP *reaxc; - int do_aspc; int aspc_order, aspc_order_max; double aspc_omega; double * aspc_b; - virtual void pertype_parameters(char*); virtual void allocate_storage(); virtual void deallocate_storage(); - virtual void allocate_matrix(); virtual void init_matvec(); virtual void compute_H(); @@ -65,10 +61,6 @@ class FixQEqReaxOMP : public FixQEqReax { virtual void sparse_matvec(sparse_matrix*,double*,double*); virtual void calculate_Q(); - /* virtual double parallel_norm( double*, int ); */ - /* virtual double parallel_dot( double*, double*, int ); */ - /* virtual double parallel_vector_acc( double*, int ); */ - virtual void vector_sum(double*,double,double*,double,double*,int); virtual void vector_add(double*, double, double*,int); diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 5f171c8768..cf2e6612a2 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -68,7 +68,7 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : { if (lmp->citeme) lmp->citeme->add(cite_fix_qeq_reax); - if (narg < 8 || narg > 9) error->all(FLERR,"Illegal fix qeq/reax command"); + if (narg<8 || narg>9) error->all(FLERR,"Illegal fix qeq/reax command"); nevery = force->inumeric(FLERR,arg[3]); if (nevery <= 0) error->all(FLERR,"Illegal fix qeq/reax command"); @@ -81,8 +81,12 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : strcpy(pertype_option,arg[7]); // dual CG support only available for USER-OMP variant + // check for compatibility is in Fix::post_constructor() dual_enabled = 0; - + if (narg == 9) { + if (strcmp(arg[8],"dual") == 0) dual_enabled = 1; + else error->all(FLERR,"Illegal fix qeq/reax command"); + } shld = NULL; n = n_cap = 0; @@ -111,26 +115,25 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : H.jlist = NULL; H.val = NULL; - comm_forward = comm_reverse = 1; + // dual CG support + // Update comm sizes for this fix + if (dual_enabled) comm_forward = comm_reverse = 2; + else comm_forward = comm_reverse = 1; // perform initial allocation of atom-based arrays // register with Atom class reaxc = NULL; - reaxc = (PairReaxC *) force->pair_match("reax/c",1); + reaxc = (PairReaxC *) force->pair_match("reax/c",0); if (reaxc) { s_hist = t_hist = NULL; grow_arrays(atom->nmax); atom->add_callback(0); - for( int i = 0; i < atom->nmax; i++ ) - for (int j = 0; j < nprev; ++j ) + for (int i = 0; i < atom->nmax; i++) + for (int j = 0; j < nprev; ++j) s_hist[i][j] = t_hist[i][j] = 0; } - - // dual CG support - // Update comm sizes for this fix - if (dual_enabled) comm_forward = comm_reverse = 2; } /* ---------------------------------------------------------------------- */ @@ -165,6 +168,8 @@ FixQEqReax::~FixQEqReax() void FixQEqReax::post_constructor() { pertype_parameters(pertype_option); + if (dual_enabled) + error->all(FLERR,"Dual keyword only supported with fix qeq/reax/omp"); } /* ---------------------------------------------------------------------- */ @@ -184,11 +189,9 @@ void FixQEqReax::pertype_parameters(char *arg) { if (strcmp(arg,"reax/c") == 0) { reaxflag = 1; - Pair *pair = force->pair_match("reax/c",1); - if (pair == NULL) - pair = force->pair_match("reax/c/kk",1); - + Pair *pair = force->pair_match("reax/c",0); if (pair == NULL) error->all(FLERR,"No pair reax/c for fix qeq/reax"); + int tmp; chi = (double *) pair->extract("chi",tmp); eta = (double *) pair->extract("eta",tmp); @@ -199,10 +202,6 @@ void FixQEqReax::pertype_parameters(char *arg) return; } - // OMP style will use it's own pertype_parameters() - Pair * pair = force->pair_match("reax/c/omp",1); - if (pair) return; - int i,itype,ntypes; double v1,v2,v3; FILE *pf; @@ -298,7 +297,7 @@ void FixQEqReax::allocate_matrix() int mincap; double safezone; - if( reaxflag ) { + if (reaxflag) { mincap = reaxc->system->mincap; safezone = reaxc->system->safezone; } else { @@ -307,7 +306,7 @@ void FixQEqReax::allocate_matrix() } n = atom->nlocal; - n_cap = MAX( (int)(n * safezone), mincap ); + n_cap = MAX( (int)(n * safezone), mincap); // determine the total space for the H matrix @@ -322,11 +321,11 @@ void FixQEqReax::allocate_matrix() } m = 0; - for( ii = 0; ii < inum; ii++ ) { + for (ii = 0; ii < inum; ii++) { i = ilist[ii]; m += numneigh[i]; } - m_cap = MAX( (int)(m * safezone), mincap * MIN_NBRS ); + m_cap = MAX( (int)(m * safezone), mincap * MIN_NBRS); H.n = n_cap; H.m = m_cap; @@ -358,18 +357,12 @@ void FixQEqReax::reallocate_matrix() void FixQEqReax::init() { - if (!atom->q_flag) error->all(FLERR,"Fix qeq/reax requires atom attribute q"); + if (!atom->q_flag) + error->all(FLERR,"Fix qeq/reax requires atom attribute q"); ngroup = group->count(igroup); if (ngroup == 0) error->all(FLERR,"Fix qeq/reax group has no atoms"); - /* - if (reaxc) - if (ngroup != reaxc->ngroup) - error->all(FLERR,"Fix qeq/reax group and pair reax/c have " - "different numbers of atoms"); - */ - // need a half neighbor list w/ Newton off and ghost neighbors // built whenever re-neighboring occurs @@ -404,9 +397,9 @@ void FixQEqReax::init_shielding() if (shld == NULL) memory->create(shld,ntypes+1,ntypes+1,"qeq:shielding"); - for( i = 1; i <= ntypes; ++i ) - for( j = 1; j <= ntypes; ++j ) - shld[i][j] = pow( gamma[i] * gamma[j], -1.5 ); + for (i = 1; i <= ntypes; ++i) + for (j = 1; j <= ntypes; ++j) + shld[i][j] = pow( gamma[i] * gamma[j], -1.5); } /* ---------------------------------------------------------------------- */ @@ -422,21 +415,21 @@ void FixQEqReax::init_taper() else if (swb < 5 && comm->me == 0) error->warning(FLERR,"Fix qeq/reax has very low Taper radius cutoff"); - d7 = pow( swb - swa, 7 ); - swa2 = SQR( swa ); - swa3 = CUBE( swa ); - swb2 = SQR( swb ); - swb3 = CUBE( swb ); + d7 = pow( swb - swa, 7); + swa2 = SQR( swa); + swa3 = CUBE( swa); + swb2 = SQR( swb); + swb3 = CUBE( swb); Tap[7] = 20.0 / d7; Tap[6] = -70.0 * (swa + swb) / d7; Tap[5] = 84.0 * (swa2 + 3.0*swa*swb + swb2) / d7; - Tap[4] = -35.0 * (swa3 + 9.0*swa2*swb + 9.0*swa*swb2 + swb3 ) / d7; - Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3 ) / d7; + Tap[4] = -35.0 * (swa3 + 9.0*swa2*swb + 9.0*swa*swb2 + swb3) / d7; + Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3) / d7; Tap[2] =-210.0 * (swa3*swb2 + swa2*swb3) / d7; Tap[1] = 140.0 * swa3 * swb3 / d7; Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 + - 7.0*swa*swb3*swb3 + swb3*swb3*swb ) / d7; + 7.0*swa*swb3*swb3 + swb3*swb3*swb) / d7; } /* ---------------------------------------------------------------------- */ @@ -480,7 +473,7 @@ void FixQEqReax::init_storage() else NN = list->inum + list->gnum; - for( int i = 0; i < NN; i++ ) { + for (int i = 0; i < NN; i++) { Hdia_inv[i] = 1. / eta[atom->type[i]]; b_s[i] = -chi[atom->type[i]]; b_t[i] = -1.0; @@ -497,7 +490,7 @@ void FixQEqReax::pre_force(int vflag) double t_start, t_end; if (update->ntimestep % nevery) return; - if( comm->me == 0 ) t_start = MPI_Wtime(); + if (comm->me == 0) t_start = MPI_Wtime(); n = atom->nlocal; N = atom->nlocal + atom->nghost; @@ -505,8 +498,8 @@ void FixQEqReax::pre_force(int vflag) // grow arrays if necessary // need to be atom->nmax in length - if( atom->nmax > nmax ) reallocate_storage(); - if( n > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE ) + if (atom->nmax > nmax) reallocate_storage(); + if (n > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE) reallocate_matrix(); init_matvec(); @@ -555,7 +548,7 @@ void FixQEqReax::init_matvec() ilist = list->ilist; } - for( ii = 0; ii < nn; ++ii ) { + for (ii = 0; ii < nn; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) { @@ -570,7 +563,7 @@ void FixQEqReax::init_matvec() /* quadratic extrapolation for s & t from previous solutions */ //s[i] = s_hist[i][2] + 3 * ( s_hist[i][0] - s_hist[i][1] ); - t[i] = t_hist[i][2] + 3 * ( t_hist[i][0] - t_hist[i][1] ); + t[i] = t_hist[i][2] + 3 * ( t_hist[i][0] - t_hist[i][1]); /* cubic extrapolation for s & t from previous solutions */ s[i] = 4*(s_hist[i][0]+s_hist[i][2])-(6*s_hist[i][1]+s_hist[i][3]); @@ -590,12 +583,12 @@ void FixQEqReax::compute_H() { int inum, jnum, *ilist, *jlist, *numneigh, **firstneigh; int i, j, ii, jj, flag; - double **x, SMALL = 0.0001; double dx, dy, dz, r_sqr; + const double SMALL = 0.0001; int *type = atom->type; tagint *tag = atom->tag; - x = atom->x; + double **x = atom->x; int *mask = atom->mask; if (reaxc) { @@ -613,14 +606,14 @@ void FixQEqReax::compute_H() // fill in the H matrix m_fill = 0; r_sqr = 0; - for( ii = 0; ii < inum; ii++ ) { + for (ii = 0; ii < inum; ii++) { i = ilist[ii]; if (mask[i] & groupbit) { jlist = firstneigh[i]; jnum = numneigh[i]; H.firstnbr[i] = m_fill; - for( jj = 0; jj < jnum; jj++ ) { + for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; dx = x[j][0] - x[i][0]; @@ -642,9 +635,9 @@ void FixQEqReax::compute_H() } } - if( flag ) { + if (flag) { H.jlist[m_fill] = j; - H.val[m_fill] = calculate_H( sqrt(r_sqr), shld[type[i]][type[j]] ); + H.val[m_fill] = calculate_H( sqrt(r_sqr), shld[type[i]][type[j]]); m_fill++; } } @@ -655,7 +648,7 @@ void FixQEqReax::compute_H() if (m_fill >= H.m) { char str[128]; sprintf(str,"H matrix size has been exceeded: m_fill=%d H.m=%d\n", - m_fill, H.m ); + m_fill, H.m); error->warning(FLERR,str); error->all(FLERR,"Fix qeq/reax has insufficient QEq matrix size"); } @@ -663,7 +656,7 @@ void FixQEqReax::compute_H() /* ---------------------------------------------------------------------- */ -double FixQEqReax::calculate_H( double r, double gamma ) +double FixQEqReax::calculate_H( double r, double gamma) { double Taper, denom; @@ -683,7 +676,7 @@ double FixQEqReax::calculate_H( double r, double gamma ) /* ---------------------------------------------------------------------- */ -int FixQEqReax::CG( double *b, double *x ) +int FixQEqReax::CG( double *b, double *x) { int i, j, imax; double tmp, alpha, beta, b_norm; @@ -702,21 +695,21 @@ int FixQEqReax::CG( double *b, double *x ) imax = 200; pack_flag = 1; - sparse_matvec( &H, x, q ); - comm->reverse_comm_fix( this ); //Coll_Vector( q ); + sparse_matvec( &H, x, q); + comm->reverse_comm_fix(this); //Coll_Vector( q ); - vector_sum( r , 1., b, -1., q, nn ); + vector_sum( r , 1., b, -1., q, nn); - for( jj = 0; jj < nn; ++jj ) { + for (jj = 0; jj < nn; ++jj) { j = ilist[jj]; if (atom->mask[j] & groupbit) d[j] = r[j] * Hdia_inv[j]; //pre-condition } - b_norm = parallel_norm( b, nn ); + b_norm = parallel_norm( b, nn); sig_new = parallel_dot( r, d, nn); - for( i = 1; i < imax && sqrt(sig_new) / b_norm > tolerance; ++i ) { + for (i = 1; i < imax && sqrt(sig_new) / b_norm > tolerance; ++i) { comm->forward_comm_fix(this); //Dist_vector( d ); sparse_matvec( &H, d, q ); comm->reverse_comm_fix(this); //Coll_vector( q ); @@ -728,7 +721,7 @@ int FixQEqReax::CG( double *b, double *x ) vector_add( r, -alpha, q, nn ); // pre-conditioning - for( jj = 0; jj < nn; ++jj ) { + for (jj = 0; jj < nn; ++jj) { j = ilist[jj]; if (atom->mask[j] & groupbit) p[j] = r[j] * Hdia_inv[j]; @@ -754,7 +747,7 @@ int FixQEqReax::CG( double *b, double *x ) /* ---------------------------------------------------------------------- */ -void FixQEqReax::sparse_matvec( sparse_matrix *A, double *x, double *b ) +void FixQEqReax::sparse_matvec( sparse_matrix *A, double *x, double *b) { int i, j, itr_j; int nn, NN, ii; @@ -770,22 +763,22 @@ void FixQEqReax::sparse_matvec( sparse_matrix *A, double *x, double *b ) ilist = list->ilist; } - for( ii = 0; ii < nn; ++ii ) { + for (ii = 0; ii < nn; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) b[i] = eta[ atom->type[i] ] * x[i]; } - for( ii = nn; ii < NN; ++ii ) { + for (ii = nn; ii < NN; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) b[i] = 0; } - for( ii = 0; ii < nn; ++ii ) { + for (ii = 0; ii < nn; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) { - for( itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { + for (itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { j = A->jlist[itr_j]; b[i] += A->val[itr_j] * x[j]; b[j] += A->val[itr_j] * x[i]; @@ -814,17 +807,17 @@ void FixQEqReax::calculate_Q() ilist = list->ilist; } - s_sum = parallel_vector_acc( s, nn ); + s_sum = parallel_vector_acc( s, nn); t_sum = parallel_vector_acc( t, nn); u = s_sum / t_sum; - for( ii = 0; ii < nn; ++ii ) { + for (ii = 0; ii < nn; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) { q[i] = s[i] - u * t[i]; /* backup s & t */ - for( k = 4; k > 0; --k ) { + for (k = 4; k > 0; --k) { s_hist[i][k] = s_hist[i][k-1]; t_hist[i][k] = t_hist[i][k-1]; } @@ -834,7 +827,7 @@ void FixQEqReax::calculate_Q() } pack_flag = 4; - comm->forward_comm_fix( this ); //Dist_vector( atom->q ); + comm->forward_comm_fix(this); //Dist_vector( atom->q ); } /* ---------------------------------------------------------------------- */ @@ -844,15 +837,15 @@ int FixQEqReax::pack_forward_comm(int n, int *list, double *buf, { int m; - if( pack_flag == 1) + if (pack_flag == 1) for(m = 0; m < n; m++) buf[m] = d[list[m]]; - else if( pack_flag == 2 ) + else if (pack_flag == 2) for(m = 0; m < n; m++) buf[m] = s[list[m]]; - else if( pack_flag == 3 ) + else if (pack_flag == 3) for(m = 0; m < n; m++) buf[m] = t[list[m]]; - else if( pack_flag == 4 ) + else if (pack_flag == 4) for(m = 0; m < n; m++) buf[m] = atom->q[list[m]]; - else if( pack_flag == 5) { + else if (pack_flag == 5) { m = 0; for(int i = 0; i < n; i++) { int j = 2 * list[i]; @@ -870,15 +863,15 @@ void FixQEqReax::unpack_forward_comm(int n, int first, double *buf) { int i, m; - if( pack_flag == 1) + if (pack_flag == 1) for(m = 0, i = first; m < n; m++, i++) d[i] = buf[m]; - else if( pack_flag == 2) + else if (pack_flag == 2) for(m = 0, i = first; m < n; m++, i++) s[i] = buf[m]; - else if( pack_flag == 3) + else if (pack_flag == 3) for(m = 0, i = first; m < n; m++, i++) t[i] = buf[m]; - else if( pack_flag == 4) + else if (pack_flag == 4) for(m = 0, i = first; m < n; m++, i++) atom->q[i] = buf[m]; - else if( pack_flag == 5) { + else if (pack_flag == 5) { int last = first + n; m = 0; for(i = first; i < last; i++) { @@ -991,7 +984,7 @@ int FixQEqReax::unpack_exchange(int nlocal, double *buf) /* ---------------------------------------------------------------------- */ -double FixQEqReax::parallel_norm( double *v, int n ) +double FixQEqReax::parallel_norm( double *v, int n) { int i; double my_sum, norm_sqr; @@ -1006,15 +999,15 @@ double FixQEqReax::parallel_norm( double *v, int n ) my_sum = 0.0; norm_sqr = 0.0; - for( ii = 0; ii < n; ++ii ) { + for (ii = 0; ii < n; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) - my_sum += SQR( v[i] ); + my_sum += SQR( v[i]); } - MPI_Allreduce( &my_sum, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce( &my_sum, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world); - return sqrt( norm_sqr ); + return sqrt( norm_sqr); } /* ---------------------------------------------------------------------- */ @@ -1034,20 +1027,20 @@ double FixQEqReax::parallel_dot( double *v1, double *v2, int n) my_dot = 0.0; res = 0.0; - for( ii = 0; ii < n; ++ii ) { + for (ii = 0; ii < n; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) my_dot += v1[i] * v2[i]; } - MPI_Allreduce( &my_dot, &res, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce( &my_dot, &res, 1, MPI_DOUBLE, MPI_SUM, world); return res; } /* ---------------------------------------------------------------------- */ -double FixQEqReax::parallel_vector_acc( double *v, int n ) +double FixQEqReax::parallel_vector_acc( double *v, int n) { int i; double my_acc, res; @@ -1062,13 +1055,13 @@ double FixQEqReax::parallel_vector_acc( double *v, int n ) my_acc = 0.0; res = 0.0; - for( ii = 0; ii < n; ++ii ) { + for (ii = 0; ii < n; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) my_acc += v[i]; } - MPI_Allreduce( &my_acc, &res, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce( &my_acc, &res, 1, MPI_DOUBLE, MPI_SUM, world); return res; } @@ -1076,7 +1069,7 @@ double FixQEqReax::parallel_vector_acc( double *v, int n ) /* ---------------------------------------------------------------------- */ void FixQEqReax::vector_sum( double* dest, double c, double* v, - double d, double* y, int k ) + double d, double* y, int k) { int kk; int *ilist; @@ -1086,7 +1079,7 @@ void FixQEqReax::vector_sum( double* dest, double c, double* v, else ilist = list->ilist; - for( --k; k>=0; --k ) { + for (--k; k>=0; --k) { kk = ilist[k]; if (atom->mask[kk] & groupbit) dest[kk] = c * v[kk] + d * y[kk]; @@ -1095,7 +1088,7 @@ void FixQEqReax::vector_sum( double* dest, double c, double* v, /* ---------------------------------------------------------------------- */ -void FixQEqReax::vector_add( double* dest, double c, double* v, int k ) +void FixQEqReax::vector_add( double* dest, double c, double* v, int k) { int kk; int *ilist; @@ -1105,7 +1098,7 @@ void FixQEqReax::vector_add( double* dest, double c, double* v, int k ) else ilist = list->ilist; - for( --k; k>=0; --k ) { + for (--k; k>=0; --k) { kk = ilist[k]; if (atom->mask[kk] & groupbit) dest[kk] += c * v[kk]; From c3f6e27bfe2e6c916f17f04da722cb0292e54121 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 25 May 2017 17:00:19 -0400 Subject: [PATCH 093/302] augment documentation for newly added multi-threaded reax/c styles --- doc/src/Section_commands.txt | 4 ++-- doc/src/fix_qeq_reax.txt | 10 ++++++++-- doc/src/pair_reaxc.txt | 1 + src/USER-OMP/pair_reaxc_omp.cpp | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index dc7ddebe58..4ed202ae2f 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -717,7 +717,7 @@ package"_Section_start.html#start_3. "phonon"_fix_phonon.html, "pimd"_fix_pimd.html, "qbmsst"_fix_qbmsst.html, -"qeq/reax"_fix_qeq_reax.html, +"qeq/reax (ko)"_fix_qeq_reax.html, "qmmm"_fix_qmmm.html, "qtb"_fix_qtb.html, "reax/c/bonds"_fix_reax_bonds.html, @@ -1057,7 +1057,7 @@ package"_Section_start.html#start_3. "oxdna2/excv"_pair_oxdna2.html, "oxdna2/stk"_pair_oxdna2.html, "quip"_pair_quip.html, -"reax/c (k)"_pair_reaxc.html, +"reax/c (ko)"_pair_reaxc.html, "smd/hertz"_pair_smd_hertz.html, "smd/tlsph"_pair_smd_tlsph.html, "smd/triangulated/surface"_pair_smd_triangulated_surface.html, diff --git a/doc/src/fix_qeq_reax.txt b/doc/src/fix_qeq_reax.txt index aed043f6c0..a1a19b7368 100644 --- a/doc/src/fix_qeq_reax.txt +++ b/doc/src/fix_qeq_reax.txt @@ -8,17 +8,19 @@ fix qeq/reax command :h3 fix qeq/reax/kk command :h3 +fix qeq/reax/omp command :h3 [Syntax:] -fix ID group-ID qeq/reax Nevery cutlo cuthi tolerance params :pre +fix ID group-ID qeq/reax Nevery cutlo cuthi tolerance params args :pre ID, group-ID are documented in "fix"_fix.html command qeq/reax = style name of this fix command Nevery = perform QEq every this many steps cutlo,cuthi = lo and hi cutoff for Taper radius tolerance = precision to which charges will be equilibrated -params = reax/c or a filename :ul +params = reax/c or a filename +args = {dual} (optional) :ul [Examples:] @@ -59,6 +61,10 @@ potential file, except that eta is defined here as twice the eta value in the ReaxFF file. Note that unlike the rest of LAMMPS, the units of this fix are hard-coded to be A, eV, and electronic charge. +The optional {dual} keyword allows to perform the optimization +of the S and T matrices in parallel. This is only supported for +the {qeq/reax/omp} style. Otherwise they are processed separately. + [Restart, fix_modify, output, run start/stop, minimize info:] No information about this fix is written to "binary restart diff --git a/doc/src/pair_reaxc.txt b/doc/src/pair_reaxc.txt index 76a8e6fd5c..cfa88673d7 100644 --- a/doc/src/pair_reaxc.txt +++ b/doc/src/pair_reaxc.txt @@ -8,6 +8,7 @@ pair_style reax/c command :h3 pair_style reax/c/kk command :h3 +pair_style reax/c/omp command :h3 [Syntax:] diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index e716188949..9dd968f0db 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -281,7 +281,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) for (i = 0; i < system->N; i ++) for (j = 0; j < MAXSPECBOND; j ++) { tmpbo[i][j] = 0.0; - tmpid[i][j] = 0; + tmpid[i][j] = 0; } FindBond(); From f1ec6dc41aa4956ecf0f2aedb5f7749bb86e9b73 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 25 May 2017 18:55:07 -0400 Subject: [PATCH 094/302] dead code removal and reformatting --- src/USER-OMP/reaxc_bond_orders_omp.cpp | 4 +- src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp | 1 - src/USER-OMP/reaxc_init_md_omp.cpp | 1 - src/USER-OMP/reaxc_torsion_angles_omp.cpp | 7 +- src/USER-OMP/reaxc_valence_angles_omp.cpp | 722 +++++++++++----------- 5 files changed, 361 insertions(+), 374 deletions(-) diff --git a/src/USER-OMP/reaxc_bond_orders_omp.cpp b/src/USER-OMP/reaxc_bond_orders_omp.cpp index 1000954f6e..222c00980e 100644 --- a/src/USER-OMP/reaxc_bond_orders_omp.cpp +++ b/src/USER-OMP/reaxc_bond_orders_omp.cpp @@ -36,10 +36,8 @@ using namespace LAMMPS_NS; -/* ---------------------------------------------------------------------- */ - void Add_dBond_to_ForcesOMP( reax_system *system, int i, int pj, - storage *workspace, reax_list **lists ) { + storage *workspace, reax_list **lists ) { reax_list *bonds = (*lists) + BONDS; bond_data *nbr_j, *nbr_k; bond_order_data *bo_ij, *bo_ji; diff --git a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp index 8b3be84dc4..c446151150 100644 --- a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp +++ b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp @@ -51,7 +51,6 @@ void Hydrogen_BondsOMP( reax_system *system, control_params *control, #endif const int nthreads = control->nthreads; - long totalReductionSize = system->N; #if defined(_OPENMP) #pragma omp parallel default(shared) //default(none) diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index 3ccd2fff64..6cce08a041 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -53,7 +53,6 @@ int Init_ListsOMP( reax_system *system, control_params *control, int *hb_top, *bond_top; MPI_Comm comm; - int TWICE = 2; int mincap = system->mincap; double safezone = system->safezone; double saferzone = system->saferzone; diff --git a/src/USER-OMP/reaxc_torsion_angles_omp.cpp b/src/USER-OMP/reaxc_torsion_angles_omp.cpp index a7b98f16b1..7a7e42ea30 100644 --- a/src/USER-OMP/reaxc_torsion_angles_omp.cpp +++ b/src/USER-OMP/reaxc_torsion_angles_omp.cpp @@ -73,7 +73,7 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, { int i, j, k, l, pi, pj, pk, pl, pij, plk; int type_i, type_j, type_k, type_l; - int start_j, end_j, start_k, end_k; + int start_j, end_j; int start_pj, end_pj, start_pk, end_pk; int num_frb_intrs = 0; @@ -108,7 +108,7 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, // Virial tallying variables double delil[3], deljl[3], delkl[3]; - double eng_tmp, f_scaler, fi_tmp[3], fj_tmp[3], fk_tmp[3]; + double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; #if defined(_OPENMP) int tid = omp_get_thread_num(); @@ -116,7 +116,6 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, int tid = 0; #endif long reductionOffset = (system->N * tid); - int num_thb_intrs = 0; class PairReaxCOMP *pair_reax_ptr; pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); @@ -156,8 +155,6 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, trying to form a 4-body interaction out of this neighborhood */ if (system->my_atoms[j].orig_id < system->my_atoms[k].orig_id && bo_jk->BO > control->thb_cut/*0*/ && Num_Entries(pk, thb_intrs)) { - start_k = Start_Index(k, bonds); - end_k = End_Index(k, bonds); pj = pbond_jk->sym_index; // pj points to j on k's list /* do the same check as above: diff --git a/src/USER-OMP/reaxc_valence_angles_omp.cpp b/src/USER-OMP/reaxc_valence_angles_omp.cpp index 4ea1953fcf..869a325d6e 100644 --- a/src/USER-OMP/reaxc_valence_angles_omp.cpp +++ b/src/USER-OMP/reaxc_valence_angles_omp.cpp @@ -47,7 +47,6 @@ void Calculate_dCos_ThetaOMP( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_ rvec* dcos_theta_dj, rvec* dcos_theta_dk ) { - int t; double sqr_d_ji = SQR(d_ji); double sqr_d_jk = SQR(d_jk); double inv_dists = 1.0 / (d_ji * d_jk); @@ -98,8 +97,8 @@ void Calculate_dCos_ThetaOMP( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_ /* this is a 3-body interaction in which the main role is played by j which sits in the middle of the other two. */ void Valence_AnglesOMP( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control ) + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control ) { #ifdef OMP_TIMING @@ -122,411 +121,406 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, double total_Epen = 0; double total_Ecoa = 0; - int per_atom = (thb_intrs->num_intrs / system->N); int nthreads = control->nthreads; - int chunksize = system->N/(nthreads*10); int num_thb_intrs = 0; int TWICE = 2; #pragma omp parallel default(shared) reduction(+:total_Eang, total_Epen, total_Ecoa, num_thb_intrs) - { - int i, j, pi, k, pk, t; - int type_i, type_j, type_k; - int start_j, end_j, start_pk, end_pk; - int cnt, my_offset, mark; + { + int i, j, pi, k, pk, t; + int type_i, type_j, type_k; + int start_j, end_j, start_pk, end_pk; + int cnt, my_offset; - double temp, temp_bo_jt, pBOjt7; - double p_val1, p_val2, p_val3, p_val4, p_val5, p_val7; - double p_pen1, p_pen2, p_pen3, p_pen4; - double p_coa1, p_coa2, p_coa3, p_coa4; - double trm8, expval6, expval7, expval2theta, expval12theta, exp3ij, exp3jk; - double exp_pen2ij, exp_pen2jk, exp_pen3, exp_pen4, trm_pen34, exp_coa2; - double dSBO1, dSBO2, SBO, SBO2, CSBO2, SBOp, prod_SBO, vlpadj; - double CEval1, CEval2, CEval3, CEval4, CEval5, CEval6, CEval7, CEval8; - double CEpen1, CEpen2, CEpen3; - double e_ang, e_coa, e_pen; - double CEcoa1, CEcoa2, CEcoa3, CEcoa4, CEcoa5; - double Cf7ij, Cf7jk, Cf8j, Cf9j; - double f7_ij, f7_jk, f8_Dj, f9_Dj; - double Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; - double r_ij, r_jk; - double BOA_ij, BOA_jk; - rvec force, ext_press; - // rtensor temp_rtensor, total_rtensor; + double temp, temp_bo_jt, pBOjt7; + double p_val1, p_val2, p_val3, p_val4, p_val5, p_val7; + double p_pen1, p_pen2, p_pen3, p_pen4; + double p_coa1, p_coa2, p_coa3, p_coa4; + double trm8, expval6, expval7, expval2theta, expval12theta, exp3ij, exp3jk; + double exp_pen2ij, exp_pen2jk, exp_pen3, exp_pen4, trm_pen34, exp_coa2; + double dSBO1, dSBO2, SBO, SBO2, CSBO2, SBOp, prod_SBO, vlpadj; + double CEval1, CEval2, CEval3, CEval4, CEval5, CEval6, CEval7, CEval8; + double CEpen1, CEpen2, CEpen3; + double e_ang, e_coa, e_pen; + double CEcoa1, CEcoa2, CEcoa3, CEcoa4, CEcoa5; + double Cf7ij, Cf7jk, Cf8j, Cf9j; + double f7_ij, f7_jk, f8_Dj, f9_Dj; + double Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; + double BOA_ij, BOA_jk; + rvec force, ext_press; + // rtensor temp_rtensor, total_rtensor; - // Tallying variables - double eng_tmp, f_scaler, fi_tmp[3], fj_tmp[3], fk_tmp[3]; - double delij[3], delkj[3]; + // Tallying variables + double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; + double delij[3], delkj[3]; - three_body_header *thbh; - three_body_parameters *thbp; - three_body_interaction_data *p_ijk, *p_kji; - bond_data *pbond_ij, *pbond_jk, *pbond_jt; - bond_order_data *bo_ij, *bo_jk, *bo_jt; + three_body_header *thbh; + three_body_parameters *thbp; + three_body_interaction_data *p_ijk, *p_kji; + bond_data *pbond_ij, *pbond_jk, *pbond_jt; + bond_order_data *bo_ij, *bo_jk, *bo_jt; #if defined(_OPENMP) - int tid = omp_get_thread_num(); + int tid = omp_get_thread_num(); #else - int tid = 0; + int tid = 0; #endif - long reductionOffset = (system->N * tid); - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); - class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + long reductionOffset = (system->N * tid); + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, - system->pair_ptr->vflag_either, - system->N, system->pair_ptr->eatom, - system->pair_ptr->vatom, thr); + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, + system->N, system->pair_ptr->eatom, + system->pair_ptr->vatom, thr); - // Run through a minimal for(jnum_intrs / nthreads; + const int per_thread = thb_intrs->num_intrs / nthreads; #pragma omp for schedule(dynamic,50) - for (j = 0; j < system->N; ++j) { - type_j = system->my_atoms[j].type; - _my_offset[j] = 0; - if(type_j < 0) continue; + for (j = 0; j < system->N; ++j) { + type_j = system->my_atoms[j].type; + _my_offset[j] = 0; + if(type_j < 0) continue; - start_j = Start_Index(j, bonds); - end_j = End_Index(j, bonds); + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); - // Always point to start of workspace to count angles - my_offset = tid * per_thread; + // Always point to start of workspace to count angles + my_offset = tid * per_thread; - for (pi = start_j; pi < end_j; ++pi) { - Set_Start_Index( pi, my_offset, thb_intrs ); - pbond_ij = &(bonds->select.bond_list[pi]); - bo_ij = &(pbond_ij->bo_data); - BOA_ij = bo_ij->BO - control->thb_cut; + for (pi = start_j; pi < end_j; ++pi) { + Set_Start_Index( pi, my_offset, thb_intrs ); + pbond_ij = &(bonds->select.bond_list[pi]); + bo_ij = &(pbond_ij->bo_data); + BOA_ij = bo_ij->BO - control->thb_cut; - if (BOA_ij > 0.0) { - i = pbond_ij->nbr; + if (BOA_ij > 0.0) { + i = pbond_ij->nbr; - /* first copy 3-body intrs from previously computed ones where i>k. - in the second for-loop below, - we compute only new 3-body intrs where i < k */ - for (pk = start_j; pk < pi; ++pk) { - start_pk = Start_Index( pk, thb_intrs ); - end_pk = End_Index( pk, thb_intrs ); + /* first copy 3-body intrs from previously computed ones where i>k. + in the second for-loop below, + we compute only new 3-body intrs where i < k */ + for (pk = start_j; pk < pi; ++pk) { + start_pk = Start_Index( pk, thb_intrs ); + end_pk = End_Index( pk, thb_intrs ); - for (t = start_pk; t < end_pk; ++t) - if (thb_intrs->select.three_body_list[t].thb == i) { + for (t = start_pk; t < end_pk; ++t) + if (thb_intrs->select.three_body_list[t].thb == i) { - p_ijk = &(thb_intrs->select.three_body_list[my_offset] ); - p_ijk->thb = bonds->select.bond_list[pk].nbr; + p_ijk = &(thb_intrs->select.three_body_list[my_offset] ); + p_ijk->thb = bonds->select.bond_list[pk].nbr; - ++my_offset; - break; - } - } // for(pk) + ++my_offset; + break; + } + } // for(pk) - /* and this is the second for loop mentioned above */ - for (pk = pi+1; pk < end_j; ++pk) { - pbond_jk = &(bonds->select.bond_list[pk]); - k = pbond_jk->nbr; + /* and this is the second for loop mentioned above */ + for (pk = pi+1; pk < end_j; ++pk) { + pbond_jk = &(bonds->select.bond_list[pk]); + k = pbond_jk->nbr; - if (j >= system->n && i >= system->n && k >= system->n) continue; + if (j >= system->n && i >= system->n && k >= system->n) continue; - p_ijk = &( thb_intrs->select.three_body_list[my_offset] ); - p_ijk->thb = k; + p_ijk = &( thb_intrs->select.three_body_list[my_offset] ); + p_ijk->thb = k; - ++my_offset; // add this to the list of 3-body interactions - } // for(pk) - } // if() + ++my_offset; // add this to the list of 3-body interactions + } // for(pk) + } // if() - Set_End_Index(pi, my_offset, thb_intrs ); - } // for(pi) + Set_End_Index(pi, my_offset, thb_intrs ); + } // for(pi) - // Confirm that thb_intrs->num_intrs / nthreads is enough to hold all angles from a single atom - if(my_offset >= (tid+1)*per_thread) { - int me; - MPI_Comm_rank(MPI_COMM_WORLD,&me); - fprintf( stderr, "step%d-ran out of space on angle_list on proc %i for atom %i:", data->step, me, j); - fprintf( stderr, " nthreads= %d, tid=%d, my_offset=%d, per_thread=%d\n", nthreads, tid, my_offset, per_thread); - fprintf( stderr, " num_intrs= %i N= %i\n",thb_intrs->num_intrs , system->N); - MPI_Abort( MPI_COMM_WORLD, INSUFFICIENT_MEMORY ); - } + // Confirm that thb_intrs->num_intrs / nthreads is enough to hold all angles from a single atom + if(my_offset >= (tid+1)*per_thread) { + int me; + MPI_Comm_rank(MPI_COMM_WORLD,&me); + fprintf( stderr, "step%d-ran out of space on angle_list on proc %i for atom %i:", data->step, me, j); + fprintf( stderr, " nthreads= %d, tid=%d, my_offset=%d, per_thread=%d\n", nthreads, tid, my_offset, per_thread); + fprintf( stderr, " num_intrs= %i N= %i\n",thb_intrs->num_intrs , system->N); + MPI_Abort( MPI_COMM_WORLD, INSUFFICIENT_MEMORY ); + } - // Number of angles owned by this atom - _my_offset[j] = my_offset - tid * per_thread; - } // for(j) + // Number of angles owned by this atom + _my_offset[j] = my_offset - tid * per_thread; + } // for(j) - // Wait for all threads to finish counting angles + // Wait for all threads to finish counting angles #pragma omp barrier - // Master thread uses angle counts to compute offsets - // This can be threaded + // Master thread uses angle counts to compute offsets + // This can be threaded #pragma omp master - { - int current_count = 0; - int m = _my_offset[0]; - _my_offset[0] = current_count; - for(j=1; jN; j++) { - current_count+= m; - m = _my_offset[j]; - _my_offset[j] = current_count; + { + int current_count = 0; + int m = _my_offset[0]; + _my_offset[0] = current_count; + for(j=1; jN; j++) { + current_count+= m; + m = _my_offset[j]; + _my_offset[j] = current_count; + } + _my_offset[system->N] = current_count + m; // Used to test if last particle has any angles } - _my_offset[system->N] = current_count + m; // Used to test if last particle has any angles - } - // All threads wait till master thread finished computing offsets + // All threads wait till master thread finished computing offsets #pragma omp barrier - // Original loop, but now using precomputed offsets - // Safe to use all threads available, regardless of threads tasked above - // We also now skip over atoms that have no angles assigned + // Original loop, but now using precomputed offsets + // Safe to use all threads available, regardless of threads tasked above + // We also now skip over atoms that have no angles assigned #pragma omp for schedule(dynamic,50)//(dynamic,chunksize)//(guided) - for (j = 0; j < system->N; ++j) { // Ray: the first one with system->N - type_j = system->my_atoms[j].type; - if(type_j < 0) continue; + for (j = 0; j < system->N; ++j) { // Ray: the first one with system->N + type_j = system->my_atoms[j].type; + if(type_j < 0) continue; - // Skip if no angles for this atom - if(_my_offset[j] == _my_offset[j+1]) continue; + // Skip if no angles for this atom + if(_my_offset[j] == _my_offset[j+1]) continue; - start_j = Start_Index(j, bonds); - end_j = End_Index(j, bonds); + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); - type_j = system->my_atoms[j].type; + type_j = system->my_atoms[j].type; - my_offset = _my_offset[j]; + my_offset = _my_offset[j]; - p_val3 = system->reax_param.sbp[ type_j ].p_val3; - p_val5 = system->reax_param.sbp[ type_j ].p_val5; + p_val3 = system->reax_param.sbp[ type_j ].p_val3; + p_val5 = system->reax_param.sbp[ type_j ].p_val5; - SBOp = 0, prod_SBO = 1; - for (t = start_j; t < end_j; ++t) { - bo_jt = &(bonds->select.bond_list[t].bo_data); - SBOp += (bo_jt->BO_pi + bo_jt->BO_pi2); - temp = SQR( bo_jt->BO ); - temp *= temp; - temp *= temp; - prod_SBO *= exp( -temp ); - } + SBOp = 0, prod_SBO = 1; + for (t = start_j; t < end_j; ++t) { + bo_jt = &(bonds->select.bond_list[t].bo_data); + SBOp += (bo_jt->BO_pi + bo_jt->BO_pi2); + temp = SQR( bo_jt->BO ); + temp *= temp; + temp *= temp; + prod_SBO *= exp( -temp ); + } - // modifications to match Adri's code - 09/01/09 - if( workspace->vlpex[j] >= 0 ){ - vlpadj = 0; - dSBO2 = prod_SBO - 1; - } - else{ - vlpadj = workspace->nlp[j]; - dSBO2 = (prod_SBO - 1) * (1 - p_val8 * workspace->dDelta_lp[j]); - } + // modifications to match Adri's code - 09/01/09 + if( workspace->vlpex[j] >= 0 ){ + vlpadj = 0; + dSBO2 = prod_SBO - 1; + } + else{ + vlpadj = workspace->nlp[j]; + dSBO2 = (prod_SBO - 1) * (1 - p_val8 * workspace->dDelta_lp[j]); + } - SBO = SBOp + (1 - prod_SBO) * (-workspace->Delta_boc[j] - p_val8 * vlpadj); - dSBO1 = -8 * prod_SBO * ( workspace->Delta_boc[j] + p_val8 * vlpadj ); + SBO = SBOp + (1 - prod_SBO) * (-workspace->Delta_boc[j] - p_val8 * vlpadj); + dSBO1 = -8 * prod_SBO * ( workspace->Delta_boc[j] + p_val8 * vlpadj ); - if( SBO <= 0 ) - SBO2 = 0, CSBO2 = 0; - else if( SBO > 0 && SBO <= 1 ) { + if( SBO <= 0 ) + SBO2 = 0, CSBO2 = 0; + else if( SBO > 0 && SBO <= 1 ) { SBO2 = pow( SBO, p_val9 ); CSBO2 = p_val9 * pow( SBO, p_val9 - 1 ); - } - else if( SBO > 1 && SBO < 2 ) { - SBO2 = 2 - pow( 2-SBO, p_val9 ); - CSBO2 = p_val9 * pow( 2 - SBO, p_val9 - 1 ); - } - else - SBO2 = 2, CSBO2 = 0; + } + else if( SBO > 1 && SBO < 2 ) { + SBO2 = 2 - pow( 2-SBO, p_val9 ); + CSBO2 = p_val9 * pow( 2 - SBO, p_val9 - 1 ); + } + else + SBO2 = 2, CSBO2 = 0; - expval6 = exp( p_val6 * workspace->Delta_boc[j] ); + expval6 = exp( p_val6 * workspace->Delta_boc[j] ); - for (pi = start_j; pi < end_j; ++pi) { - Set_Start_Index( pi, my_offset, thb_intrs ); - pbond_ij = &(bonds->select.bond_list[pi]); - bo_ij = &(pbond_ij->bo_data); - BOA_ij = bo_ij->BO - control->thb_cut; + for (pi = start_j; pi < end_j; ++pi) { + Set_Start_Index( pi, my_offset, thb_intrs ); + pbond_ij = &(bonds->select.bond_list[pi]); + bo_ij = &(pbond_ij->bo_data); + BOA_ij = bo_ij->BO - control->thb_cut; - if (BOA_ij > 0.0) { - i = pbond_ij->nbr; - r_ij = pbond_ij->d; - type_i = system->my_atoms[i].type; + if (BOA_ij > 0.0) { + i = pbond_ij->nbr; + type_i = system->my_atoms[i].type; - /* first copy 3-body intrs from previously computed ones where i>k. - in the second for-loop below, - we compute only new 3-body intrs where i < k */ - for (pk = start_j; pk < pi; ++pk) { - start_pk = Start_Index( pk, thb_intrs ); - end_pk = End_Index( pk, thb_intrs ); + /* first copy 3-body intrs from previously computed ones where i>k. + in the second for-loop below, + we compute only new 3-body intrs where i < k */ + for (pk = start_j; pk < pi; ++pk) { + start_pk = Start_Index( pk, thb_intrs ); + end_pk = End_Index( pk, thb_intrs ); - for (t = start_pk; t < end_pk; ++t) - if (thb_intrs->select.three_body_list[t].thb == i) { - p_ijk = &(thb_intrs->select.three_body_list[my_offset] ); - p_kji = &(thb_intrs->select.three_body_list[t]); + for (t = start_pk; t < end_pk; ++t) + if (thb_intrs->select.three_body_list[t].thb == i) { + p_ijk = &(thb_intrs->select.three_body_list[my_offset] ); + p_kji = &(thb_intrs->select.three_body_list[t]); - p_ijk->thb = bonds->select.bond_list[pk].nbr; - p_ijk->pthb = pk; - p_ijk->theta = p_kji->theta; - rvec_Copy( p_ijk->dcos_di, p_kji->dcos_dk ); - rvec_Copy( p_ijk->dcos_dj, p_kji->dcos_dj ); - rvec_Copy( p_ijk->dcos_dk, p_kji->dcos_di ); + p_ijk->thb = bonds->select.bond_list[pk].nbr; + p_ijk->pthb = pk; + p_ijk->theta = p_kji->theta; + rvec_Copy( p_ijk->dcos_di, p_kji->dcos_dk ); + rvec_Copy( p_ijk->dcos_dj, p_kji->dcos_dj ); + rvec_Copy( p_ijk->dcos_dk, p_kji->dcos_di ); - ++my_offset; - ++num_thb_intrs; - break; - } - } // for(pk) + ++my_offset; + ++num_thb_intrs; + break; + } + } // for(pk) - /* and this is the second for loop mentioned above */ - for (pk = pi+1; pk < end_j; ++pk) { - pbond_jk = &(bonds->select.bond_list[pk]); - bo_jk = &(pbond_jk->bo_data); - BOA_jk = bo_jk->BO - control->thb_cut; - k = pbond_jk->nbr; - type_k = system->my_atoms[k].type; - p_ijk = &( thb_intrs->select.three_body_list[my_offset] ); + /* and this is the second for loop mentioned above */ + for (pk = pi+1; pk < end_j; ++pk) { + pbond_jk = &(bonds->select.bond_list[pk]); + bo_jk = &(pbond_jk->bo_data); + BOA_jk = bo_jk->BO - control->thb_cut; + k = pbond_jk->nbr; + type_k = system->my_atoms[k].type; + p_ijk = &( thb_intrs->select.three_body_list[my_offset] ); - // Fix by Sudhir - // if (BOA_jk <= 0) continue; - if (j >= system->n && i >= system->n && k >= system->n) continue; + // Fix by Sudhir + // if (BOA_jk <= 0) continue; + if (j >= system->n && i >= system->n && k >= system->n) continue; - Calculate_Theta( pbond_ij->dvec, pbond_ij->d, - pbond_jk->dvec, pbond_jk->d, - &theta, &cos_theta ); + Calculate_Theta( pbond_ij->dvec, pbond_ij->d, + pbond_jk->dvec, pbond_jk->d, + &theta, &cos_theta ); - Calculate_dCos_ThetaOMP( pbond_ij->dvec, pbond_ij->d, - pbond_jk->dvec, pbond_jk->d, - &(p_ijk->dcos_di), &(p_ijk->dcos_dj), - &(p_ijk->dcos_dk) ); - p_ijk->thb = k; - p_ijk->pthb = pk; - p_ijk->theta = theta; + Calculate_dCos_ThetaOMP( pbond_ij->dvec, pbond_ij->d, + pbond_jk->dvec, pbond_jk->d, + &(p_ijk->dcos_di), &(p_ijk->dcos_dj), + &(p_ijk->dcos_dk) ); + p_ijk->thb = k; + p_ijk->pthb = pk; + p_ijk->theta = theta; - sin_theta = sin( theta ); - if( sin_theta < 1.0e-5 ) - sin_theta = 1.0e-5; + sin_theta = sin( theta ); + if( sin_theta < 1.0e-5 ) + sin_theta = 1.0e-5; - ++my_offset; // add this to the list of 3-body interactions - ++num_thb_intrs; + ++my_offset; // add this to the list of 3-body interactions + ++num_thb_intrs; - if ((j < system->n) && (BOA_jk > 0.0) && - (bo_ij->BO > control->thb_cut) && - (bo_jk->BO > control->thb_cut) && - (bo_ij->BO * bo_jk->BO > control->thb_cutsq)) { - r_jk = pbond_jk->d; - thbh = &( system->reax_param.thbp[ type_i ][ type_j ][ type_k ] ); + if ((j < system->n) && (BOA_jk > 0.0) && + (bo_ij->BO > control->thb_cut) && + (bo_jk->BO > control->thb_cut) && + (bo_ij->BO * bo_jk->BO > control->thb_cutsq)) { + thbh = &( system->reax_param.thbp[ type_i ][ type_j ][ type_k ] ); - for (cnt = 0; cnt < thbh->cnt; ++cnt) { + for (cnt = 0; cnt < thbh->cnt; ++cnt) { - if( fabs(thbh->prm[cnt].p_val1) > 0.001 ) { - thbp = &( thbh->prm[cnt] ); + if( fabs(thbh->prm[cnt].p_val1) > 0.001 ) { + thbp = &( thbh->prm[cnt] ); - /* ANGLE ENERGY */ - p_val1 = thbp->p_val1; - p_val2 = thbp->p_val2; - p_val4 = thbp->p_val4; - p_val7 = thbp->p_val7; - theta_00 = thbp->theta_00; + /* ANGLE ENERGY */ + p_val1 = thbp->p_val1; + p_val2 = thbp->p_val2; + p_val4 = thbp->p_val4; + p_val7 = thbp->p_val7; + theta_00 = thbp->theta_00; - exp3ij = exp( -p_val3 * pow( BOA_ij, p_val4 ) ); - f7_ij = 1.0 - exp3ij; - Cf7ij = p_val3 * p_val4 * pow( BOA_ij, p_val4 - 1.0 ) * exp3ij; + exp3ij = exp( -p_val3 * pow( BOA_ij, p_val4 ) ); + f7_ij = 1.0 - exp3ij; + Cf7ij = p_val3 * p_val4 * pow( BOA_ij, p_val4 - 1.0 ) * exp3ij; - exp3jk = exp( -p_val3 * pow( BOA_jk, p_val4 ) ); - f7_jk = 1.0 - exp3jk; - Cf7jk = p_val3 * p_val4 * pow( BOA_jk, p_val4 - 1.0 ) * exp3jk; + exp3jk = exp( -p_val3 * pow( BOA_jk, p_val4 ) ); + f7_jk = 1.0 - exp3jk; + Cf7jk = p_val3 * p_val4 * pow( BOA_jk, p_val4 - 1.0 ) * exp3jk; - expval7 = exp( -p_val7 * workspace->Delta_boc[j] ); - trm8 = 1.0 + expval6 + expval7; - f8_Dj = p_val5 - ( (p_val5 - 1.0) * (2.0 + expval6) / trm8 ); - Cf8j = ( (1.0 - p_val5) / SQR(trm8) ) * - ( p_val6 * expval6 * trm8 - - (2.0 + expval6) * ( p_val6*expval6 - p_val7*expval7 ) ); + expval7 = exp( -p_val7 * workspace->Delta_boc[j] ); + trm8 = 1.0 + expval6 + expval7; + f8_Dj = p_val5 - ( (p_val5 - 1.0) * (2.0 + expval6) / trm8 ); + Cf8j = ( (1.0 - p_val5) / SQR(trm8) ) * + ( p_val6 * expval6 * trm8 - + (2.0 + expval6) * ( p_val6*expval6 - p_val7*expval7 ) ); - theta_0 = 180.0 - theta_00 * (1.0 - - exp(-p_val10 * (2.0 - SBO2))); - theta_0 = DEG2RAD( theta_0 ); + theta_0 = 180.0 - theta_00 * (1.0 - + exp(-p_val10 * (2.0 - SBO2))); + theta_0 = DEG2RAD( theta_0 ); - expval2theta = exp( -p_val2 * SQR(theta_0 - theta) ); - if (p_val1 >= 0) - expval12theta = p_val1 * (1.0 - expval2theta); - else // To avoid linear Me-H-Me angles (6/6/06) - expval12theta = p_val1 * -expval2theta; + expval2theta = exp( -p_val2 * SQR(theta_0 - theta) ); + if (p_val1 >= 0) + expval12theta = p_val1 * (1.0 - expval2theta); + else // To avoid linear Me-H-Me angles (6/6/06) + expval12theta = p_val1 * -expval2theta; - CEval1 = Cf7ij * f7_jk * f8_Dj * expval12theta; - CEval2 = Cf7jk * f7_ij * f8_Dj * expval12theta; - CEval3 = Cf8j * f7_ij * f7_jk * expval12theta; - CEval4 = -2.0 * p_val1 * p_val2 * f7_ij * f7_jk * f8_Dj * - expval2theta * (theta_0 - theta); + CEval1 = Cf7ij * f7_jk * f8_Dj * expval12theta; + CEval2 = Cf7jk * f7_ij * f8_Dj * expval12theta; + CEval3 = Cf8j * f7_ij * f7_jk * expval12theta; + CEval4 = -2.0 * p_val1 * p_val2 * f7_ij * f7_jk * f8_Dj * + expval2theta * (theta_0 - theta); - Ctheta_0 = p_val10 * DEG2RAD(theta_00) * - exp( -p_val10 * (2.0 - SBO2) ); + Ctheta_0 = p_val10 * DEG2RAD(theta_00) * + exp( -p_val10 * (2.0 - SBO2) ); - CEval5 = -CEval4 * Ctheta_0 * CSBO2; - CEval6 = CEval5 * dSBO1; - CEval7 = CEval5 * dSBO2; - CEval8 = -CEval4 / sin_theta; + CEval5 = -CEval4 * Ctheta_0 * CSBO2; + CEval6 = CEval5 * dSBO1; + CEval7 = CEval5 * dSBO2; + CEval8 = -CEval4 / sin_theta; - total_Eang += e_ang = - f7_ij * f7_jk * f8_Dj * expval12theta; - /* END ANGLE ENERGY*/ + total_Eang += e_ang = + f7_ij * f7_jk * f8_Dj * expval12theta; + /* END ANGLE ENERGY*/ - /* PENALTY ENERGY */ - p_pen1 = thbp->p_pen1; - p_pen2 = system->reax_param.gp.l[19]; - p_pen3 = system->reax_param.gp.l[20]; - p_pen4 = system->reax_param.gp.l[21]; + /* PENALTY ENERGY */ + p_pen1 = thbp->p_pen1; + p_pen2 = system->reax_param.gp.l[19]; + p_pen3 = system->reax_param.gp.l[20]; + p_pen4 = system->reax_param.gp.l[21]; - exp_pen2ij = exp( -p_pen2 * SQR( BOA_ij - 2.0 ) ); - exp_pen2jk = exp( -p_pen2 * SQR( BOA_jk - 2.0 ) ); - exp_pen3 = exp( -p_pen3 * workspace->Delta[j] ); - exp_pen4 = exp( p_pen4 * workspace->Delta[j] ); - trm_pen34 = 1.0 + exp_pen3 + exp_pen4; - f9_Dj = ( 2.0 + exp_pen3 ) / trm_pen34; - Cf9j = ( -p_pen3 * exp_pen3 * trm_pen34 - - (2.0 + exp_pen3) * ( -p_pen3 * exp_pen3 + - p_pen4 * exp_pen4 ) ) / - SQR( trm_pen34 ); + exp_pen2ij = exp( -p_pen2 * SQR( BOA_ij - 2.0 ) ); + exp_pen2jk = exp( -p_pen2 * SQR( BOA_jk - 2.0 ) ); + exp_pen3 = exp( -p_pen3 * workspace->Delta[j] ); + exp_pen4 = exp( p_pen4 * workspace->Delta[j] ); + trm_pen34 = 1.0 + exp_pen3 + exp_pen4; + f9_Dj = ( 2.0 + exp_pen3 ) / trm_pen34; + Cf9j = ( -p_pen3 * exp_pen3 * trm_pen34 - + (2.0 + exp_pen3) * ( -p_pen3 * exp_pen3 + + p_pen4 * exp_pen4 ) ) / + SQR( trm_pen34 ); - total_Epen += e_pen = - p_pen1 * f9_Dj * exp_pen2ij * exp_pen2jk; + total_Epen += e_pen = + p_pen1 * f9_Dj * exp_pen2ij * exp_pen2jk; - CEpen1 = e_pen * Cf9j / f9_Dj; - temp = -2.0 * p_pen2 * e_pen; - CEpen2 = temp * (BOA_ij - 2.0); - CEpen3 = temp * (BOA_jk - 2.0); - /* END PENALTY ENERGY */ + CEpen1 = e_pen * Cf9j / f9_Dj; + temp = -2.0 * p_pen2 * e_pen; + CEpen2 = temp * (BOA_ij - 2.0); + CEpen3 = temp * (BOA_jk - 2.0); + /* END PENALTY ENERGY */ - /* COALITION ENERGY */ - p_coa1 = thbp->p_coa1; - p_coa2 = system->reax_param.gp.l[2]; - p_coa3 = system->reax_param.gp.l[38]; - p_coa4 = system->reax_param.gp.l[30]; + /* COALITION ENERGY */ + p_coa1 = thbp->p_coa1; + p_coa2 = system->reax_param.gp.l[2]; + p_coa3 = system->reax_param.gp.l[38]; + p_coa4 = system->reax_param.gp.l[30]; - exp_coa2 = exp( p_coa2 * workspace->Delta_val[j] ); - total_Ecoa += e_coa = - p_coa1 / (1. + exp_coa2) * - exp( -p_coa3 * SQR(workspace->total_bond_order[i]-BOA_ij) ) * - exp( -p_coa3 * SQR(workspace->total_bond_order[k]-BOA_jk) ) * - exp( -p_coa4 * SQR(BOA_ij - 1.5) ) * - exp( -p_coa4 * SQR(BOA_jk - 1.5) ); + exp_coa2 = exp( p_coa2 * workspace->Delta_val[j] ); + total_Ecoa += e_coa = + p_coa1 / (1. + exp_coa2) * + exp( -p_coa3 * SQR(workspace->total_bond_order[i]-BOA_ij) ) * + exp( -p_coa3 * SQR(workspace->total_bond_order[k]-BOA_jk) ) * + exp( -p_coa4 * SQR(BOA_ij - 1.5) ) * + exp( -p_coa4 * SQR(BOA_jk - 1.5) ); - CEcoa1 = -2 * p_coa4 * (BOA_ij - 1.5) * e_coa; - CEcoa2 = -2 * p_coa4 * (BOA_jk - 1.5) * e_coa; - CEcoa3 = -p_coa2 * exp_coa2 * e_coa / (1 + exp_coa2); - CEcoa4 = -2 * p_coa3 * - (workspace->total_bond_order[i]-BOA_ij) * e_coa; - CEcoa5 = -2 * p_coa3 * - (workspace->total_bond_order[k]-BOA_jk) * e_coa; - /* END COALITION ENERGY */ + CEcoa1 = -2 * p_coa4 * (BOA_ij - 1.5) * e_coa; + CEcoa2 = -2 * p_coa4 * (BOA_jk - 1.5) * e_coa; + CEcoa3 = -p_coa2 * exp_coa2 * e_coa / (1 + exp_coa2); + CEcoa4 = -2 * p_coa3 * + (workspace->total_bond_order[i]-BOA_ij) * e_coa; + CEcoa5 = -2 * p_coa3 * + (workspace->total_bond_order[k]-BOA_jk) * e_coa; + /* END COALITION ENERGY */ - /* FORCES */ - bo_ij->Cdbo += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); - bo_jk->Cdbo += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); - workspace->CdDelta[j] += ((CEval3 + CEval7) + CEpen1 + CEcoa3); - workspace->CdDeltaReduction[reductionOffset+i] += CEcoa4; - workspace->CdDeltaReduction[reductionOffset+k] += CEcoa5; + /* FORCES */ + bo_ij->Cdbo += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); + bo_jk->Cdbo += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); + workspace->CdDelta[j] += ((CEval3 + CEval7) + CEpen1 + CEcoa3); + workspace->CdDeltaReduction[reductionOffset+i] += CEcoa4; + workspace->CdDeltaReduction[reductionOffset+k] += CEcoa5; - for (t = start_j; t < end_j; ++t) { + for (t = start_j; t < end_j; ++t) { pbond_jt = &( bonds->select.bond_list[t] ); bo_jt = &(pbond_jt->bo_data); temp_bo_jt = bo_jt->BO; @@ -536,69 +530,69 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, bo_jt->Cdbo += (CEval6 * pBOjt7); bo_jt->Cdbopi += CEval5; bo_jt->Cdbopi2 += CEval5; - } + } - if( control->virial == 0 ) { - rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+i], - CEval8, p_ijk->dcos_di ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+k], - CEval8, p_ijk->dcos_dk ); - } - else { - /* terms not related to bond order derivatives are - added directly into forces and pressure vector/tensor */ - rvec_Scale( force, CEval8, p_ijk->dcos_di ); - rvec_Add( workspace->forceReduction[reductionOffset+i], force ); + if( control->virial == 0 ) { + rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+i], + CEval8, p_ijk->dcos_di ); + rvec_ScaledAdd( workspace->forceReduction[reductionOffset+k], + CEval8, p_ijk->dcos_dk ); + } + else { + /* terms not related to bond order derivatives are + added directly into forces and pressure vector/tensor */ + rvec_Scale( force, CEval8, p_ijk->dcos_di ); + rvec_Add( workspace->forceReduction[reductionOffset+i], force ); - rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); - rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); + rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); - rvec_Scale( force, CEval8, p_ijk->dcos_dk ); - rvec_Add( workspace->forceReduction[reductionOffset+k], force ); + rvec_Scale( force, CEval8, p_ijk->dcos_dk ); + rvec_Add( workspace->forceReduction[reductionOffset+k], force ); - rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); - } + rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); + rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); + } - /* tally into per-atom virials */ - if( system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + /* tally into per-atom virials */ + if( system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - /* Acquire vectors */ - rvec_ScaledSum( delij, 1., system->my_atoms[i].x, - -1., system->my_atoms[j].x ); - rvec_ScaledSum( delkj, 1., system->my_atoms[k].x, - -1., system->my_atoms[j].x ); + /* Acquire vectors */ + rvec_ScaledSum( delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x ); + rvec_ScaledSum( delkj, 1., system->my_atoms[k].x, + -1., system->my_atoms[j].x ); - rvec_Scale( fi_tmp, -CEval8, p_ijk->dcos_di ); - rvec_Scale( fj_tmp, -CEval8, p_ijk->dcos_dj ); - rvec_Scale( fk_tmp, -CEval8, p_ijk->dcos_dk ); + rvec_Scale( fi_tmp, -CEval8, p_ijk->dcos_di ); + rvec_Scale( fj_tmp, -CEval8, p_ijk->dcos_dj ); + rvec_Scale( fk_tmp, -CEval8, p_ijk->dcos_dk ); - eng_tmp = e_ang + e_pen + e_coa; + eng_tmp = e_ang + e_pen + e_coa; - if( system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, j, system->N, 1, - eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); - if( system->pair_ptr->vflag_atom) - // NEED TO MAKE AN OMP VERSION OF THIS CALL! - system->pair_ptr->v_tally3( i, j, k, fi_tmp, fk_tmp, delij, delkj); - } + if( system->pair_ptr->evflag) + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, j, system->N, 1, + eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + if( system->pair_ptr->vflag_atom) + // NEED TO MAKE AN OMP VERSION OF THIS CALL! + system->pair_ptr->v_tally3( i, j, k, fi_tmp, fk_tmp, delij, delkj); + } - } // if(p_val1>0.001) - } // for(cnt) - } // if(j0) - } // for(pk) - } // if(BOA_ij>0) + } // if(p_val1>0.001) + } // for(cnt) + } // if(j0) + } // for(pk) + } // if(BOA_ij>0) - Set_End_Index(pi, my_offset, thb_intrs ); - } // for(pi) - } // for(j) + Set_End_Index(pi, my_offset, thb_intrs ); + } // for(pi) + } // for(j) - pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, - system->pair_ptr->vflag_either, thr); - } // end omp parallel + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, thr); + } // end omp parallel data->my_en.e_ang = total_Eang; data->my_en.e_pen = total_Epen; From 5b1e582f037706789efd6b7093173b77468a09cc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 26 May 2017 10:52:20 -0400 Subject: [PATCH 095/302] prevent segfault when defining pair_style comb3 without arguments --- src/MANYBODY/pair_comb3.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/MANYBODY/pair_comb3.cpp b/src/MANYBODY/pair_comb3.cpp index 428ad57cbe..51445cccdd 100644 --- a/src/MANYBODY/pair_comb3.cpp +++ b/src/MANYBODY/pair_comb3.cpp @@ -161,6 +161,8 @@ void PairComb3::allocate() void PairComb3::settings(int narg, char **arg) { + if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + if (strcmp(arg[0],"polar_on") == 0) { pol_flag = 1; if (comm->me == 0 && screen) fprintf(screen, From 2055110e05d08ec443addba13216bb4528610613 Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Fri, 26 May 2017 17:38:21 -0400 Subject: [PATCH 096/302] Fixed typo in dox. --- doc/src/manifolds.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/manifolds.txt b/doc/src/manifolds.txt index 9f0082d5dc..eb3bd6d486 100644 --- a/doc/src/manifolds.txt +++ b/doc/src/manifolds.txt @@ -30,8 +30,8 @@ plane @ a b c x0 y0 z0 @ a*(x-x0) + b*(y-y0) + c*(z-z0) = 0 @ A plane with norma plane_wiggle @ a w @ z - a*sin(w*x) = 0 @ A plane with a sinusoidal modulation on z along x. sphere @ R @ x^2 + y^2 + z^2 - R^2 = 0 @ A sphere of radius R supersphere @ R q @ | x |^q + | y |^q + | z |^q - R^q = 0 @ A supersphere of hyperradius R -spine @ a, A, B, B2, c @ -(x^2 + y^2)*(a^2 - z^2/f(z)^2)*(1 + (A*sin(g(z)*z^2))^4), f(z) = c if z > 0, 1 otherwise; g(z) = B if z > 0, B2 otherwise @ An approximation to a dendtritic spine -spine_two @ a, A, B, B2, c @ -(x^2 + y^2)*(a^2 - z^2/f(z)^2)*(1 + (A*sin(g(z)*z^2))^2), f(z) = c if z > 0, 1 otherwise; g(z) = B if z > 0, B2 otherwise @ Another approximation to a dendtritic spine +spine @ a, A, B, B2, c @ -(x^2 + y^2) + (a^2 - z^2/f(z)^2)*(1 + (A*sin(g(z)*z^2))^4), f(z) = c if z > 0, 1 otherwise; g(z) = B if z > 0, B2 otherwise @ An approximation to a dendtritic spine +spine_two @ a, A, B, B2, c @ -(x^2 + y^2) + (a^2 - z^2/f(z)^2)*(1 + (A*sin(g(z)*z^2))^2), f(z) = c if z > 0, 1 otherwise; g(z) = B if z > 0, B2 otherwise @ Another approximation to a dendtritic spine thylakoid @ wB LB lB @ Various, see "(Paquay)"_#Paquay1 @ A model grana thylakoid consisting of two block-like compartments connected by a bridge of width wB, length LB and taper length lB torus @ R r @ (R - sqrt( x^2 + y^2 ) )^2 + z^2 - r^2 @ A torus with large radius R and small radius r, centered on (0,0,0) :tb(s=@) From 5a23d2d1da7559f904db9e2be82766d8b84ac462 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 26 May 2017 20:28:45 -0400 Subject: [PATCH 097/302] fix bug in computing mixed EAM potentials introduced by TI modifications --- src/MANYBODY/pair_eam.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MANYBODY/pair_eam.cpp b/src/MANYBODY/pair_eam.cpp index a610ca1bf1..d3ac3951bf 100644 --- a/src/MANYBODY/pair_eam.cpp +++ b/src/MANYBODY/pair_eam.cpp @@ -429,6 +429,7 @@ double PairEAM::init_one(int i, int j) // for funcfl could be multiple files // for setfl or fs, just one file + if (setflag[i][j] == 0) scale[i][j] = 1.0; scale[j][i] = scale[i][j]; if (funcfl) { From c0339120d2a59b0df5b07eb9a39ceb8dc518538c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 26 May 2017 21:28:41 -0400 Subject: [PATCH 098/302] add missing neighbor list class definitions to USER-OMP --- src/USER-OMP/npair_halffull_newtoff_omp.h | 8 ++++++-- src/USER-OMP/npair_halffull_newton_omp.h | 9 +++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/USER-OMP/npair_halffull_newtoff_omp.h b/src/USER-OMP/npair_halffull_newtoff_omp.h index 508efff277..961544a952 100644 --- a/src/USER-OMP/npair_halffull_newtoff_omp.h +++ b/src/USER-OMP/npair_halffull_newtoff_omp.h @@ -15,9 +15,13 @@ NPairStyle(halffull/newtoff/omp, NPairHalffullNewtoffOmp, - NP_HALF_FULL | NP_NEWTOFF | NP_OMP | NP_HALF | - NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI) + NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_HALF | + NP_ORTHO | NP_TRI |NP_OMP) +NPairStyle(halffull/newtoff/skip/omp, + NPairHalffullNewtoffOmp, + NP_HALF_FULL | NP_NEWTOFF | NP_NSQ | NP_BIN | NP_MULTI | NP_HALF | + NP_ORTHO | NP_TRI | NP_SKIP | NP_OMP) #else #ifndef LMP_NPAIR_HALFFULL_NEWTOFF_OMP_H diff --git a/src/USER-OMP/npair_halffull_newton_omp.h b/src/USER-OMP/npair_halffull_newton_omp.h index 87f05e2a40..ef8be32a74 100644 --- a/src/USER-OMP/npair_halffull_newton_omp.h +++ b/src/USER-OMP/npair_halffull_newton_omp.h @@ -15,8 +15,13 @@ NPairStyle(halffull/newton/omp, NPairHalffullNewtonOmp, - NP_HALF_FULL | NP_NEWTON | NP_OMP | NP_HALF | - NP_NSQ | NP_BIN | NP_MULTI | NP_ORTHO | NP_TRI) + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI| NP_OMP) + +NPairStyle(halffull/newton/skip/omp, + NPairHalffullNewtonOmp, + NP_HALF_FULL | NP_NEWTON | NP_HALF | NP_NSQ | NP_BIN | NP_MULTI | + NP_ORTHO | NP_TRI | NP_SKIP | NP_OMP) #else From ba0ddea5e1ff2d27fd77e3aa7263466705c64c2e Mon Sep 17 00:00:00 2001 From: Anders Hafreager Date: Sun, 28 May 2017 15:44:12 -0700 Subject: [PATCH 099/302] Using correct ndegree instead of nnn --- src/compute_hexorder_atom.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compute_hexorder_atom.cpp b/src/compute_hexorder_atom.cpp index 93b84080bc..013036f364 100644 --- a/src/compute_hexorder_atom.cpp +++ b/src/compute_hexorder_atom.cpp @@ -248,7 +248,7 @@ inline void ComputeHexOrderAtom::calc_qn_complex(double delx, double dely, doubl double x = delx*rinv; double y = dely*rinv; std::complex z(x, y); - std::complex zn = pow(z, nnn); + std::complex zn = pow(z, ndegree); u = real(zn); v = imag(zn); } @@ -259,9 +259,9 @@ inline void ComputeHexOrderAtom::calc_qn_complex(double delx, double dely, doubl inline void ComputeHexOrderAtom::calc_qn_trig(double delx, double dely, double &u, double &v) { double ntheta; if(fabs(delx) <= MY_EPSILON) { - if(dely > 0.0) ntheta = nnn * MY_PI / 2.0; - else ntheta = nnn * 3.0 * MY_PI / 2.0; - } else ntheta = nnn * atan(dely / delx); + if(dely > 0.0) ntheta = ndegree * MY_PI / 2.0; + else ntheta = ndegree * 3.0 * MY_PI / 2.0; + } else ntheta = ndegree * atan(dely / delx); u = cos(ntheta); v = sin(ntheta); } From 32c87f3131804f4702bb854884adff99e2012eab Mon Sep 17 00:00:00 2001 From: Emile Maras Date: Mon, 29 May 2017 14:00:13 +0200 Subject: [PATCH 100/302] removed a bug in fix_neb.cpp which prevented the freeend to work properly, plus added an example for the neb freeend --- examples/neb/in.neb.hop1freeend | 56 ++ examples/neb/initial.hop1freeend | 860 +++++++++++++++++++++++++++++++ 2 files changed, 916 insertions(+) create mode 100644 examples/neb/in.neb.hop1freeend create mode 100644 examples/neb/initial.hop1freeend diff --git a/examples/neb/in.neb.hop1freeend b/examples/neb/in.neb.hop1freeend new file mode 100644 index 0000000000..fc0677f30a --- /dev/null +++ b/examples/neb/in.neb.hop1freeend @@ -0,0 +1,56 @@ +# 2d NEB surface simulation, hop from surface to become adatom + +dimension 2 +boundary p s p + +atom_style atomic +neighbor 0.3 bin +neigh_modify delay 5 +atom_modify map array sort 0 0.0 + +variable u uloop 20 + +# create geometry with flat surface + +lattice hex 0.9 +region box block 0 20 0 10 -0.25 0.25 + +read_data initial.hop1freeend + +# LJ potentials + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_modify shift yes + +# define groups + +region 1 block INF INF INF 1.25 INF INF +group lower region 1 +group mobile subtract all lower +set group lower type 2 + +timestep 0.05 + +# group of NEB atoms - either block or single atom ID 412 + +region surround block 10 18 17 20 0 0 units box +group nebatoms region surround +#group nebatoms id 412 +set group nebatoms type 3 +group nonneb subtract all nebatoms + +fix 1 lower setforce 0.0 0.0 0.0 +fix 2 nebatoms neb 1.0 freeend ini +fix 3 all enforce2d + +thermo 100 + +#dump 1 nebatoms atom 10 dump.neb.$u +#dump 2 nonneb atom 10 dump.nonneb.$u + +# run NEB for 2000 steps or to force tolerance + +min_style quickmin + +neb 0.0 0.1 1000 1000 100 final final.hop1 diff --git a/examples/neb/initial.hop1freeend b/examples/neb/initial.hop1freeend new file mode 100644 index 0000000000..0357431fda --- /dev/null +++ b/examples/neb/initial.hop1freeend @@ -0,0 +1,860 @@ +LAMMPS data file via write_data, version 4 May 2017, timestep = 155 + +420 atoms +3 atom types + +0.0000000000000000e+00 2.2653923264628304e+01 xlo xhi +2.1918578738841410e-01 1.9932852254455714e+01 ylo yhi +-2.8317404080785380e-01 2.8317404080785380e-01 zlo zhi + +Masses + +1 1 +2 1 +3 1 + +Atoms # atomic + +1 2 0.0000000000000000e+00 2.2114806707013038e-01 0.0000000000000000e+00 0 0 0 +2 2 5.6634808161570760e-01 1.1832938184587634e+00 0.0000000000000000e+00 0 0 0 +3 2 1.1326961632314152e+00 2.2114806707013018e-01 0.0000000000000000e+00 0 0 0 +4 2 1.6990442448471228e+00 1.1832938184587634e+00 0.0000000000000000e+00 0 0 0 +5 2 2.2653923264628304e+00 2.2114806707013032e-01 0.0000000000000000e+00 0 0 0 +6 2 2.8317404080785380e+00 1.1832938184587634e+00 0.0000000000000000e+00 0 0 0 +7 2 3.3980884896942456e+00 2.2114806707013024e-01 0.0000000000000000e+00 0 0 0 +8 2 3.9644365713099532e+00 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +9 2 4.5307846529256608e+00 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +10 2 5.0971327345413684e+00 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +11 2 5.6634808161570760e+00 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +12 2 6.2298288977727836e+00 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +13 2 6.7961769793884912e+00 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +14 2 7.3625250610041988e+00 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +15 2 7.9288731426199064e+00 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +16 2 8.4952212242356140e+00 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +17 2 9.0615693058513216e+00 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +18 2 9.6279173874670292e+00 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +19 2 1.0194265469082737e+01 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +20 2 1.0760613550698444e+01 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +21 2 1.1326961632314152e+01 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +22 2 1.1893309713929860e+01 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +23 2 1.2459657795545567e+01 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +24 2 1.3026005877161275e+01 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +25 2 1.3592353958776982e+01 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +26 2 1.4158702040392690e+01 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +27 2 1.4725050122008398e+01 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +28 2 1.5291398203624105e+01 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +29 2 1.5857746285239813e+01 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +30 2 1.6424094366855520e+01 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +31 2 1.6990442448471228e+01 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +32 2 1.7556790530086936e+01 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +33 2 1.8123138611702643e+01 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +34 2 1.8689486693318351e+01 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +35 2 1.9255834774934058e+01 2.2114806707013010e-01 0.0000000000000000e+00 0 0 0 +36 2 1.9822182856549766e+01 1.1832938184587636e+00 0.0000000000000000e+00 0 0 0 +37 2 2.0388530938165474e+01 2.2114806707013024e-01 0.0000000000000000e+00 0 0 0 +38 2 2.0954879019781181e+01 1.1832938184587634e+00 0.0000000000000000e+00 0 0 0 +39 2 2.1521227101396889e+01 2.2114806707013043e-01 0.0000000000000000e+00 0 0 0 +40 2 2.2087575183012596e+01 1.1832938184587634e+00 0.0000000000000000e+00 0 0 0 +41 2 5.5197595012095140e-17 2.1414943053865136e+00 0.0000000000000000e+00 0 0 0 +42 1 5.6653050195082300e-01 3.1000166664180786e+00 0.0000000000000000e+00 0 0 0 +43 2 1.1326961632314152e+00 2.1414943053865136e+00 0.0000000000000000e+00 0 0 0 +44 1 1.6992713312703549e+00 3.1000339212153092e+00 0.0000000000000000e+00 0 0 0 +45 2 2.2653923264628304e+00 2.1414943053865136e+00 0.0000000000000000e+00 0 0 0 +46 1 2.8319979330663916e+00 3.1000568858502824e+00 0.0000000000000000e+00 0 0 0 +47 2 3.3980884896942456e+00 2.1414943053865136e+00 0.0000000000000000e+00 0 0 0 +48 1 3.9647072056144004e+00 3.1000829051868171e+00 0.0000000000000000e+00 0 0 0 +49 2 4.5307846529256608e+00 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +50 1 5.0973978903306154e+00 3.1001089282984520e+00 0.0000000000000000e+00 0 0 0 +51 2 5.6634808161570760e+00 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +52 1 6.2300706856774344e+00 3.1001320005511488e+00 0.0000000000000000e+00 0 0 0 +53 2 6.7961769793884912e+00 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +54 1 7.3627281418365298e+00 3.1001497026412643e+00 0.0000000000000000e+00 0 0 0 +55 2 7.9288731426199064e+00 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +56 1 8.4953743353575657e+00 3.1001604410839558e+00 0.0000000000000000e+00 0 0 0 +57 2 9.0615693058513216e+00 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +58 1 9.6280143647524650e+00 3.1001635457640377e+00 0.0000000000000000e+00 0 0 0 +59 2 1.0194265469082737e+01 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +60 1 1.0760653757776259e+01 3.1001591904894030e+00 0.0000000000000000e+00 0 0 0 +61 2 1.1326961632314152e+01 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +62 1 1.1893297897551465e+01 3.1001481997229781e+00 0.0000000000000000e+00 0 0 0 +63 2 1.2459657795545567e+01 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +64 1 1.3025951551034638e+01 3.1001318239711781e+00 0.0000000000000000e+00 0 0 0 +65 2 1.3592353958776982e+01 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +66 1 1.4158618530491893e+01 3.1001115545681470e+00 0.0000000000000000e+00 0 0 0 +67 2 1.4725050122008398e+01 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +68 1 1.5291301468763761e+01 3.1000890162853869e+00 0.0000000000000000e+00 0 0 0 +69 2 1.5857746285239813e+01 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +70 1 1.6424001663467980e+01 3.1000659357603495e+00 0.0000000000000000e+00 0 0 0 +71 2 1.6990442448471228e+01 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +72 1 1.7556718955895743e+01 3.1000441476131195e+00 0.0000000000000000e+00 0 0 0 +73 2 1.8123138611702643e+01 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +74 1 1.8689451647636982e+01 3.1000255781755963e+00 0.0000000000000000e+00 0 0 0 +75 2 1.9255834774934058e+01 2.1414943053865132e+00 0.0000000000000000e+00 0 0 0 +76 1 1.9822196505112320e+01 3.1000121466922494e+00 0.0000000000000000e+00 0 0 0 +77 2 2.0388530938165474e+01 2.1414943053865136e+00 0.0000000000000000e+00 0 0 0 +78 1 2.0954948927196146e+01 3.1000055506449713e+00 0.0000000000000000e+00 0 0 0 +79 2 2.1521227101396889e+01 2.1414943053865141e+00 0.0000000000000000e+00 0 0 0 +80 1 2.2087703334137267e+01 3.1000069547492535e+00 0.0000000000000000e+00 0 0 0 +81 1 3.1056926716504509e-04 4.0585004644184055e+00 0.0000000000000000e+00 0 0 0 +82 1 5.6689331628382078e-01 5.0169857265632762e+00 0.0000000000000000e+00 0 0 0 +83 1 1.1331010876667682e+00 4.0585336877518543e+00 0.0000000000000000e+00 0 0 0 +84 1 1.6997107179473134e+00 5.0170595571637469e+00 0.0000000000000000e+00 0 0 0 +85 1 2.2658691471408239e+00 4.0585832735991989e+00 0.0000000000000000e+00 0 0 0 +86 1 2.8324913387275488e+00 5.0171576059016481e+00 0.0000000000000000e+00 0 0 0 +87 1 3.3986077265334802e+00 4.0586437183143182e+00 0.0000000000000000e+00 0 0 0 +88 1 3.9652274946581523e+00 5.0172690174612651e+00 0.0000000000000000e+00 0 0 0 +89 1 4.5313127263524615e+00 4.0587080892871539e+00 0.0000000000000000e+00 0 0 0 +90 1 5.0979153202534064e+00 5.0173813990872880e+00 0.0000000000000000e+00 0 0 0 +91 1 5.6639833195247755e+00 4.0587690704404489e+00 0.0000000000000000e+00 0 0 0 +92 1 6.2305551824295442e+00 5.0174824868813017e+00 0.0000000000000000e+00 0 0 0 +93 1 6.7966220748571669e+00 4.0588200390400129e+00 0.0000000000000000e+00 0 0 0 +94 1 7.3631519876339633e+00 5.0175617795367824e+00 0.0000000000000000e+00 0 0 0 +95 1 7.9292347620768062e+00 4.0588559557915787e+00 0.0000000000000000e+00 0 0 0 +96 1 8.4957150696300925e+00 5.0176118394895646e+00 0.0000000000000000e+00 0 0 0 +97 1 9.0618297669257259e+00 4.0588738859603266e+00 0.0000000000000000e+00 0 0 0 +98 1 9.6282574219214077e+00 5.0176289672989007e+00 0.0000000000000000e+00 0 0 0 +99 1 1.0194417159454611e+01 4.0588730767572860e+00 0.0000000000000000e+00 0 0 0 +100 1 1.0760794315385466e+01 5.0176131474245498e+00 0.0000000000000000e+00 0 0 0 +101 1 1.1327007580768864e+01 4.0588546552053515e+00 0.0000000000000000e+00 0 0 0 +102 1 1.1893341583868121e+01 5.0175674119454996e+00 0.0000000000000000e+00 0 0 0 +103 1 1.2459611156068675e+01 4.0588211205885418e+00 0.0000000000000000e+00 0 0 0 +104 1 1.3025913928919357e+01 5.0174969437432848e+00 0.0000000000000000e+00 0 0 0 +105 1 1.3592236588154931e+01 4.0587758328652299e+00 0.0000000000000000e+00 0 0 0 +106 1 1.4158523495745847e+01 5.0174082592346645e+00 0.0000000000000000e+00 0 0 0 +107 1 1.4724890484932756e+01 4.0587226477181808e+00 0.0000000000000000e+00 0 0 0 +108 1 1.5291178803597106e+01 5.0173086870307237e+00 0.0000000000000000e+00 0 0 0 +109 1 1.5857576888353359e+01 4.0586657476126140e+00 0.0000000000000000e+00 0 0 0 +110 1 1.6423884000624799e+01 5.0172061640888863e+00 0.0000000000000000e+00 0 0 0 +111 1 1.6990296946466405e+01 4.0586096139851531e+00 0.0000000000000000e+00 0 0 0 +112 1 1.7556638404998214e+01 5.0171091825602536e+00 0.0000000000000000e+00 0 0 0 +113 1 1.8123048711157228e+01 4.0585590083330025e+00 0.0000000000000000e+00 0 0 0 +114 1 1.8689436384449273e+01 5.0170266065355777e+00 0.0000000000000000e+00 0 0 0 +115 1 1.9255827121600600e+01 4.0585188068824696e+00 0.0000000000000000e+00 0 0 0 +116 1 1.9822267727126505e+01 5.0169670887341100e+00 0.0000000000000000e+00 0 0 0 +117 1 2.0388624292977298e+01 4.0584935738800203e+00 0.0000000000000000e+00 0 0 0 +118 1 2.0955118660666272e+01 5.0169379847636248e+00 0.0000000000000000e+00 0 0 0 +119 1 2.1521430213723754e+01 4.0584868720623906e+00 0.0000000000000000e+00 0 0 0 +120 1 2.2087973498256840e+01 5.0169439545250629e+00 0.0000000000000000e+00 0 0 0 +121 1 6.5693888433665819e-04 5.9753894955957820e+00 0.0000000000000000e+00 0 0 0 +122 1 5.6732815172745055e-01 6.9338399304063270e+00 0.0000000000000000e+00 0 0 0 +123 1 1.1335287178365945e+00 5.9754794631117711e+00 0.0000000000000000e+00 0 0 0 +124 1 1.7002170239497103e+00 6.9340002985609068e+00 0.0000000000000000e+00 0 0 0 +125 1 2.2663607603415961e+00 5.9756128140497200e+00 0.0000000000000000e+00 0 0 0 +126 1 2.8330530781363672e+00 6.9342120448719999e+00 0.0000000000000000e+00 0 0 0 +127 1 3.3991419489134609e+00 5.9757753571666763e+00 0.0000000000000000e+00 0 0 0 +128 1 3.9658260192240613e+00 6.9344537679961507e+00 0.0000000000000000e+00 0 0 0 +129 1 4.5318648361825700e+00 5.9759497256682410e+00 0.0000000000000000e+00 0 0 0 +130 1 5.0985283212441441e+00 6.9347011709619251e+00 0.0000000000000000e+00 0 0 0 +131 1 5.6645260085061278e+00 5.9761173336292988e+00 0.0000000000000000e+00 0 0 0 +132 1 6.2311560978848899e+00 6.9349290616610286e+00 0.0000000000000000e+00 0 0 0 +133 1 6.7971269443565747e+00 5.9762605495489280e+00 0.0000000000000000e+00 0 0 0 +134 1 7.3637111409380722e+00 6.9351139899270322e+00 0.0000000000000000e+00 0 0 0 +135 1 7.9296749255956041e+00 5.9763649377635293e+00 0.0000000000000000e+00 0 0 0 +136 1 8.4962030194710927e+00 6.9352373287964380e+00 0.0000000000000000e+00 0 0 0 +137 1 9.0621832354873675e+00 5.9764210443253543e+00 0.0000000000000000e+00 0 0 0 +138 1 9.6286498073427680e+00 6.9352878316174378e+00 0.0000000000000000e+00 0 0 0 +139 1 1.0194670187278859e+01 5.9764252099845692e+00 0.0000000000000000e+00 0 0 0 +140 1 1.0761076657788550e+01 6.9352626758233988e+00 0.0000000000000000e+00 0 0 0 +141 1 1.1327157075090911e+01 5.9763792530010624e+00 0.0000000000000000e+00 0 0 0 +142 1 1.1893512574619942e+01 6.9351667929726579e+00 0.0000000000000000e+00 0 0 0 +143 1 1.2459665575239395e+01 5.9762893326393627e+00 0.0000000000000000e+00 0 0 0 +144 1 1.3025986375565017e+01 6.9350110693313853e+00 0.0000000000000000e+00 0 0 0 +145 1 1.3592215193397568e+01 5.9761645662970668e+00 0.0000000000000000e+00 0 0 0 +146 1 1.4158522852873338e+01 6.9348103731164086e+00 0.0000000000000000e+00 0 0 0 +147 1 1.4724821146400661e+01 5.9760159211600943e+00 0.0000000000000000e+00 0 0 0 +148 1 1.5291139696354101e+01 6.9345821426564456e+00 0.0000000000000000e+00 0 0 0 +149 1 1.5857492801384174e+01 5.9758556179168476e+00 0.0000000000000000e+00 0 0 0 +150 1 1.6423845342403485e+01 6.9343457083902562e+00 0.0000000000000000e+00 0 0 0 +151 1 1.6990232659392920e+01 5.9756969240409656e+00 0.0000000000000000e+00 0 0 0 +152 1 1.7556637811168688e+01 6.9341219348234606e+00 0.0000000000000000e+00 0 0 0 +153 1 1.8123035927190724e+01 5.9755539362099377e+00 0.0000000000000000e+00 0 0 0 +154 1 1.8689504786395585e+01 6.9339324030079297e+00 0.0000000000000000e+00 0 0 0 +155 1 1.9255890870078105e+01 5.9754408656724385e+00 0.0000000000000000e+00 0 0 0 +156 1 1.9822425360651039e+01 6.9337974543626846e+00 0.0000000000000000e+00 0 0 0 +157 1 2.0388780199969101e+01 5.9753705251759808e+00 0.0000000000000000e+00 0 0 0 +158 1 2.0955373611320280e+01 6.9337330661143222e+00 0.0000000000000000e+00 0 0 0 +159 1 2.1521683507254988e+01 5.9753521824721574e+00 0.0000000000000000e+00 0 0 0 +160 1 2.2088323232189435e+01 6.9337475792566039e+00 0.0000000000000000e+00 0 0 0 +161 1 1.1151815023353693e-03 7.8921416571122727e+00 0.0000000000000000e+00 0 0 0 +162 1 5.6789887436851039e-01 8.8505576275120745e+00 0.0000000000000000e+00 0 0 0 +163 1 1.1340615020344891e+00 7.8923152028921146e+00 0.0000000000000000e+00 0 0 0 +164 1 1.7008494977197184e+00 8.8508369646616227e+00 0.0000000000000000e+00 0 0 0 +165 1 2.2669564852467339e+00 7.8925678787693965e+00 0.0000000000000000e+00 0 0 0 +166 1 2.8337429988374914e+00 8.8512007799959171e+00 0.0000000000000000e+00 0 0 0 +167 1 3.3997890834793392e+00 7.8928753791925752e+00 0.0000000000000000e+00 0 0 0 +168 1 3.9665700017177907e+00 8.8516188392723496e+00 0.0000000000000000e+00 0 0 0 +169 1 4.5325491541722158e+00 7.8932093579911635e+00 0.0000000000000000e+00 0 0 0 +170 1 5.0993179760197034e+00 8.8520570451664753e+00 0.0000000000000000e+00 0 0 0 +171 1 5.6652272696563086e+00 7.8935385042762318e+00 0.0000000000000000e+00 0 0 0 +172 1 6.2319722558852177e+00 8.8524768944511472e+00 0.0000000000000000e+00 0 0 0 +173 1 6.7978170214800082e+00 7.8938302754648539e+00 0.0000000000000000e+00 0 0 0 +174 1 7.3645207249719933e+00 8.8528366651387476e+00 0.0000000000000000e+00 0 0 0 +175 1 7.9303191911043118e+00 7.8940542651579788e+00 0.0000000000000000e+00 0 0 0 +176 1 8.4969615618418324e+00 8.8530963542120293e+00 0.0000000000000000e+00 0 0 0 +177 1 9.0627458585593441e+00 7.8941868850969135e+00 0.0000000000000000e+00 0 0 0 +178 1 9.6293104463590424e+00 8.8532254399208412e+00 0.0000000000000000e+00 0 0 0 +179 1 1.0195121730902658e+01 7.8942152485172352e+00 0.0000000000000000e+00 0 0 0 +180 1 1.0761602408503441e+01 8.8532092085980238e+00 0.0000000000000000e+00 0 0 0 +181 1 1.1327481649719793e+01 7.8941385508356099e+00 0.0000000000000000e+00 0 0 0 +182 1 1.1893886870241856e+01 8.8530505445055354e+00 0.0000000000000000e+00 0 0 0 +183 1 1.2459865179342737e+01 7.8939667557582798e+00 0.0000000000000000e+00 0 0 0 +184 1 1.3026218291904378e+01 8.8527674547956821e+00 0.0000000000000000e+00 0 0 0 +185 1 1.3592310202433307e+01 7.8937178025905181e+00 0.0000000000000000e+00 0 0 0 +186 1 1.4158645900042497e+01 8.8523887379317436e+00 0.0000000000000000e+00 0 0 0 +187 1 1.4724847145311326e+01 7.8934149070498600e+00 0.0000000000000000e+00 0 0 0 +188 1 1.5291205081244327e+01 8.8519503874602243e+00 0.0000000000000000e+00 0 0 0 +189 1 1.5857494607334019e+01 7.8930848995638652e+00 0.0000000000000000e+00 0 0 0 +190 1 1.6423911366860466e+01 8.8514936483282209e+00 0.0000000000000000e+00 0 0 0 +191 1 1.6990256625068444e+01 7.8927574412240151e+00 0.0000000000000000e+00 0 0 0 +192 1 1.7556757521848787e+01 8.8510636099500459e+00 0.0000000000000000e+00 0 0 0 +193 1 1.8123121878813144e+01 7.8924640508501298e+00 0.0000000000000000e+00 0 0 0 +194 1 1.8689714850348466e+01 8.8507060559423465e+00 0.0000000000000000e+00 0 0 0 +195 1 1.9256065579477248e+01 7.8922356001392169e+00 0.0000000000000000e+00 0 0 0 +196 1 1.9822740225596814e+01 8.8504608774193994e+00 0.0000000000000000e+00 0 0 0 +197 1 2.0389054599310764e+01 7.8920977743942782e+00 0.0000000000000000e+00 0 0 0 +198 1 2.0955788196198530e+01 8.8503534864083591e+00 0.0000000000000000e+00 0 0 0 +199 1 2.1522054950758765e+01 7.8920658349416701e+00 0.0000000000000000e+00 0 0 0 +200 1 2.2088823030833748e+01 8.8503894045591807e+00 0.0000000000000000e+00 0 0 0 +201 1 1.7402898961801966e-03 9.8087331458102049e+00 0.0000000000000000e+00 0 0 0 +202 1 5.6862550253253785e-01 1.0767129063577668e+01 0.0000000000000000e+00 0 0 0 +203 1 1.1347351125604563e+00 9.8090210312609756e+00 0.0000000000000000e+00 0 0 0 +204 1 1.7016010961270076e+00 1.0767553944884048e+01 0.0000000000000000e+00 0 0 0 +205 1 2.2676800733457139e+00 9.8094251915038573e+00 0.0000000000000000e+00 0 0 0 +206 1 2.8345388558320415e+00 1.0768094021206529e+01 0.0000000000000000e+00 0 0 0 +207 1 3.4005711921286008e+00 9.8099146303251388e+00 0.0000000000000000e+00 0 0 0 +208 1 3.9674359888022686e+00 1.0768719604543580e+01 0.0000000000000000e+00 0 0 0 +209 1 4.5333977826109315e+00 9.8104561733570019e+00 0.0000000000000000e+00 0 0 0 +210 1 5.1002760963180327e+00 1.0769398202643465e+01 0.0000000000000000e+00 0 0 0 +211 1 5.6661407887052828e+00 9.8110111848429966e+00 0.0000000000000000e+00 0 0 0 +212 1 6.2330282022400469e+00 1.0770087202120337e+01 0.0000000000000000e+00 0 0 0 +213 1 6.7987755062394477e+00 9.8115326503110527e+00 0.0000000000000000e+00 0 0 0 +214 1 7.3656514287550623e+00 1.0770727843890981e+01 0.0000000000000000e+00 0 0 0 +215 1 7.9312798141889260e+00 9.8119658218493768e+00 0.0000000000000000e+00 0 0 0 +216 1 8.4981076412551477e+00 1.0771244633836279e+01 0.0000000000000000e+00 0 0 0 +217 1 9.0636474998261161e+00 9.8122560909429151e+00 0.0000000000000000e+00 0 0 0 +218 1 9.6303843877347930e+00 1.0771559046035311e+01 0.0000000000000000e+00 0 0 0 +219 1 1.0195900672859819e+01 9.8123627359180627e+00 0.0000000000000000e+00 0 0 0 +220 1 1.0762516251278290e+01 1.0771614844517241e+01 0.0000000000000000e+00 0 0 0 +221 1 1.1328091472906591e+01 9.8122692653101016e+00 0.0000000000000000e+00 0 0 0 +222 1 1.1894584725285364e+01 1.0771394980275380e+01 0.0000000000000000e+00 0 0 0 +223 1 1.2460291956550108e+01 9.8119854743716211e+00 0.0000000000000000e+00 0 0 0 +224 1 1.3026697175518089e+01 1.0770922584297365e+01 0.0000000000000000e+00 0 0 0 +225 1 1.3592577560562113e+01 9.8115426529845742e+00 0.0000000000000000e+00 0 0 0 +226 1 1.4158957523975143e+01 1.0770251678533704e+01 0.0000000000000000e+00 0 0 0 +227 1 1.4725010595311739e+01 9.8109868569230709e+00 0.0000000000000000e+00 0 0 0 +228 1 1.5291439665423439e+01 1.0769456959141509e+01 0.0000000000000000e+00 0 0 0 +229 1 1.5857627568713173e+01 9.8103742214932304e+00 0.0000000000000000e+00 0 0 0 +230 1 1.6424169320270668e+01 1.0768628052568168e+01 0.0000000000000000e+00 0 0 0 +231 1 1.6990431516954079e+01 9.8097684628141781e+00 0.0000000000000000e+00 0 0 0 +232 1 1.7557116532362020e+01 1.0767864432631596e+01 0.0000000000000000e+00 0 0 0 +233 1 1.8123390991250901e+01 9.8092369760472078e+00 0.0000000000000000e+00 0 0 0 +234 1 1.8690204705628890e+01 1.0767262063551410e+01 0.0000000000000000e+00 0 0 0 +235 1 1.9256448808830498e+01 9.8088413825519911e+00 0.0000000000000000e+00 0 0 0 +236 1 1.9823340586830241e+01 1.0766888821404979e+01 0.0000000000000000e+00 0 0 0 +237 1 2.0389541413400988e+01 9.8086229912274785e+00 0.0000000000000000e+00 0 0 0 +238 1 2.0956458511796701e+01 1.0766759511236279e+01 0.0000000000000000e+00 0 0 0 +239 1 2.1522621458778595e+01 9.8085916713182311e+00 0.0000000000000000e+00 0 0 0 +240 1 2.2089529168272502e+01 1.0766851883618157e+01 0.0000000000000000e+00 0 0 0 +241 1 2.5440858595377333e-03 1.1725176449724485e+01 0.0000000000000000e+00 0 0 0 +242 1 5.6945959459694062e-01 1.2683596360703445e+01 0.0000000000000000e+00 0 0 0 +243 1 1.1355189649219313e+00 1.1725603142335736e+01 0.0000000000000000e+00 0 0 0 +244 1 1.7023827890664067e+00 1.2684167657575470e+01 0.0000000000000000e+00 0 0 0 +245 1 2.2684713496063051e+00 1.1726169790097240e+01 0.0000000000000000e+00 0 0 0 +246 1 2.8353214317297493e+00 1.2684869845626739e+01 0.0000000000000000e+00 0 0 0 +247 1 3.4014115221528614e+00 1.1726849793467629e+01 0.0000000000000000e+00 0 0 0 +248 1 3.9682847366436711e+00 1.2685690043118647e+01 0.0000000000000000e+00 0 0 0 +249 1 4.5343333925353440e+00 1.1727620546655658e+01 0.0000000000000000e+00 0 0 0 +250 1 5.1012595788864648e+00 1.2686617936467927e+01 0.0000000000000000e+00 0 0 0 +251 1 5.6672100999124009e+00 1.1728453321807010e+01 0.0000000000000000e+00 0 0 0 +252 1 6.2342050679378476e+00 1.2687631443781253e+01 0.0000000000000000e+00 0 0 0 +253 1 6.7999929539663801e+00 1.1729301393807379e+01 0.0000000000000000e+00 0 0 0 +254 1 7.3670487632296053e+00 1.2688678524169049e+01 0.0000000000000000e+00 0 0 0 +255 1 7.9326168577620031e+00 1.1730088752185795e+01 0.0000000000000000e+00 0 0 0 +256 1 8.4996909972151879e+00 1.2689657545646673e+01 0.0000000000000000e+00 0 0 0 +257 1 9.0650186324858186e+00 1.1730705889838760e+01 0.0000000000000000e+00 0 0 0 +258 1 9.6320279172941738e+00 1.2690401359419884e+01 0.0000000000000000e+00 0 0 0 +259 1 1.0197176988949883e+01 1.1731033591325737e+01 0.0000000000000000e+00 0 0 0 +260 1 1.0764025265158372e+01 1.2690719979755405e+01 0.0000000000000000e+00 0 0 0 +261 1 1.1329151471753224e+01 1.1730992082437087e+01 0.0000000000000000e+00 0 0 0 +262 1 1.1895793457864773e+01 1.2690499952724066e+01 0.0000000000000000e+00 0 0 0 +263 1 1.2461074954083520e+01 1.1730568008302011e+01 0.0000000000000000e+00 0 0 0 +264 1 1.3027557263784812e+01 1.2689744664661927e+01 0.0000000000000000e+00 0 0 0 +265 1 1.3593109813371450e+01 1.1729811224797992e+01 0.0000000000000000e+00 0 0 0 +266 1 1.4159562461497188e+01 1.2688557996910490e+01 0.0000000000000000e+00 0 0 0 +267 1 1.4725395146103379e+01 1.1728816806025771e+01 0.0000000000000000e+00 0 0 0 +268 1 1.5291979336937130e+01 1.2687112353846338e+01 0.0000000000000000e+00 0 0 0 +269 1 1.5858003969640130e+01 1.1727709969544065e+01 0.0000000000000000e+00 0 0 0 +270 1 1.6424834380846097e+01 1.2685627373535834e+01 0.0000000000000000e+00 0 0 0 +271 1 1.6990919595491782e+01 1.1726637864021814e+01 0.0000000000000000e+00 0 0 0 +272 1 1.7557997576834389e+01 1.2684345428666392e+01 0.0000000000000000e+00 0 0 0 +273 1 1.8124040077451223e+01 1.1725751812758334e+01 0.0000000000000000e+00 0 0 0 +274 1 1.8691233014266899e+01 1.2683475493290855e+01 0.0000000000000000e+00 0 0 0 +275 1 1.9257221467828444e+01 1.1725167602985902e+01 0.0000000000000000e+00 0 0 0 +276 1 1.9824402296022900e+01 1.2683041511515679e+01 0.0000000000000000e+00 0 0 0 +277 1 2.0390369399207284e+01 1.1724905550220807e+01 0.0000000000000000e+00 0 0 0 +278 1 2.0957468093457749e+01 1.2682973372169659e+01 0.0000000000000000e+00 0 0 0 +279 1 2.1523449818304549e+01 1.1724927159323300e+01 0.0000000000000000e+00 0 0 0 +280 1 2.2090449109149038e+01 1.2683182366055206e+01 0.0000000000000000e+00 0 0 0 +281 1 3.4599372752678664e-03 1.3641562113178441e+01 0.0000000000000000e+00 0 0 0 +282 1 5.7026645299712297e-01 1.4600072778762289e+01 0.0000000000000000e+00 0 0 0 +283 1 1.1363018176625184e+00 1.3642122621820601e+01 0.0000000000000000e+00 0 0 0 +284 1 1.7030304397851530e+00 1.4600744808517264e+01 0.0000000000000000e+00 0 0 0 +285 1 2.2691832178537314e+00 1.3642819174389231e+01 0.0000000000000000e+00 0 0 0 +286 1 2.8358920720180945e+00 1.4601540713388465e+01 0.0000000000000000e+00 0 0 0 +287 1 3.4021290160499604e+00 1.3643644649633430e+01 0.0000000000000000e+00 0 0 0 +288 1 3.9688713598453158e+00 1.4602477110803298e+01 0.0000000000000000e+00 0 0 0 +289 1 4.5351441054704758e+00 1.3644605343002951e+01 0.0000000000000000e+00 0 0 0 +290 1 5.1019693529741863e+00 1.4603583498422479e+01 0.0000000000000000e+00 0 0 0 +291 1 5.6682074099496385e+00 1.3645707993168530e+01 0.0000000000000000e+00 0 0 0 +292 1 6.2351598742721581e+00 1.4604888485699654e+01 0.0000000000000000e+00 0 0 0 +293 1 6.8012626955016664e+00 1.3646941178415421e+01 0.0000000000000000e+00 0 0 0 +294 1 7.3683745276621622e+00 1.4606397643582930e+01 0.0000000000000000e+00 0 0 0 +295 1 7.9342088141787288e+00 1.3648248663869856e+01 0.0000000000000000e+00 0 0 0 +296 1 8.5014805494154277e+00 1.4608055299059714e+01 0.0000000000000000e+00 0 0 0 +297 1 9.0668968877652869e+00 1.3649493406156790e+01 0.0000000000000000e+00 0 0 0 +298 1 9.6342620410232698e+00 1.4609684783907733e+01 0.0000000000000000e+00 0 0 0 +299 1 1.0199152905272882e+01 1.3650407439181874e+01 0.0000000000000000e+00 0 0 0 +300 1 1.0766413330496736e+01 1.4610836305969919e+01 0.0000000000000000e+00 0 0 0 +301 1 1.1330921232704116e+01 1.3650669393063648e+01 0.0000000000000000e+00 0 0 0 +302 1 1.1897841502623006e+01 1.4610930556808350e+01 0.0000000000000000e+00 0 0 0 +303 1 1.2462421601307861e+01 1.3650120591395567e+01 0.0000000000000000e+00 0 0 0 +304 1 1.3029018938638984e+01 1.4609761134444172e+01 0.0000000000000000e+00 0 0 0 +305 1 1.3594046992755665e+01 1.3648816127477271e+01 0.0000000000000000e+00 0 0 0 +306 1 1.4160647838817273e+01 1.4607529632893289e+01 0.0000000000000000e+00 0 0 0 +307 1 1.4726158301286814e+01 1.3646976680611393e+01 0.0000000000000000e+00 0 0 0 +308 1 1.5293172565463893e+01 1.4604737496674128e+01 0.0000000000000000e+00 0 0 0 +309 1 1.5858902039329786e+01 1.3644935977195637e+01 0.0000000000000000e+00 0 0 0 +310 1 1.6426542400228328e+01 1.4602024837155536e+01 0.0000000000000000e+00 0 0 0 +311 1 1.6992136000094352e+01 1.3643085312965626e+01 0.0000000000000000e+00 0 0 0 +312 1 1.7559955069272618e+01 1.4600235886953440e+01 0.0000000000000000e+00 0 0 0 +313 1 1.8125444003110619e+01 1.3641827838397322e+01 0.0000000000000000e+00 0 0 0 +314 1 1.8693119558449155e+01 1.4599324386000902e+01 0.0000000000000000e+00 0 0 0 +315 1 1.9258622464532973e+01 1.3641178402937728e+01 0.0000000000000000e+00 0 0 0 +316 1 1.9826034884164418e+01 1.4599040434292966e+01 0.0000000000000000e+00 0 0 0 +317 1 2.0391639577074734e+01 1.3641005830730871e+01 0.0000000000000000e+00 0 0 0 +318 1 2.0958793244869717e+01 1.4599158580846662e+01 0.0000000000000000e+00 0 0 0 +319 1 2.1524539566888354e+01 1.3641168546895004e+01 0.0000000000000000e+00 0 0 0 +320 1 2.2091487241099536e+01 1.4599530965127977e+01 0.0000000000000000e+00 0 0 0 +321 1 4.3165808837657372e-03 1.5558056864296654e+01 0.0000000000000000e+00 0 0 0 +322 1 5.7083714563799326e-01 1.6516708751979007e+01 0.0000000000000000e+00 0 0 0 +323 1 1.1369032012442155e+00 1.5558694023524415e+01 0.0000000000000000e+00 0 0 0 +324 1 1.7033478671452040e+00 1.6517390053019362e+01 0.0000000000000000e+00 0 0 0 +325 1 2.2696166894760093e+00 1.5559438272441989e+01 0.0000000000000000e+00 0 0 0 +326 1 2.8360390517176817e+00 1.6518173675862919e+01 0.0000000000000000e+00 0 0 0 +327 1 3.4024835472607537e+00 1.5560308985846410e+01 0.0000000000000000e+00 0 0 0 +328 1 3.9689280293273477e+00 1.6519102391285173e+01 0.0000000000000000e+00 0 0 0 +329 1 4.5355194771089229e+00 1.5561347597079759e+01 0.0000000000000000e+00 0 0 0 +330 1 5.1020300316691811e+00 1.6520241802728972e+01 0.0000000000000000e+00 0 0 0 +331 1 5.6687261068083830e+00 1.5562609975559823e+01 0.0000000000000000e+00 0 0 0 +332 1 6.2353553251066147e+00 1.6521676870813170e+01 0.0000000000000000e+00 0 0 0 +333 1 6.8020803209306022e+00 1.5564154380715671e+01 0.0000000000000000e+00 0 0 0 +334 1 7.3688969132482525e+00 1.6523504940606951e+01 0.0000000000000000e+00 0 0 0 +335 1 7.9355107433004930e+00 1.5566016713593251e+01 0.0000000000000000e+00 0 0 0 +336 1 8.5025988576228730e+00 1.6525815249413437e+01 0.0000000000000000e+00 0 0 0 +337 1 9.0688572861916743e+00 1.5568159644275148e+01 0.0000000000000000e+00 0 0 0 +338 1 9.6362867759002064e+00 1.6528628994685398e+01 0.0000000000000000e+00 0 0 0 +339 1 1.0201819017728946e+01 1.5570385216229328e+01 0.0000000000000000e+00 0 0 0 +340 1 1.0769583800973923e+01 1.6531845844888416e+01 0.0000000000000000e+00 0 0 0 +341 1 1.1333827071325254e+01 1.5571891707346142e+01 0.0000000000000000e+00 0 0 0 +342 1 1.1901384079738815e+01 1.6533906438348030e+01 0.0000000000000000e+00 0 0 0 +343 1 1.2464735369608531e+01 1.5571536667850689e+01 0.0000000000000000e+00 0 0 0 +344 1 1.3031616332415751e+01 1.6532264065445577e+01 0.0000000000000000e+00 0 0 0 +345 1 1.3595655007692846e+01 1.5569123466092078e+01 0.0000000000000000e+00 0 0 0 +346 1 1.4162673858547034e+01 1.6527452690896975e+01 0.0000000000000000e+00 0 0 0 +347 1 1.4727720485417455e+01 1.5565353830287787e+01 0.0000000000000000e+00 0 0 0 +348 1 1.5296922688141537e+01 1.6520776714395723e+01 0.0000000000000000e+00 0 0 0 +349 1 1.5861362778086731e+01 1.5561222799294468e+01 0.0000000000000000e+00 0 0 0 +350 1 1.6430601172841506e+01 1.6517208583528205e+01 0.0000000000000000e+00 0 0 0 +351 1 1.6994922716392164e+01 1.5558699760506759e+01 0.0000000000000000e+00 0 0 0 +352 1 1.7563499738678178e+01 1.6515675589984340e+01 0.0000000000000000e+00 0 0 0 +353 1 1.8128019408521833e+01 1.5557486534354460e+01 0.0000000000000000e+00 0 0 0 +354 1 1.8695872352982320e+01 1.6515215010141834e+01 0.0000000000000000e+00 0 0 0 +355 1 1.9260742856192188e+01 1.5557098710840322e+01 0.0000000000000000e+00 0 0 0 +356 1 1.9828039670247652e+01 1.6515278710047973e+01 0.0000000000000000e+00 0 0 0 +357 1 2.0393271644052639e+01 1.5557181842904438e+01 0.0000000000000000e+00 0 0 0 +358 1 2.0960186167839215e+01 1.6515618076673135e+01 0.0000000000000000e+00 0 0 0 +359 1 2.1525740973565441e+01 1.5557536533469163e+01 0.0000000000000000e+00 0 0 0 +360 1 2.2092409007659992e+01 1.6516113225524911e+01 0.0000000000000000e+00 0 0 0 +361 1 4.8529541639103424e-03 1.7474826118864232e+01 0.0000000000000000e+00 0 0 0 +362 1 5.7093835977538809e-01 1.8433654344787417e+01 0.0000000000000000e+00 0 0 0 +363 1 1.1371184592334547e+00 1.7475436697267657e+01 0.0000000000000000e+00 0 0 0 +364 1 1.7031721612449391e+00 1.8434245395923575e+01 0.0000000000000000e+00 0 0 0 +365 1 2.2695912343467985e+00 1.7476125500853652e+01 0.0000000000000000e+00 0 0 0 +366 1 2.8356286616018873e+00 1.8434926390559969e+01 0.0000000000000000e+00 0 0 0 +367 1 3.4022762478393873e+00 1.7476929029147396e+01 0.0000000000000000e+00 0 0 0 +368 1 3.9683006032101118e+00 1.8435747821965681e+01 0.0000000000000000e+00 0 0 0 +369 1 4.5351848152653442e+00 1.7477909278192492e+01 0.0000000000000000e+00 0 0 0 +370 1 5.1011966627212457e+00 1.8436786379097875e+01 0.0000000000000000e+00 0 0 0 +371 1 5.6683370882181823e+00 1.7479154484464996e+01 0.0000000000000000e+00 0 0 0 +372 1 6.2343468444568826e+00 1.8438149387991913e+01 0.0000000000000000e+00 0 0 0 +373 1 6.8017614989468314e+00 1.7480782103907771e+01 0.0000000000000000e+00 0 0 0 +374 1 7.3678106610096554e+00 1.8439986240742563e+01 0.0000000000000000e+00 0 0 0 +375 1 7.9354841298542631e+00 1.7482944033551004e+01 0.0000000000000000e+00 0 0 0 +376 1 8.5016878917981664e+00 1.8442513240991936e+01 0.0000000000000000e+00 0 0 0 +377 1 9.0694835466447152e+00 1.7485826099637269e+01 0.0000000000000000e+00 0 0 0 +378 1 9.6361298737773780e+00 1.8446058020412732e+01 0.0000000000000000e+00 0 0 0 +379 3 1.0203552137528503e+01 1.7489611887918201e+01 0.0000000000000000e+00 0 0 0 +380 3 1.0771411102042309e+01 1.8452757080501815e+01 0.0000000000000000e+00 0 0 0 +381 3 1.1337379036649208e+01 1.7494680029430171e+01 0.0000000000000000e+00 0 0 0 +382 3 1.1906745469447291e+01 1.8462022833637111e+01 0.0000000000000000e+00 0 0 0 +383 3 1.2469280552911147e+01 1.7497259990645460e+01 0.0000000000000000e+00 0 0 0 +384 3 1.3036336275216634e+01 1.8467761987124586e+01 0.0000000000000000e+00 0 0 0 +385 3 1.3598327635293121e+01 1.7492598542232617e+01 0.0000000000000000e+00 0 0 0 +386 3 1.4175415687021504e+01 1.8442378825657116e+01 0.0000000000000000e+00 0 0 0 +387 3 1.4734039006741700e+01 1.7480807237018496e+01 0.0000000000000000e+00 0 0 0 +388 3 1.5307067776131944e+01 1.8435324828663727e+01 0.0000000000000000e+00 0 0 0 +389 3 1.5867533841026015e+01 1.7475841850521086e+01 0.0000000000000000e+00 0 0 0 +390 3 1.6437492616293390e+01 1.8432690656917494e+01 0.0000000000000000e+00 0 0 0 +391 3 1.6999775067986949e+01 1.7473899503923125e+01 0.0000000000000000e+00 0 0 0 +392 3 1.7567888910690055e+01 1.8431965422256074e+01 0.0000000000000000e+00 0 0 0 +393 1 1.8131542880564929e+01 1.7473449678636637e+01 0.0000000000000000e+00 0 0 0 +394 1 1.8698655140485940e+01 1.8432031695013379e+01 0.0000000000000000e+00 0 0 0 +395 1 1.9263155459010161e+01 1.7473512474723787e+01 0.0000000000000000e+00 0 0 0 +396 1 1.9829735002682860e+01 1.8432284732233299e+01 0.0000000000000000e+00 0 0 0 +397 1 2.0394851027090610e+01 1.7473827778588312e+01 0.0000000000000000e+00 0 0 0 +398 1 2.0961149629160545e+01 1.8432663919612150e+01 0.0000000000000000e+00 0 0 0 +399 1 2.1526715232103822e+01 1.7474283624212315e+01 0.0000000000000000e+00 0 0 0 +400 1 2.2092870034810801e+01 1.8433127631588540e+01 0.0000000000000000e+00 0 0 0 +401 1 4.8013042136807321e-03 1.9396043340320471e+01 0.0000000000000000e+00 0 0 0 +402 1 1.1367941837037772e+00 1.9396530996055038e+01 0.0000000000000000e+00 0 0 0 +403 1 2.2690256110731926e+00 1.9397098404349112e+01 0.0000000000000000e+00 0 0 0 +404 1 3.4014603716469214e+00 1.9397780714315690e+01 0.0000000000000000e+00 0 0 0 +405 1 4.5340819027961929e+00 1.9398637844588755e+01 0.0000000000000000e+00 0 0 0 +406 1 5.6668967352607975e+00 1.9399756780683603e+01 0.0000000000000000e+00 0 0 0 +407 1 6.7999442980869498e+00 1.9401258783163115e+01 0.0000000000000000e+00 0 0 0 +408 1 7.9333186797521877e+00 1.9403316975932661e+01 0.0000000000000000e+00 0 0 0 +409 1 9.0672196895765094e+00 1.9406194727028712e+01 0.0000000000000000e+00 0 0 0 +410 3 1.0202094493927524e+01 1.9410357283161499e+01 0.0000000000000000e+00 0 0 0 +411 3 1.1344493619984819e+01 1.9424786980556338e+01 0.0000000000000000e+00 0 0 0 +412 3 1.2637742177785299e+01 1.9930889974773997e+01 0.0000000000000000e+00 0 0 0 +413 3 1.3631034994726834e+01 1.9413135103231994e+01 0.0000000000000000e+00 0 0 0 +414 3 1.4752642655140622e+01 1.9401337789912994e+01 0.0000000000000000e+00 0 0 0 +415 3 1.5877850085888255e+01 1.9396855373999653e+01 0.0000000000000000e+00 0 0 0 +416 3 1.7005401679016000e+01 1.9395287677046394e+01 0.0000000000000000e+00 0 0 0 +417 1 1.8134615217150579e+01 1.9394983390043944e+01 0.0000000000000000e+00 0 0 0 +418 1 1.9264825666738730e+01 1.9395059679793604e+01 0.0000000000000000e+00 0 0 0 +419 1 2.0395687437852093e+01 1.9395286212420899e+01 0.0000000000000000e+00 0 0 0 +420 1 2.1527023164623820e+01 1.9395624428209523e+01 0.0000000000000000e+00 0 0 0 + +Velocities + +1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +41 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +42 1.4582830912290846e-05 8.8846352819582645e-06 0.0000000000000000e+00 +43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +44 1.7312859198533731e-05 8.9315474912415886e-06 0.0000000000000000e+00 +45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +46 1.9675072488620216e-05 9.1850485538530490e-06 0.0000000000000000e+00 +47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +48 2.1433074233334628e-05 9.6286706528260491e-06 0.0000000000000000e+00 +49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +50 2.2405931370299284e-05 1.0203419110643709e-05 0.0000000000000000e+00 +51 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +52 2.2491059900157929e-05 1.0820884817441812e-05 0.0000000000000000e+00 +53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +54 2.1681031416712071e-05 1.1392109985469690e-05 0.0000000000000000e+00 +55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +56 2.0060641760669130e-05 1.1861625865799975e-05 0.0000000000000000e+00 +57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +58 1.7796484401635950e-05 1.2218953480137158e-05 0.0000000000000000e+00 +59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +60 1.5112094617093786e-05 1.2477438154365889e-05 0.0000000000000000e+00 +61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +62 1.2267198630926124e-05 1.2639445999779870e-05 0.0000000000000000e+00 +63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +64 9.5350822789358476e-06 1.2675742401072055e-05 0.0000000000000000e+00 +65 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +66 7.1824119616190063e-06 1.2539493069881058e-05 0.0000000000000000e+00 +67 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +68 5.4428729520064613e-06 1.2202930059423273e-05 0.0000000000000000e+00 +69 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +70 4.4916342132800272e-06 1.1686680302800539e-05 0.0000000000000000e+00 +71 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +72 4.4211188598874964e-06 1.1059784694772424e-05 0.0000000000000000e+00 +73 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +74 5.2335171901646275e-06 1.0413115381938121e-05 0.0000000000000000e+00 +75 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +76 6.8418345483267640e-06 9.8270961040952689e-06 0.0000000000000000e+00 +77 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +78 9.0862581078626780e-06 9.3562441357185347e-06 0.0000000000000000e+00 +79 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +80 1.1750898218046424e-05 9.0341536486321376e-06 0.0000000000000000e+00 +81 2.6507896911975861e-05 1.6371545140358991e-05 0.0000000000000000e+00 +82 4.4071318998573086e-05 2.1693750644120881e-05 0.0000000000000000e+00 +83 3.1968282279407066e-05 1.6236651087870452e-05 0.0000000000000000e+00 +84 5.1796828963389391e-05 2.2204255617741203e-05 0.0000000000000000e+00 +85 3.6954144790935994e-05 1.6513220966131449e-05 0.0000000000000000e+00 +86 5.8466837911599906e-05 2.3765145047455889e-05 0.0000000000000000e+00 +87 4.0988263449448856e-05 1.7195597287912591e-05 0.0000000000000000e+00 +88 6.3421700984930829e-05 2.6202560196158383e-05 0.0000000000000000e+00 +89 4.3676514981254302e-05 1.8262201659237366e-05 0.0000000000000000e+00 +90 6.6189231995872341e-05 2.9208208903089284e-05 0.0000000000000000e+00 +91 4.4757820844412710e-05 1.9680681285465242e-05 0.0000000000000000e+00 +92 6.6503049702947023e-05 3.2363912757959332e-05 0.0000000000000000e+00 +93 4.4112984955796063e-05 2.1371026788621213e-05 0.0000000000000000e+00 +94 6.4345177020566643e-05 3.5287785267920645e-05 0.0000000000000000e+00 +95 4.1787976800244936e-05 2.3162941413835267e-05 0.0000000000000000e+00 +96 5.9928744845970383e-05 3.7723007380205399e-05 0.0000000000000000e+00 +97 3.7995079634412303e-05 2.4792875906820557e-05 0.0000000000000000e+00 +98 5.3679482622744082e-05 3.9576112916242527e-05 0.0000000000000000e+00 +99 3.3102802347870566e-05 2.5962643816709875e-05 0.0000000000000000e+00 +100 4.6196928202386916e-05 4.0841431876258162e-05 0.0000000000000000e+00 +101 2.7604731797030090e-05 2.6452929465938663e-05 0.0000000000000000e+00 +102 3.8198605610544056e-05 4.1488731650403403e-05 0.0000000000000000e+00 +103 2.2062125644364829e-05 2.6211631192676194e-05 0.0000000000000000e+00 +104 3.0461532031511585e-05 4.1405446569862951e-05 0.0000000000000000e+00 +105 1.7036890410487144e-05 2.5367151114186193e-05 0.0000000000000000e+00 +106 2.3743747198513856e-05 4.0442707371844690e-05 0.0000000000000000e+00 +107 1.3025410253023063e-05 2.4148417954514280e-05 0.0000000000000000e+00 +108 1.8714618137705143e-05 3.8535713097978544e-05 0.0000000000000000e+00 +109 1.0408634299164180e-05 2.2777378345262281e-05 0.0000000000000000e+00 +110 1.5879886471080462e-05 3.5803991688099920e-05 0.0000000000000000e+00 +111 9.4236282619897256e-06 2.1395799353203516e-05 0.0000000000000000e+00 +112 1.5528508660313246e-05 3.2559849894401442e-05 0.0000000000000000e+00 +113 1.0151636970505765e-05 2.0069631778223131e-05 0.0000000000000000e+00 +114 1.7697076907652322e-05 2.9219489273322326e-05 0.0000000000000000e+00 +115 1.2515393741428794e-05 1.8835255026813244e-05 0.0000000000000000e+00 +116 2.2166639673992795e-05 2.6190973817683679e-05 0.0000000000000000e+00 +117 1.6287686218571795e-05 1.7749195377506077e-05 0.0000000000000000e+00 +118 2.8490182736201632e-05 2.3793837746782787e-05 0.0000000000000000e+00 +119 2.1107512829311378e-05 1.6897890319175769e-05 0.0000000000000000e+00 +120 3.6037837106045466e-05 2.2245603004594772e-05 0.0000000000000000e+00 +121 5.3754680927831089e-05 2.5818243561840512e-05 0.0000000000000000e+00 +122 7.3852984703953750e-05 2.7472934391924166e-05 0.0000000000000000e+00 +123 6.4028996009385391e-05 2.5673459200729887e-05 0.0000000000000000e+00 +124 8.5908169593167111e-05 2.8779655657983422e-05 0.0000000000000000e+00 +125 7.3452059594226324e-05 2.6972883064637495e-05 0.0000000000000000e+00 +126 9.6325597970378315e-05 3.2438649799599460e-05 0.0000000000000000e+00 +127 8.1100712408732978e-05 2.9661132010523619e-05 0.0000000000000000e+00 +128 1.0416393664254911e-04 3.7996059391476322e-05 0.0000000000000000e+00 +129 8.6279187735689372e-05 3.3655093070911189e-05 0.0000000000000000e+00 +130 1.0867812733907078e-04 4.4662561906767820e-05 0.0000000000000000e+00 +131 8.8474833676771911e-05 3.8743354165649700e-05 0.0000000000000000e+00 +132 1.0953332540892396e-04 5.1642519960343192e-05 0.0000000000000000e+00 +133 8.7489301482666931e-05 4.4565301821478113e-05 0.0000000000000000e+00 +134 1.0664519563149365e-04 5.8191926603172465e-05 0.0000000000000000e+00 +135 8.3386685919597045e-05 5.0496180582897816e-05 0.0000000000000000e+00 +136 1.0029664202627839e-04 6.3854180722835299e-05 0.0000000000000000e+00 +137 7.6554421387387345e-05 5.5724916856637890e-05 0.0000000000000000e+00 +138 9.1026233328924885e-05 6.8337584627018583e-05 0.0000000000000000e+00 +139 6.7636782318513533e-05 5.9415263115523977e-05 0.0000000000000000e+00 +140 7.9687801662836277e-05 7.1465060890868459e-05 0.0000000000000000e+00 +141 5.7497112140338785e-05 6.0967609586633220e-05 0.0000000000000000e+00 +142 6.7357844628560681e-05 7.3031410372387953e-05 0.0000000000000000e+00 +143 4.7129030804640708e-05 6.0212629249287861e-05 0.0000000000000000e+00 +144 5.5250218292995579e-05 7.2797466423152327e-05 0.0000000000000000e+00 +145 3.7563119690651669e-05 5.7436898093437411e-05 0.0000000000000000e+00 +146 4.4567659752612482e-05 7.0555413628180241e-05 0.0000000000000000e+00 +147 2.9761856381290211e-05 5.3240161725660877e-05 0.0000000000000000e+00 +148 3.6379968408071024e-05 6.6254587745984145e-05 0.0000000000000000e+00 +149 2.4507249328654254e-05 4.8297754292616488e-05 0.0000000000000000e+00 +150 3.1513287993668526e-05 6.0149614548130757e-05 0.0000000000000000e+00 +151 2.2321658045569226e-05 4.3171432510556026e-05 0.0000000000000000e+00 +152 3.0489149535510922e-05 5.2826430989590112e-05 0.0000000000000000e+00 +153 2.3406691442805219e-05 3.8251620084219645e-05 0.0000000000000000e+00 +154 3.3434005351227340e-05 4.5149642749209296e-05 0.0000000000000000e+00 +155 2.7646263937105427e-05 3.3806816567877322e-05 0.0000000000000000e+00 +156 4.0072022728543377e-05 3.8051851023877120e-05 0.0000000000000000e+00 +157 3.4612453095456479e-05 3.0084179504664271e-05 0.0000000000000000e+00 +158 4.9715995320497382e-05 3.2366348850974144e-05 0.0000000000000000e+00 +159 4.3610755492928814e-05 2.7338724794948033e-05 0.0000000000000000e+00 +160 6.1380291935873857e-05 2.8717537667974358e-05 0.0000000000000000e+00 +161 8.1494982491825407e-05 2.8148953219575557e-05 0.0000000000000000e+00 +162 1.0332280599497646e-04 2.6201503829225565e-05 0.0000000000000000e+00 +163 9.5761847160871774e-05 2.7946357434336516e-05 0.0000000000000000e+00 +164 1.1864695815872809e-04 2.8356135457834722e-05 0.0000000000000000e+00 +165 1.0885399470738391e-04 3.0748146450938071e-05 0.0000000000000000e+00 +166 1.3196232705661449e-04 3.4623883717438410e-05 0.0000000000000000e+00 +167 1.1960145227112585e-04 3.6566084099414615e-05 0.0000000000000000e+00 +168 1.4195026861275745e-04 4.3922046815628174e-05 0.0000000000000000e+00 +169 1.2694731664409029e-04 4.5104351462522260e-05 0.0000000000000000e+00 +170 1.4795217588335909e-04 5.5130340832613979e-05 0.0000000000000000e+00 +171 1.3031757484079781e-04 5.5906601170376687e-05 0.0000000000000000e+00 +172 1.4942385512754647e-04 6.7008660580344934e-05 0.0000000000000000e+00 +173 1.2933895493945637e-04 6.7959205844179285e-05 0.0000000000000000e+00 +174 1.4640862693120205e-04 7.8808347871067721e-05 0.0000000000000000e+00 +175 1.2418770632620368e-04 7.9948632905278019e-05 0.0000000000000000e+00 +176 1.3899686227644703e-04 8.9704374162949410e-05 0.0000000000000000e+00 +177 1.1530175670323509e-04 9.0294899930563893e-05 0.0000000000000000e+00 +178 1.2781482749801704e-04 9.8919094420893419e-05 0.0000000000000000e+00 +179 1.0353662297703481e-04 9.7655023731693666e-05 0.0000000000000000e+00 +180 1.1373191796318627e-04 1.0541969215504335e-04 0.0000000000000000e+00 +181 8.9924310567240939e-05 1.0107679026970171e-04 0.0000000000000000e+00 +182 9.8144155759054283e-05 1.0842945197242355e-04 0.0000000000000000e+00 +183 7.5715426026251240e-05 1.0020899633485792e-04 0.0000000000000000e+00 +184 8.2585472575644195e-05 1.0759497773947524e-04 0.0000000000000000e+00 +185 6.2273313315312773e-05 9.5280171371694988e-05 0.0000000000000000e+00 +186 6.8676150395344254e-05 1.0303784847881596e-04 0.0000000000000000e+00 +187 5.0970916505555661e-05 8.7088088473526171e-05 0.0000000000000000e+00 +188 5.7773431465618642e-05 9.5162943772818259e-05 0.0000000000000000e+00 +189 4.3046171895633206e-05 7.6794608467548045e-05 0.0000000000000000e+00 +190 5.1018825812688962e-05 8.4471826448580955e-05 0.0000000000000000e+00 +191 3.9350805046373119e-05 6.5685772521718177e-05 0.0000000000000000e+00 +192 4.9118794840322114e-05 7.1798478806600616e-05 0.0000000000000000e+00 +193 4.0296544731752153e-05 5.4848218154306130e-05 0.0000000000000000e+00 +194 5.2373823993379091e-05 5.8337807582076184e-05 0.0000000000000000e+00 +195 4.5754994278033105e-05 4.5116316024063770e-05 0.0000000000000000e+00 +196 6.0480102795976155e-05 4.5653533328626764e-05 0.0000000000000000e+00 +197 5.5147574075957093e-05 3.7092945765346277e-05 0.0000000000000000e+00 +198 7.2607642712602124e-05 3.5308098903458904e-05 0.0000000000000000e+00 +199 6.7490113431981086e-05 3.1302088338741595e-05 0.0000000000000000e+00 +200 8.7399794370653100e-05 2.8568976378293145e-05 0.0000000000000000e+00 +201 1.0893722215793989e-04 2.3548242675947018e-05 0.0000000000000000e+00 +202 1.3096734611020011e-04 1.8222479559561189e-05 0.0000000000000000e+00 +203 1.2587405764826476e-04 2.3075086083653581e-05 0.0000000000000000e+00 +204 1.4794813469964918e-04 2.1310741972757686e-05 0.0000000000000000e+00 +205 1.4140062010542452e-04 2.7813335553710658e-05 0.0000000000000000e+00 +206 1.6232505969042551e-04 3.0392445992766945e-05 0.0000000000000000e+00 +207 1.5397074924697088e-04 3.7554013992723016e-05 0.0000000000000000e+00 +208 1.7307084911688810e-04 4.3967269632201604e-05 0.0000000000000000e+00 +209 1.6265299884253917e-04 5.1975640619979227e-05 0.0000000000000000e+00 +210 1.7920198664424654e-04 6.0190020213309052e-05 0.0000000000000000e+00 +211 1.6652150024137926e-04 6.9718144800536699e-05 0.0000000000000000e+00 +212 1.8081789854731273e-04 7.8360099041392683e-05 0.0000000000000000e+00 +213 1.6556181720350750e-04 8.9018344965798718e-05 0.0000000000000000e+00 +214 1.7752817256212197e-04 9.7575999242155437e-05 0.0000000000000000e+00 +215 1.5977208852566740e-04 1.0737397867986304e-04 0.0000000000000000e+00 +216 1.6979140654165145e-04 1.1697357648400367e-04 0.0000000000000000e+00 +217 1.4991716557360079e-04 1.2288188040735228e-04 0.0000000000000000e+00 +218 1.5773246565703171e-04 1.3407831270088809e-04 0.0000000000000000e+00 +219 1.3669127604115129e-04 1.3409320273816903e-04 0.0000000000000000e+00 +220 1.4251229678068216e-04 1.4611735938454550e-04 0.0000000000000000e+00 +221 1.2122307334826826e-04 1.4035076438954076e-04 0.0000000000000000e+00 +222 1.2529950168048559e-04 1.5081786662543979e-04 0.0000000000000000e+00 +223 1.0469592755885001e-04 1.4095013503932427e-04 0.0000000000000000e+00 +224 1.0808583047877408e-04 1.4794462550140816e-04 0.0000000000000000e+00 +225 8.8627241500263001e-05 1.3548056521811501e-04 0.0000000000000000e+00 +226 9.2458332531887566e-05 1.3885968265358318e-04 0.0000000000000000e+00 +227 7.4741877098264211e-05 1.2401626995789950e-04 0.0000000000000000e+00 +228 8.0205883060811833e-05 1.2520982577425913e-04 0.0000000000000000e+00 +229 6.4625586397733592e-05 1.0787656142000266e-04 0.0000000000000000e+00 +230 7.2455365263725255e-05 1.0828209149006050e-04 0.0000000000000000e+00 +231 5.9588283630412220e-05 8.9170324651604443e-05 0.0000000000000000e+00 +232 7.0192628935414336e-05 8.8909581629389317e-05 0.0000000000000000e+00 +233 6.0204784194593798e-05 7.0300012127155753e-05 0.0000000000000000e+00 +234 7.3736654845263383e-05 6.8446290010432812e-05 0.0000000000000000e+00 +235 6.6430610182749772e-05 5.3155748135392397e-05 0.0000000000000000e+00 +236 8.2877314926921305e-05 4.8905829630990080e-05 0.0000000000000000e+00 +237 7.7513488386102286e-05 3.9091588598701160e-05 0.0000000000000000e+00 +238 9.6520171103331445e-05 3.2781173935459572e-05 0.0000000000000000e+00 +239 9.2232416915701703e-05 2.8983592081175541e-05 0.0000000000000000e+00 +240 1.1323768745207866e-04 2.2099480605147771e-05 0.0000000000000000e+00 +241 1.3459865563319741e-04 1.2703227752398906e-05 0.0000000000000000e+00 +242 1.5474472990034682e-04 4.9028952578147883e-06 0.0000000000000000e+00 +243 1.5215092550023015e-04 1.2097129719583488e-05 0.0000000000000000e+00 +244 1.7049283829256650e-04 9.1706083284784945e-06 0.0000000000000000e+00 +245 1.6776008627299133e-04 1.9099097427610624e-05 0.0000000000000000e+00 +246 1.8333367243371162e-04 2.1604042292807520e-05 0.0000000000000000e+00 +247 1.8008195062651708e-04 3.3615378061081087e-05 0.0000000000000000e+00 +248 1.9189650531499411e-04 3.9685789135164573e-05 0.0000000000000000e+00 +249 1.8783573502138761e-04 5.4407048131235179e-05 0.0000000000000000e+00 +250 1.9614236422538478e-04 6.1776442206818580e-05 0.0000000000000000e+00 +251 1.9089458289321614e-04 7.9516349638183995e-05 0.0000000000000000e+00 +252 1.9558796322159504e-04 8.6892146170328155e-05 0.0000000000000000e+00 +253 1.8874887732394583e-04 1.0500710476222600e-04 0.0000000000000000e+00 +254 1.9152092472987035e-04 1.1597519058197392e-04 0.0000000000000000e+00 +255 1.8256170726520249e-04 1.2813543516461412e-04 0.0000000000000000e+00 +256 1.8317412822647789e-04 1.4660018932962857e-04 0.0000000000000000e+00 +257 1.7255263462072589e-04 1.4676532692364173e-04 0.0000000000000000e+00 +258 1.7180488878385214e-04 1.7463142934331309e-04 0.0000000000000000e+00 +259 1.5968255923162790e-04 1.6112886872639011e-04 0.0000000000000000e+00 +260 1.5736418072846288e-04 1.9373036611985696e-04 0.0000000000000000e+00 +261 1.4438478717201006e-04 1.7104686393958903e-04 0.0000000000000000e+00 +262 1.4172732865070544e-04 1.9993397606046031e-04 0.0000000000000000e+00 +263 1.2780764883044244e-04 1.7581062997197168e-04 0.0000000000000000e+00 +264 1.2551429537422006e-04 1.9326020335803872e-04 0.0000000000000000e+00 +265 1.1143818436667695e-04 1.7279653463973672e-04 0.0000000000000000e+00 +266 1.1129339275113247e-04 1.7696772682632424e-04 0.0000000000000000e+00 +267 9.7026315827934351e-05 1.6059526683700199e-04 0.0000000000000000e+00 +268 1.0011077369688101e-04 1.5518094661065159e-04 0.0000000000000000e+00 +269 8.6522173578507114e-05 1.3949676203897713e-04 0.0000000000000000e+00 +270 9.3664351269599769e-05 1.3012327167812935e-04 0.0000000000000000e+00 +271 8.1291625785936272e-05 1.1272276579557331e-04 0.0000000000000000e+00 +272 9.2500602391673231e-05 1.0286100151558550e-04 0.0000000000000000e+00 +273 8.2174156364853157e-05 8.4321872533994066e-05 0.0000000000000000e+00 +274 9.7130125497925732e-05 7.4496044974704109e-05 0.0000000000000000e+00 +275 8.9034151680274584e-05 5.8030339746749375e-05 0.0000000000000000e+00 +276 1.0678389790186836e-04 4.7638087115883802e-05 0.0000000000000000e+00 +277 1.0119535639935181e-04 3.6303198355693708e-05 0.0000000000000000e+00 +278 1.2094537118731950e-04 2.5060744325496045e-05 0.0000000000000000e+00 +279 1.1693017924424426e-04 2.0976803055913763e-05 0.0000000000000000e+00 +280 1.3749539877318216e-04 1.0260590705305633e-05 0.0000000000000000e+00 +281 1.5664700963922696e-04 -2.3143582219387062e-06 0.0000000000000000e+00 +282 1.7213521099798126e-04 -1.0893217653461935e-05 0.0000000000000000e+00 +283 1.7163725578470403e-04 -2.7032144307298500e-06 0.0000000000000000e+00 +284 1.8302101438290170e-04 -4.7015876043674941e-06 0.0000000000000000e+00 +285 1.8408986700031230e-04 7.3762135624856621e-06 0.0000000000000000e+00 +286 1.9034465344562048e-04 1.1634737927368466e-05 0.0000000000000000e+00 +287 1.9261711656854316e-04 2.7002357232706195e-05 0.0000000000000000e+00 +288 1.9361558083412500e-04 3.5128829947321527e-05 0.0000000000000000e+00 +289 1.9675951681764233e-04 5.4504542291358708e-05 0.0000000000000000e+00 +290 1.9229119872704733e-04 6.3160704993402156e-05 0.0000000000000000e+00 +291 1.9589287639141945e-04 8.5624062570252574e-05 0.0000000000000000e+00 +292 1.8763172746254775e-04 9.5926064062507038e-05 0.0000000000000000e+00 +293 1.9144012028784324e-04 1.1574950605207010e-04 0.0000000000000000e+00 +294 1.7925388721026504e-04 1.3336630569376064e-04 0.0000000000000000e+00 +295 1.8325338492376081e-04 1.3941523897602475e-04 0.0000000000000000e+00 +296 1.7111384196688562e-04 1.7606151476373124e-04 0.0000000000000000e+00 +297 1.7441139798144990e-04 1.5854503282415543e-04 0.0000000000000000e+00 +298 1.6032326888461984e-04 2.1446583056531008e-04 0.0000000000000000e+00 +299 1.6387438500404321e-04 1.7460023770546828e-04 0.0000000000000000e+00 +300 1.5074052192984994e-04 2.4020838682409438e-04 0.0000000000000000e+00 +301 1.5148519378157811e-04 1.8980377776341359e-04 0.0000000000000000e+00 +302 1.3966552521236660e-04 2.4774151750977874e-04 0.0000000000000000e+00 +303 1.3793365457372421e-04 2.0064007271268226e-04 0.0000000000000000e+00 +304 1.2999175496236775e-04 2.3635880684653166e-04 0.0000000000000000e+00 +305 1.2445809284142433e-04 2.0319207617434042e-04 0.0000000000000000e+00 +306 1.2058479570330461e-04 2.1223162942725083e-04 0.0000000000000000e+00 +307 1.1335261202324864e-04 1.9202689248144918e-04 0.0000000000000000e+00 +308 1.1489966476687653e-04 1.8116775432026056e-04 0.0000000000000000e+00 +309 1.0607147008139182e-04 1.6763704556867280e-04 0.0000000000000000e+00 +310 1.1336585045824133e-04 1.4707143380834897e-04 0.0000000000000000e+00 +311 1.0344655043634243e-04 1.3351953844142965e-04 0.0000000000000000e+00 +312 1.1682664536528110e-04 1.1117223278055075e-04 0.0000000000000000e+00 +313 1.0584011765559926e-04 9.5633260364903774e-05 0.0000000000000000e+00 +314 1.2284574193182076e-04 7.5987122603626839e-05 0.0000000000000000e+00 +315 1.1395109003961985e-04 5.9134539871496392e-05 0.0000000000000000e+00 +316 1.3307867183720012e-04 4.1776312299002252e-05 0.0000000000000000e+00 +317 1.2588269209880162e-04 2.9470198058979825e-05 0.0000000000000000e+00 +318 1.4544292811228404e-04 1.3605886591663147e-05 0.0000000000000000e+00 +319 1.4084591944156649e-04 8.4739193403876596e-06 0.0000000000000000e+00 +320 1.5916834934516234e-04 -4.8366910892216897e-06 0.0000000000000000e+00 +321 1.7356992275325834e-04 -1.8042780077684453e-05 0.0000000000000000e+00 +322 1.8147503918697350e-04 -2.4540925551368165e-05 0.0000000000000000e+00 +323 1.8163463266840930e-04 -1.7130129888846129e-05 0.0000000000000000e+00 +324 1.8253898079463108e-04 -1.5598547575766951e-05 0.0000000000000000e+00 +325 1.8657806229653399e-04 -3.4133038182733444e-06 0.0000000000000000e+00 +326 1.8037702210949025e-04 5.3434050311440554e-06 0.0000000000000000e+00 +327 1.8771879764928681e-04 2.1715518823040016e-05 0.0000000000000000e+00 +328 1.7471074558026713e-04 3.4539745108762290e-05 0.0000000000000000e+00 +329 1.8460873128030577e-04 5.4984524671188725e-05 0.0000000000000000e+00 +330 1.6600292929781353e-04 6.9008728811924969e-05 0.0000000000000000e+00 +331 1.7796512641162431e-04 9.1385034689547154e-05 0.0000000000000000e+00 +332 1.5410918238014520e-04 1.0736588228516046e-04 0.0000000000000000e+00 +333 1.6795483683047752e-04 1.2318778434343078e-04 0.0000000000000000e+00 +334 1.4157775831030313e-04 1.5014040855437159e-04 0.0000000000000000e+00 +335 1.5785083269945281e-04 1.4650075439474400e-04 0.0000000000000000e+00 +336 1.2665633684184470e-04 1.9516493438247949e-04 0.0000000000000000e+00 +337 1.4652933492756114e-04 1.5825492457397368e-04 0.0000000000000000e+00 +338 1.2214547186144981e-04 2.4167794353872549e-04 0.0000000000000000e+00 +339 1.4180074826065196e-04 1.7604592446691659e-04 0.0000000000000000e+00 +340 1.1255092108513610e-04 2.7260123374319155e-04 0.0000000000000000e+00 +341 1.3761399094902802e-04 1.9706727165017120e-04 0.0000000000000000e+00 +342 1.1522842530577449e-04 2.7911375117613133e-04 0.0000000000000000e+00 +343 1.2918411829601699e-04 2.1803343236056900e-04 0.0000000000000000e+00 +344 1.1734351128622201e-04 2.6571681944023359e-04 0.0000000000000000e+00 +345 1.2254276275087787e-04 2.2432204295978476e-04 0.0000000000000000e+00 +346 1.1974443872507096e-04 2.3680090433102696e-04 0.0000000000000000e+00 +347 1.2071540692597284e-04 2.1269652219509870e-04 0.0000000000000000e+00 +348 1.2270101616137648e-04 1.9743779542515523e-04 0.0000000000000000e+00 +349 1.2264642729289398e-04 1.8508739809863369e-04 0.0000000000000000e+00 +350 1.3383017178927455e-04 1.5156768459346495e-04 0.0000000000000000e+00 +351 1.2577540617175406e-04 1.4740321111045147e-04 0.0000000000000000e+00 +352 1.4340773421068627e-04 1.1293118958385223e-04 0.0000000000000000e+00 +353 1.3341749813102418e-04 1.0072504549123244e-04 0.0000000000000000e+00 +354 1.5386164243670204e-04 7.2227623415051933e-05 0.0000000000000000e+00 +355 1.4204167491417043e-04 5.6498808092830119e-05 0.0000000000000000e+00 +356 1.6279824866213127e-04 3.3429940217178515e-05 0.0000000000000000e+00 +357 1.5267578941533281e-04 1.9709016910970241e-05 0.0000000000000000e+00 +358 1.7110318234027366e-04 1.1467794122178855e-06 0.0000000000000000e+00 +359 1.6340539277356244e-04 -5.5189289771696855e-06 0.0000000000000000e+00 +360 1.7740714701955653e-04 -1.8977834327990608e-05 0.0000000000000000e+00 +361 1.8452802730369313e-04 -2.8832061973687458e-05 0.0000000000000000e+00 +362 1.8186625712888205e-04 -2.9558136605260799e-05 0.0000000000000000e+00 +363 1.8024969476821697e-04 -2.5772260635909678e-05 0.0000000000000000e+00 +364 1.6761747789816595e-04 -1.7724478134172529e-05 0.0000000000000000e+00 +365 1.7295655435232461e-04 -8.2023972909357763e-06 0.0000000000000000e+00 +366 1.5167563906890865e-04 7.1136721706312189e-06 0.0000000000000000e+00 +367 1.6300729193455892e-04 2.1421261796460145e-05 0.0000000000000000e+00 +368 1.3513262146713916e-04 4.1132163185070293e-05 0.0000000000000000e+00 +369 1.5092813590493438e-04 5.9201618093873702e-05 0.0000000000000000e+00 +370 1.1841008358865480e-04 8.0419467894957835e-05 0.0000000000000000e+00 +371 1.3728404354778657e-04 9.8997396367778159e-05 0.0000000000000000e+00 +372 1.0207956567589023e-04 1.2179874114308306e-04 0.0000000000000000e+00 +373 1.2285830843381253e-04 1.3408468250307866e-04 0.0000000000000000e+00 +374 8.5374614775879387e-05 1.6300686953091837e-04 0.0000000000000000e+00 +375 1.0823800239604665e-04 1.5689628308888026e-04 0.0000000000000000e+00 +376 7.0794245443767117e-05 2.0076846781781206e-04 0.0000000000000000e+00 +377 9.4916240542002045e-05 1.6757505383186989e-04 0.0000000000000000e+00 +378 5.3305776376960658e-05 2.3409206018084466e-04 0.0000000000000000e+00 +379 9.7006448817647123e-05 1.6923635825827552e-04 0.0000000000000000e+00 +380 7.3465624650027872e-05 2.8247344576399282e-04 0.0000000000000000e+00 +381 1.0549927592481066e-04 2.0928780749128950e-04 0.0000000000000000e+00 +382 8.2435739649036618e-05 2.8810010190574649e-04 0.0000000000000000e+00 +383 1.0402453921892486e-04 2.4985200604758925e-04 0.0000000000000000e+00 +384 1.0698549586748876e-04 2.9499323828433428e-04 0.0000000000000000e+00 +385 1.0406074064549273e-04 2.4902814952768373e-04 0.0000000000000000e+00 +386 1.2548092418124016e-04 2.5651719838597350e-04 0.0000000000000000e+00 +387 1.2351646868146525e-04 2.1977784401163054e-04 0.0000000000000000e+00 +388 1.5004190410192569e-04 2.0137571208681400e-04 0.0000000000000000e+00 +389 1.3393580166351108e-04 1.9255393507981809e-04 0.0000000000000000e+00 +390 1.6295883087441844e-04 1.5199213302359484e-04 0.0000000000000000e+00 +391 1.5063751113547077e-04 1.4694859067203417e-04 0.0000000000000000e+00 +392 1.8000897081745795e-04 1.0619343548646192e-04 0.0000000000000000e+00 +393 1.6561309378602883e-04 9.7037670677296156e-05 0.0000000000000000e+00 +394 1.9382745100814531e-04 6.5648980655922534e-05 0.0000000000000000e+00 +395 1.7695741527044807e-04 4.9716511735790200e-05 0.0000000000000000e+00 +396 2.0065188597728214e-04 2.5746708320466968e-05 0.0000000000000000e+00 +397 1.8297867804266331e-04 1.0615003992406336e-05 0.0000000000000000e+00 +398 1.9982611540716595e-04 -6.5682876870518107e-06 0.0000000000000000e+00 +399 1.8556554896400902e-04 -1.6509803537161082e-05 0.0000000000000000e+00 +400 1.9312536581833663e-04 -2.5912353602364910e-05 0.0000000000000000e+00 +401 1.9023801410824606e-04 -2.7464462701394523e-05 0.0000000000000000e+00 +402 1.6698242474704196e-04 -2.2099770957974276e-05 0.0000000000000000e+00 +403 1.4243470745724796e-04 -2.3480099448894497e-06 0.0000000000000000e+00 +404 1.1876992118927330e-04 2.8893674554990122e-05 0.0000000000000000e+00 +405 9.7519654816455303e-05 6.7473438674861880e-05 0.0000000000000000e+00 +406 7.9406575250692843e-05 1.0857040090545463e-04 0.0000000000000000e+00 +407 6.4539515581651943e-05 1.4692649268945184e-04 0.0000000000000000e+00 +408 5.1587395282262643e-05 1.7813848972085620e-04 0.0000000000000000e+00 +409 3.9112490387149122e-05 1.9658956051422694e-04 0.0000000000000000e+00 +410 5.0646024795521216e-05 2.1400372314275622e-04 0.0000000000000000e+00 +411 5.0846759072495365e-05 2.4269431977691632e-04 0.0000000000000000e+00 +412 -1.1482904584733112e-04 -1.4373303263865990e-04 0.0000000000000000e+00 +413 1.5511043799162975e-04 2.5875085720661746e-04 0.0000000000000000e+00 +414 1.6626514293530906e-04 2.1735425519646309e-04 0.0000000000000000e+00 +415 1.8641734272053080e-04 1.7687638118890660e-04 0.0000000000000000e+00 +416 2.0380463041431767e-04 1.3085055646827544e-04 0.0000000000000000e+00 +417 2.1756044245783355e-04 8.4550353671555104e-05 0.0000000000000000e+00 +418 2.2486305540664193e-04 4.3653832482456800e-05 0.0000000000000000e+00 +419 2.2188236489361566e-04 7.6524745655054321e-06 0.0000000000000000e+00 +420 2.0949238720629205e-04 -1.7218568434280989e-05 0.0000000000000000e+00 From c904cfb8bc5fc62c5ba1db33fa5e98f6217cd8ee Mon Sep 17 00:00:00 2001 From: Emile Maras Date: Mon, 29 May 2017 15:49:04 +0200 Subject: [PATCH 101/302] removed a bug in fix_neb.cpp which prevented the freeend to work properly, plus added an example for the neb freeend --- examples/neb/README | 6 ++++++ src/REPLICA/fix_neb.cpp | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/neb/README b/examples/neb/README index 130d0fd2e3..0993c5fcdb 100644 --- a/examples/neb/README +++ b/examples/neb/README @@ -2,13 +2,19 @@ Run these examples as: mpirun -np 4 lmp_g++ -partition 4x1 -in in.neb.hop1 mpirun -np 4 lmp_g++ -partition 4x1 -in in.neb.hop2 +mpirun -np 4 lmp_g++ -partition 4x1 -in in.neb.hop1freeend mpirun -np 3 lmp_g++ -partition 3x1 -in in.neb.sivac mpirun -np 8 lmp_g++ -partition 4x2 -in in.neb.hop1 mpirun -np 8 lmp_g++ -partition 4x2 -in in.neb.hop2 +mpirun -np 8 lmp_g++ -partition 4x2 -in in.neb.hop1freeend mpirun -np 6 lmp_g++ -partition 3x2 -in in.neb.sivac mpirun -np 9 lmp_g++ -partition 3x3 -in in.neb.sivac + +Note that more than 4 replicas should be used for a precise estimate +of the activation energy corresponding to a transition. + If you uncomment the dump command lines in the input scripts, you can create dump files to do visualization from via Python tools: (see lammps/tools/README and lammps/tools/python/README for more info on diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index 726d300d66..f66167f2a2 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -461,7 +461,7 @@ void FixNEB::min_post_force(int vflag) if (ireplica < nreplica-1) dotgrad = dotgrad /(gradlen*gradnextlen); - dot = 0.0; + if (FreeEndIni && ireplica == 0) { if (tlen > 0.0) { double dotall; From d93938f7e17f8722d0d74952fa7347b742e23bfb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 29 May 2017 16:57:35 -0400 Subject: [PATCH 102/302] displace_atom rotate needs to operate on unwrapped coordinates with image flags set to zero --- src/displace_atoms.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/displace_atoms.cpp b/src/displace_atoms.cpp index 46f697f099..7db7e21839 100644 --- a/src/displace_atoms.cpp +++ b/src/displace_atoms.cpp @@ -271,9 +271,15 @@ void DisplaceAtoms::command(int narg, char **arg) int *body = atom->body; int *mask = atom->mask; int nlocal = atom->nlocal; + imageint *image = atom->image; for (i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { + // unwrap coordinate and reset image flags accordingly + domain->unmap(x[i],image[i]); + image[i] = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + d[0] = x[i][0] - point[0]; d[1] = x[i][1] - point[1]; d[2] = x[i][2] - point[2]; From 4b8d2e829c24ceeb6a6f6f7c89668218eaa7b255 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 30 May 2017 07:41:01 -0400 Subject: [PATCH 103/302] triclinic member variable is referenced in destructor and thus must be initialized in constructor --- src/KSPACE/pppm.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 80328a2d6f..232cabe4ea 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -82,6 +82,7 @@ PPPM::PPPM(LAMMPS *lmp, int narg, char **arg) : KSpace(lmp, narg, arg), pppmflag = 1; group_group_enable = 1; + triclinic = domain->triclinic; accuracy_relative = fabs(force->numeric(FLERR,arg[0])); From 4ae314731d995cae8d92279594662f6afc39acdc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 30 May 2017 07:42:10 -0400 Subject: [PATCH 104/302] must not use strtok() in library function as it is not re-entrant and may be used inside LAMMPS commands --- src/library.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 892818ff9c..87cc5d99d8 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -277,12 +277,24 @@ void lammps_commands_string(void *ptr, char *str) BEGIN_CAPTURE { - char *ptr = strtok(copy,"\n"); - if (ptr) concatenate_lines(ptr); - while (ptr) { - lmp->input->one(ptr); - ptr = strtok(NULL,"\n"); - if (ptr) concatenate_lines(ptr); + char *ptr = copy; + for (int i=0; i < n-1; ++i) { + + // handle continuation character as last character in line or string + if ((copy[i] == '&') && (copy[i+1] == '\n')) + copy[i+1] = copy[i] = ' '; + else if ((copy[i] == '&') && (copy[i+1] == '\0')) + copy[i] = ' '; + + if ((copy[i] == '\r') || (copy[i] == '\t')) + copy[i] = ' '; + + if (copy[i] == '\n') { + copy[i] = '\0'; + lmp->input->one(ptr); + ptr = copy + i+1; + } else if (copy[i+1] == '\0') + lmp->input->one(ptr); } } END_CAPTURE From 092806ad4fe146ac1503155fa694d90af23fda1d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 30 May 2017 07:55:48 -0400 Subject: [PATCH 105/302] no need for special whitespace handling in library interface --- src/library.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 87cc5d99d8..22b54f73a1 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -286,9 +286,6 @@ void lammps_commands_string(void *ptr, char *str) else if ((copy[i] == '&') && (copy[i+1] == '\0')) copy[i] = ' '; - if ((copy[i] == '\r') || (copy[i] == '\t')) - copy[i] = ' '; - if (copy[i] == '\n') { copy[i] = '\0'; lmp->input->one(ptr); From 412cb8f089bb9e3b2ae5cfc49bc310fa38425c32 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 30 May 2017 08:15:55 -0400 Subject: [PATCH 106/302] avoid hang in fix reax/c/species when multiple atoms have the exact same x-coordinate --- src/USER-REAXC/fix_reaxc_species.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/USER-REAXC/fix_reaxc_species.cpp b/src/USER-REAXC/fix_reaxc_species.cpp index fe74337128..4e57dd1c4b 100644 --- a/src/USER-REAXC/fix_reaxc_species.cpp +++ b/src/USER-REAXC/fix_reaxc_species.cpp @@ -500,8 +500,16 @@ void FixReaxCSpecies::Output_ReaxC_Bonds(bigint ntimestep, FILE *fp) AtomCoord FixReaxCSpecies::chAnchor(AtomCoord in1, AtomCoord in2) { - if (in1.x <= in2.x) + if (in1.x < in2.x) return in1; + else if (in1.x == in2.x) { + if (in1.y < in2.y) + return in1; + else if (in1.y == in2.y) { + if (in1.z < in2.z) + return in1; + } + } return in2; } From 22fdb1fc1407d4685e4773eec3f7f6670e6f4e69 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 30 May 2017 10:21:07 -0600 Subject: [PATCH 107/302] SNAP changes by Aidan --- doc/src/compute_sna_atom.txt | 11 +- doc/src/pair_snap.txt | 9 +- examples/COUPLE/simple/simple.cpp | 2 +- examples/snap/Ta06A.snapparam | 2 +- examples/snap/W_2940_2017_2.snap | 2 +- examples/snap/W_2940_2017_2.snapparam | 2 +- examples/snap/W_2940_2017_2_He_JW2013.snap | 2 +- src/SNAP/compute_sna_atom.cpp | 7 +- src/SNAP/compute_snad_atom.cpp | 25 +-- src/SNAP/compute_snad_atom.h | 2 +- src/SNAP/compute_snav_atom.cpp | 43 ++--- src/SNAP/compute_snav_atom.h | 2 +- src/SNAP/pair_snap.cpp | 194 +++++++++++++++------ src/SNAP/pair_snap.h | 6 +- src/npair_full_bin_atomonly.h | 2 +- 15 files changed, 209 insertions(+), 102 deletions(-) diff --git a/doc/src/compute_sna_atom.txt b/doc/src/compute_sna_atom.txt index f82df0d816..defd98d520 100644 --- a/doc/src/compute_sna_atom.txt +++ b/doc/src/compute_sna_atom.txt @@ -231,11 +231,12 @@ the numbers of columns are 930, 2790, and 5580, respectively. If the {quadratic} keyword value is set to 1, then additional columns are appended to each per-atom array, corresponding to -a matrix of quantities that are products of two bispectrum components. If the -number of bispectrum components is {K}, then the number of matrix elements -is {K}^2. These are output in subblocks of {K}^2 columns, using the same -ordering of columns and sub-blocks as was used for the bispectrum -components. +the products of all distinct pairs of bispectrum components. If the +number of bispectrum components is {K}, then the number of distinct pairs +is {K}({K}+1)/2. These are output in subblocks of {K}({K}+1)/2 columns, using the same +ordering of sub-blocks as was used for the bispectrum +components. Within each sub-block, the ordering is upper-triangular, +(1,1),(1,2)...(1,{K}),(2,1)...({K}-1,{K}-1),({K}-1,{K}),({K},{K}) These values can be accessed by any command that uses per-atom values from a compute as input. See "Section diff --git a/doc/src/pair_snap.txt b/doc/src/pair_snap.txt index ab7313832c..e612adceea 100644 --- a/doc/src/pair_snap.txt +++ b/doc/src/pair_snap.txt @@ -139,10 +139,15 @@ The default values for these keywords are {rmin0} = 0.0 {diagonalstyle} = 3 {switchflag} = 0 -{bzeroflag} = 1 :ul +{bzeroflag} = 1 +{quadraticflag} = 1 :ul -Detailed definitions of these keywords are given on the "compute +Detailed definitions for all the keywords are given on the "compute sna/atom"_compute_sna_atom.html doc page. +If {quadraticflag} is set to 1, then the SNAP energy expression includes the quadratic term, +0.5*B^t.alpha.B, where alpha is a symmetric {K} by {K} matrix. +The SNAP element file should contain {K}({K}+1)/2 additional coefficients +for each element, the upper-triangular elements of alpha. :line diff --git a/examples/COUPLE/simple/simple.cpp b/examples/COUPLE/simple/simple.cpp index b279ae704c..894c708978 100644 --- a/examples/COUPLE/simple/simple.cpp +++ b/examples/COUPLE/simple/simple.cpp @@ -153,7 +153,7 @@ int main(int narg, char **arg) for (int i = 0; i < natoms; i++) type[i] = 1; lmp->input->one("delete_atoms group all"); - lammps_create_atoms(lmp,natoms,NULL,type,x,v); + lammps_create_atoms(lmp,natoms,NULL,type,x,v,NULL,0); lmp->input->one("run 10"); } diff --git a/examples/snap/Ta06A.snapparam b/examples/snap/Ta06A.snapparam index 7b30312f59..283629d658 100644 --- a/examples/snap/Ta06A.snapparam +++ b/examples/snap/Ta06A.snapparam @@ -8,8 +8,8 @@ twojmax 6 # optional -gamma 1 rfac0 0.99363 rmin0 0 diagonalstyle 3 bzeroflag 0 +quadraticflag 0 diff --git a/examples/snap/W_2940_2017_2.snap b/examples/snap/W_2940_2017_2.snap index 51eee41a0a..04b8d58094 100644 --- a/examples/snap/W_2940_2017_2.snap +++ b/examples/snap/W_2940_2017_2.snap @@ -5,7 +5,7 @@ variable zblcutinner equal 4 variable zblcutouter equal 4.8 variable zblz equal 74 -# Specify hybrid with SNAP, ZBL, and long-range Coulomb +# Specify hybrid with SNAP and ZBL pair_style hybrid/overlay & zbl ${zblcutinner} ${zblcutouter} & diff --git a/examples/snap/W_2940_2017_2.snapparam b/examples/snap/W_2940_2017_2.snapparam index f17961bdd7..27ab61a266 100644 --- a/examples/snap/W_2940_2017_2.snapparam +++ b/examples/snap/W_2940_2017_2.snapparam @@ -6,8 +6,8 @@ twojmax 8 # optional -gamma 1 rfac0 0.99363 rmin0 0 diagonalstyle 3 bzeroflag 0 +quadraticflag 0 diff --git a/examples/snap/W_2940_2017_2_He_JW2013.snap b/examples/snap/W_2940_2017_2_He_JW2013.snap index 45a31955b3..cb70916ec4 100644 --- a/examples/snap/W_2940_2017_2_He_JW2013.snap +++ b/examples/snap/W_2940_2017_2_He_JW2013.snap @@ -5,7 +5,7 @@ variable zblcutinner equal 4 variable zblcutouter equal 4.8 variable zblz equal 74 -# Specify hybrid with SNAP, ZBL, and long-range Coulomb +# Specify hybrid with SNAP and ZBL pair_style hybrid/overlay zbl ${zblcutinner} ${zblcutouter} snap table spline 10000 table spline 10000 pair_coeff 1 1 zbl ${zblz} ${zblz} diff --git a/src/SNAP/compute_sna_atom.cpp b/src/SNAP/compute_sna_atom.cpp index cba6fae9b7..5341d16efa 100644 --- a/src/SNAP/compute_sna_atom.cpp +++ b/src/SNAP/compute_sna_atom.cpp @@ -129,7 +129,7 @@ ComputeSNAAtom::ComputeSNAAtom(LAMMPS *lmp, int narg, char **arg) : ncoeff = snaptr[0]->ncoeff; size_peratom_cols = ncoeff; - if (quadraticflag) size_peratom_cols += ncoeff*ncoeff; + if (quadraticflag) size_peratom_cols += (ncoeff*(ncoeff+1))/2; peratom_flag = 1; nmax = 0; @@ -275,7 +275,10 @@ void ComputeSNAAtom::compute_peratom() int ncount = ncoeff; for (int icoeff = 0; icoeff < ncoeff; icoeff++) { double bi = snaptr[tid]->bvec[icoeff]; - for (int jcoeff = 0; jcoeff < ncoeff; jcoeff++) + + // upper-triangular elements of quadratic matrix + + for (int jcoeff = icoeff; jcoeff < ncoeff; jcoeff++) sna[i][ncount++] = bi*snaptr[tid]->bvec[jcoeff]; } } diff --git a/src/SNAP/compute_snad_atom.cpp b/src/SNAP/compute_snad_atom.cpp index 39f34dd8cd..c2ac5f5afd 100644 --- a/src/SNAP/compute_snad_atom.cpp +++ b/src/SNAP/compute_snad_atom.cpp @@ -125,11 +125,11 @@ ComputeSNADAtom::ComputeSNADAtom(LAMMPS *lmp, int narg, char **arg) : threencoeff = 3*ncoeff; size_peratom_cols = threencoeff*atom->ntypes; if (quadraticflag) { - ncoeffsq = ncoeff*ncoeff; - twoncoeffsq = 2*ncoeffsq; - threencoeffsq = 3*ncoeffsq; + ncoeffq = (ncoeff*(ncoeff+1))/2; + twoncoeffq = 2*ncoeffq; + threencoeffq = 3*ncoeffq; size_peratom_cols += - threencoeffsq*atom->ntypes; + threencoeffq*atom->ntypes; } comm_reverse = size_peratom_cols; peratom_flag = 1; @@ -250,7 +250,7 @@ void ComputeSNADAtom::compute_peratom() const int typeoffset = threencoeff*(atom->type[i]-1); const int quadraticoffset = threencoeff*atom->ntypes + - threencoeffsq*(atom->type[i]-1); + threencoeffq*(atom->type[i]-1); // insure rij, inside, and typej are of size jnum @@ -320,7 +320,10 @@ void ComputeSNADAtom::compute_peratom() double bix = snaptr[tid]->dbvec[icoeff][0]; double biy = snaptr[tid]->dbvec[icoeff][1]; double biz = snaptr[tid]->dbvec[icoeff][2]; - for (int jcoeff = 0; jcoeff < ncoeff; jcoeff++) { + + // upper-triangular elements of quadratic matrix + + for (int jcoeff = icoeff; jcoeff < ncoeff; jcoeff++) { double dbxtmp = bi*snaptr[tid]->dbvec[jcoeff][0] + bix*snaptr[tid]->bvec[jcoeff]; double dbytmp = bi*snaptr[tid]->dbvec[jcoeff][1] @@ -328,11 +331,11 @@ void ComputeSNADAtom::compute_peratom() double dbztmp = bi*snaptr[tid]->dbvec[jcoeff][2] + biz*snaptr[tid]->bvec[jcoeff]; snadi[ncount] += dbxtmp; - snadi[ncount+ncoeffsq] += dbytmp; - snadi[ncount+twoncoeffsq] += dbztmp; + snadi[ncount+ncoeffq] += dbytmp; + snadi[ncount+twoncoeffq] += dbztmp; snadj[ncount] -= dbxtmp; - snadj[ncount+ncoeffsq] -= dbytmp; - snadj[ncount+twoncoeffsq] -= dbztmp; + snadj[ncount+ncoeffq] -= dbytmp; + snadj[ncount+twoncoeffq] -= dbztmp; ncount++; } } @@ -385,7 +388,7 @@ double ComputeSNADAtom::memory_usage() bytes += 3*njmax*sizeof(double); bytes += njmax*sizeof(int); bytes += threencoeff*atom->ntypes; - if (quadraticflag) bytes += threencoeffsq*atom->ntypes; + if (quadraticflag) bytes += threencoeffq*atom->ntypes; bytes += snaptr[0]->memory_usage()*comm->nthreads; return bytes; } diff --git a/src/SNAP/compute_snad_atom.h b/src/SNAP/compute_snad_atom.h index 0d5a369ab6..8eaae2a67f 100644 --- a/src/SNAP/compute_snad_atom.h +++ b/src/SNAP/compute_snad_atom.h @@ -37,7 +37,7 @@ class ComputeSNADAtom : public Compute { private: int nmax, njmax, diagonalstyle; - int ncoeff, twoncoeff, threencoeff, ncoeffsq, twoncoeffsq, threencoeffsq; + int ncoeff, twoncoeff, threencoeff, ncoeffq, twoncoeffq, threencoeffq; double **cutsq; class NeighList *list; double **snad; diff --git a/src/SNAP/compute_snav_atom.cpp b/src/SNAP/compute_snav_atom.cpp index 0d21d16561..3b5383ddf4 100644 --- a/src/SNAP/compute_snav_atom.cpp +++ b/src/SNAP/compute_snav_atom.cpp @@ -124,14 +124,14 @@ ComputeSNAVAtom::ComputeSNAVAtom(LAMMPS *lmp, int narg, char **arg) : sixncoeff = 6*ncoeff; size_peratom_cols = sixncoeff*atom->ntypes; if (quadraticflag) { - ncoeffsq = ncoeff*ncoeff; - twoncoeffsq = 2*ncoeffsq; - threencoeffsq = 3*ncoeffsq; - fourncoeffsq = 4*ncoeffsq; - fivencoeffsq = 5*ncoeffsq; - sixncoeffsq = 6*ncoeffsq; + ncoeffq = ncoeff*ncoeff; + twoncoeffq = 2*ncoeffq; + threencoeffq = 3*ncoeffq; + fourncoeffq = 4*ncoeffq; + fivencoeffq = 5*ncoeffq; + sixncoeffq = 6*ncoeffq; size_peratom_cols += - sixncoeffsq*atom->ntypes; + sixncoeffq*atom->ntypes; } comm_reverse = size_peratom_cols; peratom_flag = 1; @@ -253,7 +253,7 @@ void ComputeSNAVAtom::compute_peratom() const int typeoffset = sixncoeff*(atom->type[i]-1); const int quadraticoffset = sixncoeff*atom->ntypes + - sixncoeffsq*(atom->type[i]-1); + sixncoeffq*(atom->type[i]-1); // insure rij, inside, and typej are of size jnum @@ -330,7 +330,10 @@ void ComputeSNAVAtom::compute_peratom() double bix = snaptr[tid]->dbvec[icoeff][0]; double biy = snaptr[tid]->dbvec[icoeff][1]; double biz = snaptr[tid]->dbvec[icoeff][2]; - for (int jcoeff = 0; jcoeff < ncoeff; jcoeff++) { + + // upper-triangular elements of quadratic matrix + + for (int jcoeff = icoeff; jcoeff < ncoeff; jcoeff++) { double dbxtmp = bi*snaptr[tid]->dbvec[jcoeff][0] + bix*snaptr[tid]->bvec[jcoeff]; double dbytmp = bi*snaptr[tid]->dbvec[jcoeff][1] @@ -338,17 +341,17 @@ void ComputeSNAVAtom::compute_peratom() double dbztmp = bi*snaptr[tid]->dbvec[jcoeff][2] + biz*snaptr[tid]->bvec[jcoeff]; snavi[ncount] += dbxtmp*xtmp; - snavi[ncount+ncoeffsq] += dbytmp*ytmp; - snavi[ncount+twoncoeffsq] += dbztmp*ztmp; - snavi[ncount+threencoeffsq] += dbytmp*ztmp; - snavi[ncount+fourncoeffsq] += dbxtmp*ztmp; - snavi[ncount+fivencoeffsq] += dbxtmp*ytmp; + snavi[ncount+ncoeffq] += dbytmp*ytmp; + snavi[ncount+twoncoeffq] += dbztmp*ztmp; + snavi[ncount+threencoeffq] += dbytmp*ztmp; + snavi[ncount+fourncoeffq] += dbxtmp*ztmp; + snavi[ncount+fivencoeffq] += dbxtmp*ytmp; snavj[ncount] -= dbxtmp*x[j][0]; - snavj[ncount+ncoeffsq] -= dbytmp*x[j][1]; - snavj[ncount+twoncoeffsq] -= dbztmp*x[j][2]; - snavj[ncount+threencoeffsq] -= dbytmp*x[j][2]; - snavj[ncount+fourncoeffsq] -= dbxtmp*x[j][2]; - snavj[ncount+fivencoeffsq] -= dbxtmp*x[j][1]; + snavj[ncount+ncoeffq] -= dbytmp*x[j][1]; + snavj[ncount+twoncoeffq] -= dbztmp*x[j][2]; + snavj[ncount+threencoeffq] -= dbytmp*x[j][2]; + snavj[ncount+fourncoeffq] -= dbxtmp*x[j][2]; + snavj[ncount+fivencoeffq] -= dbxtmp*x[j][1]; ncount++; } } @@ -401,7 +404,7 @@ double ComputeSNAVAtom::memory_usage() bytes += 3*njmax*sizeof(double); bytes += njmax*sizeof(int); bytes += sixncoeff*atom->ntypes; - if (quadraticflag) bytes += sixncoeffsq*atom->ntypes; + if (quadraticflag) bytes += sixncoeffq*atom->ntypes; bytes += snaptr[0]->memory_usage()*comm->nthreads; return bytes; } diff --git a/src/SNAP/compute_snav_atom.h b/src/SNAP/compute_snav_atom.h index 33ae4f9217..35f1478393 100644 --- a/src/SNAP/compute_snav_atom.h +++ b/src/SNAP/compute_snav_atom.h @@ -38,7 +38,7 @@ class ComputeSNAVAtom : public Compute { private: int nmax, njmax, diagonalstyle; int ncoeff, twoncoeff, threencoeff, fourncoeff, fivencoeff, sixncoeff; - int ncoeffsq, twoncoeffsq, threencoeffsq, fourncoeffsq, fivencoeffsq, sixncoeffsq; + int ncoeffq, twoncoeffq, threencoeffq, fourncoeffq, fivencoeffq, sixncoeffq; double **cutsq; class NeighList *list; double **snav; diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index e4ed57b933..492e9ad643 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -35,6 +35,10 @@ using namespace LAMMPS_NS; #define MAXLINE 1024 #define MAXWORD 3 +// Outstanding issues with quadratic term +// 1. there seems to a problem with compute_optimized energy calc +// it does not match compute_regular, even when quadratic coeffs = 0 + /* ---------------------------------------------------------------------- */ PairSNAP::PairSNAP(LAMMPS *lmp) : Pair(lmp) @@ -232,10 +236,6 @@ void PairSNAP::compute_regular(int eflag, int vflag) snaptr->compute_ui(ninside); snaptr->compute_zi(); - if (!gammaoneflag) { - snaptr->compute_bi(); - snaptr->copy_bi2bvec(); - } // for neighbors of I within cutoff: // compute dUi/drj and dBi/drj @@ -255,17 +255,41 @@ void PairSNAP::compute_regular(int eflag, int vflag) fij[1] = 0.0; fij[2] = 0.0; + // linear contributions + for (int k = 1; k <= ncoeff; k++) { - double bgb; - if (gammaoneflag) - bgb = coeffi[k]; - else bgb = coeffi[k]* - gamma*pow(snaptr->bvec[k-1],gamma-1.0); + double bgb = coeffi[k]; fij[0] += bgb*snaptr->dbvec[k-1][0]; fij[1] += bgb*snaptr->dbvec[k-1][1]; fij[2] += bgb*snaptr->dbvec[k-1][2]; } + // quadratic contributions + + if (quadraticflag) { + snaptr->compute_bi(); + snaptr->copy_bi2bvec(); + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + double bveci = snaptr->bvec[icoeff]; + double fack = coeffi[k]*bveci; + double* dbveci = snaptr->dbvec[icoeff]; + fij[0] += fack*snaptr->dbvec[icoeff][0]; + fij[1] += fack*snaptr->dbvec[icoeff][1]; + fij[2] += fack*snaptr->dbvec[icoeff][2]; + k++; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + double facki = coeffi[k]*bveci; + double fackj = coeffi[k]*snaptr->bvec[jcoeff]; + double* dbvecj = snaptr->dbvec[jcoeff]; + fij[0] += facki*dbvecj[0]+fackj*dbveci[0]; + fij[1] += facki*dbvecj[1]+fackj*dbveci[1]; + fij[2] += facki*dbvecj[2]+fackj*dbveci[2]; + k++; + } + } + } + f[i][0] += fij[0]; f[i][1] += fij[1]; f[i][2] += fij[2]; @@ -285,14 +309,33 @@ void PairSNAP::compute_regular(int eflag, int vflag) // evdwl = energy of atom I, sum over coeffs_k * Bi_k evdwl = coeffi[0]; - if (gammaoneflag) { - snaptr->compute_bi(); - snaptr->copy_bi2bvec(); - for (int k = 1; k <= ncoeff; k++) - evdwl += coeffi[k]*snaptr->bvec[k-1]; - } else - for (int k = 1; k <= ncoeff; k++) - evdwl += coeffi[k]*pow(snaptr->bvec[k-1],gamma); + if (!quadraticflag) { + snaptr->compute_bi(); + snaptr->copy_bi2bvec(); + } + + // E = beta.B + 0.5*B^t.alpha.B + // coeff[k] = beta[k-1] or + // coeff[k] = alpha_ii or + // coeff[k] = alpha_ij = alpha_ji, j != i + + // linear contributions + + for (int k = 1; k <= ncoeff; k++) + evdwl += coeffi[k]*snaptr->bvec[k-1]; + + // quadratic contributions + + if (quadraticflag) { + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + double bveci = snaptr->bvec[icoeff]; + evdwl += 0.5*coeffi[k++]*bveci*bveci; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + evdwl += coeffi[k++]*bveci*snaptr->bvec[jcoeff]; + } + } + } ev_tally_full(i,2.0*evdwl,0.0,0.0,delx,dely,delz); } @@ -562,26 +605,46 @@ void PairSNAP::compute_optimized(int eflag, int vflag) sna[tid]->compute_dbidrj(); sna[tid]->copy_dbi2dbvec(); - if (!gammaoneflag) { - sna[tid]->compute_bi(); - sna[tid]->copy_bi2bvec(); - } fij[0] = 0.0; fij[1] = 0.0; fij[2] = 0.0; + // linear contributions + for (k = 1; k <= ncoeff; k++) { - double bgb; - if (gammaoneflag) - bgb = coeffi[k]; - else bgb = coeffi[k]* - gamma*pow(sna[tid]->bvec[k-1],gamma-1.0); + double bgb = coeffi[k]; fij[0] += bgb*sna[tid]->dbvec[k-1][0]; fij[1] += bgb*sna[tid]->dbvec[k-1][1]; fij[2] += bgb*sna[tid]->dbvec[k-1][2]; } + // quadratic contributions + + if (quadraticflag) { + sna[tid]->compute_bi(); + sna[tid]->copy_bi2bvec(); + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + double bveci = sna[tid]->bvec[icoeff]; + double fack = coeffi[k]*bveci; + double* dbveci = sna[tid]->dbvec[icoeff]; + fij[0] += fack*sna[tid]->dbvec[icoeff][0]; + fij[1] += fack*sna[tid]->dbvec[icoeff][1]; + fij[2] += fack*sna[tid]->dbvec[icoeff][2]; + k++; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + double facki = coeffi[k]*bveci; + double fackj = coeffi[k]*sna[tid]->bvec[jcoeff]; + double* dbvecj = sna[tid]->dbvec[jcoeff]; + fij[0] += facki*dbvecj[0]+fackj*dbveci[0]; + fij[1] += facki*dbvecj[1]+fackj*dbveci[1]; + fij[2] += facki*dbvecj[2]+fackj*dbveci[2]; + k++; + } + } + } + #if defined(_OPENMP) #pragma omp critical #endif @@ -606,15 +669,33 @@ void PairSNAP::compute_optimized(int eflag, int vflag) if (eflag&&pairs[iijj][1] == 0) { evdwl = coeffi[0]; - if (gammaoneflag) { - sna[tid]->compute_bi(); - sna[tid]->copy_bi2bvec(); - for (int k = 1; k <= ncoeff; k++) - evdwl += coeffi[k]*sna[tid]->bvec[k-1]; - } else - for (int k = 1; k <= ncoeff; k++) - evdwl += coeffi[k]*pow(sna[tid]->bvec[k-1],gamma); + sna[tid]->compute_bi(); + sna[tid]->copy_bi2bvec(); + + // E = beta.B + 0.5*B^t.alpha.B + // coeff[k] = beta[k-1] or + // coeff[k] = alpha_ii or + // coeff[k] = alpha_ij = alpha_ji, j != i + + // linear contributions + + for (int k = 1; k <= ncoeff; k++) + evdwl += coeffi[k]*sna[tid]->bvec[k-1]; + + // quadratic contributions + + if (quadraticflag) { + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + double bveci = sna[tid]->bvec[icoeff]; + evdwl += 0.5*coeffi[k++]*bveci*bveci; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + evdwl += coeffi[k++]*bveci*sna[tid]->bvec[jcoeff]; + } + } + } + #if defined(_OPENMP) #pragma omp critical #endif @@ -1363,6 +1444,22 @@ void PairSNAP::coeff(int narg, char **arg) read_files(coefffilename,paramfilename); + if (!quadraticflag) + ncoeff = ncoeffall - 1; + else { + + // ncoeffall should be (ncoeff+2)*(ncoeff+1)/2 + // so, ncoeff = floor(sqrt(2*ncoeffall))-1 + + ncoeff = sqrt(2*ncoeffall)-1; + ncoeffq = (ncoeff*(ncoeff+1))/2; + int ntmp = 1+ncoeff+ncoeffq; + if (ntmp != ncoeffall) { + printf("ncoeffall = %d ntmp = %d ncoeff = %d \n",ncoeffall,ntmp,ncoeff); + error->all(FLERR,"Incorrect SNAP coeff file"); + } + } + // read args that map atom types to SNAP elements // map[i] = which element the Ith atom type is, -1 if not mapped // map[0] is not used @@ -1416,6 +1513,7 @@ void PairSNAP::coeff(int narg, char **arg) sna[tid]->grow_rij(nmax); } + printf("ncoeff = %d snancoeff = %d \n",ncoeff,sna[0]->ncoeff); if (ncoeff != sna[0]->ncoeff) { printf("ncoeff = %d snancoeff = %d \n",ncoeff,sna[0]->ncoeff); error->all(FLERR,"Incorrect SNAP parameter file"); @@ -1470,7 +1568,7 @@ double PairSNAP::init_one(int i, int j) void PairSNAP::read_files(char *coefffilename, char *paramfilename) { - // open SNAP ceofficient file on proc 0 + // open SNAP coefficient file on proc 0 FILE *fpcoeff; if (comm->me == 0) { @@ -1518,13 +1616,13 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) words[iword] = strtok(NULL,"' \t\n\r\f"); int nelemfile = atoi(words[0]); - ncoeff = atoi(words[1])-1; - + ncoeffall = atoi(words[1]); + // Set up element lists memory->create(radelem,nelements,"pair:radelem"); memory->create(wjelem,nelements,"pair:wjelem"); - memory->create(coeffelem,nelements,ncoeff+1,"pair:coeffelem"); + memory->create(coeffelem,nelements,ncoeffall,"pair:coeffelem"); int *found = new int[nelements]; for (int ielem = 0; ielem < nelements; ielem++) @@ -1569,7 +1667,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) if (strcmp(elemtmp,elements[ielem]) == 0) break; if (ielem == nelements) { if (comm->me == 0) - for (int icoeff = 0; icoeff <= ncoeff; icoeff++) + for (int icoeff = 0; icoeff < ncoeffall; icoeff++) ptr = fgets(line,MAXLINE,fpcoeff); continue; } @@ -1578,7 +1676,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) if (found[ielem]) { if (comm->me == 0) - for (int icoeff = 0; icoeff <= ncoeff; icoeff++) + for (int icoeff = 0; icoeff < ncoeffall; icoeff++) ptr = fgets(line,MAXLINE,fpcoeff); continue; } @@ -1595,7 +1693,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) elements[ielem], radelem[ielem], wjelem[ielem]); } - for (int icoeff = 0; icoeff <= ncoeff; icoeff++) { + for (int icoeff = 0; icoeff < ncoeffall; icoeff++) { if (comm->me == 0) { ptr = fgets(line,MAXLINE,fpcoeff); if (ptr == NULL) { @@ -1629,13 +1727,12 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) // Set defaults for optional keywords - gamma = 1.0; - gammaoneflag = 1; rfac0 = 0.99363; rmin0 = 0.0; diagonalstyle = 3; switchflag = 1; bzeroflag = 1; + quadraticflag = 0; // open SNAP parameter file on proc 0 @@ -1689,9 +1786,7 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) } else if (strcmp(keywd,"twojmax") == 0) { twojmax = atoi(keyval); twojmaxflag = 1; - } else if (strcmp(keywd,"gamma") == 0) - gamma = atof(keyval); - else if (strcmp(keywd,"rfac0") == 0) + } else if (strcmp(keywd,"rfac0") == 0) rfac0 = atof(keyval); else if (strcmp(keywd,"rmin0") == 0) rmin0 = atof(keyval); @@ -1701,6 +1796,8 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) switchflag = atoi(keyval); else if (strcmp(keywd,"bzeroflag") == 0) bzeroflag = atoi(keyval); + else if (strcmp(keywd,"quadraticflag") == 0) + quadraticflag = atoi(keyval); else error->all(FLERR,"Incorrect SNAP parameter file"); } @@ -1708,9 +1805,6 @@ void PairSNAP::read_files(char *coefffilename, char *paramfilename) if (rcutfacflag == 0 || twojmaxflag == 0) error->all(FLERR,"Incorrect SNAP parameter file"); - if (gamma == 1.0) gammaoneflag = 1; - else gammaoneflag = 0; - delete[] found; } @@ -1726,7 +1820,7 @@ double PairSNAP::memory_usage() bytes += n*n*sizeof(double); bytes += 3*nmax*sizeof(double); bytes += nmax*sizeof(int); - bytes += (2*ncoeff+1)*sizeof(double); + bytes += (2*ncoeffall)*sizeof(double); bytes += (ncoeff*3)*sizeof(double); bytes += sna[0]->memory_usage()*nthreads; return bytes; diff --git a/src/SNAP/pair_snap.h b/src/SNAP/pair_snap.h index 559d3ef571..9dec211e8e 100644 --- a/src/SNAP/pair_snap.h +++ b/src/SNAP/pair_snap.h @@ -38,7 +38,7 @@ public: double memory_usage(); protected: - int ncoeff; + int ncoeff, ncoeffq, ncoeffall; double **bvec, ***dbvec; class SNA** sna; int nmax; @@ -89,7 +89,6 @@ protected: // timespec starttime, endtime; double timers[4]; #endif - double gamma; double rcutmax; // max cutoff for all elements int nelements; // # of unique elements @@ -98,10 +97,9 @@ protected: double *wjelem; // elements weights double **coeffelem; // element bispectrum coefficients int *map; // mapping from atom types to elements - int twojmax, diagonalstyle, switchflag, bzeroflag; + int twojmax, diagonalstyle, switchflag, bzeroflag, quadraticflag; double rcutfac, rfac0, rmin0, wj1, wj2; int rcutfacflag, twojmaxflag; // flags for required parameters - int gammaoneflag; // 1 if parameter gamma is 1 }; } diff --git a/src/npair_full_bin_atomonly.h b/src/npair_full_bin_atomonly.h index 7ca5d667c7..f8c33d9558 100644 --- a/src/npair_full_bin_atomonly.h +++ b/src/npair_full_bin_atomonly.h @@ -14,7 +14,7 @@ #ifdef NPAIR_CLASS NPairStyle(full/bin/atomonly, - NPairFullBin, + NPairFullBinAtomonly, NP_FULL | NP_BIN | NP_ATOMONLY | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) From cace3e3530cbb6895a222f772fee2679d908614a Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Tue, 30 May 2017 16:08:32 -0400 Subject: [PATCH 108/302] Added missing :pre to doc/src/fix_adapt.txt --- doc/src/fix_adapt.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/fix_adapt.txt b/doc/src/fix_adapt.txt index d7c32bef3d..19d1009b8a 100644 --- a/doc/src/fix_adapt.txt +++ b/doc/src/fix_adapt.txt @@ -47,7 +47,7 @@ keyword = {scale} or {reset} :l fix 1 all adapt 1 pair soft a 1 1 v_prefactor fix 1 all adapt 1 pair soft a 2* 3 v_prefactor fix 1 all adapt 1 pair lj/cut epsilon * * v_scale1 coul/cut scale 3 3 v_scale2 scale yes reset yes -fix 1 all adapt 10 atom diameter v_size +fix 1 all adapt 10 atom diameter v_size :pre variable ramp_up equal "ramp(0.01,0.5)" fix stretch all adapt 1 bond harmonic r0 1 v_ramp_up :pre From 75b567a457620106b80726dfa93d6c5d83c07a9f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 30 May 2017 16:50:38 -0400 Subject: [PATCH 109/302] add "atomonly" optimized neighbor list build styles to USER-OMP --- src/USER-OMP/npair_full_bin_atomonly_omp.cpp | 106 +++++++++++++++ src/USER-OMP/npair_full_bin_atomonly_omp.h | 44 ++++++ .../npair_half_bin_atomonly_newton_omp.cpp | 126 ++++++++++++++++++ .../npair_half_bin_atomonly_newton_omp.h | 43 ++++++ 4 files changed, 319 insertions(+) create mode 100644 src/USER-OMP/npair_full_bin_atomonly_omp.cpp create mode 100644 src/USER-OMP/npair_full_bin_atomonly_omp.h create mode 100644 src/USER-OMP/npair_half_bin_atomonly_newton_omp.cpp create mode 100644 src/USER-OMP/npair_half_bin_atomonly_newton_omp.h diff --git a/src/USER-OMP/npair_full_bin_atomonly_omp.cpp b/src/USER-OMP/npair_full_bin_atomonly_omp.cpp new file mode 100644 index 0000000000..d9e0fb9297 --- /dev/null +++ b/src/USER-OMP/npair_full_bin_atomonly_omp.cpp @@ -0,0 +1,106 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "npair_full_bin_atomonly_omp.h" +#include "npair_omp.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "atom.h" +#include "atom_vec.h" +#include "domain.h" +#include "my_page.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace NeighConst; + +/* ---------------------------------------------------------------------- */ + +NPairFullBinAtomonlyOmp::NPairFullBinAtomonlyOmp(LAMMPS *lmp) : NPair(lmp) {} + +/* ---------------------------------------------------------------------- + binned neighbor list construction for all neighbors + every neighbor pair appears in list of both atoms i and j +------------------------------------------------------------------------- */ + +void NPairFullBinAtomonlyOmp::build(NeighList *list) +{ + const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; + + NPAIR_OMP_INIT; +#if defined(_OPENMP) +#pragma omp parallel default(none) shared(list) +#endif + NPAIR_OMP_SETUP(nlocal); + + int i,j,k,n,itype,jtype,ibin; + double xtmp,ytmp,ztmp,delx,dely,delz,rsq; + int *neighptr; + + double **x = atom->x; + int *type = atom->type; + int *mask = atom->mask; + tagint *molecule = atom->molecule; + + int *ilist = list->ilist; + int *numneigh = list->numneigh; + int **firstneigh = list->firstneigh; + + // each thread has its own page allocator + MyPage &ipage = list->ipage[tid]; + ipage.reset(); + + // loop over owned atoms, storing neighbors + + for (i = ifrom; i < ito; i++) { + + n = 0; + neighptr = ipage.vget(); + + itype = type[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + // loop over all atoms in surrounding bins in stencil including self + // skip i = j + + ibin = atom2bin[i]; + + for (k = 0; k < nstencil; k++) { + for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) { + if (i == j) continue; + + jtype = type[j]; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq <= cutneighsq[itype][jtype]) neighptr[n++] = j; + } + } + + ilist[i] = i; + firstneigh[i] = neighptr; + numneigh[i] = n; + ipage.vgot(n); + if (ipage.status()) + error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); + } + NPAIR_OMP_CLOSE; + list->inum = nlocal; + list->gnum = 0; +} diff --git a/src/USER-OMP/npair_full_bin_atomonly_omp.h b/src/USER-OMP/npair_full_bin_atomonly_omp.h new file mode 100644 index 0000000000..643bf193a2 --- /dev/null +++ b/src/USER-OMP/npair_full_bin_atomonly_omp.h @@ -0,0 +1,44 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef NPAIR_CLASS + +NPairStyle(full/bin/atomonly/omp, + NPairFullBinAtomonlyOmp, + NP_FULL | NP_BIN | NP_ATOMONLY | NP_OMP | + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) + +#else + +#ifndef LMP_NPAIR_FULL_BIN_ATOMONLY_OMP_H +#define LMP_NPAIR_FULL_BIN_ATOMONLY_OMP_H + +#include "npair.h" + +namespace LAMMPS_NS { + +class NPairFullBinAtomonlyOmp : public NPair { + public: + NPairFullBinAtomonlyOmp(class LAMMPS *); + ~NPairFullBinAtomonlyOmp() {} + void build(class NeighList *); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +*/ diff --git a/src/USER-OMP/npair_half_bin_atomonly_newton_omp.cpp b/src/USER-OMP/npair_half_bin_atomonly_newton_omp.cpp new file mode 100644 index 0000000000..02d98ff6ab --- /dev/null +++ b/src/USER-OMP/npair_half_bin_atomonly_newton_omp.cpp @@ -0,0 +1,126 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "npair_half_bin_atomonly_newton_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" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +NPairHalfBinAtomonlyNewtonOmp::NPairHalfBinAtomonlyNewtonOmp(LAMMPS *lmp) : NPair(lmp) {} + +/* ---------------------------------------------------------------------- + binned neighbor list construction with full Newton's 3rd law + each owned atom i checks its own bin and other bins in Newton stencil + every pair stored exactly once by some processor +------------------------------------------------------------------------- */ + +void NPairHalfBinAtomonlyNewtonOmp::build(NeighList *list) +{ + const int nlocal = (includegroup) ? atom->nfirst : atom->nlocal; + + NPAIR_OMP_INIT; +#if defined(_OPENMP) +#pragma omp parallel default(none) shared(list) +#endif + NPAIR_OMP_SETUP(nlocal); + + int i,j,k,n,itype,jtype,ibin; + 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; + tagint *molecule = atom->molecule; + + int *ilist = list->ilist; + int *numneigh = list->numneigh; + int **firstneigh = list->firstneigh; + + // each thread has its own page allocator + MyPage &ipage = list->ipage[tid]; + ipage.reset(); + + for (i = ifrom; i < ito; i++) { + + n = 0; + neighptr = ipage.vget(); + + itype = type[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + + // loop over rest of atoms in i's bin, ghosts are at end of linked list + // if j is owned atom, store it, since j is beyond i in linked list + // if j is ghost, only store if j coords are "above and to the right" of i + + for (j = bins[i]; j >= 0; j = bins[j]) { + if (j >= nlocal) { + 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; + } + } + + 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]) neighptr[n++] = j; + } + + // loop over all atoms in other bins in stencil, store every pair + + ibin = atom2bin[i]; + for (k = 0; k < nstencil; k++) { + for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[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]) neighptr[n++] = j; + } + } + + ilist[i] = i; + firstneigh[i] = neighptr; + numneigh[i] = n; + ipage.vgot(n); + if (ipage.status()) + error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); + } + NPAIR_OMP_CLOSE; + list->inum = nlocal; +} diff --git a/src/USER-OMP/npair_half_bin_atomonly_newton_omp.h b/src/USER-OMP/npair_half_bin_atomonly_newton_omp.h new file mode 100644 index 0000000000..63223fd0bc --- /dev/null +++ b/src/USER-OMP/npair_half_bin_atomonly_newton_omp.h @@ -0,0 +1,43 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef NPAIR_CLASS + +NPairStyle(half/bin/atomonly/newton/omp, + NPairHalfBinAtomonlyNewtonOmp, + NP_HALF | NP_BIN | NP_ATOMONLY | NP_NEWTON | NP_OMP | NP_ORTHO) + +#else + +#ifndef LMP_NPAIR_HALF_BIN_ATOMONLY_NEWTON_OMP_H +#define LMP_NPAIR_HALF_BIN_ATOMONLY_NEWTON_OMP_H + +#include "npair.h" + +namespace LAMMPS_NS { + +class NPairHalfBinAtomonlyNewtonOmp : public NPair { + public: + NPairHalfBinAtomonlyNewtonOmp(class LAMMPS *); + ~NPairHalfBinAtomonlyNewtonOmp() {} + void build(class NeighList *); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +*/ From 03ab8d0f48aa432ac444adc49a1d92567f7010c3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 30 May 2017 17:04:48 -0400 Subject: [PATCH 110/302] major neighbor list style whitespace cleanup --- src/KOKKOS/npair_kokkos.cpp | 10 +- src/KOKKOS/npair_kokkos.h | 2 +- src/USER-INTEL/nbin_intel.cpp | 14 +- src/USER-INTEL/npair_full_bin_intel.cpp | 222 +++++------ src/USER-INTEL/npair_full_bin_intel.h | 4 +- .../npair_half_bin_newtoff_intel.cpp | 80 ++-- src/USER-INTEL/npair_half_bin_newtoff_intel.h | 2 +- .../npair_half_bin_newton_intel.cpp | 356 +++++++++--------- src/USER-INTEL/npair_half_bin_newton_intel.h | 4 +- .../npair_half_bin_newton_tri_intel.cpp | 178 ++++----- .../npair_half_bin_newton_tri_intel.h | 2 +- src/USER-INTEL/npair_intel.cpp | 2 +- src/npair.cpp | 12 +- src/npair.h | 2 +- src/npair_full_bin.h | 2 +- src/npair_full_bin_atomonly.h | 2 +- src/npair_full_bin_ghost.h | 2 +- src/npair_full_nsq_ghost.h | 2 +- src/npair_half_bin_atomonly_newton.cpp | 2 +- src/npair_half_respa_bin_newton_tri.cpp | 2 +- src/npair_half_size_bin_newton.cpp | 2 +- src/npair_half_size_bin_newton_tri.cpp | 2 +- src/npair_skip_respa.h | 4 +- src/npair_skip_size.cpp | 2 +- src/npair_skip_size.h | 2 +- src/npair_skip_size_off2on.cpp | 2 +- src/npair_skip_size_off2on.h | 4 +- src/npair_skip_size_off2on_oneside.cpp | 4 +- src/npair_skip_size_off2on_oneside.h | 4 +- src/nstencil_full_bin_2d.cpp | 2 +- src/nstencil_full_bin_2d.h | 2 +- src/nstencil_full_bin_3d.h | 2 +- src/nstencil_full_ghost_bin_2d.h | 2 +- src/nstencil_full_ghost_bin_3d.h | 2 +- src/nstencil_full_multi_2d.h | 2 +- src/nstencil_half_bin_2d_newtoff.cpp | 2 +- src/nstencil_half_bin_2d_newton_tri.cpp | 2 +- src/nstencil_half_bin_3d_newtoff.cpp | 2 +- src/nstencil_half_bin_3d_newton_tri.cpp | 2 +- src/nstencil_half_ghost_bin_2d_newtoff.h | 2 +- 40 files changed, 475 insertions(+), 475 deletions(-) diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 3614a82cfe..b7b550369d 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -287,12 +287,12 @@ int NeighborKokkosExecute::exclusion(const int &i,const int &j, if (nex_mol) { for (m = 0; m < nex_mol; m++) - if (ex_mol_intra[m]) { // intra-chain: exclude i-j pair if on same molecule + if (ex_mol_intra[m]) { // intra-chain: exclude i-j pair if on same molecule if (mask[i] & ex_mol_bit[m] && mask[j] & ex_mol_bit[m] && - molecule[i] == molecule[j]) return 1; - } else // exclude i-j pair if on different molecules - if (mask[i] & ex_mol_bit[m] && mask[j] & ex_mol_bit[m] && - molecule[i] != molecule[j]) return 1; + molecule[i] == molecule[j]) return 1; + } else // exclude i-j pair if on different molecules + if (mask[i] & ex_mol_bit[m] && mask[j] & ex_mol_bit[m] && + molecule[i] != molecule[j]) return 1; } return 0; diff --git a/src/KOKKOS/npair_kokkos.h b/src/KOKKOS/npair_kokkos.h index 52cdfe0d53..8e81c57618 100644 --- a/src/KOKKOS/npair_kokkos.h +++ b/src/KOKKOS/npair_kokkos.h @@ -385,7 +385,7 @@ struct NPairKokkosBuildFunctor { } #ifdef KOKKOS_HAVE_CUDA __device__ inline - + void operator() (typename Kokkos::TeamPolicy::member_type dev) const { c.template build_ItemCuda(dev); } diff --git a/src/USER-INTEL/nbin_intel.cpp b/src/USER-INTEL/nbin_intel.cpp index 194b9a5f97..c3335b2c26 100644 --- a/src/USER-INTEL/nbin_intel.cpp +++ b/src/USER-INTEL/nbin_intel.cpp @@ -55,7 +55,7 @@ NBinIntel::~NBinIntel() { nocopy(binhead,bins,_atombin,_binpacked:alloc_if(0) free_if(1)) } #endif -} +} /* ---------------------------------------------------------------------- setup for bin_atoms() @@ -71,7 +71,7 @@ void NBinIntel::bin_atoms_setup(int nall) if (_offload_alloc) { const int * binhead = this->binhead; #pragma offload_transfer target(mic:_cop) \ - nocopy(binhead:alloc_if(0) free_if(1)) + nocopy(binhead:alloc_if(0) free_if(1)) } #endif @@ -99,7 +99,7 @@ void NBinIntel::bin_atoms_setup(int nall) const int * _atombin = this->_atombin; const int * _binpacked = this->_binpacked; #pragma offload_transfer target(mic:_cop) \ - nocopy(bins,_atombin,_binpacked:alloc_if(0) free_if(1)) + nocopy(bins,_atombin,_binpacked:alloc_if(0) free_if(1)) } #endif memory->destroy(bins); @@ -157,10 +157,10 @@ void NBinIntel::bin_atoms(IntelBuffers * buffers) { const flt_t dx = (INTEL_BIGP - bboxhi[0]); const flt_t dy = (INTEL_BIGP - bboxhi[1]); const flt_t dz = (INTEL_BIGP - bboxhi[2]); - if (dx * dx + dy * dy + dz * dz < - static_cast(neighbor->cutneighmaxsq)) + if (dx * dx + dy * dy + dz * dz < + static_cast(neighbor->cutneighmaxsq)) error->one(FLERR, - "Intel package expects no atoms within cutoff of {1e15,1e15,1e15}."); + "Intel package expects no atoms within cutoff of {1e15,1e15,1e15}."); } // ---------- Grow and cast/pack buffers ------------- @@ -181,7 +181,7 @@ void NBinIntel::bin_atoms(IntelBuffers * buffers) { { int ifrom, ito, tid; IP_PRE_omp_range_id_align(ifrom, ito, tid, nall, nthreads, - sizeof(ATOM_T)); + sizeof(ATOM_T)); buffers->thr_pack(ifrom, ito, 0); } _fix->stop_watch(TIME_PACK); diff --git a/src/USER-INTEL/npair_full_bin_intel.cpp b/src/USER-INTEL/npair_full_bin_intel.cpp index 1ec93bf113..7e0d2abdcb 100644 --- a/src/USER-INTEL/npair_full_bin_intel.cpp +++ b/src/USER-INTEL/npair_full_bin_intel.cpp @@ -70,12 +70,12 @@ fbi(NeighList *list, IntelBuffers *buffers) { #endif buffers->grow_list(list, atom->nlocal, comm->nthreads, off_end, - _fix->nbor_pack_width()); + _fix->nbor_pack_width()); int need_ic = 0; if (atom->molecular) dminimum_image_check(need_ic, neighbor->cutneighmax, neighbor->cutneighmax, - neighbor->cutneighmax); + neighbor->cutneighmax); #ifdef _LMP_INTEL_OFFLOAD if (need_ic) { @@ -167,7 +167,7 @@ fbi(const int offload, NeighList *list, IntelBuffers *buffers, overflow = _fix->get_off_overflow_flag(); _fix->stop_watch(TIME_HOST_NEIGHBOR); _fix->start_watch(TIME_OFFLOAD_LATENCY); - } else + } else #endif { tnum = comm->nthreads; @@ -255,8 +255,8 @@ fbi(const int offload, NeighList *list, IntelBuffers *buffers, ito += astart; int e_ito = ito; if (ito == num) { - int imod = ito % pack_width; - if (imod) e_ito += pack_width - imod; + int imod = ito % pack_width; + if (imod) e_ito += pack_width - imod; } const int list_size = (e_ito + tid * 2 + 2) * maxnbors; int which; @@ -276,91 +276,91 @@ fbi(const int offload, NeighList *list, IntelBuffers *buffers, const int ioffset = ntypes * itype; const int ibin = atombin[i]; - int raw_count = pack_offset; + int raw_count = pack_offset; // loop over all atoms in surrounding bins in stencil including self // skip i = j - if (exclude) { - for (int k = 0; k < nstencilp; k++) { - const int bstart = binhead[ibin + binstart[k]]; - const int bend = binhead[ibin + binend[k]]; + if (exclude) { + for (int k = 0; k < nstencilp; k++) { + const int bstart = binhead[ibin + binstart[k]]; + const int bend = binhead[ibin + binend[k]]; #ifndef _LMP_INTEL_OFFLOAD - #ifdef INTEL_VMASK + #ifdef INTEL_VMASK #pragma simd - #endif #endif - for (int jj = bstart; jj < bend; jj++) { - int j = binpacked[jj]; + #endif + for (int jj = bstart; jj < bend; jj++) { + int j = binpacked[jj]; + + if (i == j) j=e_nall; - if (i == j) j=e_nall; - #ifdef _LMP_INTEL_OFFLOAD - if (offload_noghost) { + if (offload_noghost) { if (j < nlocal) { if (i < offload_end) continue; } else if (offload) continue; } - #endif + #endif #ifndef _LMP_INTEL_OFFLOAD - const int jtype = x[j].w; - if (exclusion(i,j,itype,jtype,mask,molecule)) continue; - #endif + const int jtype = x[j].w; + if (exclusion(i,j,itype,jtype,mask,molecule)) continue; + #endif - neighptr[raw_count++] = j; + neighptr[raw_count++] = j; } } - } else { - for (int k = 0; k < nstencilp; k++) { - const int bstart = binhead[ibin + binstart[k]]; - const int bend = binhead[ibin + binend[k]]; + } else { + for (int k = 0; k < nstencilp; k++) { + const int bstart = binhead[ibin + binstart[k]]; + const int bend = binhead[ibin + binend[k]]; #ifndef _LMP_INTEL_OFFLOAD - #ifdef INTEL_VMASK + #ifdef INTEL_VMASK #pragma simd #endif #endif - for (int jj = bstart; jj < bend; jj++) { - int j = binpacked[jj]; + for (int jj = bstart; jj < bend; jj++) { + int j = binpacked[jj]; + + if (i == j) j=e_nall; - if (i == j) j=e_nall; - #ifdef _LMP_INTEL_OFFLOAD - if (offload_noghost) { + if (offload_noghost) { if (j < nlocal) { if (i < offload_end) continue; } else if (offload) continue; } - #endif + #endif - neighptr[raw_count++] = j; + neighptr[raw_count++] = j; } } - } + } - if (raw_count > obound) *overflow = 1; + if (raw_count > obound) *overflow = 1; #if defined(LMP_SIMD_COMPILER) - #ifdef _LMP_INTEL_OFFLOAD - int vlmin = lmin, vlmax = lmax, vgmin = gmin, vgmax = gmax; - #if __INTEL_COMPILER+0 > 1499 - #pragma vector aligned + #ifdef _LMP_INTEL_OFFLOAD + int vlmin = lmin, vlmax = lmax, vgmin = gmin, vgmax = gmax; + #if __INTEL_COMPILER+0 > 1499 + #pragma vector aligned #pragma simd reduction(max:vlmax,vgmax) reduction(min:vlmin, vgmin) - #endif - #else - #pragma vector aligned + #endif + #else + #pragma vector aligned #pragma simd - #endif - #endif - for (int u = pack_offset; u < raw_count; u++) { + #endif + #endif + for (int u = pack_offset; u < raw_count; u++) { int j = neighptr[u]; 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 int jtype = x[j].w; const flt_t rsq = delx * delx + dely * dely + delz * delz; - if (rsq > cutneighsq[ioffset + jtype]) - neighptr[u] = e_nall; - else { + if (rsq > cutneighsq[ioffset + jtype]) + neighptr[u] = e_nall; + else { if (need_ic) { int no_special; ominimum_image_check(no_special, delx, dely, delz); @@ -376,73 +376,73 @@ fbi(const int offload, NeighList *list, IntelBuffers *buffers, if (j > vgmax) vgmax = j; } #endif - } - } + } + } #ifdef _LMP_INTEL_OFFLOAD - lmin = MIN(lmin,vlmin); - gmin = MIN(gmin,vgmin); - lmax = MAX(lmax,vlmax); - gmax = MAX(gmax,vgmax); + lmin = MIN(lmin,vlmin); + gmin = MIN(gmin,vgmin); + lmax = MAX(lmax,vlmax); + gmax = MAX(gmax,vgmax); #endif int n = lane, n2 = pack_offset; - for (int u = pack_offset; u < raw_count; u++) { - const int j = neighptr[u]; - int pj = j; - if (pj < e_nall) { - if (need_ic) - if (pj < 0) pj = -pj - 1; - - const int jtag = tag[pj]; - int flist = 0; - if (itag > jtag) { - if ((itag+jtag) % 2 == 0) flist = 1; - } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) flist = 1; - } else { + for (int u = pack_offset; u < raw_count; u++) { + const int j = neighptr[u]; + int pj = j; + if (pj < e_nall) { + if (need_ic) + if (pj < 0) pj = -pj - 1; + + const int jtag = tag[pj]; + int flist = 0; + if (itag > jtag) { + if ((itag+jtag) % 2 == 0) flist = 1; + } else if (itag < jtag) { + if ((itag+jtag) % 2 == 1) flist = 1; + } else { if (x[pj].z < ztmp) flist = 1; - else if (x[pj].z == ztmp && x[pj].y < ytmp) flist = 1; - else if (x[pj].z == ztmp && x[pj].y == ytmp && x[pj].x < xtmp) - flist = 1; - } - if (flist) { - neighptr[n2++] = j; - } else { - neighptr[n] = j; - n += pack_width; - } + else if (x[pj].z == ztmp && x[pj].y < ytmp) flist = 1; + else if (x[pj].z == ztmp && x[pj].y == ytmp && x[pj].x < xtmp) + flist = 1; + } + if (flist) { + neighptr[n2++] = j; + } else { + neighptr[n] = j; + n += pack_width; + } } } - int ns = (n - lane) / pack_width; - atombin[i] = ns; - for (int u = pack_offset; u < n2; u++) { - neighptr[n] = neighptr[u]; - n += pack_width; - } + int ns = (n - lane) / pack_width; + atombin[i] = ns; + for (int u = pack_offset; u < n2; u++) { + neighptr[n] = neighptr[u]; + n += pack_width; + } ilist[i] = i; cnumneigh[i] = ct + lane; - ns += n2 - pack_offset; + ns += n2 - pack_offset; numneigh[i] = ns; - if (ns > max_chunk) max_chunk = ns; - lane++; - if (lane == pack_width) { - ct += max_chunk * pack_width; - const int alignb = (INTEL_DATA_ALIGN / sizeof(int)); - const int edge = (ct % alignb); - if (edge) ct += alignb - edge; - neighptr = firstneigh + ct; - max_chunk = 0; - pack_offset = maxnbors * pack_width; - lane = 0; - if (ct + obound > list_size) { - if (i < ito - 1) { - *overflow = 1; - ct = (ifrom + tid * 2) * maxnbors; - } + if (ns > max_chunk) max_chunk = ns; + lane++; + if (lane == pack_width) { + ct += max_chunk * pack_width; + const int alignb = (INTEL_DATA_ALIGN / sizeof(int)); + const int edge = (ct % alignb); + if (edge) ct += alignb - edge; + neighptr = firstneigh + ct; + max_chunk = 0; + pack_offset = maxnbors * pack_width; + lane = 0; + if (ct + obound > list_size) { + if (i < ito - 1) { + *overflow = 1; + ct = (ifrom + tid * 2) * maxnbors; + } } - } + } } if (*overflow == 1) @@ -482,13 +482,13 @@ fbi(const int offload, NeighList *list, IntelBuffers *buffers, int * _noalias jlist = firstneigh + cnumneigh[i]; const int jnum = numneigh[i]; - const int trip = jnum * pack_width; + const int trip = jnum * pack_width; for (int jj = 0; jj < trip; jj+=pack_width) { const int j = jlist[jj]; - if (need_ic && j < 0) { - which = 0; - jlist[jj] = -j - 1; - } else + if (need_ic && j < 0) { + which = 0; + jlist[jj] = -j - 1; + } else ofind_special(which, special, nspecial, i, tag[j]); #ifdef _LMP_INTEL_OFFLOAD if (j >= nlocal) { @@ -511,9 +511,9 @@ fbi(const int offload, NeighList *list, IntelBuffers *buffers, int jj = 0; for (jj = 0; jj < jnum; jj++) { if (jlist[jj] >= nlocal) { - if (jlist[jj] == e_nall) jlist[jj] = nall_offset; - else jlist[jj] -= ghost_offset; - } + if (jlist[jj] == e_nall) jlist[jj] = nall_offset; + else jlist[jj] -= ghost_offset; + } } } } diff --git a/src/USER-INTEL/npair_full_bin_intel.h b/src/USER-INTEL/npair_full_bin_intel.h index 608bd0f5dd..f1be71abbc 100644 --- a/src/USER-INTEL/npair_full_bin_intel.h +++ b/src/USER-INTEL/npair_full_bin_intel.h @@ -15,7 +15,7 @@ NPairStyle(full/bin/intel, NPairFullBinIntel, - NP_FULL | NP_BIN | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | + NP_FULL | NP_BIN | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI | NP_INTEL) #else @@ -38,7 +38,7 @@ class NPairFullBinIntel : public NPairIntel { void fbi(NeighList *, IntelBuffers *); template void fbi(const int, NeighList *, IntelBuffers *, const int, - const int, const int offload_end = 0); + const int, const int offload_end = 0); }; } diff --git a/src/USER-INTEL/npair_half_bin_newtoff_intel.cpp b/src/USER-INTEL/npair_half_bin_newtoff_intel.cpp index 1fcc3f0759..9a40e2a07c 100644 --- a/src/USER-INTEL/npair_half_bin_newtoff_intel.cpp +++ b/src/USER-INTEL/npair_half_bin_newtoff_intel.cpp @@ -26,7 +26,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfBinNewtoffIntel::NPairHalfBinNewtoffIntel(LAMMPS *lmp) : +NPairHalfBinNewtoffIntel::NPairHalfBinNewtoffIntel(LAMMPS *lmp) : NPairIntel(lmp) {} /* ---------------------------------------------------------------------- @@ -75,7 +75,7 @@ hbnni(NeighList *list, IntelBuffers *buffers) { int need_ic = 0; if (atom->molecular) dminimum_image_check(need_ic, neighbor->cutneighmax, neighbor->cutneighmax, - neighbor->cutneighmax); + neighbor->cutneighmax); #ifdef _LMP_INTEL_OFFLOAD if (need_ic) { @@ -159,7 +159,7 @@ hbnni(const int offload, NeighList *list, IntelBuffers *buffers, overflow = _fix->get_off_overflow_flag(); _fix->stop_watch(TIME_HOST_NEIGHBOR); _fix->start_watch(TIME_OFFLOAD_LATENCY); - } else + } else #endif { tnum = comm->nthreads; @@ -294,13 +294,13 @@ hbnni(const int offload, NeighList *list, IntelBuffers *buffers, ominimum_image_check(no_special, delx, dely, delz); if (no_special) neighptr[n++] = -j - 1; - else + else neighptr[n++] = j; } else neighptr[n++] = j; #ifdef _LMP_INTEL_OFFLOAD - if (j < lmin) lmin = j; - if (j > lmax) lmax = j; + if (j < lmin) lmin = j; + if (j > lmax) lmax = j; #endif } else { if (need_ic) { @@ -308,16 +308,16 @@ hbnni(const int offload, NeighList *list, IntelBuffers *buffers, ominimum_image_check(no_special, delx, dely, delz); if (no_special) neighptr[n2++] = -j - 1; - else + else neighptr[n2++] = j; } else neighptr[n2++] = j; - #ifdef _LMP_INTEL_OFFLOAD - if (j < gmin) gmin = j; - if (j > gmax) gmax = j; + #ifdef _LMP_INTEL_OFFLOAD + if (j < gmin) gmin = j; + if (j > gmax) gmax = j; #endif - } - } + } + } } } ilist[i] = i; @@ -341,13 +341,13 @@ hbnni(const int offload, NeighList *list, IntelBuffers *buffers, neighptr += n; if (ct + n + maxnbors > list_size) { *overflow = 1; - ct = (ifrom + tid) * maxnbors; + ct = (ifrom + tid) * maxnbors; } } if (*overflow == 1) - for (int i = ifrom; i < ito; i++) - numneigh[i] = 0; + for (int i = ifrom; i < ito; i++) + numneigh[i] = 0; #ifdef _LMP_INTEL_OFFLOAD if (separate_buffers) { @@ -370,7 +370,7 @@ hbnni(const int offload, NeighList *list, IntelBuffers *buffers, if (offload) { ghost_offset = overflow[LMP_GHOST_MIN] - overflow[LMP_LOCAL_MAX] - 1; nall_offset = overflow[LMP_LOCAL_MAX] + 1 + nghost; - } else { + } else { ghost_offset = overflow[LMP_GHOST_MIN] - nlocal; nall_offset = nlocal + nghost; } @@ -383,38 +383,38 @@ hbnni(const int offload, NeighList *list, IntelBuffers *buffers, const int jnum = numneigh[i]; for (int jj = 0; jj < jnum; jj++) { const int j = jlist[jj]; - if (need_ic && j < 0) { - which = 0; - jlist[jj] = -j - 1; - } else + if (need_ic && j < 0) { + which = 0; + jlist[jj] = -j - 1; + } else ofind_special(which, special, nspecial, i, tag[j]); #ifdef _LMP_INTEL_OFFLOAD - if (j >= nlocal) { - if (j == nall) - jlist[jj] = nall_offset; - else if (which) - jlist[jj] = (j-ghost_offset) ^ (which << SBBITS); - else jlist[jj]-=ghost_offset; + if (j >= nlocal) { + if (j == nall) + jlist[jj] = nall_offset; + else if (which) + jlist[jj] = (j-ghost_offset) ^ (which << SBBITS); + else jlist[jj]-=ghost_offset; } else #endif - if (which) jlist[jj] = j ^ (which << SBBITS); + if (which) jlist[jj] = j ^ (which << SBBITS); } } } #ifdef _LMP_INTEL_OFFLOAD else if (separate_buffers) { - for (int i = ifrom; i < ito; ++i) { + for (int i = ifrom; i < ito; ++i) { int * _noalias jlist = firstneigh + cnumneigh[i]; const int jnum = numneigh[i]; - int jj = 0; - for (jj = 0; jj < jnum; jj++) - if (jlist[jj] >= nlocal) break; - while (jj < jnum) { - if (jlist[jj] == nall) jlist[jj] = nall_offset; - else jlist[jj] -= ghost_offset; - jj++; - } - } + int jj = 0; + for (jj = 0; jj < jnum; jj++) + if (jlist[jj] >= nlocal) break; + while (jj < jnum) { + if (jlist[jj] == nall) jlist[jj] = nall_offset; + else jlist[jj] -= ghost_offset; + jj++; + } + } } #endif } // end omp @@ -438,9 +438,9 @@ hbnni(const int offload, NeighList *list, IntelBuffers *buffers, _fix->start_watch(TIME_PACK); _fix->set_neighbor_host_sizes(); buffers->pack_sep_from_single(_fix->host_min_local(), - _fix->host_used_local(), - _fix->host_min_ghost(), - _fix->host_used_ghost()); + _fix->host_used_local(), + _fix->host_min_ghost(), + _fix->host_used_ghost()); _fix->stop_watch(TIME_PACK); } } diff --git a/src/USER-INTEL/npair_half_bin_newtoff_intel.h b/src/USER-INTEL/npair_half_bin_newtoff_intel.h index ccb4560909..49482f8b3e 100644 --- a/src/USER-INTEL/npair_half_bin_newtoff_intel.h +++ b/src/USER-INTEL/npair_half_bin_newtoff_intel.h @@ -38,7 +38,7 @@ class NPairHalfBinNewtoffIntel : public NPairIntel { void hbnni(NeighList *, IntelBuffers *); template void hbnni(const int, NeighList *, IntelBuffers *, const int, - const int); + const int); }; } diff --git a/src/USER-INTEL/npair_half_bin_newton_intel.cpp b/src/USER-INTEL/npair_half_bin_newton_intel.cpp index 5584f962e9..6313ab944f 100644 --- a/src/USER-INTEL/npair_half_bin_newton_intel.cpp +++ b/src/USER-INTEL/npair_half_bin_newton_intel.cpp @@ -26,7 +26,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfBinNewtonIntel::NPairHalfBinNewtonIntel(LAMMPS *lmp) : +NPairHalfBinNewtonIntel::NPairHalfBinNewtonIntel(LAMMPS *lmp) : NPairIntel(lmp) {} /* ---------------------------------------------------------------------- @@ -75,7 +75,7 @@ hbni(NeighList *list, IntelBuffers *buffers) { int need_ic = 0; if (atom->molecular) dminimum_image_check(need_ic, neighbor->cutneighmax, neighbor->cutneighmax, - neighbor->cutneighmax); + neighbor->cutneighmax); #ifdef _LMP_INTEL_OFFLOAD if (need_ic) { @@ -96,7 +96,7 @@ hbni(NeighList *list, IntelBuffers *buffers) { } } #else - if (need_ic) + if (need_ic) hbni(0, list, buffers, host_start, nlocal); else hbni(0, list, buffers, host_start, nlocal); @@ -119,7 +119,7 @@ hbni(const int offload, NeighList *list, IntelBuffers *buffers, if (offload) { if (INTEL_MIC_NBOR_PAD > 1) pad = INTEL_MIC_NBOR_PAD * sizeof(float) / sizeof(flt_t); - } else + } else #endif if (INTEL_NBOR_PAD > 1) pad = INTEL_NBOR_PAD * sizeof(float) / sizeof(flt_t); @@ -172,7 +172,7 @@ hbni(const int offload, NeighList *list, IntelBuffers *buffers, overflow = _fix->get_off_overflow_flag(); _fix->stop_watch(TIME_HOST_NEIGHBOR); _fix->start_watch(TIME_OFFLOAD_LATENCY); - } else + } else #endif { tnum = comm->nthreads; @@ -235,8 +235,8 @@ hbni(const int offload, NeighList *list, IntelBuffers *buffers, int end = stencil[k] + 1; for (int kk = k + 1; kk < nstencil; kk++) { if (stencil[kk-1]+1 == stencil[kk]) { - end++; - k++; + end++; + k++; } else break; } binend[nstencilp] = end; @@ -262,8 +262,8 @@ hbni(const int offload, NeighList *list, IntelBuffers *buffers, ito += astart; int e_ito = ito; if (ito == num) { - int imod = ito % swidth; - if (imod) e_ito += swidth - imod; + int imod = ito % swidth; + if (imod) e_ito += swidth - imod; } const int list_size = (e_ito + tid * 2 + 2) * maxnbors; #else @@ -294,118 +294,118 @@ hbni(const int offload, NeighList *list, IntelBuffers *buffers, // if j is owned atom, store it, since j is beyond i in linked list // if j is ghost, only store if j coords are "above/to the right" of i - int raw_count = pack_offset; + int raw_count = pack_offset; for (int j = bins[i]; j >= 0; j = bins[j]) { if (j >= nlocal) { - #ifdef _LMP_INTEL_OFFLOAD + #ifdef _LMP_INTEL_OFFLOAD if (offload_noghost && offload) continue; - #endif + #endif if (x[j].z < ztmp) continue; if (x[j].z == ztmp) { if (x[j].y < ytmp) continue; if (x[j].y == ytmp && x[j].x < xtmp) continue; } - } + } #ifdef _LMP_INTEL_OFFLOAD else if (offload_noghost && i < offload_end) continue; - #endif + #endif #ifndef _LMP_INTEL_OFFLOAD if (exclude) { - const int jtype = x[j].w; - if (exclusion(i,j,itype,jtype,mask,molecule)) continue; - } - #endif + const int jtype = x[j].w; + if (exclusion(i,j,itype,jtype,mask,molecule)) continue; + } + #endif - neighptr[raw_count++] = j; - } + neighptr[raw_count++] = j; + } // loop over all atoms in other bins in stencil, store every pair const int ibin = atombin[i]; - if (exclude) { - for (int k = 0; k < nstencilp; k++) { - const int bstart = binhead[ibin + binstart[k]]; - const int bend = binhead[ibin + binend[k]]; - #ifndef _LMP_INTEL_OFFLOAD - #ifdef INTEL_VMASK - #pragma simd - #endif - #endif - for (int jj = bstart; jj < bend; jj++) { - const int j = binpacked[jj]; - + if (exclude) { + for (int k = 0; k < nstencilp; k++) { + const int bstart = binhead[ibin + binstart[k]]; + const int bend = binhead[ibin + binend[k]]; + #ifndef _LMP_INTEL_OFFLOAD + #ifdef INTEL_VMASK + #pragma simd + #endif + #endif + for (int jj = bstart; jj < bend; jj++) { + const int j = binpacked[jj]; + #ifdef _LMP_INTEL_OFFLOAD if (offload_noghost) { if (j < nlocal) { if (i < offload_end) continue; } else if (offload) continue; } - #endif + #endif #ifndef _LMP_INTEL_OFFLOAD - const int jtype = x[j].w; - if (exclusion(i,j,itype,jtype,mask,molecule)) continue; - #endif + const int jtype = x[j].w; + if (exclusion(i,j,itype,jtype,mask,molecule)) continue; + #endif + + neighptr[raw_count++] = j; + } + } + } else { + for (int k = 0; k < nstencilp; k++) { + const int bstart = binhead[ibin + binstart[k]]; + const int bend = binhead[ibin + binend[k]]; + #ifndef _LMP_INTEL_OFFLOAD + #ifdef INTEL_VMASK + #pragma simd + #endif + #endif + for (int jj = bstart; jj < bend; jj++) { + const int j = binpacked[jj]; - neighptr[raw_count++] = j; - } - } - } else { - for (int k = 0; k < nstencilp; k++) { - const int bstart = binhead[ibin + binstart[k]]; - const int bend = binhead[ibin + binend[k]]; - #ifndef _LMP_INTEL_OFFLOAD - #ifdef INTEL_VMASK - #pragma simd - #endif - #endif - for (int jj = bstart; jj < bend; jj++) { - const int j = binpacked[jj]; - #ifdef _LMP_INTEL_OFFLOAD if (offload_noghost) { if (j < nlocal) { if (i < offload_end) continue; } else if (offload) continue; } - #endif + #endif - neighptr[raw_count++] = j; - } - } - } + neighptr[raw_count++] = j; + } + } + } - if (raw_count > obound) *overflow = 1; + if (raw_count > obound) *overflow = 1; #if defined(LMP_SIMD_COMPILER) - #ifdef _LMP_INTEL_OFFLOAD - int vlmin = lmin, vlmax = lmax, vgmin = gmin, vgmax = gmax; - #if __INTEL_COMPILER+0 > 1499 - #pragma vector aligned + #ifdef _LMP_INTEL_OFFLOAD + int vlmin = lmin, vlmax = lmax, vgmin = gmin, vgmax = gmax; + #if __INTEL_COMPILER+0 > 1499 + #pragma vector aligned #pragma simd reduction(max:vlmax,vgmax) reduction(min:vlmin, vgmin) - #endif - #else - #pragma vector aligned + #endif + #else + #pragma vector aligned #pragma simd - #endif - #endif - for (int u = pack_offset; u < raw_count; u++) { + #endif + #endif + for (int u = pack_offset; u < raw_count; u++) { int j = neighptr[u]; 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 int jtype = x[j].w; + const int jtype = x[j].w; const flt_t rsq = delx * delx + dely * dely + delz * delz; - if (rsq > cutneighsq[ioffset + jtype]) - neighptr[u] = e_nall; - else { - if (need_ic) { - int no_special; - ominimum_image_check(no_special, delx, dely, delz); - if (no_special) - neighptr[u] = -j - 1; - } + if (rsq > cutneighsq[ioffset + jtype]) + neighptr[u] = e_nall; + else { + if (need_ic) { + int no_special; + ominimum_image_check(no_special, delx, dely, delz); + if (no_special) + neighptr[u] = -j - 1; + } #ifdef _LMP_INTEL_OFFLOAD if (j < nlocal) { if (j < vlmin) vlmin = j; @@ -415,40 +415,40 @@ hbni(const int offload, NeighList *list, IntelBuffers *buffers, if (j > vgmax) vgmax = j; } #endif - } - } + } + } #ifdef _LMP_INTEL_OFFLOAD - lmin = MIN(lmin,vlmin); - gmin = MIN(gmin,vgmin); - lmax = MAX(lmax,vlmax); - gmax = MAX(gmax,vgmax); + lmin = MIN(lmin,vlmin); + gmin = MIN(gmin,vgmin); + lmax = MAX(lmax,vlmax); + gmax = MAX(gmax,vgmax); #endif int n = lane, n2 = pack_offset; - for (int u = pack_offset; u < raw_count; u++) { - const int j = neighptr[u]; - int pj = j; - if (pj < e_nall) { - if (need_ic) - if (pj < 0) pj = -pj - 1; + for (int u = pack_offset; u < raw_count; u++) { + const int j = neighptr[u]; + int pj = j; + if (pj < e_nall) { + if (need_ic) + if (pj < 0) pj = -pj - 1; - if (pj < nlocal) { - neighptr[n] = j; - n += swidth; - } else - neighptr[n2++] = j; - } - } - int ns = (n - lane) / swidth; - for (int u = pack_offset; u < n2; u++) { - neighptr[n] = neighptr[u]; - n += swidth; - } + if (pj < nlocal) { + neighptr[n] = j; + n += swidth; + } else + neighptr[n2++] = j; + } + } + int ns = (n - lane) / swidth; + for (int u = pack_offset; u < n2; u++) { + neighptr[n] = neighptr[u]; + n += swidth; + } ilist[i] = i; cnumneigh[i] = ct + lane; - ns += n2 - pack_offset; - #ifndef OUTER_CHUNK + ns += n2 - pack_offset; + #ifndef OUTER_CHUNK int edge = (ns % pad_width); if (edge) { const int pad_end = ns + (pad_width - edge); @@ -458,41 +458,41 @@ hbni(const int offload, NeighList *list, IntelBuffers *buffers, for ( ; ns < pad_end; ns++) neighptr[ns] = e_nall; } - #endif + #endif numneigh[i] = ns; - #ifdef OUTER_CHUNK - if (ns > max_chunk) max_chunk = ns; - lane++; - if (lane == swidth) { - ct += max_chunk * swidth; - const int alignb = (INTEL_DATA_ALIGN / sizeof(int)); - int edge = (ct % alignb); - if (edge) ct += alignb - edge; - neighptr = firstneigh + ct; - max_chunk = 0; - pack_offset = maxnbors * swidth; - lane = 0; - if (ct + obound > list_size) { + #ifdef OUTER_CHUNK + if (ns > max_chunk) max_chunk = ns; + lane++; + if (lane == swidth) { + ct += max_chunk * swidth; + const int alignb = (INTEL_DATA_ALIGN / sizeof(int)); + int edge = (ct % alignb); + if (edge) ct += alignb - edge; + neighptr = firstneigh + ct; + max_chunk = 0; + pack_offset = maxnbors * swidth; + lane = 0; + if (ct + obound > list_size) { if (i < ito - 1) { - *overflow = 1; - ct = (ifrom + tid * 2) * maxnbors; + *overflow = 1; + ct = (ifrom + tid * 2) * maxnbors; } - } - } - #else - ct += ns; - const int alignb = (INTEL_DATA_ALIGN / sizeof(int)); - edge = (ct % alignb); - if (edge) ct += alignb - edge; - neighptr = firstneigh + ct; - if (ct + obound > list_size) { - if (i < ito - 1) { - *overflow = 1; - ct = (ifrom + tid * 2) * maxnbors; - } - } - #endif + } + } + #else + ct += ns; + const int alignb = (INTEL_DATA_ALIGN / sizeof(int)); + edge = (ct % alignb); + if (edge) ct += alignb - edge; + neighptr = firstneigh + ct; + if (ct + obound > list_size) { + if (i < ito - 1) { + *overflow = 1; + ct = (ifrom + tid * 2) * maxnbors; + } + } + #endif } if (*overflow == 1) @@ -505,25 +505,25 @@ hbni(const int offload, NeighList *list, IntelBuffers *buffers, #pragma omp critical #endif { - if (lmin < overflow[LMP_LOCAL_MIN]) overflow[LMP_LOCAL_MIN] = lmin; - if (lmax > overflow[LMP_LOCAL_MAX]) overflow[LMP_LOCAL_MAX] = lmax; - if (gmin < overflow[LMP_GHOST_MIN]) overflow[LMP_GHOST_MIN] = gmin; - if (gmax > overflow[LMP_GHOST_MAX]) overflow[LMP_GHOST_MAX] = gmax; + if (lmin < overflow[LMP_LOCAL_MIN]) overflow[LMP_LOCAL_MIN] = lmin; + if (lmax > overflow[LMP_LOCAL_MAX]) overflow[LMP_LOCAL_MAX] = lmax; + if (gmin < overflow[LMP_GHOST_MIN]) overflow[LMP_GHOST_MIN] = gmin; + if (gmax > overflow[LMP_GHOST_MAX]) overflow[LMP_GHOST_MAX] = gmax; } - #pragma omp barrier + #pragma omp barrier } int ghost_offset = 0, nall_offset = e_nall; if (separate_buffers) { - int nghost = overflow[LMP_GHOST_MAX] + 1 - overflow[LMP_GHOST_MIN]; - if (nghost < 0) nghost = 0; - if (offload) { - ghost_offset = overflow[LMP_GHOST_MIN] - overflow[LMP_LOCAL_MAX] - 1; - nall_offset = overflow[LMP_LOCAL_MAX] + 1 + nghost; - } else { - ghost_offset = overflow[LMP_GHOST_MIN] - nlocal; - nall_offset = nlocal + nghost; - } + int nghost = overflow[LMP_GHOST_MAX] + 1 - overflow[LMP_GHOST_MIN]; + if (nghost < 0) nghost = 0; + if (offload) { + ghost_offset = overflow[LMP_GHOST_MIN] - overflow[LMP_LOCAL_MAX] - 1; + nall_offset = overflow[LMP_LOCAL_MAX] + 1 + nghost; + } else { + ghost_offset = overflow[LMP_GHOST_MIN] - nlocal; + nall_offset = nlocal + nghost; + } } #endif @@ -531,49 +531,49 @@ hbni(const int offload, NeighList *list, IntelBuffers *buffers, for (int i = ifrom; i < ito; ++i) { int * _noalias jlist = firstneigh + cnumneigh[i]; const int jnum = numneigh[i]; - #ifndef OUTER_CHUNK + #ifndef OUTER_CHUNK #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned + #pragma vector aligned #pragma simd - #endif + #endif for (int jj = 0; jj < jnum; jj++) { - #else - const int trip = jnum * swidth; + #else + const int trip = jnum * swidth; for (int jj = 0; jj < trip; jj+= swidth) { - #endif + #endif const int j = jlist[jj]; - if (need_ic && j < 0) { - which = 0; - jlist[jj] = -j - 1; + if (need_ic && j < 0) { + which = 0; + jlist[jj] = -j - 1; } else ofind_special(which, special, nspecial, i, tag[j]); - #ifdef _LMP_INTEL_OFFLOAD - if (j >= nlocal) { - if (j == e_nall) - jlist[jj] = nall_offset; - else if (which) - jlist[jj] = (j-ghost_offset) ^ (which << SBBITS); - else jlist[jj]-=ghost_offset; + #ifdef _LMP_INTEL_OFFLOAD + if (j >= nlocal) { + if (j == e_nall) + jlist[jj] = nall_offset; + else if (which) + jlist[jj] = (j-ghost_offset) ^ (which << SBBITS); + else jlist[jj]-=ghost_offset; } else - #endif + #endif if (which) jlist[jj] = j ^ (which << SBBITS); } } } #ifdef _LMP_INTEL_OFFLOAD else if (separate_buffers) { - for (int i = ifrom; i < ito; ++i) { + for (int i = ifrom; i < ito; ++i) { int * _noalias jlist = firstneigh + cnumneigh[i]; const int jnum = numneigh[i]; - int jj = 0; - for (jj = 0; jj < jnum; jj++) - if (jlist[jj] >= nlocal) break; - while (jj < jnum) { - if (jlist[jj] == e_nall) jlist[jj] = nall_offset; - else jlist[jj] -= ghost_offset; - jj++; - } - } + int jj = 0; + for (jj = 0; jj < jnum; jj++) + if (jlist[jj] >= nlocal) break; + while (jj < jnum) { + if (jlist[jj] == e_nall) jlist[jj] = nall_offset; + else jlist[jj] -= ghost_offset; + jj++; + } + } } #endif } // end omp @@ -597,9 +597,9 @@ hbni(const int offload, NeighList *list, IntelBuffers *buffers, _fix->start_watch(TIME_PACK); _fix->set_neighbor_host_sizes(); buffers->pack_sep_from_single(_fix->host_min_local(), - _fix->host_used_local(), - _fix->host_min_ghost(), - _fix->host_used_ghost()); + _fix->host_used_local(), + _fix->host_min_ghost(), + _fix->host_used_ghost()); _fix->stop_watch(TIME_PACK); } } diff --git a/src/USER-INTEL/npair_half_bin_newton_intel.h b/src/USER-INTEL/npair_half_bin_newton_intel.h index 4e496986b4..9b5d0780a1 100644 --- a/src/USER-INTEL/npair_half_bin_newton_intel.h +++ b/src/USER-INTEL/npair_half_bin_newton_intel.h @@ -37,8 +37,8 @@ class NPairHalfBinNewtonIntel : public NPairIntel { template void hbni(NeighList *, IntelBuffers *); template - void hbni(const int, NeighList *, IntelBuffers *, const int, - const int, const int offload_end = 0); + void hbni(const int, NeighList *, IntelBuffers *, const int, + const int, const int offload_end = 0); }; } diff --git a/src/USER-INTEL/npair_half_bin_newton_tri_intel.cpp b/src/USER-INTEL/npair_half_bin_newton_tri_intel.cpp index 3b6d68d4de..5f191e0797 100644 --- a/src/USER-INTEL/npair_half_bin_newton_tri_intel.cpp +++ b/src/USER-INTEL/npair_half_bin_newton_tri_intel.cpp @@ -26,7 +26,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfBinNewtonTriIntel::NPairHalfBinNewtonTriIntel(LAMMPS *lmp) : +NPairHalfBinNewtonTriIntel::NPairHalfBinNewtonTriIntel(LAMMPS *lmp) : NPairIntel(lmp) {} /* ---------------------------------------------------------------------- @@ -75,7 +75,7 @@ hbnti(NeighList *list, IntelBuffers *buffers) { int need_ic = 0; if (atom->molecular) dminimum_image_check(need_ic, neighbor->cutneighmax, neighbor->cutneighmax, - neighbor->cutneighmax); + neighbor->cutneighmax); #ifdef _LMP_INTEL_OFFLOAD if (need_ic) { @@ -171,7 +171,7 @@ hbnti(const int offload, NeighList *list, IntelBuffers *buffers, overflow = _fix->get_off_overflow_flag(); _fix->stop_watch(TIME_HOST_NEIGHBOR); _fix->start_watch(TIME_OFFLOAD_LATENCY); - } else + } else #endif { tnum = comm->nthreads; @@ -279,20 +279,20 @@ hbnti(const int offload, NeighList *list, IntelBuffers *buffers, const int ibin = atombin[i]; - int raw_count = maxnbors; + int raw_count = maxnbors; for (int k = 0; k < nstencilp; k++) { const int bstart = binhead[ibin + binstart[k]]; const int bend = binhead[ibin + binend[k]]; for (int jj = bstart; jj < bend; jj++) { const int j = binpacked[jj]; - #ifdef _LMP_INTEL_OFFLOAD - if (offload_noghost) { + #ifdef _LMP_INTEL_OFFLOAD + if (offload_noghost) { if (j < nlocal) { if (i < offload_end) continue; } else if (offload) continue; } - #endif + #endif if (x[j].z < ztmp) continue; if (x[j].z == ztmp) { @@ -305,45 +305,45 @@ hbnti(const int offload, NeighList *list, IntelBuffers *buffers, #ifndef _LMP_INTEL_OFFLOAD if (exclude) { - const int jtype = x[j].w; - if (exclusion(i,j,itype,jtype,mask,molecule)) continue; - } - #endif + const int jtype = x[j].w; + if (exclusion(i,j,itype,jtype,mask,molecule)) continue; + } + #endif - neighptr[raw_count++] = j; - } - } - if (raw_count > obound) - *overflow = 1; + neighptr[raw_count++] = j; + } + } + if (raw_count > obound) + *overflow = 1; #if defined(LMP_SIMD_COMPILER) - #ifdef _LMP_INTEL_OFFLOAD - int vlmin = lmin, vlmax = lmax, vgmin = gmin, vgmax = gmax; - #if __INTEL_COMPILER+0 > 1499 - #pragma vector aligned + #ifdef _LMP_INTEL_OFFLOAD + int vlmin = lmin, vlmax = lmax, vgmin = gmin, vgmax = gmax; + #if __INTEL_COMPILER+0 > 1499 + #pragma vector aligned #pragma simd reduction(max:vlmax,vgmax) reduction(min:vlmin, vgmin) - #endif - #else - #pragma vector aligned + #endif + #else + #pragma vector aligned #pragma simd - #endif - #endif - for (int u = maxnbors; u < raw_count; u++) { + #endif + #endif + for (int u = maxnbors; u < raw_count; u++) { int j = neighptr[u]; 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 int jtype = x[j].w; + const int jtype = x[j].w; const flt_t rsq = delx * delx + dely * dely + delz * delz; - if (rsq > cutneighsq[ioffset + jtype]) - neighptr[u] = e_nall; - else { + if (rsq > cutneighsq[ioffset + jtype]) + neighptr[u] = e_nall; + else { if (need_ic) { - int no_special; - ominimum_image_check(no_special, delx, dely, delz); - if (no_special) - neighptr[u] = -j - 1; - } + int no_special; + ominimum_image_check(no_special, delx, dely, delz); + if (no_special) + neighptr[u] = -j - 1; + } #ifdef _LMP_INTEL_OFFLOAD if (j < nlocal) { @@ -358,26 +358,26 @@ hbnti(const int offload, NeighList *list, IntelBuffers *buffers, } int n = 0, n2 = maxnbors; - for (int u = maxnbors; u < raw_count; u++) { - const int j = neighptr[u]; - int pj = j; - if (pj < e_nall) { - if (need_ic) - if (pj < 0) pj = -pj - 1; + for (int u = maxnbors; u < raw_count; u++) { + const int j = neighptr[u]; + int pj = j; + if (pj < e_nall) { + if (need_ic) + if (pj < 0) pj = -pj - 1; - if (pj < nlocal) - neighptr[n++] = j; - else - neighptr[n2++] = j; - } - } - int ns = n; - for (int u = maxnbors; u < n2; u++) - neighptr[n++] = neighptr[u]; + if (pj < nlocal) + neighptr[n++] = j; + else + neighptr[n2++] = j; + } + } + int ns = n; + for (int u = maxnbors; u < n2; u++) + neighptr[n++] = neighptr[u]; ilist[i] = i; cnumneigh[i] = ct; - ns += n2 - maxnbors; + ns += n2 - maxnbors; int edge = (ns % pad_width); if (edge) { @@ -390,17 +390,17 @@ hbnti(const int offload, NeighList *list, IntelBuffers *buffers, } numneigh[i] = ns; - ct += ns; - const int alignb = (INTEL_DATA_ALIGN / sizeof(int)); - edge = (ct % alignb); - if (edge) ct += alignb - edge; - neighptr = firstneigh + ct; - if (ct + obound > list_size) { - if (i < ito - 1) { - *overflow = 1; - ct = (ifrom + tid * 2) * maxnbors; - } - } + ct += ns; + const int alignb = (INTEL_DATA_ALIGN / sizeof(int)); + edge = (ct % alignb); + if (edge) ct += alignb - edge; + neighptr = firstneigh + ct; + if (ct + obound > list_size) { + if (i < ito - 1) { + *overflow = 1; + ct = (ifrom + tid * 2) * maxnbors; + } + } } if (*overflow == 1) @@ -428,7 +428,7 @@ hbnti(const int offload, NeighList *list, IntelBuffers *buffers, if (offload) { ghost_offset = overflow[LMP_GHOST_MIN] - overflow[LMP_LOCAL_MAX] - 1; nall_offset = overflow[LMP_LOCAL_MAX] + 1 + nghost; - } else { + } else { ghost_offset = overflow[LMP_GHOST_MIN] - nlocal; nall_offset = nlocal + nghost; } @@ -440,43 +440,43 @@ hbnti(const int offload, NeighList *list, IntelBuffers *buffers, int * _noalias jlist = firstneigh + cnumneigh[i]; const int jnum = numneigh[i]; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned + #pragma vector aligned #pragma simd - #endif + #endif for (int jj = 0; jj < jnum; jj++) { const int j = jlist[jj]; - if (need_ic && j < 0) { - which = 0; - jlist[jj] = -j - 1; - } else + if (need_ic && j < 0) { + which = 0; + jlist[jj] = -j - 1; + } else ofind_special(which, special, nspecial, i, tag[j]); #ifdef _LMP_INTEL_OFFLOAD - if (j >= nlocal) { - if (j == e_nall) - jlist[jj] = nall_offset; - else if (which) - jlist[jj] = (j-ghost_offset) ^ (which << SBBITS); - else jlist[jj]-=ghost_offset; + if (j >= nlocal) { + if (j == e_nall) + jlist[jj] = nall_offset; + else if (which) + jlist[jj] = (j-ghost_offset) ^ (which << SBBITS); + else jlist[jj]-=ghost_offset; } else #endif - if (which) jlist[jj] = j ^ (which << SBBITS); + if (which) jlist[jj] = j ^ (which << SBBITS); } } } #ifdef _LMP_INTEL_OFFLOAD else if (separate_buffers) { - for (int i = ifrom; i < ito; ++i) { + for (int i = ifrom; i < ito; ++i) { int * _noalias jlist = firstneigh + cnumneigh[i]; const int jnum = numneigh[i]; - int jj = 0; - for (jj = 0; jj < jnum; jj++) - if (jlist[jj] >= nlocal) break; - while (jj < jnum) { - if (jlist[jj] == e_nall) jlist[jj] = nall_offset; - else jlist[jj] -= ghost_offset; - jj++; - } - } + int jj = 0; + for (jj = 0; jj < jnum; jj++) + if (jlist[jj] >= nlocal) break; + while (jj < jnum) { + if (jlist[jj] == e_nall) jlist[jj] = nall_offset; + else jlist[jj] -= ghost_offset; + jj++; + } + } } #endif } // end omp @@ -500,9 +500,9 @@ hbnti(const int offload, NeighList *list, IntelBuffers *buffers, _fix->start_watch(TIME_PACK); _fix->set_neighbor_host_sizes(); buffers->pack_sep_from_single(_fix->host_min_local(), - _fix->host_used_local(), - _fix->host_min_ghost(), - _fix->host_used_ghost()); + _fix->host_used_local(), + _fix->host_min_ghost(), + _fix->host_used_ghost()); _fix->stop_watch(TIME_PACK); } } diff --git a/src/USER-INTEL/npair_half_bin_newton_tri_intel.h b/src/USER-INTEL/npair_half_bin_newton_tri_intel.h index d1b9ee9cd1..d144c2fc52 100644 --- a/src/USER-INTEL/npair_half_bin_newton_tri_intel.h +++ b/src/USER-INTEL/npair_half_bin_newton_tri_intel.h @@ -38,7 +38,7 @@ class NPairHalfBinNewtonTriIntel : public NPairIntel { void hbnti(NeighList *, IntelBuffers *); template void hbnti(const int, NeighList *, IntelBuffers *, const int, - const int, const int offload_end = 0); + const int, const int offload_end = 0); }; } diff --git a/src/USER-INTEL/npair_intel.cpp b/src/USER-INTEL/npair_intel.cpp index bffb31b710..c92ed88774 100644 --- a/src/USER-INTEL/npair_intel.cpp +++ b/src/USER-INTEL/npair_intel.cpp @@ -62,6 +62,6 @@ void NPairIntel::grow_stencil() const int maxstencil = ns->get_maxstencil(); #pragma offload_transfer target(mic:_cop) \ in(stencil:length(maxstencil) alloc_if(1) free_if(0)) - } + } } #endif diff --git a/src/npair.cpp b/src/npair.cpp index 3451cd6eae..9fbb4d219d 100644 --- a/src/npair.cpp +++ b/src/npair.cpp @@ -123,7 +123,7 @@ void NPair::copy_bin_info() mbinxlo = nb->mbinxlo; mbinylo = nb->mbinylo; mbinzlo = nb->mbinzlo; - + bininvx = nb->bininvx; bininvy = nb->bininvy; bininvz = nb->bininvz; @@ -183,15 +183,15 @@ int NPair::exclusion(int i, int j, int itype, int jtype, if (nex_mol) { for (m = 0; m < nex_mol; m++) - // intra-chain: exclude i-j pair if in same molecule - // inter-chain: exclude i-j pair if in different molecules + // intra-chain: exclude i-j pair if in same molecule + // inter-chain: exclude i-j pair if in different molecules if (ex_mol_intra[m]) { if (mask[i] & ex_mol_bit[m] && mask[j] & ex_mol_bit[m] && - molecule[i] == molecule[j]) return 1; + molecule[i] == molecule[j]) return 1; } else { - if (mask[i] & ex_mol_bit[m] && mask[j] & ex_mol_bit[m] && - molecule[i] != molecule[j]) return 1; + if (mask[i] & ex_mol_bit[m] && mask[j] & ex_mol_bit[m] && + molecule[i] != molecule[j]) return 1; } } diff --git a/src/npair.h b/src/npair.h index 4e5e3f5dfd..6941b86164 100644 --- a/src/npair.h +++ b/src/npair.h @@ -79,7 +79,7 @@ class NPair : protected Pointers { double bininvx,bininvy,bininvz; int *atom2bin,*bins; int *binhead; - + // data from NStencil class int nstencil; diff --git a/src/npair_full_bin.h b/src/npair_full_bin.h index 432fb3cbf8..56c338e360 100644 --- a/src/npair_full_bin.h +++ b/src/npair_full_bin.h @@ -15,7 +15,7 @@ NPairStyle(full/bin, NPairFullBin, - NP_FULL | NP_BIN | NP_MOLONLY | + NP_FULL | NP_BIN | NP_MOLONLY | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/npair_full_bin_atomonly.h b/src/npair_full_bin_atomonly.h index f8c33d9558..0845d1ecef 100644 --- a/src/npair_full_bin_atomonly.h +++ b/src/npair_full_bin_atomonly.h @@ -16,7 +16,7 @@ NPairStyle(full/bin/atomonly, NPairFullBinAtomonly, NP_FULL | NP_BIN | NP_ATOMONLY | - NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) + NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/npair_full_bin_ghost.h b/src/npair_full_bin_ghost.h index a09aab8512..c5a86e68af 100644 --- a/src/npair_full_bin_ghost.h +++ b/src/npair_full_bin_ghost.h @@ -15,7 +15,7 @@ NPairStyle(full/bin/ghost, NPairFullBinGhost, - NP_FULL | NP_BIN | NP_GHOST | NP_NEWTON | NP_NEWTOFF | + NP_FULL | NP_BIN | NP_GHOST | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/npair_full_nsq_ghost.h b/src/npair_full_nsq_ghost.h index 3e259ed098..58cd73c392 100644 --- a/src/npair_full_nsq_ghost.h +++ b/src/npair_full_nsq_ghost.h @@ -15,7 +15,7 @@ NPairStyle(full/nsq/ghost, NPairFullNsqGhost, - NP_FULL | NP_NSQ | NP_GHOST | NP_NEWTON | NP_NEWTOFF | + NP_FULL | NP_NSQ | NP_GHOST | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/npair_half_bin_atomonly_newton.cpp b/src/npair_half_bin_atomonly_newton.cpp index 6bbef0700a..6da44b4a5c 100644 --- a/src/npair_half_bin_atomonly_newton.cpp +++ b/src/npair_half_bin_atomonly_newton.cpp @@ -25,7 +25,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfBinAtomonlyNewton::NPairHalfBinAtomonlyNewton(LAMMPS *lmp) : +NPairHalfBinAtomonlyNewton::NPairHalfBinAtomonlyNewton(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/npair_half_respa_bin_newton_tri.cpp b/src/npair_half_respa_bin_newton_tri.cpp index 38621224c4..4ec6685e1d 100644 --- a/src/npair_half_respa_bin_newton_tri.cpp +++ b/src/npair_half_respa_bin_newton_tri.cpp @@ -25,7 +25,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfRespaBinNewtonTri::NPairHalfRespaBinNewtonTri(LAMMPS *lmp) : +NPairHalfRespaBinNewtonTri::NPairHalfRespaBinNewtonTri(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/npair_half_size_bin_newton.cpp b/src/npair_half_size_bin_newton.cpp index a8be3ce691..4f4ecccb16 100644 --- a/src/npair_half_size_bin_newton.cpp +++ b/src/npair_half_size_bin_newton.cpp @@ -190,7 +190,7 @@ void NPairHalfSizeBinNewton::build(NeighList *list) nn += dnum; } } - + n++; } } diff --git a/src/npair_half_size_bin_newton_tri.cpp b/src/npair_half_size_bin_newton_tri.cpp index 1107f73026..559eb09a7a 100644 --- a/src/npair_half_size_bin_newton_tri.cpp +++ b/src/npair_half_size_bin_newton_tri.cpp @@ -27,7 +27,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairHalfSizeBinNewtonTri::NPairHalfSizeBinNewtonTri(LAMMPS *lmp) : +NPairHalfSizeBinNewtonTri::NPairHalfSizeBinNewtonTri(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/npair_skip_respa.h b/src/npair_skip_respa.h index 62077f85df..deff301909 100644 --- a/src/npair_skip_respa.h +++ b/src/npair_skip_respa.h @@ -15,8 +15,8 @@ NPairStyle(skip/half/respa, NPairSkipRespa, - NP_SKIP | NP_RESPA | NP_HALF | NP_FULL | - NP_NSQ | NP_BIN | NP_MULTI | + NP_SKIP | NP_RESPA | NP_HALF | NP_FULL | + NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/npair_skip_size.cpp b/src/npair_skip_size.cpp index 98e757e5c7..e8d19dedca 100644 --- a/src/npair_skip_size.cpp +++ b/src/npair_skip_size.cpp @@ -32,7 +32,7 @@ NPairSkipSize::NPairSkipSize(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 - if list requests it, preserve shear history via fix shear/history + if list requests it, preserve shear history via fix shear/history ------------------------------------------------------------------------- */ void NPairSkipSize::build(NeighList *list) diff --git a/src/npair_skip_size.h b/src/npair_skip_size.h index 9573396641..b462c9dc97 100644 --- a/src/npair_skip_size.h +++ b/src/npair_skip_size.h @@ -15,7 +15,7 @@ NPairStyle(skip/half/size, NPairSkipSize, - NP_SKIP | NP_SIZE | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | + NP_SKIP | NP_SIZE | NP_HALF | NP_FULL | NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/npair_skip_size_off2on.cpp b/src/npair_skip_size_off2on.cpp index 996e9939df..da9dd57047 100644 --- a/src/npair_skip_size_off2on.cpp +++ b/src/npair_skip_size_off2on.cpp @@ -33,7 +33,7 @@ NPairSkipSizeOff2on::NPairSkipSizeOff2on(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 - if list requests it, preserve shear history via fix shear/history + if list requests it, preserve shear history via fix shear/history ------------------------------------------------------------------------- */ void NPairSkipSizeOff2on::build(NeighList *list) diff --git a/src/npair_skip_size_off2on.h b/src/npair_skip_size_off2on.h index 4b4e9a9c29..dab32f04ff 100644 --- a/src/npair_skip_size_off2on.h +++ b/src/npair_skip_size_off2on.h @@ -15,8 +15,8 @@ NPairStyle(skip/size/off2on, NPairSkipSizeOff2on, - NP_SKIP | NP_SIZE | NP_OFF2ON | NP_HALF | - NP_NSQ | NP_BIN | NP_MULTI | + NP_SKIP | NP_SIZE | NP_OFF2ON | NP_HALF | + NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/npair_skip_size_off2on_oneside.cpp b/src/npair_skip_size_off2on_oneside.cpp index a4c1625590..7377feec5b 100644 --- a/src/npair_skip_size_off2on_oneside.cpp +++ b/src/npair_skip_size_off2on_oneside.cpp @@ -27,7 +27,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NPairSkipSizeOff2onOneside::NPairSkipSizeOff2onOneside(LAMMPS *lmp) : +NPairSkipSizeOff2onOneside::NPairSkipSizeOff2onOneside(LAMMPS *lmp) : NPair(lmp) {} /* ---------------------------------------------------------------------- @@ -35,7 +35,7 @@ NPairSkipSizeOff2onOneside::NPairSkipSizeOff2onOneside(LAMMPS *lmp) : 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 - if list requests it, preserve shear history via fix shear/history + if list requests it, preserve shear history via fix shear/history ------------------------------------------------------------------------- */ void NPairSkipSizeOff2onOneside::build(NeighList *list) diff --git a/src/npair_skip_size_off2on_oneside.h b/src/npair_skip_size_off2on_oneside.h index 9f3c06e7bc..73448ca279 100644 --- a/src/npair_skip_size_off2on_oneside.h +++ b/src/npair_skip_size_off2on_oneside.h @@ -15,8 +15,8 @@ NPairStyle(skip/size/off2on/oneside, NPairSkipSizeOff2onOneside, - NP_SKIP | NP_SIZE | NP_OFF2ON | NP_ONESIDE | NP_HALF | - NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | + NP_SKIP | NP_SIZE | NP_OFF2ON | NP_ONESIDE | NP_HALF | + NP_NSQ | NP_BIN | NP_MULTI | NP_NEWTON | NP_NEWTOFF | NP_ORTHO | NP_TRI) #else diff --git a/src/nstencil_full_bin_2d.cpp b/src/nstencil_full_bin_2d.cpp index 1f2b666dfb..0986c40dd4 100644 --- a/src/nstencil_full_bin_2d.cpp +++ b/src/nstencil_full_bin_2d.cpp @@ -28,7 +28,7 @@ NStencilFullBin2d::NStencilFullBin2d(LAMMPS *lmp) : NStencil(lmp) {} void NStencilFullBin2d::create() { int i,j; - + nstencil = 0; for (j = -sy; j <= sy; j++) diff --git a/src/nstencil_full_bin_2d.h b/src/nstencil_full_bin_2d.h index 18f848f275..d85063596f 100644 --- a/src/nstencil_full_bin_2d.h +++ b/src/nstencil_full_bin_2d.h @@ -15,7 +15,7 @@ NStencilStyle(full/bin/2d, NStencilFullBin2d, - NS_FULL | NS_BIN | NS_2D | + NS_FULL | NS_BIN | NS_2D | NS_NEWTON | NS_NEWTOFF | NS_ORTHO | NS_TRI) #else diff --git a/src/nstencil_full_bin_3d.h b/src/nstencil_full_bin_3d.h index d9acc9c535..facddd8ead 100644 --- a/src/nstencil_full_bin_3d.h +++ b/src/nstencil_full_bin_3d.h @@ -15,7 +15,7 @@ NStencilStyle(full/bin/3d, NStencilFullBin3d, - NS_FULL | NS_BIN | NS_3D | + NS_FULL | NS_BIN | NS_3D | NS_NEWTON | NS_NEWTOFF | NS_ORTHO | NS_TRI) #else diff --git a/src/nstencil_full_ghost_bin_2d.h b/src/nstencil_full_ghost_bin_2d.h index af47913e7f..531c7d2eb1 100644 --- a/src/nstencil_full_ghost_bin_2d.h +++ b/src/nstencil_full_ghost_bin_2d.h @@ -15,7 +15,7 @@ NStencilStyle(full/ghost/bin/2d, NStencilFullGhostBin2d, - NS_FULL | NS_GHOST | NS_BIN | NS_2D | + NS_FULL | NS_GHOST | NS_BIN | NS_2D | NS_NEWTON | NS_NEWTOFF | NS_ORTHO | NS_TRI) #else diff --git a/src/nstencil_full_ghost_bin_3d.h b/src/nstencil_full_ghost_bin_3d.h index beca6573de..ed4ca6c4d6 100644 --- a/src/nstencil_full_ghost_bin_3d.h +++ b/src/nstencil_full_ghost_bin_3d.h @@ -15,7 +15,7 @@ NStencilStyle(full/ghost/bin/3d, NStencilFullGhostBin3d, - NS_FULL | NS_GHOST | NS_BIN | NS_3D | + NS_FULL | NS_GHOST | NS_BIN | NS_3D | NS_NEWTON | NS_NEWTOFF | NS_ORTHO | NS_TRI) #else diff --git a/src/nstencil_full_multi_2d.h b/src/nstencil_full_multi_2d.h index 8154144eda..f78eecc55f 100644 --- a/src/nstencil_full_multi_2d.h +++ b/src/nstencil_full_multi_2d.h @@ -15,7 +15,7 @@ NStencilStyle(full/multi/2d, NStencilFullMulti2d, - NS_FULL | NS_MULTI | NS_2D | + NS_FULL | NS_MULTI | NS_2D | NS_NEWTON | NS_NEWTOFF | NS_ORTHO | NS_TRI) #else diff --git a/src/nstencil_half_bin_2d_newtoff.cpp b/src/nstencil_half_bin_2d_newtoff.cpp index be5bc81dbf..e51db6fe7a 100644 --- a/src/nstencil_half_bin_2d_newtoff.cpp +++ b/src/nstencil_half_bin_2d_newtoff.cpp @@ -19,7 +19,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NStencilHalfBin2dNewtoff::NStencilHalfBin2dNewtoff(LAMMPS *lmp) : +NStencilHalfBin2dNewtoff::NStencilHalfBin2dNewtoff(LAMMPS *lmp) : NStencil(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/nstencil_half_bin_2d_newton_tri.cpp b/src/nstencil_half_bin_2d_newton_tri.cpp index 3a645a7434..4f89b1c326 100644 --- a/src/nstencil_half_bin_2d_newton_tri.cpp +++ b/src/nstencil_half_bin_2d_newton_tri.cpp @@ -19,7 +19,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NStencilHalfBin2dNewtonTri::NStencilHalfBin2dNewtonTri(LAMMPS *lmp) : +NStencilHalfBin2dNewtonTri::NStencilHalfBin2dNewtonTri(LAMMPS *lmp) : NStencil(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/nstencil_half_bin_3d_newtoff.cpp b/src/nstencil_half_bin_3d_newtoff.cpp index 44678b05df..433de400c2 100644 --- a/src/nstencil_half_bin_3d_newtoff.cpp +++ b/src/nstencil_half_bin_3d_newtoff.cpp @@ -19,7 +19,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NStencilHalfBin3dNewtoff::NStencilHalfBin3dNewtoff(LAMMPS *lmp) : +NStencilHalfBin3dNewtoff::NStencilHalfBin3dNewtoff(LAMMPS *lmp) : NStencil(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/nstencil_half_bin_3d_newton_tri.cpp b/src/nstencil_half_bin_3d_newton_tri.cpp index 9e8c41f97a..691ce0bb80 100644 --- a/src/nstencil_half_bin_3d_newton_tri.cpp +++ b/src/nstencil_half_bin_3d_newton_tri.cpp @@ -19,7 +19,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -NStencilHalfBin3dNewtonTri::NStencilHalfBin3dNewtonTri(LAMMPS *lmp) : +NStencilHalfBin3dNewtonTri::NStencilHalfBin3dNewtonTri(LAMMPS *lmp) : NStencil(lmp) {} /* ---------------------------------------------------------------------- diff --git a/src/nstencil_half_ghost_bin_2d_newtoff.h b/src/nstencil_half_ghost_bin_2d_newtoff.h index 3b70f0042a..3286810c1c 100644 --- a/src/nstencil_half_ghost_bin_2d_newtoff.h +++ b/src/nstencil_half_ghost_bin_2d_newtoff.h @@ -15,7 +15,7 @@ NStencilStyle(half/ghost/bin/2d/newtoff, NStencilHalfGhostBin2dNewtoff, - NS_HALF | NS_GHOST | NS_BIN | NS_2D | + NS_HALF | NS_GHOST | NS_BIN | NS_2D | NS_NEWTOFF | NS_ORTHO | NS_TRI) #else From 167a51538e1689c45d045afa457a3514c50e866b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 30 May 2017 21:52:32 -0400 Subject: [PATCH 111/302] support atom style variables for assigning image flags with the set command --- doc/src/set.txt | 1 + src/set.cpp | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/doc/src/set.txt b/doc/src/set.txt index 6b59bf1332..0b428d56ed 100644 --- a/doc/src/set.txt +++ b/doc/src/set.txt @@ -80,6 +80,7 @@ keyword = {type} or {type/fraction} or {mol} or {x} or {y} or {z} or \ value can be an atom-style variable (see below) {image} nx ny nz nx,ny,nz = which periodic image of the simulation box the atom is in + any of nx,ny,nz can be an atom-style variable (see below) {bond} value = bond type for all bonds between selected atoms {angle} value = angle type for all angles between selected atoms {dihedral} value = dihedral type for all dihedrals between selected atoms diff --git a/src/set.cpp b/src/set.cpp index 4ed07d423b..b97a96167c 100644 --- a/src/set.cpp +++ b/src/set.cpp @@ -327,15 +327,18 @@ void Set::command(int narg, char **arg) ximageflag = yimageflag = zimageflag = 0; if (strcmp(arg[iarg+1],"NULL") != 0) { ximageflag = 1; - ximage = force->inumeric(FLERR,arg[iarg+1]); + if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); + else ximage = force->inumeric(FLERR,arg[iarg+1]); } if (strcmp(arg[iarg+2],"NULL") != 0) { yimageflag = 1; - yimage = force->inumeric(FLERR,arg[iarg+2]); + if (strstr(arg[iarg+2],"v_") == arg[iarg+2]) varparse(arg[iarg+2],2); + else yimage = force->inumeric(FLERR,arg[iarg+2]); } if (strcmp(arg[iarg+3],"NULL") != 0) { zimageflag = 1; - zimage = force->inumeric(FLERR,arg[iarg+3]); + if (strstr(arg[iarg+3],"v_") == arg[iarg+3]) varparse(arg[iarg+3],3); + else zimage = force->inumeric(FLERR,arg[iarg+3]); } if (ximageflag && ximage && !domain->xperiodic) error->all(FLERR, @@ -789,6 +792,9 @@ void Set::set(int keyword) int xbox = (atom->image[i] & IMGMASK) - IMGMAX; int ybox = (atom->image[i] >> IMGBITS & IMGMASK) - IMGMAX; int zbox = (atom->image[i] >> IMG2BITS) - IMGMAX; + if (varflag1) ximage = static_cast(xvalue); + if (varflag2) yimage = static_cast(yvalue); + if (varflag3) zimage = static_cast(zvalue); if (ximageflag) xbox = ximage; if (yimageflag) ybox = yimage; if (zimageflag) zbox = zimage; From 066123007cd9277d4c03669707cf34ab6c05bc06 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 30 May 2017 21:54:16 -0400 Subject: [PATCH 112/302] avoid undesired negative forces for high particle velocities in granular models --- src/GRANULAR/pair_gran_hertz_history.cpp | 2 ++ src/GRANULAR/pair_gran_hooke.cpp | 2 ++ src/GRANULAR/pair_gran_hooke_history.cpp | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/GRANULAR/pair_gran_hertz_history.cpp b/src/GRANULAR/pair_gran_hertz_history.cpp index e52aac10db..14cbc8eb0a 100644 --- a/src/GRANULAR/pair_gran_hertz_history.cpp +++ b/src/GRANULAR/pair_gran_hertz_history.cpp @@ -183,6 +183,7 @@ void PairGranHertzHistory::compute(int eflag, int vflag) ccel = kn*(radsum-r)*rinv - damp; polyhertz = sqrt((radsum-r)*radi*radj / radsum); ccel *= polyhertz; + if (ccel < 0.0) ccel = 0.0; // relative velocities @@ -390,6 +391,7 @@ double PairGranHertzHistory::single(int i, int j, int itype, int jtype, ccel = kn*(radsum-r)*rinv - damp; polyhertz = sqrt((radsum-r)*radi*radj / radsum); ccel *= polyhertz; + if (ccel < 0.0) ccel = 0.0; // relative velocities diff --git a/src/GRANULAR/pair_gran_hooke.cpp b/src/GRANULAR/pair_gran_hooke.cpp index 66e1c3dd7a..2d6d113ab7 100644 --- a/src/GRANULAR/pair_gran_hooke.cpp +++ b/src/GRANULAR/pair_gran_hooke.cpp @@ -161,6 +161,7 @@ void PairGranHooke::compute(int eflag, int vflag) damp = meff*gamman*vnnr*rsqinv; ccel = kn*(radsum-r)*rinv - damp; + if (ccel < 0.0) ccel = 0.0; // relative velocities @@ -302,6 +303,7 @@ double PairGranHooke::single(int i, int j, int itype, int jtype, double rsq, damp = meff*gamman*vnnr*rsqinv; ccel = kn*(radsum-r)*rinv - damp; + if (ccel < 0.0) ccel = 0.0; // relative velocities diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index e9662c9e73..1378709cb5 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -223,6 +223,7 @@ void PairGranHookeHistory::compute(int eflag, int vflag) damp = meff*gamman*vnnr*rsqinv; ccel = kn*(radsum-r)*rinv - damp; + if (ccel < 0.0) ccel = 0.0; // relative velocities @@ -687,6 +688,7 @@ double PairGranHookeHistory::single(int i, int j, int itype, int jtype, damp = meff*gamman*vnnr*rsqinv; ccel = kn*(radsum-r)*rinv - damp; + if (ccel < 0.0) ccel = 0.0; // relative velocities From 0be2cd3d432dcfd122651ab7ac68f3f4e24d1fac Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 30 May 2017 23:58:56 -0400 Subject: [PATCH 113/302] fix bug reported on lammps-users, when not using the first molecule template --- src/MC/fix_gcmc.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index e0a269b88c..fbe6b6bb62 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -501,7 +501,7 @@ void FixGCMC::init() if (ifix < 0) error->all(FLERR,"Fix gcmc rigid fix does not exist"); fixrigid = modify->fix[ifix]; int tmp; - if (onemols != (Molecule **) fixrigid->extract("onemol",tmp)) + if (&onemols[imol] != (Molecule **) fixrigid->extract("onemol",tmp)) error->all(FLERR, "Fix gcmc and fix rigid/small not using " "same molecule template ID"); @@ -516,7 +516,7 @@ void FixGCMC::init() if (ifix < 0) error->all(FLERR,"Fix gcmc shake fix does not exist"); fixshake = modify->fix[ifix]; int tmp; - if (onemols != (Molecule **) fixshake->extract("onemol",tmp)) + if (&onemols[imol] != (Molecule **) fixshake->extract("onemol",tmp)) error->all(FLERR,"Fix gcmc and fix shake not using " "same molecule template ID"); } @@ -1397,12 +1397,13 @@ void FixGCMC::attempt_molecule_insertion() // FixRigidSmall::set_molecule stores rigid body attributes // FixShake::set_molecule stores shake info for molecule - - if (rigidflag) - fixrigid->set_molecule(nlocalprev,maxtag_all,imol,com_coord,vnew,quat); - else if (shakeflag) - fixshake->set_molecule(nlocalprev,maxtag_all,imol,com_coord,vnew,quat); + for (int submol = 0; submol < nmol; ++submol) { + if (rigidflag) + fixrigid->set_molecule(nlocalprev,maxtag_all,submol,com_coord,vnew,quat); + else if (shakeflag) + fixshake->set_molecule(nlocalprev,maxtag_all,submol,com_coord,vnew,quat); + } atom->natoms += natoms_per_molecule; if (atom->natoms < 0) error->all(FLERR,"Too many total atoms"); @@ -2058,11 +2059,12 @@ void FixGCMC::attempt_molecule_insertion_full() // FixRigidSmall::set_molecule stores rigid body attributes // FixShake::set_molecule stores shake info for molecule - if (rigidflag) - fixrigid->set_molecule(nlocalprev,maxtag_all,imol,com_coord,vnew,quat); - else if (shakeflag) - fixshake->set_molecule(nlocalprev,maxtag_all,imol,com_coord,vnew,quat); - + for (int submol = 0; submol < nmol; ++submol) { + if (rigidflag) + fixrigid->set_molecule(nlocalprev,maxtag_all,submol,com_coord,vnew,quat); + else if (shakeflag) + fixshake->set_molecule(nlocalprev,maxtag_all,submol,com_coord,vnew,quat); + } atom->natoms += natoms_per_molecule; if (atom->natoms < 0) error->all(FLERR,"Too many total atoms"); From 85e917ae5200887365235d93b705fb1bb2f1a164 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 31 May 2017 00:38:44 -0400 Subject: [PATCH 114/302] integrate compute cnp/atom contributed by Paulo Branicio (USC) --- doc/src/Eqs/cnp_cutoff.jpg | Bin 0 -> 13431 bytes doc/src/Eqs/cnp_cutoff.tex | 14 ++ doc/src/Eqs/cnp_cutoff2.jpg | Bin 0 -> 2518 bytes doc/src/Eqs/cnp_cutoff2.tex | 12 ++ doc/src/Eqs/cnp_eq.jpg | Bin 0 -> 23959 bytes doc/src/Eqs/cnp_eq.tex | 9 + doc/src/Section_commands.txt | 1 + doc/src/compute_cna_atom.txt | 4 +- doc/src/compute_cnp_atom.txt | 111 ++++++++++ doc/src/computes.txt | 1 + doc/src/lammps.book | 1 + src/.gitignore | 4 +- src/USER-MISC/README | 1 + src/USER-MISC/compute_cnp_atom.cpp | 311 +++++++++++++++++++++++++++++ src/USER-MISC/compute_cnp_atom.h | 92 +++++++++ 15 files changed, 557 insertions(+), 4 deletions(-) create mode 100644 doc/src/Eqs/cnp_cutoff.jpg create mode 100644 doc/src/Eqs/cnp_cutoff.tex create mode 100644 doc/src/Eqs/cnp_cutoff2.jpg create mode 100644 doc/src/Eqs/cnp_cutoff2.tex create mode 100644 doc/src/Eqs/cnp_eq.jpg create mode 100644 doc/src/Eqs/cnp_eq.tex create mode 100644 doc/src/compute_cnp_atom.txt create mode 100644 src/USER-MISC/compute_cnp_atom.cpp create mode 100644 src/USER-MISC/compute_cnp_atom.h diff --git a/doc/src/Eqs/cnp_cutoff.jpg b/doc/src/Eqs/cnp_cutoff.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fae5c6b636c0f818f8677fd7fce4f402cb03a95d GIT binary patch literal 13431 zcmcI~2T)Vr)^F%ddQm}oB2xX+mEJ>ww9pAnIzm8@-UOs85JCr~_a+1g9h6=L=@6PU z=~bG5JnsG8z2En~`M;SrZ{9nZIkPh7oW0iGtL*h#d)?05E(55bDi9R_4h{}L_3j6_ z#R3!o1bF!P_;>_&Hv$3zLZW-bM0Xb@85zkvYDyX!YD#KqT82mWY3Ug0si_~ZKVW2L zW@Tliz0U#UU;#d2VP(1f0w5y>?BgWi;7|i@y8w>>H~_pm7I#ekb=?h%kB5sxeD_p` z3V?%$kAsVcM@&eFPfQ5_+|l>|0zzsUB6eCqd14N2I(h~LgO{$s_c?_UlO}{=mToy? z!1&y1kRB=_58d%yMD&@izLmR&XGn5Q?bq?!IRNoLc*z3(3>I)hVTu1|w+o-CR2vtm z6-I~JBz{LN5~$oPFpFLLff<;Ir@HVQm#@%5X1hz=Tvc-*od^=Z=|^ntmT3%Rt#R!N*lv(w@rlAZ^=#6Juq2v%Dp+!_sunUOgSC9e< zAd>j3+UB)?E1wUClE;7>532)=Q9*xI-lBp;TMHU_0!S>vlnKlA#&KCD5!+U?E+Xr+RBc) zb85MJ=@Qx5lDNTgINOdQ)%Ae`2%0xsO<@5&d$gt|@BQt|<<$5U7}YdNV4MvV4T%>; zuK+}V(MeCE@`R__FPg>SLh!`bm7tlZ8i|-|u~a4JT2ffz=jVLFkA+b>UUdzCBAp)0fcF&5otl*XM!Y zzt%{N@V!U_xW-yf$OyJqk(RIO{D)7NF|dV(&eXX$V5mcqP-3jqs3%yU)8aD!RYJUw z(OFg3H=&@x{aM@Qqzg`nr&!3#6w#T_J!>?Y0eF>@=(~lu6FT1AGK~dqlCWK$?>rG( zsYWFCHTl^yy-fvO8kHM$gvkG5I0mcH#0tsTxilnFFvxY#zT>m4Mdg6O8m8glva;{H z3|Ak@{5;PQP&scAM!DBg`5_D}G`I;h*vJ(WO1<*&%NVFPW_TealcFIakuKRp&3ueb zLQbJ0z&oMx>R9x^x^H(nWum*uE_&19X=p_OMt>{{r^^j5orGvnqjzaux9-l>l8#Se z&|?c8U6?r<-MZpUAjMk3ChvnUC-<}iN1vbc_w$3&4$Fr+yw>dx*BXL>+~j4x#=)+D zP*lJVxH?SY+)rQfyHm&h+=aw&u7Z*NX?J&a4$&W2*c-oR#?)4uGW0GA-n4d>3gd_H z{v(4wW5ebXxF}dQF{cu%aaYZ+nsJ#XE2AOXjQ4SC!+FfDp+FEOQ*~ZEwx#90^%;rk zHP6AgnfO)Aw5%&IcUuV#F(_z7WzY4_Zx6;EO!7Ff&VDv4KPBuR$I=QrkD)rpnGZSk zBFu1%XN^%~y6Di@pNh+p&Lyp&Z6Zy(HGU&kvU2Rr+3xRkGrIwdYV2y1nwku|PD~Cv zw-%xnli3e#rs$gLzl#p#gL8$W8A~-&4%DjaKj3A8I%K5pnuHa?r|21~$y)t_fqtwbV!r>U1e(1M0eErF89clwnE3s2Njg~i- zCz)Nm1(a6s`)qKz_70zBOz3AvJyqKH-3bqsJi<7Jf#fI&+{qB>t#vUOMf* zL+CAFxPIp}*CfB8BERmjgX?PFWqz1+u77V)Qov8ck1cUz7{k2=V>V%gAd`;Ur&wlP zpwvKSIQzOIW2nEy)9Q6(~c%+XE5dq=_oi z8+!Y3!otwwgvTP*1pUZyZZ5foDx~I5lUsnKar^2s^OLPxKwE2`dIZRZx}eub&MADJ zlr2#2;Lf7nUpcE?KCMyFN=zb-hp*;L>dMpQxW4zw}#gS=g0Er zdtNo`*2#GgQKRh)6X(r2VvF|1as8EYOmsd-pBu5gy65gK!^EpgbdBzmcgBM+ofWeawxH$j{;S&6ICS`CC;y`0KNFT)+> znbznesn4f}qt_Wvtb@HHR{Yc5ZP#j6xS|{Q*&#E(BslAAry7Sh0s;oh#YG?!%6!3#)@9;E7GRNRh)o*bF`Qd= zLM>8T^>@yf_*piRO7w!Wr%cvRGn{SsBS$N9{|5!Gb<#){@PHIQm5;Z{b)<|h+ji;2 zhH|8h&QVzr)JD<0@yT=dOHw?0C0TO+1a8JhdLwawoRQ>#fYEhjo75g@zwKCMnV*Rp z$&K0x4@qO4Heu(MX7f-vD`nu} zSRK}b{Y}4>b%1@drOw9y{TF6*1~#29>l#WDfMNVqD@+7x4&2=_D=)(Ndftr?+)2Q#E3jWa-c-jqU@x)M%CIpbjj9Lt%n{-VL8SU5}eih_`#mN?}6Q689$FO5ToAoRmuA~`L~X3Q!*hoac1Wy_ObXf<54S~ zl-BQRV}H+x-U4zOS?7A}t}2Qy8EcH#A@y^!5dwQ+`zQX5FH*x{I~m%XNE>3Xg&d>m zF5#J{hWOrC67MYf8irD^R^nmvp-g0Zdqs~nBo^cKA+qRk`BPl5PnQu^vFR!>j-Y(r z`=QU?Mx(v}*E<4P>jijMo7uGkR?-g)UwiBLFl!%^wdU|kob$?X=oa8ndkf&y{4e61 z2S+XCX~ePb7p~VZI!si!F2*>Kx8TewM6(yjbM+m;G~z5NeKC57dFSJLy4s(YoG+D- zq17&9fj=7ZcaB6gHw&e`-sTyq4ci&fSwD}HgBdwQ5|F=RM$@2*yNy{Ct+S#;i_u|X z15EHT4~Qy3cW}QorEoUk$UNX~m*L+?tNBstF(D?CVWcsUEmZ)_I>evK(Q5pGN7#;X zCqQf70vz|9GDTDDgXW^Z!&1U9}kD0>{Ku61%pvAGdh8%9dX1J~#EHR*S z=^N&EF1%(jb@hnW){3td{6deLpst@l-XzL^|D0zHA{)4!@ywm)#rdL(&?~y<8uxAC z?B>jt_X-lwCND{erP`_h1UD9?vlSy<2`+Ju@nW7+PoXdjQw`i`9Ee7%XobGfJ2}t6 zJ@E+-=pz-dQ=JKWapvF)cLB+4f2gi@dxXffvd=QP&6p$*RWm-MBxLW^~*SVSUs#8_4oshU!pU_V!1^!1hm zP6Pi?34|?(h2zZtmQ1n7+c^(0iKYvV z!wieVwWD1Dx5-gcd2!l~2@dejWB^Iz{u>p?hq2F=_-xkm0 z&mOJ!_bdzYpVl)<#@zyn_Hvjt*a0ZyJGT5CdE>=6Mzp0iTTdAGU;xI1uwdBNxGT5P zxuV-mCmj}zB#}mWCk7GGZIY(_GdnIlfK{HWQIL5w8}YvpNFm`B;(W4NtR3t5HSA51ac{%$!E7}$-0Mq^L%-^!jq@$cyTf6zQ&zl`U7oRJs zKW+rBTW|G}wYxVUgae{xipMUG4>!I2O8;idWWuEBW%N7~TdsOKQ>U4+&J&sT7$a_7 zaFQ%=n|X(&QMn&+_TF9PK8>!yeFmwz1`^|UdnLTE@mVRH6%oiRr?%GUV>=X&|S}?=?!rTT7*2)|dJH<+8RuvDD z5_op0p0`n;Hm_@|je!@gT%DeeF3QzDY_6<66=MjC3x@0}zs_UqrGD7Z*Sp94vZyN= zONAv-{9^x%u$Fkvl$aRxkb3( z66~yux%c3E4m*fDb{wK;!MuwfT)~`mI=#Z5Jhi7V_TFC!`_7Cw@}a6-cwJ|B!_jnM zoe6`K=ELd%p*;pB_lGR3q0F`tu>8F0WeN=Kj9*^;%ei)!nL^<}B+#r}4Ertz2i-_L zhR(-pBb_- z@>nq)$+g}#XI3DA*NYbfjxQyD=hZKmitmsoUk|FAAzZl%l1}V;?Vr?EIHDl?2^BFh zoqppBPTrV4JBiBSNF8Hiwu13X2Vq zI{{wvKJQzuNqS+&-9Kj3B{=4+W%-0f#|#0C(uh+T6@!DPxKM4y6&$%WOu|MioZh{Q zT51N*C_9ZfEr^(4B)0&@Z_-HT%6VTR%Lr}|ZTYtEG=Huq94=78&UNsk^TwkRmVI1S zz8Uj)!7_HJc|JcYL2NtHA%4xwJ@!ZKHIWB1&l!zEBr;O1jM~L^4ycbEh%V!y zmIBmRcxaS zHEa`*#+s-={UB<=_Exa{o2$C&v0|TIaFa{M68Qm74`Y)FnS;I5Zb}3lS3eub0%tz6 zb0}fsl|j)AA#0FA5*a00*uhdKczP83-dq$X8)6)FTqgYw&>Ulf2#`LDuQJRS$M{pn zWeR|YANzeNazc*I1!;w0TT&xEb@$`zPb6GOX=vri|<4dP*rEZP3&`hEU6 zOLJ6)lR|@6&-*b&hXG5_Hjo6eI8?btWp+cgcM}W1V+~CP5g%nAxu&7JJI-B^jptFn zrw0n2U%kTnP6A-({sjeBZe#Bd@4s#G-;@Cg2sSC=$T>@5&j&e+Fp!QW(c>4#{Y3(; z4e-tizQbSte)aFD3*?|1XG3Rp^1Qr4kT&Eyqjaz9rM}MCj%nM-bY(#&M#))NR(zHL z7Q6uEPN{p6xvhQiDSgV}Z)JfcUHn)HV}WP{OBx`rhIN``Q$7oIBL-ija;V9dYRJSupEA)obw#gg2DAxIcp_7*X<5$yFPKUkp*o( z5e+44*nMhHNtmnqU&s1z=__7v^{)RP!ltb|DL$usL?kEgRDv+0sDcWxJewCVOWv@D zDAn@)S@1}v2E>7HB+S;9ww)Io0qP=QS4F_bCdeZ3fe8nsbB@XU9dspQKfnP3?f0@( zq4Ml?Puxhj2JZsUfdw}(=7~#b!{>8DG2TZz!^6u%Pxu5B_gPCrLo{73`E;!~hzuB24hc`QX_&IeIrj7t8Y+GYDB*EhWJZ1ya|X2XDxUQe;8T*O{`8HMZ&MdgG1 z)jsp*KW$Q&UhrirTO2*Q!00U{xnhjCl;K)TAt?(l`}RQjPfGZ53XY~4Y5SjiXM7Y# zMSx0LfBeF}k1T<`5T+6A`jRc{TjL+ky0<;A+kf7bZUX#NGAN(}oNBShL9^rybaK~a zi-`paKU2=CO&(vOT7qhgm!Ciw z2mB;CW-`*gz{!@xF@1(ndpTesEz8o>)2M8z7H{Ga<_0x&+HzQ0I6D3(&@&ynux>2K zyQc~2jMVmN!MOrqrUG9Kw6`5YPq$OIiO^*SAk5-ZY2|wCJ_BLpgV*)XR`;KCvsXV& zB~kmpx)p(gwTgxScaJ93@Zo2a_SX?a)e^@?+Hr#Jp6o_&{n;|_Y>}y3KpqrJ;7`;< zJcEnjsaQYv!OXuSkDzx@6Nit-gK&}142H|NAj+JLLA$pAaD@?X<~rSQ$gb`{JY56e zD6bgQb-rXNKmEJx*(RyUD|2njN|Sy_T$-vw-5{!do|u}${*4ir;;4&apJ$2F>AK+? zCryr*Ch!aq!+jE>-zu5ViGjGToV9$)Adit4}>Eg$rR=*YGdtSI1E`4$OZGf=8Tocbe?JU%MyyM{`?Cix#9RVt? zLh>IZ291tM(zvVgTZ>7I%zWRw)X(#goBZ{|*|m4x4W?*m{ufQk1KDv3JWMYg z3NpJ|noL~3%kuq_g3{7seI<{@a&uP!jj5>7Kaz8(xCN*rVMs41-Knbx0)L4%NULuR z&UWAA38?>Z@9uH0knhvR1~{R^>1WWei&F8Y^yRM=+dFaK!>e#jkIZo-3(`i` z1zC({PVGo}C_un@rhqij#+$V8ac&lLPBv!uco-#C{$4Pip=;TsJ=uIsYJ7|o7de7k z@dU&}rhny>?REZT+L@LUz9L{!?=PmEtq}!80aWoCwSfS_ejv{LglP?ToqD@KM;-_B zq~IS|Dk@FK(e=}j09%%a1r5#$1j1?I1rk0#?Zz~- z_rs8VJ`~->VXlBJnfiyStyL?PJ8)6(e6MdBrdAsKOXfGDOvc)kMx(P0D*X z9^zaX@1krEKQ)2YJ)NZogv4$EKUPE!Q2rAD`aJihC2ldF=k!y;@%xu#w}59*hY@US z2r~JBEG|}_gw6Bk(2bROtLnG%27mkSKh1WNu`yptsM#HSOhzY(Aa}ahO zBJ<5^@YPq=_!0q3fu?bFYK)i9HF``-e1j=5BIQq~nrup^ZHwFSFt*(LG+jhBet!z9 zTlU_-VARA-QiK0q1%|o`Rp+@@K!6`aL_1RVChtCe^<-cnIN|x$H)y+Z?BEU*$4H4~ zT^@&fZ<${bZ&)_wm603YPOohMn+K-CLDeLwq3sC?G^BO)#;o%#^<3$>S?;gGJw!aB zas9!s8JHG4AYuVJx}urNcE(XQ`Usqx==TM1A@1)*Q!YlW7}@YPu^;XH)W$#09oj9W|1} zKYH}WV@EG+xXfu`i^Hg;#$T4b{;AoGDQ`H|L2vJ~2J{kN6A5tct1<^ox}Og3_*TtK z!D9+R-V&+^u(L4E+AFcMIcRLB7rNun-k<&5*O zISZLR`5u2+G!2p>(ng7Z8$2(4z2ov9ndqCLccfPFAJZtL!n*x>V~gNqe2v|ZjSz5C zC6Ct3K>_uSHnXbo&9^LT@|7ZkNw_(~>Y$PgTuMaKqGAWW*XmNIWXaItnq;+WyzAwj zAtL@Tj^l+_9tgRjGgKkqdi2OhZZ61(C?4o0RXOnwmPw}DdW%~xzdF}Df+}sselUNk zW@KU!9stQpD!w(zr>T@_@tCWLtsQRu^|NUAl%>?gaxrsqax*<~m*UceFHc_cQ= zi`Pek6ywp)tDN%odVUs#_Saz>EpzXGuO*7{#-Se-g*&iB+wC!LV_)oT?aA!Z9kD* z12$6#?@QOdoUWa9;YUvOD?xroh=K-WV6}%?6#h5U^0W6%#_DsEgv$>>>QUOGoAR7W zv2vT+@w-#rCyW^^lLTomsyIcCIdgawIs0pi$wS{-dsc44l5k#kydDglwjJqmqFI-! z)M&Y>ORBJ2(bYk}WlRvuFsk+chNv2@?>GzuFLQl8Jgs~r+8eh}VZgjf-+dq;vbV%k zGp|4RvM`B<%sG+G2Lyshu)hA>%pw|V_|XH)95U$$&jxiXhGRh%KDaQ#?m(03kG|{t zZu<;|G+D2K67`1A_c>e+WHaX-ny!Psza}9qE8iaU7o7t-e(Wa|u z43{y<`9hCiQcA2MC=^9p{K35Earr)FO|QyJbxS7`1}2wYSAp90L>ccAE{o02W|nml z|3$>V8$Pl07NF(U@WA#d$E9?=HC+i`cVr(Hy~cOs5Z+rll?%A=$^0_CNXEn-7bntE z>IO0cR=|J-`9VXLHC3I)Oi$#-6q3*t^sLe(b9bzGScUpHS07x}`%qgCt?clLGK#a( zpPPA*i_JYR;hsybja{So<3aLkkn@V`uJG@BSNNCKEHq-Bm9e{;EV|qd5bFEWeb8l?*=9O#5@{@W(gn1zHyEKXP8Cc{1_aCjKU2<87<)+svYIzPQ~i;hXL8>r$ldISqJ)AKTH0%!-w`CU&nS7&$jjqdevFIC|78ObEQ^FKFpO@|60S`D-VT6n?Uq0 zLbBsK7snZmnGpiDwH0JI5ST_s@G;vp@AiLN!Zx79gV@z>3O=!r+~hIc0(%!ZO5t-o z9m;QveJA(cJyK6zMR*RfFb$e~2~7!&dr+hb0kILbVdCDhS7dnbGDjab1@AF~cw`>S zj!)4fkDszM^+D$T5Op{@OsDI%{+{aohl%l|WF^S{)lq#Y58bC&0OtR$q0j5R(QJP3 zM-S1U7K2N6QrHsC2}WqNY=1+A0-X}h0X*$vyR9D&$YK(DgRTj!`x3{UWZoJk*0A@; zYmJV@Mf4SIAHXGMYo>YYAE=wI&Y2(+zo9zO5AE8fuuz1+6JPuL8LZbGO{Ltg(o)0kac|Nb-}9Ilv3Ni4UW{gp@Vel~ zxA1$tkSKW+i+ zg6f{8wqKjpEN8AahvhKOB5Vp=K%gz=WUMu7X%Otk1!`t?tXuCU1qk-a8#P9pC9gP( zE94hgAjx|)qUf{DpZ>KwT)T#G7Kk7rq1qc6utmnkKj~2^r7DWgd}DT=0q<1?nTPANUdsfE~M)?tmO%f^YExH<@nTw1pcTo zf9T0?F=)~A4v9^WkTOE3+mO22FQ3@in~lj!%Bn$$Tv%R8|x}4BD(Aoi_5?v z{&t45fXq2S=ABoCa5t{Fn)_OMG2Z zT>runE8#Ito=iIQv>eRb(trZOksW?_VePkk!JCCRK^=ZQ~!{(c^@a_q-Y9U@qgpGyUW}#4!eHz zlfj(IatzwQkCIf{1qmfq>plD{g{-{aA+_U*NGOVTAjix%jxWkP=bARlz%>{Le%@u1 z`s)lFO;AUtJsW`qDIcRZFf~coJRnb>SWUi5)PxVA)eSS_^&0Mt> zkzqsNAP1YEAx+FqEV7#@4k9XHGq{^g!LN5W0^RO?iJy3`d{RVMcSMpd?(v?y3|CjP zHoR$5qj{{-<0Q_T{!8b0V{Fbu5^(%ltd5+^_gv!_k&B?#ncvr^%+j4{y`QOEPo=*4 zm_NfV7`fg8s85@_9dsb0n$mdvW{Oo6Vx{%ZXdi8FNWW3CqbHRP-|qa3v!BxoginMf z9BDap$Tqy1)Z5Pm58AAtEq@3hTwN#<3n=HwGHLCXTHfkEr+2LS&bWAvZDnGtIxVQ* z({Jvo{G`yE2eIkJ)__x^9x=Us-c8V*cr~C(IHD8x2}`m;CqJ)Bs z?sYjX%pwac7H7#WE3xA(1= zm0~58f~*toJK=Q&Y4~-fa1b$bX)l-u$Ily8t?mye@rz3inJ4m)r*$hwcamO$Bln|6 zT2|Hbn#PFDk^7|$tEt7osJm$Sabn)Zi_kc_2sIKqPK}*aQ)eqt=3Xn{+fz#7T?Q~1 z>joSnI%xSTmu!7E>v*AxE|?{p&qDetw*a1~%d5w?fKi9`F3z`^`FvhXwbS#;oh*S< zp+ydGl<}MRrDS9-_$O?lcqoCr%1TRHlCurY_x+K(P{hwcCC>>o2{EY=pbVltof&+g z_x4xy*hp=Q@Wrmn$z*!JXPr5}(*j@0v%3SEFF|gA#7W6@AB??F1@g6 z(@bZMeOh4-0`25vj3=zzPPc#-(iuSv@|z^WCjSW05Ch^|#s%Ou?+9-i{1M;wx&<)x z-vW*}^xwN?P%MzlPLsI)=(cwAIG-oS1RwE82VFY~Z7+I+Lc3pzG70vY8@n-ahVjqO zY7;Au@g!Fe_<*>1xJGd`lT0maFHAeEw6bkxt{XLZ-@mAFvvD+TBT?1wzvc<7xpIL$ z$eJcGm3YO78fVZmp%yevVDD;UbS3`9PGoTluzwO@oVBg@V}}qYpt&2O+c0XXtBaRg zKcMQsdBDrf`pI)e%+qxqHf|C3nGj2o8p$~!7KD7;k@NFZyl|9D^_^s~VWN@iC!MEN zryCNF92_KIbg0$>xe#LMuk=5D8*bUnnLWJr6u;d1|4eWHG$g8TJp4^q0>SH!^NQS2 zy3xbUX+Ncf-{_-vCNA!0sH3HPsDG#{MSvDMRduNFAQ08pC30L@95`d`)-hgdscp#{ zF4ohJGKYDT+Z@kGHeKjchJ5rG^mo<;`&-5{Ls(U!4)x?6E8U$662^EbzU zcCec8=ah3ZI}MO^rvtIASRWT$(Z6ov`R3+C_fIbBII^coHEnb0s(&6lF5N@0OZ4W6=Bc)W=x@qp*cTaLiMti(}PQ*iJ+weO8 zurfwJ)h5I__7 z!+=zuYswSb>w7Y0(pXzi2pmqbNR%5jLM_f}UN383^_TVPoJyE+$CAgpwN>q8`-)QW z7;)|MzN}?Eh*O`u(B2V13T}KxOH&=;V|P^UyiYk}Mo6{}wZd16=jVH2YwEfXaWw{L-!umO9Tr?iLQa z#xR(6kWsDY>MF~G5i)FNz}#0zHFuJUXNe%k(|-7brg795v*g`+8tI>(NJx#A(ntW5 zeFm-n%ys2F7`{H`?%4Mvz8^NbHsr)k3;W{NF%~R|P$CGyfj}hK(!T{1=M1#CZ%l^5 zKkBxi58T2t;G1$3f2|7S^xA9&c4&o`y<)^mWy!@Dj|AK`-nY3kiPYyvrJSgZ%uTiF=CT>&(`|T*Nk)a;0%{WsUfpG1R*N%Q=6<=tF0X@yt7pGI zrS{k?G}Gj4S7%p~O)}!A&0Aa0fBz;Dy(VcU5-}&St0(;>`)vy~RUpnt+vhtC=w0oF zlQoLg2zVHX4%hy5#aI1s{Od&P7v79OHO>&+5Bx-2LKy}|OvKM3xwuSr0q`of`h zPhHP+aMQ`wMdN%P{84}=a=HWxt8#G+_1|;dvgJrPFgbZLQcfvLf>ewc=_B&Gq*$p> z|5vj3KcPZw|9&*u>ZGy)TVygH-S0~EL&U`A)R&!vC4bYOC~cRQzUGv0Gfmi8{Z~qf z_WFATeIxO_WU)*j$fk3}U& zcV)*#*%QR=-%MiuBclF?Mc+;0Zf&i7-f`mWcr;6EZtohYsn0$g{QY47atlyEeh!k< z0cLih0!1tTp#w8*PL(KT!4>c;N$w?vIXS4xw{Jmv8<2k;bmyXXZffXz1fJ9XIP4wCxR#ts?I+O!XFkw@tiHjPFJNH5luX?Bvs|ezx{L4>?t6 zr9OLP9xI!tg9UhJdulT$f(7Plx$bQ2UlZ1o`b;06u+C7hU@cVcHly>GoW`YEdJ-$S e#@TfEV#rwhl^R=S9~0)^AN=R1e@B_$&i)UDCAvod literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/cnp_cutoff.tex b/doc/src/Eqs/cnp_cutoff.tex new file mode 100644 index 0000000000..f74166e608 --- /dev/null +++ b/doc/src/Eqs/cnp_cutoff.tex @@ -0,0 +1,14 @@ +\documentclass[12pt,article]{article} + +\usepackage{indentfirst} +\usepackage{amsmath} + +\begin{document} + +\begin{eqnarray*} + r_{c}^{fcc} & = & \frac{1}{2} \left(\frac{\sqrt{2}}{2} + 1\right) \mathrm{a} \simeq 0.8536 \:\mathrm{a} \\ + r_{c}^{bcc} & = & \frac{1}{2}(\sqrt{2} + 1) \mathrm{a} \simeq 1.207 \:\mathrm{a} \\ + r_{c}^{hcp} & = & \frac{1}{2}\left(1+\sqrt{\frac{4+2x^{2}}{3}}\right) \mathrm{a} +\end{eqnarray*} + +\end{document} diff --git a/doc/src/Eqs/cnp_cutoff2.jpg b/doc/src/Eqs/cnp_cutoff2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..744b61e9b45fd5401a745ab968d9faa607a88b19 GIT binary patch literal 2518 zcmbW3XE@sn8^-@+=^HDwc7i5Oj#{;fQcg=#qpGyE6^)hJt43;cSv7(~QR7hKXzd!u zsx4xc5VNSLy{Vwe(J$}E_rv?Uuj~2nJok0qU!T*l(^-I17pH>*n3$LV?K1(VlYk}w z0fE6_5aet?AP^{wl?8SN2ONHm6~V#9h2TISxOs$lxz7t+Kp^-;`2>(iVPRoz-iw%v zD2xzF7zbPwMc(6)&bz!u)yeO$^b@mGjlO9F%M%l?y399#EaoO{#ZD7)5W>*cd^e_Go$ zDzVy>A}pek8}n*iOUrPIp*+VYlAtKp=SG=$?ahIIl>S=+qJGW}VG*ows+L>wom)wO>zeFyiS05-&kr@IZ?=j} zrn_x#JQyzd+bhVk2r&jj}rjegsDF=2d0_hgy!Dzko@3%{G~& zdr;i)($rwI#5B_#XzeR%f5o2gIpa;oUSkmL`oF*yG zc+LnSPbSV6UcmNN_&3DOl|~Oz?8HY3J1$@Gy1Cm+Q(AFVzR^jHd&4rZ$WbOfoRYgz zD*g4cMmnjIpVxu1@bOn1QxM(~gM%WKe&g$8^b*Vrt`(dw-ij{<#`Ccq* zw6)X`Vd^QjW2>s=v8JhhHKjC#yuZg0I;WUZqJtWv`^0%T zo1gR4`0MVzuV4)2NkjR(QxilTU>oz^f}E3{jD$1Zn4xh~+v%V)dcs+9nB9X(0M>k<$AT#N(t+obf#V%ZKgg4tjt ztP6zNX=D4F5{{vKnS?9|%R=LcBczD;?j0sFh2%g*itLtkiG08%XrAsP!_~%*^+Vnh zGZ~5{0UHO%CRK~W&_ePl0I$_;uuAf-DnGXUe(9%rL6l8b(8W!+w&p?XW=@XEbT3&u z(Eg<>+0OG|e9KrxaxLTo-}^4|i3#%))*L0(dFb;+C#ScWO&8m(8zC;1+u!V^uWjZp zba$_hE)ZL&ep}EVvB%6z=*g7M(QfLIo{?p&`t15ht(4&HEZnNnrxFx61)Y_=dV@n+ z%`AsPGW@O7l8%(S<)$f?rMkI)@MFs*@G+qo0p1ZH3e!E|aJ77;1Yhp=LRD{8b-cyW zTy@I=Ukoce#*NLT79AoQ8c4o5AxSj_0W*24;l@SZ`1dkKW$!N=32==`J)700t@-gX zIQ+=Yxc(IFAHCb@#5Bhp70G>T@n-okRWABAqdc{zTR6U(`^uSH1L{s&8x&_Z+$s#Hp>L^s#_3GpXoa{c;Bf;mq!0u^4c0MLqsxQ25pO zteOF`^Ya3zUU^NTdu zB7EjD#*=Cex{lrOVGqUbJ#d7qytz}d6Q&>CH$JaMRdx7JDRG-;*6wcLi@M)4F#0Z@ zxFN<;Mq`_!U1+I_>QALW`|P7@d2RTR?wp0?STDEi(I$uWTMoHogJ6s8ulzrylG{Ir z;cPWh_8BOK2JKos2OBbHD_1hg177lq)_CQplT#D^ePbP*0A&;>-Sx5B@(^lLp+Bvd zQl7kWsMydUVLXo@2UmrX71xNBsQsm?SuXQGW}frb7rXKv-7;EG5;_pS*GDf-8RvDk zH+9EZ$vC0-$Ea9x*x}Vd%TI+~Ckp)~d-=qi2Xj9H1CKYOKphXo|}}Vy6Ll46LTCl{AJ=Mu1#+em>eCDBqF(ubaZm5=9f+=f}CQJdh(qbPbJtv*pMY$SnT z&%XCEd}5>XV{JQ9A^F9kjYpkX*THcRYyoOXQ&*n~v+pP^qy2Mk&D2Nz+zbPje6mS> z9CQ#!!Ef%Fgx}O%C(0SM41OTQcL^>1X7Atj&L3qy8+?7I;O~gnEVfZR$(r0~0*2HX zdL`K4Rho>{ny*B)(|DCtMPFR{*n4_ohiK$BFUMkqnczvfNg=|3fYnzJo^Ox4?<4I{{>T2w#fhh literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/cnp_cutoff2.tex b/doc/src/Eqs/cnp_cutoff2.tex new file mode 100644 index 0000000000..fcec31fd24 --- /dev/null +++ b/doc/src/Eqs/cnp_cutoff2.tex @@ -0,0 +1,12 @@ +\documentclass[12pt,article]{article} + +\usepackage{indentfirst} +\usepackage{amsmath} + +\begin{document} + +$$ + Rc + Rs > 2*{\rm cutoff} +$$ + +\end{document} diff --git a/doc/src/Eqs/cnp_eq.jpg b/doc/src/Eqs/cnp_eq.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d4213144424331690936b0fd96014ba8ea8eaca0 GIT binary patch literal 23959 zcmeIacUV)|*C>1tJ1RCnMF9~+h0uG8f`EV!r57OsA%q?vAcmG1dqV^S1eB=sCL&D` z%vcbqp(CI$3P~sengDuYNbU}nnfbl*-upiH`My8C=bOWG&Teb(z1BKwuf5kgEAU?P z-mN=ka>~~mf~>5d0}uqQhSmu{kRZqjEMEg20^jlw4D!pC^2eZ{)tX{Wf&ALrOYlSw62(McwEV6CO7LhGmwryIsbbU|075?)n zuwF=L{f6}$H*DCrb;E`YTltR-TfcSL^gkJZ_dB#{H6#b!5fqSymTeLc+$6wz3y56H zdm(@XSgsIQx&XrbOAtuT@)avrtzNTMNZ>yk1)ybuKN>dznG+CPwtU%&RV!Do5L~AQ z8aD|p-@RF7#i8RKTcksNQ(d_=;cl7H9vKmvr=Du+p{F~ISIH*Yeth={L(mYt_wdZ# z!%22tCeO0MG{w5?-(#8OXPQGG zccG^fjcr9R1ocm{EBOel+N<%b3m}mt=4E298HRoT6NUdC1Gzs@;0;3S1efOA1R|6r+!)Q@6uU$6(c_FzoS?)lbGd!s3 zbz*uwPEt!QcgS?b`CA#9l_`}&Lb7ces!#UwAXRD?oAjPhdq4xgxWa}o|&<@*WRU(-K;cW5OlvNBPkVkupN=LKN%f} zc=qT+;nm+m$c~ea({s%2c$VY9R3th3{<&&=Z=KnL%9Q2h{u?g6AV7E?Rn6%0~PCrFLkQkPK&CIf4x1h!p-AK zaY3Axqr2_Ghxvh-tUe6#$V*2Oi=1_c-TzxJE7CP+ynn#qr2M(oyH&cmUg{*h3xvsV z{Gu8%y*wrg!GnYxS(o-FyD8}j%xbrn%%N{DT)Eko-r^$?8CaNG*8UbFX{yvQSC8)+ zz_Y64V|EXm#0J z^QQKJUoP|!LZ44Q@C`C3IcZkajGpE}PmvjpktEaRiJIA};tyAg^#)BI!6~()t}h}T zJY7E37jr|ZdohbVD2r6Umb8A6=PVo7SFZXpNXhE?S4*WQkMW|Ioxz&66aD^5Ut=Ps zgE++`RA*@{5Bj1`Dym-0%5lV(p0tchT{Vy}aYb+_u=1_#lQ!+IK9%vglta|K?$SBb zT$gQj;t{lO)-)13Y!H)qzx}J6HxFVZ+Snz>-o4qnbKTYcYJ!Si40ZFW$~aBr8ysSAItdH8K)jQrD9zRFAowJ|UF)&ItRFJRxw z-*aFLI5$)u7#exx?LYMiR&&@5xQe;y0M(2YJu%Xyue#k zT`i35Q+?W4x^7$e>;t{|NN#*r(B~&3Us0Bbrt0q8425It>aN*|T|z>+V<$op4aF*b zTcrFE1=j}KdXJ5C*nhx{PuWH0nNCK8r!X+{DITvEBDHT&BpzGt5TEqYJQH|kBr0uk zOsAL|R7mQ`C7G}XDw5_ix_x?T9@(v5#qo%;vCW!4*JdDC2pvMasM9_rY0j{Zijptt zi8{0GY}dDYeBm5cYn+>?Hl(+a9DAYugB;U=c4r2TNos9X!!-P-fZa`c*Y?9mt2h zRPIam5D%hm<3X=?keEKV_uTUu4L75Q8y0g*(wj}}DnDSQ)89-l)ZBax7UbLObbEG$ zTF;_z-lR-!s>4K#Z9Z=PYT>8SdwpTum%5aK4wi;@$1K!Pyk7+-Yfe3R%Hctajf;C< zz;2duLfhV{o-zJZ>y~od@<@J$!OcgNi)6_;5q8zgTr4$#O&(vgBKsEMY!WR9x+|^H zwu!qlc~JS|5AWJT!n-Yz2Eo#&5mBY@MnJqGXRa5mtP0FCX&%pdMMXp!#OVEJC=Ply#2mpf!H~ zt3j2c*%y~5oz=gYXwk#ZySWDXw0R7E+$s0r)Se5`4tE6ZKvL_WwF-r~Iy0CZ{VvlB z8zIGDfB#_~G!l{L77nPsw4c{GZKHx+>8kHnFCL7~}iwOw6gdQ8%}CQh}Rw?eilIBAR~lF`8O?8^wnB~()3(pNeBG{`bLA+K8gz$B@?B)SI-l)^5zofyA4uis~>^|j!EtMiK4i1BHE z|F_f`sYOhd=9IFvO7U7m%+vT&CH+qFF(Q9-!T7wu9xp7~-I#QJApuBNCAX&aeaE$5%+AxLpa7K1HycR zmWBlFYnGsmt(+~taZHat#xewW{K=Kgf8h!$ILsFxL;&q#d`RQqu%I7=0!Da-{w&zw z2v$D}#-TyRe-?tm{wy5z3?Te$vBrg+{8=yw3^@F=0C@f9&_)=4+;>JSkq1FGW=6&U z8@_P~*?37wdEvu7590se7nd%x(4hZPXB6;X;fzAP?CgWWO!wFX@ZbN>%P7E0>YwUu z2mxVB^~X*H9JKifzV;**6NV2x>=EX{r(g-mW4L34ACkk*^MOIiM;khd_5L=@e@tr! z?9P9h))o`+t^Qaj=Abiwgr#dECKMm+=z|3>7f7*h5bg*2Ht-v408U2uurPdJ06qx! zz00~EEqoOIQosI3y^Sx<=dTSyKNVIyp-ShWBzYg{P`3d|Blh>CAjZvV%b5kM!@~OO@g0Wvc$iw zp&k69;34q%HWR-H@vVG;ERe1Q3*8#5Uj(QL0p;%^%m?{-{iSZH&yt?`*$Og$0r*+{ z=YoZT!UOoahpz`$dg8-_ya@lXUNB)QplwNY@`dc@n*^2rAqkMtpAxf#hRsib_(l#P zz!!rhI0PK!i?qPs=2@}S2C6rMd(~3G{P17qT7?V6hX?3!L0NM2($CR{S9gZ1`GOOPlcHij@Vfp{h>Hk|ET^O@ERX{Xyl;)U)&E) z34bI0$d773`6@50w@3JrB3pA38yfZx;0`~k{|+wXi8ICr;6wky+)dxcH!}O#0J=cd z_#i&7*M#AN!KO*T{#8?~4FD?TztpbtTv9>*rCtcUVxRv6Ut0V7_!EI04~R4J<5K?H zD%-S_2X4eAsI5ySzCa5umHF_{+F|hEbNmjt%Z(W_E`G0?@{I&Oz^$hR^#Qm+_ z+}Id+WW9X@K*JJoR#v*^L4+`mAPm<0uz@t-r=qW~m#(_1Hr889O&#Ikp^ZVPd#NiU zJiRnE5Sp4=Y8uL3>R1&o%^&>_<1yiUsp0qkwt&3w7%;}4w0LWIs%xvNs3Ej9)l?BG zDq0>0ZB;K71PFle(on~0YO86g{TS_=55^=6n+1B78i2?o;Mq4+?lZ$cIvgp&%xe=jUa+75`!y-I^WFXW%RXng-s;U|~TG~HY`j0Hp)>Zzw%>J)g@}1`xACDj$7HE7W>Hm9* z{%1n}4b}fj(SK-z|A#43;%obFGOYBU;=R=Nmz@Df$x;>AZur@s`<&sA{pjEHUk?1s zfqyyhF9-hRz`q>${}BiNw3M+y;II?{?BKt|X9Eiye4icyM)|UzmmtUqE(cE#PrRIe ztysBY=~}sR)vDF2R;^sKX6;%K$Nl#UgjWl#hOh!z0s@<$rNC+p-V3M;48Q8Han;cB z6@trF3P4MN)f=H@0)qV5>6NPl!DAUgV42{i<+vu9bs}YMKTn-~+lAE`E`h z(+g{x2PfGe)_Ju6aE2hEuW*KDz(Bco+xH}M4-dL^1>9s7bu71J!`*DId+E(OaxPrn zB4Jh2Eqm>q23gH76T5zYHFGG`G9pU*l*;Cn&L`?l+*3)Bi}mD8bA~vNInA6)%ziTG zG0j<>OvNjs;aFiMAA-AO(RipaR(5VnQ}}*%{ai?Kw4#N{YNMyuYvUFT=(Fm+nHJ3U z8hV?zUQ<}9(m+d8jOcA&gTQyy3zwkB4asXJr)ZuuG?O^Y zB;AglhiRoIdd7&x6xr%)&)O=B3Qkl`)_+lrObwbAm&-3+Zynjsy24UB)WIp=5SJ5+ zCq^+F+YJeqd!v)-_3k}>Ro7#J=-WJNQu_OTTSrhoy=~a}__}Mqs%dPUS5k%ZT858y zdiO{777zKteJ+kbucypF%f z!ipy~{_^rIFDfz@r==3T%Bt4lZr)4T^kP?nW#zuQn``Iy=&zwu;8w}jHgVPvH-ySe znPN(_n4e8JpL$FG(4}TnA`D}Wx%ggR^~kAWT6$(eDwNsSK)-cbM_@a0^WqAC0dWtj zh1t?Rl13(zS(igy#|y$?6pSgE$~?vDD^mEFAMg0^f#@*$vi9~xvk-&UM0>kmx6Z7W zhd4~862mZu2kBVCBshsi+N+ciCMnBxovKCA6z@(Anfcy@8SalnGXC#@G>%}`h(3Ej!*zB}RW#av|iMM~5J?wU!;f4NO&fu*#MX6<3_ zXtP@V4gSLRa_@G>qF5Ac>&h8s#xoppWEZI!(O2$Fx~xhG+<{$`3=}PqL4}7t2&PRv ze6fcvacj*A^Sc`6qy*k9Zd!+b*+#|`u1XgA>jM7TdPr%UQ<(-N5x?MO!U7nN+mi4_^ z%-;GoMsl&D%&kaU-%dYf_GgvMqlJ~%v}DhRDYYV7DJ|sPu>02&oY#H&B}4|L8MWUW zK2tcZVkKD`IQ|rog?4gzqjy4vVC_{^9jc?ImAfX?bTg@a7g5fIDaRR&poL#Zk9`o$ zpzqQ}X~J~N*R2sa7na70+BWu^0)ev$Z6`a^XSBPkB5{9HJKqG6%Io}#3~U6QPD%VN{jwbRUi(X0(1((6%Om%@w)co^ zHkEaF|Hk=7La*ii!bDZGoxWRrw;m~L+;Q%j26P~QD2YWq6|a1%_T;af+fU^T~HP67R^Y<<@ZXAOWF^Rd ztbH(@#Dmy!N}Tt?T-P`p_$38WlLrlB1cph}Y6@dZ-qjNFjk=bsBatVZVQOnbV@rQe z4*I!%IotrKO6s0>(`0^S>aiH@Pi*@;g`9odeR^_xDr&OtcV=8%?znNkWX0hZr2SMU zK;0_hb80D!ih$+e7Q7}I?gXg9;bO_05nsZ-Ov@70!)iW}w?a=pa|%Knx+F73tWdOC zZyI$0@=d>=S~Ad>KR%dzza+1gt?})`ocC6F zv?u4lixRs}YS$;V2f%3O4BMXY-L%C$=z5mo72aPl zOk%9}7!baE~`uX zJ^0?Mvi_3yr8MiwH%|7}e|(5&(j*ACk>t7F#PXKDbP^3szlFRJ$Xg=XH74WxmX?WT@gQ0RXKduA{@bESt`RuW z6qIx7nYZ6voG?VCzS0eP(B~m-e_ecH)-%yPNQh&x-{mBAFEkX>dX6@wN)==YJWx^4|}Z? zSTQ9OX!^x3@?3qz@sUX**k8v#jE2O}R(RwUV64xaf569RGa7 z)UXBJ^r53k;{N%)Zhzd|tuJFAF6(l3ndXST0Zd?ww3ot7)C0sKmK?L3<=4Wj-6h@{ zNlC2`mhzLZWq&x1$~v*_k$;3^{LXHJSMO&6uKKQ}BUXsk;8c$f?)wS*36f)SFVU#V=(fTWMB~;6>MBEVy6ow(8g_E`iD#K- zA8KDs+qM1RCUP#Zd`Za~O%4jR_+Qbx`J%5sL|<#uj?RRq4z{R`zL^*#>+A^Y(!*#+ z$?NXN>e7D|Dk|C(qAk>wWZ{0ux+h?oYs`7fbfld>tzR~#q~uD(9TZc28>iS)bJa@2 zz-;G0e8ZuUy=mpAfuLA`+Yr{`hWaz(TS>{Wp;wL4FE9GHL^5B>kj;DVI*3+xoHnr# zJutbNA+GQB>%d1_Zg2!QRHz-zI*n#skM#w_0&RTjx09XvmrDGNT8^bh;0woVTknc? zJDxUMYnT(WDZVEZ`U7+G)9QDWqc!DTc+PHG8GV$|+vS1Ms=B7WMx$4u+%Ua*9N)y<9J7J>uT6O+To3Tt`L?PvL~h2b|Ew-(%^Pw^mf0l;4* zzHLN~zfuL@knBrHHImW?;V%@6%J|QCvr@b=PJMYUD*4BK)!|y(32FF`5C_h>p#M zu1wP;_NwN{qdP<|DkNVi$-WQ!-BPZ6Ovl~l zP{F2ASunxY%qt@9;f4}esm&5T-3kn{X`cp4!}9(_nRP;nX?=IN(~MN+#)FC#HVze7 zy?1h)ue03Hh*k$X09jYp|MD2mPSc^WwX2SE>y0&Ue1PJ zJG4FT+7-r!^2LsTZXvfJ6}h+*T+ARGJIEeJwFqmE5cjmMWXoJM&!1RWs8+3~h{c9% zeSEO^jrr~;k`l=oQj|0ar*6*Mu|-$&-stX9qMEgxSVX2Lb2v{kKHs&`FUH%eu6lQ; z4`tgfhdYdB6#P3{2A<-EqL`yp$@Gz%XfhBX9&{&&^Df_q2c@`RDYs^)cOXPxnA*5r z+Wm)jTBfbIUPL@rL?fLW9qYmMB(<;QVz`G|vSR&#ULi3lEK+McZA63XPGrs);Or~D zO!rR>nih;VM%amoH>kbJc@$T(LDC7FU^3OgWQXkCa9o1$<#VgJp^~k|zEupfj>1qZ z{G2hOKb0Q$dF;ZN)M;dEn{|hzR;=fVmtI}^7xLT-MoD3!ry0kS&Hd#?GzjK-Dnpl> zMkU#ssqhQoPSQK{r~4G}!#&iZ&}T(&%BXM`={>m{={zUTww#J0(8g^S#p4Xu@p@*+ ztZCN*qybU~$xs05L9y<+>$GE=1QxXqKJebE?OJ@0C}Xnht5Aq%^3d1Xc?{W8ZM2cY zsH;Y%fs=9?SbU@ecQ?bTvMl0Rc(m2TG!1jb^WJD2za-2Lx^mqT}ZieYtu`T4zl!Loh#~faH;$C?7JYW4k z4Z4#!7_z>{Qr**OuYIE2`{#+e=WWZNKWW1pEL zR5B}J_!pMGZUi02867?c6KJ^VG&)O@%(z)Ok?19IS;ec?D(x4B=WyQhKM0-MH?i{Q ztFD7X$K1_I9@L7`9XB-Y$gQ#57hbC3r#a}B_2$+6iM7-SnImo~n!EjNwq`c!;1<`D zIqxal7o{{bS5#MSF`3ST?v?{l0I0l9<`jXS>ox+#|FCXkPLssC%!9serX-WTIE|AR z9FveTu_t4#V!izwU9@P8^!_BU%ND&J5+8ai-;zE(>qkV+VYN@$)!uXxcWI1 zyB}~k<_KOg6{t3b29oAObP$Fck*)P7n&9{`|GkFBy+I?NYuhgcP-a!Uzeb4e+s~n{ zUT=g+rVd08l;h$k42UwH%!%Vc;4G$3dhb!pcu2s}uW$*C+>nuWN!D2sITO%)s~Frd z!gq;UE`4o_btlWnMLsTLb%PA+6b-2u3$B{n@~!TBo%R*(p?$`2LoRSb<(fuV;1GSo z-JR3HOv5llVG4h-W zg%uARP)J1{^fAAS^dV0_18fXs@CYn_cXEW499I$>Ox$Dc=Fb{!bxFDQIrEq9U&Kz@ z`nsr^5d;$7#T*&P!fvRvvAf)}bD=t!qJ=yV{i(n(eyp^0c0c^w@tSB&l0~OR(JmvJ zhmlCO@{rY@b1Qz`dqZSE0dCjWEKKR+(gmWZxLzitpsO%r6$_+?#3Z@U+q-x z9y6|;=ez6$A@_mj08Dg@GtapQ1j~VQpLrpL#MqX{I#G*E-D2(_Yp~d!kG8p8 zuQR$*(^qlzYI@Pbp6-pDi_G{NB!(Jif`)`!P_6N5hv;#}%qr%nIa6yax$;JzgP~d9 z-BWorZua;!=`5Q|i+fc+U6XRqJRG#|`9v;(3OdEfu`CbPvm`EM`41|RaYbm~HIg^O z1}Yw38bRH7F8e~+TChU#_m80~d`>RkbZeAJ=7vICT&!;_A=ZuxM-{_JXHHV8#f8=# z=N8-IdP`cSl$*l65yQ>CzafH7JJ=Y@N!=HzqMG31NDLs4qd@cM09&eZJstHm%g1?p zKaw#7PAak3zDlx+|FAPlv7iJ#&yBHl?a5<#*Lu~|)#&G>8z~)B=n*l5HvH<*xVWX8 z8{#@A_65&bpC5a9QINZHj$%Do$IW3AI3{S@sT1}1Qci3M@#Er%qT~h=ulIu_>q@5o zL%?6*$KU}LMimk-!grK@hvM1O+UtZ#eauo3RI>TwVfigFcdxu%>p>T_p{taBD^ z_u7^%jB*aJMRnxw$C^!@9CqS-I%CF?OpETO!5Zimpij9cTt?je1~W?n6^>iob@eSb zS7*JVzt=oZJFD{W(z+`fuim-}Bpv~717cSTOPnRh4W)2HSN07HQ%P;vu5L=r8;@2y z3|lilc!-XepT`Qwkk1~!Gfq-z#ZI~I0J&>nnq@A7YRICeX}J#WyQT5AZyyQSoL?BVrkt^=v(h`BKI}BN zXmlj@!FB6bheIp$lX_P7$P(Ai}qb3<#dq)l(#cg0D zBU!ybSmQ*kd5~iCB>*XQhnT+0j3o~awud+k%-W|1tZ289ugb=^=(i%n_tm?3e*E=9 z=#vE6d$o=<36|E4=sbp-j(WTf5o68@N=!mD`$o3i5LNrEE=$W)4C`hGPD+jM#jXrz)t`;&eI};uK>FO68w6a2d%j+ z&uw~WMZ>oUx1jb6pYSuZ;M6gxN%KOFVoSnf?)hp)Mt41PLgq4EO~h51$9${~2sE_^ zjG;5px809&e&y8kkyJR->ZRCUY`RT575aO6G-9mjMY!D8#(mB+JC7fH4Yl`}cuUv< z0n!Gy?S)rh1J2`&HPT6mVI&1^R4l>$&14tsc=Tcns(D8Yi?FyWa5P+5|2}c1k+>mJ41< zQ!`JvFO0Gm_B!&Uijx1U+4jya88Z18tySU|`%vcGgR#cMRosy0%$7r(QchiW!;{n; zxq?E!hlPs-JIZz8V)XElJA@RQRS)+$bu70(K1lFx$H8g9E$#s$v))We-sDDgMBm-% z;HcGiGQBD*5EpVPrJ$*+Yx|g4TGPFAS2sKTW|2VFq%gV$`;)`tThOgk?McIsj#3^3 zyg@pg`C_=dHPi9J@v2mZ>hfzQaXa3(BJW?BYEu6#4U(584~hUie5>zC&wMHTMVRx4 za3V0khgx*43x_?rXUTt@4>X>7)phv3&-PK#jnNvVv#VI^K7UR_YR;D`yTMnQ(KmE) z6T5INT%U)`ytKNnQ9D}hjK|B~O21YRO51B2%#Nw^7dNq&bWY!Q`<(0_V4K!XhU@7l zs$^4j;T1k+ zGoK0SHtg9~`XT+^e4H`rL2ofWtlp-1#HL$gpG;*>*i?R>kKAeOei@q=e-vdE>`p$n z`ZYru9KP^?l@VYW2*KgtKX6nf@F1_6F)G|ZdPQwQ5WwWOimY%%(~G!0$|m>}CCp552p+#SlTFHdAy+2ap;wB*sqQehfpkk@k=HfM2vX zKdj?WdrCBl_6LUDR(zT=KsiF)S)4LCaw6jRZkwa-1M>_0t&xUVv@LYB?3)2%=@ItX zYTf0v>Yq*w4zJ#H+AL6EMbS8y@@1+ZML5GpDBq zZP#7WV=zz8L!@MOIJpdMF8=K3s1J7qassJ0}g3DeIi&YfpK@xv5{~TidjuR5g(S`7ne&Fd11aTLRB{F)dJH>xJYJgyws)Um2z>0uileb z7fGK6!Q{_)(BOHN++t^i0#GBozOTs)d6tt2bMS z%x_ZM^z6|pZ<>k?EwgHMl?= z9Ftq48<8AM$z#Xia$oASw9}n&DN$*bW!_#^DYD1Rf$ETi(ePbhQnZ!Ajigp#IhcfE z^{0^bE6y)k&o+q-UiM8OD-S!%R$VH5qhIz)=6uuD;%CU=yT5d1KhB?BLhFjmSk+Ey}=7|U2K3`F8M^Dg5 zEtLIJTq5g!bs%lz0MWhO5_|)C>?wVE^*Qr9E7ERu+HV#0-fbr;g}Z><6P-$@!cC;s zK(OBpvGPpFCd~5}Wss~Zk~emop3QMWq2Pge?Kt~Np`NuJaWD42DDa+p8+(r4cB|zm zr>mo~w2h?3wHg1|R^Tsjq@y^Ttm}8Z!pc9_yvSlI&k6O3B__7QwqN%!;SgKJ^D2zeukcXLsZhOku))k zD`%9`UL#5At<+qZU~F%@D<>bbtM1@|!k%+BFK{`8U!q!CtPHy*x!g%{aq)fb?-v%{ z_3gWRSyqvGuvqZ?TXe4gc!wR&Q*3YwDGu5oeTnVXXRA1xm?R zlzY6c0~}HQV3NnoXm+U!tT;o4MYs2P@wX_Ovypg0RD^Wuz6Me4j-*Nb8}IwUihbh8 z#E&&{-o@l4)IH9gL;{z@)xm{xCB!Ouz5I%=ixvZSZoy|z-Sf^E!R|+oYgE;39-65l zwiVzcG;RetpQz*$UVziikx?A6cs2Je^0@Wd)c?o6Q)Q_O3gwjJxe&=7sk;Z;|);zA7!*{@~xUU`5EEz zro3=%yYZ$e$>C$kG$T`D5|?m=Wo%UgB;AhldlwSHd7cAjv{KU9$)z-{8+W_$(lxFn zICPzx?#xs7l_67R0sSkIrZ?=pg9~R-u5%i}hme=EDzT1SYgeP_mMkvXl7?)_&r1&U zyml&VB;Q%@NUz=8c*&C?n|fBOOF!^uq(vtHo9X#_Gv;hddJu&n48Jrht6~LcIx0`N zWR`id?NX{g4o<4=Gv1k+7|Ar2KX4?cdi}xSK~7C~9U~XEM4?&{4kHe%533FYi!NmNw_1QrW_B=cveCu^6CNmIFbqE^>ykgZE<}z zE0K`DO))nOQ^S7at)|*JAS^0_>pbqRqP_#DHDI1i+I5-fx_G$=% zg@Xtvft8BX>rTC_6!BaUg5Ez>PRwc^KEaZ0KT|+-8AW#^G`4dpi%lO)>PEeJ_OP<# z&5`y3b(2TB=hc5P2|Yw!26iP7o5DckaQZl3yVWUb+(TR({FNJ$%FG={k4qfys&FlG zihf7eb9U^c^!80cXw+GPvTN7FjS?OWt(M~`_JN#NufezKSiCS>898sJwJ2f(ybr%j zu}IwO;@tdq;QeqGajhyZ8;=4;C~&$Tr!H)s)G4{a8BmbhGowR8w~fFsi9_$dt=`fm z&TQd^4B2zC&(BL}_OFa9n9?n_=oLBbJnc~(mmisNQfej}*Mo#VN6;j1A{D?_j5!2` z8b>0)WVk*igh6SQUv$ffF`22fMmkvLkv~7VH<)eG``LN>R6XIXwrjS}ATsrXbXUc$ zz0|{9e-ORSSUotc=O0EK^Uc9tmbG6ocJicD(2Jy+b^<&Em*>Ws$GQ@)u!L!Kmis zG38F|Fi+WMKk{36+(nVA>9`4kY3CeO$#;jtZ}$co^L*H{w|2xPK}Ahx-A<$UdyEHmwQy*CD)sAn^PND z%&ZfQ4>qTNyjNypQ)jqy1}^sqx}D|2*7HMUPdG%nPKm|mPtN)-4;C+Kvfng=Qz>L8 zK74uSvHitk@(-RX4E!~uW=o3Q`TcvZf4U~CvhF|mG@&1j#6Kd($J@F%6BGf3ne z)5#6FWq=P`;M;UzjUhx&;MSt-2A#^XvqjLUmrYud%pqyzAo)> zWr3)kX02aHg|T1@n;qMKhq%{GR1cfD-YaK6Th)A-`-xU3>5Dlw!&wI;8o=-|K<26V z7UaIBA{f(#y62bDZ)nFX9b2rts<|F{oAc@ZaIr1ogIe}`@gq`Z(r=B@gpLf~+0=-> zQ^lp+UDa2QEQ$1=CtExr7aVH2fS7PkZus`S4IHKTu?_!}kp3RofnQFeUSwG7Pt@yn z)zB#LE6FCb9@mRF%iO{eY)WrG-yLh=ulw@Bumwx?4fk@7lE!+S;$r-;r3rEQV8Gdy z%^?D?D(h-zc@5Vcwr0HI9_@%OjiDPDx3RCK3C1R~O!H|orL%Ggc{PuMogb}AF_qsY zi*b?W98ksGl4K>Z%9%sVSyX=oTHCS&eNn$YyoC6yyCuajqT0nQ)u?4xdkInYCe45C z@}w*0H>;Sb$ln}^gI!%X@tg~sYs_<8GJRUF8T?<)TI*ELVON$zX+d4eLl?ipmi}sJ z_am)5$jSH2e(#aw6)RSnlE%Z4jLoElJxJidn9%|LY>ju6RK6-hGPXw#+@FweVp18^ ziQyy4Q~k$ZkJoCXlm%)u^tLu$4KdkKqtJR13g@p6hF)0U$q{bIDC+`sP?CP(KctGcXKU)6}Fd%VF|L7T2>5fM?R@*Um306mz;9J1r2v&2#<+Cdc{s)NBQZ<4Tk#I!%3gbOlF%eSV_Y_AlZ z50c%yP3zqRN5PJ{eNOxzq?h{lSREkU)a9i1s75S}`brq-6KnOLq8q6~V#tA0E2ZUB zxJLZv!E^L-b=_d|o5#uL$y=L?T-LW~`LW6FWvo@#Nr<^NVP?^*^oZND`eoR>3EfpU zG!S+^AY#w2>~|ga7@Ik{oXvK^hndnD;qCHVEwH@7cZ}CZm`HB)O&;_q{W(>E2pon+ zv#l`FHv4z3I? z?LekbIL$+3jvNw!oK?CV#Wc2H2IgfhAC%<$@dkV@=zorSbR0g-HcJZl)yOtEujsCy zm=?Nz%6cbC^5R^36!<2!x~}{JSe2|RWmF z2;)0ywa2dRini;){DXER@w)#!^zmiS19{WYAx7|o)iP4yRB7Iu`&U9e%@_5`x2%@z zN;zU<_SM9J1O3<~_r8Oczd7pk<3@p~^RH{j$v(EyN9Zo8HHY^qI5 zwBJa`Q+i(X*@*RJtZIty474_H@?^lkwm#%ja&`a@LUGS6Dov1qOFP@JbUsr=W3C>3 zExGil<00Tf4edb!hr&G__7%3{9QrQWHrBBE?pHV8me?BUwp-mSEv~&;Zyiu&^0+zS zUSz`{>WkPM56YR~L6;Uy7scjLj`$J+ZNm0_iEn~1_$Py6=ub-5L0nGg(!YysKszOI zgxG{G_FJ9C$xpOTG3eg88aBCR-arv8nRk0iGk|%4j$T|N_vN_*a7Z_T02Vxl;6wom z2>8$s#U{|k%_dljd%m{2$8RwB(p?3P6fKgl1Nxmj3bsSvK|VFC0RKIb2d!H~&yh-6 X*&M@?uTM@)HQ#144*tVd#T)ovcj-gp literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/cnp_eq.tex b/doc/src/Eqs/cnp_eq.tex new file mode 100644 index 0000000000..e5f157e6ba --- /dev/null +++ b/doc/src/Eqs/cnp_eq.tex @@ -0,0 +1,9 @@ +\documentclass[12pt]{article} + +\begin{document} + +$$ + Q_{i} = \frac{1}{n_i}\sum_{j = 1}^{n_i} | \sum_{k = 1}^{n_{ij}} \vec{R}_{ik} + \vec{R}_{jk} |^2 +$$ + +\end{document} diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index dc7ddebe58..4895a0729c 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -831,6 +831,7 @@ package"_Section_start.html#start_3. "ackland/atom"_compute_ackland_atom.html, "basal/atom"_compute_basal_atom.html, +"cnp/atom"_compute_cnp_atom.html, "dpd"_compute_dpd.html, "dpd/atom"_compute_dpd_atom.html, "fep"_compute_fep.html, diff --git a/doc/src/compute_cna_atom.txt b/doc/src/compute_cna_atom.txt index 74240b515d..23289b0132 100644 --- a/doc/src/compute_cna_atom.txt +++ b/doc/src/compute_cna_atom.txt @@ -26,7 +26,7 @@ Define a computation that calculates the CNA (Common Neighbor Analysis) pattern for each atom in the group. In solid-state systems the CNA pattern is a useful measure of the local crystal structure around an atom. The CNA methodology is described in "(Faken)"_#Faken -and "(Tsuzuki)"_#Tsuzuki. +and "(Tsuzuki)"_#Tsuzuki1. Currently, there are five kinds of CNA patterns LAMMPS recognizes: @@ -93,5 +93,5 @@ above. :link(Faken) [(Faken)] Faken, Jonsson, Comput Mater Sci, 2, 279 (1994). -:link(Tsuzuki) +:link(Tsuzuki1) [(Tsuzuki)] Tsuzuki, Branicio, Rino, Comput Phys Comm, 177, 518 (2007). diff --git a/doc/src/compute_cnp_atom.txt b/doc/src/compute_cnp_atom.txt new file mode 100644 index 0000000000..2e9950b4c1 --- /dev/null +++ b/doc/src/compute_cnp_atom.txt @@ -0,0 +1,111 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +compute cnp/atom command :h3 + +[Syntax:] + +compute ID group-ID cnp/atom cutoff :pre + +ID, group-ID are documented in "compute"_compute.html command +cnp/atom = style name of this compute command +cutoff = cutoff distance for nearest neighbors (distance units) :ul + +[Examples:] + +compute 1 all cnp/atom 3.08 :pre + +[Description:] + +Define a computation that calculates the Common Neighborhood +Parameter (CNP) for each atom in the group. In solid-state systems +the CNP is a useful measure of the local crystal structure +around an atom and can be used to characterize whether the +atom is part of a perfect lattice, a local defect (e.g. a dislocation +or stacking fault), or at a surface. + +The value of the CNP parameter will be 0.0 for atoms not +in the specified compute group. Note that normally a CNP calculation should only be +performed on mono-component systems. + +This parameter is computed using the following formula from +"(Tsuzuki)"_#Tsuzuki2 + +:c,image(Eqs/cnp_eq.jpg) + +where the index {j} goes over the {n}i nearest neighbors of atom +{i}, and the index {k} goes over the {n}ij common nearest neighbors +between atom {i} and atom {j}. Rik and Rjk are the vectors connecting atom +{k} to atoms {i} and {j}. The quantity in the double sum is computed +for each atom. + +The CNP calculation is sensitive to the specified cutoff value. +You should ensure that the appropriate nearest neighbors of an atom are +found within the cutoff distance for the presumed crystal structure. +E.g. 12 nearest neighbor for perfect FCC and HCP crystals, 14 nearest +neighbors for perfect BCC crystals. These formulas can be used to +obtain a good cutoff distance: + +:c,image(Eqs/cnp_cutoff.jpg) + +where a is the lattice constant for the crystal structure concerned +and in the HCP case, x = (c/a) / 1.633, where 1.633 is the ideal c/a +for HCP crystals. + +Also note that since the CNP calculation in LAMMPS uses the neighbors +of an owned atom to find the nearest neighbors of a ghost atom, the +following relation should also be satisfied: + +:c,image(Eqs/cnp_cutoff2.jpg) + +where Rc is the cutoff distance of the potential, Rs is the skin +distance as specified by the "neighbor"_neighbor.html command, and +cutoff is the argument used with the compute cnp/atom command. LAMMPS +will issue a warning if this is not the case. + +The neighbor list needed to compute this quantity is constructed each +time the calculation is performed (e.g. each time a snapshot of atoms +is dumped). Thus it can be inefficient to compute/dump this quantity +too frequently or to have multiple compute/dump commands, each with a +{cnp/atom} style. + +[Output info:] + +This compute calculates a per-atom vector, which can be accessed by +any command that uses per-atom values from a compute as input. See +"Section 6.15"_Section_howto.html#howto_15 for an overview of +LAMMPS output options. + +The per-atom vector values will be real positive numbers. Some typical CNP +values: + +FCC lattice = 0.0 +BCC lattice = 0.0 +HCP lattice = 4.4 :pre + +FCC (111) surface ~ 13.0 +FCC (100) surface ~ 26.5 +FCC dislocation core ~ 11 :pre + +[Restrictions:] + +This compute is part of the USER-MISC package. It is only enabled if +LAMMPS was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +[Related commands:] + +"compute cna/atom"_compute_cna_atom.html +"compute centro/atom"_compute_centro_atom.html + +[Default:] none + +:line + +:link(Tsuzuki2) +[(Tsuzuki)] Tsuzuki, Branicio, Rino, Comput Phys Comm, 177, 518 (2007). diff --git a/doc/src/computes.txt b/doc/src/computes.txt index 1d01798791..5a6ca66c46 100644 --- a/doc/src/computes.txt +++ b/doc/src/computes.txt @@ -17,6 +17,7 @@ Computes :h1 compute_chunk_atom compute_cluster_atom compute_cna_atom + compute_cnp_atom compute_com compute_com_chunk compute_contact_atom diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 1769f29825..79ff5b4a75 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -301,6 +301,7 @@ compute_centro_atom.html compute_chunk_atom.html compute_cluster_atom.html compute_cna_atom.html +compute_cnp_atom.html compute_com.html compute_com_chunk.html compute_contact_atom.html diff --git a/src/.gitignore b/src/.gitignore index 0cddfa6951..d6c535ebe9 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -177,8 +177,8 @@ /compute_basal_atom.h /compute_body_local.cpp /compute_body_local.h -/compute_cna_atom2.cpp -/compute_cna_atom2.h +/compute_cnp_atom.cpp +/compute_cnp_atom.h /compute_damage_atom.cpp /compute_damage_atom.h /compute_dilatation_atom.cpp diff --git a/src/USER-MISC/README b/src/USER-MISC/README index cacee41e0c..f501c81c17 100644 --- a/src/USER-MISC/README +++ b/src/USER-MISC/README @@ -28,6 +28,7 @@ bond_style harmonic/shift, Carsten Svaneborg, science at zqex.dk, 8 Aug 11 bond_style harmonic/shift/cut, Carsten Svaneborg, science at zqex.dk, 8 Aug 11 compute ackland/atom, Gerolf Ziegenhain, gerolf at ziegenhain.com, 4 Oct 2007 compute basal/atom, Christopher Barrett, cdb333 at cavs.msstate.edu, 3 Mar 2013 +compute cnp/atom, Paulo Branicio (USC), branicio at usc.edu, 31 May 2017 compute temp/rotate, Laurent Joly (U Lyon), ljoly.ulyon at gmail.com, 8 Aug 11 compute PRESSURE/GREM, David Stelter, dstelter@bu.edu, 22 Nov 16 dihedral_style cosine/shift/exp, Carsten Svaneborg, science at zqex.dk, 8 Aug 11 diff --git a/src/USER-MISC/compute_cnp_atom.cpp b/src/USER-MISC/compute_cnp_atom.cpp new file mode 100644 index 0000000000..6dce41291e --- /dev/null +++ b/src/USER-MISC/compute_cnp_atom.cpp @@ -0,0 +1,311 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. + + Common Neighbor Parameter as proposed in: + Tsuzuki, Branicio, Rino, Comput Phys Comm, 177, 518 (2007) + Cite: http://dx.doi.org/10.1063/1.2197987 + +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Paulo Branicio (University of Southern California) + branicio@usc.edu +------------------------------------------------------------------------- */ + +#include +#include +#include + +#include "compute_cnp_atom.h" +#include "atom.h" +#include "update.h" +#include "modify.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "force.h" +#include "pair.h" +#include "comm.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +//define maximum values +#define MAXNEAR 24 +#define MAXCOMMON 12 + +enum{NCOMMON}; + +/* ---------------------------------------------------------------------- */ + +ComputeCNPAtom::ComputeCNPAtom(LAMMPS *lmp, int narg, char **arg) : + Compute(lmp, narg, arg), + nearest(NULL), nnearest(NULL), cnpv(NULL) +{ + if (narg != 4) error->all(FLERR,"Illegal compute cnp/atom command"); + + peratom_flag = 1; + size_peratom_cols = 0; + + double cutoff = force->numeric(FLERR,arg[3]); + if (cutoff < 0.0) error->all(FLERR,"Illegal compute cnp/atom command"); + cutsq = cutoff*cutoff; + + nmax = 0; +} + +/* ---------------------------------------------------------------------- */ + +ComputeCNPAtom::~ComputeCNPAtom() +{ + memory->destroy(nearest); + memory->destroy(nnearest); + memory->destroy(cnpv); +} + +/* ---------------------------------------------------------------------- */ + +void ComputeCNPAtom::init() +{ + if (force->pair == NULL) + error->all(FLERR,"Compute cnp/atom requires a pair style be defined"); + + if (sqrt(cutsq) > force->pair->cutforce) + error->all(FLERR,"Compute cnp/atom cutoff is longer than pairwise cutoff"); + + if (2.0*sqrt(cutsq) > force->pair->cutforce + neighbor->skin && + comm->me == 0) + error->warning(FLERR,"Compute cnp/atom cutoff may be too large to find " + "ghost atom neighbors"); + + int count = 0; + for (int i = 0; i < modify->ncompute; i++) + if (strcmp(modify->compute[i]->style,"cnp/atom") == 0) count++; + if (count > 1 && comm->me == 0) + error->warning(FLERR,"More than one compute cnp/atom defined"); + + // need an occasional full neighbor list + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->pair = 0; + neighbor->requests[irequest]->compute = 1; + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->occasional = 1; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeCNPAtom::init_list(int id, NeighList *ptr) +{ + list = ptr; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeCNPAtom::compute_peratom() +{ + int i,j,k,ii,jj,kk,m,n,inum,jnum,inear,jnear; + int firstflag,ncommon; + int *ilist,*jlist,*numneigh,**firstneigh; + int cnp[MAXNEAR][4],onenearest[MAXNEAR]; + int common[MAXCOMMON]; + double xtmp,ytmp,ztmp,delx,dely,delz,rsq; + double xjtmp,yjtmp,zjtmp,rjkx,rjky,rjkz; + + invoked_peratom = update->ntimestep; + + // grow arrays if necessary + + if (atom->nmax > nmax) { + memory->destroy(nearest); + memory->destroy(nnearest); + memory->destroy(cnpv); + nmax = atom->nmax; + memory->create(nearest,nmax,MAXNEAR,"cnp:nearest"); + memory->create(nnearest,nmax,"cnp:nnearest"); + memory->create(cnpv,nmax,"cnp:cnp_cnpv"); + vector_atom = cnpv; + } + + // invoke full neighbor list (will copy or build if necessary) + + neighbor->build_one(list); + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // find the neigbors of each atom within cutoff using full neighbor list + // nearest[] = atom indices of nearest neighbors, up to MAXNEAR + // do this for all atoms, not just compute group + // since CNP calculation requires neighbors of neighbors + + double **x = atom->x; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + int nerror = 0; + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + n = 0; + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + if (rsq < cutsq) { + if (n < MAXNEAR) nearest[i][n++] = j; + else { + nerror++; + break; + } + } + } + nnearest[i] = n; + } + + // warning message + + int nerrorall; + MPI_Allreduce(&nerror,&nerrorall,1,MPI_INT,MPI_SUM,world); + if (nerrorall && comm->me == 0) { + char str[128]; + sprintf(str,"Too many neighbors in CNP for %d atoms",nerrorall); + error->warning(FLERR,str,0); + } + + // compute CNP value for each atom in group + // only performed if # of nearest neighbors = 12 or 14 (fcc,hcp) + + nerror = 0; + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + // reset cnpv + cnpv[i] = 0.0; + + // loop over nearest neighbors of I to build cnp data structure + // cnp[k][NCOMMON] = # of common neighbors of I with each of its neighbors + for (m = 0; m < nnearest[i]; m++) { + j = nearest[i][m]; + xjtmp = x[j][0]; + yjtmp = x[j][1]; + zjtmp = x[j][2]; + + // common = list of neighbors common to atom I and atom J + // if J is an owned atom, use its near neighbor list to find them + // if J is a ghost atom, use full neighbor list of I to find them + // in latter case, must exclude J from I's neighbor list + + // find common neighbors of i and j using near neighbor list + if (j < nlocal) { + firstflag = 1; + ncommon = 0; + for (inear = 0; inear < nnearest[i]; inear++) + for (jnear = 0; jnear < nnearest[j]; jnear++) + if (nearest[i][inear] == nearest[j][jnear]) { + if (ncommon < MAXCOMMON) common[ncommon++] = nearest[i][inear]; + else if (firstflag) { + nerror++; + firstflag = 0; + } + } + + // find common neighbors of i and j using full neighbor list + } else { + jlist = firstneigh[i]; + jnum = numneigh[i]; + + n = 0; + for (kk = 0; kk < jnum; kk++) { + k = jlist[kk]; + k &= NEIGHMASK; + if (k == j) continue; + + delx = xjtmp - x[k][0]; + dely = yjtmp - x[k][1]; + delz = zjtmp - x[k][2]; + rsq = delx*delx + dely*dely + delz*delz; + if (rsq < cutsq) { + if (n < MAXNEAR) onenearest[n++] = k; + else break; + } + } + + firstflag = 1; + ncommon = 0; + for (inear = 0; inear < nnearest[i]; inear++) + for (jnear = 0; (jnear < n) && (n < MAXNEAR); jnear++) + if (nearest[i][inear] == onenearest[jnear]) { + if (ncommon < MAXCOMMON) common[ncommon++] = nearest[i][inear]; + else if (firstflag) { + nerror++; + firstflag = 0; + } + } + } + + // Calculate and update sum |Rik+Rjk|ˆ2 + rjkx = 0.0; + rjky = 0.0; + rjkz = 0.0; + for (kk = 0; kk < ncommon; kk++) { + k = common[kk]; + rjkx += 2.0*x[k][0] - xjtmp - xtmp; + rjky += 2.0*x[k][1] - yjtmp - ytmp; + rjkz += 2.0*x[k][2] - zjtmp - ztmp; + } + // update cnpv with summed (valuejk) + cnpv[i] += rjkx*rjkx + rjky*rjky + rjkz*rjkz; + + // end of loop over j atoms + } + + // normalize cnp by the number of nearest neighbors + cnpv[i] = cnpv[i] / nnearest[i]; + + // end of loop over i atoms + } + + // warning message + MPI_Allreduce(&nerror,&nerrorall,1,MPI_INT,MPI_SUM,world); + if (nerrorall && comm->me == 0) { + char str[128]; + sprintf(str,"Too many common neighbors in CNP %d times",nerrorall); + error->warning(FLERR,str); + } +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based array +------------------------------------------------------------------------- */ + +double ComputeCNPAtom::memory_usage() +{ + double bytes = nmax * sizeof(int); + bytes += nmax * MAXNEAR * sizeof(int); + bytes += nmax * sizeof(double); + return bytes; +} diff --git a/src/USER-MISC/compute_cnp_atom.h b/src/USER-MISC/compute_cnp_atom.h new file mode 100644 index 0000000000..4fdb3954f2 --- /dev/null +++ b/src/USER-MISC/compute_cnp_atom.h @@ -0,0 +1,92 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef COMPUTE_CLASS + +ComputeStyle(cnp/atom,ComputeCNPAtom) + +#else + +#ifndef LMP_COMPUTE_CNP_ATOM_H +#define LMP_COMPUTE_CNP_ATOM_H + +#include "compute.h" + +namespace LAMMPS_NS { + +class ComputeCNPAtom : public Compute { + public: + ComputeCNPAtom(class LAMMPS *, int, char **); + ~ComputeCNPAtom(); + void init(); + void init_list(int, class NeighList *); + void compute_peratom(); + double memory_usage(); + + private: +//revise + int nmax; + double cutsq; + class NeighList *list; + int **nearest; + int *nnearest; + double *cnpv; +// int nmax; +// double cutsq; +// class NeighList *list; +// int **nearest; +// int *nnearest; +// double *pattern; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Compute cnp/atom requires a pair style be defined + +Self-explanatory. + +E: Compute cnp/atom cutoff is longer than pairwise cutoff + +Self-explanatory. + +W: Compute cnp/atom cutoff may be too large to find ghost atom neighbors + +The neighbor cutoff used may not encompass enough ghost atoms +to perform this operation correctly. + +W: More than one compute cnp/atom defined + +It is not efficient to use compute cnp/atom more than once. + +W: Too many neighbors in CNP for %d atoms + +More than the maximum # of neighbors was found multiple times. This +was unexpected. + +W: Too many common neighbors in CNP %d times + +More than the maximum # of neighbors was found multiple times. This +was unexpected. + +*/ From 2b3c124e61d761ebcd6a87662cf19c1d644600a1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 31 May 2017 00:43:53 -0400 Subject: [PATCH 115/302] add example input for compute cnp/atom --- examples/USER/misc/cnp/Cu_Mishin1.eam | 30009 +++++++++++++++++ examples/USER/misc/cnp/in.cnp | 51 + examples/USER/misc/cnp/log.31May17.cnp.g++.4 | 185 + 3 files changed, 30245 insertions(+) create mode 100644 examples/USER/misc/cnp/Cu_Mishin1.eam create mode 100644 examples/USER/misc/cnp/in.cnp create mode 100644 examples/USER/misc/cnp/log.31May17.cnp.g++.4 diff --git a/examples/USER/misc/cnp/Cu_Mishin1.eam b/examples/USER/misc/cnp/Cu_Mishin1.eam new file mode 100644 index 0000000000..8ea788b16d --- /dev/null +++ b/examples/USER/misc/cnp/Cu_Mishin1.eam @@ -0,0 +1,30009 @@ +#-> LAMMPS Potential File in DYNAMO 86 setfl Format <-# +# Mishin Cu EAM1 PRB(2001)63:224106 +# Implemented by G. Ziegenhain (2007) gerolf@ziegenhain.com +1 Cu +10001 0.00016401626143851118 10001 0.00089991000899910004 5.50678999999999962967 +1 63.54999999999999715783 3.61500000000000021316 FCC +0.00000499999999981071 +-0.00174266214468410396 +-0.00348892099090747365 +-0.00523377758263166015 +-0.00697723296321983710 +-0.00871928817543166090 +-0.01045994426141616529 +-0.01219920226272552810 +-0.01393706322030219269 +-0.01567352817448997016 +-0.01740859816502871027 +-0.01914227423105074877 +-0.02087455741109200957 +-0.02260544874308356711 +-0.02433494926435164629 +-0.02606306001162250752 +-0.02778978202102377892 +-0.02951511632807468644 +-0.03123906396769937643 +-0.03296162597421536944 +-0.03468280338134377416 +-0.03640259722220395844 +-0.03812100852931310513 +-0.03983803833458932075 +-0.04155368766935163549 +-0.04326795756431689455 +-0.04498084904960464314 +-0.04669236315473579424 +-0.04840250090862818766 +-0.05011126333960413959 +-0.05181865147538822214 +-0.05352466634310193427 +-0.05522930896927480404 +-0.05693258037983239817 +-0.05863448160010564791 +-0.06033501365483040502 +-0.06203417756813944806 +-0.06373197436357269652 +-0.06542840506407321399 +-0.06712347069198454363 +-0.06881717226905648133 +-0.07050951081644374341 +-0.07220048735470019352 +-0.07389010290379038892 +-0.07557835848307803417 +-0.07726525511133397472 +-0.07895079380673530878 +-0.08063497558686139044 +-0.08231780146869960291 +-0.08399927246864269392 +-0.08567938960248699942 +-0.08735815388543688442 +-0.08903556633210474303 +-0.09071162795650611343 +-0.09238633977206633929 +-0.09405970279161346426 +-0.09573171802738844605 +-0.09740238649103627466 +-0.09907170919360996919 +-0.10073968714557102189 +-0.10240632135679028636 +-0.10407161283654442485 +-0.10573556259352034914 +-0.10739817163581522053 +-0.10905944097092978851 +-0.11071937160578260162 +-0.11237796454669402024 +-0.11403522079939731881 +-0.11569114136903824175 +-0.11734572726016789801 +-0.11899897947674986654 +-0.12065089902216152851 +-0.12230148689918429739 +-0.12395074411001827386 +-0.12559867165626981134 +-0.12724527053895817730 +-0.12889054175851422102 +-0.13053448631478437036 +-0.13217710520701952959 +-0.13381839943389151060 +-0.13545836999347882212 +-0.13709701788327555150 +-0.13873434410018958829 +-0.14037034964053995978 +-0.14200503550005993958 +-0.14363840267389926808 +-0.14527045215661704702 +-0.14690118494219106537 +-0.14853060202401202616 +-0.15015870439488265831 +-0.15178549304702659839 +-0.15341096897207551208 +-0.15503513316108197273 +-0.15665798660451368818 +-0.15827953029225039216 +-0.15989976521359050565 +-0.16151869235725069274 +-0.16313631271136053158 +-0.16475262726346739939 +-0.16636763700053824877 +-0.16798134290895339049 +-0.16959374597451315481 +-0.17120484718243256239 +-0.17281464751734887386 +-0.17442314796331537252 +-0.17603034950380180845 +-0.17763625312169928350 +-0.17924085979931758672 +-0.18084417051838252988 +-0.18244618626004083239 +-0.18404690800486056546 +-0.18564633673282804338 +-0.18724447342334737954 +-0.18884131905524670358 +-0.19043687460677061196 +-0.19203114105558904967 +-0.19362411937878576396 +-0.19521581055287207107 +-0.19680621555377975085 +-0.19839533535685704990 +-0.19998317093687756341 +-0.20156972326803979101 +-0.20315499332395736687 +-0.20473898207767149415 +-0.20632169050164517188 +-0.20790311956776186264 +-0.20948327024733215396 +-0.21106214351108310012 +-0.21263974032917376533 +-0.21421606167118145692 +-0.21579110850610705441 +-0.21736488180237900636 +-0.21893738252784844533 +-0.22050861164979007611 +-0.22207857013490395204 +-0.22364725894931680727 +-0.22521467905857761593 +-0.22678083142766558566 +-0.22834571702097905543 +-0.22990933680234793002 +-0.23147169173502746276 +-0.23303278278169470283 +-0.23459261090445959752 +-0.23615117706485522220 +-0.23770848222384177717 +-0.23926452734180747584 +-0.24081931337856987696 +-0.24237284129336922334 +-0.24392511204488043219 +-0.24547612659119977252 +-0.24702588588985685547 +-0.24857439089780886121 +-0.25012164257143965074 +-0.25166764186656376268 +-0.25321238973842685738 +-0.25475588714169949967 +-0.25629813503048559653 +-0.25783913435831928851 +-0.25937888607816184106 +-0.26091739114240741770 +-0.26245465050287997144 +-0.26399066511083368880 +-0.26552543591695609848 +-0.26705896387136363046 +-0.26859124992360339235 +-0.27012229502265938663 +-0.27165210011694096437 +-0.27318066615429437149 +-0.27470799408199608749 +-0.27623408484675460173 +-0.27775893939471263394 +-0.27928255867144802238 +-0.28080494362196617431 +-0.28232609519071205639 +-0.28384601432155998069 +-0.28536470195781937775 +-0.28688215904223701713 +-0.28839838651698812555 +-0.28991338532368748915 +-0.29142715640338368033 +-0.29293970069655772548 +-0.29445101914312798996 +-0.29596111268245062220 +-0.29746998225331244825 +-0.29897762879394029767 +-0.30048405324199434219 +-0.30198925653457253659 +-0.30349323960821239510 +-0.30499600339888122136 +-0.30649754884198898708 +-0.30799787687238255884 +-0.30949698842434347767 +-0.31099488443159151174 +-0.31249156582728909726 +-0.31398703354402890398 +-0.31548128851384849014 +-0.31697433166822186479 +-0.31846616393806082002 +-0.31995678625371759551 +-0.32144619954498221404 +-0.32293440474108559002 +-0.32442140277069952958 +-0.32590719456193006920 +-0.32739178104233035427 +-0.32887516313889042507 +-0.33035734177804076950 +-0.33183831788565321119 +-0.33331809238704224185 +-0.33479666620695880397 +-0.33627404026960228123 +-0.33775021549860539949 +-0.33922519281705065808 +-0.34069897314745967165 +-0.34217155741179272610 +-0.34364294653145810443 +-0.34511314142730631360 +-0.34658214301962564363 +-0.34804995222815282574 +-0.34951656997206770328 +-0.35098199716999012310 +-0.35244623473998837326 +-0.35390928359957030125 +-0.35537114466569219573 +-0.35683181885475256934 +-0.35829130708259526727 +-0.35974961026450769097 +-0.36120672931522657123 +-0.36266266514892819828 +-0.36411741867923907989 +-0.36557099081923016826 +-0.36702338248141774812 +-0.36847459457776565728 +-0.36992462801968262198 +-0.37137348371802536562 +-0.37282116258309905277 +-0.37426766552465062787 +-0.37571299345187991747 +-0.37715714727343430113 +-0.37860012789740338235 +-0.38004193623133053492 +-0.38148257318220668566 +-0.38292203965646720576 +-0.38436033656000123671 +-0.38579746479814236437 +-0.38723342527567661264 +-0.38866821889683933477 +-0.39010184656531077252 +-0.39153430918422804652 +-0.39296560765617449817 +-0.39439574288318146600 +-0.39582471576673539104 +-0.39725252720777071147 +-0.39867917810667208300 +-0.40010466936327881982 +-0.40152900187687645683 +-0.40295217654620607561 +-0.40437419426945986345 +-0.40579505594427933701 +-0.40721476246776200369 +-0.40863331473645647662 +-0.41005071364636069831 +-0.41146696009293082241 +-0.41288205497107366426 +-0.41429599917514670082 +-0.41570879359896562022 +-0.41712043913579721632 +-0.41853093667836116509 +-0.41994028711883579774 +-0.42134849134884655442 +-0.42275555025948019505 +-0.42416146474127680577 +-0.42556623568422757842 +-0.42696986397778324829 +-0.42837235051084965320 +-0.42977369617178595718 +-0.43117390184840864720 +-0.43257296842799108916 +-0.43397089679725908695 +-0.43536768784240109653 +-0.43676334244905978821 +-0.43815786150233115848 +-0.43955124588677385589 +-0.44094349648640029926 +-0.44233461418468200677 +-0.44372459986454959591 +-0.44511345440838834264 +-0.44650117869804484272 +-0.44788777361482345896 +-0.44927324003948587716 +-0.45065757885225421475 +-0.45204079093281057666 +-0.45342287716029394673 +-0.45480383841330462857 +-0.45618367556990069289 +-0.45756238950760419470 +-0.45893998110339406793 +-0.46031645123370923400 +-0.46169180077445215460 +-0.46306603060098527891 +-0.46443914158813104365 +-0.46581113461017276123 +-0.46718201054085817248 +-0.46855177025339234120 +-0.46992041462044742417 +-0.47128794451415378930 +-0.47265436080610534475 +-0.47401966436735998300 +-0.47538385606843602815 +-0.47674693677931756497 +-0.47810890736945044210 +-0.47946976870774227208 +-0.48082952166256776039 +-0.48218816710176337637 +-0.48354570589263046188 +-0.48490213890193478719 +-0.48625746699590566280 +-0.48761169104023815990 +-0.48896481190009355444 +-0.49031683044009444217 +-0.49166774752433273221 +-0.49301756401636431804 +-0.49436628077921129787 +-0.49571389867536153062 +-0.49706041856676952406 +-0.49840584131485510255 +-0.49975016778050784794 +-0.50109339882407955002 +-0.50243553530539442065 +-0.50377657808374021187 +-0.50511652801787265687 +-0.50645538596601724635 +-0.50779315278586700799 +-0.50912982933458073020 +-0.51046541646878829113 +-0.51179991504458843821 +-0.51313332591754612366 +-0.51446564994269738946 +-0.51579688797454759097 +-0.51712704086707050877 +-0.51845610947371145727 +-0.51978409464738239976 +-0.52111099724046949788 +-0.52243681810482778261 +-0.52376155809178026601 +-0.52508521805212549083 +-0.52640779883612909273 +-0.52772930129352957351 +-0.52904972627353608061 +-0.53036907462483195985 +-0.53168734719556765000 +-0.53300454483337089684 +-0.53432066838533831543 +-0.53563571869803894288 +-0.53694969661751823509 +-0.53826260298929007320 +-0.53957443865834386898 +-0.54088520446914323259 +-0.54219490126562197574 +-0.54350352989119077307 +-0.54481109118873494168 +-0.54611758600061044433 +-0.54742301516864966260 +-0.54872737953416228507 +-0.55003067993792686963 +-0.55133291722020327796 +-0.55263409222072201743 +-0.55393420577869179056 +-0.55523325873279683051 +-0.55653125192119468068 +-0.55782818618152241186 +-0.55912406235089351370 +-0.56041888126589345376 +-0.56171264376258900342 +-0.56300535067652468513 +-0.56429700284271699928 +-0.56558760109566508234 +-0.56687714626934182505 +-0.56816563919720142195 +-0.56945308071217493051 +-0.57073947164666982701 +-0.57202481283257444744 +-0.57330910510125532298 +-0.57459234928355584771 +-0.57587454620980160769 +-0.57715569670979682826 +-0.57843580161282304175 +-0.57971486174764530475 +-0.58099287794250331629 +-0.58226985102512207604 +-0.58354578182270655518 +-0.58482067116193858780 +-0.58609451986898353226 +-0.58736732876948938298 +-0.58863909868858099728 +-0.58990983045086831105 +-0.59117952488044189785 +-0.59244818280087430118 +-0.59371580503521959038 +-0.59498239240601469291 +-0.59624794573527784003 +-0.59751246584451433996 +-0.59877595355470614180 +-0.60003840968632227160 +-0.60129983505931594578 +-0.60256023049311990825 +-0.60381959680665509005 +-0.60507793481832550242 +-0.60633524534601579425 +-0.60759152920709968981 +-0.60884678721843243920 +-0.61010102019635503723 +-0.61135422895669599974 +-0.61260641431476559049 +-0.61385757708536048405 +-0.61510771808276465400 +-0.61635683812074715249 +-0.61760493801256166613 +-0.61885201857095162303 +-0.62009808060814330943 +-0.62134312493585119874 +-0.62258715236527772952 +-0.62383016370711130705 +-0.62507215977152896791 +-0.62631314136819438154 +-0.62755310930625851640 +-0.62879206439436230447 +-0.63003000744063264449 +-0.63126693925268773100 +-0.63250286063763105915 +-0.63373777240205786399 +-0.63497167535205112365 +-0.63620457029318266962 +-0.63743645803051407484 +-0.63866733936859865217 +-0.63989721511147834576 +-0.64112608606268373101 +-0.64235395302523756733 +-0.64358081680165168947 +-0.64480667819393122642 +-0.64603153800357060454 +-0.64725539703155376969 +-0.64847825607836062645 +-0.64970011594395837839 +-0.65092097742780707925 +-0.65214084132886074308 +-0.65335970844556445769 +-0.65457757957585460673 +-0.65579445551716286644 +-0.65701033706641043253 +-0.65822522502001490352 +-0.65943912017388583990 +-0.66065202332342476410 +-0.66186393526352982342 +-0.66307485678859134914 +-0.66428478869249341088 +-0.66549373176861470469 +-0.66670168680983232790 +-0.66790865460851045476 +-0.66911463595651565761 +-0.67031963164520491638 +-0.67152364246543294612 +-0.67272666920755086473 +-0.67392871266140152997 +-0.67512977361632775519 +-0.67632985286116875656 +-0.67752895118425726650 +-0.67872706937342464073 +-0.67992420821599930392 +-0.68112036849880541745 +-0.68231555100816598802 +-0.68350975652989998110 +-0.68470298584932565156 +-0.68589523975125876731 +-0.68708651902001127709 +-0.68827682443939619539 +-0.68946615679272427180 +-0.69065451686280354693 +-0.69184190543194290512 +-0.69302832328195052014 +-0.69421377119413141266 +-0.69539824994929366753 +-0.69658176032774266062 +-0.69776430310928261314 +-0.69894587907322391906 +-0.70012648899837093275 +-0.70130613366303062861 +-0.70248481384501326730 +-0.70366253032162640046 +-0.70483928386968108804 +-0.70601507526549078797 +-0.70718990528486713742 +-0.70836377470312816840 +-0.70953668429508920390 +-0.71070863483507262792 +-0.71187962709689966978 +-0.71304966185389617728 +-0.71421873987889084034 +-0.71538686194421430287 +-0.71655402882170116108 +-0.71772024128269085175 +-0.71888550009802543173 +-0.72004980603804979999 +-0.72121315987261480629 +-0.72237556237107569679 +-0.72353701430229033775 +-0.72469751643462454460 +-0.72585706953594675284 +-0.72701567437363001645 +-0.72817333171455689289 +-0.72933004232510945108 +-0.73048580697118081773 +-0.73164062641816896004 +-0.73279450143097513148 +-0.73394743277401186532 +-0.73509942121119387082 +-0.73625046750594536071 +-0.73740057242119738667 +-0.73854973671938717317 +-0.73969796116246100404 +-0.74084524651187178002 +-0.74199159352857990690 +-0.74313700297305507192 +-0.74428147560527668780 +-0.74542501218472767555 +-0.74656761347040490051 +-0.74770928022081095676 +-0.74885001319395994024 +-0.74998981314737345194 +-0.75112868083808481678 +-0.75226661702263375453 +-0.75340362245707326316 +-0.75453969789696473391 +-0.75567484409737972761 +-0.75680906181290308332 +-0.75794235179762670107 +-0.75907471480515664730 +-0.76020615158860804783 +-0.76133666290060886261 +-0.76246624949329699916 +-0.76359491211832519753 +-0.76472265152685525713 +-0.76584946846956292177 +-0.76697536369663454892 +-0.76810033795777221677 +-0.76922439200218883926 +-0.77034752657861038649 +-0.77146974243527677295 +-0.77259104031994030315 +-0.77371142097986944641 +-0.77483088516184306371 +-0.77594943361215862332 +-0.77706706707662220879 +-0.77818378630056028733 +-0.77929959202880905167 +-0.78041448500572241365 +-0.78152846597517156013 +-0.78264153568053695942 +-0.78375369486471968550 +-0.78486494427013497877 +-0.78597528463871402238 +-0.78708471671190349817 +-0.78819324123066869525 +-0.78930085893548884712 +-0.79040757056636090638 +-0.79151337686279932271 +-0.79261827856383559876 +-0.79372227640801895632 +-0.79482537113341500401 +-0.79592756347760862390 +-0.79702885417770130694 +-0.79812924397031381751 +-0.79922873359158530526 +-0.80032732377717308303 +-0.80142501526225307096 +-0.80252180878152268306 +-0.80361770506919327772 +-0.80471270485900170399 +-0.80580680888420075370 +-0.80690001787756360230 +-0.80799233257138536324 +-0.80908375369747931316 +-0.81017428198717977850 +-0.81126391817134169138 +-0.81235266298034392030 +-0.81344051714407883402 +-0.81452748139196939903 +-0.81561355645295208205 +-0.81669874305549083893 +-0.81778304192756934299 +-0.81886645379669209532 +-0.81994897938988731134 +-0.82103061943370736486 +-0.82211137465422345905 +-0.82319124577703295387 +-0.82427023352725514727 +-0.82534833862953282946 +-0.82642556180803228294 +-0.82750190378644350453 +-0.82857736528798020537 +-0.82965194703538136523 +-0.83072564975090834594 +-0.83179847415634977637 +-0.83287042097301666743 +-0.83394149092174574278 +-0.83501168472289899469 +-0.83608100309636546044 +-0.83714944676155589320 +-0.83821701643741097776 +-0.83928371284239378092 +-0.84034953669449663494 +-0.84141448871123669662 +-0.84247856960965838979 +-0.84354178010633074081 +-0.84460412091735403983 +-0.84566559275835184728 +-0.84672619634447676695 +-0.84778593239040955787 +-0.84884480161035757995 +-0.84990280471805745854 +-0.85095994242677175379 +-0.85201621544929539986 +-0.85307162449794771142 +-0.85412617028458059920 +-0.85517985352057146464 +-0.85623267491682941710 +-0.85728463518379238728 +-0.85833573503142845951 +-0.85938597516923365127 +-0.86043535630623679822 +-0.86148387915099400303 +-0.86253154441159596288 +-0.86357835279565886566 +-0.86462430501033260555 +-0.86566940176230011694 +-0.86671364375777071309 +-0.86775703170249007812 +-0.86879956630173271748 +-0.86984124826030440047 +-0.87088207828254660114 +-0.87192205707232894873 +-0.87296118533305588905 +-0.87399946376766446399 +-0.87503689307862275726 +-0.87607347396793455729 +-0.87710920713713691477 +-0.87814409328729681192 +-0.87917813311902004436 +-0.88021132733244056290 +-0.88124367662723068761 +-0.88227518170259733310 +-0.88330584325727823369 +-0.88433566198954860482 +-0.88536463859721981073 +-0.88639277377763292520 +-0.88742006822767161012 +-0.88844652264374968098 +-0.88947213772181732416 +-0.89049691415736376143 +-0.89152085264541103271 +-0.89254395388051888105 +-0.89356621855678364241 +-0.89458764736783757954 +-0.89560824100685065829 +-0.89662800016653032564 +-0.89764692553911995532 +-0.89866501781640195645 +-0.89968227768969533109 +-0.90069870584985767259 +-0.90171430298728494357 +-0.90272906979190992161 +-0.90374300695320575194 +-0.90475611516018417113 +-0.90576839510139395273 +-0.90677984746492468204 +-0.90779047293840609001 +-0.90880027220900538865 +-0.90980924596342926947 +-0.91081739488792790027 +-0.91182471966828693155 +-0.91283122098983682235 +-0.91383689953744418055 +-0.91484175599552020053 +-0.91584579104801511207 +-0.91684900537841951262 +-0.91785139966976747594 +-0.91885297460463344343 +-0.91985373086513311236 +-0.92085366913292521218 +-0.92185279008921039434 +-0.92285109441473034408 +-0.92384858278977177726 +-0.92484525589416155533 +-0.92584111440727046016 +-0.92683615900801430421 +-0.92783039037484882350 +-0.92882380918577545081 +-0.92981641611833953931 +-0.93080821184962925230 +-0.93179919705627756166 +-0.93278937241446224782 +-0.93377873859990412342 +-0.93476729628787058601 +-0.93575504615317117718 +-0.93674198887016491000 +-0.93772812511275271952 +-0.93871345555438256980 +-0.93969798086804590120 +-0.94068170172628473580 +-0.94166461880118190741 +-0.94264673276436994342 +-0.94362804428702773407 +-0.94460855403987920020 +-0.94558826269319662394 +-0.94656717091679909437 +-0.94754527938005250753 +-0.94852258875187089870 +-0.94949909970071733056 +-0.95047481289459923026 +-0.95144972900107571689 +-0.95242384868725227243 +-0.95339717261978340623 +-0.95436970146487265509 +-0.95534143588827213911 +-0.95631237655528322783 +-0.95728252413075676230 +-0.95825187927909261099 +-0.95922044266424077996 +-0.96018821494970230113 +-0.96115519679852501334 +-0.96212138887331155601 +-0.96308679183621048736 +-0.96405140634892450002 +-0.96501523307270731245 +-0.96597827266835922799 +-0.96694052579623845922 +-0.96790199311624980361 +-0.96886267528785152692 +-0.96982257297005358687 +-0.97078168682141896539 +-0.97174001750006078204 +-0.97269756566364762307 +-0.97365433196939710214 +-0.97461031707408296576 +-0.97556552163403087441 +-0.97651994630511951279 +-0.97747359174278058980 +-0.97842645860200216923 +-0.97937854753732289659 +-0.98032985920283599590 +-0.98128039425219149017 +-0.98223015333859153841 +-0.98317913711479443251 +-0.98412734623311037829 +-0.98507478134540926717 +-0.98602144310311290454 +-0.98696733215719900656 +-0.98791244915820186634 +-0.98885679475621213186 +-0.98980036960087414144 +-0.99074317434139014260 +-0.99168520962652007000 +-0.99262647610457777070 +-0.99356697442343566706 +-0.99450670523052253635 +-0.99544566917282528706 +-0.99638386689688651643 +-0.99732129904880939542 +-0.99825796627425189556 +-0.99919386921843167393 +-1.00012900852612385272 +-1.00106338484166190739 +-1.00199699880894010917 +-1.00292985107140819601 +-1.00386194227207781182 +-1.00479327305351673338 +-1.00572384405785530959 +-1.00665365592678179851 +-1.00758270930154525402 +-1.00851100482295241711 +-1.00943854313137393319 +-1.01036532486673724662 +-1.01129135066853215186 +-1.01221662117580946116 +-1.01314113702718056054 +-1.01406489886081785379 +-1.01498790731445454050 +-1.01591016302538661442 +-1.01683166663047175327 +-1.01775241876612843051 +-1.01867242006833813583 +-1.01959167117264537517 +-1.02051017271415478405 +-1.02142792532753645673 +-1.02234492964702261553 +-1.02326118630640672258 +-1.02417669593904858694 +-1.02509145917787036772 +-1.02600547665535568598 +-1.02691874900355628597 +-1.02783127685408559593 +-1.02874306083812050439 +-1.02965410158640446880 +-1.03056439972924418491 +-1.03147395589651091896 +-1.03238277071764361636 +-1.03329084482164379466 +-1.03419817883707976236 +-1.03510477339208462055 +-1.03601062911435803926 +-1.03691574663116536925 +-1.03782012656933986250 +-1.03872376955527800924 +-1.03962667621494664338 +-1.04052884717387539304 +-1.04143028305716378590 +-1.04233098448947902881 +-1.04323095209505400938 +-1.04413018649768996049 +-1.04502868832075446193 +-1.04592645818718676942 +-1.04682349671949070924 +-1.04771980453974045133 +-1.04861538226957784481 +-1.04951023053021419429 +-1.05040434994242914968 +-1.05129774112657203844 +-1.05219040470256186559 +-1.05308234128988620348 +-1.05397355150760385634 +-1.05486403597434152957 +-1.05575379530829738250 +-1.05664283012724036226 +-1.05753114104850975963 +-1.05841872868901476501 +-1.05930559366523602272 +-1.06019173659322496484 +-1.06107715808860492146 +-1.06196185876657134273 +-1.06284583924188891224 +-1.06372910012889687614 +-1.06461164204150571244 +-1.06549346559319757510 +-1.06637457139702651610 +-1.06725496006562270424 +-1.06813463221118487567 +-1.06901358844548788340 +-1.06989182937987781230 +-1.07076935562527508772 +-1.07164616779217447551 +-1.07252226649064374975 +-1.07339765233032502501 +-1.07427232592043364612 +-1.07514628786976085273 +-1.07601953878667178088 +-1.07689207927910657325 +-1.07776390995457971300 +-1.07863503142018291037 +-1.07950544428257977358 +-1.08037514914801291432 +-1.08124414662229817452 +-1.08211243731083084363 +-1.08298002181857677684 +-1.08384690075008416343 +-1.08471307470947375684 +-1.08557854430044420369 +-1.08644331012627159971 +-1.08730737278980904570 +-1.08817073289348642540 +-1.08903339103931062759 +-1.08989534782886798858 +-1.09075660386332140561 +-1.09161715974341255730 +-1.09247701606946057140 +-1.09333617344136424521 +-1.09419463245859915901 +-1.09505239372022211697 +-1.09590945782486692828 +-1.09676582537074795987 +-1.09762149695565902618 +-1.09847647317697227898 +-1.09933075463164042773 +-1.10018434191619696172 +-1.10103723562675526182 +-1.10188943635900749030 +-1.10274094470822903169 +-1.10359176126927360784 +-1.10444188663657771876 +-1.10529132140415775609 +-1.10614006616561266760 +-1.10698812151412129268 +-1.10783548804244635910 +-1.10868216634293026424 +-1.10952815700749973793 +-1.11037346062766251187 +-1.11121807779450820775 +-1.11206200909871166793 +-1.11290525513052673823 +-1.11374781647979470556 +-1.11458969373593630436 +-1.11543088748795837795 +-1.11627139832445143597 +-1.11711122683358587970 +-1.11795037360312177199 +-1.11878883922039973342 +-1.11962662427234649343 +-1.12046372934547266986 +-1.12130015502587365717 +-1.12213590189922896023 +-1.12297097055080530303 +-1.12380536156545374205 +-1.12463907552761077646 +-1.12547211302129945842 +-1.12630447463012650644 +-1.12713616093728741241 +-1.12796717252556311095 +-1.12879750997732131168 +-1.12962717387451494488 +-1.13045616479868638038 +-1.13128448333096254252 +-1.13211213005205890703 +-1.13293910554227950094 +-1.13376541038151290586 +-1.13459104514923869722 +-1.13541601042452344750 +-1.13624030678602117028 +-1.13706393481197509665 +-1.13788689508021745311 +-1.13870918816816790731 +-1.13953081465283689866 +-1.14035177511082186363 +-1.14117207011831189867 +-1.14199170025108442950 +-1.14281066608450676547 +-1.14362896819353587752 +-1.14444660715272039653 +-1.14526358353619661656 +-1.14607989791769449006 +-1.14689555087053163263 +-1.14771054296761909619 +-1.14852487478145715016 +-1.14933854688413883416 +-1.15015155984734662731 +-1.15096391424235733325 +-1.15177561064003852742 +-1.15258664961084811296 +-1.15339703172483876159 +-1.15420675755165325072 +-1.15501582766053001450 +-1.15582424262029714868 +-1.15663200299937707349 +-1.15743910936578608961 +-1.15824556228713149153 +-1.15905136233061734075 +-1.15985651006303935873 +-1.16066100605078759145 +-1.16146485085984685348 +-1.16226804505579539573 +-1.16307058920380512745 +-1.16387248386864472494 +-1.16467372961467807713 +-1.16547432700586073295 +-1.16627427660574722879 +-1.16707357897748509323 +-1.16787223468381795577 +-1.16867024428708687900 +-1.16946760834922702799 +-1.17026432743177055684 +-1.17106040209584638667 +-1.17185583290217820718 +-1.17265062041108847346 +-1.17344476518249707375 +-1.17423826777591822079 +-1.17503112875046622499 +-1.17582334866485105351 +-1.17661492807738099486 +-1.17740586754596265884 +-1.17819616762810186472 +-1.17898582888089897835 +-1.17977485186105668369 +-1.18056323712487398758 +-1.18135098522824932843 +-1.18213809672668168638 +-1.18292457217526636448 +-1.18371041212870076187 +-1.18449561714127926670 +-1.18528018776689858527 +-1.18606412455905418923 +-1.18684742807084187000 +-1.18763009885495751661 +-1.18841213746369733784 +-1.18919354444895919443 +-1.18997432036224060070 +-1.19075446575464205523 +-1.19153398117686237789 +-1.19231286717920559326 +-1.19309112431157360312 +-1.19386875312347262579 +-1.19464575416401008745 +-1.19542212798189662060 +-1.19619787512544295538 +-1.19697299614256480460 +-1.19774749158077886690 +-1.19852136198720615745 +-1.19929460790857111974 +-1.20006722989119873901 +-1.20083922848102120362 +-1.20161060422357190980 +-1.20238135766398879234 +-1.20315148934701410255 +-1.20392099981699551847 +-1.20468988961788237013 +-1.20545815929323074656 +-1.20622580938620060920 +-1.20699284043955823442 +-1.20775925299567354898 +-1.20852504759652301658 +-1.20929022478368719540 +-1.21005478509835473488 +-1.21081872908131815691 +-1.21158205727297629828 +-1.21234477021333697522 +-1.21310686844200987800 +-1.21386835249821567473 +-1.21462922292077935005 +-1.21538948024813420190 +-1.21614912501832006519 +-1.21690815776898464406 +-1.21766657903738328983 +-1.21842438936037922304 +-1.21918158927444308937 +-1.21993817931565429191 +-1.22069416001969965890 +-1.22144953192187655233 +-1.22220429555708909319 +-1.22295845145985193625 +-1.22371200016428627322 +-1.22446494220412560594 +-1.22521727811271197162 +-1.22596900842299616485 +-1.22672013366753929198 +-1.22747065437851277103 +-1.22822057108769788769 +-1.22896988432648712752 +-1.22971859462588239964 +-1.23046670251649792327 +-1.23121420852855623096 +-1.23196111319189505195 +-1.23270741703595865246 +-1.23345312058980760561 +-1.23419822438211079785 +-1.23494272894115031391 +-1.23568663479482010459 +-1.23642994247062554258 +-1.23717265249568697527 +-1.23791476539673528379 +-1.23865628170011365938 +-1.23939720193177960184 +-1.24013752661730425331 +-1.24087725628187039995 +-1.24161639145027624664 +-1.24235493264693186433 +-1.24309288039586318675 +-1.24383023522070823574 +-1.24456699764472089598 +-1.24530316819076958268 +-1.24603874738133590938 +-1.24677373573851735244 +-1.24750813378402680698 +-1.24824194203919103252 +-1.24897516102495487189 +-1.24970779126187525598 +-1.25043983327012653284 +-1.25117128756950091173 +-1.25190215467940291205 +-1.25263243511885535852 +-1.25336212940649982528 +-1.25409123806058997452 +-1.25481976159899999423 +-1.25554770053921904704 +-1.25627505539835482296 +-1.25700182669313220707 +-1.25772801493989350163 +-1.25845362065459775991 +-1.25917864435282389479 +-1.25990308654976823632 +-1.26062694776024497578 +-1.26135022849868771999 +-1.26207292927914682679 +-1.26279505061529517818 +-1.26351659302042085287 +-1.26423755700743356556 +-1.26495794308886200241 +-1.26567775177685470922 +-1.26639698358317742688 +-1.26711563901922108499 +-1.26783371859599225395 +-1.26855122282411958423 +-1.26926815221385291821 +-1.26998450727506106972 +-1.27070028851723448859 +-1.27141549644948659292 +-1.27213013158054888407 +-1.27284419441877694190 +-1.27355768547214687203 +-1.27427060524825597199 +-1.27498295425432583983 +-1.27569473299719637893 +-1.27640594198333401366 +-1.27711658171882547208 +-1.27782665270938156077 +-1.27853615546033383410 +-1.27924509047663903516 +-1.27995345826287576507 +-1.28066125932324736958 +-1.28136849416158038473 +-1.28207516328132475891 +-1.28278126718555540720 +-1.28348680637696999085 +-1.28419178135789113782 +-1.28489619263026710883 +-1.28560004069567046514 +-1.28630332605529718037 +-1.28700604920997041525 +-1.28770821066013652079 +-1.28840981090586970126 +-1.28911085044686934964 +-1.28981132978245760512 +-1.29051124941158756876 +-1.29121060983283397761 +-1.29190941154440097627 +-1.29260765504411789806 +-1.29330534082944259566 +-1.29400246939745655617 +-1.29469904124487156238 +-1.29539505686802502993 +-1.29609051676288222765 +-1.29678542142503672174 +-1.29747977134970904345 +-1.29817356703174713317 +-1.29886680896562944909 +-1.29955949764545986014 +-1.30025163356497408529 +-1.30094321721753436449 +-1.30163424909613190117 +-1.30232472969338797242 +-1.30301465950155215268 +-1.30370403901250475620 +-1.30439286871775483867 +-1.30508114910844086332 +-1.30576888067533314342 +-1.30645606390882962344 +-1.30714269929896031996 +-1.30782878733538643345 +-1.30851432850739790581 +-1.30919932330391675102 +-1.30988377221349683310 +-1.31056767572432164570 +-1.31125103432420742067 +-1.31193384850060068558 +-1.31261611874058115035 +-1.31329784553086170718 +-1.31397902935778310152 +-1.31465967070732214772 +-1.31533977006508751018 +-1.31601932791632103559 +-1.31669834474589508844 +-1.31737682103831810210 +-1.31805475727772902772 +-1.31873215394790221922 +-1.31940901153224632303 +-1.32008533051380050338 +-1.32076111137524243588 +-1.32143635459887875960 +-1.32211106066665484704 +-1.32278523006014880892 +-1.32345886326057393667 +-1.32413196074877759223 +-1.32480452300524320641 +-1.32547655051008783644 +-1.32614804374306638479 +-1.32681900318356782442 +-1.32748942931061675310 +-1.32815932260287450362 +-1.32882868353863781152 +-1.32949751259584081353 +-1.33016581025205349320 +-1.33083357698448168094 +-1.33150081326996927444 +-1.33216751958499757258 +-1.33283369640568349901 +-1.33349934420778293287 +-1.33416446346668804424 +-1.33482905465743018070 +-1.33549311825467631465 +-1.33615665473273548258 +-1.33681966456555012535 +-1.33748214822670519197 +-1.33814410618942258857 +-1.33880553892656228854 +-1.33946644691062544119 +-1.34012683061375059701 +-1.34078669050771592808 +-1.34144602706393967217 +-1.34210484075348013278 +-1.34276313204703412474 +-1.34342090141494052702 +-1.34407814932717650791 +-1.34473487625336041162 +-1.34539108266275242443 +-1.34604676902425079987 +-1.34670193580639807607 +-1.34735658347737574658 +-1.34801071250500648091 +-1.34866432335675634491 +-1.34931741649973124808 +-1.34996999240067983017 +-1.35062205152599279501 +-1.35127359434170246644 +-1.35192462131348412058 +-1.35257513290665620787 +-1.35322512958617857670 +-1.35387461181665536003 +-1.35452358006233186671 +-1.35517203478709880038 +-1.35581997645448959489 +-1.35646740552768130250 +-1.35711432246949437186 +-1.35776072774239442431 +-1.35840662180848981144 +-1.35905200512953427960 +-1.35969687816692541560 +-1.36034124138170575691 +-1.36098509523456456805 +-1.36162844018583184535 +-1.36227127669548675470 +-1.36291360522315319059 +-1.36355542622810022024 +-1.36419674016924075133 +-1.36483754750513730514 +-1.36547784869399579932 +-1.36611764419366932266 +-1.36675693446165880118 +-1.36739571995510900138 +-1.36803400113081385925 +-1.36867177844521270558 +-1.36930905235439404066 +-1.36994582331409198162 +-1.37058209177968892689 +-1.37121785820621577834 +-1.37185312304834949870 +-1.37248788676041533208 +-1.37312214979638946843 +-1.37375591260989393660 +-1.37438917565419949085 +-1.37502193938222738723 +-1.37565420424654538678 +-1.37628597069937308461 +-1.37691723919257769104 +-1.37754801017767603000 +-1.37817828410583476106 +-1.37880806142787104562 +-1.37943734259425054844 +-1.38006612805509165653 +-1.38069441826016126029 +-1.38132221365887608577 +-1.38194951470030513718 +-1.38257632183316792052 +-1.38320263550583577583 +-1.38382845616632899066 +-1.38445378426232235114 +-1.38507862024113936883 +-1.38570296454975805389 +-1.38632681763480558601 +-1.38695017994256319938 +-1.38757305191896485042 +-1.38819543400959499735 +-1.38881732665969170881 +-1.38943873031414799613 +-1.39005964541750559604 +-1.39068007241396229823 +-1.39130001174736994685 +-1.39191946386123177604 +-1.39253842919870640671 +-1.39315690820260451588 +-1.39377490131539305551 +-1.39439240897919169981 +-1.39500943163577506567 +-1.39562596972657271266 +-1.39624202369266825485 +-1.39685759397480024901 +-1.39747268101336308277 +-1.39808728524840630847 +-1.39870140711963486524 +-1.39931504706640907898 +-1.39992820552774355214 +-1.40054088294231293688 +-1.40115307974844416350 +-1.40176479638412310180 +-1.40237603328699012017 +-1.40298679089434408240 +-1.40359706964313901700 +-1.40420686996998744789 +-1.40481619231115839597 +-1.40542503710257804528 +-1.40603340477983174139 +-1.40664129577816021666 +-1.40724871053246269881 +-1.40785564947729913143 +-1.40846211304688395671 +-1.40906810167509233267 +-1.40967361579545746864 +-1.41027865584117151343 +-1.41088322224508511127 +-1.41148731543970917812 +-1.41209093585721245923 +-1.41269408392942374952 +-1.41329676008783233776 +-1.41389896476358645216 +-1.41450069838749392659 +-1.41510196139002397686 +-1.41570275420130498034 +-1.41630307725112780659 +-1.41690293096894137648 +-1.41750231578385732512 +-1.41810123212464778142 +-1.41869968041974625628 +-1.41929766109724719847 +-1.41989517458490732693 +-1.42049222131014474257 +-1.42108880170003892829 +-1.42168491618133296939 +-1.42228056518043066703 +-1.42287574912339898070 +-1.42347046843596780619 +-1.42406472354352864329 +-1.42465851487113726037 +-1.42525184284351214004 +-1.42584470788503425709 +-1.42643711041974863285 +-1.42702905087136544537 +-1.42762052966325603265 +-1.42821154721845822166 +-1.42880210395967122139 +-1.42939220030926139593 +-1.42998183668925826773 +-1.43057101352135562777 +-1.43115973122691375607 +-1.43174799022695609096 +-1.43233579094217233774 +-1.43292313379291691433 +-1.43351001919921072769 +-1.43409644758074072968 +-1.43468241935685791866 +-1.43526793494658000405 +-1.43585299476859251655 +-1.43643759924124569949 +-1.43702174878255695134 +-1.43760544381021082572 +-1.43818868474155747705 +-1.43877147199361621333 +-1.43935380598307194333 +-1.43993568712627739714 +-1.44051711583925357019 +-1.44109809253768883508 +-1.44167861763693894162 +-1.44225869155202901517 +-1.44283831469765155830 +-1.44341748748816778303 +-1.44399621033760805489 +-1.44457448365966989456 +-1.44515230786772219673 +-1.44572968337480212142 +-1.44630661059361464993 +-1.44688308993653680368 +-1.44745912181561386944 +-1.44803470664256028755 +-1.44860984482876253843 +-1.44918453678527470174 +-1.44975878292282445159 +-1.45033258365180683924 +-1.45090593938229073245 +-1.45147885052401237616 +-1.45205131748638183176 +-1.45262334067847875829 +-1.45319492050905596514 +-1.45376605738653719158 +-1.45433675171901599654 +-1.45490700391425997751 +-1.45547681437970855001 +-1.45604618352247250357 +-1.45661511174933555601 +-1.45718359946675568573 +-1.45775164708086002463 +-1.45831925499745196362 +-1.45888642362200515734 +-1.45945315335966974146 +-1.46001944461526722563 +-1.46058529779329271392 +-1.46115071329791579302 +-1.46171569153297942201 +-1.46228023290200193074 +-1.46284433780817391124 +-1.46340800665436332473 +-1.46397123984310884026 +-1.46453403777662782836 +-1.46509640085681014376 +-1.46565832948522167811 +-1.46621982406310413793 +-1.46678088499137415646 +-1.46734151267062307156 +-1.46790170750112025644 +-1.46846146988280845669 +-1.46902080021530934140 +-1.46957969889791995044 +-1.47013816632961180630 +-1.47069620290903579907 +-1.47125380903451929981 +-1.47181098510406460633 +-1.47236773151535427218 +-1.47292404866574599964 +-1.47347993695227508226 +-1.47403539677165618116 +-1.47459042852028021642 +-1.47514503259421614345 +-1.47569920938921317344 +-1.47625295930069633243 +-1.47680628272377090227 +-1.47735918005321953395 +-1.47791165168350469017 +-1.47846369800876886735 +-1.47901531942283126497 +-1.47956651631919289258 +-1.48011728909103235097 +-1.48066763813120938487 +-1.48121756383226399478 +-1.48176706658641466063 +-1.48231614678556056219 +-1.48286480482128313341 +-1.48341304108484051127 +-1.48396085596717641764 +-1.48450824985891149943 +-1.48505522315034954595 +-1.48560177623147593451 +-1.48614790949195607617 +-1.48669362332113630387 +-1.48723891810804875746 +-1.48778379424140183573 +-1.48832825210959107665 +-1.48887229210069071961 +-1.48941591460245970069 +-1.48995912000233854400 +-1.49050190868745113804 +-1.49104428104460295934 +-1.49158623746028418111 +-1.49212777832066834094 +-1.49266890401161056445 +-1.49320961491865089599 +-1.49374991142701429858 +-1.49428979392160687922 +-1.49482926278702166201 +-1.49536831840753348111 +-1.49590696116710364372 +-1.49644519144937770960 +-1.49698300963768504701 +-1.49752041611504038698 +-1.49805741126414471154 +-1.49859399546738192299 +-1.49913016910682395100 +-1.49966593256422742186 +-1.50020128622103410265 +-1.50073623045837223344 +-1.50127076565705630529 +-1.50180489219758639408 +-1.50233861046015038099 +-1.50287192082462262022 +-1.50340482367056216262 +-1.50393731937721764069 +-1.50446940832352371586 +-1.50500109088810152258 +-1.50553236744926133284 +-1.50606323838500055778 +-1.50659370407300419181 +-1.50712376489064325824 +-1.50765342121498124861 +-1.50818267342276612908 +-1.50871152189043700176 +-1.50923996699411944178 +-1.50976800910962882796 +-1.51029564861246901053 +-1.51082288587783430955 +-1.51134972128060773855 +-1.51187615519536056041 +-1.51240218799635517399 +-1.51292782005754289365 +-1.51345305175256616970 +-1.51397788345475636795 +-1.51450231553713554611 +-1.51502634837241600962 +-1.51554998233300297628 +-1.51607321779098791481 +-1.51659605511815698264 +-1.51711849468598680701 +-1.51764053686564448498 +-1.51816218202798913772 +-1.51868343054357102240 +-1.51920428278263219823 +-1.51972473911510919109 +-1.52024479991062722029 +-1.52076446553850486154 +-1.52128373636775338085 +-1.52180261276707740059 +-1.52232109510487356729 +-1.52283918374923166184 +-1.52335687906793459945 +-1.52387418142845865177 +-1.52439109119797322478 +-1.52490760874334174702 +-1.52542373443112166953 +-1.52593946862756402183 +-1.52645481169861296777 +-1.52696976400991024647 +-1.52748432592678784481 +-1.52799849781427532491 +-1.52851228003709582737 +-1.52902567295966784755 +-1.52953867694610501360 +-1.53005129236021542027 +-1.53056351956550340532 +-1.53107535892517043763 +-1.53158681080211067638 +-1.53209787555891518984 +-1.53260855355787350973 +-1.53311884516096830211 +-1.53362875072988069647 +-1.53413827062598717710 +-1.53464740521036224763 +-1.53515615484377576649 +-1.53566451988669627760 +-1.53617250069928923395 +-1.53668009764141633156 +-1.53718731107263861801 +-1.53769414135221316187 +-1.53820058883909727143 +-1.53870665389194294370 +-1.53921233686910441385 +-1.53971763812863082777 +-1.54022255802827201521 +-1.54072709692547693550 +-1.54123125517739056889 +-1.54173503314085991178 +-1.54223843117243042400 +-1.54274144962834691697 +-1.54324408886455244350 +-1.54374634923669251663 +-1.54424823110011000260 +-1.54474973480984889562 +-1.54525086072065365173 +-1.54575160918696941081 +-1.54625198056293977622 +-1.54675197520241169968 +-1.54725159345893148455 +-1.54775083568574700621 +-1.54824970223580749007 +-1.54874819346176284540 +-1.54924630971596566376 +-1.54974405135046877646 +-1.55024141871702791917 +-1.55073841216710039959 +-1.55123503205184687381 +-1.55173127872212868184 +-1.55222715252850940182 +-1.55272265382125795874 +-1.55321778295034418349 +-1.55371254026544036719 +-1.55420692611592370369 +-1.55470094085087362501 +-1.55519458481907202341 +-1.55568785836900769226 +-1.55618076184886988678 +-1.55667329560655387510 +-1.55716545998965871789 +-1.55765725534548682418 +-1.55814868202104572781 +-1.55863974036304786530 +-1.55913043071791057592 +-1.55962075343175587960 +-1.56011070885041047696 +-1.56060029731940685949 +-1.56108951918398286551 +-1.56157837478908234630 +-1.56206686447935449991 +-1.56255498859915475940 +-1.56304274749254390464 +-1.56353014150328939458 +-1.56401717097486581132 +-1.56450383625045397196 +-1.56499013767294092858 +-1.56547607558492107849 +-1.56596165032869527600 +-1.56644686224627283089 +-1.56693171167936995403 +-1.56741619896940997947 +-1.56790032445752380852 +-1.56838408848455101996 +-1.56886749139103898187 +-1.56935053351724329573 +-1.56983321520312779640 +-1.57031553678836521826 +-1.57079749861233586294 +-1.57127910101412981980 +-1.57176034433254674383 +-1.57224122890609452341 +-1.57272175507299105668 +-1.57320192317116269720 +-1.57368173353824736260 +-1.57416118651158987163 +-1.57464028242824882753 +-1.57511902162498884650 +-1.57559740443828899537 +-1.57607543120433568617 +-1.57655310225902689503 +-1.57703041793797238412 +-1.57750737857649170337 +-1.57798398450961574468 +-1.57846023607208674200 +-1.57893613359835982557 +-1.57941167742259858109 +-1.57988686787868126693 +-1.58036170530019681735 +-1.58083619002044595270 +-1.58131032237244273375 +-1.58178410268891322943 +-1.58225753130229462862 +-1.58273060854473990311 +-1.58320333474811136831 +-1.58367571024398756663 +-1.58414773536365771633 +-1.58461941043812637453 +-1.58509073579811055055 +-1.58556171177404126027 +-1.58603233869606352613 +-1.58650261689403593302 +-1.58697254669753107237 +-1.58744212843583754058 +-1.58791136243795594218 +-1.58838024903260310872 +-1.58884878854821098848 +-1.58931698131292575837 +-1.58978482765460871207 +-1.59025232790083670409 +-1.59071948237890170574 +-1.59118629141581191533 +-1.59165275533829198018 +-1.59211887447277922192 +-1.59258464914543074187 +-1.59305007968211809199 +-1.59351516640843060557 +-1.59397990964967273264 +-1.59444430973086603842 +-1.59490836697674898126 +-1.59537208171177757876 +-1.59583545426012474167 +-1.59629848494568049588 +-1.59676117409205353681 +-1.59722352202256767661 +-1.59768552906026783944 +-1.59814719552791517643 +-1.59860852174798884207 +-1.59906950804268710442 +-1.59953015473392667900 +-1.59999046214334184057 +-1.60045043059228708771 +-1.60091006040183470027 +-1.60136935189277762603 +-1.60182830538562681610 +-1.60228692120061300130 +-1.60274519965768580398 +-1.60320314107651595847 +-1.60366074577649442290 +-1.60411801407673015873 +-1.60457494629605479375 +-1.60503154275301751497 +-1.60548780376589039776 +-1.60594372965266618536 +-1.60639932073105740074 +-1.60685457731849812291 +-1.60730949973214309878 +-1.60776408828886996361 +-1.60821834330527568824 +-1.60867226509768057596 +-1.60912585398212715226 +-1.60957911027437794438 +-1.61003203428991836788 +-1.61048462634395717075 +-1.61093688675142487909 +-1.61138881582697468531 +-1.61184041388498222602 +-1.61229168123954713643 +-1.61274261820449016369 +-1.61319322509335760785 +-1.61364350221941799113 +-1.61409344989566339024 +-1.61454306843480965838 +-1.61499235814929664734 +-1.61544131935128798538 +-1.61588995235267285366 +-1.61633825746506332166 +-1.61678623499979545741 +-1.61723388526793177000 +-1.61768120858025854503 +-1.61812820524728806504 +-1.61857487557925594501 +-1.61902121988612535120 +-1.61946723847758144998 +-1.61991293166303984563 +-1.62035829975163814254 +-1.62080334305224083025 +-1.62124806187344017161 +-1.62169245652355220599 +-1.62213652731062096812 +-1.62258027454241604559 +-1.62302369852643391113 +-1.62346679956990014304 +-1.62390957797976343002 +-1.62435203406270356474 +-1.62479416812512433843 +-1.62523598047315931403 +-1.62567747141266849553 +-1.62611864124924143660 +-1.62655949028819257762 +-1.62700001883456812912 +-1.62744022719313963243 +-1.62788011566840884470 +-1.62831968456460507433 +-1.62875893418568828963 +-1.62919786483534423382 +-1.62963647681699042025 +-1.63007477043377213555 +-1.63051274598856488218 +-1.63095040378397326819 +-1.63138774412233233946 +-1.63182476730570491519 +-1.63226147363588669492 +-1.63269786341440159561 +-1.63313393694250463817 +-1.63356969452118128139 +-1.63400513645114697781 +-1.63444026303284850599 +-1.63487507456646374848 +-1.63530957135190191387 +-1.63574375368880287063 +-1.63617762187653714712 +-1.63661117621420926227 +-1.63704441700065306264 +-1.63747734453443483105 +-1.63790995911385439676 +-1.63834226103694335919 +-1.63877425060146264535 +-1.63920592810490939328 +-1.63963729384451140092 +-1.64006834811723134493 +-1.64049909121976278392 +-1.64092952344853260094 +-1.64135964509970233571 +-1.64178945646916485401 +-1.64221895785254923261 +-1.64264814954521609636 +-1.64307703184226094884 +-1.64350560503851417238 +-1.64393386942853769739 +-1.64436182530663099755 +-1.64478947296682598278 +-1.64521681270289077403 +-1.64564384480832659463 +-1.64607056957637043482 +-1.64649698729999505176 +-1.64692309827190785931 +-1.64734890278455203827 +-1.64777440113010631428 +-1.64819959360048473584 +-1.64862448048733756245 +-1.64904906208205126461 +-1.64947333867574852384 +-1.64989731055928845471 +-1.65032097802326704894 +-1.65074434135801606516 +-1.65116740085360436119 +-1.65159015679983833813 +-1.65201260948626149627 +-1.65243475920215399100 +-1.65285660623653440915 +-1.65327815087815821471 +-1.65369939341551885903 +-1.65412033413684711469 +-1.65454097333011329596 +-1.65496131128302526037 +-1.65538134828302929691 +-1.65580108461730879377 +-1.65622052057278801307 +-1.65663965643612876022 +-1.65705849249373260434 +-1.65747702903173999012 +-1.65789526633603045980 +-1.65831320469222309733 +-1.65873084438567652832 +-1.65914818570149069643 +-1.65956522892450242246 +-1.65998197433929117750 +-1.66039842223017530820 +-1.66081457288121403515 +-1.66123042657620811902 +-1.66164598359869697397 +-1.66206124423196199835 +-1.66247620875902635262 +-1.66289087746265251688 +-1.66330525062534584357 +-1.66371932852935255909 +-1.66413311145666109603 +-1.66454659968899987277 +-1.66495979350784173434 +-1.66537269319439884541 +-1.66578529902962846343 +-1.66619761129422894186 +-1.66660963026863973013 +-1.66702135623304537049 +-1.66743278946737261137 +-1.66784393025128974131 +-1.66825477886420925344 +-1.66866533558528784553 +-1.66907560069342464359 +-1.66948557446726164599 +-1.66989525718518638797 +-1.67030464912532816690 +-1.67071375056556337135 +-1.67112256178350904179 +-1.67153108305652930987 +-1.67193931466173162370 +-1.67234725687596874621 +-1.67275490997583720088 +-1.67316227423767949212 +-1.67356934993758299512 +-1.67397613735137973379 +-1.67438263675464882319 +-1.67478884842271225075 +-1.67519477263064087147 +-1.67560040965324907880 +-1.67600575976509880149 +-1.67641082324049639496 +-1.67681560035349663806 +-1.67722009137789962452 +-1.67762429658725231718 +-1.67802821625484854806 +-1.67843185065372813014 +-1.67883520005667974395 +-1.67923826473623849509 +-1.67964104496468680239 +-1.68004354101405439792 +-1.68044575315611899313 +-1.68084768166240627885 +-1.68124932680419014730 +-1.68165068885249224806 +-1.68205176807808287620 +-1.68245256475147964004 +-1.68285307914295101384 +-1.68325331152251234101 +-1.68365326215992827663 +-1.68405293132471300943 +-1.68445231928613003980 +-1.68485142631319195772 +-1.68525025267465955459 +-1.68564879863904604207 +-1.68604706447461194507 +-1.68644505044937043081 +-1.68684275683108131361 +-1.68724018388725749418 +-1.68763733188516096284 +-1.68803420109180457587 +-1.68843079177395316570 +-1.68882710419811998825 +-1.68922313863057205197 +-1.68961889533732434465 +-1.69001437458414649484 +-1.69040957663655699861 +-1.69080450175982877070 +-1.69119915021898292729 +-1.69159352227879589137 +-1.69198761820379384169 +-1.69238143825825582134 +-1.69277498270621462595 +-1.69316825181145413914 +-1.69356124583751110890 +-1.69395396504767470347 +-1.69434640970498850976 +-1.69473858007224786881 +-1.69513047641200231830 +-1.69552209898655381615 +-1.69591344805795918305 +-1.69630452388802810404 +-1.69669532673832423875 +-1.69708585687016588750 +-1.69747611454462465908 +-1.69786610002252658091 +-1.69825581356445298731 +-1.69864525543073940916 +-1.69903442588147579606 +-1.69942332517650762647 +-1.69981195357543501956 +-1.70020031133761317932 +-1.70058839872215372679 +-1.70097621598792203557 +-1.70136376339354078446 +-1.70175104119738818120 +-1.70213804965759796239 +-1.70252478903205961558 +-1.70291125957841993355 +-1.70329746155408123798 +-1.70368339521620404398 +-1.70406906082170284122 +-1.70445445862725120101 +-1.70483958888927866759 +-1.70522445186397320072 +-1.70560904780727895513 +-1.70599337697489672472 +-1.70637743962228727312 +-1.70676123600466689290 +-1.70714476637701162431 +-1.70752803099405414677 +-1.70791103011028577718 +-1.70829376397995735815 +-1.70867623285707637137 +-1.70905843699540938019 +-1.70944037664848291769 +-1.70982205206958126631 +-1.71020346351174845623 +-1.71058461122778782126 +-1.71096549547026155480 +-1.71134611649149137591 +-1.71172647454355897345 +-1.71210656987830711628 +-1.71248640274733587852 +-1.71286597340200819062 +-1.71324528209344495444 +-1.71362432907252859593 +-1.71400311458990306512 +-1.71438163889597161571 +-1.71475990224089902547 +-1.71513790487460959788 +-1.71551564704679182505 +-1.71589312900689372476 +-1.71627035100412372870 +-1.71664731328745423511 +-1.71702401610561694589 +-1.71740045970710841772 +-1.71777664434018384476 +-1.71815257025286349801 +-1.71852823769292850642 +-1.71890364690792263325 +-1.71927879814515360835 +-1.71965369165168979748 +-1.72002832767436331096 +-1.72040270645977044772 +-1.72077682825427014102 +-1.72115069330398418046 +-1.72152430185479743407 +-1.72189765415236051282 +-1.72227075044208532972 +-1.72264359096914954073 +-1.72301617597849521246 +-1.72338850571482637974 +-1.72376058042261348646 +-1.72413240034609183127 +-1.72450396572925912508 +-1.72487527681588082018 +-1.72524633384948522519 +-1.72561713707336616963 +-1.72598768673058411416 +-1.72635798306396281987 +-1.72672802631609378921 +-1.72709781672933271324 +-1.72746735454580191416 +-1.72783664000738967914 +-1.72820567335574915013 +-1.72857445483230276473 +-1.72894298467823648302 +-1.72931126313450467258 +-1.72967929044182722187 +-1.73004706684069131661 +-1.73041459257135166183 +-1.73078186787383025980 +-1.73114889298791529981 +-1.73151566815316448888 +-1.73188219360889972265 +-1.73224846959421485693 +-1.73261449634796860231 +-1.73298027410878940913 +-1.73334580311507324701 +-1.73371108360498382694 +-1.73407611581645482168 +-1.73444089998718742329 +-1.73480543635465234154 +-1.73516972515608847161 +-1.73553376662850489254 +-1.73589756100867820265 +-1.73626110853315607230 +-1.73662440943825502337 +-1.73698746396006131754 +-1.73735027233443117822 +-1.73771283479698990249 +-1.73807515158313341530 +-1.73843722292802937979 +-1.73879904906661364450 +-1.73916063023359379613 +-1.73952196666344782727 +-1.73988305859042391432 +-1.74024390624854241594 +-1.74060450987159454073 +-1.74096486969314145909 +-1.74132498594651785595 +-1.74168485886482837799 +-1.74204448868094941005 +-1.74240387562753062944 +-1.74276301993699167525 +-1.74312192184152636720 +-1.74348058157309915295 +-1.74383899936344755055 +-1.74419717544408214849 +-1.74455511004628416316 +-1.74491280340111210023 +-1.74527025573939176262 +-1.74562746729172668658 +-1.74598443828849125836 +-1.74634116895983382278 +-1.74669765953567757144 +-1.74705391024571698999 +-1.74740992131942318721 +-1.74776569298603789981 +-1.74812122547458081989 +-1.74847651901384337769 +-1.74883157383239229432 +-1.74918639015856847152 +-1.74954096822048832394 +-1.74989530824604200276 +-1.75024941046289561619 +-1.75060327509849011918 +-1.75095690238004220163 +-1.75131029253454295613 +-1.75166344578876009841 +-1.75201636236923663503 +-1.75236904250229130753 +-1.75272148641401903646 +-1.75307369433029136552 +-1.75342566647675579539 +-1.75377740307883533966 +-1.75412890436173052322 +-1.75448017055042027046 +-1.75483120186965679821 +-1.75518199854397227710 +-1.75553256079767461273 +-1.75588288885484922197 +-1.75623298293935925507 +-1.75658284327484603971 +-1.75693247008472686055 +-1.75728186359219940016 +-1.75763102402023663196 +-1.75797995159159192724 +-1.75832864652879594658 +-1.75867710905415775002 +-1.75902533938976524119 +-1.75937333775748494524 +-1.75972110437896267499 +-1.76006863947562264272 +-1.76041594326866857045 +-1.76076301597908391194 +-1.76110985782763029839 +-1.76145646903484998091 +-1.76180284982106538649 +-1.76214900040637778567 +-1.76249492101066929095 +-1.76284061185360041435 +-1.76318607315461450824 +-1.76353130513293399062 +-1.76387630800756189942 +-1.76422108199728233657 +-1.76456562732066046806 +-1.76490994419604141363 +-1.76525403284155202321 +-1.76559789347510109891 +-1.76594152631437939505 +-1.76628493157685650949 +-1.76662810947978599074 +-1.76697106024020289539 +-1.76731378407492445426 +-1.76765628120054940631 +-1.76799855183345977494 +-1.76834059618981820350 +-1.76868241448557217410 +-1.76902400693645067697 +-1.76936537375796509863 +-1.76970651516541077619 +-1.77004743137386566509 +-1.77038812259819211548 +-1.77072858905303354149 +-1.77106883095281952833 +-1.77140884851176116932 +-1.77174864194385506266 +-1.77208821146288153514 +-1.77242755728240397595 +-1.77276667961577061305 +-1.77310557867611562344 +-1.77344425467635469218 +-1.77378270782919078563 +-1.77412093834711059870 +-1.77445894644238566507 +-1.77479673232707302333 +-1.77513429621301543904 +-1.77547163831184007243 +-1.77580875883496025480 +-1.77614565799357526643 +-1.77648233599866833821 +-1.77681879306101153659 +-1.77715502939116154479 +-1.77749104519946077296 +-1.77782684069603891253 +-1.77816241609081138186 +-1.77849777159348154676 +-1.77883290741353805586 +-1.77916782376025728318 +-1.77950252084270332809 +-1.77983699886972712711 +-1.78017125804996467764 +-1.78050529859184303305 +-1.78083912070357541779 +-1.78117272459316211553 +-1.78150611046839202345 +-1.78183927853684243026 +-1.78217222900587857204 +-1.78250496208265341025 +-1.78283747797410940805 +-1.78316977688697653193 +-1.78350185902777558233 +-1.78383372460281308669 +-1.78416537381818685049 +-1.78449680687978351479 +-1.78482802399327944443 +-1.78515902536413939572 +-1.78548981119761851488 +-1.78582038169876033962 +-1.78615073707240079592 +-1.78648087752316397925 +-1.78681080325546415288 +-1.78714051447350685820 +-1.78747001138128691622 +-1.78779929418259131424 +-1.78812836308099543103 +-1.78845721827986792185 +-1.78878585998236694365 +-1.78911428839144215353 +-1.78944250370983470866 +-1.78977050614007748841 +-1.79009829588449309590 +-1.79042587314519807684 +-1.79075323812410047708 +-1.79108039102289851030 +-1.79140733204308411075 +-1.79173406138594160097 +-1.79206057925254635954 +-1.79238688584376815172 +-1.79271298136026691061 +-1.79303886600249740013 +-1.79336453997070743860 +-1.79369000346493612241 +-1.79401525668501782285 +-1.79434029983057863333 +-1.79466513310103881196 +-1.79498975669561167123 +-1.79531417081330624264 +-1.79563837565292283571 +-1.79596237141305747897 +-1.79628615829210014354 +-1.79660973648823452109 +-1.79693310619943891204 +-1.79725626762348689169 +-1.79757922095794664408 +-1.79790196640018073992 +-1.79822450414734613666 +-1.79854683439639684295 +-1.79886895734407925573 +-1.79919087318693926569 +-1.79951258212131448566 +-1.79983408434334091197 +-1.80015538004894803947 +-1.80047646943386308038 +-1.80079735269360852179 +-1.80111803002350479019 +-1.80143850161866536652 +-1.80175876767400278133 +-1.80207882838422617233 +-1.80239868394384106232 +-1.80271833454714935918 +-1.80303778038824980001 +-1.80335702166104017152 +-1.80367605855921420144 +-1.80399489127626244667 +-1.80431352000547517989 +-1.80463194493993861478 +-1.80495016627253734853 +-1.80526818419595413978 +-1.80558599890267035271 +-1.80590361058496484681 +-1.80622101943491508713 +-1.80653822564439892062 +-1.80685522940508902501 +-1.80717203090846023628 +-1.80748863034578555187 +-1.80780502790813635272 +-1.80812122378638506781 +-1.80843721817120051121 +-1.80875301125305432137 +-1.80906860322221541004 +-1.80938399426875395903 +-1.80969918458253942184 +-1.81001417435324074567 +-1.81032896377032881396 +-1.81064355302307333773 +-1.81095794230054396579 +-1.81127213179161405954 +-1.81158612168495536388 +-1.81189991216903867333 +-1.81221350343214071543 +-1.81252689566233549101 +-1.81284008904749871505 +-1.81315308377531003714 +-1.81346588003324837857 +-1.81377847800859370864 +-1.81409087788843037536 +-1.81440307985964310866 +-1.81471508410891857466 +-1.81502689082274781818 +-1.81533850018742093368 +-1.81564991238903328252 +-1.81596112761348105202 +-1.81627214604646525231 +-1.81658296787348705337 +-1.81689359327985400228 +-1.81720402245067380598 +-1.81751425557085921625 +-1.81782429282512647539 +-1.81813413439799487215 +-1.81844378047378718577 +-1.81875323123663079627 +-1.81906248687045657420 +-1.81937154755900065695 +-1.81968041348580111816 +-1.81998908483420263060 +-1.82029756178735402372 +-1.82060584452820872770 +-1.82091393323952321914 +-1.82122182810386212815 +-1.82152952930359268713 +-1.82183703702088828358 +-1.82214435143772779391 +-1.82245147273589624959 +-1.82275840109698150648 +-1.82306513670238001801 +-1.82337167973329372650 +-1.82367803037072984118 +-1.82398418879550194838 +-1.82429015518823001152 +-1.82459592972934059318 +-1.82490151259906685510 +-1.82520690397744833611 +-1.82551210404433073009 +-1.82581711297936966076 +-1.82612193096202313214 +-1.82642655817156152054 +-1.82673099478705780463 +-1.82703524098739711334 +-1.82733929695126828818 +-1.82764316285716965638 +-1.82794683888340792066 +-1.82825032520809704906 +-1.82855362200915894100 +-1.82885672946432542574 +-1.82915964775113426555 +-1.82946237704693381865 +-1.82976491752888059672 +-1.83006726937393948695 +-1.83036943275888486227 +-1.83067140786030058131 +-1.83097319485457910027 +-1.83127479391792169494 +-1.83157620522634090321 +-1.83187742895565719436 +-1.83217846528150185570 +-1.83247931437931632637 +-1.83277997642435042103 +-1.83308045159166632665 +-1.83338074005613416162 +-1.83368084199243708277 +-1.83398075757506773265 +-1.83428048697832779546 +-1.83458003037633288201 +-1.83487938794300675660 +-1.83517855985208666603 +-1.83547754627712000897 +-1.83577634739146500209 +-1.83607496336829090211 +-1.83637339438058178054 +-1.83667164060112986235 +-1.83696970220254174322 +-1.83726757935723439275 +-1.83756527223743781896 +-1.83786278101519462425 +-1.83816010586235933921 +-1.83845724695059775655 +-1.83875420445139181602 +-1.83905097853603316516 +-1.83934756937562782220 +-1.83964397714109439974 +-1.83994020200316410474 +-1.84023624413238429121 +-1.84053210369911224298 +-1.84082778087352161300 +-1.84112327582559753836 +-1.84141858872514130319 +-1.84171371974176634190 +-1.84200866904490179188 +-1.84230343680379005100 +-1.84259802318748766581 +-1.84289242836486666377 +-1.84318665250461410920 +-1.84348069577523032692 +-1.84377455834503201082 +-1.84406824038214955941 +-1.84436174205452974029 +-1.84465506352993480199 +-1.84494820497594202990 +-1.84524116655994374625 +-1.84553394844914886441 +-1.84582655081058155666 +-1.84611897381108258642 +-1.84641121761730842010 +-1.84670328239573189322 +-1.84699516831264221040 +-1.84728687553414561151 +-1.84757840422616448350 +-1.84786975455443736038 +-1.84816092668452136571 +-1.84845192078178888195 +-1.84874273701143154724 +-1.84903337553845537045 +-1.84932383652768672633 +-1.84961412014376791468 +-1.84990422655116026895 +-1.85019415591414082556 +-1.85048390839680609865 +-1.85077348416307119194 +-1.85106288337666757826 +-1.85135210620114709634 +-1.85164115279987950835 +-1.85193002333605205578 +-1.85221871797267123583 +-1.85250723687256368954 +-1.85279558019837375937 +-1.85308374811256548753 +-1.85337174077742172784 +-1.85365955835504481186 +-1.85394720100735721502 +-1.85423466889610066843 +-1.85452196218283593687 +-1.85480908102894570533 +-1.85509602559563058222 +-1.85538279604391243005 +-1.85566939253463325521 +-1.85595581522845542999 +-1.85624206428586235873 +-1.85652813986715781169 +-1.85681404213246592505 +-1.85709977124173231111 +-1.85738532735472272606 +-1.85767071063102662265 +-1.85795592123005248730 +-1.85824095931103050461 +-1.85852582503301411165 +-1.85881051855487577917 +-1.85909504003531234062 +-1.85937938963284232763 +-1.85966356750580374957 +-1.85994757381236142102 +-1.86023140871049807998 +-1.86051507235802104923 +-1.86079856491256090401 +-1.86108188653157013981 +-1.86136503737232406053 +-1.86164801759192188868 +-1.86193082734728410088 +-1.86221346679515642464 +-1.86249593609210695178 +-1.86277823539452791479 +-1.86306036485863502072 +-1.86334232464046745115 +-1.86362411489588852831 +-1.86390573578058660331 +-1.86418718745007239157 +-1.86446847005968141531 +-1.86474958376457622400 +-1.86503052871973928895 +-1.86531130507998166301 +-1.86559191299993765156 +-1.86587235263406681085 +-1.86615262413665394803 +-1.86643272766180867706 +-1.86671266336346564074 +-1.86699243139538628711 +-1.86727203191115687098 +-1.86755146506418867602 +-1.86783073100772067932 +-1.86810982989481577654 +-1.86838876187836411269 +-1.86866752711108152774 +-1.86894612574551199913 +-1.86922455793402342294 +-1.86950282382881161070 +-1.86978092358189940114 +-1.87005885734513643825 +-1.87033662527019872712 +-1.87061422750858930009 +-1.87089166421164021514 +-1.87116893553050833710 +-1.87144604161618000049 +-1.87172298261946856712 +-1.87199975869101553627 +-1.87227636998128987855 +-1.87255281664058759183 +-1.87282909881903547600 +-1.87310521666658669204 +-1.87338117033302298253 +-1.87365695996795400546 +-1.87393258572082133107 +-1.87420804774089022615 +-1.87448334617725897999 +-1.87475848117885335320 +-1.87503345289442879817 +-1.87530826147256979297 +-1.87558290706168939721 +-1.87585738981003191661 +-1.87613170986567046050 +-1.87640586737650805205 +-1.87667986249027674006 +-1.87695369535454026355 +-1.87722736611669183127 +-1.87750087492395478783 +-1.87777422192338283580 +-1.87804740726186070177 +-1.87832043108610391435 +-1.87859329354265747192 +-1.87886599477789983936 +-1.87913853493803784112 +-1.87941091416911199019 +-1.87968313261699271344 +-1.87995519042738057358 +-1.88022708774581115421 +-1.88049882471764884251 +-1.88077040148809104814 +-1.88104181820216664889 +-1.88131307500473821115 +-1.88158417204049754901 +-1.88185510945397194149 +-1.88212588738951924761 +-1.88239650599132968267 +-1.88266696540342759469 +-1.88293726576966968800 +-1.88320740723374524528 +-1.88347738993917634964 +-1.88374721402931966097 +-1.88401687964736352932 +-1.88428638693633110357 +-1.88455573603907788893 +-1.88482492709829552169 +-1.88509396025650555195 +-1.88536283565606721524 +-1.88563155343917276952 +-1.88590011374784727316 +-1.88616851672395169359 +-1.88643676250918046478 +-1.88670485124506392971 +-1.88697278307296589794 +-1.88724055813408586602 +-1.88750817656945768519 +-1.88777563851995089372 +-1.88804294412627005073 +-1.88831009352895429210 +-1.88857708686837999501 +-1.88884392428475700321 +-1.88911060591813262377 +-1.88937713190838918464 +-1.88964350239524514485 +-1.88990971751825553859 +-1.89017577741681064296 +-1.89044168223013819841 +-1.89070743209730118828 +-1.89097302715719983723 +-1.89123846754857138919 +-1.89150375340999077345 +-1.89176888487986816223 +-1.89203386209645008087 +-1.89229868519782384872 +-1.89256335432191025170 +-1.89282786960647131380 +-1.89309223118910185946 +-1.89335643920724017164 +-1.89362049379815644556 +-1.89388439509896455704 +-1.89414814324661229250 +-1.89441173837788756629 +-1.89467518062941620016 +-1.89493847013766170129 +-1.89520160703892792675 +-1.89546459146935575291 +-1.89572742356492618399 +-1.89599010346145835371 +-1.89625263129461130163 +-1.89651500719988130861 +-1.89677723131260700384 +-1.89703930376796425783 +-1.89730122470096884690 +-1.89756299424647689733 +-1.89782461253918333099 +-1.89808607971362519606 +-1.89834739590417722610 +-1.89860856124505561482 +-1.89886957587031557360 +-1.89913043991385466214 +-1.89939115350941012395 +-1.89965171679055933041 +-1.89991212989072133510 +-1.90017239294315576359 +-1.90043250608096347953 +-1.90069246943708569653 +-1.90095228314430619854 +-1.90121194733524978560 +-1.90147146214238249584 +-1.90173082769801182756 +-1.90199004413428784943 +-1.90224911158320209026 +-1.90250803017658820515 +-1.90276680004612197550 +-1.90302542132332175306 +-1.90328389413954801590 +-1.90354221862600292425 +-1.90380039491373342919 +-1.90405842313362771989 +-1.90431630341641744408 +-1.90457403589267615374 +-1.90483162069282241369 +-1.90508905794711624893 +-1.90534634778566269731 +-1.90560349033840892297 +-1.90586048573514710291 +-1.90611733410551154044 +-1.90637403557898221784 +-1.90663059028488146573 +-1.90688699835237596147 +-1.90714325991047917164 +-1.90739937508804557886 +-1.90765534401377534479 +-1.90791116681621386597 +-1.90816684362375044159 +-1.90842237456461960576 +-1.90867775976690179363 +-1.90893299935852089888 +-1.90918809346724693832 +-1.90944304222069449750 +-1.90969784574632539531 +-1.90995250417144446509 +-1.91020701762320532779 +-1.91046138622860439682 +-1.91071561011448620704 +-1.91096968940753964006 +-1.91122362423430192102 +-1.91147741472115506589 +-1.91173106099432832394 +-1.91198456317989573527 +-1.91223792140377990556 +-1.91249113579175000766 +-1.91274420646942133750 +-1.91299713356225753458 +-1.91324991719556791736 +-1.91350255749450992582 +-1.91375505458408756709 +-1.91400740858915430209 +-1.91425961963440882663 +-1.91451168784439884618 +-1.91476361334352151999 +-1.91501539625601813199 +-1.91526703670598164031 +-1.91551853481735223639 +-1.91576989071391712294 +-1.91602110451931340052 +-1.91627217635702717935 +-1.91652310635039202502 +-1.91677389462259051278 +-1.91702454129665600391 +-1.91727504649546798277 +-1.91752541034175827406 +-1.91777563295810482558 +-1.91802571446693770341 +-1.91827565499053620535 +-1.91852545465102730660 +-1.91877511357039098883 +-1.91902463187045291271 +-1.91927400967289307765 +-1.91952324709923982660 +-1.91977234427087095625 +-1.92002130130901571547 +-1.92027011833475413916 +-1.92051879546901682616 +-1.92076733283258405116 +-1.92101573054608820712 +-1.92126398873001225098 +-1.92151210750469014776 +-1.92176008699030753668 +-1.92200792730690062093 +-1.92225562857435816611 +-1.92250319091241994585 +-1.92275061444067740801 +-1.92299789927857389671 +-1.92324504554540487433 +-1.92349205336031880975 +-1.92373892284231362559 +-1.92398565411024335958 +-1.92423224728281150320 +-1.92447870247857455439 +-1.92472501981594334985 +-1.92497119941317995639 +-1.92521724138839989138 +-1.92546314585957234478 +-1.92570891294451862485 +-1.92595454276091326840 +-1.92620003542628426274 +-1.92644539105801571033 +-1.92669060977334138940 +-1.92693569168935119329 +-1.92718063692298779976 +-1.92742544559104955759 +-1.92767011781018693384 +-1.92791465369690517839 +-1.92815905336756543420 +-1.92840331693838096250 +-1.92864744452542113962 +-1.92889143624460945858 +-1.92913529221172486139 +-1.92937901254240062876 +-1.92962259735212504630 +-1.92986604675624207061 +-1.93010936086995088523 +-1.93035253980830567855 +-1.93059558368621564384 +-1.93083849261844830991 +-1.93108126671962332388 +-1.93132390610421866839 +-1.93156641088656666483 +-1.93180878118085863626 +-1.93205101710113846813 +-1.93229311876130926962 +-1.93253508627512893270 +-1.93277691975621301879 +-1.93301861931803231620 +-1.93326018507391705903 +-1.93350161713705159805 +-1.93374291562047928572 +-1.93398408063709892346 +-1.93422511229966831436 +-1.93446601072080293093 +-1.93470677601297347259 +-1.93494740828851052861 +-1.93518790765960146949 +-1.93542827423829111311 +-1.93566850813648350105 +-1.93590860946594012226 +-1.93614857833828080125 +-1.93638841486498347599 +-1.93662811915738464208 +-1.93686769132668046289 +-1.93710713148392366101 +-1.93734643974002751499 +-1.93758561620576386098 +-1.93782466099176331475 +-1.93806357420851504969 +-1.93830235596636946127 +-1.93854100637553483644 +-1.93877952554607957403 +-1.93901791358793085251 +-1.93925617061087640636 +-1.93949429672456385987 +-1.93973229203850050517 +-1.93997015666205441242 +-1.94020789070445287550 +-1.94044549427478374426 +-1.94068296748199675683 +-1.94092031043489909869 +-1.94115752324216273017 +-1.94139460601231705894 +-1.94163155885375360299 +-1.94186838187472554651 +-1.94210507518334685173 +-1.94234163888759159278 +-1.94257807309529728634 +-1.94281437791416089489 +-1.94305055345174304549 +-1.94328659981546403301 +-1.94352251711260715084 +-1.94375830545031802465 +-1.94399396493560372434 +-1.94422949567533431825 +-1.94446489777623954254 +-1.94470017134491479638 +-1.94493531648781758925 +-1.94517033331126643070 +-1.94540522192144305080 +-1.94563998242439306630 +-1.94587461492602420421 +-1.94610911953210807823 +-1.94634349634827841236 +-1.94657774548003370541 +-1.94681186703273456651 +-1.94704586111160660167 +-1.94727972782173730515 +-1.94751346726807961218 +-1.94774707955544945648 +-1.94798056478852776863 +-1.94821392307185847770 +-1.94844715450985050964 +-1.94868025920677712115 +-1.94891323726677478945 +-1.94914608879384787521 +-1.94937881389186218328 +-1.94961141266454962562 +-1.94984388521550711104 +-1.95007623164819587913 +-1.95030845206594372065 +-1.95054054657194386735 +-1.95077251526925299352 +-1.95100435826079410262 +-1.95123607564935630521 +-1.95146766753759570712 +-1.95169913402803230085 +-1.95193047522305196395 +-1.95216169122490779131 +-1.95239278213571987308 +-1.95262374805747196405 +-1.95285458909201703470 +-1.95308530534107327448 +-1.95331589690622520195 +-1.95354636388892410892 +-1.95377670639049050294 +-1.95400692451210833411 +-1.95423701835483099032 +-1.95446698801957996494 +-1.95469683360714130416 +-1.95492655521817093600 +-1.95515615295319045153 +-1.95538562691258976933 +-1.95561497719662935602 +-1.95584420390543289869 +-1.95607330713899507657 +-1.95630228699717889640 +-1.95653114357971436021 +-1.95675987698620046373 +-1.95698848731610408613 +-1.95721697466876176641 +-1.95744533914337903724 +-1.95767358083902798249 +-1.95790169985465167812 +-1.95812969628906241581 +-1.95835757024094037071 +-1.95858532180883626594 +-1.95881295109116848607 +-1.95904045818622640773 +-1.95926784319216951147 +-1.95949510620702582742 +-1.95972224732869282349 +-1.95994926665494006990 +-1.96017616428340479828 +-1.96040294031159567645 +-1.96062959483689236428 +-1.96085612795654351537 +-1.96108253976766855331 +-1.96130883036725833790 +-1.96153499985217383283 +-1.96176104831914810411 +-1.96198697586478254529 +-1.96221278258555287266 +-1.96243846857780379622 +-1.96266403393775146213 +-1.96288947876148500704 +-1.96311480314496322741 +-1.96334000718401813224 +-1.96356509097435272260 +-1.96379005461154121370 +-1.96401489819103192147 +-1.96423962180814326572 +-1.96446422555806599064 +-1.96468870953586516315 +-1.96491307383647617613 +-1.96513731855470630272 +-1.96536144378523980336 +-1.96558544962262815581 +-1.96580933616129960306 +-1.96603310349555404635 +-1.96625675171956482146 +-1.96648028092737758854 +-1.96670369121291255254 +-1.96692698266996268686 +-1.96715015539219528762 +-1.96737320947314953123 +-1.96759614500624113731 +-1.96781896208475681753 +-1.96804166080185893861 +-1.96826424125058441206 +-1.96848670352384313986 +-1.96870904771441956882 +-1.96893127391497402279 +-1.96915338221803937202 +-1.96937537271602458588 +-1.96959724550121251241 +-1.96981900066576098851 +-1.97004063830170417226 +-1.97026215850094965631 +-1.97048356135528179855 +-1.97070484695635816941 +-1.97092601539571399272 +-1.97114706676475925917 +-1.97136800115477828221 +-1.97158881865693413893 +-1.97180951936226311894 +-1.97203010336167849914 +-1.97225057074597032170 +-1.97247092160580272946 +-1.97269115603171885098 +-1.97291127411413746984 +-1.97313127594335191439 +-1.97335116160953538689 +-1.97357093120273541231 +-1.97379058481287739113 +-1.97401012252976326700 +-1.97422954444307374722 +-1.97444885064236475003 +-1.97466804121706940300 +-1.97488711625649937531 +-1.97510607584984443363 +-1.97532492008617133195 +-1.97554364905442336742 +-1.97576226284342371109 +-1.97598076154187141107 +-1.97619914523834605546 +-1.97641741402130399763 +-1.97663556797908013252 +-1.97685360719988700851 +-1.97707153177181726988 +-1.97728934178284121437 +-1.97750703732080790331 +-1.97772461847344560582 +-1.97794208532836224279 +-1.97815943797304294449 +-1.97837667649485338117 +-1.97859380098103865286 +-1.97881081151872173507 +-1.97902770819490791965 +-1.97924449109647992984 +-1.97946116031020036274 +-1.97967771592271235548 +-1.97989415802053847493 +-1.98011048669008227208 +-1.98032670201762561746 +-1.98054280408933425228 +-1.98075879299124957278 +-1.98097466880929706790 +-1.98119043162928165636 +-1.98140608153688835280 +-1.98162161861768426618 +-1.98183704295711660137 +-1.98205235464051376937 +-1.98226755375308538731 +-1.98248264037992294462 +-1.98269761460599780456 +-1.98291247651616431291 +-1.98312722619515779954 +-1.98334186372759480044 +-1.98355638919797483410 +-1.98377080269067906926 +-1.98398510428996921462 +-1.98419929407999062754 +-1.98441337214477120376 +-1.98462733856821915701 +-1.98484119343412834802 +-1.98505493682617228934 +-1.98526856882790814218 +-1.98548208952277605022 +-1.98569549899409913962 +-1.98590879732508351907 +-1.98612198459881805768 +-1.98633506089827482910 +-1.98654802630631044380 +-1.98676088090566294042 +-1.98697362477895445032 +-1.98718625800869319598 +-1.98739878067726705169 +-1.98761119286695087105 +-1.98782349465990226811 +-1.98803568613816361577 +-1.98824776738366026940 +-1.98845973847820345348 +-1.98867159950348781905 +-1.98888335054109188782 +-1.98909499167248049467 +-1.98930652297900145697 +-1.98951794454188868322 +-1.98972925644226128483 +-1.98994045876112135574 +-1.99015155157935863528 +-1.99036253497774606736 +-1.99057340903694424128 +-1.99078417383749628478 +-1.99099482945983385918 +-1.99120537598427183035 +-1.99141581349101270959 +-1.99162614206014398910 +-1.99183636177163969627 +-1.99204647270535883941 +-1.99225647494104829427 +-1.99246636855834013957 +-1.99267615363675254514 +-1.99288583025569154827 +-1.99309539849444949944 +-1.99330485843220439612 +-1.99351421014802188125 +-1.99372345372085457704 +-1.99393258922954319523 +-1.99414161675281276231 +-1.99435053636927839271 +-1.99455934815744218014 +-1.99476805219569208738 +-1.99497664856230505492 +-1.99518513733544522459 +-1.99539351859316549387 +-1.99560179241340507339 +-1.99580995887399281763 +-1.99601801805264433831 +-1.99622597002696466895 +-1.99643381487444604439 +-1.99664155267247012127 +-1.99684918349830686779 +-1.99705670742911411963 +-1.99726412454194002244 +-1.99747143491371970114 +-1.99767863862127970087 +-1.99788573574133332400 +-1.99809272635048440492 +-1.99829961052522464549 +-1.99850638834193805593 +-1.99871305987689429351 +-1.99891962520625598998 +-1.99912608440607342253 +-1.99933243755228784444 +-1.99953868472072948670 +-1.99974482598711889025 +-1.99995086142706801624 +-2.00015679111607758145 +-2.00036261512953839059 +-2.00056833354273333470 +-2.00077394643083472658 +-2.00097945386890563313 +-2.00118485593189987526 +-2.00139015269466247204 +-2.00159534423192964070 +-2.00180043061832746432 +-2.00200541192837411231 +-2.00221028823648072859 +-2.00241505961694565841 +-2.00261972614396288606 +-2.00282428789161537352 +-2.00302874493387905730 +-2.00323309734462151610 +-2.00343734519760197088 +-2.00364148856647306118 +-2.00384552752477640425 +-2.00404946214594836817 +-2.00425329250331740738 +-2.00445701867010450670 +-2.00466064071942184910 +-2.00486415872427548024 +-2.00506757275756442027 +-2.00527088289207977567 +-2.00547408920050518333 +-2.00567719175541947507 +-2.00588019062929223679 +-2.00608308589448780523 +-2.00628587762326260346 +-2.00648856588776824950 +-2.00669115076004933584 +-2.00689363231204342952 +-2.00709601061558196022 +-2.00729828574239110850 +-2.00750045776409091758 +-2.00770252675219396110 +-2.00790449277811022810 +-2.00810635591314046167 +-2.00830811622848193210 +-2.00850977379522666055 +-2.00871132868436008678 +-2.00891278096676195730 +-2.00911413071320898993 +-2.00931537799437132108 +-2.00951652288081383801 +-2.00971756544299795522 +-2.00991850575127894984 +-2.01011934387590907036 +-2.01032007988703353973 +-2.01052071385469544040 +-2.01072124584883304976 +-2.01092167593927850788 +-2.01112200419576225841 +-2.01132223068791082810 +-2.01152235548524327413 +-2.01172237865717917771 +-2.01192230027303153861 +-2.01212212040201166019 +-2.01232183911322604075 +-2.01252145647567726172 +-2.01272097255826709628 +-2.01292038742979029209 +-2.01311970115894256494 +-2.01331891381431304922 +-2.01351802546439140329 +-2.01371703617756070415 +-2.01391594602210588505 +-2.01411475506620352149 +-2.01431346337793382162 +-2.01451207102526907988 +-2.01471057807608389112 +-2.01490898459814804511 +-2.01510729065912919111 +-2.01530549632659372605 +-2.01550360166800768269 +-2.01570160675073184464 +-2.01589951164202840772 +-2.01609731640905609495 +-2.01629502111887193294 +-2.01649262583843480456 +-2.01669013063459789947 +-2.01688753557411626360 +-2.01708484072364324646 +-2.01728204614972916886 +-2.01747915191882798425 +-2.01767615809728795284 +-2.01787306475135963524 +-2.01806987194719189560 +-2.01826657975083367802 +-2.01846318822823267425 +-2.01865969744523887641 +-2.01885610746759880385 +-2.01905241836096038810 +-2.01924863019087208471 +-2.01944474302278198508 +-2.01964075692203781642 +-2.01983667195388916227 +-2.02003248818348435378 +-2.02022820567587357843 +-2.02042382449600754768 +-2.02061934470873616476 +-2.02081476637881340963 +-2.02101008957088934537 +-2.02120531434952033223 +-2.02140044077916103404 +-2.02159546892416708275 +-2.02179039884879729883 +-2.02198523061720969451 +-2.02217996429346635878 +-2.02237459994152724008 +-2.02256913762526036038 +-2.02276357740842893662 +-2.02295791935470159473 +-2.02315216352764837282 +-2.02334630999074160940 +-2.02354035880735549924 +-2.02373431004076786976 +-2.02392816375415707242 +-2.02412192001060597946 +-2.02431557887309798716 +-2.02450914040452056852 +-2.02470260466766438512 +-2.02489597172522239887 +-2.02508924163978987210 +-2.02528241447386836427 +-2.02547549028985818254 +-2.02566846915006637531 +-2.02586135111670273545 +-2.02605413625187935622 +-2.02624682461761373986 +-2.02643941627582568898 +-2.02663191128833908294 +-2.02682430971688321009 +-2.02701661162309010322 +-2.02720881706849498372 +-2.02740092611454070237 +-2.02759293882257018993 +-2.02778485525383489474 +-2.02797667546948767736 +-2.02816839953058680734 +-2.02836002749809729551 +-2.02855155943288645304 +-2.02874299539572833240 +-2.02893433544729973050 +-2.02912557964818640599 +-2.02931672805887552968 +-2.02950778073976101368 +-2.02969873775114306724 +-2.02988959915322642047 +-2.03008036500612298880 +-2.03027103536984787624 +-2.03046161030432381622 +-2.03065208986937939528 +-2.03084247412474816485 +-2.03103276313007130582 +-2.03122295694489540807 +-2.03141305562867335865 +-2.03160305924076389772 +-2.03179296784043428303 +-2.03198278148685629318 +-2.03217250023910978030 +-2.03236212415618044957 +-2.03255165329696252385 +-2.03274108772025474678 +-2.03293042748476437964 +-2.03311967264910675723 +-2.03330882327180351155 +-2.03349787941128301583 +-2.03368684112588393731 +-2.03387570847384813177 +-2.03406448151332908125 +-2.03425316030238745313 +-2.03444174489898887970 +-2.03463023536101017541 +-2.03481863174623622825 +-2.03500693411235777930 +-2.03519514251697586360 +-2.03538325701759870157 +-2.03557127767164436349 +-2.03575920453643766095 +-2.03594703766921369947 +-2.03613477712711610224 +-2.03632242296719701002 +-2.03650997524641708125 +-2.03669743402164771240 +-2.03688479934966748530 +-2.03707207128716483169 +-2.03725924989073847726 +-2.03744633521689566535 +-2.03763332732205482145 +-2.03782022626254066822 +-2.03800703209459088683 +-2.03819374487435167609 +-2.03838036465787952878 +-2.03856689150114078757 +-2.03875332546001253320 +-2.03893966659028080812 +-2.03912591494764328104 +-2.03931207058770702645 +-2.03949813356599074510 +-2.03968410393792254354 +-2.03986998175884304274 +-2.04005576708400138131 +-2.04024145996855876817 +-2.04042706046758892668 +-2.04061256863607365375 +-2.04079798452890814886 +-2.04098330820089834958 +-2.04116853970676137564 +-2.04135367910112686118 +-2.04153872643853340207 +-2.04172368177343477313 +-2.04190854516019326681 +-2.04209331665308679860 +-2.04227799630630180161 +-2.04246258417393722340 +-2.04264708031000630228 +-2.04283148476843301466 +-2.04301579760305473954 +-2.04320001886761870580 +-2.04338414861578776538 +-2.04356818690113595238 +-2.04375213377715159169 +-2.04393598929723285806 +-2.04411975351469266116 +-2.04430342648275775730 +-2.04448700825456652908 +-2.04467049888317164985 +-2.04485389842153786333 +-2.04503720692254553626 +-2.04522042443898488528 +-2.04540355102356485872 +-2.04558658672890292252 +-2.04576953160753438610 +-2.04595238571190440879 +-2.04613514909437732570 +-2.04631782180722687770 +-2.04650040390264376100 +-2.04668289543273074216 +-2.04686529644950709894 +-2.04704760700490551173 +-2.04722982715077339577 +-2.04741195693887378937 +-2.04759399642088180116 +-2.04777594564838949509 +-2.04795780467290500226 +-2.04813957354584852411 +-2.04832125231855677328 +-2.04850284104228252957 +-2.04868433976819286357 +-2.04886574854737002482 +-2.04904706743081321818 +-2.04922829646943505111 +-2.04940943571406641865 +-2.04959048521545161847 +-2.04977144502425279171 +-2.04995231519104592621 +-2.05013309576632485332 +-2.05031378680050035967 +-2.05049438834389574637 +-2.05067490044675526661 +-2.05085532315923613211 +-2.05103565653141384217 +-2.05121590061327951915 +-2.05139605545474212889 +-2.05157612110562848073 +-2.05175609761567834255 +-2.05193598503455199022 +-2.05211578341182621088 +-2.05229549279699341469 +-2.05247511323946518758 +-2.05265464478856962671 +-2.05283408749355311684 +-2.05301344140357810986 +-2.05319270656772490113 +-2.05337188303499340591 +-2.05355097085429960657 +-2.05372997007447910534 +-2.05390888074428268339 +-2.05408770291238385042 +-2.05426643662736818641 +-2.05444508193774577620 +-2.05462363889194055133 +-2.05480210753829828363 +-2.05498048792507992388 +-2.05515878010046826319 +-2.05533698411256349203 +-2.05551510000938497669 +-2.05569312783887081508 +-2.05587106764887739274 +-2.05604891948718337957 +-2.05622668340148218036 +-2.05640435943938948427 +-2.05658194764844104441 +-2.05675944807608912512 +-2.05693686076970783105 +-2.05711418577659133078 +-2.05729142314395208047 +-2.05746857291892348840 +-2.05764563514855858273 +-2.05782260987983089962 +-2.05799949715963270691 +-2.05817629703477900094 +-2.05835300955200350970 +-2.05852963475796046922 +-2.05870617269922506765 +-2.05888262342229300117 +-2.05905898697358002991 +-2.05923526339942464247 +-2.05941145274608450322 +-2.05958755505973822864 +-2.05976357038648671960 +-2.05993949877235182910 +-2.06011534026327591818 +-2.06029109490512318814 +-2.06046676274367923654 +-2.06064234382465238937 +-2.06081783819366970434 +-2.06099324589628318805 +-2.06116856697796491105 +-2.06134380148410878419 +-2.06151894946003189091 +-2.06169401095097315491 +-2.06186898600209289611 +-2.06204387465847371885 +-2.06221867696512228818 +-2.06239339296696577719 +-2.06256802270885453154 +-2.06274256623556251355 +-2.06291702359178508175 +-2.06309139482214165540 +-2.06326567997117304998 +-2.06343987908334458581 +-2.06361399220304475577 +-2.06378801937458389304 +-2.06396196064219683564 +-2.06413581605004070596 +-2.06430958564219846352 +-2.06448326946267313176 +-2.06465686755539445940 +-2.06483037996421403548 +-2.06500380673290928613 +-2.06517714790517947776 +-2.06535040352464793756 +-2.06552357363486516206 +-2.06569665827930082358 +-2.06586965750135398423 +-2.06604257134434510235 +-2.06621539985151958518 +-2.06638814306604867710 +-2.06656080103102590684 +-2.06673337378947197251 +-2.06690586138433163299 +-2.06707826385847326378 +-2.06725058125469196568 +-2.06742281361570778841 +-2.06759496098416484244 +-2.06776702340263396351 +-2.06793900091361004812 +-2.06811089355951471802 +-2.06828270138269321166 +-2.06845442442541926908 +-2.06862606272989024703 +-2.06879761633823067157 +-2.06896908529248868547 +-2.06914046963464137718 +-2.06931176940659122820 +-2.06948298465016433667 +-2.06965411540711663463 +-2.06982516171912811487 +-2.06999612362780682773 +-2.07016700117468532838 +-2.07033779440122511772 +-2.07050850334881220149 +-2.07067912805876197524 +-2.07084966857231478343 +-2.07102012493063769583 +-2.07119049717482672790 +-2.07136078534590417632 +-2.07153098948481861896 +-2.07170110963244713531 +-2.07187114582959530651 +-2.07204109811699321853 +-2.07221096653529990306 +-2.07238075112510422571 +-2.07255045192692044509 +-2.07272006898119220963 +-2.07288960232828811669 +-2.07305905200850926207 +-2.07322841806208213455 +-2.07339770052916083642 +-2.07356689944983196838 +-2.07373601486410441552 +-2.07390504681192133773 +-2.07407399533314906748 +-2.07424286046758910018 +-2.07441164225496521567 +-2.07458034073493413629 +-2.07474895594708153013 +-2.07491748793091801417 +-2.07508593672588892431 +-2.07525430237136632172 +-2.07542258490664943693 +-2.07559078437096955483 +-2.07575890080348868239 +-2.07592693424329421958 +-2.07609488472940606485 +-2.07626275230077528278 +-2.07643053699627877506 +-2.07659823885472594185 +-2.07676585791485646126 +-2.07693339421533762490 +-2.07710084779477099914 +-2.07726821869168487567 +-2.07743550694453960048 +-2.07760271259172490943 +-2.07776983567156214860 +-2.07793687622230338619 +-2.07810383428212919199 +-2.07827070988915396654 +-2.07843750308142150018 +-2.07860421389690763760 +-2.07877084237351583695 +-2.07893738854908605163 +-2.07910385246138496029 +-2.07927023414811351643 +-2.07943653364690161922 +-2.07960275099531344267 +-2.07976888623084255059 +-2.07993493939091411704 +-2.08010091051288625863 +-2.08026679963404959040 +-2.08043260679162456128 +-2.08059833202276589503 +-2.08076397536455770521 +-2.08092953685401882424 +-2.08109501652810013894 +-2.08126041442368237000 +-2.08142573057758140109 +-2.08159096502654605843 +-2.08175611780725455802 +-2.08192118895632116704 +-2.08208617851029131884 +-2.08225108650564338930 +-2.08241591297878869682 +-2.08258065796607327869 +-2.08274532150377345019 +-2.08290990362810068959 +-2.08307440437520119403 +-2.08323882378115010638 +-2.08340316188196084113 +-2.08356741871357620255 +-2.08373159431187771062 +-2.08389568871267538697 +-2.08405970195171663661 +-2.08422363406468047486 +-2.08438748508718330044 +-2.08455125505477090186 +-2.08471494400292733928 +-2.08487855196706828309 +-2.08504207898254723119 +-2.08520552508464662722 +-2.08536889030858763050 +-2.08553217468952567515 +-2.08569537826255002599 +-2.08585850106268422266 +-2.08602154312488785592 +-2.08618450448405567954 +-2.08634738517501538979 +-2.08651018523253251047 +-2.08667290469130639607 +-2.08683554358597112000 +-2.08699810195109680677 +-2.08716057982119007619 +-2.08732297723069137874 +-2.08748529421397766015 +-2.08764753080536102914 +-2.08780968703909142192 +-2.08797176294935127316 +-2.08813375857026217730 +-2.08829567393588044766 +-2.08845750908019800463 +-2.08861926403714370792 +-2.08878093884058291252 +-2.08894253352431746862 +-2.08910404812208527758 +-2.08926548266755984784 +-2.08942683719435340350 +-2.08958811173601466393 +-2.08974930632602751146 +-2.08991042099781276775 +-2.09007145578473085834 +-2.09023241072007692765 +-2.09039328583708394760 +-2.09055408116892316173 +-2.09071479674870008836 +-2.09087543260946340240 +-2.09103598878419072449 +-2.09119646530580638455 +-2.09135686220716676686 +-2.09151717952106741549 +-2.09167741728024170200 +-2.09183757551736126956 +-2.09199765426503558885 +-2.09215765355581195806 +-2.09231757342217683515 +-2.09247741389655184108 +-2.09263717501130219745 +-2.09279685679872784476 +-2.09295645929106655103 +-2.09311598252049835267 +-2.09327542651913844907 +-2.09343479131904297574 +-2.09359407695220500756 +-2.09375328345055944368 +-2.09391241084597634625 +-2.09407145917026893400 +-2.09423042845518647681 +-2.09438931873241873660 +-2.09454813003359507917 +-2.09470686239028447417 +-2.09486551583399416288 +-2.09502409039617276676 +-2.09518258610820629073 +-2.09534100300142300810 +-2.09549934110708946378 +-2.09565760045641313880 +-2.09581578108054022991 +-2.09597388301055786997 +-2.09613190627749323980 +-2.09628985091231445637 +-2.09644771694592924050 +-2.09660550440918491688 +-2.09676321333287107862 +-2.09692084374771781086 +-2.09707839568439435851 +-2.09723586917351179082 +-2.09739326424562166906 +-2.09755058093121693474 +-2.09770781926073102142 +-2.09786497926453829876 +-2.09802206097295629306 +-2.09817906441624035807 +-2.09833598962458989234 +-2.09849283662814567464 +-2.09864960545698764349 +-2.09880629614114022630 +-2.09896290871056745431 +-2.09911944319517607127 +-2.09927589962481464525 +-2.09943227802927312453 +-2.09958857843828416989 +-2.09974480088152137824 +-2.09990094538860239126 +-2.10005701198908534266 +-2.10021300071247196684 +-2.10036891158820449022 +-2.10052474464567096035 +-2.10068049991419769640 +-2.10083617742305728271 +-2.10099177720146457204 +-2.10114729927857535330 +-2.10130274368348901604 +-2.10145811044524855049 +-2.10161339959284054757 +-2.10176861115519297840 +-2.10192374516117874705 +-2.10207880163961302600 +-2.10223378061925458837 +-2.10238868212880580799 +-2.10254350619691265933 +-2.10269825285216471755 +-2.10285292212309604665 +-2.10300751403818164675 +-2.10316202862584500366 +-2.10331646591444920702 +-2.10347082593230449987 +-2.10362510870766206139 +-2.10377931426872111231 +-2.10393344264362225360 +-2.10408749386045146323 +-2.10424146794723965215 +-2.10439536493196177602 +-2.10454918484253639122 +-2.10470292770682876338 +-2.10485659355264642656 +-2.10501018240774451229 +-2.10516369429982130868 +-2.10531712925652136903 +-2.10547048730543195916 +-2.10562376847408838643 +-2.10577697278997044705 +-2.10593010028050064975 +-2.10608315097305132113 +-2.10623612489493616806 +-2.10638902207341738304 +-2.10654184253570120333 +-2.10669458630894013140 +-2.10684725342023293493 +-2.10699984389662331452 +-2.10715235776510256827 +-2.10730479505260470674 +-2.10745715578601444662 +-2.10760943999215832889 +-2.10776164769781315655 +-2.10791377892969888919 +-2.10806583371448352793 +-2.10821781207878089504 +-2.10836971404915329842 +-2.10852153965210709075 +-2.10867328891409666625 +-2.10882496186152268436 +-2.10897655852073473426 +-2.10912807891802689397 +-2.10927952307964172718 +-2.10943089103176761867 +-2.10958218280054277116 +-2.10973339841204987621 +-2.10988453789232099922 +-2.11003560126733535895 +-2.11018658856301755122 +-2.11033749980524376610 +-2.11048833501983468253 +-2.11063909423255946507 +-2.11078977746913754032 +-2.11094038475523193554 +-2.11109091611645771636 +-2.11124137157837576950 +-2.11139175116649635555 +-2.11154205490627733255 +-2.11169228282312415601 +-2.11184243494239387573 +-2.11199251128938803035 +-2.11214251188935930870 +-2.11229243676750799708 +-2.11244228594898419971 +-2.11259205945888561828 +-2.11274175732225888424 +-2.11289137956410044694 +-2.11304092620935657365 +-2.11319039728291979685 +-2.11333979280963557557 +-2.11348911281429518993 +-2.11363835732164062620 +-2.11378752635636590895 +-2.11393661994310955166 +-2.11408563810646432657 +-2.11423458087096882707 +-2.11438344826111501717 +-2.11453224030134201428 +-2.11468095701604053005 +-2.11482959842955020591 +-2.11497816456616094527 +-2.11512665545011335766 +-2.11527507110559831460 +-2.11542341155675606146 +-2.11557167682767843786 +-2.11571986694240621318 +-2.11586798192493219517 +-2.11601602179919900948 +-2.11616398658910043196 +-2.11631187631848094455 +-2.11645969101113484712 +-2.11660743069081025425 +-2.11675509538120198982 +-2.11690268510595869245 +-2.11705019988868148317 +-2.11719763975291952462 +-2.11734500472217446188 +-2.11749229481990086654 +-2.11763951006950223999 +-2.11778665049433589829 +-2.11793371611771030771 +-2.11808070696288330836 +-2.11822762305306788733 +-2.11837446441142729370 +-2.11852123106107592676 +-2.11866792302508200052 +-2.11881454032646443508 +-2.11896108298819507709 +-2.11910755103319692338 +-2.11925394448434678552 +-2.11940026336447351341 +-2.11954650769635755125 +-2.11969267750273315798 +-2.11983877280628441042 +-2.11998479362965230877 +-2.12013073999542722703 +-2.12027661192615468622 +-2.12042240944433180161 +-2.12056813257240772685 +-2.12071378133278720668 +-2.12085935574782702417 +-2.12100485583983777715 +-2.12115028163108032544 +-2.12129563314377289629 +-2.12144091040008486715 +-2.12158611342214120654 +-2.12173124223201714500 +-2.12187629685174483640 +-2.12202127730330891708 +-2.12216618360864739401 +-2.12231101578965386523 +-2.12245577386817307897 +-2.12260045786600670681 +-2.12274506780490890279 +-2.12288960370658941201 +-2.12303406559271090615 +-2.12317845348488987156 +-2.12332276740469927390 +-2.12346700737366633760 +-2.12361117341327076957 +-2.12375526554494964415 +-2.12389928379009251813 +-2.12404322817004498347 +-2.12418709870610777912 +-2.12433089541953545876 +-2.12447461833153905530 +-2.12461826746328386051 +-2.12476184283588986901 +-2.12490534447043355470 +-2.12504877238794609440 +-2.12519212660941336779 +-2.12533540715577906610 +-2.12547861404794025120 +-2.12562174730675046419 +-2.12576480695301794910 +-2.12590779300750876146 +-2.12605070549094365973 +-2.12619354442399854932 +-2.12633630982730670311 +-2.12647900172145787323 +-2.12662162012699473834 +-2.12676416506442134136 +-2.12690663655419331945 +-2.12704903461672589771 +-2.12719135927238900408 +-2.12733361054151037806 +-2.12747578844437201795 +-2.12761789300121639812 +-2.12775992423223980765 +-2.12790188215759590307 +-2.12804376679739482014 +-2.12818557817170628255 +-2.12832731630055471683 +-2.12846898120392102882 +-2.12861057290174571222 +-2.12875209141392440770 +-2.12889353676031145568 +-2.12903490896071856397 +-2.12917620803491436376 +-2.12931743400262574184 +-2.12945858688353562016 +-2.12959966669728739674 +-2.12974067346347917251 +-2.12988160720166996853 +-2.13002246793137395287 +-2.13016325567206576963 +-2.13030397044317654220 +-2.13044461226409520549 +-2.13058518115417117045 +-2.13072567713270943912 +-2.13086610021897637779 +-2.13100645043219394381 +-2.13114672779154323834 +-2.13128693231616628267 +-2.13142706402516157738 +-2.13156712293758587862 +-2.13170710907245686272 +-2.13184702244874868526 +-2.13198686308539775425 +-2.13212663100129651284 +-2.13226632621529788025 +-2.13240594874621258725 +-2.13254549861281361700 +-2.13268497583382954375 +-2.13282438042795208233 +-2.13296371241382853867 +-2.13310297181006935929 +-2.13324215863524235814 +-2.13338127290787671342 +-2.13352031464645852665 +-2.13365928386943703998 +-2.13379818059522019524 +-2.13393700484217463398 +-2.13407575662862969423 +-2.13421443597287208149 +-2.13435304289315030957 +-2.13449157740767336833 +-2.13463003953460850326 +-2.13476842929208698862 +-2.13490674669819657794 +-2.13504499177098905349 +-2.13518316452847489728 +-2.13532126498862551145 +-2.13545929316937321829 +-2.13559724908861170434 +-2.13573513276419557627 +-2.13587294421393902866 +-2.13601068345561850848 +-2.13614835050697271512 +-2.13628594538569860362 +-2.13642346810945715774 +-2.13656091869586850507 +-2.13669829716251680196 +-2.13683560352694534856 +-2.13697283780666102970 +-2.13711000001912987400 +-2.13724709018178193887 +-2.13738410831200731366 +-2.13752105442715967243 +-2.13765792854455360938 +-2.13779473068146552706 +-2.13793146085513496857 +-2.13806811908276150902 +-2.13820470538151008455 +-2.13834121976850388691 +-2.13847766226083280117 +-2.13861403287554585617 +-2.13875033162965655364 +-2.13888655854013931545 +-2.13902271362393348042 +-2.13915879689793797525 +-2.13929480837901708767 +-2.13943074808399735787 +-2.13956661602966802249 +-2.13970241223277968245 +-2.13983813671005007606 +-2.13997378947815608541 +-2.14010937055373862137 +-2.14024487995340439994 +-2.14038031769372061319 +-2.14051568379121848196 +-2.14065097826239547629 +-2.14078620112370687778 +-2.14092135239157688176 +-2.14105643208239149189 +-2.14119144021249985244 +-2.14132637679821602461 +-2.14146124185581676613 +-2.14159603540154508394 +-2.14173075745160579331 +-2.14186540802216773827 +-2.14199998712936556799 +-2.14213449478929707226 +-2.14226893101802540187 +-2.14240329583157640414 +-2.14253758924594217561 +-2.14267181127707750932 +-2.14280596194090389162 +-2.14294004125330639354 +-2.14307404923013367082 +-2.14320798588720151656 +-2.14334185124028842040 +-2.14347564530514089753 +-2.14360936809746682741 +-2.14374301963294078277 +-2.14387659992720358559 +-2.14401010899585964253 +-2.14414354685447827720 +-2.14427691351859639468 +-2.14441020900371537294 +-2.14454343332530106281 +-2.14467658649878645249 +-2.14480966853956811491 +-2.14494267946301109262 +-2.14507561928444356880 +-2.14520848801916130810 +-2.14534128568242543622 +-2.14547401228946243990 +-2.14560666785546549917 +-2.14573925239559581968 +-2.14587176592497641536 +-2.14600420845870010211 +-2.14613658001182594504 +-2.14626888059937659392 +-2.14640111023634405640 +-2.14653326893768614525 +-2.14666535671832470200 +-2.14679737359315403467 +-2.14692931957702937140 +-2.14706119468477485412 +-2.14719299893118398259 +-2.14732473233101250898 +-2.14745639489898554331 +-2.14758798664979755344 +-2.14771950759810703602 +-2.14785095775853873690 +-2.14798233714568942432 +-2.14811364577411900711 +-2.14824488365835586379 +-2.14837605081289773068 +-2.14850714725220637291 +-2.14863817299071424571 +-2.14876912804282049763 +-2.14890001242289230277 +-2.14903082614526352856 +-2.14916156922423740028 +-2.14929224167408428059 +-2.14942284350904255774 +-2.14955337474331908965 +-2.14968383539108875979 +-2.14981422546649492133 +-2.14994454498364895301 +-2.15007479395663025912 +-2.15020497239948760182 +-2.15033508032623688067 +-2.15046511775086468532 +-2.15059508468732341058 +-2.15072498114953658543 +-2.15085480715139576446 +-2.15098456270676097191 +-2.15111424782946158984 +-2.15124386253329547003 +-2.15137340683202982206 +-2.15150288073940165745 +-2.15163228426911556923 +-2.15176161743484728461 +-2.15189088025023966821 +-2.15202007272890716294 +-2.15214919488443179318 +-2.15227824673036716163 +-2.15240722828023356428 +-2.15253613954752420767 +-2.15266498054569899168 +-2.15279375128818983853 +-2.15292245178839714015 +-2.15305108205969375490 +-2.15317964211541656994 +-2.15330813196888071204 +-2.15343655163336489267 +-2.15356490112211984567 +-2.15369318044836877135 +-2.15382138962530067516 +-2.15394952866608058173 +-2.15407759758383932081 +-2.15420559639168107680 +-2.15433352510267717150 +-2.15446138372987405774 +-2.15458917228628532570 +-2.15471689078489792024 +-2.15484453923866814407 +-2.15497211766052298998 +-2.15509962606335925273 +-2.15522706446004930214 +-2.15535443286343220137 +-2.15548173128631992412 +-2.15560895974149557830 +-2.15573611824171251783 +-2.15586320679969656311 +-2.15599022542814555692 +-2.15611717413972714397 +-2.15624405294708276770 +-2.15637086186282189715 +-2.15649760089952957642 +-2.15662427006976020749 +-2.15675086938604154696 +-2.15687739886087115337 +-2.15700385850672038401 +-2.15713024833603261854 +-2.15725656836122148263 +-2.15738281859467484480 +-2.15750899904875170776 +-2.15763510973578398477 +-2.15776115066807472331 +-2.15788712185789943732 +-2.15801302331750965990 +-2.15813885505912361751 +-2.15826461709493688801 +-2.15839030943711485122 +-2.15851593209779757387 +-2.15864148508909625690 +-2.15876696842309634405 +-2.15889238211185574556 +-2.15901772616740439403 +-2.15914300060174690898 +-2.15926820542685948823 +-2.15939334065469257240 +-2.15951840629716995679 +-2.15964340236618657087 +-2.15976832887361425151 +-2.15989318583129685791 +-2.16001797325104982761 +-2.16014269114466328503 +-2.16026733952390204152 +-2.16039191840050470717 +-2.16051642778618235852 +-2.16064086769261987087 +-2.16076523813147680642 +-2.16088953911438608202 +-2.16101377065295574553 +-2.16113793275876586719 +-2.16126202544337342459 +-2.16138604871830608545 +-2.16151000259506975709 +-2.16163388708514148107 +-2.16175770219997387400 +-2.16188144795099379536 +-2.16200512434960367969 +-2.16212873140717931619 +-2.16225226913507073689 +-2.16237573754460488118 +-2.16249913664708071082 +-2.16262246645377453902 +-2.16274572697593558956 +-2.16286891822478910541 +-2.16299204021153412825 +-2.16311509294734705122 +-2.16323807644337806622 +-2.16336099071075205202 +-2.16348383576056901845 +-2.16360661160390632674 +-2.16372931825181513688 +-2.16385195571532173986 +-2.16397452400542977813 +-2.16409702313311669286 +-2.16421945310933550033 +-2.16434181394501612417 +-2.16446410565106361901 +-2.16458632823835994685 +-2.16470848171776042435 +-2.16483056610009905185 +-2.16495258139618451665 +-2.16507452761680152520 +-2.16519640477271213541 +-2.16531821287465264803 +-2.16543995193333715932 +-2.16556162195945578475 +-2.16568322296367465896 +-2.16580475495663682395 +-2.16592621794896222909 +-2.16604761195124595474 +-2.16616893697406043273 +-2.16629019302795500224 +-2.16641138012345768615 +-2.16653249827106941794 +-2.16665354748127025886 +-2.16677452776451762162 +-2.16689543913124449404 +-2.16701628159186299172 +-2.16713705515676080537 +-2.16725775983630164490 +-2.16737839564083056842 +-2.16749896258066510057 +-2.16761946066610411421 +-2.16773988990742116911 +-2.16786025031486984105 +-2.16798054189867794861 +-2.16810076466905510273 +-2.16822091863618426899 +-2.16834100381023064941 +-2.16846102020133235655 +-2.16858096781960973942 +-2.16870084667515961030 +-2.16882065677805480064 +-2.16894039813834904606 +-2.16906007076607343365 +-2.16917967467123551373 +-2.16929920986382285264 +-2.16941867635380214452 +-2.16953807415111477042 +-2.16965740326568656826 +-2.16977666370741495427 +-2.16989585548618046928 +-2.17001497861184144966 +-2.17013403309423402732 +-2.17025301894317301787 +-2.17037193616845369704 +-2.17049078477984780378 +-2.17060956478710842532 +-2.17072827619996511217 +-2.17084691902812831898 +-2.17096549328128762824 +-2.17108399896911041793 +-2.17120243610124408207 +-2.17132080468731558653 +-2.17143910473693102503 +-2.17155733625967517497 +-2.17167549926511327385 +-2.17179359376278968696 +-2.17191161976222790742 +-2.17202957727293277657 +-2.17214746630438515496 +-2.17226528686605080409 +-2.17238303896737061649 +-2.17250072261776727700 +-2.17261833782664481873 +-2.17273588460338551442 +-2.17285336295735032053 +-2.17297077289788509447 +-2.17308811443430949240 +-2.17320538757592940371 +-2.17332259233202629289 +-2.17343972871186652540 +-2.17355679672469115360 +-2.17367379637972835127 +-2.17379072768618053502 +-2.17390759065323502242 +-2.17402438529005825885 +-2.17414111160579759385 +-2.17425776960957994888 +-2.17437435931051536997 +-2.17449088071769303099 +-2.17460733384018389813 +-2.17472371868703939768 +-2.17484003526729230416 +-2.17495628358995585216 +-2.17507246366402684501 +-2.17518857549848032562 +-2.17530461910227401745 +-2.17542059448434610403 +-2.17553650165361789348 +-2.17565234061899159812 +-2.17576811138935033441 +-2.17588381397355767888 +-2.17599944838046210904 +-2.17611501461889123021 +-2.17623051269765399596 +-2.17634594262554514899 +-2.17646130441133456301 +-2.17657659806378234180 +-2.17669182359162327600 +-2.17680698100357750135 +-2.17692207030834739001 +-2.17703709151461755056 +-2.17715204463105305166 +-2.17726692966630386294 +-2.17738174662900085821 +-2.17749649552775670358 +-2.17761117637116718981 +-2.17772578916781123226 +-2.17784033392624998271 +-2.17795481065502682938 +-2.17806921936266828510 +-2.17818356005768265504 +-2.17829783274856181308 +-2.17841203744378120177 +-2.17852617415179850013 +-2.17864024288105406768 +-2.17875424363997183264 +-2.17886817643695884783 +-2.17898204128040395844 +-2.17909583817868091060 +-2.17920956714014790734 +-2.17932322817314183538 +-2.17943682128598759107 +-2.17955034648699186306 +-2.17966380378444357646 +-2.17977719318661788961 +-2.17989051470177130909 +-2.18000376833814524247 +-2.18011695410396422190 +-2.18023007200743634826 +-2.18034312205675462337 +-2.18045610426009606186 +-2.18056901862561725025 +-2.18068186516146722553 +-2.18079464387577148798 +-2.18090735477664265929 +-2.18101999787217781801 +-2.18113257317045894368 +-2.18124508067954936408 +-2.18135752040749819614 +-2.18146989236234167819 +-2.18158219655209739685 +-2.18169443298476695148 +-2.18180660166834083924 +-2.18191870261078690874 +-2.18203073582006501496 +-2.18214270130411680526 +-2.18225459907086660749 +-2.18236642912822853546 +-2.18247819148409627488 +-2.18258988614635240921 +-2.18270151312286264655 +-2.18281307242147892822 +-2.18292456405003632014 +-2.18303598801635878601 +-2.18314734432824986143 +-2.18325863299350508839 +-2.18336985401990046896 +-2.18348100741519823842 +-2.18359209318714819759 +-2.18370311134348460413 +-2.18381406189192617262 +-2.18392494484017829492 +-2.18403576019593215207 +-2.18414650796686382606 +-2.18425718816063652028 +-2.18436780078489922730 +-2.18447834584728539653 +-2.18458882335541515474 +-2.18469923331689530599 +-2.18480957573931799942 +-2.18491985063026206149 +-2.18503005799729210779 +-2.18514019784795987533 +-2.18525027018980155802 +-2.18536027503034135933 +-2.18547021237708971597 +-2.18558008223754285382 +-2.18568988461918323196 +-2.18579961952948220727 +-2.18590928697589514940 +-2.18601888696586499350 +-2.18612841950682268433 +-2.18623788460618317941 +-2.18634728227135122225 +-2.18645661250971690137 +-2.18656587532865698265 +-2.18667507073553668562 +-2.18678419873770746307 +-2.18689325934250655692 +-2.18700225255726188323 +-2.18711117838928492674 +-2.18722003684587651406 +-2.18732882793432414914 +-2.18743755166190334549 +-2.18754620803587629396 +-2.18765479706349275091 +-2.18776331875199092636 +-2.18787177310859703994 +-2.18798016014052132405 +-2.18808847985496646160 +-2.18819673225912003645 +-2.18830491736015897430 +-2.18841303516524732231 +-2.18852108568153713719 +-2.18862906891616804117 +-2.18873698487626855425 +-2.18884483356895520600 +-2.18895261500133253563 +-2.18906032918049220370 +-2.18916797611351654496 +-2.18927555580747323916 +-2.18938306826942197247 +-2.18949051350640688796 +-2.18959789152546280278 +-2.18970520233361432005 +-2.18981244593787094388 +-2.18991962234523374065 +-2.19002673156269311860 +-2.19013377359722483106 +-2.19024074845579663773 +-2.19034765614536297562 +-2.19045449667286939999 +-2.19056127004524858748 +-2.19066797626942166843 +-2.19077461535230222367 +-2.19088118730078962315 +-2.19098769212177302279 +-2.19109412982213180854 +-2.19120050040873426411 +-2.19130680388843801509 +-2.19141304026808958483 +-2.19151920955452483852 +-2.19162531175457031551 +-2.19173134687504100881 +-2.19183731492274214148 +-2.19194321590446872250 +-2.19204904982700377047 +-2.19215481669712231039 +-2.19226051652158826499 +-2.19236614930715534300 +-2.19247171506056570678 +-2.19257721378855485739 +-2.19268264549784541728 +-2.19278801019515112714 +-2.19289330788717595766 +-2.19299853858061366552 +-2.19310370228214868149 +-2.19320879899845522232 +-2.19331382873619773477 +-2.19341879150203222792 +-2.19352368730260494090 +-2.19362851614454967830 +-2.19373327803449447160 +-2.19383797297905669410 +-2.19394260098484394916 +-2.19404716205845407018 +-2.19415165620647689693 +-2.19425608343549249923 +-2.19436044375207206514 +-2.19446473716277790089 +-2.19456896367416076643 +-2.19467312329276564853 +-2.19477721602512820809 +-2.19488124187777255969 +-2.19498520085721837702 +-2.19508909296997023475 +-2.19519291822253048707 +-2.19529667662138994189 +-2.19540036817302919303 +-2.19550399288392172892 +-2.19560755076053482071 +-2.19571104180932374916 +-2.19581446603673580142 +-2.19591782344921249148 +-2.19602111405318467519 +-2.19612433785507432660 +-2.19622749486129720253 +-2.19633058507826062211 +-2.19643360851236169040 +-2.19653656516999262749 +-2.19663945505753410714 +-2.19674227818136280632 +-2.19684503454784341159 +-2.19694772416333528042 +-2.19705034703418933262 +-2.19715290316674893845 +-2.19725539256734858640 +-2.19735781524231654771 +-2.19746017119797310002 +-2.19756246044063052736 +-2.19766468297659400832 +-2.19776683881216028382 +-2.19786892795361943342 +-2.19797095040725531945 +-2.19807290617934159016 +-2.19817479527614834112 +-2.19827661770393500973 +-2.19837837346895526025 +-2.19848006257745565151 +-2.19858168503567696916 +-2.19868324084985067302 +-2.19878473002620156151 +-2.19888615257094910405 +-2.19898750849030522048 +-2.19908879779047383707 +-2.19919002047765310692 +-2.19929117655803540998 +-2.19939226603780468849 +-2.19949328892313866746 +-2.19959424522020885462 +-2.19969513493518187275 +-2.19979595807421413056 +-2.19989671464345803997 +-2.19999740464906023973 +-2.20009802809715848682 +-2.20019858499388742956 +-2.20029907534537239044 +-2.20039949915773469513 +-2.20049985643708945204 +-2.20060014718954377599 +-2.20070037142120078499 +-2.20080052913815693572 +-2.20090062034650202349 +-2.20100064505232095868 +-2.20110060326169287848 +-2.20120049498068892646 +-2.20130032021537891396 +-2.20140007897182199414 +-2.20149977125607554385 +-2.20159939707418805810 +-2.20169895643220581150 +-2.20179844933616797320 +-2.20189787579210660695 +-2.20199723580605200013 +-2.20209652938402511424 +-2.20219575653204602261 +-2.20229491725612458453 +-2.20239401156226977108 +-2.20249303945648211567 +-2.20259200094475993126 +-2.20269089603309398129 +-2.20278972472747192057 +-2.20288848703387429850 +-2.20298718295827988811 +-2.20308581250665946882 +-2.20318437568497982326 +-2.20328287249920551361 +-2.20338130295529133207 +-2.20347966705919251496 +-2.20357796481685674905 +-2.20367619623422816844 +-2.20377436131724557811 +-2.20387246007184334218 +-2.20397049250395227205 +-2.20406845861949829413 +-2.20416635842440289395 +-2.20426419192458400431 +-2.20436195912595422897 +-2.20445966003442217485 +-2.20455729465589200800 +-2.20465486299626522992 +-2.20475236506143890125 +-2.20484980085730386534 +-2.20494717038974918921 +-2.20504447366465994307 +-2.20514171068791631214 +-2.20523888146539492894 +-2.20533598600297020553 +-2.20543302430651033674 +-2.20552999638188085285 +-2.20562690223494461961 +-2.20572374187155961778 +-2.20582051529758071950 +-2.20591722251885968831 +-2.20601386354124384681 +-2.20611043837057829720 +-2.20620694701270414484 +-2.20630338947345805423 +-2.20639976575867624575 +-2.20649607587419005483 +-2.20659231982582682008 +-2.20668849761941165966 +-2.20678460926076613902 +-2.20688065475571093543 +-2.20697663411006095302 +-2.20707254732962931953 +-2.20716839442022561002 +-2.20726417538765717907 +-2.20735989023772960493 +-2.20745553897624402495 +-2.20755112160899891194 +-2.20764663814179140644 +-2.20774208858041509629 +-2.20783747293066046069 +-2.20793279119831620250 +-2.20802804338916969229 +-2.20812322950900341567 +-2.20821834956359897006 +-2.20831340355873617654 +-2.20840839150019041526 +-2.20850331339373706641 +-2.20859816924514795744 +-2.20869295906019269538 +-2.20878768284464044314 +-2.20888234060425547867 +-2.20897693234480296809 +-2.20907145807204408072 +-2.20916591779173998589 +-2.20926031150964741201 +-2.20935463923152264343 +-2.20944890096312063221 +-2.20954309671019366590 +-2.20963722647849225567 +-2.20973129027376735678 +-2.20982528810176459544 +-2.20991921996823181829 +-2.21001308587891243107 +-2.21010688583954939546 +-2.21020061985588611719 +-2.21029428793366111705 +-2.21038789007861247171 +-2.21048142629648047830 +-2.21057489659300010487 +-2.21066830097390543131 +-2.21076163944493275793 +-2.21085491201181305598 +-2.21094811868027907309 +-2.21104125945606133641 +-2.21113433434488859675 +-2.21122734335249093718 +-2.21132028648459622033 +-2.21141316374693008839 +-2.21150597514521995990 +-2.21159872068519192112 +-2.21169140037256939380 +-2.21178401421307668784 +-2.21187656221243722499 +-2.21196904437637442697 +-2.21206146071060993918 +-2.21215381122086540699 +-2.21224609591286247579 +-2.21233831479232323503 +-2.21243046786496577738 +-2.21252255513651219232 +-2.21261457661268101660 +-2.21270653229919300742 +-2.21279842220176758971 +-2.21289024632612374432 +-2.21298200467798089619 +-2.21307369726305669388 +-2.21316532408707233870 +-2.21325688515574725557 +-2.21334838047479776080 +-2.21343981004994594386 +-2.21353117388690989742 +-2.21362247199141037868 +-2.21371370436916636848 +-2.21380487102589817994 +-2.21389597196732657025 +-2.21398700719917274071 +-2.21407797672715744852 +-2.21416888055700189497 +-2.21425971869442905771 +-2.21435049114516147029 +-2.21444119791492388671 +-2.21453183900943839646 +-2.21462241443442930944 +-2.21471292419562493237 +-2.21480336829874868698 +-2.21489374674952799182 +-2.21498405955369159770 +-2.21507430671696647906 +-2.21516448824508405124 +-2.21525460414377395324 +-2.21534465441876760039 +-2.21543463907579862848 +-2.21552455812059934104 +-2.21561441155890515020 +-2.21570419939645280039 +-2.21579392163897814783 +-2.21588357829222060147 +-2.21597316936192001435 +-2.21606269485381801587 +-2.21615215477365623542 +-2.21624154912717852284 +-2.21633087792013183659 +-2.21642014115826135878 +-2.21650933884731671242 +-2.21659847099304752049 +-2.21668753760120695873 +-2.21677653867754642647 +-2.21686547422782265215 +-2.21695434425779280829 +-2.21704314877321451149 +-2.21713188777984893107 +-2.21722056128345945680 +-2.21730916928980903435 +-2.21739771180466505029 +-2.21748618883379622346 +-2.21757460038297349314 +-2.21766294645796824270 +-2.21775122706455629640 +-2.21783944220851303442 +-2.21792759189562005417 +-2.21801567613165717674 +-2.21810369492240866407 +-2.21819164827366144266 +-2.21827953619120243900 +-2.21836735868082479683 +-2.21845511574831943946 +-2.21854280739948439560 +-2.21863043364011769398 +-2.21871799447601958377 +-2.21880548991299475503 +-2.21889291995684967418 +-2.21898028461339347217 +-2.21906758388843705632 +-2.21915481778779621891 +-2.21924198631728852860 +-2.21932908948273466265 +-2.21941612728995618653 +-2.21950309974478221520 +-2.21959000685303964318 +-2.21967684862056335859 +-2.21976362505318647322 +-2.21985033615674964835 +-2.21993698193709265709 +-2.22002356240006148980 +-2.22011007755150480136 +-2.22019652739727391122 +-2.22028291194322369151 +-2.22036923119521167891 +-2.22045548515910029508 +-2.22054167384075462621 +-2.22062779724604286713 +-2.22071385538083765354 +-2.22079984825101339752 +-2.22088577586245117246 +-2.22097163822103293995 +-2.22105743533264554657 +-2.22114316720317939158 +-2.22122883383852887107 +-2.22131443524459148975 +-2.22139997142726786095 +-2.22148544239246659160 +-2.22157084814609540047 +-2.22165618869406733538 +-2.22174146404230166141 +-2.22182667419671897591 +-2.22191181916324476120 +-2.22199689894780982868 +-2.22208191355634721020 +-2.22216686299479615485 +-2.22225174726909768808 +-2.22233656638520082893 +-2.22242132034905370830 +-2.22250600916661378292 +-2.22259063284384028591 +-2.22267519138669733536 +-2.22275968480115437842 +-2.22284411309318352679 +-2.22292847626876355349 +-2.22301277433387678428 +-2.22309700729450909762 +-2.22318117515665436557 +-2.22326527792630734837 +-2.22334931560946991169 +-2.22343328821214658575 +-2.22351719574035078253 +-2.22360103820009635811 +-2.22368481559740427400 +-2.22376852793829993260 +-2.22385217522881362129 +-2.22393575747498184469 +-2.22401927468284377198 +-2.22410272685844656593 +-2.22418611400784049792 +-2.22426943613708072434 +-2.22435269325222861880 +-2.22443588535935177219 +-2.22451901246452088401 +-2.22460207457381331508 +-2.22468507169331131124 +-2.22476800382910333553 +-2.22485087098728229194 +-2.22493367317394596938 +-2.22501641039520103860 +-2.22509908265715417031 +-2.22518168996592313746 +-2.22526423232762793347 +-2.22534670974839521307 +-2.22542912223435829233 +-2.22551146979165448414 +-2.22559375242642820680 +-2.22567597014482965179 +-2.22575812295301211918 +-2.22584021085714001131 +-2.22592223386337861868 +-2.22600419197790300174 +-2.22608608520689177368 +-2.22616791355652976492 +-2.22624967703300935540 +-2.22633137564252825413 +-2.22641300939129038738 +-2.22649457828550456640 +-2.22657608233138804010 +-2.22665752153516249834 +-2.22673889590305806863 +-2.22682020544130887529 +-2.22690145015615659219 +-2.22698263005384911040 +-2.22706374514064142645 +-2.22714479542279386592 +-2.22722578090657252758 +-2.22730670159825372423 +-2.22738755750411643319 +-2.22746834863044851360 +-2.22754907498354315365 +-2.22762973656970242331 +-2.22771033339523150119 +-2.22779086546644622402 +-2.22787133278966642536 +-2.22795173537122037644 +-2.22803207321744300984 +-2.22811234633467503130 +-2.22819255472926514017 +-2.22827269840756914121 +-2.22835277737594950054 +-2.22843279164077623378 +-2.22851274120842646198 +-2.22859262608528219118 +-2.22867244627773564147 +-2.22875220179218569427 +-2.22883189263503789235 +-2.22891151881270310753 +-2.22899108033160375797 +-2.22907057719816581454 +-2.22915000941882546215 +-2.22922937700002421479 +-2.22930867994821158007 +-2.22938791826984550326 +-2.22946709197139103509 +-2.22954620105931944352 +-2.22962524554011132238 +-2.22970422542025437096 +-2.22978314070624428211 +-2.22986199140458385415 +-2.22994077752178387897 +-2.23001949906436269799 +-2.23009815603884709034 +-2.23017674845177138465 +-2.23025527630967701498 +-2.23033373961911385308 +-2.23041213838664154068 +-2.23049047261882549265 +-2.23056874232223822929 +-2.23064694750346426133 +-2.23072508816909209628 +-2.23080316432572089980 +-2.23088117597995694297 +-2.23095912313841493457 +-2.23103700580771802109 +-2.23111482399449778669 +-2.23119257770539292096 +-2.23127026694705232757 +-2.23134789172613112740 +-2.23142545204929554359 +-2.23150294792321712833 +-2.23158037935457853607 +-2.23165774635006997073 +-2.23173504891639096215 +-2.23181228706024592512 +-2.23188946078835348530 +-2.23196657010743670924 +-2.23204361502423020980 +-2.23212059554547614937 +-2.23219751167792246349 +-2.23227436342833218674 +-2.23235115080347146232 +-2.23242787381011753567 +-2.23250453245505831035 +-2.23258112674508701900 +-2.23265765668700888469 +-2.23273412228763579179 +-2.23281052355379072694 +-2.23288686049230467034 +-2.23296313311001703994 +-2.23303934141377746769 +-2.23311548541044535554 +-2.23319156510688721085 +-2.23326758050997975502 +-2.23334353162661081171 +-2.23341941846367486590 +-2.23349524102807661663 +-2.23357099932673053289 +-2.23364669336655996545 +-2.23372232315449759099 +-2.23379788869748630020 +-2.23387339000247875376 +-2.23394882707643471775 +-2.23402419992632683687 +-2.23409950855913574941 +-2.23417475298185008725 +-2.23424993320147269316 +-2.23432504922500951849 +-2.23440010105948339003 +-2.23447508871192113133 +-2.23455001218936244456 +-2.23462487149885591364 +-2.23469966664746166884 +-2.23477439764224650176 +-2.23484906449028919440 +-2.23492366719867785463 +-2.23499820577451213666 +-2.23507268022490013237 +-2.23514709055695925954 +-2.23522143677781892634 +-2.23529571889461786682 +-2.23536993691450414090 +-2.23544409084463824300 +-2.23551818069218777296 +-2.23559220646433320923 +-2.23566616816826435610 +-2.23574006581118212011 +-2.23581389940029362506 +-2.23588766894282420239 +-2.23596137444600229216 +-2.23603501591707054530 +-2.23610859336328005043 +-2.23618210679189477474 +-2.23625555621018801133 +-2.23632894162544237915 +-2.23640226304495381981 +-2.23647552047602538039 +-2.23654871392597387469 +-2.23662184340212633060 +-2.23669490891181865777 +-2.23676791046240008853 +-2.23684084806122784883 +-2.23691372171567248728 +-2.23698653143311343428 +-2.23705927722094299881 +-2.23713195908656237165 +-2.23720457703738517807 +-2.23727713108083614557 +-2.23734962122434932752 +-2.23742204747537121179 +-2.23749440984135938848 +-2.23756670832978210584 +-2.23763894294811827024 +-2.23771111370386011075 +-2.23778322060450696185 +-2.23785526365757414524 +-2.23792724287058408805 +-2.23799915825107476053 +-2.23807100980659123834 +-2.23814279754469236394 +-2.23821452147294852608 +-2.23828618159893988349 +-2.23835777793025991755 +-2.23842931047451099147 +-2.23850077923931056745 +-2.23857218423228498949 +-2.23864352546107392428 +-2.23871480293332547618 +-2.23878601665670284859 +-2.23885716663887945899 +-2.23892825288754027113 +-2.23899927541038357148 +-2.23907023421511608419 +-2.23914112930945918833 +-2.23921196070114669752 +-2.23928272839792041893 +-2.23935343240753770289 +-2.23942407273776478149 +-2.23949464939638387406 +-2.23956516239118563760 +-2.23963561172997449589 +-2.23970599742056508674 +-2.23977631947078625885 +-2.23984657788847751902 +-2.23991677268149214086 +-2.23998690385769272382 +-2.24005697142495607821 +-2.24012697539117144885 +-2.24019691576423918278 +-2.24026679255207294972 +-2.24033660576259707753 +-2.24040635540375010493 +-2.24047604148348122877 +-2.24054566400975385676 +-2.24061522299054294294 +-2.24068471843383454356 +-2.24075415034762981392 +-2.24082351873994012337 +-2.24089282361879016392 +-2.24096206499221706210 +-2.24103124286827171119 +-2.24110035725501477444 +-2.24116940816052379049 +-2.24123839559288562384 +-2.24130731956020001761 +-2.24137618007058048164 +-2.24144497713215384849 +-2.24151371075305760883 +-2.24158238094144435237 +-2.24165098770547821516 +-2.24171953105333709999 +-2.24178801099321001189 +-2.24185642753330105492 +-2.24192478068182543538 +-2.24199307044701345859 +-2.24206129683710653211 +-2.24212945986035894208 +-2.24219755952504007368 +-2.24226559583943130249 +-2.24233356881182599452 +-2.24240147845053261477 +-2.24246932476387250688 +-2.24253710776017767259 +-2.24260482744779743314 +-2.24267248383509087972 +-2.24274007693043264666 +-2.24280760674220935869 +-2.24287507327882140729 +-2.24294247654868295072 +-2.24300981656022146993 +-2.24307709332187732443 +-2.24314430684210375233 +-2.24321145712937042305 +-2.24327854419215677595 +-2.24334556803895868171 +-2.24341252867828311324 +-2.24347942611865303064 +-2.24354626036860382854 +-2.24361303143668555649 +-2.24367973933145847809 +-2.24374638406150239689 +-2.24381296563540422184 +-2.24387948406177084593 +-2.24394593934921893208 +-2.24401233150638113045 +-2.24407866054190074934 +-2.24414492646444019286 +-2.24421112928266985875 +-2.24427726900527924059 +-2.24434334564096893416 +-2.24440935919845374613 +-2.24447530968646358218 +-2.24454119711374078250 +-2.24460702148904278630 +-2.24467278282114168775 +-2.24473848111882334777 +-2.24480411639088606179 +-2.24486968864614455654 +-2.24493519789342688142 +-2.24500064414157485260 +-2.24506602739944582936 +-2.24513134767590960550 +-2.24519660497985196201 +-2.24526179932017200258 +-2.24532693070578437400 +-2.24539199914561571347 +-2.24545700464860997769 +-2.24552194722372355784 +-2.24558682687992883231 +-2.24565164362621016991 +-2.24571639747156925893 +-2.24578108842502111031 +-2.24584571649559494588 +-2.24591028169233508649 +-2.24597478402430095201 +-2.24603922350056484092 +-2.24610360013021681524 +-2.24616791392235715108 +-2.24623216488610566444 +-2.24629635303059371765 +-2.24636047836496821617 +-2.24642454089839072040 +-2.24648854064003966613 +-2.24655247759910503547 +-2.24661635178479413000 +-2.24668016320632801808 +-2.24674391187294286709 +-2.24680759779389038755 +-2.24687122097843561264 +-2.24693478143586178319 +-2.24699827917546368639 +-2.24706171420655342885 +-2.24712508653845599582 +-2.24718839618051458018 +-2.24725164314208525340 +-2.24731482743253918599 +-2.24737794906126486794 +-2.24744100803766277963 +-2.24750400437115116503 +-2.24756693807116336714 +-2.24762980914714693981 +-2.24769261760856453591 +-2.24775536346489479556 +-2.24781804672563234604 +-2.24788066740028602553 +-2.24794322549838110348 +-2.24800572102945706021 +-2.24806815400307025143 +-2.24813052442879168780 +-2.24819283231620747898 +-2.24825507767491972189 +-2.24831726051454783288 +-2.24837938084472321876 +-2.24844143867509504986 +-2.24850343401532848375 +-2.24856536687510333294 +-2.24862723726411539715 +-2.24868904519207690740 +-2.24875079066871386146 +-2.24881247370377090888 +-2.24887409430700513369 +-2.24893565248819182756 +-2.24899714825712271349 +-2.24905858162360194896 +-2.24911995259745234321 +-2.24918126118851269268 +-2.24924250740663644876 +-2.24930369126169349414 +-2.24936481276356881054 +-2.24942587192216558734 +-2.24948686874740166886 +-2.24954780324920955437 +-2.24960867543754039488 +-2.24966948532236044045 +-2.24973023291365059606 +-2.24979091822140953028 +-2.24985154125565189887 +-2.24991210202640790072 +-2.24997260054372505422 +-2.25003303681766686495 +-2.25009341085831060525 +-2.25015372267575308740 +-2.25021397228010622271 +-2.25027415968149835379 +-2.25033428489007247819 +-2.25039434791598980112 +-2.25045434876942973546 +-2.25051428746058235220 +-2.25057416399966081499 +-2.25063397839688983382 +-2.25069373066251365856 +-2.25075342080679074996 +-2.25081304883999777644 +-2.25087261477242739360 +-2.25093211861438691201 +-2.25099156037620407034 +-2.25105094006822037400 +-2.25111025770079509201 +-2.25116951328430348056 +-2.25122870682913855944 +-2.25128783834570800337 +-2.25134690784443858291 +-2.25140591533577305583 +-2.25146486083016972302 +-2.25152374433810509302 +-2.25158256587007121752 +-2.25164132543657879992 +-2.25170002304815364269 +-2.25175865871534020002 +-2.25181723244869802514 +-2.25187574425880443485 +-2.25193419415625362134 +-2.25199258215165665220 +-2.25205090825564147039 +-2.25210917247885378245 +-2.25216737483195572622 +-2.25222551532562631493 +-2.25228359397056143720 +-2.25234161077747652158 +-2.25239956575709943110 +-2.25245745892017890100 +-2.25251529027748054190 +-2.25257305983978506347 +-2.25263076761789315938 +-2.25268841362262062233 +-2.25274599786480056451 +-2.25280352035528474985 +-2.25286098110494092950 +-2.25291838012465595042 +-2.25297571742533131456 +-2.25303299301788806375 +-2.25309020691326322705 +-2.25314735912241248528 +-2.25320444965630839462 +-2.25326147852594083076 +-2.25331844574231610068 +-2.25337535131646093944 +-2.25343219525941629300 +-2.25348897758224220311 +-2.25354569829601736330 +-2.25360235741183512204 +-2.25365895494080925587 +-2.25371549089406952859 +-2.25377196528276346754 +-2.25382837811805725181 +-2.25388472941113349179 +-2.25394101917319300554 +-2.25399724741545481876 +-2.25405341414915438847 +-2.25410951938554759977 +-2.25416556313590410454 +-2.25422154541151442686 +-2.25427746622368596618 +-2.25433332558374299737 +-2.25438912350303066745 +-2.25444485999290833433 +-2.25450053506475578402 +-2.25455614872996923381 +-2.25461170099996266458 +-2.25466719188617004122 +-2.25472262140004131581 +-2.25477798955304553630 +-2.25483329635666862600 +-2.25488854182241649227 +-2.25494372596181058555 +-2.25499884878639145214 +-2.25505391030771917826 +-2.25510891053737028145 +-2.25516384948694037504 +-2.25521872716804150372 +-2.25527354359230525205 +-2.25532829877138230046 +-2.25538299271694020476 +-2.25543762544066428433 +-2.25549219695425984256 +-2.25554670726944817005 +-2.25560115639797231779 +-2.25565554435158865942 +-2.25570987114207621715 +-2.25576413678123177675 +-2.25581834128086722302 +-2.25587248465281708931 +-2.25592656690893100802 +-2.25598058806107903962 +-2.25603454812114945227 +-2.25608844710104738951 +-2.25614228501269931115 +-2.25619606186804633197 +-2.25624977767905132708 +-2.25630343245769493521 +-2.25635702621597555861 +-2.25641055896591025132 +-2.25646403071953693953 +-2.25651744148890731623 +-2.25657079128609661112 +-2.25662408012319648520 +-2.25667730801231680715 +-2.25673047496558698555 +-2.25678358099515685709 +-2.25683662611318958113 +-2.25688961033187318606 +-2.25694253366341079925 +-2.25699539612002597622 +-2.25704819771395959194 +-2.25710093845747206132 +-2.25715361836284378327 +-2.25720623744237203212 +-2.25725879570837406618 +-2.25731129317318712779 +-2.25736372984916355833 +-2.25741610574867879180 +-2.25746842088412469352 +-2.25752067526791355689 +-2.25757286891247588301 +-2.25762500183026082468 +-2.25767707403373663055 +-2.25772908553539108922 +-2.25778103634773197328 +-2.25783292648328481889 +-2.25788475595459292578 +-2.25793652477422090996 +-2.25798823295475248329 +-2.25803988050878867710 +-2.25809146744895139491 +-2.25814299378788119199 +-2.25819445953823638717 +-2.25824586471269661558 +-2.25829720932396016408 +-2.25834849338474397129 +-2.25839971690778451574 +-2.25845087990583825999 +-2.25850198239167854197 +-2.25855302437810090410 +-2.25860400587791865235 +-2.25865492690396463260 +-2.25870578746909211887 +-2.25875658758617081645 +-2.25880732726809396738 +-2.25885800652776991271 +-2.25890862537813097433 +-2.25895918383212412905 +-2.25900968190271944636 +-2.25906011960290431517 +-2.25911049694568744073 +-2.25916081394409440364 +-2.25921107061117387715 +-2.25926126695999140992 +-2.25931140300363209050 +-2.25936147875520143558 +-2.25941149422782538991 +-2.25946144943464721777 +-2.25951134438883149969 +-2.25956117910356235612 +-2.25961095359204255928 +-2.25966066786749664175 +-2.25971032194316467923 +-2.25975991583231206050 +-2.25980944954821838522 +-2.25985892310418767792 +-2.25990833651353906220 +-2.25995768978961608653 +-2.26000698294578006298 +-2.26005621599540917899 +-2.26010538895190737918 +-2.26015450182869281903 +-2.26020355463920763484 +-2.26025254739691039418 +-2.26030148011528275731 +-2.26035035280782281575 +-2.26039916548805308594 +-2.26044791816951029517 +-2.26049661086575603974 +-2.26054524359036967951 +-2.26059381635695055834 +-2.26064232917911800413 +-2.26069078207051221696 +-2.26073917504479249274 +-2.26078750811563811141 +-2.26083578129674833690 +-2.26088399460184330536 +-2.26093214804466358103 +-2.26098024163896704763 +-2.26102827539853601380 +-2.26107624933716744309 +-2.26112416346868405626 +-2.26117201780692411717 +-2.26121981236574942642 +-2.26126754715903999227 +-2.26131522220069669515 +-2.26136283750464084363 +-2.26141039308481239800 +-2.26145788895517307893 +-2.26150532512970547927 +-2.26155270162240995546 +-2.26160001844730995657 +-2.26164727561844713932 +-2.26169447314988403264 +-2.26174161105570403762 +-2.26178868935001009532 +-2.26183570804692601897 +-2.26188266716059649397 +-2.26192956670518485751 +-2.26197640669487620713 +-2.26202318714387562437 +-2.26206990806640906300 +-2.26211656947672201667 +-2.26216317138908129536 +-2.26220971381777280484 +-2.26225619677710465538 +-2.26230262028140449715 +-2.26234898434502129660 +-2.26239528898232311604 +-2.26244153420769844587 +-2.26248772003555886911 +-2.26253384648033284421 +-2.26257991355647325449 +-2.26262592127845030276 +-2.26267186966075639631 +-2.26271775871790392642 +-2.26276358846442704476 +-2.26280935891487855471 +-2.26285507008383390826 +-2.26290072198588765318 +-2.26294631463565654172 +-2.26299184804777597790 +-2.26303732223690357017 +-2.26308273721771779918 +-2.26312809300491712960 +-2.26317338961322045421 +-2.26321862705736842614 +-2.26326380535212123846 +-2.26330892451226128870 +-2.26335398455259140249 +-2.26339898548793350130 +-2.26344392733313171107 +-2.26348881010305280626 +-2.26353363381257999265 +-2.26357839847662090094 +-2.26362310411010314581 +-2.26366775072797477009 +-2.26371233834520424466 +-2.26375686697678224490 +-2.26380133663771987429 +-2.26384574734304910848 +-2.26389009910782057489 +-2.26393439194711110218 +-2.26397862587601395035 +-2.26402280090964413972 +-2.26406691706313889512 +-2.26411097435165631353 +-2.26415497279037447598 +-2.26419891239449233566 +-2.26424279317923105026 +-2.26428661515983309371 +-2.26433037835156092399 +-2.26437408276969698306 +-2.26441772842954769374 +-2.26446131534643768646 +-2.26450484353571646068 +-2.26454831301274861488 +-2.26459172379292628108 +-2.26463507589165846667 +-2.26467836932437727171 +-2.26472160410653433615 +-2.26476478025360572488 +-2.26480789778108482224 +-2.26485095670448766114 +-2.26489395703935292303 +-2.26493689880123927338 +-2.26497978200572491758 +-2.26502260666841248593 +-2.26506537280492326047 +-2.26510808043090161590 +-2.26515072956201235499 +-2.26519332021394159682 +-2.26523585240239677674 +-2.26527832614310664638 +-2.26532074145182082958 +-2.26536309834431159871 +-2.26540539683637032198 +-2.26544763694381279251 +-2.26548981868247301108 +-2.26553194206820807111 +-2.26557400711689682637 +-2.26561601384443811469 +-2.26565796226675253422 +-2.26569985239978333169 +-2.26574168425949418193 +-2.26578345786186918787 +-2.26582517322291643325 +-2.26586683035866309766 +-2.26590842928515856514 +-2.26594997001847442419 +-2.26599145257470313553 +-2.26603287696995803202 +-2.26607424322037598330 +-2.26611555134211206664 +-2.26615680135134489603 +-2.26619799326427662223 +-2.26623912709712715952 +-2.26628020286613907075 +-2.26632122058757934369 +-2.26636218027773184147 +-2.26640308195290574034 +-2.26644392562943020053 +-2.26648471132365569858 +-2.26652543905195580365 +-2.26656610883072362483 +-2.26660672067637580795 +-2.26664727460534942693 +-2.26668777063410464834 +-2.26672820877912073456 +-2.26676858905690137291 +-2.26680891148397023471 +-2.26684917607687230756 +-2.26688938285217700397 +-2.26692953182647238819 +-2.26696962301636961712 +-2.26700965643850160802 +-2.26704963210952215036 +-2.26708955004610723805 +-2.26712941026495551355 +-2.26716921278278649154 +-2.26720895761634100296 +-2.26724864478238252730 +-2.26728827429769719259 +-2.26732784617908933456 +-2.26736736044338904605 +-2.26740681710744773625 +-2.26744621618813502195 +-2.26748555770234760942 +-2.26752484166699863621 +-2.26756406809902788524 +-2.26760323701539423524 +-2.26764234843307832534 +-2.26768140236908521956 +-2.26772039884043863367 +-2.26775933786418582017 +-2.26779821945739579192 +-2.26783704363716021035 +-2.26787581042059116498 +-2.26791451982482339389 +-2.26795317186701295142 +-2.26799176656433898458 +-2.26803030393400240072 +-2.26806878399322497941 +-2.26810720675925159284 +-2.26814557224934709723 +-2.26818388048080255004 +-2.26822213147092677232 +-2.26826032523705167776 +-2.26829846179653271676 +-2.26833654116674487966 +-2.26837456336508802579 +-2.26841252840898111032 +-2.26845043631586751331 +-2.26848828710321148705 +-2.26852608078849948825 +-2.26856381738923973401 +-2.26860149692296353408 +-2.26863911940722351446 +-2.26867668485959317337 +-2.26871419329767087802 +-2.26875164473907497964 +-2.26878903920144647799 +-2.26882637670244902139 +-2.26886365725976624219 +-2.26890088089110752989 +-2.26893804761420092575 +-2.26897515744679845184 +-2.26901221040667522288 +-2.26904920651162456124 +-2.26908614577946732282 +-2.26912302822804168301 +-2.26915985387521024208 +-2.26919662273885824888 +-2.26923333483689360079 +-2.26926999018724329105 +-2.26930658880785873777 +-2.26934313071671311945 +-2.26937961593180315134 +-2.26941604447114642085 +-2.26945241635278271985 +-2.26948873159477271244 +-2.26952499021520281985 +-2.26956119223217855918 +-2.26959733766383076059 +-2.26963342652830801782 +-2.26966945884378512588 +-2.26970543462845819604 +-2.26974135390054421180 +-2.26977721667828413743 +-2.26981302297994069761 +-2.26984877282379748920 +-2.26988446622816342213 +-2.26992010321136650219 +-2.26995568379175916007 +-2.26999120798771558682 +-2.27002667581763128979 +-2.27006208729992575712 +-2.27009744245304023735 +-2.27013274129543685120 +-2.27016798384560303248 +-2.27020317012204575491 +-2.27023830014329552895 +-2.27027337392790506954 +-2.27030839149444974012 +-2.27034335286152710864 +-2.27037825804775739158 +-2.27041310707178300987 +-2.27044789995226725665 +-2.27048263670789784996 +-2.27051731735738515638 +-2.27055194191945908244 +-2.27058651041287573591 +-2.27062102285641120858 +-2.27065547926886512897 +-2.27068987966905755371 +-2.27072422407583340842 +-2.27075851250805893500 +-2.27079274498462213572 +-2.27082692152443632594 +-2.27086104214643302868 +-2.27089510686956996821 +-2.27092911571282440875 +-2.27096306869519759530 +-2.27099696583571475372 +-2.27103080715342064977 +-2.27106459266738225367 +-2.27109832239669362508 +-2.27113199636046569907 +-2.27116561457783561195 +-2.27119917706796226042 +-2.27123268385002496927 +-2.27126613494322837639 +-2.27129953036679799183 +-2.27133287013998286241 +-2.27136615428205290712 +-2.27139938281230158168 +-2.27143255575004632263 +-2.27146567311462410643 +-2.27149873492539722264 +-2.27153174120174883299 +-2.27156469196308430369 +-2.27159758722883253768 +-2.27163042701844553051 +-2.27166321135139703813 +-2.27169594024718302094 +-2.27172861372532208790 +-2.27176123180535594059 +-2.27179379450684848507 +-2.27182630184938716411 +-2.27185875385257984860 +-2.27189115053605883432 +-2.27192349191947862153 +-2.27195577802251591493 +-2.27198800886486962369 +-2.27202018446626308190 +-2.27205230484644005173 +-2.27208437002516783210 +-2.27211638002223637045 +-2.27214833485745870689 +-2.27218023455066919780 +-2.27221207912172573629 +-2.27224386859050886400 +-2.27227560297692088298 +-2.27230728230088763198 +-2.27233890658235759830 +-2.27237047584130102962 +-2.27240199009771215444 +-2.27243344937160607344 +-2.27246485368302186814 +-2.27249620305202082449 +-2.27252749749868643292 +-2.27255873704312616468 +-2.27258992170546836320 +-2.27262105150586579683 +-2.27265212646449166201 +-2.27268314660154535645 +-2.27271411193724448552 +-2.27274502249183196767 +-2.27277587828557381400 +-2.27280667933875690778 +-2.27283742567169255722 +-2.27286811730471338677 +-2.27289875425817511356 +-2.27292933655245654734 +-2.27295986420795870231 +-2.27299033724510479715 +-2.27302075568434247543 +-2.27305111954614025294 +-2.27308142885098929398 +-2.27311168361940607596 +-2.27314188387192528396 +-2.27317202962910913655 +-2.27320212091153850409 +-2.27323215773981957000 +-2.27326214013457983398 +-2.27329206811646988839 +-2.27332194170616430640 +-2.27335176092435764517 +-2.27338152579176977497 +-2.27341123632914099417 +-2.27344089255723647014 +-2.27347049449684179834 +-2.27350004216876833141 +-2.27352953559384696192 +-2.27355897479293256325 +-2.27358835978690354551 +-2.27361769059666052328 +-2.27364696724312542742 +-2.27367618974724416958 +-2.27370535812998664227 +-2.27373447241234316607 +-2.27376353261532715422 +-2.27379253875997600076 +-2.27382149086734886012 +-2.27385038895852797936 +-2.27387923305461780998 +-2.27390802317674545208 +-2.27393675934606287470 +-2.27396544158374114275 +-2.27399406991097663422 +-2.27402264434898748746 +-2.27405116491901537756 +-2.27407963164232329589 +-2.27410804454019865872 +-2.27413640363395019861 +-2.27416470894491107302 +-2.27419296049443397933 +-2.27422115830389737212 +-2.27424930239470191040 +-2.27427739278827045766 +-2.27430542950604763774 +-2.27433341256950205533 +-2.27436134200012540774 +-2.27438921781943204081 +-2.27441704004895584035 +-2.27444480871025911384 +-2.27447252382492237643 +-2.27450018541455012411 +-2.27452779350077083365 +-2.27455534810523340994 +-2.27458284924961073870 +-2.27461029695559968644 +-2.27463769124491754781 +-2.27466503213930604232 +-2.27469231966052731764 +-2.27471955383036972265 +-2.27474673467064203436 +-2.27477386220317567833 +-2.27480093644982561685 +-2.27482795743246901665 +-2.27485492517300613713 +-2.27488183969335944212 +-2.27490870101547582038 +-2.27493550916132170059 +-2.27496226415288793632 +-2.27498896601218980607 +-2.27501561476126346051 +-2.27504221042216681070 +-2.27506875301698263669 +-2.27509524256781503482 +-2.27512167909679119404 +-2.27514806262606095189 +-2.27517439317779857078 +-2.27520067077419652080 +-2.27522689543747480556 +-2.27525306718987474497 +-2.27527918605365808702 +-2.27530525205111189280 +-2.27533126520454587194 +-2.27535722553628971809 +-2.27538313306869977026 +-2.27540898782415057511 +-2.27543478982504421282 +-2.27546053909380185942 +-2.27548623565286867176 +-2.27551187952471334341 +-2.27553747073182410787 +-2.27556300929671673217 +-2.27558849524192519098 +-2.27561392859000832800 +-2.27563930936354763546 +-2.27566463758514769822 +-2.27568991327743264108 +-2.27571513646305412237 +-2.27574030716468378444 +-2.27576542540501458589 +-2.27579049120676568663 +-2.27581550459267489828 +-2.27584046558550623374 +-2.27586537420804546628 +-2.27589023048309879727 +-2.27591503443349729707 +-2.27593978608209468462 +-2.27596448545176688327 +-2.27598913256541202088 +-2.27601372744595042974 +-2.27603827011632819932 +-2.27606276059950918267 +-2.27608719891848387817 +-2.27611158509626365642 +-2.27613591915588253656 +-2.27616020112039851853 +-2.27618443101289003039 +-2.27620860885646081329 +-2.27623273467423414829 +-2.27625680848935685319 +-2.27628083032500150296 +-2.27630480020436021249 +-2.27632871815064641297 +-2.27635258418709973682 +-2.27637639833698024461 +-2.27640016062357108950 +-2.27642387107017851733 +-2.27644752970012964610 +-2.27647113653677690692 +-2.27649469160349271490 +-2.27651819492367302189 +-2.27654164652073776054 +-2.27656504641812640344 +-2.27658839463930506852 +-2.27661169120775852548 +-2.27663493614699552481 +-2.27665812948054924192 +-2.27668127123197194805 +-2.27670436142484122755 +-2.27672740008275686918 +-2.27675038722933864577 +-2.27677332288823386364 +-2.27679620708310626043 +-2.27681903983764755139 +-2.27684182117556810354 +-2.27686455112060359696 +-2.27688722969651058392 +-2.27690985692706870935 +-2.27693243283607849037 +-2.27695495744736664534 +-2.27697743078477898848 +-2.27699985287218531482 +-2.27702222373347851203 +-2.27704454339257100770 +-2.27706681187340276296 +-2.27708902919993061431 +-2.27711119539613759954 +-2.27713331048602896090 +-2.27715537449363081279 +-2.27717738744299236231 +-2.27719934935818635324 +-2.27722126026330640158 +-2.27724312018246966005 +-2.27726492913981592991 +-2.27728668715950544055 +-2.27730839426572417850 +-2.27733005048267678205 +-2.27735165583459409078 +-2.27737321034572648415 +-2.27739471404034832247 +-2.27741616694275528232 +-2.27743756907726657701 +-2.27745892046822318022 +-2.27748022113998827010 +-2.27750147111694900559 +-2.27752267042351208559 +-2.27754381908410863389 +-2.27756491712319197873 +-2.27758596456523809692 +-2.27760696143474339337 +-2.27762790775622958606 +-2.27764880355423748881 +-2.27766964885333367263 +-2.27769044367810424845 +-2.27771118805315841982 +-2.27773188200312981522 +-2.27775252555267071486 +-2.27777311872645915614 +-2.27779366154919316045 +-2.27781415404559384186 +-2.27783459624040540703 +-2.27785498815839293485 +-2.27787532982434504092 +-2.27789562126307210121 +-2.27791586249940625208 +-2.27793605355820227842 +-2.27795619446433761368 +-2.27797628524271233985 +-2.27799632591824741112 +-2.27801631651588731842 +-2.27803625706059831302 +-2.27805614757736751841 +-2.27807598809120781524 +-2.27809577862715073593 +-2.27811551921025134959 +-2.27813520986558737391 +-2.27815485061825873103 +-2.27817444149338621528 +-2.27819398251611460182 +-2.27821347371160998208 +-2.27823291510506020785 +-2.27825230672167622359 +-2.27827164858668984593 +-2.27829094072535687232 +-2.27831018316295397241 +-2.27832937592478090849 +-2.27834851903615698276 +-2.27836761252242681053 +-2.27838665640895587927 +-2.27840565072113232503 +-2.27842459548436471195 +-2.27844349072408602908 +-2.27846233646574969356 +-2.27848113273483177110 +-2.27849987955683008778 +-2.27851857695726556230 +-2.27853722496167909739 +-2.27855582359563646477 +-2.27857437288472297610 +-2.27859287285454836791 +-2.27861132353074147261 +-2.27862972493895510340 +-2.27864807710486516612 +-2.27866638005416577428 +-2.27868463381257768674 +-2.27870283840584031410 +-2.27872099385971660368 +-2.27873910019999037502 +-2.27875715745246898436 +-2.27877516564297977197 +-2.27879312479737361485 +-2.27881103494152315037 +-2.27882889610132233216 +-2.27884670830268820652 +-2.27886447157155691556 +-2.27888218593389080269 +-2.27889985141566997484 +-2.27891746804289896389 +-2.27893503584160495024 +-2.27895255483783287787 +-2.27897002505765522429 +-2.27898744652716045422 +-2.27900481927246412184 +-2.27902214331969998895 +-2.27903941869502579820 +-2.27905664542461972033 +-2.27907382353468257463 +-2.27909095305143694077 +-2.27910803400112671468 +-2.27912506641001888497 +-2.27914205030439953603 +-2.27915898571058006539 +-2.27917587265489052228 +-2.27919271116368538088 +-2.27920950126333776709 +-2.27922624298024567580 +-2.27924293634082753002 +-2.27925958137152262495 +-2.27927617809879334843 +-2.27929272654912251639 +-2.27930922674901692560 +-2.27932567872500158046 +-2.27934208250362724257 +-2.27935843811146154891 +-2.27937474557509833772 +-2.27939100492115098717 +-2.27940721617625463580 +-2.27942337936706573842 +-2.27943949452026295432 +-2.27945556166254714725 +-2.27947158082063916495 +-2.27948755202128205966 +-2.27950347529124108803 +-2.27951935065730326713 +-2.27953517814627648619 +-2.27955095778499039483 +-2.27956668960029507076 +-2.27958237361906501661 +-2.27959800986819249857 +-2.27961359837459420774 +-2.27962913916520859559 +-2.27964463226699232123 +-2.27966007770692691281 +-2.27967547551201343836 +-2.27969082570927517040 +-2.27970612832575714179 +-2.27972138338852481354 +-2.27973659092466629517 +-2.27975175096129056840 +-2.27976686352552659898 +-2.27978192864452866573 +-2.27979694634546747878 +-2.27981191665553861725 +-2.27982683960195808837 +-2.27984171521196321564 +-2.27985654351281130658 +-2.27987132453178453773 +-2.27988605829618284915 +-2.27990074483332882949 +-2.27991538417056682775 +-2.27992997633526162105 +-2.27994452135480019095 +-2.27995901925659039122 +-2.27997347006806005965 +-2.27998787381666057072 +-2.28000223052986372707 +-2.28001654023516175940 +-2.28003080296006777061 +-2.28004501873211884444 +-2.28005918757887027226 +-2.28007330952789910583 +-2.28008738460680504545 +-2.28010141284320777544 +-2.28011539426474829639 +-2.28012932889908892520 +-2.28014321677391329501 +-2.28015705791692457893 +-2.28017085235584948677 +-2.28018460011843471236 +-2.28019830123244737763 +-2.28021195572567680898 +-2.28022556362593187274 +-2.28023912496104497194 +-2.28025263975886716139 +-2.28026610804727125625 +-2.28027952985415183207 +-2.28029290520742344839 +-2.28030623413502242514 +-2.28031951666490551034 +-2.28033275282505076831 +-2.28034594264345624737 +-2.28035908614814308848 +-2.28037218336715019618 +-2.28038523432854134398 +-2.28039823906039806900 +-2.28041119759082322460 +-2.28042410994794142454 +-2.28043697615989904293 +-2.28044979625486066155 +-2.28046257026101351073 +-2.28047529820656569299 +-2.28048798011974529487 +-2.28050061602880127509 +-2.28051320596200524093 +-2.28052574994764611915 +-2.28053824801403681732 +-2.28055070018950889477 +-2.28056310650241611526 +-2.28057546698113311479 +-2.28058778165405229288 +-2.28060005054959091808 +-2.28061227369618313432 +-2.28062445112228839861 +-2.28063658285638126699 +-2.28064866892696027634 +-2.28066070936254439161 +-2.28067270419167344997 +-2.28068465344290549623 +-2.28069655714482255604 +-2.28070841532602441859 +-2.28072022801513396573 +-2.28073199524079228695 +-2.28074371703166223213 +-2.28075539341642663516 +-2.28076702442378964619 +-2.28077861008247584351 +-2.28079015042122890122 +-2.28080164546881469789 +-2.28081309525401776384 +-2.28082449980564572201 +-2.28083585915252395893 +-2.28084717332349917740 +-2.28085844234743939651 +-2.28086966625323173119 +-2.28088084506978550081 +-2.28089197882602734424 +-2.28090306755090654889 +-2.28091411127339327436 +-2.28092511002247499974 +-2.28093606382716318492 +-2.28094697271648705339 +-2.28095783671949714488 +-2.28096865586526353908 +-2.28097943018287763195 +-2.28099015970145080345 +-2.28100084445011308532 +-2.28101148445801671372 +-2.28102207975433302067 +-2.28103263036825376631 +-2.28104313632899158293 +-2.28105359766577819869 +-2.28106401440786576984 +-2.28107438658452732483 +-2.28108471422505321158 +-2.28109499735875820292 +-2.28110523601497483526 +-2.28111543022305518491 +-2.28112558001237131222 +-2.28113568541231659381 +-2.28114574645230394623 +-2.28115576316176671412 +-2.28116573557015689389 +-2.28117566370694735411 +-2.28118554760163094741 +-2.28119538728371962222 +-2.28120518278274664326 +-2.28121493412826392699 +-2.28122464134984470618 +-2.28123430447707997715 +-2.28124392353958249657 +-2.28125349856698367290 +-2.28126302958893578676 +-2.28127251663511110280 +-2.28128195973519964923 +-2.28129135891891277055 +-2.28130071421598090708 +-2.28131002565615625954 +-2.28131929326920879220 +-2.28132851708492756515 +-2.28133769713312251071 +-2.28134683344362443336 +-2.28135592604628101299 +-2.28136497497096168985 +-2.28137398024755588821 +-2.28138294190596990774 +-2.28139185997613269663 +-2.28140073448799007849 +-2.28140956547151185774 +-2.28141835295668160555 +-2.28142709697350642983 +-2.28143579755201120207 +-2.28144445472224077776 +-2.28145306851426132866 +-2.28146163895815545786 +-2.28147016608402619653 +-2.28147864992199744805 +-2.28148709050221176753 +-2.28149548785482858548 +-2.28150384201003220142 +-2.28151215299802068159 +-2.28152042084901562902 +-2.28152864559325418981 +-2.28153682726099660272 +-2.28154496588251953781 +-2.28155306148812053735 +-2.28156111410811623941 +-2.28156912377284282201 +-2.28157709051265378264 +-2.28158501435792393508 +-2.28159289533904674485 +-2.28160073348643432922 +-2.28160852883051923357 +-2.28161628140175176682 +-2.28162399123060222195 +-2.28163165834755776729 +-2.28163928278312999609 +-2.28164686456784338020 +-2.28165440373224592818 +-2.28166190030690163582 +-2.28166935432239625925 +-2.28167676580933331820 +-2.28168413479833454005 +-2.28169146132004074801 +-2.28169874540511408156 +-2.28170598708423311152 +-2.28171318638809639268 +-2.28172034334741979933 +-2.28172745799294052205 +-2.28173453035541440315 +-2.28174156046561371625 +-2.28174854835433249534 +-2.28175549405238076162 +-2.28176239759059029666 +-2.28176925899980886925 +-2.28177607831090512036 +-2.28178285555476589863 +-2.28178959076229492808 +-2.28179628396441858129 +-2.28180293519207788577 +-2.28180954447623429715 +-2.28181611184787014324 +-2.28182263733798063043 +-2.28182912097758494596 +-2.28183556279771959652 +-2.28184196282943885237 +-2.28184832110381430326 +-2.28185463765193929930 +-2.28186091250492273375 +-2.28186714569389392793 +-2.28187333724999996676 +-2.28187948720440614281 +-2.28188559558829817675 +-2.28189166243287644420 +-2.28189768776936263706 +-2.28190367162899576670 +-2.28190961404303394033 +-2.28191551504275347284 +-2.28192137465944844266 +-2.28192719292443157997 +-2.28193296986903337853 +-2.28193870552460342793 +-2.28194439992250952542 +-2.28195005309413812000 +-2.28195566507089253605 +-2.28196123588419341743 +-2.28196676556548405657 +-2.28197225414622106854 +-2.28197770165788149654 +-2.28198310813196059144 +-2.28198847359997136763 +-2.28199379809344460313 +-2.28199908164392928356 +-2.28200432428299215815 +-2.28200952604221907194 +-2.28201468695321363356 +-2.28201980704759588292 +-2.28202488635700451169 +-2.28202992491309863965 +-2.28203492274755204150 +-2.28203987989205714371 +-2.28204479637832546857 +-2.28204967223808585786 +-2.28205450750308402874 +-2.28205930220508523831 +-2.28206405637587117496 +-2.28206877004724129065 +-2.28207344325101368909 +-2.28207807601902423755 +-2.28208266838312567870 +-2.28208722037518851877 +-2.28209173202710147166 +-2.28209620337077145891 +-2.28210063443812183337 +-2.28210502526109415555 +-2.28210937587164730544 +-2.28211368630175881478 +-2.28211795658342131432 +-2.28212218674864741885 +-2.28212637682946617446 +-2.28213052685792527896 +-2.28213463686608841741 +-2.28213870688603615022 +-2.28214273694986946595 +-2.28214672708970400805 +-2.28215067733767451585 +-2.28215458772593127179 +-2.28215845828664232187 +-2.28216228905199569610 +-2.28216608005419407945 +-2.28216983132545658819 +-2.28217354289802321077 +-2.28217721480414770241 +-2.28218084707610247008 +-2.28218443974617768433 +-2.28218799284667950289 +-2.28219150640993184709 +-2.28219498046827551363 +-2.28219841505406995097 +-2.28220181019968926250 +-2.28220516593752575929 +-2.28220848229998907186 +-2.28221175931950481797 +-2.28221499702851726710 +-2.28221819545948667596 +-2.28222135464488973255 +-2.28222447461722222073 +-2.28222755540899280291 +-2.28223059705273190190 +-2.28223359958098370726 +-2.28223656302630928394 +-2.28223948742128879275 +-2.28224237279851571714 +-2.28224521919060441277 +-2.28224802663018166982 +-2.28225079514989470653 +-2.28225352478240584020 +-2.28225621556039470761 +-2.28225886751655560047 +-2.28226148068360190635 +-2.28226405509426300000 +-2.28226659078128424341 +-2.28226908777742742984 +-2.28227154611547300433 +-2.28227396582821429050 +-2.28227634694846548413 +-2.28227868950905232737 +-2.28228099354282143452 +-2.28228325908263451893 +-2.28228548616136839300 +-2.28228767481191718858 +-2.28228982506719235701 +-2.28229193696011956050 +-2.28229401052364222480 +-2.28229604579072065107 +-2.28229804279433068359 +-2.28230000156746282158 +-2.28230192214312710419 +-2.28230380455434733733 +-2.28230564883416509048 +-2.28230745501563614397 +-2.28230922313183404171 +-2.28231095321584742663 +-2.28231264530078270525 +-2.28231429941976005082 +-2.28231591560591740020 +-2.28231749389240823334 +-2.28231903431240157332 +-2.28232053689908376271 +-2.28232200168565491083 +-2.28232342870533289059 +-2.28232481799135156209 +-2.28232616957695944038 +-2.28232748349542058364 +-2.28232875978001681361 +-2.28232999846404549515 +-2.28233119958081731582 +-2.28233236316366117080 +-2.28233348924592149842 +-2.28233457786095739195 +-2.28233562904214482003 +-2.28233664282287351810 +-2.28233761923655098514 +-2.28233855831659981916 +-2.28233946009645682906 +-2.28234032460957658728 +-2.28234115188942698893 +-2.28234194196949369271 +-2.28234269488327567998 +-2.28234341066428880751 +-2.28234408934606358699 +-2.28234473096214696142 +-2.28234533554610097283 +-2.28234590313150231822 +-2.28234643375194279358 +-2.28234692744103062623 +-2.28234738423239003069 +-2.28234780415965765599 +-2.28234818725648880289 +-2.28234853355655120666 +-2.28234884309352858978 +-2.28234911590112155011 +-2.28234935201304356411 +-2.28234955146302276319 +-2.28234971428480726274 +-2.28234984051215405998 +-2.28234993017883880384 +-2.28234998331865046595 +-2.28234999996539489331 +-2.28234998014945666966 +-2.28234992388917534711 +-2.28234983120024015335 +-2.28234970209833232246 +-2.28234953659912864765 +-2.28234933471829704033 +-2.28234909647149919465 +-2.28234882187438925527 +-2.28234851094261559368 +-2.28234816369181814366 +-2.28234778013763195403 +-2.28234736029568274773 +-2.28234690418159047454 +-2.28234641181096931106 +-2.28234588319942455215 +-2.28234531836255483128 +-2.28234471731595478516 +-2.28234408007520794825 +-2.28234340665589252595 +-2.28234269707358228274 +-2.28234195134384032499 +-2.28234116948222487409 +-2.28234035150428704597 +-2.28233949742557085116 +-2.28233860726161275068 +-2.28233768102794565280 +-2.28233671874009047542 +-2.28233572041356413962 +-2.28233468606387779332 +-2.28233361570653325856 +-2.28233250935702658424 +-2.28233136703084671382 +-2.28233018874347681759 +-2.28232897451039162817 +-2.28232772434705921683 +-2.28232643826894232575 +-2.28232511629149525945 +-2.28232375843016699335 +-2.28232236470039762111 +-2.28232093511762101912 +-2.28231946969726662289 +-2.28231796845475409796 +-2.28231643140549600446 +-2.28231485856490090569 +-2.28231324994836937137 +-2.28231160557129308941 +-2.28230992544906063912 +-2.28230820959704994166 +-2.28230645803063492139 +-2.28230467076518195313 +-2.28230284781604852995 +-2.28230098919859036855 +-2.28229909492814941885 +-2.28229716502006718670 +-2.28229519948967540799 +-2.28229319835229871316 +-2.28229116162325595951 +-2.28228908931785845482 +-2.28228698145141217779 +-2.28228483803921422535 +-2.28228265909655636534 +-2.28228044463872326020 +-2.28227819468099291100 +-2.28227590923863532524 +-2.28227358832691651358 +-2.28227123196109227266 +-2.28226884015641484638 +-2.28226641292812670869 +-2.28226395029146678084 +-2.28226145226166465818 +-2.28225891885394327474 +-2.28225635008352067956 +-2.28225374596560692808 +-2.28225110651540497031 +-2.28224843174811242719 +-2.28224572167891937013 +-2.28224297632300698879 +-2.28224019569555469644 +-2.28223737981172947187 +-2.28223452868669696159 +-2.28223164233561304215 +-2.28222872077362515242 +-2.28222576401587762263 +-2.28222277207750723349 +-2.28221974497364366030 +-2.28221668271940769657 +-2.28221358532991658308 +-2.28221045282028045520 +-2.28220728520560012242 +-2.28220408250097328562 +-2.28220084472148831978 +-2.28219757188222738264 +-2.28219426399826685881 +-2.28219092108467558333 +-2.28218754315651661813 +-2.28218413022884547559 +-2.28218068231671056267 +-2.28217719943515495729 +-2.28217368159921463189 +-2.28217012882391756534 +-2.28216654112428818379 +-2.28216291851533936708 +-2.28215926101208221866 +-2.28215556862951807204 +-2.28215184138264381986 +-2.28214807928644658475 +-2.28214428235591126892 +-2.28214045060601167236 +-2.28213658405171759824 +-2.28213268270799174431 +-2.28212874658978881470 +-2.28212477571205951676 +-2.28212077008974567605 +-2.28211672973778334494 +-2.28211265467110058225 +-2.28210854490462189403 +-2.28210440045326157232 +-2.28210022133192991234 +-2.28209600755553010387 +-2.28209175913895645493 +-2.28208747609710016491 +-2.28208315844484355139 +-2.28207880619706315883 +-2.28207441936862798215 +-2.28206999797440124311 +-2.28206554202923950214 +-2.28206105154799310242 +-2.28205652654550394942 +-2.28205196703661039592 +-2.28204737303614058064 +-2.28204274455891997775 +-2.28203808161976340330 +-2.28203338423348256470 +-2.28202865241487984349 +-2.28202388617875362442 +-2.28201908553989474271 +-2.28201425051308426362 +-2.28200938111310280831 +-2.28200447735471989574 +-2.28199953925269971577 +-2.28199456682180024103 +-2.28198956007677145053 +-2.28198451903235888238 +-2.28197944370330008113 +-2.28197433410432681811 +-2.28196919025016287108 +-2.28196401215552890918 +-2.28195879983513316702 +-2.28195355330368387925 +-2.28194827257587817826 +-2.28194295766640875556 +-2.28193760858996075314 +-2.28193222536121398392 +-2.28192680799483937903 +-2.28192135650550431691 +-2.28191587090786729419 +-2.28191035121658236662 +-2.28190479744629426406 +-2.28189920961164416369 +-2.28189358772726569313 +-2.28188793180778448644 +-2.28188224186782129266 +-2.28187651792198931133 +-2.28187075998489730111 +-2.28186496807114469476 +-2.28185914219532648417 +-2.28185328237202966761 +-2.28184738861583635838 +-2.28184146094132156435 +-2.28183549936305141159 +-2.28182950389559069393 +-2.28182347455349310295 +-2.28181741135130700115 +-2.28181131430357542200 +-2.28180518342483473759 +-2.28179901872961288234 +-2.28179282023243334976 +-2.28178658794781297203 +-2.28178032189026147591 +-2.28177402207428281500 +-2.28176768851437250518 +-2.28176132122502250965 +-2.28175492022071590981 +-2.28174848551593090207 +-2.28174201712513902152 +-2.28173551506280380963 +-2.28172897934338481107 +-2.28172240998133313283 +-2.28171580699109322055 +-2.28170917038710641123 +-2.28170250018380249557 +-2.28169579639560948792 +-2.28168905903694563264 +-2.28168228812222517732 +-2.28167548366585348774 +-2.28166864568223237697 +-2.28166177418575522040 +-2.28165486919080917616 +-2.28164793071177518513 +-2.28164095876302708277 +-2.28163395335893426363 +-2.28162691451385901686 +-2.28161984224215519390 +-2.28161273655817220529 +-2.28160559747625280025 +-2.28159842501073262255 +-2.28159121917594287510 +-2.28158397998620499081 +-2.28157670745583729399 +-2.28156940159914878308 +-2.28156206243044534787 +-2.28155468996402310822 +-2.28154728421417463124 +-2.28153984519518493457 +-2.28153237292133104219 +-2.28152486740688642541 +-2.28151732866611700601 +-2.28150975671328160033 +-2.28150215156263458383 +-2.28149451322842011791 +-2.28148684172488103172 +-2.28147913706624994035 +-2.28147139926675501798 +-2.28146362834061688929 +-2.28145582430205084989 +-2.28144798716526553406 +-2.28144011694446291472 +-2.28143221365383874755 +-2.28142427730758257098 +-2.28141630791987681803 +-2.28140830550490036899 +-2.28140027007682100191 +-2.28139220164980427441 +-2.28138410023800819459 +-2.28137596585558233286 +-2.28136779851667315100 +-2.28135959823542000535 +-2.28135136502595470276 +-2.28134309890240194463 +-2.28133479987888332374 +-2.28132646796951199519 +-2.28131810318839489682 +-2.28130970554963186103 +-2.28130127506731827935 +-2.28129281175554199379 +-2.28128431562838507318 +-2.28127578669992381322 +-2.28126722498422607188 +-2.28125863049535526628 +-2.28125000324736859625 +-2.28124134325431482395 +-2.28123265053024049109 +-2.28122392508918148124 +-2.28121516694516923707 +-2.28120637611223076036 +-2.28119755260438195066 +-2.28118869643563870753 +-2.28117980762000449602 +-2.28117088617148056073 +-2.28116193210406192904 +-2.28115294543173341424 +-2.28114392616847894146 +-2.28113487432827133361 +-2.28112578992507941678 +-2.28111667297286668799 +-2.28110752348558865066 +-2.28109834147719592323 +-2.28108912696163024236 +-2.28107987995283201244 +-2.28107060046472964743 +-2.28106128851124889678 +-2.28105194410630884860 +-2.28104256726382104148 +-2.28103315799769212902 +-2.28102371632182121530 +-2.28101424225010340763 +-2.28100473579642448740 +-2.28099519697466712742 +-2.28098562579870467459 +-2.28097602228240647904 +-2.28096638643963567361 +-2.28095671828424695349 +-2.28094701783009234930 +-2.28093728509101367763 +-2.28092752008084920234 +-2.28091772281343141415 +-2.28090789330258347789 +-2.28089803156212544977 +-2.28088813760586939239 +-2.28087821144762292747 +-2.28086825310118568311 +-2.28085826258035151426 +-2.28084823989890761453 +-2.28083818507063806891 +-2.28082809810931497196 +-2.28081797902871041828 +-2.28080782784258673246 +-2.28079764456470002187 +-2.28078742920880195300 +-2.28077718178863575460 +-2.28076690231794110275 +-2.28075659081044923582 +-2.28074624727988695128 +-2.28073587173997394117 +-2.28072546420442279214 +-2.28071502468694209398 +-2.28070455320123288701 +-2.28069404976098955018 +-2.28068351437990157748 +-2.28067294707165135748 +-2.28066234784991683782 +-2.28065171672836619621 +-2.28064105372066627808 +-2.28063035884047282664 +-2.28061963210143892056 +-2.28060887351721142124 +-2.28059808310142786425 +-2.28058726086772356467 +-2.28057640682972495583 +-2.28056552100105358605 +-2.28055460339532434233 +-2.28054365402614678260 +-2.28053267290712247117 +-2.28052166005184941966 +-2.28051061547391809015 +-2.28049953918691228338 +-2.28048843120441047105 +-2.28047729153998490759 +-2.28046612020720207425 +-2.28045491721962045872 +-2.28044368259079632821 +-2.28043241633427573589 +-2.28042111846359940586 +-2.28040978899230450949 +-2.28039842793391978049 +-2.28038703530196862346 +-2.28037561110996822578 +-2.28036415537142911347 +-2.28035266809985737169 +-2.28034114930875020377 +-2.28032959901160214855 +-2.28031801722189797488 +-2.28030640395312023117 +-2.28029475921874125177 +-2.28028308303223115061 +-2.28027137540705160390 +-2.28025963635665895879 +-2.28024786589450378926 +-2.28023606403402867571 +-2.28022423078867308988 +-2.28021236617186895401 +-2.28020047019704019675 +-2.28018854287760852628 +-2.28017658422698632492 +-2.28016459425858286636 +-2.28015257298579809841 +-2.28014052042202886028 +-2.28012843658066266528 +-2.28011632147508525037 +-2.28010417511867258256 +-2.28009199752479485568 +-2.28007978870682004313 +-2.28006754867810501608 +-2.28005527745200309298 +-2.28004297504186315138 +-2.28003064146102429888 +-2.28001827672282209036 +-2.28000588084058586347 +-2.27999345382763829448 +-2.27998099569729539837 +-2.27996850646286919329 +-2.27995598613766414786 +-2.27994343473497851349 +-2.27993085226810610067 +-2.27991823875033228219 +-2.27990559419493976634 +-2.27989291861520060323 +-2.27988021202438551072 +-2.27986747443575632488 +-2.27985470586256866454 +-2.27984190631807592808 +-2.27982907581551996756 +-2.27981621436813997050 +-2.27980332198916979536 +-2.27979039869183530698 +-2.27977744448935659705 +-2.27976445939494887227 +-2.27975144342182067803 +-2.27973839658317434242 +-2.27972531889220686452 +-2.27971221036210724975 +-2.27969907100606317130 +-2.27968590083725075601 +-2.27967269986884346622 +-2.27965946811400765881 +-2.27964620558590436161 +-2.27963291229768749702 +-2.27961958826250787880 +-2.27960623349350566258 +-2.27959284800381967173 +-2.27957943180657940374 +-2.27956598491490991520 +-2.27955250734192960138 +-2.27953899910075330482 +-2.27952546020448609809 +-2.27951189066622950108 +-2.27949829049907881640 +-2.27948465971612268532 +-2.27947099833044486417 +-2.27945730635512155970 +-2.27944358380322453783 +-2.27942983068781934719 +-2.27941604702196443100 +-2.27940223281871334748 +-2.27938838809111432582 +-2.27937451285220848973 +-2.27936060711503163390 +-2.27934667089261155937 +-2.27933270419797473494 +-2.27931870704413652717 +-2.27930467944411052628 +-2.27929062141090144067 +-2.27927653295750864970 +-2.27926241409692842410 +-2.27924826484214726463 +-2.27923408520614767525 +-2.27921987520190549859 +-2.27920563484239080410 +-2.27919136414057010853 +-2.27917706310939971459 +-2.27916273176183326044 +-2.27914837011081727880 +-2.27913397816929208517 +-2.27911955595019355414 +-2.27910510346644956670 +-2.27909062073098445111 +-2.27907610775671365388 +-2.27906156455654995696 +-2.27904699114339814869 +-2.27903238753015857654 +-2.27901775372972315026 +-2.27900308975498155917 +-2.27898839561881461080 +-2.27897367133409778361 +-2.27895891691370211518 +-2.27894413237049020537 +-2.27892931771732243362 +-2.27891447296705029757 +-2.27889959813252085397 +-2.27888469322657361005 +-2.27886975826204407625 +-2.27885479325176154575 +-2.27883979820854865039 +-2.27882477314522180478 +-2.27880971807459431488 +-2.27879463300947016080 +-2.27877951796265021400 +-2.27876437294692602009 +-2.27874919797508779240 +-2.27873399305991641839 +-2.27871875821418790053 +-2.27870349345067380042 +-2.27868819878213813013 +-2.27867287422133824037 +-2.27865751978102881736 +-2.27864213547395610959 +-2.27862672131286014832 +-2.27861127731047830025 +-2.27859580347953860624 +-2.27858029983276466623 +-2.27856476638287563929 +-2.27854920314258180269 +-2.27853361012458988100 +-2.27851798734160038151 +-2.27850233480630759431 +-2.27848665253140092446 +-2.27847094052956178345 +-2.27845519881346847413 +-2.27843942739579219392 +-2.27842362628919747891 +-2.27840779550634353612 +-2.27839193505988601984 +-2.27837604496247081443 +-2.27836012522674113967 +-2.27834417586533310995 +-2.27832819689087795467 +-2.27831218831599935370 +-2.27829615015331699013 +-2.27828008241544299750 +-2.27826398511498595667 +-2.27824785826454689897 +-2.27823170187672063847 +-2.27821551596409888063 +-2.27819930053926489322 +-2.27818305561479705901 +-2.27816678120326754353 +-2.27815047731724362734 +-2.27813414396928681782 +-2.27811778117195196103 +-2.27810138893778812985 +-2.27808496727933906811 +-2.27806851620914407874 +-2.27805203573973358289 +-2.27803552588363444897 +-2.27801898665336732819 +-2.27800241806144754264 +-2.27798582012038375311 +-2.27796919284267973538 +-2.27795253624083215982 +-2.27793585032733369999 +-2.27791913511466992404 +-2.27790239061532151510 +-2.27788561684176160682 +-2.27786881380646155648 +-2.27785198152188250731 +-2.27783512000048249391 +-2.27781822925471288954 +-2.27780130929701973841 +-2.27778436013984109110 +-2.27776738179561499820 +-2.27775037427676574353 +-2.27773333759571983137 +-2.27771627176489310784 +-2.27769917679669609001 +-2.27768205270353574221 +-2.27766489949781059110 +-2.27764771719191605470 +-2.27763050579824000152 +-2.27761326532916452692 +-2.27759599579706861761 +-2.27757869721432149035 +-2.27756136959329058556 +-2.27754401294633312958 +-2.27752662728580590468 +-2.27750921262405636725 +-2.27749176897342708870 +-2.27747429634625531136 +-2.27745679475487161625 +-2.27743926421160169937 +-2.27742170472876725995 +-2.27740411631868022724 +-2.27738649899364986595 +-2.27736885276597966765 +-2.27735117764796601847 +-2.27733347365189997547 +-2.27731574079006859890 +-2.27729797907475051133 +-2.27728018851822033852 +-2.27726236913274737717 +-2.27724452093059426261 +-2.27722664392401741296 +-2.27720873812526924951 +-2.27719080354659597631 +-2.27717284020023669200 +-2.27715484809842694247 +-2.27713682725339561230 +-2.27711877767736492473 +-2.27710069938255310618 +-2.27708259238117216583 +-2.27706445668542789562 +-2.27704629230752120250 +-2.27702809925964633209 +-2.27700987755399353318 +-2.27699162720274461691 +-2.27697334821807961802 +-2.27695504061216880132 +-2.27693670439717932297 +-2.27691833958527301007 +-2.27689994618860369613 +-2.27688152421932255010 +-2.27686307368957230324 +-2.27684459461149169002 +-2.27682608699721278356 +-2.27680755085886410427 +-2.27678898620856529078 +-2.27677039305843287309 +-2.27675177142057716395 +-2.27673312130710181478 +-2.27671444273010692427 +-2.27669573570168459753 +-2.27667700023392205466 +-2.27665823633890296307 +-2.27663944402870166428 +-2.27662062331539072346 +-2.27660177421103293582 +-2.27658289672768932022 +-2.27656399087741423415 +-2.27654505667225448562 +-2.27652609412425288582 +-2.27650710324544647278 +-2.27648808404786784365 +-2.27646903654354071378 +-2.27644996074448613399 +-2.27643085666271893786 +-2.27641172431024685352 +-2.27639256369907494459 +-2.27637337484119983699 +-2.27635415774861327165 +-2.27633491243330210452 +-2.27631563890724830657 +-2.27629633718242496698 +-2.27627700727080384269 +-2.27625764918434825290 +-2.27623826293501574369 +-2.27621884853476164068 +-2.27619940599553016725 +-2.27617993532926643496 +-2.27616043654790312090 +-2.27614090966337334621 +-2.27612135468760179435 +-2.27610177163250648746 +-2.27608216051000278313 +-2.27606252133199804533 +-2.27604285411039564124 +-2.27602315885709183263 +-2.27600343558397888444 +-2.27598368430294284437 +-2.27596390502586265470 +-2.27594409776461548134 +-2.27592426253106872025 +-2.27590439933708710285 +-2.27588450819452869922 +-2.27586458911524580628 +-2.27584464211108494780 +-2.27582466719388865073 +-2.27580466437549189251 +-2.27578463366772609788 +-2.27576457508241514205 +-2.27574448863137890342 +-2.27572437432643015498 +-2.27570423217937811700 +-2.27568406220202534840 +-2.27566386440616819087 +-2.27564363880359898928 +-2.27562338540610253901 +-2.27560310422546141496 +-2.27558279527344886617 +-2.27556245856183503307 +-2.27554209410238295064 +-2.27552170190685165707 +-2.27550128198699308513 +-2.27548083435455605894 +-2.27546035902128140904 +-2.27543985599890552507 +-2.27541932529915902350 +-2.27539876693376630357 +-2.27537818091444821178 +-2.27535756725291804514 +-2.27533692596088554794 +-2.27531625705005291493 +-2.27529556053211790001 +-2.27527483641877292797 +-2.27525408472170465046 +-2.27523330545259261370 +-2.27521249862311369938 +-2.27519166424493857193 +-2.27517080232972990217 +-2.27514991288914858458 +-2.27512899593484796412 +-2.27510805147847516849 +-2.27508707953167288451 +-2.27506608010607758175 +-2.27504505321332350931 +-2.27502399886503337001 +-2.27500291707283031073 +-2.27498180784832726431 +-2.27496067120313583132 +-2.27493950714885917463 +-2.27491831569709601624 +-2.27489709685943930495 +-2.27487585064747666053 +-2.27485457707279081774 +-2.27483327614695873820 +-2.27481194788155027808 +-2.27479059228813218496 +-2.27476920937826498914 +-2.27474779916350255959 +-2.27472636165539565667 +-2.27470489686548749120 +-2.27468340480531550085 +-2.27466188548641401468 +-2.27464033892030981221 +-2.27461876511852434390 +-2.27459716409257595160 +-2.27457553585397453944 +-2.27455388041422557066 +-2.27453219778483006763 +-2.27451048797728150319 +-2.27448875100307112973 +-2.27446698687368131786 +-2.27444519560058955321 +-2.27442337719527110096 +-2.27440153166919190042 +-2.27437965903381522637 +-2.27435775930059680405 +-2.27433583248098747376 +-2.27431387858643319078 +-2.27429189762837546951 +-2.27426988961824738666 +-2.27424785456747935442 +-2.27422579248749556768 +-2.27420370338971311597 +-2.27418158728554731240 +-2.27415944418640414426 +-2.27413727410368737836 +-2.27411507704879101155 +-2.27409285303310992887 +-2.27407060206802880131 +-2.27404832416492652669 +-2.27402601933518111466 +-2.27400368759016036080 +-2.27398132894122984027 +-2.27395894339974757870 +-2.27393653097706627264 +-2.27391409168453639822 +-2.27389162553349866158 +-2.27386913253529110435 +-2.27384661270124555088 +-2.27382406604268805239 +-2.27380149257093977511 +-2.27377889229731611209 +-2.27375626523312934779 +-2.27373361138968155259 +-2.27371093077827390871 +-2.27368822341019916067 +-2.27366548929674738844 +-2.27364272844920067840 +-2.27361994087883756421 +-2.27359712659693080639 +-2.27357428561474650408 +-2.27355141794354809193 +-2.27352852359458879050 +-2.27350560257912270856 +-2.27348265490839507308 +-2.27345968059364400560 +-2.27343667964610629539 +-2.27341365207700940587 +-2.27339059789757946817 +-2.27336751711903417572 +-2.27334440975258722517 +-2.27332127580944609591 +-2.27329811530081205007 +-2.27327492823788546161 +-2.27325171463185604637 +-2.27322847449390996744 +-2.27320520783522894703 +-2.27318191466698982239 +-2.27315859500036054897 +-2.27313524884650863811 +-2.27311187621659138713 +-2.27308847712176476108 +-2.27306505157317717547 +-2.27304159958197260494 +-2.27301812115928836278 +-2.27299461631625776548 +-2.27297108506400880046 +-2.27294752741366279380 +-2.27292394337633840706 +-2.27290033296314453182 +-2.27287669618518828329 +-2.27285303305357189174 +-2.27282934357938914971 +-2.27280562777373118521 +-2.27278188564768202085 +-2.27275811721232168239 +-2.27273432247872309020 +-2.27271050145795694419 +-2.27268665416108550659 +-2.27266278059916748688 +-2.27263888078325493325 +-2.27261495472439589705 +-2.27259100243363265648 +-2.27256702392200082841 +-2.27254301920053380925 +-2.27251898828025611365 +-2.27249493117218914762 +-2.27247084788734943217 +-2.27244673843674593883 +-2.27242260283138408639 +-2.27239844108226352049 +-2.27237425320037811360 +-2.27235003919671685324 +-2.27232579908226428600 +-2.27230153286799740897 +-2.27227724056489055471 +-2.27225292218391095034 +-2.27222857773602049392 +-2.27220420723217708669 +-2.27217981068333285677 +-2.27215538810043193862 +-2.27213093949441935493 +-2.27210646487622813794 +-2.27208196425679087582 +-2.27205743764703038678 +-2.27203288505786948903 +-2.27200830650022167490 +-2.27198370198499599582 +-2.27195907152309661825 +-2.27193441512542460003 +-2.27190973280287122904 +-2.27188502456632512860 +-2.27186029042667048117 +-2.27183553039478391966 +-2.27181074448153896839 +-2.27178593269780160213 +-2.27176109505443513115 +-2.27173623156229442799 +-2.27171134223223347703 +-2.27168642707509649270 +-2.27166148610172413669 +-2.27163651932295307390 +-2.27161152674961330789 +-2.27158650839252995723 +-2.27156146426252236736 +-2.27153639437040544280 +-2.27151129872698787082 +-2.27148617734307434191 +-2.27146103022946288519 +-2.27143585739694797709 +-2.27141065885631832089 +-2.27138543461835462622 +-2.27136018469383582641 +-2.27133490909353508158 +-2.27130960782821844646 +-2.27128428090864797895 +-2.27125892834558218425 +-2.27123355014977024169 +-2.27120814633195955423 +-2.27118271690289086351 +-2.27115726187329958208 +-2.27113178125391668161 +-2.27110627505546736060 +-2.27108074328867193259 +-2.27105518596424404976 +-2.27102960309289514385 +-2.27100399468532732072 +-2.27097836075224090990 +-2.27095270130433002365 +-2.27092701635228211288 +-2.27090130590678240807 +-2.27087556997850725793 +-2.27084980857812990251 +-2.27082402171631914101 +-2.27079820940373711124 +-2.27077237165104062200 +-2.27074650846888204114 +-2.27072061986790707522 +-2.27069470585875921032 +-2.27066876645207305074 +-2.27064280165848186854 +-2.27061681148860960988 +-2.27059079595307888866 +-2.27056475506250343699 +-2.27053868882749387836 +-2.27051259725865728356 +-2.27048648036659139748 +-2.27046033816189174459 +-2.27043417065514763209 +-2.27040797785694348221 +-2.27038175977785883219 +-2.27035551642846744613 +-2.27032924781933731495 +-2.27030295396103287686 +-2.27027663486411190874 +-2.27025029053912730248 +-2.27022392099662750908 +-2.27019752624715565048 +-2.27017110630124907544 +-2.27014466116943935958 +-2.27011819086225408171 +-2.27009169539021593565 +-2.27006517476384050980 +-2.27003862899364028394 +-2.27001205809012152059 +-2.26998546206378515322 +-2.26995884092512767438 +-2.26993219468463980348 +-2.26990552335280737495 +-2.26987882694011133822 +-2.26985210545702642548 +-2.26982535891402292805 +-2.26979858732156580814 +-2.26977179069011514301 +-2.26974496903012656901 +-2.26971812235204772890 +-2.26969125066632360088 +-2.26966435398339472229 +-2.26963743231369408093 +-2.26961048566765022372 +-2.26958351405568770076 +-2.26955651748822351266 +-2.26952949597567288365 +-2.26950244952844348845 +-2.26947537815693767271 +-2.26944828187155467347 +-2.26942116068268573414 +-2.26939401460071987771 +-2.26936684363603857761 +-2.26933964779901975461 +-2.26931242710003555629 +-2.26928518154945324525 +-2.26925791115763431094 +-2.26923061593493446964 +-2.26920329589170766127 +-2.26917595103829849990 +-2.26914858138504849094 +-2.26912118694229425486 +-2.26909376772036752712 +-2.26906632372959338184 +-2.26903885498029245227 +-2.26901136148278048665 +-2.26898384324736879236 +-2.26895630028436157133 +-2.26892873260405991687 +-2.26890114021675826095 +-2.26887352313274748283 +-2.26884588136231180044 +-2.26881821491573187899 +-2.26879052380328127825 +-2.26876280803522956120 +-2.26873506762184140584 +-2.26870730257337616109 +-2.26867951290008784682 +-2.26865169861222559788 +-2.26862385972003366419 +-2.26859599623375007837 +-2.26856810816360843219 +-2.26854019551983876468 +-2.26851225831266356536 +-2.26848429655230177104 +-2.26845631024896521311 +-2.26842829941286305839 +-2.26840026405419870059 +-2.26837220418316976023 +-2.26834411980996852876 +-2.26831601094478330083 +-2.26828787759779615385 +-2.26825971977918605660 +-2.26823153749912398425 +-2.26820333076777780335 +-2.26817509959531005137 +-2.26814684399187793673 +-2.26811856396763200650 +-2.26809025953272191956 +-2.26806193069728712075 +-2.26803357747146616674 +-2.26800519986539006467 +-2.26797679788918449262 +-2.26794837155297290820 +-2.26791992086686944319 +-2.26789144584098822932 +-2.26786294648543407249 +-2.26783442281030778176 +-2.26780587482570572533 +-2.26777730254172027458 +-2.26774870596843580728 +-2.26772008511593448077 +-2.26769143999429090286 +-2.26766277061357657274 +-2.26763407698385721645 +-2.26760535911519323093 +-2.26757661701764057227 +-2.26754785070124986746 +-2.26751906017606552624 +-2.26749024545212884973 +-2.26746140653947492183 +-2.26743254344813394141 +-2.26740365618813122239 +-2.26737474476948630553 +-2.26734580920221562295 +-2.26731684949632850135 +-2.26728786566182893836 +-2.26725885770871782299 +-2.26722982564698938290 +-2.26720076948663429306 +-2.26717168923763745525 +-2.26714258490997755402 +-2.26711345651362972120 +-2.26708430405856375955 +-2.26705512755474281050 +-2.26702592701212912729 +-2.26699670244067519320 +-2.26696745385033038289 +-2.26693818125103963013 +-2.26690888465274298369 +-2.26687956406537294285 +-2.26685021949886111869 +-2.26682085096312979644 +-2.26679145846809859677 +-2.26676204202368314355 +-2.26673260163979017889 +-2.26670313732632644488 +-2.26667364909318802546 +-2.26664413695027233686 +-2.26661460090746613716 +-2.26658504097465351990 +-2.26655545716171413773 +-2.26652584947852142605 +-2.26649621793494482347 +-2.26646656254084799542 +-2.26643688330608972237 +-2.26640718024052478796 +-2.26637745335400087043 +-2.26634770265636165121 +-2.26631792815744681491 +-2.26628812986708982891 +-2.26625830779512016377 +-2.26622846195136018466 +-2.26619859234562959216 +-2.26616869898774231373 +-2.26613878188750694775 +-2.26610884105472631944 +-2.26607887649920014539 +-2.26604888823072281312 +-2.26601887625908204882 +-2.26598884059406069369 +-2.26595878124543936849 +-2.26592869822299114446 +-2.26589859153648420786 +-2.26586846119568319224 +-2.26583830721034562572 +-2.26580812959022681596 +-2.26577792834507407704 +-2.26574770348463205849 +-2.26571745501863963668 +-2.26568718295682947073 +-2.26565688730893111114 +-2.26562656808466922342 +-2.26559622529376136768 +-2.26556585894592155128 +-2.26553546905085889662 +-2.26550505561827764112 +-2.26547461865787536084 +-2.26544415817934741142 +-2.26541367419238248715 +-2.26538316670666350916 +-2.26535263573187073405 +-2.26532208127767775707 +-2.26529150335375284442 +-2.26526090196976070956 +-2.26523027713536029282 +-2.26519962886020609361 +-2.26516895715394639410 +-2.26513826202622592376 +-2.26510754348668497116 +-2.26507680154495494307 +-2.26504603621066813446 +-2.26501524749344662624 +-2.26498443540291116705 +-2.26495359994867584419 +-2.26492274114034852772 +-2.26489185898753575543 +-2.26486095349983651559 +-2.26483002468684491149 +-2.26479907255815060552 +-2.26476809712333881919 +-2.26473709839198766858 +-2.26470607637367349341 +-2.26467503107796597206 +-2.26464396251442900976 +-2.26461287069262295901 +-2.26458175562210239917 +-2.26455061731241746870 +-2.26451945577311430924 +-2.26448827101373151294 +-2.26445706304380500740 +-2.26442583187286494706 +-2.26439457751043615730 +-2.26436329996603857850 +-2.26433199924918948653 +-2.26430067536939771955 +-2.26426932833616856300 +-2.26423795815900374961 +-2.26420656484739790670 +-2.26417514841084299704 +-2.26414370885882298978 +-2.26411224620082007775 +-2.26408076044630934831 +-2.26404925160476366841 +-2.26401771968564702320 +-2.26398616469842028920 +-2.26395458665254167840 +-2.26392298555746140920 +-2.26389136142262481499 +-2.26385971425747545283 +-2.26382804407144888614 +-2.26379635087397534932 +-2.26376463467448374445 +-2.26373289548239453595 +-2.26370113330712507960 +-2.26366934815808695802 +-2.26363754004468731296 +-2.26360570897632795706 +-2.26357385496240670619 +-2.26354197801231604714 +-2.26351007813544224945 +-2.26347815534116847402 +-2.26344620963887255272 +-2.26341424103792610012 +-2.26338224954769851038 +-2.26335023517755073996 +-2.26331819793684196895 +-2.26328613783492471612 +-2.26325405488114794750 +-2.26322194908485441189 +-2.26318982045538241721 +-2.26315766900206449819 +-2.26312549473423008095 +-2.26309329766120326255 +-2.26306107779230236687 +-2.26302883513684083283 +-2.26299656970412810253 +-2.26296428150346828900 +-2.26293197054416062031 +-2.26289963683549988360 +-2.26286728038677376063 +-2.26283490120726904493 +-2.26280249930626320420 +-2.26277007469303192977 +-2.26273762737684602797 +-2.26270515736697008791 +-2.26267266467266336960 +-2.26264014930318158036 +-2.26260761126777465435 +-2.26257505057568941709 +-2.26254246723616514458 +-2.26250986125843889241 +-2.26247723265173972251 +-2.26244458142529536460 +-2.26241190758832555474 +-2.26237921115004692041 +-2.26234649211967164817 +-2.26231375050640570734 +-2.26228098631945062635 +-2.26224819956800393683 +-2.26221539026125562089 +-2.26218255840839477244 +-2.26214970401860249183 +-2.26211682710105721483 +-2.26208392766492982773 +-2.26205100571938855225 +-2.26201806127359672516 +-2.26198509433671191005 +-2.26195210491788678553 +-2.26191909302626958933 +-2.26188605867100456237 +-2.26185300186122884014 +-2.26181992260607644951 +-2.26178682091467697646 +-2.26175369679615378971 +-2.26172055025962537300 +-2.26168738131420576920 +-2.26165418996900635662 +-2.26162097623313007588 +-2.26158774011567631490 +-2.26155448162574135296 +-2.26152120077241258755 +-2.26148789756477830437 +-2.26145457201191701913 +-2.26142122412290502709 +-2.26138785390681151810 +-2.26135446137270390565 +-2.26132104652964205371 +-2.26128760938668316172 +-2.26125414995287776776 +-2.26122066823727196905 +-2.26118716424890919825 +-2.26115363799682356216 +-2.26112008949004872349 +-2.26108651873761168360 +-2.26105292574853500298 +-2.26101931053183458076 +-2.26098567309652498381 +-2.26095201345161411766 +-2.26091833160610278242 +-2.26088462756899133410 +-2.26085090134927213512 +-2.26081715295593399517 +-2.26078338239796083897 +-2.26074958968433126216 +-2.26071577482401897541 +-2.26068193782599413666 +-2.26064807869922068662 +-2.26061419745265856918 +-2.26058029409526239917 +-2.26054636863598190644 +-2.26051242108376282403 +-2.26047845144754555591 +-2.26044445973626562107 +-2.26041044595885320945 +-2.26037641012423495823 +-2.26034235224133128739 +-2.26030827231905995234 +-2.26027417036633115899 +-2.26024004639205289280 +-2.26020590040512603380 +-2.26017173241444746523 +-2.26013754242891140578 +-2.26010333045740274827 +-2.26006909650880682960 +-2.26003484059200099310 +-2.26000056271585725298 +-2.25996626288924407078 +-2.25993194112102591120 +-2.25989759742006146581 +-2.25986323179520498527 +-2.25982884425530494710 +-2.25979443480920627607 +-2.25976000346574856792 +-2.25972555023376564520 +-2.25969107512208911004 +-2.25965657813954345912 +-2.25962205929494919232 +-2.25958751859712192456 +-2.25955295605487371802 +-2.25951837167700864129 +-2.25948376547232987477 +-2.25944913744963349345 +-2.25941448761771113141 +-2.25937981598534953775 +-2.25934512256133146479 +-2.25931040735443433576 +-2.25927567037343068890 +-2.25924091162708817748 +-2.25920613112417001389 +-2.25917132887343585779 +-2.25913650488363781932 +-2.25910165916352490001 +-2.25906679172184254867 +-2.25903190256732866459 +-2.25899699170871848253 +-2.25896205915474146408 +-2.25892710491412307405 +-2.25889212899558300407 +-2.25885713140783650488 +-2.25882211215959527451 +-2.25878707125956523782 +-2.25875200871644654654 +-2.25871692453893713193 +-2.25868181873572693164 +-2.25864669131550499515 +-2.25861154228695193424 +-2.25857637165874614027 +-2.25854117943955889913 +-2.25850596563805927630 +-2.25847073026291145226 +-2.25843547332277205797 +-2.25840019482629550396 +-2.25836489478213042759 +-2.25832957319892191350 +-2.25829423008530838501 +-2.25825886544992560090 +-2.25822347930140221450 +-2.25818807164836465873 +-2.25815264249943270514 +-2.25811719186322168440 +-2.25808171974834470674 +-2.25804622616340555652 +-2.25801071111700668581 +-2.25797517461774521763 +-2.25793961667421294592 +-2.25790403729499677965 +-2.25786843648868051915 +-2.25783281426384085933 +-2.25779717062905138647 +-2.25776150559288080188 +-2.25772581916389158962 +-2.25769011135064401330 +-2.25765438216169167518 +-2.25761863160558373664 +-2.25758285969086625045 +-2.25754706642607771983 +-2.25751125181975398348 +-2.25747541588042555105 +-2.25743955861661849127 +-2.25740368003685398790 +-2.25736778014964922789 +-2.25733185896351384869 +-2.25729591648695748773 +-2.25725995272848001250 +-2.25722396769657951410 +-2.25718796139975008685 +-2.25715193384647916375 +-2.25711588504524884868 +-2.25707981500453991330 +-2.25704372373282557973 +-2.25700761123857462920 +-2.25697147753025229022 +-2.25693532261631757407 +-2.25689914650522682749 +-2.25686294920542884768 +-2.25682673072537198777 +-2.25679049107349438685 +-2.25675423025823507217 +-2.25671794828802241284 +-2.25668164517128655433 +-2.25664532091644831624 +-2.25660897553192496545 +-2.25657260902612932796 +-2.25653622140747023295 +-2.25649981268435118054 +-2.25646338286516945359 +-2.25642693195832144681 +-2.25639045997219422901 +-2.25635396691517353673 +-2.25631745279563977746 +-2.25628091762196802961 +-2.25624436140252759841 +-2.25620778414568645687 +-2.25617118585980414025 +-2.25613456655323751932 +-2.25609792623433857983 +-2.25606126491145575486 +-2.25602458259292948384 +-2.25598787928709842987 +-2.25595115500229548289 +-2.25591440974684953602 +-2.25587764352908415333 +-2.25584085635731845798 +-2.25580404823986624407 +-2.25576721918503819708 +-2.25573036920113834114 +-2.25569349829646847994 +-2.25565660647932242355 +-2.25561969375799220572 +-2.25558276014076408700 +-2.25554580563592033116 +-2.25550883025173654062 +-2.25547183399648698554 +-2.25543481687843705430 +-2.25539777890585124709 +-2.25536072008698740277 +-2.25532364043009980747 +-2.25528653994343653011 +-2.25524941863524208685 +-2.25521227651375610890 +-2.25517511358721467474 +-2.25513792986384720152 +-2.25510072535187910958 +-2.25506350005953137838 +-2.25502625399502187875 +-2.25498898716656004382 +-2.25495169958235486263 +-2.25491439125060821880 +-2.25487706217951711096 +-2.25483971237727542913 +-2.25480234185207129016 +-2.25476495061208837001 +-2.25472753866550545965 +-2.25469010602049824143 +-2.25465265268523484821 +-2.25461517866788208053 +-2.25457768397659963355 +-2.25454016861954409379 +-2.25450263260486538641 +-2.25446507594071121616 +-2.25442749863522395870 +-2.25438990069653932835 +-2.25435228213279170717 +-2.25431464295210659543 +-2.25427698316261126976 +-2.25423930277242101639 +-2.25420160178965156561 +-2.25416388022241243050 +-2.25412613807880735095 +-2.25408837536693829051 +-2.25405059209489921912 +-2.25401278827078099809 +-2.25397496390267182420 +-2.25393711899865190063 +-2.25389925356679832191 +-2.25386136761518374172 +-2.25382346115187592872 +-2.25378553418493821070 +-2.25374758672242947455 +-2.25370961877240194582 +-2.25367163034290607371 +-2.25363362144198786652 +-2.25359559207768489486 +-2.25355754225803428525 +-2.25351947199106650288 +-2.25348138128480623976 +-2.25344327014727685565 +-2.25340513858649504897 +-2.25336698661047263315 +-2.25332881422721786890 +-2.25329062144473279972 +-2.25325240827101724861 +-2.25321417471406393318 +-2.25317592078186246241 +-2.25313764648239711619 +-2.25309935182364862172 +-2.25306103681359193303 +-2.25302270146019933961 +-2.25298434577143380508 +-2.25294596975526006943 +-2.25290757341963310267 +-2.25286915677250654255 +-2.25283071982182736548 +-2.25279226257553855106 +-2.25275378504157997028 +-2.25271528722788438870 +-2.25267676914238101915 +-2.25263823079299552177 +-2.25259967218764822761 +-2.25256109333425325048 +-2.25252249424072248374 +-2.25248387491496249169 +-2.25244523536487362136 +-2.25240657559835577572 +-2.25236789562329908776 +-2.25232919544759280228 +-2.25229047507911905868 +-2.25225173452575866406 +-2.25221297379538398786 +-2.25217419289586473496 +-2.25213539183506705754 +-2.25209657062085089052 +-2.25205772926107217202 +-2.25201886776358106701 +-2.25197998613622640818 +-2.25194108438684814644 +-2.25190216252328623270 +-2.25186322055337084791 +-2.25182425848493217302 +-2.25178527632579328355 +-2.25174627408377414639 +-2.25170725176668806711 +-2.25166820938234524263 +-2.25162914693855320536 +-2.25159006444311016182 +-2.25155096190381431853 +-2.25151183932845677660 +-2.25147269672482375213 +-2.25143353410069968490 +-2.25139435146386102105 +-2.25135514882208154219 +-2.25131592618313058907 +-2.25127668355477217332 +-2.25123742094476675391 +-2.25119813836086768433 +-2.25115883581082698583 +-2.25111951330239135061 +-2.25108017084330036539 +-2.25104080844129272876 +-2.25100142610409958976 +-2.25096202383944943293 +-2.25092260165506452552 +-2.25088315955866447027 +-2.25084369755796309676 +-2.25080421566067068184 +-2.25076471387449039696 +-2.25072519220712408128 +-2.25068565066626735671 +-2.25064608925961184838 +-2.25060650799484340823 +-2.25056690687964477959 +-2.25052728592169382082 +-2.25048764512866350529 +-2.25044798450822236546 +-2.25040830406803449293 +-2.25036860381575909429 +-2.25032888375905137934 +-2.25028914390556167291 +-2.25024938426293541482 +-2.25020960483881449221 +-2.25016980564083546312 +-2.25012998667662955654 +-2.25009014795382533691 +-2.25005028948004648370 +-2.25001041126291045913 +-2.24997051331003161678 +-2.24993059562901942527 +-2.24989065822747935641 +-2.24985070111301155293 +-2.24981072429321082851 +-2.24977072777567066453 +-2.24973071156797566061 +-2.24969067567770864002 +-2.24965062011244842921 +-2.24961054487976763738 +-2.24957044998723398876 +-2.24953033544241343122 +-2.24949020125286436311 +-2.24945004742614207416 +-2.24940987396979652502 +-2.24936968089137456772 +-2.24932946819841772523 +-2.24928923589846263553 +-2.24924898399904238389 +-2.24920871250768383831 +-2.24916842143191075820 +-2.24912811077924157388 +-2.24908778055719205113 +-2.24904743077327129441 +-2.24900706143498441136 +-2.24896667254983251283 +-2.24892626412531138058 +-2.24888583616891279959 +-2.24884538868812544621 +-2.24880492169043000317 +-2.24876443518330582094 +-2.24872392917422603276 +-2.24868340367066110730 +-2.24864285868007440783 +-2.24860229420992618898 +-2.24856171026767359677 +-2.24852110686076578361 +-2.24848048399665012553 +-2.24843984168276822544 +-2.24839917992655990986 +-2.24835849873545612354 +-2.24831779811688603488 +-2.24827707807827437136 +-2.24823633862704008735 +-2.24819557977059858445 +-2.24815480151635904704 +-2.24811400387172977133 +-2.24807318684411194809 +-2.24803235044090232719 +-2.24799149466949277354 +-2.24795061953727159931 +-2.24790972505162400807 +-2.24786881121992720978 +-2.24782787804955619393 +-2.24778692554788328550 +-2.24774595372227015133 +-2.24770496258008156687 +-2.24766395212867298170 +-2.24762292237539540452 +-2.24758187332759762356 +-2.24754080499262309800 +-2.24749971737781040204 +-2.24745861049049233671 +-2.24741748433800081486 +-2.24737633892765886756 +-2.24733517426678952589 +-2.24729399036270782730 +-2.24725278722272570064 +-2.24721156485414930160 +-2.24717032326428434175 +-2.24712906246042631864 +-2.24708778244987028572 +-2.24704648323990552328 +-2.24700516483781775889 +-2.24696382725088605881 +-2.24692247048638726881 +-2.24688109455159246153 +-2.24683969945376871280 +-2.24679828520017910165 +-2.24675685179808048986 +-2.24671539925472796284 +-2.24667392757736950060 +-2.24663243677324953040 +-2.24659092684960937092 +-2.24654939781368501173 +-2.24650784967270578107 +-2.24646628243390056312 +-2.24642469610448980433 +-2.24638309069169306298 +-2.24634146620272234784 +-2.24629982264478700316 +-2.24625816002509237634 +-2.24621647835083670941 +-2.24617477762921780027 +-2.24613305786742412096 +-2.24609131907264414352 +-2.24604956125206056683 +-2.24600778441284898435 +-2.24596598856218365725 +-2.24592417370723307357 +-2.24588233985516305680 +-2.24584048701313143681 +-2.24579861518829515532 +-2.24575672438780449269 +-2.24571481461880528840 +-2.24567288588844116148 +-2.24563093820384818144 +-2.24558897157216152962 +-2.24554698600050750557 +-2.24550498149601196474 +-2.24546295806579454535 +-2.24542091571697044472 +-2.24537885445664997519 +-2.24533677429194034048 +-2.24529467522994385931 +-2.24525255727775752135 +-2.24521042044247431946 +-2.24516826473118324969 +-2.24512609015096931131 +-2.24508389670891128631 +-2.24504168441208529217 +-2.24499945326756167319 +-2.24495720328240810915 +-2.24491493446368428621 +-2.24487264681845077874 +-2.24483034035375883519 +-2.24478801507665881587 +-2.24474567099419308747 +-2.24470330811340312849 +-2.24466092644132375611 +-2.24461852598498623479 +-2.24457610675141738810 +-2.24453366874763871053 +-2.24449121198066903204 +-2.24444873645752052127 +-2.24440624218520357047 +-2.24436372917072057831 +-2.24432119742107349936 +-2.24427864694325718276 +-2.24423607774426292494 +-2.24419348983107802553 +-2.24415088321068401100 +-2.24410825789005885511 +-2.24406561387617742298 +-2.24402295117600791841 +-2.24398026979651410429 +-2.24393756974465752307 +-2.24389485102739438815 +-2.24385211365167513975 +-2.24380935762444666537 +-2.24376658295265141163 +-2.24372378964322960471 +-2.24368097770311303307 +-2.24363814713923215294 +-2.24359529795851120326 +-2.24355243016787087029 +-2.24350954377422784347 +-2.24346663878449348317 +-2.24342371520557470888 +-2.24338077304437577553 +-2.24333781230779338856 +-2.24329483300272292112 +-2.24325183513605397323 +-2.24320881871467125990 +-2.24316578374545683161 +-2.24312273023528563343 +-2.24307965819103083405 +-2.24303656761956071719 +-2.24299345852773646115 +-2.24295033092241924422 +-2.24290718481046180699 +-2.24286402019871555780 +-2.24282083709402568772 +-2.24277763550323339103 +-2.24273441543317630931 +-2.24269117689068542276 +-2.24264791988259037936 +-2.24260464441571460981 +-2.24256135049687710392 +-2.24251803813289285472 +-2.24247470733057285841 +-2.24243135809672278214 +-2.24238799043814429623 +-2.24234460436163596242 +-2.24230119987398923698 +-2.24225777698199468801 +-2.24221433569243400186 +-2.24217087601208930892 +-2.24212739794773474600 +-2.24208390150614222947 +-2.24204038669407834661 +-2.24199685351830435565 +-2.24195330198558018253 +-2.24190973210265731552 +-2.24186614387628679879 +-2.24182253731321168289 +-2.24177891242017457429 +-2.24173526920390919770 +-2.24169160767114927779 +-2.24164792782862054565 +-2.24160422968304651192 +-2.24156051324114669043 +-2.24151677850963348959 +-2.24147302549521842963 +-2.24142925420460548125 +-2.24138546464449728290 +-2.24134165682158847943 +-2.24129783074257415976 +-2.24125398641414008694 +-2.24121012384297069175 +-2.24116624303574596411 +-2.24112234399913923255 +-2.24107842673982116111 +-2.24103449126445974926 +-2.24099053757971455880 +-2.24094656569224381926 +-2.24090257560870176334 +-2.24085856733573640653 +-2.24081454087999087932 +-2.24077049624810609174 +-2.24072643344671806886 +-2.24068235248245795077 +-2.24063825336195243665 +-2.24059413609182378480 +-2.24055000067869070079 +-2.24050584712916656116 +-2.24046167544986163378 +-2.24041748564737996929 +-2.24037327772832384198 +-2.24032905169928886480 +-2.24028480756686532160 +-2.24024054533764438446 +-2.24019626501820834363 +-2.24015196661513460441 +-2.24010765013499968390 +-2.24006331558437299378 +-2.24001896296982083712 +-2.23997459229790552016 +-2.23993020357518357599 +-2.23988579680820754092 +-2.23984137200352684260 +-2.23979692916768602373 +-2.23975246830722429792 +-2.23970798942867732606 +-2.23966349253857721635 +-2.23961897764345030382 +-2.23957444474981937077 +-2.23952989386420231455 +-2.23948532499311392385 +-2.23944073814306277015 +-2.23939613332055431627 +-2.23935151053209002825 +-2.23930686978416648714 +-2.23926221108327538900 +-2.23921753443590576538 +-2.23917283984853998646 +-2.23912812732765731383 +-2.23908339687973345633 +-2.23903864851123923785 +-2.23899388222864015319 +-2.23894909803839814444 +-2.23890429594697160098 +-2.23885947596081358313 +-2.23881463808637226620 +-2.23876978233009404917 +-2.23872490869841733740 +-2.23868001719777920400 +-2.23863510783461183706 +-2.23859018061534165156 +-2.23854523554639150973 +-2.23850027263418072110 +-2.23845529188512415431 +-2.23841029330563090483 +-2.23836527690210829178 +-2.23832024268095652886 +-2.23827519064857272113 +-2.23823012081135042095 +-2.23818503317567740751 +-2.23813992774793923957 +-2.23809480453451392634 +-2.23804966354177903298 +-2.23800450477610413103 +-2.23795932824385657156 +-2.23791413395140059706 +-2.23786892190509245637 +-2.23782369211128839837 +-2.23777844457633534603 +-2.23773317930658199870 +-2.23768789630836772986 +-2.23764259558802880434 +-2.23759727715189793429 +-2.23755194100630472320 +-2.23750658715757300143 +-2.23746121561202038208 +-2.23741582637596447825 +-2.23737041945571579760 +-2.23732499485757951874 +-2.23727955258785948800 +-2.23723409265285377856 +-2.23718861505885691088 +-2.23714311981215629999 +-2.23709760691903936092 +-2.23705207638578640328 +-2.23700652821867329578 +-2.23696096242397324261 +-2.23691537900795411886 +-2.23686977797688069103 +-2.23682415933701062016 +-2.23677852309460023505 +-2.23673286925590053542 +-2.23668719782715808009 +-2.23664150881461409881 +-2.23659580222450848908 +-2.23655007806307448703 +-2.23650433633654088794 +-2.23645857705113337843 +-2.23641280021307320425 +-2.23636700582857672615 +-2.23632119390385586399 +-2.23627536444511987312 +-2.23622951745857179162 +-2.23618365295041154894 +-2.23613777092683285730 +-2.23609187139402898481 +-2.23604595435818520599 +-2.23600001982548501900 +-2.23595406780210437248 +-2.23590809829422143551 +-2.23586211130800105451 +-2.23581610684961074043 +-2.23577008492521223104 +-2.23572404554096149099 +-2.23567798870301004399 +-2.23563191441750808153 +-2.23558582269059913372 +-2.23553971352842140163 +-2.23549358693711264223 +-2.23544744292280217479 +-2.23540128149161843041 +-2.23535510264968229066 +-2.23530890640311374895 +-2.23526269275802524916 +-2.23521646172052923518 +-2.23517021329672926910 +-2.23512394749272669259 +-2.23507766431461973866 +-2.23503136376850042311 +-2.23498504586045809717 +-2.23493871059657545075 +-2.23489235798293472968 +-2.23484598802560929798 +-2.23479960073067340787 +-2.23475319610419198568 +-2.23470677415222951367 +-2.23466033488084381275 +-2.23461387829609048339 +-2.23456740440401890879 +-2.23452091321067536356 +-2.23447440472210212548 +-2.23442787894433569917 +-2.23438133588341036884 +-2.23433477554535420140 +-2.23428819793619304335 +-2.23424160306194696801 +-2.23419499092863205192 +-2.23414836154226081888 +-2.23410171490884001955 +-2.23405505103437507231 +-2.23400836992486340193 +-2.23396167158630110094 +-2.23391495602467893278 +-2.23386822324598277589 +-2.23382147325619673239 +-2.23377470606129646669 +-2.23372792166725764318 +-2.23368112008005015312 +-2.23363430130563855869 +-2.23358746534998253708 +-2.23354061221904220957 +-2.23349374191876837159 +-2.23344685445510959809 +-2.23339994983401135542 +-2.23335302806141111631 +-2.23330608914324768577 +-2.23325913308545009883 +-2.23321215989394694645 +-2.23316516957466149051 +-2.23311816213351166382 +-2.23307113757641362284 +-2.23302409590927553040 +-2.23297703713800554937 +-2.23292996126850473715 +-2.23288286830667148664 +-2.23283575825839841755 +-2.23278863112957592918 +-2.23274148692608731537 +-2.23269432565381542588 +-2.23264714731863511687 +-2.23259995192641991224 +-2.23255273948303845089 +-2.23250550999435359856 +-2.23245826346622511238 +-2.23241099990450964086 +-2.23236371931505761523 +-2.23231642170371680223 +-2.23226910707632830722 +-2.23222177543873412375 +-2.23217442679676603134 +-2.23212706115625447723 +-2.23207967852302591183 +-2.23203227890290278879 +-2.23198486230170267675 +-2.23193742872523870346 +-2.23188997817931955581 +-2.23184251066975081201 +-2.23179502620233272125 +-2.23174752478286242408 +-2.23170000641713217604 +-2.23165247111093068000 +-2.23160491887004086564 +-2.23155734970024299813 +-2.23150976360731334580 +-2.23146216059702240386 +-2.23141454067513755888 +-2.23136690384742220061 +-2.23131925011963438976 +-2.23127157949752863431 +-2.23122389198685677769 +-2.23117618759336355794 +-2.23112846632279104853 +-2.23108072818087821432 +-2.23103297317335780292 +-2.23098520130595812105 +-2.23093741258440703135 +-2.23088960701442395873 +-2.23084178460172521952 +-2.23079394535202446548 +-2.23074608927103001932 +-2.23069821636444576285 +-2.23065032663797246926 +-2.23060242009730469448 +-2.23055449674813521810 +-2.23050655659615193471 +-2.23045859964703785394 +-2.23041062590647154451 +-2.23036263538012846652 +-2.23031462807367875101 +-2.23026660399279030855 +-2.23021856314312483249 +-2.23017050553033957527 +-2.23012243116009045707 +-2.23007434003802673672 +-2.23002623216979323217 +-2.22997810756103298502 +-2.22992996621738148733 +-2.22988180814447423117 +-2.22983363334793782684 +-2.22978544183339888463 +-2.22973723360647779757 +-2.22968900867278918554 +-2.22964076703794855661 +-2.22959250870756209295 +-2.22954423368723331222 +-2.22949594198256395572 +-2.22944763359914777112 +-2.22939930854257672976 +-2.22935096681843880617 +-2.22930260843231708989 +-2.22925423338978934140 +-2.22920584169643198891 +-2.22915743335781435519 +-2.22910900837950354259 +-2.22906056676706221253 +-2.22901210852604769741 +-2.22896363366201510914 +-2.22891514218051378649 +-2.22886663408708862733 +-2.22881810938728230909 +-2.22876956808663084786 +-2.22872101019066892746 +-2.22867243570492501448 +-2.22862384463492313458 +-2.22857523698618553709 +-2.22852661276422781000 +-2.22847797197456332086 +-2.22842931462269921994 +-2.22838064071414043710 +-2.22833195025438612902 +-2.22828324324893278785 +-2.22823451970327335303 +-2.22818577962289232630 +-2.22813702301327554167 +-2.22808824987990128363 +-2.22803946022824383988 +-2.22799065406377616583 +-2.22794183139196411148 +-2.22789299221826908592 +-2.22784413654815161010 +-2.22779526438706598768 +-2.22774637574046074917 +-2.22769747061378264874 +-2.22764854901247444374 +-2.22759961094197311837 +-2.22755065640771343638 +-2.22750168541512261200 +-2.22745269796962874764 +-2.22740369407665061985 +-2.22735467374160789333 +-2.22730563696991223921 +-2.22725658376697133178 +-2.22720751413819195719 +-2.22715842808897424021 +-2.22710932562471430884 +-2.22706020675080385018 +-2.22701107147263188679 +-2.22696191979558255625 +-2.22691275172503555524 +-2.22686356726636658365 +-2.22681436642494734457 +-2.22676514920614510018 +-2.22671591561532489223 +-2.22666666565784332477 +-2.22661739933905744593 +-2.22656811666431853070 +-2.22651881763897296906 +-2.22646950226836315423 +-2.22642017055782792667 +-2.22637082251270213007 +-2.22632145813831616721 +-2.22627207743999644407 +-2.22622268042306581393 +-2.22617326709284135688 +-2.22612383745463704443 +-2.22607439151376329534 +-2.22602492927552519930 +-2.22597545074522606967 +-2.22592595592816122618 +-2.22587644482962554449 +-2.22582691745490812707 +-2.22577737380929363553 +-2.22572781389806317875 +-2.22567823772649520109 +-2.22562864529986015327 +-2.22557903662342893014 +-2.22552941170246443292 +-2.22547977054222911875 +-2.22543011314797789524 +-2.22538043952496300548 +-2.22533074967843402803 +-2.22528104361363388008 +-2.22523132133580370251 +-2.22518158285017841891 +-2.22513182816198984426 +-2.22508205727646624084 +-2.22503227019883143001 +-2.22498246693430479226 +-2.22493264748810082310 +-2.22488281186543224166 +-2.22483296007150510576 +-2.22478309211152325275 +-2.22473320799068607911 +-2.22468330771418720815 +-2.22463339128721804272 +-2.22458345871496598889 +-2.22453351000261401182 +-2.22448354515533930353 +-2.22443356417831727967 +-2.22438356707671802681 +-2.22433355385570852292 +-2.22428352452044997278 +-2.22423347907610091667 +-2.22418341752781545395 +-2.22413333988074457537 +-2.22408324614003216624 +-2.22403313631082122370 +-2.22398301039824985992 +-2.22393286840745041388 +-2.22388271034355300415 +-2.22383253621168419656 +-2.22378234601696389561 +-2.22373213976451022944 +-2.22368191745943599713 +-2.22363167910685177731 +-2.22358142471185971090 +-2.22353115427956371519 +-2.22348086781505838161 +-2.22343056532343874565 +-2.22338024680979273739 +-2.22332991227920384603 +-2.22327956173675467255 +-2.22322919518752026846 +-2.22317881263657435298 +-2.22312841408898487217 +-2.22307799954981488710 +-2.22302756902412701479 +-2.22297712251697499042 +-2.22292666003341432557 +-2.22287618157848987366 +-2.22282568715724648811 +-2.22277517677472502555 +-2.22272465043596101353 +-2.22267410814598553870 +-2.22262354990982702319 +-2.22257297573250989231 +-2.22252238561905279823 +-2.22247177957447128449 +-2.22242115760377734190 +-2.22237051971197807632 +-2.22231986590407704085 +-2.22226919618507334775 +-2.22221851055996300062 +-2.22216780903373711809 +-2.22211709161138237789 +-2.22206635829788101688 +-2.22201560909821438372 +-2.22196484401735672165 +-2.22191406306027738893 +-2.22186326623194618790 +-2.22181245353732226278 +-2.22176162498136786638 +-2.22171078056903681386 +-2.22165992030527892354 +-2.22160904419504179330 +-2.22155815224326769197 +-2.22150724445489444747 +-2.22145632083485899955 +-2.22140538138808851798 +-2.22135442611951239300 +-2.22130345503405202123 +-2.22125246813662480250 +-2.22120146543214680435 +-2.22115044692552743300 +-2.22109941262167254195 +-2.22104836252548532016 +-2.22099729664186318345 +-2.22094621497570043900 +-2.22089511753188739718 +-2.22084400431531081566 +-2.22079287533085123485 +-2.22074173058338786291 +-2.22069057007779369073 +-2.22063939381893993286 +-2.22058820181169158658 +-2.22053699406091054058 +-2.22048577057145557490 +-2.22043453134817925232 +-2.22038327639593191520 +-2.22033200571955990910 +-2.22028071932390380638 +-2.22022941721380284719 +-2.22017809939408916620 +-2.22012676586959356584 +-2.22007541664514151947 +-2.22002405172555361546 +-2.21997267111564955400 +-2.21992127482024059759 +-2.21986986284413800874 +-2.21981843519214594451 +-2.21976699186906722971 +-2.21971553287969936008 +-2.21966405822883494636 +-2.21961256792126349069 +-2.21956106196177094247 +-2.21950954035513881024 +-2.21945800310614460571 +-2.21940645021956139971 +-2.21935488170015871034 +-2.21930329755270161485 +-2.21925169778195252590 +-2.21920008239266808303 +-2.21914845138960048487 +-2.21909680477750104188 +-2.21904514256111484727 +-2.21899346474518210925 +-2.21894177133444170380 +-2.21889006233362584553 +-2.21883833774746319634 +-2.21878659758068108587 +-2.21873484183799929426 +-2.21868307052413626934 +-2.21863128364380424173 +-2.21857948120171277751 +-2.21852766320256744592 +-2.21847582965106981945 +-2.21842398055191658557 +-2.21837211590980221132 +-2.21832023572941494649 +-2.21826834001544082042 +-2.21821642877255964521 +-2.21816450200545078886 +-2.21811255971878740212 +-2.21806060191723686259 +-2.21800862860546654787 +-2.21795663978813717421 +-2.21790463546990634924 +-2.21785261565542679563 +-2.21780058034934857147 +-2.21774852955631684992 +-2.21769646328097325139 +-2.21764438152795539949 +-2.21759228430189558878 +-2.21754017160742566972 +-2.21748804344916861098 +-2.21743589983174693714 +-2.21738374075977917599 +-2.21733156623787630579 +-2.21727937627065152526 +-2.21722717086270737497 +-2.21717495001864595139 +-2.21712271374306624239 +-2.21707046204056146266 +-2.21701819491571994192 +-2.21696591237312912170 +-2.21691361441736978222 +-2.21686130105302048321 +-2.21680897228465401128 +-2.21675662811683960030 +-2.21670426855414515188 +-2.21665189360113190631 +-2.21659950326235621887 +-2.21654709754237400077 +-2.21649467644573361369 +-2.21644223997698208706 +-2.21638978814066156531 +-2.21633732094130930790 +-2.21628483838345990975 +-2.21623234047164308080 +-2.21617982721038542238 +-2.21612729860420909489 +-2.21607475465763181788 +-2.21602219537516864634 +-2.21596962076132930619 +-2.21591703082061997065 +-2.21586442555754370431 +-2.21581180497659957496 +-2.21575916908227998903 +-2.21570651787907735297 +-2.21565385137147696781 +-2.21560116956396191412 +-2.21554847246101083158 +-2.21549576006709925124 +-2.21544303238669737510 +-2.21539028942427140834 +-2.21533753118428355933 +-2.21528475767119514828 +-2.21523196888945905769 +-2.21517916484352817008 +-2.21512634553784737435 +-2.21507351097686067121 +-2.21502066116500762050 +-2.21496779610672289706 +-2.21491491580643806714 +-2.21486202026858070013 +-2.21480910949757348050 +-2.21475618349783642813 +-2.21470324227378467796 +-2.21465028582983025629 +-2.21459731417038030443 +-2.21454432729983885508 +-2.21449132522260550004 +-2.21443830794307627841 +-2.21438527546564190018 +-2.21433222779469218722 +-2.21427916493460941183 +-2.21422608688977451408 +-2.21417299366456399312 +-2.21411988526334857497 +-2.21406676169049898562 +-2.21401362295037662520 +-2.21396046904734378202 +-2.21390729998575652715 +-2.21385411576996782301 +-2.21380091640432574707 +-2.21374770189317437996 +-2.21369447224085558190 +-2.21364122745170632811 +-2.21358796753005782065 +-2.21353469248024037341 +-2.21348140230657985938 +-2.21342809701339549022 +-2.21337477660500647758 +-2.21332144108572448360 +-2.21326809045985939406 +-2.21321472473171709794 +-2.21316134390559904332 +-2.21310794798580179332 +-2.21305453697662102286 +-2.21300111088234441326 +-2.21294766970726008992 +-2.21289421345564774057 +-2.21284074213178705293 +-2.21278725573995105336 +-2.21273375428441143598 +-2.21268023776943367764 +-2.21262670619927881432 +-2.21257315957820788199 +-2.21251959791047347892 +-2.21246602120032775929 +-2.21241242945201621595 +-2.21235882266978300947 +-2.21230520085786608320 +-2.21225156402050027182 +-2.21219791216191818961 +-2.21214424528634578948 +-2.21209056339800680391 +-2.21203686650112141265 +-2.21198315459990357823 +-2.21192942769856681906 +-2.21187568580131665996 +-2.21182192891235951393 +-2.21176815703589424444 +-2.21171437017611527409 +-2.21166056833721835773 +-2.21160675152338814797 +-2.21155291973881062972 +-2.21149907298766690289 +-2.21144521127413273831 +-2.21139133460238124229 +-2.21133744297657974798 +-2.21128353640089603260 +-2.21122961487948943571 +-2.21117567841651663230 +-2.21112172701613163284 +-2.21106776068248356282 +-2.21101377941971843910 +-2.21095978323197694948 +-2.21090577212339800539 +-2.21085174609811430102 +-2.21079770516025631011 +-2.21074364931395006550 +-2.21068957856331849143 +-2.21063549291247829487 +-2.21058139236554529461 +-2.21052727692662953629 +-2.21047314659983751284 +-2.21041900138927260855 +-2.21036484129903332274 +-2.21031066633321460202 +-2.21025647649590917254 +-2.21020227179120132277 +-2.21014805222317711753 +-2.21009381779591551620 +-2.21003956851349148138 +-2.20998530437997642295 +-2.20993102539944130669 +-2.20987673157594644024 +-2.20982242291355390762 +-2.20976809941632001966 +-2.20971376108829797857 +-2.20965940793353476934 +-2.20960503995607604466 +-2.20955065715996257225 +-2.20949625954923156712 +-2.20944184712791624747 +-2.20938741990004539062 +-2.20933297786964510934 +-2.20927852104073707551 +-2.20922404941733896422 +-2.20916956300346312148 +-2.20911506180312189329 +-2.20906054582032007616 +-2.20900601505905980204 +-2.20895146952334098245 +-2.20889690921715686756 +-2.20884233414449848709 +-2.20878774430935376216 +-2.20873313971570395253 +-2.20867852036752987388 +-2.20862388626880568054 +-2.20856923742350463868 +-2.20851457383559202086 +-2.20845989550903265553 +-2.20840520244778781844 +-2.20835049465581256811 +-2.20829577213705796623 +-2.20824103489547418633 +-2.20818628293500518467 +-2.20813151625959269708 +-2.20807673487317224215 +-2.20802193877967711799 +-2.20796712798303795822 +-2.20791230248717784690 +-2.20785746229601986812 +-2.20780260741348177689 +-2.20774773784347777550 +-2.20769285358991673718 +-2.20763795465670487062 +-2.20758304104774571996 +-2.20752811276693750031 +-2.20747316981817442993 +-2.20741821220534806258 +-2.20736323993234506702 +-2.20730825300304811520 +-2.20725325142133765866 +-2.20719823519108926391 +-2.20714320431617405660 +-2.20708815880046049784 +-2.20703309864781171967 +-2.20697802386208907777 +-2.20692293444714859874 +-2.20686783040684364465 +-2.20681271174502180443 +-2.20675757846552844654 +-2.20670243057220494265 +-2.20664726806888955579 +-2.20659209095941477585 +-2.20653689924760998409 +-2.20648169293730234131 +-2.20642647203231279107 +-2.20637123653646005650 +-2.20631598645355886390 +-2.20626072178741949870 +-2.20620544254184913768 +-2.20615014872065007268 +-2.20609484032762281913 +-2.20603951736656123117 +-2.20598417984125783065 +-2.20592882775550114260 +-2.20587346111307436303 +-2.20581807991775624700 +-2.20576268417332599370 +-2.20570727388355480869 +-2.20565184905221034484 +-2.20559640968306025499 +-2.20554095577986331023 +-2.20548548734637783753 +-2.20543000438635683480 +-2.20537450690355063543 +-2.20531899490170602007 +-2.20526346838456355215 +-2.20520792735586201871 +-2.20515237181933665411 +-2.20509680177871869589 +-2.20504121723773360841 +-2.20498561820010552381 +-2.20493000466955324512 +-2.20487437664979379903 +-2.20481873414453710680 +-2.20476307715749308969 +-2.20470740569236411943 +-2.20465171975285167960 +-2.20459601934265325696 +-2.20454030446546056510 +-2.20448457512496309718 +-2.20442883132484634956 +-2.20437307306879048951 +-2.20431730036047612842 +-2.20426151320357410768 +-2.20420571160175660097 +-2.20414989555868956472 +-2.20409406507803584674 +-2.20403822016345340984 +-2.20398236081859799640 +-2.20392648704712135199 +-2.20387059885267078130 +-2.20381469623888959219 +-2.20375877920941709576 +-2.20370284776789082670 +-2.20364690191794343477 +-2.20359094166320224062 +-2.20353496700729278857 +-2.20347897795383662611 +-2.20342297450645085988 +-2.20336695666874948785 +-2.20331092444434073485 +-2.20325487783683149345 +-2.20319881684982510350 +-2.20314274148691913169 +-2.20308665175170803607 +-2.20303054764778361019 +-2.20297442917873276258 +-2.20291829634813884908 +-2.20286214915958167282 +-2.20280598761663748419 +-2.20274981172287809272 +-2.20269362148187219930 +-2.20263741689718406391 +-2.20258119797237528203 +-2.20252496471100256414 +-2.20246871711661951210 +-2.20241245519277573095 +-2.20235617894301638486 +-2.20229988837088530573 +-2.20224358347992010820 +-2.20218726427365485421 +-2.20213093075562182932 +-2.20207458292934665778 +-2.20201822079835407564 +-2.20196184436616215763 +-2.20190545363628809028 +-2.20184904861224461925 +-2.20179262929753871703 +-2.20173619569567646792 +-2.20167974781015729491 +-2.20162328564447928869 +-2.20156680920213609909 +-2.20151031848661782320 +-2.20145381350140967314 +-2.20139729424999375240 +-2.20134076073585038813 +-2.20128421296245146976 +-2.20122765093327021901 +-2.20117107465177275216 +-2.20111448412142429731 +-2.20105787934568342123 +-2.20100126032800647025 +-2.20094462707184579386 +-2.20088797958064974480 +-2.20083131785786445533 +-2.20077464190693072865 +-2.20071795173128492706 +-2.20066124733436208061 +-2.20060452871959189025 +-2.20054779589040006016 +-2.20049104885021007405 +-2.20043428760244053066 +-2.20037751215050647602 +-2.20032072249781984752 +-2.20026391864778725349 +-2.20020710060381352591 +-2.20015026836929905585 +-2.20009342194763979350 +-2.20003656134222946861 +-2.19997968655645603775 +-2.19992279759370568115 +-2.19986589445736013815 +-2.19980897715079715127 +-2.19975204567739135442 +-2.19969510004051294061 +-2.19963814024352855014 +-2.19958116628980171470 +-2.19952417818269241323 +-2.19946717592555529563 +-2.19941015952174323544 +-2.19935312897460422121 +-2.19929608428748313287 +-2.19923902546372040945 +-2.19918195250665338136 +-2.19912486541961582631 +-2.19906776420593752519 +-2.19901064886894470618 +-2.19895351941195960066 +-2.19889637583830133138 +-2.19883921815128413613 +-2.19878204635421958812 +-2.19872486045041570790 +-2.19866766044317651918 +-2.19861044633580204888 +-2.19855321813158832711 +-2.19849597583382916355 +-2.19843871944581259470 +-2.19838144897082621299 +-2.19832416441214828495 +-2.19826686577306107395 +-2.19820955305683574110 +-2.19815222626674433570 +-2.19809488540605446616 +-2.19803753047802796772 +-2.19798016148592623153 +-2.19792277843300354334 +-2.19786538132251374478 +-2.19780797015770534841 +-2.19775054494182153775 +-2.19769310567810594037 +-2.19763565236979374617 +-2.19757818502012192141 +-2.19752070363231810646 +-2.19746320820960949760 +-2.19740569875522018251 +-2.19734817527236803159 +-2.19729063776426913890 +-2.19723308623413604579 +-2.19717552068517552044 +-2.19711794112059211059 +-2.19706034754358858763 +-2.19700273995736106158 +-2.19694511836510208980 +-2.19688748277000334141 +-2.19682983317524893607 +-2.19677216958402432567 +-2.19671449199950608033 +-2.19665680042487032608 +-2.19659909486328741579 +-2.19654137531792681415 +-2.19648364179195265677 +-2.19642589428852419431 +-2.19636813281079978921 +-2.19631035736193158669 +-2.19625256794506995561 +-2.19619476456336082393 +-2.19613694721994612280 +-2.19607911591796467476 +-2.19602127066055130555 +-2.19596341145083817636 +-2.19590553829195211932 +-2.19584765118701730202 +-2.19578975013915433934 +-2.19573183515147984934 +-2.19567390622710689740 +-2.19561596336914544025 +-2.19555800658070099374 +-2.19550003586487507690 +-2.19544205122476743242 +-2.19538405266347158573 +-2.19532604018408017410 +-2.19526801378967961753 +-2.19520997348335500376 +-2.19515191926818520329 +-2.19509385114724908661 +-2.19503576912361708651 +-2.19497767320036096805 +-2.19491956338054494680 +-2.19486143966723235010 +-2.19480330206348073219 +-2.19474515057234587090 +-2.19468698519687777093 +-2.19462880594012510471 +-2.19457061280513165968 +-2.19451240579493767058 +-2.19445418491257937532 +-2.19439595016109123549 +-2.19433770154350238357 +-2.19427943906283706710 +-2.19422116272212042176 +-2.19416287252436781330 +-2.19410456847259638380 +-2.19404625056981705811 +-2.19398791881903854062 +-2.19392957322326287439 +-2.19387121378549210249 +-2.19381284050872205071 +-2.19375445339594765670 +-2.19369605245015764083 +-2.19363763767433761487 +-2.19357920907147097012 +-2.19352076664453576882 +-2.19346231039650829686 +-2.19340384033035862288 +-2.19334535644905637142 +-2.19328685875556494977 +-2.19322834725284510071 +-2.19316982194385534655 +-2.19311128283154710417 +-2.19305272991887223455 +-2.19299416320877638142 +-2.19293558270420207990 +-2.19287698840808920053 +-2.19281838032337317301 +-2.19275975845298587430 +-2.19270112279985518455 +-2.19264247336690587531 +-2.19258381015706005357 +-2.19252513317323449726 +-2.19246644241834420797 +-2.19240773789529797000 +-2.19234901960700456769 +-2.19229028755636523584 +-2.19223154174628120927 +-2.19217278217964750553 +-2.19211400885935692173 +-2.19205522178829870228 +-2.19199642096935809477 +-2.19193760640541546181 +-2.19187877809935027784 +-2.19181993605403713232 +-2.19176108027234572972 +-2.19170221075714533043 +-2.19164332751129808941 +-2.19158443053766438524 +-2.19152551983910148792 +-2.19146659541846222652 +-2.19140765727859632150 +-2.19134870542234860835 +-2.19128973985256170209 +-2.19123076057207688550 +-2.19117176758372478318 +-2.19111276089034001657 +-2.19105374049475010167 +-2.19099470639978033404 +-2.19093565860824934788 +-2.19087659712297622150 +-2.19081752194677337187 +-2.19075843308245277186 +-2.19069933053281928892 +-2.19064021430067734642 +-2.19058108438882603863 +-2.19052194080006001897 +-2.19046278353717305265 +-2.19040361260295401991 +-2.19034442800018780417 +-2.19028522973165484800 +-2.19022601780013470574 +-2.19016679220840115860 +-2.19010755295922709962 +-2.19004830005537831639 +-2.18998903349961748788 +-2.18992975329470729307 +-2.18987045944340419368 +-2.18981115194846021055 +-2.18975183081262558815 +-2.18969249603864657416 +-2.18963314762926586354 +-2.18957378558722259854 +-2.18951440991525148050 +-2.18945502061608543443 +-2.18939561769245250034 +-2.18933620114707716553 +-2.18927677098268169686 +-2.18921732720198303213 +-2.18915786980769500047 +-2.18909839880252965472 +-2.18903891418919416267 +-2.18897941597038991901 +-2.18891990414881920657 +-2.18886037872717809094 +-2.18880083970815952910 +-2.18874128709445248120 +-2.18868172088874324288 +-2.18862214109371455706 +-2.18856254771204472576 +-2.18850294074640938646 +-2.18844332019948062396 +-2.18838368607392741438 +-2.18832403837241207256 +-2.18826437709759913375 +-2.18820470225214425142 +-2.18814501383870130269 +-2.18808531185992150014 +-2.18802559631845250365 +-2.18796586721693842037 +-2.18790612455801758429 +-2.18784636834432832941 +-2.18778659857850232839 +-2.18772681526317080980 +-2.18766701840095834086 +-2.18760720799448771245 +-2.18754738404637860683 +-2.18748754655924582124 +-2.18742769553570193253 +-2.18736783097835507661 +-2.18730795288981072488 +-2.18724806127266946376 +-2.18718815612952965921 +-2.18712823746298612448 +-2.18706830527562967603 +-2.18700835957004713350 +-2.18694840034882309610 +-2.18688842761453816621 +-2.18682844136976850535 +-2.18676844161708849867 +-2.18670842835906764634 +-2.18664840159827189581 +-2.18658836133726497408 +-2.18652830757860572319 +-2.18646824032485032063 +-2.18640815957855139118 +-2.18634806534225756280 +-2.18628795761851479895 +-2.18622783640986506626 +-2.18616770171884544638 +-2.18610755354799302097 +-2.18604739189983776626 +-2.18598721677690877030 +-2.18592702818172979207 +-2.18586682611682192601 +-2.18580661058470360203 +-2.18574638158788792097 +-2.18568613912888531914 +-2.18562588321020356830 +-2.18556561383434688750 +-2.18550533100381416673 +-2.18544503472110207554 +-2.18538472498870550709 +-2.18532440180911224914 +-2.18526406518481008945 +-2.18520371511827971034 +-2.18514335161200312641 +-2.18508297466845391455 +-2.18502258429010653984 +-2.18496218047942791785 +-2.18490176323888274368 +-2.18484133257093615654 +-2.18478088847804530204 +-2.18472043096266377304 +-2.18465996002724427427 +-2.18459947567423462544 +-2.18453897790607998175 +-2.18447846672522150158 +-2.18441794213409590242 +-2.18435740413513812541 +-2.18429685273077955898 +-2.18423628792344626248 +-2.18417570971556207482 +-2.18411511810954905854 +-2.18405451310782261487 +-2.18399389471279725683 +-2.18393326292688172430 +-2.18387261775248431306 +-2.18381195919200621347 +-2.18375128724784905998 +-2.18369060192240782570 +-2.18362990321807570737 +-2.18356919113724279313 +-2.18350846568229428613 +-2.18344772685561139269 +-2.18338697465957531918 +-2.18332620909656061059 +-2.18326543016893914739 +-2.18320463787908014552 +-2.18314383222934926820 +-2.18308301322210773776 +-2.18302218085971277972 +-2.18296133514452161961 +-2.18290047607888393344 +-2.18283960366514939722 +-2.18277871790566102561 +-2.18271781880276138921 +-2.18265690635878684134 +-2.18259598057607373534 +-2.18253504145695087502 +-2.18247408900374662011 +-2.18241312321878622171 +-2.18235214410438782551 +-2.18229115166287046534 +-2.18223014589654829010 +-2.18216912680773056366 +-2.18210809439872388538 +-2.18204704867183307826 +-2.18198598962935719214 +-2.18192491727359350051 +-2.18186383160683483595 +-2.18180273263137181061 +-2.18174162034949015165 +-2.18168049476347292170 +-2.18161935587560051886 +-2.18155820368814845622 +-2.18149703820338869420 +-2.18143585942359230501 +-2.18137466735102414361 +-2.18131346198794773272 +-2.18125224333662037779 +-2.18119101139929982835 +-2.18112976617823761671 +-2.18106850767568216654 +-2.18100723589388012513 +-2.18094595083507281075 +-2.18088465250149976526 +-2.18082334089539520150 +-2.18076201601899155591 +-2.18070067787451771224 +-2.18063932646419855743 +-2.18057796179025586980 +-2.18051658385490654268 +-2.18045519266036835759 +-2.18039378820885065835 +-2.18033237050256278877 +-2.18027093954370876361 +-2.18020949533449082125 +-2.18014803787710631511 +-2.18008656717374993406 +-2.18002508322661325835 +-2.17996358603788387143 +-2.17990207560974624812 +-2.17984055194438175462 +-2.17977901504396731625 +-2.17971746491067852602 +-2.17965590154668475975 +-2.17959432495415406095 +-2.17953273513525180860 +-2.17947113209213805263 +-2.17940951582696973432 +-2.17934788634190113044 +-2.17928624363908385320 +-2.17922458772066418575 +-2.17916291858878530263 +-2.17910123624559037836 +-2.17903954069321370568 +-2.17897783193379179778 +-2.17891610996945317424 +-2.17885437480232591057 +-2.17879262643453275317 +-2.17873086486819511620 +-2.17866909010543041703 +-2.17860730214835074392 +-2.17854550099906774108 +-2.17848368665968683544 +-2.17842185913231389804 +-2.17836001841904725040 +-2.17829816452198388177 +-2.17823629744321811685 +-2.17817441718483983948 +-2.17811252374893626893 +-2.17805061713758973951 +-2.17798869735288080918 +-2.17792676439688737133 +-2.17786481827168110215 +-2.17780285897933278960 +-2.17774088652191011306 +-2.17767890090147409055 +-2.17761690212008662826 +-2.17755489017980474742 +-2.17749286508268014018 +-2.17743082683076449868 +-2.17736877542610329783 +-2.17730671087074068026 +-2.17724463316671590363 +-2.17718254231606511695 +-2.17712043832082313699 +-2.17705832118301856326 +-2.17699619090467910709 +-2.17693404748782848301 +-2.17687189093448463240 +-2.17680972124666594070 +-2.17674753842638502022 +-2.17668534247565226281 +-2.17662313339647450761 +-2.17656091119085415286 +-2.17649867586079182047 +-2.17643642740828502369 +-2.17637416583532594672 +-2.17631189114390455330 +-2.17624960333600858675 +-2.17618730241362046129 +-2.17612498837872125890 +-2.17606266123328717654 +-2.17600032097929174668 +-2.17593796761870494905 +-2.17587560115349409884 +-2.17581322158562162628 +-2.17575082891704951749 +-2.17568842314973354135 +-2.17562600428562724630 +-2.17556357232668107216 +-2.17550112727484323827 +-2.17543866913205485858 +-2.17537619790025837929 +-2.17531371358139047345 +-2.17525121617738470547 +-2.17518870569017064298 +-2.17512618212167696541 +-2.17506364547382702312 +-2.17500109574854105787 +-2.17493853294773709095 +-2.17487595707332781458 +-2.17481336812722547691 +-2.17475076611133610882 +-2.17468815102756485302 +-2.17462552287781196725 +-2.17456288166397548878 +-2.17450022738794856991 +-2.17443756005162303069 +-2.17437487965688625025 +-2.17431218620562249910 +-2.17424947969971382733 +-2.17418676014103651184 +-2.17412402753146638545 +-2.17406128187287350784 +-2.17399852316712660638 +-2.17393575141609085577 +-2.17387296662162654570 +-2.17381016878559307770 +-2.17374735790984363604 +-2.17368453399623096089 +-2.17362169704660290748 +-2.17355884706280555463 +-2.17349598404667920803 +-2.17343310800006284111 +-2.17337021892479231866 +-2.17330731682269906457 +-2.17324440169561183822 +-2.17318147354535629034 +-2.17311853237375363079 +-2.17305557818262373715 +-2.17299261097378249019 +-2.17292963074904177390 +-2.17286663751021080770 +-2.17280363125909481425 +-2.17274061199749768392 +-2.17267757972721708981 +-2.17261453445005114915 +-2.17255147616779131781 +-2.17248840488222727529 +-2.17242532059514603660 +-2.17236222330832973171 +-2.17229911302355871427 +-2.17223598974261022931 +-2.17217285346725708095 +-2.17210970419926852060 +-2.17204654194041246740 +-2.17198336669245284369 +-2.17192017845714824276 +-2.17185697723625814604 +-2.17179376303153448546 +-2.17173053584472919297 +-2.17166729567758798325 +-2.17160404253185745915 +-2.17154077640927667403 +-2.17147749731158468123 +-2.17141420524051387275 +-2.17135090019779886106 +-2.17128758218516360046 +-2.17122425120433648615 +-2.17116090725703614339 +-2.17109755034498341786 +-2.17103418046989204981 +-2.17097079763347355907 +-2.17090740183743768910 +-2.17084399308348885427 +-2.17078057137333013671 +-2.17071713670865928947 +-2.17065368909117317742 +-2.17059022852256422453 +-2.17052675500452130208 +-2.17046326853873106089 +-2.17039976912687659905 +-2.17033625677063657378 +-2.17027273147168742184 +-2.17020919323170424775 +-2.17014564205235505057 +-2.17008207793530782936 +-2.17001850088222525414 +-2.16995491089476910673 +-2.16989130797459539579 +-2.16982769212335835363 +-2.16976406334270954801 +-2.16970042163429566173 +-2.16963676699976204532 +-2.16957309944074916430 +-2.16950941895889481970 +-2.16944572555583459206 +-2.16938201923319962106 +-2.16931829999261882591 +-2.16925456783571757313 +-2.16919082276411590016 +-2.16912706477943473260 +-2.16906329388328966701 +-2.16899951007729230312 +-2.16893571336305246433 +-2.16887190374217508904 +-2.16880808121626555973 +-2.16874424578692082122 +-2.16868039745573915056 +-2.16861653622431305166 +-2.16855266209423369617 +-2.16848877506708692664 +-2.16842487514445769747 +-2.16836096232792563399 +-2.16829703661906814105 +-2.16823309801946040309 +-2.16816914653067316365 +-2.16810518215427405764 +-2.16804120489182805542 +-2.16797721474489701876 +-2.16791321171503925669 +-2.16784919580380952553 +-2.16778516701276036116 +-2.16772112534344119084 +-2.16765707079739611274 +-2.16759300337616922505 +-2.16752892308130018506 +-2.16746482991432465326 +-2.16740072387677518151 +-2.16733660497018254532 +-2.16727247319607352338 +-2.16720832855597178579 +-2.16714417105139656172 +-2.16708000068386663628 +-2.16701581745489679776 +-2.16695162136599561720 +-2.16688741241867344201 +-2.16682319061443307007 +-2.16675895595477818745 +-2.16669470844120493069 +-2.16663044807521032453 +-2.16656617485828562053 +-2.16650188879192029390 +-2.16643758987760026713 +-2.16637327811680791001 +-2.16630895351102292778 +-2.16624461606172102890 +-2.16618026577037658953 +-2.16611590263846043314 +-2.16605152666743716594 +-2.16598713785877317051 +-2.16592273621392772398 +-2.16585832173435877124 +-2.16579389442152203671 +-2.16572945427686702757 +-2.16566500130184325101 +-2.16560053549789577332 +-2.16553605686646477579 +-2.16547156540899177202 +-2.16540706112691072605 +-2.16534254402165604603 +-2.16527801409465503468 +-2.16521347134733499473 +-2.16514891578112056436 +-2.16508434739743016451 +-2.16501976619768088383 +-2.16495517218328759057 +-2.16489056535566071204 +-2.16482594571620801105 +-2.16476131326633369767 +-2.16469666800744020563 +-2.16463200994092463958 +-2.16456733906818321600 +-2.16450265539060771047 +-2.16443795890958723405 +-2.16437324962650823323 +-2.16430852754275315775 +-2.16424379265970090458 +-2.16417904497872948255 +-2.16411428450121201550 +-2.16404951122851896272 +-2.16398472516201723082 +-2.16391992630307195000 +-2.16385511465304292145 +-2.16379029021328994631 +-2.16372545298516705259 +-2.16366060297002604784 +-2.16359574016921563100 +-2.16353086458408361281 +-2.16346597621596936634 +-2.16340107506621404099 +-2.16333616113615523346 +-2.16327123442712387913 +-2.16320629494045224561 +-2.16314134267746638329 +-2.16307637763949101029 +-2.16301139982784773608 +-2.16294640924385328518 +-2.16288140588882349391 +-2.16281638976407064590 +-2.16275136087090169568 +-2.16268631921062448598 +-2.16262126478453975409 +-2.16255619759394823731 +-2.16249111764014712023 +-2.16242602492442781426 +-2.16236091944808128673 +-2.16229580121239628454 +-2.16223067021865578141 +-2.16216552646814186289 +-2.16210036996213039728 +-2.16203520070189902924 +-2.16197001868871874208 +-2.16190482392385874277 +-2.16183961640858468556 +-2.16177439614415911606 +-2.16170916313184147128 +-2.16164391737288941187 +-2.16157865886855660165 +-2.16151338762009270766 +-2.16144810362874739695 +-2.16138280689576278704 +-2.16131749742238188361 +-2.16125217520984147512 +-2.16118684025937879412 +-2.16112149257222485588 +-2.16105613214961067570 +-2.16099075899276149570 +-2.16092537310289900532 +-2.16085997448124578213 +-2.16079456312901818649 +-2.16072913904743035829 +-2.16066370223769377290 +-2.16059825270101502070 +-2.16053279043860024800 +-2.16046731545165204835 +-2.16040182774136813038 +-2.16033632730894575857 +-2.16027081415557686839 +-2.16020528828245117481 +-2.16013974969075572830 +-2.16007419838167535886 +-2.16000863435639001153 +-2.15994305761607829908 +-2.15987746816191394927 +-2.15981186599506891355 +-2.15974625111671247879 +-2.15968062352801082326 +-2.15961498323012524025 +-2.15954933022421702304 +-2.15948366451144124767 +-2.15941798609295299016 +-2.15935229496990332976 +-2.15928659114343757253 +-2.15922087461470280090 +-2.15915514538483943596 +-2.15908940345498701063 +-2.15902364882627972875 +-2.15895788149985268234 +-2.15889210147683385799 +-2.15882630875835035411 +-2.15876050334552482823 +-2.15869468523947993788 +-2.15862885444133167923 +-2.15856301095219604846 +-2.15849715477318415680 +-2.15843128590540356271 +-2.15836540434996182469 +-2.15829951010796117217 +-2.15823360318050072593 +-2.15816768356867916268 +-2.15810175127358716551 +-2.15803580629631763799 +-2.15796984863795815457 +-2.15790387829959318111 +-2.15783789528230540711 +-2.15777189958717308116 +-2.15770589121527178733 +-2.15763987016767444516 +-2.15757383644545219781 +-2.15750779004966997121 +-2.15744173098139491174 +-2.15737565924168483988 +-2.15730957483159935251 +-2.15724347775219404966 +-2.15717736800451964641 +-2.15711124558962685782 +-2.15704511050856018173 +-2.15697896276236544821 +-2.15691280235208049376 +-2.15684662927874359895 +-2.15678044354338949162 +-2.15671424514704845876 +-2.15664803409075034324 +-2.15658181037551965886 +-2.15651557400237958717 +-2.15644932497234975699 +-2.15638306328644624443 +-2.15631678894568290517 +-2.15625050195107137441 +-2.15618420230361795831 +-2.15611789000432807484 +-2.15605156505420447743 +-2.15598522745424636682 +-2.15591887720544850282 +-2.15585251430880431300 +-2.15578613876530411630 +-2.15571975057593467895 +-2.15565334974168143489 +-2.15558693626352537720 +-2.15552051014244394622 +-2.15545407137941325004 +-2.15538761997540673221 +-2.15532115593139250720 +-2.15525467924833824540 +-2.15518818992720717631 +-2.15512168796896030898 +-2.15505517337455643201 +-2.15498864614494944902 +-2.15492210628109237547 +-2.15485555378393245363 +-2.15478898865441736987 +-2.15472241089349036969 +-2.15465582050209247811 +-2.15458921748116027928 +-2.15452260183162769280 +-2.15445597355442819421 +-2.15438933265048948584 +-2.15432267912073704963 +-2.15425601296609414703 +-2.15418933418748137498 +-2.15412264278581488952 +-2.15405593876200995851 +-2.15398922211697652074 +-2.15392249285162451500 +-2.15385575096685855101 +-2.15378899646358146214 +-2.15372222934269297312 +-2.15365544960508925598 +-2.15358865725166515048 +-2.15352185228331105549 +-2.15345503470091514941 +-2.15338820450536294615 +-2.15332136169753729504 +-2.15325450627831571637 +-2.15318763824857750677 +-2.15312075760919396927 +-2.15305386436103773917 +-2.15298695850497479043 +-2.15292004004187109700 +-2.15285310897258952423 +-2.15278616529798894064 +-2.15271920901892466205 +-2.15265224013625244837 +-2.15258525865081962181 +-2.15251826456347705729 +-2.15245125787506852433 +-2.15238423858643557196 +-2.15231720669841752880 +-2.15225016221185061482 +-2.15218310512756882957 +-2.15211603544640261987 +-2.15204895316917932391 +-2.15198185829672317126 +-2.15191475082985750333 +-2.15184763076940033244 +-2.15178049811616833864 +-2.15171335287097509337 +-2.15164619503463061534 +-2.15157902460794225874 +-2.15151184159171515731 +-2.15144464598675178024 +-2.15137743779385015586 +-2.15131021701380742428 +-2.15124298364741761702 +-2.15117573769546943652 +-2.15110847915875202929 +-2.15104120803804965689 +-2.15097392433414391633 +-2.15090662804781507234 +-2.15083931917983894877 +-2.15077199773098870494 +-2.15070466370203527973 +-2.15063731709374694745 +-2.15056995790688709747 +-2.15050258614221911913 +-2.15043520180050284907 +-2.15036780488249368304 +-2.15030039538894568452 +-2.15023297332060936427 +-2.15016553867823301260 +-2.15009809146256269941 +-2.15003063167433872138 +-2.14996315931430181934 +-2.14989567438318918136 +-2.14982817688173311055 +-2.14976066681066635411 +-2.14969314417071544199 +-2.14962560896260779231 +-2.14955806118706460595 +-2.14949050084480441924 +-2.14942292793654798899 +-2.14935534246300585792 +-2.14928774442489078922 +-2.14922013382291243744 +-2.14915251065777468398 +-2.14908487493018096615 +-2.14901722664083161263 +-2.14894956579042428757 +-2.14888189237965177014 +-2.14881420640920861587 +-2.14874650787978183075 +-2.14867879679205797672 +-2.14861107314672095114 +-2.14854333694445021052 +-2.14847558818592432317 +-2.14840782687181741650 +-2.14834005300280184159 +-2.14827226657954772904 +-2.14820446760272076858 +-2.14813665607298531768 +-2.14806883199100218107 +-2.14800099535742905488 +-2.14793314617292230295 +-2.14786528443813384825 +-2.14779741015371383739 +-2.14772952332030930833 +-2.14766162393856507862 +-2.14759371200912196898 +-2.14752578753261946787 +-2.14745785050969217878 +-2.14738990094097470518 +-2.14732193882709676558 +-2.14725396416868674621 +-2.14718597696636859240 +-2.14711797722076536132 +-2.14704996493249522516 +-2.14698194010217635608 +-2.14691390273042115311 +-2.14684585281784201527 +-2.14677779036504645660 +-2.14670971537263888251 +-2.14664162784122503069 +-2.14657352777140264521 +-2.14650541516377035833 +-2.14643729001892147323 +-2.14636915233744884901 +-2.14630100211994090387 +-2.14623283936698472374 +-2.14616466407916162140 +-2.14609647625705513008 +-2.14602827590124256574 +-2.14596006301229813573 +-2.14589183759079560332 +-2.14582359963730429087 +-2.14575534915239085620 +-2.14568708613662062490 +-2.14561881059055536980 +-2.14555052251475197878 +-2.14548222190976956014 +-2.14541390877615922861 +-2.14534558311447298706 +-2.14527724492525750932 +-2.14520889420905902512 +-2.14514053096642021146 +-2.14507215519788019265 +-2.14500376690397676072 +-2.14493536608524326681 +-2.14486695274221128571 +-2.14479852687541150402 +-2.14473008848536794702 +-2.14466163757260508405 +-2.14459317413764338767 +-2.14452469818100199817 +-2.14445620970319472676 +-2.14438770870473538466 +-2.14431919518613200992 +-2.14425066914789397288 +-2.14418213059052487068 +-2.14411357951452608006 +-2.14404501592039764546 +-2.14397643980863472635 +-2.14390785117973159402 +-2.14383925003418029931 +-2.14377063637246667582 +-2.14370201019507833351 +-2.14363337150249755325 +-2.14356472029520439548 +-2.14349605657367670020 +-2.14342738033838831058 +-2.14335869158981218163 +-2.14328999032841815975 +-2.14322127655467253859 +-2.14315255026903850322 +-2.14308381147197879457 +-2.14301506016395126863 +-2.14294629634541244911 +-2.14287752001681441882 +-2.14280873117860970467 +-2.14273992983124506040 +-2.14267111597516590749 +-2.14260228961081544696 +-2.14253345073863243897 +-2.14246459935905519956 +-2.14239573547251760388 +-2.14232685907945308301 +-2.14225797018028929486 +-2.14218906877545345324 +-2.14212015486536877518 +-2.14205122845045758950 +-2.14198228953113778417 +-2.14191333810782591485 +-2.14184437418093454042 +-2.14177539775087533158 +-2.14170640881805507405 +-2.14163740738288010945 +-2.14156839344575233852 +-2.14149936700707321791 +-2.14143032806723754291 +-2.14136127662664188520 +-2.14129221268567793146 +-2.14122313624473425975 +-2.14115404730420033630 +-2.14108494586445718966 +-2.14101583192588851290 +-2.14094670548887133776 +-2.14087756655378269599 +-2.14080841512099739887 +-2.14073925119088404045 +-2.14067007476381210296 +-2.14060088584014840407 +-2.14053168442025354423 +-2.14046247050448945615 +-2.14039324409321451981 +-2.14032400518678223023 +-2.14025475378554652650 +-2.14018548988985646275 +-2.14011621350005931674 +-2.14004692461650103397 +-2.13997762323952178676 +-2.13990830936946263563 +-2.13983898300665886794 +-2.13976964415144532694 +-2.13970029280415419137 +-2.13963092896511453134 +-2.13956155263465142014 +-2.13949216381308904289 +-2.13942276250074936428 +-2.13935334869794946400 +-2.13928392240500686583 +-2.13921448362223376449 +-2.13914503234994102243 +-2.13907556858843772574 +-2.13900609233802718734 +-2.13893660359901449652 +-2.13886710237169985760 +-2.13879758865637947807 +-2.13872806245335000952 +-2.13865852376290277448 +-2.13858897258532820729 +-2.13851940892091407775 +-2.13844983276994415888 +-2.13838024413270177959 +-2.13831064300946538381 +-2.13824102940051297139 +-2.13817140330611854537 +-2.13810176472655388835 +-2.13803211366208811839 +-2.13796245011298857719 +-2.13789277407951860965 +-2.13782308556194022842 +-2.13775338456051100522 +-2.13768367107549028816 +-2.13761394510712898764 +-2.13754420665567979043 +-2.13747445572139138648 +-2.13740469230450891303 +-2.13733491640527617506 +-2.13726512802393564527 +-2.13719532716072446732 +-2.13712551381587756438 +-2.13705568798962985966 +-2.13698584968221139135 +-2.13691599889385086541 +-2.13684613562477343507 +-2.13677625987520247719 +-2.13670637164535737185 +-2.13663647093545838729 +-2.13656655774571824224 +-2.13649663207635187590 +-2.13642669392756845426 +-2.13635674329957625517 +-2.13628678019258044785 +-2.13621680460678353697 +-2.13614681654238580677 +-2.13607681599958532104 +-2.13600680297857659085 +-2.13593677747955190682 +-2.13586673950270222733 +-2.13579668904821406983 +-2.13572662611627306362 +-2.13565655070706172936 +-2.13558646282075903500 +-2.13551636245754261623 +-2.13544624961758788828 +-2.13537612430106715777 +-2.13530598650814917860 +-2.13523583623900270467 +-2.13516567349379160490 +-2.13509549827267752775 +-2.13502531057582123353 +-2.13495511040337948572 +-2.13488489775550727146 +-2.13481467263235646925 +-2.13474443503407629308 +-2.13467418496081462465 +-2.13460392241271579294 +-2.13453364738992190652 +-2.13446335989257329757 +-2.13439305992080541330 +-2.13432274747475503318 +-2.13425242255455227536 +-2.13418208516032814615 +-2.13411173529220965506 +-2.13404137295032025889 +-2.13397099813478385855 +-2.13390061084571813765 +-2.13383021108324122395 +-2.13375979884746813653 +-2.13368937413851034179 +-2.13361893695647841795 +-2.13354848730147894642 +-2.13347802517361673225 +-2.13340755057299436004 +-2.13333706349971130578 +-2.13326656395386393683 +-2.13319605193554773237 +-2.13312552744485595113 +-2.13305499048187652278 +-2.13298444104669959742 +-2.13291387913940688748 +-2.13284330476008276989 +-2.13277271790880718072 +-2.13270211858565650331 +-2.13263150679070712101 +-2.13256088252403053218 +-2.13249024578569690291 +-2.13241959657577506704 +-2.13234893489432852931 +-2.13227826074142123858 +-2.13220757411711270279 +-2.13213687502146109765 +-2.13206616345452149019 +-2.13199543941634761524 +-2.13192470290698787849 +-2.13185395392649335022 +-2.13178319247490666299 +-2.13171241855227266981 +-2.13164163215863133871 +-2.13157083329402086136 +-2.13150002195847720898 +-2.13142919815203368827 +-2.13135836187472138548 +-2.13128751312656872230 +-2.13121665190760056774 +-2.13114577821784223488 +-2.13107489205731370774 +-2.13100399342603408215 +-2.13093308232401978941 +-2.13086215875128415220 +-2.13079122270783916093 +-2.13072027419369369738 +-2.13064931320885397881 +-2.13057833975332444609 +-2.13050735382710776378 +-2.13043635543020171141 +-2.13036534456260273629 +-2.13029432122430728569 +-2.13022328541530692192 +-2.13015223713559009866 +-2.13008117638514526959 +-2.13001010316395644750 +-2.12993901747200720109 +-2.12986791930927576999 +-2.12979680867574128200 +-2.12972568557137842404 +-2.12965454999615966258 +-2.12958340195005613182 +-2.12951224143303541325 +-2.12944106844506242382 +-2.12936988298610208048 +-2.12929868505611352703 +-2.12922747465505590725 +-2.12915625178288481223 +-2.12908501643955494487 +-2.12901376862501656717 +-2.12894250833921816479 +-2.12887123558210733520 +-2.12879995035362723499 +-2.12872865265372057664 +-2.12865734248232563175 +-2.12858601983937978375 +-2.12851468472481775152 +-2.12844333713857114532 +-2.12837197708057068724 +-2.12830060455074310255 +-2.12822921954901378427 +-2.12815782207530501680 +-2.12808641212953775224 +-2.12801498971162850182 +-2.12794355482149510905 +-2.12787210745904964426 +-2.12780064762420284552 +-2.12772917531686278636 +-2.12765769053693665214 +-2.12758619328432674322 +-2.12751468355893669226 +-2.12744316136066302647 +-2.12737162668940449350 +-2.12730007954505495604 +-2.12722851992750605632 +-2.12715694783664677203 +-2.12708536327236608088 +-2.12701376623454718739 +-2.12694215672307418430 +-2.12687053473782627933 +-2.12679890027868268021 +-2.12672725334551726561 +-2.12665559393820480238 +-2.12658392205661606056 +-2.12651223770061781337 +-2.12644054087007861042 +-2.12636883156486122814 +-2.12629710978482844297 +-2.12622537552983725817 +-2.12615362879974600929 +-2.12608186959440947916 +-2.12601009791367934199 +-2.12593831375740682788 +-2.12586651712543739379 +-2.12579470801761738485 +-2.12572288643379003759 +-2.12565105237379770031 +-2.12557920583747472776 +-2.12550734682466124781 +-2.12543547533518761838 +-2.12536359136888775012 +-2.12529169492558978050 +-2.12521978600512007063 +-2.12514786460730409345 +-2.12507593073196288103 +-2.12500398437891835357 +-2.12493202554798576998 +-2.12486005423898127731 +-2.12478807045171835810 +-2.12471607418600783035 +-2.12464406544165740343 +-2.12457204421847301035 +-2.12450001051625880777 +-2.12442796433481717600 +-2.12435590567394516626 +-2.12428383453344293841 +-2.12421175091310221461 +-2.12413965481271693747 +-2.12406754623207660870 +-2.12399542517096939775 +-2.12392329162918036545 +-2.12385114560649324034 +-2.12377898710268908644 +-2.12370681611754585916 +-2.12363463265084106979 +-2.12356243670234734466 +-2.12349022827183864237 +-2.12341800735908181608 +-2.12334577396384727166 +-2.12327352808589875366 +-2.12320126972499911844 +-2.12312899888090811373 +-2.12305671555338504319 +-2.12298441974218610184 +-2.12291211144706437608 +-2.12283979066777117595 +-2.12276745740405692331 +-2.12269511165566804323 +-2.12262275342234918440 +-2.12255038270384233101 +-2.12247799949988857904 +-2.12240560381022635994 +-2.12233319563459055246 +-2.12226077497271514716 +-2.12218834182433102598 +-2.12211589618916729449 +-2.12204343806695128194 +-2.12197096745740676482 +-2.12189848436025751965 +-2.12182598877522199388 +-2.12175348070201907902 +-2.12168096014036322572 +-2.12160842708996932870 +-2.12153588155054784181 +-2.12146332352180833070 +-2.12139075300345680830 +-2.12131816999519839939 +-2.12124557449673423193 +-2.12117296650776587796 +-2.12110034602799046866 +-2.12102771305710335881 +-2.12095506759479812686 +-2.12088240964076613082 +-2.12080973919469606415 +-2.12073705625627528804 +-2.12066436082518894324 +-2.12059165290111728552 +-2.12051893248374279111 +-2.12044619957274127486 +-2.12037345416779032803 +-2.12030069626856265685 +-2.12022792587472963532 +-2.12015514298596086107 +-2.12008234760192193491 +-2.12000953972227934585 +-2.11993671934669514201 +-2.11986388647483003922 +-2.11979104110633986835 +-2.11971818324088401297 +-2.11964531287811386306 +-2.11957243001768302904 +-2.11949953465923845997 +-2.11942662680242976947 +-2.11935370644690124209 +-2.11928077359229449783 +-2.11920782823825204488 +-2.11913487038441195054 +-2.11906190003041006165 +-2.11898891717588133687 +-2.11891592182045762627 +-2.11884291396376811534 +-2.11876989360544154550 +-2.11869686074510221729 +-2.11862381538237443124 +-2.11855075751687982333 +-2.11847768714823558867 +-2.11840460427606069871 +-2.11833150889996835176 +-2.11825840101957174610 +-2.11818528063448185961 +-2.11811214774430611740 +-2.11803900234865105645 +-2.11796584444711966100 +-2.11789267403931535938 +-2.11781949112483669495 +-2.11774629570328176698 +-2.11767308777424601018 +-2.11759986733732175068 +-2.11752663439210042640 +-2.11745338893817214299 +-2.11738013097512167704 +-2.11730686050253602559 +-2.11723357751999552434 +-2.11716028202708228534 +-2.11708697402337353566 +-2.11701365350844605828 +-2.11694032048187485984 +-2.11686697494322917379 +-2.11679361689208045405 +-2.11672024632799571364 +-2.11664686325054196558 +-2.11657346765928133792 +-2.11650005955377507050 +-2.11642663893358262683 +-2.11635320579826080589 +-2.11627976014736551846 +-2.11620630198044823445 +-2.11613283129706042374 +-2.11605934809675133579 +-2.11598585237906666734 +-2.11591234414355122695 +-2.11583882338974627046 +-2.11576529011719349782 +-2.11569174432543016806 +-2.11561818601399176387 +-2.11554461518241287976 +-2.11547103183022633388 +-2.11539743595696005940 +-2.11532382756214287767 +-2.11525020664530005732 +-2.11517657320595420245 +-2.11510292724362747308 +-2.11502926875783936467 +-2.11495559774810759635 +-2.11488191421394500225 +-2.11480821815486663695 +-2.11473450957038311415 +-2.11466078846000282709 +-2.11458705482323239266 +-2.11451330865957709548 +-2.11443954996853999972 +-2.11436577874962017276 +-2.11429199500231757014 +-2.11421819872612815061 +-2.11414438992054565247 +-2.11407056858506425812 +-2.11399673471917148859 +-2.11392288832235797358 +-2.11384902939410856959 +-2.11377515793390768906 +-2.11370127394123752396 +-2.11362737741557671356 +-2.11355346835640522940 +-2.11347954676319682576 +-2.11340561263542747739 +-2.11333166597256694175 +-2.11325770677408630860 +-2.11318373503945267089 +-2.11310975076813267748 +-2.11303575395958764815 +-2.11296174461328112315 +-2.11288772272867131363 +-2.11281368830521643076 +-2.11273964134237157708 +-2.11266558183959096695 +-2.11259150979632481793 +-2.11251742521202334757 +-2.11244332808613322072 +-2.11236921841809976996 +-2.11229509620736610742 +-2.11222096145337401296 +-2.11214681415556215782 +-2.11207265431336832506 +-2.11199848192622718912 +-2.11192429699357253625 +-2.11185009951483415591 +-2.11177588948944183755 +-2.11170166691682359428 +-2.11162743179640344238 +-2.11155318412760495406 +-2.11147892390984859290 +-2.11140465114255349022 +-2.11133036582513788915 +-2.11125606795701603602 +-2.11118175753760084490 +-2.11110743456630300940 +-2.11103309904253277907 +-2.11095875096569596252 +-2.11088439033519836840 +-2.11081001715044269673 +-2.11073563141083075934 +-2.11066123311576081534 +-2.11058682226463067977 +-2.11051239885683417086 +-2.11043796289176599501 +-2.11036351436881641774 +-2.11028905328737526048 +-2.11021457964682879194 +-2.11014009344656328082 +-2.11006559468596011087 +-2.10999108336440333034 +-2.10991655948127032616 +-2.10984202303593848526 +-2.10976747402778386231 +-2.10969291245617940334 +-2.10961833832049627802 +-2.10954375162010521194 +-2.10946915235437160163 +-2.10939454052266306405 +-2.10931991612434144301 +-2.10924527915876991457 +-2.10917062962530721393 +-2.10909596752331029990 +-2.10902129285213701948 +-2.10894660561113944652 +-2.10887190579966965487 +-2.10879719341707794200 +-2.10872246846271194087 +-2.10864773093591839626 +-2.10857298083604050021 +-2.10849821816242055661 +-2.10842344291439864890 +-2.10834865509131352823 +-2.10827385469250083716 +-2.10819904171729621822 +-2.10812421616502998489 +-2.10804937803503422700 +-2.10797452732663703756 +-2.10789966403916562143 +-2.10782478817194318665 +-2.10774989972429427354 +-2.10767499869553942560 +-2.10760008508499607771 +-2.10752515889198255294 +-2.10745022011581450982 +-2.10737526875580449826 +-2.10730030481126240360 +-2.10722532828150033168 +-2.10715033916582328288 +-2.10707533746353758985 +-2.10700032317394780890 +-2.10692529629635449950 +-2.10685025683005777708 +1.64032663064655026552 +1.63919755783538723115 +1.63806880064274751341 +1.63694035948710014949 +1.63581223478635995328 +1.63468442695788840346 +1.63355693641848720432 +1.63242976358440672335 +1.63130290887133977407 +1.63017637269442339232 +1.62905015546824016859 +1.62792425760681602753 +1.62679867952362022798 +1.62567342163156713930 +1.62454848434301624138 +1.62342386806976723967 +1.62229957322306694856 +1.62117560021360529454 +1.62005194945151442809 +1.61892862134637094407 +1.61780561630719565969 +1.61668293474245117203 +1.61556057706004385643 +1.61443854366732586492 +1.61331683497108735459 +1.61219545137756692377 +1.61107439329244339632 +1.60995366112083848620 +1.60883325526731724153 +1.60771317613588871076 +1.60659342413000283400 +1.60547399965255332965 +1.60435490310587702822 +1.60323613489175098579 +1.60211769541139759099 +1.60099958506548056825 +1.59988180425410453367 +1.59876435337681876980 +1.59764723283261433906 +1.59653044301992275145 +1.59541398433661929523 +1.59429785718002170469 +1.59318206194688749555 +1.59206659903341862794 +1.59095146883525795367 +1.58983667174748966033 +1.58872220816463993742 +1.58760807848067808656 +1.58649428308901274676 +1.58538082238249589118 +1.58426769675342127286 +1.58315490659352242631 +1.58204245229397666428 +1.58093033424539997078 +1.57981855283785299626 +1.57870710846083572854 +1.57759600150328838097 +1.57648523235359516725 +1.57537480139958030456 +1.57426470902850779154 +1.57315495562708473898 +1.57204554158145937137 +1.57093646727721880652 +1.56982773309939260820 +1.56871933943245300824 +1.56761128666030891132 +1.56650357516631366650 +1.56539620533326151453 +1.56428917754338425716 +1.56318249217835725240 +1.56207614961929719399 +1.56097015024675855877 +1.55986449444073893567 +1.55875918258067636124 +1.55765421504544776532 +1.55654959221337163555 +1.55544531446220846149 +1.55434138216915718189 +1.55323779571085784923 +1.55213455546339140767 +1.55103166180227902693 +1.54992911510248165818 +1.54882691573840247656 +1.54772506408388266230 +1.54662356051220473141 +1.54552240539609275771 +1.54442159910770904219 +1.54332114201865677749 +1.54222103449998138025 +1.54112127692216493990 +1.54002186965513288008 +1.53892281306824996179 +1.53782410753031961725 +1.53672575340958661450 +1.53562775107373794548 +1.53453010088989616477 +1.53343280322462804932 +1.53233585844393882525 +1.53123926691327327809 +1.53014302899751730713 +1.52904714506099725924 +1.52795161546747726433 +1.52685644058016389835 +1.52576162076170351867 +1.52466715637418137597 +1.52357304777912294647 +1.52247929533749526421 +1.52138589940970336833 +1.52029286035559318968 +1.51920017853445199485 +1.51810785430500372328 +1.51701588802541653678 +1.51592428005329526997 +1.51483303074568653734 +1.51374214045907562465 +1.51265160954938981952 +1.51156143837199463675 +1.51047162728169626078 +1.50938217663274110159 +1.50829308677881512857 +1.50720435807304453668 +1.50611599086799619052 +1.50502798551567584795 +1.50394034236752993650 +1.50285306177444599740 +1.50176614408674935497 +1.50067958965420711337 +1.49959339882602660232 +1.49850757195085382278 +1.49742210937677588944 +1.49633701145132103072 +1.49525227852145503604 +1.49416791093358614084 +1.49308390903356236201 +1.49200027316667038768 +1.49091700367763912993 +1.48983410091063772640 +1.48875156520927265369 +1.48766939691659372258 +1.48658759637509074736 +1.48550616392669176946 +1.48442509991276794246 +1.48334440467412775888 +1.48226407855102326749 +1.48118412188314407807 +1.48010453500962291251 +1.47902531826902960965 +1.47794647199937889681 +1.47686799653812106392 +1.47578989222215062327 +1.47471215938780120247 +1.47363479837084798696 +1.47255780950650505545 +1.47148119312942871062 +1.47040494957371481455 +1.46932907917290078714 +1.46825358225996449590 +1.46717845916732536615 +1.46610371022684149445 +1.46502933576981453356 +1.46395533612698436343 +1.46288171162853419816 +1.46180846260408725534 +1.46073558938270720020 +1.45966309229289925575 +1.45859097166260975875 +1.45751922781922638173 +1.45644786108957768889 +1.45537687179993313613 +1.45430626027600373718 +1.45323602684294206355 +1.45216617182534246666 +1.45109669554723841323 +1.45002759833210759233 +1.44895888050286836268 +1.44789054238187886448 +1.44682258429094123819 +1.44575500655129873806 +1.44468780948363373362 +1.44362099340807414904 +1.44255455864418813405 +1.44148850551098361983 +1.44042283432691364808 +1.43935754540987148609 +1.43829263907719262505 +1.43722811564565433606 +1.43616397543147744642 +1.43510021875032234284 +1.43403684591729385644 +1.43297385724693926434 +1.43191125305324562511 +1.43084903364964466377 +1.42978719934901055133 +1.42872575046365835050 +1.42766468730534734632 +1.42660401018527926986 +1.42554371941409674385 +1.42448381530188750155 +1.42342429815818105610 +1.42236516829194981071 +1.42130642601160883665 +1.42024807162501764957 +1.41919010543947599068 +1.41813252776173071013 +1.41707533889796888360 +1.41601853915382136506 +1.41496212883436323082 +1.41390610824411289137 +1.41285047768703098114 +1.41179523746652413330 +1.41074038788544053880 +1.40968592924607283301 +1.40863186185015720753 +1.40757818599887496447 +1.40652490199284896377 +1.40547201013214873022 +1.40441951071628667869 +1.40336740404421900230 +1.40231569041434678269 +1.40126437012451598996 +1.40021344347201548430 +1.39916291075358012463 +1.39811277226538899221 +1.39706302830306472451 +1.39601367916167706795 +1.39496472513573865903 +1.39391616651920702274 +1.39286800360548634892 +1.39182023668742460565 +1.39077286605731531566 +1.38972589200689733424 +1.38867931482735462723 +1.38763313480931693711 +1.38658735224285956100 +1.38554196741750401678 +1.38449698062221582262 +1.38345239214540827177 +1.38240820227493976802 +1.38136441129811382567 +1.38032101950168129001 +1.37927802717184011527 +1.37823543459423181190 +1.37719324205394699767 +1.37615144983552029068 +1.37511005822293541634 +1.37406906749962054448 +1.37302847794845339635 +1.37198828985175502737 +1.37094850349129715461 +1.36990911914829505136 +1.36887013710341398642 +1.36783155763676500527 +1.36679338102790826071 +1.36575560755584857198 +1.36471823749904119794 +1.36368127113538739614 +1.36264470874223686536 +1.36160855059638663533 +1.36057279697408373131 +1.35953744815102051113 +1.35850250440234043836 +1.35746796600263230914 +1.35643383322593558127 +1.35540010634573859782 +1.35436678563497614469 +1.35333387136603455758 +1.35230136381074683705 +1.35126926324039642324 +1.35023756992571475344 +1.34920628413688437064 +1.34817540614353492678 +1.34714493621474740159 +1.34611487461905210417 +1.34508522162442756276 +1.34405597749830407750 +1.34302714250756149994 +1.34199871691852878897 +1.34097070099698623125 +1.33994309500816366487 +1.33891589921674203367 +1.33788911388685205495 +1.33686273928207688400 +1.33583677566544811732 +1.33481122329944978944 +1.33378608244601792876 +1.33276135336653656083 +1.33173703632184481371 +1.33071313157223092283 +1.32968963937743533954 +1.32866655999664984300 +1.32764389368852020468 +1.32662164071114041519 +1.32559980132205956771 +1.32457837577827830522 +1.32355736433624882054 +1.32253676725187663266 +1.32151658478052058676 +1.32049681717699041172 +1.31947746469554982873 +1.31845852758991610720 +1.31744000611325917660 +1.31642190051820118235 +1.31540421105682048264 +1.31438693798064565321 +1.31337008154066192667 +1.31235364198730763974 +1.31133761957047334512 +1.31032201453950625236 +1.30930682714320667515 +1.30829205762982847538 +1.30727770624708239389 +1.30626377324213227560 +1.30525025886159662392 +1.30423716335155015500 +1.30322448695752246550 +1.30221222992449670031 +1.30120039249691465955 +1.30018897491867102545 +1.29917797743311691505 +1.29816740028306032428 +1.29715724371076546184 +1.29614750795794919647 +1.29513819326579038282 +1.29412929987492009154 +1.29312082802542738236 +1.29211277795685819392 +1.29110514990821623194 +1.29009794411796052671 +1.28909116082400876380 +1.28808480026373595173 +1.28707886267397419999 +1.28607334829101338514 +1.28506825735060159488 +1.28406359008794423993 +1.28305934673770627441 +1.28205552753401108568 +1.28105213271043805179 +1.28004916250002853673 +1.27904661713527989519 +1.27804449684815080168 +1.27704280187005791980 +1.27604153243187790068 +1.27504068876394516252 +1.27404027109605699764 +1.27304027965746757722 +1.27204071467689172614 +1.27104157638250558904 +1.27004286500194574216 +1.26904458076230697294 +1.26804672389014694289 +1.26704929461148307901 +1.26605229315179457217 +1.26505571973602104485 +1.26405957458856499365 +1.26306385793328734835 +1.26206856999351479942 +1.26107371099203180442 +1.26007928115108813749 +1.25908528069239289415 +1.25809170983712159675 +1.25709856880590797878 +1.25610585781885131240 +1.25511357709551196749 +1.25412172685491474233 +1.25313030731554708730 +1.25213931869536132524 +1.25114876121177043267 +1.25015863508165425699 +1.24916894052135396542 +1.24817967774667715197 +1.24719084697289472885 +1.24620244841474181463 +1.24521448228641862244 +1.24422694880159134811 +1.24323984817338861752 +1.24225318061440659356 +1.24126694633670697776 +1.24028114555181501188 +1.23929577847072303065 +1.23831084530389068377 +1.23732634626124160526 +1.23634228155216652212 +1.23535865138552347631 +1.23437545596963627048 +1.23339269551229624433 +1.23241037022076160845 +1.23142848030175833252 +1.23044702596147903506 +1.22946600740558542597 +1.22848542483920497581 +1.22750527846693513467 +1.22652556849284199991 +1.22554629512045742956 +1.22456745855278481550 +1.22358905899229575276 +1.22261109664092915139 +1.22163357170009545527 +1.22065648437067375554 +1.21967983485301134650 +1.21870362334692794448 +1.21772785005171235717 +1.21675251516612181746 +1.21577761888838709048 +1.21480316141620781067 +1.21382914294675403610 +1.21285556367666780275 +1.21188242380206290250 +1.21090972351852332878 +1.20993746302110460888 +1.20896564250433669052 +1.20799426216221772457 +1.20702332218822117049 +1.20605282277529290980 +1.20508276411584880350 +1.20411314640178046531 +1.20314396982445170892 +1.20217523457469832593 +1.20120694084283186065 +1.20023908881863672349 +1.19927167869137019096 +1.19830471064976573636 +1.19733818488202969910 +1.19637210157584261694 +1.19540646091836189058 +1.19444126309621778681 +1.19347650829551699125 +1.19251219670184083199 +1.19154832850024772206 +1.19058490387526960674 +1.18962192301091729263 +1.18865938609067578469 +1.18769729329750672875 +1.18673564481385040992 +1.18577444082162131167 +1.18481368150221300084 +1.18385336703649568513 +1.18289349760481865559 +1.18193407338700651188 +1.18097509456236382519 +1.18001656130967158553 +1.17905847380719142059 +1.17810083223266315322 +1.17714363676330457942 +1.17618688757581302262 +1.17523058484636599985 +1.17427472875061900126 +1.17331931946370859876 +1.17236435716025177989 +1.17140984201434505962 +1.17045577419956492449 +1.16950215388897094115 +1.16854898125509976126 +1.16759625646997267090 +1.16664397970509114977 +1.16569215113143864748 +1.16474077091947947338 +1.16378983923916168308 +1.16283935625991352580 +1.16188932215064810727 +1.16093973707976005905 +1.15999060121512775900 +1.15904191472411177699 +1.15809367777355709528 +1.15714589052979222039 +1.15619855315862918310 +1.15525166582536531479 +1.15430522869478147108 +1.15335924193114380820 +1.15241370569820289482 +1.15146862015919415612 +1.15052398547683898400 +1.14957980181334540326 +1.14863606933040496294 +1.14769278818919695517 +1.14674995855038752701 +1.14580758057412768203 +1.14486565442005616688 +1.14392418024729969339 +1.14298315821447005192 +1.14204258847966899637 +1.14110247120048535763 +1.14016280653399482148 +1.13922359463676259317 +1.13828483566484273126 +1.13734652977377659333 +1.13640867711859550049 +1.13547127785382095944 +1.13453433213346221997 +1.13359784011101938361 +1.13266180193948273747 +1.13172621777133142196 +1.13079108775853698354 +1.12985641205256115427 +1.12892219080435607381 +1.12798842416436451153 +1.12705511228252364120 +1.12612225530825926789 +1.12518985339049049088 +1.12425790667762925956 +1.12332641531757926323 +1.12239537945773704131 +1.12146479924499331560 +1.12053467482572921554 +1.11960500634582271751 +1.11867579395064442593 +1.11774703778505801743 +1.11681873799342246123 +1.11589089471959179711 +1.11496350810691335909 +1.11403657829823066194 +1.11311010543588340127 +1.11218408966170412278 +1.11125853111702421749 +1.11033342994266970294 +1.10940878627896277742 +1.10848460026572315229 +1.10756087204226760790 +1.10663760174740821718 +1.10571478951945656455 +1.10479243549622219156 +1.10387053981500971034 +1.10294910261262502083 +1.10202812402537175807 +1.10110760418905062608 +1.10018754323896361669 +1.09926794130991134502 +1.09834879853619260537 +1.09743011505160792396 +1.09651189098945711642 +1.09559412648253995393 +1.09467682166315727343 +1.09375997666311142176 +1.09284359161370425717 +1.09192766664574092417 +1.09101220188952696688 +1.09009719747487010544 +1.08918265353108134619 +1.08826857018697342738 +1.08735494757086104123 +1.08644178581056372046 +1.08552908503340250768 +1.08461684536620395214 +1.08370506693529655706 +1.08279374986651499846 +1.08188289428519635038 +1.08097250031618452581 +1.08006256808382583579 +1.07915309771197409638 +1.07824408932398796424 +1.07733554304273204671 +1.07642745899057579173 +1.07551983728939704044 +1.07461267806057958474 +1.07370598142501250116 +1.07279974750309436970 +1.07189397641473060929 +1.07098866827933347778 +1.07008382321582451446 +1.06917944134263254163 +1.06827552277769544098 +1.06737206763846037560 +1.06646907604188379004 +1.06556654810443030001 +1.06466448394207602313 +1.06376288367030547022 +1.06286174740411420991 +1.06196107525800864657 +1.06106086734600646437 +1.06016112378163551710 +1.05926184467793538246 +1.05836303014745714002 +1.05746468030226492552 +1.05656679525393415453 +1.05566937511355418700 +1.05477241999172499654 +1.05387592999856249953 +1.05297990524369344811 +1.05208434583626031511 +1.05118925188491885159 +1.05029462349783941910 +1.04940046078270676766 +1.04850676384672092389 +1.04761353279659608084 +1.04672076773856326248 +1.04582846877836876942 +1.04493663602127528911 +1.04404526957206167381 +1.04315436953502294060 +1.04226393601397182564 +1.04137396911223834017 +1.04048446893266977042 +1.03959543557763156585 +1.03870686914900622888 +1.03781876974819753379 +1.03693113747612386533 +1.03604397243322665645 +1.03515727471946483718 +1.03427104443431572278 +1.03338528167677945468 +1.03249998654537522569 +1.03161515913814105794 +1.03073079955263868790 +1.02984690788594934752 +1.02896348423467576261 +1.02808052869494237491 +1.02719804136239734049 +1.02631602233220875497 +1.02543447169906842831 +1.02455338955719166272 +1.02367277600031658658 +1.02279263112170459848 +1.02191295501414169955 +1.02103374776993716111 +1.02015500948092552314 +1.01927674023846592810 +1.01839894013344256507 +1.01752160925626466970 +1.01664474769686785649 +1.01576835554471323064 +1.01489243288878872029 +1.01401697981760885447 +1.01314199641921454109 +1.01226748278117417712 +1.01139343899058387066 +1.01051986513406744095 +1.00964676129777797264 +1.00877412756739515132 +1.00790196402812881615 +1.00703027076471784973 +1.00615904786142928984 +1.00528829540206188220 +1.00441801346994274979 +1.00354820214793094557 +1.00267886151841434383 +1.00180999166331363703 +1.00094159266407922715 +1.00007366460169477840 +0.99920620755667410862 +0.99833922160906529708 +0.99747270683844702077 +0.99660666332393210709 +0.99574109114416597954 +0.99487599037732776797 +0.99401136110113075262 +0.99314720339282236417 +0.99228351732918373962 +0.99142030298653172071 +0.99055756044071741062 +0.98969528976712739521 +0.98883349104068529734 +0.98797216433584977846 +0.98711130972661531580 +0.98625092728651475582 +0.98539101708861609463 +0.98453157920552569760 +0.98367261370938774423 +0.98281412067188456128 +0.98195610016423540145 +0.98109855225719988514 +0.98024147702107533586 +0.97938487452569866765 +0.97852874484044705117 +0.97767308803423802477 +0.97681790417552649686 +0.97596319333231162929 +0.97510895557213028706 +0.97425519096206347758 +0.97340189956873135468 +0.97254908145829799260 +0.97169673669646761116 +0.97084486534848879469 +0.96999346747915171640 +0.96914254315279013685 +0.96829209243328162593 +0.96744211538404800699 +0.96659261206805369149 +0.96574358254780945376 +0.96489502688536921138 +0.96404694514233335578 +0.96319933737984697597 +0.96235220365860230096 +0.96150554403883525811 +0.96065935858033091321 +0.95981364734241947367 +0.95896841038397850898 +0.95812364776343372785 +0.95727935953875853414 +0.95643554576747369378 +0.95559220650664977725 +0.95474934181290405100 +0.95390695174240547338 +0.95306503635087136406 +0.95222359569356784803 +0.95138262982531274226 +0.95054213880047400131 +0.94970212267296949538 +0.94886258149626934166 +0.94802351532339523832 +0.94718492420691902112 +0.94634680819896677129 +0.94550916735121648404 +0.94467200171489784655 +0.94383531134079490243 +0.94299909627924560773 +0.94216335658014016552 +0.94132809229292435660 +0.94049330346659865132 +0.93965899014971676628 +0.93882515239038932808 +0.93799179023628209695 +0.93715890373461585572 +0.93632649293216874131 +0.93549455787527502348 +0.93466309860982554891 +0.93383211518126907347 +0.93300160763461248425 +0.93217157601441835713 +0.93134202036481039677 +0.93051294072946832969 +0.92968433715163256714 +0.92885620967410276183 +0.92802855833923836304 +0.92720138318895706231 +0.92637468426473901228 +0.92554846160762394014 +0.92472271525821270188 +0.92389744525666861463 +0.92307265164271534719 +0.92224833445563947354 +0.92142449373428947368 +0.92060112951707673279 +0.91977824184197642943 +0.91895583074652620326 +0.91813389626782893060 +0.91731243844254928277 +0.91649145730691961020 +0.91567095289673394731 +0.91485092524735389663 +0.91403137439370518713 +0.91321230037028100490 +0.91239370321113910656 +0.91157558294990492787 +0.91075793961977025148 +0.90994077325349465024 +0.90912408388340515408 +0.90830787154139758233 +0.90749213625893399016 +0.90667687806704810871 +0.90586209699633990500 +0.90504779307698102198 +0.90423396633871155892 +0.90342061681084262492 +0.90260774452225478459 +0.90179534950140005645 +0.90098343177630191292 +0.90017199137455483626 +0.89936102832332542878 +0.89855054264935330099 +0.89774053437894907326 +0.89693100353799770641 +0.89612195015195672543 +0.89531337424585766271 +0.89450527584430628014 +0.89369765497148268008 +0.89289051165114097230 +0.89208384590661193858 +0.89127765776079981297 +0.89047194723618605661 +0.88966671435482791441 +0.88886195913835974736 +0.88805768160799181121 +0.88725388178451236598 +0.88645055968828623261 +0.88564771533925790159 +0.88484534875694886846 +0.88404345996046018730 +0.88324204896847124946 +0.88244111579924133792 +0.88164066047060896114 +0.88084068299999307428 +0.88004118340439374535 +0.87924216170039148910 +0.87844361790414704494 +0.87764555203140492967 +0.87684796409748877455 +0.87605085411730665435 +0.87525422210534931100 +0.87445806807568970953 +0.87366239204198370416 +0.87286719401747225877 +0.87207247401497933748 +0.87127823204691479120 +0.87048446812527191518 +0.86969118226162922536 +0.86889837446715234570 +0.86810604475259123269 +0.86731419312828239576 +0.86652281960415045159 +0.86573192418970545958 +0.86494150689404514232 +0.86415156772585599576 +0.86336210669341162394 +0.86257312380457429324 +0.86178461906679559856 +0.86099659248711624127 +0.86020904407216580712 +0.85942197382816531981 +0.85863538176092535359 +0.85784926787584603325 +0.85706363217792080889 +0.85627847467173368035 +0.85549379536145897518 +0.85470959425086567851 +0.85392587134331332521 +0.85314262664175610773 +0.85235986014873998950 +0.85157757186640592462 +0.85079576179648730427 +0.85001442994031362055 +0.84923357629880824593 +0.84845320087248965457 +0.84767330366147242149 +0.84689388466546666745 +0.84611494388377828102 +0.84533648131531080594 +0.84455849695856410886 +0.84378099081163515649 +0.84300396287221979197 +0.84222741313761151360 +0.84145134160470169693 +0.84067574826998114901 +0.83990063312953933128 +0.83912599617906680205 +0.83835183741385221889 +0.83757815682878633545 +0.83680495441835933690 +0.83603223017666350447 +0.83525998409739132811 +0.83448821617383894811 +0.83371692639890304655 +0.83294611476508495507 +0.83217578126448632503 +0.83140592588881445657 +0.83063654862937874590 +0.82986764947709423801 +0.82909922842247940622 +0.82833128545565859469 +0.82756382056635990896 +0.82679683374391876871 +0.82603032497727468808 +0.82526429425497582759 +0.82449874156517510837 +0.82373366689563465304 +0.82296907023372145584 +0.82220495156641282275 +0.82144131088029270771 +0.82067814816155493229 +0.81991546339600140936 +0.81915325656904469653 +0.81839152766570544273 +0.81763027667061582981 +0.81686950356801790729 +0.81610920834176503558 +0.81534939097532121988 +0.81459005145176421880 +0.81383118975378021531 +0.81307280586367169928 +0.81231489976335147229 +0.81155747143434631141 +0.81080052085779652504 +0.81004404801445772932 +0.80928805288469729540 +0.80853253544849934542 +0.80777749568546219905 +0.80702293357480048286 +0.80626884909534335399 +0.80551524222553860799 +0.80476211294344812686 +0.80400946122675209793 +0.80325728705274834773 +0.80250559039835134278 +0.80175437124009529821 +0.80100362955413240140 +0.80025336531623292302 +0.79950357850178765950 +0.79875426908580660079 +0.79800543704291948544 +0.79725708234737779900 +0.79650920497305222057 +0.79576180489343606439 +0.79501488208164383664 +0.79426843651041179051 +0.79352246815209859232 +0.79277697697868698690 +0.79203196296178113300 +0.79128742607260937891 +0.79054336628202481752 +0.78979978356050350996 +0.78905667787814759428 +0.78831404920468373110 +0.78757189750946365869 +0.78683022276146585838 +0.78608902492929499939 +0.78534830398118138373 +0.78460805988498349972 +0.78386829260818724485 +0.78312900211790537064 +0.78239018838087970309 +0.78165185136348080963 +0.78091399103170744400 +0.78017660735118832260 +0.77943970028718245757 +0.77870326980457726940 +0.77796731586789313884 +0.77723183844127918807 +0.77649683748851694443 +0.77576231297301978529 +0.77502826485783316013 +0.77429469310563392437 +0.77356159767873367006 +0.77282897853907572827 +0.77209683564823738955 +0.77136516896743079208 +0.77063397845750214454 +0.76990326407893183713 +0.76917302579183643996 +0.76844326355596748179 +0.76771397733071244929 +0.76698516707509589718 +0.76625683274777933729 +0.76552897430705979520 +0.76480159171087391812 +0.76407468491679486622 +0.76334825388203475516 +0.76262229856344476708 +0.76189681891751492859 +0.76117181490037422176 +0.76044728646779280457 +0.75972323357517956843 +0.75899965617758569092 +0.75827655422970219323 +0.75755392768586293784 +0.75683177650004207493 +0.75611010062585792824 +0.75538890001656877615 +0.75466817462507906900 +0.75394792440393454402 +0.75322814930532655531 +0.75250884928108863203 +0.75179002428270036429 +0.75107167426128595977 +0.75035379916761535402 +0.74963639895210387731 +0.74891947356481358700 +0.74820302295545249027 +0.74748704707337676467 +0.74677154586758787147 +0.74605651928673744067 +0.74534196727912416236 +0.74462788979269556311 +0.74391428677504767286 +0.74320115817342657927 +0.74248850393472765052 +0.74177632400549653457 +0.74106461833192938116 +0.74035338685987439611 +0.73964262953482895480 +0.73893234630194470913 +0.73822253710602281362 +0.73751320189151914342 +0.73680434060254174078 +0.73609595318285248045 +0.73538803957586484916 +0.73468059972464994090 +0.73397363357193035061 +0.73326714106008517025 +0.73256112213114832343 +0.73185557672680989771 +0.73115050478841514536 +0.73044590625696725894 +0.72974178107312503982 +0.72903812917720489661 +0.72833495050918151126 +0.72763224500868750599 +0.72693001261501322130 +0.72622825326710915839 +0.72552696690358386977 +0.72482615346270629075 +0.72412581288240607247 +0.72342594510027158350 +0.72272655005355368463 +0.72202762767916428555 +0.72132917791367590077 +0.72063120069332431417 +0.71993369595400813488 +0.71923666363128679890 +0.71854010366038501001 +0.71784401597619085234 +0.71714840051325534631 +0.71645325720579533524 +0.71575858598769226404 +0.71506438679249162416 +0.71437065955340595114 +0.71367740420331415852 +0.71298462067475965043 +0.71229230889995520659 +0.71160046881077954062 +0.71090910033877818819 +0.71021820341516661568 +0.70952777797082766664 +0.70883782393631300511 +0.70814834124184444786 +0.70745932981731252109 +0.70677078959227812582 +0.70608272049597331499 +0.70539512245729940609 +0.70470799540483064494 +0.70402133926681220721 +0.70333515397116208590 +0.70264943944546898180 +0.70196419561699685552 +0.70127942241268070855 +0.70059511975913058013 +0.69991128758263021492 +0.69922792580913850635 +0.69854503436428738716 +0.69786261317338660337 +0.69718066216141949543 +0.69649918125304621785 +0.69581817037260373926 +0.69513762944410584232 +0.69445755839124323483 +0.69377795713738454886 +0.69309882560557645181 +0.69242016371854420154 +0.69174197139869142426 +0.69106424856810233504 +0.69038699514853940631 +0.68971021106144636548 +0.68903389622794575242 +0.68835805056884336040 +0.68768267400462457228 +0.68700776645545780230 +0.68633332784119183145 +0.68565935808135980434 +0.68498585709517567643 +0.68431282480153898806 +0.68364026111903164473 +0.68296816596592069271 +0.68229653926015554344 +0.68162538091937363571 +0.68095469086089510657 +0.68028446900172723222 +0.67961471525856265163 +0.67894542954778192012 +0.67827661178545062270 +0.67760826188732314890 +0.67694037976884058327 +0.67627296534513325899 +0.67560601853101964753 +0.67493953924100669184 +0.67427352738929080544 +0.67360798288975920478 +0.67294290565598779974 +0.67227829560124408026 +0.67161415263848611712 +0.67095047668036367217 +0.67028726763921764320 +0.66962452542708184033 +0.66896224995568209781 +0.66830044113643760628 +0.66763909888046091279 +0.66697822309855847589 +0.66631781370123033259 +0.66565787059867231878 +0.66499839370077329370 +0.66433938291711980284 +0.66368083815699274730 +0.66302275932936993730 +0.66236514634292498194 +0.66170799910603017580 +0.66105131752675261314 +0.66039510151285962802 +0.65973935097181590770 +0.65908406581078526898 +0.65842924593662888189 +0.65777489125590971053 +0.65712100167488840530 +0.65646757709952752169 +0.65581461743548996601 +0.65516212258813877334 +0.65451009246253932794 +0.65385852696345880819 +0.65320742599536607553 +0.65255678946243345084 +0.65190661726853615932 +0.65125690931725188637 +0.65060766551186399731 +0.64995888575535887277 +0.64931056995042790714 +0.64866271799946728649 +0.64801532980457987598 +0.64736840526757277736 +0.64672194428996088167 +0.64607594677296498187 +0.64543041261751266102 +0.64478534172424040172 +0.64414073399349147664 +0.64349658932531750288 +0.64285290761947944116 +0.64220968877544737374 +0.64156693269239983834 +0.64092463926922649264 +0.64028280840452733713 +0.63964143999661249307 +0.63900053394350397884 +0.63836009014293404462 +0.63772010849234828100 +0.63708058888890439775 +0.63644153122947244583 +0.63580293541063626073 +0.63516480132869279629 +0.63452712887965256883 +0.63388991795924132244 +0.63325316846289991801 +0.63261688028578300091 +0.63198105332276199864 +0.63134568746842456566 +0.63071078261707325119 +0.63007633866272882983 +0.62944235549912863625 +0.62880883301972856358 +0.62817577111770128706 +0.62754316968593870651 +0.62691102861705094718 +0.62627934780336802500 +0.62564812713693962465 +0.62501736650953509944 +0.62438706581264402651 +0.62375722493747798314 +0.62312784377496799326 +0.62249892221576874629 +0.62187046015025537748 +0.62124245746852702066 +0.62061491406040392160 +0.61998782981543132387 +0.61936120462287680422 +0.61873503837173293718 +0.61810933095071607379 +0.61748408224826889512 +0.61685929215255741465 +0.61623496055147497508 +0.61561108733263947279 +0.61498767238339702157 +0.61436471559081939908 +0.61374221684170693347 +0.61312017602258594984 +0.61249859301971276704 +0.61187746771907025600 +0.61125680000637250266 +0.61063658976706103321 +0.61001683688630825575 +0.60939754124901568400 +0.60877870273981693483 +0.60816032124307528584 +0.60754239664288500755 +0.60692492882307391699 +0.60630791766720093516 +0.60569136305855675317 +0.60507526488016705191 +0.60445962301478850520 +0.60384443734491322076 +0.60322970775276751887 +0.60261543412031159939 +0.60200161632924076294 +0.60138825426098574400 +0.60077534779671304399 +0.60016289681732593042 +0.59955090120346332672 +0.59893936083550225469 +0.59832827559355650227 +0.59771764535747695657 +0.59710747000685415742 +0.59649774942101607689 +0.59588848347903078384 +0.59527967205970522269 +0.59467131504158576849 +0.59406341230295933720 +0.59345596372185349665 +0.59284896917603724376 +0.59224242854302033834 +0.59163634170005541257 +0.59103070852413575054 +0.59042552889199817479 +0.58982080268012293534 +0.58921652976473293251 +0.58861271002179571532 +0.58800934332702292640 +0.58740642955586974683 +0.58680396858353767175 +0.58620196028497317808 +0.58560040453486850165 +0.58499930120766285846 +0.58439865017754155652 +0.58379845131843643991 +0.58319870450402744311 +0.58259940960774236896 +0.58200056650275733272 +0.58140217506199687314 +0.58080423515813539570 +0.58020674666359539629 +0.57960970945054968162 +0.57901312339092181336 +0.57841698835638655218 +0.57782130421836819245 +0.57722607084804378186 +0.57663128811634167814 +0.57603695589394232623 +0.57544307405127947952 +0.57484964245853942266 +0.57425666098566230389 +0.57366412950234257906 +0.57307204787802767942 +0.57248041598192012103 +0.57188923368297861494 +0.57129850084991629089 +0.57070821735120236262 +0.57011838305506257196 +0.56952899782947941087 +0.56894006154219156635 +0.56835157406069658492 +0.56776353525224887431 +0.56717594498386181279 +0.56658880312230652798 +0.56600210953411456138 +0.56541586408557531485 +0.56483006664273971431 +0.56424471707141754528 +0.56365981523718078350 +0.56307536100536115242 +0.56249135424105234371 +0.56190779480910979515 +0.56132468257415191193 +0.56074201740055884535 +0.56015979915247449128 +0.55957802769380560193 +0.55899670288822367326 +0.55841582459916327963 +0.55783539268982507142 +0.55725540702317355457 +0.55667586746193986613 +0.55609677386861955384 +0.55551812610547601778 +0.55493992403453773488 +0.55436216751760158949 +0.55378485641623131919 +0.55320799059175873591 +0.55263156990528339296 +0.55205559421767469441 +0.55148006338956923056 +0.55090497728137466371 +0.55033033575326795184 +0.54975613866519634776 +0.54918238587687739916 +0.54860907724780094696 +0.54803621263722590573 +0.54746379190418514860 +0.54689181490748306480 +0.54632028150569700298 +0.54574919155717627195 +0.54517854492004513833 +0.54460834145220038405 +0.54403858101131330471 +0.54346926345483059784 +0.54290038863997358565 +0.54233195642373843715 +0.54176396666289705628 +0.54119641921399863627 +0.54062931393336788322 +0.54006265067710745864 +0.53949642930109653616 +0.53893064966099257784 +0.53836531161223044606 +0.53780041501002484594 +0.53723595970936843802 +0.53667194556503383662 +0.53610837243157316578 +0.53554524016331894742 +0.53498254861438332419 +0.53442029763866027992 +0.53385848708982519550 +0.53329711682133462691 +0.53273618668642785945 +0.53217569653812646369 +0.53161564622923429546 +0.53105603561233916121 +0.53049686453981270695 +0.52993813286381064032 +0.52937984043627261954 +0.52882198710892380777 +0.52826457273327398489 +0.52770759716061910183 +0.52715106024204105850 +0.52659496182840814793 +0.52603930177037605542 +0.52548407991838708142 +0.52492929612267047457 +0.52437495023324542931 +0.52382104209991753319 +0.52326757157228298567 +0.52271453849972593364 +0.52216194273142080284 +0.52160978411633118768 +0.52105806250321218265 +0.52050677774060860603 +0.51995592967685722030 +0.51940551816008662112 +0.51885554303821590505 +0.51830600415895755617 +0.51775690136981689093 +0.51720823451809172511 +0.51666000345087448320 +0.51611220801505042211 +0.51556484805729929644 +0.51501792342409569159 +0.51447143396170924579 +0.51392537951620520520 +0.51337975993344497905 +0.51283457505908536245 +0.51228982473858075686 +0.51174550881718128270 +0.51120162713993555492 +0.51065817955169034992 +0.51011516589708949532 +0.50957258602057564634 +0.50903043976639172907 +0.50848872697857838698 +0.50794744750097631236 +0.50740660117722757860 +0.50686618785077319771 +0.50632620736485633994 +0.50578665956252077951 +0.50524754428661211580 +0.50470886137977788444 +0.50417061068446911154 +0.50363279204293842639 +0.50309540529724194879 +0.50255845028923995521 +0.50202192686059632365 +0.50148583485277942184 +0.50095017410706299543 +0.50041494446452527978 +0.49988014576604977712 +0.49934577785232736602 +0.49881184056385363679 +0.49827833374093177810 +0.49774525722367202185 +0.49721261085199230934 +0.49668039446561806916 +0.49614860790408321645 +0.49561725100673009736 +0.49508632361271054378 +0.49455582556098548475 +0.49402575669032605665 +0.49349611683931282613 +0.49296690584633806598 +0.49243812354960392330 +0.49190976978712436241 +0.49138184439672571990 +0.49085434721604576103 +0.49032727808253451229 +0.48980063683345576031 +0.48927442330588555297 +0.48874863733671441990 +0.48822327876264720592 +0.48769834742020218288 +0.48717384314571332560 +0.48664976577532892410 +0.48612611514501358201 +0.48560289109054760592 +0.48508009344752800462 +0.48455772205136871111 +0.48403577673729930586 +0.48351425734036829196 +0.48299316369544154082 +0.48247249563720356891 +0.48195225300015714920 +0.48143243561862447688 +0.48091304332674650324 +0.48039407595848437893 +0.47987553334761950952 +0.47935741532775366647 +0.47883972173231020841 +0.47832245239453302643 +0.47780560714748776530 +0.47728918582406215654 +0.47677318825696674010 +0.47625761427873486431 +0.47574246372172290798 +0.47522773641811144607 +0.47471343219990391749 +0.47419955089892840139 +0.47368609234683872744 +0.47317305637511247740 +0.47266044281505420477 +0.47214825149779321434 +0.47163648225428517202 +0.47112513491531260446 +0.47061420931148528757 +0.47010370527323980250 +0.46959362263084142297 +0.46908396121438250548 +0.46857472085378498727 +0.46806590137879822144 +0.46755750261900264064 +0.46704952440380692602 +0.46654196656245050523 +0.46603482892400344140 +0.46552811131736560046 +0.46502181357126892713 +0.46451593551427639017 +0.46401047697478298160 +0.46350543778101671588 +0.46300081776103724218 +0.46249661674273778722 +0.46199283455384437813 +0.46148947102191756331 +0.46098652597435224587 +0.46048399923837740610 +0.45998189064105649004 +0.45948020000928929685 +0.45897892716981031347 +0.45847807194919065754 +0.45797763417383807738 +0.45747761366999645238 +0.45697801026374701427 +0.45647882378100940182 +0.45598005404753949588 +0.45548170088893263907 +0.45498376413062285861 +0.45448624359788336591 +0.45398913911582539082 +0.45349245050940173440 +0.45299617760340410433 +0.45250032022246505781 +0.45200487819105866771 +0.45150985133349991196 +0.45101523947394422942 +0.45052104243639140568 +0.45002726004468113219 +0.44953389212249761364 +0.44904093849336779165 +0.44854839898066156678 +0.44805627340759318633 +0.44756456159722118882 +0.44707326337244801540 +0.44658237855602200828 +0.44609190697053641150 +0.44560184843843020364 +0.44511220278198815326 +0.44462296982334248430 +0.44413414938447076663 +0.44364574128719880264 +0.44315774535319990557 +0.44267016140399528812 +0.44218298926095395140 +0.44169622874529390621 +0.44120987967808228403 +0.44072394188023517048 +0.44023841517251915967 +0.43975329937555107662 +0.43926859430979658949 +0.43878429979557437290 +0.43830041565305288831 +0.43781694170225282647 +0.43733387776304694095 +0.43685122365515993703 +0.43636897919816919345 +0.43588714421150548395 +0.43540571851445281082 +0.43492470192614912650 +0.43444409426558633358 +0.43396389535161133955 +0.43348410500292539060 +0.43300472303808479335 +0.43252574927550219153 +0.43204718353344589987 +0.43156902563004090334 +0.43109127538326813545 +0.43061393261096653218 +0.43013699713083125564 +0.42966046876041641411 +0.42918434731713384078 +0.42870863261825409296 +0.42823332448090634106 +0.42775842272207925676 +0.42728392715862056894 +0.42680983760723878451 +0.42633615388450230022 +0.42586287580684017984 +0.42539000319054320887 +0.42491753585176261776 +0.42444547360651141421 +0.42397381627066571541 +0.42350256365996369334 +0.42303171559000629642 +0.42256127187625763808 +0.42209123233404571840 +0.42162159677856153595 +0.42115236502486197434 +0.42068353688786730427 +0.42021511218236323737 +0.41974709072300137036 +0.41927947232429807478 +0.41881225680063627337 +0.41834544396626555107 +0.41787903363530193301 +0.41741302562172910573 +0.41694741973939813962 +0.41648221580202771097 +0.41601741362320426854 +0.41555301301638425393 +0.41508901379489193673 +0.41462541577192141284 +0.41416221876053638251 +0.41369942257367048333 +0.41323702702412734578 +0.41277503192458186998 +0.41231343708758028122 +0.41185224232553985235 +0.41139144745074929244 +0.41093105227537035651 +0.41047105661143640232 +0.41001146027085422219 +0.40955226306540387649 +0.40909346480673902668 +0.40863506530638643577 +0.40817706437574868827 +0.40771946182610097065 +0.40726225746859529009 +0.40680545111425825411 +0.40634904257399251382 +0.40589303165857570921 +0.40543741817866318922 +0.40498220194478634637 +0.40452738276735361600 +0.40407296045665158646 +0.40361893482284411094 +0.40316530567597275159 +0.40271207282595877786 +0.40225923608260116815 +0.40180679525557855269 +0.40135475015444926905 +0.40090310058865186171 +0.40045184636750408291 +0.40000098730020516857 +0.39955052319583528320 +0.39910045386335535333 +0.39865077911160828883 +0.39820149874931959344 +0.39775261258509553297 +0.39730412042742713208 +0.39685602208468673258 +0.39640831736513099104 +0.39596100607689993511 +0.39551408802801818476 +0.39506756302639400857 +0.39462143087982148870 +0.39417569139597841144 +0.39373034438242943134 +0.39328538964662429489 +0.39284082699589911725 +0.39239665623747643775 +0.39195287717846610809 +0.39150948962586418212 +0.39106649338655508075 +0.39062388826731098135 +0.39018167407479265041 +0.38973985061554844433 +0.38929841769601636337 +0.38885737512252344095 +0.38841672270128685396 +0.38797646023841281249 +0.38753658753989905783 +0.38709710441163258654 +0.38665801065939209291 +0.38621930608884785796 +0.38578099050556130534 +0.38534306371498600052 +0.38490552552246865003 +0.38446837573324726955 +0.38403161415245351540 +0.38359524058511285105 +0.38315925483614421410 +0.38272365671036029378 +0.38228844601246880774 +0.38185362254707133634 +0.38141918611866515443 +0.38098513653164273185 +0.38055147359029239951 +0.38011819709879857143 +0.37968530686124257745 +0.37925280268160160846 +0.37882068436375004872 +0.37838895171146058605 +0.37795760452840299060 +0.37752664261814528057 +0.37709606578415449940 +0.37666587382979571652 +0.37623606655833313761 +0.37580664377293088174 +0.37537760527665303689 +0.37494895087246304932 +0.37452068036322605504 +0.37409279355170677039 +0.37366529024057160147 +0.37323817023238836654 +0.37281143332962696224 +0.37238507933465930799 +0.37195910804975962360 +0.37153351927710509539 +0.37110831281877615373 +0.37068348847675647306 +0.37025904605293380456 +0.36983498534910014266 +0.36941130616695155853 +0.36898800830808947682 +0.36856509157401984300 +0.36814255576615451115 +0.36772040068581146599 +0.36729862613421437878 +0.36687723191249310695 +0.36645621782168552594 +0.36603558366273486469 +0.36561532923649370241 +0.36519545434372102655 +0.36477595878508500826 +0.36435684236116122614 +0.36393810487243510865 +0.36351974611930026882 +0.36310176590206039160 +0.36268416402092917838 +0.36226694027602962533 +0.36185009446739563321 +0.36143362639497222943 +0.36101753585861451334 +0.36060182265809020974 +0.36018648659307794802 +0.35977152746316931609 +0.35935694506786680646 +0.35894273920658753552 +0.35852890967866007932 +0.35811545628332719371 +0.35770237881974525918 +0.35728967708698500250 +0.35687735088403077510 +0.35646540000978221840 +0.35605382426305348664 +0.35564262344257457915 +0.35523179734699084076 +0.35482134577486418303 +0.35441126852467164099 +0.35400156539480859275 +0.35359223618358531782 +0.35318328068923110497 +0.35277469870989208722 +0.35236649004363240767 +0.35195865448843471901 +0.35155119184219985051 +0.35114410190274775170 +0.35073738446781727029 +0.35033103933506737349 +0.34992506630207687035 +0.34951946516634402329 +0.34911423572528826886 +0.34870937777624938514 +0.34830489111648865741 +0.34790077554318893371 +0.34749703085345440279 +0.34709365684431187082 +0.34669065331270970676 +0.34628802005552000720 +0.34588575686953743071 +0.34548386355148008597 +0.34508233989798992036 +0.34468118570563255343 +0.34428040077089799853 +0.34387998489020116244 +0.34347993785988195636 +0.34308025947620512941 +0.34268094953536160086 +0.34228200783346757197 +0.34188343416656608031 +0.34148522833062600057 +0.34108739012154387638 +0.34068991933514286563 +0.34029281576717407276 +0.33989607921331582707 +0.33949970946917479298 +0.33910370633028619203 +0.33870806959211391396 +0.33831279905005084974 +0.33791789449941989076 +0.33752335573547254111 +0.33712918255339058282 +0.33673537474828674210 +0.33634193211520374556 +0.33594885444911565253 +0.33555614154492752199 +0.33516379319747624521 +0.33477180920152971311 +0.33438018935178909219 +0.33398893344288738128 +0.33359804126939091029 +0.33320751262579867413 +0.33281734730654310983 +0.33242754510599031859 +0.33203810581844067640 +0.33164902923812888957 +0.33126031515922416126 +0.33087196337583091310 +0.33048397368198889623 +0.33009634587167235864 +0.32970907973879276520 +0.32932217507719757643 +0.32893563168067019298 +0.32854944934293078829 +0.32816362785763764087 +0.32777816701838508040 +0.32739306661870631876 +0.32700832645207184024 +0.32662394631189095584 +0.32623992599151124816 +0.32585626528421962611 +0.32547296398324165878 +0.32509002188174312975 +0.32470743877282937095 +0.32432521444954587331 +0.32394334870487867528 +0.32356184133175436290 +0.32318069212304084692 +0.32279990087154736278 +0.32241946737002480372 +0.32203939141116610934 +0.32165967278760609904 +0.32128031129192285986 +0.32090130671663691375 +0.32052265885421193925 +0.32014436749705504903 +0.31976643243751790013 +0.31938885346789519515 +0.31901163038042662512 +0.31863476296729614790 +0.31825825102063309835 +0.31788209433251218838 +0.31750629269495350693 +0.31713084589992279749 +0.31675575373933240186 +0.31638101600504042743 +0.31600663248885302314 +0.31563260298252210356 +0.31525892727774784685 +0.31488560516617747354 +0.31451263643940685633 +0.31414002088897929887 +0.31376775830638709008 +0.31339584848307172615 +0.31302429121042346649 +0.31265308627978172229 +0.31228223348243633328 +0.31191173260962640201 +0.31154158345254184814 +0.31117178580232335294 +0.31080233945006241481 +0.31043324418680123822 +0.31006449980353378848 +0.30969610609120618028 +0.30932806284071640013 +0.30896036984291486149 +0.30859302688860440478 +0.30822603376854118551 +0.30785939027343411922 +0.30749309619394604720 +0.30712715132069362545 +0.30676155544424765775 +0.30639630835513359530 +0.30603140984383075951 +0.30566685970077417389 +0.30530265771635417549 +0.30493880368091613731 +0.30457529738476191161 +0.30421213861814966339 +0.30384932717129292667 +0.30348686283436260291 +0.30312474539748712754 +0.30276297465075147075 +0.30240155038419846978 +0.30204047238782899543 +0.30167974045160189656 +0.30131935436543438867 +0.30095931391920260900 +0.30059961890274167207 +0.30024026910584605821 +0.29988126431827016871 +0.29952260432972749316 +0.29916428892989194166 +0.29880631790839834450 +0.29844869105484195249 +0.29809140815877904762 +0.29773446900972727613 +0.29737787339716598156 +0.29702162111053553861 +0.29666571193923974015 +0.29631014567264424286 +0.29595492210007712242 +0.29560004101083020567 +0.29524550219415790497 +0.29489130543927799533 +0.29453745053537294663 +0.29418393727158892448 +0.29383076543703656736 +0.29347793482079104210 +0.29312544521189276558 +0.29277329639934679406 +0.29242148817212443301 +0.29207002031916240448 +0.29171889262936395726 +0.29136810489159781223 +0.29101765689470016074 +0.29066754842747377641 +0.29031777927868845923 +0.28996834923708181275 +0.28961925809135941057 +0.28927050563019413021 +0.28892209164222765194 +0.28857401591606995916 +0.28822627824030006005 +0.28787887840346615409 +0.28753181619408602065 +0.28718509140064640839 +0.28683870381160486707 +0.28649265321538847084 +0.28614693940039526154 +0.28580156215499386008 +0.28545652126752407707 +0.28511181652629680183 +0.28476744771959516811 +0.28442341463567288873 +0.28407971706275703117 +0.28373635478904690732 +0.28339332760271412903 +0.28305063529190316318 +0.28270827764473221988 +0.28236625444929264184 +0.28202456549364962601 +0.28168321056584266771 +0.28134218945388522748 +0.28100150194576506424 +0.28066114782944584505 +0.28032112689286525775 +0.27998143892393689836 +0.27964208371054999347 +0.27930306104056984440 +0.27896437070183732754 +0.27862601248217044869 +0.27828798616936373245 +0.27795029155118866626 +0.27761292841539381149 +0.27727589654970569155 +0.27693919574182818133 +0.27660282577944372839 +0.27626678645021240932 +0.27593107754177353952 +0.27559569884174489607 +0.27526065013772382795 +0.27492593121728653438 +0.27459154186798900854 +0.27425748187736742612 +0.27392375103293786776 +0.27359034912219704072 +0.27325727593262244541 +0.27292453125167209782 +0.27259211486678558423 +0.27226002656538417224 +0.27192826613487047771 +0.27159683336262924191 +0.27126572803602783113 +0.27093494994241584806 +0.27060449886912529838 +0.27027437460347197851 +0.26994457693275480947 +0.26961510564425600345 +0.26928596052524206295 +0.26895714136296322572 +0.26862864794465390883 +0.26830048005753365237 +0.26797263748880684187 +0.26764512002566248627 +0.26731792745527566124 +0.26699105956480650992 +0.26666451614140124216 +0.26633829697219235655 +0.26601240184429891800 +0.26568683054482639117 +0.26536158286086719560 +0.26503665857950120532 +0.26471205748779519373 +0.26438777937280422137 +0.26406382402157091427 +0.26374019122112640767 +0.26341688075849029049 +0.26309389242067054981 +0.26277122599466418151 +0.26244888126745763435 +0.26212685802602675444 +0.26180515605733734041 +0.26148377514834469926 +0.26116271508599486761 +0.26084197565722389012 +0.26052155664895859655 +0.26020145784811743450 +0.25988167904160941468 +0.25956222001633560970 +0.25924308055918826588 +0.25892426045705152493 +0.25860575949680253416 +0.25828757746531044726 +0.25796971414943725698 +0.25765216933603773963 +0.25733494281196023223 +0.25701803436404629943 +0.25670144377913128864 +0.25638517084404499613 +0.25606921534561077891 +0.25575357707064660939 +0.25543825580596551950 +0.25512325133837515656 +0.25480856345467861601 +0.25449419194167427483 +0.25418013658615673522 +0.25386639717491560342 +0.25355297349473765456 +0.25323986533240533392 +0.25292707247469820020 +0.25261459470839275898 +0.25230243182026279580 +0.25199058359707893207 +0.25167904982561034588 +0.25136783029262299571 +0.25105692478488206287 +0.25074633308915045271 +0.25043605499219012689 +0.25012609028076165929 +0.24981643874162490215 +0.24950710016153862525 +0.24919807432726176488 +0.24888936102555284102 +0.24858096004317081773 +0.24827287116687410395 +0.24796509418342266295 +0.24765762887957665228 +0.24735047504209733971 +0.24704363245774746405 +0.24673710091329145722 +0.24643088019549472256 +0.24612497009112552226 +0.24581937038695381159 +0.24551408086975221035 +0.24520910132629608613 +0.24490443154336402620 +0.24460007130773678274 +0.24429602040619985415 +0.24399227862554126456 +0.24368884575255356228 +0.24338572157403334795 +0.24308290587678155203 +0.24278039844760340715 +0.24247819907330925293 +0.24217630754071450827 +0.24187472363663967134 +0.24157344714791118001 +0.24127247786136069019 +0.24097181556382638035 +0.24067146004215195232 +0.24037141108318840765 +0.24007166847379282637 +0.23977223200082944943 +0.23947310145116987301 +0.23917427661169274322 +0.23887575726928420017 +0.23857754321083846083 +0.23827963422325798559 +0.23798203009345328396 +0.23768473060834383048 +0.23738773555485709332 +0.23709104471992994978 +0.23679465789050860303 +0.23649857485354866538 +0.23620279539601529706 +0.23590731930488387236 +0.23561214636713950776 +0.23531727636977756157 +0.23502270909980457758 +0.23472844434423753568 +0.23443448189010443472 +0.23414082152444484763 +0.23384746303430972714 +0.23355440620676098940 +0.23326165082887365121 +0.23296919668773419243 +0.23267704357044186048 +0.23238519126410833726 +0.23209363955585773920 +0.23180238823282800498 +0.23151143708216995187 +0.23122078589104816393 +0.23093043444664035357 +0.23064038253613888818 +0.23035062994675006842 +0.23006117646569432256 +0.22977202188020698359 +0.22948316597753823376 +0.22919460854495332658 +0.22890634936973272562 +0.22861838823917221553 +0.22833072494058340163 +0.22804335926129440382 +0.22775629098864857980 +0.22746951991000666227 +0.22718304581274448295 +0.22689686848425683063 +0.22661098771195345436 +0.22632540328326256063 +0.22604011498562953664 +0.22575512260651747765 +0.22547042593340776984 +0.22518602475379881356 +0.22490191885520835480 +0.22461810802517237495 +0.22433459205124584024 +0.22405137072100239637 +0.22376844382203464612 +0.22348581114195575914 +0.22320347246839733479 +0.22292142758901103972 +0.22263967629146927396 +0.22235821836346383873 +0.22207705359270793477 +0.22179618176693469134 +0.22151560267389822090 +0.22123531610137422976 +0.22095532183715957397 +0.22067561966907273119 +0.22039620938495313451 +0.22011709077266394807 +0.21983826362008856981 +0.21955972771513390662 +0.21928148284572948623 +0.21900352879982729060 +0.21872586536540253310 +0.21844849233045346426 +0.21817140948300173253 +0.21789461661109313373 +0.21761811350279686161 +0.21734189994620659037 +0.21706597572943950314 +0.21679034064063837373 +0.21651499446796970694 +0.21623993699962529291 +0.21596516802382223488 +0.21569068732880264383 +0.21541649470283447121 +0.21514258993421089827 +0.21486897281125136305 +0.21459564312230139382 +0.21432260065573313645 +0.21404984519994518788 +0.21377737654336209649 +0.21350519447443644383 +0.21323329878164742901 +0.21296168925350200674 +0.21269036567853416564 +0.21241932784530603850 +0.21214857554240784676 +0.21187810855845759517 +0.21160792668210162693 +0.21133802970201545635 +0.21106841740690288067 +0.21079908958549711806 +0.21053004602655975286 +0.21026128651888259524 +0.20999281085128657098 +0.20972461881262291494 +0.20945671019177228289 +0.20918908477764561193 +0.20892174235918478664 +0.20865468272536116801 +0.20838790566517811920 +0.20812141096766909043 +0.20785519842189909001 +0.20758926781696510067 +0.20732361894199408114 +0.20705825158614610260 +0.20679316553861301631 +0.20652836058861837043 +0.20626383652541868674 +0.20599959313830257246 +0.20573563021659169170 +0.20547194754964004382 +0.20520854492683557324 +0.20494542213759897598 +0.20468257897138503187 +0.20442001521768196626 +0.20415773066601136665 +0.20389572510592995913 +0.20363399832702791525 +0.20337255011893060064 +0.20311138027129763128 +0.20285048857382362297 +0.20258987481623838556 +0.20232953878830645111 +0.20206948027982862826 +0.20180969908064089191 +0.20155019498061507721 +0.20129096776965949012 +0.20103201723771776943 +0.20077334317477069092 +0.20051494537083555669 +0.20025682361596613967 +0.19999897770025390487 +0.19974140741382598319 +0.19948411254684919602 +0.19922709288952539231 +0.19897034823209600041 +0.19871387836483944689 +0.19845768307807257202 +0.19820176216215096288 +0.19794611540746731571 +0.19769074260445437807 +0.19743564354358325574 +0.19718081801536402331 +0.19692626581034633482 +0.19667198671911825802 +0.19641798053230907772 +0.19616424704058640915 +0.19591078603465841845 +0.19565759730527357285 +0.19540468064322027986 +0.19515203583932830278 +0.19489966268446670683 +0.19464756096954630160 +0.19439573048551922474 +0.19414417102337852561 +0.19389288237415860938 +0.19364186432893498724 +0.19339111667882660783 +0.19314063921499249887 +0.19289043172863493125 +0.19264049401099828107 +0.19239082585336936271 +0.19214142704707806719 +0.19189229738349633525 +0.19164343665403985040 +0.19139484465016720627 +0.19114652116338085031 +0.19089846598522652865 +0.19065067890729309186 +0.19040315972121515942 +0.19015590821866926174 +0.18990892419137764269 +0.18966220743110681624 +0.18941575772966764979 +0.18916957487891622458 +0.18892365867075305852 +0.18867800889712435519 +0.18843262535002155977 +0.18818750782148166434 +0.18794265610358748542 +0.18769806998846719215 +0.18745374926829555529 +0.18720969373529344759 +0.18696590318172798262 +0.18672237739991331962 +0.18647911618220988639 +0.18623611932102523969 +0.18599338660881387097 +0.18575091783807759493 +0.18550871280136596586 +0.18526677129127605559 +0.18502509310045242574 +0.18478367802158768285 +0.18454252584742278365 +0.18430163637074678529 +0.18406100938439748371 +0.18382064468126099732 +0.18358054205427243311 +0.18334070129641605318 +0.18310112220072458089 +0.18286180456028069963 +0.18262274816821663648 +0.18238395281771380141 +0.18214541830200403627 +0.18190714441436833804 +0.18166913094813852414 +0.18143137769669653858 +0.18119388445347506256 +0.18095665101195687607 +0.18071967716567613471 +0.18048296270821795328 +0.18024650743321790625 +0.18001031113436369302 +0.17977437360539427758 +0.17953869464010011048 +0.17930327403232376726 +0.17906811157595925454 +0.17883320706495331454 +0.17859856029330450911 +0.17836417105506441327 +0.17813003914433686581 +0.17789616435527838556 +0.17766254648209911515 +0.17742918531906137769 +0.17719608066048131434 +0.17696323230072869004 +0.17673064003422639390 +0.17649830365545177147 +0.17626622295893495940 +0.17603439773926171652 +0.17580282779107050950 +0.17557151290905531615 +0.17534045288796440420 +0.17510964752260010924 +0.17487909660782099963 +0.17464879993853921203 +0.17441875730972308811 +0.17418896851639611989 +0.17395943335363692195 +0.17373015161658067473 +0.17350112310041701513 +0.17327234760039328387 +0.17304382491181130588 +0.17281555483003022133 +0.17258753715046587507 +0.17235977166858928999 +0.17213225817993019207 +0.17190499648007354083 +0.17167798636466252704 +0.17145122762939699057 +0.17122472007003444738 +0.17099846348238997851 +0.17077245766233578594 +0.17054670240580280249 +0.17032119750877935949 +0.17009594276731229701 +0.16987093797750679736 +0.16964618293552558015 +0.16942167743759184440 +0.16919742127998557701 +0.16897341425904696677 +0.16874965617117501648 +0.16852614681282712672 +0.16830288598052173255 +0.16807987347083527818 +0.16785710908040449296 +0.16763459260592600275 +0.16741232384415624668 +0.16719030259191214327 +0.16696852864606989697 +0.16674700180356763490 +0.16652572186140265909 +0.16630468861663391666 +0.16608390186638100072 +0.16586336140782365067 +0.16564306703820469435 +0.16542301855482624551 +0.16520321575505303446 +0.16498365843631124239 +0.16476434639608852906 +0.16454527943193480999 +0.16432645734146134053 +0.16410787992234274202 +0.16388954697231475355 +0.16367145828917636918 +0.16345361367078906079 +0.16323601291507652822 +0.16301865582002647570 +0.16280154218368847463 +0.16258467180417612852 +0.16236804447966601828 +0.16215166000839817406 +0.16193551818867685244 +0.16171961881886876000 +0.16150396169740627306 +0.16128854662278424570 +0.16107337339356267436 +0.16085844180836569861 +0.16064375166588137911 +0.16042930276486361274 +0.16021509490412966237 +0.16000112788256251606 +0.15978740149911010993 +0.15957391555278530038 +0.15936066984266694657 +0.15914766416789802306 +0.15893489832768870063 +0.15872237212131359851 +0.15851008534811392159 +0.15829803780749698849 +0.15808622929893506592 +0.15787465962196881031 +0.15766332857620315999 +0.15745223596131086019 +0.15724138157703110297 +0.15703076522316991581 +0.15682038669960018940 +0.15661024580626156655 +0.15640034234316205208 +0.15619067611037570908 +0.15598124690804487935 +0.15577205453637962829 +0.15556309879565688448 +0.15535437948622304871 +0.15514589640849094088 +0.15493764936294257550 +0.15472963815012785727 +0.15452186257066549691 +0.15431432242524245613 +0.15410701751461414188 +0.15389994763960601620 +0.15369311260111084838 +0.15348651220009165708 +0.15328014623758071111 +0.15307401451467847475 +0.15286811683255668859 +0.15266245299245517764 +0.15245702279568429383 +0.15225182604362422212 +0.15204686253772484172 +0.15184213207950691960 +0.15163763447056022304 +0.15143336951254651734 +0.15122933700719659589 +0.15102553675631302799 +0.15082196856176866007 +0.15061863222550697650 +0.15041552754954357063 +0.15021265433596386885 +0.15001001238692573958 +0.14980760150465774472 +0.14960542149146000002 +0.14940347214970509104 +0.14920175328183646335 +0.14900026469037011556 +0.14879900617789371120 +0.14859797754706738360 +0.14839717860062359711 +0.14819660914136650876 +0.14799626897217435517 +0.14779615789599648279 +0.14759627571585579031 +0.14739662223484814585 +0.14719719725614197059 +0.14699800058297990413 +0.14679903201867650075 +0.14660029136662081073 +0.14640177843027479820 +0.14620349301317450696 +0.14600543491892967185 +0.14580760395122333017 +0.14560999991381379237 +0.14541262261053217175 +0.14521547184528477148 +0.14501854742205202986 +0.14482184914488838157 +0.14462537681792400623 +0.14442913024536249700 +0.14423310923148335849 +0.14403731358064061907 +0.14384174309726349694 +0.14364639758585656670 +0.14345127685099900994 +0.14325638069734680791 +0.14306170892963035457 +0.14286726135265609416 +0.14267303777130665998 +0.14247903799053956986 +0.14228526181539000173 +0.14209170905096774051 +0.14189837950245967613 +0.14170527297512894305 +0.14151238927431497583 +0.14131972820543431402 +0.14112728957397921437 +0.14093507318552031538 +0.14074307884570386173 +0.14055130636025359170 +0.14035975553497115342 +0.14016842617573396779 +0.13997731808849867008 +0.13978643107929789036 +0.13959576495424286247 +0.13940531951952217504 +0.13921509458140235438 +0.13902508994622828076 +0.13883530542042177292 +0.13864574081048464116 +0.13845639592299521792 +0.13826727056461149412 +0.13807836454206959265 +0.13788967766218379607 +0.13770120973184837854 +0.13751296055803494123 +0.13732492994779532669 +0.13713711770825975922 +0.13694952364663798283 +0.13676214757021903923 +0.13657498928637082369 +0.13638804860254175044 +0.13620132532625897626 +0.13601481926512976051 +0.13582853022684154842 +0.13564245801916055556 +0.13545660244993493193 +0.13527096332709112603 +0.13508554045863682691 +0.13490033365266010379 +0.13471534271732929500 +0.13453056746089361861 +0.13434600769168195122 +0.13416166321810579776 +0.13397753384865584980 +0.13379361939190465014 +0.13360991965650589886 +0.13342643445119378720 +0.13324316358478510702 +0.13306010686617672500 +0.13287726410434783086 +0.13269463510835913245 +0.13251221968735285572 +0.13233001765055349419 +0.13214802880726672640 +0.13196625296688127560 +0.13178468993886705007 +0.13160333953277669750 +0.13142220155824552164 +0.13124127582499006683 +0.13106056214281125438 +0.13088006032159102410 +0.13069977017129474905 +0.13051969150197095804 +0.13033982412375011428 +0.13016016784684719676 +0.12998072248155892461 +0.12980148783826603309 +0.12962246372743252421 +0.12944364995960577769 +0.12926504634541674532 +0.12908665269557950683 +0.12890846882089304626 +0.12873049453223897598 +0.12855272964058345186 +0.12837517395697684019 +0.12819782729255291276 +0.12802068945853056769 +0.12784376026621219191 +0.12766703952698513214 +0.12749052705232100102 +0.12731422265377631553 +0.12713812614299199732 +0.12696223733169348380 +0.12678655603169206034 +0.12661108205488294520 +0.12643581521324706585 +0.12626075531885061487 +0.12608590218384418957 +0.12591125562046506792 +0.12573681544103476604 +0.12556258145796106440 +0.12538855348373709186 +0.12521473133094199182 +0.12504111481224053359 +0.12486770374038300147 +0.12469449792820683220 +0.12452149718863426975 +0.12434870133467444686 +0.12417611017942298268 +0.12400372353606090026 +0.12383154121785712454 +0.12365956303816570683 +0.12348778881042822564 +0.12331621834817273198 +0.12314485146501426283 +0.12297368797465459134 +0.12280272769088229623 +0.12263197042757371935 +0.12246141599869160566 +0.12229106421828636608 +0.12212091490049604980 +0.12195096785954516461 +0.12178122290974720265 +0.12161167986550192044 +0.12144233854129750372 +0.12127319875170990138 +0.12110426031140261727 +0.12093552303512770940 +0.12076698673772422177 +0.12059865123412077947 +0.12043051633933304911 +0.12026258186846541798 +0.12009484763671104957 +0.11992731345935062071 +0.11975997915175459752 +0.11959284452938104271 +0.11942590940777732256 +0.11925917360257951017 +0.11909263692951255198 +0.11892629920439055924 +0.11876016024311593366 +0.11859421986168165730 +0.11842847787616843369 +0.11826293410274729689 +0.11809758835767832086 +0.11793244045731089698 +0.11776749021808446960 +0.11760273745652749522 +0.11743818198925864982 +0.11727382363298630152 +0.11710966220450860775 +0.11694569752071384827 +0.11678192939857974519 +0.11661835765517546137 +0.11645498210765881097 +0.11629180257327897952 +0.11612881886937530262 +0.11596603081337686358 +0.11580343822280457500 +0.11564104091526875018 +0.11547883870847085175 +0.11531683142020335286 +0.11515501886834898781 +0.11499340087088213980 +0.11483197724586721722 +0.11467074781146092965 +0.11450971238590992862 +0.11434887078755279211 +0.11418822283481934454 +0.11402776834623025437 +0.11386750714039867161 +0.11370743903602820168 +0.11354756385191466794 +0.11338788140694550099 +0.11322839152009936403 +0.11306909401044784591 +0.11290998869715335173 +0.11275107539947067103 +0.11259235393674689452 +0.11243382412842080342 +0.11227548579402392426 +0.11211733875317908549 +0.11195938282560283228 +0.11180161783110283136 +0.11164404358958006369 +0.11148665992102797795 +0.11132946664553186600 +0.11117246358327122213 +0.11101565055451670383 +0.11085902737963296283 +0.11070259387907713244 +0.11054634987339932717 +0.11039029518324303125 +0.11023442962934409950 +0.11007875303253278343 +0.10992326521373146919 +0.10976796599395662046 +0.10961285519431784863 +0.10945793263601792666 +0.10930319814035421855 +0.10914865152871637555 +0.10899429262258872320 +0.10884012124354891515 +0.10868613721326857158 +0.10853234035351337627 +0.10837873048614225790 +0.10822530743310934676 +0.10807207101646176817 +0.10791902105834144665 +0.10776615738098450914 +0.10761347980672081315 +0.10746098815797561210 +0.10730868225726758469 +0.10715656192721050022 +0.10700462699051246918 +0.10685287726997638735 +0.10670131258849981093 +0.10654993276907465116 +0.10639873763478858992 +0.10624772700882310905 +0.10609690071445532222 +0.10594625857505740596 +0.10579580041409594737 +0.10564552605513374828 +0.10549543532182774352 +0.10534552803793094389 +0.10519580402729113155 +0.10504626311385192872 +0.10489690512165240899 +0.10474772987482643127 +0.10459873719760476307 +0.10444992691431254084 +0.10430129884937144880 +0.10415285282729860872 +0.10400458867270671870 +0.10385650621030530216 +0.10370860526489873721 +0.10356088566138803297 +0.10341334722477026065 +0.10326598978013841468 +0.10311881315268205117 +0.10297181716768628867 +0.10282500165053357066 +0.10267836642670177816 +0.10253191132176567302 +0.10238563616139681467 +0.10223954077136240826 +0.10209362497752734467 +0.10194788860585242418 +0.10180233148239546670 +0.10165695343331118683 +0.10151175428485087471 +0.10136673386336300662 +0.10122189199529255110 +0.10107722850718237062 +0.10093274322567140355 +0.10078843597749627403 +0.10064430658949091724 +0.10050035488858584387 +0.10035658070180983326 +0.10021298385628815697 +0.10006956417924385561 +0.09992632149799754449 +0.09978325563996721936 +0.09964036643266853399 +0.09949765370371441153 +0.09935511728081616867 +0.09921275699178219720 +0.09907057266451893551 +0.09892856412703092406 +0.09878673120741986169 +0.09864507373388645139 +0.09850359153472845741 +0.09836228443834220403 +0.09822115227322228415 +0.09808019486796057396 +0.09793941205124842564 +0.09779880365187441915 +0.09765836949872594430 +0.09751810942078878441 +0.09737802324714681101 +0.09723811080698298304 +0.09709837192957791741 +0.09695880644431165152 +0.09681941418066236649 +0.09668019496820692837 +0.09654114863662138779 +0.09640227501567967539 +0.09626357393525568351 +0.09612504522532122619 +0.09598668871594759344 +0.09584850423730476021 +0.09571049161966196928 +0.09557265069338755081 +0.09543498128894824239 +0.09529748323691122902 +0.09516015636794179777 +0.09502300051280501703 +0.09488601550236522297 +0.09474920116758572819 +0.09461255733953018165 +0.09447608384936051484 +0.09433978052833902339 +0.09420364720782714585 +0.09406768371928607431 +0.09393188989427676827 +0.09379626556445923302 +0.09366081056159422658 +0.09352552471754130292 +0.09339040786426044960 +0.09325545983381143544 +0.09312068045835347752 +0.09298606957014660113 +0.09285162700155000226 +0.09271735258502333821 +0.09258324615312632511 +0.09244930753851880734 +0.09231553657396085466 +0.09218193309231234589 +0.09204849692653421789 +0.09191522790968685575 +0.09178212587493163321 +0.09164919065553002453 +0.09151642208484381258 +0.09138381999633579666 +0.09125138422356871004 +0.09111911460020603870 +0.09098701096001195199 +0.09085507313685131647 +0.09072330096468957106 +0.09059169427759258819 +0.09046025290972785349 +0.09032897669536277263 +0.09019786546886603140 +0.09006691906470729037 +0.08993613731745647710 +0.08980552006178563196 +0.08967506713246670147 +0.08954477836437331473 +0.08941465359248003397 +0.08928469265186241011 +0.08915489537769748229 +0.08902526160526294530 +0.08889579116993856500 +0.08876648390720440207 +0.08863733965264262993 +0.08850835824193646617 +0.08837953951087020033 +0.08825088329533049836 +0.08812238943130429325 +0.08799405775488099157 +0.08786588810225103019 +0.08773788030970651464 +0.08761003421364142729 +0.08748234965055078083 +0.08735482645703224192 +0.08722746446978411894 +0.08710026352560730489 +0.08697322346140420879 +0.08684634411417872790 +0.08671962532103734411 +0.08659306691918775001 +0.08646666874593998686 +0.08634043063870593115 +0.08621435243499947498 +0.08608843397243659545 +0.08596267508873506324 +0.08583707562171535854 +0.08571163540929940816 +0.08558635428951168189 +0.08546123210047906760 +0.08533626868042987201 +0.08521146386769590242 +0.08508681750071005190 +0.08496232941800836713 +0.08483799945822899369 +0.08471382746011218989 +0.08458981326250139543 +0.08446595670434163539 +0.08434225762468096355 +0.08421871586266986565 +0.08409533125756137040 +0.08397210364871118826 +0.08384903287557710083 +0.08372611877772062616 +0.08360336119480482608 +0.08348075996659617970 +0.08335831493296369521 +0.08323602593387884052 +0.08311389280941662572 +0.08299191539975413201 +0.08287009354517173298 +0.08274842708605262276 +0.08262691586288271883 +0.08250555971625128659 +0.08238435848684978746 +0.08226331201547389116 +0.08214242014302101935 +0.08202168271049245507 +0.08190109955899242677 +0.08178067052972787243 +0.08166039546400968852 +0.08154027420325099529 +0.08142030658896869111 +0.08130049246278281405 +0.08118083166641644477 +0.08106132404169631711 +0.08094196943055181892 +0.08082276767501657411 +0.08070371861722658302 +0.08058482209942197105 +0.08046607796394592005 +0.08034748605324490422 +0.08022904620986941182 +0.08011075827647272385 +0.07999262209581206595 +0.07987463751074808105 +0.07975680436424492648 +0.07963912249937041277 +0.07952159175929569834 +0.07940421198729603891 +0.07928698302674978826 +0.07916990472113934196 +0.07905297691405080429 +0.07893619944917351638 +0.07881957217030141627 +0.07870309492133130413 +0.07858676754626429950 +0.07847058988920518896 +0.07835456179436255109 +0.07823868310604907561 +0.07812295366868057811 +0.07800737332677797065 +0.07789194192496487479 +0.07777665930796962002 +0.07766152532062428615 +0.07754653980786459233 +0.07743170261473097948 +0.07731701358636720867 +0.07720247256802144353 +0.07708807940504579237 +0.07697383394289661340 +0.07685973602713420949 +0.07674578550342273098 +0.07663198221753117489 +0.07651832601533210820 +0.07640481674280238944 +0.07629145424602333525 +0.07617823837117997099 +0.07606516896456233523 +0.07595224587256384219 +0.07583946894168275277 +0.07572683801852146679 +0.07561435294978662014 +0.07550201358228951498 +0.07538981976294496790 +0.07527777133877333604 +0.07516586815689826895 +0.07505411006454842937 +0.07494249690905688266 +0.07483102853786059716 +0.07471970479850184588 +0.07460852553862645786 +0.07449749060598535866 +0.07438659984843379314 +0.07427585311393143652 +0.07416525025054265807 +0.07405479110643597984 +0.07394447552988511752 +0.07383430336926775917 +0.07372427447306650894 +0.07361438868986856787 +0.07350464586836541470 +0.07339504585735373565 +0.07328558850573427264 +0.07317627366251287790 +0.07306710117679986183 +0.07295807089781009003 +0.07284918267486363563 +0.07274043635738462743 +0.07263183179490234620 +0.07252336883705078063 +0.07241504733356851631 +0.07230686713429912427 +0.07219882808919056427 +0.07209093004829623952 +0.07198317286177358110 +0.07187555637988539414 +0.07176808045299924721 +0.07166074493158712533 +0.07155354966622658186 +0.07144649450759936460 +0.07133957930649242885 +0.07123280391379752108 +0.07112616818051144263 +0.07101967195773575825 +0.07091331509667671285 +0.07080709744864620292 +0.07070101886506023614 +0.07059507919744029136 +0.07048927829741265250 +0.07038361601670840850 +0.07027809220716409178 +0.07017270672072069282 +0.07006745940942449291 +0.06996235012542677267 +0.06985737872098372880 +0.06975254504845677939 +0.06964784896031193939 +0.06954329030912087539 +0.06943886894755976757 +0.06933458472841023956 +0.06923043750455880330 +0.06912642712899683128 +0.06902255345482133375 +0.06891881633523398720 +0.06881521562354162014 +0.06871175117315622694 +0.06860842283759500948 +0.06850523047048023839 +0.06840217392553889220 +0.06829925305660398960 +0.06819646771761275761 +0.06809381776260810260 +0.06799130304573805517 +0.06788892342125536772 +0.06778667874351873568 +0.06768456886699125707 +0.06758259364624166765 +0.06748075293594367474 +0.06737904659087633197 +0.06727747446592374780 +0.06717603641607515497 +0.06707473229642546553 +0.06697356196217400803 +0.06687252526862610957 +0.06677162207119177739 +0.06667085222538628175 +0.06657021558683065554 +0.06646971201125038975 +0.06636934135447672412 +0.06626910347244596711 +0.06616899822119966246 +0.06606902545688476958 +0.06596918503575301129 +0.06586947681416205347 +0.06576990064857415885 +0.06567045639555725567 +0.06557114391178445190 +0.06547196305403378547 +0.06537291367918919571 +0.06527399564423928824 +0.06517520880627819535 +0.06507655302250522911 +0.06497802815022518663 +0.06487963404684786439 +0.06478137056988832188 +0.06468323757696720078 +0.06458523492581003111 +0.06448736247424791124 +0.06438962008021713312 +0.06429200760175890483 +0.06419452489702047460 +0.06409717182425365978 +0.06399994824181580444 +0.06390285400816962669 +0.06380588898188295499 +0.06370905302162915840 +0.06361234598618627223 +0.06351576773443845525 +0.06341931812537443536 +0.06332299701808853654 +0.06322680427178035967 +0.06313073974575450498 +0.06303480329942130755 +0.06293899479229590754 +0.06284331408399899954 +0.06274776103425647178 +0.06265233550289921183 +0.06255703734986389764 +0.06246186643519190812 +0.06236682261903024604 +0.06227190576163110780 +0.06217711572335179321 +0.06208245236465500388 +0.06198791554610838528 +0.06189350512838542179 +0.06179922097226416000 +0.06170506293862821484 +0.06161103088846661691 +0.06151712468287299368 +0.06142334418304706140 +0.06132968925029300827 +0.06123615974602044515 +0.06114275553174453731 +0.06104947646908515796 +0.06095632241976779025 +0.06086329324562267384 +0.06077038880858577630 +0.06067760897069777309 +0.06058495359410476927 +0.06049242254105798022 +0.06040001567391369008 +0.06030773285513376519 +0.06021557394728462714 +0.06012353881303823810 +0.06003162731517158041 +0.05993983931656686470 +0.05984817468021143977 +0.05975663326919743168 +0.05966521494672279158 +0.05957391957608983157 +0.05948274702070651537 +0.05939169714408568113 +0.05930076980984501367 +0.05920996488170803679 +0.05911928222350245482 +0.05902872169916167228 +0.05893828317272387096 +0.05884796650833239856 +0.05875777157023564373 +0.05866769822278681407 +0.05857774633044470630 +0.05848791575777247120 +0.05839820636943868909 +0.05830861803021694656 +0.05821915060498540628 +0.05812980395872795886 +0.05804057795653280033 +0.05795147246359334814 +0.05786248734520803988 +0.05777362246678022922 +0.05768487769381833163 +0.05759625289193517211 +0.05750774792684939379 +0.05741936266438368852 +0.05733109697046606668 +0.05724295071112959349 +0.05715492375251165352 +0.05706701596085524825 +0.05697922720250754580 +0.05689155734392099817 +0.05680400625165274442 +0.05671657379236477725 +0.05662925983282403319 +0.05654206423990183056 +0.05645498688057502823 +0.05636802762192444360 +0.05628118633113619873 +0.05619446287550111663 +0.05610785712241452006 +0.05602136893937682827 +0.05593499819399277290 +0.05584874475397225840 +0.05576260848712942531 +0.05567658926138350367 +0.05559068694475824413 +0.05550490140538177214 +0.05541923251148752477 +0.05533368013141289066 +0.05524824413360027164 +0.05516292438659670117 +0.05507772075905343484 +0.05499263311972682478 +0.05490766133747743832 +0.05482280528127052299 +0.05473806482017577746 +0.05465343982336761525 +0.05456893016012484554 +0.05448453569983058298 +0.05440025631197297623 +0.05431609186614395901 +0.05423204223204049906 +0.05414810727946366836 +0.05406428687831889290 +0.05398058089861657027 +0.05389698921047077901 +0.05381351168410041658 +0.05373014818982873447 +0.05364689859808298433 +0.05356376277939529917 +0.05348074060440164562 +0.05339783194384247617 +0.05331503666856259732 +0.05323235464951107249 +0.05314978575774117336 +0.05306732986441022037 +0.05298498684078027654 +0.05290275655821700951 +0.05282063888819057973 +0.05273863370227548780 +0.05265674087214990140 +0.05257496026959668223 +0.05249329176650233131 +0.05241173523485774532 +0.05233029054675780722 +0.05224895757440151112 +0.05216773619009196228 +0.05208662626623598163 +0.05200562767534494535 +0.05192474029003360525 +0.05184396398302114350 +0.05176329862713067997 +0.05168274409528885588 +0.05160230026052688851 +0.05152196699597923202 +0.05144174417488472928 +0.05136163167058584167 +0.05128162935652895438 +0.05120173710626434171 +0.05112195479344574384 +0.05104228229183133125 +0.05096271947528242113 +0.05088326621776436548 +0.05080392239334631521 +0.05072468787620081770 +0.05064556254060461477 +0.05056654626093758098 +0.05048763891168363271 +0.05040884036743013136 +0.05033015050286809844 +0.05025156919279218093 +0.05017309631210038756 +0.05009473173579473415 +0.05001647533898021664 +0.04993832699686569232 +0.04986028658476348435 +0.04978235397808904866 +0.04970452905236187602 +0.04962681168320428465 +0.04954920174634235008 +0.04947169911760544714 +0.04939430367292623608 +0.04931701528834090548 +0.04923983383998847829 +0.04916275920411204703 +0.04908579125705717777 +0.04900892987527320777 +0.04893217493531259316 +0.04885552631383063837 +0.04877898388758643983 +0.04870254753344178261 +0.04862621712836165400 +0.04854999254941439607 +0.04847387367377112982 +0.04839786037870631719 +0.04832195254159712267 +0.04824615003992412110 +0.04817045275127061071 +0.04809486055332289067 +0.04801937332387044843 +0.04794399094080514095 +0.04786871328212252003 +0.04779354022592022244 +0.04771847165039927452 +0.04764350743386329412 +0.04756864745471876127 +0.04749389159147500428 +0.04741923972274376953 +0.04734469172724012354 +0.04727024748378119701 +0.04719590687128728812 +0.04712166976878120334 +0.04704753605538810474 +0.04697350561033627331 +0.04689957831295609586 +0.04682575404268070340 +0.04675203267904584625 +0.04667841410168958871 +0.04660489819035268377 +0.04653148482487811516 +0.04645817388521140262 +0.04638496525140046317 +0.04631185880359553475 +0.04623885442204943991 +0.04616595198711675313 +0.04609315137925508454 +0.04602045247902367825 +0.04594785516708431439 +0.04587535932420114954 +0.04580296483123996731 +0.04573067156916942044 +0.04565847941905974011 +0.04558638826208345762 +0.04551439797951525174 +0.04544250845273172662 +0.04537071956321171023 +0.04529903119253560206 +0.04522744322238634457 +0.04515595553454834071 +0.04508456801090814092 +0.04501328053345418634 +0.04494209298427650351 +0.04487100524556745379 +0.04480001719962067169 +0.04472912872883185592 +0.04465833971569839467 +0.04458765004281940725 +0.04451705959289567471 +0.04444656824872943862 +0.04437617589322508799 +0.04430588240938798661 +0.04423568768032550697 +0.04416559158924641265 +0.04409559401946083063 +0.04402569485438075775 +0.04395589397751922811 +0.04388619127249094448 +0.04381658662301190360 +0.04374707991289951414 +0.04367767102607257590 +0.04360835984655088426 +0.04353914625845603514 +0.04347003014601038412 +0.04340101139353770565 +0.04333208988546302654 +0.04326326550631227202 +0.04319453814071288339 +0.04312590767339299219 +0.04305737398918198927 +0.04298893697301033046 +0.04292059650990938391 +0.04285235248501154809 +0.04278420478354996725 +0.04271615329085912127 +0.04264819789237381947 +0.04258033847363017904 +0.04251257492026486173 +0.04244490711801530980 +0.04237733495271997497 +0.04230985831031765926 +0.04224247707684809783 +0.04217519113845161205 +0.04210800038136918583 +0.04204090469194235458 +0.04197390395661304563 +0.04190699806192415416 +0.04184018689451850931 +0.04177347034113984559 +0.04170684828863215066 +0.04164032062393970002 +0.04157388723410739007 +0.04150754800628019686 +0.04144130282770355084 +0.04137515158572306617 +0.04130909416778467957 +0.04124313046143445599 +0.04117726035431843595 +0.04111148373418328783 +0.04104580048887526700 +0.04098021050634095830 +0.04091471367462703318 +0.04084930988187979867 +0.04078399901634603697 +0.04071878096637202710 +0.04065365562040416936 +0.04058862286698865229 +0.04052368259477149431 +0.04045883469249864084 +0.04039407904901545082 +0.04032941555326750166 +0.04026484409429956918 +0.04020036456125640478 +0.04013597684338233301 +0.04007168083002105030 +0.04000747641061616622 +0.03994336347471044713 +0.03987934191194641292 +0.03981541161206584439 +0.03975157246491003299 +0.03968782436041973921 +0.03962416718863477627 +0.03956060083969446112 +0.03949712520383743403 +0.03943374017140145044 +0.03937044563282353360 +0.03930724147863974560 +0.03924412759948553431 +0.03918110388609512273 +0.03911817022930199478 +0.03905532652003866623 +0.03899257264933641415 +0.03892990850832581118 +0.03886733398823599694 +0.03880484898039522623 +0.03874245337623044572 +0.03868014706726748825 +0.03861792994513103122 +0.03855580190154409698 +0.03849376282832903118 +0.03843181261740622606 +0.03836995116079502943 +0.03830817835061334220 +0.03824649407907736165 +0.03818489823850220594 +0.03812339072130113693 +0.03806197141998592798 +0.03800064022716679452 +0.03793939703555228998 +0.03787824173794934746 +0.03781717422726296046 +0.03775619439649668951 +0.03769530213875204455 +0.03763449734722879025 +0.03757377991522487665 +0.03751314973613616849 +0.03745260670345688936 +0.03739215071077898328 +0.03733178165179252411 +0.03727149942028548657 +0.03721130391014374622 +0.03715119501535112806 +0.03709117262998899711 +0.03703123664823695232 +0.03697138696437192451 +0.03691162347276880085 +0.03685194606790007099 +0.03679235464433567443 +0.03673284909674356946 +0.03667342931988884502 +0.03661409520863429662 +0.03655484665794014182 +0.03649568356286411741 +0.03643660581856127817 +0.03637761332028396216 +0.03631870596338202667 +0.03625988364330241798 +0.03620114625558937954 +0.03614249369588445893 +0.03608392585992607066 +0.03602544264355018316 +0.03596704394268944449 +0.03590872965337370271 +0.03585049967172981161 +0.03579235389398162381 +0.03573429221644981724 +0.03567631453555187432 +0.03561842074780240813 +0.03556061074981250320 +0.03550288443829015261 +0.03544524171004015400 +0.03538768246196365846 +0.03533020659105889222 +0.03527281399442029619 +0.03521550456923906031 +0.03515827821280283205 +0.03510113482249576505 +0.03504407429579840111 +0.03498709653028753142 +0.03493020142363668229 +0.03487338887361528250 +0.03481665877808917675 +0.03476001103502054934 +0.03470344554246748009 +0.03464696219858456189 +0.03459056090162214436 +0.03453424154992679185 +0.03447800404194109603 +0.03442184827620352328 +0.03436577415134867836 +0.03430978156610670765 +0.03425387041930396531 +0.03419804060986234712 +0.03414229203679965130 +0.03408662459922941201 +0.03403103819636062871 +0.03397553272749827963 +0.03392010809204257932 +0.03386476418948953376 +0.03380950091943060037 +0.03375431818155263247 +0.03369921587563805970 +0.03364419390156443701 +0.03358925215930484709 +0.03353439054892767140 +0.03347960897059645141 +0.03342490732457004815 +0.03337028551120223285 +0.03331574343094229063 +0.03326128098433427799 +0.03320689807201735594 +0.03315259459472578996 +0.03309837045328852673 +0.03304422554862982558 +0.03299015978176843278 +0.03293617305381805332 +0.03288226526598723304 +0.03282843631957911568 +0.03277468611599172049 +0.03272101455671737325 +0.03266742154334340703 +0.03261390697755140594 +0.03256047076111760058 +0.03250711279591267377 +0.03245383298390162874 +0.03240063122714405275 +0.03234750742779366611 +0.03229446148809856504 +0.03224149331040111754 +0.03218860279713779693 +0.03213578985083940381 +0.03208305437413051103 +0.03203039626973024079 +0.03197781544045133484 +0.03192531178920066104 +0.03187288521897909538 +0.03182053563288117504 +0.03176826293409563268 +0.03171606702590461235 +0.03166394781168425238 +0.03161190519490432449 +0.03155993907912825469 +0.03150804936801320649 +0.03145623596530962296 +0.03140449877486189978 +0.03135283770060747627 +0.03130125264657748763 +0.03124974351689646310 +0.03119831021578207270 +0.03114695264754557477 +0.03109567071659122967 +0.03104446432741660503 +0.03099333338461248213 +0.03094227779286263386 +0.03089129745694410220 +0.03084039228172662239 +0.03078956217217332370 +0.03073880703333988981 +0.03068812677037507930 +0.03063752128852056250 +0.03058699049311055379 +0.03053653428957231464 +0.03048615258342551176 +0.03043584528028267164 +0.03038561228584886822 +0.03033545350592174034 +0.03028536884639145693 +0.03023535821324051243 +0.03018542151254411873 +0.03013555865046951485 +0.03008576953327653583 +0.03003605406731718955 +0.02998641215903562890 +0.02993684371496847102 +0.02988734864174414502 +0.02983792684608336729 +0.02978857823479883621 +0.02973930271479528764 +0.02969010019306943249 +0.02964097057670971383 +0.02959191377289667468 +0.02954292968890250698 +0.02949401823209118340 +0.02944517930991851634 +0.02939641282993170346 +0.02934771869976992090 +0.02929909682716363983 +0.02925054711993495607 +0.02920206948599748942 +0.02915366383335621023 +0.02910533007010752959 +0.02905706810443908425 +0.02900887784462997249 +0.02896075919905035517 +0.02891271207616167779 +0.02886473638451656637 +0.02881683203275854643 +0.02876899892962246977 +0.02872123698393392460 +0.02867354610460962419 +0.02862592620065711885 +0.02857837718117468145 +0.02853089895535175155 +0.02848349143246807491 +0.02843615452189442172 +0.02838888813309211820 +0.02834169217561301884 +0.02829456655909974583 +0.02824751119328511306 +0.02820052598799280621 +0.02815361085313655351 +0.02810676569872064268 +0.02805999043483969890 +0.02801328497167840034 +0.02796664921951200200 +0.02792008308870559327 +0.02787358648971452121 +0.02782715933308424483 +0.02778080152945015119 +0.02773451298953775665 +0.02768829362416218298 +0.02764214334422888941 +0.02759606206073273935 +0.02755004968475859711 +0.02750410612748103653 +0.02745823130016410846 +0.02741242511416188896 +0.02736668748091763276 +0.02732101831196434572 +0.02727541751892445521 +0.02722988501350978932 +0.02718442070752164971 +0.02713902451285045425 +0.02709369634147626438 +0.02704843610546797325 +0.02700324371698391984 +0.02695811908827148995 +0.02691306213166706762 +0.02686807275959630578 +0.02682315088457350866 +0.02677829641920219730 +0.02673350927617461348 +0.02668878936827187923 +0.02664413660836395178 +0.02659955090940929051 +0.02655503218445540506 +0.02651058034663810944 +0.02646619530918190022 +0.02642187698539990096 +0.02637762528869348755 +0.02633344013255280169 +0.02628932143055597720 +0.02624526909636972979 +0.02620128304374900671 +0.02615736318653692424 +0.02611350943866481977 +0.02606972171415203668 +0.02602599992710625740 +0.02598234399172287198 +0.02593875382228542567 +0.02589522933316539335 +0.02585177043882191938 +0.02580837705380229982 +0.02576504909274129548 +0.02572178647036148583 +0.02567858910147315793 +0.02563545690097417465 +0.02559238978385003360 +0.02554938766517349247 +0.02550645046010516920 +0.02546357808389269547 +0.02542077045187132039 +0.02537802747946354617 +0.02533534908217894080 +0.02529273517561460294 +0.02525018567545450968 +0.02520770049746985306 +0.02516527955751887008 +0.02512292277154677331 +0.02508063005558576822 +0.02503840132575479993 +0.02499623649825990709 +0.02495413548939365983 +0.02491209821553553097 +0.02487012459315169483 +0.02482821453879472534 +0.02478636796910416856 +0.02474458480080570302 +0.02470286495071175731 +0.02466120833572107290 +0.02461961487281878400 +0.02457808447907637583 +0.02453661707165149045 +0.02449521256778822154 +0.02445387088481656285 +0.02441259194015277592 +0.02437137565129920275 +0.02433022193584402637 +0.02428913071146163866 +0.02424810189591208864 +0.02420713540704142255 +0.02416623116278153807 +0.02412538908114980271 +0.02408460908024970260 +0.02404389107826998204 +0.02400323499348513967 +0.02396264074425525498 +0.02392210824902578359 +0.02388163742632778974 +0.02384122819477739463 +0.02380088047307642174 +0.02376059418001172027 +0.02372036923445542886 +0.02368020555536489574 +0.02364010306178248796 +0.02360006167283580300 +0.02356008130773723855 +0.02352016188578431866 +0.02348030332635936412 +0.02344050554892961394 +0.02340076847304714547 +0.02336109201834857263 +0.02332147610455551079 +0.02328192065147391063 +0.02324242557899452652 +0.02320299080709260081 +0.02316361625582768341 +0.02312430184534407587 +0.02308504749587013405 +0.02304585312771871217 +0.02300671866128688528 +0.02296764401705595274 +0.02292862911559140002 +0.02288967387754268709 +0.02285077822364353986 +0.02281194207471150606 +0.02277316535164813222 +0.02273444797543894974 +0.02269578986715309332 +0.02265719094794384214 +0.02261865113904785660 +0.02258017036178568138 +0.02254174853756140198 +0.02250338558786274187 +0.02246508143426092716 +0.02242683599841050618 +0.02238864920204973463 +0.02235052096699989208 +0.02231245121516577112 +0.02227443986853539989 +0.02223648684917984772 +0.02219859207925361372 +0.02216075548099395026 +0.02212297697672138685 +0.02208525648883931727 +0.02204759393983407936 +0.02200998925227495157 +0.02197244234881390312 +0.02193495315218580918 +0.02189752158520813161 +0.02186014757078104387 +0.02182283103188737555 +0.02178557189159231397 +0.02174837007304382744 +0.02171122549947207547 +0.02167413809418966900 +0.02163710778059164605 +0.02160013448215520118 +0.02156321812243985891 +0.02152635862508712680 +0.02148955591382086666 +0.02145280991244685395 +0.02141612054485284022 +0.02137948773500866415 +0.02134291140696590108 +0.02130639148485811984 +0.02126992789290054961 +0.02123352055539021524 +0.02119716939670582279 +0.02116087434130767275 +0.02112463531373768785 +0.02108845223861916668 +0.02105232504065711677 +0.02101625364463766479 +0.02098023797542847638 +0.02094427795797850628 +0.02090837351731776594 +0.02087252457855775373 +0.02083673106689084079 +0.02080099290759059374 +0.02076531002601155265 +0.02072968234758929343 +0.02069410979784027521 +0.02065859230236169117 +0.02062312978683178422 +0.02058772217700931273 +0.02055236939873383850 +0.02051707137792559837 +0.02048182804058523709 +0.02044663931279422017 +0.02041150512071416429 +0.02037642539058730565 +0.02034140004873625021 +0.02030642902156370999 +0.02027151223555295409 +0.02023664961726719808 +0.02020184109334990583 +0.02016708659052462299 +0.02013238603559490761 +0.02009773935544433010 +0.02006314647703628939 +0.02002860732741423497 +0.01999412183370121582 +0.01995968992310016843 +0.01992531152289373983 +0.01989098656044406208 +0.01985671496319312349 +0.01982249665866222046 +0.01978833157445219343 +0.01975421963824337476 +0.01972016077779537371 +0.01968615492094722558 +0.01965220199561702741 +0.01961830192980234047 +0.01958445465157965595 +0.01955066008910466904 +0.01951691817061209505 +0.01948322882441557574 +0.01944959197890778688 +0.01941600756256015373 +0.01938247550392300025 +0.01934899573162539299 +0.01931556817437504736 +0.01928219276095847687 +0.01924886942024051778 +0.01921559808116489465 +0.01918237867275348132 +0.01914921112410677626 +0.01911609536440365270 +0.01908303132290111934 +0.01905001892893468801 +0.01901705811191788456 +0.01898414880134246391 +0.01895129092677826088 +0.01891848441787313123 +0.01888572920435300020 +0.01885302521602150519 +0.01882037238276043634 +0.01878777063452913634 +0.01875521990136487169 +0.01872272011338258976 +0.01869027120077471765 +0.01865787309381159581 +0.01862552572284076682 +0.01859322901828744726 +0.01856098291065421887 +0.01852878733052101129 +0.01849664220854515401 +0.01846454747546104683 +0.01843250306208053454 +0.01840050889929235878 +0.01836856491806253960 +0.01833667104943405637 +0.01830482722452676445 +0.01827303337453766927 +0.01824128943074039208 +0.01820959532448552728 +0.01817795098720033017 +0.01814635635038880021 +0.01811481134563159082 +0.01808331590458582896 +0.01805186995898533375 +0.01802047344064024864 +0.01798912628143720799 +0.01795782841333919480 +0.01792657976838542278 +0.01789538027869152365 +0.01786422987644909963 +0.01783312849392607383 +0.01780207606346632596 +0.01777107251748979294 +0.01774011778849246199 +0.01770921180904601322 +0.01767835451179826031 +0.01764754582947257108 +0.01761678569486820056 +0.01758607404086004120 +0.01755541080039854998 +0.01752479590650992888 +0.01749422929229566687 +0.01746371089093288684 +0.01743324063567405768 +0.01740281845984699427 +0.01737244429685481928 +0.01734211808017576545 +0.01731183974336350864 +0.01728160922004657110 +0.01725142644392868574 +0.01722129134878861226 +0.01719120386847989429 +0.01716116393693122022 +0.01713117148814589583 +0.01710122645620215653 +0.01707132877525290374 +0.01704147837952565622 +0.01701167520332269589 +0.01698191918102071041 +0.01695221024707095625 +0.01692254833599915465 +0.01689293338240537706 +0.01686336532096406604 +0.01683384408642381314 +0.01680436961360766771 +0.01677494183741260955 +0.01674556069280983689 +0.01671622611484462062 +0.01668693803863608924 +0.01665769639937751331 +0.01662850113233584753 +0.01659935217285195969 +0.01657024945634052310 +0.01654119291828985705 +0.01651218249426196841 +0.01648321811989238855 +0.01645429973089033646 +0.01642542726303837172 +0.01639660065219255766 +0.01636781983428233986 +0.01633908474531034841 +0.01631039532135271711 +0.01628175149855853529 +0.01625315321315017741 +0.01622460040142307755 +0.01619609299974566693 +0.01616763094455942601 +0.01613921417237862768 +0.01611084261979056978 +0.01608251622345524545 +0.01605423492010541603 +0.01602599864654657286 +0.01599780733965674648 +0.01596966093638671133 +0.01594155937375961105 +0.01591350258887112498 +0.01588549051888933292 +0.01585752310105465607 +0.01582960027267987443 +0.01580172197114987701 +0.01577388813392189074 +0.01574609869852513361 +0.01571835360256097075 +0.01569065278370279995 +0.01566299617969585389 +0.01563538372835747772 +0.01560781536757662770 +0.01558029103531416784 +0.01555281066960269819 +0.01552537420854647500 +0.01549798159032138474 +0.01547063275317477234 +0.01544332763542567016 +0.01541606617546439212 +0.01538884831175273311 +0.01536167398282381469 +0.01533454312728193755 +0.01530745568380281231 +0.01528041159113312231 +0.01525341078809075608 +0.01522645321356465298 +0.01519953880651469906 +0.01517266750597179130 +0.01514583925103758083 +0.01511905398088471408 +0.01509231163475645288 +0.01506561215196682881 +0.01503895547190058253 +0.01501234153401289836 +0.01498577027782969397 +0.01495924164294723351 +0.01493275556903222827 +0.01490631199582180544 +0.01487991086312339534 +0.01485355211081465857 +0.01482723567884341488 +0.01480096150722776983 +0.01477472953605575567 +0.01474853970548554126 +0.01472239195574523256 +0.01469628622713278591 +0.01467022246001620234 +0.01464420059483307300 +0.01461822057209084640 +0.01459228233236666700 +0.01456638581630726598 +0.01454053096462902886 +0.01451471771811771276 +0.01448894601762873782 +0.01446321580408675006 +0.01443752701848584168 +0.01441187960188939840 +0.01438627349542997633 +0.01436070864030943722 +0.01433518497779859291 +0.01430970244923746720 +0.01428426099603504265 +0.01425886055966917726 +0.01423350108168685429 +0.01420818250370361677 +0.01418290476740393345 +0.01415766781454103583 +0.01413247158693674808 +0.01410731602648156342 +0.01408220107513442898 +0.01405712667492296265 +0.01403209276794304371 +0.01400709929635908860 +0.01398214620240376474 +0.01395723342837796796 +0.01393236091665097168 +0.01390752860966004527 +0.01388273644991062580 +0.01385798437997622437 +0.01383327234249829250 +0.01380860028018627422 +0.01378396813581739440 +0.01375937585223684784 +0.01373482337235741937 +0.01371031063915973715 +0.01368583759569204882 +0.01366140418507009666 +0.01363701035047733615 +0.01361265603516457166 +0.01358834118245005884 +0.01356406573571945079 +0.01353982963842569227 +0.01351563283408899890 +0.01349147526629674264 +0.01346735687870353158 +0.01344327761503092897 +0.01341923741906759018 +0.01339523623466921942 +0.01337127400575825742 +0.01334735067632424055 +0.01332346619042324397 +0.01329962049217831010 +0.01327581352577907395 +0.01325204523548178560 +0.01322831556560933632 +0.01320462446055102081 +0.01318097186476279922 +0.01315735772276684611 +0.01313378197915175856 +0.01311024457857247298 +0.01308674546575003435 +0.01306328458547185295 +0.01303986188259130194 +0.01301647730202791682 +0.01299313078876719596 +0.01296982228786063528 +0.01294655174442561028 +0.01292331910364528762 +0.01290012431076875687 +0.01287696731111066806 +0.01285384805005148311 +0.01283076647303720876 +0.01280772252557939479 +0.01278471615325522254 +0.01276174730170713881 +0.01273881591664311266 +0.01271592194383640642 +0.01269306532912557045 +0.01267024601841440154 +0.01264746395767175034 +0.01262471909293177465 +0.01260201137029349355 +0.01257934073592101819 +0.01255670713604343028 +0.01253411051695456704 +0.01251155082501330222 +0.01248902800664306208 +0.01246654200833210123 +0.01244409277663337948 +0.01242168025816435366 +0.01239930439960711291 +0.01237696514770813411 +0.01235466244927848831 +0.01233239625119348336 +0.01231016650039279230 +0.01228797314388041344 +0.01226581612872441884 +0.01224369540205722841 +0.01222161091107516750 +0.01219956260303873066 +0.01217755042527234044 +0.01215557432516436998 +0.01213363425016709615 +0.01211173014779650357 +0.01208986196563251007 +0.01206802965131854172 +0.01204623315256183116 +0.01202447241713315226 +0.01200274739286675933 +0.01198105802766049124 +0.01195940426947554591 +0.01193778606633647162 +0.01191620336633119129 +0.01189465611761082210 +0.01187314426838976568 +0.01185166776694547563 +0.01183022656161853044 +0.01180882060081257096 +0.01178744983299417383 +0.01176611420669286534 +0.01174481367050099131 +0.01172354817307378998 +0.01170231766312914909 +0.01168112208944772391 +0.01165996140087281578 +0.01163883554631022117 +0.01161774447472842080 +0.01159668813515822398 +0.01157566647669291265 +0.01155467944848814765 +0.01153372699976188895 +0.01151280907979434359 +0.01149192563792783735 +0.01147107662356700898 +0.01145026198617838872 +0.01142948167529066542 +0.01140873564049444885 +0.01138802383144223163 +0.01136734619784847238 +0.01134670268948931651 +0.01132609325620270377 +0.01130551784788826758 +0.01128497641450730039 +0.01126446890608266867 +0.01124399527269868797 +0.01122355546450126002 +0.01120314943169761941 +0.01118277712455640997 +0.01116243849340753727 +0.01114213348864213915 +0.01112186206071264123 +0.01110162416013249498 +0.01108141973747629218 +0.01106124874337962270 +0.01104111112853907797 +0.01102100684371215382 +0.01100093583971714466 +0.01098089806743325798 +0.01096089347780033335 +0.01094092202181896900 +0.01092098365055042992 +0.01090107831511645184 +0.01088120596669943374 +0.01086136655654210137 +0.01084156003594772058 +0.01082178635627984234 +0.01080204546896233568 +0.01078233732547935995 +0.01076266187737516013 +0.01074301907625427842 +0.01072340887378120042 +0.01070383122168047825 +0.01068428607173669415 +0.01066477337579423319 +0.01064529308575749671 +0.01062584515359051365 +0.01060642953131720433 +0.01058704617102112361 +0.01056769502484549220 +0.01054837604499307170 +0.01052908918372617679 +0.01050983439336664743 +0.01049061162629565461 +0.01047142083495378878 +0.01045226197184094714 +0.01043313498951622953 +0.01041403984059803382 +0.01039497647776380790 +0.01037594485375012941 +0.01035694492135260519 +0.01033797663342582093 +0.01031903994288330302 +0.01030013480269736936 +0.01028126116589929591 +0.01026241898557894716 +0.01024360821488503291 +0.01022482880702483936 +0.01020608071526423084 +0.01018736389292769842 +0.01016867829339809098 +0.01015002387011681301 +0.01013140057658353660 +0.01011280836635635068 +0.01009424719305154240 +0.01007571701034357115 +0.01005721777196520381 +0.01003874943170711756 +0.01002031194341818088 +0.01000190526100518812 +0.00998352933843282483 +0.00996518412972380654 +0.00994686958895849536 +0.00992858567027516542 +0.00991033232786971835 +0.00989210951599574402 +0.00987391718896449798 +0.00985575530114467246 +0.00983762380696256294 +0.00981952266090184607 +0.00980145181750363172 +0.00978341123136635543 +0.00976540085714564313 +0.00974742064955451577 +0.00972947056336300603 +0.00971155055339836121 +0.00969366057454487326 +0.00967580058174376083 +0.00965797052999333404 +0.00964017037434868225 +0.00962240006992180590 +0.00960465957188146036 +0.00958694883545315769 +0.00956926781591911461 +0.00955161646861805991 +0.00953399474894546343 +0.00951640261235317877 +0.00949884001434959935 +0.00948130691049949015 +0.00946380325642395305 +0.00944632900780047711 +0.00942888412036268532 +0.00941146854990048375 +0.00939408225225986208 +0.00937672518334292313 +0.00935939729910779082 +0.00934209855556852702 +0.00932482890879522686 +0.00930758831491370654 +0.00929037673010570976 +0.00927319411060867349 +0.00925604041271575577 +0.00923891559277582007 +0.00922181960719323235 +0.00920475241242797032 +0.00918771396499546734 +0.00917070422146662803 +0.00915372313846771028 +0.00913677067268028539 +0.00911984678084125366 +0.00910295141974267613 +0.00908608454623180233 +0.00906924611721101823 +0.00905243608963770575 +0.00903565442052433124 +0.00901890106693824939 +0.00900217598600172066 +0.00898547913489189387 +0.00896881047084066053 +0.00895216995113466349 +0.00893555753311520498 +0.00891897317417828482 +0.00890241683177438355 +0.00888588846340855956 +0.00886938802664035894 +0.00885291547908365409 +0.00883647077840679467 +0.00882005388233234218 +0.00880366474863714457 +0.00878730333515226336 +0.00877096959976287477 +0.00875466350040830787 +0.00873838499508181564 +0.00872213404183080389 +0.00870591059875644793 +0.00868971462401390594 +0.00867354607581211946 +0.00865740491241378043 +0.00864129109213538846 +0.00862520457334699751 +0.00860914531447234781 +0.00859311327398871311 +0.00857710841042688167 +0.00856113068237108858 +0.00854518004845894984 +0.00852925646738147969 +0.00851335989788293453 +0.00849749029876081807 +0.00848164762886585710 +0.00846583184710185226 +0.00845004291242574916 +0.00843428078384746496 +0.00841854542042990914 +0.00840283678128894707 +0.00838715482559327166 +0.00837149951256441378 +0.00835587080147661213 +0.00834026865165691036 +0.00832469302248492644 +0.00830914387339291849 +0.00829362116386570675 +0.00827812485344053654 +0.00826265490170722920 +0.00824721126830784898 +0.00823179391293692164 +0.00821640279534118986 +0.00820103787531960803 +0.00818569911272343416 +0.00817038646745590728 +0.00815509989947243996 +0.00813983936878040840 +0.00812460483543920448 +0.00810939625956012648 +0.00809421360130627328 +0.00807905682089269696 +0.00806392587858604550 +0.00804882073470479173 +0.00803374134961903734 +0.00801868768375041223 +0.00800365969757221331 +0.00798865735160915469 +0.00797368060643741279 +0.00795872942268456215 +0.00794380376102952514 +0.00792890358220250252 +0.00791402884698490586 +0.00789917951620938176 +0.00788435555075965577 +0.00786955691157055666 +0.00785478355962795048 +0.00784003545596864172 +0.00782531256168040625 +0.00781061483790181695 +0.00779594224582234787 +0.00778129474668215991 +0.00776667230177219454 +0.00775207487243401421 +0.00773750242005976849 +0.00772295490609223225 +0.00770843229202461139 +0.00769393453940061828 +0.00767946160981434079 +0.00766501346491018504 +0.00765059006638294826 +0.00763619137597756036 +0.00762181735548920353 +0.00760746796676320652 +0.00759314317169494830 +0.00757884293222988413 +0.00756456721036340846 +0.00755031596814092869 +0.00753608916765762579 +0.00752188677105858957 +0.00750770874053866694 +0.00749355503834241155 +0.00747942562676409597 +0.00746532046814756510 +0.00745123952488625004 +0.00743718275942312473 +0.00742315013425059577 +0.00740914161191054670 +0.00739515715499410899 +0.00738119672614187799 +0.00736726028804358425 +0.00735334780343822967 +0.00733945923511397907 +0.00732559454590804744 +0.00731175369870679624 +0.00729793665644550352 +0.00728414338210845152 +0.00727037383872881308 +0.00725662798938859176 +0.00724290579721864353 +0.00722920722539847904 +0.00721553223715642230 +0.00720188079576933229 +0.00718825286456273478 +0.00717464840691067491 +0.00716106738623566250 +0.00714750976600872067 +0.00713397550974916722 +0.00712046458102473263 +0.00710697694345140824 +0.00709351256069340550 +0.00708007139646315165 +0.00706665341452116999 +0.00705325857867611806 +0.00703988685278463498 +0.00702653820075136836 +0.00701321258652891528 +0.00699990997411765840 +0.00698663032756596369 +0.00697337361096982047 +0.00696013978847304093 +0.00694692882426706758 +0.00693374068259101049 +0.00692057532773152767 +0.00690743272402277644 +0.00689431283584642472 +0.00688121562763155652 +0.00686814106385460338 +0.00685508910903936692 +0.00684205972775684800 +0.00682905288462534732 +0.00681606854431025724 +0.00680310667152415633 +0.00679016723102666021 +0.00677725018762436165 +0.00676435550617092343 +0.00675148315156681375 +0.00673863308875943638 +0.00672580528274299878 +0.00671299969855845922 +0.00670021630129351460 +0.00668745505608247127 +0.00667471592810633604 +0.00666199888259260027 +0.00664930388481533088 +0.00663663090009502382 +0.00662397989379856587 +0.00661135083133929363 +0.00659874367817675153 +0.00658615839981681328 +0.00657359496181155866 +0.00656105332975920504 +0.00654853346930412035 +0.00653603534613667568 +0.00652355892599334932 +0.00651110417465648132 +0.00649867105795438361 +0.00648625954176122819 +0.00647386959199695074 +0.00646150117462734527 +0.00644915425566382206 +0.00643682880116350740 +0.00642452477722913612 +0.00641224215000898382 +0.00639998088569688345 +0.00638774095053206824 +0.00637552231079926805 +0.00636332493282850634 +0.00635114878299514705 +0.00633899382771984689 +0.00632686003346840786 +0.00631474736675190045 +0.00630265579412642336 +0.00629058528219316945 +0.00627853579759836584 +0.00626650730703320977 +0.00625449977723379399 +0.00624251317498107552 +0.00623054746710088696 +0.00621860262046375952 +0.00620667860198498809 +0.00619477537862454970 +0.00618289291738697254 +0.00617103118532147735 +0.00615919014952169726 +0.00614736977712579229 +0.00613557003531634178 +0.00612379089132030884 +0.00611203231240897270 +0.00610029426589787840 +0.00608857671914683589 +0.00607687963955979692 +0.00606520299458486543 +0.00605354675171422899 +0.00604191087848407818 +0.00603029534247465429 +0.00601870011131004027 +0.00600712515265828563 +0.00599557043423122951 +0.00598403592378451976 +0.00597252158911754788 +0.00596102739807335361 +0.00594955331853870215 +0.00593809931844384818 +0.00592666536576266518 +0.00591525142851250050 +0.00590385747475411643 +0.00589248347259174743 +0.00588112939017290063 +0.00586979519568840962 +0.00585848085737237633 +0.00584718634350209644 +0.00583591162239800818 +0.00582465666242365076 +0.00581342143198567383 +0.00580220589953365541 +0.00579101003356019203 +0.00577983380260078863 +0.00576867717523375356 +0.00575754012008031918 +0.00574642260580437991 +0.00573532460111259718 +0.00572424607475430398 +0.00571318699552144683 +0.00570214733224854581 +0.00569112705381263906 +0.00568012612913325419 +0.00566914452717234233 +0.00565818221693423565 +0.00564723916746560656 +0.00563631534785537670 +0.00562541072723476976 +0.00561452527477712942 +0.00560365895969798349 +0.00559281175125493895 +0.00558198361874761868 +0.00557117453151771257 +0.00556038445894877636 +0.00554961337046632440 +0.00553886123553769087 +0.00552812802367203763 +0.00551741370442027871 +0.00550671824737499708 +0.00549604162217051315 +0.00548538379848268441 +0.00547474474602897398 +0.00546412443456838030 +0.00545352283390130102 +0.00544293991386964656 +0.00543237564435662852 +0.00542182999528682472 +0.00541130293662608723 +0.00540079443838148519 +0.00539030447060130213 +0.00537983300337489725 +0.00536938000683281121 +0.00535894545114653544 +0.00534852930652861529 +0.00533813154323252523 +0.00532775213155262019 +0.00531739104182414775 +0.00530704824442311887 +0.00529672370976633222 +0.00528641740831127700 +0.00527612931055611127 +0.00526585938703963505 +0.00525560760834115157 +0.00524537394508056698 +0.00523515836791819955 +0.00522496084755480917 +0.00521478135473157391 +0.00520461986022993737 +0.00519447633487168936 +0.00518435074951881410 +0.00517424307507352403 +0.00516415328247815143 +0.00515408134271513451 +0.00514402722680696624 +0.00513399090581612150 +0.00512397235084507963 +0.00511397153303617350 +0.00510398842357163811 +0.00509402299367351253 +0.00508407521460357836 +0.00507414505766341437 +0.00506423249419418915 +0.00505433749557675314 +0.00504446003323152058 +0.00503460007861845742 +0.00502475760323699370 +0.00501493257862601748 +0.00500512497636382454 +0.00499533476806803250 +0.00498556192539557821 +0.00497580642004267441 +0.00496606822374467960 +0.00495634730827620648 +0.00494664364545090683 +0.00493695720712154524 +0.00492728796517989155 +0.00491763589155670873 +0.00490800095822168259 +0.00489838313718336370 +0.00488878240048919600 +0.00487919872022536151 +0.00486963206851680815 +0.00486008241752720980 +0.00485054973945882317 +0.00484103400655260755 +0.00483153519108800444 +0.00482205326538301393 +0.00481258820179409318 +0.00480313997271611740 +0.00479370855058236338 +0.00478429390786439326 +0.00477489601707210658 +0.00476551485075359799 +0.00475615038149518679 +0.00474680258192132325 +0.00473747142469455561 +0.00472815688251552145 +0.00471885892812281150 +0.00470957753429303034 +0.00470031267384067065 +0.00469106431961812016 +0.00468183244451558355 +0.00467261702146102957 +0.00466341802342018236 +0.00465423542339645467 +0.00464506919443089580 +0.00463591930960215864 +0.00462678574202644854 +0.00461766846485747381 +0.00460856745128640066 +0.00459948267454181846 +0.00459041410788969730 +0.00458136172463331250 +0.00457232549811322896 +0.00456330540170723966 +0.00455430140883033262 +0.00454531349293463196 +0.00453634162750937448 +0.00452738578608083073 +0.00451844594221230671 +0.00450952206950402858 +0.00450061414159316775 +0.00449172213215377498 +0.00448284601489669452 +0.00447398576356959100 +0.00446514135195684534 +0.00445631275387950443 +0.00444749994319530717 +0.00443870289379856824 +0.00442992157962016769 +0.00442115597462747634 +0.00441240605282436360 +0.00440367178825107602 +0.00439495315498427287 +0.00438625012713693679 +0.00437756267885832263 +0.00436889078433393054 +0.00436023441778548432 +0.00435159355347080300 +0.00434296816568385726 +0.00433435822875466361 +0.00432576371704926008 +0.00431718460496964985 +0.00430862086695378392 +0.00430007247747545961 +0.00429153941104433011 +0.00428302164220585851 +0.00427451914554123104 +0.00426603189566735711 +0.00425755986723679904 +0.00424910303493771652 +0.00424066137349385971 +0.00423223485766450677 +0.00422382346224440229 +0.00421542716206375120 +0.00420704593198811642 +0.00419867974691843625 +0.00419032858179094105 +0.00418199241157712551 +0.00417367121128370093 +0.00416536495595254668 +0.00415707362066065206 +0.00414879718052011369 +0.00414053561067805834 +0.00413228888631659956 +0.00412405698265280209 +0.00411583987493865239 +0.00410763753846096150 +0.00409944994854139193 +0.00409127708053636224 +0.00408311890983702880 +0.00407497541186922514 +0.00406684656209343586 +0.00405873233600471776 +0.00405063270913270414 +0.00404254765704153453 +0.00403447715532979836 +0.00402642117963052104 +0.00401837970561110501 +0.00401035270897326986 +0.00400234016545303415 +0.00399434205082066507 +0.00398635834088062729 +0.00397838901147154912 +0.00397043403846616960 +0.00396249339777128042 +0.00395456706532772411 +0.00394665501711031867 +0.00393875722912782281 +0.00393087367742287613 +0.00392300433807199998 +0.00391514918718548991 +0.00390730820090742000 +0.00389948135541560168 +0.00389166862692149739 +0.00388386999167021759 +0.00387608542594047867 +0.00386831490604450578 +0.00386055840832805761 +0.00385281590917034046 +0.00384508738498398617 +0.00383737281221500220 +0.00382967216734270794 +0.00382198542687973335 +0.00381431256737192834 +0.00380665356539836020 +0.00379900839757124935 +0.00379137704053592690 +0.00378375947097080167 +0.00377615566558729687 +0.00376856560112983057 +0.00376098925437576238 +0.00375342660213534183 +0.00374587762125168236 +0.00373834228860070580 +0.00373082058109109379 +0.00372331247566426741 +0.00371581794929432517 +0.00370833697898800309 +0.00370086954178463308 +0.00369341561475611604 +0.00368597517500683473 +0.00367854819967366282 +0.00367113466592588903 +0.00366373455096519847 +0.00365634783202559068 +0.00364897448637339699 +0.00364161449130715733 +0.00363426782415765797 +0.00362693446228784392 +0.00361961438309277902 +0.00361230756399961821 +0.00360501398246756239 +0.00359773361598778561 +0.00359046644208343502 +0.00358321243830957365 +0.00357597158225312186 +0.00356874385153284129 +0.00356152922379926462 +0.00355432767673466779 +0.00354713918805303575 +0.00353996373550000002 +0.00353280129685281307 +0.00352565184992029807 +0.00351851537254281414 +0.00351139184259218742 +0.00350428123797170976 +0.00349718353661607065 +0.00349009871649131080 +0.00348302675559480262 +0.00347596763195518518 +0.00346892132363232734 +0.00346188780871729569 +0.00345486706533230156 +0.00344785907163067205 +0.00344086380579679361 +0.00343388124604606000 +0.00342691137062486580 +0.00341995415781053526 +0.00341300958591128720 +0.00340607763326619814 +0.00339915827824515846 +0.00339225149924881481 +0.00338535727470855004 +0.00337847558308643952 +0.00337160640287518815 +0.00336474971259811398 +0.00335790549080909866 +0.00335107371609251730 +0.00334425436706324228 +0.00333744742236657954 +0.00333065286067821568 +0.00332387066070420319 +0.00331710080118088804 +0.00331034326087488841 +0.00330359801858304530 +0.00329686505313238733 +0.00329014434338008224 +0.00328343586821339779 +0.00327673960654966453 +0.00327005553733621546 +0.00326338363955036657 +0.00325672389219937297 +0.00325007627432036912 +0.00324344076498035011 +0.00323681734327611621 +0.00323020598833422424 +0.00322360667931096724 +0.00321701939539232023 +0.00321044411579389424 +0.00320388081976091333 +0.00319732948656814868 +0.00319079009551989168 +0.00318426262594990453 +0.00317774705722140413 +0.00317124336872698061 +0.00316475153988857779 +0.00315827155015747279 +0.00315180337901417714 +0.00314534700596845159 +0.00313890241055924182 +0.00313246957235464168 +0.00312604847095183805 +0.00311963908597710001 +0.00311324139708569255 +0.00310685538396187916 +0.00310048102631885984 +0.00309411830389873114 +0.00308776719647244503 +0.00308142768383978544 +0.00307509974582927895 +0.00306878336229821167 +0.00306247851313255727 +0.00305618517824693837 +0.00304990333758459360 +0.00304363297111732945 +0.00303737405884546520 +0.00303112658079783418 +0.00302489051703169406 +0.00301866584763273160 +0.00301245255271497935 +0.00300625061242080875 +0.00300006000692084728 +0.00299388071641399755 +0.00298771272112734665 +0.00298155600131614533 +0.00297541053726376944 +0.00296927630928166915 +0.00296315329770932556 +0.00295704148291423257 +0.00295094084529182827 +0.00294485136526547895 +0.00293877302328641142 +0.00293270579983371258 +0.00292664967541423097 +0.00292060463056258808 +0.00291457064584111801 +0.00290854770183982978 +0.00290253577917634880 +0.00289653485849591594 +0.00289054492047129477 +0.00288456594580277980 +0.00287859791521813098 +0.00287264080947252816 +0.00286669460934855505 +0.00286075929565614111 +0.00285483484923250213 +0.00284892125094214719 +0.00284301848167680402 +0.00283712652235538262 +0.00283124535392394964 +0.00282537495735566292 +0.00281951531365075454 +0.00281366640383648708 +0.00280782820896709889 +0.00280200071012377729 +0.00279618388841461557 +0.00279037772497456749 +0.00278458220096540953 +0.00277879729757570968 +0.00277302299602077062 +0.00276725927754261150 +0.00276150612340990463 +0.00275576351491794123 +0.00275003143338859975 +0.00274430986017031421 +0.00273859877663800355 +0.00273289816419306246 +0.00272720800426330505 +0.00272152827830291410 +0.00271585896779243758 +0.00271020005423871103 +0.00270455151917484539 +0.00269891334416015767 +0.00269328551078017089 +0.00268766800064651869 +0.00268206079539696704 +0.00267646387669533614 +0.00267087722623146184 +0.00266530082572117178 +0.00265973465690624291 +0.00265417870155433338 +0.00264863294145898558 +0.00264309735843956195 +0.00263757193434120945 +0.00263205665103481310 +0.00262655149041697523 +0.00262105643440994863 +0.00261557146496162098 +0.00261009656404546367 +0.00260463171366049490 +0.00259917689583123810 +0.00259373209260768895 +0.00258829728606525550 +0.00258287245830475130 +0.00257745759145232333 +0.00257205266765943991 +0.00256665766910283300 +0.00256127257798446223 +0.00255589737653147235 +0.00255053204699617073 +0.00254517657165596618 +0.00253983093281333989 +0.00253449511279581034 +0.00252916909395589249 +0.00252385285867102929 +0.00251854638934360551 +0.00251324966840087453 +0.00250796267829490969 +0.00250268540150259868 +0.00249741782052557851 +0.00249215991789019471 +0.00248691167614748226 +0.00248167307787310661 +0.00247644410566733942 +0.00247122474215500645 +0.00246601496998546509 +0.00246081477183253232 +0.00245562413039448427 +0.00245044302839400032 +0.00244527144857811579 +0.00244010937371819895 +0.00243495678660990466 +0.00242981367007311187 +0.00242468000695193883 +0.00241955578011465505 +0.00241444097245366090 +0.00240933556688545120 +0.00240423954635056924 +0.00239915289381356384 +0.00239407559226297115 +0.00238900762471124656 +0.00238394897419475817 +0.00237889962377371613 +0.00237385955653215443 +0.00236882875557787925 +0.00236380720404244689 +0.00235879488508110519 +0.00235379178187277100 +0.00234879787761997855 +0.00234381315554885606 +0.00233883759890906283 +0.00233387119097377017 +0.00232891391503962800 +0.00232396575442670155 +0.00231902669247845356 +0.00231409671256170265 +0.00230917579806656607 +0.00230426393240644976 +0.00229936109901799539 +0.00229446728136102791 +0.00228958246291854732 +0.00228470662719666489 +0.00227983975772457371 +0.00227498183805450917 +0.00227013285176171737 +0.00226529278244440432 +0.00226046161372370517 +0.00225563932924364129 +0.00225082591267108901 +0.00224602134769573240 +0.00224122561803003330 +0.00223643870740918276 +0.00223166059959108458 +0.00222689127835627157 +0.00222213072750791947 +0.00221737893087178058 +0.00221263587229615253 +0.00220790153565183014 +0.00220317590483208679 +0.00219845896375261063 +0.00219375069635149118 +0.00218905108658916121 +0.00218436011844837762 +0.00217967777593416337 +0.00217500404307379141 +0.00217033890391671877 +0.00216568234253456792 +0.00216103434302109421 +0.00215639488949213214 +0.00215176396608555845 +0.00214714155696126962 +0.00214252764630111893 +0.00213792221830890567 +0.00213332525721032047 +0.00212873674725290929 +0.00212415667270603788 +0.00211958501786085407 +0.00211502176703024913 +0.00211046690454881917 +0.00210592041477282834 +0.00210138228208017405 +0.00209685249087034151 +0.00209233102556437853 +0.00208781787060483221 +0.00208331301045574374 +0.00207881642960259507 +0.00207432811255226250 +0.00206984804383299930 +0.00206537620799438848 +0.00206091258960728035 +0.00205645717326380850 +0.00205200994357730487 +0.00204757088518228193 +0.00204313998273440191 +0.00203871722091041822 +0.00203430258440815337 +0.00202989605794646122 +0.00202549762626518404 +0.00202110727412511655 +0.00201672498630797769 +0.00201235074761635683 +0.00200798454287368089 +0.00200362635692418953 +0.00199927617463289140 +0.00199493398088551599 +0.00199059976058849151 +0.00198627349866890585 +0.00198195518007444763 +0.00197764478977340355 +0.00197334231275460336 +0.00196904773402737212 +0.00196476103862151851 +0.00196048221158728019 +0.00195621123799527997 +0.00195194810293651435 +0.00194769279152229541 +0.00194344528888422234 +0.00193920558017413752 +0.00193497365056411320 +0.00193074948524636940 +0.00192653306943328054 +0.00192232438835732307 +0.00191812342727103072 +0.00191393017144697499 +0.00190974460617771295 +0.00190556671677575293 +0.00190139648857352741 +0.00189723390692334601 +0.00189307895719737353 +0.00188893162478757427 +0.00188479189510568838 +0.00188065975358318459 +0.00187653518567124371 +0.00187241817684070250 +0.00186830871258202740 +0.00186420677840527381 +0.00186011235984005719 +0.00185602544243550108 +0.00185194601176021751 +0.00184787405340226720 +0.00184380955296911935 +0.00183975249608761722 +0.00183570286840393734 +0.00183166065558356523 +0.00182762584331124900 +0.00182359841729096963 +0.00181957836324590392 +0.00181556566691838759 +0.00181156031406987019 +0.00180756229048089994 +0.00180357158195107361 +0.00179958817429900272 +0.00179561205336228164 +0.00179164320499745357 +0.00178768161507995545 +0.00178372726950411925 +0.00177978015418310152 +0.00177584025504887145 +0.00177190755805215990 +0.00176798204916243560 +0.00176406371436785953 +0.00176015253967525876 +0.00175624851111009193 +0.00175235161471640373 +0.00174846183655679843 +0.00174457916271240974 +0.00174070357928284535 +0.00173683507238617816 +0.00173297362815889042 +0.00172911923275585657 +0.00172527187235029552 +0.00172143153313374011 +0.00171759820131599824 +0.00171377186312513191 +0.00170995250480740642 +0.00170614011262726719 +0.00170233467286730073 +0.00169853617182820515 +0.00169474459582874180 +0.00169095993120571639 +0.00168718216431394067 +0.00168341128152620003 +0.00167964726923321107 +0.00167589011384360422 +0.00167213980178385980 +0.00166839631949831078 +0.00166465965344908605 +0.00166092979011608325 +0.00165720671599693583 +0.00165349041760697664 +0.00164978088147920148 +0.00164607809416425044 +0.00164238204223035524 +0.00163869271226332121 +0.00163501009086648719 +0.00163133416466069645 +0.00162766492028424336 +0.00162400234439288296 +0.00162034642365975283 +0.00161669714477537555 +0.00161305449444759858 +0.00160941845940158236 +0.00160578902637974956 +0.00160216618214177294 +0.00159854991346452201 +0.00159494020714205220 +0.00159133704998555081 +0.00158774042882332475 +0.00158415033050075013 +0.00158056674188025150 +0.00157698964984127237 +0.00157341904128023504 +0.00156985490311051701 +0.00156629722226240978 +0.00156274598568308869 +0.00155920118033659621 +0.00155566279320379277 +0.00155213081128233415 +0.00154860522158663683 +0.00154508601114785715 +0.00154157316701383535 +0.00153806667624909496 +0.00153456652593479573 +0.00153107270316870194 +0.00152758519506516013 +0.00152410398875506238 +0.00152062907138581253 +0.00151716043012130992 +0.00151369805214190381 +0.00151024192464437480 +0.00150679203484189658 +0.00150334836996401325 +0.00149991091725660088 +0.00149647966398184628 +0.00149305459741821381 +0.00148963570486042177 +0.00148622297361939836 +0.00148281639102227627 +0.00147941594441233196 +0.00147602162114898977 +0.00147263340860777077 +0.00146925129418027387 +0.00146587526527415198 +0.00146250530931306194 +0.00145914141373666099 +0.00145578356600057084 +0.00145243175357634316 +0.00144908596395143942 +0.00144574618462920139 +0.00144241240312881431 +0.00143908460698530033 +0.00143576278374947237 +0.00143244692098791460 +0.00142913700628295465 +0.00142583302723264219 +0.00142253497145070355 +0.00141924282656654094 +0.00141595658022519049 +0.00141267622008730176 +0.00140940173382910340 +0.00140613310914239321 +0.00140287033373449194 +0.00139961339532823636 +0.00139636228166194415 +0.00139311698048939130 +0.00138987747957978504 +0.00138664376671774887 +0.00138341582970327379 +0.00138019365635172562 +0.00137697723449379931 +0.00137376655197549722 +0.00137056159665811675 +0.00136736235641821374 +0.00136416881914758073 +0.00136098097275323031 +0.00135779880515736885 +0.00135462230429737678 +0.00135145145812577130 +0.00134828625461021071 +0.00134512668173343976 +0.00134197272749329096 +0.00133882437990265790 +0.00133568162698947121 +0.00133254445679667531 +0.00132941285738220959 +0.00132628681681898212 +0.00132316632319486082 +0.00132005136461264263 +0.00131694192919003619 +0.00131383800505964119 +0.00131073958036893347 +0.00130764664328022898 +0.00130455918197068836 +0.00130147718463227875 +0.00129840063947176581 +0.00129532953471068568 +0.00129226385858534267 +0.00128920359934676259 +0.00128614874526070534 +0.00128309928460762848 +0.00128005520568268269 +0.00127701649679568051 +0.00127398314627108944 +0.00127095514244800634 +0.00126793247368015352 +0.00126491512833585770 +0.00126190309479802770 +0.00125889636146414314 +0.00125589491674624946 +0.00125289874907091956 +0.00124990784687926157 +0.00124692219862689740 +0.00124394179278394280 +0.00124096661783500172 +0.00123799666227915176 +0.00123503191462992078 +0.00123207236341528535 +0.00122911799717766038 +0.00122616880447387567 +0.00122322477387517550 +0.00122028589396719930 +0.00121735215334996629 +0.00121442354063788088 +0.00121150004445970969 +0.00120858165345857373 +0.00120566835629194063 +0.00120276014163161614 +0.00119985699816372465 +0.00119695891458871631 +0.00119406587962134756 +0.00119117788199068217 +0.00118829491044007132 +0.00118541695372716333 +0.00118254400062387183 +0.00117967603991639522 +0.00117681306040520088 +0.00117395505090501346 +0.00117110200024481766 +0.00116825389726785372 +0.00116541073083159552 +0.00116257248980778131 +0.00115973916308237434 +0.00115691073955558272 +0.00115408720814184950 +0.00115126855776984485 +0.00114845477738247082 +0.00114564585593686223 +0.00114284178240437991 +0.00114004254577061248 +0.00113724813503538304 +0.00113445853921272295 +0.00113167374733091301 +0.00112889374843245702 +0.00112611853157409394 +0.00112334808582679243 +0.00112058240027576475 +0.00111782146402045353 +0.00111506526617456041 +0.00111231379586602540 +0.00110956704223705077 +0.00110682499444408975 +0.00110408764165787474 +0.00110135497306338781 +0.00109862697785991122 +0.00109590364526100420 +0.00109318496449452144 +0.00109047092480261975 +0.00108776151544177782 +0.00108505672568277867 +0.00108235654481075275 +0.00107966096212516694 +0.00107696996693984991 +0.00107428354858299336 +0.00107160169639716730 +0.00106892439973933382 +0.00106625164798086780 +0.00106358343050756286 +0.00106091973671964992 +0.00105826055603181466 +0.00105560587787320820 +0.00105295569168746897 +0.00105030998693273945 +0.00104766875308168628 +0.00104503197962151962 +0.00104239965605400415 +0.00103977177189549467 +0.00103714831667694194 +0.00103452927994392477 +0.00103191465125666653 +0.00102930442019006610 +0.00102669857633371463 +0.00102409710929192281 +0.00102150000868373846 +0.00101890726414299447 +0.00101631886531830615 +0.00101373480187312657 +0.00101115506348575606 +0.00100857963984937933 +0.00100600852067209254 +0.00100344169567693803 +0.00100087915460193118 +0.00099832088720009662 +0.00099576688323949861 +0.00099321713250327855 +0.00099067162478968097 +0.00098813034991210259 +0.00098559329769911893 +0.00098306045799452491 +0.00098053182065737298 +0.00097800737556201435 +0.00097548711259813105 +0.00097297102167078441 +0.00097045909270045735 +0.00096795131562309514 +0.00096544768039014226 +0.00096294817696860127 +0.00096045279534106296 +0.00095796152550576121 +0.00095547435747662349 +0.00095299128128330777 +0.00095051228697126395 +0.00094803736460178061 +0.00094556650425202447 +0.00094309969601510946 +0.00094063693000014602 +0.00093817819633228530 +0.00093572348515278824 +0.00093327278661907312 +0.00093082609090476976 +0.00092838338819978879 +0.00092594466871037738 +0.00092350992265917496 +0.00092107914028527829 +0.00091865231184430727 +0.00091622942760845847 +0.00091381047786658434 +0.00091139545292425058 +0.00090898434310380410 +0.00090657713874444637 +0.00090417383020229209 +0.00090177440785045332 +0.00089937886207910325 +0.00089698718329555205 +0.00089459936192432064 +0.00089221538840721906 +0.00088983525320341067 +0.00088745894678951011 +0.00088508645965964985 +0.00088271778232556347 +0.00088035290531666489 +0.00087799181918014099 +0.00087563451448101695 +0.00087328098180226561 +0.00087093121174488055 +0.00086858519492796380 +0.00086624292198881920 +0.00086390438358304985 +0.00086156957038463207 +0.00085923847308602870 +0.00085691108239827573 +0.00085458738905108114 +0.00085226738379291767 +0.00084995105739112944 +0.00084763840063202252 +0.00084532940432098470 +0.00084302405928257207 +0.00084072235636062213 +0.00083842428641835870 +0.00083612984033850832 +0.00083383900902338757 +0.00083155178339504191 +0.00082926815439534176 +0.00082698811298610145 +0.00082471165014919435 +0.00082243875688667301 +0.00082016942422088025 +0.00081790364319458183 +0.00081564140487107599 +0.00081338270033433314 +0.00081112752068910232 +0.00080887585706105507 +0.00080662770059690251 +0.00080438304246453155 +0.00080214187385313864 +0.00079990418597335980 +0.00079766997005740906 +0.00079543921735921342 +0.00079321191915454733 +0.00079098806674118881 +0.00078876765143904464 +0.00078655066459030684 +0.00078433709755959394 +0.00078212694173409865 +0.00077992018852373376 +0.00077771682936129266 +0.00077551685570260054 +0.00077332025902666262 +0.00077112703083582861 +0.00076893716265594993 +0.00076675064603653467 +0.00076456747255091969 +0.00076238763379643353 +0.00076021112139455641 +0.00075803792699109438 +0.00075586804225635080 +0.00075370145888529029 +0.00075153816859772579 +0.00074937816313848632 +0.00074722143427759789 +0.00074506797381046551 +0.00074291777355805014 +0.00074077082536706113 +0.00073862712111013543 +0.00073648665268603365 +0.00073434941201982063 +0.00073221539106307367 +0.00073008458179406050 +0.00072795697621794511 +0.00072583256636698634 +0.00072371134430074128 +0.00072159330210626088 +0.00071947843189830646 +0.00071736672581954736 +0.00071525817604077395 +0.00071315277476111626 +0.00071105051420824854 +0.00070895138663861000 +0.00070685538433762764 +0.00070476249961993142 +0.00070267272482957516 +0.00070058605234026993 +0.00069850247455561078 +0.00069642198390929987 +0.00069434457286538410 +0.00069227023391849095 +0.00069019895959405552 +0.00068813074244857811 +0.00068606557506984572 +0.00068400345007718969 +0.00068194436012172755 +0.00067988829788660668 +0.00067783525608726457 +0.00067578522747167565 +0.00067373820482060894 +0.00067169418094788615 +0.00066965314870064076 +0.00066761510095957944 +0.00066558003063925386 +0.00066354793068832232 +0.00066151879408982216 +0.00065949261386143859 +0.00065746938305578852 +0.00065544909476068184 +0.00065343174209942022 +0.00065141731823106829 +0.00064940581635073639 +0.00064739722968987657 +0.00064539155151656499 +0.00064338877513579100 +0.00064138889388976451 +0.00063939190115819939 +0.00063739779035862278 +0.00063540655494666873 +0.00063341818841638976 +0.00063143268430055364 +0.00062945003617096806 +0.00062747023763877832 +0.00062549328235478709 +0.00062351916400977538 +0.00062154787633481089 +0.00061957941310157897 +0.00061761376812270394 +0.00061565093525207558 +0.00061369090838517780 +0.00061173368145942041 +0.00060977924845447614 +0.00060782760339260554 +0.00060587874033901298 +0.00060393265340217672 +0.00060198933673419634 +0.00060004878453113369 +0.00059811099103337538 +0.00059617595052596241 +0.00059424365733896098 +0.00059231410584781763 +0.00059038729047370601 +0.00058846320568389614 +0.00058654184599211978 +0.00058462320595892314 +0.00058270728019205100 +0.00058079406334680711 +0.00057888355012642703 +0.00057697573528245382 +0.00057507061361511934 +0.00057316817997371593 +0.00057126842925698076 +0.00056937135641348493 +0.00056747695644201535 +0.00056558522439195712 +0.00056369615536369828 +0.00056180974450900526 +0.00055992598703143127 +0.00055804487818671069 +0.00055616641328315008 +0.00055429058768203838 +0.00055241739679804834 +0.00055054683609963415 +0.00054867890110945055 +0.00054681358740475369 +0.00054495089061781560 +0.00054309080643633544 +0.00054123333060385821 +0.00053937845892018340 +0.00053752618724179550 +0.00053567651148227343 +0.00053382942761272018 +0.00053198493166218414 +0.00053014301971808704 +0.00052830368792664137 +0.00052646693249329532 +0.00052463274968315326 +0.00052280113582140820 +0.00052097208729377700 +0.00051914560054694013 +0.00051732167208896473 +0.00051550029848976004 +0.00051368147638150259 +0.00051186520245908554 +0.00051005147348055335 +0.00050824028626755304 +0.00050643163770576623 +0.00050462552474536660 +0.00050282194440145838 +0.00050102089375452853 +0.00049922236995088916 +0.00049742637020313164 +0.00049563289179056910 +0.00049384193205969621 +0.00049205348842463385 +0.00049026755836758282 +0.00048848413943927672 +0.00048670322925942910 +0.00048492482551719596 +0.00048314892597162276 +0.00048137552845209912 +0.00047960463085881409 +0.00047783623116321122 +0.00047607032740843423 +0.00047430691770979544 +0.00047254600025521660 +0.00047078757330569395 +0.00046903163519574015 +0.00046727818433384930 +0.00046552721920293584 +0.00046377873836080276 +0.00046203274044058056 +0.00046028922415118563 +0.00045854818827776797 +0.00045680963168216054 +0.00045507355330332250 +0.00045333995215779941 +0.00045160882734015791 +0.00044988017802343383 +0.00044815400345957971 +0.00044643030297990223 +0.00044470907599550015 +0.00044299032199771418 +0.00044127404055855333 +0.00043956023133113543 +0.00043784889405011819 +0.00043614002853213538 +0.00043443363467621568 +0.00043272971246421878 +0.00043102826196125691 +0.00042932928331611465 +0.00042763277676167137 +0.00042593874261531500 +0.00042424718127934992 +0.00042255809324141883 +0.00042087147907490178 +0.00041918733943932144 +0.00041750567508074384 +0.00041582648683217434 +0.00041414977561394926 +0.00041247554243412706 +0.00041080378838887659 +0.00040913451466284919 +0.00040746772252956407 +0.00040580341335177527 +0.00040414158858183974 +0.00040248224976208364 +0.00040082539852515678 +0.00039917103659438890 +0.00039751916578413597 +0.00039586978800012275 +0.00039422290523977562 +0.00039257851959256524 +0.00039093663324032084 +0.00038929724845755865 +0.00038766036761178635 +0.00038602599316382241 +0.00038439412766808290 +0.00038276477377288828 +0.00038113793422074420 +0.00037951361184862656 +0.00037789180958824805 +0.00037627253046633284 +0.00037465577760486645 +0.00037304155422135496 +0.00037142986362906572 +0.00036982070923725923 +0.00036821409455142020 +0.00036661002317347655 +0.00036500849880200203 +0.00036340952523242979 +0.00036181310635723725 +0.00036021924616612947 +0.00035862794874621655 +0.00035703921828217865 +0.00035545305905641263 +0.00035386947544918998 +0.00035228847193878441 +0.00035071005310159621 +0.00034913422361227076 +0.00034756098824379947 +0.00034599035186761123 +0.00034442231945365867 +0.00034285689607048788 +0.00034129408688529482 +0.00033973389716397516 +0.00033817633227116288 +0.00033662139767024542 +0.00033506909892338583 +0.00033351944169151578 +0.00033197243173432536 +0.00033042807491023368 +0.00032888637717635359 +0.00032734734458843268 +0.00032581098330079636 +0.00032427729956626230 +0.00032274629973604832 +0.00032121799025966962 +0.00031969237768480558 +0.00031816946865717783 +0.00031664926992039150 +0.00031513178831577221 +0.00031361703078218456 +0.00031210500435583971 +0.00031059571617007576 +0.00030908917345514312 +0.00030758538353795398 +0.00030608435384182653 +0.00030458609188620771 +0.00030309060528638894 +0.00030159790175318646 +0.00030010798909262863 +0.00029862087520561033 +0.00029713656808753175 +0.00029565507582792616 +0.00029417640661006685 +0.00029270056871054753 +0.00029122757049886605 +0.00028975742043697015 +0.00028829012707879157 +0.00028682569906976366 +0.00028536414514632224 +0.00028390547413537548 +0.00028244969495377437 +0.00028099681660774707 +0.00027954684819232186 +0.00027809979889073121 +0.00027665567797379272 +0.00027521449479926663 +0.00027377625881121122 +0.00027234097953929504 +0.00027090866659810336 +0.00026947932968642111 +0.00026805297858649511 +0.00026662962316327104 +0.00026520927336362116 +0.00026379193921553980 +0.00026237763082732370 +0.00026096635838672802 +0.00025955813216010665 +0.00025815296249152213 +0.00025675085980184510 +0.00025535183458782448 +0.00025395589742113934 +0.00025256305894742499 +0.00025117332988528683 +0.00024978672102527632 +0.00024840324322886436 +0.00024702290742738042 +0.00024564572462092881 +0.00024427170587728962 +0.00024290086233079398 +0.00024153320518117510 +0.00024016874569240254 +0.00023880749519149109 +0.00023744946506728458 +0.00023609466676922187 +0.00023474311180608201 +0.00023339481174469433 +0.00023204977820864901 +0.00023070802287696265 +0.00022936955748273475 +0.00022803439381177784 +0.00022670254370122682 +0.00022537401903812047 +0.00022404883175797266 +0.00022272699384330929 +0.00022140851732218987 +0.00022009341426670491 +0.00021878169679145334 +0.00021747337705199180 +0.00021616846724327452 +0.00021486697959805965 +0.00021356892638529803 +0.00021227431990850418 +0.00021098317250410086 +0.00020969549653974254 +0.00020841130441262543 +0.00020713060854776722 +0.00020585342139626986 +0.00020457975543356424 +0.00020330962315763114 +0.00020204303708719958 +0.00020078000975993625 +0.00019952055373060248 +0.00019826468156919718 +0.00019701240585908093 +0.00019576373919508234 +0.00019451869418157656 +0.00019327728343056024 +0.00019203951955969501 +0.00019080541519033841 +0.00018957498294555776 +0.00018834823544812394 +0.00018712518531848604 +0.00018590584517273840 +0.00018469022762055985 +0.00018347834526314424 +0.00018227021069111028 +0.00018106583648239621 +0.00017986523520014603 +0.00017866841939057139 +0.00017747540158080395 +0.00017628619427673283 +0.00017510080996082936 +0.00017391926108995291 +0.00017274156009315346 +0.00017156771936945386 +0.00017039775128562226 +0.00016923166817393216 +0.00016806948232991488 +0.00016691120601009183 +0.00016575685142971135 +0.00016460643076046178 +0.00016345995612818110 +0.00016231743961055842 +0.00016117889323482624 +0.00016004432897543912 +0.00015891375875175761 +0.00015778719442571256 +0.00015666464779947077 +0.00015554613061308982 +0.00015443165454217376 +0.00015332123119551395 +0.00015221487211273922 +0.00015111258876195096 +0.00015001439253736109 +0.00014892029475692444 +0.00014783030665997283 +0.00014674443940484002 +0.00014566270406650035 +0.00014458511163419142 +0.00014351167300904666 +0.00014244239900172652 +0.00014137730033005207 +0.00014031638761663633 +0.00013925967138652860 +0.00013820716206485221 +0.00013715886997445079 +0.00013611480533354034 +0.00013507497825336579 +0.00013403939873586003 +0.00013300807667131781 +0.00013198102183607048 +0.00013095824389017051 +0.00012993975237508596 +0.00012892555671140286 +0.00012791566619653726 +0.00012691009000246207 +0.00012590883717344099 +0.00012491191662377510 +0.00012391933713556402 +0.00012293110735648102 +0.00012194723579755565 +0.00012096773083098366 +0.00011999260068793976 +0.00011902185345641399 +0.00011805549707906165 +0.00011709353935107408 +0.00011613598791806021 +0.00011518285027395829 +0.00011423413375895662 +0.00011328984555744068 +0.00011234999269595689 +0.00011141458204120259 +0.00011048362029803099 +0.00010955711400748957 +0.00010863506954487006 +0.00010771749311779088 +0.00010680439076430042 +0.00010589576835100762 +0.00010499163157123387 +0.00010409198594320032 +0.00010319683680823301 +0.00010230618932900173 +0.00010142004848778428 +0.00010053841908476233 +0.00009966130573634098 +0.00009878871287350876 +0.00009792064474021815 +0.00009705710539180302 +0.00009619809869342526 +0.00009534362831855720 +0.00009449369774749003 +0.00009364831026588584 +0.00009280746896335510 +0.00009197117673207145 +0.00009113943626542206 +0.00009031225005669428 +0.00008948962039779276 +0.00008867154937800208 +0.00008785803888277903 +0.00008704909059258394 +0.00008624470598175084 +0.00008544488631739589 +0.00008464963265836112 +0.00008385894585420282 +0.00008307282654421436 +0.00008229127515649126 +0.00008151429190703497 +0.00008074187679889607 +0.00007997402962136396 +0.00007921074994918931 +0.00007845203714185478 +0.00007769789034288226 +0.00007694830847918706 +0.00007620329026046763 +0.00007546283417864649 +0.00007472693850734542 +0.00007399560130140877 +0.00007326882039646755 +0.00007254659340854837 +0.00007182891773372154 +0.00007111579054780104 +0.00007040720880607996 +0.00006970316924311348 +0.00006900366837254568 +0.00006830870248698106 +0.00006761826765789567 +0.00006693235973560079 +0.00006625097434924249 +0.00006557410690685042 +0.00006490175259542856 +0.00006423390638109204 +0.00006357056300924453 +0.00006291171700480662 +0.00006225736267248095 +0.00006160749409706569 +0.00006096210514381129 +0.00006032118945882083 +0.00005968474046949159 +0.00005905275138500751 +0.00005842521519686650 +0.00005780212467945706 +0.00005718347239067491 +0.00005656925067258489 +0.00005595945165212168 +0.00005535406724183958 +0.00005475308914069832 +0.00005415650883489387 +0.00005356431759873060 +0.00005297650649553491 +0.00005239306637860843 +0.00005181398789222634 +0.00005123926147267150 +0.00005066887734931090 +0.00005010282554571235 +0.00004954109588080025 +0.00004898367797004783 +0.00004843056122671436 +0.00004788173486311390 +0.00004733718789192601 +0.00004679690912754181 +0.00004626088718744920 +0.00004572911049365049 +0.00004520156727412210 +0.00004467824556430446 +0.00004415913320862963 +0.00004364421786208276 +0.00004313348699179797 +0.00004262692787868560 +0.00004212452761909734 +0.00004162627312651888 +0.00004113215113329622 +0.00004064214819239368 +0.00004015625067918300 +0.00003967444479325917 +0.00003919671656029207 +0.00003872305183390125 +0.00003825343629756171 +0.00003778785546653699 +0.00003732629468983973 +0.00003686873915221652 +0.00003641517387616299 +0.00003596558372395931 +0.00003551995339973329 +0.00003507826745154608 +0.00003464051027350154 +0.00003420666610787687 +0.00003377671904727831 +0.00003335065303681454 +0.00003292845187629214 +0.00003251009922243104 +0.00003209557859109932 +0.00003168487335956411 +0.00003127796676876486 +0.00003087484192559915 +0.00003047548180522744 +0.00003007986925339238 +0.00002968798698875439 +0.00002929981760523876 +0.00002891534357440082 +0.00002853454724779964 +0.00002815741085938625 +0.00002778391652790322 +0.00002741404625929296 +0.00002704778194912029 +0.00002668510538500004 +0.00002632599824903585 +0.00002597044212026597 +0.00002561841847711761 +0.00002526990869986501 +0.00002492489407309813 +0.00002458335578819186 +0.00002424527494578295 +0.00002391063255824903 +0.00002357940955219246 +0.00002325158677092413 +0.00002292714497695307 +0.00002260606485447356 +0.00002228832701185480 +0.00002197391198413001 +0.00002166280023548498 +0.00002135497216174414 +0.00002105040809285716 +0.00002074908829538038 +0.00002045099297495611 +0.00002015610227878796 +0.00001986439629811220 +0.00001957585507066212 +0.00001929045858313014 +0.00001900818677362025 +0.00001872901953409570 +0.00001845293671281841 +0.00001817991811678108 +0.00001790994351412923 +0.00001764299263657701 +0.00001737904518181073 +0.00001711808081588327 +0.00001686007917559819 +0.00001660501987088228 +0.00001635288248714554 +0.00001610364658763157 +0.00001585729171575246 +0.00001561379739741215 +0.00001537314314331576 +0.00001513530845126507 +0.00001490027280843841 +0.00001466801569365813 +0.00001443851657963970 +0.00001421175493522709 +0.00001398771022761099 +0.00001376636192453095 +0.00001354768949645947 +0.00001333167241877061 +0.00001311829017388911 +0.00001290752225342203 +0.00001269934816027206 +0.00001249374741073204 +0.00001229069953655943 +0.00001209018408703322 +0.00001189218063098919 +0.00001169666875883610 +0.00001150362808455129 +0.00001131303824765573 +0.00001112487891516740 +0.00001093912978353534 +0.00001075577058055027 +0.00001057478106723465 +0.00001039614103971062 +0.00001021983033104593 +0.00001004582881307678 +0.00000987411639820984 +0.00000970467304119977 +0.00000953747874090482 +0.00000937251354201913 +0.00000920975753678193 +0.00000904919086666259 +0.00000889079372402380 +0.00000873454635375948 +0.00000858042905490958 +0.00000842842218225094 +0.00000827850614786440 +0.00000813066142267675 +0.00000798486853798033 +0.00000784110808692664 +0.00000769936072599646 +0.00000755960717644533 +0.00000742182822572486 +0.00000728600472887876 +0.00000715211760991561 +0.00000702014786315592 +0.00000689007655455510 +0.00000676188482300175 +0.00000663555388159154 +0.00000651106501887576 +0.00000638839960008658 +0.00000626753906833648 +0.00000614846494579379 +0.00000603115883483353 +0.00000591560241916396 +0.00000580177746492804 +0.00000568966582178178 +0.00000557924942394700 +0.00000547051029124053 +0.00000536343053007917 +0.00000525799233445998 +0.00000515417798691779 +0.00000505196985945748 +0.00000495135041446324 +0.00000485230220558377 +0.00000475480787859418 +0.00000465885017223371 +0.00000456441191902126 +0.00000447147604604650 +0.00000438002557573850 +0.00000429004362661122 +0.00000420151341398622 +0.00000411441825069232 +0.00000402874154774348 +0.00000394446681499353 +0.00000386157766176898 +0.00000378005779747980 +0.00000369989103220823 +0.00000362106127727558 +0.00000354355254578819 +0.00000346734895316124 +0.00000339243471762174 +0.00000331879416069041 +0.00000324641170764281 +0.00000317527188794950 +0.00000310535933569641 +0.00000303665878998425 +0.00000296915509530826 +0.00000290283320191803 +0.00000283767816615768 +0.00000277367515078635 +0.00000271080942528005 +0.00000264906636611388 +0.00000258843145702569 +0.00000252889028926120 +0.00000247042856180067 +0.00000241303208156721 +0.00000235668676361770 +0.00000230137863131540 +0.00000224709381648532 +0.00000219381855955238 +0.00000214153920966238 +0.00000209024222478610 +0.00000203991417180713 +0.00000199054172659297 +0.00000194211167405008 +0.00000189461090816317 +0.00000184802643201864 +0.00000180234535781251 +0.00000175755490684345 +0.00000171364240949048 +0.00000167059530517602 +0.00000162840114231447 +0.00000158704757824644 +0.00000154652237915873 +0.00000150681341999093 +0.00000146790868432795 +0.00000142979626427932 +0.00000139246436034547 +0.00000135590128127092 +0.00000132009544388473 +0.00000128503537292880 +0.00000125070970087358 +0.00000121710716772192 +0.00000118421662080116 +0.00000115202701454361 +0.00000112052741025560 +0.00000108970697587568 +0.00000105955498572167 +0.00000103006082022713 +0.00000100121396566739 +0.00000097300401387535 +0.00000094542066194718 +0.00000091845371193836 +0.00000089209307055004 +0.00000086632874880603 +0.00000084115086172062 +0.00000081654962795755 +0.00000079251536948002 +0.00000076903851119244 +0.00000074610958057368 +0.00000072371920730217 +0.00000070185812287317 +0.00000068051716020834 +0.00000065968725325755 +0.00000063935943659376 +0.00000061952484500041 +0.00000060017471305203 +0.00000058130037468812 +0.00000056289326278040 +0.00000054494490869372 +0.00000052744694184084 +0.00000051039108923112 +0.00000049376917501348 +0.00000047757312001364 +0.00000046179494126599 +0.00000044642675154007 +0.00000043146075886206 +0.00000041688926603128 +0.00000040270467013187 +0.00000038889946203999 +0.00000037546622592643 +0.00000036239763875514 +0.00000034968646977753 +0.00000033732558002280 +0.00000032530792178459 +0.00000031362653810391 +0.00000030227456224860 +0.00000029124521718949 +0.00000028053181507340 +0.00000027012775669300 +0.00000026002653095392 +0.00000025022171433899 +0.00000024070697036996 +0.00000023147604906671 +0.00000022252278640417 +0.00000021384110376696 +0.00000020542500740208 +0.00000019726858786956 +0.00000018936601949134 +0.00000018171155979855 +0.00000017429954897704 +0.00000016712440931172 +0.00000016018064462933 +0.00000015346283974026 +0.00000014696565987903 +0.00000014068385014403 +0.00000013461223493628 +0.00000012874571739742 +0.00000012307927884713 +0.00000011760797821998 +0.00000011232695150180 +0.00000010723141116583 +0.00000010231664560849 +0.00000009757801858513 +0.00000009301096864570 +0.00000008861100857040 +0.00000008437372480561 +0.00000008029477689993 +0.00000007636989694061 +0.00000007259488899033 +0.00000006896562852451 +0.00000006547806186922 +0.00000006212820563961 +0.00000005891214617924 +0.00000005582603900006 +0.00000005286610822341 +0.00000005002864602183 +0.00000004731001206203 +0.00000004470663294883 +0.00000004221500167036 +0.00000003983167704441 +0.00000003755328316614 +0.00000003537650885708 +0.00000003329810711556 +0.00000003131489456865 +0.00000002942375092561 +0.00000002762161843286 +0.00000002590550133074 +0.00000002427246531179 +0.00000002271963698091 +0.00000002124420331725 +0.00000001984341113796 +0.00000001851456656381 +0.00000001725503448680 +0.00000001606223803967 +0.00000001493365806750 +0.00000001386683260132 +0.00000001285935633389 +0.00000001190888009753 +0.00000001101311034420 +0.00000001016980862774 +0.00000000937679108844 +0.00000000863192793977 +0.00000000793314295749 +0.00000000727841297114 +0.00000000666576735781 +0.00000000609328753836 +0.00000000555910647606 +0.00000000506140817769 +0.00000000459842719706 +0.00000000416844814110 +0.00000000376980517843 +0.00000000340088155045 +0.00000000306010908504 +0.00000000274596771278 +0.00000000245698498584 +0.00000000219173559937 +0.00000000194884091563 +0.00000000172696849069 +0.00000000152483160381 +0.00000000134118878948 +0.00000000117484337213 +0.00000000102464300354 +0.00000000088947920294 +0.00000000076828689983 +0.00000000066004397945 +0.00000000056377083107 +0.00000000047852989894 +0.00000000040342523597 +0.00000000033760206013 +0.00000000028024631366 +0.00000000023058422497 +0.00000000018788187322 +0.00000000015144475576 +0.00000000012061735824 +0.00000000009478272745 +0.00000000007336204696 +0.00000000005581421541 +0.00000000004163542763 +0.00000000003035875840 +0.00000000002155374902 +0.00000000001482599650 +0.00000000000981674556 +0.00000000000620248330 +0.00000000000369453654 +0.00000000000203867190 +0.00000000000101469855 +0.00000000000043607361 +0.00000000000014951028 +0.00000000000003458852 +0.00000000000000336852 +0.00000000000000000666 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +25.30325876473197865835 +50.33068723221295925896 +75.08452989996564497233 +99.56701517655753264080 +123.78035548904902896084 +147.72674738975246100381 +171.40837166230983257265 +194.82739342708941876481 +217.98596224590846759384 +240.88621222608529137688 +263.53026212382513904231 +285.92021544694233625705 +308.05816055692667987387 +329.94617077035269403495 +351.58630445964155342153 +372.98060515317575891459 +394.13110163477034575408 +415.03980804251074232525 +435.70872396695193629057 +456.13983454868861144860 +476.33511057530165544449 +496.29650857768081095855 +516.02597092572648307396 +535.52542592344275362848 +554.79678790341586136492 +573.84195732068417328264 +592.66282084601164115156 +611.26125145855405662587 +629.63910853793697697256 +647.79823795573702227557 +665.74047216637734436517 +683.46763029743556216999 +700.98151823937803328590 +718.28392873470716040174 +735.37664146654287833371 +752.26142314663343313441 +768.94002760279340691341 +785.41419586578740563709 +801.68565625564951915294 +817.75612446744332828530 +833.62730365648098995734 +849.30088452298264201090 +864.77854539619420393137 +880.06195231796402822511 +895.15275912578044881229 +910.05260753526692951709 +924.76312722216368911177 +939.28593590375908206624 +953.62263941980756953853 +967.77483181292609515367 +981.74409540847000243957 +995.53200089388099058851 +1009.14010739755019585573 +1022.56996256714887749695 +1035.82310264745615313586 +1048.90105255769708492153 +1061.80532596836610537139 +1074.53742537756261299364 +1087.09884218683282597340 +1099.49105677651778023574 +1111.71553858061292885395 +1123.77374616115298522345 +1135.66712728210723071243 +1147.39711898279392698896 +1158.96514765083020392922 +1170.37262909460582704924 +1181.62096861527970759198 +1192.71156107832348425291 +1203.64579098459012129751 +1214.42503254092798670172 +1225.05064973034200193069 +1235.52399638168913043046 +1245.84641623892980533128 +1256.01924302993165838416 +1266.04380053481736467802 +1275.92140265388024999993 +1285.65335347505970275961 +1295.24094734096343017882 +1304.68546891547634913877 +1313.98819324992132351326 +1323.15038584879380323400 +1332.17330273507604943006 +1341.05819051512116857339 +1349.80628644311491370900 +1358.41881848512298347487 +1366.89700538271949881164 +1375.24205671620484281448 +1383.45517296740581514314 +1391.53754558207174341078 +1399.49035703187087165134 +1407.31478087597315607127 +1415.01198182223402000091 +1422.58311578798998198181 +1430.02932996044251012790 +1437.35176285666352669068 +1444.55154438320346343971 +1451.62979589530868906877 +1458.58763025575808569556 +1465.42615189331172587117 +1472.14645686078711150913 +1478.74963289274455746636 +1485.23675946280513926467 +1491.60890784059483848978 +1497.86714114830760991026 +1504.01251441691556465230 +1510.04607464199739297328 +1515.96886083921026511234 +1521.78190409939566052344 +1527.48622764333299528516 +1533.08284687612376728794 +1538.57276944122941131354 +1543.95699527415149532317 +1549.23651665576403502200 +1554.41231826529792670044 +1559.48537723297181400994 +1564.45666319229280816216 +1569.32713833198931752122 +1574.09775744764328919700 +1578.76946799293909862172 +1583.34321013062162819551 +1587.81991678307872462028 +1592.20051368263148106053 +1596.48591942145731081837 +1600.67704550122221007769 +1604.77479638235899983556 +1608.78006953304065973498 +1612.69375547781714885787 +1616.51673784595186589286 +1620.24989341942409737385 +1623.89409218062860418286 +1627.45019735975347430212 +1630.91906548185124847805 +1634.30154641359854394977 +1637.59848340975872815761 +1640.81071315931603749050 +1643.93906583133525600715 +1646.98436512050216151692 +1649.94742829236633951950 +1652.82906622829091247695 +1655.63008347010691068135 +1658.35127826446046128694 +1660.99344260689667862607 +1663.55736228562614087423 +1666.04381692501033285225 +1668.45358002877378567064 +1670.78741902291585574858 +1673.04609529833646774932 +1675.23036425320833586738 +1677.34097533504177590657 +1679.37867208247644157382 +1681.34419216681885700382 +1683.23826743327208532719 +1685.06162394192392639525 +1686.81498200844930579478 +1688.49905624454936514667 +1690.11455559810906379425 +1691.66218339311876661668 +1693.14263736930934101110 +1694.55660972151827081689 +1695.90478713883021555375 +1697.18785084342448499228 +1698.40647662917444904451 +1699.56133490000684105325 +1700.65309070799366963911 +1701.68240379117764859984 +1702.64992861119321787555 +1703.55631439058652176755 +1704.40220514992029166024 +1705.18823974462111436878 +1705.91505190159159610630 +1706.58327025555581712979 +1707.19351838520697128843 +1707.74641484906987898285 +1708.24257322115522583772 +1708.68260212637187578366 +1709.06710527568202451221 +1709.39668150106058419624 +1709.67192479019627171510 +1709.89342432096395896224 +1710.06176449568079078745 +1710.17752497512537956936 +1710.24128071233235459658 +1710.25360198615453555249 +1710.21505443462228868157 +1710.12619908806300372817 +1709.98759240200661224662 +1709.79978628986873445683 +1709.56332815542600656045 +1709.27876092505675842403 +1708.94662307978933313279 +1708.56744868712189600046 +1708.14176743263442403986 +1707.67010465138650943118 +1707.15298135911712051893 +1706.59091428321698913351 +1705.98441589351796210394 +1705.33399443285543384263 +1704.64015394744478726352 +1703.90339431703455375100 +1703.12421128487858368317 +1702.30309648750085216307 +1701.44053748425380945264 +1700.53701778668664701399 +1699.59301688772188754228 +1698.60901029062029010674 +1697.58546953777567978250 +1696.52286223929036168556 +1695.42165210138000475126 +1694.28229895458684950427 +1693.10525878178896164172 +1691.89098374603349839163 +1690.63992221818057259952 +1689.35251880437203908514 +1688.02921437329200671229 +1686.67044608327114474378 +1685.27664740919158248289 +1683.84824816921968704264 +1682.38567455134625561186 +1680.88934913977936957963 +1679.35969094112010679964 +1677.79711541039364419703 +1676.20203447689141285082 +1674.57485656983044464141 +1672.91598664387038297718 +1671.22582620442722145526 +1669.50477333283492953342 +1667.75322271132722562470 +1665.97156564786291710334 +1664.16019010077457096486 +1662.31948070324938271369 +1660.44981878765702276723 +1658.55158240970536098757 +1656.62514637242702519870 +1654.67088225002339640923 +1652.68915841152806933678 +1650.68034004431069661223 +1648.64478917744872887852 +1646.58286470490929787047 +1644.49492240859035518952 +1642.38131498120378637395 +1640.24239204900868571713 +1638.07850019437023547653 +1635.88998297820148764004 +1633.67718096222392887285 +1631.44043173108229893842 +1629.18006991432798713504 +1626.89642720822439514450 +1624.58983239742724435928 +1622.26061137651640819968 +1619.90908717137290295796 +1617.53557996040285615891 +1615.14040709564869757742 +1612.72388312372822838370 +1610.28631980663089962036 +1607.82802614240245020483 +1605.34930838565878730151 +1602.85047006797003632528 +1600.33181201811134997115 +1597.79363238217570142297 +1595.23622664352933497867 +1592.65988764267262922658 +1590.06490559692565511796 +1587.45156811999868295970 +1584.82016024143285903847 +1582.17096442589559046610 +1579.50426059234678177745 +1576.82032613309365842724 +1574.11943593268961194553 +1571.40186238671935825550 +1568.66787542044562542287 +1565.91774250735034001991 +1563.15172868751142232213 +1560.37009658590022809221 +1557.57310643051164333883 +1554.76101607039981900016 +1551.93408099357861829048 +1549.09255434479587165697 +1546.23668694319212590926 +1543.36672729984093166422 +1540.48292163516975961102 +1537.58551389624426519731 +1534.67474577395819324011 +1531.75085672009436166263 +1528.81408396425945284136 +1525.86466253072217114095 +1522.90282525512679967505 +1519.92880280108306578768 +1516.94282367665846322780 +1513.94511425073937971320 +1510.93589876930241189257 +1507.91539937154902872862 +1504.88383610595292338985 +1501.84142694617867164197 +1498.78838780689216036990 +1495.72493255948347723461 +1492.65127304765155713540 +1489.56761910290379091748 +1486.47417855993671764736 +1483.37115727191871883406 +1480.25875912566175429674 +1477.13718605668805139430 +1474.00663806419834145345 +1470.86731322593254844833 +1467.71940771293157013133 +1464.56311580418991979968 +1461.39862990121059738158 +1458.22614054247037529422 +1455.04583641776048352767 +1451.85790438245408040530 +1448.66252947166117337474 +1445.45989491428599649225 +1442.25018214699025520531 +1439.03357082805382560764 +1435.81023885115496341314 +1432.58036235903250599222 +1429.34411575707326846896 +1426.10167172679393843282 +1422.85320123922451784892 +1419.59887356822218862362 +1416.33885630366444274841 +1413.07331536456695175730 +1409.80241501210502974573 +1406.52631786255415136111 +1403.24518490012133042910 +1399.95917548969669041981 +1396.66844738953409432725 +1393.37315676381012963247 +1390.07345819511715490080 +1386.76950469687221811910 +1383.46144772562342950550 +1380.14943719327175131184 +1376.83362147923344309675 +1373.51414744249018440314 +1370.19116043355461442843 +1366.86480430637379868131 +1363.53522143013287859503 +1360.20255270097004540730 +1356.86693755363876334741 +1353.52851397305539649096 +1350.18741850578385310655 +1346.84378627143087214790 +1343.49775097397787249065 +1340.14944491300730078365 +1336.79899899487691072864 +1333.44654274379604430578 +1330.09220431283256402821 +1326.73611049484452450997 +1323.37838673333430961065 +1320.01915713320636314165 +1316.65854447149240513681 +1313.29667020796000542759 +1309.93365449566385905200 +1306.56961619142612107680 +1303.20467286623625113862 +1299.83894081556718447246 +1296.47253506965307678911 +1293.10556940365677291993 +1289.73815634778361527424 +1286.37040719732226534688 +1283.00243202261958685995 +1279.63433967895957721339 +1276.26623781641683308408 +1272.89823288960360514466 +1269.53043016735523451644 +1266.16293374235533519823 +1262.79584654069708449242 +1259.42927033135129022412 +1256.06330573560148877732 +1252.69805223638491042948 +1249.33360818758387722482 +1245.97007082323466420348 +1242.60753626669998084253 +1239.24609953973185838549 +1235.88585457151589253044 +1232.52689420762635563733 +1229.16931021891718955885 +1225.81319331035706454713 +1222.45863312980577575217 +1219.10571827670105449215 +1215.75453631073105498217 +1212.40517376040088493028 +1209.05771613155684462981 +1205.71224791584972990677 +1202.36885259913810841681 +1199.02761266982111010293 +1195.68860962712869877578 +1192.35192398933986623888 +1189.01763530194648410543 +1185.68582214575440048066 +1182.35656214493178595148 +1179.02993197500268252043 +1175.70600737077552366827 +1172.38486313421162776649 +1169.06657314225481059111 +1165.75121035458391816064 +1162.43884682132579655445 +1159.12955369069504740764 +1155.82340121660513432289 +1152.52045876620104536414 +1149.22079482734284283652 +1145.92447701604783105722 +1142.63157208385655394522 +1139.34214592517150776985 +1136.05626358452582280734 +1132.77398926380078592047 +1129.49538632939925264509 +1126.22051731935607676860 +1122.94944395041261486767 +1119.68222712501665228046 +1116.41892693830027383228 +1113.15960268498520235880 +1109.90431286624675522035 +1106.65311519652459537610 +1103.40606661028823509696 +1100.16322326875592807482 +1096.92464056654762316612 +1093.69037313831859137281 +1090.46047486531551840017 +1087.23499888190576712077 +1084.01399758203888268326 +1080.79752262569263621117 +1077.58562494523607711017 +1074.37835475176962063415 +1071.17576154141374900064 +1067.97789410154859979230 +1064.78480051699830255529 +1061.59652817620326459291 +1058.41312377730946536758 +1055.23463333423205767758 +1052.06110218267417621973 +1048.89257498609981666959 +1045.72909574165146295854 +1042.57070778605293526198 +1039.41745380143697730091 +1036.26937582115192526544 +1033.12651523550880483526 +1029.98891279750819194305 +1026.85660862849726981949 +1023.72964222381494892034 +1020.60805245836627364042 +1017.49187759218114024407 +1014.38115527591321551881 +1011.27592255631441275909 +1008.17621588164320201031 +1005.08207110707110132353 +1001.99352350001606737351 +998.91060774545053391194 +995.83335795116818189854 +992.76180765301626252040 +989.69598982007153153972 +986.63593685980697500781 +983.58168062319566615770 +980.53325240978506371903 +977.49068297273527150537 +974.45400252382046346611 +971.42324073837960440869 +968.39842676025818946073 +965.37958920668620521610 +962.36675617313221664517 +959.35995523811527618818 +956.35921346799557341001 +953.36455742170255689416 +950.37601315546032765269 +947.39360622744504780712 +944.41736170243711967487 +941.44730415641697618412 +938.48345768113688336598 +935.52584588864783654572 +932.57449191581633840542 +929.62941842877773979126 +926.69064762737650653435 +923.75820124956146628392 +920.83210057576025064918 +917.91236643319848553801 +914.99901920022057311144 +912.09207881054635436158 +909.19156475750946810876 +906.29749609826365031040 +903.40989145795936110517 +900.52876903387164020387 +897.65414659952659803821 +894.78604150877231404593 +891.92447069982790708309 +889.06945069929724922986 +886.22099762616346652067 +883.37912719573841968668 +880.54385472358933384385 +877.71519512944087182404 +874.89316294103889504186 +872.07777229798784901504 +869.26903695555154172325 +866.46697028844755550381 +863.67158529458515658916 +860.88289459879126752639 +858.10091045650233354536 +855.32564475742890408583 +852.55710902919747695705 +849.79531444094413927814 +847.04027180691559806291 +844.29199159001007046754 +841.55048390530748747551 +838.81575852356900213636 +836.08782487470170963206 +833.36669205121654613322 +830.65236881164071292005 +827.94486358390850000433 +825.24418446872857657581 +822.55033924292763458652 +819.86333536276242739405 +817.18317996720566043223 +814.50987988121164562472 +811.84344161895830893627 +809.18387138705395500438 +806.53117508772982091614 +803.88535832199306696566 +801.24642639278204114817 +798.61438430806583710364 +795.98923678394100988953 +793.37098824769498150999 +790.75964284085137023794 +788.15520442217302843346 +785.55767657068463449832 +782.96706258861365768098 +780.38336550435610661225 +777.80658807539771260053 +775.23673279120862389391 +772.67380187612980080303 +770.11779729222860169102 +767.56872074212333245669 +765.02657367180779601767 +762.49135727342888912972 +759.96307248806147072173 +757.44172000844616832183 +754.92730028172195488878 +752.41981351211802575563 +749.91925966364237865491 +747.42563846273878880311 +744.93894940091854550701 +742.45919173738900553872 +739.98636450163814970438 +737.52046649602061734186 +735.06149629830497360672 +732.60945226421324605326 +730.16433252993067526404 +727.72613501460705265345 +725.29485742282145110948 +722.87049724704661457508 +720.45305177007844577020 +718.04251806745321573544 +715.63889300983873908990 +713.24217326541997863387 +710.85235530224736066884 +708.46943539058167971234 +706.09340960521240049275 +703.72427382775413207128 +701.36202374893707656156 +699.00665487086234861636 +696.65816250925161057239 +694.31654179567715345911 +691.98178767976503422688 +689.65389493139264232013 +687.33285814285420656233 +685.01867173102550623298 +682.71132993949356659868 +680.41082684068408070743 +678.11715633796040947345 +675.83031216771485105710 +673.55028790142705474864 +671.27707694773005187017 +669.01067255443297199236 +666.75106781054807925102 +664.49825564828961432795 +662.25222884505956244539 +660.01298002541170717450 +657.78050166301500212285 +655.55478608257863015751 +653.33582546178195116227 +651.12361183317113955127 +648.91813708605684496433 +646.71939296837695110298 +644.52737108856399572687 +642.34206291737962146726 +640.16345978974629815639 +637.99155290655710359715 +635.82633333647277140699 +633.66779201769759310992 +631.51591975975702553114 +629.37070724523550779850 +627.23214503152576071443 +625.10022355254477588460 +622.97493312043866353633 +620.85626392728352129780 +618.74420604676026869129 +616.63874943581606657972 +614.53988393632198494743 +612.44759927670781962661 +610.36188507357792332186 +608.28273083333010617935 +606.21012595374804732273 +604.14405972557528912148 +602.08452133409741691139 +600.03149986068206089840 +597.98498428433413209859 +595.94496348321160894557 +593.91142623615246520785 +591.88436122416510443145 +589.86375703192845776357 +587.84960214926218213805 +585.84188497258867300843 +583.84059380639041592076 +581.84571686464448703191 +579.85724227224602600472 +577.87515806642772986379 +575.89945219815831478627 +573.93011253352790390636 +571.96712685513284668559 +570.01048286343223026051 +568.06016817810746033501 +566.11617033940069632081 +564.17847680944464627828 +562.24707497357667307369 +560.32195214165324159694 +558.40309554933401159360 +556.49049235937422963616 +554.58412966289290579880 +552.68399448062814371951 +550.79007376419781394361 +548.90235439732646227640 +547.02082319707790247776 +545.14546691507337072835 +543.27627223869308181747 +541.41322579227301048377 +539.55631413828461973026 +537.70552377851697656297 +535.86084115522817228339 +534.02225265230754303047 +532.18974459641185603687 +530.36330325809967689565 +528.54291485294754693314 +526.72856554267002593406 +524.92024143621006260219 +523.11792859083971052314 +521.32161301323503721505 +519.53128066055080580554 +517.74691744147617100680 +515.96850921729560468521 +514.19604180291969441896 +512.42950096792947078939 +510.66887243758685599460 +508.91414189386046018626 +507.16529497641829493659 +505.42231728363145748517 +503.68519437355178069993 +501.95391176489607687472 +500.22845493800735994228 +498.50880933581629506079 +496.79496036478553833149 +495.08689339585845345937 +493.38459376538042988614 +491.68804677603037589506 +489.99723769772930381805 +488.31215176854897208614 +486.63277419560262160303 +484.95909015594213542499 +483.29108479742876625096 +481.62874323961153777418 +479.97205057458558030703 +478.32099186785058009264 +476.67555215915183453035 +475.03571646332585487471 +473.40146977112294734980 +471.77279705003678600406 +470.14968324511221453577 +468.53211327975770927878 +466.92007205653652590627 +465.31354445796677055114 +463.71251534729424292891 +462.11696956927630708378 +460.52689195094478691317 +458.94226730236829325804 +457.36308041740142016351 +455.78931607443581697225 +454.22095903713102416077 +452.65799405515099351760 +451.10040586488412373001 +449.54817919016119276421 +448.00129874295885201718 +446.45974922410971430509 +444.92351532398777180788 +443.39258172320518269771 +441.86693309328632039978 +440.34655409734159547952 +438.83142939073843535880 +437.32154362176004269713 +435.81688143225352405352 +434.31742745828489660198 +432.82316633077130063612 +431.33408267612082909181 +429.85016111685303030754 +428.37138627222611830803 +426.89774275884258258884 +425.42921519126446128212 +423.96578818261144760982 +422.50744634515126563201 +421.05417429089578718049 +419.60595663217986839300 +418.16277798223319450699 +416.72462295575815005577 +415.29147616949029497846 +413.86332224275145108550 +412.44014579801074660281 +411.02193146142496971152 +409.60866386337721678501 +408.20032763901593853006 +406.79690742878165110596 +405.39838787892557547821 +404.00475364203492745219 +402.61598937753467453149 +401.23207975220191201515 +399.85300944065852490894 +398.47876312587391112174 +397.10932549964428517342 +395.74468126308664750468 +394.38481512710706056168 +393.02971181288182833669 +391.67935605232082707516 +390.33373258853146126057 +388.99282617627119407189 +387.65662158240746748561 +386.32510358635539660099 +384.99825698052728739640 +383.67606657076328247058 +382.35851717676746375218 +381.04559363252718640069 +379.73728078674378139112 +378.43356350323983861017 +377.13442666137831338347 +375.83985515646469366402 +374.54983390015235045212 +373.26434782083327945656 +371.98338186403992722262 +370.70692099282291565032 +369.43495018814354580172 +368.16745444924367802741 +366.90441879402709446367 +365.64582825942073895931 +364.39166790174851939810 +363.14192279708237265368 +361.89657804160532350579 +360.65561875195953689399 +359.41903006559385858054 +358.18679714110396616888 +356.95890515857666969168 +355.73533931991659073901 +354.51608484918187969015 +353.30112699290737054980 +352.09045102042671260278 +350.88404222418563449537 +349.68188592006322323869 +348.48396744767148902611 +347.29027217066840194093 +346.10078547705433038573 +344.91549277947132168265 +343.73437951549186664124 +342.55743114791505377070 +341.38463316504419253761 +340.21597108097569162055 +339.05143043586872408923 +337.89099679622682970148 +336.73465575516019043789 +335.58239293265955893730 +334.43419397585086016988 +333.29004455926138916766 +332.14993038507009259774 +331.01383718336154515782 +329.88175071237077418118 +328.75365675873342752311 +327.62954113771866104798 +326.50938969347487272898 +325.39318829925787213142 +324.28092285766462055108 +323.17257930085543193854 +322.06814359078441611928 +320.96760171941321004851 +319.87093970893266714484 +318.77814361197454218200 +317.68919951182209615581 +316.60409352261439153153 +315.52281178955627183313 +314.44534048911265244897 +313.37166582920821156222 +312.30177404942514840513 +311.23565142118729909271 +310.17328424795465480202 +309.11465886540617020728 +308.05976164161785391116 +307.00857897724824852048 +305.96109730571083673567 +304.91730309334406001653 +303.87718283958741949391 +302.84072307714541238965 +301.80791037214845573544 +300.77873132432006286763 +299.75317256713242386468 +298.73122076795897328338 +297.71286262823258539356 +296.69808488359331022366 +295.68687430403161897630 +294.67921769403932330533 +293.67510189274844378815 +292.67451377406655410596 +291.67744024682031067641 +290.68386825488192926059 +289.69378477730657550637 +288.70717682845469198583 +287.72403145812387492697 +286.74433575166580112636 +285.76807683011395511130 +284.79524185029447380657 +283.82581800494767776399 +282.85979252283891582920 +281.89715266886946665181 +280.93788574418306325242 +279.98197908627656715908 +279.02942006909705696671 +278.08019610314852343436 +277.13429463558856014060 +276.19170315032431517466 +275.25240916810491853539 +274.31640024661868437761 +273.38366398057547712597 +272.45418800180033258584 +271.52795997931497140598 +270.60496761942232524234 +269.68519866578344590380 +268.76864089950186098577 +267.85528213919383233588 +266.94511024106793684041 +266.03811309899128900724 +265.13427864456537008664 +264.23359484718770318068 +263.33604971412364648131 +262.44163129056391881022 +261.55032765969144747942 +260.66212694273787064958 +259.77701729904305238961 +258.89498692610629859701 +258.01602405964700892582 +257.14011697364861674941 +256.26725398041548942274 +255.39742343061507767743 +254.53061371332827889091 +253.66681325608746533362 +252.80601052492636426905 +251.94819402441302713669 +251.09335229769334318917 +250.24147392652560029092 +249.39254753131575625957 +248.54656177114802062533 +247.70350534382188811833 +246.86336698587399496319 +246.02613547261344706385 +245.19179961814123203112 +244.36034827538017566440 +243.53177033609199497732 +242.70605473090446935203 +241.88319042932380398270 +241.06316643975830515956 +240.24597180953094266442 +239.43159562489515224115 +238.62002701104478319394 +237.81125513213055455708 +237.00526919126301095275 +236.20205843052656291547 +235.40161213098255643672 +234.60391961267538363245 +233.80897023463325012926 +233.01675339487513838321 +232.22725853040540755501 +231.44047511721728938028 +230.65639267028913650392 +229.87500074357691914884 +229.09628893001479355007 +228.32024686150165848630 +227.54686420889942155554 +226.77613068201691248760 +226.00803602960465354954 +225.24257003933652754313 +224.47972253780088180974 +223.71948339048350362646 +222.96184250174854923898 +222.20678981482527092339 +221.45431531178618911326 +220.70440901352424134529 +219.95706097973672399348 +219.21226130889800742807 +218.47000013823475228492 +217.73026764370345631505 +216.99305403996194741012 +216.25834958033902921670 +215.52614455680966898399 +214.79642929996151679006 +214.06919417896236268462 +213.34442960153049284600 +212.62212601389836663657 +211.90227390077617997122 +211.18486378531946456860 +210.46988622908617116991 +209.75733183200375719935 +209.04719123232399624612 +208.33945510658659827641 +207.63411416957305277720 +206.93115917426777627952 +206.23058091180917017482 +205.53237021144914820070 +204.83651794050351213627 +204.14301500430650548878 +203.45185234615919966927 +202.76302094728532665613 +202.07651182677500401041 +201.39231604153792432044 +200.71042468624887078477 +200.03082889329454019389 +199.35351983271743847581 +198.67848871216409634144 +198.00572677682458788695 +197.33522530937869987611 +196.66697562993590508995 +196.00096909597678518367 +195.33719710229064503437 +194.67565108091901038279 +194.01632250108860944238 +193.35920286915356314239 +192.70428372852592247000 +192.05155665961723343571 +191.40101327976745437809 +190.75264524318353664967 +190.10644424086734716184 +189.46240200055200375573 +188.82051028663059355495 +188.18076090008770506756 +187.54314567842587280211 +186.90765649559963890169 +186.27428526193727975624 +185.64302392407338970770 +185.01386446487148873530 +184.38679890335225763920 +183.76181929461367303702 +183.13891772976165839282 +182.51808633582618313085 +181.89931727569040731396 +181.28260274800823026453 +180.66793498712462451294 +180.05530626300068774981 +179.44470888112692819050 +178.83613518244840179250 +178.22957754327657653448 +177.62502837521270748766 +177.02248012506134955402 +176.42192527474512075969 +175.82335634122497936005 +175.22676587640864909190 +174.63214646707086785682 +174.03949073476272246808 +173.44879133572680984798 +172.86004096080611702746 +172.27323233536077395911 +171.68835821917278394722 +171.10541140636203749636 +170.52438472529257751376 +169.94527103848324145474 +169.36806324251338651266 +168.79275426793600445308 +168.21933707917861511305 +167.64780467445584122288 +167.07815008567271775064 +166.51036637832874021115 +165.94444665142762573851 +165.38038403737576231833 +164.81817170189245302936 +164.25780284390739893752 +163.69927069546875486594 +163.14256852164223232649 +162.58768962041256145312 +162.03462732258864775758 +161.48337499169869602156 +160.93392602389582179967 +160.38627384785533536160 +159.84041192467279302036 +159.29633374776577170451 +158.75403284277101079169 +158.21350276743990548312 +157.67473711154016768887 +157.13772949675015411231 +156.60247357655424593759 +156.06896303614209386978 +155.53719159230243462844 +155.00715299331631058521 +154.47884101885563268297 +153.95224947987543373529 +153.42737221850575224380 +152.90420310794971214818 +152.38273605237100127852 +151.86296498679189426184 +151.34488387698038991402 +150.82848671934667095229 +150.31376754082953084435 +149.80072039879212297819 +149.28933938091006439208 +148.77961860506036373408 +148.27155221921449879119 +147.76513440132623600221 +147.26035935921885311473 +146.75722133047818829255 +146.25571458233605426358 +145.75583341156234951086 +145.25757214435063247038 +144.76092513620648105643 +144.26588677183184472597 +143.77245146501616090973 +143.28061365851780806224 +142.79036782395434102000 +142.30170846168573461910 +141.81463010069910524180 +141.32912729849689981165 +140.84519464097684249282 +140.36282674232191425290 +139.88201824487904900707 +139.40276381904686786584 +138.92505816315843958364 +138.44889600336111357137 +137.97427209350550469935 +137.50118121502151780078 +137.02961817680636613659 +136.55957781510332438302 +136.09105499338525646635 +135.62404460223336855051 +135.15854155922318113880 +134.69454080880032620371 +134.23203732216575190250 +133.77102609715379344379 +133.31150215811371140262 +132.85346055578705204425 +132.39689636719182885827 +131.94180469549746703706 +131.48818066990801867178 +131.03601944553960834128 +130.58531620329719658002 +130.13606614975799402600 +129.68826451704447322300 +129.24190656270766908165 +128.79698756960033279029 +128.35350284575886803395 +127.91144772427934128700 +127.47081756319226997221 +127.03160774534519816825 +126.59381367827356257294 +126.15743079408274240905 +125.72245454932165387163 +125.28888042486030940381 +124.85670392576408005425 +124.42592058117324427258 +123.99652594417480599986 +123.56851559168180187953 +123.14188512430652622243 +122.71663016623710973363 +122.29274636511028973018 +121.87022939189068893029 +121.44907494074067244583 +121.02927872889925708932 +120.61083649655498106767 +120.19374400671821945252 +119.77799704509997980040 +119.36359141998079280711 +118.95052296208957898216 +118.53878752447276667681 +118.12838098237220663123 +117.71929923309598109427 +117.31153819589160036685 +116.90509381182205572713 +116.49996204363461060893 +116.09613887563828882321 +115.69362031357397313514 +115.29240238448812760907 +114.89248113660387673463 +114.49385263919691624324 +114.09651298246323847252 +113.70045827739600952100 +113.30568465565558256003 +112.91218826944009379076 +112.51996529136044955521 +112.12901191431089387152 +111.73932435133929175208 +111.35089883552136313938 +110.96373161983125044117 +110.57781897701181605953 +110.19315719944684417442 +109.80974259903410938932 +109.42757150705313051731 +109.04664027403941872763 +108.66694526965460454448 +108.28848288255515797118 +107.91124952026721928178 +107.53524160905512019326 +107.16045559379080032159 +106.78688793782788479803 +106.41453512287047544760 +106.04339364884187091320 +105.67346003375872953711 +105.30473081359949105718 +104.93720254217338094804 +104.57087179099346485600 +104.20573514914565294021 +103.84178922315851423264 +103.47903063687319047403 +103.11745603131384996232 +102.75706206455868141347 +102.39784541160902620049 +102.03980276425792794726 +101.68293083096286011369 +101.32722633671245660025 +100.97268602289982197817 +100.61930664718798311696 +100.26708498338349784262 +99.91601782130517506175 +99.56610196665086220946 +99.21733424087156549831 +98.86971148103667417217 +98.52323053970729915818 +98.17788828480331630999 +97.83368159947411868416 +97.49060738196641295872 +97.14866254549615121050 +96.80784401811526151960 +96.46814874258357974668 +96.12957367623650384303 +95.79211579085547612067 +95.45577207253539597787 +95.12053952155697800208 +94.78641515225243097120 +94.45339599287862597521 +94.12147908548379859894 +93.79066148577663852848 +93.46094026299810764158 +93.13231249978707637638 +92.80477529205360553988 +92.47832574884434109208 +92.15296099221450276673 +91.82867815709688841253 +91.50547439116876091703 +91.18334685472470368950 +90.86229272054197281250 +90.54230917375367937439 +90.22339341171507953732 +89.90554264387496630206 +89.58875409164238590165 +89.27302498825906695856 +88.95835257866583845043 +88.64473411937406410743 +88.33216687833429148213 +88.02064813480552629699 +87.71017517922331308000 +87.40074531307199379171 +87.09235584875112579084 +86.78500410944714360539 +86.47868742900185168310 +86.17340315178122978068 +85.86914863254547469751 +85.56592123631993729305 +85.26371833826128465716 +84.96253732353073928607 +84.66237558716133548842 +84.36323053392860060740 +84.06509957821872092154 +83.76798014389945024050 +83.47186966418983899985 +83.17676558153003441021 +82.88266534745005742479 +82.58956642244055501578 +82.29746627582154872016 +82.00636238561278901216 +81.71625223840464968816 +81.42713332922680535830 +81.13900316141860002972 +80.85185924649904620765 +80.56569910403634082741 +80.28052026151821962685 +79.99632025422278047699 +79.71309662508851090479 +79.43084692458268136761 +79.14956871057428600125 +78.86925954820154061053 +78.58991700974554817094 +78.31153867449641836629 +78.03412212862777153077 +77.75766496506514613429 +77.48216478335658052856 +77.20761918954302416296 +76.93402579602933144542 +76.66138222145539771191 +76.38968609056622938169 +76.11893503408272465549 +75.84912668857280948487 +75.58025869632162141443 +75.31232870520243238843 +75.04533436854916317316 +74.77927334502578560205 +74.51414329849802697936 +74.24994189790440657362 +73.98666681712714421337 +73.72431573486323941324 +73.46288633449709948309 +73.20237630397099337642 +72.94278333565559080398 +72.68410512622342878331 +72.42633937651791598000 +72.16948379142844771650 +71.91353607975752026960 +71.65849395409689748249 +71.40435513069675721454 +71.15111732933850419158 +70.89877827320584913195 +70.64733568875703895174 +70.39678730559826647095 +70.14713085635406741858 +69.89836407654090066899 +69.65048470443714734301 +69.40349048095842476869 +69.15737914952694609383 +68.91214845594690530106 +68.66779614827447630887 +68.42431997669261534156 +68.18171769338090371093 +67.93998705239147284374 +67.69912580951863390055 +67.45913172217474595982 +67.22000254926146567414 +66.98173605104189221038 +66.74432998901642122291 +66.50778212579284343065 +66.27209022496090540244 +66.03725205096672823402 +65.80326536898419931276 +65.57012794479007311566 +65.33783754463529191980 +65.10639193512143663156 +64.87578888307153590631 +64.64602615540636065816 +64.41710151901621372872 +64.18901274063662754088 +63.96175758671982691794 +63.73533382331184782288 +63.50973921592348148124 +63.28497152940758496698 +63.06102852783090639832 +62.83790797435012365213 +62.61560763108433746993 +62.39412525899203387780 +62.17345861774303017455 +61.95360546559619052687 +61.73456355927048377907 +61.51633065382369380814 +61.29890450252383260477 +61.08228285672691981745 +60.86646346574967481047 +60.65144407674694093657 +60.43722243458505261060 +60.22379628171862009367 +60.01116335806393919938 +59.79932140087704084408 +59.58826814462648968629 +59.37800132087168236694 +59.16851865813670485750 +58.95981788178721672011 +58.75189671390509005278 +58.54475287316520848435 +58.33838407471186116027 +58.13278803003441908004 +57.92796244684359407984 +57.72390502894780439647 +57.52061347612891495373 +57.31808548401941294514 +57.11631874397912866925 +56.91531094297207005184 +56.71505976344127475386 +56.51556288318843712659 +56.31681797524785793030 +56.11882270776663972356 +55.92157474387813209660 +55.72507174158241838313 +55.52931135362169356995 +55.33429122735816463319 +55.14000900465069321399 +54.94646232173311517499 +54.75364880909176434898 +54.56156609134313839604 +54.37021178711137281425 +54.17958350890626206819 +53.98967886300078333761 +53.80049544930927396535 +53.61203086126625549923 +53.42428268570412797089 +53.23724850273107733756 +53.05092588561016242465 +52.86531240063676051477 +52.68040560701775376629 +52.49620305675043141491 +52.31270229450142750238 +52.12990085748371882346 +51.94779627533795718364 +51.76638607000909075850 +51.58566775562819373135 +51.40563883838826342298 +51.22629681642651888751 +51.04763917970213782382 +50.86966340987623169667 +50.69236698019049214281 +50.51574735534754267974 +50.33980199139088540505 +50.16452833558428636707 +49.98992382629159436647 +49.81598589285688660766 +49.64271195548386828023 +49.47009942511645164132 +49.29814570331990353225 +49.12684818215959126064 +48.95620424408270565664 +48.78621126179712064186 +48.61686659815408262375 +48.44816760602657979007 +48.28011162819275625679 +48.11269599721354239819 +47.94591803531707796537 +47.77977505434974148102 +47.61426436030226483354 +47.44938326622619229056 +47.28512909616733139728 +47.12149918517034308252 +46.95849087924214160239 +46.79610153531388760939 +46.63432852120588734124 +46.47316921558874014409 +46.31262100794856451103 +46.15268129854887746433 +45.99334749839513136749 +45.83461702919673541601 +45.67648732333272931783 +45.51895582381340688016 +45.36201998424598258453 +45.20567726879712466825 +45.04992515215796800021 +44.89476111950691006314 +44.74018266647521357982 +44.58618729910980960085 +44.43277253383953251387 +44.27993589743691416061 +44.12767492698573335019 +43.97598716984266786767 +43.82487018360454555932 +43.67432153607089162506 +43.52433880521073916725 +43.37491957912624229721 +43.22606145601890403896 +43.07776204415264231784 +42.93001896182171606142 +42.78282983731357802526 +42.63619230887618272163 +42.49010402468241665019 +42.34456264279611303891 +42.19956583113673076468 +42.05511126744711702941 +41.91119663925665861370 +41.76781964384998957485 +41.62497798823090988662 +41.48266938908996337432 +41.34089157276900294846 +41.19964227522859090413 +41.05891924201452525267 +40.91872022822411025800 +40.77904299847148195113 +40.63988532685638688235 +40.50124499692867630074 +40.36311980165736912340 +40.22550754339489031963 +40.08840603384647494067 +39.95181309403624680954 +39.81572655427422802177 +39.68014425412317081054 +39.54506404236671102126 +39.41048377697643445572 +39.27640132507964665365 +39.14281456292645344774 +39.00972137585783627856 +38.87711965827271143326 +38.74500731359629668304 +38.61338225424835712829 +38.48224240161076181721 +38.35158568599567985302 +38.22141004661358465455 +38.09171343154149980137 +37.96249379769139409291 +37.83374911077925872860 +37.70547734529222339006 +37.57767648445877028962 +37.45034452021639737040 +37.32347945318034021511 +37.19707929261260659359 +37.07114205639138759807 +36.94566577097954507281 +36.82064847139394458964 +36.69608820117456815524 +36.57198301235333559589 +36.44833096542399886175 +36.32513012931172369235 +36.20237858134226627271 +36.08007440721176806164 +35.95821570095625929753 +35.83680056492121224210 +35.71582710973162733126 +35.59529345426237512129 +35.47519772560780637605 +35.35553805905213664573 +35.23631259803831738964 +35.11751949414078666223 +34.99915690703301152098 +34.88122300446068635438 +34.76371596220937476573 +34.64663396407794238030 +34.52997520184670321441 +34.41373787525032668100 +34.29792019194658792003 +34.18252036748936717458 +34.06753662529808224235 +33.95296719662977125154 +33.83881032054888748917 +33.72506424390055457252 +33.61172722127966494554 +33.49879751500436952938 +33.38627339508597913209 +33.27415313920153039362 +33.16243503266429826226 +33.05111736839712932579 +32.94019844690222242889 +32.82967657623511570364 +32.71955007197500719940 +32.60981725719793899998 +32.50047646244758681178 +32.39152602570899119883 +32.28296429237932585465 +32.17478961524188463272 +32.06700035443648033606 +31.95959487743414584315 +31.85257155900787751079 +31.74592878120652272855 +31.63966493332641860547 +31.53377841188559571606 +31.42826762059530665283 +31.32313097033411963821 +31.21836687911967445075 +31.11397377208324499520 +31.00995008144147746521 +30.90629424647120870873 +30.80300471348151702955 +30.70007993578819593949 +30.59751837368570548392 +30.49531849442290720731 +30.39347877217439375386 +30.29199768801645475946 +30.19087372989909923149 +30.09010539262118300030 +29.98969117780305637666 +29.88962959386213213975 +29.78991915598573569923 +29.69055838610549713508 +29.59154581287248930721 +29.49287997163080632390 +29.39455940439161452105 +29.29658265980816267415 +29.19894829315043693896 +29.10165486627961684007 +29.00470094762269113176 +28.90808511214726905791 +28.81180594133612871133 +28.71586202316242619759 +28.62025195206481598120 +28.52497432892248596659 +28.43002776103000073249 +28.33541086207270254249 +28.24112225210164695000 +28.14716055750911039013 +28.05352441100453830813 +27.96021245158949852794 +27.86722332453348371928 +27.77455568134860186547 +27.68220817976714087649 +27.59017948371532114038 +27.49846826329078908202 +27.40707319473711933711 +27.31599296042109870086 +27.22522624880804542613 +27.13477175443770761376 +27.04462817790082596048 +26.95479422581555795091 +26.86526861080366046508 +26.77605005146668304405 +26.68713727236277222232 +26.59852900398254504921 +26.51022398272636237948 +26.42222095088086319947 +26.33451865659567303624 +26.24711585386030066047 +26.16001130248066175454 +26.07320376805612482940 +25.98669202195664951205 +25.90047484130004917802 +25.81455100892899778842 +25.72891931338833515497 +25.64357854890126375835 +25.55852751534885669571 +25.47376501824525618645 +25.38928986871692572436 +25.30510088347852715174 +25.22119688481228294563 +25.13757670054450699126 +25.05423916402323314401 +24.97118311409653657051 +24.88840739509069877045 +24.80591085678731388953 +24.72369235440210388788 +24.64175074856195735151 +24.56008490528433085842 +24.47869369595421318309 +24.39757599730345560829 +24.31673069138841469794 +24.23615666556882430882 +24.15585281248532467657 +24.07581803003941445240 +23.99605122137037227503 +23.91655129483559960590 +23.83731716398797928491 +23.75834774755560019344 +23.67964196941952792486 +23.60119875859395577322 +23.52301704920383329522 +23.44509578046549691521 +23.36743389666375136926 +23.29003034713316822035 +23.21288408623530585828 +23.13599407333955682020 +23.05935927280120978367 +22.98297865394201622280 +22.90685119102856504014 +22.83097586325288830267 +22.75535165471064402709 +22.67997755438216245238 +22.60485255611097699102 +22.52997565858463246968 +22.45534586531354293015 +22.38096218461183894988 +22.30682362957593412034 +22.23292921806610777935 +22.15927797268507504214 +22.08586892075944874136 +22.01270109431903421182 +21.93977353007683106512 +21.86708526941069408167 +21.79463535834159770843 +21.72242284751629526340 +21.65044679218575396362 +21.57870625218719240479 +21.50720029192404680884 +21.43592798034608648550 +21.36488839093130565061 +21.29408060166526439616 +21.22350369502323985671 +21.15315675795033101281 +21.08303888184257601779 +21.01314916252748332681 +20.94348670024567482528 +20.87405059963178999283 +20.80483996969570625879 +20.73585392380362080189 +20.66709157965911813903 +20.59855205928473864674 +20.53023448900308878251 +20.46213799941875421950 +20.39426172539945980589 +20.32660480605775532581 +20.25916638473176334401 +20.19194560896845658249 +20.12494163050359929912 +20.05815360524501400619 +19.99158069325298470176 +19.92522205872349871925 +19.85907686996920773481 +19.79314429940156827570 +19.72742352351281880374 +19.66191372285851812762 +19.59661408203928090188 +19.53152378968299984763 +19.46664203842717100201 +19.40196802490081040560 +19.33750094970717370302 +19.27324001740620573742 +19.20918443649675921847 +19.14533341939927524322 +19.08168618243819736335 +19.01824194582424709665 +18.95499993363764090759 +18.89195937381044032577 +18.82911949810976892650 +18.76647954212016600195 +18.70403874522585851992 +18.64179635059531037200 +18.57975160516241786013 +18.51790375961096302149 +18.45625206835622833523 +18.39479578952963123584 +18.33353418496087172684 +18.27246652016118133588 +18.21159206430680299604 +18.15091009022244605831 +18.09041987436447840309 +18.03012069680442763797 +17.97001184121180017428 +17.91009259483877258390 +17.85036224850227526417 +17.79082009656920604357 +17.73146543693870214042 +17.67229757102674980729 +17.61331580374914196341 +17.55451944350607718093 +17.49590780216510665923 +17.43748019504608848251 +17.37923594090425893910 +17.32117436191430215331 +17.26329478365510894378 +17.20559653509252484582 +17.14807894856511083503 +17.09074135976673858295 +17.03358310773184314257 +16.97660353481965600508 +16.91980198669748602924 +16.86317781232654766654 +16.80673036394488306655 +16.75045899705314766948 +16.69436307039816114184 +16.63844194595804992787 +16.58269498892606819140 +16.52712156769623064179 +16.47172105384681017881 +16.41649282212636506983 +16.36143625043737515057 +16.30655071982189596724 +16.25183561444548985264 +16.19729032158305770395 +16.14291423160304006501 +16.08870673795299310882 +16.03466723714439368109 +15.98079512873708907250 +15.92708981532582690477 +15.87355070252360711436 +15.82017719894874829833 +15.76696871620847240081 +15.71392466888532801761 +15.66104447452220682635 +15.60832755360723389515 +15.55577332955996183728 +15.50338122871606394426 +15.45115068031363136924 +15.39908111647791599808 +15.34717197220775020128 +15.29542268536014759661 +15.24383269663702122898 +15.19240144956993177061 +15.14112839050673287034 +15.09001296859686291896 +15.03905463577716261625 +14.98825284675780267207 +14.93760705900810847879 +14.88711673274297631053 +14.83678133090830364438 +14.78660031916758654802 +14.73657316588691479353 +14.68669934212278604946 +14.63697832160647571698 +14.58740958073171611886 +14.53799259853974668033 +14.48872685670651883072 +14.43961183952866633717 +14.39064703390945254569 +14.34183192934566442034 +14.29316601791399499177 +14.24464879425748620179 +14.19627975557195043166 +14.14805840159260341693 +14.09998423458029748190 +14.05205675930868913781 +14.00427548305060199141 +13.95663991556495453494 +13.90914956908329891405 +13.86180395829665101814 +13.81460260034216958047 +13.76754501478999692665 +13.72063072363071967175 +13.67385925126164991639 +13.62723012447436232719 +13.58074287244071420844 +13.53439702670080535540 +13.48819212115028243204 +13.44212769202608726005 +13.39620327789511300409 +13.35041841964064701642 +13.30477266044970363623 +13.25926554580005856110 +13.21389662344788717974 +13.16866544341509026594 +13.12357155797656282914 +13.07861452164755000638 +13.03379389117123388075 +12.98910922550588864510 +12.94456008581259354173 +12.90014603544306659444 +12.85586663992686418112 +12.81172146695925206927 +12.76771008638832682891 +12.72383207020356366002 +12.68008699252260385038 +12.63647442957995892243 +12.59299395971407875550 +12.54964516335525637203 +12.50642762301411003989 +12.46334092326842402088 +12.42038465075223818701 +12.37755839414279002142 +12.33486174414917968534 +12.29229429350034052959 +12.24985563693253709516 +12.20754537117821314496 +12.16536309495338663567 +12.12330840894665939800 +12.08138091580655881785 +12.03958022013054574018 +11.99790592845237569009 +11.95635764923133947946 +11.91493499283977897107 +11.87363757155208965344 +11.83246499953275154837 +11.79141689282494454005 +11.75049286933852954462 +11.70969254883932109124 +11.66901555293676828740 +11.62846150507332332324 +11.58803003051247593191 +11.54772075632717331928 +11.50753331138946222723 +11.46746732635771337527 +11.42752243366685860337 +11.38769826751585867441 +11.34799446385714816188 +11.30841066038559894480 +11.26894649652642499404 +11.22960161342528628836 +11.19037565393592714713 +11.15126826261032455534 +11.11227908568660183164 +11.07340777107880569474 +11.03465396836517165013 +10.99601732877788151654 +10.95749750519143361771 +10.91909415211253886469 +10.88080692566858154180 +10.84263548359723827730 +10.80457948523523192819 +10.76663859150771784812 +10.72881246491787621267 +10.69110076953577248560 +10.65350317098798882398 +10.61601933644642237198 +10.57864893461802680008 +10.54139163573473503277 +10.50424711154151324877 +10.46721503528724817045 +10.43029508171343167078 +10.39348692704386678543 +10.35679024897399536087 +10.32020472666075150414 +10.28373004071205620846 +10.24736587317652869444 +10.21111190753290109967 +10.17496782868001403699 +10.13893332292598969957 +10.10300807797845124014 +10.06719178293418970327 +10.03148412826892688088 +9.99588480582706040423 +9.96039350881153140449 +9.92500993177359802644 +9.88973377060275105066 +9.85456472251688531117 +9.81950248605217801412 +9.78454676105256915264 +9.74969724866047648959 +9.71495365130618182548 +9.68031567269857617930 +9.64578301781432756457 +9.61135539288891571630 +9.57703250540628836518 +9.54281406408902377336 +9.50869977888848261216 +9.47468936097505576299 +9.44078252272860396488 +9.40697897772853508513 +9.37327844074409988195 +9.33968062772465934529 +9.30618525579000355208 +9.27279204322080907730 +9.23950070944900581082 +9.20631097504825568478 +9.17322256172422889620 +9.14023519230520520296 +9.10734859073229507942 +9.07456248205018667363 +9.04187659239774532693 +9.00929064899855625015 +8.97680438015105686134 +8.94441751521991434970 +8.91212978462575300398 +8.87994091983676625546 +8.84785065335858433855 +8.81585871872540671745 +8.78396485049084319030 +8.75216878421804267418 +8.72047025647126794468 +8.68886900480589652318 +8.65736476776005225986 +8.62595728484475010589 +8.59464629653532341536 +8.56343154426165931170 +8.53231277039987467958 +8.50128971826251955690 +8.47036213209016608516 +8.43952975704201513452 +8.40879233918707491569 +8.37814962549483333021 +8.34760136382694817314 +8.31714730292758197550 +8.28678719241522010464 +8.25652078277331114009 +8.22634782534128561338 +8.19626807230642562274 +8.16628127669416237211 +8.13638719235975393929 +8.10658557397975165770 +8.07687617704266003216 +8.04725875784081168263 +8.01773307346088515146 +7.98829888177617863931 +7.95895594143695994660 +7.92970401186277840111 +7.90054285323308214117 +7.87147222647914279747 +7.84249189327493834156 +7.81360161602920300083 +7.78480115787626214541 +7.75609028266817279729 +7.72746875496568552677 +7.69893634003021709589 +7.67049280381476883406 +7.64213791295626965194 +7.61387143476643579731 +7.58569313722407567724 +7.55760278896597537113 +7.52960015927931181068 +7.50168501809252852297 +7.47385713596797796043 +7.44611628409241887994 +7.41846223426991713268 +7.39089475891295855092 +7.36341363103434876081 +7.33601862423889272691 +7.30870951271533009219 +7.28148607122818969373 +7.25434807510966450650 +7.22729530025127608894 +7.20032752309605861285 +7.17344452063001902786 +7.14664607037442234372 +7.11993195037771364753 +7.09330193920742946290 +7.06675581594214019532 +7.04029336016347695448 +7.01391435194803669617 +6.98761857185952628413 +6.96140580094091632191 +6.93527582070653814128 +6.90922841313373936600 +6.88326336065562927047 +6.85738044615259934034 +6.83157945294510060563 +6.80586016478512156880 +6.78022236584899218315 +6.75466584072930853466 +6.72919037442714085273 +6.70379575234422464547 +6.67848176027529039089 +6.65324818440049536861 +6.62809481127747890383 +6.60302142783385281888 +6.57802782135940677932 +6.55311377949839712898 +6.52827909024202757138 +6.50352354192092629859 +6.47884692319739841082 +6.45424902305781067469 +6.42972963080527737390 +6.40528853605165693352 +6.38092552871034968121 +6.35664039898878918677 +6.33243293738106771684 +6.30830293465987335111 +6.28425018186973005641 +6.26027447031907957609 +6.23637559157296639256 +6.21255333744590743095 +6.18880749999402812733 +6.16513787150815328886 +6.14154424450582325790 +6.11802641172475336617 +6.09458416611468045687 +6.07121730083077260076 +6.04792560922579891525 +6.02470888484323996437 +6.00156692140958547554 +5.97849951282755753823 +5.95550645316841542609 +5.93258753666522320458 +5.90974255770523093645 +5.88697131082305435967 +5.86427359069299036776 +5.84164919212249600378 +5.81909791004442844553 +5.79661953951059860657 +5.77421387568387167732 +5.75188071383186727559 +5.72961984931922962971 +5.70743107760103818293 +5.68531419421539041537 +5.66326899477674405858 +5.64129527496852567481 +5.61939283053656346567 +5.59756145728145337870 +5.57580095105238093822 +5.55411110773941363306 +5.53249172326721350146 +5.51094259358762350587 +5.48946351467313586880 +5.46805428250948999391 +5.44671469308945610521 +5.42544454240523421618 +5.40424362644235145581 +5.38311174117221646895 +5.36204868254571298536 +5.34105424648595494830 +5.32012822888201863947 +5.29927042558162586516 +5.27848063238497111627 +5.25775864503717649256 +5.23710425922250077946 +5.21651727055678193778 +5.19599747458128735644 +5.17554466675557378608 +5.15515864245124966203 +5.13483919694497537023 +5.11458612541205592805 +5.09439922291944480293 +5.07427828441942985194 +5.05422310474293823290 +5.03423347859298964124 +5.01430920053793371949 +4.99445006500510757519 +4.97465586627397904351 +4.95492639846981841600 +4.93526145555716677649 +4.91566083133328746158 +4.89612431942163262022 +4.87665171326536128760 +4.85724280612072334407 +4.83789739105076854742 +4.81861526091889658119 +4.79939620838244085377 +4.78024002588592189511 +4.76114650565510100222 +4.74211543969009863275 +4.72314661975954841466 +4.70423983739356188494 +4.68539488387796154711 +4.66661155024767460020 +4.64788962728035315308 +4.62922890549002552518 +4.61062917514020753629 +4.59209022663705734857 +4.57361185114222568160 +4.55519384066701071845 +4.53683598806882315557 +4.51853808704783332928 +4.50029993214360324316 +4.48212131873169106200 +4.46400204302031600179 +4.44594190204681005696 +4.42794069367450848773 +4.40999821658904878063 +4.39211427029530998567 +4.37428865511413711431 +4.35652117217868184440 +4.33881162343158699457 +4.32115981162132278826 +4.30356554029891924529 +4.28602861381483890568 +4.26854883731575718286 +4.25112601674120060835 +4.23375995882040356832 +4.21645047106900605627 +4.19919736178581715080 +4.18200044004960247435 +4.16485951571620738321 +4.14777439941494918685 +4.13074490254580073412 +4.11377083727588388484 +4.09685201653668684685 +4.07998825402062337275 +4.06317936417819591810 +4.04642516221464010329 +4.02972546408708254262 +4.01308008650106629034 +3.99648884690794803376 +3.97995156350134271506 +3.96346805521462597355 +3.94703814171723355031 +3.93066164341228230228 +3.91433838143302592627 +3.89806817764023350037 +3.88185085461871937085 +3.86568623567496372218 +3.84957414483366155977 +3.83351440683490052308 +3.81750684713114818436 +3.80155129188450358058 +3.78564756796326129518 +3.76979550293976650721 +3.75399492508676724256 +3.73824566337486929868 +3.72254754746950533573 +3.70690040772821305382 +3.69130407519738401589 +3.67575838160998769055 +3.66026315938213198109 +3.64481824161056877642 +3.62942346206962040966 +3.61407865520867588316 +3.59878365614883088952 +3.58353830068085166261 +3.56834242526148059937 +3.55319586701142142715 +3.53809846371210445781 +3.52305005380314728569 +3.50805047637920619508 +3.49309957118790581632 +3.47819717862642985295 +3.46334313973919227791 +3.44853729621486682078 +3.43377949038392538128 +3.41906956521554139528 +3.40440736431544843654 +3.38979273192279340066 +3.37522551290764560861 +3.36070555276831139935 +3.34623269762852126874 +3.33180679423504999548 +3.31742768995507253393 +3.30309523277318595191 +3.28880927128913658208 +3.27456965471505290211 +3.26037623287272149142 +3.24622885619139189828 +3.23212737570472352644 +3.21807164304855142234 +3.20406151045813736289 +3.19009683076566785687 +3.17617745739761048185 +3.16230324437229226575 +3.14847404629747007476 +3.13468971836748266924 +3.12095011636097785512 +3.10725509663837140550 +3.09360451613915499181 +3.07999823237970105083 +3.06643610345069017598 +3.05291798801451275125 +3.03944374530283978331 +3.02601323511433095703 +3.01262631781184930801 +2.99928285432041441538 +2.98598270612453697836 +2.97272573526585226489 +2.95951180434068339409 +2.94634077649766634721 +2.93321251543517336202 +2.92012688539923459530 +2.90708375118108364177 +2.89408297811452941417 +2.88112443207374191445 +2.86820797947108729886 +2.85533348725429103609 +2.84250082290470018620 +2.82970985443447808905 +2.81696045038452380638 +2.80425247982200964714 +2.79158581233818514633 +2.77896031804590348813 +2.76637586757753739519 +2.75383233208263566993 +2.74132958322552466868 +2.72886749318308741152 +2.71644593464259775928 +2.70406478079921042124 +2.69172390535415706481 +2.67942318251197519885 +2.66716248697868207884 +2.65494169395926915556 +2.64276067915576362566 +2.63061931876456966961 +2.61851748947485685193 +2.60645506846588848049 +2.59443193340502542554 +2.58244796244547014652 +2.57050303422421055899 +2.55859702785956555360 +2.54672982294951033566 +2.53490129956898524455 +2.52311133826816647030 +2.51135982007002578342 +2.49964662646846402794 +2.48797163942581001095 +2.47633474137119069525 +2.46473581519807138918 +2.45317474426220405448 +2.44165141237957339371 +2.43016570382437402387 +2.41871750332662127647 +2.40730669607066571913 +2.39593316769243136477 +2.38459680427784492807 +2.37329749236053766381 +2.36203511891993533922 +2.35080957137897694764 +2.33962073760247912801 +2.32846850589471099369 +2.31735276499759867974 +2.30627340408855285858 +2.29523031277870881439 +2.28422338111049860743 +2.27325249955613850616 +2.26231755901529840713 +2.25141845081328284550 +2.24055506669896198346 +2.22972729884288023428 +2.21893503983507978106 +2.20817818268354981726 +2.19745662081191106552 +2.18677024805753283943 +2.17611895866978866110 +2.16550264730784869371 +2.15492120903892159234 +2.14437453933634047942 +2.13386253407759829415 +2.12338508954243465610 +2.11294210241095781200 +2.10253346976164179338 +2.09215908906957848146 +2.08181885820468215442 +2.07151267542953654299 +2.06124043939760737132 +2.05100204915159878283 +2.04079740412120314019 +2.03062640412165684722 +2.02048894935161715836 +2.01038494039141379943 +2.00031427820122376104 +1.99027686411919546572 +1.98027259985959358524 +1.97030138751108419015 +1.96036312953494529232 +1.95045772876311973576 +1.94058508839641286059 +1.93074511200292708857 +1.92093770351588966072 +1.91116276723226841128 +1.90142020781075071767 +1.89170993027001510534 +1.88203183998705636526 +1.87238584269527397197 +1.86277184448273191997 +1.85318975179055267510 +1.84363947141113526662 +1.83412091048631231693 +1.82463397650560144037 +1.81517857730469578392 +1.80575462106338546775 +1.79636201630420533348 +1.78700067189054823125 +1.77767049702493151742 +1.76837140124735503477 +1.75910329443359714219 +1.74986608679341504313 +1.74065968886904598456 +1.73148401153352171633 +1.72233896598879043793 +1.71322446376413539681 +1.70414041671469851380 +1.69508673701949108548 +1.68606333717999401500 +1.67707013001846383382 +1.66810702867622473455 +1.65917394661199990580 +1.65027079760044181889 +1.64139749573032767138 +1.63255395540302039592 +1.62374009133083840872 +1.61495581853546421591 +1.60620105234627330582 +1.59747570839881780635 +1.58877970263314005628 +1.58011295129221873701 +1.57147537092039635276 +1.56286687836183113554 +1.55428739075876776177 +1.54573682555014113582 +1.53721510046991416409 +1.52872213354547925590 +1.52025784309623257506 +1.51182214773189538271 +1.50341496635100058121 +1.49503621813931708573 +1.48668582256841652622 +1.47836369939402945128 +1.47006976865454674908 +1.46180395066952550920 +1.45356616603808941335 +1.44535633563751497732 +1.43717438062162128354 +1.42902022241934067992 +1.42089378273317823442 +1.41279498353768517838 +1.40472374707803537852 +1.39667999586845836824 +1.38866365269085800804 +1.38067464059317535074 +1.37271288288808657185 +1.36477830315138271011 +1.35687082522062851808 +1.34899037319362280485 +1.34113687142691473397 +1.33331024453445112776 +1.32551041738603569975 +1.31773731510593083982 +1.30999086307141920926 +1.30227098691126830232 +1.29457761250450964496 +1.28691066597876235811 +1.27927007370901235639 +1.27165576231605936819 +1.26406765866518533414 +1.25650568986469868271 +1.24896978326451413288 +1.24145986645482642174 +1.23397586726463770468 +1.22651771376034535166 +1.21908533424447917959 +1.21167865725410606181 +1.20429761155973547027 +1.19694212616361972401 +1.18961213029863821511 +1.18230755342678017783 +1.17502832523783196095 +1.16777437564805741665 +1.16054563479871553078 +1.15334203305484495061 +1.14616350100384067900 +1.13900996945408339300 +1.13188136943371553400 +1.12477763218910653542 +1.11769868918377812683 +1.11064447209679428852 +1.10361491282167967221 +1.09660994346492679519 +1.08962949634477701544 +1.08267350398986650362 +1.07574189913789197703 +1.06883461473434415723 +1.06195158393124877705 +1.05509274008572528913 +1.04825801675883778508 +1.04144734771417746266 +1.03466066691672908817 +1.02789790853141926874 +1.02115900692196315269 +1.01444389664950085361 +1.00775251247139419064 +1.00108478933990907578 +0.99444066240094930453 +0.98782006699283797513 +0.98122293864503296046 +0.97464921307683927143 +0.96809882619617182442 +0.96157171409840669352 +0.95506781306495758255 +0.94858705956219147026 +0.94212939024011499445 +0.93569474193113832960 +0.92928305164888735934 +0.92289425658694790311 +0.91652829411762581913 +0.91018510179079237243 +0.90386461733252509987 +0.89756677864414657897 +0.89129152380072285133 +0.88503879105007021710 +0.87880851881144506077 +0.87260064567438710981 +0.86641511039754504075 +0.86025185190739528185 +0.85411080929715310628 +0.84799192182553773112 +0.84189512891556694818 +0.83582037015346000164 +0.82976758528733707276 +0.82373671422620298177 +0.81772769703860670454 +0.81174047395161841312 +0.80577498534958547083 +0.79983117177300588896 +0.79390897391737536015 +0.78800833263197334055 +0.78212918891879468219 +0.77627148393139688842 +0.77043515897365399958 +0.76462015549876305442 +0.75882641510797066431 +0.75305387954955094187 +0.74730249071757604007 +0.74157219065090762555 +0.73586292153191912302 +0.73017462568551061430 +0.72450724557788859226 +0.71886072381555321531 +0.71323500314409893353 +0.70763002644711081590 +0.70204573674512216197 +0.69648207719443289143 +0.69093899108606715576 +0.68541642184467743704 +0.67991431302734151032 +0.67443260832266649363 +0.66897125154948278158 +0.66353018665595009384 +0.65810935771832990149 +0.65270870893999721751 +0.64732818465031349842 +0.64196772930356504894 +0.63662728747791175188 +0.63130680387430915257 +0.62600622331538857690 +0.62072549074449956397 +0.61546455122451737552 +0.61022334993696414340 +0.60500183218075576086 +0.59979994337128783588 +0.59461762903933801372 +0.58945483483001104297 +0.58431150650175722738 +0.57918758992521701678 +0.57408303108230540612 +0.56899777606510193451 +0.56393177107482228561 +0.55888496242086282972 +0.55385729651964199505 +0.54884871989368855250 +0.54385917917059034554 +0.53888862108196466938 +0.53393699246242709577 +0.52900424024861358863 +0.52409031147815476892 +0.51919515328863630188 +0.51431871291666575452 +0.50946093769677991414 +0.50462177506054473053 +0.49980117253544098510 +0.49499907774399420912 +0.49021543840265607850 +0.48545020232094249213 +0.48070331740034394352 +0.47597473163337389312 +0.47126439310261208915 +0.46657224997968954616 +0.46189825052433541863 +0.45724234308338790322 +0.45260447608980386436 +0.44798459806177093334 +0.44338265760159528694 +0.43879860339490395216 +0.43423238420953458316 +0.42968394889468874975 +0.42515324637991480650 +0.42064022567412684417 +0.41614483586475065069 +0.41166702611668548606 +0.40720674567135267674 +0.40276394384584079944 +0.39833857003182343570 +0.39393057369480499741 +0.38953990437297092431 +0.38516651167641718922 +0.38081034528610835377 +0.37647135495306194297 +0.37214949049728890396 +0.36784470180693601415 +0.36355693883737844052 +0.35928615161027105396 +0.35503229021261462073 +0.35079530479585468994 +0.34657514557494945029 +0.34237176282754006040 +0.33818510689289132953 +0.33401512817111589371 +0.32986177712218645031 +0.32572500426509526372 +0.32160476017688544026 +0.31750099549182708714 +0.31341366090041961057 +0.30934270714861605844 +0.30528808503683646514 +0.30124974541910048975 +0.29722763920215905520 +0.29322171734462348924 +0.28923193085601067720 +0.28525823079593842779 +0.28130056827316807233 +0.27735889444484157496 +0.27343316051546306955 +0.26952331773614501831 +0.26562931740366507727 +0.26175111085960772739 +0.25788864948954270950 +0.25404188472211586269 +0.25021076802817870943 +0.24639525091996333783 +0.24259528495018267691 +0.23881082171119830115 +0.23504181283420824689 +0.23128820998829366373 +0.22754996487962880769 +0.22382702925064526522 +0.22011935487918735110 +0.21642689357759026247 +0.21274959719190841834 +0.20908741760109805785 +0.20544030671609270211 +0.20180821647903146587 +0.19819109886240146579 +0.19458890586818811119 +0.19100158952712262272 +0.18742910189771386231 +0.18387139506558175528 +0.18032842114247765730 +0.17680013226560251094 +0.17328648059666129644 +0.16978741832112848043 +0.16630289764739022984 +0.16283287080595698626 +0.15937729004861825310 +0.15593610764765009069 +0.15250927589498011749 +0.14909674710142983844 +0.14569847359588250502 +0.14231440772443651466 +0.13894450184964590722 +0.13558870834975594866 +0.13224697961780521038 +0.12891926806418882445 +0.12560552617021522592 +0.12230570656116336592 +0.11901976201549462064 +0.11574764546443649937 +0.11248930999139464260 +0.10924470883149571543 +0.10601379537111199625 +0.10279652314728171536 +0.09959284584731471768 +0.09640271730819173490 +0.09322609151612935852 +0.09006292260612240586 +0.08691316486130810925 +0.08377677271271159742 +0.08065370073848945887 +0.07754390366367849841 +0.07444733635955638751 +0.07136395384321385371 +0.06829371127712473288 +0.06523656396854136952 +0.06219246736916411028 +0.05916137707454408728 +0.05614324882366601016 +0.05313803849850472216 +0.05014570212346302486 +0.04716619586502609346 +0.04419947603113642126 +0.04124549907091006051 +0.03830422157401116440 +0.03537560027031150245 +0.03245959202934081689 +0.02955615385985960533 +0.02666524290943977221 +0.02378681646396064997 +0.02092083194715501845 +0.01806724692017725592 +0.01522601908113094087 +0.01239710626466902950 +0.00958046644147678324 +0.00677605771786358307 +0.00398383833530616821 +0.00120376667004638100 +-0.00156419876744263520 +-0.00432009933278203542 +-0.00706397624823543006 +-0.00979587060305073948 +-0.01251582335397210741 +-0.01522387532563447034 +-0.01792006721099659305 +-0.02060443957180051189 +-0.02327703283894178021 +-0.02593788731297356695 +-0.02858704316449516697 +-0.03122454043455262854 +-0.03385041903509006939 +-0.03646471874939912622 +-0.03906747923250309534 +-0.04165874001155958628 +-0.04423854048632793606 +-0.04680691992956353964 +-0.04936391748739366730 +-0.05190957217982962446 +-0.05444392290106098153 +-0.05696700841995743642 +-0.05947886738040953497 +-0.06197953830180393670 +-0.06446905957939044751 +-0.06694746948468353887 +-0.06941480616585349317 +-0.07187110764819920616 +-0.07431641183446550947 +-0.07675075650530546745 +-0.07917417931960950284 +-0.08158671781497751907 +-0.08398840940807239530 +-0.08637929139502827092 +-0.08875940095180953615 +-0.09112877513466594026 +-0.09348745088044209395 +-0.09583546500706885407 +-0.09817285421382720978 +-0.10049965508184756369 +-0.10281590407442217638 +-0.10512163753742814754 +-0.10741689169966583961 +-0.10970170267329171221 +-0.11197610645416224140 +-0.11424013892222927014 +-0.11649383584190589613 +-0.11873723286242815478 +-0.12097036551826791106 +-0.12319326922949774827 +-0.12540597930210645172 +-0.12760853092845811374 +-0.12980095918756545670 +-0.13198329904556924119 +-0.13415558535598773315 +-0.13631785286017905623 +-0.13847013618761275233 +-0.14061246985633521489 +-0.14274488827326337059 +-0.14486742573452937588 +-0.14698011642592240245 +-0.14908299442314557059 +-0.15117609369225687432 +-0.15325944808998118174 +-0.15533309136404252482 +-0.15739705715360799432 +-0.15945137898951941557 +-0.16149609029474054633 +-0.16353122438464182120 +-0.16555681446739253793 +-0.16757289364429872602 +-0.16957949491010682053 +-0.17157665115342835005 +-0.17356439515698604548 +-0.17554275959805210050 +-0.17751177704872680985 +-0.17947147997628587479 +-0.18142190074354788698 +-0.18336307160916195946 +-0.18529502472803049962 +-0.18721779215153122600 +-0.18913140582794707445 +-0.19103589760273467779 +-0.19293129921890370126 +-0.19481764231732984216 +-0.19669495843704906668 +-0.19856327901566192540 +-0.20042263538956769930 +-0.20227305879440529712 +-0.20411458036525056969 +-0.20594723113703702899 +-0.20777104204484417305 +-0.20958604392420171481 +-0.21139226751144571392 +-0.21318974344401100951 +-0.21497850226076295477 +-0.21675857440232867979 +-0.21852999021136415569 +-0.22029277993293666649 +-0.22204697371475282108 +-0.22379260160759861797 +-0.22552969356551105795 +-0.22725827944619389487 +-0.22897838901125933120 +-0.23069005192658134651 +-0.23239329776260334026 +-0.23408815599460125467 +-0.23577465600302294213 +-0.23745282707380005460 +-0.23912269839864266907 +-0.24078429907533391297 +-0.24243765810802209160 +-0.24408280440755494856 +-0.24571976679175877578 +-0.24734857398574316978 +-0.24896925462216304425 +-0.25058183724160032479 +-0.25218635029275199289 +-0.25378282213281466717 +-0.25537128102774170335 +-0.25695175515250689990 +-0.25852427259146554261 +-0.26008886133857000988 +-0.26164554929771965952 +-0.26319436428302539488 +-0.26473533401906462759 +-0.26626848614125603332 +-0.26779384819603885282 +-0.26931144764124426150 +-0.27082131184630986453 +-0.27232346809262492071 +-0.27381794357379035665 +-0.27530476539586473672 +-0.27678396057768550609 +-0.27825555605114415947 +-0.27971957866145158444 +-0.28117605516742993910 +-0.28262501224175445858 +-0.28406647647127730716 +-0.28550047435727277101 +-0.28692703231571697886 +-0.28834617667756068382 +-0.28975793368898583591 +-0.29116232951171738819 +-0.29255939022326388210 +-0.29394914181716502721 +-0.29533161020331738511 +-0.29670682120817393201 +-0.29807480057509455618 +-0.29943557396451581099 +-0.30078916695428548067 +-0.30213560503991160333 +-0.30347491363478723558 +-0.30480711807051258377 +-0.30613224359710716760 +-0.30745031538329886667 +-0.30876135851677649624 +-0.31006539800442711741 +-0.31136245877263807325 +-0.31265256566748467204 +-0.31393574345508573620 +-0.31521201682176597236 +-0.31648141037435584266 +-0.31774394864041449749 +-0.31899965606852659361 +-0.32024855702853638473 +-0.32149067581176415942 +-0.32272603663130966511 +-0.32395466362225028290 +-0.32517658084195605328 +-0.32639181227025237941 +-0.32760038180974154765 +-0.32880231328599379692 +-0.32999763044783342325 +-0.33118635696757131592 +-0.33236851644121445659 +-0.33354413238877494985 +-0.33471322825443605709 +-0.33587582740685795191 +-0.33703195313939265931 +-0.33818162867028311869 +-0.33932487714301817761 +-0.34046172162639154468 +-0.34159218511493211201 +-0.34271629052899305057 +-0.34383406071505984158 +-0.34494551844597987067 +-0.34605068642115610622 +-0.34714958726684025381 +-0.34824224353630184314 +-0.34932867771011111291 +-0.35040891219635977860 +-0.35148296933085226845 +-0.35255087137738905234 +-0.35361264052794638690 +-0.35466829890297124628 +-0.35571786855151082962 +-0.35676137145153813401 +-0.35779882951010105741 +-0.35883026456359862211 +-0.35985569837798464521 +-0.36087515264898434308 +-0.36188864900231482169 +-0.36289620899393654208 +-0.36389785411024871964 +-0.36489360576832025052 +-0.36588348531608178016 +-0.36686751403258704984 +-0.36784571312821834344 +-0.36881810374488571691 +-0.36978470695624826581 +-0.37074554376795654242 +-0.37170063511782552856 +-0.37265000187609986781 +-0.37359366484561479238 +-0.37453164476204964251 +-0.37546396229413336876 +-0.37639063804382189016 +-0.37731169254656488077 +-0.37822714627148151800 +-0.37913701962154966463 +-0.38004133293388925319 +-0.38094010647988368889 +-0.38183336046544991138 +-0.38272111503120048726 +-0.38360339025269624136 +-0.38448020614062433653 +-0.38535158264099039771 +-0.38621753963534621867 +-0.38707809694099759579 +-0.38793327431118890258 +-0.38878309143531092351 +-0.38962756793911523800 +-0.39046672338488153109 +-0.39130057727166678294 +-0.39212914903547002599 +-0.39295245804943729206 +-0.39377052362405651209 +-0.39458336500737778429 +-0.39539100138519800431 +-0.39619345188122867540 +-0.39699073555734065710 +-0.39778287141372803415 +-0.39856987838911567268 +-0.39935177536094706996 +-0.40012858114556548728 +-0.40090031449844165667 +-0.40166699411432016387 +-0.40242863862746380832 +-0.40318526661178499815 +-0.40393689658108511420 +-0.40468354698922315293 +-0.40542523623031084812 +-0.40616198263887842712 +-0.40689380449010048579 +-0.40762071999995713734 +-0.40834274732542868991 +-0.40905990456467244965 +-0.40977220975721628804 +-0.41047968088414815702 +-0.41118233586830243986 +-0.41188019257441033094 +-0.41257326880933270496 +-0.41326158232219201150 +-0.41394515080461852241 +-0.41462399189084719886 +-0.41529812315797964839 +-0.41596756212609836689 +-0.41663232625849411228 +-0.41729243296182866318 +-0.41794789958629241511 +-0.41859874342581943063 +-0.41924498171822782711 +-0.41988663164542311401 +-0.42052371033357272001 +-0.42115623485324521491 +-0.42178422221965744532 +-0.42240768939274103699 +-0.42302665327745014867 +-0.42364113072380904512 +-0.42425113852716350715 +-0.42485669342833048967 +-0.42545781211375061082 +-0.42605451121569604123 +-0.42664680731239812417 +-0.42723471692825720769 +-0.42781825653399807585 +-0.42839744254681200175 +-0.42897229133056963279 +-0.42954281919594600181 +-0.43010904240063752013 +-0.43067097714946617204 +-0.43122863959460294714 +-0.43178204583569207431 +-0.43233121192003914901 +-0.43287615384277644548 +-0.43341688754700724573 +-0.43395342892397670287 +-0.43448579381325469484 +-0.43501399800287154918 +-0.43553805722950134083 +-0.43605798717859278746 +-0.43657380348456331642 +-0.43708552173094472604 +-0.43759315745054477853 +-0.43809672612559197313 +-0.43859624318792461706 +-0.43909172401911306105 +-0.43958318395065287820 +-0.44007063826409348328 +-0.44055410219120733073 +-0.44103359091415172966 +-0.44150911956560617844 +-0.44198070322895793849 +-0.44244835693841066959 +-0.44291209567918060630 +-0.44337193438764294084 +-0.44382788795145122762 +-0.44427997120974493939 +-0.44472819895324494643 +-0.44517258592445341225 +-0.44561314681778102509 +-0.44604989627968066879 +-0.44648284890884815113 +-0.44691201925630785752 +-0.44733742182563152046 +-0.44775907107302170829 +-0.44817698140750450442 +-0.44859116719105174287 +-0.44900164273874859644 +-0.44940842231892957903 +-0.44981152015332087624 +-0.45021095041718550700 +-0.45060672723949102281 +-0.45099886470302480435 +-0.45138737684456248234 +-0.45177227765498612078 +-0.45215358107945818888 +-0.45253130101754390768 +-0.45290545132335952028 +-0.45327604580571001502 +-0.45364309822824883112 +-0.45400662230958621635 +-0.45436663172347097062 +-0.45472314009889064357 +-0.45507616102024422977 +-0.45542570802746329406 +-0.45577179461615996425 +-0.45611443423775055450 +-0.45645364029961343899 +-0.45678942616522150155 +-0.45712180515427164318 +-0.45745079054282217212 +-0.45777639556343119320 +-0.45809863340530965203 +-0.45841751721443085854 +-0.45873306009367464942 +-0.45904527510297438164 +-0.45935417525942279227 +-0.45965977353745468559 +-0.45996208286891704375 +-0.46026111614326059573 +-0.46055688620762114116 +-0.46084940586700318121 +-0.46113868788437750723 +-0.46142474498080798817 +-0.46170758983561499544 +-0.46198723508646799552 +-0.46226369332954619917 +-0.46253697711966129669 +-0.46280709897035537947 +-0.46307407135409872634 +-0.46333790670232466447 +-0.46359861740565400101 +-0.46385621581394725910 +-0.46411071423647515255 +-0.46436212494203649159 +-0.46461046015906093398 +-0.46485573207577601806 +-0.46509795284029464835 +-0.46533713456076541970 +-0.46557328930549385371 +-0.46580642910304986826 +-0.46603656594241427147 +-0.46626371177307424087 +-0.46648787850519624065 +-0.46670907800968691737 +-0.46692732211836363021 +-0.46714262262404415704 +-0.46735499128069657448 +-0.46756443980354428502 +-0.46777097986918653172 +-0.46797462311571591531 +-0.46817538114285200956 +-0.46837326551206664993 +-0.46856828774666753334 +-0.46876045933195303883 +-0.46894979171532108486 +-0.46913629630637043721 +-0.46931998447705475241 +-0.46950086756175568592 +-0.46967895685743793477 +-0.46985426362374999032 +-0.47002679908313305113 +-0.47019657442095291744 +-0.47036360078560063291 +-0.47052788928863370499 +-0.47068945100485137800 +-0.47084829697244584557 +-0.47100443819308956961 +-0.47115788563207083861 +-0.47130865021840029350 +-0.47145674284491373429 +-0.47160217436838913763 +-0.47174495560967377727 +-0.47188509735378103560 +-0.47202261035001163991 +-0.47215750531204808693 +-0.47228979291809181085 +-0.47241948381094156506 +-0.47254658859814957506 +-0.47267111785207671648 +-0.47279308211004950069 +-0.47291249187443595847 +-0.47302935761277403737 +-0.47314368975788084759 +-0.47325549870794164642 +-0.47336479482664300944 +-0.47347158844325676341 +-0.47357588985277088156 +-0.47367770931598046635 +-0.47377705705958661486 +-0.47387394327633963753 +-0.47396837812509506893 +-0.47406037173096343684 +-0.47414993418537720871 +-0.47423707554623328875 +-0.47432180583796962337 +-0.47440413505168138597 +-0.47448407314521828804 +-0.47456163004330176314 +-0.47463681563761089821 +-0.47470963978690666751 +-0.47478011231710287587 +-0.47484824302140266061 +-0.47491404166038025947 +-0.47497751796209353170 +-0.47503868162216950077 +-0.47509754230391942897 +-0.47515410963844101344 +-0.47520839322471580823 +-0.47526040262969321271 +-0.47531014738842336520 +-0.47535763700411698407 +-0.47540288094829052934 +-0.47544588866081849421 +-0.47548666955006413382 +-0.47552523299297116965 +-0.47556158833514261541 +-0.47559574489097145022 +-0.47562771194370540018 +-0.47565749874557111676 +-0.47568511451785361333 +-0.47571056845099579657 +-0.47573386970470410429 +-0.47575502740802211310 +-0.47577405065946304363 +-0.47579094852707071173 +-0.47580573004852522168 +-0.47581840423123850092 +-0.47582898005245644057 +-0.47583746645934860142 +-0.47584387236908509689 +-0.47584820666896210373 +-0.47585047821645848343 +-0.47585069583937444904 +-0.47584886833587092259 +-0.47584500447460470474 +-0.47583911299479608736 +-0.47583120260633354759 +-0.47582128198986578527 +-0.47580935979687410953 +-0.47579544464979250940 +-0.47577954514206799441 +-0.47576166983827783419 +-0.47574182727420827321 +-0.47572002595692736149 +-0.47569627436492173400 +-0.47567058094811509594 +-0.47564295412803581087 +-0.47561340229784154765 +-0.47558193382244146052 +-0.47554855703858306404 +-0.47551328025491845786 +-0.47547611175212195489 +-0.47543705978294714676 +-0.47539613257234064614 +-0.47535333831751608313 +-0.47530868518803287559 +-0.47526218132590325460 +-0.47521383484565077326 +-0.47516365383443487369 +-0.47511164635208907869 +-0.47505782043124683556 +-0.47500218407739747128 +-0.47494474526899393974 +-0.47488551195752265466 +-0.47482449206758936544 +-0.47476169349700308997 +-0.47469712411686620923 +-0.47463079177165629075 +-0.47456270427930252742 +-0.47449286943126839367 +-0.47442129499264434900 +-0.47434798870222166789 +-0.47427295827258042493 +-0.47419621139015977196 +-0.47411775571535830220 +-0.47403759888259067168 +-0.47395574850039667858 +-0.47387221215150554521 +-0.47378699739290780490 +-0.47370011175596299369 +-0.47361156274644666819 +-0.47352135784466198309 +-0.47342950450550042030 +-0.47333601015851273219 +-0.47324088220802551508 +-0.47314412803316996392 +-0.47304575498800310873 +-0.47294577040155338921 +-0.47284418157792751369 +-0.47274099579637135493 +-0.47263622031134638890 +-0.47252986235261174031 +-0.47242192912530622806 +-0.47231242781001969711 +-0.47220136556286845808 +-0.47208874951557683319 +-0.47197458677554166018 +-0.47185888442592721637 +-0.47174164952572827936 +-0.47162288910984379031 +-0.47150261018915690103 +-0.47138081975061141282 +-0.47125752475728410751 +-0.47113273214846695947 +-0.47100644883971809485 +-0.47087868172296482028 +-0.47074943766656379696 +-0.47061872351537614723 +-0.47048654609083068179 +-0.47035291219102315363 +-0.47021782859075650363 +-0.47008130204164411126 +-0.46994333927215808933 +-0.46980394698771887896 +-0.46966313187075742208 +-0.46952090058079598567 +-0.46937725975450123039 +-0.46923221600577880164 +-0.46908577592583017291 +-0.46893794608323408069 +-0.46878873302399903800 +-0.46863814327165143059 +-0.46848618332730218583 +-0.46833285966971555103 +-0.46817817875537159900 +-0.46802214701855071599 +-0.46786477087138261810 +-0.46770605670394760356 +-0.46754601088430791656 +-0.46738463975860378152 +-0.46722194965110680487 +-0.46705794686430107676 +-0.46689263767894167989 +-0.46672602835412346778 +-0.46655812512735667097 +-0.46638893421462312983 +-0.46621846181045462076 +-0.46604671408799291932 +-0.46587369719905219467 +-0.46569941727421354516 +-0.46552388042283704417 +-0.46534709273319452283 +-0.46516906027248117184 +-0.46498978908691085410 +-0.46480928520177622332 +-0.46462755462150556740 +-0.46444460332974102368 +-0.46426043728938942712 +-0.46407506244270291251 +-0.46388848471133425910 +-0.46370070999639712017 +-0.46351174417854718035 +-0.46332159311801940360 +-0.46313026265472828635 +-0.46293775860829433633 +-0.46274408677813477775 +-0.46254925294350646148 +-0.46235326286359129666 +-0.46215612227754226948 +-0.46195783690454950143 +-0.46175841244390236628 +-0.46155785457505954517 +-0.46135616895770542589 +-0.46115336123181183137 +-0.46094943701769680588 +-0.46074440191609250528 +-0.46053826150820631469 +-0.46033102135577991243 +-0.46012268700114244968 +-0.45991326396729220738 +-0.45970275775793195683 +-0.45949117385755006149 +-0.45927851773147176928 +-0.45906479482591527885 +-0.45885001056806518083 +-0.45863417036611087152 +-0.45841727960933620345 +-0.45819934366814729643 +-0.45798036789415291770 +-0.45776035762021782816 +-0.45753931816051418568 +-0.45731725481059731786 +-0.45709417284744041643 +-0.45687007752951686035 +-0.45664497409684556839 +-0.45641886777104628825 +-0.45619176375540976265 +-0.45596366723493497730 +-0.45573458337641836735 +-0.45550451732847530018 +-0.45527347422162472990 +-0.45504145916832550167 +-0.45480847726305251300 +-0.45457453358234090057 +-0.45433963318484255067 +-0.45410378111138516299 +-0.45386698238503225822 +-0.45362924201113130618 +-0.45339056497737867391 +-0.45315095625386253575 +-0.45291042079312787694 +-0.45266896353023322597 +-0.45242658938279933789 +-0.45218330325106148582 +-0.45193911001793940496 +-0.45169401454907043281 +-0.45144802169288478222 +-0.45120113628064201228 +-0.45095336312649764166 +-0.45070470702755299763 +-0.45045517276390933947 +-0.45020476509871204529 +-0.44995348877822310962 +-0.44970134853185700363 +-0.44944834907224689990 +-0.44919449509528330822 +-0.44893979128017602598 +-0.44868424228951020449 +-0.44842785276929281180 +-0.44817062734899887344 +-0.44791257064164391455 +-0.44765368724380399934 +-0.44739398173570754658 +-0.44713345868124781957 +-0.44687212262806491614 +-0.44660997810757258053 +-0.44634702963503064543 +-0.44608328170958372327 +-0.44581873881431122175 +-0.44555340541628735140 +-0.44528728596661970585 +-0.44502038490051176733 +-0.44475270663730492871 +-0.44448425558052490070 +-0.44421503611795420952 +-0.44394505262164168924 +-0.44367430944799868264 +-0.44340281093780831156 +-0.44313056141630285945 +-0.44285756519319824376 +-0.44258382656274591893 +-0.44230934980378550092 +-0.44203413917978601200 +-0.44175819893890444501 +-0.44148153331402861799 +-0.44120414652282036183 +-0.44092604276777574990 +-0.44064722623625862674 +-0.44036770110056838723 +-0.44008747151796123731 +-0.43980654163072374629 +-0.43952491556619893709 +-0.43924259743685034607 +-0.43895959134029988169 +-0.43867590135937506446 +-0.43839153156215726614 +-0.43810648600202800607 +-0.43782076871772546145 +-0.43753438373336922540 +-0.43724733505852664273 +-0.43695962668824428476 +-0.43667126260310945574 +-0.43638224676928449863 +-0.43609258313854953881 +-0.43580227564836154786 +-0.43551132822188981519 +-0.43521974476806152277 +-0.43492752918161292630 +-0.43463468534312182934 +-0.43434121711907536234 +-0.43404712836188663605 +-0.43375242290996252059 +-0.43345710458773201168 +-0.43316117720569985439 +-0.43286464456049222882 +-0.43256751043488778086 +-0.43226977859787901748 +-0.43197145280470178319 +-0.43167253679688771806 +-0.43137303430230566903 +-0.43107294903519921547 +-0.43077228469624134766 +-0.43047104497256344358 +-0.43016923353781594264 +-0.42986685405219254852 +-0.42956391016248574033 +-0.42926040550212263280 +-0.42895634369121332652 +-0.42865172833659020979 +-0.42834656303184376336 +-0.42804085135738140222 +-0.42773459688044773719 +-0.42742780315518547063 +-0.42712047372266792600 +-0.42681261211093601826 +-0.42650422183505781737 +-0.42619530639714497955 +-0.42588586928641442020 +-0.42557591397921767928 +-0.42526544393908854991 +-0.42495446261678249122 +-0.42464297345031143394 +-0.42433097986499013210 +-0.42401848527347890672 +-0.42370549307581778509 +-0.42339200665947335223 +-0.42307802939936772768 +-0.42276356465793152317 +-0.42244861578513753786 +-0.42213318611854161455 +-0.42181727898331744520 +-0.42150089769230209003 +-0.42118404554603477985 +-0.42086672583279693960 +-0.42054894182864305252 +-0.42023069679745178595 +-0.41991199399095258116 +-0.41959283664878083142 +-0.41927322799849514601 +-0.41895317125563480420 +-0.41863266962375006441 +-0.41831172629443552635 +-0.41799034444738042415 +-0.41766852725039582683 +-0.41734627785945832557 +-0.41702359941874839189 +-0.41670049506068174150 +-0.41637696790595457585 +-0.41605302106357788805 +-0.41572865763091315650 +-0.41540388069371525503 +-0.41507869332615954239 +-0.41475309859088760334 +-0.41442709953904238729 +-0.41410069921030701057 +-0.41377390063293068012 +-0.41344670682378370508 +-0.41311912078837093043 +-0.41279114552089590795 +-0.41246278400426833466 +-0.41213403921016378284 +-0.41180491409904235178 +-0.41147541162019585226 +-0.41114553471178211241 +-0.41081528630085240028 +-0.41048466930340021808 +-0.41015368662438261849 +-0.40982234115776877692 +-0.40949063578656630380 +-0.40915857338285671618 +-0.40882615680784323287 +-0.40849338891185799083 +-0.40816027253443404321 +-0.40782681050430708014 +-0.40749300563946933007 +-0.40715886074719803700 +-0.40682437862408676876 +-0.40648956205608927084 +-0.40615441381854033853 +-0.40581893667620366761 +-0.40548313338329761146 +-0.40514700668352843227 +-0.40481055931013043558 +-0.40447379398588956256 +-0.40413671342319462676 +-0.40379932032404824982 +-0.40346161738011848685 +-0.40312360727275969863 +-0.40278529267305612782 +-0.40244667624185065380 +-0.40210776062977288126 +-0.40176854847727722087 +-0.40142904241467741722 +-0.40108924506217702444 +-0.40074915902990071448 +-0.40040878691792464172 +-0.40006813131631840941 +-0.39972719480516322177 +-0.39938597995460178858 +-0.39904448932485214740 +-0.39870272546625090682 +-0.39836069091928183461 +-0.39801838821460983064 +-0.39767581987311090286 +-0.39733298840589997836 +-0.39698989631437286985 +-0.39664654609022342857 +-0.39630294021548939654 +-0.39595908116257527709 +-0.39561497139427997949 +-0.39527061336384333723 +-0.39492600951495643313 +-0.39458116228180983853 +-0.39423607408911059968 +-0.39389074735212675771 +-0.39354518447670827630 +-0.39319938785931812797 +-0.39285335988706560073 +-0.39250710293773610760 +-0.39216061937982249486 +-0.39181391157255140989 +-0.39146698186591827318 +-0.39111983260070948276 +-0.39077246610854315945 +-0.39042488471189051857 +-0.39007709072410728934 +-0.38972908644946369083 +-0.38938087418317651744 +-0.38903245621143567323 +-0.38868383481143570224 +-0.38833501225139832602 +-0.38798599079061218964 +-0.38763677267945395588 +-0.38728736015942155646 +-0.38693775546315750669 +-0.38658796081448759674 +-0.38623797842843504702 +-0.38588781051126674893 +-0.38553745926050553283 +-0.38518692686496830424 +-0.38483621550479263362 +-0.38448532735146440098 +-0.38413426456784210972 +-0.38378302930819097050 +-0.38343162371821026824 +-0.38308004993505756497 +-0.38272831008737789871 +-0.38237640629533131698 +-0.38202434067062424061 +-0.38167211531653333356 +-0.38131973232793248130 +-0.38096719379132298888 +-0.38061450178485645157 +-0.38026165837837105910 +-0.37990866563340602857 +-0.37955552560324135047 +-0.37920224033291222154 +-0.37884881185924784708 +-0.37849524221089286824 +-0.37814153340833051020 +-0.37778768746391733213 +-0.37743370638190026911 +-0.37707959215845460177 +-0.37672534678170027655 +-0.37637097223172999438 +-0.37601647048064695822 +-0.37566184349256703801 +-0.37530709322367439285 +-0.37495222162222247020 +-0.37459723062857525067 +-0.37424212217522684343 +-0.37388689818682713240 +-0.37353156058021019792 +-0.37317611126441802005 +-0.37282055214072712390 +-0.37246488510267478089 +-0.37210911203607877074 +-0.37175323481907329715 +-0.37139725532212003456 +-0.37104117540805231501 +-0.37068499693207834778 +-0.37032872174182501768 +-0.36997235167734843220 +-0.36961588857117133600 +-0.36925933424829893159 +-0.36890269052624607982 +-0.36854595921506294598 +-0.36818914211735886965 +-0.36783224102832817737 +-0.36747525773577388586 +-0.36711819402012724201 +-0.36676105165448230627 +-0.36640383240460766556 +-0.36604653802898595716 +-0.36568917027881991944 +-0.36533173089807113865 +-0.36497422162347487040 +-0.36461664418456984915 +-0.36425900030372043714 +-0.36390129169613388838 +-0.36354352006989704149 +-0.36318568712598392478 +-0.36282779455829616833 +-0.36246984405367166371 +-0.36211183729191492864 +-0.36175377594582303065 +-0.36139566168120029754 +-0.36103749615688984775 +-0.36067928102479096530 +-0.36032101792988580069 +-0.35996270851026024307 +-0.35960435439712573613 +-0.35924595721484703370 +-0.35888751858095518932 +-0.35852904010618469322 +-0.35817052339448024467 +-0.35781197004303150200 +-0.35745338164228701583 +-0.35709475977598309493 +-0.35673610602116334611 +-0.35637742194819754804 +-0.35601870912080962883 +-0.35565996909609653986 +-0.35530120342455112636 +-0.35494241365008499800 +-0.35458360131004568183 +-0.35422476793524498850 +-0.35386591504997694235 +-0.35350704417204131813 +-0.35314815681276068293 +-0.35278925447701059426 +-0.35243033866322992509 +-0.35207141086345428160 +-0.35171247256332649478 +-0.35135352524212581926 +-0.35099457037278480875 +-0.35063560942191324132 +-0.35027664384981410661 +-0.34991767511051224959 +-0.34955870465176924755 +-0.34919973391510800154 +-0.34884076433582916765 +-0.34848179734303669219 +-0.34812283435965524214 +-0.34776387680245524070 +-0.34740492608206591241 +-0.34704598360300364934 +-0.34668705076368572238 +-0.34632812895645981310 +-0.34596921956761106376 +-0.34561032397739593902 +-0.34525144356005177393 +-0.34489257968382452946 +-0.34453373371098494626 +-0.34417490699784786257 +-0.34381610089479625048 +-0.34345731674629553787 +-0.34309855589091953210 +-0.34273981966136612964 +-0.34238110938447391396 +-0.34202242638125640584 +-0.34166377196689690088 +-0.34130514745079459926 +-0.34094655413656521636 +-0.34058799332206762811 +-0.34022946629942618646 +-0.33987097435504115550 +-0.33951251876961685561 +-0.33915410081817443100 +-0.33879572177007655220 +-0.33843738288904218203 +-0.33807908543316594896 +-0.33772083065494018506 +-0.33736261980126908133 +-0.33700445411349455593 +-0.33664633482740558001 +-0.33628826317326582229 +-0.33593024037582552843 +-0.33557226765434533533 +-0.33521434622261148117 +-0.33485647728895645558 +-0.33449866205627321047 +-0.33414090172203991802 +-0.33378319747833418152 +-0.33342555051185174264 +-0.33306796200392452256 +-0.33271043313053921819 +-0.33235296506235706415 +-0.33199555896472954242 +-0.33163821599771470261 +-0.33128093731610314121 +-0.33092372406942216490 +-0.33056657740196915274 +-0.33020949845281805102 +-0.32985248835584030092 +-0.32949554823972593276 +-0.32913867922799633359 +-0.32878188243902267685 +-0.32842515898604623947 +-0.32806850997719277929 +-0.32771193651549385129 +-0.32735543969889741023 +-0.32699902062029273520 +-0.32664268036752019952 +-0.32628642002339736106 +-0.32593024066572712227 +-0.32557414336731976823 +-0.32521812919600845415 +-0.32486219921466724658 +-0.32450635448122755466 +-0.32415059604869472798 +-0.32379492496516448785 +-0.32343934227383963620 +-0.32308384901304876280 +-0.32272844621626106676 +-0.32237313491210189964 +-0.32201791612437208334 +-0.32166279087206112175 +-0.32130776016936951622 +-0.32095282502571687022 +-0.32059798644576398274 +-0.32024324542942950167 +-0.31988860297190191417 +-0.31953406006365903114 +-0.31917961769048308618 +-0.31882527683347849923 +-0.31847103846908486613 +-0.31811690356909455568 +-0.31776287310066902991 +-0.31740894802635366556 +-0.31705512930409679440 +-0.31670141788725980625 +-0.31634781472463813223 +-0.31599432076047284657 +-0.31564093693447159428 +-0.31528766418181791709 +-0.31493450343319190354 +-0.31458145561478162433 +-0.31422852164830195054 +-0.31387570245100948618 +-0.31352299893571539124 +-0.31317041201080303425 +-0.31281794258024236965 +-0.31246559154360603605 +-0.31211335979608439972 +-0.31176124822849710094 +-0.31140925772731697929 +-0.31105738917467146143 +-0.31070564344837359183 +-0.31035402142192286545 +-0.31000252396452870896 +-0.30965115194112319275 +-0.30929990621237335446 +-0.30894878763470012828 +-0.30859779706028861446 +-0.30824693533710673110 +-0.30789620330891809274 +-0.30754560181529561058 +-0.30719513169163747968 +-0.30684479376918111226 +-0.30649458887501862536 +-0.30614451783210888669 +-0.30579458145929483415 +-0.30544478057131363435 +-0.30509511597881666667 +-0.30474558848837962621 +-0.30439619890251651269 +-0.30404694801969550655 +-0.30369783663435195864 +-0.30334886553690609823 +-0.30300003551376958333 +-0.30265134734736676148 +-0.30230280181614321844 +-0.30195439969458526264 +-0.30160614175322775221 +-0.30125802875867130348 +-0.30091006147359727896 +-0.30056224065677555890 +-0.30021456706308674578 +-0.29986704144352865908 +-0.29951966454523176742 +-0.29917243711147745167 +-0.29882535988170283447 +-0.29847843359152215204 +-0.29813165897273385951 +-0.29778503675334161427 +-0.29743856765755849469 +-0.29709225240582781691 +-0.29674609171483123937 +-0.29640008629750552727 +-0.29605423686305426534 +-0.29570854411696051445 +-0.29536300876100046731 +-0.29501763149325666014 +-0.29467241300812935245 +-0.29432735399635395757 +-0.29398245514500720432 +-0.29363771713752639947 +-0.29329314065371675513 +-0.29294872636977070668 +-0.29260447495827351938 +-0.29226038708822099643 +-0.29191646342502935996 +-0.29157270463054990595 +-0.29122911136308193836 +-0.29088568427738242805 +-0.29054242402467961304 +-0.29019933125268798646 +-0.28985640660561784454 +-0.28951365072418988600 +-0.28917106424564342770 +-0.28882864780375649971 +-0.28848640202884728856 +-0.28814432754779817358 +-0.28780242498405850249 +-0.28746069495766157775 +-0.28711913808523603642 +-0.28677775498001756294 +-0.28643654625186026896 +-0.28609551250724885030 +-0.28575465434931346387 +-0.28541397237783716623 +-0.28507346718927090157 +-0.28473313937674366025 +-0.28439298953007563497 +-0.28405301823579076625 +-0.28371322607712479158 +-0.28337361363404095504 +-0.28303418148323938874 +-0.28269493019817021340 +-0.28235586034904497366 +-0.28201697250284601948 +-0.28167826722333988432 +-0.28133974507108966412 +-0.28100140660346645261 +-0.28066325237465700182 +-0.28032528293567987587 +-0.27998749883439333352 +-0.27964990061551048273 +-0.27931248882060577543 +-0.27897526398813005111 +-0.27863822665342141693 +-0.27830137734871163158 +-0.27796471660314564511 +-0.27762824494278554033 +-0.27729196289062396641 +-0.27695587096659790571 +-0.27661996968759450244 +-0.27628425956746643921 +-0.27594874111703915354 +-0.27561341484412688052 +-0.27527828125353814848 +-0.27494334084708971222 +-0.27460859412361537935 +-0.27427404157897955495 +-0.27393968370608573482 +-0.27360552099488827382 +-0.27327155393240121217 +-0.27293778300271143156 +-0.27260420868698859165 +-0.27227083146349495557 +-0.27193765180759499334 +-0.27160467019176870451 +-0.27127188708561894570 +-0.27093930295588580792 +-0.27060691826645272284 +-0.27027473347835923034 +-0.26994274904981008234 +-0.26961096543618884303 +-0.26927938309006260731 +-0.26894800246119676679 +-0.26861682399656466869 +-0.26828584814035388861 +-0.26795507533398271738 +-0.26762450601610510148 +-0.26729414062262174534 +-0.26696397958669343398 +-0.26663402333874697270 +-0.26630427230648645587 +-0.26597472691490325891 +-0.26564538758628875037 +-0.26531625474023856626 +-0.26498732879366776460 +-0.26465861016081682067 +-0.26433009925326400591 +-0.26400179647993438081 +-0.26367370224710950932 +-0.26334581695843545246 +-0.26301814101493564690 +-0.26269067481501889860 +-0.26236341875448865313 +-0.26203637322655209951 +-0.26170953862183210514 +-0.26138291532837343301 +-0.26105650373165650846 +-0.26073030421460219319 +-0.26040431715758466380 +-0.26007854293843840621 +-0.25975298193246948442 +-0.25942763451246481088 +-0.25910250104870002907 +-0.25877758190895022716 +-0.25845287745849632177 +-0.25812838806013999049 +-0.25780411407420728009 +-0.25748005585855948674 +-0.25715621376860497982 +-0.25683258815730319879 +-0.25650917937517869749 +-0.25618598777032752789 +-0.25586301368842545578 +-0.25554025747274111691 +-0.25521771946413956966 +-0.25489540000109528473 +-0.25457329941969830678 +-0.25425141805366663350 +-0.25392975623435087851 +-0.25360831429074653931 +-0.25328709254949938190 +-0.25296609133491809729 +-0.25264531096898101836 +-0.25232475177134422450 +-0.25200441405935097849 +-0.25168429814804027522 +-0.25136440435015700023 +-0.25104473297615748084 +-0.25072528433421997773 +-0.25040605873025356676 +-0.25008705646790496679 +-0.24976827784857003056 +-0.24944972317139826878 +-0.24913139273330456303 +-0.24881328682897513316 +-0.24849540575087905592 +-0.24817774978927281682 +-0.24786031923221141238 +-0.24754311436555634374 +-0.24722613547298130654 +-0.24690938283598490299 +-0.24659285673389488847 +-0.24627655744387777492 +-0.24596048524094898946 +-0.24564464039797717643 +-0.24532902318569549394 +-0.24501363387270710947 +-0.24469847272549738459 +-0.24438354000843673375 +-0.24406883598379236489 +-0.24375436091173446895 +-0.24344011505034499065 +-0.24312609865562620493 +-0.24281231198150676764 +-0.24249875527985109702 +-0.24218542880046639576 +-0.24187233279111167161 +-0.24155946749750462077 +-0.24124683316332856675 +-0.24093443003024250793 +-0.24062225833788616902 +-0.24031031832389154745 +-0.23999861022388574439 +-0.23968713427150278861 +-0.23937589069838757783 +-0.23906487973420836868 +-0.23875410160665927473 +-0.23844355654147048051 +-0.23813324476241701233 +-0.23782316649132148600 +-0.23751332194806806797 +-0.23720371135060486223 +-0.23689433491495254236 +-0.23658519285521484310 +-0.23627628538358086407 +-0.23596761271033681040 +-0.23565917504387010051 +-0.23535097259068027409 +-0.23504300555538240602 +-0.23473527414071723718 +-0.23442777854755686429 +-0.23412051897491251151 +-0.23381349561994260733 +-0.23350670867795852992 +-0.23320015834243246200 +-0.23289384480500396890 +-0.23258776825548874156 +-0.23228192888188364806 +-0.23197632687037550436 +-0.23167096240534607032 +-0.23136583566938148659 +-0.23106094684327835309 +-0.23075629610604989073 +-0.23045188363493337991 +-0.23014770960539795985 +-0.22984377419114970786 +-0.22954007756414168684 +-0.22923661989457677635 +-0.22893340135091785892 +-0.22863042209989184461 +-0.22832768230650041241 +-0.22802518213402209191 +-0.22772292174402206100 +-0.22742090129635927909 +-0.22711912094918951244 +-0.22681758085897721355 +-0.22651628118049829674 +-0.22621522206684741008 +-0.22591440366944715024 +-0.22561382613805075481 +-0.22531348962075201103 +-0.22501339426398919707 +-0.22471354021255490752 +-0.22441392760959871788 +-0.22411455659663653828 +-0.22381542731355549836 +-0.22351653989862146910 +-0.22321789448848528004 +-0.22291949121818890878 +-0.22262133022117108760 +-0.22232341162927524159 +-0.22202573557275531724 +-0.22172830218028166671 +-0.22143111157894698748 +-0.22113416389427409392 +-0.22083745925022058021 +-0.22054099776918723030 +-0.22024477957202134859 +-0.21994880477802536412 +-0.21965307350496113270 +-0.21935758586905915180 +-0.21906234198502078092 +-0.21876734196602667937 +-0.21847258592374330100 +-0.21817807396832814004 +-0.21788380620843475488 +-0.21758978275122117796 +-0.21729600370235369056 +-0.21700246916601539926 +-0.21670917924490920581 +-0.21641613404026652234 +-0.21612333365185026901 +-0.21583077817796503250 +-0.21553846771545831507 +-0.21524640235972994362 +-0.21495458220473578903 +-0.21466300734299459396 +-0.21437167786559468974 +-0.21408059386219760456 +-0.21378975542104552976 +-0.21349916262896653785 +-0.21320881557138091078 +-0.21291871433230599719 +-0.21262885899436204107 +-0.21233924963877989778 +-0.21204988634540239412 +-0.21176076919269534726 +-0.21147189825774839744 +-0.21118327361628411176 +-0.21089489534266206427 +-0.21060676350988419281 +-0.21031887818960151582 +-0.21003123945211826795 +-0.20974384736639783977 +-0.20945670200007054929 +-0.20916980341943547383 +-0.20888315168946777756 +-0.20859674687382556701 +-0.20831058903485213940 +-0.20802467823358491983 +-0.20773901452975587767 +-0.20745359798180509903 +-0.20716842864687767811 +-0.20688350658083237699 +-0.20659883183825009101 +-0.20631440447243462599 +-0.20603022453541861014 +-0.20574629207797107133 +-0.20546260714960309923 +-0.20517916979856848370 +-0.20489598007187403983 +-0.20461303801528163415 +-0.20433034367331592840 +-0.20404789708926723835 +-0.20376569830519727922 +-0.20348374736194621559 +-0.20320204429913482636 +-0.20292058915517147133 +-0.20263938196725747587 +-0.20235842277139090561 +-0.20207771160237258945 +-0.20179724849380939466 +-0.20151703347812385814 +-0.20123706658655426960 +-0.20095734784916027826 +-0.20067787729483099746 +-0.20039865495128747486 +-0.20011968084508857668 +-0.19984095500163434611 +-0.19956247744517427445 +-0.19928424819880807828 +-0.19900626728449352654 +-0.19872853472305085365 +-0.19845105053416667307 +-0.19817381473639908429 +-0.19789682734718214152 +-0.19762008838283329215 +-0.19734359785855512537 +-0.19706735578843903589 +-0.19679136218547610415 +-0.19651561706155512566 +-0.19624012042747018825 +-0.19596487229292505750 +-0.19568987266654105928 +-0.19541512155585424870 +-0.19514061896732790014 +-0.19486636490635175778 +-0.19459235937725080645 +-0.19431860238328627077 +-0.19404509392666219325 +-0.19377183400853026374 +-0.19349882262899306684 +-0.19322605978710896690 +-0.19295354548089857505 +-0.19268127970734605370 +-0.19240926246240663833 +-0.19213749374100738687 +-0.19186597353705797664 +-0.19159470184344831734 +-0.19132367865205640589 +-0.19105290395375204571 +-0.19078237773840406311 +-0.19051209999487889180 +-0.19024207071104928812 +-0.18997228987379966014 +-0.18970275746902534597 +-0.18943347348164241151 +-0.18916443789558798350 +-0.18889565069382810436 +-0.18862711185835859262 +-0.18835882137021106586 +-0.18809077920945829754 +-0.18782298535521604887 +-0.18755543978564859220 +-0.18728814247797387349 +-0.18702109340846542751 +-0.18675429255245931670 +-0.18648773988435402016 +-0.18622143537762200771 +-0.18595537900480585414 +-0.18568957073752689890 +-0.18542401054648768866 +-0.18515869840147955450 +-0.18489363427138044704 +-0.18462881812416467864 +-0.18436424992690381153 +-0.18409992964577320818 +-0.18383585724605316924 +-0.18357203269213515084 +-0.18330845594752520622 +-0.18304512697484806583 +-0.18278204573584980186 +-0.18251921219140493369 +-0.18225662630151667765 +-0.18199428802532408023 +-0.18173219732110226787 +-0.18147035414627230021 +-0.18120875845739883858 +-0.18094741021019611349 +-0.18068630935953519656 +-0.18042545585944325115 +-0.18016484966310847282 +-0.17990449072288555721 +-0.17964437899030008539 +-0.17938451441604841285 +-0.17912489695000535783 +-0.17886552654122633843 +-0.17860640313795195233 +-0.17834752668761069683 +-0.17808889713682282685 +-0.17783051443140623915 +-0.17757237851637694415 +-0.17731448933595478357 +-0.17705684683356742726 +-0.17679945095185256587 +-0.17654230163266310116 +-0.17628539881706858927 +-0.17602874244536287351 +-0.17577233245706416764 +-0.17551616879091883061 +-0.17526025138490677890 +-0.17500458017624578866 +-0.17474915510139119035 +-0.17449397609604283543 +-0.17423904309514864908 +-0.17398435603290596241 +-0.17372991484276667506 +-0.17347571945744114097 +-0.17322176980890049980 +-0.17296806582838078481 +-0.17271460744638547635 +-0.17246139459269196892 +-0.17220842719635173768 +-0.17195570518569369689 +-0.17170322848833199925 +-0.17145099703116417622 +-0.17119901074037732758 +-0.17094726954145059161 +-0.17069577335916133465 +-0.17044452211758340243 +-0.17019351574009483619 +-0.16994275414937892732 +-0.16969223726742979630 +-0.16944196501555303103 +-0.16919193731437037753 +-0.16894215408382423638 +-0.16869261524317846757 +-0.16844332071102349757 +-0.16819427040527928918 +-0.16794546424319839462 +-0.16769690214136906414 +-0.16744858401571804940 +-0.16720050978151621002 +-0.16695267935337923526 +-0.16670509264527072490 +-0.16645774957050729626 +-0.16621065004176174829 +-0.16596379397106356124 +-0.16571718126980417019 +-0.16547081184874209980 +-0.16522468561800071618 +-0.16497880248707649797 +-0.16473316236483909192 +-0.16448776515953678068 +-0.16424261077879745430 +-0.16399769912963263474 +-0.16375303011844116741 +-0.16350860365101113625 +-0.16326441963252344425 +-0.16302047796755556042 +-0.16277677856008329615 +-0.16253332131348507961 +-0.16229010613054264955 +-0.16204713291344899351 +-0.16180440156380576644 +-0.16156191198262895292 +-0.16131966407035155942 +-0.16107765772682863803 +-0.16083589285133514935 +-0.16059436934257434459 +-0.16035308709867690524 +-0.16011204601720688268 +-0.15987124599516180923 +-0.15963068692897727785 +-0.15939036871452996746 +-0.15915029124713950259 +-0.15891045442157175627 +-0.15867085813204276357 +-0.15843150227221983184 +-0.15819238673522578731 +-0.15795351141363986325 +-0.15771487619950463888 +-0.15747648098432417973 +-0.15723832565906839531 +-0.15700041011417853465 +-0.15676273423956629816 +-0.15652529792461761238 +-0.15628810105819643250 +-0.15605114352864812854 +-0.15581442522379926330 +-0.15557794603096275488 +-0.15534170583694037471 +-0.15510570452802488473 +-0.15486994199000306272 +-0.15463441810815772848 +-0.15439913276727235125 +-0.15416408585163113298 +-0.15392927724502344922 +-0.15369470683074651363 +-0.15346037449160698785 +-0.15322628010992470071 +-0.15299242356753367522 +-0.15275880474578792945 +-0.15252542352556086591 +-0.15229227978724865777 +-0.15205937341077385705 +-0.15182670427558853099 +-0.15159427226067387351 +-0.15136207724454517343 +-0.15113011910525567250 +-0.15089839772039484456 +-0.15066691296709477932 +-0.15043566472203095952 +-0.15020465286142592465 +-0.14997387726105060324 +-0.14974333779622639451 +-0.14951303434183085828 +-0.14928296677229632716 +-0.14905313496161345932 +-0.14882353878333640096 +-0.14859417811058198144 +-0.14836505281603246109 +-0.14813616277193999982 +-0.14790750785012868329 +-0.14767908792199455070 +-0.14745090285851064626 +-0.14722295253022843475 +-0.14699523680728035502 +-0.14676775555938223472 +-0.14654050865583509444 +-0.14631349596552908898 +-0.14608671735694386817 +-0.14586017269815224062 +-0.14563386185682269947 +-0.14540778470022075464 +-0.14518194109521229129 +-0.14495633090826418043 +-0.14473095400545016309 +-0.14450581025244921274 +-0.14428089951454958761 +-0.14405622165665110668 +-0.14383177654326886885 +-0.14360756403853189300 +-0.14338358400618850252 +-0.14315983630960879558 +-0.14293632081178375692 +-0.14271303737533094780 +-0.14248998586249450593 +-0.14226716613514928111 +-0.14204457805480091848 +-0.14182222148258971650 +-0.14160009627929220910 +-0.14137820230532358035 +-0.14115653942073932980 +-0.14093510748523849219 +-0.14071390635816469206 +-0.14049293589850928021 +-0.14027219596491180553 +-0.14005168641566573262 +-0.13983140710871638790 +-0.13961135790166537274 +-0.13939153865177225655 +-0.13917194921595821278 +-0.13895258945080454782 +-0.13873345921255816893 +-0.13851455835713213927 +-0.13829588674010862004 +-0.13807744421674009172 +-0.13785923064195151899 +-0.13764124587034348712 +-0.13742348975619303464 +-0.13720596215345587376 +-0.13698866291576974885 +-0.13677159189645449189 +-0.13655474894851538092 +-0.13633813392464522174 +-0.13612174667722570787 +-0.13590558705832997410 +-0.13568965491972317938 +-0.13547395011286789135 +-0.13525847248892239327 +-0.13504322189874415350 +-0.13482819819289182384 +-0.13461340122162862576 +-0.13439883083492104587 +-0.13418448688244358213 +-0.13397036921357946548 +-0.13375647767742346317 +-0.13354281212278271140 +-0.13332937239817915787 +-0.13311615835185217072 +-0.13290316983175920473 +-0.13269040668557832707 +-0.13247786876071071527 +-0.13226555590428132336 +-0.13205346796314199054 +-0.13184160478387146886 +-0.13162996621278058584 +-0.13141855209591080111 +-0.13120736227903692650 +-0.13099639660767090077 +-0.13078565492706140105 +-0.13057513708219589676 +-0.13036484291780350842 +-0.13015477227835725582 +-0.12994492500807361401 +-0.12973530095091623249 +-0.12952589995059743400 +-0.12931672185057965785 +-0.12910776649407743055 +-0.12889903372405894788 +-0.12869052338324848961 +-0.12848223531412761300 +-0.12827416935893601324 +-0.12806632535967618636 +-0.12785870315811243003 +-0.12765130259577295302 +-0.12744412351395248417 +-0.12723716575371488147 +-0.12703042915589207729 +-0.12682391356108813074 +-0.12661761880968003258 +-0.12641154474182011991 +-0.12620569119743663133 +-0.12600005801623612167 +-0.12579464503770582118 +-0.12558945210111366331 +-0.12538447904551133782 +-0.12517972570973565083 +-0.12497519193240991253 +-0.12477087755194582464 +-0.12456678240654436851 +-0.12436290633419966323 +-0.12415924917269817451 +-0.12395581075962058826 +-0.12375259093234584895 +-0.12354958952805017436 +-0.12334680638370898453 +-0.12314424133609984391 +-0.12294189422180405724 +-0.12273976487720614226 +-0.12253785313849768768 +-0.12233615884167778343 +-0.12213468182255537986 +-0.12193342191675009267 +-0.12173237895969402089 +-0.12153155278663395344 +-0.12133094323263177161 +-0.12113055013256683601 +-0.12093037332113766580 +-0.12073041263286277136 +-0.12053066790208280534 +-0.12033113896296118717 +-0.12013182564948771125 +-0.11993272779547771434 +-0.11973384523457430983 +-0.11953517780025040007 +-0.11933672532581107717 +-0.11913848764439219363 +-0.11894046458896435914 +-0.11874265599233460589 +-0.11854506168714562531 +-0.11834768150587929303 +-0.11815051528085727950 +-0.11795356284424306226 +-0.11775682402804266147 +-0.11756029866410645790 +-0.11736398658413103868 +-0.11716788761965990506 +-0.11697200160208527653 +-0.11677632836264982552 +-0.11658086773244763501 +-0.11638561954242584995 +-0.11619058362338542667 +-0.11599575980598456071 +-0.11580114792073782637 +-0.11560674779801810574 +-0.11541255926805869814 +-0.11521858216095538785 +-0.11502481630666511192 +-0.11483126153501019284 +-0.11463791767567797775 +-0.11444478455822351681 +-0.11425186201206954939 +-0.11405914986650879384 +-0.11386664795070522427 +-0.11367435609369516691 +-0.11348227412438853523 +-0.11329040187157078667 +-0.11309873916390367210 +-0.11290728582992688722 +-0.11271604169805858608 +-0.11252500659659872562 +-0.11233418035372826072 +-0.11214356279751075407 +-0.11195315375589545703 +-0.11176295305671669900 +-0.11157296052769549721 +-0.11138317599644151357 +-0.11119359929045480317 +-0.11100423023712506498 +-0.11081506866373494469 +-0.11062611439746035391 +-0.11043736726537220494 +-0.11024882709443721562 +-0.11006049371151924166 +-0.10987236694338115006 +-0.10968444661668529105 +-0.10949673255799496907 +-0.10930922459377614975 +-0.10912192255039801503 +-0.10893482625413486442 +-0.10874793553116610112 +-0.10856125020758002064 +-0.10837477010937177080 +-0.10818849506244700154 +-0.10800242489262192047 +-0.10781655942562530515 +-0.10763089848709871121 +-0.10744544190259840144 +-0.10726018949759659471 +-0.10707514109748202114 +-0.10689029652756154576 +-0.10670565561306173674 +-0.10652121817912897639 +-0.10633698405083201466 +-0.10615295305316120589 +-0.10596912501103231130 +-0.10578549974928551369 +-0.10560207709268663867 +-0.10541885686593033267 +-0.10523583889363898047 +-0.10505302300036446772 +-0.10487040901058977682 +-0.10468799674873076333 +-0.10450578603913505960 +-0.10432377670608525277 +-0.10414196857379920402 +-0.10396036146643153342 +-0.10377895520807417507 +-0.10359774962275779264 +-0.10341674453445326431 +-0.10323593976707201580 +-0.10305533514446758858 +-0.10287493049043702764 +-0.10269472562872117294 +-0.10251472038300660228 +-0.10233491457692552029 +-0.10215530803405878379 +-0.10197590057793524954 +-0.10179669203203296768 +-0.10161768221978111082 +-0.10143887096456127850 +-0.10126025808970667841 +-0.10108184341850499910 +-0.10090362677419950632 +-0.10072560797998823812 +-0.10054778685902711344 +-0.10037016323442975174 +-0.10019273692926930486 +-0.10001550776657865127 +-0.09983847556935200596 +-0.09966164016054600283 +-0.09948500136308026376 +-0.09930855899983860591 +-0.09913231289367051280 +-0.09895626286739134247 +-0.09878040874378413161 +-0.09860475034559938734 +-0.09842928749555822365 +-0.09825402001635125115 +-0.09807894773064014526 +-0.09790407046105915889 +-0.09772938803021649634 +-0.09755490026069345288 +-0.09738060697504716257 +-0.09720650799581095902 +-0.09703260314549534693 +-0.09685889224658898733 +-0.09668537512155947478 +-0.09651205159285483615 +-0.09633892148290390534 +-0.09616598461411737797 +-0.09599324080888939348 +-0.09582068988959749345 +-0.09564833167860453678 +-0.09547616599825828332 +-0.09530419267089453028 +-0.09513241151883598812 +-0.09496082236439351565 +-0.09478942502986863194 +-0.09461821933755265590 +-0.09444720510972809402 +-0.09427638216866984777 +-0.09410575033664687894 +-0.09393530943592109939 +-0.09376505928874999396 +-0.09359499971738705071 +-0.09342513054408262130 +-0.09325545159108457327 +-0.09308596268063962231 +-0.09291666363499402614 +-0.09274755427639443106 +-0.09257863442708873236 +-0.09240990390932721232 +-0.09224136254536316470 +-0.09207301015745389394 +-0.09190484656786107598 +-0.09173687159885302034 +-0.09156908507270421216 +-0.09140148681169614486 +-0.09123407663811899937 +-0.09106685437427251839 +-0.09089981984246614521 +-0.09073297286501989800 +-0.09056631326426604900 +-0.09039984086254919393 +-0.09023355548222763978 +-0.09006745694567344640 +-0.08990154507527498007 +-0.08973581969343492892 +-0.08957028062257378631 +-0.08940492768512990629 +-0.08923976070355967016 +-0.08907477950033870773 +-0.08890998389796302137 +-0.08874537371894931914 +-0.08858094878583623599 +-0.08841670892118473624 +-0.08825265394757983439 +-0.08808878368763010946 +-0.08792509796396937027 +-0.08776159659925714118 +-0.08759827941617977232 +-0.08743514623745071712 +-0.08727219688581211443 +-0.08710943118403444152 +-0.08694684895491923415 +-0.08678445002129665797 +-0.08662223420603021307 +-0.08646020133201451352 +-0.08629835122217734134 +-0.08613668369948028480 +-0.08597519858691941852 +-0.08581389570752596951 +-0.08565277488436734421 +-0.08549183594054762803 +-0.08533107869920897315 +-0.08517050298353139037 +-0.08501010861673430341 +-0.08484989542207670155 +-0.08468986322285844415 +-0.08453001184242082966 +-0.08437034110414698418 +-0.08421085083146358230 +-0.08405154084784065283 +-0.08389241097679180081 +-0.08373346104187713579 +-0.08357469086670174518 +-0.08341610027491767887 +-0.08325768909022430997 +-0.08309945713636904263 +-0.08294140423714797816 +-0.08278353021640690035 +-0.08262583489804227466 +-0.08246831810600092905 +-0.08231097966428195523 +-0.08215381939693640334 +-0.08199683712806879465 +-0.08184003268183764890 +-0.08168340588245584510 +-0.08152695655419160692 +-0.08137068452136987651 +-0.08121458960837095453 +-0.08105867163963394184 +-0.08090293043965546271 +-0.08074736583299105264 +-0.08059197764425587995 +-0.08043676569812542587 +-0.08028172981933595631 +-0.08012686983268554886 +-0.07997218556303443970 +-0.07981767683530641144 +-0.07966334347448848774 +-0.07950918530563219622 +-0.07935520215385420684 +-0.07920139384433703966 +-0.07904776020232957834 +-0.07889430105314779174 +-0.07874101622217594132 +-0.07858790553486641461 +-0.07843496881674065502 +-0.07828220589339017488 +-0.07812961659047697183 +-0.07797720073373429206 +-0.07782495814896714381 +-0.07767288866205322717 +-0.07752099209894312837 +-0.07736926828566140224 +-0.07721771704830758531 +-0.07706633821305577947 +-0.07691513160615617850 +-0.07676409705393549832 +-0.07661323438279743492 +-0.07646254341922362197 +-0.07631202398977388057 +-0.07616167592108785689 +-0.07601149903988414780 +-0.07586149317296213279 +-0.07571165814720200171 +-0.07556199378956583723 +-0.07541249992709800343 +-0.07526317638692571477 +-0.07511402299625971613 +-0.07496503958239579546 +-0.07481622597271311847 +-0.07466758199467775359 +-0.07451910747584121475 +-0.07437080224384201577 +-0.07422266612640590622 +-0.07407469895134692617 +-0.07392690054656742005 +-0.07377927074005941055 +-0.07363180935990439047 +-0.07348451623427504353 +-0.07333739119143461993 +-0.07319043405973850447 +-0.07304364466763414721 +-0.07289702284366224305 +-0.07275056841645723138 +-0.07260428121474737928 +-0.07245816106735653017 +-0.07231220780320363195 +-0.07216642125130304231 +-0.07202080124076712386 +-0.07187534760080464824 +-0.07173006016072260016 +-0.07158493874992652439 +-0.07143998319792112250 +-0.07129519333431061368 +-0.07115056898879960900 +-0.07100610999119423561 +-0.07086181617140152600 +-0.07071768735943088913 +-0.07057372338539463774 +-0.07042992407950809941 +-0.07028628927209086552 +-0.07014281879356702720 +-0.06999951247446560554 +-0.06985637014542185608 +-0.06971339163717708842 +-0.06957057678057938788 +-0.06942792540658455913 +-0.06928543734625652872 +-0.06914311243076795566 +-0.06900095049140056447 +-0.06885895135954679669 +-0.06871711486670827040 +-0.06857544084449852806 +-0.06843392912464286992 +-0.06829257953897849287 +-0.06815139191945546182 +-0.06801036609813748690 +-0.06786950190720193732 +-0.06772879917894104873 +-0.06758825774576197876 +-0.06744787744018811149 +-0.06730765809485894646 +-0.06716759954253012643 +-0.06702770161607608801 +-0.06688796414848860450 +-0.06674838697287810430 +-0.06660896992247447579 +-0.06646971283062744207 +-0.06633061553080674133 +-0.06619167785660337588 +-0.06605289964173005623 +-0.06591428072002136762 +-0.06577582092543461656 +-0.06563752009205042759 +-0.06549937805407317348 +-0.06536139464583182179 +-0.06522356970178024016 +-0.06508590305649768204 +-0.06494839454469011897 +-0.06481104400118975484 +-0.06467385126095606673 +-0.06453681615907655433 +-0.06439993853076717012 +-0.06426321821137283286 +-0.06412665503636783004 +-0.06399024884135738611 +-0.06385399946207623301 +-0.06371790673439113595 +-0.06358197049430090730 +-0.06344619057793632333 +-0.06331056682156138704 +-0.06317509906157370292 +-0.06303978713450478222 +-0.06290463087702109768 +-0.06276963012592422231 +-0.06263478471815195348 +-0.06250009449077810475 +-0.06236555928101371327 +-0.06223117892620721320 +-0.06209695326384525454 +-0.06196288213155328600 +-0.06182896536709589497 +-0.06169520280837745979 +-0.06156159429344333633 +-0.06142813966047876162 +-0.06129483874781162245 +-0.06116169139391138682 +-0.06102869743739029740 +-0.06089585671700393360 +-0.06076316907165168341 +-0.06063063434037722910 +-0.06049825236236942849 +-0.06036602297696242597 +-0.06023394602363698475 +-0.06010202134202006358 +-0.05997024877188619069 +-0.05983862815315749845 +-0.05970715932590467401 +-0.05957584213034742421 +-0.05944467640685485721 +-0.05931366199594657190 +-0.05918279873829275506 +-0.05905208647471424377 +-0.05892152504618473202 +-0.05879111429382972986 +-0.05866085405892798588 +-0.05853074418291179248 +-0.05840078450736764515 +-0.05827097487403661707 +-0.05814131512481521269 +-0.05801180510175613786 +-0.05788244464706822356 +-0.05775323360311745285 +-0.05762417181242758535 +-0.05749525911768037928 +-0.05736649536171661151 +-0.05723788038753638285 +-0.05710941403829969398 +-0.05698109615732745159 +-0.05685292658810143368 +-0.05672490517426508755 +-0.05659703175962436938 +-0.05646930618814805652 +-0.05634172830396851767 +-0.05621429795138208757 +-0.05608701497485026055 +-0.05595987921899896189 +-0.05583289052862049073 +-0.05570604874867384620 +-0.05557935372428474824 +-0.05545280530074656045 +-0.05532640332352116441 +-0.05520014763823895970 +-0.05507403809070002265 +-0.05494807452687430066 +-0.05482225679290280568 +-0.05469658473509754482 +-0.05457105819994192974 +-0.05444567703409267795 +-0.05432044108437907026 +-0.05419535019780414437 +-0.05407040422154530540 +-0.05394560300295488109 +-0.05382094638956047561 +-0.05369643422906596186 +-0.05357206636935218924 +-0.05344784265847705301 +-0.05332376294467648659 +-0.05319982707636512764 +-0.05307603490213654018 +-0.05295238627076444271 +-0.05282888103120283313 +-0.05270551903258673815 +-0.05258230012423317085 +-0.05245922415564125557 +-0.05233629097649292877 +-0.05221350043665400065 +-0.05209085238617436331 +-0.05196834667528880958 +-0.05184598315441747707 +-0.05172376167416719434 +-0.05160168208533062739 +-0.05147974423888845852 +-0.05135794798600951117 +-0.05123629317805106220 +-0.05111477966655969540 +-0.05099340730327225207 +-0.05087217594011586574 +-0.05075108542920920424 +-0.05063013562286274721 +-0.05050932637357986865 +-0.05038865753405692011 +-0.05026812895718429930 +-0.05014774049604683176 +-0.05002749200392479084 +-0.04990738333429432794 +-0.04978741434082811085 +-0.04966758487739604544 +-0.04954789479806642749 +-0.04942834395710517942 +-0.04930893220897850093 +-0.04918965940835205025 +-0.04907052541009225555 +-0.04895153006926689088 +-0.04883267324114578395 +-0.04871395478120126021 +-0.04859537454510928084 +-0.04847693238874974109 +-0.04835862816820764298 +-0.04824046173977311613 +-0.04812243295994271530 +-0.04800454168541968408 +-0.04788678777311503043 +-0.04776917108014808178 +-0.04765169146384704707 +-0.04753434878175022416 +-0.04741714289160620099 +-0.04730007365137419567 +-0.04718314091922629072 +-0.04706634455354661434 +-0.04694968441293278366 +-0.04683316035619651541 +-0.04671677224236444465 +-0.04660051993067852033 +-0.04648440328059718490 +-0.04636842215179608206 +-0.04625257640416841759 +-0.04613686589782600017 +-0.04602129049310007408 +-0.04590585005054169387 +-0.04579054443092293175 +-0.04567537349523739104 +-0.04556033710470094866 +-0.04544543512075285147 +-0.04533066740505604236 +-0.04521603381949800687 +-0.04510153422619190416 +-0.04498716848747705277 +-0.04487293646591972857 +-0.04475883802431399050 +-0.04464487302568295041 +-0.04453104133327822484 +-0.04441734281058226652 +-0.04430377732130857255 +-0.04419034472940213537 +-0.04407704489904072653 +-0.04396387769463557665 +-0.04385084298083197912 +-0.04373794062251048359 +-0.04362517048478741638 +-0.04351253243301611562 +-0.04340002633278711858 +-0.04328765204992966048 +-0.04317540945051191043 +-0.04306329840084240079 +-0.04295131876747047828 +-0.04283947041718731696 +-0.04272775321702688978 +-0.04261616703426630154 +-0.04250471173642730166 +-0.04239338719127706823 +-0.04228219326682863127 +-0.04217112983134203852 +-0.04206019675332543784 +-0.04194939390153546582 +-0.04183872114497866335 +-0.04172817835291208616 +-0.04161776539484412368 +-0.04150748214053585905 +-0.04139732846000147154 +-0.04128730422350920803 +-0.04117740930158258345 +-0.04106764356500127583 +-0.04095800688480174395 +-0.04084849913227835833 +-0.04073912017898482368 +-0.04062986989673380428 +-0.04052074815759922066 +-0.04041175483391680479 +-0.04030288979828471063 +-0.04019415292356479791 +-0.04008554408288353410 +-0.03997706314963277857 +-0.03986870999747119809 +-0.03976048450032473869 +-0.03965238653238822852 +-0.03954441596812567628 +-0.03943657268227182544 +-0.03932885654983266088 +-0.03922126744608699783 +-0.03911380524658708557 +-0.03900646982715972461 +-0.03889926106390731442 +-0.03879217883320924820 +-0.03868522301172176020 +-0.03857839347638071514 +-0.03847169010440122661 +-0.03836511277327939173 +-0.03825866136079317942 +-0.03815233574500363767 +-0.03804613580425555280 +-0.03794006141717907316 +-0.03783411246269044459 +-0.03772828881999341216 +-0.03762259036857987932 +-0.03751701698823135811 +-0.03741156855901991291 +-0.03730624496130931916 +-0.03720104607575630551 +-0.03709597178331147660 +-0.03699102196522075642 +-0.03688619650302624869 +-0.03678149527856704182 +-0.03667691817398148479 +-0.03657246507170724276 +-0.03646813585448302475 +-0.03636393040534955517 +-0.03625984860765086443 +-0.03615589034503535748 +-0.03605205550145708371 +-0.03594834396117720793 +-0.03584475560876465572 +-0.03574129032909776488 +-0.03563794800736545115 +-0.03553472852906810336 +-0.03543163178001939445 +-0.03532865764634708639 +-0.03522580601449437632 +-0.03512307677122144395 +-0.03502046980360629808 +-0.03491798499904612968 +-0.03481562224525891480 +-0.03471338143028441375 +-0.03461126244248557970 +-0.03450926517054975218 +-0.03440738950349039177 +-0.03430563533064751036 +-0.03420400254168991933 +-0.03410249102661633974 +-0.03400110067575635303 +-0.03389983137977214955 +-0.03379868302965984006 +-0.03369765551675051041 +-0.03359674873271210199 +-0.03349596256955036933 +-0.03339529691961069108 +-0.03329475167557898602 +-0.03319432673048359345 +-0.03309402197769622384 +-0.03299383731093386701 +-0.03289377262425990239 +-0.03279382781208575043 +-0.03269400276917204529 +-0.03259429739063077203 +-0.03249471157192544007 +-0.03239524520887415715 +-0.03229589819764999703 +-0.03219667043478294244 +-0.03209756181716132833 +-0.03199857224203317418 +-0.03189970160700811991 +-0.03180094981005859855 +-0.03170231674952150858 +-0.03160380232409999018 +-0.03150540643286457720 +-0.03140712897525493180 +-0.03130896985108167635 +-0.03121092896052767365 +-0.03111300620414981372 +-0.03101520148288047091 +-0.03091751469802963767 +-0.03081994575128547270 +-0.03072249454471712854 +-0.03062516098077587914 +-0.03052794496229674012 +-0.03043084639250023468 +-0.03033386517499411794 +-0.03023700121377495553 +-0.03014025441323000057 +-0.03004362467813874102 +-0.02994711191367495015 +-0.02985071602540794941 +-0.02975443691930480111 +-0.02965827450173163377 +-0.02956222867945590069 +-0.02946629935964784064 +-0.02937048644988240337 +-0.02927478985814089413 +-0.02917920949281333984 +-0.02908374526269914134 +-0.02898839707701042143 +-0.02889316484537276034 +-0.02879804847782750643 +-0.02870304788483359071 +-0.02860816297726945234 +-0.02851339366643472484 +-0.02841873986405253280 +-0.02832420148227098380 +-0.02822977843366564210 +-0.02813547063124088865 +-0.02804127798843228381 +-0.02794720041910826042 +-0.02785323783757240670 +-0.02775939015856530856 +-0.02766565729726647160 +-0.02757203916929662837 +-0.02747853569071959101 +-0.02738514677804382638 +-0.02729187234822567573 +-0.02719871231867031225 +-0.02710566660723443336 +-0.02701273513222812728 +-0.02691991781241714551 +-0.02682721456702475207 +-0.02673462531573415901 +-0.02664214997869073995 +-0.02654978847650378213 +-0.02645754073024903993 +-0.02636540666147084086 +-0.02627338619218409083 +-0.02618147924487683464 +-0.02608968574251230646 +-0.02599800560853110856 +-0.02590643876685377878 +-0.02581498514188269172 +-0.02572364465850445620 +-0.02563241724209246869 +-0.02554130281850895343 +-0.02545030131410745688 +-0.02535941265573505438 +-0.02526863677073512907 +-0.02517797358694887078 +-0.02508742303271862054 +-0.02499698503688992449 +-0.02490665952881380291 +-0.02481644643834933495 +-0.02472634569586621214 +-0.02463635723224683743 +-0.02454648097888934358 +-0.02445671686770968523 +-0.02436706483114443877 +-0.02427752480215307831 +-0.02418809671422074772 +-0.02409878050136053662 +-0.02400957609811641899 +-0.02392048343956569220 +-0.02383150246132149583 +-0.02374263309953553169 +-0.02365387529090099555 +-0.02356522897265435346 +-0.02347669408257923793 +-0.02338827055900820004 +-0.02329995834082585621 +-0.02321175736747146598 +-0.02312366757894184291 +-0.02303568891579379357 +-0.02294782131914727824 +-0.02286006473068799213 +-0.02277241909267029366 +-0.02268488434791996258 +-0.02259746043983688196 +-0.02251014731239828898 +-0.02242294491016138397 +-0.02233585317826634539 +-0.02224887206243909496 +-0.02216200150899469423 +-0.02207524146483942282 +-0.02198859187747462945 +-0.02190205269499948329 +-0.02181562386611369392 +-0.02172930534012078654 +-0.02164309706693120020 +-0.02155699899706505634 +-0.02147101108165563182 +-0.02138513327245213091 +-0.02129936552182318948 +-0.02121370778275958463 +-0.02112816000887768678 +-0.02104272215442241564 +-0.02095739417427072357 +-0.02087217602393461394 +-0.02078706765956446489 +-0.02070206903795215880 +-0.02061718011653470781 +-0.02053240085339683857 +-0.02044773120727522847 +-0.02036317113756115973 +-0.02027872060430415541 +-0.02019437956821528227 +-0.02011014799067065151 +-0.02002602583371455164 +-0.01994201306006327182 +-0.01985810963310829375 +-0.01977431551691998315 +-0.01969063067625079211 +-0.01960705507653909621 +-0.01952358868391239344 +-0.01944023146519120379 +-0.01935698338789251793 +-0.01927384442023326316 +-0.01919081453113427593 +-0.01910789369022363252 +-0.01902508186784014621 +-0.01894237903503772844 +-0.01885978516358848348 +-0.01877730022598669835 +-0.01869492419545254122 +-0.01861265704593590559 +-0.01853049875211998029 +-0.01844844928942534351 +-0.01836650863401380340 +-0.01828467676279202717 +-0.01820295365341556212 +-0.01812133928429281865 +-0.01803983363458875819 +-0.01795843668422917455 +-0.01787714841390441664 +-0.01779596880507346851 +-0.01771489783996808148 +-0.01763393550159665646 +-0.01755308177374820255 +-0.01747233664099679187 +-0.01739170008870537590 +-0.01731117210303007026 +-0.01723075267092415153 +-0.01715044178014260567 +-0.01707023941924561486 +-0.01699014557760357078 +-0.01691016024540099513 +-0.01683028341364072381 +-0.01675051507414829569 +-0.01667085521957637276 +-0.01659130384340878547 +-0.01651186093996530324 +-0.01643252650440571450 +-0.01635330053273451045 +-0.01627418302180502069 +-0.01619517396932415934 +-0.01611627337385660233 +-0.01603748123482968621 +-0.01595879755253765131 +-0.01588022232814632895 +-0.01580175556369766907 +-0.01572339726211457317 +-0.01564514742720489460 +-0.01556700606366699137 +-0.01548897317709376636 +-0.01541104877397759046 +-0.01533323286171499843 +-0.01525552544861154616 +-0.01517792654388634699 +-0.01510043615767716653 +-0.01502305430104507525 +-0.01494578098597947567 +-0.01486861622540271502 +-0.01479156003317529111 +-0.01471461242410042856 +-0.01463777341392941481 +-0.01456104301936637924 +-0.01448442125807325974 +-0.01440790814867513002 +-0.01433150371076462835 +-0.01425520796490770473 +-0.01417902093264849193 +-0.01410294263651431027 +-0.01402697310002091850 +-0.01395111234767778749 +-0.01387536040499300072 +-0.01379971729847890606 +-0.01372418305565704759 +-0.01364875770506369414 +-0.01357344127625487867 +-0.01349823379981195809 +-0.01342313530734674625 +-0.01334814583150715009 +-0.01327326540598240158 +-0.01319849406550855503 +-0.01312383184587388209 +-0.01304927878392462409 +-0.01297483491756979378 +-0.01290050028578766314 +-0.01282627492863059118 +-0.01275215888723093410 +-0.01267815220380654438 +-0.01260425492166649189 +-0.01253046708521646409 +-0.01245678873996483929 +-0.01238321993252806605 +-0.01230976071063662712 +-0.01223641112314057845 +-0.01216317122001548713 +-0.01209004105236802934 +-0.01201702067244211393 +-0.01194411013362451854 +-0.01187130949045076683 +-0.01179861879861123126 +-0.01172603811495682991 +-0.01165356749750480134 +-0.01158120700544530007 +-0.01150895669914675686 +-0.01143681664016227284 +-0.01136478689123540838 +-0.01129286751630651474 +-0.01122105858051844138 +-0.01114936015022306021 +-0.01107777229298721050 +-0.01100629507759874788 +-0.01093492857407288993 +-0.01086367285365837272 +-0.01079252798884350502 +-0.01072149405336267694 +-0.01065057112220249222 +-0.01057975927160800279 +-0.01050905857908917759 +-0.01043846912342708683 +-0.01036799098468018689 +-0.01029762424419090883 +-0.01022736898459193980 +-0.01015722528981261204 +-0.01008719324508533521 +-0.01001727293695225257 +-0.00994746445327114245 +-0.00987776788322270415 +-0.00980818331731647328 +-0.00973871084739758204 +-0.00966935056665327135 +-0.00960010256961951400 +-0.00953096695218737765 +-0.00946194381160997758 +-0.00939303324650883099 +-0.00932423535688065193 +-0.00925555024410388075 +-0.00918697801094547559 +-0.00911851876156739329 +-0.00905017260153360460 +-0.00898193963781659249 +-0.00891381997880416263 +-0.00884581373430614465 +-0.00877792101556138654 +-0.00871014193524395110 +-0.00864247660747070531 +-0.00857492514780755326 +-0.00850748767327643741 +-0.00844016430236220645 +-0.00837295515501946044 +-0.00830586035267922435 +-0.00823888001825609333 +-0.00817201427615503635 +-0.00810526325227814599 +-0.00803862707403167273 +-0.00797210587033293262 +-0.00790569977161708487 +-0.00783940890984427541 +-0.00777323341850644656 +-0.00770717343263426988 +-0.00764122908880432265 +-0.00757540052514547087 +-0.00750968788134660260 +-0.00744409129866303084 +-0.00737861091992370217 +-0.00731324688953810965 +-0.00724799935350336350 +-0.00718286845941092534 +-0.00711785435645396342 +-0.00705295719543403820 +-0.00698817712876834748 +-0.00692351431049642758 +-0.00685896889628745052 +-0.00679454104344684104 +-0.00673023091092365879 +-0.00666603865931738281 +-0.00660196445088485732 +-0.00653800844954742152 +-0.00647417082089777988 +-0.00641045173220677975 +-0.00634685135243086198 +-0.00628336985221858348 +-0.00622000740391774089 +-0.00615676418158226605 +-0.00609364036097922394 +-0.00603063611959552080 +-0.00596775163664507897 +-0.00590498709307568214 +-0.00584234267157565049 +-0.00577981855658091757 +-0.00571741493428184946 +-0.00565513199262986967 +-0.00559296992134466087 +-0.00553092891192062328 +-0.00546900915763381783 +-0.00540721085354876289 +-0.00534553419652507300 +-0.00528397938522410203 +-0.00522254662011587076 +-0.00516123610348561551 +-0.00510004803944035662 +-0.00503898263391564828 +-0.00497804009468220173 +-0.00491722063135209466 +-0.00485652445538574829 +-0.00479595178009828167 +-0.00473550282066582517 +-0.00467517779413211682 +-0.00461497691941487129 +-0.00455490041731197986 +-0.00449494851050813264 +-0.00443512142358081906 +-0.00437541938300679053 +-0.00431584261716807041 +-0.00425639135635826928 +-0.00419706583278846822 +-0.00413786628059359309 +-0.00407879293583821457 +-0.00401984603652259364 +-0.00396102582258852764 +-0.00390233253592543738 +-0.00384376642037566026 +-0.00378532772174088516 +-0.00372701668778736969 +-0.00366883356825170375 +-0.00361077861484645482 +-0.00355285208126563312 +-0.00349505422319002857 +-0.00343738529829280522 +-0.00337984556624468116 +-0.00332243528871926062 +-0.00326515472939810239 +-0.00320800415397591880 +-0.00315098383016546458 +-0.00309409402770270117 +-0.00303733501835150733 +-0.00298070707590849734 +-0.00292421047620781234 +-0.00286784549712569125 +-0.00281161241858477167 +-0.00275551152255904897 +-0.00269954309307779633 +-0.00264370741622999830 +-0.00258800478016850671 +-0.00253243547511413205 +-0.00247699979335945161 +-0.00242169802927292817 +-0.00236653047930257153 +-0.00231149744197950988 +-0.00225659921792162538 +-0.00220183610983702748 +-0.00214720842252720187 +-0.00209271646289043269 +-0.00203836053992480963 +-0.00198414096473112844 +-0.00193005805051586028 +-0.00187611211259380069 +-0.00182230346839052835 +-0.00176863243744515108 +-0.00171509934141242989 +-0.00166170450406498763 +-0.00160844825129547743 +-0.00155533091111822769 +-0.00150235281367133407 +-0.00144951429121801222 +-0.00139681567814826067 +-0.00134425731097999887 +-0.00129183952836036276 +-0.00123956267106650341 +-0.00118742708200668227 +-0.00113543310622076779 +-0.00108358109088076138 +-0.00103187138529117653 +-0.00098030434088921072 +-0.00092888031124441499 +-0.00087759965205905634 +-0.00082646272116725257 +-0.00077546987853459705 +-0.00072462148625736895 +-0.00067391790856158242 +-0.00062335951180172273 +-0.00057294666445956871 +-0.00052267973714255833 +-0.00047255910258195400 +-0.00042258513563093938 +-0.00037275821326244107 +-0.00032307871456658144 +-0.00027354702074823854 +-0.00022416351512409208 +-0.00017492858311950459 +-0.00012584261226533024 +-0.00007690599219422538 +-0.00002811911463682659 +0.00002051762658208678 +0.00006900383554804056 +0.00011733911426135711 +0.00016552306264196211 +0.00021355527853431807 +0.00026143535771304643 +0.00030916289388815250 +0.00035673747871101959 +0.00040415870178057349 +0.00045142615064967193 +0.00049853941083171933 +0.00054549806580782528 +0.00059230169703383499 +0.00063894988394805059 +0.00068544220397902104 +0.00073177823255379706 +0.00077795754310628999 +0.00082397970708624412 +0.00086984429396813254 +0.00091555087126070887 +0.00096109900451675403 +0.00100648825734316982 +0.00105171819141126671 +0.00109678836646789858 +0.00114169834034607816 +0.00118644766897676632 +0.00123103590640059293 +0.00127546260478002271 +0.00131972731441184327 +0.00136382958374022347 +0.00140776895936975117 +0.00145154498607928607 +0.00149515720683581995 +0.00153860516280905179 +0.00158188839338607680 +0.00162500643618673736 +0.00166795882707903567 +0.00171074510019528290 +0.00175336478794848628 +0.00179581742104914358 +0.00183810252852256630 +0.00188021963772666339 +0.00192216827436976576 +0.00196394796252942743 +0.00200555822467135547 +0.00204699858166882331 +0.00208826855282253027 +0.00212936765588111945 +0.00217029540706174025 +0.00221105132107143106 +0.00225163491112892033 +0.00229204568898675300 +0.00233228316495403144 +0.00237234684791965550 +0.00241223624537586362 +0.00245195086344250678 +0.00249149020689172756 +0.00253085377917306028 +0.00257004108243917605 +0.00260905161757219806 +0.00264788488421022726 +0.00268654038077470632 +0.00272501760449824762 +0.00276331605145289190 +0.00280143521657894327 +0.00283937459371459656 +0.00287713367562564010 +0.00291471195403606364 +0.00295210891965925560 +0.00298932406222950564 +0.00302635687053440109 +0.00306320683244743668 +0.00309987343496153419 +0.00313635616422296148 +0.00317265450556589688 +0.00320876794354757857 +0.00324469596198421421 +0.00328043804398706323 +0.00331599367199963708 +0.00335136232783523214 +0.00338654349271511187 +0.00342153664730736762 +0.00345634127176643957 +0.00349095684577312377 +0.00352538284857531036 +0.00355961875902945915 +0.00359366405564255772 +0.00362751821661478962 +0.00366118071988296269 +0.00369465104316436853 +0.00372792866400152318 +0.00376101305980749458 +0.00379390370791183587 +0.00382660008560731799 +0.00385910167019734096 +0.00389140793904379839 +0.00392351836961593071 +0.00395543243953971023 +0.00398714962664794680 +0.00401866940903101121 +0.00404999126508856153 +0.00408111467358150508 +0.00411203911368498900 +0.00414276406504210902 +0.00417328900781816382 +0.00420361342275571859 +0.00423373679123046059 +0.00426365859530754808 +0.00429337831779894302 +0.00432289544232127877 +0.00435220945335460310 +0.00438131983630170828 +0.00441022607754834855 +0.00443892766452402138 +0.00446742408576358396 +0.00449571483096963126 +0.00452379939107557753 +0.00455167725830935184 +0.00457934792625821086 +0.00460681088993374326 +0.00463406564583809799 +0.00466111169203071475 +0.00468794852819584638 +0.00471457565571083408 +0.00474099257771516680 +0.00476719879918016502 +0.00479319382697952507 +0.00481897716996053382 +0.00484454833901611526 +0.00486990684715749803 +0.00489505220958774776 +0.00491998394377589701 +0.00494470156953194257 +0.00496920460908252884 +0.00499349258714731469 +0.00501756503101614612 +0.00504142147062705201 +0.00506506143864459291 +0.00508848447053940594 +0.00511169010466816596 +0.00513467788235436474 +0.00515744734796977442 +0.00517999804901670378 +0.00520232953621081219 +0.00522444136356473368 +0.00524633308847239320 +0.00526800427179399938 +0.00528945447794169389 +0.00531068327496596326 +0.00533169023464259706 +0.00535247493256046404 +0.00537303694820985209 +0.00539337586507148119 +0.00541349127070622771 +0.00543338275684545659 +0.00545304991948191483 +0.00547249235896140034 +0.00549170968007490698 +0.00551070149215152419 +0.00552946740915175473 +0.00554800704976174137 +0.00556632003748764453 +0.00558440600075096188 +0.00560226457298428331 +0.00561989539272756463 +0.00563729810372499539 +0.00565447235502242879 +0.00567141780106523042 +0.00568813410179677768 +0.00570462092275731466 +0.00572087793518342297 +0.00573690481610796259 +0.00575270124846027821 +0.00576826692116714449 +0.00578360152925392994 +0.00579870477394628988 +0.00581357636277222024 +0.00582821600966452504 +0.00584262343506365429 +0.00585679836602086192 +0.00587074053630180781 +0.00588444968649040612 +0.00589792556409297723 +0.00591116792364279782 +0.00592417652680477316 +0.00593695114248051804 +0.00594949154691360241 +0.00596179752379498440 +0.00597386886436877644 +0.00598570536753807378 +0.00599730683997097384 +0.00600867309620679076 +0.00601980395876235749 +0.00603069925823841897 +0.00604135883342611039 +0.00605178253141358449 +0.00606197020769252883 +0.00607192172626477237 +0.00608163695974894402 +0.00609111578948701680 +0.00610035810565079471 +0.00610936380734843076 +0.00611813280273069103 +0.00612666500909721159 +0.00613496035300253092 +0.00614301877036202773 +0.00615084020655756302 +0.00615842461654295906 +0.00616577196494917310 +0.00617288222618926023 +0.00617975538456294344 +0.00618639143436092252 +0.00619279037996872412 +0.00619895223597033331 +0.00620487702725115633 +0.00621056478910074657 +0.00621601556731498413 +0.00622122941829765606 +0.00622620640916166177 +0.00623094661782951000 +0.00623545013313328306 +0.00623971705491396973 +0.00624374749412010856 +0.00624754157290576592 +0.00625109942472777680 +0.00625442119444223621 +0.00625750703840019431 +0.00626035712454253886 +0.00626297163249402416 +0.00626535075365638496 +0.00626749469130061590 +0.00626940366065820934 +0.00627107788901140346 +0.00627251761578251008 +0.00627372309262208983 +0.00627469458349610119 +0.00627543236477187249 +0.00627593672530298453 +0.00627620796651290423 +0.00627624640247742040 +0.00627605236000583662 +0.00627562617872083183 +0.00627496821113703029 +0.00627407882273814214 +0.00627295839205282285 +0.00627160731072896882 +0.00627002598360661915 +0.00626821482878932561 +0.00626617427771401780 +0.00626390477521922024 +0.00626140677961176031 +0.00625868076273173018 +0.00625572721001583804 +0.00625254662055901075 +0.00624913950717423308 +0.00624550639645067834 +0.00624164782880990646 +0.00623756435856027275 +0.00623325655394946828 +0.00622872499721507673 +0.00622397028463322292 +0.00621899302656514844 +0.00621379384750190850 +0.00620837338610687357 +0.00620273229525615446 +0.00619687124207700217 +0.00619079090798393961 +0.00618449198871271789 +0.00617797519435211821 +0.00617124124937343168 +0.00616429089265766762 +0.00615712487752046508 +0.00614974397173458608 +0.00614214895755017549 +0.00613434063171241443 +0.00612631980547692027 +0.00611808730462254022 +0.00610964396946174753 +0.00610099065484840612 +0.00609212823018312130 +0.00608305757941587574 +0.00607377960104616733 +0.00606429520812040192 +0.00605460532822676371 +0.00604471090348725551 +0.00603461289054719584 +0.00602431226056182427 +0.00601380999918027254 +0.00600310710652670124 +0.00599220459717864345 +0.00598110350014255041 +0.00596980485882651728 +0.00595830973101008510 +0.00594661918881124549 +0.00593473431865048327 +0.00592265622121197766 +0.00591038601140177807 +0.00589792481830317579 +0.00588527378512901291 +0.00587243406917102931 +0.00585940684174628829 +0.00584619328814056215 +0.00583279460754867075 +0.00581921201301194291 +0.00580544673135250603 +0.00579150000310460749 +0.00577737308244291505 +0.00576306723710772687 +0.00574858374832713879 +0.00573392391073620274 +0.00571908903229298264 +0.00570408043419155363 +0.00568889945077193353 +0.00567354742942701405 +0.00565802573050628102 +0.00564233572721670271 +0.00562647880552035948 +0.00561045636402911826 +0.00559426981389624794 +0.00557792057870500589 +0.00556141009435410019 +0.00554473980894032784 +0.00552791118263799407 +0.00551092568757543654 +0.00549378480770853963 +0.00547649003869127900 +0.00545904288774323124 +0.00544144487351430010 +0.00542369752594634019 +0.00540580238613196790 +0.00538776100617042748 +0.00536957494902065222 +0.00535124578835132880 +0.00533277510838837000 +0.00531416450375934296 +0.00529541557933525028 +0.00527652995006952768 +0.00525750924083430611 +0.00523835508625392510 +0.00521906913053592474 +0.00519965302729922824 +0.00518010843939981352 +0.00516043703875376531 +0.00514064050615785622 +0.00512072053110745017 +0.00510067881161220711 +0.00508051705400909548 +0.00506023697277315811 +0.00503984029032585913 +0.00501932873684116359 +0.00499870405004923437 +0.00497796797503810215 +0.00495712226405292493 +0.00493616867629324049 +0.00491510897770807472 +0.00489394494078901864 +0.00487267834436120369 +0.00485131097337254593 +0.00482984461868082859 +0.00480828107683907695 +0.00478662214987909170 +0.00476486964509324675 +0.00474302537481446820 +0.00472109115619479599 +0.00469906881098215191 +0.00467696016529563913 +0.00465476704939935069 +0.00463249129747479640 +0.00461013474739183863 +0.00458769924047851187 +0.00456518662128942241 +0.00454259873737301433 +0.00451993743903774618 +0.00449720457911705063 +0.00447440201273352923 +0.00445153159706197094 +0.00442859519109159178 +0.00440559465538741587 +0.00438253185185096417 +0.00435940864348006475 +0.00433622689412832898 +0.00431298846826376654 +0.00428969523072706728 +0.00426634904648937486 +0.00424295178040974292 +0.00421950529699214628 +0.00419601146014250519 +0.00417247213292526713 +0.00414888917732003128 +0.00412526445397807216 +0.00410159982197895630 +0.00407789713858706417 +0.00405415825900856501 +0.00403038503614834911 +0.00400657932036736081 +0.00398274295924028361 +0.00395887779731365994 +0.00393498567586436816 +0.00391106843265892276 +0.00388712790171311367 +0.00386316591305249776 +0.00383918429247357687 +0.00381518486130583406 +0.00379116943617453838 +0.00376713982876471492 +0.00374309784558591501 +0.00371904528773814606 +0.00369498395067893465 +0.00367091562399161908 +0.00364684209115477553 +0.00362276512931319645 +0.00359868650905005279 +0.00357460799416058463 +0.00355053134142730440 +0.00352645830039676747 +0.00350239061315787102 +0.00347833001412207413 +0.00345427822980509842 +0.00343023697861059374 +0.00340620797061558104 +0.00338219290735788675 +0.00335819348162537694 +0.00333421137724748120 +0.00331024826888854772 +0.00328630582184343120 +0.00326238569183523886 +0.00323848952481533810 +0.00321461895676552123 +0.00319077561350271030 +0.00316696111048583645 +0.00314317705262522670 +0.00311942503409445068 +0.00309570663814469176 +0.00307202343692155851 +0.00304837699128473767 +0.00302476885063003489 +0.00300120055271421151 +0.00297767362348253265 +0.00295418957689908782 +0.00293074991477976915 +0.00290735612662834566 +0.00288400968947514699 +0.00286071206771875254 +0.00283746471297061965 +0.00281426906390266126 +0.00279112654609773008 +0.00276803857190332939 +0.00274500654028814878 +0.00272203183670180699 +0.00269911583293764743 +0.00267625988699868962 +0.00265346534296662323 +0.00263073353087418501 +0.00260806576658050883 +0.00258546335164977319 +0.00256292757323310118 +0.00254045970395367238 +0.00251806100179501318 +0.00249573270999276994 +0.00247347605692956182 +0.00245129225603322055 +0.00242918250567832712 +0.00240714798909109212 +0.00238518987425745052 +0.00236330931383469962 +0.00234150744506626514 +0.00231978538969991946 +0.00229814425390935167 +0.00227658512821895306 +0.00225510908743220898 +0.00223371719056318857 +0.00221241048077151217 +0.00219118998530062588 +0.00217005671541946202 +0.00214901166636731348 +0.00212805581730225561 +0.00210719013125268287 +0.00208641555507227188 +0.00206573301939822667 +0.00204514343861283455 +0.00202464771080822746 +0.00200424671775459914 +0.00198394132487149421 +0.00196373238120243218 +0.00194362071939275941 +0.00192360715567072471 +0.00190369248983165399 +0.00188387750522550049 +0.00186416296874737436 +0.00184454963083129043 +0.00182503822544702364 +0.00180562947010009427 +0.00178632406583471024 +0.00176712269723997418 +0.00174802603245891074 +0.00172903472320060634 +0.00171014940475529612 +0.00169137069601242801 +0.00167269919948154536 +0.00165413550131627055 +0.00163568017134095209 +0.00161733376308024015 +0.00159909681379147273 +0.00158096984449983225 +0.00156295336003616728 +0.00154504784907770780 +0.00152725378419128277 +0.00150957162187927152 +0.00149200180262815747 +0.00147454475095966332 +0.00145720087548437583 +0.00143997056895802246 +0.00142285420834006708 +0.00140585215485483227 +0.00138896475405499956 +0.00137219233588749723 +0.00135553521476163854 +0.00133899368961970587 +0.00132256804400963956 +0.00130625854616000701 +0.00129006544905715232 +0.00127398899052448707 +0.00125802939330380763 +0.00124218686513883464 +0.00122646159886060984 +0.00121085377247496313 +0.00119536354925189946 +0.00117999107781690963 +0.00116473649224406255 +0.00114959991215108498 +0.00113458144279605716 +0.00111968117517593840 +0.00110489918612677904 +0.00109023553842560808 +0.00107569028089387047 +0.00106126344850259141 +0.00104695506247894435 +0.00103276513041438193 +0.00101869364637422583 +0.00100474059100868107 +0.00099090593166517279 +0.00097718962250215816 +0.00096359160460409983 +0.00095011180609777556 +0.00093675014226979184 +0.00092350651568529876 +0.00091038081630777747 +0.00089737292162007075 +0.00088448269674634217 +0.00087170999457512985 +0.00085905465588338042 +0.00084651650946143860 +0.00083409537223889680 +0.00082179104941143349 +0.00080960333456837647 +0.00079753200982111885 +0.00078557684593229325 +0.00077373760244568181 +0.00076201402781676168 +0.00075040585954401647 +0.00073891282430075926 +0.00072753463806759144 +0.00071627100626540246 +0.00070512162388889547 +0.00069408617564053728 +0.00068316433606506921 +0.00067235576968431620 +0.00066166013113243738 +0.00065107706529151993 +0.00064060620742743964 +0.00063024718332610854 +0.00061999960942987048 +0.00060986309297417446 +0.00059983723212442286 +0.00058992161611299697 +0.00058011582537636098 +0.00057041943169236823 +0.00056083199831754335 +0.00055135308012445891 +0.00054198222373911642 +0.00053271896767833509 +0.00052356284248704582 +0.00051451337087562597 +0.00050557006785704507 +0.00049673244088394345 +0.00048799998998556502 +0.00047937220790452887 +0.00047084858023337470 +0.00046242858555097671 +0.00045411169555864176 +0.00044589737521598719 +0.00043778508287653208 +0.00042977427042299596 +0.00042186438340223052 +0.00041405486115989011 +0.00040634513697465532 +0.00039873463819211535 +0.00039122278635823454 +0.00038380899735240766 +0.00037649268152003374 +0.00036927324380470742 +0.00036215008387985710 +0.00035512259627992889 +0.00034819017053105251 +0.00034135219128118556 +0.00033460803842968469 +0.00032795708725638574 +0.00032139870855004522 +0.00031493226873622763 +0.00030855713000458928 +0.00030227265043555125 +0.00029607818412631833 +0.00028997308131631778 +0.00028395668851192882 +0.00027802834861057735 +0.00027218740102415243 +0.00026643318180174364 +0.00026076502375165482 +0.00025518225656277017 +0.00024968420692514826 +0.00024427019864992240 +0.00023893955278846149 +0.00023369158775079612 +0.00022852561942327118 +0.00022344096128549241 +0.00021843692452645934 +0.00021351281815995335 +0.00020866794913914532 +0.00020390162247042350 +0.00019921314132641238 +0.00019460180715824267 +0.00019006691980697862 +0.00018560777761426325 +0.00018122367753215345 +0.00017691391523214813 +0.00017267778521337987 +0.00016851458091003216 +0.00016442359479789176 +0.00016040411850010134 +0.00015645544289207949 +0.00015257685820561977 +0.00014876765413213852 +0.00014502711992513335 +0.00014135454450176860 +0.00013774921654364957 +0.00013421042459675967 +0.00013073745717056653 +0.00012732960283627930 +0.00012398615032430663 +0.00012070638862084818 +0.00011748960706367170 +0.00011433509543705691 +0.00011124214406591244 +0.00010821004390905095 +0.00010523808665166882 +0.00010232556479697123 +0.00009947177175699164 +0.00009667600194258920 +0.00009393755085263230 +0.00009125571516235576 +0.00008862979281093456 +0.00008605908308822327 +0.00008354288672070636 +0.00008108050595664496 +0.00007867124465043090 +0.00007631440834613650 +0.00007400930436030073 +0.00007175524186390800 +0.00006955153196360009 +0.00006739748778211389 +0.00006529242453793922 +0.00006323565962423341 +0.00006122651268695581 +0.00005926430570225884 +0.00005734836305312869 +0.00005547801160528469 +0.00005365258078233247 +0.00005187140264020413 +0.00005013381194085406 +0.00004843914622524493 +0.00004678674588561793 +0.00004517595423705786 +0.00004360611758834899 +0.00004207658531215262 +0.00004058670991448058 +0.00003913584710349550 +0.00003772335585763454 +0.00003634859849306667 +0.00003501094073048208 +0.00003370975176124071 +0.00003244440431286012 +0.00003121427471386971 +0.00003001874295803045 +0.00002885719276792973 +0.00002772901165795149 +0.00002663359099664633 +0.00002557032606848550 +0.00002453861613502384 +0.00002353786449547162 +0.00002256747854668510 +0.00002162686984257741 +0.00002071545415297148 +0.00001983265152188321 +0.00001897788632525714 +0.00001815058732815587 +0.00001735018774141286 +0.00001657612527775123 +0.00001582784220738795 +0.00001510478541311512 +0.00001440640644487779 +0.00001373216157385117 +0.00001308151184602594 +0.00001245392313530567 +0.00001184886619613321 +0.00001126581671564079 +0.00001070425536534102 +0.00001016366785236234 +0.00000964354497023746 +0.00000914338264924924 +0.00000866268200634905 +0.00000820094939464464 +0.00000775769645247272 +0.00000733244015206028 +0.00000692470284778296 +0.00000653401232402526 +0.00000615990184265578 +0.00000580191019011655 +0.00000545958172413972 +0.00000513246642009613 +0.00000482011991698345 +0.00000452210356305917 +0.00000423798446112975 +0.00000396733551349670 +0.00000370973546657108 +0.00000346476895516112 +0.00000323202654644036 +0.00000301110478360136 +0.00000280160622920510 +0.00000260313950822784 +0.00000241531935081538 +0.00000223776663474958 +0.00000207010842763393 +0.00000191197802880317 +0.00000176301501096574 +0.00000162286526158168 +0.00000149118102398443 +0.00000136762093825140 +0.00000125185008182945 +0.00000114354000992020 +0.00000104236879563259 +0.00000094802106990583 +0.00000086018806121006 +0.00000077856763502926 +0.00000070286433313185 +0.00000063278941263383 +0.00000056806088486051 +0.00000050840355401046 +0.00000045354905562748 +0.00000040323589488517 +0.00000035720948468869 +0.00000031522218359818 +0.00000027703333357882 +0.00000024240929758123 +0.00000021112349695691 +0.00000018295644871280 +0.00000015769580260895 +0.00000013513637810321 +0.00000011508020114699 +0.00000009733654083554 +0.00000008172194591643 +0.00000006806028115990 +0.00000005618276359412 +0.00000004592799860902 +0.00000003714201593145 +0.00000002967830547495 +0.00000002339785306689 +0.00000001816917605582 +0.00000001386835880167 +0.00000001037908805133 +0.00000000759268820197 +0.00000000540815645445 +0.00000000373219785892 +0.00000000247926025467 +0.00000000157156910601 +0.00000000093916223615 +0.00000000051992446044 +0.00000000025962212071 +0.00000000011193752186 +0.00000000003850327215 +0.00000000000893652797 +0.00000000000087314440 +0.00000000000000173200 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 +0.00000000000000000000 diff --git a/examples/USER/misc/cnp/in.cnp b/examples/USER/misc/cnp/in.cnp new file mode 100644 index 0000000000..2c71441483 --- /dev/null +++ b/examples/USER/misc/cnp/in.cnp @@ -0,0 +1,51 @@ +# Generation and relaxation of a partial dislocation in Cu perfect FCC crystal + +# Initialization +units metal +boundary p p p +atom_style atomic + +# create simulation box and system +lattice fcc 3.615 origin 0.01 0.01 0.01 orient x -1 -1 2 orient y 1 1 1 orient z -1 1 0 +region mdbox block 0 3 0.0 14.0 0 84 units lattice +region system block 0 3 1.1 13.1 0 84 units lattice +create_box 2 mdbox +create_atoms 1 region system + +# Define atoms mass and force field +mass * 63.54 +pair_style eam/alloy +pair_coeff * * Cu_Mishin1.eam Cu Cu + +# Delete a plane of atoms along the z direction to generate a partial dislocation +region dislocation_atoms block 0 3 7 14 41.9 42.1 units lattice +delete_atoms region dislocation_atoms +region quarter_up block 0 3 7 11 0 84 units lattice +group middle region quarter_up + +# specify simulation parameters +timestep 0.004 + +# Relax configuration using conjugate gradient +#min_style cg +#minimize 1.0e-4 1.0e-6 100 1000 + +# Setup calculations +compute 1 all cnp/atom 3.086 +compute 2 all cna/atom 3.086 +compute 3 all centro/atom fcc +compute 4 all coord/atom cutoff 3.086 +dump 1 all custom 100 dump.lammpstrj id type xu yu zu c_1 c_2 c_3 c_4 + +### Set up thermo display +thermo 10 +thermo_style custom step atoms temp press pe ke etotal + +# Relax the system performing a langevin dynamics (freeze motion along y 111 direction) +fix 1 all nve +fix 2 all langevin 50 1 0.1 699483 +fix 3 all setforce NULL 0.0 NULL +fix 4 middle setforce 0.0 0.0 0.0 +run 100 +unfix 4 +run 200 diff --git a/examples/USER/misc/cnp/log.31May17.cnp.g++.4 b/examples/USER/misc/cnp/log.31May17.cnp.g++.4 new file mode 100644 index 0000000000..d86d0b5600 --- /dev/null +++ b/examples/USER/misc/cnp/log.31May17.cnp.g++.4 @@ -0,0 +1,185 @@ +LAMMPS (19 May 2017) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) + using 1 OpenMP thread(s) per MPI task +# Generation and relaxation of a partial dislocation in Cu perfect FCC crystal + +# Initialization +units metal +boundary p p p +atom_style atomic + +# create simulation box and system +lattice fcc 3.615 origin 0.01 0.01 0.01 orient x -1 -1 2 orient y 1 1 1 orient z -1 1 0 +Lattice spacing in x,y,z = 5.90327 6.26136 5.11238 +region mdbox block 0 3 0.0 14.0 0 84 units lattice +region system block 0 3 1.1 13.1 0 84 units lattice +create_box 2 mdbox +Created orthogonal box = (0 0 0) to (17.7098 87.6591 429.44) + 1 by 1 by 4 MPI processor grid +create_atoms 1 region system +Created 48384 atoms + +# Define atoms mass and force field +mass * 63.54 +pair_style eam/alloy +pair_coeff * * Cu_Mishin1.eam Cu Cu + +# Delete a plane of atoms along the z direction to generate a partial dislocation +region dislocation_atoms block 0 3 7 14 41.9 42.1 units lattice +delete_atoms region dislocation_atoms +Deleted 76 atoms, new total = 48308 +region quarter_up block 0 3 7 11 0 84 units lattice +group middle region quarter_up +16080 atoms in group middle + +# specify simulation parameters +timestep 0.004 + +# Relax configuration using conjugate gradient +#min_style cg +#minimize 1.0e-4 1.0e-6 100 1000 + +# Setup calculations +compute 1 all cnp/atom 3.086 +compute 2 all cna/atom 3.086 +compute 3 all centro/atom fcc +compute 4 all coord/atom cutoff 3.086 +dump 1 all custom 100 dump.lammpstrj id type xu yu zu c_1 c_2 c_3 c_4 + +### Set up thermo display +thermo 10 +thermo_style custom step atoms temp press pe ke etotal + +# Relax the system performing a langevin dynamics (freeze motion along y 111 direction) +fix 1 all nve +fix 2 all langevin 50 1 0.1 699483 +fix 3 all setforce NULL 0.0 NULL +fix 4 middle setforce 0.0 0.0 0.0 +run 100 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 7.50679 + ghost atom cutoff = 7.50679 + binsize = 3.75339, bins = 5 24 115 + 5 neighbor lists, perpetual/occasional/extra = 1 4 0 + (1) pair eam/alloy, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard + (2) compute cnp/atom, occasional + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard + (3) compute cna/atom, occasional + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard + (4) compute centro/atom, occasional + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard + (5) compute coord/atom, occasional + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 45.41 | 45.41 | 45.41 Mbytes +Step Atoms Temp Press PotEng KinEng TotEng + 0 48308 0 -3388.0911 -169746.07 0 -169746.07 + 10 48308 7.35092 -3091.0864 -169715.96 45.900393 -169670.05 + 20 48308 9.9162268 -2822.7045 -169678.51 61.918604 -169616.59 + 30 48308 12.351316 -2726.7195 -169666.35 77.123716 -169589.23 + 40 48308 13.302856 -2703.586 -169662.9 83.06529 -169579.83 + 50 48308 12.782228 -2706.8662 -169662.36 79.814401 -169582.55 + 60 48308 12.198179 -2772.4206 -169670.02 76.167503 -169593.86 + 70 48308 10.663322 -2841.3384 -169677.48 66.583595 -169610.9 + 80 48308 9.1169804 -2932.3896 -169687.85 56.927974 -169630.92 + 90 48308 7.2905076 -3029.9433 -169699.09 45.523167 -169653.56 + 100 48308 5.4063635 -3139.4496 -169711.65 33.758252 -169677.89 +Loop time of 10.9003 on 4 procs for 100 steps with 48308 atoms + +Performance: 3.171 ns/day, 7.570 hours/ns, 9.174 timesteps/s +31.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 | 9.8764 | 9.9587 | 10.021 | 1.6 | 91.36 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.1232 | 0.18385 | 0.26683 | 12.1 | 1.69 +Output | 0.45385 | 0.45451 | 0.45634 | 0.2 | 4.17 +Modify | 0.25026 | 0.2537 | 0.25744 | 0.5 | 2.33 +Other | | 0.04949 | | | 0.45 + +Nlocal: 12077 ave 12096 max 12020 min +Histogram: 1 0 0 0 0 0 0 0 0 3 +Nghost: 14204 ave 14261 max 14109 min +Histogram: 1 0 0 0 0 1 0 0 0 2 +Neighs: 814050 ave 818584 max 809212 min +Histogram: 1 0 0 0 0 2 0 0 0 1 +FullNghs: 1.6281e+06 ave 1.63296e+06 max 1.61808e+06 min +Histogram: 1 0 0 0 0 0 1 0 0 2 + +Total # of neighbors = 6512400 +Ave neighs/atom = 134.81 +Neighbor list builds = 0 +Dangerous builds = 0 +unfix 4 +run 200 +Per MPI rank memory allocation (min/avg/max) = 45.41 | 45.41 | 45.41 Mbytes +Step Atoms Temp Press PotEng KinEng TotEng + 100 48308 5.4063635 -3139.4496 -169711.65 33.758252 -169677.89 + 110 48308 15.260795 -2793.119 -169677.24 95.290993 -169581.95 + 120 48308 18.548656 -2433.1584 -169624.79 115.82096 -169508.97 + 130 48308 22.15831 -2276.626 -169604.28 138.36025 -169465.92 + 140 48308 24.393841 -2208.1771 -169596.16 152.31929 -169443.84 + 150 48308 24.797558 -2173.3145 -169591.43 154.84016 -169436.59 + 160 48308 24.73371 -2188.909 -169593.08 154.44148 -169438.64 + 170 48308 24.128467 -2220.3404 -169596.96 150.66225 -169446.29 + 180 48308 22.975708 -2275.1244 -169602.72 143.46422 -169459.26 + 190 48308 21.936324 -2348.3762 -169610.59 136.97413 -169473.61 + 200 48308 20.516249 -2432.8447 -169619.98 128.10694 -169491.87 + 210 48308 19.000566 -2510.2915 -169628.58 118.64276 -169509.93 + 220 48308 17.490407 -2597.299 -169638.24 109.21307 -169529.03 + 230 48308 16.062482 -2684.1203 -169648.31 100.29687 -169548.01 + 240 48308 14.360342 -2768.2313 -169657.7 89.668411 -169568.03 + 250 48308 12.802315 -2852.6965 -169666.99 79.939831 -169587.05 + 260 48308 11.258205 -2944.4533 -169677.52 70.298142 -169607.23 + 270 48308 9.6159129 -3038.6304 -169688.06 60.043393 -169628.02 + 280 48308 7.972425 -3129.0826 -169698.03 49.781176 -169648.25 + 290 48308 6.3752377 -3219.2054 -169708.23 39.808067 -169668.42 + 300 48308 4.7374688 -3306.1468 -169718.27 29.58156 -169688.69 +Loop time of 23.0164 on 4 procs for 200 steps with 48308 atoms + +Performance: 3.003 ns/day, 7.992 hours/ns, 8.689 timesteps/s +31.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 | 20.221 | 20.423 | 20.57 | 3.1 | 88.73 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.27748 | 0.42603 | 0.62832 | 21.4 | 1.85 +Output | 1.5454 | 1.5473 | 1.5529 | 0.3 | 6.72 +Modify | 0.48886 | 0.49773 | 0.50842 | 1.1 | 2.16 +Other | | 0.1221 | | | 0.53 + +Nlocal: 12077 ave 12096 max 12020 min +Histogram: 1 0 0 0 0 0 0 0 0 3 +Nghost: 14204 ave 14261 max 14109 min +Histogram: 1 0 0 0 0 1 0 0 0 2 +Neighs: 814094 ave 818584 max 809212 min +Histogram: 1 0 0 0 0 2 0 0 0 1 +FullNghs: 1.62852e+06 ave 1.63296e+06 max 1.61892e+06 min +Histogram: 1 0 0 0 0 0 0 1 0 2 + +Total # of neighbors = 6514094 +Ave neighs/atom = 134.845 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:35 From f57f1efdff0cea43fcad22b4061a3c944fa91110 Mon Sep 17 00:00:00 2001 From: Anders Hafreager Date: Wed, 31 May 2017 00:34:26 -0700 Subject: [PATCH 116/302] Setting lattice to NULL before creating --- src/domain.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/domain.cpp b/src/domain.cpp index 8ead12cd4e..aadd1b751f 100644 --- a/src/domain.cpp +++ b/src/domain.cpp @@ -1697,6 +1697,7 @@ int Domain::ownatom(int id, double *x, imageint *image, int shrinkexceed) void Domain::set_lattice(int narg, char **arg) { if (lattice) delete lattice; + lattice = NULL; lattice = new Lattice(lmp,narg,arg); } From 937cf0b996e5a31ebaeecbe412f03a4abaa508e0 Mon Sep 17 00:00:00 2001 From: Markus Hoehnerbach Date: Wed, 31 May 2017 12:20:12 +0200 Subject: [PATCH 117/302] Bugfix: Kronecker term ignored in spline forces. The code ignored the kronecker(ktype, 0) or kronecker(ltype, 0) terms in the contributing terms to NconjtmpI and NconjtmpJ. The issue was present both in ::bondorder and ::bondorderLJ and led to energy conservation issues. It has been fixed by checking for the atom type before entering the offending calculations and adding clarifying comments. --- src/MANYBODY/pair_airebo.cpp | 32 ++++++++++++++++++++++++++++++++ src/USER-OMP/pair_airebo_omp.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index cc7efbcaa6..d83f5a39a8 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -1615,6 +1615,10 @@ double PairAIREBO::bondorder(int i, int j, double rij[3], if (vflag_atom) v_tally2(atomi,atomk,-tmp2,rik); + // due to kronecker(ktype, 0) term in contribution + // to NconjtmpI and later Nijconj + if (ktype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpI*dwik*SpN)/rikmag; f[atomi][0] -= tmp2*rik[0]; f[atomi][1] -= tmp2*rik[1]; @@ -1678,6 +1682,10 @@ double PairAIREBO::bondorder(int i, int j, double rij[3], if (vflag_atom) v_tally2(atomj,atoml,-tmp2,rjl); + // due to kronecker(ltype, 0) term in contribution + // to NconjtmpJ and later Nijconj + if (ltype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpJ*dwjl*SpN)/rjlmag; f[atomj][0] -= tmp2*rjl[0]; f[atomj][1] -= tmp2*rjl[1]; @@ -1960,6 +1968,10 @@ double PairAIREBO::bondorder(int i, int j, double rij[3], if (vflag_atom) v_tally2(atomi,atomk,-tmp2,rik); + // due to kronecker(ktype, 0) term in contribution + // to NconjtmpI and later Nijconj + if (ktype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpI*dwik*SpN)*Etmp/rikmag; f[atomi][0] -= tmp2*rik[0]; f[atomi][1] -= tmp2*rik[1]; @@ -2023,6 +2035,10 @@ double PairAIREBO::bondorder(int i, int j, double rij[3], if (vflag_atom) v_tally2(atomj,atoml,-tmp2,rjl); + // due to kronecker(ltype, 0) term in contribution + // to NconjtmpJ and later Nijconj + if (ltype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpJ*dwjl*SpN)*Etmp/rjlmag; f[atomj][0] -= tmp2*rjl[0]; f[atomj][1] -= tmp2*rjl[1]; @@ -2560,6 +2576,10 @@ double PairAIREBO::bondorderLJ(int i, int j, double rij[3], double rijmag, if (vflag_atom) v_tally2(atomi,atomk,-tmp2,rik); + // due to kronecker(ktype, 0) term in contribution + // to NconjtmpI and later Nijconj + if (ktype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpI*dwik*SpN)/rikmag; f[atomi][0] -= tmp2*rik[0]; f[atomi][1] -= tmp2*rik[1]; @@ -2623,6 +2643,10 @@ double PairAIREBO::bondorderLJ(int i, int j, double rij[3], double rijmag, if (vflag_atom) v_tally2(atomj,atoml,-tmp2,rjl); + // due to kronecker(ltype, 0) term in contribution + // to NconjtmpJ and later Nijconj + if (ltype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpJ*dwjl*SpN)/rjlmag; f[atomj][0] -= tmp2*rjl[0]; f[atomj][1] -= tmp2*rjl[1]; @@ -2895,6 +2919,10 @@ double PairAIREBO::bondorderLJ(int i, int j, double rij[3], double rijmag, if (vflag_atom) v_tally2(atomi,atomk,-tmp2,rik); + // due to kronecker(ktype, 0) term in contribution + // to NconjtmpI and later Nijconj + if (ktype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpI*dwik*SpN)*Etmp/rikmag; f[atomi][0] -= tmp2*rik[0]; f[atomi][1] -= tmp2*rik[1]; @@ -2958,6 +2986,10 @@ double PairAIREBO::bondorderLJ(int i, int j, double rij[3], double rijmag, if (vflag_atom) v_tally2(atomj,atoml,-tmp2,rjl); + // due to kronecker(ltype, 0) term in contribution + // to NconjtmpJ and later Nijconj + if (ltype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpJ*dwjl*SpN)*Etmp/rjlmag; f[atomj][0] -= tmp2*rjl[0]; f[atomj][1] -= tmp2*rjl[1]; diff --git a/src/USER-OMP/pair_airebo_omp.cpp b/src/USER-OMP/pair_airebo_omp.cpp index 95f9d8b401..206e8e86e6 100644 --- a/src/USER-OMP/pair_airebo_omp.cpp +++ b/src/USER-OMP/pair_airebo_omp.cpp @@ -1387,6 +1387,10 @@ double PairAIREBOOMP::bondorder_thr(int i, int j, double rij[3], double rijmag, if (vflag_atom) v_tally2_thr(atomi,atomk,-tmp2,rik,thr); + // due to kronecker(ktype, 0) term in contribution + // to NconjtmpI and later Nijconj + if (ktype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpI*dwik*SpN)/rikmag; f[atomi][0] -= tmp2*rik[0]; f[atomi][1] -= tmp2*rik[1]; @@ -1450,6 +1454,10 @@ double PairAIREBOOMP::bondorder_thr(int i, int j, double rij[3], double rijmag, if (vflag_atom) v_tally2_thr(atomj,atoml,-tmp2,rjl,thr); + // due to kronecker(ltype, 0) term in contribution + // to NconjtmpJ and later Nijconj + if (ltype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpJ*dwjl*SpN)/rjlmag; f[atomj][0] -= tmp2*rjl[0]; f[atomj][1] -= tmp2*rjl[1]; @@ -1732,6 +1740,10 @@ double PairAIREBOOMP::bondorder_thr(int i, int j, double rij[3], double rijmag, if (vflag_atom) v_tally2_thr(atomi,atomk,-tmp2,rik,thr); + // due to kronecker(ktype, 0) term in contribution + // to NconjtmpI and later Nijconj + if (ktype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpI*dwik*SpN)*Etmp/rikmag; f[atomi][0] -= tmp2*rik[0]; f[atomi][1] -= tmp2*rik[1]; @@ -1795,6 +1807,10 @@ double PairAIREBOOMP::bondorder_thr(int i, int j, double rij[3], double rijmag, if (vflag_atom) v_tally2_thr(atomj,atoml,-tmp2,rjl,thr); + // due to kronecker(ltype, 0) term in contribution + // to NconjtmpJ and later Nijconj + if (ltype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpJ*dwjl*SpN)*Etmp/rjlmag; f[atomj][0] -= tmp2*rjl[0]; f[atomj][1] -= tmp2*rjl[1]; @@ -2332,6 +2348,10 @@ double PairAIREBOOMP::bondorderLJ_thr(int i, int j, double rij[3], double rijmag if (vflag_atom) v_tally2_thr(atomi,atomk,-tmp2,rik,thr); + // due to kronecker(ktype, 0) term in contribution + // to NconjtmpI and later Nijconj + if (ktype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpI*dwik*SpN)/rikmag; f[atomi][0] -= tmp2*rik[0]; f[atomi][1] -= tmp2*rik[1]; @@ -2395,6 +2415,10 @@ double PairAIREBOOMP::bondorderLJ_thr(int i, int j, double rij[3], double rijmag if (vflag_atom) v_tally2_thr(atomj,atoml,-tmp2,rjl,thr); + // due to kronecker(ltype, 0) term in contribution + // to NconjtmpJ and later Nijconj + if (ltype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpJ*dwjl*SpN)/rjlmag; f[atomj][0] -= tmp2*rjl[0]; f[atomj][1] -= tmp2*rjl[1]; @@ -2667,6 +2691,10 @@ double PairAIREBOOMP::bondorderLJ_thr(int i, int j, double rij[3], double rijmag if (vflag_atom) v_tally2_thr(atomi,atomk,-tmp2,rik,thr); + // due to kronecker(ktype, 0) term in contribution + // to NconjtmpI and later Nijconj + if (ktype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpI*dwik*SpN)*Etmp/rikmag; f[atomi][0] -= tmp2*rik[0]; f[atomi][1] -= tmp2*rik[1]; @@ -2730,6 +2758,10 @@ double PairAIREBOOMP::bondorderLJ_thr(int i, int j, double rij[3], double rijmag if (vflag_atom) v_tally2_thr(atomj,atoml,-tmp2,rjl,thr); + // due to kronecker(ltype, 0) term in contribution + // to NconjtmpJ and later Nijconj + if (ltype != 0) continue; + tmp2 = VA*dN3[2]*(2.0*NconjtmpJ*dwjl*SpN)*Etmp/rjlmag; f[atomj][0] -= tmp2*rjl[0]; f[atomj][1] -= tmp2*rjl[1]; From d2b65590392e5782ebb2217129d78d555a7dd3c8 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Wed, 31 May 2017 10:52:03 -0600 Subject: [PATCH 118/302] Fixing issue in fix_qeq_reax --- src/USER-REAXC/fix_qeq_reax.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index cf2e6612a2..9d165f3fd3 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -140,12 +140,12 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : FixQEqReax::~FixQEqReax() { + if (copymode) return; + delete[] pertype_option; // unregister callbacks to this fix from Atom class - if (copymode) return; - atom->delete_callback(id,0); memory->destroy(s_hist); From af5f19604cceb62f547132c723de6ea49d9aaf6e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 31 May 2017 23:36:39 -0400 Subject: [PATCH 119/302] remove no longer correct sentence from set command docs --- doc/src/set.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/src/set.txt b/doc/src/set.txt index 0b428d56ed..14460c9741 100644 --- a/doc/src/set.txt +++ b/doc/src/set.txt @@ -364,9 +364,8 @@ A value of -1 means subtract 1 box length to get the true value. LAMMPS updates these flags as atoms cross periodic boundaries during the simulation. The flags can be output with atom snapshots via the "dump"_dump.html command. If a value of NULL is specified for any of -nx,ny,nz, then the current image value for that dimension is -unchanged. For non-periodic dimensions only a value of 0 can be -specified. This keyword does not allow use of atom-style variables. +nx,ny,nz, then the current image value for that dimension is unchanged. +For non-periodic dimensions only a value of 0 can be specified. This command can be useful after a system has been equilibrated and atoms have diffused one or more box lengths in various directions. This command can then reset the image values for atoms so that they From f59ee5bd62c7a830991ae63c54c9b45cab5ef4a2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 2 Jun 2017 08:45:15 -0400 Subject: [PATCH 120/302] enable support for dynamic groups in fix planeforce and fix lineforce --- src/fix_lineforce.cpp | 2 ++ src/fix_planeforce.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/fix_lineforce.cpp b/src/fix_lineforce.cpp index f82ed957f7..1e78bf3ec3 100644 --- a/src/fix_lineforce.cpp +++ b/src/fix_lineforce.cpp @@ -29,6 +29,8 @@ using namespace FixConst; FixLineForce::FixLineForce(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) { + dynamic_group_allow = 1; + if (narg != 6) error->all(FLERR,"Illegal fix lineforce command"); xdir = force->numeric(FLERR,arg[3]); ydir = force->numeric(FLERR,arg[4]); diff --git a/src/fix_planeforce.cpp b/src/fix_planeforce.cpp index 872bd98716..5e999c888c 100644 --- a/src/fix_planeforce.cpp +++ b/src/fix_planeforce.cpp @@ -29,6 +29,8 @@ using namespace FixConst; FixPlaneForce::FixPlaneForce(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) { + dynamic_group_allow = 1; + if (narg != 6) error->all(FLERR,"Illegal fix planeforce command"); xdir = force->numeric(FLERR,arg[3]); ydir = force->numeric(FLERR,arg[4]); From e03cc994673e6b43ef41368f772d46f9ba3b7086 Mon Sep 17 00:00:00 2001 From: Emile Maras Date: Fri, 2 Jun 2017 23:42:16 +0200 Subject: [PATCH 121/302] made the command options more lammps standard style --- doc/src/fix_neb.txt | 54 +++++++++++++++++++++------------ examples/neb/in.neb.hop1 | 2 +- examples/neb/in.neb.hop1freeend | 2 +- examples/neb/in.neb.hop2 | 2 +- examples/neb/in.neb.sivac | 2 +- src/REPLICA/fix_neb.cpp | 49 +++++++++++++++++------------- src/REPLICA/fix_neb.h | 2 +- 7 files changed, 67 insertions(+), 46 deletions(-) diff --git a/doc/src/fix_neb.txt b/doc/src/fix_neb.txt index a5c4bf4396..cd0fa23e85 100644 --- a/doc/src/fix_neb.txt +++ b/doc/src/fix_neb.txt @@ -12,22 +12,33 @@ fix neb command :h3 fix ID group-ID neb Kspring keyword value :pre -ID, group-ID are documented in "fix"_fix.html command -neb = style name of this fix command -Kspring = parallel spring constant (force/distance units) -keyword = {idealpos} or {neigh} or {perp} or {freeend} :ul - {idealpos} = each replica is attached with a spring to its interpolated ideal position (default) - {neigh} = each replica is connected with spring to the previous and next replica. - {perp} value = set spring constant for the perpendicular spring to {value} - {freeend} flag = set behavior for the end points - flag = {ini} or {final} or {finaleini} or {final2eini} +ID, group-ID are documented in "fix"_fix.html command :ulb,l +neb = style name of this fix command :l +Kspring = parallel spring constant (force/distance units or force units) :l +zero or more keyword/value pairs may be appended :l +keyword = {nudg_style} or {perp} or {freend} or {freend_k_spring} :l + {nudg_style} value = {neigh} or {idealpos} + {neigh} = the parallel nudging force is calculated from the distance to neighbouring replicas (in this case, Kspring is in force/distance units) + {idealpos} = the parallel nudging force is proportional to the distance between the replica and its interpolated ideal position (in this case Kspring is in force units) + {perp} value {none} or kspring2 + {none} = no perpendicular spring force is applied + {freeend} value = {none} or {ini} or {final} or {finaleini} or {final2eini} + {none} = no nudging force is apply to the first and last replicas + {ini} = set the first replica to be a free end + {final} = set the last replica to be a free end + {finaleini} = set the last replica to be a free end and set its target energy as that of the first replica + {final2eini} = same as {finaleini} plus prevent intermediate replicas to have a lower energy than the first replica + {freeend_kspring} value = kspring2 + kspring2 = spring constant of the perpendicular spring force (per distance units) +flag = set behavior for the end points + flag = :pre [Examples:] fix 1 active neb 10.0 fix 2 all neb 1.0 perp 1.0 freeend final -fix 1 all neb 1.0 neigh freeend final2eini :pre +fix 1 all neb 1.0 nudg_style idealpos freeend final2eini freend_kspring 1:pre [Description:] @@ -109,11 +120,11 @@ replica, a free end neb calculation with the value {finaleini} or :line -The keywords {idealpos} and {neigh} allow to specify how to parallel -spring force is computed. If the keyword {idealpos} is used or by -default, the spring force is computed as suggested in "(E)"_#E : +The keyword {nudg_style} allow to specify how to parallel +nudging force is computed. With a value of idealpos, the spring +force is computed as suggested in "(E)"_#E : -Fspringparallel=-{Kspring}* (RD-RDideal)/(2 meanDist) :pre +Fnudgparallel=-{Kspring}* (RD-RDideal)/(2 meanDist) :pre where RD is the "reaction coordinate" see "neb"_neb.html section, and RDideal is the ideal RD for which all the images are equally spaced @@ -121,13 +132,14 @@ RDideal is the ideal RD for which all the images are equally spaced is the replica number). The meanDist is the average distance between replicas. -If the keyword {neigh} is used, the parallel spring force is computed -as in "(Henkelman1)"_#Henkelman1 by connecting each intermediate -replica with the previous and the next image: +When {nudg_style} has a value of neigh (or by default), the parallel +nudging force is computed as in "(Henkelman1)"_#Henkelman1 by +connecting each intermediate replica with the previous and the next +image: -Fspringparallel= {Kspring}* (|Ri+1 - Ri| - |Ri - Ri-1|) :pre +Fnudgparallel= {Kspring}* (|Ri+1 - Ri| - |Ri - Ri-1|) :pre -The parallel spring force associated with the key word idealpos should +The parallel nudging force associated with the key word idealpos should usually be more efficient at keeping the images equally spaced. :line @@ -172,7 +184,9 @@ for more info on packages. [Default:] -none +The option defaults are nudg_style = neigh, perp = none, freeend = none and freend_kspring = 1. + +:line :link(Henkelman1) [(Henkelman1)] Henkelman and Jonsson, J Chem Phys, 113, 9978-9985 (2000). diff --git a/examples/neb/in.neb.hop1 b/examples/neb/in.neb.hop1 index 495b2faa93..b874d1ba32 100644 --- a/examples/neb/in.neb.hop1 +++ b/examples/neb/in.neb.hop1 @@ -51,7 +51,7 @@ set group nebatoms type 3 group nonneb subtract all nebatoms fix 1 lower setforce 0.0 0.0 0.0 -fix 2 nebatoms neb 1.0 neigh +fix 2 nebatoms neb 1.0 nudg_style idealpos fix 3 all enforce2d thermo 100 diff --git a/examples/neb/in.neb.hop1freeend b/examples/neb/in.neb.hop1freeend index fc0677f30a..fa90e9a98c 100644 --- a/examples/neb/in.neb.hop1freeend +++ b/examples/neb/in.neb.hop1freeend @@ -41,7 +41,7 @@ set group nebatoms type 3 group nonneb subtract all nebatoms fix 1 lower setforce 0.0 0.0 0.0 -fix 2 nebatoms neb 1.0 freeend ini +fix 2 nebatoms neb 1.0 nudg_style idealpos freeend ini fix 3 all enforce2d thermo 100 diff --git a/examples/neb/in.neb.hop2 b/examples/neb/in.neb.hop2 index 9a8986f454..242de759fa 100644 --- a/examples/neb/in.neb.hop2 +++ b/examples/neb/in.neb.hop2 @@ -53,7 +53,7 @@ set group nebatoms type 3 group nonneb subtract all nebatoms fix 1 lower setforce 0.0 0.0 0.0 -fix 2 nebatoms neb 1.0 neigh +fix 2 nebatoms neb 1.0 fix 3 all enforce2d thermo 100 diff --git a/examples/neb/in.neb.sivac b/examples/neb/in.neb.sivac index 2fdf46f9d5..941d063b90 100644 --- a/examples/neb/in.neb.sivac +++ b/examples/neb/in.neb.sivac @@ -66,7 +66,7 @@ minimize 1.0e-6 1.0e-4 1000 10000 reset_timestep 0 -fix 1 all neb 1.0 neigh +fix 1 all neb 1.0 thermo 100 diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index f66167f2a2..b17315ca0d 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -46,12 +46,13 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : displacements(NULL) { - NEBLongRange=true; - StandardNEB=PerpSpring=FreeEndIni=FreeEndFinal=false; + NEBLongRange=false; + StandardNEB=true; + PerpSpring=FreeEndIni=FreeEndFinal=false; FreeEndFinalWithRespToEIni=FinalAndInterWithRespToEIni=false; kspringPerp=0.0; - + kspring2=1.0; if (narg < 4) error->all(FLERR,"Illegal fix neb command, argument missing"); @@ -62,21 +63,23 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : int iarg =4; while (iarg < narg) { - if (strcmp (arg[iarg],"idealpos")==0) { - NEBLongRange = true; - iarg+=1; - } else if (strcmp (arg[iarg],"neigh")==0) { - NEBLongRange = false; - StandardNEB = true; - iarg+=1; - } else if (strcmp (arg[iarg],"perp")==0) { + if (strcmp (arg[iarg],"nudg_style")==0) { + if (strcmp (arg[iarg+1],"idealpos")==0) { + NEBLongRange = true; + iarg+=2;} + else if (strcmp (arg[iarg+1],"neigh")==0) { + NEBLongRange = false; + StandardNEB = true; + iarg+=2;} + else error->all(FLERR,"Illegal fix neb command. Unknown keyword");} + else if (strcmp (arg[iarg],"perp")==0) { PerpSpring=true; kspringPerp = force->numeric(FLERR,arg[iarg+1]); if (kspringPerp < 0.0) error->all(FLERR,"Illegal fix neb command. " "The perpendicular spring force was not provided properly"); - iarg+=2; - } else if (strcmp (arg[iarg],"freeend")==0) { + iarg+=2;} + else if (strcmp (arg[iarg],"freeend")==0) { if (strcmp (arg[iarg+1],"ini")==0) FreeEndIni=true; else if (strcmp (arg[iarg+1],"final")==0) @@ -86,8 +89,12 @@ FixNEB::FixNEB(LAMMPS *lmp, int narg, char **arg) : else if (strcmp (arg[iarg+1],"final2eini")==0) { FinalAndInterWithRespToEIni=true; FreeEndFinalWithRespToEIni=true;} - iarg+=2; - } else error->all(FLERR,"Illegal fix neb command. Unknown keyword"); + else if (strcmp (arg[iarg+1],"none")!=0) error->all(FLERR,"Illegal fix neb command. Unknown keyword"); + iarg+=2;} + else if (strcmp (arg[iarg],"freeend_kspring")==0) { + kspring2=force->numeric(FLERR,arg[iarg+1]); + iarg+=2; } + else error->all(FLERR,"Illegal fix neb command. Unknown keyword"); } // nreplica = number of partitions @@ -468,8 +475,8 @@ void FixNEB::min_post_force(int vflag) MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); dot=dotall/tlen; - if (dot<0) prefactor = -dot - (veng-EIniIni); - else prefactor = -dot + (veng-EIniIni); + if (dot<0) prefactor = -dot - kspring2*(veng-EIniIni); + else prefactor = -dot + kspring2*(veng-EIniIni); for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { @@ -486,8 +493,8 @@ void FixNEB::min_post_force(int vflag) MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); dot=dotall/tlen; - if (dot<0) prefactor = -dot - (veng-EFinalIni); - else prefactor = -dot + (veng-EFinalIni); + if (dot<0) prefactor = -dot - kspring2*(veng-EFinalIni); + else prefactor = -dot + kspring2*(veng-EFinalIni); for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { @@ -504,8 +511,8 @@ void FixNEB::min_post_force(int vflag) MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); dot=dotall/tlen; - if (dot<0) prefactor = -dot - (veng-vIni); - else prefactor = -dot + (veng-vIni); + if (dot<0) prefactor = -dot - kspring2*(veng-vIni); + else prefactor = -dot + kspring2*(veng-vIni); for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { diff --git a/src/REPLICA/fix_neb.h b/src/REPLICA/fix_neb.h index 1582912dac..7e9e6db865 100644 --- a/src/REPLICA/fix_neb.h +++ b/src/REPLICA/fix_neb.h @@ -38,7 +38,7 @@ class FixNEB : public Fix { private: int me,nprocs,nprocs_universe; - double kspring,kspringPerp,EIniIni,EFinalIni; + double kspring,kspring2,kspringPerp,EIniIni,EFinalIni; bool StandardNEB,NEBLongRange,PerpSpring,FreeEndIni,FreeEndFinal; bool FreeEndFinalWithRespToEIni,FinalAndInterWithRespToEIni; int ireplica,nreplica; From ff58ccac2870341b1ca911f056853c150d510394 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 4 Jun 2017 21:21:32 -0400 Subject: [PATCH 122/302] add clarification to impact of special bonds to manybody potentials --- doc/src/special_bonds.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/src/special_bonds.txt b/doc/src/special_bonds.txt index 6924b321a0..6a661015bd 100644 --- a/doc/src/special_bonds.txt +++ b/doc/src/special_bonds.txt @@ -65,7 +65,13 @@ sense to define permanent bonds between atoms that interact via these potentials, though such bonds may exist elsewhere in your system, e.g. when using the "pair_style hybrid"_pair_hybrid.html command. Thus LAMMPS ignores special_bonds settings when manybody potentials -are calculated. +are calculated. Please note, that the existence of explicit bonds +for atoms that are described by a manybody potential will alter the +neigborlist and thus can render the computation of those interactions +invalid, since those pairs are not only used to determine direct +pairwise interactions but also neighbors of neighbors and more. +The recommended course of action is to remove such bonds, or - if +that is not possible - use a special bonds setting of 1.0 1.0 1.0. NOTE: Unlike some commands in LAMMPS, you cannot use this command multiple times in an incremental fashion: e.g. to first set the LJ From 95d6f05a764ef646e733818301f0fd8c0d1e08bb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 Jun 2017 12:41:37 -0400 Subject: [PATCH 123/302] add 3 APIs to Modify for checking if atoms overlap with any rigid fixes --- src/modify.cpp | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/modify.h | 3 ++ 2 files changed, 95 insertions(+) diff --git a/src/modify.cpp b/src/modify.cpp index 7af4576038..4422ee6890 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -23,6 +23,7 @@ #include "group.h" #include "update.h" #include "domain.h" +#include "region.h" #include "input.h" #include "variable.h" #include "memory.h" @@ -995,6 +996,97 @@ int Modify::check_package(const char *package_fix_name) return 1; } + +/* ---------------------------------------------------------------------- + check if the group indicated by groupbit overlaps with any + currently existing rigid fixes. return 1 in this case otherwise 0 +------------------------------------------------------------------------- */ + +int Modify::check_rigid_group_overlap(int groupbit) +{ + const int * const mask = atom->mask; + const int nlocal = atom->nlocal; + + int n = 0; + for (int ifix = 0; ifix < nfix; ifix++) { + if (strncmp("rigid",fix[ifix]->style,5) == 0) { + const int bothbits = groupbit | fix[ifix]->groupbit; + for (int i=0; i < nlocal; ++i) + if (mask[i] & bothbits) {++n; break;} + if (n > 0) break; + } + } + + int n_all = 0; + MPI_Allreduce(&n,&n_all,1,MPI_INT,MPI_SUM,world); + + if (n_all > 0) return 1; + return 0; +} + +/* ---------------------------------------------------------------------- + check if the atoms in the region indicated by regionid overlap with any + currently existing rigid fixes. return 1 in this case otherwise 0 +------------------------------------------------------------------------- */ + +int Modify::check_rigid_region_overlap(Region *reg) +{ + const int * const mask = atom->mask; + const double * const * const x = atom->x; + const int nlocal = atom->nlocal; + + int n = 0; + reg->prematch(); + for (int ifix = 0; ifix < nfix; ifix++) { + if (strncmp("rigid",fix[ifix]->style,5) == 0) { + const int groupbit = fix[ifix]->groupbit; + for (int i=0; i < nlocal; ++i) + if ((mask[i] & groupbit) && reg->match(x[i][0],x[i][1],x[i][2])) { + ++n; + break; + } + if (n > 0) break; + } + } + + int n_all = 0; + MPI_Allreduce(&n,&n_all,1,MPI_INT,MPI_SUM,world); + + if (n_all > 0) return 1; + return 0; +} + +/* ---------------------------------------------------------------------- + check if the atoms in the selection list (length atom->nlocal, + content: 1 if atom is contained, 0 if not) overlap with currently + existing rigid fixes. return 1 in this case otherwise 0 +------------------------------------------------------------------------- */ + +int Modify::check_rigid_list_overlap(int *select) +{ + const int * const mask = atom->mask; + const int nlocal = atom->nlocal; + + int n = 0; + for (int ifix = 0; ifix < nfix; ifix++) { + if (strncmp("rigid",fix[ifix]->style,5) == 0) { + const int groupbit = fix[ifix]->groupbit; + for (int i=0; i < nlocal; ++i) + if ((mask[i] & groupbit) && select[i]) { + ++n; + break; + } + if (n > 0) break; + } + } + + int n_all = 0; + MPI_Allreduce(&n,&n_all,1,MPI_INT,MPI_SUM,world); + + if (n_all > 0) return 1; + return 0; +} + /* ---------------------------------------------------------------------- add a new compute ------------------------------------------------------------------------- */ diff --git a/src/modify.h b/src/modify.h index 3ded3cbab6..2ad244f8fb 100644 --- a/src/modify.h +++ b/src/modify.h @@ -98,6 +98,9 @@ class Modify : protected Pointers { int find_fix(const char *); int find_fix_by_style(const char *); int check_package(const char *); + int check_rigid_group_overlap(int); + int check_rigid_region_overlap(class Region *); + int check_rigid_list_overlap(int *); void add_compute(int, char **, int trysuffix=1); void modify_compute(int, char **); From 968de8548c1aca6782a465578c0297783a87d3ce Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 Jun 2017 13:06:53 -0400 Subject: [PATCH 124/302] apply test for overlap with rigid bodies to set and velocity command --- src/set.cpp | 22 ++++++++++++++++++++++ src/velocity.cpp | 6 ++++++ 2 files changed, 28 insertions(+) diff --git a/src/set.cpp b/src/set.cpp index 4ed07d423b..629f325d35 100644 --- a/src/set.cpp +++ b/src/set.cpp @@ -585,6 +585,28 @@ void Set::set(int keyword) } } + // check if properties of atoms in rigid bodies are updated + // that are cached as per-body data. + switch (keyword) { + case X: + case Y: + case Z: + case MOLECULE: + case MASS: + case ANGMOM: + case SHAPE: + case DIAMETER: + case DENSITY: + case QUAT: + case IMAGE: + if (modify->check_rigid_list_overlap(select)) + error->warning(FLERR,"Changing a property of atoms in rigid bodies " + "that has no effect unless rigid bodies are rebuild"); + break; + default: // assume no conflict for all other properties + break; + } + // loop over selected atoms AtomVecEllipsoid *avec_ellipsoid = diff --git a/src/velocity.cpp b/src/velocity.cpp index 82b6efbe1b..260a11bb4e 100644 --- a/src/velocity.cpp +++ b/src/velocity.cpp @@ -68,6 +68,12 @@ void Velocity::command(int narg, char **arg) if (igroup == -1) error->all(FLERR,"Could not find velocity group ID"); groupbit = group->bitmask[igroup]; + // check if velocities of atoms in rigid bodies are updated + + if (modify->check_rigid_group_overlap(groupbit)) + error->warning(FLERR,"Changing velocities of atoms in rigid bodies. " + "This has no effect unless rigid bodies are rebuild"); + // identify style if (strcmp(arg[1],"create") == 0) style = CREATE; From 90ca0852c798243e3217e2395cf4acaa7c2fc145 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 Jun 2017 15:48:23 -0400 Subject: [PATCH 125/302] use "body" list via Fix::extract() to correctly identify atoms in bodies --- src/modify.cpp | 36 +++++++++++++++++++++++++++--------- src/modify.h | 2 +- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/modify.cpp b/src/modify.cpp index 4422ee6890..b390b7f89a 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -1006,13 +1006,20 @@ int Modify::check_rigid_group_overlap(int groupbit) { const int * const mask = atom->mask; const int nlocal = atom->nlocal; + int dim; int n = 0; for (int ifix = 0; ifix < nfix; ifix++) { if (strncmp("rigid",fix[ifix]->style,5) == 0) { const int bothbits = groupbit | fix[ifix]->groupbit; - for (int i=0; i < nlocal; ++i) - if (mask[i] & bothbits) {++n; break;} + const int * const body = (const int *)fix[ifix]->extract("body",dim); + if ((body == NULL) || (dim != 1)) break; + + for (int i=0; i < nlocal; ++i) { + if (((mask[i] & bothbits) == bothbits) && (body[i] >= 0)) { + ++n; break; + } + } if (n > 0) break; } } @@ -1025,23 +1032,29 @@ int Modify::check_rigid_group_overlap(int groupbit) } /* ---------------------------------------------------------------------- - check if the atoms in the region indicated by regionid overlap with any - currently existing rigid fixes. return 1 in this case otherwise 0 + check if the atoms in the group indicated by groupbit _and_ region + indicated by regionid overlap with any currently existing rigid fixes. + return 1 in this case, otherwise 0 ------------------------------------------------------------------------- */ -int Modify::check_rigid_region_overlap(Region *reg) +int Modify::check_rigid_region_overlap(int groupbit, Region *reg) { const int * const mask = atom->mask; const double * const * const x = atom->x; const int nlocal = atom->nlocal; + int dim; int n = 0; reg->prematch(); for (int ifix = 0; ifix < nfix; ifix++) { if (strncmp("rigid",fix[ifix]->style,5) == 0) { - const int groupbit = fix[ifix]->groupbit; + const int bothbits = groupbit | fix[ifix]->groupbit; + const int * const body = (const int *)fix[ifix]->extract("body",dim); + if ((body == NULL) || (dim != 1)) break; + for (int i=0; i < nlocal; ++i) - if ((mask[i] & groupbit) && reg->match(x[i][0],x[i][1],x[i][2])) { + if (((mask[i] & bothbits) == bothbits) && (body[i] >= 0) + && reg->match(x[i][0],x[i][1],x[i][2])) { ++n; break; } @@ -1066,16 +1079,21 @@ int Modify::check_rigid_list_overlap(int *select) { const int * const mask = atom->mask; const int nlocal = atom->nlocal; + int dim; int n = 0; for (int ifix = 0; ifix < nfix; ifix++) { if (strncmp("rigid",fix[ifix]->style,5) == 0) { const int groupbit = fix[ifix]->groupbit; - for (int i=0; i < nlocal; ++i) - if ((mask[i] & groupbit) && select[i]) { + const int * const body = (const int *)fix[ifix]->extract("body",dim); + if ((body == NULL) || (dim != 1)) break; + + for (int i=0; i < nlocal; ++i) { + if ((mask[i] & groupbit) && (body[i] >= 0) && select[i]) { ++n; break; } + } if (n > 0) break; } } diff --git a/src/modify.h b/src/modify.h index 2ad244f8fb..d825d5c4ef 100644 --- a/src/modify.h +++ b/src/modify.h @@ -99,7 +99,7 @@ class Modify : protected Pointers { int find_fix_by_style(const char *); int check_package(const char *); int check_rigid_group_overlap(int); - int check_rigid_region_overlap(class Region *); + int check_rigid_region_overlap(int, class Region *); int check_rigid_list_overlap(int *); void add_compute(int, char **, int trysuffix=1); From ed50bd225494d05a9caf05a0e935ac6f81ec7d2f Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Mon, 5 Jun 2017 13:54:13 -0600 Subject: [PATCH 126/302] Removing unnecessary fences --- src/KOKKOS/angle_charmm_kokkos.cpp | 1 - src/KOKKOS/bond_class2_kokkos.cpp | 1 - src/KOKKOS/bond_fene_kokkos.cpp | 1 - src/KOKKOS/bond_harmonic_kokkos.cpp | 1 - src/KOKKOS/compute_temp_kokkos.cpp | 2 - src/KOKKOS/dihedral_charmm_kokkos.cpp | 1 - src/KOKKOS/dihedral_class2_kokkos.cpp | 1 - src/KOKKOS/dihedral_opls_kokkos.cpp | 1 - src/KOKKOS/fix_langevin_kokkos.cpp | 4 -- src/KOKKOS/fix_nh_kokkos.cpp | 4 -- src/KOKKOS/fix_nve_kokkos.cpp | 2 - src/KOKKOS/fix_qeq_reax_kokkos.cpp | 38 ------------------ src/KOKKOS/fix_setforce_kokkos.cpp | 2 - src/KOKKOS/fix_wall_reflect_kokkos.cpp | 1 - src/KOKKOS/improper_class2_kokkos.cpp | 2 - src/KOKKOS/improper_harmonic_kokkos.cpp | 1 - src/KOKKOS/pair_eam_alloy_kokkos.cpp | 2 - src/KOKKOS/pair_eam_fs_kokkos.cpp | 7 ---- src/KOKKOS/pair_eam_kokkos.cpp | 2 - src/KOKKOS/pair_reaxc_kokkos.cpp | 31 --------------- src/KOKKOS/pppm_kokkos.cpp | 51 ------------------------- 21 files changed, 156 deletions(-) diff --git a/src/KOKKOS/angle_charmm_kokkos.cpp b/src/KOKKOS/angle_charmm_kokkos.cpp index 346077e071..8dd22022d8 100644 --- a/src/KOKKOS/angle_charmm_kokkos.cpp +++ b/src/KOKKOS/angle_charmm_kokkos.cpp @@ -111,7 +111,6 @@ void AngleCharmmKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,nanglelist),*this); } } - DeviceType::fence(); if (eflag_global) energy += ev.evdwl; if (vflag_global) { diff --git a/src/KOKKOS/bond_class2_kokkos.cpp b/src/KOKKOS/bond_class2_kokkos.cpp index b01af92b5f..b3c11c9a06 100644 --- a/src/KOKKOS/bond_class2_kokkos.cpp +++ b/src/KOKKOS/bond_class2_kokkos.cpp @@ -110,7 +110,6 @@ void BondClass2Kokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,nbondlist),*this); } } - //DeviceType::fence(); if (eflag_global) energy += ev.evdwl; if (vflag_global) { diff --git a/src/KOKKOS/bond_fene_kokkos.cpp b/src/KOKKOS/bond_fene_kokkos.cpp index cfc37bfa9f..025838340b 100644 --- a/src/KOKKOS/bond_fene_kokkos.cpp +++ b/src/KOKKOS/bond_fene_kokkos.cpp @@ -125,7 +125,6 @@ void BondFENEKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,nbondlist),*this); } } - DeviceType::fence(); k_warning_flag.template modify(); k_warning_flag.template sync(); diff --git a/src/KOKKOS/bond_harmonic_kokkos.cpp b/src/KOKKOS/bond_harmonic_kokkos.cpp index 408f59c563..da45c70d6c 100644 --- a/src/KOKKOS/bond_harmonic_kokkos.cpp +++ b/src/KOKKOS/bond_harmonic_kokkos.cpp @@ -111,7 +111,6 @@ void BondHarmonicKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,nbondlist),*this); } } - //DeviceType::fence(); if (eflag_global) energy += ev.evdwl; if (vflag_global) { diff --git a/src/KOKKOS/compute_temp_kokkos.cpp b/src/KOKKOS/compute_temp_kokkos.cpp index 6a24591d6c..2ea67a1fb1 100644 --- a/src/KOKKOS/compute_temp_kokkos.cpp +++ b/src/KOKKOS/compute_temp_kokkos.cpp @@ -63,7 +63,6 @@ double ComputeTempKokkos::compute_scalar() Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,nlocal),*this,t_kk); else Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,nlocal),*this,t_kk); - DeviceType::fence(); copymode = 0; t = t_kk.t0; // could make this more efficient @@ -118,7 +117,6 @@ void ComputeTempKokkos::compute_vector() Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,nlocal),*this,t_kk); else Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,nlocal),*this,t_kk); - DeviceType::fence(); copymode = 0; t[0] = t_kk.t0; diff --git a/src/KOKKOS/dihedral_charmm_kokkos.cpp b/src/KOKKOS/dihedral_charmm_kokkos.cpp index ee9e3d1244..a8a8aade60 100644 --- a/src/KOKKOS/dihedral_charmm_kokkos.cpp +++ b/src/KOKKOS/dihedral_charmm_kokkos.cpp @@ -132,7 +132,6 @@ void DihedralCharmmKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,ndihedrallist),*this); } } - DeviceType::fence(); // error check diff --git a/src/KOKKOS/dihedral_class2_kokkos.cpp b/src/KOKKOS/dihedral_class2_kokkos.cpp index edfd1b3395..89e42c6f83 100644 --- a/src/KOKKOS/dihedral_class2_kokkos.cpp +++ b/src/KOKKOS/dihedral_class2_kokkos.cpp @@ -159,7 +159,6 @@ void DihedralClass2Kokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,ndihedrallist),*this); } } - DeviceType::fence(); // error check diff --git a/src/KOKKOS/dihedral_opls_kokkos.cpp b/src/KOKKOS/dihedral_opls_kokkos.cpp index 8e222ad860..e37d4d2ef5 100644 --- a/src/KOKKOS/dihedral_opls_kokkos.cpp +++ b/src/KOKKOS/dihedral_opls_kokkos.cpp @@ -121,7 +121,6 @@ void DihedralOPLSKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,ndihedrallist),*this); } } - DeviceType::fence(); // error check diff --git a/src/KOKKOS/fix_langevin_kokkos.cpp b/src/KOKKOS/fix_langevin_kokkos.cpp index 0572dcedbe..fb0f329a91 100644 --- a/src/KOKKOS/fix_langevin_kokkos.cpp +++ b/src/KOKKOS/fix_langevin_kokkos.cpp @@ -506,7 +506,6 @@ void FixLangevinKokkos::post_force(int vflag) Kokkos::parallel_for(nlocal,post_functor); } - DeviceType::fence(); if(tbiasflag == BIAS){ atomKK->sync(temperature->execution_space,temperature->datamask_read); @@ -531,7 +530,6 @@ void FixLangevinKokkos::post_force(int vflag) // set total force zero in parallel on the device FixLangevinKokkosZeroForceFunctor zero_functor(this); Kokkos::parallel_for(nlocal,zero_functor); - DeviceType::fence(); } // f is modified by both post_force and zero_force functors atomKK->modified(execution_space,datamask_modify); @@ -726,7 +724,6 @@ double FixLangevinKokkos::compute_scalar() k_flangevin.template sync(); FixLangevinKokkosTallyEnergyFunctor scalar_functor(this); Kokkos::parallel_reduce(nlocal,scalar_functor,energy_onestep); - DeviceType::fence(); energy = 0.5*energy_onestep*update->dt; } @@ -770,7 +767,6 @@ void FixLangevinKokkos::end_of_step() k_flangevin.template sync(); FixLangevinKokkosTallyEnergyFunctor tally_functor(this); Kokkos::parallel_reduce(nlocal,tally_functor,energy_onestep); - DeviceType::fence(); energy += energy_onestep*update->dt; } diff --git a/src/KOKKOS/fix_nh_kokkos.cpp b/src/KOKKOS/fix_nh_kokkos.cpp index 2b55259365..fb03bf68c6 100644 --- a/src/KOKKOS/fix_nh_kokkos.cpp +++ b/src/KOKKOS/fix_nh_kokkos.cpp @@ -495,7 +495,6 @@ void FixNHKokkos::nh_v_press() Kokkos::parallel_for(Kokkos::RangePolicy >(0,nlocal),*this); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,nlocal),*this); - DeviceType::fence(); copymode = 0; atomKK->modified(execution_space,V_MASK); @@ -550,7 +549,6 @@ void FixNHKokkos::nve_v() Kokkos::parallel_for(Kokkos::RangePolicy >(0,nlocal),*this); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,nlocal),*this); - DeviceType::fence(); copymode = 0; } @@ -595,7 +593,6 @@ void FixNHKokkos::nve_x() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); copymode = 0; } @@ -631,7 +628,6 @@ void FixNHKokkos::nh_v_temp() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); copymode = 0; atomKK->modified(execution_space,V_MASK); diff --git a/src/KOKKOS/fix_nve_kokkos.cpp b/src/KOKKOS/fix_nve_kokkos.cpp index 4c041f85b0..eb41443bab 100644 --- a/src/KOKKOS/fix_nve_kokkos.cpp +++ b/src/KOKKOS/fix_nve_kokkos.cpp @@ -76,7 +76,6 @@ void FixNVEKokkos::initial_integrate(int vflag) FixNVEKokkosInitialIntegrateFunctor functor(this); Kokkos::parallel_for(nlocal,functor); } - DeviceType::fence(); } template @@ -133,7 +132,6 @@ void FixNVEKokkos::final_integrate() FixNVEKokkosFinalIntegrateFunctor functor(this); Kokkos::parallel_for(nlocal,functor); } - DeviceType::fence(); // debug //atomKK->sync(Host,datamask_read); diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.cpp b/src/KOKKOS/fix_qeq_reax_kokkos.cpp index 2e46b85fd2..5cafbd2ef3 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reax_kokkos.cpp @@ -234,12 +234,10 @@ void FixQEqReaxKokkos::pre_force(int vflag) // compute_H FixQEqReaxKokkosComputeHFunctor computeH_functor(this); Kokkos::parallel_scan(inum,computeH_functor); - DeviceType::fence(); // init_matvec FixQEqReaxKokkosMatVecFunctor matvec_functor(this); Kokkos::parallel_for(inum,matvec_functor); - DeviceType::fence(); // comm->forward_comm_fix(this); //Dist_vector( s ); pack_flag = 2; @@ -259,15 +257,12 @@ void FixQEqReaxKokkos::pre_force(int vflag) // 1st cg solve over b_s, s cg_solve1(); - DeviceType::fence(); // 2nd cg solve over b_t, t cg_solve2(); - DeviceType::fence(); // calculate_Q(); calculate_q(); - DeviceType::fence(); copymode = 0; @@ -354,7 +349,6 @@ void FixQEqReaxKokkos::allocate_array() const int ignum = atom->nlocal + atom->nghost; FixQEqReaxKokkosZeroFunctor zero_functor(this); Kokkos::parallel_for(ignum,zero_functor); - DeviceType::fence(); } /* ---------------------------------------------------------------------- */ @@ -499,10 +493,8 @@ void FixQEqReaxKokkos::cg_solve1() // sparse_matvec( &H, x, q ); FixQEqReaxKokkosSparse12Functor sparse12_functor(this); Kokkos::parallel_for(inum,sparse12_functor); - DeviceType::fence(); if (neighflag != FULL) { Kokkos::parallel_for(Kokkos::RangePolicy(nlocal,nlocal+atom->nghost),*this); - DeviceType::fence(); if (neighflag == HALF) { FixQEqReaxKokkosSparse13Functor sparse13_functor(this); Kokkos::parallel_for(inum,sparse13_functor); @@ -513,7 +505,6 @@ void FixQEqReaxKokkos::cg_solve1() } else { Kokkos::parallel_for(Kokkos::TeamPolicy (inum, teamsize), *this); } - DeviceType::fence(); if (neighflag != FULL) { k_o.template modify(); @@ -529,21 +520,17 @@ void FixQEqReaxKokkos::cg_solve1() F_FLOAT my_norm = 0.0; FixQEqReaxKokkosNorm1Functor norm1_functor(this); Kokkos::parallel_reduce(inum,norm1_functor,my_norm); - DeviceType::fence(); F_FLOAT norm_sqr = 0.0; MPI_Allreduce( &my_norm, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); b_norm = sqrt(norm_sqr); - DeviceType::fence(); // sig_new = parallel_dot( r, d, nn); F_FLOAT my_dot = 0.0; FixQEqReaxKokkosDot1Functor dot1_functor(this); Kokkos::parallel_reduce(inum,dot1_functor,my_dot); - DeviceType::fence(); F_FLOAT dot_sqr = 0.0; MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); F_FLOAT sig_new = dot_sqr; - DeviceType::fence(); int loop; const int loopmax = 200; @@ -560,10 +547,8 @@ void FixQEqReaxKokkos::cg_solve1() // sparse_matvec( &H, d, q ); FixQEqReaxKokkosSparse22Functor sparse22_functor(this); Kokkos::parallel_for(inum,sparse22_functor); - DeviceType::fence(); if (neighflag != FULL) { Kokkos::parallel_for(Kokkos::RangePolicy(nlocal,nlocal+atom->nghost),*this); - DeviceType::fence(); if (neighflag == HALF) { FixQEqReaxKokkosSparse23Functor sparse23_functor(this); Kokkos::parallel_for(inum,sparse23_functor); @@ -574,7 +559,6 @@ void FixQEqReaxKokkos::cg_solve1() } else { Kokkos::parallel_for(Kokkos::TeamPolicy (inum, teamsize), *this); } - DeviceType::fence(); if (neighflag != FULL) { @@ -589,7 +573,6 @@ void FixQEqReaxKokkos::cg_solve1() my_dot = dot_sqr = 0.0; FixQEqReaxKokkosDot2Functor dot2_functor(this); Kokkos::parallel_reduce(inum,dot2_functor,my_dot); - DeviceType::fence(); MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); tmp = dot_sqr; @@ -602,12 +585,10 @@ void FixQEqReaxKokkos::cg_solve1() my_dot = dot_sqr = 0.0; FixQEqReaxKokkosPrecon1Functor precon1_functor(this); Kokkos::parallel_for(inum,precon1_functor); - DeviceType::fence(); // preconditioning: p[j] = r[j] * Hdia_inv[j]; // sig_new = parallel_dot( r, p, nn); FixQEqReaxKokkosPreconFunctor precon_functor(this); Kokkos::parallel_reduce(inum,precon_functor,my_dot); - DeviceType::fence(); MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); sig_new = dot_sqr; @@ -616,7 +597,6 @@ void FixQEqReaxKokkos::cg_solve1() // vector_sum( d, 1., p, beta, d, nn ); FixQEqReaxKokkosVecSum2Functor vecsum2_functor(this); Kokkos::parallel_for(inum,vecsum2_functor); - DeviceType::fence(); } if (loop >= loopmax && comm->me == 0) { @@ -644,10 +624,8 @@ void FixQEqReaxKokkos::cg_solve2() // sparse_matvec( &H, x, q ); FixQEqReaxKokkosSparse32Functor sparse32_functor(this); Kokkos::parallel_for(inum,sparse32_functor); - DeviceType::fence(); if (neighflag != FULL) { Kokkos::parallel_for(Kokkos::RangePolicy(nlocal,nlocal+atom->nghost),*this); - DeviceType::fence(); if (neighflag == HALF) { FixQEqReaxKokkosSparse33Functor sparse33_functor(this); Kokkos::parallel_for(inum,sparse33_functor); @@ -658,7 +636,6 @@ void FixQEqReaxKokkos::cg_solve2() } else { Kokkos::parallel_for(Kokkos::TeamPolicy (inum, teamsize), *this); } - DeviceType::fence(); if (neighflag != FULL) { k_o.template modify(); @@ -674,21 +651,17 @@ void FixQEqReaxKokkos::cg_solve2() F_FLOAT my_norm = 0.0; FixQEqReaxKokkosNorm2Functor norm2_functor(this); Kokkos::parallel_reduce(inum,norm2_functor,my_norm); - DeviceType::fence(); F_FLOAT norm_sqr = 0.0; MPI_Allreduce( &my_norm, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); b_norm = sqrt(norm_sqr); - DeviceType::fence(); // sig_new = parallel_dot( r, d, nn); F_FLOAT my_dot = 0.0; FixQEqReaxKokkosDot1Functor dot1_functor(this); Kokkos::parallel_reduce(inum,dot1_functor,my_dot); - DeviceType::fence(); F_FLOAT dot_sqr = 0.0; MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); F_FLOAT sig_new = dot_sqr; - DeviceType::fence(); int loop; const int loopmax = 200; @@ -705,10 +678,8 @@ void FixQEqReaxKokkos::cg_solve2() // sparse_matvec( &H, d, q ); FixQEqReaxKokkosSparse22Functor sparse22_functor(this); Kokkos::parallel_for(inum,sparse22_functor); - DeviceType::fence(); if (neighflag != FULL) { Kokkos::parallel_for(Kokkos::RangePolicy(nlocal,nlocal+atom->nghost),*this); - DeviceType::fence(); if (neighflag == HALF) { FixQEqReaxKokkosSparse23Functor sparse23_functor(this); Kokkos::parallel_for(inum,sparse23_functor); @@ -719,7 +690,6 @@ void FixQEqReaxKokkos::cg_solve2() } else { Kokkos::parallel_for(Kokkos::TeamPolicy (inum, teamsize), *this); } - DeviceType::fence(); if (neighflag != FULL) { k_o.template modify(); @@ -733,10 +703,8 @@ void FixQEqReaxKokkos::cg_solve2() my_dot = dot_sqr = 0.0; FixQEqReaxKokkosDot2Functor dot2_functor(this); Kokkos::parallel_reduce(inum,dot2_functor,my_dot); - DeviceType::fence(); MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); tmp = dot_sqr; - DeviceType::fence(); alpha = sig_new / tmp; @@ -747,12 +715,10 @@ void FixQEqReaxKokkos::cg_solve2() my_dot = dot_sqr = 0.0; FixQEqReaxKokkosPrecon2Functor precon2_functor(this); Kokkos::parallel_for(inum,precon2_functor); - DeviceType::fence(); // preconditioning: p[j] = r[j] * Hdia_inv[j]; // sig_new = parallel_dot( r, p, nn); FixQEqReaxKokkosPreconFunctor precon_functor(this); Kokkos::parallel_reduce(inum,precon_functor,my_dot); - DeviceType::fence(); MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); sig_new = dot_sqr; @@ -761,7 +727,6 @@ void FixQEqReaxKokkos::cg_solve2() // vector_sum( d, 1., p, beta, d, nn ); FixQEqReaxKokkosVecSum2Functor vecsum2_functor(this); Kokkos::parallel_for(inum,vecsum2_functor); - DeviceType::fence(); } if (loop >= loopmax && comm->me == 0) { @@ -786,7 +751,6 @@ void FixQEqReaxKokkos::calculate_q() sum = sum_all = 0.0; FixQEqReaxKokkosVecAcc1Functor vecacc1_functor(this); Kokkos::parallel_reduce(inum,vecacc1_functor,sum); - DeviceType::fence(); MPI_Allreduce(&sum, &sum_all, 1, MPI_DOUBLE, MPI_SUM, world ); const F_FLOAT s_sum = sum_all; @@ -794,7 +758,6 @@ void FixQEqReaxKokkos::calculate_q() sum = sum_all = 0.0; FixQEqReaxKokkosVecAcc2Functor vecacc2_functor(this); Kokkos::parallel_reduce(inum,vecacc2_functor,sum); - DeviceType::fence(); MPI_Allreduce(&sum, &sum_all, 1, MPI_DOUBLE, MPI_SUM, world ); const F_FLOAT t_sum = sum_all; @@ -804,7 +767,6 @@ void FixQEqReaxKokkos::calculate_q() // q[i] = s[i] - u * t[i]; FixQEqReaxKokkosCalculateQFunctor calculateQ_functor(this); Kokkos::parallel_for(inum,calculateQ_functor); - DeviceType::fence(); pack_flag = 4; //comm->forward_comm_fix( this ); //Dist_vector( atom->q ); diff --git a/src/KOKKOS/fix_setforce_kokkos.cpp b/src/KOKKOS/fix_setforce_kokkos.cpp index 27f7d100fa..5e26ef3610 100644 --- a/src/KOKKOS/fix_setforce_kokkos.cpp +++ b/src/KOKKOS/fix_setforce_kokkos.cpp @@ -108,7 +108,6 @@ void FixSetForceKokkos::post_force(int vflag) if (varflag == CONSTANT) { copymode = 1; Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,foriginal_kk); - DeviceType::fence(); copymode = 0; // variable force, wrap with clear/add @@ -138,7 +137,6 @@ void FixSetForceKokkos::post_force(int vflag) copymode = 1; Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,foriginal_kk); - DeviceType::fence(); copymode = 0; } diff --git a/src/KOKKOS/fix_wall_reflect_kokkos.cpp b/src/KOKKOS/fix_wall_reflect_kokkos.cpp index 55be7e5cd7..cd7a2c59b7 100644 --- a/src/KOKKOS/fix_wall_reflect_kokkos.cpp +++ b/src/KOKKOS/fix_wall_reflect_kokkos.cpp @@ -79,7 +79,6 @@ void FixWallReflectKokkos::post_integrate() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); copymode = 0; } diff --git a/src/KOKKOS/improper_class2_kokkos.cpp b/src/KOKKOS/improper_class2_kokkos.cpp index 25bd2c732f..c2cb7dfe2b 100644 --- a/src/KOKKOS/improper_class2_kokkos.cpp +++ b/src/KOKKOS/improper_class2_kokkos.cpp @@ -140,7 +140,6 @@ void ImproperClass2Kokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,nimproperlist),*this); } } - DeviceType::fence(); if (eflag_global) energy += ev.evdwl; // error check @@ -165,7 +164,6 @@ void ImproperClass2Kokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,nimproperlist),*this); } } - DeviceType::fence(); if (eflag_global) energy += ev.evdwl; if (vflag_global) { diff --git a/src/KOKKOS/improper_harmonic_kokkos.cpp b/src/KOKKOS/improper_harmonic_kokkos.cpp index 9c99b35bd9..1e58e18c51 100644 --- a/src/KOKKOS/improper_harmonic_kokkos.cpp +++ b/src/KOKKOS/improper_harmonic_kokkos.cpp @@ -128,7 +128,6 @@ void ImproperHarmonicKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,nimproperlist),*this); } } - //DeviceType::fence(); // error check diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.cpp b/src/KOKKOS/pair_eam_alloy_kokkos.cpp index 45c320bc51..76c701213d 100644 --- a/src/KOKKOS/pair_eam_alloy_kokkos.cpp +++ b/src/KOKKOS/pair_eam_alloy_kokkos.cpp @@ -409,7 +409,6 @@ int PairEAMAlloyKokkos::pack_forward_comm_kokkos(int n, DAT::tdual_i iswap = iswap_in; v_buf = buf.view(); Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); - DeviceType::fence(); return n; } @@ -428,7 +427,6 @@ void PairEAMAlloyKokkos::unpack_forward_comm_kokkos(int n, int first first = first_in; v_buf = buf.view(); Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); - DeviceType::fence(); } template diff --git a/src/KOKKOS/pair_eam_fs_kokkos.cpp b/src/KOKKOS/pair_eam_fs_kokkos.cpp index b9fa82740a..9b565f8ede 100644 --- a/src/KOKKOS/pair_eam_fs_kokkos.cpp +++ b/src/KOKKOS/pair_eam_fs_kokkos.cpp @@ -133,7 +133,6 @@ void PairEAMFSKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy(0,nall),*this); else Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); // loop over neighbors of my atoms @@ -156,7 +155,6 @@ void PairEAMFSKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } } - DeviceType::fence(); // communicate and sum densities (on the host) @@ -174,7 +172,6 @@ void PairEAMFSKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); } else if (neighflag == FULL) { @@ -184,7 +181,6 @@ void PairEAMFSKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); } if (eflag) { @@ -239,7 +235,6 @@ void PairEAMFSKokkos::compute(int eflag_in, int vflag_in) } } } - DeviceType::fence(); if (eflag_global) eng_vdwl += ev.evdwl; if (vflag_global) { @@ -414,7 +409,6 @@ int PairEAMFSKokkos::pack_forward_comm_kokkos(int n, DAT::tdual_int_ iswap = iswap_in; v_buf = buf.view(); Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); - DeviceType::fence(); return n; } @@ -433,7 +427,6 @@ void PairEAMFSKokkos::unpack_forward_comm_kokkos(int n, int first_in first = first_in; v_buf = buf.view(); Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); - DeviceType::fence(); } template diff --git a/src/KOKKOS/pair_eam_kokkos.cpp b/src/KOKKOS/pair_eam_kokkos.cpp index e4128de722..7be8e54605 100644 --- a/src/KOKKOS/pair_eam_kokkos.cpp +++ b/src/KOKKOS/pair_eam_kokkos.cpp @@ -409,7 +409,6 @@ int PairEAMKokkos::pack_forward_comm_kokkos(int n, DAT::tdual_int_2d iswap = iswap_in; v_buf = buf.view(); Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); - DeviceType::fence(); return n; } @@ -428,7 +427,6 @@ void PairEAMKokkos::unpack_forward_comm_kokkos(int n, int first_in, first = first_in; v_buf = buf.view(); Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); - DeviceType::fence(); } template diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index 59369b5e08..6082c93287 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -731,7 +731,6 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } - DeviceType::fence(); ev_all += ev; pvector[13] = ev.ecoul; @@ -771,7 +770,6 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } } - DeviceType::fence(); ev_all += ev; pvector[10] = ev.evdwl; pvector[11] = ev.ecoul; @@ -800,7 +798,6 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) // zero Kokkos::parallel_for(Kokkos::RangePolicy(0,nmax),*this); - DeviceType::fence(); if (neighflag == HALF) Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); @@ -808,7 +805,6 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); else //(neighflag == FULL) Kokkos::parallel_for(Kokkos::RangePolicy(0,ignum),*this); - DeviceType::fence(); k_resize_bo.modify(); k_resize_bo.sync(); @@ -827,15 +823,11 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) // Bond order if (neighflag == HALF) { Kokkos::parallel_for(Kokkos::RangePolicy(0,ignum),*this); - DeviceType::fence(); } else if (neighflag == HALFTHREAD) { Kokkos::parallel_for(Kokkos::RangePolicy(0,ignum),*this); - DeviceType::fence(); } Kokkos::parallel_for(Kokkos::RangePolicy(0,ignum),*this); - DeviceType::fence(); Kokkos::parallel_for(Kokkos::RangePolicy(0,ignum),*this); - DeviceType::fence(); // Bond energy if (neighflag == HALF) { @@ -843,7 +835,6 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); ev_all += ev; pvector[0] = ev.evdwl; } else { //if (neighflag == HALFTHREAD) { @@ -851,7 +842,6 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); ev_all += ev; pvector[0] = ev.evdwl; } @@ -859,21 +849,17 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) // Multi-body corrections if (neighflag == HALF) { Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); ev_all += ev; } pvector[2] = ev.ereax[0]; @@ -887,14 +873,12 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); ev_all += ev; } pvector[4] = ev.ereax[3]; @@ -908,14 +892,12 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); ev_all += ev; } pvector[8] = ev.ereax[6]; @@ -929,14 +911,12 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); - DeviceType::fence(); ev_all += ev; } } @@ -946,22 +926,18 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) // Bond force if (neighflag == HALF) { Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); - DeviceType::fence(); if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,ignum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); - DeviceType::fence(); ev_all += ev; pvector[0] += ev.evdwl; } else { //if (neighflag == HALFTHREAD) { Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); - DeviceType::fence(); if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,ignum),*this,ev); else Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); - DeviceType::fence(); ev_all += ev; pvector[0] += ev.evdwl; } @@ -3945,11 +3921,9 @@ void PairReaxCKokkos::ev_setup(int eflag, int vflag) if (vflag_global) for (i = 0; i < 6; i++) virial[i] = 0.0; if (eflag_atom) { Kokkos::parallel_for(Kokkos::RangePolicy(0,maxeatom),*this); - DeviceType::fence(); } if (vflag_atom) { Kokkos::parallel_for(Kokkos::RangePolicy(0,maxvatom),*this); - DeviceType::fence(); } // if vflag_global = 2 and pair::compute() calls virial_fdotr_compute() @@ -4002,7 +3976,6 @@ void PairReaxCKokkos::FindBond(int &numbonds) { copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nmax),*this); - DeviceType::fence(); bo_cut_bond = control->bg_cut; @@ -4017,7 +3990,6 @@ void PairReaxCKokkos::FindBond(int &numbonds) numbonds = 0; PairReaxCKokkosFindBondFunctor find_bond_functor(this); Kokkos::parallel_reduce(inum,find_bond_functor,numbonds); - DeviceType::fence(); copymode = 0; } @@ -4076,7 +4048,6 @@ void PairReaxCKokkos::PackBondBuffer(DAT::tdual_ffloat_1d k_buf, int nlocal = atomKK->nlocal; PairReaxCKokkosPackBondBufferFunctor pack_bond_buffer_functor(this); Kokkos::parallel_scan(nlocal,pack_bond_buffer_functor); - DeviceType::fence(); copymode = 0; k_buf.modify(); @@ -4135,11 +4106,9 @@ void PairReaxCKokkos::FindBondSpecies() { copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nmax),*this); - DeviceType::fence(); nlocal = atomKK->nlocal; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); copymode = 0; // NOTE: Could improve performance if a Kokkos version of ComputeSpecAtom is added diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index 3ad7334d2f..bd3ed3644f 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -403,17 +403,14 @@ void PPPMKokkos::setup() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(nxlo_fft,nxhi_fft+1),*this); - DeviceType::fence(); copymode = 0; copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(nylo_fft,nyhi_fft+1),*this); - DeviceType::fence(); copymode = 0; copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(nzlo_fft,nzhi_fft+1),*this); - DeviceType::fence(); copymode = 0; // merge three outer loops into one for better threading @@ -425,7 +422,6 @@ void PPPMKokkos::setup() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_fft),*this); - DeviceType::fence(); copymode = 0; compute_gf_ik(); @@ -753,7 +749,6 @@ void PPPMKokkos::compute(int eflag, int vflag) if (eflag_atom) { copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); copymode = 0; //for (i = nlocal; i < ntotal; i++) d_eatom[i] *= 0.5*qscale; } @@ -761,7 +756,6 @@ void PPPMKokkos::compute(int eflag, int vflag) if (vflag_atom) { copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,ntotal),*this); - DeviceType::fence(); copymode = 0; } } @@ -1415,7 +1409,6 @@ void PPPMKokkos::compute_gf_ik() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_fft),*this); - DeviceType::fence(); copymode = 0; } @@ -1495,7 +1488,6 @@ void PPPMKokkos::compute_gf_ik_triclinic() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(nzlo_fft,nzhi_fft+1),*this); - DeviceType::fence(); copymode = 0; } @@ -1588,7 +1580,6 @@ void PPPMKokkos::particle_map() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); copymode = 0; k_flag.template modify(); @@ -1641,7 +1632,6 @@ void PPPMKokkos::make_rho() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_out),*this); - DeviceType::fence(); copymode = 0; // loop over my charges, add their contribution to nearby grid points @@ -1654,7 +1644,6 @@ void PPPMKokkos::make_rho() #ifdef KOKKOS_HAVE_CUDA copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); copymode = 0; #else ix = nxhi_out-nxlo_out + 1; @@ -1663,7 +1652,6 @@ void PPPMKokkos::make_rho() copymode = 1; Kokkos::TeamPolicy config(lmp->kokkos->num_threads,1); Kokkos::parallel_for(config,*this); - DeviceType::fence(); copymode = 0; #endif } @@ -1794,7 +1782,6 @@ void PPPMKokkos::brick2fft() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); - DeviceType::fence(); copymode = 0; k_density_fft.template modify(); @@ -1842,7 +1829,6 @@ void PPPMKokkos::poisson_ik() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); - DeviceType::fence(); copymode = 0; k_work1.template modify(); @@ -1862,14 +1848,12 @@ void PPPMKokkos::poisson_ik() if (vflag_global) { copymode = 1; Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nfft),*this,ev); - DeviceType::fence(); copymode = 0; for (j = 0; j < 6; j++) virial[j] += ev.v[j]; energy += ev.ecoul; } else { copymode = 1; Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nfft),*this,ev); - DeviceType::fence(); copymode = 0; energy += ev.ecoul; } @@ -1880,7 +1864,6 @@ void PPPMKokkos::poisson_ik() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); - DeviceType::fence(); copymode = 0; // extra FFTs for per-atomKK energy/virial @@ -1914,7 +1897,6 @@ void PPPMKokkos::poisson_ik() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_fft),*this); - DeviceType::fence(); copymode = 0; k_work2.template modify(); @@ -1926,7 +1908,6 @@ void PPPMKokkos::poisson_ik() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); - DeviceType::fence(); copymode = 0; @@ -1934,7 +1915,6 @@ void PPPMKokkos::poisson_ik() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_fft),*this); - DeviceType::fence(); copymode = 0; k_work2.template modify(); @@ -1946,14 +1926,12 @@ void PPPMKokkos::poisson_ik() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); - DeviceType::fence(); copymode = 0; // z direction gradient copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_fft),*this); - DeviceType::fence(); copymode = 0; k_work2.template modify(); @@ -1965,7 +1943,6 @@ void PPPMKokkos::poisson_ik() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); - DeviceType::fence(); copymode = 0; } @@ -2215,7 +2192,6 @@ void PPPMKokkos::poisson_peratom() if (eflag_atom) { copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); - DeviceType::fence(); copymode = 0; k_work2.template modify(); @@ -2227,7 +2203,6 @@ void PPPMKokkos::poisson_peratom() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); - DeviceType::fence(); copymode = 0; } @@ -2238,7 +2213,6 @@ void PPPMKokkos::poisson_peratom() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); - DeviceType::fence(); copymode = 0; k_work2.template modify(); @@ -2250,13 +2224,11 @@ void PPPMKokkos::poisson_peratom() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); - DeviceType::fence(); copymode = 0; copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); - DeviceType::fence(); copymode = 0; k_work2.template modify(); @@ -2268,13 +2240,11 @@ void PPPMKokkos::poisson_peratom() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); - DeviceType::fence(); copymode = 0; copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); - DeviceType::fence(); copymode = 0; k_work2.template modify(); @@ -2286,12 +2256,10 @@ void PPPMKokkos::poisson_peratom() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); - DeviceType::fence(); copymode = 0; copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); - DeviceType::fence(); copymode = 0; k_work2.template modify(); @@ -2303,13 +2271,11 @@ void PPPMKokkos::poisson_peratom() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); - DeviceType::fence(); copymode = 0; copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); - DeviceType::fence(); copymode = 0; k_work2.template modify(); @@ -2321,13 +2287,11 @@ void PPPMKokkos::poisson_peratom() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); - DeviceType::fence(); copymode = 0; copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nfft),*this); - DeviceType::fence(); copymode = 0; k_work2.template modify(); @@ -2339,7 +2303,6 @@ void PPPMKokkos::poisson_peratom() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,inum_inout),*this); - DeviceType::fence(); copymode = 0; } @@ -2545,7 +2508,6 @@ void PPPMKokkos::fieldforce_ik() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); copymode = 0; } @@ -2606,7 +2568,6 @@ void PPPMKokkos::fieldforce_peratom() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); copymode = 0; } @@ -2682,12 +2643,10 @@ void PPPMKokkos::pack_forward_kokkos(int flag, Kokkos::DualView(0,nlist),*this); - DeviceType::fence(); copymode = 0; } else if (flag == FORWARD_IK_PERATOM) { copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlist),*this); - DeviceType::fence(); copymode = 0; } } @@ -2740,12 +2699,10 @@ void PPPMKokkos::unpack_forward_kokkos(int flag, Kokkos::DualView(0,nlist),*this); - DeviceType::fence(); copymode = 0; } else if (flag == FORWARD_IK_PERATOM) { copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlist),*this); - DeviceType::fence(); copymode = 0; } } @@ -2798,7 +2755,6 @@ void PPPMKokkos::pack_reverse_kokkos(int flag, Kokkos::DualView(0,nlist),*this); - DeviceType::fence(); copymode = 0; } @@ -2829,7 +2785,6 @@ void PPPMKokkos::unpack_reverse_kokkos(int flag, Kokkos::DualView(0,nlist),*this); - DeviceType::fence(); copymode = 0; } @@ -2989,7 +2944,6 @@ void PPPMKokkos::slabcorr() double dipole = 0.0; copymode = 1; Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,dipole); - DeviceType::fence(); copymode = 0; // sum local contributions to get global dipole moment @@ -3003,7 +2957,6 @@ void PPPMKokkos::slabcorr() if (eflag_atom || fabs(qsum) > SMALL) { copymode = 1; Kokkos::parallel_reduce(Kokkos::RangePolicy(0,nlocal),*this,dipole_r2); - DeviceType::fence(); copymode = 0; // sum local contributions @@ -3027,7 +2980,6 @@ void PPPMKokkos::slabcorr() efact = qscale * MY_2PI/volume; copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); copymode = 0; } @@ -3037,7 +2989,6 @@ void PPPMKokkos::slabcorr() copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); - DeviceType::fence(); copymode = 0; } @@ -3081,7 +3032,6 @@ int PPPMKokkos::timing_1d(int n, double &time1d) copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,2*nfft_both),*this); - DeviceType::fence(); copymode = 0; MPI_Barrier(world); @@ -3119,7 +3069,6 @@ int PPPMKokkos::timing_3d(int n, double &time3d) copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,2*nfft_both),*this); - DeviceType::fence(); copymode = 0; MPI_Barrier(world); From 0034d2db35b1e3c7ef28bce5a5bad09ffcb1e72b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 Jun 2017 16:30:30 -0400 Subject: [PATCH 127/302] apply the rigid body checks to some more example codes --- src/fix_heat.cpp | 6 +++++- src/fix_temp_berendsen.cpp | 3 +++ src/fix_temp_csld.cpp | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/fix_heat.cpp b/src/fix_heat.cpp index d41aa4abea..97e0ed6a7f 100644 --- a/src/fix_heat.cpp +++ b/src/fix_heat.cpp @@ -64,7 +64,7 @@ idregion(NULL), hstr(NULL), vheat(NULL), vscale(NULL) // optional args iregion = -1; - + int iarg = 5; while (iarg < narg) { if (strcmp(arg[iarg],"region") == 0) { @@ -126,6 +126,10 @@ void FixHeat::init() else error->all(FLERR,"Variable for fix heat is invalid style"); } + // check for rigid bodies in region (done here for performance reasons) + if (modify->check_rigid_region_overlap(groupbit,domain->regions[iregion])) + error->warning(FLERR,"Cannot apply fix heat to atoms in rigid bodies"); + // cannot have 0 atoms in group if (group->count(igroup) == 0) diff --git a/src/fix_temp_berendsen.cpp b/src/fix_temp_berendsen.cpp index aff9a44977..7b312cfb5f 100644 --- a/src/fix_temp_berendsen.cpp +++ b/src/fix_temp_berendsen.cpp @@ -128,6 +128,9 @@ void FixTempBerendsen::init() error->all(FLERR,"Temperature ID for fix temp/berendsen does not exist"); temperature = modify->compute[icompute]; + if (modify->check_rigid_group_overlap(groupbit)) + error->warning(FLERR,"Cannot thermostat atoms in rigid bodies"); + if (temperature->tempbias) which = BIAS; else which = NOBIAS; } diff --git a/src/fix_temp_csld.cpp b/src/fix_temp_csld.cpp index f24314ac80..63f27cdecb 100644 --- a/src/fix_temp_csld.cpp +++ b/src/fix_temp_csld.cpp @@ -155,6 +155,9 @@ void FixTempCSLD::init() error->all(FLERR,"Temperature ID for fix temp/csld does not exist"); temperature = modify->compute[icompute]; + if (modify->check_rigid_group_overlap(groupbit)) + error->warning(FLERR,"Cannot thermostat atoms in rigid bodies"); + if (temperature->tempbias) which = BIAS; else which = NOBIAS; } From 3a018363254afff4a95f2369eac3210d4f43aa40 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 Jun 2017 16:39:17 -0400 Subject: [PATCH 128/302] simplify code for rigid body overlap checks --- src/modify.cpp | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/src/modify.cpp b/src/modify.cpp index b390b7f89a..01de6b5928 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -1011,16 +1011,11 @@ int Modify::check_rigid_group_overlap(int groupbit) int n = 0; for (int ifix = 0; ifix < nfix; ifix++) { if (strncmp("rigid",fix[ifix]->style,5) == 0) { - const int bothbits = groupbit | fix[ifix]->groupbit; const int * const body = (const int *)fix[ifix]->extract("body",dim); if ((body == NULL) || (dim != 1)) break; - for (int i=0; i < nlocal; ++i) { - if (((mask[i] & bothbits) == bothbits) && (body[i] >= 0)) { - ++n; break; - } - } - if (n > 0) break; + for (int i=0; (i < nlocal) && (n == 0); ++i) + if ((mask[i] & groupbit) && (body[i] >= 0)) ++n; } } @@ -1048,17 +1043,12 @@ int Modify::check_rigid_region_overlap(int groupbit, Region *reg) reg->prematch(); for (int ifix = 0; ifix < nfix; ifix++) { if (strncmp("rigid",fix[ifix]->style,5) == 0) { - const int bothbits = groupbit | fix[ifix]->groupbit; const int * const body = (const int *)fix[ifix]->extract("body",dim); if ((body == NULL) || (dim != 1)) break; - for (int i=0; i < nlocal; ++i) - if (((mask[i] & bothbits) == bothbits) && (body[i] >= 0) - && reg->match(x[i][0],x[i][1],x[i][2])) { - ++n; - break; - } - if (n > 0) break; + for (int i=0; (i < nlocal) && (n == 0); ++i) + if ((mask[i] & groupbit) && (body[i] >= 0) + && reg->match(x[i][0],x[i][1],x[i][2])) ++n; } } @@ -1084,17 +1074,11 @@ int Modify::check_rigid_list_overlap(int *select) int n = 0; for (int ifix = 0; ifix < nfix; ifix++) { if (strncmp("rigid",fix[ifix]->style,5) == 0) { - const int groupbit = fix[ifix]->groupbit; const int * const body = (const int *)fix[ifix]->extract("body",dim); if ((body == NULL) || (dim != 1)) break; - for (int i=0; i < nlocal; ++i) { - if ((mask[i] & groupbit) && (body[i] >= 0) && select[i]) { - ++n; - break; - } - } - if (n > 0) break; + for (int i=0; (i < nlocal) && (n == 0); ++i) + if ((body[i] >= 0) && select[i]) ++n; } } From deff6c666eaf6f9025bc9051d3112807d69fc6fb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 Jun 2017 17:31:43 -0400 Subject: [PATCH 129/302] add flag "reinit" with args "yes" / "no" to fixes rigid & rigid/small --- src/RIGID/fix_rigid.cpp | 24 ++++++++++++++++------- src/RIGID/fix_rigid.h | 1 + src/RIGID/fix_rigid_small.cpp | 36 +++++++++++++++++++++++++---------- src/RIGID/fix_rigid_small.h | 1 + 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index e9c06dee5c..83022cbcba 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -267,6 +267,8 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : int seed; langflag = 0; + reinitflag = 1; + tstat_flag = 0; pstat_flag = 0; allremap = 1; @@ -501,6 +503,14 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : infile = new char[n]; strcpy(infile,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/small command"); + if (strcmp("yes",arg[iarg+1]) == 0) reinitflag = 1; + else if (strcmp("no",arg[iarg+1]) == 0) reinitflag = 0; + else error->all(FLERR,"Illegal fix rigid command"); iarg += 2; } else error->all(FLERR,"Illegal fix rigid command"); @@ -679,15 +689,15 @@ void FixRigid::init() if (strstr(update->integrate_style,"respa")) step_respa = ((Respa *) update->integrate)->step; - // setup rigid bodies, using current atom info - // only do initialization once, b/c properties may not be re-computable - // especially if overlapping particles - // do not do dynamic init if read body properties from infile - // this is b/c the infile defines the static and dynamic properties - // and may not be computable if contain overlapping particles + // setup rigid bodies, using current atom info. if reinitflag is not set, + // do the initialization only once, b/c properties may not be re-computable + // especially if overlapping particles. + // do not do dynamic init if read body properties from infile. + // this is b/c the infile defines the static and dynamic properties and may + // not be computable if contain overlapping particles. // setup_bodies_static() reads infile itself - if (!setupflag) { + if (reinitflag || !setupflag) { setup_bodies_static(); if (!infile) setup_bodies_dynamic(); setupflag = 1; diff --git a/src/RIGID/fix_rigid.h b/src/RIGID/fix_rigid.h index a6d1f65e1c..12439d42cf 100644 --- a/src/RIGID/fix_rigid.h +++ b/src/RIGID/fix_rigid.h @@ -104,6 +104,7 @@ class FixRigid : public Fix { int extended; // 1 if any particles have extended attributes int orientflag; // 1 if particles store spatial orientation int dorientflag; // 1 if particles store dipole orientation + int reinitflag; // 1 if re-initialize rigid bodies between runs imageint *xcmimage; // internal image flags for atoms in rigid bodies // set relative to in-box xcm of each body diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 2d8e736a1e..f40b52e162 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -138,6 +138,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : langflag = 0; infile = NULL; onemols = NULL; + reinitflag = 1; tstat_flag = 0; pstat_flag = 0; @@ -173,6 +174,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Fix rigid/small langevin period must be > 0.0"); if (seed <= 0) error->all(FLERR,"Illegal fix rigid/small command"); iarg += 5; + } else if (strcmp(arg[iarg],"infile") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid/small command"); delete [] infile; @@ -180,7 +182,16 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : infile = new char[n]; strcpy(infile,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/small command"); + if (strcmp("yes",arg[iarg+1]) == 0) reinitflag = 1; + else if (strcmp("no",arg[iarg+1]) == 0) reinitflag = 0; + else error->all(FLERR,"Illegal fix rigid/small command"); + iarg += 2; + } else if (strcmp(arg[iarg],"mol") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix rigid/small command"); int imol = atom->find_molecule(arg[iarg+1]); @@ -520,14 +531,15 @@ void FixRigidSmall::init() } /* ---------------------------------------------------------------------- - setup static/dynamic properties of rigid bodies, using current atom info - only do initialization once, b/c properties may not be re-computable - especially if overlapping particles or bodies inserted from mol template - do not do dynamic init if read body properties from infile - this is b/c the infile defines the static and dynamic properties - and may not be computable if contain overlapping particles - setup_bodies_static() reads infile itself - cannot do this until now, b/c requires comm->setup() to have setup stencil + setup static/dynamic properties of rigid bodies, using current atom info. + if reinitflag is not set, do the initialization only once, b/c properties + may not be re-computable especially if overlapping particles or bodies + are inserted from mol template. + do not do dynamic init if read body properties from infile. this + is b/c the infile defines the static and dynamic properties and may not + be computable if contain overlapping particles setup_bodies_static() + reads infile itself. + cannot do this until now, b/c requires comm->setup() to have setup stencil invoke pre_neighbor() to insure body xcmimage flags are reset needed if Verlet::setup::pbc() has remapped/migrated atoms for 2nd run setup_bodies_static() invokes pre_neighbor itself @@ -535,9 +547,13 @@ void FixRigidSmall::init() void FixRigidSmall::setup_pre_neighbor() { - if (!setupflag) setup_bodies_static(); + if (reinitflag || !setupflag) + setup_bodies_static(); else pre_neighbor(); - if (!setupflag && !infile) setup_bodies_dynamic(); + + if ((reinitflag || !setupflag) && !infile) + setup_bodies_dynamic(); + setupflag = 1; } diff --git a/src/RIGID/fix_rigid_small.h b/src/RIGID/fix_rigid_small.h index 9c89bab885..72e32719c0 100644 --- a/src/RIGID/fix_rigid_small.h +++ b/src/RIGID/fix_rigid_small.h @@ -131,6 +131,7 @@ class FixRigidSmall : public Fix { int extended; // 1 if any particles have extended attributes int orientflag; // 1 if particles store spatial orientation int dorientflag; // 1 if particles store dipole orientation + int reinitflag; // 1 if re-initialize rigid bodies between runs int POINT,SPHERE,ELLIPSOID,LINE,TRIANGLE,DIPOLE; // bitmasks for eflags int OMEGA,ANGMOM,TORQUE; From 46c5cbae8f3a5016f6e3327b5a23bc2f42c7d258 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 5 Jun 2017 18:04:09 -0400 Subject: [PATCH 130/302] update rigid fix documentation for added `reinit` keyword --- doc/src/fix_rigid.txt | 65 ++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/doc/src/fix_rigid.txt b/doc/src/fix_rigid.txt index 03edf61ed8..dbadd3fa63 100644 --- a/doc/src/fix_rigid.txt +++ b/doc/src/fix_rigid.txt @@ -31,11 +31,12 @@ bodystyle = {single} or {molecule} or {group} :l groupID1, groupID2, ... = list of N group IDs :pre zero or more keyword/value pairs may be appended :l -keyword = {langevin} or {temp} or {iso} or {aniso} or {x} or {y} or {z} or {couple} or {tparam} or {pchain} or {dilate} or {force} or {torque} or {infile} :l +keyword = {langevin} or {reinit} or {temp} or {iso} or {aniso} or {x} or {y} or {z} or {couple} or {tparam} or {pchain} or {dilate} or {force} or {torque} or {infile} :l {langevin} values = Tstart Tstop Tperiod seed Tstart,Tstop = desired temperature at start/stop of run (temperature units) Tdamp = temperature damping parameter (time units) seed = random number seed to use for white noise (positive integer) + {reinit} = {yes} or {no} {temp} values = Tstart Tstop Tdamp Tstart,Tstop = desired temperature at start/stop of run (temperature units) Tdamp = temperature damping parameter (time units) @@ -68,10 +69,10 @@ keyword = {langevin} or {temp} or {iso} or {aniso} or {x} or {y} or {z} or {coup [Examples:] -fix 1 clump rigid single +fix 1 clump rigid single reinit yes fix 1 clump rigid/small molecule fix 1 clump rigid single force 1 off off on langevin 1.0 1.0 1.0 428984 -fix 1 polychains rigid/nvt molecule temp 1.0 1.0 5.0 +fix 1 polychains rigid/nvt molecule temp 1.0 1.0 5.0 reinit no fix 1 polychains rigid molecule force 1*5 off off off force 6*10 off off on fix 1 polychains rigid/small molecule langevin 1.0 1.0 1.0 428984 fix 2 fluid rigid group 3 clump1 clump2 clump3 torque * off off off @@ -87,7 +88,12 @@ means that each timestep the total force and torque on each rigid body is computed as the sum of the forces and torques on its constituent particles. The coordinates, velocities, and orientations of the atoms in each body are then updated so that the body moves and rotates as a -single entity. +single entity. This is implemented by creating internal data structures +for each rigid body and performing time integration on these data +structures. Positions, velocities, and orientations of the constituent +particles are regenerated from the rigid body data structures in every +time step. This restricts which operations and fixes can be applied to +rigid bodies. See below for a detailed discussion. Examples of large rigid bodies are a colloidal particle, or portions of a biomolecule such as a protein. @@ -148,8 +154,9 @@ differences may accumulate to produce divergent trajectories. NOTE: You should not update the atoms in rigid bodies via other time-integration fixes (e.g. "fix nve"_fix_nve.html, "fix -nvt"_fix_nh.html, "fix npt"_fix_nh.html), or you will be integrating -their motion more than once each timestep. When performing a hybrid +nvt"_fix_nh.html, "fix npt"_fix_nh.html, "fix move"_fix_move.html), +or you will have conflicting updates to positions and velocities +resulting in unphysical behavior in most cases. When performing a hybrid simulation with some atoms in rigid bodies, and some not, a separate time integration fix like "fix nve"_fix_nve.html or "fix nvt"_fix_nh.html should be used for the non-rigid particles. @@ -165,23 +172,29 @@ setting the force on them to 0.0 (via the "fix setforce"_fix_setforce.html command), and integrating them as usual (e.g. via the "fix nve"_fix_nve.html command). -NOTE: The aggregate properties of each rigid body are calculated one -time at the start of the first simulation run after these fixes are -specified. The properties include the position and velocity of the -center-of-mass of the body, its moments of inertia, and its angular -momentum. This is done using the properties of the constituent atoms -of the body at that point in time (or see the {infile} keyword -option). Thereafter, changing properties of individual atoms in the -body will have no effect on a rigid body's dynamics, unless they -affect the "pair_style"_pair_style.html interactions that individual -particles are part of. For example, you might think you could -displace the atoms in a body or add a large velocity to each atom in a -body to make it move in a desired direction before a 2nd run is +IMPORTANT NOTE: The aggregate properties of each rigid body are +calculated at the start of a simulation run and are maintained in +internal data structures. The properties include the position and +velocity of the center-of-mass of the body, its moments of inertia, and +its angular momentum. This is done using the properties of the +constituent atoms of the body at that point in time (or see the {infile} +keyword option). Thereafter, changing these properties of individual +atoms in the body will have no effect on a rigid body's dynamics, unless +they effect any computation of per-atom forces or torques. If the +keyword {reinit} is set to {yes} (the default), the rigid body data +structures will be recreated at the beginning of each {run} command; +if the keyword {reinit} is set to {no}, the rigid body data structures +will be built only at the very first {run} command and maintained for +as long as the rigid fix is defined. For example, you might think you +could displace the atoms in a body or add a large velocity to each atom +in a body to make it move in a desired direction before a 2nd run is performed, using the "set"_set.html or "displace_atoms"_displace_atoms.html or "velocity"_velocity.html -command. But these commands will not affect the internal attributes -of the body, and the position and velocity of individual atoms in the -body will be reset when time integration starts. +commands. But these commands will not affect the internal attributes +of the body unless {reinit} is set to {yes}. With {reinit} set to {no} +(or using the {infile} option, which implies {reinit} {no}) the position +and velocity of individual atoms in the body will be reset when time +integration starts again. :line @@ -401,6 +414,14 @@ couple none :pre The keyword/value option pairs are used in the following ways. +The {reinit} keyword determines, whether the rigid body properties +are reinitialized between run commands. With the option {yes} (the +default) this is done, with the option {no} this is not done. Turning +off the reinitialization can be helpful to protect rigid bodies against +unphysical manipulations between runs or when properties cannot be +easily recomputed (e.g. when read from a file). When using the {infile} +keyword, the {reinit} option is automatically set to {no}. + The {langevin} and {temp} and {tparam} keywords perform thermostatting of the rigid bodies, altering both their translational and rotational degrees of freedom. What is meant by "temperature" of a collection of @@ -778,7 +799,7 @@ exclude, "fix shake"_fix_shake.html The option defaults are force * on on on and torque * on on on, meaning all rigid bodies are acted on by center-of-mass force and -torque. Also Tchain = Pchain = 10, Titer = 1, Torder = 3. +torque. Also Tchain = Pchain = 10, Titer = 1, Torder = 3, reinit = yes. :line From d437650c776f218c139c2900e7fa8efcad6a2750 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Jun 2017 08:08:10 -0400 Subject: [PATCH 131/302] make certain Domain::box_change is initialized before use --- src/domain.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/domain.cpp b/src/domain.cpp index aadd1b751f..427f7785e8 100644 --- a/src/domain.cpp +++ b/src/domain.cpp @@ -60,6 +60,7 @@ enum{LAYOUT_UNIFORM,LAYOUT_NONUNIFORM,LAYOUT_TILED}; // several files Domain::Domain(LAMMPS *lmp) : Pointers(lmp) { box_exist = 0; + box_change = 0; dimension = 3; nonperiodic = 0; From 06c8e95774cc1d42a49d9ca2419cbbbaf42d3cac Mon Sep 17 00:00:00 2001 From: Emile Maras Date: Tue, 6 Jun 2017 14:20:54 +0200 Subject: [PATCH 132/302] corrected the fix_neb documentation --- doc/src/fix_neb.txt | 108 ++++++++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 53 deletions(-) diff --git a/doc/src/fix_neb.txt b/doc/src/fix_neb.txt index cd0fa23e85..94c6ee84fd 100644 --- a/doc/src/fix_neb.txt +++ b/doc/src/fix_neb.txt @@ -18,20 +18,19 @@ Kspring = parallel spring constant (force/distance units or force units) :l zero or more keyword/value pairs may be appended :l keyword = {nudg_style} or {perp} or {freend} or {freend_k_spring} :l {nudg_style} value = {neigh} or {idealpos} - {neigh} = the parallel nudging force is calculated from the distance to neighbouring replicas (in this case, Kspring is in force/distance units) + {neigh} = the parallel nudging force is calculated from the distances to neighbouring replicas (in this case, Kspring is in force/distance units) {idealpos} = the parallel nudging force is proportional to the distance between the replica and its interpolated ideal position (in this case Kspring is in force units) {perp} value {none} or kspring2 {none} = no perpendicular spring force is applied + {kspring2} = spring constant for the perpendicular nudging force (in force/distance units) {freeend} value = {none} or {ini} or {final} or {finaleini} or {final2eini} - {none} = no nudging force is apply to the first and last replicas + {none} = no nudging force is applied to the first and last replicas {ini} = set the first replica to be a free end {final} = set the last replica to be a free end {finaleini} = set the last replica to be a free end and set its target energy as that of the first replica {final2eini} = same as {finaleini} plus prevent intermediate replicas to have a lower energy than the first replica - {freeend_kspring} value = kspring2 - kspring2 = spring constant of the perpendicular spring force (per distance units) -flag = set behavior for the end points - flag = + {freeend_kspring} value = kspring3 + kspring3 = spring constant of the perpendicular spring force (per distance units) :pre [Examples:] @@ -58,10 +57,10 @@ highest energy along the MEP). One purpose of the nudging forces is to keep the replicas equally spaced. During the NEB, the 3N-length vector of interatomic force Fi = -Grad(V) of replicas i is altered. For all intermediate replicas -(i.e. for 1 0 -:pre - -where E is the energy of the free end replica and ETarget is the -target energy. - -When the value {ini} ({final}) is used after the keyword {freeend}, -the first (last) replica is considered as a free end. The target -energy is set to the energy of the replica at starting of the NEB -calculation. When the value {finaleini} or {final2eini} is used the -last image is considered as a free end and the target energy is equal -to the energy of the first replica (which can evolve during the NEB -relaxation). With the value {finaleini}, when the initial path is too -far from the MEP, an intermediate repilica might relax "faster" and -get a lower energy than the last replica. The benefit of the free end -is then lost since this intermediate replica will relax toward a local -minima. This behavior can be prevented by using the value {final2eini} -which remove entirely the contribution of the gradient for all -intermediate replica which have a lower energy than the initial one -thus preventing these replicae to over-relax. After converging a NEB -with the {final2eini} value it is recommended to check that all -intermediate replica have a larger energy than the initial -replica. Finally note that if the last replica converges toward a -local minimum with a larger energy than the energy of the first -replica, a free end neb calculation with the value {finaleini} or -{final2eini} cannot reach the convergence criteria. - -:line - The keyword {nudg_style} allow to specify how to parallel nudging force is computed. With a value of idealpos, the spring force is computed as suggested in "(E)"_#E : @@ -159,6 +115,52 @@ when the angle Ri-1 Ri Ri+1 is accute. f(Ri-1 Ri R+1) is defined in :line +By default, the force acting on the first and last replicas is not +altered so that during the NEB relaxation, these ending replicas relax +toward local minima. However it is possible to use the key word +{freeend} to allow either the initial or the final replica to relax +toward a MEP while constraining its energy. The interatomic force Fi +for the free end image becomes : + +Fi = -Grad(V)+ (Grad(V) dot That + (E-ETarget)*kspring3) That, {when} Grad(V) dot That < 0 +Fi = -Grad(V)+ (Grad(V) dot That + (ETarget- E)*kspring3) That, {when} Grad(V) dot That > 0 +:pre + +where E is the energy of the free end replica and ETarget is the +target energy. + +When the value {ini} ({final}) is used after the keyword {freeend}, +the first (last) replica is considered as a free end. The target +energy is set to the energy of the replica at starting of the NEB +calculation. When the value {finaleini} or {final2eini} is used the +last image is considered as a free end and the target energy is equal +to the energy of the first replica (which can evolve during the NEB +relaxation). With the value {finaleini}, when the initial path is too +far from the MEP, an intermediate repilica might relax "faster" and +get a lower energy than the last replica. The benefit of the free end +is then lost since this intermediate replica will relax toward a local +minima. This behavior can be prevented by using the value {final2eini} +which remove entirely the contribution of the gradient for all +intermediate replica which have a lower energy than the initial one +thus preventing these replicae to over-relax. After converging a NEB +with the {final2eini} value it is recommended to check that all +intermediate replica have a larger energy than the initial +replica. Finally note that if the last replica converges toward a +local minimum with a larger energy than the energy of the first +replica, a free end neb calculation with the value {finaleini} or +{final2eini} cannot reach the convergence criteria. + +:line + + + +In the second stage of the NEB, the interatomic force Fi for the +climbing replica (which is the replica of highest energy) becomes: + +Fi = -Grad(V) + 2 (Grad(V) dot That) That :pre + + + [Restart, fix_modify, output, run start/stop, minimize info:] No information about this fix is written to "binary restart From 18dee3f78ed2537f3044d757691b526f4778ca7e Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Tue, 6 Jun 2017 16:03:09 -0400 Subject: [PATCH 133/302] Added Gaussian bump. Updated e-mail address. --- doc/src/manifolds.txt | 7 ++++--- src/USER-MANIFOLD/manifold.h | 2 +- src/USER-MANIFOLD/manifold_gaussian_bump.h | 5 ++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/doc/src/manifolds.txt b/doc/src/manifolds.txt index 9f0082d5dc..c9bb1ce57f 100644 --- a/doc/src/manifolds.txt +++ b/doc/src/manifolds.txt @@ -24,14 +24,15 @@ to the relevant fixes. {manifold} @ {parameters} @ {equation} @ {description} cylinder @ R @ x^2 + y^2 - R^2 = 0 @ Cylinder along z-axis, axis going through (0,0,0) cylinder_dent @ R l a @ x^2 + y^2 - r(z)^2 = 0, r(x) = R if | z | > l, r(z) = R - a*(1 + cos(z/l))/2 otherwise @ A cylinder with a dent around z = 0 -dumbbell @ a A B c @ -( x^2 + y^2 ) * (a^2 - z^2/c^2) * ( 1 + (A*sin(B*z^2))^4) = 0 @ A dumbbell @ +dumbbell @ a A B c @ -( x^2 + y^2 ) + (a^2 - z^2/c^2) * ( 1 + (A*sin(B*z^2))^4) = 0 @ A dumbbell ellipsoid @ a b c @ (x/a)^2 + (y/b)^2 + (z/c)^2 = 0 @ An ellipsoid +gaussian_bump @ A l rc1 rc2 @ if( x < rc1) -z + A * exp( -x^2 / (2 l^2) ); else if( x < rc2 ) -z + a + b*x + c*x^2 + d*x^3; else z @ A Gaussian bump at x = y = 0, smoothly tapered to a flat plane z = 0. plane @ a b c x0 y0 z0 @ a*(x-x0) + b*(y-y0) + c*(z-z0) = 0 @ A plane with normal (a,b,c) going through point (x0,y0,z0) plane_wiggle @ a w @ z - a*sin(w*x) = 0 @ A plane with a sinusoidal modulation on z along x. sphere @ R @ x^2 + y^2 + z^2 - R^2 = 0 @ A sphere of radius R supersphere @ R q @ | x |^q + | y |^q + | z |^q - R^q = 0 @ A supersphere of hyperradius R -spine @ a, A, B, B2, c @ -(x^2 + y^2)*(a^2 - z^2/f(z)^2)*(1 + (A*sin(g(z)*z^2))^4), f(z) = c if z > 0, 1 otherwise; g(z) = B if z > 0, B2 otherwise @ An approximation to a dendtritic spine -spine_two @ a, A, B, B2, c @ -(x^2 + y^2)*(a^2 - z^2/f(z)^2)*(1 + (A*sin(g(z)*z^2))^2), f(z) = c if z > 0, 1 otherwise; g(z) = B if z > 0, B2 otherwise @ Another approximation to a dendtritic spine +spine @ a, A, B, B2, c @ -(x^2 + y^2) + (a^2 - z^2/f(z)^2)*(1 + (A*sin(g(z)*z^2))^4), f(z) = c if z > 0, 1 otherwise; g(z) = B if z > 0, B2 otherwise @ An approximation to a dendtritic spine +spine_two @ a, A, B, B2, c @ -(x^2 + y^2) + (a^2 - z^2/f(z)^2)*(1 + (A*sin(g(z)*z^2))^2), f(z) = c if z > 0, 1 otherwise; g(z) = B if z > 0, B2 otherwise @ Another approximation to a dendtritic spine thylakoid @ wB LB lB @ Various, see "(Paquay)"_#Paquay1 @ A model grana thylakoid consisting of two block-like compartments connected by a bridge of width wB, length LB and taper length lB torus @ R r @ (R - sqrt( x^2 + y^2 ) )^2 + z^2 - r^2 @ A torus with large radius R and small radius r, centered on (0,0,0) :tb(s=@) diff --git a/src/USER-MANIFOLD/manifold.h b/src/USER-MANIFOLD/manifold.h index d0ffa214ac..b89e765a6e 100644 --- a/src/USER-MANIFOLD/manifold.h +++ b/src/USER-MANIFOLD/manifold.h @@ -24,7 +24,7 @@ testing purposes) and a wave-y plane. See the README file for more info. - Stefan Paquay, s.paquay@tue.nl + Stefan Paquay, stefanpaquay@gmail.com Applied Physics/Theory of Polymers and Soft Matter, Eindhoven University of Technology (TU/e), The Netherlands diff --git a/src/USER-MANIFOLD/manifold_gaussian_bump.h b/src/USER-MANIFOLD/manifold_gaussian_bump.h index 43f69fba18..f3401a4a33 100644 --- a/src/USER-MANIFOLD/manifold_gaussian_bump.h +++ b/src/USER-MANIFOLD/manifold_gaussian_bump.h @@ -24,7 +24,10 @@ testing purposes) and a wave-y plane. See the README file for more info. - Stefan Paquay, s.paquay@tue.nl + Stefan Paquay, spaquay@brandeis.edu + Brandeis University, Waltham, MA, USA. + + This package was mainly developed at Applied Physics/Theory of Polymers and Soft Matter, Eindhoven University of Technology (TU/e), The Netherlands From cd67eaa5f42a4b6506dd95b871de872689757e17 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Jun 2017 16:26:57 -0400 Subject: [PATCH 134/302] update e-mail and affiliation for stefan paquay in USER-MANIFOLD related files --- doc/src/Section_packages.txt | 4 ++-- src/USER-MANIFOLD/README | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/src/Section_packages.txt b/doc/src/Section_packages.txt index cc44c05906..d4276fdf82 100644 --- a/doc/src/Section_packages.txt +++ b/doc/src/Section_packages.txt @@ -2027,8 +2027,8 @@ algorithm to formulate single-particle constraint functions g(xi,yi,zi) = 0 and their derivative (i.e. the normal of the manifold) n = grad(g). -[Author:] Stefan Paquay (Eindhoven University of Technology (TU/e), The -Netherlands) +[Author:] Stefan Paquay (until 2017: Eindhoven University of Technology (TU/e), The +Netherlands; since 2017: Brandeis University, Waltham, MA, USA) [Install or un-install:] diff --git a/src/USER-MANIFOLD/README b/src/USER-MANIFOLD/README index f55a9bb8e3..eb83cfc5ab 100644 --- a/src/USER-MANIFOLD/README +++ b/src/USER-MANIFOLD/README @@ -7,10 +7,14 @@ box). It achieves this using the RATTLE constraint algorithm applied to single-particle constraint functions g(xi,yi,zi) = 0 and their derivative (i.e. the normal of the manifold) n = grad(g). -Stefan Paquay, s.paquay@tue.nl -Applied Physics/Theory of Polymers and Soft Matter, +Stefan Paquay, stefanpaquay@gmail.com + +until 2017: Applied Physics/Theory of Polymers and Soft Matter, Eindhoven University of Technology (TU/e), The Netherlands +since 2017: Brandeis University, Waltham, MA, USA. + + Thanks to Remy Kusters at TU/e for testing. This software is distributed under the GNU General Public License. From 5cb56796a22fcc615d613a612a0d9edc2a248026 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Jun 2017 17:26:06 -0400 Subject: [PATCH 135/302] alias pair style lj/sf to lj/smooth/linear and remove/update related files --- doc/src/Eqs/pair_lj_sf.jpg | Bin 15535 -> 0 bytes doc/src/Eqs/pair_lj_sf.tex | 11 - doc/src/Section_commands.txt | 1 - doc/src/pair_lj_sf.txt | 114 -------- doc/src/pair_lj_smooth_linear.txt | 31 +- src/Purge.list | 5 + src/USER-MISC/pair_lj_sf.cpp | 355 ----------------------- src/USER-MISC/pair_lj_sf.h | 53 ---- src/USER-OMP/pair_lj_sf_omp.cpp | 164 ----------- src/USER-OMP/pair_lj_sf_omp.h | 48 --- src/USER-OMP/pair_lj_smooth_linear_omp.h | 1 + src/pair_lj_smooth_linear.h | 1 + 12 files changed, 23 insertions(+), 761 deletions(-) delete mode 100644 doc/src/Eqs/pair_lj_sf.jpg delete mode 100644 doc/src/Eqs/pair_lj_sf.tex delete mode 100644 doc/src/pair_lj_sf.txt delete mode 100644 src/USER-MISC/pair_lj_sf.cpp delete mode 100644 src/USER-MISC/pair_lj_sf.h delete mode 100644 src/USER-OMP/pair_lj_sf_omp.cpp delete mode 100644 src/USER-OMP/pair_lj_sf_omp.h diff --git a/doc/src/Eqs/pair_lj_sf.jpg b/doc/src/Eqs/pair_lj_sf.jpg deleted file mode 100644 index a702240003cd4e1bd5043fc5e6a523998fadf8de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15535 zcmd6O1yEamv}Pz?tk9w%NwLzR#U0wxq6JD@+})uNJXoPP1S{@d3c=ke65QP-xCf`m z@_(~CJMZnjeLM4Z-t3o|Br}n7@9)U(e&0Fwe)@hH@I+2ZRtkWDfdPwIfX90Ns7?J?o^}YX3;FETC!m%yKR&sa6IG3r7oA=X~ zW~zfe!0X7bo=ar4`+zkH?{=-@%Ec?-`A?xhLA@x#b34@qvRGSrS?y|mnIG9+Km>9ao=;CzSpLnALPW2 zaF*oqddx@VxSi)BFKy`Q{oLEZ7qO~@S)o$Bi%zkgSX|8Oqiy>5?b=tw;^T4JTR+rv zTg=*(W}@7OgNPx-OPFx-4!_u+m=6#f-Q2MKFfng#jh&7ewkE_aEz^=c+-0}cW`V&S z@U%GZOoo2BA+A84T^?jE`}EL>zcIHZ+anyLtEX1c_x2m^IN$6kYZK{z2!nfoc@Y8# zW_H!+D4B;hF(kx@xD83LYAA9W5?=?3T~CdBJ-$^F2s)-D>3uyNOkV|uGp{jKZ^TP& zFOhQdWPBf|n(C5W47LZ=!{#jCf;3Af{F}Jmb#=9!0?av8PFQE2*+xs_l=;*RGM8eG z|6V%22L#*$ig;UAC9XNAuMSC~rMd>+Dh%3VWIUa}TQ_;H?mf%ODuoPQq_AhbU?`E< zU>sb84)soc2}|&6&K&ZpI)nJOs0^%%erQLB@zcv7jIx6-du-}*N9tWVK89^Qcf#R2 zj&{k?mbOhhpN*7OE#fn<`}nD>tke@gLoo6A#=ONaA1f~W6{-Zv<4_F7H)0g$v2=d7 zSqWdRih#9&Q$^0dBoe3yZgBXs@CqkakLRnBP4ePM=^$!-Cac2i5BC;`qA?KqqRO3S zzmGivI0;gcfjwaA&m#qyz{VQUD?gZ(w5)|o-r1-&zw}gavF%+lY4+=u_QC?5#>+yqE+^VBCZJ^VQ9L+9}eVnK-1toz{$nc zt^0CN7|gRW1Zp5w>}30*_3B6Dv{f6>h&u*BX3SNi6THKG&Fs9$AfjCzi(InSfNG{b^U@*HYVz_UBeoJ-2PjH%#TTx@6<)Zno9x zeX7ph^sD&ZU-wVyop#Z$%U_H6(TK&TmOR^P(~7o=FwJl13ibA9dHa;n(O|e-^|Y>- z9TuvKD=$medMLRe&>KU*XHYsR3p6p(1v0p6FNAMJ7+ta~g;LFwr-3%I@-Cz!OEf08 zfSVBhstQ6m-b)AE=jTYpOKUTWkaRv|m8J;fZ&8%)EK4sK*J^cGMnw}m$WTF)k z@M!k1LM+kam!VbCViwJ2wDv0I8!K8_355r56fFN=dE>*`2M1kgzcnYLvgDqroSF0y zOt1^%;jPRx|2F7W)z=&QQGX3L>OCPCl;Q$bf?dT?YPen_RdO8t&SLkTUw17RTW0on zyy?{E`FULPYB8#Yo2W~Ymyl$qdP|4LXbZPc2VgV1jXi*MyE;S6)RUZE75~egn$2;# z@LgrrxTf`wvXXgQtUw=H42J5q5r+3eSr66h-@#=WFJEDgVMkdz;YZGBSz4M&UZQB( zJpgzYe|bJI0_|O;_Hu}JLukb4^~7seof*^OL|U`N;ft$2ZA^UIdw|3I%VC6^yu+JO zh%HofklAEt+sfr0KtLn$yk6N$#FIJ4$7wpMO7oJ#`>w)1{mRSxB=qcO-IgmSs?og0 zv$a(bAClh1%EB4?R8q4sj!mBSb;qA8#;7)g(VH2@v{sCR(lnxO*Lwi-UloV2<3XcT z3Lc^_xc&=qmfKNXZmA^RDOIhn;|?#_rIS~V2bOO##EYN=Dn*(Ja>Ga4Si;1I2bjQ; zJm2sm3Yu6^(iN!mGx9qI%y({!lL1%J^_8AV_80czITtKX_X*yG2fIG2ex({GD+CvB zSiDSH-HJ$%$7g6zsy+R@C@4j@CipQzF{8`jqe`OB9+0vV2~54>l_*48{{8y~mEYki z*2AeB*x%ipm@8A&05dD!ml;~FOaL%p{hP>mrHBgQb*0d$eg!(b% zKp-1VsVB`a;2gu%`$Y=$mZ|?9uqj$|73*M5WNyCbGX<^kbG_=mJTU7dA-eRq+Ou|i zWu_P3FZY*?bka$tFDu0CXrG9Pt6!YHvS##7q!YK>H2Y=s@8S4shyGw?Q5=?xj18EcYLw zZh)&~vILHM>{9YiyRO0ANmIOs3&j?Ygim^=lj56LO?{?Di2^MB^Zgd>@84e$Jcq=` z(7NA@PaHr+IlRfVZmO}llgGV5LBG7s zX@6cu;MOtiyuM1L9OEsZsIjv?*PcC&yCwOGP=zxDlpqC*nIk5qqQY~DWKPAjfS7OZ z)?fbmawK01SBYG2l)E)EK5Y0s;n8U7EFpWsj@LY043%-Kb$favx-7H_xWWNV! z<;Fd(Jt0=Yg~UIVtx9)!l~{M=dW~>VN;pEwTnNpIu^CZqKD-3#%K}c1`*Uyn&`*rN zofzfknsx7Ra0axp8FfU7R^<*{UCVCMK($47O*Q_b-CPPC=9y9hZVD~5WGUDBenf5j zqnBpt(Wtv*az*x;3auIT(CA8|T@YO5qv6p&_Ok#{W$Ve6-$vuM&^)NtBm+i=z;LRC zr`{2IQJVeT#|Y*sD7AE?h#0wBHgtpRrc3aBE{dOmGL@?cXWE8`NF25y244sO>eh1T(v|)9;bNjO@d{qIpox2 zPZVfviJxHXoCAQqJs@<|JS&Z|o!2^Az;~)_AG;WL{E6qgzaMlrv~}5T z!^EY4QgK=Y)^o^N^i5aUVE9N=ge~$5EwV1>(b(2otXCfuU`O0)#&+c>v?vHk5=*NO z5Y`;sd?G^Tyy~n}?X&-%xQ_o{e)=K7b-VXUf~KLv!anrWsIHsmo8cUGl9X+nM8W7# z>G`?QoBhkX?KDaGbhST=$-sX57klIjYzk!obNGNr&=^N6qm|JG$U?)lDYW`>l4DXv zic>+6nk{Hl2$NO#nnqt%lG*3Zw4z*FMA>N%*w_aq&UO99b9RdN+Lv8{ zZh+VVi?md_{`S4z(`xCr31uK5O8z-jGStx#@G zR0i?I=^^xk`et2dEHNu)P<(Hn89U9e!YJrygfI6*DSP^~EJr}!_o54LgaxTeF;z(J zEG}LB0tZ(HeG!RMy$MF$${wg?-9%;XL20!yzvJe1K&GX?{hnuLx4P8h>L`zChFwCR zMXAT=s9N-cP`&%!G8D2vctb+ZU7UY`v;%FYC^=s7;)!Shhf3aJz}{6HGaT<8V5W_j zIR~pFaz_*fOv=d--ur<1noEbDP6+*qUmq?Rt{Pqk%Tl>D08dC=iq^8 z0pxS=g8RA3P^BLG;5TogBDA=eX`utD0wH;!lG*@8Zk!ZX5roI7IA8Gk{ISI}+}*;W zv5#s_2jaRSoJ}${Hi#8|$6C`KT2~a0-EJ&||J$M3vRvy$1%V-li)SU749(QS1K8I?WBdKkZDCFBP^BLwN0Lw+7s)L3#(2YZRtn-CF|A4!lu#FtjllPX)Y^BdY~SBsX5)1KuA@ z|4S|KdzI9&y7vVU)jd%tw*7;gKKczrWaw0VNexomgbST<$@;e!knMGyFpu_q73Ax2 z2a;R}X{&l~v-A5IOlu9-??vq2o;PGr62TW2CU(OodhH9Yz-n%H}p?;c-X>0sH{ zP4qEXe+sCO^zx`6O4miCV!Hq^GI$?x24DZ+WQQ5K$d1kP(>U!&kC?V}&3a#sv`eg% z+ygF3YTZnjKX%;%*iwWQYKa4?n-`Xbz0xNvWI~BI$@fo4s?=!PmAl1%dPrj!v0TkO zH6|)ES;Z->YV|$v(dHL{xu_KjsJ-gSN4e>0#K*JjYT&W1tvix-ZK|<_m%XDIAi6^L z^Lx5iJ5ttw*JlXRgJuq%@3G4ruh13pPA0nza+-X96_K0v=|D7loS?zlJl48)m#ygH zO8|8~Cd#-xVb)s!r#505uHyt z?XJX9&n%l!AyL)raIbsc|X(b)M?Qs7rZk&m}`<@cd2k#)9zwBp@ zvN>>4qJOy>=Pc9_PboKpN6d(8)Bb+nQZ(cT^r#5VFl$$hcJT~5SEf5 zvt6m!cM#HZ53gk{p5Y$w$II*+p91G*bw0W%JrQmAos0alZ8Y-Sx}7oX z5D_kT&fqTcn6qQ>{UFoI=5y2_J1#XmtzZ8hAiHnCX1DJgxUa$KFAhTYyZEFik;q5S z_{Vk13kkm{VlF0l%CBXgNGp7?-t&C1XFqeVQjhEkM(;18+095v#lyqgcGr6EN{$yo{6+FJ&NiLC zYt!1nqpDzc#1j@N{1!DIdy6{&6$6fqx@#_Aj63bPSbqhY_56Lmra8Do*-=dG4SBI( z8*z7&-lT)(=~Mk#{XEz3Gz@6tO54Vm?!yVyY8hxV)n!N1HqNWYFfKQS)Y1mxEnhKb zyk+lIp=)7}c3#Dlwy_S6a#YzOY+fmIl>zEq8lrNjF*kr1vr~ zH@+RO7$iK=AE(%#yHKCwxjpZ4X}ycaP!sedOf%~wHu#Y&5iM9G&hIax0B^5nL**F9 z$V)i5JI*j*`zc7gd>-IadB+qSkJ)8EZGn#G9vv&5)^T2|&rA7UoS*KX#>_ahZm-7R z8;C!&neFIl>i$&Oh{{>|?bGStxjhnnY5OJEBhJh9?t8#ddg49cL_PhacfhZ~j3F#! zp;2s4bckc8!2YOS{Zt0{x`#nz*GN$;Xc7KrpwTUcN8?iPSjg&`gNDbV2z8jJ8!eID zn6MRhoafX5RiDf^h8)scdZHoBPB_C)y?$g$?~L!ddFCbXX(E029>)vi=3CpHk@I1I z^8+`{IDWeBx-w+NQ)!1ZWUuwUgi~ZQ-%)A&jg{QT2c;>j+WFr+3J-X<&0W4()V+1n z)iG-yFQvNx&#OC}tjUsg@>mnJmBr=nUFVr`HlZ`2vRZSue7ygoZpd-%?I6bvyPxr0 zan)Qyd$SfSW(mdj;?D%K-M6PFBx+>Au}fBi_OlIwix8H6q=2BoQ}bcWd$yy5Hdy z{r-KJ#PMrZG(A0A-#)~OF6?NIJucVQ)iflz&}gkhWG!;3jPcu4Bt_H$-0iswP-Lq2 zap|g{f4xU2Ftw})J(*wf;q2heHg1fA+9`yu|I|)NcH7DkS9z*nq0FSpP1hyX4ArXH zJP0^uNa$6iC+XET7v2dz1it|%bGhARZ&>UVH(CWPyPl3}X3Ce)@km-5v&(Gn4~j=5 zq8cNzT}H)x9y=L-mW-=gThJBeQOhnNCYzM!pFP*57EJ2X_zck-Ipu%FyWv>tb2ue3 zT&wy>S0KQPU%T_BdT&6)w02pys~f#SHI=PNA_IB*_u1^f-tjm?ADO8|RiWTQp?Klw z*G&lL2D0I|3|@1 z%N|zo;66pg3&ACXdW5Vgw~hRkv?%3iEZa8gn&{2qj9$2@t+YVp3r?g((%q_%}q87=B7R&LQ zw<*R&vnaKx%EOl@YEuV78;$P)SaKwV*+Cdsen%eSU+w{m4CCZOCkwa0sL4QU%#@P8fyLo`;4P%6iQ$-WYynBeWa zn5;KP!}kEbOav1G%kglk#c9cke3kHLx@HT1X96-@DLi9$h{b{nS2wRM znK6sjFEY`KYT=_6?Q_Pnp4ykWt7*yioL`kC0uBR++svJ>CIOqJ2_JP;1LV$C`?9T_ zHp#B+%bB~cKqJjjdFD?uePZg*@3Mm*oYEu37;&0NFXGA)MUJt`jUsOwA)!ZgfOAiMg(6-_3|c81P7tN8%jic zC93xOfmCc1Ipoh4$hWEcGHieAQak60Mo*SyKK3M#O$n9ciTj6?s|sQ@-Z4fPc;T}VsvM)c6NV#kkj z4#sd8J6#7~?%;C(zwEjCrr%9|xM8ttyd6V&mx}*Q^FYD^QyvL7r~hx^xup%Ps#emb zNa^3Zo8ae04qz%1E8P;qA2YUe98!fF=Ek3|j+@F_2eW9m|JK+C>^TX{`{WlKYe2mK zlPif7!Z{a$9j@ES&&M*OCj5wz6UFxcw2teH?TI)3=I_5G9VR7frkOUk7zf$V%n^C? zo)d-axb!zXOlfILmk@*B$Ag?9Yo`s9U1K3R@59Odkuf(j$`2^@K#}>j;#LlpHw!6n z4P6FTo6@caO7k4c$%7}86mtw6SFe~|jz%=Ueg_q_q!q?-i`lf3q|Kh{D|i+j*B^L< zo*O3F?H&5v@IW+*P7W9cHD8ksxlI(VR;ZxMI~aB-JR(=ShwMj%`ykEt0I23+ndyhl zNa=YPhIwD6k1g{=QB_gH;%klc_d23ZY z;L<@&;PGkA1{GoK!L!U>w_%8FW-OdVN`Q4!kM8gMz7YD*ZlXbWP^9rkK**2IZ8S2E zd73E)4>I%RHXV`EUcotW6*~2jPGwp7%Kux5jq){ej9S_Rh^b{i90XyN#Xj~Mr&$&e zd7oRI9l3mV%q_YqI2$(&+sSzqs#Z~r5i=&D&xHYi%U zuyz_&?s4@!D#5cw{lefv}T z5Pl?(hNg?xoR_#2V~=u_o_+%nk*~R57`tr!MVsBpcl1rv0En)`-N|vw$;y~7BbtV9 zG&D)nlizr~ryA$RxQw4!PL^ZKf|1v5*g7T?k+%Mi(SINLmo?oy+Ad*VE0Fg9zb>f_ z-2i^(MSpZVq+gu#%GgBt^tc z{bW^k)1GB(P*4k_izMw`yhzT|yzrQ-mtfXjD+j_fD1@A#a`Vp|91$=>h&|{*+CRD& z5AKYvnR*ZMeH0wn5hk*`jFzfOU;cReYsbhT%+W4DmT@{rkgv0!gh7GPJrXpk7(4M# zY&_%8i)@qU)52A)oI+RAIeph98(DuhiV-a>=reitWMoHn@jFI`lx|a>8xAJr&y_f? zTJIo(XxBQN7cRXRlgYy~hHTIMnhrgyE^l0AAI?2AOsk?>!f#M2P4|vpZN&drlDSAZu->81Eku;6FsD#PQTs!^0|8O-me8QTP;s>ChInw=|B&PBT!6_|jLa zzgs*xfBJ69+`5oTwQe@v0yF3RS-XzQSB^%$R>joBl=5Hg&w4Ge!9}1|TV03lMvjx= z01>vsDA$5+T=HIr1L`)7Zr5{up&S9`zQ?xJ-7XvA4OpKkOC1{&?akB_XYrmVdj}>C zN_Lkbdd*&|&wr&b46&4oQ<)OoT3js7(jn9Vg*u8{|FvrL2K6kg&3AtbTj)WwIWW(* z>ZW#%%5_-{AXtYMqs0RGkPT~M=Nn>Od#f}LswDu(_?K<$Pk%MbQg9k$b)I6ZpBa~` z4Az&bMJr(VZ=_JY#A{-!B$-ooh8eZ|OCLkWoK|ELRX%G$@tSlYYTjmSCwHM?dkJ4d1Ze-f-U95>gilz zQ2C#JCgOaq;vyxh&own))`y{z)l`G27K08u>y3Xt+B(!ww;AfBpj55u$1DjR;bnX; zCOR?w={G#OHoCw!Xup`8vC1mS+yRDl3#F;S=a23IBw>PD-`b)h(E@Vk(yUlvar_|} zG6b^292V2hx0Nn~%~+9`Zh695surIjG(60i_Tw@bo6VE=d0`y;7qhgZ_*?AN%2k?Y zFFD52gm%@#%iGy(=X8-oRjq%0@mM(q*2+#j9D7Z#q&|!vQ`WAVzv^K}s{QC8JgHZ8 z!o?ULVF2UY19Dbzdu7TlAuzG1qY8YN=unA2+}sNFeZnRl^lCx6$Jc{FQfrsdwKtFN zY|$k9&d?hvr;L9mm;e19VY8)riEWYUZzb}Olh@*}3|*n%QGQyyy|>^Ms9E{tJOzt& zo-WF9`;BmJl2ZN1Wl7PCFOcMpuYIcsX5I2rKb-@;+Tu=akAdPntteV@N3n&akPIj!mTHUTJuM(uzrARmB%0xhFv1R_g z{aSOAJd0BQbzOdAsA~2yYDY)UHYz=4<-~|#UQDNS=5d{e7#o85Y@$I|!g(O? z-72N#1Gya9$2PU9wWh=@WS9|n-S;6prOWYr)SP>c;Uq+W=k^{jTlvcfPL=pfxms{~ zc#cCh+CV1efjf>=u+{3X-ycqpd zkFBK z3<;;gaIBE?QVq9jIncdK@n@@M$x{Ov#93&6k7Mm0YGAZ8hiXea!eh-PB_(%}7<3K5 zWCru_b(fuT^uB@P=MuqsfWzQTol{Eo2r^fY*`Geq5=xA;x6gE~+fwbA-)4K|q?=fO z*tF~*x9qd*A8E&8<9=XEL{>C7eZk^B#D8_Etbe#^Yg1Dhls)4IPCYe?$Xrjp($<94 z7`?~L!TZ&_Wu1HcTdH5lo#ER3(8_m`eheEyvdUZ|1q3qvvjFS$d^m(vw#h9 zhh{pnOHWJHj|swOxmDJ?y(i4XP(#qgI2FxdUh4jwv$67JW7EgfzO(JCX#TL~_Z5zJ zVSTqRc<%u+HKooCkDQtUF`m~-`2QxnIAY9_K?sus1tRLL_iz=r#Mg6be!0W*(j}`F zgF-S_l|)P0jJgJ35gX-vXi9^uo~;{+_g~}=g68PrOeuUFg{wyS`QKgnrAgfbNLQE3 zkHhw1=ubj8Ge0LTp@44&&T~R;bSPe*QK`1cAl4-0tBA;B#ZUc#095qa4!@JwJXT}+AZ44HC_X>m$Yn6w7aw? zZ*8;$sIVBqiWb5TG;%0Xyjc@{TX!YI-W1-EFlvjntL*p&TS#d z@M?h7i!97bOLw#@5;NF-5@}yv-L*QXy963Su}W*+;-%At<`;}KtNZD;9)7}YnUdVf zkNW>^a>=9j`~xs2s;x+$0~)*sIAf`~@m^`!CE~n{xC=cOhqa@k$|@qiKvUkBV_itp zX(&@Lul+3F$XgYXl4r1YbnBvTlB$}uN%Z0hkNzw+yFejud_o+=#`w~YOE`MH5uE*ENej`777e$2pvsr5n&O~*e z?>09?!oZ8k`L4S+3u_NWX%BK4M({>Mdd8ybFi->h?%-e$En57h!5ikBPBpditM&X; zvz~slXFQM&Uh%GVp5MTOo1{=1PhwsbdalyMFS&Qojw*Fwd$yp^4x5T%U76ZLpZ%ps zd2sJb)SwV&l>iYkZNL4v5iUb?O>G=NlwM*J;r+SF@x6v3*Cyn=ynifWJ%Y2{N++ge zF`B^PLz5R#Y)i|9Wp~9r;89C*qu*bhl!r)9HOC7Is)JI~sE2*%uaNF5_up z2oL9gMl1uERM$2gXQJEGTBIx|-0-(M7L7*+u!gu2fxr|bI9@0mnp~Wh7L#xH=48V| zGL&+aN%5%wu)lfzI(jBsgb;`I9e3+_&1tf2{keQQuF>wCgQ$0ca?d)nHq>do6ZM*& zc?sS=Gd!JZlunCqWu$mAbs_w`Yz|aymExDuo^&)Ml-jk7j?rgCYH%4lQ9YGn@ZO$* zs3jQgmpVNV(NR1Wwbu08?r#!%iz4@cF{xtnprF!Xx75y=zv}kxLLYzd{W{hrN{LCO zyHZHzcvAJlt2B&~Bts%(ct^X_HMQeKT((g>@l6c2#o}V7Nmaf9tX&2qkpq|VTRI4Y zZEHsL>}VP3m9qo<6^naaM}i%pMr)aitE z*EZ1t6tzy^4iM>9vqZ#=z^y^Ld$ShT?lPBiBVuJgMLZnhwrOy{PcQN zoB}9nD<1BAV7tm66&R~Lk9?XJJrvEmRk@w-E|EZ>gshJbqSeAkC*`Zsv1LP0it~(b zC2a~*1HNJBj>I+W2nXpdg6)F^_dPm8%R9xDcw)<<>e!6qZVtACeIkhy2@K8t=KL)b zF1}3ehID#}plIO~fkP2U1yMo(MT{wZ8cuvwpFEd8 z9_UfHgv1Ahuau!{@omzC+zCUqB@X=B*?8}WzoY&3=OHGr_a9V`?LvtyR;pdXF~`Ju z;g@QMx;g_!1YE+tErB6Fs-b*E?W&8SJfEAx2FPW#Xl#7S_%Lm5Jv zG|z;-a}DV#Gun+j-)=7(!GdIBapb)J@by?NVXao_ajz-6E`q4LK#Bb^S_UgF&j{a& z!Qud|Gs-L8GzneSd0+>E_kfuT+)k)RLj1TdnxJ?j&mccRChCE#{aC>*#NEQhG612DeYMG6X#g*aD2K*)K zjTFw0lO_bw36qogb=um&s;BJ1SLRs?e<0b>E9=h)wrD7=r%Tf@U*`zqbsU+rbGrRj zZsWHw$*ymS;MBKasDwfujA?$(P`H2y+T2?WHF0tNy+@hub-mSbqniCR9w9kVR>})GP_d&?xB0T_I(@dOwVr^K5*vyV z=# zLi_#j2`eOjr|$?I{R=nG9*m}-=`W3eRRUCO)8V~Ez%rM3D%-g?8XUt+pn@Z9BDO|p5SP$c%FMe3VLZnWx#mw>TX*3H2pfAWNGTs2?ZRx2h2H4Dx2M5dkeVXo;L{HF$fPo zNG>Xkn%zqsmo}+QVV%g>%3in?OAkh31TkGPXP66&W{OfMdz?4I>F4E-Jy8uiVvaR8 zwz_)P=C{}>xf^pN1*)8{j=2tv-F*Q%&xyvg=DgqKmTQ;b8|@SQv7YH3%V(`!@6Hd< zA|fsk9r}H_;=R-8<2aV(H2qRLEa6UXl_c!Oh$!trSHUy8T&JO0ol_V;;V1Bw;`KXm zJQFA)it}~O*GCD~Huv)w+Q{@$TY5;zsoFc-RO=@R=LuBw{+%VZ7?})pJXGA7ICty* z)O`v1lll%t;qO62bK>?H*Uh24(V*YCiI(IS%jLuFk5=1Sd)WtLa%f_S0vM-tAmIFu zoE8S36Qi($Z&ND-z22^x1*iO4w`ib?@2`%f8BEMF8_j=W4CVT9<|y$i^?NoVmhU{F zQ#t$GalOd5K|nL7nhxf}30LbG->ke2B-;eRZ+piJCbPo}$mN`N$BM_sXqCCjO37r0 zF(vC}G$Mj7_dL?XE{#~XCLCi@G7|@bbGkJ&a{ZAy*Gl#+N+w*Zk_z5WJOq11y}l>H zcoz>%sSA{bl{PkT?(80m>@(nZA2oVY2CxtG@_a2Fib7l^W9FQg9-g8zqbvq65Jct= z!z8%nnI~O9T~=3nRWYZ@s>tp}*wx3pOZ=Pqed(oRi0;&cPK8p6aDOqPyLRszWekw9 z?c)Vs!ybWuDgIP*z}8`n8Q8C1e+d{!&ePfXo`YH8Z{G!w>7!xVJnsO3;%hN*Rkj%HIDf!Q{ogB-$?L zynk>X=EHqz@zHg!%wQ?9E=tKF^B3tl0>)eBL_}<`y{2AQ1P4ackOQ&OkFE_jafbuL zbuBl%tRzgv+#;i-%|{Dd;m=`CteeehNnW>BnZurhsIt@~KLPa5ViXWKUlqQ1u{5R|da;j@ zIAGsGP@WQq5u4<{BL()I&WbA8P2vY@j&wh8hzB;RrsTP6}C-X5A@r|81N2ozqLPfdjoAxaSuHbx?xs~s3i%A8*ug;{gBg@G%#=* zqiLJQX!&eQ8~9XO%(uzEr+xEt6Xx#Vz*d~#6G!Q9uycl5v8ljkrnJC|&M zEQ+zTtln%V>moR4b}UX^J^^X$V^!J%E21}!Ho299c2*5N)Vtl!br^l{*+g`{Z-a=y z8PxcHTM20XMf@7Nak{g8xQk`qndC+aJA{je|3VdS<9ED-pAMdlxdGhfH+~Y)J@&L z^(~Fx*KkZmPl!n!a`b;>C-$(LOc@zpT;94E5f(0It7)%YNI0JB&{bGCGcSifD)Kq! z2;mW3I~RA3=qE3r|KF%E|12p>Nyv?yty3%7Lm^S{xXd`~^^j1JDO6qYPI+V#rFJrHRmUOuVcfo=xqW-0i|USPgSl%lzg}${!MOtf6_!XJwd$FM5=u;MB{mLl-ulv}FMFXPCFJ;}e$+Q7K;5MjK9U^=oN}xbXU>phd5|BjeVAURr$4D+SS?{JYhygLk|mYWq&+zW zy(hXe#*Vu5{*ro3f|Jv#vQlG$VvDC^vRU{wO|!kPz-9}*8GZ9e>QI4M|9gwd%-oq+OA2qpD?syZ88RbGb^8E~Jso7wtmF$blGGd)17Hrb9d-yR@ogl)@c}1X zu2(C4XiD=qimv6I38gY_nGrg0e`w1haAf2`7K3&)zaBLBQ%(g5;{A>*LzoKS z)BW_WV9@k_f_I_U3_=T_b$Q4eVmn0#BF9G|0f>nz=JH5Lf@~6C6j9SlQo1MN zh4KF6Kx&Y)b8j7}GsOXte3vYK+rW8c=-(2Wibyvohdru$NMf`-m|Tt0w%x{f-6Njc z+2PGt7wAPpf7Q^M~!n*miyk(D_^rPuA$BGwAd)#^)9XJl`N zm-OqmMsnW?F=Q(?smk+gMwNC^K^W$>FCuYWggT-Qo{D#Z$rwQ+fhbN7xTQM5Az;a0y#nppMQl)9I;+CbW2pt3>{NX z`UL%7A=`}um!QX<% -#include -#include -#include "pair_lj_sf.h" -#include "atom.h" -#include "comm.h" -#include "force.h" -#include "neigh_list.h" -#include "memory.h" -#include "error.h" - -using namespace LAMMPS_NS; - -/* ---------------------------------------------------------------------- */ - -PairLJShiftedForce::PairLJShiftedForce(LAMMPS *lmp) : Pair(lmp) -{ - respa_enable = 0; -} - -/* ---------------------------------------------------------------------- */ - -PairLJShiftedForce::~PairLJShiftedForce() -{ - if (allocated) { - memory->destroy(setflag); - memory->destroy(cutsq); - - memory->destroy(cut); - memory->destroy(epsilon); - memory->destroy(sigma); - memory->destroy(lj1); - memory->destroy(lj2); - memory->destroy(lj3); - memory->destroy(lj4); - memory->destroy(foffset); - memory->destroy(offset); - } -} - -/* ---------------------------------------------------------------------- */ - -void PairLJShiftedForce::compute(int eflag, int vflag) -{ - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; - double rsq,r2inv,r6inv,forcelj,factor_lj; - double r,t; - int *ilist,*jlist,*numneigh,**firstneigh; - - evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = 0; - - double **x = atom->x; - double **f = atom->f; - int *type = atom->type; - int nlocal = atom->nlocal; - double *special_lj = force->special_lj; - int newton_pair = force->newton_pair; - - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - - // loop over neighbors of my atoms - - for (ii = 0; ii < inum; ii++) { - i = ilist[ii]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itype = type[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - factor_lj = special_lj[sbmask(j)]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - jtype = type[j]; - - if (rsq < cutsq[itype][jtype]) { - r2inv = 1.0/rsq; - r6inv = r2inv*r2inv*r2inv; - r = sqrt(rsq); - t = r/cut[itype][jtype]; - forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]) - - t*foffset[itype][jtype]; - fpair = factor_lj*forcelj*r2inv; - - f[i][0] += delx*fpair; - f[i][1] += dely*fpair; - f[i][2] += delz*fpair; - if (newton_pair || j < nlocal) { - f[j][0] -= delx*fpair; - f[j][1] -= dely*fpair; - f[j][2] -= delz*fpair; - } - - if (eflag) { - evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) + - (t-1.0)*foffset[itype][jtype] - offset[itype][jtype]; - evdwl *= factor_lj; - } - - if (evflag) ev_tally(i,j,nlocal,newton_pair, - evdwl,0.0,fpair,delx,dely,delz); - } - } - } - - if (vflag_fdotr) virial_fdotr_compute(); -} - -/* ---------------------------------------------------------------------- - allocate all arrays -------------------------------------------------------------------------- */ - -void PairLJShiftedForce::allocate() -{ - allocated = 1; - int n = atom->ntypes; - - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; - - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(epsilon,n+1,n+1,"pair:epsilon"); - memory->create(sigma,n+1,n+1,"pair:sigma"); - memory->create(lj1,n+1,n+1,"pair:lj1"); - memory->create(lj2,n+1,n+1,"pair:lj2"); - memory->create(lj3,n+1,n+1,"pair:lj3"); - memory->create(lj4,n+1,n+1,"pair:lj4"); - memory->create(foffset,n+1,n+1,"pair:foffset"); - memory->create(offset,n+1,n+1,"pair:offset"); -} - -/* ---------------------------------------------------------------------- - global settings -------------------------------------------------------------------------- */ - -void PairLJShiftedForce::settings(int narg, char **arg) -{ - if (narg != 1) error->all(FLERR,"Illegal pair_style command"); - - cut_global = force->numeric(FLERR,arg[0]); - - if (cut_global <= 0.0) - error->all(FLERR,"Illegal pair_style command"); - - // reset cutoffs that have been explicitly set - - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) - if (setflag[i][j]) cut[i][j] = cut_global; - } -} - -/* ---------------------------------------------------------------------- - set coeffs for one or more type pairs -------------------------------------------------------------------------- */ - -void PairLJShiftedForce::coeff(int narg, char **arg) -{ - if (narg < 4 || narg > 5) - error->all(FLERR,"Incorrect args for pair coefficients"); - if (!allocated) allocate(); - - int ilo,ihi,jlo,jhi; - force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); - force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - - double epsilon_one = force->numeric(FLERR,arg[2]); - double sigma_one = force->numeric(FLERR,arg[3]); - - double cut_one = cut_global; - if (narg == 5) cut_one = force->numeric(FLERR,arg[4]); - - if (cut_one <= 0.0) - error->all(FLERR,"Incorrect args for pair coefficients"); - - int count = 0; - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { - epsilon[i][j] = epsilon_one; - sigma[i][j] = sigma_one; - cut[i][j] = cut_one; - setflag[i][j] = 1; - count++; - } - } - - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); -} - -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i -------------------------------------------------------------------------- */ - -double PairLJShiftedForce::init_one(int i, int j) -{ - if (setflag[i][j] == 0) { - epsilon[i][j] = mix_energy(epsilon[i][i],epsilon[j][j], - sigma[i][i],sigma[j][j]); - sigma[i][j] = mix_distance(sigma[i][i],sigma[j][j]); - cut[i][j] = mix_distance(cut[i][i],cut[j][j]); - } - - lj1[i][j] = 48.0 * epsilon[i][j] * pow(sigma[i][j],12.0); - lj2[i][j] = 24.0 * epsilon[i][j] * pow(sigma[i][j],6.0); - lj3[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j],12.0); - lj4[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j],6.0); - - double ratio = sigma[i][j] / cut[i][j]; - foffset[i][j] = 4.0 * epsilon[i][j] * (12.0 * pow(ratio,12.0) - - 6.0 * pow(ratio,6.0)); - offset[i][j] = 4.0 * epsilon[i][j] * (pow(ratio,12.0) - pow(ratio,6.0)); - - cut[j][i] = cut[i][j]; - lj1[j][i] = lj1[i][j]; - lj2[j][i] = lj2[i][j]; - lj3[j][i] = lj3[i][j]; - lj4[j][i] = lj4[i][j]; - foffset[j][i] = foffset[i][j]; - offset[j][i] = offset[i][j]; - - return cut[i][j]; -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairLJShiftedForce::write_restart(FILE *fp) -{ - write_restart_settings(fp); - - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) { - fwrite(&setflag[i][j],sizeof(int),1,fp); - if (setflag[i][j]) { - fwrite(&epsilon[i][j],sizeof(double),1,fp); - fwrite(&sigma[i][j],sizeof(double),1,fp); - fwrite(&cut[i][j],sizeof(double),1,fp); - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairLJShiftedForce::read_restart(FILE *fp) -{ - read_restart_settings(fp); - allocate(); - - int i,j; - int me = comm->me; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) { - if (me == 0) fread(&setflag[i][j],sizeof(int),1,fp); - MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); - if (setflag[i][j]) { - if (me == 0) { - fread(&epsilon[i][j],sizeof(double),1,fp); - fread(&sigma[i][j],sizeof(double),1,fp); - fread(&cut[i][j],sizeof(double),1,fp); - } - MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); - } - } -} - -/* ---------------------------------------------------------------------- - proc 0 writes to restart file -------------------------------------------------------------------------- */ - -void PairLJShiftedForce::write_restart_settings(FILE *fp) -{ - fwrite(&cut_global,sizeof(double),1,fp); - fwrite(&offset_flag,sizeof(int),1,fp); - fwrite(&mix_flag,sizeof(int),1,fp); -} - -/* ---------------------------------------------------------------------- - proc 0 reads from restart file, bcasts -------------------------------------------------------------------------- */ - -void PairLJShiftedForce::read_restart_settings(FILE *fp) -{ - int me = comm->me; - if (me == 0) { - fread(&cut_global,sizeof(double),1,fp); - fread(&offset_flag,sizeof(int),1,fp); - fread(&mix_flag,sizeof(int),1,fp); - } - MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); - MPI_Bcast(&offset_flag,1,MPI_INT,0,world); - MPI_Bcast(&mix_flag,1,MPI_INT,0,world); -} - -/* ---------------------------------------------------------------------- */ - -double PairLJShiftedForce::single(int i, int j, int itype, int jtype, double rsq, - double factor_coul, double factor_lj, - double &fforce) -{ - double r2inv,r6inv,forcelj,philj,r,t; - - r2inv = 1.0/rsq; - r6inv = r2inv*r2inv*r2inv; - r = sqrt(rsq); - t = r/cut[itype][jtype]; - forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]) - - t*foffset[itype][jtype]; - fforce = factor_lj*forcelj*r2inv; - - philj = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) + - (t-1.0)*foffset[itype][jtype] - offset[itype][jtype]; - return factor_lj*philj; -} diff --git a/src/USER-MISC/pair_lj_sf.h b/src/USER-MISC/pair_lj_sf.h deleted file mode 100644 index 1a4106b782..0000000000 --- a/src/USER-MISC/pair_lj_sf.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef PAIR_CLASS - -PairStyle(lj/sf,PairLJShiftedForce) - -#else - -#ifndef LMP_PAIR_LJ_SF_H -#define LMP_PAIR_LJ_SF_H - -#include "pair.h" - -namespace LAMMPS_NS { - -class PairLJShiftedForce : public Pair { - public: - PairLJShiftedForce(class LAMMPS *); - virtual ~PairLJShiftedForce(); - virtual void compute(int, int); - void settings(int, char **); - void coeff(int, char **); - double init_one(int, int); - void write_restart(FILE *); - void read_restart(FILE *); - void write_restart_settings(FILE *); - void read_restart_settings(FILE *); - double single(int, int, int, int, double, double, double, double &); - - protected: - double cut_global; - double **cut; - double **epsilon,**sigma; - double **lj1,**lj2,**lj3,**lj4,**foffset,**offset; - - void allocate(); -}; - -} - -#endif -#endif diff --git a/src/USER-OMP/pair_lj_sf_omp.cpp b/src/USER-OMP/pair_lj_sf_omp.cpp deleted file mode 100644 index bd9d5220b8..0000000000 --- a/src/USER-OMP/pair_lj_sf_omp.cpp +++ /dev/null @@ -1,164 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - This software is distributed under the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- - Contributing author: Axel Kohlmeyer (Temple U) -------------------------------------------------------------------------- */ - -#include -#include "pair_lj_sf_omp.h" -#include "atom.h" -#include "comm.h" -#include "force.h" -#include "neighbor.h" -#include "neigh_list.h" - -#include "suffix.h" -using namespace LAMMPS_NS; - -/* ---------------------------------------------------------------------- */ - -PairLJShiftedForceOMP::PairLJShiftedForceOMP(LAMMPS *lmp) : - PairLJShiftedForce(lmp), ThrOMP(lmp, THR_PAIR) -{ - suffix_flag |= Suffix::OMP; - respa_enable = 0; -} - -/* ---------------------------------------------------------------------- */ - -void PairLJShiftedForceOMP::compute(int eflag, int vflag) -{ - if (eflag || vflag) { - ev_setup(eflag,vflag); - } else evflag = vflag_fdotr = 0; - - const int nall = atom->nlocal + atom->nghost; - const int nthreads = comm->nthreads; - const int inum = list->inum; - -#if defined(_OPENMP) -#pragma omp parallel default(none) shared(eflag,vflag) -#endif - { - int ifrom, ito, tid; - - loop_setup_thr(ifrom, ito, tid, inum, nthreads); - ThrData *thr = fix->get_thr(tid); - thr->timer(Timer::START); - ev_setup_thr(eflag, vflag, nall, eatom, vatom, thr); - - if (evflag) { - if (eflag) { - if (force->newton_pair) eval<1,1,1>(ifrom, ito, thr); - else eval<1,1,0>(ifrom, ito, thr); - } else { - if (force->newton_pair) eval<1,0,1>(ifrom, ito, thr); - else eval<1,0,0>(ifrom, ito, thr); - } - } else { - if (force->newton_pair) eval<0,0,1>(ifrom, ito, thr); - else eval<0,0,0>(ifrom, ito, thr); - } - - thr->timer(Timer::PAIR); - reduce_thr(this, eflag, vflag, thr); - } // end of omp parallel region -} - -template -void PairLJShiftedForceOMP::eval(int iifrom, int iito, ThrData * const thr) -{ - int i,j,ii,jj,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; - double t,rsq,r2inv,r6inv,forcelj,factor_lj; - int *ilist,*jlist,*numneigh,**firstneigh; - - evdwl = 0.0; - - const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; - dbl3_t * _noalias const f = (dbl3_t *) thr->get_f()[0]; - const int * _noalias const type = atom->type; - const int nlocal = atom->nlocal; - const double * _noalias const special_lj = force->special_lj; - double fxtmp,fytmp,fztmp; - - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; - - // loop over neighbors of my atoms - - for (ii = iifrom; ii < iito; ++ii) { - - i = ilist[ii]; - xtmp = x[i].x; - ytmp = x[i].y; - ztmp = x[i].z; - itype = type[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - fxtmp=fytmp=fztmp=0.0; - - for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - factor_lj = special_lj[sbmask(j)]; - j &= NEIGHMASK; - - delx = xtmp - x[j].x; - dely = ytmp - x[j].y; - delz = ztmp - x[j].z; - rsq = delx*delx + dely*dely + delz*delz; - jtype = type[j]; - - if (rsq < cutsq[itype][jtype]) { - r2inv = 1.0/rsq; - r6inv = r2inv*r2inv*r2inv; - t = sqrt(rsq)/cut[itype][jtype]; - - forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]) - - t*foffset[itype][jtype]; - - fpair = factor_lj*forcelj*r2inv; - - fxtmp += delx*fpair; - fytmp += dely*fpair; - fztmp += delz*fpair; - if (NEWTON_PAIR || j < nlocal) { - f[j].x -= delx*fpair; - f[j].y -= dely*fpair; - f[j].z -= delz*fpair; - } - - if (EFLAG) { - evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) + - (t-1.0)*foffset[itype][jtype] - offset[itype][jtype]; - evdwl *= factor_lj; - } - - if (EVFLAG) ev_tally_thr(this,i,j,nlocal,NEWTON_PAIR, - evdwl,0.0,fpair,delx,dely,delz,thr); - } - } - f[i].x += fxtmp; - f[i].y += fytmp; - f[i].z += fztmp; - } -} - -/* ---------------------------------------------------------------------- */ - -double PairLJShiftedForceOMP::memory_usage() -{ - double bytes = memory_usage_thr(); - bytes += PairLJShiftedForce::memory_usage(); - - return bytes; -} diff --git a/src/USER-OMP/pair_lj_sf_omp.h b/src/USER-OMP/pair_lj_sf_omp.h deleted file mode 100644 index 92db973b3d..0000000000 --- a/src/USER-OMP/pair_lj_sf_omp.h +++ /dev/null @@ -1,48 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------- - Contributing author: Axel Kohlmeyer (Temple U) -------------------------------------------------------------------------- */ - -#ifdef PAIR_CLASS - -PairStyle(lj/sf/omp,PairLJShiftedForceOMP) - -#else - -#ifndef LMP_PAIR_LJ_SF_OMP_H -#define LMP_PAIR_LJ_SF_OMP_H - -#include "pair_lj_sf.h" -#include "thr_omp.h" - -namespace LAMMPS_NS { - -class PairLJShiftedForceOMP : public PairLJShiftedForce, public ThrOMP { - - public: - PairLJShiftedForceOMP(class LAMMPS *); - - virtual void compute(int, int); - virtual double memory_usage(); - - private: - template - void eval(int ifrom, int ito, ThrData * const thr); -}; - -} - -#endif -#endif diff --git a/src/USER-OMP/pair_lj_smooth_linear_omp.h b/src/USER-OMP/pair_lj_smooth_linear_omp.h index 940c0ea707..874e42eb9f 100644 --- a/src/USER-OMP/pair_lj_smooth_linear_omp.h +++ b/src/USER-OMP/pair_lj_smooth_linear_omp.h @@ -18,6 +18,7 @@ #ifdef PAIR_CLASS PairStyle(lj/smooth/linear/omp,PairLJSmoothLinearOMP) +PairStyle(lj/sf/omp,PairLJSmoothLinearOMP) #else diff --git a/src/pair_lj_smooth_linear.h b/src/pair_lj_smooth_linear.h index 0e3376b789..c18c442a18 100644 --- a/src/pair_lj_smooth_linear.h +++ b/src/pair_lj_smooth_linear.h @@ -14,6 +14,7 @@ #ifdef PAIR_CLASS PairStyle(lj/smooth/linear,PairLJSmoothLinear) +PairStyle(lj/sf,PairLJSmoothLinear) #else From 04ebd81ac5d01c4ed615856e52f1156bd4820699 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Jun 2017 17:26:18 -0400 Subject: [PATCH 136/302] minor whitespace cleanup --- src/write_restart.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/write_restart.cpp b/src/write_restart.cpp index 77e2cb05d9..ad6c756558 100644 --- a/src/write_restart.cpp +++ b/src/write_restart.cpp @@ -185,7 +185,7 @@ void WriteRestart::multiproc_options(int multiproc_caller, int mpiioflag_caller, if (strcmp(arg[iarg],"fileper") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal write_restart command"); if (!multiproc) - error->all(FLERR,"Cannot use write_restart fileper " + error->all(FLERR,"Cannot use write_restart fileper " "without % in restart file name"); int nper = force->inumeric(FLERR,arg[iarg+1]); if (nper <= 0) error->all(FLERR,"Illegal write_restart command"); @@ -203,7 +203,7 @@ void WriteRestart::multiproc_options(int multiproc_caller, int mpiioflag_caller, } else if (strcmp(arg[iarg],"nfile") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal write_restart command"); if (!multiproc) - error->all(FLERR,"Cannot use write_restart nfile " + error->all(FLERR,"Cannot use write_restart nfile " "without % in restart file name"); int nfile = force->inumeric(FLERR,arg[iarg+1]); if (nfile <= 0) error->all(FLERR,"Illegal write_restart command"); From 1f9504c54622f4b1c5eb2a8bd6526a1c7a475583 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 6 Jun 2017 17:31:45 -0400 Subject: [PATCH 137/302] some more bookkeeping updates triggered by the lj/sf style removal --- doc/src/lammps.book | 1 - doc/src/pairs.txt | 1 - src/.gitignore | 2 -- src/USER-MISC/README | 1 - 4 files changed, 5 deletions(-) diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 1769f29825..69c215a2b9 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -446,7 +446,6 @@ pair_lj96.html pair_lj_cubic.html pair_lj_expand.html pair_lj_long.html -pair_lj_sf.html pair_lj_smooth.html pair_lj_smooth_linear.html pair_lj_soft.html diff --git a/doc/src/pairs.txt b/doc/src/pairs.txt index 538e2a7268..2c1b20f4d3 100644 --- a/doc/src/pairs.txt +++ b/doc/src/pairs.txt @@ -49,7 +49,6 @@ Pair Styles :h1 pair_lj_cubic pair_lj_expand pair_lj_long - pair_lj_sf pair_lj_smooth pair_lj_smooth_linear pair_lj_soft diff --git a/src/.gitignore b/src/.gitignore index 0cddfa6951..e8649c59b0 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -740,8 +740,6 @@ /pair_lj_sdk_coul_long.h /pair_lj_sdk_coul_msm.cpp /pair_lj_sdk_coul_msm.h -/pair_lj_sf.cpp -/pair_lj_sf.h /pair_lj_sf_dipole_sf.cpp /pair_lj_sf_dipole_sf.h /pair_lubricateU.cpp diff --git a/src/USER-MISC/README b/src/USER-MISC/README index cacee41e0c..3b69fd1dec 100644 --- a/src/USER-MISC/README +++ b/src/USER-MISC/README @@ -63,7 +63,6 @@ pair_style gauss/cut, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 pair_style lennard/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 pair_style list, Axel Kohlmeyer (Temple U), akohlmey at gmail.com, 1 Jun 13 pair_style lj/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 -pair_style lj/sf, Laurent Joly (U Lyon), ljoly.ulyon at gmail.com, 8 Aug 11 pair_style kolmogorov/crespi/z, Jaap Kroes (Radboud U), jaapkroes at gmail dot com, 28 Feb 17 pair_style meam/spline, Alexander Stukowski (LLNL), alex at stukowski.com, 1 Feb 12 pair_style meam/sw/spline, Robert Rudd (LLNL), robert.rudd at llnl.gov, 1 Oct 12 From a2edef7c9c3e8b10f72f0d0031129b15392fef39 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Jun 2017 00:23:53 -0400 Subject: [PATCH 138/302] local variable fp in pair style eam/cd was shadowing class member. renamed local variable to fptr --- src/USER-MISC/pair_cdeam.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/USER-MISC/pair_cdeam.cpp b/src/USER-MISC/pair_cdeam.cpp index 91ef598de8..b5607012ce 100644 --- a/src/USER-MISC/pair_cdeam.cpp +++ b/src/USER-MISC/pair_cdeam.cpp @@ -456,11 +456,11 @@ void PairCDEAM::read_h_coeff(char *filename) { if(comm->me == 0) { // Open potential file - FILE *fp; + FILE *fptr; char line[MAXLINE]; char nextline[MAXLINE]; - fp = force->open_potential(filename); - if (fp == NULL) { + fptr = force->open_potential(filename); + if (fptr == NULL) { char str[128]; sprintf(str,"Cannot open EAM potential file %s", filename); error->one(FLERR,str); @@ -468,7 +468,7 @@ void PairCDEAM::read_h_coeff(char *filename) // h coefficients are stored at the end of the file. // Skip to last line of file. - while(fgets(nextline, MAXLINE, fp) != NULL) { + while(fgets(nextline, MAXLINE, fptr) != NULL) { strcpy(line, nextline); } char* ptr = strtok(line, " \t\n\r\f"); @@ -483,7 +483,7 @@ void PairCDEAM::read_h_coeff(char *filename) error->one(FLERR,"Failed to read h(x) function coefficients from EAM file."); // Close the potential file. - fclose(fp); + fclose(fptr); } MPI_Bcast(&nhcoeff, 1, MPI_INT, 0, world); From 99ef36f4405014b057c2c3e9fe5d1178b3e3f8f1 Mon Sep 17 00:00:00 2001 From: Lars Pastewka Date: Wed, 7 Jun 2017 13:52:33 +0200 Subject: [PATCH 139/302] MAINT: Switched NetCDF from 64BIT_OFFSET to 64BIT_DATA which can handle frames (of unlimited dimension) > 2 GB. This becomes important for system sizes 100 Mio atoms and upwards. --- src/USER-NETCDF/dump_netcdf.cpp | 2 +- src/USER-NETCDF/dump_netcdf_mpiio.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/USER-NETCDF/dump_netcdf.cpp b/src/USER-NETCDF/dump_netcdf.cpp index bad90bdef3..c09a131e0a 100644 --- a/src/USER-NETCDF/dump_netcdf.cpp +++ b/src/USER-NETCDF/dump_netcdf.cpp @@ -354,7 +354,7 @@ void DumpNetCDF::openfile() if (singlefile_opened) return; singlefile_opened = 1; - NCERRX( nc_create(filename, NC_64BIT_OFFSET, &ncid), + NCERRX( nc_create(filename, NC_64BIT_DATA, &ncid), filename ); // dimensions diff --git a/src/USER-NETCDF/dump_netcdf_mpiio.cpp b/src/USER-NETCDF/dump_netcdf_mpiio.cpp index 2e9ec274a5..85a1f347f0 100644 --- a/src/USER-NETCDF/dump_netcdf_mpiio.cpp +++ b/src/USER-NETCDF/dump_netcdf_mpiio.cpp @@ -350,7 +350,7 @@ void DumpNetCDFMPIIO::openfile() if (singlefile_opened) return; singlefile_opened = 1; - NCERRX( ncmpi_create(MPI_COMM_WORLD, filename, NC_64BIT_OFFSET, + NCERRX( ncmpi_create(MPI_COMM_WORLD, filename, NC_64BIT_DATA, MPI_INFO_NULL, &ncid), filename ); // dimensions From 36c8b26fef94a67f4cecc796475a6855f21274cf Mon Sep 17 00:00:00 2001 From: Lars Pastewka Date: Wed, 7 Jun 2017 14:01:36 +0200 Subject: [PATCH 140/302] BUG: DumpNCMPIIO is now called DumpNetCDFMPIIO --- src/USER-NETCDF/dump_netcdf_mpiio.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/USER-NETCDF/dump_netcdf_mpiio.h b/src/USER-NETCDF/dump_netcdf_mpiio.h index 6f5b00b033..f7904b6960 100644 --- a/src/USER-NETCDF/dump_netcdf_mpiio.h +++ b/src/USER-NETCDF/dump_netcdf_mpiio.h @@ -66,7 +66,7 @@ class DumpNetCDFMPIIO : public DumpCustom { int var; // NetCDF variable }; - typedef void (DumpNCMPIIO::*funcptr_t)(void *); + typedef void (DumpNetCDFMPIIO::*funcptr_t)(void *); // per-frame quantities (variables, fixes or computes) struct nc_perframe_t { From 2e728972e21efc9f1666c29badc9d1aef15794fb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Jun 2017 17:09:45 -0400 Subject: [PATCH 141/302] make pair styles lj/cut/tip4p/long/omp, lj/long/tip4p/long and lj/long/tip4p/long/omp consistent with the reset of tip4p styles --- src/KSPACE/pair_lj_long_tip4p_long.cpp | 739 +++++------ src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp | 29 +- src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp | 1150 +++++++++--------- 3 files changed, 1003 insertions(+), 915 deletions(-) diff --git a/src/KSPACE/pair_lj_long_tip4p_long.cpp b/src/KSPACE/pair_lj_long_tip4p_long.cpp index fd318fd75b..d2a6b801fc 100644 --- a/src/KSPACE/pair_lj_long_tip4p_long.cpp +++ b/src/KSPACE/pair_lj_long_tip4p_long.cpp @@ -126,7 +126,7 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) int order1 = ewald_order&(1<<1), order6 = ewald_order&(1<<6); int ni; - double *lj1i, *lj2i, *lj3i, *lj4i, *offseti; + double *lj1i, *lj2i, *lj3i, *lj4i, *offseti; double g2 = g_ewald_6*g_ewald_6, g6 = g2*g2*g2, g8 = g6*g2; inum = list->inum; @@ -158,7 +158,6 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) hneigh[i][0] = iH1; hneigh[i][1] = iH2; hneigh[i][2] = 1; - } else { iH1 = hneigh[i][0]; iH2 = hneigh[i][1]; @@ -191,22 +190,22 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) r2inv = 1.0/rsq; if (order6) { // long-range lj if (!ndisptablebits || rsq <= tabinnerdispsq) { - register double rn = r2inv*r2inv*r2inv; - register double x2 = g2*rsq, a2 = 1.0/x2; - x2 = a2*exp(-x2)*lj4i[jtype]; - if (ni == 0) { - forcelj = - (rn*=rn)*lj1i[jtype]-g8*(((6.0*a2+6.0)*a2+3.0)*a2+1.0)*x2*rsq; - if (eflag) - evdwl = rn*lj3i[jtype]-g6*((a2+1.0)*a2+0.5)*x2; - } - else { // special case - register double f = special_lj[ni], t = rn*(1.0-f); - forcelj = f*(rn *= rn)*lj1i[jtype]- - g8*(((6.0*a2+6.0)*a2+3.0)*a2+1.0)*x2*rsq+t*lj2i[jtype]; - if (eflag) - evdwl = f*rn*lj3i[jtype]-g6*((a2+1.0)*a2+0.5)*x2+t*lj4i[jtype]; - } + register double rn = r2inv*r2inv*r2inv; + register double x2 = g2*rsq, a2 = 1.0/x2; + x2 = a2*exp(-x2)*lj4i[jtype]; + if (ni == 0) { + forcelj = + (rn*=rn)*lj1i[jtype]-g8*(((6.0*a2+6.0)*a2+3.0)*a2+1.0)*x2*rsq; + if (eflag) + evdwl = rn*lj3i[jtype]-g6*((a2+1.0)*a2+0.5)*x2; + } + else { // special case + register double f = special_lj[ni], t = rn*(1.0-f); + forcelj = f*(rn *= rn)*lj1i[jtype]- + g8*(((6.0*a2+6.0)*a2+3.0)*a2+1.0)*x2*rsq+t*lj2i[jtype]; + if (eflag) + evdwl = f*rn*lj3i[jtype]-g6*((a2+1.0)*a2+0.5)*x2+t*lj4i[jtype]; + } } else { // table real space register union_int_float_t disp_t; @@ -224,31 +223,31 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) if (eflag) evdwl = f*rn*lj3i[jtype]-(edisptable[disp_k]+f_disp*dedisptable[disp_k])*lj4i[jtype]+t*lj4i[jtype]; } } - } - else { // cut lj - register double rn = r2inv*r2inv*r2inv; - if (ni == 0) { - forcelj = rn*(rn*lj1i[jtype]-lj2i[jtype]); - if (eflag) evdwl = rn*(rn*lj3i[jtype]-lj4i[jtype])-offseti[jtype]; - } - else { // special case - register double f = special_lj[ni]; - forcelj = f*rn*(rn*lj1i[jtype]-lj2i[jtype]); - if (eflag) - evdwl = f * (rn*(rn*lj3i[jtype]-lj4i[jtype])-offseti[jtype]); - } + } + else { // cut lj + register double rn = r2inv*r2inv*r2inv; + if (ni == 0) { + forcelj = rn*(rn*lj1i[jtype]-lj2i[jtype]); + if (eflag) evdwl = rn*(rn*lj3i[jtype]-lj4i[jtype])-offseti[jtype]; + } + else { // special case + register double f = special_lj[ni]; + forcelj = f*rn*(rn*lj1i[jtype]-lj2i[jtype]); + if (eflag) + evdwl = f * (rn*(rn*lj3i[jtype]-lj4i[jtype])-offseti[jtype]); + } } forcelj *= r2inv; - f[i][0] += delx*forcelj; - f[i][1] += dely*forcelj; - f[i][2] += delz*forcelj; - f[j][0] -= delx*forcelj; - f[j][1] -= dely*forcelj; - f[j][2] -= delz*forcelj; + f[i][0] += delx*forcelj; + f[i][1] += dely*forcelj; + f[i][2] += delz*forcelj; + f[j][0] -= delx*forcelj; + f[j][1] -= dely*forcelj; + f[j][2] -= delz*forcelj; if (evflag) ev_tally(i,j,nlocal,newton_pair, - evdwl,0.0,forcelj,delx,dely,delz); + evdwl,0.0,forcelj,delx,dely,delz); } @@ -257,7 +256,7 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) if (rsq < cut_coulsqplus) { if (itype == typeO || jtype == typeO) { - if (jtype == typeO) { + if (jtype == typeO) { if (hneigh[j][0] < 0) { jH1 = atom->map(tag[j] + 1); jH2 = atom->map(tag[j] + 2); @@ -272,7 +271,6 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) hneigh[j][0] = jH1; hneigh[j][1] = jH2; hneigh[j][2] = 1; - } else { jH1 = hneigh[j][0]; jH2 = hneigh[j][1]; @@ -282,63 +280,63 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) } } x2 = newsite[j]; - } else x2 = x[j]; - delx = x1[0] - x2[0]; - dely = x1[1] - x2[1]; - delz = x1[2] - x2[2]; - rsq = delx*delx + dely*dely + delz*delz; + } else x2 = x[j]; + delx = x1[0] - x2[0]; + dely = x1[1] - x2[1]; + delz = x1[2] - x2[2]; + rsq = delx*delx + dely*dely + delz*delz; } - // test current rsq against cutoff and compute Coulombic force + // test current rsq against cutoff and compute Coulombic force if (rsq < cut_coulsq && order1) { - r2inv = 1.0 / rsq; - if (!ncoultablebits || rsq <= tabinnersq) { - r = sqrt(rsq); - grij = g_ewald * r; - expm2 = exp(-grij*grij); - t = 1.0 / (1.0 + EWALD_P*grij); - erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - prefactor = qqrd2e * qtmp*q[j]/r; - forcecoul = prefactor * (erfc + EWALD_F*grij*expm2); - if (factor_coul < 1.0) { - forcecoul -= (1.0-factor_coul)*prefactor; - } - } else { - union_int_float_t rsq_lookup; - rsq_lookup.f = rsq; - itable = rsq_lookup.i & ncoulmask; - itable >>= ncoulshiftbits; - fraction = (rsq_lookup.f - rtable[itable]) * drtable[itable]; - table = ftable[itable] + fraction*dftable[itable]; - forcecoul = qtmp*q[j] * table; - if (factor_coul < 1.0) { - table = ctable[itable] + fraction*dctable[itable]; - prefactor = qtmp*q[j] * table; - forcecoul -= (1.0-factor_coul)*prefactor; - } - } + r2inv = 1.0 / rsq; + if (!ncoultablebits || rsq <= tabinnersq) { + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + prefactor = qqrd2e * qtmp*q[j]/r; + forcecoul = prefactor * (erfc + EWALD_F*grij*expm2); + if (factor_coul < 1.0) { + forcecoul -= (1.0-factor_coul)*prefactor; + } + } else { + union_int_float_t rsq_lookup; + rsq_lookup.f = rsq; + itable = rsq_lookup.i & ncoulmask; + itable >>= ncoulshiftbits; + fraction = (rsq_lookup.f - rtable[itable]) * drtable[itable]; + table = ftable[itable] + fraction*dftable[itable]; + forcecoul = qtmp*q[j] * table; + if (factor_coul < 1.0) { + table = ctable[itable] + fraction*dctable[itable]; + prefactor = qtmp*q[j] * table; + forcecoul -= (1.0-factor_coul)*prefactor; + } + } - cforce = forcecoul * r2inv; + cforce = forcecoul * r2inv; - //if (evflag) ev_tally(i,j,nlocal,newton_pair, + //if (evflag) ev_tally(i,j,nlocal,newton_pair, // evdwl,0.0,cforce,delx,dely,delz); - // if i,j are not O atoms, force is applied directly - // if i or j are O atoms, force is on fictitious atom & partitioned - // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) - // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f - // preserves total force and torque on water molecule - // virial = sum(r x F) where each water's atoms are near xi and xj - // vlist stores 2,4,6 atoms whose forces contribute to virial + // if i,j are not O atoms, force is applied directly + // if i or j are O atoms, force is on fictitious atom & partitioned + // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) + // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f + // preserves total force and torque on water molecule + // virial = sum(r x F) where each water's atoms are near xi and xj + // vlist stores 2,4,6 atoms whose forces contribute to virial - n = 0; + n = 0; key = 0; - if (itype != typeO) { - f[i][0] += delx * cforce; - f[i][1] += dely * cforce; - f[i][2] += delz * cforce; + if (itype != typeO) { + f[i][0] += delx * cforce; + f[i][1] += dely * cforce; + f[i][2] += delz * cforce; if (vflag) { v[0] = x[i][0] * delx * cforce; @@ -348,9 +346,9 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) v[4] = x[i][0] * delz * cforce; v[5] = x[i][1] * delz * cforce; } - vlist[n++] = i; + vlist[n++] = i; - } else { + } else { key += 1; fd[0] = delx*cforce; fd[1] = dely*cforce; @@ -376,42 +374,42 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) f[iH2][1] += fH[1]; f[iH2][2] += fH[2]; - if (vflag) { + if (vflag) { xH1 = x[iH1]; xH2 = x[iH2]; - v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; - v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; - v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; - v[3] = x[i][0]*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1]; - v[4] = x[i][0]*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2]; - v[5] = x[i][1]*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2]; - } - vlist[n++] = i; - vlist[n++] = iH1; - vlist[n++] = iH2; - } - - if (jtype != typeO) { - f[j][0] -= delx * cforce; - f[j][1] -= dely * cforce; - f[j][2] -= delz * cforce; - - if (vflag) { - v[0] -= x[j][0] * delx * cforce; - v[1] -= x[j][1] * dely * cforce; - v[2] -= x[j][2] * delz * cforce; - v[3] -= x[j][0] * dely * cforce; - v[4] -= x[j][0] * delz * cforce; - v[5] -= x[j][1] * delz * cforce; + v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; + v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; + v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; + v[3] = x[i][0]*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1]; + v[4] = x[i][0]*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2]; + v[5] = x[i][1]*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2]; } - vlist[n++] = j; + vlist[n++] = i; + vlist[n++] = iH1; + vlist[n++] = iH2; + } - } else { + if (jtype != typeO) { + f[j][0] -= delx * cforce; + f[j][1] -= dely * cforce; + f[j][2] -= delz * cforce; + + if (vflag) { + v[0] -= x[j][0] * delx * cforce; + v[1] -= x[j][1] * dely * cforce; + v[2] -= x[j][2] * delz * cforce; + v[3] -= x[j][0] * dely * cforce; + v[4] -= x[j][0] * delz * cforce; + v[5] -= x[j][1] * delz * cforce; + } + vlist[n++] = j; + + } else { key += 2; - fd[0] = -delx*cforce; - fd[1] = -dely*cforce; - fd[2] = -delz*cforce; + fd[0] = -delx*cforce; + fd[1] = -dely*cforce; + fd[2] = -delz*cforce; fO[0] = fd[0]*(1 - alpha); fO[1] = fd[1]*(1 - alpha); @@ -421,45 +419,45 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) fH[1] = 0.5 * alpha * fd[1]; fH[2] = 0.5 * alpha * fd[2]; - f[j][0] += fO[0]; - f[j][1] += fO[1]; - f[j][2] += fO[2]; + f[j][0] += fO[0]; + f[j][1] += fO[1]; + f[j][2] += fO[2]; - f[jH1][0] += fH[0]; - f[jH1][1] += fH[1]; - f[jH1][2] += fH[2]; + f[jH1][0] += fH[0]; + f[jH1][1] += fH[1]; + f[jH1][2] += fH[2]; - f[jH2][0] += fH[0]; - f[jH2][1] += fH[1]; - f[jH2][2] += fH[2]; + f[jH2][0] += fH[0]; + f[jH2][1] += fH[1]; + f[jH2][2] += fH[2]; - if (vflag) { + if (vflag) { xH1 = x[jH1]; xH2 = x[jH2]; - v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; - v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; - v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; - v[3] += x[j][0]*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1]; - v[4] += x[j][0]*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2]; - v[5] += x[j][1]*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2]; + v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; + v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; + v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; + v[3] += x[j][0]*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1]; + v[4] += x[j][0]*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2]; + v[5] += x[j][1]*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2]; } vlist[n++] = j; - vlist[n++] = jH1; - vlist[n++] = jH2; - } + vlist[n++] = jH1; + vlist[n++] = jH2; + } - if (eflag) { - if (!ncoultablebits || rsq <= tabinnersq) - ecoul = prefactor*erfc; - else { - table = etable[itable] + fraction*detable[itable]; - ecoul = qtmp*q[j] * table; - } - if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; + if (eflag) { + if (!ncoultablebits || rsq <= tabinnersq) + ecoul = prefactor*erfc; + else { + table = etable[itable] + fraction*detable[itable]; + ecoul = qtmp*q[j] * table; + } + if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; } else ecoul = 0.0; if (evflag) ev_tally_tip4p(key,vlist,v,ecoul,alpha); - } + } } } } @@ -473,7 +471,7 @@ void PairLJLongTIP4PLong::compute_inner() int iH1,iH2,jH1,jH2; double qtmp,xtmp,ytmp,ztmp,delx,dely,delz; double r2inv,forcecoul,forcelj,cforce; - double fO[3],fH[3],fd[3];// f1[3]; + double fO[3],fH[3],fd[3]; double *x1,*x2; int *ilist,*jlist,*numneigh,**firstneigh; double rsq, qri; @@ -534,14 +532,19 @@ void PairLJLongTIP4PLong::compute_inner() itype = type[i]; if (itype == typeO && order1) { if (hneigh[i][0] < 0) { - hneigh[i][0] = iH1 = atom->map(tag[i] + 1); - hneigh[i][1] = iH2 = atom->map(tag[i] + 2); - hneigh[i][2] = 1; + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite(x[i],x[iH1],x[iH2],newsite[i]); + hneigh[i][0] = iH1; + hneigh[i][1] = iH2; + hneigh[i][2] = 1; } else { iH1 = hneigh[i][0]; iH2 = hneigh[i][1]; @@ -570,12 +573,12 @@ void PairLJLongTIP4PLong::compute_inner() if (rsq < cut_ljsq[itype][jtype] && rsq < cut_out_off_sq ) { // lj r2inv = 1.0/rsq; - register double rn = r2inv*r2inv*r2inv; - if (ni == 0) forcelj = rn*(rn*lj1i[jtype]-lj2i[jtype]); - else { // special case - register double f = special_lj[ni]; - forcelj = f*rn*(rn*lj1i[jtype]-lj2i[jtype]); - } + register double rn = r2inv*r2inv*r2inv; + if (ni == 0) forcelj = rn*(rn*lj1i[jtype]-lj2i[jtype]); + else { // special case + register double f = special_lj[ni]; + forcelj = f*rn*(rn*lj1i[jtype]-lj2i[jtype]); + } if (rsq > cut_out_on_sq) { // switching register double rsw = (sqrt(rsq) - cut_out_on)/cut_out_diff; @@ -583,12 +586,12 @@ void PairLJLongTIP4PLong::compute_inner() } forcelj *= r2inv; - f[i][0] += delx*forcelj; - f[i][1] += dely*forcelj; - f[i][2] += delz*forcelj; - f[j][0] -= delx*forcelj; - f[j][1] -= dely*forcelj; - f[j][2] -= delz*forcelj; + f[i][0] += delx*forcelj; + f[i][1] += dely*forcelj; + f[i][2] += delz*forcelj; + f[j][0] -= delx*forcelj; + f[j][1] -= dely*forcelj; + f[j][2] -= delz*forcelj; } @@ -597,16 +600,21 @@ void PairLJLongTIP4PLong::compute_inner() if (rsq < cut_coulsqplus && order1) { if (itype == typeO || jtype == typeO) { - if (jtype == typeO) { + if (jtype == typeO) { if (hneigh[j][0] < 0) { - hneigh[j][0] = jH1 = atom->map(tag[j] + 1); - hneigh[j][1] = jH2 = atom->map(tag[j] + 2); - hneigh[j][2] = 1; + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite(x[j],x[jH1],x[jH2],newsite[j]); + hneigh[j][0] = jH1; + hneigh[j][1] = jH2; + hneigh[j][2] = 1; } else { jH1 = hneigh[j][0]; jH2 = hneigh[j][1]; @@ -616,17 +624,17 @@ void PairLJLongTIP4PLong::compute_inner() } } x2 = newsite[j]; - } else x2 = x[j]; - delx = x1[0] - x2[0]; - dely = x1[1] - x2[1]; - delz = x1[2] - x2[2]; - rsq = delx*delx + dely*dely + delz*delz; + } else x2 = x[j]; + delx = x1[0] - x2[0]; + dely = x1[1] - x2[1]; + delz = x1[2] - x2[2]; + rsq = delx*delx + dely*dely + delz*delz; } - // test current rsq against cutoff and compute Coulombic force + // test current rsq against cutoff and compute Coulombic force if (rsq < cut_coulsq && rsq < cut_out_off_sq) { - r2inv = 1.0 / rsq; + r2inv = 1.0 / rsq; qri = qqrd2e*qtmp; if (ni == 0) forcecoul = qri*q[j]*sqrt(r2inv); else { @@ -638,25 +646,25 @@ void PairLJLongTIP4PLong::compute_inner() forcecoul *= 1.0 + rsw*rsw*(2.0*rsw-3.0); } - cforce = forcecoul * r2inv; + cforce = forcecoul * r2inv; - //if (evflag) ev_tally(i,j,nlocal,newton_pair, + //if (evflag) ev_tally(i,j,nlocal,newton_pair, // evdwl,0.0,cforce,delx,dely,delz); - // if i,j are not O atoms, force is applied directly - // if i or j are O atoms, force is on fictitious atom & partitioned - // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) - // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f - // preserves total force and torque on water molecule - // virial = sum(r x F) where each water's atoms are near xi and xj - // vlist stores 2,4,6 atoms whose forces contribute to virial + // if i,j are not O atoms, force is applied directly + // if i or j are O atoms, force is on fictitious atom & partitioned + // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) + // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f + // preserves total force and torque on water molecule + // virial = sum(r x F) where each water's atoms are near xi and xj + // vlist stores 2,4,6 atoms whose forces contribute to virial - if (itype != typeO) { - f[i][0] += delx * cforce; - f[i][1] += dely * cforce; - f[i][2] += delz * cforce; + if (itype != typeO) { + f[i][0] += delx * cforce; + f[i][1] += dely * cforce; + f[i][2] += delz * cforce; - } else { + } else { fd[0] = delx*cforce; fd[1] = dely*cforce; fd[2] = delz*cforce; @@ -682,15 +690,15 @@ void PairLJLongTIP4PLong::compute_inner() f[iH2][2] += fH[2]; } - if (jtype != typeO) { - f[j][0] -= delx * cforce; - f[j][1] -= dely * cforce; - f[j][2] -= delz * cforce; + if (jtype != typeO) { + f[j][0] -= delx * cforce; + f[j][1] -= dely * cforce; + f[j][2] -= delz * cforce; - } else { - fd[0] = -delx*cforce; - fd[1] = -dely*cforce; - fd[2] = -delz*cforce; + } else { + fd[0] = -delx*cforce; + fd[1] = -dely*cforce; + fd[2] = -delz*cforce; fO[0] = fd[0]*(1 - alpha); fO[1] = fd[1]*(1 - alpha); @@ -700,19 +708,19 @@ void PairLJLongTIP4PLong::compute_inner() fH[1] = 0.5 * alpha * fd[1]; fH[2] = 0.5 * alpha * fd[2]; - f[j][0] += fO[0]; - f[j][1] += fO[1]; - f[j][2] += fO[2]; + f[j][0] += fO[0]; + f[j][1] += fO[1]; + f[j][2] += fO[2]; - f[jH1][0] += fH[0]; - f[jH1][1] += fH[1]; - f[jH1][2] += fH[2]; + f[jH1][0] += fH[0]; + f[jH1][1] += fH[1]; + f[jH1][2] += fH[2]; - f[jH2][0] += fH[0]; - f[jH2][1] += fH[1]; - f[jH2][2] += fH[2]; + f[jH2][0] += fH[0]; + f[jH2][1] += fH[1]; + f[jH2][2] += fH[2]; } - } + } } } } @@ -777,14 +785,19 @@ void PairLJLongTIP4PLong::compute_middle() itype = type[i]; if (itype == typeO && order1) { if (hneigh[i][0] < 0) { - hneigh[i][0] = iH1 = atom->map(tag[i] + 1); - hneigh[i][1] = iH2 = atom->map(tag[i] + 2); - hneigh[i][2] = 1; + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite(x[i],x[iH1],x[iH2],newsite[i]); + hneigh[i][0] = iH1; + hneigh[i][1] = iH2; + hneigh[i][2] = 1; } else { iH1 = hneigh[i][0]; iH2 = hneigh[i][1]; @@ -813,12 +826,12 @@ void PairLJLongTIP4PLong::compute_middle() if (rsq < cut_ljsq[itype][jtype] && rsq >= cut_in_off_sq && rsq <= cut_out_off_sq ) { // lj r2inv = 1.0/rsq; - register double rn = r2inv*r2inv*r2inv; - if (ni == 0) forcelj = rn*(rn*lj1i[jtype]-lj2i[jtype]); - else { // special case - register double f = special_lj[ni]; - forcelj = f*rn*(rn*lj1i[jtype]-lj2i[jtype]); - } + register double rn = r2inv*r2inv*r2inv; + if (ni == 0) forcelj = rn*(rn*lj1i[jtype]-lj2i[jtype]); + else { // special case + register double f = special_lj[ni]; + forcelj = f*rn*(rn*lj1i[jtype]-lj2i[jtype]); + } if (rsq < cut_in_on_sq) { // switching register double rsw = (sqrt(rsq) - cut_in_off)/cut_in_diff; @@ -830,12 +843,12 @@ void PairLJLongTIP4PLong::compute_middle() } forcelj *= r2inv; - f[i][0] += delx*forcelj; - f[i][1] += dely*forcelj; - f[i][2] += delz*forcelj; - f[j][0] -= delx*forcelj; - f[j][1] -= dely*forcelj; - f[j][2] -= delz*forcelj; + f[i][0] += delx*forcelj; + f[i][1] += dely*forcelj; + f[i][2] += delz*forcelj; + f[j][0] -= delx*forcelj; + f[j][1] -= dely*forcelj; + f[j][2] -= delz*forcelj; } @@ -844,16 +857,21 @@ void PairLJLongTIP4PLong::compute_middle() if (rsq < cut_coulsqplus && order1) { if (itype == typeO || jtype == typeO) { - if (jtype == typeO) { + if (jtype == typeO) { if (hneigh[j][0] < 0) { - hneigh[j][0] = jH1 = atom->map(tag[j] + 1); - hneigh[j][1] = jH2 = atom->map(tag[j] + 2); - hneigh[j][2] = 1; + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite(x[j],x[jH1],x[jH2],newsite[j]); + hneigh[j][0] = jH1; + hneigh[j][1] = jH2; + hneigh[j][2] = 1; } else { jH1 = hneigh[j][0]; jH2 = hneigh[j][1]; @@ -863,17 +881,17 @@ void PairLJLongTIP4PLong::compute_middle() } } x2 = newsite[j]; - } else x2 = x[j]; - delx = x1[0] - x2[0]; - dely = x1[1] - x2[1]; - delz = x1[2] - x2[2]; - rsq = delx*delx + dely*dely + delz*delz; + } else x2 = x[j]; + delx = x1[0] - x2[0]; + dely = x1[1] - x2[1]; + delz = x1[2] - x2[2]; + rsq = delx*delx + dely*dely + delz*delz; } - // test current rsq against cutoff and compute Coulombic force + // test current rsq against cutoff and compute Coulombic force if (rsq < cut_coulsq && rsq >= cut_in_off_sq && rsq <= cut_out_off_sq) { - r2inv = 1.0 / rsq; + r2inv = 1.0 / rsq; qri = qqrd2e*qtmp; if (ni == 0) forcecoul = qri*q[j]*sqrt(r2inv); else { @@ -889,25 +907,25 @@ void PairLJLongTIP4PLong::compute_middle() forcecoul *= 1.0 + rsw*rsw*(2.0*rsw-3.0); } - cforce = forcecoul * r2inv; + cforce = forcecoul * r2inv; - //if (evflag) ev_tally(i,j,nlocal,newton_pair, + //if (evflag) ev_tally(i,j,nlocal,newton_pair, // evdwl,0.0,cforce,delx,dely,delz); - // if i,j are not O atoms, force is applied directly - // if i or j are O atoms, force is on fictitious atom & partitioned - // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) - // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f - // preserves total force and torque on water molecule - // virial = sum(r x F) where each water's atoms are near xi and xj - // vlist stores 2,4,6 atoms whose forces contribute to virial + // if i,j are not O atoms, force is applied directly + // if i or j are O atoms, force is on fictitious atom & partitioned + // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) + // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f + // preserves total force and torque on water molecule + // virial = sum(r x F) where each water's atoms are near xi and xj + // vlist stores 2,4,6 atoms whose forces contribute to virial - if (itype != typeO) { - f[i][0] += delx * cforce; - f[i][1] += dely * cforce; - f[i][2] += delz * cforce; + if (itype != typeO) { + f[i][0] += delx * cforce; + f[i][1] += dely * cforce; + f[i][2] += delz * cforce; - } else { + } else { fd[0] = delx*cforce; fd[1] = dely*cforce; fd[2] = delz*cforce; @@ -933,15 +951,15 @@ void PairLJLongTIP4PLong::compute_middle() f[iH2][2] += fH[2]; } - if (jtype != typeO) { - f[j][0] -= delx * cforce; - f[j][1] -= dely * cforce; - f[j][2] -= delz * cforce; + if (jtype != typeO) { + f[j][0] -= delx * cforce; + f[j][1] -= dely * cforce; + f[j][2] -= delz * cforce; - } else { - fd[0] = -delx*cforce; - fd[1] = -dely*cforce; - fd[2] = -delz*cforce; + } else { + fd[0] = -delx*cforce; + fd[1] = -dely*cforce; + fd[2] = -delz*cforce; fO[0] = fd[0]*(1 - alpha); fO[1] = fd[1]*(1 - alpha); @@ -951,19 +969,19 @@ void PairLJLongTIP4PLong::compute_middle() fH[1] = 0.5 * alpha * fd[1]; fH[2] = 0.5 * alpha * fd[2]; - f[j][0] += fO[0]; - f[j][1] += fO[1]; - f[j][2] += fO[2]; + f[j][0] += fO[0]; + f[j][1] += fO[1]; + f[j][2] += fO[2]; - f[jH1][0] += fH[0]; - f[jH1][1] += fH[1]; - f[jH1][2] += fH[2]; + f[jH1][0] += fH[0]; + f[jH1][1] += fH[1]; + f[jH1][2] += fH[2]; - f[jH2][0] += fH[0]; - f[jH2][1] += fH[1]; - f[jH2][2] += fH[2]; + f[jH2][0] += fH[0]; + f[jH2][1] += fH[1]; + f[jH2][2] += fH[2]; } - } + } } } } @@ -979,8 +997,8 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) int iH1,iH2,jH1,jH2; double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul; double r2inv,forcecoul,forcelj,cforce, respa_coul, respa_lj, frespa,fvirial; - double fO[3],fH[3],fd[3],v[6],xH1[3],xH2[3];// f1[3]; - double *x1,*x2; + double fO[3],fH[3],fd[3],v[6]; + double *x1,*x2,*xH1,*xH2; int *ilist,*jlist,*numneigh,**firstneigh; double rsq,qri; int respa_flag; @@ -1048,14 +1066,19 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) itype = type[i]; if (itype == typeO) { if (hneigh[i][0] < 0) { - hneigh[i][0] = iH1 = atom->map(tag[i] + 1); - hneigh[i][1] = iH2 = atom->map(tag[i] + 2); - hneigh[i][2] = 1; + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite(x[i],x[iH1],x[iH2],newsite[i]); + hneigh[i][0] = iH1; + hneigh[i][1] = iH2; + hneigh[i][2] = 1; } else { iH1 = hneigh[i][0]; iH2 = hneigh[i][1]; @@ -1096,8 +1119,8 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) r2inv = 1.0/rsq; register double rn = r2inv*r2inv*r2inv; if (respa_flag) respa_lj = ni == 0 ? // correct for respa - frespa*rn*(rn*lj1i[jtype]-lj2i[jtype]) : - frespa*rn*(rn*lj1i[jtype]-lj2i[jtype])*special_lj[ni]; + frespa*rn*(rn*lj1i[jtype]-lj2i[jtype]) : + frespa*rn*(rn*lj1i[jtype]-lj2i[jtype])*special_lj[ni]; if (order6) { // long-range form if (!ndisptablebits || rsq <= tabinnerdispsq) { register double x2 = g2*rsq, a2 = 1.0/x2; @@ -1145,17 +1168,17 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) } forcelj *= r2inv; - f[i][0] += delx*forcelj; - f[i][1] += dely*forcelj; - f[i][2] += delz*forcelj; - f[j][0] -= delx*forcelj; - f[j][1] -= dely*forcelj; - f[j][2] -= delz*forcelj; + f[i][0] += delx*forcelj; + f[i][1] += dely*forcelj; + f[i][2] += delz*forcelj; + f[j][0] -= delx*forcelj; + f[j][1] -= dely*forcelj; + f[j][2] -= delz*forcelj; if (evflag) { fvirial = forcelj + respa_lj*r2inv; ev_tally(i,j,nlocal,newton_pair, - evdwl,0.0,fvirial,delx,dely,delz); + evdwl,0.0,fvirial,delx,dely,delz); } } @@ -1165,16 +1188,21 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) if (rsq < cut_coulsqplus) { if (itype == typeO || jtype == typeO) { - if (jtype == typeO) { + if (jtype == typeO) { if (hneigh[j][0] < 0) { - hneigh[j][0] = jH1 = atom->map(tag[j] + 1); - hneigh[j][1] = jH2 = atom->map(tag[j] + 2); - hneigh[j][2] = 1; + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite(x[j],x[jH1],x[jH2],newsite[j]); + hneigh[j][0] = jH1; + hneigh[j][1] = jH2; + hneigh[j][2] = 1; } else { jH1 = hneigh[j][0]; jH2 = hneigh[j][1]; @@ -1184,14 +1212,14 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) } } x2 = newsite[j]; - } else x2 = x[j]; - delx = x1[0] - x2[0]; - dely = x1[1] - x2[1]; - delz = x1[2] - x2[2]; - rsq = delx*delx + dely*dely + delz*delz; + } else x2 = x[j]; + delx = x1[0] - x2[0]; + dely = x1[1] - x2[1]; + delz = x1[2] - x2[2]; + rsq = delx*delx + dely*dely + delz*delz; } - // test current rsq against cutoff and compute Coulombic force + // test current rsq against cutoff and compute Coulombic force if ((rsq < cut_coulsq) && order1) { frespa = 1.0; // check whether and how to compute respa corrections @@ -1245,20 +1273,20 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) fvirial = (forcecoul + respa_coul) * r2inv; // if i,j are not O atoms, force is applied directly - // if i or j are O atoms, force is on fictitious atom & partitioned - // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) - // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f - // preserves total force and torque on water molecule - // virial = sum(r x F) where each water's atoms are near xi and xj - // vlist stores 2,4,6 atoms whose forces contribute to virial + // if i or j are O atoms, force is on fictitious atom & partitioned + // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) + // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f + // preserves total force and torque on water molecule + // virial = sum(r x F) where each water's atoms are near xi and xj + // vlist stores 2,4,6 atoms whose forces contribute to virial - n = 0; + n = 0; key = 0; - if (itype != typeO) { - f[i][0] += delx * cforce; + if (itype != typeO) { + f[i][0] += delx * cforce; f[i][1] += dely * cforce; - f[i][2] += delz * cforce; + f[i][2] += delz * cforce; if (vflag) { v[0] = x[i][0] * delx * fvirial; @@ -1268,9 +1296,9 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) v[4] = x[i][0] * delz * fvirial; v[5] = x[i][1] * delz * fvirial; } - vlist[n++] = i; + vlist[n++] = i; - } else { + } else { key += 1; fd[0] = delx*cforce; fd[1] = dely*cforce; @@ -1296,7 +1324,7 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) f[iH2][1] += fH[1]; f[iH2][2] += fH[2]; - if (vflag) { + if (vflag) { fd[0] = delx*fvirial; fd[1] = dely*fvirial; fd[2] = delz*fvirial; @@ -1309,42 +1337,41 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) fH[1] = 0.5 * alpha * fd[1]; fH[2] = 0.5 * alpha * fd[2]; - domain->closest_image(x[i],x[iH1],xH1); - domain->closest_image(x[i],x[iH2],xH2); - - v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; - v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; - v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; - v[3] = x[i][0]*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1]; - v[4] = x[i][0]*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2]; - v[5] = x[i][1]*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2]; - } - vlist[n++] = i; - vlist[n++] = iH1; - vlist[n++] = iH2; - } - - if (jtype != typeO) { - f[j][0] -= delx * cforce; - f[j][1] -= dely * cforce; - f[j][2] -= delz * cforce; - - if (vflag) { - v[0] -= x[j][0] * delx * fvirial; - v[1] -= x[j][1] * dely * fvirial; - v[2] -= x[j][2] * delz * fvirial; - v[3] -= x[j][0] * dely * fvirial; - v[4] -= x[j][0] * delz * fvirial; - v[5] -= x[j][1] * delz * fvirial; + xH1 = x[jH1]; + xH2 = x[jH2]; + v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; + v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; + v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; + v[3] = x[i][0]*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1]; + v[4] = x[i][0]*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2]; + v[5] = x[i][1]*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2]; } - vlist[n++] = j; + vlist[n++] = i; + vlist[n++] = iH1; + vlist[n++] = iH2; + } - } else { + if (jtype != typeO) { + f[j][0] -= delx * cforce; + f[j][1] -= dely * cforce; + f[j][2] -= delz * cforce; + + if (vflag) { + v[0] -= x[j][0] * delx * fvirial; + v[1] -= x[j][1] * dely * fvirial; + v[2] -= x[j][2] * delz * fvirial; + v[3] -= x[j][0] * dely * fvirial; + v[4] -= x[j][0] * delz * fvirial; + v[5] -= x[j][1] * delz * fvirial; + } + vlist[n++] = j; + + } else { key += 2; - fd[0] = -delx*cforce; - fd[1] = -dely*cforce; - fd[2] = -delz*cforce; + fd[0] = -delx*cforce; + fd[1] = -dely*cforce; + fd[2] = -delz*cforce; fO[0] = fd[0]*(1 - alpha); fO[1] = fd[1]*(1 - alpha); @@ -1354,23 +1381,23 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) fH[1] = 0.5 * alpha * fd[1]; fH[2] = 0.5 * alpha * fd[2]; - f[j][0] += fO[0]; - f[j][1] += fO[1]; - f[j][2] += fO[2]; + f[j][0] += fO[0]; + f[j][1] += fO[1]; + f[j][2] += fO[2]; - f[jH1][0] += fH[0]; - f[jH1][1] += fH[1]; - f[jH1][2] += fH[2]; + f[jH1][0] += fH[0]; + f[jH1][1] += fH[1]; + f[jH1][2] += fH[2]; - f[jH2][0] += fH[0]; - f[jH2][1] += fH[1]; - f[jH2][2] += fH[2]; + f[jH2][0] += fH[0]; + f[jH2][1] += fH[1]; + f[jH2][2] += fH[2]; - if (vflag) { + if (vflag) { - fd[0] = -delx*fvirial; - fd[1] = -dely*fvirial; - fd[2] = -delz*fvirial; + fd[0] = -delx*fvirial; + fd[1] = -dely*fvirial; + fd[2] = -delz*fvirial; fO[0] = fd[0]*(1 - alpha); fO[1] = fd[1]*(1 - alpha); @@ -1380,20 +1407,20 @@ void PairLJLongTIP4PLong::compute_outer(int eflag, int vflag) fH[1] = 0.5 * alpha * fd[1]; fH[2] = 0.5 * alpha * fd[2]; - domain->closest_image(x[j],x[jH1],xH1); - domain->closest_image(x[j],x[jH2],xH2); + xH1 = x[jH1]; + xH2 = x[jH2]; - v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; - v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; - v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; - v[3] += x[j][0]*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1]; - v[4] += x[j][0]*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2]; - v[5] += x[j][1]*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2]; + v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; + v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; + v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; + v[3] += x[j][0]*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1]; + v[4] += x[j][0]*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2]; + v[5] += x[j][1]*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2]; } vlist[n++] = j; - vlist[n++] = jH1; - vlist[n++] = jH2; - } + vlist[n++] = jH1; + vlist[n++] = jH2; + } if (evflag) ev_tally_tip4p(key,vlist,v,ecoul,alpha); } diff --git a/src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp b/src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp index 2f1b98fc4f..d05b13cd10 100644 --- a/src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp @@ -104,7 +104,7 @@ void PairLJCutTIP4PLongOMP::compute(int eflag, int vflag) thr->timer(Timer::START); ev_setup_thr(eflag, vflag, nall, eatom, vatom, thr); - if (!ncoultablebits) { + if (ncoultablebits) { if (evflag) { if (eflag) { if (vflag) eval<1,1,1,1>(ifrom, ito, thr); @@ -156,6 +156,7 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) dbl3_t * _noalias const f = (dbl3_t *) thr->get_f()[0]; const double * _noalias const q = atom->q; const int * _noalias const type = atom->type; + const tagint * _noalias const tag = atom->tag; const int nlocal = atom->nlocal; const double * _noalias const special_coul = force->special_coul; const double * _noalias const special_lj = force->special_lj; @@ -187,8 +188,8 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) // will be the same, there is no race condition. if (itype == typeO) { if (hneigh_thr[i].a < 0) { - iH1 = atom->map(atom->tag[i] + 1); - iH2 = atom->map(atom->tag[i] + 2); + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) @@ -267,8 +268,8 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) if (jtype == typeO) { if (hneigh_thr[j].a < 0) { - jH1 = atom->map(atom->tag[j] + 1); - jH2 = atom->map(atom->tag[j] + 2); + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) @@ -301,7 +302,7 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) if (rsq < cut_coulsq) { r2inv = 1 / rsq; - if (CTABLE || rsq <= tabinnersq) { + if (!CTABLE || rsq <= tabinnersq) { r = sqrt(rsq); grij = g_ewald * r; expm2 = exp(-grij*grij); @@ -337,7 +338,7 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) // virial = sum(r x F) where each water's atoms are near xi and xj // vlist stores 2,4,6 atoms whose forces contribute to virial - if (EVFLAG) { + if (VFLAG) { n = 0; key = 0; } @@ -354,11 +355,11 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) v[3] = x[i].x * dely * cforce; v[4] = x[i].x * delz * cforce; v[5] = x[i].y * delz * cforce; + vlist[n++] = i; } - if (EVFLAG) vlist[n++] = i; } else { - if (EVFLAG) key++; + if (VFLAG) key++; fdx = delx*cforce; fdy = dely*cforce; @@ -393,8 +394,6 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) v[3] = x[i].x*fOy + xH1.x*fHy + xH2.x*fHy; v[4] = x[i].x*fOz + xH1.x*fHz + xH2.x*fHz; v[5] = x[i].y*fOz + xH1.y*fHz + xH2.y*fHz; - } - if (EVFLAG) { vlist[n++] = i; vlist[n++] = iH1; vlist[n++] = iH2; @@ -413,11 +412,11 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) v[3] -= x[j].x * dely * cforce; v[4] -= x[j].x * delz * cforce; v[5] -= x[j].y * delz * cforce; + vlist[n++] = j; } - if (EVFLAG) vlist[n++] = j; } else { - if (EVFLAG) key += 2; + if (VFLAG) key += 2; fdx = -delx*cforce; fdy = -dely*cforce; @@ -452,8 +451,6 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) v[3] += x[j].x*fOy + xH1.x*fHy + xH2.x*fHy; v[4] += x[j].x*fOz + xH1.x*fHz + xH2.x*fHz; v[5] += x[j].y*fOz + xH1.y*fHz + xH2.y*fHz; - } - if (EVFLAG) { vlist[n++] = j; vlist[n++] = jH1; vlist[n++] = jH2; @@ -461,7 +458,7 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) } if (EFLAG) { - if (CTABLE || rsq <= tabinnersq) + if (!CTABLE || rsq <= tabinnersq) ecoul = prefactor*erfc; else { table = etable[itable] + fraction*detable[itable]; diff --git a/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp b/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp index 5072496cc6..1c8f60d7dc 100644 --- a/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp +++ b/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp @@ -15,13 +15,14 @@ #include #include "pair_lj_long_tip4p_long_omp.h" #include "atom.h" +#include "domain.h" #include "comm.h" #include "math_vector.h" #include "force.h" #include "neighbor.h" -#include "neigh_list.h" +#include "error.h" #include "memory.h" -#include "domain.h" +#include "neigh_list.h" #include "suffix.h" using namespace LAMMPS_NS; @@ -719,25 +720,27 @@ template < const int EVFLAG, const int EFLAG, void PairLJLongTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) { const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; - double * const * const f = thr->get_f(); - const double * const q = atom->q; - const int * const type = atom->type; + dbl3_t * _noalias const f = (dbl3_t *) thr->get_f()[0]; + const double * _noalias const q = atom->q; + const int * _noalias const type = atom->type; + const tagint * _noalias const tag = atom->tag; const int nlocal = atom->nlocal; - const double * const special_coul = force->special_coul; - const double * const special_lj = force->special_lj; + const double * _noalias const special_coul = force->special_coul; + const double * _noalias const special_lj = force->special_lj; const double qqrd2e = force->qqrd2e; const double cut_coulsqplus = (cut_coul+2.0*qdist)*(cut_coul+2.0*qdist); + const int vflag = vflag_global || vflag_atom; int i,j,ii,jj,jnum,itype,jtype,itable; int n,vlist[6]; int key; int iH1,iH2,jH1,jH2; - double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul; + double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,fxtmp,fytmp,fztmp,evdwl,ecoul; double fraction,table; double r,r2inv,forcecoul,forcelj,cforce; double factor_coul; double grij,expm2,prefactor,t,erfc; - double fO[3],fH[3],fd[3],v[6]; + double fOx,fOy,fOz,fHx,fHy,fHz,fdx,fdy,fdz,v[6]; dbl3_t x1,x2,xH1,xH2; int *ilist,*jlist,*numneigh,**firstneigh; double rsq; @@ -763,26 +766,25 @@ void PairLJLongTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) itype = type[i]; if (itype == typeO) { if (hneigh_thr[i].a < 0) { - iH1 = atom->map(atom->tag[i] + 1); - iH2 = atom->map(atom->tag[i] + 2); + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); - if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) + if (type[iH1] != typeH || type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); - // set iH1,iH2 to index of closest image to O + // set iH1,iH2 to closest image to O iH1 = domain->closest_image(i,iH1); iH2 = domain->closest_image(i,iH2); compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); - hneigh_thr[i].a = iH1; - hneigh_thr[i].b = iH2; hneigh_thr[i].t = 1; - + hneigh_thr[i].b = iH2; + hneigh_thr[i].a = iH1; } else { iH1 = hneigh_thr[i].a; iH2 = hneigh_thr[i].b; if (hneigh_thr[i].t == 0) { - hneigh_thr[i].t = 1; compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); + hneigh_thr[i].t = 1; } } x1 = newsite_thr[i]; @@ -790,13 +792,14 @@ void PairLJLongTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) jlist = firstneigh[i]; jnum = numneigh[i]; + fxtmp=fytmp=fztmp=0.0; offseti = offset[itype]; lj1i = lj1[itype]; lj2i = lj2[itype]; lj3i = lj3[itype]; lj4i = lj4[itype]; for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; ni = sbmask(j); - factor_coul = special_coul[sbmask(j)]; + factor_coul = special_coul[ni]; j &= NEIGHMASK; delx = xtmp - x[j].x; @@ -809,22 +812,22 @@ void PairLJLongTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) r2inv = 1.0/rsq; if (ORDER6) { // long-range lj if (!LJTABLE || rsq <= tabinnerdispsq) { - register double rn = r2inv*r2inv*r2inv; - register double x2 = g2*rsq, a2 = 1.0/x2; - x2 = a2*exp(-x2)*lj4i[jtype]; - if (ni == 0) { - forcelj = - (rn*=rn)*lj1i[jtype]-g8*(((6.0*a2+6.0)*a2+3.0)*a2+1.0)*x2*rsq; - if (EFLAG) - evdwl = rn*lj3i[jtype]-g6*((a2+1.0)*a2+0.5)*x2; - } - else { // special case - register double f = special_lj[ni], t = rn*(1.0-f); - forcelj = f*(rn *= rn)*lj1i[jtype]- - g8*(((6.0*a2+6.0)*a2+3.0)*a2+1.0)*x2*rsq+t*lj2i[jtype]; - if (EFLAG) - evdwl = f*rn*lj3i[jtype]-g6*((a2+1.0)*a2+0.5)*x2+t*lj4i[jtype]; - } + register double rn = r2inv*r2inv*r2inv; + register double x2 = g2*rsq, a2 = 1.0/x2; + x2 = a2*exp(-x2)*lj4i[jtype]; + if (ni == 0) { + forcelj = + (rn*=rn)*lj1i[jtype]-g8*(((6.0*a2+6.0)*a2+3.0)*a2+1.0)*x2*rsq; + if (EFLAG) + evdwl = rn*lj3i[jtype]-g6*((a2+1.0)*a2+0.5)*x2; + } + else { // special case + register double f = special_lj[ni], t = rn*(1.0-f); + forcelj = f*(rn *= rn)*lj1i[jtype]- + g8*(((6.0*a2+6.0)*a2+3.0)*a2+1.0)*x2*rsq+t*lj2i[jtype]; + if (EFLAG) + evdwl = f*rn*lj3i[jtype]-g6*((a2+1.0)*a2+0.5)*x2+t*lj4i[jtype]; + } } else { // table real space register union_int_float_t disp_t; @@ -842,31 +845,31 @@ void PairLJLongTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) if (EFLAG) evdwl = f*rn*lj3i[jtype]-(edisptable[disp_k]+f_disp*dedisptable[disp_k])*lj4i[jtype]+t*lj4i[jtype]; } } - } - else { // cut lj - register double rn = r2inv*r2inv*r2inv; - if (ni == 0) { - forcelj = rn*(rn*lj1i[jtype]-lj2i[jtype]); - if (EFLAG) evdwl = rn*(rn*lj3i[jtype]-lj4i[jtype])-offseti[jtype]; - } - else { // special case - register double f = special_lj[ni]; - forcelj = f*rn*(rn*lj1i[jtype]-lj2i[jtype]); - if (EFLAG) - evdwl = f * (rn*(rn*lj3i[jtype]-lj4i[jtype])-offseti[jtype]); - } + } + else { // cut lj + register double rn = r2inv*r2inv*r2inv; + if (ni == 0) { + forcelj = rn*(rn*lj1i[jtype]-lj2i[jtype]); + if (EFLAG) evdwl = rn*(rn*lj3i[jtype]-lj4i[jtype])-offseti[jtype]; + } + else { // special case + register double f = special_lj[ni]; + forcelj = f*rn*(rn*lj1i[jtype]-lj2i[jtype]); + if (EFLAG) + evdwl = f * (rn*(rn*lj3i[jtype]-lj4i[jtype])-offseti[jtype]); + } } forcelj *= r2inv; - f[i][0] += delx*forcelj; - f[i][1] += dely*forcelj; - f[i][2] += delz*forcelj; - f[j][0] -= delx*forcelj; - f[j][1] -= dely*forcelj; - f[j][2] -= delz*forcelj; + fxtmp += delx*forcelj; + fytmp += dely*forcelj; + fztmp += delz*forcelj; + f[j].x -= delx*forcelj; + f[j].y -= dely*forcelj; + f[j].z -= delz*forcelj; if (EVFLAG) ev_tally_thr(this,i,j,nlocal, /* newton_pair = */ 1, - evdwl,0.0,forcelj,delx,dely,delz,thr); + evdwl,0.0,forcelj,delx,dely,delz,thr); } @@ -875,211 +878,215 @@ void PairLJLongTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) if (rsq < cut_coulsqplus) { if (itype == typeO || jtype == typeO) { - if (jtype == typeO) { + if (jtype == typeO) { if (hneigh_thr[j].a < 0) { - jH1 = atom->map(atom->tag[j] + 1); - jH2 = atom->map(atom->tag[j] + 2); + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); - if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) + if (type[jH1] != typeH || type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); // set jH1,jH2 to closest image to O jH1 = domain->closest_image(j,jH1); jH2 = domain->closest_image(j,jH2); compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); - hneigh_thr[j].a = jH1; - hneigh_thr[j].b = jH2; hneigh_thr[j].t = 1; - + hneigh_thr[j].b = jH2; + hneigh_thr[j].a = jH1; } else { jH1 = hneigh_thr[j].a; jH2 = hneigh_thr[j].b; if (hneigh_thr[j].t == 0) { - hneigh_thr[j].t = 1; compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); + hneigh_thr[j].t = 1; } } x2 = newsite_thr[j]; - } else x2 = x[j]; - delx = x1.x - x2.x; - dely = x1.y - x2.y; - delz = x1.z - x2.z; - rsq = delx*delx + dely*dely + delz*delz; + } else x2 = x[j]; + delx = x1.x - x2.x; + dely = x1.y - x2.y; + delz = x1.z - x2.z; + rsq = delx*delx + dely*dely + delz*delz; } - // test current rsq against cutoff and compute Coulombic force + // test current rsq against cutoff and compute Coulombic force if (rsq < cut_coulsq && ORDER1) { - r2inv = 1.0 / rsq; - if (!CTABLE || rsq <= tabinnersq) { - r = sqrt(rsq); - grij = g_ewald * r; - expm2 = exp(-grij*grij); - t = 1.0 / (1.0 + EWALD_P*grij); - erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - prefactor = qqrd2e * qtmp*q[j]/r; - forcecoul = prefactor * (erfc + EWALD_F*grij*expm2); - if (factor_coul < 1.0) { - forcecoul -= (1.0-factor_coul)*prefactor; - } - } else { - union_int_float_t rsq_lookup; - rsq_lookup.f = rsq; - itable = rsq_lookup.i & ncoulmask; - itable >>= ncoulshiftbits; - fraction = (rsq_lookup.f - rtable[itable]) * drtable[itable]; - table = ftable[itable] + fraction*dftable[itable]; - forcecoul = qtmp*q[j] * table; - if (factor_coul < 1.0) { - table = ctable[itable] + fraction*dctable[itable]; - prefactor = qtmp*q[j] * table; - forcecoul -= (1.0-factor_coul)*prefactor; - } - } + r2inv = 1.0 / rsq; + if (!CTABLE || rsq <= tabinnersq) { + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + prefactor = qqrd2e * qtmp*q[j]/r; + forcecoul = prefactor * (erfc + EWALD_F*grij*expm2); + if (factor_coul < 1.0) { + forcecoul -= (1.0-factor_coul)*prefactor; + } + } else { + union_int_float_t rsq_lookup; + rsq_lookup.f = rsq; + itable = rsq_lookup.i & ncoulmask; + itable >>= ncoulshiftbits; + fraction = (rsq_lookup.f - rtable[itable]) * drtable[itable]; + table = ftable[itable] + fraction*dftable[itable]; + forcecoul = qtmp*q[j] * table; + if (factor_coul < 1.0) { + table = ctable[itable] + fraction*dctable[itable]; + prefactor = qtmp*q[j] * table; + forcecoul -= (1.0-factor_coul)*prefactor; + } + } - cforce = forcecoul * r2inv; + cforce = forcecoul * r2inv; - //if (evflag) ev_tally(i,j,nlocal,newton_pair, + //if (evflag) ev_tally(i,j,nlocal,newton_pair, // evdwl,0.0,cforce,delx,dely,delz); - // if i,j are not O atoms, force is applied directly - // if i or j are O atoms, force is on fictitious atom & partitioned - // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) - // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f - // preserves total force and torque on water molecule - // virial = sum(r x F) where each water's atoms are near xi and xj - // vlist stores 2,4,6 atoms whose forces contribute to virial + // if i,j are not O atoms, force is applied directly + // if i or j are O atoms, force is on fictitious atom & partitioned + // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) + // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f + // preserves total force and torque on water molecule + // virial = sum(r x F) where each water's atoms are near xi and xj + // vlist stores 2,4,6 atoms whose forces contribute to virial - n = 0; - key = 0; + if (EVFLAG && vflag) { + n = 0; + key = 0; + } - if (itype != typeO) { - f[i][0] += delx * cforce; - f[i][1] += dely * cforce; - f[i][2] += delz * cforce; + if (itype != typeO) { + fxtmp += delx * cforce; + fytmp += dely * cforce; + fztmp += delz * cforce; - if (EVFLAG) { + if (EVFLAG && vflag) { v[0] = x[i].x * delx * cforce; v[1] = x[i].y * dely * cforce; v[2] = x[i].z * delz * cforce; v[3] = x[i].x * dely * cforce; v[4] = x[i].x * delz * cforce; v[5] = x[i].y * delz * cforce; + vlist[n++] = i; } - vlist[n++] = i; - } else { - key += 1; - fd[0] = delx*cforce; - fd[1] = dely*cforce; - fd[2] = delz*cforce; + } else { + if (EVFLAG && vflag) key++; + fdx = delx*cforce; + fdy = dely*cforce; + fdz = delz*cforce; - fO[0] = fd[0]*(1 - alpha); - fO[1] = fd[1]*(1 - alpha); - fO[2] = fd[2]*(1 - alpha); + fOx = fdx*(1 - alpha); + fOy = fdy*(1 - alpha); + fOz = fdz*(1 - alpha); - fH[0] = 0.5 * alpha * fd[0]; - fH[1] = 0.5 * alpha * fd[1]; - fH[2] = 0.5 * alpha * fd[2]; + fHx = 0.5 * alpha * fdx; + fHy = 0.5 * alpha * fdy; + fHz = 0.5 * alpha * fdz; - f[i][0] += fO[0]; - f[i][1] += fO[1]; - f[i][2] += fO[2]; + fxtmp += fOx; + fytmp += fOy; + fztmp += fOz; - f[iH1][0] += fH[0]; - f[iH1][1] += fH[1]; - f[iH1][2] += fH[2]; + f[iH1].x += fHx; + f[iH1].y += fHy; + f[iH1].z += fHz; - f[iH2][0] += fH[0]; - f[iH2][1] += fH[1]; - f[iH2][2] += fH[2]; + f[iH2].x += fHx; + f[iH2].y += fHy; + f[iH2].z += fHz; - if (EVFLAG) { + if (EVFLAG && vflag) { xH1 = x[iH1]; xH2 = x[iH2]; - v[0] = x[i].x*fO[0] + xH1.x*fH[0] + xH2.x*fH[0]; - v[1] = x[i].y*fO[1] + xH1.y*fH[1] + xH2.y*fH[1]; - v[2] = x[i].z*fO[2] + xH1.z*fH[2] + xH2.z*fH[2]; - v[3] = x[i].x*fO[1] + xH1.x*fH[1] + xH2.x*fH[1]; - v[4] = x[i].x*fO[2] + xH1.x*fH[2] + xH2.x*fH[2]; - v[5] = x[i].y*fO[2] + xH1.y*fH[2] + xH2.y*fH[2]; - } - vlist[n++] = i; - vlist[n++] = iH1; - vlist[n++] = iH2; - } - - if (jtype != typeO) { - f[j][0] -= delx * cforce; - f[j][1] -= dely * cforce; - f[j][2] -= delz * cforce; - - if (EVFLAG) { - v[0] -= x[j].x * delx * cforce; - v[1] -= x[j].y * dely * cforce; - v[2] -= x[j].z * delz * cforce; - v[3] -= x[j].x * dely * cforce; - v[4] -= x[j].x * delz * cforce; - v[5] -= x[j].y * delz * cforce; + v[0] = x[i].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] = x[i].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] = x[i].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] = x[i].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] = x[i].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] = x[i].y*fOz + xH1.y*fHz + xH2.y*fHz; + vlist[n++] = i; + vlist[n++] = iH1; + vlist[n++] = iH2; } - vlist[n++] = j; + } - } else { - key += 2; + if (jtype != typeO) { + f[j].x -= delx * cforce; + f[j].y -= dely * cforce; + f[j].z -= delz * cforce; - fd[0] = -delx*cforce; - fd[1] = -dely*cforce; - fd[2] = -delz*cforce; + if (EVFLAG && vflag) { + v[0] -= x[j].x * delx * cforce; + v[1] -= x[j].y * dely * cforce; + v[2] -= x[j].z * delz * cforce; + v[3] -= x[j].x * dely * cforce; + v[4] -= x[j].x * delz * cforce; + v[5] -= x[j].y * delz * cforce; + vlist[n++] = j; + } - fO[0] = fd[0]*(1 - alpha); - fO[1] = fd[1]*(1 - alpha); - fO[2] = fd[2]*(1 - alpha); + } else { + if (EVFLAG && vflag) key += 2; - fH[0] = 0.5 * alpha * fd[0]; - fH[1] = 0.5 * alpha * fd[1]; - fH[2] = 0.5 * alpha * fd[2]; + fdx = -delx*cforce; + fdy = -dely*cforce; + fdz = -delz*cforce; - f[j][0] += fO[0]; - f[j][1] += fO[1]; - f[j][2] += fO[2]; + fOx = fdx*(1 - alpha); + fOy = fdy*(1 - alpha); + fOz = fdz*(1 - alpha); - f[jH1][0] += fH[0]; - f[jH1][1] += fH[1]; - f[jH1][2] += fH[2]; + fHx = 0.5 * alpha * fdx; + fHy = 0.5 * alpha * fdy; + fHz = 0.5 * alpha * fdz; - f[jH2][0] += fH[0]; - f[jH2][1] += fH[1]; - f[jH2][2] += fH[2]; + f[j].x += fOx; + f[j].y += fOy; + f[j].z += fOz; - if (EVFLAG) { + f[jH1].x += fHx; + f[jH1].y += fHy; + f[jH1].z += fHz; + + f[jH2].x += fHx; + f[jH2].y += fHy; + f[jH2].z += fHz; + + if (EVFLAG && vflag) { xH1 = x[jH1]; xH2 = x[jH2]; - v[0] += x[j].x*fO[0] + xH1.x*fH[0] + xH2.x*fH[0]; - v[1] += x[j].y*fO[1] + xH1.y*fH[1] + xH2.y*fH[1]; - v[2] += x[j].z*fO[2] + xH1.z*fH[2] + xH2.z*fH[2]; - v[3] += x[j].x*fO[1] + xH1.x*fH[1] + xH2.x*fH[1]; - v[4] += x[j].x*fO[2] + xH1.x*fH[2] + xH2.x*fH[2]; - v[5] += x[j].y*fO[2] + xH1.y*fH[2] + xH2.y*fH[2]; + v[0] += x[j].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] += x[j].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] += x[j].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] += x[j].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] += x[j].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] += x[j].y*fOz + xH1.y*fHz + xH2.y*fHz; + vlist[n++] = j; + vlist[n++] = jH1; + vlist[n++] = jH2; } - vlist[n++] = j; - vlist[n++] = jH1; - vlist[n++] = jH2; - } + } - if (EFLAG) { - if (!CTABLE || rsq <= tabinnersq) - ecoul = prefactor*erfc; - else { - table = etable[itable] + fraction*detable[itable]; - ecoul = qtmp*q[j] * table; - } - if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; + if (EFLAG) { + if (!CTABLE || rsq <= tabinnersq) + ecoul = prefactor*erfc; + else { + table = etable[itable] + fraction*detable[itable]; + ecoul = qtmp*q[j] * table; + } + if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; } else ecoul = 0.0; if (EVFLAG) ev_tally_list_thr(this,key,vlist,v,ecoul,alpha,thr); - } + } } } + f[i].x += fxtmp; + f[i].y += fytmp; + f[i].z += fztmp; } } @@ -1090,11 +1097,12 @@ void PairLJLongTIP4PLongOMP::eval_inner(int iifrom, int iito, ThrData * const th double rsq, r2inv, forcecoul = 0.0, forcelj, cforce; const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; - double * const * const f = thr->get_f(); - const double * const q = atom->q; - const int * const type = atom->type; - const double * const special_coul = force->special_coul; - const double * const special_lj = force->special_lj; + dbl3_t * _noalias const f = (dbl3_t *) thr->get_f()[0]; + const double * _noalias const q = atom->q; + const int * _noalias const type = atom->type; + const tagint * _noalias const tag = atom->tag; + const double * _noalias const special_coul = force->special_coul; + const double * _noalias const special_lj = force->special_lj; const double qqrd2e = force->qqrd2e; const double cut_coulsqplus = (cut_coul+2.0*qdist)*(cut_coul+2.0*qdist); @@ -1111,8 +1119,8 @@ void PairLJLongTIP4PLongOMP::eval_inner(int iifrom, int iito, ThrData * const th int i,j,ii,jj,jnum,itype,jtype; int iH1,iH2,jH1,jH2; - double qtmp,xtmp,ytmp,ztmp,delx,dely,delz; - double fO[3],fH[3],fd[3]; + double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,fxtmp,fytmp,fztmp; + double fOx,fOy,fOz,fHx,fHy,fHz,fdx,fdy,fdz; dbl3_t x1,x2; int *ilist,*jlist,*numneigh,**firstneigh; @@ -1131,22 +1139,35 @@ void PairLJLongTIP4PLongOMP::eval_inner(int iifrom, int iito, ThrData * const th ytmp = x[i].y; ztmp = x[i].z; itype = type[i]; + + // if atom I = water O, set x1 = offset charge site + // else x1 = x of atom I + // NOTE: to make this part thread safe, we need to + // make sure that the hneigh_thr[][] entries only get + // updated, when all data is in place. worst case, + // some calculation is repeated, but since the results + // will be the same, there is no race condition. if (itype == typeO) { if (hneigh_thr[i].a < 0) { - hneigh_thr[i].a = iH1 = atom->map(atom->tag[i] + 1); - hneigh_thr[i].b = iH2 = atom->map(atom->tag[i] + 2); - hneigh_thr[i].t = 1; + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); - if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) + if (type[iH1] != typeH || type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); + hneigh_thr[i].t = 1; + hneigh_thr[i].b = iH2; + hneigh_thr[i].a = iH1; } else { iH1 = hneigh_thr[i].a; iH2 = hneigh_thr[i].b; if (hneigh_thr[i].t == 0) { - hneigh_thr[i].t = 1; compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); + hneigh_thr[i].t = 1; } } x1 = newsite_thr[i]; @@ -1155,6 +1176,7 @@ void PairLJLongTIP4PLongOMP::eval_inner(int iifrom, int iito, ThrData * const th jlist = firstneigh[i]; jnum = numneigh[i]; lj1i = lj1[itype]; lj2i = lj2[itype]; + fxtmp=fytmp=fztmp=0.0; for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; @@ -1169,12 +1191,12 @@ void PairLJLongTIP4PLongOMP::eval_inner(int iifrom, int iito, ThrData * const th if (rsq < cut_ljsq[itype][jtype] && rsq < cut_out_off_sq ) { // lj r2inv = 1.0/rsq; - register double rn = r2inv*r2inv*r2inv; - if (ni == 0) forcelj = rn*(rn*lj1i[jtype]-lj2i[jtype]); - else { // special case - register double f = special_lj[ni]; - forcelj = f*rn*(rn*lj1i[jtype]-lj2i[jtype]); - } + register double rn = r2inv*r2inv*r2inv; + if (ni == 0) forcelj = rn*(rn*lj1i[jtype]-lj2i[jtype]); + else { // special case + register double f = special_lj[ni]; + forcelj = f*rn*(rn*lj1i[jtype]-lj2i[jtype]); + } if (rsq > cut_out_on_sq) { // switching register double rsw = (sqrt(rsq) - cut_out_on)/cut_out_diff; @@ -1182,12 +1204,12 @@ void PairLJLongTIP4PLongOMP::eval_inner(int iifrom, int iito, ThrData * const th } forcelj *= r2inv; - f[i][0] += delx*forcelj; - f[i][1] += dely*forcelj; - f[i][2] += delz*forcelj; - f[j][0] -= delx*forcelj; - f[j][1] -= dely*forcelj; - f[j][2] -= delz*forcelj; + fxtmp += delx*forcelj; + fytmp += dely*forcelj; + fztmp += delz*forcelj; + f[j].x -= delx*forcelj; + f[j].y -= dely*forcelj; + f[j].z -= delz*forcelj; } @@ -1196,36 +1218,41 @@ void PairLJLongTIP4PLongOMP::eval_inner(int iifrom, int iito, ThrData * const th if (rsq < cut_coulsqplus && order1) { if (itype == typeO || jtype == typeO) { - if (jtype == typeO) { + if (jtype == typeO) { if (hneigh_thr[j].a < 0) { - hneigh_thr[j].a = jH1 = atom->map(atom->tag[j] + 1); - hneigh_thr[j].b = jH2 = atom->map(atom->tag[j] + 2); - hneigh_thr[j].t = 1; + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); - if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) + if (type[jH1] != typeH || type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); + hneigh_thr[j].t = 1; + hneigh_thr[j].b = jH2; + hneigh_thr[j].a = jH1; } else { jH1 = hneigh_thr[j].a; jH2 = hneigh_thr[j].b; if (hneigh_thr[j].t == 0) { - hneigh_thr[j].t = 1; compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); + hneigh_thr[j].t = 1; } } x2 = newsite_thr[j]; - } else x2 = x[j]; - delx = x1.x - x2.x; - dely = x1.y - x2.y; - delz = x1.z - x2.z; - rsq = delx*delx + dely*dely + delz*delz; + } else x2 = x[j]; + delx = x1.x - x2.x; + dely = x1.y - x2.y; + delz = x1.z - x2.z; + rsq = delx*delx + dely*dely + delz*delz; } - // test current rsq against cutoff and compute Coulombic force + // test current rsq against cutoff and compute Coulombic force if (rsq < cut_coulsq && rsq < cut_out_off_sq) { - r2inv = 1.0 / rsq; + r2inv = 1.0 / rsq; qri = qqrd2e*qtmp; if (ni == 0) forcecoul = qri*q[j]*sqrt(r2inv); else { @@ -1237,83 +1264,86 @@ void PairLJLongTIP4PLongOMP::eval_inner(int iifrom, int iito, ThrData * const th forcecoul *= 1.0 + rsw*rsw*(2.0*rsw-3.0); } - cforce = forcecoul * r2inv; + cforce = forcecoul * r2inv; - //if (evflag) ev_tally(i,j,nlocal,newton_pair, + //if (evflag) ev_tally(i,j,nlocal,newton_pair, // evdwl,0.0,cforce,delx,dely,delz); - // if i,j are not O atoms, force is applied directly - // if i or j are O atoms, force is on fictitious atom & partitioned - // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) - // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f - // preserves total force and torque on water molecule - // virial = sum(r x F) where each water's atoms are near xi and xj - // vlist stores 2,4,6 atoms whose forces contribute to virial + // if i,j are not O atoms, force is applied directly + // if i or j are O atoms, force is on fictitious atom & partitioned + // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) + // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f + // preserves total force and torque on water molecule + // virial = sum(r x F) where each water's atoms are near xi and xj + // vlist stores 2,4,6 atoms whose forces contribute to virial - if (itype != typeO) { - f[i][0] += delx * cforce; - f[i][1] += dely * cforce; - f[i][2] += delz * cforce; + if (itype != typeO) { + fxtmp += delx * cforce; + fytmp += dely * cforce; + fztmp += delz * cforce; - } else { - fd[0] = delx*cforce; - fd[1] = dely*cforce; - fd[2] = delz*cforce; + } else { + fdx = delx*cforce; + fdy = dely*cforce; + fdz = delz*cforce; - fO[0] = fd[0]*(1 - alpha); - fO[1] = fd[1]*(1 - alpha); - fO[2] = fd[2]*(1 - alpha); + fOx = fdx*(1 - alpha); + fOy = fdy*(1 - alpha); + fOz = fdz*(1 - alpha); - fH[0] = 0.5 * alpha * fd[0]; - fH[1] = 0.5 * alpha * fd[1]; - fH[2] = 0.5 * alpha * fd[2]; + fHx = 0.5 * alpha * fdx; + fHy = 0.5 * alpha * fdy; + fHz = 0.5 * alpha * fdz; - f[i][0] += fO[0]; - f[i][1] += fO[1]; - f[i][2] += fO[2]; + fxtmp += fOx; + fytmp += fOy; + fztmp += fOz; - f[iH1][0] += fH[0]; - f[iH1][1] += fH[1]; - f[iH1][2] += fH[2]; + f[iH1].x += fHx; + f[iH1].y += fHy; + f[iH1].z += fHz; - f[iH2][0] += fH[0]; - f[iH2][1] += fH[1]; - f[iH2][2] += fH[2]; + f[iH2].x += fHx; + f[iH2].y += fHy; + f[iH2].z += fHz; } - if (jtype != typeO) { - f[j][0] -= delx * cforce; - f[j][1] -= dely * cforce; - f[j][2] -= delz * cforce; + if (jtype != typeO) { + f[j].x -= delx * cforce; + f[j].y -= dely * cforce; + f[j].z -= delz * cforce; - } else { - fd[0] = -delx*cforce; - fd[1] = -dely*cforce; - fd[2] = -delz*cforce; + } else { + fdx = -delx*cforce; + fdy = -dely*cforce; + fdz = -delz*cforce; - fO[0] = fd[0]*(1 - alpha); - fO[1] = fd[1]*(1 - alpha); - fO[2] = fd[2]*(1 - alpha); + fOx = fdx*(1 - alpha); + fOy = fdy*(1 - alpha); + fOz = fdz*(1 - alpha); - fH[0] = 0.5 * alpha * fd[0]; - fH[1] = 0.5 * alpha * fd[1]; - fH[2] = 0.5 * alpha * fd[2]; + fHx = 0.5 * alpha * fdx; + fHy = 0.5 * alpha * fdy; + fHz = 0.5 * alpha * fdz; - f[j][0] += fO[0]; - f[j][1] += fO[1]; - f[j][2] += fO[2]; + f[j].x += fOx; + f[j].y += fOy; + f[j].z += fOz; - f[jH1][0] += fH[0]; - f[jH1][1] += fH[1]; - f[jH1][2] += fH[2]; + f[jH1].x += fHx; + f[jH1].y += fHy; + f[jH1].z += fHz; - f[jH2][0] += fH[0]; - f[jH2][1] += fH[1]; - f[jH2][2] += fH[2]; + f[jH2].x += fHx; + f[jH2].y += fHy; + f[jH2].z += fHz; } - } + } } } + f[i].x += fxtmp; + f[i].y += fytmp; + f[i].z += fztmp; } } @@ -1324,11 +1354,12 @@ void PairLJLongTIP4PLongOMP::eval_middle(int iifrom, int iito, ThrData * const t double rsq, r2inv, forcecoul,forcelj, cforce; const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; - double * const * const f = thr->get_f(); - const double * const q = atom->q; - const int * const type = atom->type; - const double * const special_coul = force->special_coul; - const double * const special_lj = force->special_lj; + dbl3_t * _noalias const f = (dbl3_t *) thr->get_f()[0]; + const double * _noalias const q = atom->q; + const int * _noalias const type = atom->type; + const tagint * _noalias const tag = atom->tag; + const double * _noalias const special_coul = force->special_coul; + const double * _noalias const special_lj = force->special_lj; const double qqrd2e = force->qqrd2e; const double cut_coulsqplus = (cut_coul+2.0*qdist)*(cut_coul+2.0*qdist); @@ -1348,8 +1379,8 @@ void PairLJLongTIP4PLongOMP::eval_middle(int iifrom, int iito, ThrData * const t int i,j,ii,jj,jnum,itype,jtype; int iH1,iH2,jH1,jH2; - double qtmp,xtmp,ytmp,ztmp,delx,dely,delz; - double fO[3],fH[3],fd[3]; + double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,fxtmp,fytmp,fztmp; + double fOx,fOy,fOz,fHx,fHy,fHz,fdx,fdy,fdz; dbl3_t x1,x2; int *ilist,*jlist,*numneigh,**firstneigh; double qri; @@ -1372,20 +1403,25 @@ void PairLJLongTIP4PLongOMP::eval_middle(int iifrom, int iito, ThrData * const t itype = type[i]; if (itype == typeO) { if (hneigh_thr[i].a < 0) { - hneigh_thr[i].a = iH1 = atom->map(atom->tag[i] + 1); - hneigh_thr[i].b = iH2 = atom->map(atom->tag[i] + 2); - hneigh_thr[i].t = 1; + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); - if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) + if (type[iH1] != typeH || type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); + hneigh_thr[i].t = 1; + hneigh_thr[i].b = iH2; + hneigh_thr[i].a = iH1; } else { iH1 = hneigh_thr[i].a; iH2 = hneigh_thr[i].b; if (hneigh_thr[i].t == 0) { - hneigh_thr[i].t = 1; compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); + hneigh_thr[i].t = 1; } } x1 = newsite_thr[i]; @@ -1394,6 +1430,7 @@ void PairLJLongTIP4PLongOMP::eval_middle(int iifrom, int iito, ThrData * const t jlist = firstneigh[i]; jnum = numneigh[i]; lj1i = lj1[itype]; lj2i = lj2[itype]; + fxtmp = fytmp = fztmp = 0.0; for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; @@ -1408,12 +1445,12 @@ void PairLJLongTIP4PLongOMP::eval_middle(int iifrom, int iito, ThrData * const t if (rsq < cut_ljsq[itype][jtype] && rsq >= cut_in_off_sq && rsq <= cut_out_off_sq ) { // lj r2inv = 1.0/rsq; - register double rn = r2inv*r2inv*r2inv; - if (ni == 0) forcelj = rn*(rn*lj1i[jtype]-lj2i[jtype]); - else { // special case - register double f = special_lj[ni]; - forcelj = f*rn*(rn*lj1i[jtype]-lj2i[jtype]); - } + register double rn = r2inv*r2inv*r2inv; + if (ni == 0) forcelj = rn*(rn*lj1i[jtype]-lj2i[jtype]); + else { // special case + register double f = special_lj[ni]; + forcelj = f*rn*(rn*lj1i[jtype]-lj2i[jtype]); + } if (rsq < cut_in_on_sq) { // switching register double rsw = (sqrt(rsq) - cut_in_off)/cut_in_diff; @@ -1425,12 +1462,12 @@ void PairLJLongTIP4PLongOMP::eval_middle(int iifrom, int iito, ThrData * const t } forcelj *= r2inv; - f[i][0] += delx*forcelj; - f[i][1] += dely*forcelj; - f[i][2] += delz*forcelj; - f[j][0] -= delx*forcelj; - f[j][1] -= dely*forcelj; - f[j][2] -= delz*forcelj; + fxtmp += delx*forcelj; + fytmp += dely*forcelj; + fztmp += delz*forcelj; + f[j].x -= delx*forcelj; + f[j].y -= dely*forcelj; + f[j].z -= delz*forcelj; } @@ -1439,36 +1476,41 @@ void PairLJLongTIP4PLongOMP::eval_middle(int iifrom, int iito, ThrData * const t if (rsq < cut_coulsqplus && order1) { if (itype == typeO || jtype == typeO) { - if (jtype == typeO) { + if (jtype == typeO) { if (hneigh_thr[j].a < 0) { - hneigh_thr[j].a = jH1 = atom->map(atom->tag[j] + 1); - hneigh_thr[j].b = jH2 = atom->map(atom->tag[j] + 2); - hneigh_thr[j].t = 1; + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); - if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) + if (type[jH1] != typeH || type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); + hneigh_thr[j].t = 1; + hneigh_thr[j].b = jH2; + hneigh_thr[j].a = jH1; } else { jH1 = hneigh_thr[j].a; jH2 = hneigh_thr[j].b; if (hneigh_thr[j].t == 0) { - hneigh_thr[j].t = 1; compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); + hneigh_thr[j].t = 1; } } x2 = newsite_thr[j]; - } else x2 = x[j]; - delx = x1.x - x2.x; - dely = x1.y - x2.y; - delz = x1.z - x2.z; - rsq = delx*delx + dely*dely + delz*delz; + } else x2 = x[j]; + delx = x1.x - x2.x; + dely = x1.y - x2.y; + delz = x1.z - x2.z; + rsq = delx*delx + dely*dely + delz*delz; } - // test current rsq against cutoff and compute Coulombic force + // test current rsq against cutoff and compute Coulombic force if (rsq < cut_coulsq && rsq >= cut_in_off_sq && rsq <= cut_out_off_sq) { - r2inv = 1.0 / rsq; + r2inv = 1.0 / rsq; qri = qqrd2e*qtmp; if (ni == 0) forcecoul = qri*q[j]*sqrt(r2inv); else { @@ -1484,83 +1526,86 @@ void PairLJLongTIP4PLongOMP::eval_middle(int iifrom, int iito, ThrData * const t forcecoul *= 1.0 + rsw*rsw*(2.0*rsw-3.0); } - cforce = forcecoul * r2inv; + cforce = forcecoul * r2inv; - //if (evflag) ev_tally(i,j,nlocal,newton_pair, + //if (evflag) ev_tally(i,j,nlocal,newton_pair, // evdwl,0.0,cforce,delx,dely,delz); - // if i,j are not O atoms, force is applied directly - // if i or j are O atoms, force is on fictitious atom & partitioned - // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) - // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f - // preserves total force and torque on water molecule - // virial = sum(r x F) where each water's atoms are near xi and xj - // vlist stores 2,4,6 atoms whose forces contribute to virial + // if i,j are not O atoms, force is applied directly + // if i or j are O atoms, force is on fictitious atom & partitioned + // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) + // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f + // preserves total force and torque on water molecule + // virial = sum(r x F) where each water's atoms are near xi and xj + // vlist stores 2,4,6 atoms whose forces contribute to virial - if (itype != typeO) { - f[i][0] += delx * cforce; - f[i][1] += dely * cforce; - f[i][2] += delz * cforce; + if (itype != typeO) { + fxtmp += delx * cforce; + fytmp += dely * cforce; + fztmp += delz * cforce; - } else { - fd[0] = delx*cforce; - fd[1] = dely*cforce; - fd[2] = delz*cforce; + } else { + fdx = delx*cforce; + fdy = dely*cforce; + fdz = delz*cforce; - fO[0] = fd[0]*(1 - alpha); - fO[1] = fd[1]*(1 - alpha); - fO[2] = fd[2]*(1 - alpha); + fOx = fdx*(1 - alpha); + fOy = fdy*(1 - alpha); + fOz = fdz*(1 - alpha); - fH[0] = 0.5 * alpha * fd[0]; - fH[1] = 0.5 * alpha * fd[1]; - fH[2] = 0.5 * alpha * fd[2]; + fHx = 0.5 * alpha * fdx; + fHy = 0.5 * alpha * fdy; + fHz = 0.5 * alpha * fdz; - f[i][0] += fO[0]; - f[i][1] += fO[1]; - f[i][2] += fO[2]; + fxtmp += fOx; + fytmp += fOy; + fztmp += fOz; - f[iH1][0] += fH[0]; - f[iH1][1] += fH[1]; - f[iH1][2] += fH[2]; + f[iH1].x += fHx; + f[iH1].y += fHy; + f[iH1].z += fHz; - f[iH2][0] += fH[0]; - f[iH2][1] += fH[1]; - f[iH2][2] += fH[2]; + f[iH2].x += fHx; + f[iH2].y += fHy; + f[iH2].z += fHz; } - if (jtype != typeO) { - f[j][0] -= delx * cforce; - f[j][1] -= dely * cforce; - f[j][2] -= delz * cforce; + if (jtype != typeO) { + f[j].x -= delx * cforce; + f[j].y -= dely * cforce; + f[j].z -= delz * cforce; - } else { - fd[0] = -delx*cforce; - fd[1] = -dely*cforce; - fd[2] = -delz*cforce; + } else { + fdx = -delx*cforce; + fdy = -dely*cforce; + fdz = -delz*cforce; - fO[0] = fd[0]*(1 - alpha); - fO[1] = fd[1]*(1 - alpha); - fO[2] = fd[2]*(1 - alpha); + fOx = fdx*(1 - alpha); + fOy = fdy*(1 - alpha); + fOz = fdz*(1 - alpha); - fH[0] = 0.5 * alpha * fd[0]; - fH[1] = 0.5 * alpha * fd[1]; - fH[2] = 0.5 * alpha * fd[2]; + fHx = 0.5 * alpha * fdx; + fHy = 0.5 * alpha * fdy; + fHz = 0.5 * alpha * fdz; - f[j][0] += fO[0]; - f[j][1] += fO[1]; - f[j][2] += fO[2]; + f[j].x += fOx; + f[j].y += fOy; + f[j].z += fOz; - f[jH1][0] += fH[0]; - f[jH1][1] += fH[1]; - f[jH1][2] += fH[2]; + f[jH1].x += fHx; + f[jH1].y += fHy; + f[jH1].z += fHz; - f[jH2][0] += fH[0]; - f[jH2][1] += fH[1]; - f[jH2][2] += fH[2]; + f[jH2].x += fHx; + f[jH2].y += fHy; + f[jH2].z += fHz; } - } + } } } + f[i].x += fxtmp; + f[i].y += fytmp; + f[i].z += fztmp; } } @@ -1572,25 +1617,28 @@ void PairLJLongTIP4PLongOMP::eval_outer(int iifrom, int iito, ThrData * const th { double evdwl,ecoul,fvirial; evdwl = ecoul = 0.0; + double qtmp,xtmp,ytmp,ztmp,delx,dely,delz; + double r2inv,forcecoul,forcelj,cforce, respa_coul, respa_lj, frespa; + double fdx,fdy,fdz,fOx,fOy,fOz,fHx,fHy,fHz; + double v[6]; + dbl3_t x1,x2,xH1,xH2; const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; - double * const * const f = thr->get_f(); - const double * const q = atom->q; - const int * const type = atom->type; + dbl3_t * _noalias const f = (dbl3_t *) thr->get_f()[0]; + const double * _noalias const q = atom->q; + const int * _noalias const type = atom->type; + const tagint * _noalias const tag = atom->tag; const int nlocal = atom->nlocal; - const double * const special_coul = force->special_coul; - const double * const special_lj = force->special_lj; + const double * _noalias const special_coul = force->special_coul; + const double * _noalias const special_lj = force->special_lj; const double qqrd2e = force->qqrd2e; const double cut_coulsqplus = (cut_coul+2.0*qdist)*(cut_coul+2.0*qdist); - + const int vflag = vflag_atom || vflag_global; + int i,j,ii,jj,jnum,itype,jtype; int n,vlist[6]; int key; int iH1,iH2,jH1,jH2; - double qtmp,xtmp,ytmp,ztmp,delx,dely,delz; - double r2inv,forcecoul,forcelj,cforce, respa_coul, respa_lj, frespa; - double fO[3],fH[3],fd[3],v[6],xH1[3],xH2[3]; - dbl3_t x1,x2; int *ilist,*jlist,*numneigh,**firstneigh; double rsq,qri; int respa_flag; @@ -1606,6 +1654,8 @@ void PairLJLongTIP4PLongOMP::eval_outer(int iifrom, int iito, ThrData * const th const double cut_in_off_sq = cut_in_off*cut_in_off; const double cut_in_on_sq = cut_in_on*cut_in_on; + double fxtmp,fytmp,fztmp; + ilist = listouter->ilist; numneigh = listouter->numneigh; firstneigh = listouter->firstneigh; @@ -1622,20 +1672,25 @@ void PairLJLongTIP4PLongOMP::eval_outer(int iifrom, int iito, ThrData * const th itype = type[i]; if (itype == typeO) { if (hneigh_thr[i].a < 0) { - hneigh_thr[i].a = iH1 = atom->map(atom->tag[i] + 1); - hneigh_thr[i].b = iH2 = atom->map(atom->tag[i] + 2); - hneigh_thr[i].t = 1; + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); - if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) + if (type[iH1] != typeH || type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); + hneigh_thr[i].t = 1; + hneigh_thr[i].b = iH2; + hneigh_thr[i].a = iH1; compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); } else { iH1 = hneigh_thr[i].a; iH2 = hneigh_thr[i].b; if (hneigh_thr[i].t == 0) { - hneigh_thr[i].t = 1; compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); + hneigh_thr[i].t = 1; } } x1 = newsite_thr[i]; @@ -1670,8 +1725,8 @@ void PairLJLongTIP4PLongOMP::eval_outer(int iifrom, int iito, ThrData * const th r2inv = 1.0/rsq; register double rn = r2inv*r2inv*r2inv; if (respa_flag) respa_lj = ni == 0 ? // correct for respa - frespa*rn*(rn*lj1i[jtype]-lj2i[jtype]) : - frespa*rn*(rn*lj1i[jtype]-lj2i[jtype])*special_lj[ni]; + frespa*rn*(rn*lj1i[jtype]-lj2i[jtype]) : + frespa*rn*(rn*lj1i[jtype]-lj2i[jtype])*special_lj[ni]; if (ORDER6) { // long-range form if (!ndisptablebits || rsq <= tabinnerdispsq) { register double x2 = g2*rsq, a2 = 1.0/x2; @@ -1719,17 +1774,17 @@ void PairLJLongTIP4PLongOMP::eval_outer(int iifrom, int iito, ThrData * const th } forcelj *= r2inv; - f[i][0] += delx*forcelj; - f[i][1] += dely*forcelj; - f[i][2] += delz*forcelj; - f[j][0] -= delx*forcelj; - f[j][1] -= dely*forcelj; - f[j][2] -= delz*forcelj; + fxtmp += delx*forcelj; + fytmp += dely*forcelj; + fztmp += delz*forcelj; + f[j].x -= delx*forcelj; + f[j].y -= dely*forcelj; + f[j].z -= delz*forcelj; if (EVFLAG) { fvirial = forcelj + respa_lj*r2inv; ev_tally_thr(this,i,j,nlocal,/*newton_pair = */ 1, - evdwl,0.0,fvirial,delx,dely,delz, thr); + evdwl,0.0,fvirial,delx,dely,delz, thr); } } @@ -1739,33 +1794,38 @@ void PairLJLongTIP4PLongOMP::eval_outer(int iifrom, int iito, ThrData * const th if (rsq < cut_coulsqplus) { if (itype == typeO || jtype == typeO) { - if (jtype == typeO) { + if (jtype == typeO) { if (hneigh_thr[j].a < 0) { - hneigh_thr[j].a = jH1 = atom->map(atom->tag[j] + 1); - hneigh_thr[j].b = jH2 = atom->map(atom->tag[j] + 2); - hneigh_thr[j].t = 1; + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); - if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) + if (type[jH1] != typeH || type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); + hneigh_thr[j].t = 1; + hneigh_thr[j].b = jH2; + hneigh_thr[j].a = jH1; } else { jH1 = hneigh_thr[j].a; jH2 = hneigh_thr[j].b; if (hneigh_thr[j].t == 0) { - hneigh_thr[j].t = 1; compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); + hneigh_thr[j].t = 1; } } x2 = newsite_thr[j]; - } else x2 = x[j]; - delx = x1.x - x2.x; - dely = x1.y - x2.y; - delz = x1.z - x2.z; - rsq = delx*delx + dely*dely + delz*delz; + } else x2 = x[j]; + delx = x1.x - x2.x; + dely = x1.y - x2.y; + delz = x1.z - x2.z; + rsq = delx*delx + dely*dely + delz*delz; } - // test current rsq against cutoff and compute Coulombic force + // test current rsq against cutoff and compute Coulombic force if ((rsq < cut_coulsq) && ORDER1) { frespa = 1.0; // check whether and how to compute respa corrections @@ -1819,161 +1879,165 @@ void PairLJLongTIP4PLongOMP::eval_outer(int iifrom, int iito, ThrData * const th fvirial = (forcecoul + respa_coul) * r2inv; // if i,j are not O atoms, force is applied directly - // if i or j are O atoms, force is on fictitious atom & partitioned - // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) - // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f - // preserves total force and torque on water molecule - // virial = sum(r x F) where each water's atoms are near xi and xj - // vlist stores 2,4,6 atoms whose forces contribute to virial + // if i or j are O atoms, force is on fictitious atom & partitioned + // force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999) + // f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f + // preserves total force and torque on water molecule + // virial = sum(r x F) where each water's atoms are near xi and xj + // vlist stores 2,4,6 atoms whose forces contribute to virial - n = 0; - key = 0; + if (EVFLAG && vflag) { + n = 0; + key = 0; + } - if (itype != typeO) { - f[i][0] += delx * cforce; - f[i][1] += dely * cforce; - f[i][2] += delz * cforce; + if (itype != typeO) { + fxtmp += delx * cforce; + fytmp += dely * cforce; + fztmp += delz * cforce; - if (EVFLAG) { + if (EVFLAG && vflag) { v[0] = x[i].x * delx * fvirial; v[1] = x[i].y * dely * fvirial; v[2] = x[i].z * delz * fvirial; v[3] = x[i].x * dely * fvirial; v[4] = x[i].x * delz * fvirial; v[5] = x[i].y * delz * fvirial; + vlist[n++] = i; } - vlist[n++] = i; - } else { - key += 1; - fd[0] = delx*cforce; - fd[1] = dely*cforce; - fd[2] = delz*cforce; + } else { + if (EVFLAG && vflag) key += 1; - fO[0] = fd[0]*(1 - alpha); - fO[1] = fd[1]*(1 - alpha); - fO[2] = fd[2]*(1 - alpha); + fdx = delx*cforce; + fdy = dely*cforce; + fdz = delz*cforce; - fH[0] = 0.5 * alpha * fd[0]; - fH[1] = 0.5 * alpha * fd[1]; - fH[2] = 0.5 * alpha * fd[2]; + fOx = fdx*(1 - alpha); + fOy = fdy*(1 - alpha); + fOz = fdz*(1 - alpha); - f[i][0] += fO[0]; - f[i][1] += fO[1]; - f[i][2] += fO[2]; + fHx = 0.5*alpha * fdx; + fHy = 0.5*alpha * fdy; + fHz = 0.5*alpha * fdz; - f[iH1][0] += fH[0]; - f[iH1][1] += fH[1]; - f[iH1][2] += fH[2]; + fxtmp += fOx; + fytmp += fOy; + fztmp += fOz; - f[iH2][0] += fH[0]; - f[iH2][1] += fH[1]; - f[iH2][2] += fH[2]; + f[iH1].x += fHx; + f[iH1].y += fHy; + f[iH1].z += fHz; - if (EVFLAG) { + f[iH2].x += fHx; + f[iH2].y += fHy; + f[iH2].z += fHz; - fd[0] = delx*fvirial; - fd[1] = dely*fvirial; - fd[2] = delz*fvirial; + if (EVFLAG && vflag) { + xH1 = x[iH1]; + xH2 = x[iH2]; - fO[0] = fd[0]*(1 - alpha); - fO[1] = fd[1]*(1 - alpha); - fO[2] = fd[2]*(1 - alpha); + fdx = delx*fvirial; + fdy = dely*fvirial; + fdz = delz*fvirial; - fH[0] = 0.5 * alpha * fd[0]; - fH[1] = 0.5 * alpha * fd[1]; - fH[2] = 0.5 * alpha * fd[2]; + fOx = fdx*(1 - alpha); + fOy = fdy*(1 - alpha); + fOz = fdz*(1 - alpha); - domain->closest_image(&x[i].x,&x[iH1].x,xH1); - domain->closest_image(&x[i].x,&x[iH2].x,xH2); + fHx = 0.5 * alpha * fdx; + fHy = 0.5 * alpha * fdy; + fHz = 0.5 * alpha * fdz; - v[0] = x[i].x*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; - v[1] = x[i].y*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; - v[2] = x[i].z*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; - v[3] = x[i].x*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1]; - v[4] = x[i].x*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2]; - v[5] = x[i].y*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2]; - } - vlist[n++] = i; - vlist[n++] = iH1; - vlist[n++] = iH2; - } - - if (jtype != typeO) { - f[j][0] -= delx * cforce; - f[j][1] -= dely * cforce; - f[j][2] -= delz * cforce; - - if (EVFLAG) { - v[0] -= x[j].x * delx * fvirial; - v[1] -= x[j].y * dely * fvirial; - v[2] -= x[j].z * delz * fvirial; - v[3] -= x[j].x * dely * fvirial; - v[4] -= x[j].x * delz * fvirial; - v[5] -= x[j].y * delz * fvirial; + v[0] = x[i].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] = x[i].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] = x[i].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] = x[i].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] = x[i].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] = x[i].y*fOz + xH1.y*fHz + xH2.y*fHz; + vlist[n++] = i; + vlist[n++] = iH1; + vlist[n++] = iH2; } - vlist[n++] = j; + } - } else { - key += 2; + if (jtype != typeO) { + f[j].x -= delx * cforce; + f[j].y -= dely * cforce; + f[j].z -= delz * cforce; - fd[0] = -delx*cforce; - fd[1] = -dely*cforce; - fd[2] = -delz*cforce; - - fO[0] = fd[0]*(1 - alpha); - fO[1] = fd[1]*(1 - alpha); - fO[2] = fd[2]*(1 - alpha); - - fH[0] = 0.5 * alpha * fd[0]; - fH[1] = 0.5 * alpha * fd[1]; - fH[2] = 0.5 * alpha * fd[2]; - - f[j][0] += fO[0]; - f[j][1] += fO[1]; - f[j][2] += fO[2]; - - f[jH1][0] += fH[0]; - f[jH1][1] += fH[1]; - f[jH1][2] += fH[2]; - - f[jH2][0] += fH[0]; - f[jH2][1] += fH[1]; - f[jH2][2] += fH[2]; - - if (EVFLAG) { - - fd[0] = -delx*fvirial; - fd[1] = -dely*fvirial; - fd[2] = -delz*fvirial; - - fO[0] = fd[0]*(1 - alpha); - fO[1] = fd[1]*(1 - alpha); - fO[2] = fd[2]*(1 - alpha); - - fH[0] = 0.5 * alpha * fd[0]; - fH[1] = 0.5 * alpha * fd[1]; - fH[2] = 0.5 * alpha * fd[2]; - - domain->closest_image(&x[j].x,&x[jH1].x,xH1); - domain->closest_image(&x[j].x,&x[jH2].x,xH2); - - v[0] += x[j].x*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; - v[1] += x[j].y*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; - v[2] += x[j].z*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; - v[3] += x[j].x*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1]; - v[4] += x[j].x*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2]; - v[5] += x[j].y*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2]; + if (EVFLAG && vflag) { + v[0] -= x[j].x * delx * fvirial; + v[1] -= x[j].y * dely * fvirial; + v[2] -= x[j].z * delz * fvirial; + v[3] -= x[j].x * dely * fvirial; + v[4] -= x[j].x * delz * fvirial; + v[5] -= x[j].y * delz * fvirial; + vlist[n++] = j; } - vlist[n++] = j; - vlist[n++] = jH1; - vlist[n++] = jH2; - } + + } else { + if (EVFLAG && vflag) key += 2; + + fdx = -delx*cforce; + fdy = -dely*cforce; + fdz = -delz*cforce; + + fOx = fdx*(1 - alpha); + fOy = fdy*(1 - alpha); + fOz = fdz*(1 - alpha); + + fHx = 0.5 * alpha * fdx; + fHy = 0.5 * alpha * fdy; + fHz = 0.5 * alpha * fdz; + + f[j].x += fOx; + f[j].y += fOy; + f[j].z += fOz; + + f[jH1].x += fHx; + f[jH1].y += fHy; + f[jH1].z += fHz; + + f[jH2].x += fHx; + f[jH2].y += fHy; + f[jH2].z += fHz; + + if (EVFLAG && vflag) { + xH1 = x[jH1]; + xH2 = x[jH2]; + + fdx = -delx*fvirial; + fdy = -dely*fvirial; + fdz = -delz*fvirial; + + fOx = fdx*(1 - alpha); + fOy = fdy*(1 - alpha); + fOz = fdz*(1 - alpha); + + fHx = 0.5 * alpha * fdx; + fHy = 0.5 * alpha * fdy; + fHz = 0.5 * alpha * fdz; + + v[0] += x[j].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] += x[j].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] += x[j].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] += x[j].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] += x[j].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] += x[j].y*fOz + xH1.y*fHz + xH2.y*fHz; + vlist[n++] = j; + vlist[n++] = jH1; + vlist[n++] = jH2; + } + } if (EVFLAG) ev_tally_list_thr(this,key,vlist,v,ecoul,alpha,thr); } } } + f[i].x += fxtmp; + f[i].y += fytmp; + f[i].z += fztmp; } } From 31a734b03d620c9aef0ecacb53f2d251ca13e55e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Jun 2017 17:10:33 -0400 Subject: [PATCH 142/302] sbmask function should be flagged as const indicating no side effects --- src/compute.h | 2 +- src/create_bonds.h | 2 +- src/delete_atoms.h | 2 +- src/pair.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compute.h b/src/compute.h index 7f12cd97e2..279f71829b 100644 --- a/src/compute.h +++ b/src/compute.h @@ -152,7 +152,7 @@ class Compute : protected Pointers { double **vbiasall; // stored velocity bias for all atoms int maxbias; // size of vbiasall array - inline int sbmask(int j) { + inline int sbmask(int j) const { return j >> SBBITS & 3; } diff --git a/src/create_bonds.h b/src/create_bonds.h index 2936506b3f..24b1596e37 100644 --- a/src/create_bonds.h +++ b/src/create_bonds.h @@ -30,7 +30,7 @@ class CreateBonds : protected Pointers { void command(int, char **); private: - inline int sbmask(int j) { + inline int sbmask(int j) const { return j >> SBBITS & 3; } }; diff --git a/src/delete_atoms.h b/src/delete_atoms.h index 62ba47d715..72cf44285f 100644 --- a/src/delete_atoms.h +++ b/src/delete_atoms.h @@ -45,7 +45,7 @@ class DeleteAtoms : protected Pointers { void recount_topology(); void options(int, char **); - inline int sbmask(int j) { + inline int sbmask(int j) const { return j >> SBBITS & 3; } diff --git a/src/pair.h b/src/pair.h index dd859e5f2a..b57004d965 100644 --- a/src/pair.h +++ b/src/pair.h @@ -245,7 +245,7 @@ class Pair : protected Pointers { ubuf(int arg) : i(arg) {} }; - inline int sbmask(int j) { + inline int sbmask(int j) const { return j >> SBBITS & 3; } }; From 5c1d17d1c031f78fbe08d0500bb3396087464b4b Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 8 Jun 2017 10:42:08 -0600 Subject: [PATCH 143/302] Updating Kokkos lib to v2.03.05 --- lib/kokkos/CHANGELOG.md | 48 + lib/kokkos/CMakeLists.txt | 46 +- lib/kokkos/Makefile.kokkos | 360 +- lib/kokkos/Makefile.targets | 13 +- .../algorithms/src/KokkosAlgorithms_dummy.cpp | 1 + lib/kokkos/algorithms/src/Kokkos_Random.hpp | 6 +- lib/kokkos/algorithms/unit_tests/Makefile | 19 +- lib/kokkos/algorithms/unit_tests/TestCuda.cpp | 18 +- .../algorithms/unit_tests/TestOpenMP.cpp | 18 +- .../algorithms/unit_tests/TestRandom.hpp | 6 +- .../algorithms/unit_tests/TestSerial.cpp | 16 +- lib/kokkos/algorithms/unit_tests/TestSort.hpp | 21 +- .../algorithms/unit_tests/TestThreads.cpp | 16 +- .../benchmarks/bytes_and_flops/Makefile | 6 +- lib/kokkos/benchmarks/gather/Makefile | 8 +- lib/kokkos/cmake/KokkosConfig.cmake.in | 18 + lib/kokkos/cmake/Modules/FindHWLOC.cmake | 20 + lib/kokkos/cmake/Modules/FindMemkind.cmake | 20 + lib/kokkos/cmake/Modules/FindQthreads.cmake | 20 + lib/kokkos/cmake/kokkos.cmake | 1198 + .../kokkos-trilinos-integration-procedure.txt | 44 +- .../config/kokkos_dev/config-core-all.sh | 2 +- .../kokkos_dev/config-core-cuda-omp-hwloc.sh | 2 +- .../config/kokkos_dev/config-core-cuda.sh | 2 +- lib/kokkos/config/master_history.txt | 3 +- lib/kokkos/config/snapshot.py | 68 +- lib/kokkos/config/test_all_sandia | 17 +- .../testing_scripts/jenkins_test_driver | 2 +- .../config/trilinos-integration/checkin-test | 4 + .../prepare_trilinos_repos.sh | 25 +- .../shepard_jenkins_run_script_pthread_intel | 60 + .../shepard_jenkins_run_script_serial_intel | 60 + .../white_run_jenkins_script_cuda | 63 + .../white_run_jenkins_script_omp | 58 + .../containers/performance_tests/Makefile | 11 +- .../containers/performance_tests/TestCuda.cpp | 20 +- .../performance_tests/TestDynRankView.hpp | 9 +- .../performance_tests/TestOpenMP.cpp | 16 +- .../performance_tests/TestThreads.cpp | 16 +- lib/kokkos/containers/src/Kokkos_Bitset.hpp | 9 +- lib/kokkos/containers/src/Kokkos_DualView.hpp | 12 + .../containers/src/Kokkos_DynRankView.hpp | 289 +- .../containers/src/Kokkos_DynamicView.hpp | 10 +- .../containers/src/Kokkos_ErrorReporter.hpp | 11 +- .../containers/src/Kokkos_Functional.hpp | 9 +- .../containers/src/Kokkos_UnorderedMap.hpp | 11 +- lib/kokkos/containers/src/Kokkos_Vector.hpp | 9 +- .../src/impl/Kokkos_Bitset_impl.hpp | 2 +- .../src/impl/Kokkos_Functional_impl.hpp | 11 +- .../src/impl/Kokkos_UnorderedMap_impl.hpp | 11 +- lib/kokkos/containers/unit_tests/Makefile | 19 +- .../containers/unit_tests/TestComplex.hpp | 263 - lib/kokkos/containers/unit_tests/TestCuda.cpp | 16 +- .../containers/unit_tests/TestDualView.hpp | 9 +- .../containers/unit_tests/TestDynamicView.hpp | 9 +- .../unit_tests/TestErrorReporter.hpp | 9 +- .../containers/unit_tests/TestOpenMP.cpp | 23 +- .../containers/unit_tests/TestSerial.cpp | 24 +- .../unit_tests/TestStaticCrsGraph.hpp | 9 +- .../containers/unit_tests/TestThreads.cpp | 18 +- .../unit_tests/TestUnorderedMap.hpp | 9 +- .../containers/unit_tests/TestVector.hpp | 9 +- lib/kokkos/core/cmake/KokkosCore_config.h.in | 93 +- lib/kokkos/core/perf_test/CMakeLists.txt | 13 +- lib/kokkos/core/perf_test/Makefile | 53 +- lib/kokkos/core/perf_test/PerfTestCuda.cpp | 199 - lib/kokkos/core/perf_test/PerfTestDriver.hpp | 86 - ...ramSchmidt.hpp => PerfTestGramSchmidt.cpp} | 61 +- ...erfTestHexGrad.hpp => PerfTestHexGrad.cpp} | 57 + lib/kokkos/core/perf_test/PerfTestHost.cpp | 125 - lib/kokkos/core/perf_test/PerfTestMain.cpp | 31 +- .../PerfTest_Category.hpp} | 26 +- .../perf_test/PerfTest_CustomReduction.cpp | 115 + lib/kokkos/core/perf_test/run_mempool.sh | 25 + lib/kokkos/core/perf_test/run_mempool_fill.sh | 21 + lib/kokkos/core/perf_test/run_taskdag.sh | 21 + lib/kokkos/core/perf_test/test_mempool.cpp | 357 + lib/kokkos/core/perf_test/test_taskdag.cpp | 284 + .../src/Cuda/KokkosExp_Cuda_IterateTile.hpp | 11 +- lib/kokkos/core/src/Cuda/Kokkos_CudaExec.hpp | 16 +- lib/kokkos/core/src/Cuda/Kokkos_CudaSpace.cpp | 15 +- .../core/src/Cuda/Kokkos_Cuda_Alloc.hpp | 12 +- .../core/src/Cuda/Kokkos_Cuda_Error.hpp | 11 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_Impl.cpp | 41 +- .../core/src/Cuda/Kokkos_Cuda_Internal.hpp | 13 +- .../core/src/Cuda/Kokkos_Cuda_Parallel.hpp | 1012 +- .../core/src/Cuda/Kokkos_Cuda_ReduceScan.hpp | 282 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.cpp | 21 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_Task.hpp | 54 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp | 982 + .../src/Cuda/Kokkos_Cuda_Vectorization.hpp | 11 +- lib/kokkos/core/src/Cuda/Kokkos_Cuda_View.hpp | 10 +- .../core/src/Cuda/Kokkos_Cuda_abort.hpp | 12 +- .../core/src/KokkosExp_MDRangePolicy.hpp | 4 +- lib/kokkos/core/src/Kokkos_Complex.hpp | 124 +- lib/kokkos/core/src/Kokkos_Concepts.hpp | 9 +- lib/kokkos/core/src/Kokkos_Core.hpp | 10 +- lib/kokkos/core/src/Kokkos_Core_fwd.hpp | 33 +- lib/kokkos/core/src/Kokkos_Cuda.hpp | 12 +- lib/kokkos/core/src/Kokkos_CudaSpace.hpp | 15 +- lib/kokkos/core/src/Kokkos_ExecPolicy.hpp | 2 - lib/kokkos/core/src/Kokkos_HBWSpace.hpp | 11 +- lib/kokkos/core/src/Kokkos_HostSpace.hpp | 5 +- lib/kokkos/core/src/Kokkos_Layout.hpp | 18 +- lib/kokkos/core/src/Kokkos_Macros.hpp | 22 +- lib/kokkos/core/src/Kokkos_MemoryPool.hpp | 1997 +- lib/kokkos/core/src/Kokkos_NumericTraits.hpp | 217 + lib/kokkos/core/src/Kokkos_OpenMP.hpp | 34 +- lib/kokkos/core/src/Kokkos_OpenMPTarget.hpp | 186 + .../core/src/Kokkos_OpenMPTargetSpace.hpp | 265 + .../core/src/Kokkos_Parallel_Reduce.hpp | 1012 +- lib/kokkos/core/src/Kokkos_Qthreads.hpp | 9 +- lib/kokkos/core/src/Kokkos_ScratchSpace.hpp | 17 +- lib/kokkos/core/src/Kokkos_Serial.hpp | 11 +- lib/kokkos/core/src/Kokkos_TaskScheduler.hpp | 103 +- lib/kokkos/core/src/Kokkos_Threads.hpp | 10 +- lib/kokkos/core/src/Kokkos_Timer.hpp | 11 +- lib/kokkos/core/src/Kokkos_Vectorization.hpp | 9 +- lib/kokkos/core/src/Kokkos_View.hpp | 178 +- lib/kokkos/core/src/Makefile | 20 +- ..._OpenMPexec.cpp => Kokkos_OpenMP_Exec.cpp} | 67 +- ..._OpenMPexec.hpp => Kokkos_OpenMP_Exec.hpp} | 15 +- .../src/OpenMP/Kokkos_OpenMP_Parallel.hpp | 98 +- .../core/src/OpenMP/Kokkos_OpenMP_Task.cpp | 33 +- .../core/src/OpenMP/Kokkos_OpenMP_Task.hpp | 9 +- .../OpenMPTarget/Kokkos_OpenMPTargetSpace.cpp | 306 + .../OpenMPTarget/Kokkos_OpenMPTarget_Exec.cpp | 273 + .../OpenMPTarget/Kokkos_OpenMPTarget_Exec.hpp | 727 + .../Kokkos_OpenMPTarget_Parallel.hpp | 767 + .../OpenMPTarget/Kokkos_OpenMPTarget_Task.cpp | 329 + .../OpenMPTarget/Kokkos_OpenMPTarget_Task.hpp | 356 + .../core/src/Qthreads/Kokkos_QthreadsExec.cpp | 14 +- .../core/src/Qthreads/Kokkos_QthreadsExec.hpp | 5 + .../src/Qthreads/Kokkos_Qthreads_Parallel.hpp | 5 + .../src/Qthreads/Kokkos_Qthreads_Task.cpp | 8 +- .../src/Qthreads/Kokkos_Qthreads_Task.hpp | 3 +- .../Kokkos_Qthreads_TaskPolicy.cpp.old | 21 +- .../Kokkos_Qthreads_TaskPolicy.hpp.old | 16 +- .../Qthreads/Kokkos_Qthreads_TaskQueue.hpp | 10 +- .../Kokkos_Qthreads_TaskQueue_impl.hpp | 7 +- .../core/src/Threads/Kokkos_ThreadsExec.cpp | 18 +- .../core/src/Threads/Kokkos_ThreadsExec.hpp | 7 +- .../src/Threads/Kokkos_ThreadsExec_base.cpp | 22 +- .../core/src/Threads/Kokkos_ThreadsTeam.hpp | 95 +- .../src/Threads/Kokkos_Threads_Parallel.hpp | 32 +- .../src/impl/KokkosExp_Host_IterateTile.hpp | 138 +- .../core/src/impl/Kokkos_AnalyzePolicy.hpp | 1 + .../core/src/impl/Kokkos_Atomic_Assembly.hpp | 11 +- .../Kokkos_Atomic_Compare_Exchange_Strong.hpp | 1 + .../core/src/impl/Kokkos_Atomic_Decrement.hpp | 2 + .../core/src/impl/Kokkos_Atomic_Exchange.hpp | 3 +- .../core/src/impl/Kokkos_Atomic_Fetch_Add.hpp | 3 + .../core/src/impl/Kokkos_Atomic_Fetch_And.hpp | 10 +- .../core/src/impl/Kokkos_Atomic_Fetch_Or.hpp | 10 +- .../core/src/impl/Kokkos_Atomic_Fetch_Sub.hpp | 10 +- .../core/src/impl/Kokkos_Atomic_Generic.hpp | 14 +- .../core/src/impl/Kokkos_Atomic_Increment.hpp | 2 + .../core/src/impl/Kokkos_Atomic_View.hpp | 9 +- .../core/src/impl/Kokkos_Atomic_Windows.hpp | 9 +- lib/kokkos/core/src/impl/Kokkos_BitOps.hpp | 37 +- .../core/src/impl/Kokkos_CPUDiscovery.cpp | 1 + lib/kokkos/core/src/impl/Kokkos_ClockTic.hpp | 106 + .../core/src/impl/Kokkos_ConcurrentBitset.hpp | 357 + lib/kokkos/core/src/impl/Kokkos_Core.cpp | 177 +- lib/kokkos/core/src/impl/Kokkos_Error.cpp | 17 +- lib/kokkos/core/src/impl/Kokkos_Error.hpp | 4 +- .../core/src/impl/Kokkos_ExecPolicy.cpp | 44 + .../core/src/impl/Kokkos_FunctorAdapter.hpp | 55 + .../core/src/impl/Kokkos_FunctorAnalysis.hpp | 350 +- lib/kokkos/core/src/impl/Kokkos_HBWSpace.cpp | 10 +- lib/kokkos/core/src/impl/Kokkos_HostSpace.cpp | 47 +- .../core/src/impl/Kokkos_HostThreadTeam.hpp | 75 +- .../core/src/impl/Kokkos_Memory_Fence.hpp | 2 +- lib/kokkos/core/src/impl/Kokkos_OldMacros.hpp | 12 + .../core/src/impl/Kokkos_PhysicalLayout.hpp | 13 +- .../src/impl/Kokkos_Profiling_DeviceInfo.hpp | 8 +- .../src/impl/Kokkos_Profiling_Interface.cpp | 374 +- .../src/impl/Kokkos_Profiling_Interface.hpp | 138 +- lib/kokkos/core/src/impl/Kokkos_Reducer.hpp | 317 - lib/kokkos/core/src/impl/Kokkos_Serial.cpp | 11 +- .../core/src/impl/Kokkos_Serial_Task.cpp | 24 +- .../core/src/impl/Kokkos_Serial_Task.hpp | 1 + .../core/src/impl/Kokkos_SharedAlloc.cpp | 29 +- .../core/src/impl/Kokkos_SharedAlloc.hpp | 21 +- .../core/src/impl/Kokkos_StaticAssert.hpp | 9 +- lib/kokkos/core/src/impl/Kokkos_TaskQueue.hpp | 14 +- .../core/src/impl/Kokkos_TaskQueue_impl.hpp | 13 +- lib/kokkos/core/src/impl/Kokkos_Traits.hpp | 16 +- lib/kokkos/core/src/impl/Kokkos_Utilities.hpp | 3 +- .../core/src/impl/Kokkos_ViewMapping.hpp | 33 +- .../core/src/impl/Kokkos_Volatile_Load.hpp | 2 - lib/kokkos/core/src/impl/Kokkos_hwloc.cpp | 1 - lib/kokkos/core/src/impl/Kokkos_spinwait.cpp | 8 +- lib/kokkos/core/unit_test/CMakeLists.txt | 101 +- lib/kokkos/core/unit_test/Makefile | 182 +- lib/kokkos/core/unit_test/TestAggregate.hpp | 5 + lib/kokkos/core/unit_test/TestAtomic.hpp | 49 + .../core/unit_test/TestAtomicOperations.hpp | 83 +- lib/kokkos/core/unit_test/TestAtomicViews.hpp | 36 + lib/kokkos/core/unit_test/TestCXX11.hpp | 14 + .../core/unit_test/TestCXX11Deduction.hpp | 7 + .../core/unit_test/TestCompilerMacros.hpp | 7 + lib/kokkos/core/unit_test/TestComplex.hpp | 243 + .../core/unit_test/TestConcurrentBitset.hpp | 177 + .../unit_test/TestDefaultDeviceType_d.cpp | 237 - .../core/unit_test/TestFunctorAnalysis.hpp | 153 + lib/kokkos/core/unit_test/TestInit.hpp | 76 + lib/kokkos/core/unit_test/TestMDRange.hpp | 17 +- lib/kokkos/core/unit_test/TestMemoryPool.hpp | 975 +- .../core/unit_test/TestPolicyConstruction.hpp | 9 + lib/kokkos/core/unit_test/TestRange.hpp | 116 +- lib/kokkos/core/unit_test/TestReduce.hpp | 1002 +- .../unit_test/TestReduceCombinatorical.hpp | 597 + lib/kokkos/core/unit_test/TestScan.hpp | 28 +- .../core/unit_test/TestTaskScheduler.hpp | 146 +- lib/kokkos/core/unit_test/TestTeam.hpp | 12 +- lib/kokkos/core/unit_test/TestTeamVector.hpp | 187 +- .../unit_test/TestTemplateMetaFunctions.hpp | 8 + lib/kokkos/core/unit_test/TestTile.hpp | 27 + lib/kokkos/core/unit_test/TestViewAPI.hpp | 140 +- ...tViewMapping.hpp => TestViewMapping_a.hpp} | 380 +- .../core/unit_test/TestViewMapping_b.hpp | 186 + .../unit_test/TestViewMapping_subview.hpp | 211 + lib/kokkos/core/unit_test/TestViewOfClass.hpp | 5 + lib/kokkos/core/unit_test/TestViewSubview.hpp | 9 +- .../core/unit_test/UnitTestMainInit.cpp | 54 + ..._a.cpp => TestCudaHostPinned_Category.hpp} | 27 +- .../cuda/TestCudaHostPinned_SharedAlloc.cpp | 55 + .../cuda/TestCudaHostPinned_ViewAPI.cpp | 45 + .../cuda/TestCudaHostPinned_ViewMapping_a.cpp | 46 + .../cuda/TestCudaHostPinned_ViewMapping_b.cpp | 46 + ...TestCudaHostPinned_ViewMapping_subview.cpp | 46 + ...uctions_a.cpp => TestCudaUVM_Category.hpp} | 25 +- .../cuda/TestCudaUVM_SharedAlloc.cpp | 55 + .../unit_test/cuda/TestCudaUVM_ViewAPI.cpp | 45 + .../cuda/TestCudaUVM_ViewMapping_a.cpp | 46 + .../cuda/TestCudaUVM_ViewMapping_b.cpp | 46 + .../cuda/TestCudaUVM_ViewMapping_subview.cpp | 46 + .../cuda/TestCuda_AtomicOperations.cpp | 46 + .../unit_test/cuda/TestCuda_AtomicViews.cpp | 47 + .../core/unit_test/cuda/TestCuda_Atomics.cpp | 161 +- .../core/unit_test/cuda/TestCuda_Category.hpp | 65 + .../core/unit_test/cuda/TestCuda_Complex.cpp | 47 + ...stCuda_ViewAPI_g.cpp => TestCuda_Init.cpp} | 13 +- .../core/unit_test/cuda/TestCuda_MDRange.cpp | 47 + .../core/unit_test/cuda/TestCuda_Other.cpp | 158 +- .../unit_test/cuda/TestCuda_RangePolicy.cpp | 47 + .../unit_test/cuda/TestCuda_Reductions.cpp | 48 + .../unit_test/cuda/TestCuda_Reductions_b.cpp | 138 - .../core/unit_test/cuda/TestCuda_Scan.cpp | 47 + .../unit_test/cuda/TestCuda_SharedAlloc.cpp | 55 + .../core/unit_test/cuda/TestCuda_Spaces.cpp | 3 +- .../unit_test/cuda/TestCuda_SubView_a.cpp | 47 +- .../unit_test/cuda/TestCuda_SubView_b.cpp | 19 +- .../unit_test/cuda/TestCuda_SubView_c01.cpp | 7 +- .../unit_test/cuda/TestCuda_SubView_c02.cpp | 7 +- .../unit_test/cuda/TestCuda_SubView_c03.cpp | 7 +- .../unit_test/cuda/TestCuda_SubView_c04.cpp | 7 +- .../unit_test/cuda/TestCuda_SubView_c05.cpp | 7 +- .../unit_test/cuda/TestCuda_SubView_c06.cpp | 7 +- .../unit_test/cuda/TestCuda_SubView_c07.cpp | 7 +- .../unit_test/cuda/TestCuda_SubView_c08.cpp | 7 +- .../unit_test/cuda/TestCuda_SubView_c09.cpp | 7 +- .../unit_test/cuda/TestCuda_SubView_c10.cpp | 7 +- .../unit_test/cuda/TestCuda_SubView_c11.cpp | 7 +- .../unit_test/cuda/TestCuda_SubView_c12.cpp | 7 +- .../core/unit_test/cuda/TestCuda_Task.cpp | 47 + .../core/unit_test/cuda/TestCuda_Team.cpp | 89 +- .../cuda/TestCuda_TeamReductionScan.cpp | 82 + .../TestCuda_TeamScratch.cpp} | 80 +- .../unit_test/cuda/TestCuda_ViewAPI_b.cpp | 13 +- .../unit_test/cuda/TestCuda_ViewMapping_a.cpp | 46 + .../unit_test/cuda/TestCuda_ViewMapping_b.cpp | 46 + .../cuda/TestCuda_ViewMapping_subview.cpp | 46 + .../unit_test/cuda/TestCuda_ViewOfClass.cpp | 46 + .../{ => default}/TestDefaultDeviceType.cpp | 31 +- .../TestDefaultDeviceTypeInit_1.cpp | 0 .../TestDefaultDeviceTypeInit_10.cpp | 0 .../TestDefaultDeviceTypeInit_11.cpp | 0 .../TestDefaultDeviceTypeInit_12.cpp | 0 .../TestDefaultDeviceTypeInit_13.cpp | 0 .../TestDefaultDeviceTypeInit_14.cpp | 0 .../TestDefaultDeviceTypeInit_15.cpp | 0 .../TestDefaultDeviceTypeInit_16.cpp | 0 .../TestDefaultDeviceTypeInit_2.cpp | 0 .../TestDefaultDeviceTypeInit_3.cpp | 0 .../TestDefaultDeviceTypeInit_4.cpp | 0 .../TestDefaultDeviceTypeInit_5.cpp | 0 .../TestDefaultDeviceTypeInit_6.cpp | 0 .../TestDefaultDeviceTypeInit_7.cpp | 0 .../TestDefaultDeviceTypeInit_8.cpp | 0 .../TestDefaultDeviceTypeInit_9.cpp | 0 .../TestDefaultDeviceType_Category.hpp | 67 + .../{ => default}/TestDefaultDeviceType_a.cpp | 15 +- .../{ => default}/TestDefaultDeviceType_b.cpp | 16 +- .../{ => default}/TestDefaultDeviceType_c.cpp | 16 +- .../default/TestDefaultDeviceType_d.cpp | 73 + .../core/unit_test/openmp/TestOpenMP.hpp | 1 + .../openmp/TestOpenMP_AtomicOperations.cpp | 46 + .../openmp/TestOpenMP_AtomicViews.cpp | 47 + .../unit_test/openmp/TestOpenMP_Atomics.cpp | 159 +- .../unit_test/openmp/TestOpenMP_Category.hpp | 65 + .../unit_test/openmp/TestOpenMP_Complex.cpp | 47 + .../TestOpenMP_Init.cpp} | 13 +- .../unit_test/openmp/TestOpenMP_MDRange.cpp | 47 + .../unit_test/openmp/TestOpenMP_Other.cpp | 176 +- .../openmp/TestOpenMP_RangePolicy.cpp | 47 + .../openmp/TestOpenMP_Reductions.cpp | 105 +- .../core/unit_test/openmp/TestOpenMP_Scan.cpp | 47 + .../TestOpenMP_SharedAlloc.cpp} | 9 +- .../unit_test/openmp/TestOpenMP_SubView_a.cpp | 47 +- .../unit_test/openmp/TestOpenMP_SubView_b.cpp | 19 +- .../openmp/TestOpenMP_SubView_c01.cpp | 7 +- .../openmp/TestOpenMP_SubView_c02.cpp | 7 +- .../openmp/TestOpenMP_SubView_c03.cpp | 7 +- .../openmp/TestOpenMP_SubView_c04.cpp | 7 +- .../openmp/TestOpenMP_SubView_c05.cpp | 5 +- .../openmp/TestOpenMP_SubView_c06.cpp | 7 +- .../openmp/TestOpenMP_SubView_c07.cpp | 7 +- .../openmp/TestOpenMP_SubView_c08.cpp | 7 +- .../openmp/TestOpenMP_SubView_c09.cpp | 7 +- .../openmp/TestOpenMP_SubView_c10.cpp | 7 +- .../openmp/TestOpenMP_SubView_c11.cpp | 7 +- .../openmp/TestOpenMP_SubView_c12.cpp | 7 +- .../core/unit_test/openmp/TestOpenMP_Task.cpp | 47 + .../core/unit_test/openmp/TestOpenMP_Team.cpp | 90 +- .../TestOpenMP_TeamReductionScan.cpp} | 85 +- .../openmp/TestOpenMP_TeamScratch.cpp | 83 + .../unit_test/openmp/TestOpenMP_ViewAPI_b.cpp | 83 +- .../openmp/TestOpenMP_ViewMapping_a.cpp | 46 + .../openmp/TestOpenMP_ViewMapping_b.cpp | 46 + .../openmp/TestOpenMP_ViewMapping_subview.cpp | 46 + .../openmp/TestOpenMP_ViewOfClass.cpp | 46 + .../TestOpenMPTarget.hpp} | 90 +- .../TestOpenMPTarget_AtomicOperations.cpp | 46 + .../TestOpenMPTarget_AtomicViews.cpp | 47 + .../openmptarget/TestOpenMPTarget_Atomics.cpp | 46 + .../TestOpenMPTarget_Category.hpp | 65 + .../openmptarget/TestOpenMPTarget_Complex.cpp | 47 + .../TestOpenMPTarget_Init.cpp} | 14 +- .../openmptarget/TestOpenMPTarget_MDRange.cpp | 47 + .../openmptarget/TestOpenMPTarget_Other.cpp | 50 + .../TestOpenMPTarget_RangePolicy.cpp | 47 + .../TestOpenMPTarget_Reductions.cpp | 46 + .../openmptarget/TestOpenMPTarget_Scan.cpp | 47 + .../TestOpenMPTarget_SharedAlloc.cpp | 55 + .../TestOpenMPTarget_SubView_a.cpp | 104 + .../TestOpenMPTarget_SubView_b.cpp} | 22 +- .../TestOpenMPTarget_SubView_c01.cpp | 54 + .../TestOpenMPTarget_SubView_c02.cpp | 54 + .../TestOpenMPTarget_SubView_c03.cpp | 54 + .../TestOpenMPTarget_SubView_c04.cpp | 54 + .../TestOpenMPTarget_SubView_c05.cpp | 54 + .../TestOpenMPTarget_SubView_c06.cpp | 54 + .../TestOpenMPTarget_SubView_c07.cpp} | 8 +- .../TestOpenMPTarget_SubView_c08.cpp | 54 + .../TestOpenMPTarget_SubView_c09.cpp | 54 + .../TestOpenMPTarget_SubView_c10.cpp | 54 + .../TestOpenMPTarget_SubView_c11.cpp | 54 + .../TestOpenMPTarget_SubView_c12.cpp | 54 + .../openmptarget/TestOpenMPTarget_Team.cpp | 75 + .../TestOpenMPTarget_TeamReductionScan.cpp | 81 + .../TestOpenMPTarget_TeamScratch.cpp | 83 + .../TestOpenMPTarget_ViewAPI_b.cpp | 45 + .../TestOpenMPTarget_ViewMapping_a.cpp | 46 + .../TestOpenMPTarget_ViewMapping_b.cpp | 46 + .../TestOpenMPTarget_ViewMapping_subview.cpp | 46 + .../TestOpenMPTarget_ViewOfClass.cpp | 46 + .../qthreads/TestQthreads_Category.hpp | 65 + .../qthreads/TestQthreads_Complex.cpp | 3 + .../unit_test/qthreads/TestQthreads_Other.cpp | 8 +- .../serial/TestSerial_AtomicOperations.cpp | 46 + .../serial/TestSerial_AtomicViews.cpp | 47 + .../unit_test/serial/TestSerial_Atomics.cpp | 162 +- .../unit_test/serial/TestSerial_Category.hpp | 65 + .../unit_test/serial/TestSerial_Complex.cpp | 47 + .../core/unit_test/serial/TestSerial_Init.cpp | 50 + .../unit_test/serial/TestSerial_MDRange.cpp | 47 + .../unit_test/serial/TestSerial_Other.cpp | 136 +- .../serial/TestSerial_RangePolicy.cpp | 47 + .../serial/TestSerial_Reductions.cpp | 88 +- .../core/unit_test/serial/TestSerial_Scan.cpp | 47 + .../TestSerial_SharedAlloc.cpp} | 9 +- .../unit_test/serial/TestSerial_SubView_a.cpp | 47 +- .../unit_test/serial/TestSerial_SubView_b.cpp | 19 +- .../serial/TestSerial_SubView_c01.cpp | 7 +- .../serial/TestSerial_SubView_c02.cpp | 7 +- .../serial/TestSerial_SubView_c03.cpp | 7 +- .../serial/TestSerial_SubView_c04.cpp | 7 +- .../serial/TestSerial_SubView_c05.cpp | 5 +- .../serial/TestSerial_SubView_c06.cpp | 7 +- .../serial/TestSerial_SubView_c07.cpp | 7 +- .../serial/TestSerial_SubView_c08.cpp | 7 +- .../serial/TestSerial_SubView_c09.cpp | 7 +- .../serial/TestSerial_SubView_c10.cpp | 7 +- .../serial/TestSerial_SubView_c11.cpp | 7 +- .../serial/TestSerial_SubView_c12.cpp | 7 +- .../core/unit_test/serial/TestSerial_Task.cpp | 47 + .../core/unit_test/serial/TestSerial_Team.cpp | 87 +- .../serial/TestSerial_TeamReductionScan.cpp | 81 + .../serial/TestSerial_TeamScratch.cpp | 83 + .../unit_test/serial/TestSerial_ViewAPI_b.cpp | 83 +- .../serial/TestSerial_ViewMapping_a.cpp | 46 + .../serial/TestSerial_ViewMapping_b.cpp | 46 + .../serial/TestSerial_ViewMapping_subview.cpp | 46 + .../serial/TestSerial_ViewOfClass.cpp | 46 + .../core/unit_test/threads/TestThreads.hpp | 40 +- .../threads/TestThreads_AtomicOperations.cpp | 46 + .../threads/TestThreads_AtomicViews.cpp | 47 + .../unit_test/threads/TestThreads_Atomics.cpp | 158 +- .../threads/TestThreads_Category.hpp | 65 + .../unit_test/threads/TestThreads_Complex.cpp | 47 + .../unit_test/threads/TestThreads_Init.cpp | 50 + .../unit_test/threads/TestThreads_MDRange.cpp | 47 + .../unit_test/threads/TestThreads_Other.cpp | 160 +- .../threads/TestThreads_RangePolicy.cpp | 47 + .../threads/TestThreads_Reductions.cpp | 106 +- .../unit_test/threads/TestThreads_Scan.cpp | 47 + .../threads/TestThreads_SharedAlloc.cpp | 55 + .../threads/TestThreads_SubView_a.cpp | 47 +- .../threads/TestThreads_SubView_b.cpp | 19 +- .../threads/TestThreads_SubView_c01.cpp | 7 +- .../threads/TestThreads_SubView_c02.cpp | 7 +- .../threads/TestThreads_SubView_c03.cpp | 7 +- .../threads/TestThreads_SubView_c04.cpp | 7 +- .../threads/TestThreads_SubView_c05.cpp | 5 +- .../threads/TestThreads_SubView_c06.cpp | 7 +- .../threads/TestThreads_SubView_c07.cpp | 7 +- .../threads/TestThreads_SubView_c08.cpp | 7 +- .../threads/TestThreads_SubView_c09.cpp | 7 +- .../threads/TestThreads_SubView_c10.cpp | 7 +- .../threads/TestThreads_SubView_c11.cpp | 7 +- .../threads/TestThreads_SubView_c12.cpp | 7 +- .../unit_test/threads/TestThreads_Team.cpp | 90 +- .../threads/TestThreads_TeamReductionScan.cpp | 81 + .../threads/TestThreads_TeamScratch.cpp | 83 + .../threads/TestThreads_ViewAPI_a.cpp | 54 - .../threads/TestThreads_ViewAPI_b.cpp | 83 +- .../threads/TestThreads_ViewMapping_a.cpp | 46 + .../threads/TestThreads_ViewMapping_b.cpp | 46 + .../TestThreads_ViewMapping_subview.cpp | 46 + .../threads/TestThreads_ViewOfClass.cpp | 46 + lib/kokkos/example/cmake_build/CMakeLists.txt | 44 + .../example/cmake_build/cmake_example.cpp | 87 + lib/kokkos/example/feint/ElemFunctor.hpp | 10 +- lib/kokkos/example/feint/feint_threads.cpp | 13 +- lib/kokkos/example/feint/main.cpp | 10 +- lib/kokkos/example/fenl/CGSolve.hpp | 4 +- lib/kokkos/example/fenl/fenl.cpp | 2 +- lib/kokkos/example/fenl/fenl.hpp | 10 +- lib/kokkos/example/fenl/fenl_functors.hpp | 14 +- lib/kokkos/example/fenl/fenl_impl.hpp | 16 +- lib/kokkos/example/fenl/main.cpp | 19 +- lib/kokkos/example/fixture/BoxElemFixture.hpp | 16 +- .../example/global_2_local_ids/G2L_Main.cpp | 12 +- lib/kokkos/example/grow_array/grow_array.hpp | 10 +- lib/kokkos/example/grow_array/main.cpp | 10 +- lib/kokkos/example/md_skeleton/main.cpp | 10 +- .../example/multi_fem/ExplicitFunctors.hpp | 18 +- .../multi_fem/HexExplicitFunctions.hpp | 10 +- lib/kokkos/example/multi_fem/Nonlinear.hpp | 4 +- .../multi_fem/NonlinearElement_Cuda.hpp | 22 +- .../example/multi_fem/ParallelMachine.cpp | 14 +- .../example/multi_fem/SparseLinearSystem.hpp | 4 +- .../example/multi_fem/TestBoxMeshFixture.hpp | 10 +- lib/kokkos/example/sort_array/main.cpp | 16 +- lib/kokkos/example/sort_array/sort_array.hpp | 10 +- .../05_simple_atomics/simple_atomics.cpp | 2 +- lib/kokkos/generate_makefile.bash | 19 +- lib/kokkos/tpls/gtest/gtest/LICENSE | 28 + lib/kokkos/tpls/gtest/gtest/README | 13 + lib/kokkos/tpls/gtest/gtest/gtest-all.cc | 9594 ++++++++ lib/kokkos/tpls/gtest/gtest/gtest-test-part.h | 1 + lib/kokkos/tpls/gtest/gtest/gtest.h | 20065 ++++++++++++++++ 474 files changed, 50972 insertions(+), 10897 deletions(-) create mode 100644 lib/kokkos/cmake/KokkosConfig.cmake.in create mode 100644 lib/kokkos/cmake/Modules/FindHWLOC.cmake create mode 100644 lib/kokkos/cmake/Modules/FindMemkind.cmake create mode 100644 lib/kokkos/cmake/Modules/FindQthreads.cmake create mode 100644 lib/kokkos/cmake/kokkos.cmake create mode 100644 lib/kokkos/config/trilinos-integration/checkin-test create mode 100755 lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_pthread_intel create mode 100755 lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_serial_intel create mode 100755 lib/kokkos/config/trilinos-integration/white_run_jenkins_script_cuda create mode 100755 lib/kokkos/config/trilinos-integration/white_run_jenkins_script_omp delete mode 100644 lib/kokkos/containers/unit_tests/TestComplex.hpp delete mode 100644 lib/kokkos/core/perf_test/PerfTestCuda.cpp rename lib/kokkos/core/perf_test/{PerfTestGramSchmidt.hpp => PerfTestGramSchmidt.cpp} (78%) rename lib/kokkos/core/perf_test/{PerfTestHexGrad.hpp => PerfTestHexGrad.cpp} (83%) delete mode 100644 lib/kokkos/core/perf_test/PerfTestHost.cpp rename lib/kokkos/core/{unit_test/cuda/TestCuda_ViewAPI_f.cpp => perf_test/PerfTest_Category.hpp} (82%) create mode 100644 lib/kokkos/core/perf_test/PerfTest_CustomReduction.cpp create mode 100755 lib/kokkos/core/perf_test/run_mempool.sh create mode 100755 lib/kokkos/core/perf_test/run_mempool_fill.sh create mode 100755 lib/kokkos/core/perf_test/run_taskdag.sh create mode 100644 lib/kokkos/core/perf_test/test_mempool.cpp create mode 100644 lib/kokkos/core/perf_test/test_taskdag.cpp create mode 100644 lib/kokkos/core/src/Cuda/Kokkos_Cuda_Team.hpp create mode 100644 lib/kokkos/core/src/Kokkos_NumericTraits.hpp create mode 100644 lib/kokkos/core/src/Kokkos_OpenMPTarget.hpp create mode 100644 lib/kokkos/core/src/Kokkos_OpenMPTargetSpace.hpp rename lib/kokkos/core/src/OpenMP/{Kokkos_OpenMPexec.cpp => Kokkos_OpenMP_Exec.cpp} (87%) rename lib/kokkos/core/src/OpenMP/{Kokkos_OpenMPexec.hpp => Kokkos_OpenMP_Exec.hpp} (97%) create mode 100644 lib/kokkos/core/src/OpenMPTarget/Kokkos_OpenMPTargetSpace.cpp create mode 100644 lib/kokkos/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Exec.cpp create mode 100644 lib/kokkos/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Exec.hpp create mode 100644 lib/kokkos/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Parallel.hpp create mode 100644 lib/kokkos/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Task.cpp create mode 100644 lib/kokkos/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Task.hpp create mode 100644 lib/kokkos/core/src/impl/Kokkos_ClockTic.hpp create mode 100644 lib/kokkos/core/src/impl/Kokkos_ConcurrentBitset.hpp delete mode 100644 lib/kokkos/core/src/impl/Kokkos_Reducer.hpp create mode 100644 lib/kokkos/core/unit_test/TestComplex.hpp create mode 100644 lib/kokkos/core/unit_test/TestConcurrentBitset.hpp delete mode 100644 lib/kokkos/core/unit_test/TestDefaultDeviceType_d.cpp create mode 100644 lib/kokkos/core/unit_test/TestFunctorAnalysis.hpp create mode 100644 lib/kokkos/core/unit_test/TestInit.hpp create mode 100644 lib/kokkos/core/unit_test/TestReduceCombinatorical.hpp rename lib/kokkos/core/unit_test/{TestViewMapping.hpp => TestViewMapping_a.hpp} (77%) create mode 100644 lib/kokkos/core/unit_test/TestViewMapping_b.hpp create mode 100644 lib/kokkos/core/unit_test/TestViewMapping_subview.hpp create mode 100644 lib/kokkos/core/unit_test/UnitTestMainInit.cpp rename lib/kokkos/core/unit_test/cuda/{TestCuda_ViewAPI_a.cpp => TestCudaHostPinned_Category.hpp} (86%) create mode 100644 lib/kokkos/core/unit_test/cuda/TestCudaHostPinned_SharedAlloc.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCudaHostPinned_ViewAPI.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCudaHostPinned_ViewMapping_a.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCudaHostPinned_ViewMapping_b.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCudaHostPinned_ViewMapping_subview.cpp rename lib/kokkos/core/unit_test/cuda/{TestCuda_Reductions_a.cpp => TestCudaUVM_Category.hpp} (86%) create mode 100644 lib/kokkos/core/unit_test/cuda/TestCudaUVM_SharedAlloc.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCudaUVM_ViewAPI.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCudaUVM_ViewMapping_a.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCudaUVM_ViewMapping_b.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCudaUVM_ViewMapping_subview.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_AtomicOperations.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_AtomicViews.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_Category.hpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_Complex.cpp rename lib/kokkos/core/unit_test/cuda/{TestCuda_ViewAPI_g.cpp => TestCuda_Init.cpp} (93%) create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_MDRange.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_RangePolicy.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_Reductions.cpp delete mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_Reductions_b.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_Scan.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_SharedAlloc.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_Task.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_TeamReductionScan.cpp rename lib/kokkos/core/unit_test/{serial/TestSerial.hpp => cuda/TestCuda_TeamScratch.cpp} (64%) create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_ViewMapping_a.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_ViewMapping_b.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_ViewMapping_subview.cpp create mode 100644 lib/kokkos/core/unit_test/cuda/TestCuda_ViewOfClass.cpp rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceType.cpp (81%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_1.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_10.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_11.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_12.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_13.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_14.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_15.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_16.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_2.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_3.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_4.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_5.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_6.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_7.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_8.cpp (100%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceTypeInit_9.cpp (100%) create mode 100644 lib/kokkos/core/unit_test/default/TestDefaultDeviceType_Category.hpp rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceType_a.cpp (91%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceType_b.cpp (90%) rename lib/kokkos/core/unit_test/{ => default}/TestDefaultDeviceType_c.cpp (90%) create mode 100644 lib/kokkos/core/unit_test/default/TestDefaultDeviceType_d.cpp create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_AtomicOperations.cpp create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_AtomicViews.cpp create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_Category.hpp create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_Complex.cpp rename lib/kokkos/core/unit_test/{cuda/TestCuda_ViewAPI_h.cpp => openmp/TestOpenMP_Init.cpp} (92%) create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_MDRange.cpp create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_RangePolicy.cpp create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_Scan.cpp rename lib/kokkos/core/unit_test/{cuda/TestCuda_ViewAPI_c.cpp => openmp/TestOpenMP_SharedAlloc.cpp} (91%) create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_Task.cpp rename lib/kokkos/core/unit_test/{cuda/TestCuda_ViewAPI_d.cpp => openmp/TestOpenMP_TeamReductionScan.cpp} (55%) create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_TeamScratch.cpp create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_ViewMapping_a.cpp create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_ViewMapping_b.cpp create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_ViewMapping_subview.cpp create mode 100644 lib/kokkos/core/unit_test/openmp/TestOpenMP_ViewOfClass.cpp rename lib/kokkos/core/unit_test/{cuda/TestCuda.hpp => openmptarget/TestOpenMPTarget.hpp} (60%) create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_AtomicOperations.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_AtomicViews.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_Atomics.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_Category.hpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_Complex.cpp rename lib/kokkos/core/unit_test/{serial/TestSerial_ViewAPI_a.cpp => openmptarget/TestOpenMPTarget_Init.cpp} (90%) create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_MDRange.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_Other.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_RangePolicy.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_Reductions.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_Scan.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SharedAlloc.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SubView_a.cpp rename lib/kokkos/core/unit_test/{cuda/TestCuda_ViewAPI_e.cpp => openmptarget/TestOpenMPTarget_SubView_b.cpp} (71%) create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SubView_c01.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SubView_c02.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SubView_c03.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SubView_c04.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SubView_c05.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SubView_c06.cpp rename lib/kokkos/core/unit_test/{cuda/TestCuda_ViewAPI_s.cpp => openmptarget/TestOpenMPTarget_SubView_c07.cpp} (90%) create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SubView_c08.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SubView_c09.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SubView_c10.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SubView_c11.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_SubView_c12.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_Team.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_TeamReductionScan.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_TeamScratch.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_ViewAPI_b.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_ViewMapping_a.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_ViewMapping_b.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_ViewMapping_subview.cpp create mode 100644 lib/kokkos/core/unit_test/openmptarget/TestOpenMPTarget_ViewOfClass.cpp create mode 100644 lib/kokkos/core/unit_test/qthreads/TestQthreads_Category.hpp create mode 100644 lib/kokkos/core/unit_test/qthreads/TestQthreads_Complex.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_AtomicOperations.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_AtomicViews.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_Category.hpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_Complex.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_Init.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_MDRange.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_RangePolicy.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_Scan.cpp rename lib/kokkos/core/unit_test/{openmp/TestOpenMP_ViewAPI_a.cpp => serial/TestSerial_SharedAlloc.cpp} (91%) create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_Task.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_TeamReductionScan.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_TeamScratch.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_ViewMapping_a.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_ViewMapping_b.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_ViewMapping_subview.cpp create mode 100644 lib/kokkos/core/unit_test/serial/TestSerial_ViewOfClass.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_AtomicOperations.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_AtomicViews.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_Category.hpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_Complex.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_Init.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_MDRange.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_RangePolicy.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_Scan.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_SharedAlloc.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_TeamReductionScan.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_TeamScratch.cpp delete mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_ViewAPI_a.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_ViewMapping_a.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_ViewMapping_b.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_ViewMapping_subview.cpp create mode 100644 lib/kokkos/core/unit_test/threads/TestThreads_ViewOfClass.cpp create mode 100644 lib/kokkos/example/cmake_build/CMakeLists.txt create mode 100644 lib/kokkos/example/cmake_build/cmake_example.cpp create mode 100644 lib/kokkos/tpls/gtest/gtest/LICENSE create mode 100644 lib/kokkos/tpls/gtest/gtest/README create mode 100644 lib/kokkos/tpls/gtest/gtest/gtest-all.cc create mode 120000 lib/kokkos/tpls/gtest/gtest/gtest-test-part.h create mode 100644 lib/kokkos/tpls/gtest/gtest/gtest.h diff --git a/lib/kokkos/CHANGELOG.md b/lib/kokkos/CHANGELOG.md index c6fe991b97..acb54ff22f 100644 --- a/lib/kokkos/CHANGELOG.md +++ b/lib/kokkos/CHANGELOG.md @@ -1,5 +1,53 @@ # Change Log + +## [2.03.05](https://github.com/kokkos/kokkos/tree/2.03.05) (2017-05-27) +[Full Changelog](https://github.com/kokkos/kokkos/compare/2.03.00...2.03.05) + +**Implemented enhancements:** + +- Harmonize Custom Reductions over nesting levels [\#802](https://github.com/kokkos/kokkos/issues/802) +- Prevent users directly including KokkosCore\_config.h [\#815](https://github.com/kokkos/kokkos/issues/815) +- DualView aborts on concurrent host/device modify \(in debug mode\) [\#814](https://github.com/kokkos/kokkos/issues/814) +- Abort when running on a NVIDIA CC5.0 or higher architecture with code compiled for CC \< 5.0 [\#813](https://github.com/kokkos/kokkos/issues/813) +- Add "name" function to ExecSpaces [\#806](https://github.com/kokkos/kokkos/issues/806) +- Allow null Future in task spawn dependences [\#795](https://github.com/kokkos/kokkos/issues/795) +- Add Unit Tests for Kokkos::complex [\#785](https://github.com/kokkos/kokkos/issues/785) +- Add pow function for Kokkos::complex [\#784](https://github.com/kokkos/kokkos/issues/784) +- Square root of a complex [\#729](https://github.com/kokkos/kokkos/issues/729) +- Command line processing of --threads argument prevents users from having any commandline arguments starting with --threads [\#760](https://github.com/kokkos/kokkos/issues/760) +- Protected deprecated API with appropriate macro [\#756](https://github.com/kokkos/kokkos/issues/756) +- Allow task scheduler memory pool to be used by tasks [\#747](https://github.com/kokkos/kokkos/issues/747) +- View bounds checking on host-side performance: constructing a std::string [\#723](https://github.com/kokkos/kokkos/issues/723) +- Add check for AppleClang as compiler distinct from check for Clang. [\#705](https://github.com/kokkos/kokkos/issues/705) +- Uninclude source files for specific configurations to prevent link warning. [\#701](https://github.com/kokkos/kokkos/issues/701) +- Add --small option to snapshot script [\#697](https://github.com/kokkos/kokkos/issues/697) +- CMake Standalone Support [\#674](https://github.com/kokkos/kokkos/issues/674) +- CMake build unit test and install [\#808](https://github.com/kokkos/kokkos/issues/808) +- CMake: Fix having kokkos as a subdirectory in a pure cmake project [\#629](https://github.com/kokkos/kokkos/issues/629) +- Tribits macro assumes build directory is in top level source directory [\#654](https://github.com/kokkos/kokkos/issues/654) +- Use bin/nvcc\_wrapper, not config/nvcc\_wrapper [\#562](https://github.com/kokkos/kokkos/issues/562) +- Allow MemoryPool::allocate\(\) to be called from multiple threads per warp. [\#487](https://github.com/kokkos/kokkos/issues/487) +- Allow MemoryPool::allocate\\(\\) to be called from multiple threads per warp. [\#487](https://github.com/kokkos/kokkos/issues/487) +- Move OpenMP 4.5 OpenMPTarget backend into Develop [\#456](https://github.com/kokkos/kokkos/issues/456) +- Testing on ARM testbed [\#288](https://github.com/kokkos/kokkos/issues/288) + +**Fixed bugs:** + +- Fix label in OpenMP parallel\_reduce verify\_initialized [\#834](https://github.com/kokkos/kokkos/issues/834) +- TeamScratch Level 1 on Cuda hangs [\#820](https://github.com/kokkos/kokkos/issues/820) +- \[bug\] memory pool. [\#786](https://github.com/kokkos/kokkos/issues/786) +- Some Reduction Tests fail on Intel 18 with aggressive vectorization on [\#774](https://github.com/kokkos/kokkos/issues/774) +- Error copying dynamic view on copy of memory pool [\#773](https://github.com/kokkos/kokkos/issues/773) +- CUDA stack overflow with TaskDAG test [\#758](https://github.com/kokkos/kokkos/issues/758) +- ThreadVectorRange Customized Reduction Bug [\#739](https://github.com/kokkos/kokkos/issues/739) +- set\_scratch\_size overflows [\#726](https://github.com/kokkos/kokkos/issues/726) +- Get wrong results for compiler checks in Makefile on OS X. [\#706](https://github.com/kokkos/kokkos/issues/706) +- Fix check if multiple host architectures enabled. [\#702](https://github.com/kokkos/kokkos/issues/702) +- Threads Backend Does not Pass on Cray Compilers [\#609](https://github.com/kokkos/kokkos/issues/609) +- Rare bug in memory pool where allocation can finish on superblock in empty state [\#452](https://github.com/kokkos/kokkos/issues/452) +- LDFLAGS in core/unit\_test/Makefile: potential "undefined reference" to pthread lib [\#148](https://github.com/kokkos/kokkos/issues/148) + ## [2.03.00](https://github.com/kokkos/kokkos/tree/2.03.00) (2017-04-25) [Full Changelog](https://github.com/kokkos/kokkos/compare/2.02.15...2.03.00) diff --git a/lib/kokkos/CMakeLists.txt b/lib/kokkos/CMakeLists.txt index 1c820660ae..b2771ed527 100644 --- a/lib/kokkos/CMakeLists.txt +++ b/lib/kokkos/CMakeLists.txt @@ -5,11 +5,12 @@ ELSE() ENDIF() IF(NOT KOKKOS_HAS_TRILINOS) - CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11 FATAL_ERROR) - INCLUDE(cmake/tribits.cmake) - SET(CMAKE_CXX_STANDARD 11) -ENDIF() + cmake_minimum_required(VERSION 3.1 FATAL_ERROR) + project(Kokkos CXX) + INCLUDE(cmake/kokkos.cmake) +ELSE() +#------------------------------------------------------------------------------ # # A) Forward delcare the package so that certain options are also defined for # subpackages @@ -17,14 +18,13 @@ ENDIF() TRIBITS_PACKAGE_DECL(Kokkos) # ENABLE_SHADOWING_WARNINGS) + #------------------------------------------------------------------------------ # # B) Define the common options for Kokkos first so they can be used by # subpackages as well. # - - # mfh 01 Aug 2016: See Issue #61: # # https://github.com/kokkos/kokkos/issues/61 @@ -83,10 +83,10 @@ TRIBITS_ADD_OPTION_AND_DEFINE( ) ASSERT_DEFINED(TPL_ENABLE_Pthread) -IF (Kokkos_ENABLE_Pthread AND NOT TPL_ENABLE_Pthread) +IF(Kokkos_ENABLE_Pthread AND NOT TPL_ENABLE_Pthread) MESSAGE(FATAL_ERROR "You set Kokkos_ENABLE_Pthread=ON, but Trilinos' support for Pthread(s) is not enabled (TPL_ENABLE_Pthread=OFF). This is not allowed. Please enable Pthreads in Trilinos before attempting to enable Kokkos' support for Pthreads.") -ENDIF () -IF (NOT TPL_ENABLE_Pthread) +ENDIF() +IF(NOT TPL_ENABLE_Pthread) ADD_DEFINITIONS(-DGTEST_HAS_PTHREAD=0) ENDIF() @@ -98,12 +98,13 @@ TRIBITS_ADD_OPTION_AND_DEFINE( ) TRIBITS_ADD_OPTION_AND_DEFINE( - Kokkos_ENABLE_Qthreads + Kokkos_ENABLE_QTHREAD KOKKOS_HAVE_QTHREADS "Enable Qthreads support in Kokkos." - "${TPL_ENABLE_QTHREADS}" + "${TPL_ENABLE_QTHREAD}" ) +# TODO: No longer an option in Kokkos. Needs to be removed. TRIBITS_ADD_OPTION_AND_DEFINE( Kokkos_ENABLE_CXX11 KOKKOS_HAVE_CXX11 @@ -118,6 +119,7 @@ TRIBITS_ADD_OPTION_AND_DEFINE( "${TPL_ENABLE_HWLOC}" ) +# TODO: This is currently not used in Kokkos. Should it be removed? TRIBITS_ADD_OPTION_AND_DEFINE( Kokkos_ENABLE_MPI KOKKOS_HAVE_MPI @@ -154,13 +156,27 @@ TRIBITS_ADD_OPTION_AND_DEFINE( "${Kokkos_ENABLE_Debug_Bounds_Check_DEFAULT}" ) +TRIBITS_ADD_OPTION_AND_DEFINE( + Kokkos_ENABLE_Debug_DualView_Modify_Check + KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK + "Enable abort when Kokkos::DualView modified on host and device without sync." + "${Kokkos_ENABLE_DEBUG}" + ) + TRIBITS_ADD_OPTION_AND_DEFINE( Kokkos_ENABLE_Profiling - KOKKOS_ENABLE_PROFILING_INTERNAL + KOKKOS_ENABLE_PROFILING "Enable KokkosP profiling support for kernel data collections." "${TPL_ENABLE_DLlib}" ) +TRIBITS_ADD_OPTION_AND_DEFINE( + Kokkos_ENABLE_Profiling_Load_Print + KOKKOS_ENABLE_PROFILING_LOAD_PRINT + "Print to standard output which profiling library was loaded." + OFF + ) + # placeholder for future device... TRIBITS_ADD_OPTION_AND_DEFINE( Kokkos_ENABLE_Winthread @@ -169,6 +185,7 @@ TRIBITS_ADD_OPTION_AND_DEFINE( "${TPL_ENABLE_Winthread}" ) +# TODO: No longer an option in Kokkos. Needs to be removed. # use new/old View TRIBITS_ADD_OPTION_AND_DEFINE( Kokkos_USING_DEPRECATED_VIEW @@ -177,12 +194,12 @@ TRIBITS_ADD_OPTION_AND_DEFINE( OFF ) + #------------------------------------------------------------------------------ # # C) Install Kokkos' executable scripts # - # nvcc_wrapper is Kokkos' wrapper for NVIDIA's NVCC CUDA compiler. # Kokkos needs nvcc_wrapper in order to build. Other libraries and # executables also need nvcc_wrapper. Thus, we need to install it. @@ -199,6 +216,8 @@ INSTALL(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/bin/nvcc_wrapper DESTINATION bin) TRIBITS_PROCESS_SUBPACKAGES() + +#------------------------------------------------------------------------------ # # E) If Kokkos itself is enabled, process the Kokkos package # @@ -213,3 +232,4 @@ TRIBITS_EXCLUDE_FILES( ) TRIBITS_PACKAGE_POSTPROCESS() +ENDIF() diff --git a/lib/kokkos/Makefile.kokkos b/lib/kokkos/Makefile.kokkos index 5b094dba8c..24cd772e00 100644 --- a/lib/kokkos/Makefile.kokkos +++ b/lib/kokkos/Makefile.kokkos @@ -35,23 +35,26 @@ KOKKOS_INTERNAL_USE_MEMKIND := $(strip $(shell echo $(KOKKOS_USE_TPLS) | grep "e # Check for advanced settings. KOKKOS_INTERNAL_OPT_RANGE_AGGRESSIVE_VECTORIZATION := $(strip $(shell echo $(KOKKOS_OPTIONS) | grep "aggressive_vectorization" | wc -l)) KOKKOS_INTERNAL_DISABLE_PROFILING := $(strip $(shell echo $(KOKKOS_OPTIONS) | grep "disable_profiling" | wc -l)) +KOKKOS_INTERNAL_DISABLE_DUALVIEW_MODIFY_CHECK := $(strip $(shell echo $(KOKKOS_OPTIONS) | grep "disable_dualview_modify_check" | wc -l)) +KOKKOS_INTERNAL_ENABLE_PROFILING_LOAD_PRINT := $(strip $(shell echo $(KOKKOS_OPTIONS) | grep "enable_profile_load_print" | wc -l)) KOKKOS_INTERNAL_CUDA_USE_LDG := $(strip $(shell echo $(KOKKOS_CUDA_OPTIONS) | grep "use_ldg" | wc -l)) KOKKOS_INTERNAL_CUDA_USE_UVM := $(strip $(shell echo $(KOKKOS_CUDA_OPTIONS) | grep "force_uvm" | wc -l)) KOKKOS_INTERNAL_CUDA_USE_RELOC := $(strip $(shell echo $(KOKKOS_CUDA_OPTIONS) | grep "rdc" | wc -l)) KOKKOS_INTERNAL_CUDA_USE_LAMBDA := $(strip $(shell echo $(KOKKOS_CUDA_OPTIONS) | grep "enable_lambda" | wc -l)) # Check for Kokkos Host Execution Spaces one of which must be on. -KOKKOS_INTERNAL_USE_OPENMP := $(strip $(shell echo $(KOKKOS_DEVICES) | grep OpenMP | wc -l)) +KOKKOS_INTERNAL_USE_OPENMPTARGET := $(strip $(shell echo $(KOKKOS_DEVICES) | grep OpenMPTarget | wc -l)) +KOKKOS_INTERNAL_USE_OPENMP := $(strip $(shell echo $(subst OpenMPTarget,,$(KOKKOS_DEVICES)) | grep OpenMP | wc -l)) KOKKOS_INTERNAL_USE_PTHREADS := $(strip $(shell echo $(KOKKOS_DEVICES) | grep Pthread | wc -l)) KOKKOS_INTERNAL_USE_QTHREADS := $(strip $(shell echo $(KOKKOS_DEVICES) | grep Qthreads | wc -l)) KOKKOS_INTERNAL_USE_SERIAL := $(strip $(shell echo $(KOKKOS_DEVICES) | grep Serial | wc -l)) ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 0) -ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 0) -ifeq ($(KOKKOS_INTERNAL_USE_QTHREADS), 0) - KOKKOS_INTERNAL_USE_SERIAL := 1 -endif -endif + ifeq ($(KOKKOS_INTERNAL_USE_PTHREADS), 0) + ifeq ($(KOKKOS_INTERNAL_USE_QTHREADS), 0) + KOKKOS_INTERNAL_USE_SERIAL := 1 + endif + endif endif # Check for other Execution Spaces. @@ -64,24 +67,25 @@ ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) endif # Check OS. -KOKKOS_OS := $(shell uname -s) -KOKKOS_INTERNAL_OS_CYGWIN := $(shell uname -s | grep CYGWIN | wc -l) -KOKKOS_INTERNAL_OS_LINUX := $(shell uname -s | grep Linux | wc -l) -KOKKOS_INTERNAL_OS_DARWIN := $(shell uname -s | grep Darwin | wc -l) +KOKKOS_OS := $(strip $(shell uname -s)) +KOKKOS_INTERNAL_OS_CYGWIN := $(strip $(shell uname -s | grep CYGWIN | wc -l)) +KOKKOS_INTERNAL_OS_LINUX := $(strip $(shell uname -s | grep Linux | wc -l)) +KOKKOS_INTERNAL_OS_DARWIN := $(strip $(shell uname -s | grep Darwin | wc -l)) # Check compiler. -KOKKOS_INTERNAL_COMPILER_INTEL := $(shell $(CXX) --version 2>&1 | grep "Intel Corporation" | wc -l) -KOKKOS_INTERNAL_COMPILER_PGI := $(shell $(CXX) --version 2>&1 | grep PGI | wc -l) -KOKKOS_INTERNAL_COMPILER_XL := $(shell $(CXX) -qversion 2>&1 | grep XL | wc -l) -KOKKOS_INTERNAL_COMPILER_CRAY := $(shell $(CXX) -craype-verbose 2>&1 | grep "CC-" | wc -l) -KOKKOS_INTERNAL_COMPILER_NVCC := $(shell $(CXX) --version 2>&1 | grep "nvcc" | wc -l) +KOKKOS_INTERNAL_COMPILER_INTEL := $(strip $(shell $(CXX) --version 2>&1 | grep "Intel Corporation" | wc -l)) +KOKKOS_INTERNAL_COMPILER_PGI := $(strip $(shell $(CXX) --version 2>&1 | grep PGI | wc -l)) +KOKKOS_INTERNAL_COMPILER_XL := $(strip $(shell $(CXX) -qversion 2>&1 | grep XL | wc -l)) +KOKKOS_INTERNAL_COMPILER_CRAY := $(strip $(shell $(CXX) -craype-verbose 2>&1 | grep "CC-" | wc -l)) +KOKKOS_INTERNAL_COMPILER_NVCC := $(strip $(shell $(CXX) --version 2>&1 | grep nvcc | wc -l)) +KOKKOS_INTERNAL_COMPILER_CLANG := $(strip $(shell $(CXX) --version 2>&1 | grep clang | wc -l)) +KOKKOS_INTERNAL_COMPILER_APPLE_CLANG := $(strip $(shell $(CXX) --version 2>&1 | grep "apple-darwin" | wc -l)) ifneq ($(OMPI_CXX),) - KOKKOS_INTERNAL_COMPILER_NVCC := $(shell $(OMPI_CXX) --version 2>&1 | grep "nvcc" | wc -l) + KOKKOS_INTERNAL_COMPILER_NVCC := $(strip $(shell $(OMPI_CXX) --version 2>&1 | grep "nvcc" | wc -l)) endif ifneq ($(MPICH_CXX),) - KOKKOS_INTERNAL_COMPILER_NVCC := $(shell $(MPICH_CXX) --version 2>&1 | grep "nvcc" | wc -l) + KOKKOS_INTERNAL_COMPILER_NVCC := $(strip $(shell $(MPICH_CXX) --version 2>&1 | grep "nvcc" | wc -l)) endif -KOKKOS_INTERNAL_COMPILER_CLANG := $(shell $(CXX) --version 2>&1 | grep "clang" | wc -l) ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 2) KOKKOS_INTERNAL_COMPILER_CLANG = 1 @@ -90,6 +94,11 @@ ifeq ($(KOKKOS_INTERNAL_COMPILER_XL), 2) KOKKOS_INTERNAL_COMPILER_XL = 1 endif +# Apple Clang passes both clang and apple clang tests, so turn off clang. +ifeq ($(KOKKOS_INTERNAL_COMPILER_APPLE_CLANG), 1) + KOKKOS_INTERNAL_COMPILER_CLANG = 0 +endif + ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) KOKKOS_INTERNAL_COMPILER_CLANG_VERSION := $(shell clang --version | grep version | cut -d ' ' -f3 | tr -d '.') @@ -97,29 +106,43 @@ ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) ifeq ($(shell test $(KOKKOS_INTERNAL_COMPILER_CLANG_VERSION) -lt 400; echo $$?),0) $(error Compiling Cuda code directly with Clang requires version 4.0.0 or higher) endif + KOKKOS_INTERNAL_CUDA_USE_LAMBDA := 1 endif endif +# Set OpenMP flags. ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) KOKKOS_INTERNAL_OPENMP_FLAG := -mp else ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp=libomp else - ifeq ($(KOKKOS_INTERNAL_COMPILER_XL), 1) - KOKKOS_INTERNAL_OPENMP_FLAG := -qsmp=omp + ifeq ($(KOKKOS_INTERNAL_COMPILER_APPLE_CLANG), 1) + KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp=libomp else - ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) - # OpenMP is turned on by default in Cray compiler environment. - KOKKOS_INTERNAL_OPENMP_FLAG := + ifeq ($(KOKKOS_INTERNAL_COMPILER_XL), 1) + KOKKOS_INTERNAL_OPENMP_FLAG := -qsmp=omp else - KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp + ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) + # OpenMP is turned on by default in Cray compiler environment. + KOKKOS_INTERNAL_OPENMP_FLAG := + else + KOKKOS_INTERNAL_OPENMP_FLAG := -fopenmp + endif endif endif endif endif +ifeq ($(KOKKOS_INTERNAL_COMPILER_XL), 1) + KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -DKOKKOS_IBM_XL_OMP45_WORKAROUND -qsmp=omp -qoffload -qnoeh +else + ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) + KOKKOS_INTERNAL_OPENMPTARGET_FLAG := -DKOKKOS_BUG_WORKAROUND_IBM_CLANG_OMP45_VIEW_INIT -fopenmp-implicit-declare-target -fopenmp-targets=nvptx64-nvidia-cuda -fopenmp -fopenmp=libomp + endif +endif +# Set C++11 flags. ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) KOKKOS_INTERNAL_CXX11_FLAG := --c++11 else @@ -146,7 +169,7 @@ KOKKOS_INTERNAL_USE_ARCH_SKX := $(strip $(shell echo $(KOKKOS_ARCH) | grep SKX | KOKKOS_INTERNAL_USE_ARCH_KNL := $(strip $(shell echo $(KOKKOS_ARCH) | grep KNL | wc -l)) # NVIDIA based. -NVCC_WRAPPER := $(KOKKOS_PATH)/config/nvcc_wrapper +NVCC_WRAPPER := $(KOKKOS_PATH)/bin/nvcc_wrapper KOKKOS_INTERNAL_USE_ARCH_KEPLER30 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Kepler30 | wc -l)) KOKKOS_INTERNAL_USE_ARCH_KEPLER32 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Kepler32 | wc -l)) KOKKOS_INTERNAL_USE_ARCH_KEPLER35 := $(strip $(shell echo $(KOKKOS_ARCH) | grep Kepler35 | wc -l)) @@ -180,10 +203,20 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_NVIDIA), 0) + $(KOKKOS_INTERNAL_USE_ARCH_MAXWELL53) | bc)) endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_NVIDIA), 1) + ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) + ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) + KOKKOS_INTERNAL_NVCC_PATH := $(shell which nvcc) + CUDA_PATH ?= $(KOKKOS_INTERNAL_NVCC_PATH:/bin/nvcc=) + KOKKOS_INTERNAL_OPENMPTARGET_FLAG := $(KOKKOS_INTERNAL_OPENMPTARGET_FLAG) --cuda-path=$(CUDA_PATH) + endif + endif +endif # ARM based. KOKKOS_INTERNAL_USE_ARCH_ARMV80 := $(strip $(shell echo $(KOKKOS_ARCH) | grep ARMv80 | wc -l)) KOKKOS_INTERNAL_USE_ARCH_ARMV81 := $(strip $(shell echo $(KOKKOS_ARCH) | grep ARMv81 | wc -l)) KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX := $(strip $(shell echo $(KOKKOS_ARCH) | grep ARMv8-ThunderX | wc -l)) +KOKKOS_INTERNAL_USE_ARCH_ARM := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_ARMV80)+$(KOKKOS_INTERNAL_USE_ARCH_ARMV81)+$(KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX) | bc)) # IBM based. KOKKOS_INTERNAL_USE_ARCH_BGQ := $(strip $(shell echo $(KOKKOS_ARCH) | grep BGQ | wc -l)) @@ -206,8 +239,11 @@ KOKKOS_INTERNAL_USE_ISA_X86_64 := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ KOKKOS_INTERNAL_USE_ISA_KNC := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_KNC) | bc )) KOKKOS_INTERNAL_USE_ISA_POWERPCLE := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_POWER8)+$(KOKKOS_INTERNAL_USE_ARCH_POWER9) | bc )) +# Decide whether we can support transactional memory +KOKKOS_INTERNAL_USE_TM := $(strip $(shell echo $(KOKKOS_INTERNAL_USE_ARCH_BDW)+$(KOKKOS_INTERNAL_USE_ARCH_SKX) | bc )) + # Incompatible flags? -KOKKOS_INTERNAL_USE_ARCH_MULTIHOST := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_AVX)+$(KOKKOS_INTERNAL_USE_ARCH_AVX2)+$(KOKKOS_INTERNAL_USE_ARCH_KNC)+$(KOKKOS_INTERNAL_USE_ARCH_IBM)+$(KOKKOS_INTERNAL_USE_ARCH_AMDAVX)+$(KOKKOS_INTERNAL_USE_ARCH_ARMV80)+$(KOKKOS_INTERNAL_USE_ARCH_ARMV81)+$(KOKKOS_INTERNAL_USE_ARCH_ARMV8_THUNDERX)>1" | bc )) +KOKKOS_INTERNAL_USE_ARCH_MULTIHOST := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_AVX)+$(KOKKOS_INTERNAL_USE_ARCH_AVX2)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC)+$(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON)+$(KOKKOS_INTERNAL_USE_ARCH_KNC)+$(KOKKOS_INTERNAL_USE_ARCH_IBM)+$(KOKKOS_INTERNAL_USE_ARCH_ARM)>1" | bc )) KOKKOS_INTERNAL_USE_ARCH_MULTIGPU := $(strip $(shell echo "$(KOKKOS_INTERNAL_USE_ARCH_NVIDIA)>1" | bc)) ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MULTIHOST), 1) @@ -240,12 +276,22 @@ tmp := $(shell echo "Makefile constructed configuration:" >> KokkosCore_config.t tmp := $(shell date >> KokkosCore_config.tmp) tmp := $(shell echo "----------------------------------------------*/" >> KokkosCore_config.tmp) +tmp := $(shell echo '\#if !defined(KOKKOS_MACROS_HPP) || defined(KOKKOS_CORE_CONFIG_H)' >> KokkosCore_config.tmp) +tmp := $(shell echo '\#error "Do not include KokkosCore_config.h directly; include Kokkos_Macros.hpp instead."' >> KokkosCore_config.tmp) +tmp := $(shell echo '\#else' >> KokkosCore_config.tmp) +tmp := $(shell echo '\#define KOKKOS_CORE_CONFIG_H' >> KokkosCore_config.tmp) +tmp := $(shell echo '\#endif' >> KokkosCore_config.tmp) + tmp := $(shell echo "/* Execution Spaces */" >> KokkosCore_config.tmp) ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) tmp := $(shell echo "\#define KOKKOS_HAVE_CUDA 1" >> KokkosCore_config.tmp ) endif +ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) + tmp := $(shell echo '\#define KOKKOS_ENABLE_OPENMPTARGET 1' >> KokkosCore_config.tmp) +endif + ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 1) tmp := $(shell echo '\#define KOKKOS_HAVE_OPENMP 1' >> KokkosCore_config.tmp) endif @@ -262,6 +308,12 @@ ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) tmp := $(shell echo "\#define KOKKOS_HAVE_SERIAL 1" >> KokkosCore_config.tmp ) endif +ifeq ($(KOKKOS_INTERNAL_USE_TM), 1) + tmp := $(shell echo "\#ifndef __CUDA_ARCH__" >> KokkosCore_config.tmp ) + tmp := $(shell echo "\#define KOKKOS_ENABLE_TM" >> KokkosCore_config.tmp ) + tmp := $(shell echo "\#endif" >> KokkosCore_config.tmp ) +endif + ifeq ($(KOKKOS_INTERNAL_USE_ISA_X86_64), 1) tmp := $(shell echo "\#ifndef __CUDA_ARCH__" >> KokkosCore_config.tmp ) tmp := $(shell echo "\#define KOKKOS_USE_ISA_X86_64" >> KokkosCore_config.tmp ) @@ -293,13 +345,21 @@ ifeq ($(KOKKOS_INTERNAL_ENABLE_CXX1Z), 1) endif ifeq ($(KOKKOS_INTERNAL_ENABLE_DEBUG), 1) -ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) - KOKKOS_CXXFLAGS += -lineinfo -endif + ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) + KOKKOS_CXXFLAGS += -lineinfo + endif + KOKKOS_CXXFLAGS += -g KOKKOS_LDFLAGS += -g -ldl tmp := $(shell echo "\#define KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK 1" >> KokkosCore_config.tmp ) tmp := $(shell echo "\#define KOKKOS_HAVE_DEBUG 1" >> KokkosCore_config.tmp ) + ifeq ($(KOKKOS_INTERNAL_DISABLE_DUALVIEW_MODIFY_CHECK), 0) + tmp := $(shell echo "\#define KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK 1" >> KokkosCore_config.tmp ) + endif +endif + +ifeq ($(KOKKOS_INTERNAL_ENABLE_PROFILING_LOAD_PRINT), 1) + tmp := $(shell echo "\#define KOKKOS_ENABLE_PROFILING_LOAD_PRINT 1" >> KokkosCore_config.tmp ) endif ifeq ($(KOKKOS_INTERNAL_USE_HWLOC), 1) @@ -311,8 +371,6 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_LIBRT), 1) tmp := $(shell echo "\#define KOKKOS_USE_LIBRT 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define PREC_TIMER 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOSP_ENABLE_RTLIB 1" >> KokkosCore_config.tmp ) KOKKOS_LIBS += -lrt endif @@ -323,8 +381,8 @@ ifeq ($(KOKKOS_INTERNAL_USE_MEMKIND), 1) tmp := $(shell echo "\#define KOKKOS_HAVE_HBWSPACE 1" >> KokkosCore_config.tmp ) endif -ifeq ($(KOKKOS_INTERNAL_DISABLE_PROFILING), 1) - tmp := $(shell echo "\#define KOKKOS_ENABLE_PROFILING 0" >> KokkosCore_config.tmp ) +ifeq ($(KOKKOS_INTERNAL_DISABLE_PROFILING), 0) + tmp := $(shell echo "\#define KOKKOS_ENABLE_PROFILING" >> KokkosCore_config.tmp ) endif tmp := $(shell echo "/* Optimization Settings */" >> KokkosCore_config.tmp) @@ -336,39 +394,44 @@ endif tmp := $(shell echo "/* Cuda Settings */" >> KokkosCore_config.tmp) ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) + ifeq ($(KOKKOS_INTERNAL_CUDA_USE_LDG), 1) + tmp := $(shell echo "\#define KOKKOS_CUDA_USE_LDG_INTRINSIC 1" >> KokkosCore_config.tmp ) + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) + tmp := $(shell echo "\#define KOKKOS_CUDA_USE_LDG_INTRINSIC 1" >> KokkosCore_config.tmp ) + endif + endif -ifeq ($(KOKKOS_INTERNAL_CUDA_USE_LDG), 1) - tmp := $(shell echo "\#define KOKKOS_CUDA_USE_LDG_INTRINSIC 1" >> KokkosCore_config.tmp ) -endif + ifeq ($(KOKKOS_INTERNAL_CUDA_USE_UVM), 1) + tmp := $(shell echo "\#define KOKKOS_CUDA_USE_UVM 1" >> KokkosCore_config.tmp ) + endif -ifeq ($(KOKKOS_INTERNAL_CUDA_USE_UVM), 1) - tmp := $(shell echo "\#define KOKKOS_CUDA_USE_UVM 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_USE_CUDA_UVM 1" >> KokkosCore_config.tmp ) -endif + ifeq ($(KOKKOS_INTERNAL_CUDA_USE_RELOC), 1) + tmp := $(shell echo "\#define KOKKOS_CUDA_USE_RELOCATABLE_DEVICE_CODE 1" >> KokkosCore_config.tmp ) + KOKKOS_CXXFLAGS += --relocatable-device-code=true + KOKKOS_LDFLAGS += --relocatable-device-code=true + endif -ifeq ($(KOKKOS_INTERNAL_CUDA_USE_RELOC), 1) - tmp := $(shell echo "\#define KOKKOS_CUDA_USE_RELOCATABLE_DEVICE_CODE 1" >> KokkosCore_config.tmp ) - KOKKOS_CXXFLAGS += --relocatable-device-code=true - KOKKOS_LDFLAGS += --relocatable-device-code=true -endif + ifeq ($(KOKKOS_INTERNAL_CUDA_USE_LAMBDA), 1) + ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) + ifeq ($(shell test $(KOKKOS_INTERNAL_COMPILER_NVCC_VERSION) -gt 70; echo $$?),0) + tmp := $(shell echo "\#define KOKKOS_CUDA_USE_LAMBDA 1" >> KokkosCore_config.tmp ) + KOKKOS_CXXFLAGS += -expt-extended-lambda + else + $(warning Warning: Cuda Lambda support was requested but NVCC version is too low. This requires NVCC for Cuda version 7.5 or higher. Disabling Lambda support now.) + endif + endif -ifeq ($(KOKKOS_INTERNAL_CUDA_USE_LAMBDA), 1) - ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) - ifeq ($(shell test $(KOKKOS_INTERNAL_COMPILER_NVCC_VERSION) -gt 70; echo $$?),0) + ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) tmp := $(shell echo "\#define KOKKOS_CUDA_USE_LAMBDA 1" >> KokkosCore_config.tmp ) - KOKKOS_CXXFLAGS += -expt-extended-lambda - else - $(warning Warning: Cuda Lambda support was requested but NVCC version is too low. This requires NVCC for Cuda version 7.5 or higher. Disabling Lambda support now.) endif endif ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) - tmp := $(shell echo "\#define KOKKOS_CUDA_USE_LAMBDA 1" >> KokkosCore_config.tmp ) + tmp := $(shell echo "\#define KOKKOS_CUDA_CLANG_WORKAROUND" >> KokkosCore_config.tmp ) endif endif -endif - # Add Architecture flags. ifeq ($(KOKKOS_INTERNAL_USE_ARCH_ARMV80), 1) @@ -469,7 +532,7 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_POWER9), 1) endif endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX2), 1) +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_HSW), 1) tmp := $(shell echo "\#define KOKKOS_ARCH_AVX2 1" >> KokkosCore_config.tmp ) ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) @@ -491,6 +554,28 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX2), 1) endif endif +ifeq ($(KOKKOS_INTERNAL_USE_ARCH_BDW), 1) + tmp := $(shell echo "\#define KOKKOS_ARCH_AVX2 1" >> KokkosCore_config.tmp ) + + ifeq ($(KOKKOS_INTERNAL_COMPILER_INTEL), 1) + KOKKOS_CXXFLAGS += -xCORE-AVX2 + KOKKOS_LDFLAGS += -xCORE-AVX2 + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) + + else + ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) + KOKKOS_CXXFLAGS += -tp=haswell + KOKKOS_LDFLAGS += -tp=haswell + else + # Assume that this is a really a GNU compiler. + KOKKOS_CXXFLAGS += -march=core-avx2 -mtune=core-avx2 -mrtm + KOKKOS_LDFLAGS += -march=core-avx2 -mtune=core-avx2 -mrtm + endif + endif + endif +endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC), 1) tmp := $(shell echo "\#define KOKKOS_ARCH_AVX512MIC 1" >> KokkosCore_config.tmp ) @@ -501,12 +586,12 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512MIC), 1) ifeq ($(KOKKOS_INTERNAL_COMPILER_CRAY), 1) else - ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) + ifeq ($(KOKKOS_INTERNAL_COMPILER_PGI), 1) else # Asssume that this is really a GNU compiler. - KOKKOS_CXXFLAGS += -march=knl - KOKKOS_LDFLAGS += -march=knl + KOKKOS_CXXFLAGS += -march=knl -mtune=knl + KOKKOS_LDFLAGS += -march=knl -mtune=knl endif endif endif @@ -526,8 +611,8 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_AVX512XEON), 1) else # Nothing here yet. - KOKKOS_CXXFLAGS += -march=skylake-avx512 - KOKKOS_LDFLAGS += -march=skylake-avx512 + KOKKOS_CXXFLAGS += -march=skylake-avx512 -mtune=skylake-avx512 -mrtm + KOKKOS_LDFLAGS += -march=skylake-avx512 -mtune=skylake-avx512 -mrtm endif endif endif @@ -541,70 +626,67 @@ endif # Figure out the architecture flag for Cuda. ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) + ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) + KOKKOS_INTERNAL_CUDA_ARCH_FLAG=-arch + endif + ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) + KOKKOS_INTERNAL_CUDA_ARCH_FLAG=--cuda-gpu-arch + KOKKOS_CXXFLAGS += -x cuda + endif -ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) - KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG=-arch -endif -ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) - KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG=--cuda-gpu-arch - KOKKOS_CXXFLAGS += -x cuda -endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER30), 1) + tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER 1" >> KokkosCore_config.tmp ) + tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER30 1" >> KokkosCore_config.tmp ) + KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_30 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER32), 1) + tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER 1" >> KokkosCore_config.tmp ) + tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER32 1" >> KokkosCore_config.tmp ) + KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_32 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER35), 1) + tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER 1" >> KokkosCore_config.tmp ) + tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER35 1" >> KokkosCore_config.tmp ) + KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_35 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER37), 1) + tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER 1" >> KokkosCore_config.tmp ) + tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER37 1" >> KokkosCore_config.tmp ) + KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_37 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MAXWELL50), 1) + tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL 1" >> KokkosCore_config.tmp ) + tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL50 1" >> KokkosCore_config.tmp ) + KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_50 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MAXWELL52), 1) + tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL 1" >> KokkosCore_config.tmp ) + tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL52 1" >> KokkosCore_config.tmp ) + KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_52 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MAXWELL53), 1) + tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL 1" >> KokkosCore_config.tmp ) + tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL53 1" >> KokkosCore_config.tmp ) + KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_53 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_PASCAL60), 1) + tmp := $(shell echo "\#define KOKKOS_ARCH_PASCAL 1" >> KokkosCore_config.tmp ) + tmp := $(shell echo "\#define KOKKOS_ARCH_PASCAL60 1" >> KokkosCore_config.tmp ) + KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_60 + endif + ifeq ($(KOKKOS_INTERNAL_USE_ARCH_PASCAL61), 1) + tmp := $(shell echo "\#define KOKKOS_ARCH_PASCAL 1" >> KokkosCore_config.tmp ) + tmp := $(shell echo "\#define KOKKOS_ARCH_PASCAL61 1" >> KokkosCore_config.tmp ) + KOKKOS_INTERNAL_CUDA_ARCH_FLAG := $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG)=sm_61 + endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER30), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER30 1" >> KokkosCore_config.tmp ) - KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_30 - KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_30 -endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER32), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER32 1" >> KokkosCore_config.tmp ) - KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_32 - KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_32 -endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER35), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER35 1" >> KokkosCore_config.tmp ) - KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_35 - KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_35 -endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_KEPLER37), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_KEPLER37 1" >> KokkosCore_config.tmp ) - KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_37 - KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_37 -endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MAXWELL50), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL50 1" >> KokkosCore_config.tmp ) - KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_50 - KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_50 -endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MAXWELL52), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL52 1" >> KokkosCore_config.tmp ) - KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_52 - KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_52 -endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_MAXWELL53), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_MAXWELL53 1" >> KokkosCore_config.tmp ) - KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_53 - KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_53 -endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_PASCAL61), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_PASCAL 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_PASCAL61 1" >> KokkosCore_config.tmp ) - KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_61 - KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_61 -endif -ifeq ($(KOKKOS_INTERNAL_USE_ARCH_PASCAL60), 1) - tmp := $(shell echo "\#define KOKKOS_ARCH_PASCAL 1" >> KokkosCore_config.tmp ) - tmp := $(shell echo "\#define KOKKOS_ARCH_PASCAL60 1" >> KokkosCore_config.tmp ) - KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_60 - KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_COMPILER_CUDA_ARCH_FLAG)=sm_60 -endif + ifneq ($(KOKKOS_INTERNAL_USE_ARCH_NVIDIA), 0) + KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG) + ifeq ($(KOKKOS_INTERNAL_COMPILER_NVCC), 1) + KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_CUDA_ARCH_FLAG) + endif + endif endif KOKKOS_INTERNAL_LS_CONFIG := $(shell ls KokkosCore_config.h) @@ -630,9 +712,24 @@ KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/containers/src/impl/*.cpp) ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) KOKKOS_SRC += $(wildcard $(KOKKOS_PATH)/core/src/Cuda/*.cpp) KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/Cuda/*.hpp) - KOKKOS_CXXFLAGS += -I$(CUDA_PATH)/include + KOKKOS_CPPFLAGS += -I$(CUDA_PATH)/include KOKKOS_LDFLAGS += -L$(CUDA_PATH)/lib64 KOKKOS_LIBS += -lcudart -lcuda + + ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) + KOKKOS_CXXFLAGS += --cuda-path=$(CUDA_PATH) + endif +endif + +ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) + KOKKOS_SRC += $(KOKKOS_PATH)/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Exec.cpp $(KOKKOS_PATH)/core/src/OpenMPTarget/Kokkos_OpenMPTargetSpace.cpp + KOKKOS_HEADERS += $(wildcard $(KOKKOS_PATH)/core/src/OpenMPTarget/*.hpp) + ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) + KOKKOS_CXXFLAGS += -Xcompiler $(KOKKOS_INTERNAL_OPENMPTARGET_FLAG) + else + KOKKOS_CXXFLAGS += $(KOKKOS_INTERNAL_OPENMPTARGET_FLAG) + endif + KOKKOS_LDFLAGS += $(KOKKOS_INTERNAL_OPENMPTARGET_FLAG) endif ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 1) @@ -666,10 +763,27 @@ endif ifeq ($(KOKKOS_INTERNAL_COMPILER_CLANG), 1) KOKKOS_INTERNAL_GCC_PATH = $(shell which g++) KOKKOS_INTERNAL_GCC_TOOLCHAIN = $(KOKKOS_INTERNAL_GCC_PATH:/bin/g++=) - KOKKOS_CXXFLAGS += --gcc-toolchain=$(KOKKOS_INTERNAL_GCC_TOOLCHAIN) -DKOKKOS_CUDA_CLANG_WORKAROUND -DKOKKOS_CUDA_USE_LDG_INTRINSIC + KOKKOS_CXXFLAGS += --gcc-toolchain=$(KOKKOS_INTERNAL_GCC_TOOLCHAIN) KOKKOS_LDFLAGS += --gcc-toolchain=$(KOKKOS_INTERNAL_GCC_TOOLCHAIN) endif +# Don't include Kokkos_HBWSpace.cpp if not using MEMKIND to avoid a link warning. +ifneq ($(KOKKOS_INTERNAL_USE_MEMKIND), 1) + KOKKOS_SRC := $(filter-out $(KOKKOS_PATH)/core/src/impl/Kokkos_HBWSpace.cpp,$(KOKKOS_SRC)) +endif + +# Don't include Kokkos_Profiling_Interface.cpp if not using profiling to avoid a link warning. +ifeq ($(KOKKOS_INTERNAL_DISABLE_PROFILING), 1) + KOKKOS_SRC := $(filter-out $(KOKKOS_PATH)/core/src/impl/Kokkos_Profiling_Interface.cpp,$(KOKKOS_SRC)) +endif + +# Don't include Kokkos_Serial.cpp or Kokkos_Serial_Task.cpp if not using Serial +# device to avoid a link warning. +ifneq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) + KOKKOS_SRC := $(filter-out $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial.cpp,$(KOKKOS_SRC)) + KOKKOS_SRC := $(filter-out $(KOKKOS_PATH)/core/src/impl/Kokkos_Serial_Task.cpp,$(KOKKOS_SRC)) +endif + # With Cygwin functions such as fdopen and fileno are not defined # when strict ansi is enabled. strict ansi gets enabled with --std=c++11 # though. So we hard undefine it here. Not sure if that has any bad side effects diff --git a/lib/kokkos/Makefile.targets b/lib/kokkos/Makefile.targets index 54cacb741b..3cb52a04cd 100644 --- a/lib/kokkos/Makefile.targets +++ b/lib/kokkos/Makefile.targets @@ -53,11 +53,20 @@ Kokkos_Qthreads_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/Qthreads/K endif ifeq ($(KOKKOS_INTERNAL_USE_OPENMP), 1) -Kokkos_OpenMPexec.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMPexec.cpp - $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMPexec.cpp +Kokkos_OpenMP_Exec.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Exec.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Exec.cpp Kokkos_OpenMP_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Task.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/OpenMP/Kokkos_OpenMP_Task.cpp endif +ifeq ($(KOKKOS_INTERNAL_USE_OPENMPTARGET), 1) +Kokkos_OpenMPTarget_Exec.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Exec.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Exec.cpp +Kokkos_OpenMPTargetSpace.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/OpenMPTarget/Kokkos_OpenMPTargetSpace.cpp + $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/OpenMPTarget/Kokkos_OpenMPTargetSpace.cpp +#Kokkos_OpenMPTarget_Task.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Task.cpp +# $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/OpenMPTarget/Kokkos_OpenMPTarget_Task.cpp +endif + Kokkos_HBWSpace.o: $(KOKKOS_CPP_DEPENDS) $(KOKKOS_PATH)/core/src/impl/Kokkos_HBWSpace.cpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) -c $(KOKKOS_PATH)/core/src/impl/Kokkos_HBWSpace.cpp diff --git a/lib/kokkos/algorithms/src/KokkosAlgorithms_dummy.cpp b/lib/kokkos/algorithms/src/KokkosAlgorithms_dummy.cpp index e69de29bb2..9c08a088b0 100644 --- a/lib/kokkos/algorithms/src/KokkosAlgorithms_dummy.cpp +++ b/lib/kokkos/algorithms/src/KokkosAlgorithms_dummy.cpp @@ -0,0 +1 @@ +void KOKKOS_ALGORITHMS_SRC_DUMMY_PREVENT_LINK_ERROR() {} diff --git a/lib/kokkos/algorithms/src/Kokkos_Random.hpp b/lib/kokkos/algorithms/src/Kokkos_Random.hpp index bd73582362..42c115b7a5 100644 --- a/lib/kokkos/algorithms/src/Kokkos_Random.hpp +++ b/lib/kokkos/algorithms/src/Kokkos_Random.hpp @@ -674,7 +674,7 @@ namespace Kokkos { const double V = 2.0*drand() - 1.0; S = U*U+V*V; } - return U*sqrt(-2.0*log(S)/S); + return U*std::sqrt(-2.0*log(S)/S); } KOKKOS_INLINE_FUNCTION @@ -917,7 +917,7 @@ namespace Kokkos { const double V = 2.0*drand() - 1.0; S = U*U+V*V; } - return U*sqrt(-2.0*log(S)/S); + return U*std::sqrt(-2.0*log(S)/S); } KOKKOS_INLINE_FUNCTION @@ -1171,7 +1171,7 @@ namespace Kokkos { const double V = 2.0*drand() - 1.0; S = U*U+V*V; } - return U*sqrt(-2.0*log(S)/S); + return U*std::sqrt(-2.0*log(S)/S); } KOKKOS_INLINE_FUNCTION diff --git a/lib/kokkos/algorithms/unit_tests/Makefile b/lib/kokkos/algorithms/unit_tests/Makefile index 3027c6a94b..b74192ef18 100644 --- a/lib/kokkos/algorithms/unit_tests/Makefile +++ b/lib/kokkos/algorithms/unit_tests/Makefile @@ -8,7 +8,7 @@ default: build_all echo "End Build" ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) - CXX = $(KOKKOS_PATH)/config/nvcc_wrapper + CXX = $(KOKKOS_PATH)/bin/nvcc_wrapper else CXX = g++ endif @@ -21,8 +21,8 @@ include $(KOKKOS_PATH)/Makefile.kokkos KOKKOS_CXXFLAGS += -I$(GTEST_PATH) -I${KOKKOS_PATH}/algorithms/unit_tests -TEST_TARGETS = -TARGETS = +TEST_TARGETS = +TARGETS = ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) OBJ_CUDA = TestCuda.o UnitTestMain.o gtest-all.o @@ -49,16 +49,16 @@ ifeq ($(KOKKOS_INTERNAL_USE_SERIAL), 1) endif KokkosAlgorithms_UnitTest_Cuda: $(OBJ_CUDA) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ_CUDA) $(KOKKOS_LIBS) $(LIB) -o KokkosAlgorithms_UnitTest_Cuda + $(LINK) $(EXTRA_PATH) $(OBJ_CUDA) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosAlgorithms_UnitTest_Cuda KokkosAlgorithms_UnitTest_Threads: $(OBJ_THREADS) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ_THREADS) $(KOKKOS_LIBS) $(LIB) -o KokkosAlgorithms_UnitTest_Threads + $(LINK) $(EXTRA_PATH) $(OBJ_THREADS) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosAlgorithms_UnitTest_Threads KokkosAlgorithms_UnitTest_OpenMP: $(OBJ_OPENMP) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ_OPENMP) $(KOKKOS_LIBS) $(LIB) -o KokkosAlgorithms_UnitTest_OpenMP + $(LINK) $(EXTRA_PATH) $(OBJ_OPENMP) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosAlgorithms_UnitTest_OpenMP KokkosAlgorithms_UnitTest_Serial: $(OBJ_SERIAL) $(KOKKOS_LINK_DEPENDS) - $(LINK) $(KOKKOS_LDFLAGS) $(LDFLAGS) $(EXTRA_PATH) $(OBJ_SERIAL) $(KOKKOS_LIBS) $(LIB) -o KokkosAlgorithms_UnitTest_Serial + $(LINK) $(EXTRA_PATH) $(OBJ_SERIAL) $(KOKKOS_LIBS) $(LIB) $(KOKKOS_LDFLAGS) $(LDFLAGS) -o KokkosAlgorithms_UnitTest_Serial test-cuda: KokkosAlgorithms_UnitTest_Cuda ./KokkosAlgorithms_UnitTest_Cuda @@ -76,7 +76,7 @@ build_all: $(TARGETS) test: $(TEST_TARGETS) -clean: kokkos-clean +clean: kokkos-clean rm -f *.o $(TARGETS) # Compilation rules @@ -84,6 +84,5 @@ clean: kokkos-clean %.o:%.cpp $(KOKKOS_CPP_DEPENDS) $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) $(EXTRA_INC) -c $< -gtest-all.o:$(GTEST_PATH)/gtest/gtest-all.cc +gtest-all.o:$(GTEST_PATH)/gtest/gtest-all.cc $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) $(EXTRA_INC) -c $(GTEST_PATH)/gtest/gtest-all.cc - diff --git a/lib/kokkos/algorithms/unit_tests/TestCuda.cpp b/lib/kokkos/algorithms/unit_tests/TestCuda.cpp index ba3938f497..710eeb8ada 100644 --- a/lib/kokkos/algorithms/unit_tests/TestCuda.cpp +++ b/lib/kokkos/algorithms/unit_tests/TestCuda.cpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. -// +// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -36,12 +36,15 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ -#include +#include +#ifdef KOKKOS_ENABLE_CUDA + +#include #include #include @@ -49,8 +52,6 @@ #include -#ifdef KOKKOS_ENABLE_CUDA - #include #include @@ -105,6 +106,7 @@ CUDA_SORT_UNSIGNED(171) #undef CUDA_RANDOM_XORSHIFT1024 #undef CUDA_SORT_UNSIGNED } - +#else +void KOKKOS_ALGORITHMS_UNITTESTS_TESTCUDA_PREVENT_LINK_ERROR() {} #endif /* #ifdef KOKKOS_ENABLE_CUDA */ diff --git a/lib/kokkos/algorithms/unit_tests/TestOpenMP.cpp b/lib/kokkos/algorithms/unit_tests/TestOpenMP.cpp index f4d582d0bb..1e7ee68549 100644 --- a/lib/kokkos/algorithms/unit_tests/TestOpenMP.cpp +++ b/lib/kokkos/algorithms/unit_tests/TestOpenMP.cpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. -// +// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -36,13 +36,16 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ -#include +#include +#ifdef KOKKOS_ENABLE_OPENMP + +#include #include //---------------------------------------------------------------------------- @@ -52,7 +55,6 @@ namespace Test { -#ifdef KOKKOS_ENABLE_OPENMP class openmp : public ::testing::Test { protected: static void SetUpTestCase() @@ -97,6 +99,8 @@ OPENMP_SORT_UNSIGNED(171) #undef OPENMP_RANDOM_XORSHIFT64 #undef OPENMP_RANDOM_XORSHIFT1024 #undef OPENMP_SORT_UNSIGNED -#endif } // namespace test +#else +void KOKKOS_ALGORITHMS_UNITTESTS_TESTOPENMP_PREVENT_LINK_ERROR() {} +#endif diff --git a/lib/kokkos/algorithms/unit_tests/TestRandom.hpp b/lib/kokkos/algorithms/unit_tests/TestRandom.hpp index c906b9f2cd..9cf02f74b4 100644 --- a/lib/kokkos/algorithms/unit_tests/TestRandom.hpp +++ b/lib/kokkos/algorithms/unit_tests/TestRandom.hpp @@ -295,7 +295,7 @@ struct test_random_scalar { parallel_reduce (num_draws/1024, functor_type (pool, density_1d, density_3d), result); //printf("Result: %lf %lf %lf\n",result.mean/num_draws/3,result.variance/num_draws/3,result.covariance/num_draws/2); - double tolerance = 1.6*sqrt(1.0/num_draws); + double tolerance = 1.6*std::sqrt(1.0/num_draws); double mean_expect = 0.5*Kokkos::rand::max(); double variance_expect = 1.0/3.0*mean_expect*mean_expect; double mean_eps = mean_expect/(result.mean/num_draws/3)-1.0; @@ -321,7 +321,7 @@ struct test_random_scalar { typedef test_histogram1d_functor functor_type; parallel_reduce (HIST_DIM1D, functor_type (density_1d, num_draws), result); - double tolerance = 6*sqrt(1.0/HIST_DIM1D); + double tolerance = 6*std::sqrt(1.0/HIST_DIM1D); double mean_expect = 1.0*num_draws*3/HIST_DIM1D; double variance_expect = 1.0*num_draws*3/HIST_DIM1D*(1.0-1.0/HIST_DIM1D); double covariance_expect = -1.0*num_draws*3/HIST_DIM1D/HIST_DIM1D; @@ -354,7 +354,7 @@ struct test_random_scalar { typedef test_histogram3d_functor functor_type; parallel_reduce (HIST_DIM1D, functor_type (density_3d, num_draws), result); - double tolerance = 6*sqrt(1.0/HIST_DIM1D); + double tolerance = 6*std::sqrt(1.0/HIST_DIM1D); double mean_expect = 1.0*num_draws/HIST_DIM1D; double variance_expect = 1.0*num_draws/HIST_DIM1D*(1.0-1.0/HIST_DIM1D); double covariance_expect = -1.0*num_draws/HIST_DIM1D/HIST_DIM1D; diff --git a/lib/kokkos/algorithms/unit_tests/TestSerial.cpp b/lib/kokkos/algorithms/unit_tests/TestSerial.cpp index 6ac80cf73a..a1df93e07b 100644 --- a/lib/kokkos/algorithms/unit_tests/TestSerial.cpp +++ b/lib/kokkos/algorithms/unit_tests/TestSerial.cpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. -// +// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -36,11 +36,14 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ +#include +#ifdef KOKKOS_ENABLE_SERIAL + #include #include @@ -55,7 +58,6 @@ namespace Test { -#ifdef KOKKOS_ENABLE_SERIAL class serial : public ::testing::Test { protected: static void SetUpTestCase() @@ -93,7 +95,9 @@ SERIAL_SORT_UNSIGNED(171) #undef SERIAL_RANDOM_XORSHIFT1024 #undef SERIAL_SORT_UNSIGNED -#endif // KOKKOS_ENABLE_SERIAL } // namespace Test +#else +void KOKKOS_ALGORITHMS_UNITTESTS_TESTSERIAL_PREVENT_LINK_ERROR() {} +#endif // KOKKOS_ENABLE_SERIAL diff --git a/lib/kokkos/algorithms/unit_tests/TestSort.hpp b/lib/kokkos/algorithms/unit_tests/TestSort.hpp index 61ffa6f43a..04be98f1cc 100644 --- a/lib/kokkos/algorithms/unit_tests/TestSort.hpp +++ b/lib/kokkos/algorithms/unit_tests/TestSort.hpp @@ -1,12 +1,12 @@ //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. -// +// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -35,12 +35,12 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER -#ifndef TESTSORT_HPP_ -#define TESTSORT_HPP_ +#ifndef KOKKOS_ALGORITHMS_UNITTESTS_TESTSORT_HPP +#define KOKKOS_ALGORITHMS_UNITTESTS_TESTSORT_HPP #include #include @@ -212,7 +212,12 @@ void test_dynamic_view_sort(unsigned int n ) const size_t upper_bound = 2 * n ; typename KeyDynamicViewType::memory_pool - pool( memory_space() , 2 * n * sizeof(KeyType) ); + pool( memory_space() + , n * sizeof(KeyType) * 1.2 + , 500 /* min block size in bytes */ + , 30000 /* max block size in bytes */ + , 1000000 /* min superblock size in bytes */ + ); KeyDynamicViewType keys("Keys",pool,upper_bound); @@ -272,4 +277,4 @@ void test_sort(unsigned int N) } } -#endif /* TESTSORT_HPP_ */ +#endif /* KOKKOS_ALGORITHMS_UNITTESTS_TESTSORT_HPP */ diff --git a/lib/kokkos/algorithms/unit_tests/TestThreads.cpp b/lib/kokkos/algorithms/unit_tests/TestThreads.cpp index 36d438b643..08749779ff 100644 --- a/lib/kokkos/algorithms/unit_tests/TestThreads.cpp +++ b/lib/kokkos/algorithms/unit_tests/TestThreads.cpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. -// +// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -36,11 +36,14 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ +#include +#ifdef KOKKOS_ENABLE_THREADS + #include #include @@ -55,7 +58,6 @@ namespace Test { -#ifdef KOKKOS_ENABLE_PTHREAD class threads : public ::testing::Test { protected: static void SetUpTestCase() @@ -107,7 +109,9 @@ THREADS_SORT_UNSIGNED(171) #undef THREADS_RANDOM_XORSHIFT1024 #undef THREADS_SORT_UNSIGNED -#endif } // namespace Test +#else +void KOKKOS_ALGORITHMS_UNITTESTS_TESTTHREADS_PREVENT_LINK_ERROR() {} +#endif diff --git a/lib/kokkos/benchmarks/bytes_and_flops/Makefile b/lib/kokkos/benchmarks/bytes_and_flops/Makefile index 6a1917a523..5ddf78f28e 100644 --- a/lib/kokkos/benchmarks/bytes_and_flops/Makefile +++ b/lib/kokkos/benchmarks/bytes_and_flops/Makefile @@ -7,7 +7,7 @@ default: build echo "Start Build" ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) -CXX = ${KOKKOS_PATH}/config/nvcc_wrapper +CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper EXE = bytes_and_flops.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -22,7 +22,7 @@ CXXFLAGS = -O3 -g DEPFLAGS = -M LINK = ${CXX} -LINKFLAGS = +LINKFLAGS = OBJ = $(SRC:.cpp=.o) LIB = @@ -34,7 +34,7 @@ build: $(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) -clean: kokkos-clean +clean: kokkos-clean rm -f *.o *.cuda *.host # Compilation rules diff --git a/lib/kokkos/benchmarks/gather/Makefile b/lib/kokkos/benchmarks/gather/Makefile index fd1feab6fa..0ea9fb1dd2 100644 --- a/lib/kokkos/benchmarks/gather/Makefile +++ b/lib/kokkos/benchmarks/gather/Makefile @@ -7,7 +7,7 @@ default: build echo "Start Build" ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) -CXX = ${KOKKOS_PATH}/config/nvcc_wrapper +CXX = ${KOKKOS_PATH}/bin/nvcc_wrapper EXE = gather.cuda KOKKOS_DEVICES = "Cuda,OpenMP" KOKKOS_ARCH = "SNB,Kepler35" @@ -22,7 +22,7 @@ CXXFLAGS = -O3 -g DEPFLAGS = -M LINK = ${CXX} -LINKFLAGS = +LINKFLAGS = OBJ = $(SRC:.cpp=.o) LIB = @@ -35,10 +35,10 @@ build: $(EXE) $(EXE): $(OBJ) $(KOKKOS_LINK_DEPENDS) $(LINK) $(KOKKOS_LDFLAGS) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(KOKKOS_LIBS) $(LIB) -o $(EXE) -clean: kokkos-clean +clean: kokkos-clean rm -f *.o *.cuda *.host # Compilation rules -%.o:%.cpp $(KOKKOS_CPP_DEPENDS) gather_unroll.hpp gather.hpp +%.o:%.cpp $(KOKKOS_CPP_DEPENDS) gather_unroll.hpp gather.hpp $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) $(EXTRA_INC) -c $< diff --git a/lib/kokkos/cmake/KokkosConfig.cmake.in b/lib/kokkos/cmake/KokkosConfig.cmake.in new file mode 100644 index 0000000000..fc099a494c --- /dev/null +++ b/lib/kokkos/cmake/KokkosConfig.cmake.in @@ -0,0 +1,18 @@ +# - Config file for the Kokkos package +# It defines the following variables +# Kokkos_INCLUDE_DIRS - include directories for Kokkos +# Kokkos_LIBRARIES - libraries to link against + +# Compute paths +GET_FILENAME_COMPONENT(Kokkos_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +SET(Kokkos_INCLUDE_DIRS "@CONF_INCLUDE_DIRS@") + +# Our library dependencies (contains definitions for IMPORTED targets) +IF(NOT TARGET kokkos AND NOT Kokkos_BINARY_DIR) + INCLUDE("${Kokkos_CMAKE_DIR}/KokkosTargets.cmake") +ENDIF() + +# These are IMPORTED targets created by KokkosTargets.cmake +SET(Kokkos_LIBRARY_DIRS @INSTALL_LIB_DIR@) +SET(Kokkos_LIBRARIES @Kokkos_LIBRARIES_NAMES@) +SET(Kokkos_TPL_LIBRARIES @KOKKOS_LIBS@) diff --git a/lib/kokkos/cmake/Modules/FindHWLOC.cmake b/lib/kokkos/cmake/Modules/FindHWLOC.cmake new file mode 100644 index 0000000000..273dcb5c8a --- /dev/null +++ b/lib/kokkos/cmake/Modules/FindHWLOC.cmake @@ -0,0 +1,20 @@ +#.rst: +# FindHWLOC +# ---------- +# +# Try to find HWLOC. +# +# The following variables are defined: +# +# HWLOC_FOUND - System has HWLOC +# HWLOC_INCLUDE_DIR - HWLOC include directory +# HWLOC_LIBRARIES - Libraries needed to use HWLOC + +find_path(HWLOC_INCLUDE_DIR hwloc.h) +find_library(HWLOC_LIBRARIES hwloc) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(HWLOC DEFAULT_MSG + HWLOC_INCLUDE_DIR HWLOC_LIBRARIES) + +mark_as_advanced(HWLOC_INCLUDE_DIR HWLOC_LIBRARIES) diff --git a/lib/kokkos/cmake/Modules/FindMemkind.cmake b/lib/kokkos/cmake/Modules/FindMemkind.cmake new file mode 100644 index 0000000000..245fb44c19 --- /dev/null +++ b/lib/kokkos/cmake/Modules/FindMemkind.cmake @@ -0,0 +1,20 @@ +#.rst: +# FindMemkind +# ---------- +# +# Try to find Memkind. +# +# The following variables are defined: +# +# MEMKIND_FOUND - System has Memkind +# MEMKIND_INCLUDE_DIR - Memkind include directory +# MEMKIND_LIBRARIES - Libraries needed to use Memkind + +find_path(MEMKIND_INCLUDE_DIR memkind.h) +find_library(MEMKIND_LIBRARIES memkind) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Memkind DEFAULT_MSG + MEMKIND_INCLUDE_DIR MEMKIND_LIBRARIES) + +mark_as_advanced(MEMKIND_INCLUDE_DIR MEMKIND_LIBRARIES) diff --git a/lib/kokkos/cmake/Modules/FindQthreads.cmake b/lib/kokkos/cmake/Modules/FindQthreads.cmake new file mode 100644 index 0000000000..a254b0e996 --- /dev/null +++ b/lib/kokkos/cmake/Modules/FindQthreads.cmake @@ -0,0 +1,20 @@ +#.rst: +# FindQthreads +# ---------- +# +# Try to find Qthreads. +# +# The following variables are defined: +# +# QTHREADS_FOUND - System has Qthreads +# QTHREADS_INCLUDE_DIR - Qthreads include directory +# QTHREADS_LIBRARIES - Libraries needed to use Qthreads + +find_path(QTHREADS_INCLUDE_DIR qthread.h) +find_library(QTHREADS_LIBRARIES qthread) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Qthreads DEFAULT_MSG + QTHREADS_INCLUDE_DIR QTHREADS_LIBRARIES) + +mark_as_advanced(QTHREADS_INCLUDE_DIR QTHREADS_LIBRARIES) diff --git a/lib/kokkos/cmake/kokkos.cmake b/lib/kokkos/cmake/kokkos.cmake new file mode 100644 index 0000000000..235b7eaba4 --- /dev/null +++ b/lib/kokkos/cmake/kokkos.cmake @@ -0,0 +1,1198 @@ + + +# Set which Kokkos backend to use. +set(KOKKOS_ENABLE_CUDA OFF CACHE BOOL "Use Kokkos CUDA backend") +set(KOKKOS_ENABLE_OPENMP ON CACHE BOOL "Use Kokkos OpenMP backend") +set(KOKKOS_ENABLE_PTHREAD OFF CACHE BOOL "Use Kokkos Pthreads backend") +set(KOKKOS_ENABLE_QTHREADS OFF CACHE BOOL "Use Kokkos Qthreads backend") +set(KOKKOS_ENABLE_SERIAL ON CACHE BOOL "Use Kokkos Serial backend") + +# List of possible host architectures. +list(APPEND KOKKOS_HOST_ARCH_LIST + None # No architecture optimization + AMDAVX # AMD chip + ARMv80 # ARMv8.0 Compatible CPU + ARMv81 # ARMv8.1 Compatible CPU + ARMv8-ThunderX # ARMv8 Cavium ThunderX CPU + SNB # Intel Sandy/Ivy Bridge CPUs + HSW # Intel Haswell CPUs + BDW # Intel Broadwell Xeon E-class CPUs + SKX # Intel Sky Lake Xeon E-class HPC CPUs (AVX512) + KNC # Intel Knights Corner Xeon Phi + KNL # Intel Knights Landing Xeon Phi + BGQ # IBM Blue Gene Q + Power7 # IBM POWER7 CPUs + Power8 # IBM POWER8 CPUs + Power9 # IBM POWER9 CPUs + ) + +# Setting this variable to a value other than "None" can improve host +# performance by turning on architecture specific code. +set(KOKKOS_HOST_ARCH "None" CACHE STRING "Optimize for specific host architecture.") +set_property(CACHE KOKKOS_HOST_ARCH PROPERTY STRINGS ${KOKKOS_HOST_ARCH_LIST}) + +# List of possible GPU architectures. +list(APPEND KOKKOS_GPU_ARCH_LIST + None # No architecture optimization + Kepler # NVIDIA Kepler default (generation CC 3.5) + Kepler30 # NVIDIA Kepler generation CC 3.0 + Kepler32 # NVIDIA Kepler generation CC 3.2 + Kepler35 # NVIDIA Kepler generation CC 3.5 + Kepler37 # NVIDIA Kepler generation CC 3.7 + Maxwell # NVIDIA Maxwell default (generation CC 5.0) + Maxwell50 # NVIDIA Maxwell generation CC 5.0 + Maxwell52 # NVIDIA Maxwell generation CC 5.2 + Maxwell53 # NVIDIA Maxwell generation CC 5.3 + Pascal60 # NVIDIA Pascal generation CC 6.0 + Pascal61 # NVIDIA Pascal generation CC 6.1 + ) + +# Setting this variable to a value other than "None" can improve GPU +# performance by turning on architecture specific code. +set(KOKKOS_GPU_ARCH "None" CACHE STRING "Optimize for specific GPU architecture.") +set_property(CACHE KOKKOS_GPU_ARCH PROPERTY STRINGS ${KOKKOS_GPU_ARCH_LIST}) + +set(KOKKOS_SEPARATE_LIBS OFF CACHE BOOL "OFF = kokkos. ON = kokkoscore, kokkoscontainers, and kokkosalgorithms.") + +# Enable hwloc library. +set(KOKKOS_ENABLE_HWLOC OFF CACHE BOOL "Enable hwloc for better process placement.") +set(KOKKOS_HWLOC_DIR "" CACHE PATH "Location of hwloc library.") + +# Enable memkind library. +set(KOKKOS_ENABLE_MEMKIND OFF CACHE BOOL "Enable memkind.") +set(KOKKOS_MEMKIND_DIR "" CACHE PATH "Location of memkind library.") + +set(KOKKOS_ENABLE_LIBRT OFF CACHE BOOL "Enable librt for more precise timer.") + +# Enable debugging. +set(KOKKOS_DEBUG OFF CACHE BOOL "Enable debugging in Kokkos.") + +# Enable profiling. +set(KOKKOS_ENABLE_PROFILING ON CACHE BOOL "Enable profiling.") + +# Enable aggressive vectorization. +set(KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION OFF CACHE BOOL "Enable aggressive vectorization.") + +# Qthreads options. +set(KOKKOS_QTHREADS_DIR "" CACHE PATH "Location of Qthreads library.") + +# CUDA options. +set(KOKKOS_CUDA_DIR "" CACHE PATH "Location of CUDA library. Defaults to where nvcc installed.") +set(KOKKOS_ENABLE_CUDA_LDG_INTRINSIC OFF CACHE BOOL "Enable CUDA LDG.") +set(KOKKOS_ENABLE_CUDA_UVM OFF CACHE BOOL "Enable CUDA unified virtual memory.") +set(KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE OFF CACHE BOOL "Enable relocatable device code for CUDA.") +set(KOKKOS_ENABLE_CUDA_LAMBDA ON CACHE BOOL "Enable lambdas for CUDA.") + +################################### FUNCTIONS ################################## + +# Sets the following compiler variables that are analogous to the CMAKE_* +# versions. We add the ability to detect NVCC (really nvcc_wrapper). +# KOKKOS_CXX_COMPILER +# KOKKOS_CXX_COMPILER_ID +# KOKKOS_CXX_COMPILER_VERSION +# +# Also verifies the compiler version meets the minimum required by Kokkos. +function(set_kokkos_cxx_compiler) + # Since CMake doesn't recognize the nvcc compiler until 3.8, we use our own + # version of the CMake variables and detect nvcc ourselves. Initially set to + # the CMake variable values. + set(INTERNAL_CXX_COMPILER ${CMAKE_CXX_COMPILER}) + set(INTERNAL_CXX_COMPILER_ID ${CMAKE_CXX_COMPILER_ID}) + set(INTERNAL_CXX_COMPILER_VERSION ${CMAKE_CXX_COMPILER_VERSION}) + + # Check if the compiler is nvcc (which really means nvcc_wrapper). + execute_process(COMMAND ${INTERNAL_CXX_COMPILER} --version + COMMAND grep nvcc + COMMAND wc -l + OUTPUT_VARIABLE INTERNAL_HAVE_COMPILER_NVCC + OUTPUT_STRIP_TRAILING_WHITESPACE) + + string(REGEX REPLACE "^ +" "" + INTERNAL_HAVE_COMPILER_NVCC ${INTERNAL_HAVE_COMPILER_NVCC}) + + if(INTERNAL_HAVE_COMPILER_NVCC) + # Set the compiler id to nvcc. We use the value used by CMake 3.8. + set(INTERNAL_CXX_COMPILER_ID NVIDIA) + + # Set nvcc's compiler version. + execute_process(COMMAND ${INTERNAL_CXX_COMPILER} --version + COMMAND grep release + OUTPUT_VARIABLE INTERNAL_CXX_COMPILER_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + + string(REGEX MATCH "[0-9]+\.[0-9]+\.[0-9]+$" + INTERNAL_CXX_COMPILER_VERSION ${INTERNAL_CXX_COMPILER_VERSION}) + endif() + + # Enforce the minimum compilers supported by Kokkos. + set(KOKKOS_MESSAGE_TEXT "Compiler not supported by Kokkos. Required compiler versions:") + set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n Clang 3.5.2 or higher") + set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n GCC 4.7.2 or higher") + set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n Intel 14.0.4 or higher") + set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n NVCC 7.0.28 or higher") + set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n PGI 17.1 or higher\n") + + if(INTERNAL_CXX_COMPILER_ID STREQUAL Clang) + if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 3.5.2) + message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}") + endif() + elseif(INTERNAL_CXX_COMPILER_ID STREQUAL GNU) + if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 4.7.2) + message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}") + endif() + elseif(INTERNAL_CXX_COMPILER_ID STREQUAL Intel) + if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 14.0.4) + message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}") + endif() + elseif(INTERNAL_CXX_COMPILER_ID STREQUAL NVIDIA) + if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 7.0.28) + message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}") + endif() + elseif(INTERNAL_CXX_COMPILER_ID STREQUAL PGI) + if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 17.1) + message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}") + endif() + endif() + + # Enforce that extensions are turned off for nvcc_wrapper. + if(INTERNAL_CXX_COMPILER_ID STREQUAL NVIDIA) + if(NOT DEFINED CMAKE_CXX_EXTENSIONS OR CMAKE_CXX_EXTENSIONS STREQUAL ON) + message(FATAL_ERROR "NVCC doesn't support C++ extensions. Set CMAKE_CXX_EXTENSIONS to OFF in your CMakeLists.txt.") + endif() + endif() + + if(KOKKOS_ENABLE_CUDA) + # Enforce that the compiler can compile CUDA code. + if(INTERNAL_CXX_COMPILER_ID STREQUAL Clang) + if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 4.0.0) + message(FATAL_ERROR "Compiling CUDA code directly with Clang requires version 4.0.0 or higher.") + endif() + elseif(NOT INTERNAL_CXX_COMPILER_ID STREQUAL NVIDIA) + message(FATAL_ERROR "Invalid compiler for CUDA. The compiler must be nvcc_wrapper or Clang.") + endif() + endif() + + set(KOKKOS_CXX_COMPILER ${INTERNAL_CXX_COMPILER} PARENT_SCOPE) + set(KOKKOS_CXX_COMPILER_ID ${INTERNAL_CXX_COMPILER_ID} PARENT_SCOPE) + set(KOKKOS_CXX_COMPILER_VERSION ${INTERNAL_CXX_COMPILER_VERSION} PARENT_SCOPE) +endfunction() + +# Transitively enforces that the appropriate CXX standard compile flags (C++11 +# or above) are added to targets that use the Kokkos library. Compile features +# are used if possible. Otherwise, the appropriate flags are added to +# KOKKOS_CXX_FLAGS. Values set by the user to CMAKE_CXX_STANDARD and +# CMAKE_CXX_EXTENSIONS are honored. +function(set_kokkos_compiler_standard) + # The following table lists the versions of CMake that supports CXX_STANDARD + # and the CXX compile features for different compilers. The versions are + # based on CMake documentation, looking at CMake code, and verifying by + # testing with specific CMake versions. + # + # COMPILER CXX_STANDARD Compile Features + # --------------------------------------------------------------- + # Clang 3.1 3.1 + # GNU 3.1 3.2 + # AppleClang 3.2 3.2 + # Intel 3.6 3.6 + # Cray No No + # PGI No No + # XL No No + # + # For compiling CUDA code using nvcc_wrapper, we will use the host compiler's + # flags for turning on C++11. Since for compiler ID and versioning purposes + # CMake recognizes the host compiler when calling nvcc_wrapper, this just + # works. Both NVCC and nvcc_wrapper only recognize '-std=c++11' which means + # that we can only use host compilers for CUDA builds that use those flags. + # It also means that extensions (gnu++11) can't be turned on for CUDA builds. + + # Check if we can use compile features. + if(NOT KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA) + if(CMAKE_CXX_COMPILER_ID STREQUAL Clang) + if(NOT CMAKE_VERSION VERSION_LESS 3.1) + set(INTERNAL_USE_COMPILE_FEATURES ON) + endif() + elseif(CMAKE_CXX_COMPILER_ID STREQUAL AppleClang OR CMAKE_CXX_COMPILER_ID STREQUAL GNU) + if(NOT CMAKE_VERSION VERSION_LESS 3.2) + set(INTERNAL_USE_COMPILE_FEATURES ON) + endif() + elseif(CMAKE_CXX_COMPILER_ID STREQUAL Intel) + if(NOT CMAKE_VERSION VERSION_LESS 3.6) + set(INTERNAL_USE_COMPILE_FEATURES ON) + endif() + endif() + endif() + + if(INTERNAL_USE_COMPILE_FEATURES) + # Use the compile features aspect of CMake to transitively cause C++ flags + # to populate to user code. + + # I'm using a hack by requiring features that I know force the lowest version + # of the compilers we want to support. Clang 3.3 and later support all of + # the C++11 standard. With CMake 3.8 and higher, we could switch to using + # cxx_std_11. + set(KOKKOS_CXX11_FEATURES + cxx_nonstatic_member_init # Forces GCC 4.7 or later and Intel 14.0 or later. + PARENT_SCOPE + ) + else() + # CXX compile features are not yet implemented for this combination of + # compiler and version of CMake. + + if(CMAKE_CXX_COMPILER_ID STREQUAL AppleClang) + # Versions of CMAKE before 3.2 don't support CXX_STANDARD or C++ compile + # features for the AppleClang compiler. Set compiler flags transitively + # here such that they trickle down to a call to target_compile_options(). + + # The following two blocks of code were copied from + # /Modules/Compiler/AppleClang-CXX.cmake from CMake 3.7.2 and then + # modified. + if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.0) + set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "-std=c++11") + set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11") + endif() + + if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.1) + set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-std=c++14") + set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14") + elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1) + # AppleClang 5.0 knows this flag, but does not set a __cplusplus macro + # greater than 201103L. + set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-std=c++1y") + set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y") + endif() + elseif(CMAKE_CXX_COMPILER_ID STREQUAL Intel) + # Versions of CMAKE before 3.6 don't support CXX_STANDARD or C++ compile + # features for the Intel compiler. Set compiler flags transitively here + # such that they trickle down to a call to target_compile_options(). + + # The following three blocks of code were copied from + # /Modules/Compiler/Intel-CXX.cmake from CMake 3.7.2 and then modified. + if("x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC") + set(_std -Qstd) + set(_ext c++) + else() + set(_std -std) + set(_ext gnu++) + endif() + + if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0.2) + set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "${_std}=c++14") + # TODO: There is no gnu++14 value supported; figure out what to do. + set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "${_std}=c++14") + elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0.0) + set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "${_std}=c++1y") + # TODO: There is no gnu++14 value supported; figure out what to do. + set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "${_std}=c++1y") + endif() + + if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.0) + set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "${_std}=c++11") + set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "${_std}=${_ext}11") + elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.1) + set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "${_std}=c++0x") + set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "${_std}=${_ext}0x") + endif() + elseif(CMAKE_CXX_COMPILER_ID STREQUAL Cray) + # CMAKE doesn't support CXX_STANDARD or C++ compile features for the Cray + # compiler. Set compiler options transitively here such that they trickle + # down to a call to target_compile_options(). + set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "-hstd=c++11") + set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "-hstd=c++11") + set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-hstd=c++11") + set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-hstd=c++11") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL PGI) + # CMAKE doesn't support CXX_STANDARD or C++ compile features for the PGI + # compiler. Set compiler options transitively here such that they trickle + # down to a call to target_compile_options(). + set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "--c++11") + set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "--c++11") + set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "--c++11") + set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "--c++11") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL XL) + # CMAKE doesn't support CXX_STANDARD or C++ compile features for the XL + # compiler. Set compiler options transitively here such that they trickle + # down to a call to target_compile_options(). + set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "-std=c++11") + set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "-std=c++11") + set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-std=c++11") + set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-std=c++11") + else() + # Assume GNU. CMAKE_CXX_STANDARD is handled correctly by CMake 3.1 and + # above for this compiler. If the user explicitly requests a C++ + # standard, CMake takes care of it. If not, transitively require C++11. + if(NOT CMAKE_CXX_STANDARD) + set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION ${CMAKE_CXX11_STANDARD_COMPILE_OPTION}) + set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION ${CMAKE_CXX11_EXTENSION_COMPILE_OPTION}) + endif() + endif() + + # Set the C++ standard info for Kokkos respecting user set values for + # CMAKE_CXX_STANDARD and CMAKE_CXX_EXTENSIONS. + if(CMAKE_CXX_STANDARD EQUAL 14) + if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL OFF) + set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX14_STANDARD_COMPILE_OPTION}) + else() + set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX14_EXTENSION_COMPILE_OPTION}) + endif() + elseif(CMAKE_CXX_STANDARD EQUAL 11) + if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL OFF) + set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_STANDARD_COMPILE_OPTION}) + else() + set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_EXTENSION_COMPILE_OPTION}) + endif() + else() + # The user didn't explicitly request a standard, transitively require + # C++11 respecting CMAKE_CXX_EXTENSIONS. + if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL OFF) + set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_STANDARD_COMPILE_OPTION}) + else() + set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_EXTENSION_COMPILE_OPTION}) + endif() + endif() + + set(KOKKOS_CXX_FLAGS ${INTERNAL_CXX_FLAGS} PARENT_SCOPE) + endif() +endfunction() + +########################## COMPILER AND FEATURE CHECKS ######################### + +# TODO: We are assuming that nvcc_wrapper is using g++ as the host compiler. +# Should we allow the user the option to change this? The host compiler +# for nvcc_wrapper can be set via the NVCC_WRAPPER_DEFAULT_COMPILER +# environment variable or by passing a different host compiler with the +# -ccbin flag. + +# TODO: Fully add CUDA support for Clang. +set_kokkos_cxx_compiler() + +set_kokkos_compiler_standard() + +######################### INITIALIZE INTERNAL VARIABLES ######################## + +# Add Kokkos' modules to CMake's module path. +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${Kokkos_SOURCE_DIR}/cmake/Modules/") + +# Start with all global variables set to false. This guarantees correct +# results with changes and multiple configures. +set(KOKKOS_HAVE_CUDA OFF CACHE INTERNAL "") +set(KOKKOS_USE_CUDA_UVM OFF CACHE INTERNAL "") +set(KOKKOS_HAVE_CUDA_RDC OFF CACHE INTERNAL "") +set(KOKKOS_HAVE_CUDA_LAMBDA OFF CACHE INTERNAL "") +set(KOKKOS_CUDA_CLANG_WORKAROUND OFF CACHE INTERNAL "") +set(KOKKOS_HAVE_OPENMP OFF CACHE INTERNAL "") +set(KOKKOS_HAVE_PTHREAD OFF CACHE INTERNAL "") +set(KOKKOS_HAVE_QTHREADS OFF CACHE INTERNAL "") +set(KOKKOS_HAVE_SERIAL OFF CACHE INTERNAL "") +set(KOKKOS_HAVE_HWLOC OFF CACHE INTERNAL "") +set(KOKKOS_ENABLE_HBWSPACE OFF CACHE INTERNAL "") +set(KOKKOS_HAVE_DEBUG OFF CACHE INTERNAL "") +set(KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK OFF CACHE INTERNAL "") +set(KOKKOS_ENABLE_ISA_X86_64 OFF CACHE INTERNAL "") +set(KOKKOS_ENABLE_ISA_KNC OFF CACHE INTERNAL "") +set(KOKKOS_ENABLE_ISA_POWERPCLE OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_ARMV80 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_ARMV81 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_ARMV8_THUNDERX OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_AVX OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_AVX2 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_AVX512MIC OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_AVX512XEON OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_KNC OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_POWER8 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_POWER9 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_KEPLER OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_KEPLER30 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_KEPLER32 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_KEPLER35 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_KEPLER37 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_MAXWELL OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_MAXWELL50 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_MAXWELL52 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_MAXWELL53 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_PASCAL OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_PASCAL60 OFF CACHE INTERNAL "") +set(KOKKOS_ARCH_PASCAL61 OFF CACHE INTERNAL "") + +############################## SET BACKEND OPTIONS ############################# + +# Make sure at least one backend is selected. +if(NOT KOKKOS_ENABLE_CUDA AND NOT KOKKOS_ENABLE_OPENMP AND NOT KOKKOS_ENABLE_PTHREAD AND NOT KOKKOS_ENABLE_QTHREADS AND NOT KOKKOS_ENABLE_SERIAL) + message(FATAL_ERROR "Must set one of KOKKOS_ENABLE_CUDA, KOKKOS_ENABLE_OPENMP, KOKKOS_ENABLE_PTHREAD, KOKKOS_ENABLE_QTHREADS, or KOKKOS_ENABLE_SERIAL") +endif() + +# Only one of OpenMP, Pthreads, and Qthreads can be set. +set(KOKKOS_MESSAGE_TEXT "Only one of KOKKOS_ENABLE_OPENMP, KOKKOS_ENABLE_PTHREAD, and KOKKOS_ENABLE_QTHREADS can be selected") +if(KOKKOS_ENABLE_OPENMP AND KOKKOS_ENABLE_PTHREAD) + message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}") +elseif(KOKKOS_ENABLE_OPENMP AND KOKKOS_ENABLE_QTHREADS) + message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}") +elseif(KOKKOS_ENABLE_PTHREAD AND KOKKOS_ENABLE_QTHREADS) + message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}") +endif() + +# Get source files. +file(GLOB KOKKOS_CORE_SRCS core/src/impl/*.cpp) +file(GLOB KOKKOS_CONTAINERS_SRCS containers/src/impl/*.cpp) + +# Set options if using CUDA backend. +if(KOKKOS_ENABLE_CUDA) + if(KOKKOS_CUDA_DIR) + set(CUDA_TOOLKIT_ROOT_DIR ${KOKKOS_CUDA_DIR}) + endif() + + find_package(CUDA) + + if(NOT CUDA_FOUND) + if(KOKKOS_CUDA_DIR) + message(FATAL_ERROR "Couldn't find CUDA in default locations, and KOKKOS_CUDA_DIR points to an invalid installation.") + else() + message(FATAL_ERROR "Couldn't find CUDA in default locations. Set KOKKOS_CUDA_DIR.") + endif() + endif() + + list(APPEND KOKKOS_INCLUDE_DIRS ${CUDA_INCLUDE_DIRS}) + list(APPEND KOKKOS_LD_FLAGS -L${CUDA_TOOLKIT_ROOT_DIR}/lib64) + list(APPEND KOKKOS_LIBS cudart cuda) + + set(KOKKOS_HAVE_CUDA ON CACHE INTERNAL "") + file(GLOB KOKKOS_CUDA_SRCS core/src/Cuda/*.cpp) + list(APPEND KOKKOS_CORE_SRCS ${KOKKOS_CUDA_SRCS}) + + # Set CUDA UVM if requested. + if(KOKKOS_ENABLE_CUDA_UVM) + set(KOKKOS_USE_CUDA_UVM ON CACHE INTERNAL "") + endif() + + # Set CUDA relocatable device code if requested. + if(KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE) + set(KOKKOS_HAVE_CUDA_RDC ON CACHE INTERNAL "") + list(APPEND KOKKOS_CXX_FLAGS --relocatable-device-code=true) + list(APPEND KOKKOS_LD_FLAGS --relocatable-device-code=true) + endif() + + # Set CUDA lambda if requested. + if(KOKKOS_ENABLE_CUDA_LAMBDA) + set(KOKKOS_HAVE_CUDA_LAMBDA ON CACHE INTERNAL "") + + if(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA) + if(KOKKOS_CXX_COMPILER_VERSION VERSION_LESS 7.5) + message(FATAL_ERROR "CUDA lambda support requires CUDA 7.5 or higher. Disable it or use a 7.5 or later compiler.") + else() + list(APPEND KOKKOS_CXX_FLAGS -expt-extended-lambda) + endif() + endif() + endif() + + # Set Clang specific options. + if(KOKKOS_CXX_COMPILER_ID STREQUAL Clang) + list(APPEND KOKKOS_CXX_FLAGS --cuda-path=${CUDA_TOOLKIT_ROOT_DIR}) + + set(KOKKOS_CUDA_CLANG_WORKAROUND ON CACHE INTERNAL "") + + # Force CUDA_LDG_INTRINSIC on when using Clang. + set(KOKKOS_ENABLE_CUDA_LDG_INTRINSIC ON CACHE BOOL "Enable CUDA LDG." FORCE) + endif() +endif() + +# Set options if using OpenMP backend. +if(KOKKOS_ENABLE_OPENMP) + find_package(OpenMP REQUIRED) + + if(OPENMP_FOUND) + if(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA) + list(APPEND KOKKOS_CXX_FLAGS -Xcompiler) + endif() + + list(APPEND KOKKOS_CXX_FLAGS ${OpenMP_CXX_FLAGS}) + list(APPEND KOKKOS_LD_FLAGS ${OpenMP_CXX_FLAGS}) + endif() + + set(KOKKOS_HAVE_OPENMP ON CACHE INTERNAL "") + file(GLOB KOKKOS_OPENMP_SRCS core/src/OpenMP/*.cpp) + list(APPEND KOKKOS_CORE_SRCS ${KOKKOS_OPENMP_SRCS}) +endif() + +# Set options if using Pthreads backend. +if(KOKKOS_ENABLE_PTHREAD) + find_package(Threads REQUIRED) + + list(APPEND KOKKOS_LIBS Threads::Threads) + + set(KOKKOS_HAVE_PTHREAD ON CACHE INTERNAL "") + file(GLOB KOKKOS_PTHREAD_SRCS core/src/Threads/*.cpp) + list(APPEND KOKKOS_CORE_SRCS ${KOKKOS_PTHREAD_SRCS}) +endif() + +# Set options if using Qthreads backend. +if(KOKKOS_ENABLE_QTHREADS) + if(KOKKOS_QTHREADS_DIR) + list(APPEND CMAKE_PREFIX_PATH ${KOKKOS_QTHREADS_DIR}) + endif() + + find_package(Qthreads) + + if(NOT QTHREADS_FOUND) + if(KOKKOS_QTHREADS_DIR) + message(FATAL_ERROR "Couldn't find Qthreads in default locations, and KOKKOS_QTHREADS_DIR points to an invalid installation.") + else() + message(FATAL_ERROR "Couldn't find Qthreads in default locations. Set KOKKOS_QTHREADS_DIR.") + endif() + endif() + + list(APPEND KOKKOS_INCLUDE_DIRS ${QTHREADS_INCLUDE_DIR}) + list(APPEND KOKKOS_LIBS ${QTHREADS_LIBRARIES}) + + set(KOKKOS_HAVE_QTHREADS ON CACHE INTERNAL "") + file(GLOB KOKKOS_QTHREADS_SRCS core/src/Threads/*.cpp) + list(APPEND KOKKOS_CORE_SRCS ${KOKKOS_QTHREADS_SRCS}) + + if(KOKKOS_QTHREADS_DIR) + list(REMOVE_AT CMAKE_PREFIX_PATH -1) + endif() +endif() + +# Set options if using Serial backend. +if(KOKKOS_ENABLE_SERIAL) + set(KOKKOS_HAVE_SERIAL ON CACHE INTERNAL "") +else() + # Remove serial source files. + list(REMOVE_ITEM KOKKOS_CORE_SRCS + "${Kokkos_SOURCE_DIR}/core/src/impl/Kokkos_Serial.cpp" + "${Kokkos_SOURCE_DIR}/core/src/impl/Kokkos_Serial_Task.cpp") +endif() + +########################### SET ARCHITECTURE OPTIONS ########################### + +# Make sure the host architecture option is valid. Need to verify in case user +# passes the option via the command line. +list(FIND KOKKOS_HOST_ARCH_LIST "${KOKKOS_HOST_ARCH}" KOKKOS_VALID_HOST_ARCH) +if(KOKKOS_VALID_HOST_ARCH EQUAL -1) + set(KOKKOS_ARCH_TEXT "\n ${KOKKOS_HOST_ARCH_LIST}") + string(REPLACE ";" "\n " KOKKOS_ARCH_TEXT "${KOKKOS_ARCH_TEXT}") + set(KOKKOS_MESSAGE_TEXT "Invalid architecture for KOKKOS_HOST_ARCH: '${KOKKOS_HOST_ARCH}'") + set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n Choices:${KOKKOS_ARCH_TEXT}\n") + message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}") +endif() + +# Make sure the GPU architecture option is valid. Need to verify in case user +# passes the option via the command line. +list(FIND KOKKOS_GPU_ARCH_LIST "${KOKKOS_GPU_ARCH}" KOKKOS_VALID_GPU_ARCH) +if(KOKKOS_VALID_GPU_ARCH EQUAL -1) + set(KOKKOS_ARCH_TEXT "\n ${KOKKOS_GPU_ARCH_LIST}") + string(REPLACE ";" "\n " KOKKOS_ARCH_TEXT "${KOKKOS_ARCH_TEXT}") + set(KOKKOS_MESSAGE_TEXT "Invalid architecture for KOKKOS_GPU_ARCH: '${KOKKOS_GPU_ARCH}'") + set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n Choices:${KOKKOS_ARCH_TEXT}\n") + message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}") +endif() + +# Decide what ISA level we are able to support. +if(KOKKOS_HOST_ARCH STREQUAL SNB OR KOKKOS_HOST_ARCH STREQUAL HSW OR KOKKOS_HOST_ARCH STREQUAL BDW OR + KOKKOS_HOST_ARCH STREQUAL SKX OR KOKKOS_HOST_ARCH STREQUAL KNL) + set(KOKKOS_ENABLE_ISA_X86_64 ON CACHE INTERNAL "") +endif() + +if(KOKKOS_HOST_ARCH STREQUAL KNC) + set(KOKKOS_ENABLE_ISA_KNC ON CACHE INTERNAL "") +endif() + +if(KOKKOS_HOST_ARCH STREQUAL Power8 OR KOKKOS_HOST_ARCH STREQUAL Power9) + set(KOKKOS_ENABLE_ISA_POWERPCLE ON CACHE INTERNAL "") +endif() + +# Add host architecture options. +if(KOKKOS_HOST_ARCH STREQUAL ARMv80) + set(KOKKOS_ARCH_ARMV80 ON CACHE INTERNAL "") + + if(KOKKOS_CXX_COMPILER_ID STREQUAL Cray) + elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI) + else() + list(APPEND KOKKOS_CXX_FLAGS -march=armv8-a) + list(APPEND KOKKOS_LD_FLAGS -march=armv8-a) + endif() +elseif(KOKKOS_HOST_ARCH STREQUAL ARMv81) + set(KOKKOS_ARCH_ARMV81 ON CACHE INTERNAL "") + + if(KOKKOS_CXX_COMPILER_ID STREQUAL Cray) + elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI) + else() + list(APPEND KOKKOS_CXX_FLAGS -march=armv8.1-a) + list(APPEND KOKKOS_LD_FLAGS -march=armv8.1-a) + endif() +elseif(KOKKOS_HOST_ARCH STREQUAL ARMv8-ThunderX) + set(KOKKOS_ARCH_ARMV80 ON CACHE INTERNAL "") + set(KOKKOS_ARCH_ARMV8_THUNDERX ON CACHE INTERNAL "") + + if(KOKKOS_CXX_COMPILER_ID STREQUAL Cray) + elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI) + else() + list(APPEND KOKKOS_CXX_FLAGS -march=armv8-a -mtune=thunderx) + list(APPEND KOKKOS_LD_FLAGS -march=armv8-a -mtune=thunderx) + endif() +elseif(KOKKOS_HOST_ARCH STREQUAL SNB OR KOKKOS_HOST_ARCH STREQUAL AMDAVX) + set(KOKKOS_ARCH_AVX ON CACHE INTERNAL "") + + if(KOKKOS_CXX_COMPILER_ID STREQUAL Intel) + list(APPEND KOKKOS_CXX_FLAGS -mavx) + list(APPEND KOKKOS_LD_FLAGS -mavx) + elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Cray) + elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI) + list(APPEND KOKKOS_CXX_FLAGS -tp=sandybridge) + list(APPEND KOKKOS_LD_FLAGS -tp=sandybridge) + else() + list(APPEND KOKKOS_CXX_FLAGS -mavx) + list(APPEND KOKKOS_LD_FLAGS -mavx) + endif() +elseif(KOKKOS_HOST_ARCH STREQUAL HSW OR KOKKOS_HOST_ARCH STREQUAL BDW) + set(KOKKOS_ARCH_AVX2 ON CACHE INTERNAL "") + + if(KOKKOS_CXX_COMPILER_ID STREQUAL Intel) + list(APPEND KOKKOS_CXX_FLAGS -xCORE-AVX2) + list(APPEND KOKKOS_LD_FLAGS -xCORE-AVX2) + elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Cray) + elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI) + list(APPEND KOKKOS_CXX_FLAGS -tp=haswell) + list(APPEND KOKKOS_LD_FLAGS -tp=haswell) + else() + list(APPEND KOKKOS_CXX_FLAGS -march=core-avx2 -mtune=core-avx2) + list(APPEND KOKKOS_LD_FLAGS -march=core-avx2 -mtune=core-avx2) + endif() +elseif(KOKKOS_HOST_ARCH STREQUAL KNL) + set(KOKKOS_ARCH_AVX512MIC ON CACHE INTERNAL "") + + if(KOKKOS_CXX_COMPILER_ID STREQUAL Intel) + list(APPEND KOKKOS_CXX_FLAGS -xMIC-AVX512) + list(APPEND KOKKOS_LD_FLAGS -xMIC-AVX512) + elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Cray) + elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI) + else() + list(APPEND KOKKOS_CXX_FLAGS -march=knl) + list(APPEND KOKKOS_LD_FLAGS -march=knl) + endif() +elseif(KOKKOS_HOST_ARCH STREQUAL SKX) + set(KOKKOS_ARCH_AVX512XEON ON CACHE INTERNAL "") + + if(KOKKOS_CXX_COMPILER_ID STREQUAL Intel) + list(APPEND KOKKOS_CXX_FLAGS -xCORE-AVX512) + list(APPEND KOKKOS_LD_FLAGS -xCORE-AVX512) + elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Cray) + elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI) + else() + list(APPEND KOKKOS_CXX_FLAGS -march=skylake-avx512) + list(APPEND KOKKOS_LD_FLAGS -march=skylake-avx512) + endif() +elseif(KOKKOS_HOST_ARCH STREQUAL KNC) + set(KOKKOS_ARCH_KNC ON CACHE INTERNAL "") + list(APPEND KOKKOS_CXX_FLAGS -mmic) + list(APPEND KOKKOS_LD_FLAGS -mmic) +elseif(KOKKOS_HOST_ARCH STREQUAL Power8) + set(KOKKOS_ARCH_POWER8 ON CACHE INTERNAL "") + + if(KOKKOS_CXX_COMPILER_ID STREQUAL PGI) + else() + list(APPEND KOKKOS_CXX_FLAGS -mcpu=power8 -mtune=power8) + list(APPEND KOKKOS_LD_FLAGS -mcpu=power8 -mtune=power8) + endif() +elseif(KOKKOS_HOST_ARCH STREQUAL Power9) + set(KOKKOS_ARCH_POWER9 ON CACHE INTERNAL "") + + if(KOKKOS_CXX_COMPILER_ID STREQUAL PGI) + else() + list(APPEND KOKKOS_CXX_FLAGS -mcpu=power9 -mtune=power9) + list(APPEND KOKKOS_LD_FLAGS -mcpu=power9 -mtune=power9) + endif() +endif() + +# Add GPU architecture options. +if(KOKKOS_ENABLE_CUDA) + if(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA) + set(KOKKOS_GPU_ARCH_FLAG -arch) + elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Clang) + list(APPEND KOKKOS_CXX_FLAGS -x cuda) + set(KOKKOS_GPU_ARCH_FLAG --cuda-gpu-arch) + endif() + + if(KOKKOS_GPU_ARCH STREQUAL Kepler30) + set(KOKKOS_ARCH_KEPLER ON CACHE INTERNAL "") + set(KOKKOS_ARCH_KEPLER30 ON CACHE INTERNAL "") + set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_30) + elseif(KOKKOS_GPU_ARCH STREQUAL Kepler32) + set(KOKKOS_ARCH_KEPLER ON CACHE INTERNAL "") + set(KOKKOS_ARCH_KEPLER32 ON CACHE INTERNAL "") + set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_32) + elseif(KOKKOS_GPU_ARCH STREQUAL Kepler35 OR KOKKOS_GPU_ARCH STREQUAL Kepler) + set(KOKKOS_ARCH_KEPLER ON CACHE INTERNAL "") + set(KOKKOS_ARCH_KEPLER35 ON CACHE INTERNAL "") + set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_35) + elseif(KOKKOS_GPU_ARCH STREQUAL Kepler37) + set(KOKKOS_ARCH_KEPLER ON CACHE INTERNAL "") + set(KOKKOS_ARCH_KEPLER37 ON CACHE INTERNAL "") + set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_37) + elseif(KOKKOS_GPU_ARCH STREQUAL Maxwell50 OR KOKKOS_GPU_ARCH STREQUAL Maxwell) + set(KOKKOS_ARCH_MAXWELL ON CACHE INTERNAL "") + set(KOKKOS_ARCH_MAXWELL50 ON CACHE INTERNAL "") + set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_50) + elseif(KOKKOS_GPU_ARCH STREQUAL Maxwell52) + set(KOKKOS_ARCH_MAXWELL ON CACHE INTERNAL "") + set(KOKKOS_ARCH_MAXWELL52 ON CACHE INTERNAL "") + set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_52) + elseif(KOKKOS_GPU_ARCH STREQUAL Maxwell53) + set(KOKKOS_ARCH_MAXWELL ON CACHE INTERNAL "") + set(KOKKOS_ARCH_MAXWELL53 ON CACHE INTERNAL "") + set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_53) + elseif(KOKKOS_GPU_ARCH STREQUAL Pascal60) + set(KOKKOS_ARCH_PASCAL ON CACHE INTERNAL "") + set(KOKKOS_ARCH_PASCAL60 ON CACHE INTERNAL "") + set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_60) + elseif(KOKKOS_GPU_ARCH STREQUAL Pascal61) + set(KOKKOS_ARCH_PASCAL ON CACHE INTERNAL "") + set(KOKKOS_ARCH_PASCAL61 ON CACHE INTERNAL "") + set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_61) + endif() + + if(NOT KOKKOS_GPU_ARCH STREQUAL None) + list(APPEND KOKKOS_CXX_FLAGS ${KOKKOS_GPU_ARCH_FLAG}) + + if(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA) + list(APPEND KOKKOS_LD_FLAGS ${KOKKOS_GPU_ARCH_FLAG}) + endif() + endif() +endif() + +############################### SET OTHER OPTIONS ############################## + +# Set options if using hwloc. +if(KOKKOS_ENABLE_HWLOC) + if(KOKKOS_HWLOC_DIR) + list(APPEND CMAKE_PREFIX_PATH ${KOKKOS_HWLOC_DIR}) + endif() + + find_package(HWLOC) + + if(NOT HWLOC_FOUND) + if(KOKKOS_HWLOC_DIR) + message(FATAL_ERROR "Couldn't find HWLOC in default locations, and KOKKOS_HWLOC_DIR points to an invalid installation.") + else() + message(FATAL_ERROR "Couldn't find HWLOC in default locations. Set KOKKOS_HWLOC_DIR.") + endif() + endif() + + list(APPEND KOKKOS_INCLUDE_DIRS ${HWLOC_INCLUDE_DIR}) + list(APPEND KOKKOS_LIBS ${HWLOC_LIBRARIES}) + + set(KOKKOS_HAVE_HWLOC ON CACHE INTERNAL "") + + if(KOKKOS_HWLOC_DIR) + list(REMOVE_AT CMAKE_PREFIX_PATH -1) + endif() +endif() + +# Set options if using memkind. +if(KOKKOS_ENABLE_MEMKIND) + if(KOKKOS_MEMKIND_DIR) + list(APPEND CMAKE_PREFIX_PATH ${KOKKOS_MEMKIND_DIR}) + endif() + + find_package(Memkind) + + if(NOT MEMKIND_FOUND) + if(KOKKOS_MEMKIND_DIR) + message(FATAL_ERROR "Couldn't find Memkind in default locations, and KOKKOS_MEMKIND_DIR points to an invalid installation.") + else() + message(FATAL_ERROR "Couldn't find Memkind in default locations. Set KOKKOS_MEMKIND_DIR.") + endif() + endif() + + set(KOKKOS_ENABLE_HBWSPACE ON CACHE INTERNAL "") + list(APPEND KOKKOS_INCLUDE_DIRS ${MEMKIND_INCLUDE_DIR}) + list(APPEND KOKKOS_LIBS ${MEMKIND_LIBRARIES}) + + if(KOKKOS_MEMKIND_DIR) + list(REMOVE_AT CMAKE_PREFIX_PATH -1) + endif() +else() + # Remove HBW source file. + list(REMOVE_ITEM KOKKOS_CORE_SRCS + "${Kokkos_SOURCE_DIR}/core/src/impl/Kokkos_HBWSpace.cpp") +endif() + +# Set options if using librt. +if(KOKKOS_ENABLE_LIBRT) + list(APPEND KOKKOS_LIBS rt) +endif() + +# Set debugging if requested. +if(KOKKOS_DEBUG) + set(KOKKOS_HAVE_DEBUG ON CACHE INTERNAL "") + set(KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK ON CACHE INTERNAL "") + + if(KOKKOS_CXX_COVIDIA) + list(APPEND KOKKOS_CXX_FLAGS -lineinfo) + endif() + + list(APPEND KOKKOS_CXX_FLAGS -g) + list(APPEND KOKKOS_LD_FLAGS -g) +endif() + +# Set profiling if requested. +if(KOKKOS_ENABLE_PROFILING) + list(APPEND KOKKOS_LIBS dl) +else() + # Remove profiling source file. + list(REMOVE_ITEM KOKKOS_CORE_SRCS + "${Kokkos_SOURCE_DIR}/core/src/impl/Kokkos_Profiling_Interface.cpp") +endif() + +# Use GCC toolchain with Clang. +if(KOKKOS_CXX_COMPILER_ID STREQUAL Clang AND NOT APPLE) + find_program(KOKKOS_GCC_PATH g++) + if(NOT KOKKOS_GCC_PATH) + message(FATAL_ERROR "Can't find GCC path to get toolchain for Clang.") + endif() + string(REPLACE "/bin/g++" "" KOKKOS_GCC_PATH ${KOKKOS_GCC_PATH}) + + list(APPEND KOKKOS_CXX_FLAGS --gcc-toolchain=${KOKKOS_GCC_PATH}) + list(APPEND KOKKOS_LD_FLAGS --gcc-toolchain=${KOKKOS_GCC_PATH}) +endif() + +############################ Detect if submodule ############################### +# +# With thanks to StackOverflow: +# http://stackoverflow.com/questions/25199677/how-to-detect-if-current-scope-has-a-parent-in-cmake +# +get_directory_property(HAS_PARENT PARENT_DIRECTORY) +if(HAS_PARENT) + message(STATUS "Submodule build") + SET(KOKKOS_HEADER_DIR "include/kokkos") +else() + message(STATUS "Standalone build") + SET(KOKKOS_HEADER_DIR "include") +endif() + +############################ PRINT CONFIGURE STATUS ############################ + +message(STATUS "") +message(STATUS "****************** Kokkos Settings ******************") +message(STATUS "Execution Spaces") + +if(KOKKOS_ENABLE_CUDA) + message(STATUS " Device Parallel: Cuda") +else() + message(STATUS " Device Parallel: None") +endif() + +if(KOKKOS_ENABLE_OPENMP) + message(STATUS " Host Parallel: OpenMP") +elseif(KOKKOS_ENABLE_PTHREAD) + message(STATUS " Host Parallel: Pthread") +elseif(KOKKOS_ENABLE_QTHREADS) + message(STATUS " Host Parallel: Qthreads") +else() + message(STATUS " Host Parallel: None") +endif() + +if(KOKKOS_ENABLE_SERIAL) + message(STATUS " Host Serial: Serial") +else() + message(STATUS " Host Serial: None") +endif() + +message(STATUS "") +message(STATUS "Architectures") +message(STATUS " Host Architecture: ${KOKKOS_HOST_ARCH}") +message(STATUS " Device Architecture: ${KOKKOS_GPU_ARCH}") + +message(STATUS "") +message(STATUS "Enabled options") + +if(KOKKOS_SEPARATE_LIBS) + message(STATUS " KOKKOS_SEPARATE_LIBS") +endif() + +if(KOKKOS_ENABLE_HWLOC) + message(STATUS " KOKKOS_ENABLE_HWLOC") +endif() + +if(KOKKOS_ENABLE_MEMKIND) + message(STATUS " KOKKOS_ENABLE_MEMKIND") +endif() + +if(KOKKOS_DEBUG) + message(STATUS " KOKKOS_DEBUG") +endif() + +if(KOKKOS_ENABLE_PROFILING) + message(STATUS " KOKKOS_ENABLE_PROFILING") +endif() + +if(KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION) + message(STATUS " KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION") +endif() + +if(KOKKOS_ENABLE_CUDA) + if(KOKKOS_ENABLE_CUDA_LDG_INTRINSIC) + message(STATUS " KOKKOS_ENABLE_CUDA_LDG_INTRINSIC") + endif() + + if(KOKKOS_ENABLE_CUDA_UVM) + message(STATUS " KOKKOS_ENABLE_CUDA_UVM") + endif() + + if(KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE) + message(STATUS " KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE") + endif() + + if(KOKKOS_ENABLE_CUDA_LAMBDA) + message(STATUS " KOKKOS_ENABLE_CUDA_LAMBDA") + endif() + + if(KOKKOS_CUDA_DIR) + message(STATUS " KOKKOS_CUDA_DIR: ${KOKKOS_CUDA_DIR}") + endif() +endif() + +if(KOKKOS_QTHREADS_DIR) + message(STATUS " KOKKOS_QTHREADS_DIR: ${KOKKOS_QTHREADS_DIR}") +endif() + +if(KOKKOS_HWLOC_DIR) + message(STATUS " KOKKOS_HWLOC_DIR: ${KOKKOS_HWLOC_DIR}") +endif() + +if(KOKKOS_MEMKIND_DIR) + message(STATUS " KOKKOS_MEMKIND_DIR: ${KOKKOS_MEMKIND_DIR}") +endif() + +message(STATUS "*****************************************************") +message(STATUS "") + +################################ SET UP PROJECT ################################ + +configure_file( + ${Kokkos_SOURCE_DIR}/core/cmake/KokkosCore_config.h.in + ${Kokkos_BINARY_DIR}/KokkosCore_config.h +) + +SET(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries") +SET(INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables") +SET(INSTALL_INCLUDE_DIR ${KOKKOS_HEADER_DIR} CACHE PATH + "Installation directory for header files") +IF(WIN32 AND NOT CYGWIN) + SET(DEF_INSTALL_CMAKE_DIR CMake) +ELSE() + SET(DEF_INSTALL_CMAKE_DIR lib/CMake/Kokkos) +ENDIF() + +SET(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH + "Installation directory for CMake files") + +# Make relative paths absolute (needed later on) +FOREACH(p LIB BIN INCLUDE CMAKE) + SET(var INSTALL_${p}_DIR) + IF(NOT IS_ABSOLUTE "${${var}}") + SET(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}") + ENDIF() +ENDFOREACH() + +# set up include-directories +SET (Kokkos_INCLUDE_DIRS + ${Kokkos_SOURCE_DIR}/core/src + ${Kokkos_SOURCE_DIR}/containers/src + ${Kokkos_SOURCE_DIR}/algorithms/src + ${Kokkos_BINARY_DIR} # to find KokkosCore_config.h +) + +INCLUDE_DIRECTORIES(${Kokkos_INCLUDE_DIRS}) + +IF(KOKKOS_SEPARATE_LIBS) + # kokkoscore + ADD_LIBRARY( + kokkoscore + ${KOKKOS_CORE_SRCS} + ) + + target_compile_options( + kokkoscore + PUBLIC ${KOKKOS_CXX_FLAGS} + ) + + target_compile_features( + kokkoscore + PUBLIC ${KOKKOS_CXX11_FEATURES} + ) + + # Install the kokkoscore library + INSTALL (TARGETS kokkoscore + ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib + LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin + ) + + # Install the kokkoscore headers + INSTALL (DIRECTORY + ${Kokkos_SOURCE_DIR}/core/src/ + DESTINATION ${KOKKOS_HEADER_DIR} + FILES_MATCHING PATTERN "*.hpp" + ) + + # Install KokkosCore_config.h header + INSTALL (FILES + ${Kokkos_BINARY_DIR}/KokkosCore_config.h + DESTINATION ${KOKKOS_HEADER_DIR} + ) + + TARGET_LINK_LIBRARIES( + kokkoscore + ${KOKKOS_LD_FLAGS} + ${KOKKOS_LIBS} + ) + + # kokkoscontainers + ADD_LIBRARY( + kokkoscontainers + ${KOKKOS_CONTAINERS_SRCS} + ) + + TARGET_LINK_LIBRARIES( + kokkoscontainers + kokkoscore + ) + + # Install the kokkocontainers library + INSTALL (TARGETS kokkoscontainers + ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib + LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) + + # Install the kokkoscontainers headers + INSTALL (DIRECTORY + ${Kokkos_SOURCE_DIR}/containers/src/ + DESTINATION ${KOKKOS_HEADER_DIR} + FILES_MATCHING PATTERN "*.hpp" + ) + + # kokkosalgorithms - Build as interface library since no source files. + ADD_LIBRARY( + kokkosalgorithms + INTERFACE + ) + + target_include_directories( + kokkosalgorithms + INTERFACE ${Kokkos_SOURCE_DIR}/algorithms/src + ) + + TARGET_LINK_LIBRARIES( + kokkosalgorithms + INTERFACE kokkoscore + ) + + # Install the kokkoalgorithms library + INSTALL (TARGETS kokkosalgorithms + ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib + LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) + + # Install the kokkosalgorithms headers + INSTALL (DIRECTORY + ${Kokkos_SOURCE_DIR}/algorithms/src/ + DESTINATION ${KOKKOS_INSTALL_INDLUDE_DIR} + FILES_MATCHING PATTERN "*.hpp" + ) + + SET (Kokkos_LIBRARIES_NAMES kokkoscore kokkoscontainers kokkosalgorithms) + +ELSE() + # kokkos + ADD_LIBRARY( + kokkos + ${KOKKOS_CORE_SRCS} + ${KOKKOS_CONTAINERS_SRCS} + ) + + target_compile_options( + kokkos + PUBLIC ${KOKKOS_CXX_FLAGS} + ) + + target_compile_features( + kokkos + PUBLIC ${KOKKOS_CXX11_FEATURES} + ) + + TARGET_LINK_LIBRARIES( + kokkos + ${KOKKOS_LD_FLAGS} + ${KOKKOS_LIBS} + ) + + # Install the kokkos library + INSTALL (TARGETS kokkos + EXPORT KokkosTargets + ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib + LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) + + + # Install the kokkos headers + INSTALL (DIRECTORY + EXPORT KokkosTargets + ${Kokkos_SOURCE_DIR}/core/src/ + DESTINATION ${KOKKOS_HEADER_DIR} + FILES_MATCHING PATTERN "*.hpp" + ) + INSTALL (DIRECTORY + EXPORT KokkosTargets + ${Kokkos_SOURCE_DIR}/containers/src/ + DESTINATION ${KOKKOS_HEADER_DIR} + FILES_MATCHING PATTERN "*.hpp" + ) + INSTALL (DIRECTORY + EXPORT KokkosTargets + ${Kokkos_SOURCE_DIR}/algorithms/src/ + DESTINATION ${KOKKOS_HEADER_DIR} + FILES_MATCHING PATTERN "*.hpp" + ) + + INSTALL (FILES + ${Kokkos_BINARY_DIR}/KokkosCore_config.h + DESTINATION ${KOKKOS_HEADER_DIR} + ) + + include_directories(${Kokkos_BINARY_DIR}) + include_directories(${Kokkos_SOURCE_DIR}/core/src) + include_directories(${Kokkos_SOURCE_DIR}/containers/src) + include_directories(${Kokkos_SOURCE_DIR}/algorithms/src) + + + SET (Kokkos_LIBRARIES_NAMES kokkos) + +endif() + +# Add all targets to the build-tree export set +export(TARGETS ${Kokkos_LIBRARIES_NAMES} + FILE "${Kokkos_BINARY_DIR}/KokkosTargets.cmake") + +# Export the package for use from the build-tree +# (this registers the build-tree with a global CMake-registry) +export(PACKAGE Kokkos) + +# Create the KokkosConfig.cmake and KokkosConfigVersion files +file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}" + "${INSTALL_INCLUDE_DIR}") +# ... for the build tree +set(CONF_INCLUDE_DIRS "${Kokkos_SOURCE_DIR}" "${Kokkos_BINARY_DIR}") +configure_file(${Kokkos_SOURCE_DIR}/cmake/KokkosConfig.cmake.in + "${Kokkos_BINARY_DIR}/KokkosConfig.cmake" @ONLY) +# ... for the install tree +set(CONF_INCLUDE_DIRS "\${Kokkos_CMAKE_DIR}/${REL_INCLUDE_DIR}") +configure_file(${Kokkos_SOURCE_DIR}/cmake/KokkosConfig.cmake.in + "${Kokkos_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/KokkosConfig.cmake" @ONLY) + +# Install the KokkosConfig.cmake and KokkosConfigVersion.cmake +install(FILES + "${Kokkos_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/KokkosConfig.cmake" + DESTINATION "${INSTALL_CMAKE_DIR}") + +# Install the export set for use with the install-tree +INSTALL(EXPORT KokkosTargets DESTINATION + "${INSTALL_CMAKE_DIR}") diff --git a/lib/kokkos/config/kokkos-trilinos-integration-procedure.txt b/lib/kokkos/config/kokkos-trilinos-integration-procedure.txt index 961e4186ec..0f24487814 100644 --- a/lib/kokkos/config/kokkos-trilinos-integration-procedure.txt +++ b/lib/kokkos/config/kokkos-trilinos-integration-procedure.txt @@ -60,34 +60,12 @@ Step 2: // -------------------------------------------------------------------------------- // Step 3: - 3.1. Build and test Trilinos with 3 different configurations; a configure-all script is provided in Trilinos and should be modified to test each of the following 3 configurations with appropriate environment variable(s): + 3.1. Build and test Trilinos with 4 different configurations; Run scripts for white and shepard are provided in kokkos/config/trilinos-integration - - GCC/4.7.2-OpenMP/Complex - Run tests with the following environment variable: + Usually its a good idea to run those script via nohup. + You can run all four at the same time, use separate directories for each. - export OMP_NUM_THREADS=2 - - - - Intel/15.0.2-Serial/NoComplex - - - - GCC/4.8.4/CUDA/7.5.18-Cuda/Serial/NoComplex - Run tests with the following environment variables: - - export CUDA_LAUNCH_BLOCKING=1 - export CUDA_MANAGED_FORCE_DEVICE_ALLOC=1 - - - mkdir Build - cd Build - cp TRILINOS_PATH/sampleScripts/Sandia-SEMS/configure-all ./ - ** Set the path to Trilinos appropriately within the configure-all script ** - source $SEMS_MODULE_ROOT/utils/sems-modules-init.sh kokkos - source configure-all - make -k (-k means "keep going" to get past build errors; -j12 can also be specified to build with 12 threads, for example) - ctest - - 3.2. Compare the failed test output to the test output on the dashboard ( testing.sandia.gov/cdash select Trilinos ); investigate and fix problems if new tests fail after the Kokkos snapshot + 3.2. Compare the failed test output between the pristine and the updated runs; investigate and fix problems if new tests fail after the Kokkos snapshot // -------------------------------------------------------------------------------- // @@ -134,7 +112,7 @@ Step 4: Once all Trilinos tests pass promote Kokkos develop branch to master on master: sha1 develop: sha1 - git push --follow-tags origin master + 4.4. Do NOT push yet // -------------------------------------------------------------------------------- // @@ -156,9 +134,15 @@ Step 5: python KOKKOS_PATH/config/snapshot.py KOKKOS_PATH TRILINOS_PATH/packages - 5.3. Push the updated develop branch of Trilinos to Github - congratulations!!! + 5.3. Run checkin-test to push to trilinos using the CI build modules (gcc/4.9.3) - (From Trilinos directory): - git push + The modules are listed in kokkos/config/trilinos-integration/checkin-test + Run checkin-test, forward dependencies and optional dependencies must be enabled + If push failed because someone else clearly broke something, push manually. + If push failed for unclear reasons, investigate, fix, and potentially start over from step 2 after reseting your local kokkos/master branch + +Step 6: Push Kokkos to master + + git push --follow-tags origin master // -------------------------------------------------------------------------------- // diff --git a/lib/kokkos/config/kokkos_dev/config-core-all.sh b/lib/kokkos/config/kokkos_dev/config-core-all.sh index d4fb25a8e1..1867de7204 100755 --- a/lib/kokkos/config/kokkos_dev/config-core-all.sh +++ b/lib/kokkos/config/kokkos_dev/config-core-all.sh @@ -13,7 +13,7 @@ # module load cmake/2.8.11.2 gcc/4.8.3 cuda/6.5.14 nvcc-wrapper/gnu # # The 'nvcc-wrapper' module should load a script that matches -# kokkos/config/nvcc_wrapper +# kokkos/bin/nvcc_wrapper # #----------------------------------------------------------------------------- # Source and installation directories: diff --git a/lib/kokkos/config/kokkos_dev/config-core-cuda-omp-hwloc.sh b/lib/kokkos/config/kokkos_dev/config-core-cuda-omp-hwloc.sh index c2e17bb944..5a6cc1493e 100755 --- a/lib/kokkos/config/kokkos_dev/config-core-cuda-omp-hwloc.sh +++ b/lib/kokkos/config/kokkos_dev/config-core-cuda-omp-hwloc.sh @@ -13,7 +13,7 @@ # module load cmake/2.8.11.2 gcc/4.8.3 cuda/6.5.14 nvcc-wrapper/gnu # # The 'nvcc-wrapper' module should load a script that matches -# kokkos/config/nvcc_wrapper +# kokkos/bin/nvcc_wrapper # #----------------------------------------------------------------------------- # Source and installation directories: diff --git a/lib/kokkos/config/kokkos_dev/config-core-cuda.sh b/lib/kokkos/config/kokkos_dev/config-core-cuda.sh index 39b72d5ce1..606755da81 100755 --- a/lib/kokkos/config/kokkos_dev/config-core-cuda.sh +++ b/lib/kokkos/config/kokkos_dev/config-core-cuda.sh @@ -13,7 +13,7 @@ # module load cmake/2.8.11.2 gcc/4.8.3 cuda/6.5.14 nvcc-wrapper/gnu # # The 'nvcc-wrapper' module should load a script that matches -# kokkos/config/nvcc_wrapper +# kokkos/bin/nvcc_wrapper # #----------------------------------------------------------------------------- # Source and installation directories: diff --git a/lib/kokkos/config/master_history.txt b/lib/kokkos/config/master_history.txt index 9eaecb5031..cc6f4c97d7 100644 --- a/lib/kokkos/config/master_history.txt +++ b/lib/kokkos/config/master_history.txt @@ -5,4 +5,5 @@ tag: 2.02.00 date: 10:30:2016 master: 6c90a581 develop: ca3dd56e tag: 2.02.01 date: 11:01:2016 master: 9c698c86 develop: b0072304 tag: 2.02.07 date: 12:16:2016 master: 4b4cc4ba develop: 382c0966 tag: 2.02.15 date: 02:10:2017 master: 8c64cd93 develop: 28dea8b6 -tag: 2.03.00 date: 04:25:2017 master: 120d9ce7 develop: 015ba641 +tag: 2.03.00 date: 04:25:2017 master: 120d9ce7 develop: 015ba641 +tag: 2.03.05 date: 05:27:2017 master: 36b92f43 develop: 79073186 diff --git a/lib/kokkos/config/snapshot.py b/lib/kokkos/config/snapshot.py index d816cd0c9c..bfa97bf48a 100755 --- a/lib/kokkos/config/snapshot.py +++ b/lib/kokkos/config/snapshot.py @@ -27,7 +27,7 @@ import subprocess, argparse, re, doctest, os, datetime, traceback def parse_cmdline(description): parser = argparse.ArgumentParser(usage="snapshot.py [options] source destination", description=description) - parser.add_argument("-n", "--no-comit", action="store_false", dest="create_commit", default=True, + parser.add_argument("-n", "--no-commit", action="store_false", dest="create_commit", default=True, help="Do not perform a commit or create a commit message.") parser.add_argument("-v", "--verbose", action="store_true", dest="verbose_mode", default=False, help="Enable verbose mode.") @@ -39,6 +39,8 @@ def parse_cmdline(description): help="Type of repository of the source, use none to skip all repository operations.") parser.add_argument("--dest-repo", choices=["git","none"], default="", help="Type of repository of the destination, use none to skip all repository operations.") + parser.add_argument("--small", action="store_true", dest="small_mode", + help="Don't include tests and other extra files when copying.") parser.add_argument("source", help="Source project to snapshot from.") parser.add_argument("destination", help="Destination to snapshot too.") @@ -58,9 +60,9 @@ def validate_options(options): options.source = os.path.abspath(options.source) options.destination = os.path.abspath(options.destination) - + if os.path.exists(options.source): - apparent_source_repo_type, source_root = deterimine_repo_type(options.source) + apparent_source_repo_type, source_root = determine_repo_type(options.source) else: raise RuntimeError("Could not find source directory of %s." % options.source) options.source_root = source_root @@ -69,7 +71,7 @@ def validate_options(options): print "Could not find destination directory of %s so it will be created." % options.destination os.makedirs(options.destination) - apparent_dest_repo_type, dest_root = deterimine_repo_type(options.destination) + apparent_dest_repo_type, dest_root = determine_repo_type(options.destination) options.dest_root = dest_root #error on svn repo types for now @@ -111,7 +113,7 @@ def run_cmd(cmd, options, working_dir="."): print "==== %s stderr ====" % cmd_str print proc_stderr print "==== %s stderr ====" % cmd_str - + if ret_val != 0: raise RuntimeError("Command '%s' failed with error code %d. Error message:%s%s%sstdout:%s" % \ (cmd_str, ret_val, os.linesep, proc_stderr, os.linesep, proc_stdout)) @@ -119,7 +121,7 @@ def run_cmd(cmd, options, working_dir="."): return proc_stdout, proc_stderr #end run_cmd -def deterimine_repo_type(location): +def determine_repo_type(location): apparent_repo_type = "none" while location != "": @@ -133,16 +135,32 @@ def deterimine_repo_type(location): location = location[:location.rfind(os.sep)] return apparent_repo_type, location - -#end deterimine_repo_type +#end determine_repo_type def rsync(source, dest, options): rsync_cmd = ["rsync", "-ar", "--delete"] if options.debug_mode: rsync_cmd.append("-v") + if options.small_mode or options.source_repo == "git": + rsync_cmd.append("--delete-excluded") + + if options.small_mode: + rsync_cmd.append("--include=config/master_history.txt") + rsync_cmd.append("--include=cmake/tpls") + rsync_cmd.append("--exclude=benchmarks/") + rsync_cmd.append("--exclude=config/*") + rsync_cmd.append("--exclude=doc/") + rsync_cmd.append("--exclude=example/") + rsync_cmd.append("--exclude=tpls/") + rsync_cmd.append("--exclude=HOW_TO_SNAPSHOT") + rsync_cmd.append("--exclude=unit_test") + rsync_cmd.append("--exclude=unit_tests") + rsync_cmd.append("--exclude=perf_test") + rsync_cmd.append("--exclude=performance_tests") + if options.source_repo == "git": - rsync_cmd.append("--exclude=.git") + rsync_cmd.append("--exclude=.git*") rsync_cmd.append(options.source) rsync_cmd.append(options.destination) @@ -171,28 +189,27 @@ def find_git_commit_information(options): ('sems', 'software.sandia.gov:/git/sems') """ git_log_cmd = ["git", "log", "-1"] - + output, error = run_cmd(git_log_cmd, options, options.source) - + commit_match = re.match("commit ([0-9a-fA-F]+)", output) commit_id = commit_match.group(1) commit_log = output - + git_remote_cmd = ["git", "remote", "-v"] output, error = run_cmd(git_remote_cmd, options, options.source) - + remote_match = re.search("origin\s([^ ]*/([^ ]+))", output, re.MULTILINE) if not remote_match: raise RuntimeError("Could not find origin of repo at %s. Consider using none for source repo type." % (options.source)) source_location = remote_match.group(1) source_name = remote_match.group(2).strip() - + if source_name[-1] == "/": source_name = source_name[:-1] return commit_id, commit_log, source_name, source_location - #end find_git_commit_information def do_git_commit(message, options): @@ -201,10 +218,10 @@ def do_git_commit(message, options): git_add_cmd = ["git", "add", "-A"] run_cmd(git_add_cmd, options, options.destination) - + git_commit_cmd = ["git", "commit", "-m%s" % message] run_cmd(git_commit_cmd, options, options.destination) - + git_log_cmd = ["git", "log", "--format=%h", "-1"] commit_sha1, error = run_cmd(git_log_cmd, options, options.destination) @@ -214,7 +231,7 @@ def do_git_commit(message, options): def verify_git_repo_clean(location, options): git_status_cmd = ["git", "status", "--porcelain"] output, error = run_cmd(git_status_cmd, options, location) - + if output != "": if options.no_validate_repo == False: raise RuntimeError("%s is not clean.%sPlease commit or stash all changes before running snapshot." @@ -223,7 +240,6 @@ def verify_git_repo_clean(location, options): print "WARNING: %s is not clean. Proceeding anyway." % location print "WARNING: This could lead to differences in the source and destination." print "WARNING: It could also lead to extra files being included in the snapshot commit." - #end verify_git_repo_clean def main(options): @@ -238,14 +254,14 @@ def main(options): commit_log = "Unknown commit from %s snapshotted at: %s" % (options.source, datetime.datetime.now()) repo_name = options.source repo_location = options.source - + commit_message = create_commit_message(commit_id, commit_log, repo_name, repo_location) + os.linesep*2 - + if options.dest_repo == "git": verify_git_repo_clean(options.destination, options) rsync(options.source, options.destination, options) - + if options.dest_repo == "git": do_git_commit(commit_message, options) elif options.dest_repo == "none": @@ -256,10 +272,6 @@ def main(options): cwd = os.getcwd() print "No commit done by request. Please use file at:" print "%s%sif you wish to commit this to a repo later." % (cwd+"/"+file_name, os.linesep) - - - - #end main if (__name__ == "__main__"): @@ -267,7 +279,7 @@ if (__name__ == "__main__"): doctest.testmod() sys.exit(0) - try: + try: options = parse_cmdline(__doc__) main(options) except RuntimeError, e: @@ -275,5 +287,5 @@ if (__name__ == "__main__"): if "--debug" in sys.argv: traceback.print_exc() sys.exit(1) - else: + else: sys.exit(0) diff --git a/lib/kokkos/config/test_all_sandia b/lib/kokkos/config/test_all_sandia index 6909606643..8e1246bf8b 100755 --- a/lib/kokkos/config/test_all_sandia +++ b/lib/kokkos/config/test_all_sandia @@ -24,6 +24,8 @@ elif [[ "$HOSTNAME" =~ node.* ]]; then # Warning: very generic name fi elif [[ "$HOSTNAME" =~ apollo ]]; then MACHINE=apollo +elif [[ "$HOSTNAME" =~ sullivan ]]; then + MACHINE=sullivan elif [ ! -z "$SEMS_MODULEFILES_ROOT" ]; then MACHINE=sems else @@ -152,7 +154,7 @@ if [ "$MACHINE" = "sems" ]; then "gcc/5.1.0 $BASE_MODULE_LIST "Serial" g++ $GCC_WARNING_FLAGS" "intel/16.0.1 $BASE_MODULE_LIST "OpenMP" icpc $INTEL_WARNING_FLAGS" "clang/3.9.0 $BASE_MODULE_LIST "Pthread_Serial" clang++ $CLANG_WARNING_FLAGS" - "cuda/8.0.44 $CUDA8_MODULE_LIST "Cuda_OpenMP" $KOKKOS_PATH/config/nvcc_wrapper $CUDA_WARNING_FLAGS" + "cuda/8.0.44 $CUDA8_MODULE_LIST "Cuda_OpenMP" $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" ) else # Format: (compiler module-list build-list exe-name warning-flag) @@ -164,6 +166,7 @@ if [ "$MACHINE" = "sems" ]; then "clang/3.6.1 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS" "clang/3.7.1 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS" "clang/3.8.1 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS" + "clang/3.9.0 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS" "cuda/7.0.28 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/config/nvcc_wrapper $CUDA_WARNING_FLAGS" "cuda/7.5.18 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/config/nvcc_wrapper $CUDA_WARNING_FLAGS" "cuda/8.0.44 $CUDA8_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/config/nvcc_wrapper $CUDA_WARNING_FLAGS" @@ -184,7 +187,7 @@ elif [ "$MACHINE" = "white" ]; then # Format: (compiler module-list build-list exe-name warning-flag) COMPILERS=("gcc/5.4.0 $BASE_MODULE_LIST $IBM_BUILD_LIST g++ $GCC_WARNING_FLAGS" "ibm/13.1.3 $IBM_MODULE_LIST $IBM_BUILD_LIST xlC $IBM_WARNING_FLAGS" - "cuda/8.0.44 $CUDA_MODULE_LIST $CUDA_IBM_BUILD_LIST ${KOKKOS_PATH}/config/nvcc_wrapper $CUDA_WARNING_FLAGS" + "cuda/8.0.44 $CUDA_MODULE_LIST $CUDA_IBM_BUILD_LIST ${KOKKOS_PATH}/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" ) if [ -z "$ARCH_FLAG" ]; then @@ -221,7 +224,7 @@ elif [ "$MACHINE" = "sullivan" ]; then BASE_MODULE_LIST="/" # Format: (compiler module-list build-list exe-name warning-flag) - COMPILERS=("gcc/5.3.0 $BASE_MODULE_LIST $ARM_GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS") + COMPILERS=("gcc/6.1.0 $BASE_MODULE_LIST $ARM_GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS") if [ -z "$ARCH_FLAG" ]; then ARCH_FLAG="--arch=ARMv8-ThunderX" @@ -278,11 +281,11 @@ elif [ "$MACHINE" = "apollo" ]; then "intel/16.0.1 $BASE_MODULE_LIST "OpenMP" icpc $INTEL_WARNING_FLAGS" "clang/3.9.0 $BASE_MODULE_LIST "Pthread_Serial" clang++ $CLANG_WARNING_FLAGS" "clang/head $CLANG_MODULE_LIST "Cuda_Pthread" clang++ $CUDA_WARNING_FLAGS" - "cuda/8.0.44 $CUDA_MODULE_LIST "Cuda_OpenMP" $KOKKOS_PATH/config/nvcc_wrapper $CUDA_WARNING_FLAGS" + "cuda/8.0.44 $CUDA_MODULE_LIST "Cuda_OpenMP" $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" ) else # Format: (compiler module-list build-list exe-name warning-flag) - COMPILERS=("cuda/8.0.44 $CUDA8_MODULE_LIST $BUILD_LIST_CUDA_NVCC $KOKKOS_PATH/config/nvcc_wrapper $CUDA_WARNING_FLAGS" + COMPILERS=("cuda/8.0.44 $CUDA8_MODULE_LIST $BUILD_LIST_CUDA_NVCC $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" "clang/head $CLANG_MODULE_LIST $BUILD_LIST_CUDA_CLANG clang++ $CUDA_WARNING_FLAGS" "clang/3.9.0 $CLANG_MODULE_LIST $BUILD_LIST_CLANG clang++ $CLANG_WARNING_FLAGS" "gcc/4.7.2 $BASE_MODULE_LIST $GCC_BUILD_LIST g++ $GCC_WARNING_FLAGS" @@ -295,8 +298,8 @@ elif [ "$MACHINE" = "apollo" ]; then "intel/16.0.1 $BASE_MODULE_LIST $INTEL_BUILD_LIST icpc $INTEL_WARNING_FLAGS" "clang/3.5.2 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS" "clang/3.6.1 $BASE_MODULE_LIST $CLANG_BUILD_LIST clang++ $CLANG_WARNING_FLAGS" - "cuda/7.0.28 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/config/nvcc_wrapper $CUDA_WARNING_FLAGS" - "cuda/7.5.18 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/config/nvcc_wrapper $CUDA_WARNING_FLAGS" + "cuda/7.0.28 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" + "cuda/7.5.18 $CUDA_MODULE_LIST $CUDA_BUILD_LIST $KOKKOS_PATH/bin/nvcc_wrapper $CUDA_WARNING_FLAGS" ) fi diff --git a/lib/kokkos/config/testing_scripts/jenkins_test_driver b/lib/kokkos/config/testing_scripts/jenkins_test_driver index 9cba7fa518..f393940304 100755 --- a/lib/kokkos/config/testing_scripts/jenkins_test_driver +++ b/lib/kokkos/config/testing_scripts/jenkins_test_driver @@ -48,7 +48,7 @@ esac #nvcc wrapper and make the wrapper the compiler. if [ $cuda_compiler != "" ]; then export NVCC_WRAPPER_DEFAULT_COMPILER=$compiler - compiler=$kokkos_path/config/nvcc_wrapper + compiler=$kokkos_path/bin/nvcc_wrapper fi if [ $host_compiler_brand == "intel" -a $cuda_compiler != "" ]; then diff --git a/lib/kokkos/config/trilinos-integration/checkin-test b/lib/kokkos/config/trilinos-integration/checkin-test new file mode 100644 index 0000000000..92a1b1c068 --- /dev/null +++ b/lib/kokkos/config/trilinos-integration/checkin-test @@ -0,0 +1,4 @@ +module purge +module load sems-env sems-gcc/4.9.3 sems-openmpi/1.10.1 sems-hdf5/1.8.12/parallel sems-netcdf/4.3.2/parallel sems-python/2.7.9 sems-zlib/1.2.8/base sems-cmake/3.5.2 sems-parmetis/4.0.3/64bit_parallel sems-scotch/6.0.3/nopthread_64bit_parallel sems-boost/1.59.0/base + +#Run Trilinos CheckinTest diff --git a/lib/kokkos/config/trilinos-integration/prepare_trilinos_repos.sh b/lib/kokkos/config/trilinos-integration/prepare_trilinos_repos.sh index 2692f76038..b81a3b1566 100755 --- a/lib/kokkos/config/trilinos-integration/prepare_trilinos_repos.sh +++ b/lib/kokkos/config/trilinos-integration/prepare_trilinos_repos.sh @@ -1,5 +1,18 @@ #!/bin/bash -le +TRILINOS_UPDATE_BRANCH=$1 +TRILINOS_PRISTINE_BRANCH=$2 + +if [ -z $TRILINOS_UPDATE_BRANCH ] +then + TRILINOS_UPDATE_BRANCH=develop +fi + +if [ -z $TRILINOS_PRISTINE_BRANCH ] +then + TRILINOS_PRISTINE_BRANCH=develop +fi + export TRILINOS_UPDATED_PATH=${PWD}/trilinos-update export TRILINOS_PRISTINE_PATH=${PWD}/trilinos-pristine @@ -16,8 +29,8 @@ if [ ! -d "${TRILINOS_PRISTINE_PATH}" ]; then fi cd ${TRILINOS_UPDATED_PATH} -git checkout develop -git reset --hard origin/develop +git checkout $TRILINOS_UPDATE_BRANCH +git reset --hard origin/$TRILINOS_UPDATE_BRANCH git pull cd .. @@ -28,18 +41,14 @@ echo "" echo "" echo "Trilinos State:" git log --pretty=oneline --since=7.days -SHA=`git log --pretty=oneline --since=7.days | head -n 2 | tail -n 1 | awk '{print $1}'` cd .. cd ${TRILINOS_PRISTINE_PATH} git status -git log --pretty=oneline --since=7.days -echo "Checkout develop" -git checkout develop +echo "Checkout $TRILINOS_PRISTINE_BRANCH" +git checkout $TRILINOS_PRISTINE_BRANCH echo "Pull" git pull -echo "Checkout SHA" -git checkout ${SHA} cd .. cd ${TRILINOS_PRISTINE_PATH} diff --git a/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_pthread_intel b/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_pthread_intel new file mode 100755 index 0000000000..23968e8c0f --- /dev/null +++ b/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_pthread_intel @@ -0,0 +1,60 @@ +#!/bin/bash -el +ulimit -c 0 +module load devpack/openmpi/1.10.0/intel/16.1.056/cuda/none + +KOKKOS_BRANCH=$1 +TRILINOS_UPDATE_BRANCH=$2 +TRILINOS_PRISTINE_BRANCH=$3 + +if [ -z $KOKKOS_BRANCH ] +then + KOKKOS_BRANCH=develop +fi + +if [ -z $TRILINOS_UPDATE_BRANCH ] +then + TRILINOS_UPDATE_BRANCH=develop +fi + +if [ -z $TRILINOS_PRISTINE_BRANCH ] +then + TRILINOS_PRISTINE_BRANCH=develop +fi + +export OMP_NUM_THREADS=8 +export JENKINS_DO_CUDA=OFF +export JENKINS_DO_OPENMP=OFF +export JENKINS_DO_PTHREAD=ON +export JENKINS_DO_SERIAL=OFF +export JENKINS_DO_COMPLEX=OFF + +export ARCH_CXX_FLAG="-xCORE-AVX2 -mkl" +export ARCH_C_FLAG="-xCORE-AVX2 -mkl" +export BLAS_LIBRARIES="-mkl;${MKLROOT}/lib/intel64/libmkl_intel_lp64.a;${MKLROOT}/lib/intel64/libmkl_intel_thread.a;${MKLROOT}/lib/intel64/libmkl_core.a" +export LAPACK_LIBRARIES=${BLAS_LIBRARIES} + +export JENKINS_DO_TESTS=ON +export JENKINS_DO_EXAMPLES=ON +export JENKINS_DO_SHARED=OFF + +export QUEUE=haswell + + +module load python + + +export KOKKOS_PATH=${PWD}/kokkos + +#Already done: +if [ ! -d "${KOKKOS_PATH}" ]; then + git clone https://github.com/kokkos/kokkos ${KOKKOS_PATH} +fi + +cd ${KOKKOS_PATH} +git checkout $KOKKOS_BRANCH +git pull +cd .. + +source ${KOKKOS_PATH}/config/trilinos-integration/prepare_trilinos_repos.sh $TRILINOS_UPDATE_BRANCH $TRILINOS_PRISTINE_BRANCH + +${TRILINOS_UPDATED_PATH}/sampleScripts/Sandia-SEMS/run_repo_comparison_slurm ${TRILINOS_UPDATED_PATH} ${TRILINOS_PRISTINE_PATH} ${TRILINOS_UPDATED_PATH}/sampleScripts/Sandia-SEMS/configure-testbeds-jenkins-all TestCompare ${QUEUE} diff --git a/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_serial_intel b/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_serial_intel new file mode 100755 index 0000000000..964de3a002 --- /dev/null +++ b/lib/kokkos/config/trilinos-integration/shepard_jenkins_run_script_serial_intel @@ -0,0 +1,60 @@ +#!/bin/bash -el +ulimit -c 0 +module load devpack/openmpi/1.10.0/intel/16.1.056/cuda/none + +KOKKOS_BRANCH=$1 +TRILINOS_UPDATE_BRANCH=$2 +TRILINOS_PRISTINE_BRANCH=$3 + +if [ -z $KOKKOS_BRANCH ] +then + KOKKOS_BRANCH=develop +fi + +if [ -z $TRILINOS_UPDATE_BRANCH ] +then + TRILINOS_UPDATE_BRANCH=develop +fi + +if [ -z $TRILINOS_PRISTINE_BRANCH ] +then + TRILINOS_PRISTINE_BRANCH=develop +fi + +export OMP_NUM_THREADS=8 +export JENKINS_DO_CUDA=OFF +export JENKINS_DO_OPENMP=OFF +export JENKINS_DO_PTHREAD=OFF +export JENKINS_DO_SERIAL=ON +export JENKINS_DO_COMPLEX=ON + +export ARCH_CXX_FLAG="-xCORE-AVX2 -mkl" +export ARCH_C_FLAG="-xCORE-AVX2 -mkl" +export BLAS_LIBRARIES="-mkl;${MKLROOT}/lib/intel64/libmkl_intel_lp64.a;${MKLROOT}/lib/intel64/libmkl_intel_thread.a;${MKLROOT}/lib/intel64/libmkl_core.a" +export LAPACK_LIBRARIES=${BLAS_LIBRARIES} + +export JENKINS_DO_TESTS=ON +export JENKINS_DO_EXAMPLES=ON +export JENKINS_DO_SHARED=OFF + +export QUEUE=haswell + + +module load python + + +export KOKKOS_PATH=${PWD}/kokkos + +#Already done: +if [ ! -d "${KOKKOS_PATH}" ]; then + git clone https://github.com/kokkos/kokkos ${KOKKOS_PATH} +fi + +cd ${KOKKOS_PATH} +git checkout $KOKKOS_BRANCH +git pull +cd .. + +source ${KOKKOS_PATH}/config/trilinos-integration/prepare_trilinos_repos.sh $TRILINOS_UPDATE_BRANCH $TRILINOS_PRISTINE_BRANCH + +${TRILINOS_UPDATED_PATH}/sampleScripts/Sandia-SEMS/run_repo_comparison_slurm ${TRILINOS_UPDATED_PATH} ${TRILINOS_PRISTINE_PATH} ${TRILINOS_UPDATED_PATH}/sampleScripts/Sandia-SEMS/configure-testbeds-jenkins-all TestCompare ${QUEUE} diff --git a/lib/kokkos/config/trilinos-integration/white_run_jenkins_script_cuda b/lib/kokkos/config/trilinos-integration/white_run_jenkins_script_cuda new file mode 100755 index 0000000000..52af024858 --- /dev/null +++ b/lib/kokkos/config/trilinos-integration/white_run_jenkins_script_cuda @@ -0,0 +1,63 @@ +#!/bin/bash -el +ulimit -c 0 + +KOKKOS_BRANCH=$1 +TRILINOS_UPDATE_BRANCH=$2 +TRILINOS_PRISTINE_BRANCH=$3 + +if [ -z $KOKKOS_BRANCH ] +then + KOKKOS_BRANCH=develop +fi + +if [ -z $TRILINOS_UPDATE_BRANCH ] +then + TRILINOS_UPDATE_BRANCH=develop +fi + +if [ -z $TRILINOS_PRISTINE_BRANCH ] +then + TRILINOS_PRISTINE_BRANCH=develop +fi + +module load devpack/openmpi/1.10.4/gcc/5.4.0/cuda/8.0.44 +export OMP_NUM_THREADS=8 +export JENKINS_DO_CUDA=ON +export JENKINS_DO_OPENMP=OFF +export JENKINS_DO_PTHREAD=OFF +export JENKINS_DO_SERIAL=ON +export JENKINS_DO_COMPLEX=OFF + +export JENKINS_ARCH_CXX_FLAG="-mcpu=power8 -arch=sm_37" +export JENKINS_ARCH_C_FLAG="-mcpu=power8" +export BLAS_LIBRARIES="${BLAS_ROOT}/lib/libblas.a;gfortran;gomp" +export LAPACK_LIBRARIES="${LAPACK_ROOT}/lib/liblapack.a;gfortran;gomp" + +export JENKINS_DO_TESTS=ON +export JENKINS_DO_EXAMPLES=ON + +export QUEUE=rhel7F + +module load python + +export KOKKOS_PATH=${PWD}/kokkos + +#Already done: +if [ ! -d "${KOKKOS_PATH}" ]; then + git clone https://github.com/kokkos/kokkos ${KOKKOS_PATH} +fi + +export OMPI_CXX=${KOKKOS_PATH}/bin/nvcc_wrapper + +cd ${KOKKOS_PATH} +git checkout $KOKKOS_BRANCH +git pull +cd .. + +export CUDA_LAUNCH_BLOCKING=1 +export CUDA_MANAGED_FORCE_DEVICE_ALLOC=1 + +source ${KOKKOS_PATH}/config/trilinos-integration/prepare_trilinos_repos.sh $TRILINOS_UPDATE_BRANCH $TRILINOS_PRISTINE_BRANCH + +${TRILINOS_UPDATED_PATH}/sampleScripts/Sandia-SEMS/run_repo_comparison_lsf ${TRILINOS_UPDATED_PATH} ${TRILINOS_PRISTINE_PATH} ${TRILINOS_UPDATED_PATH}/sampleScripts/Sandia-SEMS/configure-testbeds-jenkins-all TestCompare ${QUEUE} + diff --git a/lib/kokkos/config/trilinos-integration/white_run_jenkins_script_omp b/lib/kokkos/config/trilinos-integration/white_run_jenkins_script_omp new file mode 100755 index 0000000000..452165eef2 --- /dev/null +++ b/lib/kokkos/config/trilinos-integration/white_run_jenkins_script_omp @@ -0,0 +1,58 @@ +#!/bin/bash -el +ulimit -c 0 + +KOKKOS_BRANCH=$1 +TRILINOS_UPDATE_BRANCH=$2 +TRILINOS_PRISTINE_BRANCH=$3 + +if [ -z $KOKKOS_BRANCH ] +then + KOKKOS_BRANCH=develop +fi + +if [ -z $TRILINOS_UPDATE_BRANCH ] +then + TRILINOS_UPDATE_BRANCH=develop +fi + +if [ -z $TRILINOS_PRISTINE_BRANCH ] +then + TRILINOS_PRISTINE_BRANCH=develop +fi + +module load devpack/openmpi/1.10.4/gcc/5.4.0/cuda/8.0.44 +export OMP_NUM_THREADS=8 +export JENKINS_DO_CUDA=OFF +export JENKINS_DO_OPENMP=ON +export JENKINS_DO_PTHREAD=OFF +export JENKINS_DO_SERIAL=OFF +export JENKINS_DO_COMPLEX=OFF + +export JENKINS_ARCH_CXX_FLAG="-mcpu=power8" +export JENKINS_ARCH_C_FLAG="-mcpu=power8" +export BLAS_LIBRARIES="${BLAS_ROOT}/lib/libblas.a;gfortran;gomp" +export LAPACK_LIBRARIES="${LAPACK_ROOT}/lib/liblapack.a;gfortran;gomp" + +export JENKINS_DO_TESTS=ON +export JENKINS_DO_EXAMPLES=ON + +export QUEUE=rhel7F + +module load python + +export KOKKOS_PATH=${PWD}/kokkos + +#Already done: +if [ ! -d "${KOKKOS_PATH}" ]; then + git clone https://github.com/kokkos/kokkos ${KOKKOS_PATH} +fi + +cd ${KOKKOS_PATH} +git checkout $KOKKOS_BRANCH +git pull +cd .. + +source ${KOKKOS_PATH}/config/trilinos-integration/prepare_trilinos_repos.sh $TRILINOS_UPDATE_BRANCH $TRILINOS_PRISTINE_BRANCH + +${TRILINOS_UPDATED_PATH}/sampleScripts/Sandia-SEMS/run_repo_comparison_lsf ${TRILINOS_UPDATED_PATH} ${TRILINOS_PRISTINE_PATH} ${TRILINOS_UPDATED_PATH}/sampleScripts/Sandia-SEMS/configure-testbeds-jenkins-all TestCompare ${QUEUE} + diff --git a/lib/kokkos/containers/performance_tests/Makefile b/lib/kokkos/containers/performance_tests/Makefile index fa3bc77701..edaaf1ee51 100644 --- a/lib/kokkos/containers/performance_tests/Makefile +++ b/lib/kokkos/containers/performance_tests/Makefile @@ -8,7 +8,7 @@ default: build_all echo "End Build" ifneq (,$(findstring Cuda,$(KOKKOS_DEVICES))) - CXX = $(KOKKOS_PATH)/config/nvcc_wrapper + CXX = $(KOKKOS_PATH)/bin/nvcc_wrapper else CXX = g++ endif @@ -21,8 +21,8 @@ include $(KOKKOS_PATH)/Makefile.kokkos KOKKOS_CXXFLAGS += -I$(GTEST_PATH) -I${KOKKOS_PATH}/containers/performance_tests -TEST_TARGETS = -TARGETS = +TEST_TARGETS = +TARGETS = ifeq ($(KOKKOS_INTERNAL_USE_CUDA), 1) OBJ_CUDA = TestCuda.o TestMain.o gtest-all.o @@ -65,7 +65,7 @@ build_all: $(TARGETS) test: $(TEST_TARGETS) -clean: kokkos-clean +clean: kokkos-clean rm -f *.o $(TARGETS) # Compilation rules @@ -73,6 +73,5 @@ clean: kokkos-clean %.o:%.cpp $(KOKKOS_CPP_DEPENDS) $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) $(EXTRA_INC) -c $< -gtest-all.o:$(GTEST_PATH)/gtest/gtest-all.cc +gtest-all.o:$(GTEST_PATH)/gtest/gtest-all.cc $(CXX) $(KOKKOS_CPPFLAGS) $(KOKKOS_CXXFLAGS) $(CXXFLAGS) $(EXTRA_INC) -c $(GTEST_PATH)/gtest/gtest-all.cc - diff --git a/lib/kokkos/containers/performance_tests/TestCuda.cpp b/lib/kokkos/containers/performance_tests/TestCuda.cpp index d5cad06a47..208387425f 100644 --- a/lib/kokkos/containers/performance_tests/TestCuda.cpp +++ b/lib/kokkos/containers/performance_tests/TestCuda.cpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. -// +// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -36,12 +36,15 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ -#include +#include +#if defined( KOKKOS_ENABLE_CUDA ) + +#include #include #include #include @@ -52,8 +55,6 @@ #include -#if defined( KOKKOS_ENABLE_CUDA ) - #include #include @@ -79,7 +80,7 @@ protected: } }; -TEST_F( cuda, dynrankview_perf ) +TEST_F( cuda, dynrankview_perf ) { std::cout << "Cuda" << std::endl; std::cout << " DynRankView vs View: Initialization Only " << std::endl; @@ -105,5 +106,6 @@ TEST_F( cuda, unordered_map_performance_far) } } - +#else +void KOKKOS_CONTAINERS_PERFORMANCE_TESTS_TESTCUDA_PREVENT_EMPTY_LINK_ERROR() {} #endif /* #if defined( KOKKOS_ENABLE_CUDA ) */ diff --git a/lib/kokkos/containers/performance_tests/TestDynRankView.hpp b/lib/kokkos/containers/performance_tests/TestDynRankView.hpp index d96a3f7432..4c0ccb6b88 100644 --- a/lib/kokkos/containers/performance_tests/TestDynRankView.hpp +++ b/lib/kokkos/containers/performance_tests/TestDynRankView.hpp @@ -1,13 +1,13 @@ //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. -// +// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -36,7 +36,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER @@ -263,3 +263,4 @@ void test_dynrankview_op_perf( const int par_size ) } //end Performance #endif + diff --git a/lib/kokkos/containers/performance_tests/TestOpenMP.cpp b/lib/kokkos/containers/performance_tests/TestOpenMP.cpp index da74d32ac1..b674ec4a74 100644 --- a/lib/kokkos/containers/performance_tests/TestOpenMP.cpp +++ b/lib/kokkos/containers/performance_tests/TestOpenMP.cpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. -// +// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -36,11 +36,14 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ +#include +#if defined( KOKKOS_ENABLE_OPENMP ) + #include #include @@ -93,7 +96,7 @@ protected: } }; -TEST_F( openmp, dynrankview_perf ) +TEST_F( openmp, dynrankview_perf ) { std::cout << "OpenMP" << std::endl; std::cout << " DynRankView vs View: Initialization Only " << std::endl; @@ -137,4 +140,7 @@ TEST_F( openmp, unordered_map_performance_far) } } // namespace test +#else +void KOKKOS_CONTAINERS_PERFORMANCE_TESTS_TESTOPENMP_PREVENT_EMPTY_LINK_ERROR() {} +#endif diff --git a/lib/kokkos/containers/performance_tests/TestThreads.cpp b/lib/kokkos/containers/performance_tests/TestThreads.cpp index 4179b7de4c..a8910a3c72 100644 --- a/lib/kokkos/containers/performance_tests/TestThreads.cpp +++ b/lib/kokkos/containers/performance_tests/TestThreads.cpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. -// +// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -36,11 +36,14 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ +#include +#if defined( KOKKOS_ENABLE_THREADS ) + #include #include @@ -87,7 +90,7 @@ protected: } }; -TEST_F( threads, dynrankview_perf ) +TEST_F( threads, dynrankview_perf ) { std::cout << "Threads" << std::endl; std::cout << " DynRankView vs View: Initialization Only " << std::endl; @@ -132,4 +135,7 @@ TEST_F( threads, unordered_map_performance_far) } // namespace Performance +#else +void KOKKOS_CONTAINERS_PERFORMANCE_TESTS_TESTTHREADS_PREVENT_EMPTY_LINK_ERROR() {} +#endif diff --git a/lib/kokkos/containers/src/Kokkos_Bitset.hpp b/lib/kokkos/containers/src/Kokkos_Bitset.hpp index 74da5f61b5..7714506e92 100644 --- a/lib/kokkos/containers/src/Kokkos_Bitset.hpp +++ b/lib/kokkos/containers/src/Kokkos_Bitset.hpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. -// +// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -36,7 +36,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ @@ -435,3 +435,4 @@ void deep_copy( ConstBitset & dst, ConstBitset const& src) } // namespace Kokkos #endif //KOKKOS_BITSET_HPP + diff --git a/lib/kokkos/containers/src/Kokkos_DualView.hpp b/lib/kokkos/containers/src/Kokkos_DualView.hpp index 3a0196ee4c..937eab0d88 100644 --- a/lib/kokkos/containers/src/Kokkos_DualView.hpp +++ b/lib/kokkos/containers/src/Kokkos_DualView.hpp @@ -442,6 +442,17 @@ public: modified_host () = (modified_device () > modified_host () ? modified_device () : modified_host ()) + 1; } + +#ifdef KOKKOS_ENABLE_DEBUG_DUALVIEW_MODIFY_CHECK + if (modified_host() && modified_device()) { + std::string msg = "Kokkos::DualView::modify ERROR: "; + msg += "Concurrent modification of host and device views "; + msg += "in DualView \""; + msg += d_view.label(); + msg += "\"\n"; + Kokkos::abort(msg.c_str()); + } +#endif } //@} @@ -624,3 +635,4 @@ deep_copy (const ExecutionSpace& exec , } // namespace Kokkos #endif + diff --git a/lib/kokkos/containers/src/Kokkos_DynRankView.hpp b/lib/kokkos/containers/src/Kokkos_DynRankView.hpp index acb37f7f75..8e464506f9 100644 --- a/lib/kokkos/containers/src/Kokkos_DynRankView.hpp +++ b/lib/kokkos/containers/src/Kokkos_DynRankView.hpp @@ -1,13 +1,13 @@ /* //@HEADER // ************************************************************************ -// +// // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation -// +// // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. -// +// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -36,7 +36,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) -// +// // ************************************************************************ //@HEADER */ @@ -140,21 +140,21 @@ struct DynRankDimTraits { static typename std::enable_if< (std::is_same::value) , Layout>::type createLayout( const Layout& layout ) { return Layout( layout.dimension[0] != unspecified ? layout.dimension[0] : 1 - , layout.stride[0] + , layout.stride[0] , layout.dimension[1] != unspecified ? layout.dimension[1] : 1 - , layout.stride[1] + , layout.stride[1] , layout.dimension[2] != unspecified ? layout.dimension[2] : 1 - , layout.stride[2] + , layout.stride[2] , layout.dimension[3] != unspecified ? layout.dimension[3] : 1 - , layout.stride[3] + , layout.stride[3] , layout.dimension[4] != unspecified ? layout.dimension[4] : 1 - , layout.stride[4] + , layout.stride[4] , layout.dimension[5] != unspecified ? layout.dimension[5] : 1 - , layout.stride[5] + , layout.stride[5] , layout.dimension[6] != unspecified ? layout.dimension[6] : 1 - , layout.stride[6] + , layout.stride[6] , layout.dimension[7] != unspecified ? layout.dimension[7] : 1 - , layout.stride[7] + , layout.stride[7] ); } @@ -188,7 +188,7 @@ struct DynRankDimTraits { KOKKOS_INLINE_FUNCTION static typename std::enable_if< (std::is_same::value || std::is_same::value) && std::is_integral::value , Layout >::type reconstructLayout( const Layout& layout , iType dynrank ) { - return Layout( dynrank > 0 ? layout.dimension[0] : ~size_t(0) + return Layout( dynrank > 0 ? layout.dimension[0] : ~size_t(0) , dynrank > 1 ? layout.dimension[1] : ~size_t(0) , dynrank > 2 ? layout.dimension[2] : ~size_t(0) , dynrank > 3 ? layout.dimension[3] : ~size_t(0) @@ -205,27 +205,27 @@ struct DynRankDimTraits { static typename std::enable_if< (std::is_same::value) && std::is_integral::value , Layout >::type reconstructLayout( const Layout& layout , iType dynrank ) { return Layout( dynrank > 0 ? layout.dimension[0] : ~size_t(0) - , dynrank > 0 ? layout.stride[0] : (0) + , dynrank > 0 ? layout.stride[0] : (0) , dynrank > 1 ? layout.dimension[1] : ~size_t(0) - , dynrank > 1 ? layout.stride[1] : (0) + , dynrank > 1 ? layout.stride[1] : (0) , dynrank > 2 ? layout.dimension[2] : ~size_t(0) - , dynrank > 2 ? layout.stride[2] : (0) + , dynrank > 2 ? layout.stride[2] : (0) , dynrank > 3 ? layout.dimension[3] : ~size_t(0) - , dynrank > 3 ? layout.stride[3] : (0) + , dynrank > 3 ? layout.stride[3] : (0) , dynrank > 4 ? layout.dimension[4] : ~size_t(0) - , dynrank > 4 ? layout.stride[4] : (0) + , dynrank > 4 ? layout.stride[4] : (0) , dynrank > 5 ? layout.dimension[5] : ~size_t(0) - , dynrank > 5 ? layout.stride[5] : (0) + , dynrank > 5 ? layout.stride[5] : (0) , dynrank > 6 ? layout.dimension[6] : ~size_t(0) - , dynrank > 6 ? layout.stride[6] : (0) + , dynrank > 6 ? layout.stride[6] : (0) , dynrank > 7 ? layout.dimension[7] : ~size_t(0) - , dynrank > 7 ? layout.stride[7] : (0) + , dynrank > 7 ? layout.stride[7] : (0) ); } /** \brief Debug bounds-checking routines */ -// Enhanced debug checking - most infrastructure matches that of functions in +// Enhanced debug checking - most infrastructure matches that of functions in // Kokkos_ViewMapping; additional checks for extra arguments beyond rank are 0 template< unsigned , typename iType0 , class MapType > KOKKOS_INLINE_FUNCTION @@ -235,20 +235,20 @@ bool dyn_rank_view_verify_operator_bounds( const iType0 & , const MapType & ) template< unsigned R , typename iType0 , class MapType , typename iType1 , class ... Args > KOKKOS_INLINE_FUNCTION bool dyn_rank_view_verify_operator_bounds - ( const iType0 & rank + ( const iType0 & rank , const MapType & map , const iType1 & i , Args ... args ) { - if ( static_cast(R) < rank ) { + if ( static_cast(R) < rank ) { return ( size_t(i) < map.extent(R) ) && dyn_rank_view_verify_operator_bounds( rank , map , args ... ); } else if ( i != 0 ) { printf("DynRankView Debug Bounds Checking Error: at rank %u\n Extra arguments beyond the rank must be zero \n",R); return ( false ) - && dyn_rank_view_verify_operator_bounds( rank , map , args ... ); + && dyn_rank_view_verify_operator_bounds( rank , map , args ... ); } else { return ( true ) @@ -281,20 +281,24 @@ void dyn_rank_view_error_operator_bounds } // op_rank = rank of the operator version that was called -template< typename iType0 , typename iType1 , class MapType , class ... Args > +template< typename MemorySpace + , typename iType0 , typename iType1 , class MapType , class ... Args > KOKKOS_INLINE_FUNCTION void dyn_rank_view_verify_operator_bounds - ( const iType0 & op_rank , const iType1 & rank , const char* label , const MapType & map , Args ... args ) + ( const iType0 & op_rank , const iType1 & rank + , const Kokkos::Impl::SharedAllocationTracker & tracker + , const MapType & map , Args ... args ) { if ( static_cast(rank) > op_rank ) { - Kokkos::abort( "DynRankView Bounds Checking Error: Need at least rank arguments to the operator()" ); + Kokkos::abort( "DynRankView Bounds Checking Error: Need at least rank arguments to the operator()" ); } if ( ! dyn_rank_view_verify_operator_bounds<0>( rank , map , args ... ) ) { #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) enum { LEN = 1024 }; char buffer[ LEN ]; - int n = snprintf(buffer,LEN,"DynRankView bounds error of view %s (", label); + const std::string label = tracker.template get_label(); + int n = snprintf(buffer,LEN,"DynRankView bounds error of view %s (", label.c_str()); dyn_rank_view_error_operator_bounds<0>( buffer + n , LEN - n , map , args ... ); Kokkos::Impl::throw_runtime_exception(std::string(buffer)); #else @@ -347,7 +351,7 @@ private: std::is_same< typename DstTraits::array_layout , typename SrcTraits::array_layout >::value || std::is_same< typename DstTraits::array_layout - , Kokkos::LayoutStride >::value + , Kokkos::LayoutStride >::value }; public: @@ -381,9 +385,9 @@ public: } //end Impl /* \class DynRankView - * \brief Container that creates a Kokkos view with rank determined at runtime. + * \brief Container that creates a Kokkos view with rank determined at runtime. * Essentially this is a rank 7 view that wraps the access operators - * to yield the functionality of a view + * to yield the functionality of a view * * Changes from View * 1. The rank of the DynRankView is returned by the method rank() @@ -410,14 +414,14 @@ class DynRankView : public ViewTraits< DataType , Properties ... > { static_assert( !std::is_array::value && !std::is_pointer::value , "Cannot template DynRankView with array or pointer datatype - must be pod" ); -private: +private: template < class , class ... > friend class DynRankView ; template < class , class ... > friend class Impl::ViewMapping ; -public: +public: typedef ViewTraits< DataType , Properties ... > drvtraits ; - typedef View< DataType******* , Properties...> view_type ; + typedef View< DataType******* , Properties...> view_type ; typedef ViewTraits< DataType******* , Properties ... > traits ; @@ -430,7 +434,7 @@ private: map_type m_map ; unsigned m_rank; -public: +public: KOKKOS_INLINE_FUNCTION view_type & DownCast() const { return ( view_type & ) (*this); } KOKKOS_INLINE_FUNCTION @@ -588,7 +592,7 @@ private: // rank of the calling operator - included as first argument in ARG #define KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( ARG ) \ DynRankView::template verify_space< Kokkos::Impl::ActiveExecutionMemorySpace >::check(); \ - Kokkos::Experimental::Impl::dyn_rank_view_verify_operator_bounds ARG ; + Kokkos::Experimental::Impl::dyn_rank_view_verify_operator_bounds< typename traits::memory_space > ARG ; #else @@ -607,14 +611,10 @@ public: // Rank 0 KOKKOS_INLINE_FUNCTION reference_type operator()() const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (0 , this->rank() , NULL , m_map) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (0 , this->rank() , m_track.template get_label().c_str(),m_map) ) - #endif + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (0 , this->rank(), m_track, m_map) ) return implementation_map().reference(); - //return m_map.reference(0,0,0,0,0,0,0); + //return m_map.reference(0,0,0,0,0,0,0); } // Rank 1 @@ -624,6 +624,8 @@ public: typename std::enable_if< std::is_same::value && std::is_integral::value, reference_type>::type operator[](const iType & i0) const { + //Phalanx is violating this, since they use the operator to access ALL elements in the allocation + //KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (1 , this->rank(), m_track, m_map) ) return data()[i0]; } @@ -647,14 +649,10 @@ public: template< typename iType > KOKKOS_INLINE_FUNCTION typename std::enable_if< (std::is_same::value && std::is_integral::value), reference_type>::type - operator()(const iType & i0 ) const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (1 , this->rank() , NULL , m_map , i0) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (1 , this->rank() , m_track.template get_label().c_str(),m_map,i0) ) - #endif - return m_map.reference(i0); + operator()(const iType & i0 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (1 , this->rank(), m_track, m_map, i0) ) + return m_map.reference(i0); } template< typename iType > @@ -662,11 +660,7 @@ public: typename std::enable_if< !(std::is_same::value && std::is_integral::value), reference_type>::type operator()(const iType & i0 ) const { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (1 , this->rank() , NULL , m_map , i0) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (1 , this->rank() , m_track.template get_label().c_str(),m_map,i0) ) - #endif + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (1 , this->rank(), m_track, m_map, i0) ) return m_map.reference(i0,0,0,0,0,0,0); } @@ -674,155 +668,111 @@ public: template< typename iType0 , typename iType1 > KOKKOS_INLINE_FUNCTION typename std::enable_if< (std::is_same::value && std::is_integral::value && std::is_integral::value), reference_type>::type - operator()(const iType0 & i0 , const iType1 & i1 ) const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (2 , this->rank() , NULL , m_map , i0 , i1) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (2 , this->rank() , m_track.template get_label().c_str(),m_map,i0,i1) ) - #endif - return m_map.reference(i0,i1); + operator()(const iType0 & i0 , const iType1 & i1 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (2 , this->rank(), m_track, m_map, i0, i1) ) + return m_map.reference(i0,i1); } template< typename iType0 , typename iType1 > KOKKOS_INLINE_FUNCTION typename std::enable_if< !(std::is_same::value && std::is_integral::value), reference_type>::type - operator()(const iType0 & i0 , const iType1 & i1 ) const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (2 , this->rank() , NULL , m_map , i0 , i1) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (2 , this->rank() , m_track.template get_label().c_str(),m_map,i0,i1) ) - #endif - return m_map.reference(i0,i1,0,0,0,0,0); + operator()(const iType0 & i0 , const iType1 & i1 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (2 , this->rank(), m_track, m_map, i0, i1) ) + return m_map.reference(i0,i1,0,0,0,0,0); } // Rank 3 template< typename iType0 , typename iType1 , typename iType2 > KOKKOS_INLINE_FUNCTION typename std::enable_if< (std::is_same::value && std::is_integral::value && std::is_integral::value && std::is_integral::value), reference_type>::type - operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 ) const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (3 , this->rank() , NULL , m_map , i0 , i1 , i2) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (3 , this->rank() , m_track.template get_label().c_str(),m_map,i0,i1,i2) ) - #endif - return m_map.reference(i0,i1,i2); + operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (3 , this->rank(), m_track, m_map, i0, i1, i2) ) + return m_map.reference(i0,i1,i2); } template< typename iType0 , typename iType1 , typename iType2 > KOKKOS_INLINE_FUNCTION typename std::enable_if< !(std::is_same::value && std::is_integral::value), reference_type>::type - operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 ) const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (3 , this->rank() , NULL , m_map , i0 , i1 , i2) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (3 , this->rank() , m_track.template get_label().c_str(),m_map,i0,i1,i2) ) - #endif - return m_map.reference(i0,i1,i2,0,0,0,0); + operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (3 , this->rank(), m_track, m_map, i0, i1, i2) ) + return m_map.reference(i0,i1,i2,0,0,0,0); } // Rank 4 template< typename iType0 , typename iType1 , typename iType2 , typename iType3 > KOKKOS_INLINE_FUNCTION typename std::enable_if< (std::is_same::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value), reference_type>::type - operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 ) const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (4 , this->rank() , NULL , m_map , i0 , i1 , i2 , i3) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (4 , this->rank() , m_track.template get_label().c_str(),m_map,i0,i1,i2,i3) ) - #endif - return m_map.reference(i0,i1,i2,i3); + operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (4 , this->rank(), m_track, m_map, i0, i1, i2, i3) ) + return m_map.reference(i0,i1,i2,i3); } template< typename iType0 , typename iType1 , typename iType2 , typename iType3 > KOKKOS_INLINE_FUNCTION typename std::enable_if< !(std::is_same::value && std::is_integral::value), reference_type>::type - operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 ) const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (4 , this->rank() , NULL , m_map , i0 , i1 , i2 , i3) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (4 , this->rank() , m_track.template get_label().c_str(),m_map,i0,i1,i2,i3) ) - #endif - return m_map.reference(i0,i1,i2,i3,0,0,0); + operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (4 , this->rank(), m_track, m_map, i0, i1, i2, i3) ) + return m_map.reference(i0,i1,i2,i3,0,0,0); } // Rank 5 template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 > KOKKOS_INLINE_FUNCTION typename std::enable_if< (std::is_same::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value), reference_type>::type - operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 ) const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (5 , this->rank() , NULL , m_map , i0 , i1 , i2 , i3, i4) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (5 , this->rank() , m_track.template get_label().c_str(),m_map,i0,i1,i2,i3,i4) ) - #endif - return m_map.reference(i0,i1,i2,i3,i4); + operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (5 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4) ) + return m_map.reference(i0,i1,i2,i3,i4); } template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 > KOKKOS_INLINE_FUNCTION typename std::enable_if< !(std::is_same::value && std::is_integral::value), reference_type>::type - operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 ) const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (5 , this->rank() , NULL , m_map , i0 , i1 , i2 , i3, i4) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (5 , this->rank() , m_track.template get_label().c_str(),m_map,i0,i1,i2,i3,i4) ) - #endif - return m_map.reference(i0,i1,i2,i3,i4,0,0); + operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (5 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4) ) + return m_map.reference(i0,i1,i2,i3,i4,0,0); } // Rank 6 template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 , typename iType5 > KOKKOS_INLINE_FUNCTION typename std::enable_if< (std::is_same::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value), reference_type>::type - operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 , const iType5 & i5 ) const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (6 , this->rank() , NULL , m_map , i0 , i1 , i2 , i3, i4 , i5) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (6 , this->rank() , m_track.template get_label().c_str(),m_map,i0,i1,i2,i3,i4,i5) ) - #endif - return m_map.reference(i0,i1,i2,i3,i4,i5); + operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 , const iType5 & i5 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (6 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4, i5) ) + return m_map.reference(i0,i1,i2,i3,i4,i5); } template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 , typename iType5 > KOKKOS_INLINE_FUNCTION typename std::enable_if< !(std::is_same::value && std::is_integral::value), reference_type>::type - operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 , const iType5 & i5 ) const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (6 , this->rank() , NULL , m_map , i0 , i1 , i2 , i3, i4 , i5) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (6 , this->rank() , m_track.template get_label().c_str(),m_map,i0,i1,i2,i3,i4,i5) ) - #endif - return m_map.reference(i0,i1,i2,i3,i4,i5,0); + operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 , const iType5 & i5 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (6 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4, i5) ) + return m_map.reference(i0,i1,i2,i3,i4,i5,0); } // Rank 7 template< typename iType0 , typename iType1 , typename iType2 , typename iType3, typename iType4 , typename iType5 , typename iType6 > KOKKOS_INLINE_FUNCTION typename std::enable_if< (std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value && std::is_integral::value), reference_type>::type - operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 , const iType5 & i5 , const iType6 & i6 ) const - { - #ifndef KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (7 , this->rank() , NULL , m_map , i0 , i1 , i2 , i3, i4 , i5 , i6) ) - #else - KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (7 , this->rank() , m_track.template get_label().c_str(),m_map,i0,i1,i2,i3,i4,i5,i6) ) - #endif - return m_map.reference(i0,i1,i2,i3,i4,i5,i6); + operator()(const iType0 & i0 , const iType1 & i1 , const iType2 & i2 , const iType3 & i3 , const iType4 & i4 , const iType5 & i5 , const iType6 & i6 ) const + { + KOKKOS_IMPL_VIEW_OPERATOR_VERIFY( (7 , this->rank(), m_track, m_map, i0, i1, i2, i3, i4, i5, i6) ) + return m_map.reference(i0,i1,i2,i3,i4,i5,i6); } #undef KOKKOS_IMPL_VIEW_OPERATOR_VERIFY //---------------------------------------- - // Standard constructor, destructor, and assignment operators... + // Standard constructor, destructor, and assignment operators... KOKKOS_INLINE_FUNCTION ~DynRankView() {} @@ -840,7 +790,7 @@ public: DynRankView & operator = ( const DynRankView & rhs ) { m_track = rhs.m_track; m_map = rhs.m_map; m_rank = rhs.m_rank; return *this; } KOKKOS_INLINE_FUNCTION - DynRankView & operator = ( DynRankView && rhs ) { m_track = rhs.m_track; m_map = rhs.m_map; m_rank = rhs.m_rank; return *this; } + DynRankView & operator = ( DynRankView && rhs ) { m_track = rhs.m_track; m_map = rhs.m_map; m_rank = rhs.m_rank; return *this; } //---------------------------------------- // Compatible view copy constructor and assignment @@ -1068,7 +1018,7 @@ public: DynRankView( const Label & arg_label , typename std::enable_if< Kokkos::Experimental::Impl::is_view_label