From 67fced37c826f32ea571dd5c5b24b16016c27953 Mon Sep 17 00:00:00 2001 From: Anders Hafreager Date: Wed, 26 Apr 2017 20:10:18 +0200 Subject: [PATCH 001/131] 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/131] 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/131] 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 640edbc1d40e6571d25b02d9f4e892d95a9c4008 Mon Sep 17 00:00:00 2001 From: Emile Maras Date: Thu, 18 May 2017 11:08:08 +0200 Subject: [PATCH 004/131] 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 005/131] 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 069f3e746b46e0655fa648d864734424704fc273 Mon Sep 17 00:00:00 2001 From: Emile Maras Date: Thu, 18 May 2017 21:23:29 +0200 Subject: [PATCH 006/131] 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 007/131] 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 9593e05c9ec55ddd0d97ea019b08ccfdf7f2c42d Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Thu, 18 May 2017 19:37:08 -0400 Subject: [PATCH 008/131] 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 a5110d81ea6133a74b79d5bf1be433a3d4625995 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 19 May 2017 12:13:23 -0400 Subject: [PATCH 009/131] 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 010/131] 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 011/131] 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 012/131] 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 013/131] 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 014/131] 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 015/131] 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 016/131] 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 017/131] 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 018/131] 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 019/131] 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 020/131] 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 021/131] 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 022/131] 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 023/131] 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 024/131] 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 025/131] 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 026/131] 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 027/131] 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 028/131] 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 029/131] 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 030/131] 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 031/131] 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 032/131] 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 033/131] 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 034/131] 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 035/131] 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 036/131] 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 037/131] 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 038/131] 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 039/131] 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 040/131] 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 041/131] 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 042/131] 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 043/131] 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 044/131] 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 045/131] 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 046/131] 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 047/131] 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 048/131] 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 049/131] 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 050/131] 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 051/131] 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 052/131] 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 053/131] 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 054/131] 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 055/131] 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 056/131] 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 057/131] 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 058/131] 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 059/131] 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 060/131] 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 061/131] 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 062/131] 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 063/131] 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 064/131] 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 065/131] 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 066/131] 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 067/131] 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 068/131] 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 069/131] 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 070/131] 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 071/131] 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 072/131] 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 073/131] 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 074/131] 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 075/131] 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 076/131] 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 077/131] 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 078/131] 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 079/131] 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 080/131] 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 081/131] 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 082/131] 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 083/131] 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 084/131] 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 085/131] 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 086/131] 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 087/131] 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 088/131] 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 089/131] 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