diff --git a/.travis.yml b/.travis.yml index b86634a232ec6920def2b6be818ad7b1b8020c2b..4f344159d14ac33676b9f2bd3eef67b3c3df6b2e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,11 +30,6 @@ matrix: dist: trusty sudo: required env: PLUMED_CC=gcc PLUMED_CXX=g++ PLUMED_CXXFLAGS=-O3 LAPACK=yes -# then I try serial compiler on UBUNTU precise - - os: linux - dist: precise - sudo: required - env: PLUMED_CC=gcc PLUMED_CXX=g++ # test using external blas with internal lapack - os: linux dist: trusty @@ -85,7 +80,7 @@ install: # I use 1.71 since 1.72 seems to report a lot of false positive - if test "$CPPCHECK" == yes ; then ./.travis/install.cppcheck $CPPCHECK_VERSION ; fi # for plumedcheck I need latest gawk - - if test "$CPPCHECK" == yes ; then ./.travis/install.gawk ; fi + - if test "$CPPCHECK" == yes ; then ./.travis/install.gawk 4.1.4 ; fi # installation of these packages takes a lot of time # we do it only when needed - if test "$PLUMED_CXX" == "mpic++" -a "$TRAVIS_OS_NAME" == "linux" ; then sudo apt-get install -y libopenmpi-dev openmpi-bin ; fi diff --git a/.travis/install.cppcheck b/.travis/install.cppcheck index 25543080f983183abe83aa534786eea78af63679..b00de738de4a5682e13cb1dc4c9e447a28d2077e 100755 --- a/.travis/install.cppcheck +++ b/.travis/install.cppcheck @@ -3,6 +3,7 @@ set -e set -x +cd "$(mktemp -d)" git clone https://github.com/danmar/cppcheck.git cd cppcheck @@ -15,12 +16,9 @@ else version=$(git tag | tail -n 1) fi - git checkout $version make -j 4 install CFGDIR="$HOME/opt/share/cppcheck/" CXXFLAGS="-O2 -march=native -mtune=native -Wunreachable-code" PREFIX="$HOME/opt" cd ../ cppcheck --version - - diff --git a/.travis/install.doxygen b/.travis/install.doxygen index 7a425f33da380f8acd1753b03fd8c83794d3e4a4..1f020a22e0a5d7e0aa9b17b68fac69811c4642e1 100755 --- a/.travis/install.doxygen +++ b/.travis/install.doxygen @@ -3,6 +3,8 @@ set -e set -x +cd "$(mktemp -d)" + git clone https://github.com/doxygen/doxygen.git cd doxygen diff --git a/.travis/install.gawk b/.travis/install.gawk index a0a66370e1e15898f13584906b7848782649cd02..d7fdf6edf2ff42d8ce8ab37c6564d9a8e0064d45 100755 --- a/.travis/install.gawk +++ b/.travis/install.gawk @@ -3,12 +3,25 @@ set -e set -x -echo "installing latest gawk" -wget http://git.savannah.gnu.org/cgit/gawk.git/snapshot/gawk-4.1.4.tar.gz -tar xzf gawk-4.1.4.tar.gz -cd gawk-4.1.4 +cd "$(mktemp -d)" + +version=4.1.4 + +if [ -n "$1" ] ; then + version=$1 +fi + +echo "installing gawk $version" + +wget http://git.savannah.gnu.org/cgit/gawk.git/snapshot/gawk-$version.tar.gz + +tar xzf gawk-$version.tar.gz + +cd gawk-$version + ./configure --prefix="$HOME/opt" + make -j 4 + make install -cd ../ diff --git a/.travis/install.xdrfile b/.travis/install.xdrfile index 96fa78f40cbb085d90c908609fef081c615241c0..296a8eaf3d1bb363dd05987c077b16d2af7f36ee 100755 --- a/.travis/install.xdrfile +++ b/.travis/install.xdrfile @@ -3,16 +3,25 @@ set -e set -x +cd "$(mktemp -d)" + echo "installing xdrfile library" # wget ftp://ftp.gromacs.org/pub/contrib/xdrfile-1.1.4.tar.gz # xdrfile was removed from gromacs ftp # as a workaround I added a copy to people.sissa.it/~bussi/plumed # this complies with its license + wget people.sissa.it/~bussi/plumed/xdrfile-1.1.4.tar.gz + tar xzf xdrfile-1.1.4.tar.gz + cd xdrfile-1.1.4 + ./configure --enable-shared --prefix="$HOME/opt" + make + make install + cd ../ diff --git a/CHANGES/v2.4.txt b/CHANGES/v2.4.txt index da8969083fc5c02de5c2c5ef1a645e0e3bb87b36..c7c15e866cd6b4286a779f11071c1b2d854eb08d 100644 --- a/CHANGES/v2.4.txt +++ b/CHANGES/v2.4.txt @@ -5,6 +5,12 @@ This page contains changes that will end up in 2.4 Changes from version 2.3 which are relevant for users: +- Changes leading to incompatible behavior: + - A c++11 compliant compiler is required (see \issue{212}). This should mean: + - gcc 4.8 + - clang 3.3 + - intel 15 +- Other changes: - \ref PBMETAD : multiple walkers using files (thanks to Marco De La Pierre). - \ref PBMETAD : adaptive gaussians - \ref PBMETAD : default names for GRID and FILE (usefull with many collective variables) @@ -15,4 +21,5 @@ Changes from version 2.3 which are relevant for developers: PLUMED totally exception safe (there are still many non-safe pointers around), this made it possible to add a regtest that actually tests erroneous cmd strings and erroneous inputs. + - Due to the required c++11 support, travis-ci test on Ubuntu Precise has been removed. */ diff --git a/README b/README index 341cc3fd083084d37d79a92f2a8233bc63250ec8..55e6b5eba3a01ebc2f3b6e11dd6c17966d4b688f 100644 --- a/README +++ b/README @@ -23,7 +23,7 @@ http://www.plumed.org/documentation Needed software: * GNU make -* c/c++ compiler +* c/c++ compiler (c++11 support is required as of version 2.4). * a modern version of the "patch" * support for POSIX library dirent.h * xxd (present in most unix distributions) diff --git a/configure b/configure index eda363efcf5554e750586b2f6633b7dae06d89af..0b4f7aef76a1a233a818fd471bc1f442d76f492b 100755 --- a/configure +++ b/configure @@ -4443,9 +4443,9 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext save_CXXFLAGS="$CXXFLAGS" - CXXFLAGS="$CXXFLAGS -ansi" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -ansi" >&5 -$as_echo_n "checking whether $CXX accepts -ansi... " >&6; } + CXXFLAGS="$CXXFLAGS -std=c++11" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -std=c++11" >&5 +$as_echo_n "checking whether $CXX accepts -std=c++11... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -5056,11 +5056,15 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports explicit" >&5 -$as_echo_n "checking whether $CXX supports explicit... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX declares c++11 support" >&5 +$as_echo_n "checking whether $CXX declares c++11 support... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - class A{explicit A(){}}; + +#if __cplusplus <= 199711L +this_compiler_does_not_support_cxx11 +#endif + int main () { @@ -5075,13 +5079,14 @@ $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ; - $as_echo "#define explicit /**/" >>confdefs.h - + as_fn_error $? "C++11 support is required" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + if test "$dependency_tracking" = true then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX can generate dependency file with -MM -MF" >&5 diff --git a/configure.ac b/configure.ac index b9ecf5beca7dcd5c71370523c3220f583dc00891..be80486cdf7ff2a14bf00375e621c8396ba4cbf8 100644 --- a/configure.ac +++ b/configure.ac @@ -252,7 +252,7 @@ if test $basic_warnings == true then PLUMED_CHECK_CXXFLAG([-Wall]) PLUMED_CHECK_CXXFLAG([-pedantic]) - PLUMED_CHECK_CXXFLAG([-ansi]) + PLUMED_CHECK_CXXFLAG([-std=c++11]) fi if test $debug == true @@ -282,11 +282,17 @@ then PLUMED_CHECK_CXXFLAG([-Wold-style-cast]) fi -AC_MSG_CHECKING([whether $CXX supports explicit]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ class A{explicit A(){}};])], +AC_MSG_CHECKING([whether $CXX declares c++11 support]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +#if __cplusplus <= 199711L +this_compiler_does_not_support_cxx11 +#endif +])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) ; - AC_DEFINE([explicit],[])]) + AC_MSG_ERROR([C++11 support is required])]) + + AC_SUBST(disable_dependency_tracking) diff --git a/developer-doc/HowToContributeToPlumed.txt b/developer-doc/HowToContributeToPlumed.txt index 8f148b6e1778be6841edf7975d5f1290576288bd..ed259b6145d0a4f2e80ff538b8f9bcc1b0948621 100644 --- a/developer-doc/HowToContributeToPlumed.txt +++ b/developer-doc/HowToContributeToPlumed.txt @@ -151,7 +151,8 @@ libraries so as to make compilation straightforward for users who are using/not on how to add complilation options on this page: \ref UsingExternalLibs. N.B. you should only need to modify the configure scripts if you are using modules. Flags for activating your module at configure time will be generated automatically. - We ask you not to include C++ features that are too new and not supported by the vast majority of compilers. -As of PLUMED v2.3, we are not using any C++11 feature. This might change in the future as compilers are improved. +Until PLUMED v2.3, we were not using any C++11 feature. Since PLUMED v2.4, a C++11-compliant compiler is explicitly +requested and so you can use C++11 features. \subsection ctesting Writing regression tests diff --git a/regtest/basic/rt-make-mw/main.cpp b/regtest/basic/rt-make-mw/main.cpp index 6f4e4c8ff0d9e53baa23f9180a4b16e39dec74a6..fc435d19f06ac888c9418095f77c80787a5a8e9a 100644 --- a/regtest/basic/rt-make-mw/main.cpp +++ b/regtest/basic/rt-make-mw/main.cpp @@ -4,7 +4,7 @@ using namespace PLMD; -void go(Plumed* p,int natoms,unsigned iw,unsigned is){ +void go(Plumed& p,int natoms,unsigned iw,unsigned is){ std::vector<double> positions(3*natoms,0.0); for(unsigned i=0;i<natoms;i++) positions[i]=i+iw+is; std::vector<double> masses(natoms,1.0); @@ -12,38 +12,41 @@ void go(Plumed* p,int natoms,unsigned iw,unsigned is){ std::vector<double> box(9,0.0); std::vector<double> virial(9,0.0); - p->cmd("setStep",&is); - p->cmd("setPositions",&positions[0]); - p->cmd("setBox",&box[0]); - p->cmd("setForces",&forces[0]); - p->cmd("setVirial",&virial[0]); - p->cmd("setMasses",&masses[0]); - p->cmd("calc"); + p.cmd("setStep",&is); + p.cmd("setPositions",&positions[0]); + p.cmd("setBox",&box[0]); + p.cmd("setForces",&forces[0]); + p.cmd("setVirial",&virial[0]); + p.cmd("setMasses",&masses[0]); + p.cmd("calc"); } int main(){ - std::vector<Plumed*> p; +/* + This regtest uses a STL containing Plumed objects. + This is only possible with a c++11 compiler that implements move semantics. +*/ + std::vector<Plumed> p; unsigned nwalkers=3; unsigned nsteps=10; p.resize(nwalkers); - for(unsigned iw=0;iw<nwalkers;iw++) p[iw]=new Plumed; int natoms=10; for(unsigned iw=0;iw<nwalkers;iw++){ - p[iw]->cmd("setNatoms",&natoms); + p[iw].cmd("setNatoms",&natoms); std::ostringstream iwss; iwss<<iw; std::string file; file="test." + iwss.str() + ".log"; - p[iw]->cmd("setLogFile",file.c_str()); + p[iw].cmd("setLogFile",file.c_str()); file="plumed." + iwss.str() + ".dat"; - p[iw]->cmd("setPlumedDat",file.c_str()); - p[iw]->cmd("init"); + p[iw].cmd("setPlumedDat",file.c_str()); + p[iw].cmd("init"); } // half steps for each walker @@ -52,7 +55,5 @@ int main(){ // other half steps for each walker for(unsigned iw=0;iw<nwalkers;iw++) for(unsigned is=nsteps/2;is<nsteps;is++) go(p[iw],natoms,iw,is); - for(unsigned iw=0;iw<nwalkers;iw++) delete p[iw]; - return 0; } diff --git a/regtest/crystallization/rt-spherical-integral/config b/regtest/crystallization/rt-spherical-integral/config index 31b0428ecb877af3773c67492e5ed02d76fbda18..86881dd730e4432aee2f654848b24a98396564b2 100644 --- a/regtest/crystallization/rt-spherical-integral/config +++ b/regtest/crystallization/rt-spherical-integral/config @@ -1,3 +1,4 @@ type=driver +plumed_modules=crystallization # this is to test a different name arg="--plumed plumed.dat --ixyz trajectory.xyz --dump-forces forces --dump-forces-fmt %8.4f" # --debug-forces forces.num" diff --git a/regtest/multicolvar/rt-dist-contour/deriv.reference b/regtest/multicolvar/rt-dist-contour/deriv.reference index 148e921166fac9db5f0425d1aef6402679c141f1..531fbfce89dd19ab6d5085ec44ac370d4d2f0496 100644 --- a/regtest/multicolvar/rt-dist-contour/deriv.reference +++ b/regtest/multicolvar/rt-dist-contour/deriv.reference @@ -1,10 +1,10 @@ #! FIELDS time parameter dc.qdist 0.000000 0 0.0000 0.000000 1 0.0000 - 0.000000 2 2.7307 + 0.000000 2 -2.7307 0.000000 3 0.0000 0.000000 4 0.0000 - 0.000000 5 -2.7307 + 0.000000 5 2.7307 0.000000 6 0.0000 0.000000 7 0.0000 0.000000 8 0.0000 @@ -13,2044 +13,2044 @@ 0.000000 11 0.0000 0.000000 12 0.0000 0.000000 13 0.0000 - 0.000000 14 3.7283 + 0.000000 14 -3.7283 1.000000 0 -0.0099 1.000000 1 -0.0015 - 1.000000 2 2.8856 + 1.000000 2 -2.8856 1.000000 3 0.0099 1.000000 4 0.0015 - 1.000000 5 -2.8856 + 1.000000 5 2.8856 1.000000 6 -0.0000 1.000000 7 -0.0000 1.000000 8 -0.0143 1.000000 9 -0.0000 1.000000 10 -0.0000 1.000000 11 -0.0022 - 1.000000 12 0.0143 - 1.000000 13 0.0022 - 1.000000 14 4.1634 + 1.000000 12 -0.0143 + 1.000000 13 -0.0022 + 1.000000 14 -4.1634 2.000000 0 -0.0191 2.000000 1 -0.0059 - 2.000000 2 3.0068 + 2.000000 2 -3.0068 2.000000 3 0.0191 2.000000 4 0.0059 - 2.000000 5 -3.0068 + 2.000000 5 3.0068 2.000000 6 -0.0002 2.000000 7 -0.0001 2.000000 8 -0.0287 2.000000 9 -0.0001 2.000000 10 -0.0000 2.000000 11 -0.0089 - 2.000000 12 0.0287 - 2.000000 13 0.0089 - 2.000000 14 4.5204 + 2.000000 12 -0.0287 + 2.000000 13 -0.0089 + 2.000000 14 -4.5204 3.000000 0 -0.0270 3.000000 1 -0.0130 - 3.000000 2 3.0678 + 3.000000 2 -3.0678 3.000000 3 0.0270 3.000000 4 0.0130 - 3.000000 5 -3.0678 + 3.000000 5 3.0678 3.000000 6 -0.0004 3.000000 7 -0.0002 3.000000 8 -0.0414 3.000000 9 -0.0002 3.000000 10 -0.0001 3.000000 11 -0.0200 - 3.000000 12 0.0414 - 3.000000 13 0.0200 - 3.000000 14 4.7057 + 3.000000 12 -0.0414 + 3.000000 13 -0.0200 + 3.000000 14 -4.7057 4.000000 0 -0.0330 4.000000 1 -0.0226 - 4.000000 2 3.0553 + 4.000000 2 -3.0553 4.000000 3 0.0330 4.000000 4 0.0226 - 4.000000 5 -3.0553 + 4.000000 5 3.0553 4.000000 6 -0.0005 4.000000 7 -0.0004 4.000000 8 -0.0504 4.000000 9 -0.0004 4.000000 10 -0.0003 4.000000 11 -0.0345 - 4.000000 12 0.0504 - 4.000000 13 0.0345 - 4.000000 14 4.6674 + 4.000000 12 -0.0504 + 4.000000 13 -0.0345 + 4.000000 14 -4.6674 5.000000 0 -0.0366 5.000000 1 -0.0341 - 5.000000 2 2.9720 + 5.000000 2 -2.9720 5.000000 3 0.0366 5.000000 4 0.0341 - 5.000000 5 -2.9720 + 5.000000 5 2.9720 5.000000 6 -0.0007 5.000000 7 -0.0006 5.000000 8 -0.0544 5.000000 9 -0.0006 5.000000 10 -0.0006 5.000000 11 -0.0506 - 5.000000 12 0.0544 - 5.000000 13 0.0506 - 5.000000 14 4.4165 + 5.000000 12 -0.0544 + 5.000000 13 -0.0506 + 5.000000 14 -4.4165 6.000000 0 -0.0373 6.000000 1 -0.0470 - 6.000000 2 2.8361 + 6.000000 2 -2.8361 6.000000 3 0.0373 6.000000 4 0.0470 - 6.000000 5 -2.8361 + 6.000000 5 2.8361 6.000000 6 -0.0007 6.000000 7 -0.0009 6.000000 8 -0.0529 6.000000 9 -0.0009 6.000000 10 -0.0011 6.000000 11 -0.0666 - 6.000000 12 0.0529 - 6.000000 13 0.0666 - 6.000000 14 4.0218 + 6.000000 12 -0.0529 + 6.000000 13 -0.0666 + 6.000000 14 -4.0218 7.000000 0 -0.0348 7.000000 1 -0.0607 - 7.000000 2 2.6773 + 7.000000 2 -2.6773 7.000000 3 0.0348 7.000000 4 0.0607 - 7.000000 5 -2.6773 + 7.000000 5 2.6773 7.000000 6 -0.0006 7.000000 7 -0.0011 7.000000 8 -0.0466 7.000000 9 -0.0011 7.000000 10 -0.0018 7.000000 11 -0.0813 - 7.000000 12 0.0466 - 7.000000 13 0.0813 - 7.000000 14 3.5839 + 7.000000 12 -0.0466 + 7.000000 13 -0.0813 + 7.000000 14 -3.5839 8.000000 0 -0.0290 8.000000 1 -0.0746 - 8.000000 2 2.5300 + 8.000000 2 -2.5300 8.000000 3 0.0290 8.000000 4 0.0746 - 8.000000 5 -2.5300 + 8.000000 5 2.5300 8.000000 6 -0.0004 8.000000 7 -0.0011 8.000000 8 -0.0367 8.000000 9 -0.0011 8.000000 10 -0.0028 8.000000 11 -0.0943 - 8.000000 12 0.0367 - 8.000000 13 0.0943 - 8.000000 14 3.2006 + 8.000000 12 -0.0367 + 8.000000 13 -0.0943 + 8.000000 14 -3.2006 9.000000 0 -0.0197 9.000000 1 -0.0878 - 9.000000 2 2.4265 + 9.000000 2 -2.4265 9.000000 3 0.0197 9.000000 4 0.0878 - 9.000000 5 -2.4265 + 9.000000 5 2.4265 9.000000 6 -0.0002 9.000000 7 -0.0009 9.000000 8 -0.0239 9.000000 9 -0.0009 9.000000 10 -0.0039 9.000000 11 -0.1065 - 9.000000 12 0.0239 - 9.000000 13 0.1065 - 9.000000 14 2.9440 + 9.000000 12 -0.0239 + 9.000000 13 -0.1065 + 9.000000 14 -2.9440 10.000000 0 -0.0071 10.000000 1 -0.0997 - 10.000000 2 2.3893 + 10.000000 2 -2.3893 10.000000 3 0.0071 10.000000 4 0.0997 - 10.000000 5 -2.3893 + 10.000000 5 2.3893 10.000000 6 -0.0000 10.000000 7 -0.0004 10.000000 8 -0.0085 10.000000 9 -0.0004 10.000000 10 -0.0050 10.000000 11 -0.1192 - 10.000000 12 0.0085 - 10.000000 13 0.1192 - 10.000000 14 2.8544 + 10.000000 12 -0.0085 + 10.000000 13 -0.1192 + 10.000000 14 -2.8544 11.000000 0 0.0087 11.000000 1 -0.1097 - 11.000000 2 2.4265 + 11.000000 2 -2.4265 11.000000 3 -0.0087 11.000000 4 0.1097 - 11.000000 5 -2.4265 + 11.000000 5 2.4265 11.000000 6 -0.0000 11.000000 7 0.0005 11.000000 8 0.0106 11.000000 9 0.0005 11.000000 10 -0.0060 11.000000 11 -0.1330 - 11.000000 12 -0.0106 - 11.000000 13 0.1330 - 11.000000 14 2.9440 + 11.000000 12 0.0106 + 11.000000 13 -0.1330 + 11.000000 14 -2.9440 12.000000 0 0.0273 12.000000 1 -0.1169 - 12.000000 2 2.5300 + 12.000000 2 -2.5300 12.000000 3 -0.0273 12.000000 4 0.1169 - 12.000000 5 -2.5300 + 12.000000 5 2.5300 12.000000 6 -0.0004 12.000000 7 0.0016 12.000000 8 0.0345 12.000000 9 0.0016 12.000000 10 -0.0068 12.000000 11 -0.1478 - 12.000000 12 -0.0345 - 12.000000 13 0.1478 - 12.000000 14 3.2006 + 12.000000 12 0.0345 + 12.000000 13 -0.1478 + 12.000000 14 -3.2006 13.000000 0 0.0481 13.000000 1 -0.1208 - 13.000000 2 2.6773 + 13.000000 2 -2.6773 13.000000 3 -0.0481 13.000000 4 0.1208 - 13.000000 5 -2.6773 + 13.000000 5 2.6773 13.000000 6 -0.0012 13.000000 7 0.0029 13.000000 8 0.0644 13.000000 9 0.0029 13.000000 10 -0.0073 13.000000 11 -0.1617 - 13.000000 12 -0.0644 - 13.000000 13 0.1617 - 13.000000 14 3.5839 + 13.000000 12 0.0644 + 13.000000 13 -0.1617 + 13.000000 14 -3.5839 14.000000 0 0.0707 14.000000 1 -0.1208 - 14.000000 2 2.8361 + 14.000000 2 -2.8361 14.000000 3 -0.0707 14.000000 4 0.1208 - 14.000000 5 -2.8361 + 14.000000 5 2.8361 14.000000 6 -0.0025 14.000000 7 0.0043 14.000000 8 0.1002 14.000000 9 0.0043 14.000000 10 -0.0073 14.000000 11 -0.1714 - 14.000000 12 -0.1002 - 14.000000 13 0.1714 - 14.000000 14 4.0218 + 14.000000 12 0.1002 + 14.000000 13 -0.1714 + 14.000000 14 -4.0218 15.000000 0 0.0942 15.000000 1 -0.1167 - 15.000000 2 2.9720 + 15.000000 2 -2.9720 15.000000 3 -0.0942 15.000000 4 0.1167 - 15.000000 5 -2.9720 + 15.000000 5 2.9720 15.000000 6 -0.0044 15.000000 7 0.0055 15.000000 8 0.1400 15.000000 9 0.0055 15.000000 10 -0.0068 15.000000 11 -0.1734 - 15.000000 12 -0.1400 - 15.000000 13 0.1734 - 15.000000 14 4.4165 + 15.000000 12 0.1400 + 15.000000 13 -0.1734 + 15.000000 14 -4.4165 16.000000 0 0.1180 16.000000 1 -0.1081 - 16.000000 2 3.0553 + 16.000000 2 -3.0553 16.000000 3 -0.1180 16.000000 4 0.1081 - 16.000000 5 -3.0553 + 16.000000 5 3.0553 16.000000 6 -0.0070 16.000000 7 0.0064 16.000000 8 0.1802 16.000000 9 0.0064 16.000000 10 -0.0058 16.000000 11 -0.1651 - 16.000000 12 -0.1802 - 16.000000 13 0.1651 - 16.000000 14 4.6674 + 16.000000 12 0.1802 + 16.000000 13 -0.1651 + 16.000000 14 -4.6674 17.000000 0 0.1411 17.000000 1 -0.0948 - 17.000000 2 3.0678 + 17.000000 2 -3.0678 17.000000 3 -0.1411 17.000000 4 0.0948 - 17.000000 5 -3.0678 + 17.000000 5 3.0678 17.000000 6 -0.0100 17.000000 7 0.0067 17.000000 8 0.2164 17.000000 9 0.0067 17.000000 10 -0.0045 17.000000 11 -0.1454 - 17.000000 12 -0.2164 - 17.000000 13 0.1454 - 17.000000 14 4.7057 + 17.000000 12 0.2164 + 17.000000 13 -0.1454 + 17.000000 14 -4.7057 18.000000 0 0.1627 18.000000 1 -0.0769 - 18.000000 2 3.0068 + 18.000000 2 -3.0068 18.000000 3 -0.1627 18.000000 4 0.0769 - 18.000000 5 -3.0068 + 18.000000 5 3.0068 18.000000 6 -0.0132 18.000000 7 0.0063 18.000000 8 0.2447 18.000000 9 0.0063 18.000000 10 -0.0030 18.000000 11 -0.1157 - 18.000000 12 -0.2447 - 18.000000 13 0.1157 - 18.000000 14 4.5204 + 18.000000 12 0.2447 + 18.000000 13 -0.1157 + 18.000000 14 -4.5204 19.000000 0 0.1820 19.000000 1 -0.0546 - 19.000000 2 2.8856 + 19.000000 2 -2.8856 19.000000 3 -0.1820 19.000000 4 0.0546 - 19.000000 5 -2.8856 + 19.000000 5 2.8856 19.000000 6 -0.0166 19.000000 7 0.0050 19.000000 8 0.2626 19.000000 9 0.0050 19.000000 10 -0.0015 19.000000 11 -0.0788 - 19.000000 12 -0.2626 - 19.000000 13 0.0788 - 19.000000 14 4.1634 + 19.000000 12 0.2626 + 19.000000 13 -0.0788 + 19.000000 14 -4.1634 20.000000 0 0.1980 20.000000 1 -0.0282 - 20.000000 2 2.7307 + 20.000000 2 -2.7307 20.000000 3 -0.1980 20.000000 4 0.0282 - 20.000000 5 -2.7307 + 20.000000 5 2.7307 20.000000 6 -0.0196 20.000000 7 0.0028 20.000000 8 0.2703 20.000000 9 0.0028 20.000000 10 -0.0004 20.000000 11 -0.0385 - 20.000000 12 -0.2703 - 20.000000 13 0.0385 - 20.000000 14 3.7283 + 20.000000 12 0.2703 + 20.000000 13 -0.0385 + 20.000000 14 -3.7283 21.000000 0 0.2100 21.000000 1 0.0018 - 21.000000 2 2.5757 + 21.000000 2 -2.5757 21.000000 3 -0.2100 21.000000 4 -0.0018 - 21.000000 5 -2.5757 + 21.000000 5 2.5757 21.000000 6 -0.0220 21.000000 7 -0.0002 21.000000 8 0.2704 21.000000 9 -0.0002 21.000000 10 -0.0000 21.000000 11 0.0023 - 21.000000 12 -0.2704 - 21.000000 13 -0.0023 - 21.000000 14 3.3171 + 21.000000 12 0.2704 + 21.000000 13 0.0023 + 21.000000 14 -3.3171 22.000000 0 0.2172 22.000000 1 0.0347 - 22.000000 2 2.4545 + 22.000000 2 -2.4545 22.000000 3 -0.2172 22.000000 4 -0.0347 - 22.000000 5 -2.4545 + 22.000000 5 2.4545 22.000000 6 -0.0236 22.000000 7 -0.0038 22.000000 8 0.2666 22.000000 9 -0.0038 22.000000 10 -0.0006 22.000000 11 0.0426 - 22.000000 12 -0.2666 - 22.000000 13 -0.0426 - 22.000000 14 3.0123 + 22.000000 12 0.2666 + 22.000000 13 0.0426 + 22.000000 14 -3.0123 23.000000 0 0.2191 23.000000 1 0.0698 - 23.000000 2 2.3935 + 23.000000 2 -2.3935 23.000000 3 -0.2191 23.000000 4 -0.0698 - 23.000000 5 -2.3935 + 23.000000 5 2.3935 23.000000 6 -0.0240 23.000000 7 -0.0076 23.000000 8 0.2623 23.000000 9 -0.0076 23.000000 10 -0.0024 23.000000 11 0.0836 - 23.000000 12 -0.2623 - 23.000000 13 -0.0836 - 23.000000 14 2.8645 + 23.000000 12 0.2623 + 23.000000 13 0.0836 + 23.000000 14 -2.8645 24.000000 0 0.2152 24.000000 1 0.1062 - 24.000000 2 2.4060 + 24.000000 2 -2.4060 24.000000 3 -0.2152 24.000000 4 -0.1062 - 24.000000 5 -2.4060 + 24.000000 5 2.4060 24.000000 6 -0.0232 24.000000 7 -0.0114 24.000000 8 0.2589 24.000000 9 -0.0114 24.000000 10 -0.0056 24.000000 11 0.1278 - 24.000000 12 -0.2589 - 24.000000 13 -0.1278 - 24.000000 14 2.8945 + 24.000000 12 0.2589 + 24.000000 13 0.1278 + 24.000000 14 -2.8945 25.000000 0 0.2051 25.000000 1 0.1429 - 25.000000 2 2.4893 + 25.000000 2 -2.4893 25.000000 3 -0.2051 25.000000 4 -0.1429 - 25.000000 5 -2.4893 + 25.000000 5 2.4893 25.000000 6 -0.0210 25.000000 7 -0.0147 25.000000 8 0.2553 25.000000 9 -0.0147 25.000000 10 -0.0102 25.000000 11 0.1778 - 25.000000 12 -0.2553 - 25.000000 13 -0.1778 - 25.000000 14 3.0983 + 25.000000 12 0.2553 + 25.000000 13 0.1778 + 25.000000 14 -3.0983 26.000000 0 0.1887 26.000000 1 0.1788 - 26.000000 2 2.6252 + 26.000000 2 -2.6252 26.000000 3 -0.1887 26.000000 4 -0.1788 - 26.000000 5 -2.6252 + 26.000000 5 2.6252 26.000000 6 -0.0178 26.000000 7 -0.0169 26.000000 8 0.2477 26.000000 9 -0.0169 26.000000 10 -0.0160 26.000000 11 0.2347 - 26.000000 12 -0.2477 - 26.000000 13 -0.2347 - 26.000000 14 3.4458 + 26.000000 12 0.2477 + 26.000000 13 0.2347 + 26.000000 14 -3.4458 27.000000 0 0.1661 27.000000 1 0.2129 - 27.000000 2 2.7841 + 27.000000 2 -2.7841 27.000000 3 -0.1661 27.000000 4 -0.2129 - 27.000000 5 -2.7841 + 27.000000 5 2.7841 27.000000 6 -0.0138 27.000000 7 -0.0177 27.000000 8 0.2311 27.000000 9 -0.0177 27.000000 10 -0.0227 27.000000 11 0.2964 - 27.000000 12 -0.2311 - 27.000000 13 -0.2964 - 27.000000 14 3.8755 + 27.000000 12 0.2311 + 27.000000 13 0.2964 + 27.000000 14 -3.8755 28.000000 0 0.1373 28.000000 1 0.2440 - 28.000000 2 2.9313 + 28.000000 2 -2.9313 28.000000 3 -0.1373 28.000000 4 -0.2440 - 28.000000 5 -2.9313 + 28.000000 5 2.9313 28.000000 6 -0.0094 28.000000 7 -0.0168 28.000000 8 0.2012 28.000000 9 -0.0168 28.000000 10 -0.0298 28.000000 11 0.3577 - 28.000000 12 -0.2012 - 28.000000 13 -0.3577 - 28.000000 14 4.2963 + 28.000000 12 0.2012 + 28.000000 13 0.3577 + 28.000000 14 -4.2963 29.000000 0 0.1028 29.000000 1 0.2712 - 29.000000 2 3.0348 + 29.000000 2 -3.0348 29.000000 3 -0.1028 29.000000 4 -0.2712 - 29.000000 5 -3.0348 + 29.000000 5 3.0348 29.000000 6 -0.0053 29.000000 7 -0.0139 29.000000 8 0.1560 29.000000 9 -0.0139 29.000000 10 -0.0368 29.000000 11 0.4115 - 29.000000 12 -0.1560 - 29.000000 13 -0.4115 - 29.000000 14 4.6050 + 29.000000 12 0.1560 + 29.000000 13 0.4115 + 29.000000 14 -4.6050 30.000000 0 0.0632 30.000000 1 0.2933 - 30.000000 2 3.0720 + 30.000000 2 -3.0720 30.000000 3 -0.0632 30.000000 4 -0.2933 - 30.000000 5 -3.0720 + 30.000000 5 3.0720 30.000000 6 -0.0020 30.000000 7 -0.0093 30.000000 8 0.0971 30.000000 9 -0.0093 30.000000 10 -0.0430 30.000000 11 0.4504 - 30.000000 12 -0.0971 - 30.000000 13 -0.4504 - 30.000000 14 4.7186 + 30.000000 12 0.0971 + 30.000000 13 0.4504 + 30.000000 14 -4.7186 31.000000 0 0.0193 31.000000 1 0.3094 - 31.000000 2 3.0348 + 31.000000 2 -3.0348 31.000000 3 -0.0193 31.000000 4 -0.3094 - 31.000000 5 -3.0348 + 31.000000 5 3.0348 31.000000 6 -0.0002 31.000000 7 -0.0030 31.000000 8 0.0293 31.000000 9 -0.0030 31.000000 10 -0.0479 31.000000 11 0.4695 - 31.000000 12 -0.0293 - 31.000000 13 -0.4695 - 31.000000 14 4.6050 + 31.000000 12 0.0293 + 31.000000 13 0.4695 + 31.000000 14 -4.6050 32.000000 0 -0.0280 32.000000 1 0.3188 - 32.000000 2 2.9313 + 32.000000 2 -2.9313 32.000000 3 0.0280 32.000000 4 -0.3188 - 32.000000 5 -2.9313 + 32.000000 5 2.9313 32.000000 6 -0.0004 32.000000 7 0.0045 32.000000 8 -0.0410 32.000000 9 0.0045 32.000000 10 -0.0508 32.000000 11 0.4672 - 32.000000 12 0.0410 - 32.000000 13 -0.4672 - 32.000000 14 4.2963 + 32.000000 12 -0.0410 + 32.000000 13 0.4672 + 32.000000 14 -4.2963 33.000000 0 -0.0777 33.000000 1 0.3207 - 33.000000 2 2.7841 + 33.000000 2 -2.7841 33.000000 3 0.0777 33.000000 4 -0.3207 - 33.000000 5 -2.7841 + 33.000000 5 2.7841 33.000000 6 -0.0030 33.000000 7 0.0125 33.000000 8 -0.1081 33.000000 9 0.0125 33.000000 10 -0.0514 33.000000 11 0.4465 - 33.000000 12 0.1081 - 33.000000 13 -0.4465 - 33.000000 14 3.8755 + 33.000000 12 -0.1081 + 33.000000 13 0.4465 + 33.000000 14 -3.8755 34.000000 0 -0.1285 34.000000 1 0.3148 - 34.000000 2 2.6252 + 34.000000 2 -2.6252 34.000000 3 0.1285 34.000000 4 -0.3148 - 34.000000 5 -2.6252 + 34.000000 5 2.6252 34.000000 6 -0.0083 34.000000 7 0.0202 34.000000 8 -0.1687 34.000000 9 0.0202 34.000000 10 -0.0495 34.000000 11 0.4132 - 34.000000 12 0.1687 - 34.000000 13 -0.4132 - 34.000000 14 3.4458 + 34.000000 12 -0.1687 + 34.000000 13 0.4132 + 34.000000 14 -3.4458 35.000000 0 -0.1792 35.000000 1 0.3006 - 35.000000 2 2.4893 + 35.000000 2 -2.4893 35.000000 3 0.1792 35.000000 4 -0.3006 - 35.000000 5 -2.4893 + 35.000000 5 2.4893 35.000000 6 -0.0161 35.000000 7 0.0269 35.000000 8 -0.2231 35.000000 9 0.0269 35.000000 10 -0.0452 35.000000 11 0.3742 - 35.000000 12 0.2231 - 35.000000 13 -0.3742 - 35.000000 14 3.0983 + 35.000000 12 -0.2231 + 35.000000 13 0.3742 + 35.000000 14 -3.0983 36.000000 0 -0.2285 36.000000 1 0.2782 - 36.000000 2 2.4060 + 36.000000 2 -2.4060 36.000000 3 0.2285 36.000000 4 -0.2782 - 36.000000 5 -2.4060 + 36.000000 5 2.4060 36.000000 6 -0.0261 36.000000 7 0.0318 36.000000 8 -0.2749 36.000000 9 0.0318 36.000000 10 -0.0387 36.000000 11 0.3347 - 36.000000 12 0.2749 - 36.000000 13 -0.3347 - 36.000000 14 2.8945 + 36.000000 12 -0.2749 + 36.000000 13 0.3347 + 36.000000 14 -2.8945 37.000000 0 -0.2749 37.000000 1 0.2476 - 37.000000 2 2.3935 + 37.000000 2 -2.3935 37.000000 3 0.2749 37.000000 4 -0.2476 - 37.000000 5 -2.3935 + 37.000000 5 2.3935 37.000000 6 -0.0378 37.000000 7 0.0340 37.000000 8 -0.3290 37.000000 9 0.0340 37.000000 10 -0.0307 37.000000 11 0.2963 - 37.000000 12 0.3290 - 37.000000 13 -0.2963 - 37.000000 14 2.8645 + 37.000000 12 -0.3290 + 37.000000 13 0.2963 + 37.000000 14 -2.8645 38.000000 0 -0.3172 38.000000 1 0.2093 - 38.000000 2 2.4545 + 38.000000 2 -2.4545 38.000000 3 0.3172 38.000000 4 -0.2093 - 38.000000 5 -2.4545 + 38.000000 5 2.4545 38.000000 6 -0.0503 38.000000 7 0.0332 38.000000 8 -0.3893 38.000000 9 0.0332 38.000000 10 -0.0219 38.000000 11 0.2568 - 38.000000 12 0.3893 - 38.000000 13 -0.2568 - 38.000000 14 3.0123 + 38.000000 12 -0.3893 + 38.000000 13 0.2568 + 38.000000 14 -3.0123 39.000000 0 -0.3540 39.000000 1 0.1637 - 39.000000 2 2.5757 + 39.000000 2 -2.5757 39.000000 3 0.3540 39.000000 4 -0.1637 - 39.000000 5 -2.5757 + 39.000000 5 2.5757 39.000000 6 -0.0626 39.000000 7 0.0290 39.000000 8 -0.4559 39.000000 9 0.0290 39.000000 10 -0.0134 39.000000 11 0.2108 - 39.000000 12 0.4559 - 39.000000 13 -0.2108 - 39.000000 14 3.3171 + 39.000000 12 -0.4559 + 39.000000 13 0.2108 + 39.000000 14 -3.3171 40.000000 0 -0.3841 40.000000 1 0.1118 - 40.000000 2 2.7307 + 40.000000 2 -2.7307 40.000000 3 0.3841 40.000000 4 -0.1118 - 40.000000 5 -2.7307 + 40.000000 5 2.7307 40.000000 6 -0.0738 40.000000 7 0.0215 40.000000 8 -0.5244 40.000000 9 0.0215 40.000000 10 -0.0062 40.000000 11 0.1526 - 40.000000 12 0.5244 - 40.000000 13 -0.1526 - 40.000000 14 3.7283 + 40.000000 12 -0.5244 + 40.000000 13 0.1526 + 40.000000 14 -3.7283 41.000000 0 -0.4064 41.000000 1 0.0544 - 41.000000 2 2.8856 + 41.000000 2 -2.8856 41.000000 3 0.4064 41.000000 4 -0.0544 - 41.000000 5 -2.8856 + 41.000000 5 2.8856 41.000000 6 -0.0826 41.000000 7 0.0111 41.000000 8 -0.5863 41.000000 9 0.0111 41.000000 10 -0.0015 41.000000 11 0.0786 - 41.000000 12 0.5863 - 41.000000 13 -0.0786 - 41.000000 14 4.1634 + 41.000000 12 -0.5863 + 41.000000 13 0.0786 + 41.000000 14 -4.1634 42.000000 0 -0.4199 42.000000 1 -0.0071 - 42.000000 2 3.0068 + 42.000000 2 -3.0068 42.000000 3 0.4199 42.000000 4 0.0071 - 42.000000 5 -3.0068 + 42.000000 5 3.0068 42.000000 6 -0.0882 42.000000 7 -0.0015 42.000000 8 -0.6313 42.000000 9 -0.0015 42.000000 10 -0.0000 42.000000 11 -0.0106 - 42.000000 12 0.6313 - 42.000000 13 0.0106 - 42.000000 14 4.5204 + 42.000000 12 -0.6313 + 42.000000 13 -0.0106 + 42.000000 14 -4.5204 43.000000 0 -0.4240 43.000000 1 -0.0714 - 43.000000 2 3.0678 + 43.000000 2 -3.0678 43.000000 3 0.4240 43.000000 4 0.0714 - 43.000000 5 -3.0678 + 43.000000 5 3.0678 43.000000 6 -0.0899 43.000000 7 -0.0151 43.000000 8 -0.6504 43.000000 9 -0.0151 43.000000 10 -0.0025 43.000000 11 -0.1095 - 43.000000 12 0.6504 - 43.000000 13 0.1095 - 43.000000 14 4.7057 + 43.000000 12 -0.6504 + 43.000000 13 -0.1095 + 43.000000 14 -4.7057 44.000000 0 -0.4181 44.000000 1 -0.1371 - 44.000000 2 3.0553 + 44.000000 2 -3.0553 44.000000 3 0.4181 44.000000 4 0.1371 - 44.000000 5 -3.0553 + 44.000000 5 3.0553 44.000000 6 -0.0874 44.000000 7 -0.0287 44.000000 8 -0.6387 44.000000 9 -0.0287 44.000000 10 -0.0094 44.000000 11 -0.2094 - 44.000000 12 0.6387 - 44.000000 13 0.2094 - 44.000000 14 4.6674 + 44.000000 12 -0.6387 + 44.000000 13 -0.2094 + 44.000000 14 -4.6674 45.000000 0 -0.4019 45.000000 1 -0.2025 - 45.000000 2 2.9720 + 45.000000 2 -2.9720 45.000000 3 0.4019 45.000000 4 0.2025 - 45.000000 5 -2.9720 + 45.000000 5 2.9720 45.000000 6 -0.0807 45.000000 7 -0.0407 45.000000 8 -0.5972 45.000000 9 -0.0407 45.000000 10 -0.0205 45.000000 11 -0.3009 - 45.000000 12 0.5972 - 45.000000 13 0.3009 - 45.000000 14 4.4165 + 45.000000 12 -0.5972 + 45.000000 13 -0.3009 + 45.000000 14 -4.4165 46.000000 0 -0.3752 46.000000 1 -0.2661 - 46.000000 2 2.8361 + 46.000000 2 -2.8361 46.000000 3 0.3752 46.000000 4 0.2661 - 46.000000 5 -2.8361 + 46.000000 5 2.8361 46.000000 6 -0.0704 46.000000 7 -0.0499 46.000000 8 -0.5321 46.000000 9 -0.0499 46.000000 10 -0.0354 46.000000 11 -0.3773 - 46.000000 12 0.5321 - 46.000000 13 0.3773 - 46.000000 14 4.0218 + 46.000000 12 -0.5321 + 46.000000 13 -0.3773 + 46.000000 14 -4.0218 47.000000 0 -0.3385 47.000000 1 -0.3261 - 47.000000 2 2.6773 + 47.000000 2 -2.6773 47.000000 3 0.3385 47.000000 4 0.3261 - 47.000000 5 -2.6773 + 47.000000 5 2.6773 47.000000 6 -0.0573 47.000000 7 -0.0552 47.000000 8 -0.4531 47.000000 9 -0.0552 47.000000 10 -0.0532 47.000000 11 -0.4365 - 47.000000 12 0.4531 - 47.000000 13 0.4365 - 47.000000 14 3.5839 + 47.000000 12 -0.4531 + 47.000000 13 -0.4365 + 47.000000 14 -3.5839 48.000000 0 -0.2920 48.000000 1 -0.3810 - 48.000000 2 2.5300 + 48.000000 2 -2.5300 48.000000 3 0.2920 48.000000 4 0.3810 - 48.000000 5 -2.5300 + 48.000000 5 2.5300 48.000000 6 -0.0426 48.000000 7 -0.0556 48.000000 8 -0.3694 48.000000 9 -0.0556 48.000000 10 -0.0726 48.000000 11 -0.4819 - 48.000000 12 0.3694 - 48.000000 13 0.4819 - 48.000000 14 3.2006 + 48.000000 12 -0.3694 + 48.000000 13 -0.4819 + 48.000000 14 -3.2006 49.000000 0 -0.2366 49.000000 1 -0.4291 - 49.000000 2 2.4265 + 49.000000 2 -2.4265 49.000000 3 0.2366 49.000000 4 0.4291 - 49.000000 5 -2.4265 + 49.000000 5 2.4265 49.000000 6 -0.0280 49.000000 7 -0.0508 49.000000 8 -0.2871 49.000000 9 -0.0508 49.000000 10 -0.0921 49.000000 11 -0.5206 - 49.000000 12 0.2871 - 49.000000 13 0.5206 - 49.000000 14 2.9440 + 49.000000 12 -0.2871 + 49.000000 13 -0.5206 + 49.000000 14 -2.9440 50.000000 0 -0.1733 50.000000 1 -0.4690 - 50.000000 2 2.3893 + 50.000000 2 -2.3893 50.000000 3 0.1733 50.000000 4 0.4690 - 50.000000 5 -2.3893 + 50.000000 5 2.3893 50.000000 6 -0.0150 50.000000 7 -0.0406 50.000000 8 -0.2071 50.000000 9 -0.0406 50.000000 10 -0.1100 50.000000 11 -0.5603 - 50.000000 12 0.2071 - 50.000000 13 0.5603 - 50.000000 14 2.8544 + 50.000000 12 -0.2071 + 50.000000 13 -0.5603 + 50.000000 14 -2.8544 51.000000 0 -0.1033 51.000000 1 -0.4994 - 51.000000 2 2.4265 + 51.000000 2 -2.4265 51.000000 3 0.1033 51.000000 4 0.4994 - 51.000000 5 -2.4265 + 51.000000 5 2.4265 51.000000 6 -0.0053 51.000000 7 -0.0258 51.000000 8 -0.1253 51.000000 9 -0.0258 51.000000 10 -0.1247 51.000000 11 -0.6059 - 51.000000 12 0.1253 - 51.000000 13 0.6059 - 51.000000 14 2.9440 + 51.000000 12 -0.1253 + 51.000000 13 -0.6059 + 51.000000 14 -2.9440 52.000000 0 -0.0281 52.000000 1 -0.5192 - 52.000000 2 2.5300 + 52.000000 2 -2.5300 52.000000 3 0.0281 52.000000 4 0.5192 - 52.000000 5 -2.5300 + 52.000000 5 2.5300 52.000000 6 -0.0004 52.000000 7 -0.0073 52.000000 8 -0.0355 52.000000 9 -0.0073 52.000000 10 -0.1348 52.000000 11 -0.6569 - 52.000000 12 0.0355 - 52.000000 13 0.6569 - 52.000000 14 3.2006 + 52.000000 12 -0.0355 + 52.000000 13 -0.6569 + 52.000000 14 -3.2006 53.000000 0 0.0508 53.000000 1 -0.5276 - 53.000000 2 2.6773 + 53.000000 2 -2.6773 53.000000 3 -0.0508 53.000000 4 0.5276 - 53.000000 5 -2.6773 + 53.000000 5 2.6773 53.000000 6 -0.0013 53.000000 7 0.0134 53.000000 8 0.0680 53.000000 9 0.0134 53.000000 10 -0.1392 53.000000 11 -0.7062 - 53.000000 12 -0.0680 - 53.000000 13 0.7062 - 53.000000 14 3.5839 + 53.000000 12 0.0680 + 53.000000 13 -0.7062 + 53.000000 14 -3.5839 54.000000 0 0.1315 54.000000 1 -0.5237 - 54.000000 2 2.8361 + 54.000000 2 -2.8361 54.000000 3 -0.1315 54.000000 4 0.5237 - 54.000000 5 -2.8361 + 54.000000 5 2.8361 54.000000 6 -0.0086 54.000000 7 0.0344 54.000000 8 0.1865 54.000000 9 0.0344 54.000000 10 -0.1372 54.000000 11 -0.7427 - 54.000000 12 -0.1865 - 54.000000 13 0.7427 - 54.000000 14 4.0218 + 54.000000 12 0.1865 + 54.000000 13 -0.7427 + 54.000000 14 -4.0218 55.000000 0 0.2122 55.000000 1 -0.5074 - 55.000000 2 2.9720 + 55.000000 2 -2.9720 55.000000 3 -0.2122 55.000000 4 0.5074 - 55.000000 5 -2.9720 + 55.000000 5 2.9720 55.000000 6 -0.0225 55.000000 7 0.0538 55.000000 8 0.3153 55.000000 9 0.0538 55.000000 10 -0.1287 55.000000 11 -0.7540 - 55.000000 12 -0.3153 - 55.000000 13 0.7540 - 55.000000 14 4.4165 + 55.000000 12 0.3153 + 55.000000 13 -0.7540 + 55.000000 14 -4.4165 56.000000 0 0.2908 56.000000 1 -0.4786 - 56.000000 2 3.0553 + 56.000000 2 -3.0553 56.000000 3 -0.2908 56.000000 4 0.4786 - 56.000000 5 -3.0553 + 56.000000 5 3.0553 56.000000 6 -0.0423 56.000000 7 0.0696 56.000000 8 0.4442 56.000000 9 0.0696 56.000000 10 -0.1145 56.000000 11 -0.7311 - 56.000000 12 -0.4442 - 56.000000 13 0.7311 - 56.000000 14 4.6674 + 56.000000 12 0.4442 + 56.000000 13 -0.7311 + 56.000000 14 -4.6674 57.000000 0 0.3655 57.000000 1 -0.4374 - 57.000000 2 3.0678 + 57.000000 2 -3.0678 57.000000 3 -0.3655 57.000000 4 0.4374 - 57.000000 5 -3.0678 + 57.000000 5 3.0678 57.000000 6 -0.0668 57.000000 7 0.0799 57.000000 8 0.5606 57.000000 9 0.0799 57.000000 10 -0.0957 57.000000 11 -0.6710 - 57.000000 12 -0.5606 - 57.000000 13 0.6710 - 57.000000 14 4.7057 + 57.000000 12 0.5606 + 57.000000 13 -0.6710 + 57.000000 14 -4.7057 58.000000 0 0.4342 58.000000 1 -0.3845 - 58.000000 2 3.0068 + 58.000000 2 -3.0068 58.000000 3 -0.4342 58.000000 4 0.3845 - 58.000000 5 -3.0068 + 58.000000 5 3.0068 58.000000 6 -0.0943 58.000000 7 0.0835 58.000000 8 0.6528 58.000000 9 0.0835 58.000000 10 -0.0739 58.000000 11 -0.5781 - 58.000000 12 -0.6528 - 58.000000 13 0.5781 - 58.000000 14 4.5204 + 58.000000 12 0.6528 + 58.000000 13 -0.5781 + 58.000000 14 -4.5204 59.000000 0 0.4952 59.000000 1 -0.3208 - 59.000000 2 2.8856 + 59.000000 2 -2.8856 59.000000 3 -0.4952 59.000000 4 0.3208 - 59.000000 5 -2.8856 + 59.000000 5 2.8856 59.000000 6 -0.1226 59.000000 7 0.0794 59.000000 8 0.7145 59.000000 9 0.0794 59.000000 10 -0.0514 59.000000 11 -0.4628 - 59.000000 12 -0.7145 - 59.000000 13 0.4628 - 59.000000 14 4.1634 + 59.000000 12 0.7145 + 59.000000 13 -0.4628 + 59.000000 14 -4.1634 60.000000 0 0.5467 60.000000 1 -0.2473 - 60.000000 2 2.7307 + 60.000000 2 -2.7307 60.000000 3 -0.5467 60.000000 4 0.2473 - 60.000000 5 -2.7307 + 60.000000 5 2.7307 60.000000 6 -0.1494 60.000000 7 0.0676 60.000000 8 0.7464 60.000000 9 0.0676 60.000000 10 -0.0306 60.000000 11 -0.3376 - 60.000000 12 -0.7464 - 60.000000 13 0.3376 - 60.000000 14 3.7283 + 60.000000 12 0.7464 + 60.000000 13 -0.3376 + 60.000000 14 -3.7283 61.000000 0 0.5871 61.000000 1 -0.1655 - 61.000000 2 2.5757 + 61.000000 2 -2.5757 61.000000 3 -0.5871 61.000000 4 0.1655 - 61.000000 5 -2.5757 + 61.000000 5 2.5757 61.000000 6 -0.1724 61.000000 7 0.0486 61.000000 8 0.7561 61.000000 9 0.0486 61.000000 10 -0.0137 61.000000 11 -0.2132 - 61.000000 12 -0.7561 - 61.000000 13 0.2132 - 61.000000 14 3.3171 + 61.000000 12 0.7561 + 61.000000 13 -0.2132 + 61.000000 14 -3.3171 62.000000 0 0.6152 62.000000 1 -0.0772 - 62.000000 2 2.4545 + 62.000000 2 -2.4545 62.000000 3 -0.6152 62.000000 4 0.0772 - 62.000000 5 -2.4545 + 62.000000 5 2.4545 62.000000 6 -0.1892 62.000000 7 0.0237 62.000000 8 0.7550 62.000000 9 0.0237 62.000000 10 -0.0030 62.000000 11 -0.0947 - 62.000000 12 -0.7550 - 62.000000 13 0.0947 - 62.000000 14 3.0123 + 62.000000 12 0.7550 + 62.000000 13 -0.0947 + 62.000000 14 -3.0123 63.000000 0 0.6298 63.000000 1 0.0159 - 63.000000 2 2.3935 + 63.000000 2 -2.3935 63.000000 3 -0.6298 63.000000 4 -0.0159 - 63.000000 5 -2.3935 + 63.000000 5 2.3935 63.000000 6 -0.1983 63.000000 7 -0.0050 63.000000 8 0.7537 63.000000 9 -0.0050 63.000000 10 -0.0001 63.000000 11 0.0190 - 63.000000 12 -0.7537 - 63.000000 13 -0.0190 - 63.000000 14 2.8645 + 63.000000 12 0.7537 + 63.000000 13 0.0190 + 63.000000 14 -2.8645 64.000000 0 0.6302 64.000000 1 0.1116 - 64.000000 2 2.4060 + 64.000000 2 -2.4060 64.000000 3 -0.6302 64.000000 4 -0.1116 - 64.000000 5 -2.4060 + 64.000000 5 2.4060 64.000000 6 -0.1986 64.000000 7 -0.0352 64.000000 8 0.7581 64.000000 9 -0.0352 64.000000 10 -0.0062 64.000000 11 0.1342 - 64.000000 12 -0.7581 - 64.000000 13 -0.1342 - 64.000000 14 2.8945 + 64.000000 12 0.7581 + 64.000000 13 0.1342 + 64.000000 14 -2.8945 65.000000 0 0.6159 65.000000 1 0.2077 - 65.000000 2 2.4893 + 65.000000 2 -2.4893 65.000000 3 -0.6159 65.000000 4 -0.2077 - 65.000000 5 -2.4893 + 65.000000 5 2.4893 65.000000 6 -0.1897 65.000000 7 -0.0640 65.000000 8 0.7666 65.000000 9 -0.0640 65.000000 10 -0.0216 65.000000 11 0.2585 - 65.000000 12 -0.7666 - 65.000000 13 -0.2585 - 65.000000 14 3.0983 + 65.000000 12 0.7666 + 65.000000 13 0.2585 + 65.000000 14 -3.0983 66.000000 0 0.5869 66.000000 1 0.3020 - 66.000000 2 2.6252 + 66.000000 2 -2.6252 66.000000 3 -0.5869 66.000000 4 -0.3020 - 66.000000 5 -2.6252 + 66.000000 5 2.6252 66.000000 6 -0.1722 66.000000 7 -0.0886 66.000000 8 0.7703 66.000000 9 -0.0886 66.000000 10 -0.0456 66.000000 11 0.3964 - 66.000000 12 -0.7703 - 66.000000 13 -0.3964 - 66.000000 14 3.4458 + 66.000000 12 0.7703 + 66.000000 13 0.3964 + 66.000000 14 -3.4458 67.000000 0 0.5433 67.000000 1 0.3921 - 67.000000 2 2.7841 + 67.000000 2 -2.7841 67.000000 3 -0.5433 67.000000 4 -0.3921 - 67.000000 5 -2.7841 + 67.000000 5 2.7841 67.000000 6 -0.1476 67.000000 7 -0.1065 67.000000 8 0.7562 67.000000 9 -0.1065 67.000000 10 -0.0769 67.000000 11 0.5459 - 67.000000 12 -0.7562 - 67.000000 13 -0.5459 - 67.000000 14 3.8755 + 67.000000 12 0.7562 + 67.000000 13 0.5459 + 67.000000 14 -3.8755 68.000000 0 0.4857 68.000000 1 0.4759 - 68.000000 2 2.9313 + 68.000000 2 -2.9313 68.000000 3 -0.4857 68.000000 4 -0.4759 - 68.000000 5 -2.9313 + 68.000000 5 2.9313 68.000000 6 -0.1180 68.000000 7 -0.1156 68.000000 8 0.7119 68.000000 9 -0.1156 68.000000 10 -0.1132 68.000000 11 0.6975 - 68.000000 12 -0.7119 - 68.000000 13 -0.6975 - 68.000000 14 4.2963 + 68.000000 12 0.7119 + 68.000000 13 0.6975 + 68.000000 14 -4.2963 69.000000 0 0.4151 69.000000 1 0.5511 - 69.000000 2 3.0348 + 69.000000 2 -3.0348 69.000000 3 -0.4151 69.000000 4 -0.5511 - 69.000000 5 -3.0348 + 69.000000 5 3.0348 69.000000 6 -0.0862 69.000000 7 -0.1144 69.000000 8 0.6299 69.000000 9 -0.1144 69.000000 10 -0.1519 69.000000 11 0.8363 - 69.000000 12 -0.6299 - 69.000000 13 -0.8363 - 69.000000 14 4.6050 + 69.000000 12 0.6299 + 69.000000 13 0.8363 + 69.000000 14 -4.6050 70.000000 0 0.3329 70.000000 1 0.6158 - 70.000000 2 3.0720 + 70.000000 2 -3.0720 70.000000 3 -0.3329 70.000000 4 -0.6158 - 70.000000 5 -3.0720 + 70.000000 5 3.0720 70.000000 6 -0.0554 70.000000 7 -0.1025 70.000000 8 0.5113 70.000000 9 -0.1025 70.000000 10 -0.1896 70.000000 11 0.9459 - 70.000000 12 -0.5113 - 70.000000 13 -0.9459 - 70.000000 14 4.7186 + 70.000000 12 0.5113 + 70.000000 13 0.9459 + 70.000000 14 -4.7186 71.000000 0 0.2405 71.000000 1 0.6680 - 71.000000 2 3.0348 + 71.000000 2 -3.0348 71.000000 3 -0.2405 71.000000 4 -0.6680 - 71.000000 5 -3.0348 + 71.000000 5 3.0348 71.000000 6 -0.0289 71.000000 7 -0.0803 71.000000 8 0.3649 71.000000 9 -0.0803 71.000000 10 -0.2231 71.000000 11 1.0137 - 71.000000 12 -0.3649 - 71.000000 13 -1.0137 - 71.000000 14 4.6050 + 71.000000 12 0.3649 + 71.000000 13 1.0137 + 71.000000 14 -4.6050 72.000000 0 0.1399 72.000000 1 0.7063 - 72.000000 2 2.9313 + 72.000000 2 -2.9313 72.000000 3 -0.1399 72.000000 4 -0.7063 - 72.000000 5 -2.9313 + 72.000000 5 2.9313 72.000000 6 -0.0098 72.000000 7 -0.0494 72.000000 8 0.2051 72.000000 9 -0.0494 72.000000 10 -0.2494 72.000000 11 1.0352 - 72.000000 12 -0.2051 - 72.000000 13 -1.0352 - 72.000000 14 4.2963 + 72.000000 12 0.2051 + 72.000000 13 1.0352 + 72.000000 14 -4.2963 73.000000 0 0.0333 73.000000 1 0.7292 - 73.000000 2 2.7841 + 73.000000 2 -2.7841 73.000000 3 -0.0333 73.000000 4 -0.7292 - 73.000000 5 -2.7841 + 73.000000 5 2.7841 73.000000 6 -0.0006 73.000000 7 -0.0121 73.000000 8 0.0463 73.000000 9 -0.0121 73.000000 10 -0.2659 73.000000 11 1.0151 - 73.000000 12 -0.0463 - 73.000000 13 -1.0151 - 73.000000 14 3.8755 + 73.000000 12 0.0463 + 73.000000 13 1.0151 + 73.000000 14 -3.8755 74.000000 0 -0.0771 74.000000 1 0.7360 - 74.000000 2 2.6252 + 74.000000 2 -2.6252 74.000000 3 0.0771 74.000000 4 -0.7360 - 74.000000 5 -2.6252 + 74.000000 5 2.6252 74.000000 6 -0.0030 74.000000 7 0.0284 74.000000 8 -0.1012 74.000000 9 0.0284 74.000000 10 -0.2708 74.000000 11 0.9660 - 74.000000 12 0.1012 - 74.000000 13 -0.9660 - 74.000000 14 3.4458 + 74.000000 12 -0.1012 + 74.000000 13 0.9660 + 74.000000 14 -3.4458 75.000000 0 -0.1888 75.000000 1 0.7259 - 75.000000 2 2.4893 + 75.000000 2 -2.4893 75.000000 3 0.1888 75.000000 4 -0.7259 - 75.000000 5 -2.4893 + 75.000000 5 2.4893 75.000000 6 -0.0178 75.000000 7 0.0685 75.000000 8 -0.2349 75.000000 9 0.0685 75.000000 10 -0.2634 75.000000 11 0.9034 - 75.000000 12 0.2349 - 75.000000 13 -0.9034 - 75.000000 14 3.0983 + 75.000000 12 -0.2349 + 75.000000 13 0.9034 + 75.000000 14 -3.0983 76.000000 0 -0.2991 76.000000 1 0.6987 - 76.000000 2 2.4060 + 76.000000 2 -2.4060 76.000000 3 0.2991 76.000000 4 -0.6987 - 76.000000 5 -2.4060 + 76.000000 5 2.4060 76.000000 6 -0.0447 76.000000 7 0.1045 76.000000 8 -0.3598 76.000000 9 0.1045 76.000000 10 -0.2441 76.000000 11 0.8405 - 76.000000 12 0.3598 - 76.000000 13 -0.8405 - 76.000000 14 2.8945 + 76.000000 12 -0.3598 + 76.000000 13 0.8405 + 76.000000 14 -2.8945 77.000000 0 -0.4054 77.000000 1 0.6547 - 77.000000 2 2.3935 + 77.000000 2 -2.3935 77.000000 3 0.4054 77.000000 4 -0.6547 - 77.000000 5 -2.3935 + 77.000000 5 2.3935 77.000000 6 -0.0822 77.000000 7 0.1327 77.000000 8 -0.4851 77.000000 9 0.1327 77.000000 10 -0.2143 77.000000 11 0.7835 - 77.000000 12 0.4851 - 77.000000 13 -0.7835 - 77.000000 14 2.8645 + 77.000000 12 -0.4851 + 77.000000 13 0.7835 + 77.000000 14 -2.8645 78.000000 0 -0.5051 78.000000 1 0.5943 - 78.000000 2 2.4545 + 78.000000 2 -2.4545 78.000000 3 0.5051 78.000000 4 -0.5943 - 78.000000 5 -2.4545 + 78.000000 5 2.4545 78.000000 6 -0.1276 78.000000 7 0.1501 78.000000 8 -0.6199 78.000000 9 0.1501 78.000000 10 -0.1766 78.000000 11 0.7294 - 78.000000 12 0.6199 - 78.000000 13 -0.7294 - 78.000000 14 3.0123 + 78.000000 12 -0.6199 + 78.000000 13 0.7294 + 78.000000 14 -3.0123 79.000000 0 -0.5958 79.000000 1 0.5188 - 79.000000 2 2.5757 + 79.000000 2 -2.5757 79.000000 3 0.5958 79.000000 4 -0.5188 - 79.000000 5 -2.5757 + 79.000000 5 2.5757 79.000000 6 -0.1775 79.000000 7 0.1545 79.000000 8 -0.7673 79.000000 9 0.1545 79.000000 10 -0.1346 79.000000 11 0.6681 - 79.000000 12 0.7673 - 79.000000 13 -0.6681 - 79.000000 14 3.3171 + 79.000000 12 -0.7673 + 79.000000 13 0.6681 + 79.000000 14 -3.3171 80.000000 0 -0.6751 80.000000 1 0.4293 - 80.000000 2 2.7307 + 80.000000 2 -2.7307 80.000000 3 0.6751 80.000000 4 -0.4293 - 80.000000 5 -2.7307 + 80.000000 5 2.7307 80.000000 6 -0.2279 80.000000 7 0.1449 80.000000 8 -0.9217 80.000000 9 0.1449 80.000000 10 -0.0921 80.000000 11 0.5861 - 80.000000 12 0.9217 - 80.000000 13 -0.5861 - 80.000000 14 3.7283 + 80.000000 12 -0.9217 + 80.000000 13 0.5861 + 80.000000 14 -3.7283 81.000000 0 -0.7408 81.000000 1 0.3276 - 81.000000 2 2.8856 + 81.000000 2 -2.8856 81.000000 3 0.7408 81.000000 4 -0.3276 - 81.000000 5 -2.8856 + 81.000000 5 2.8856 81.000000 6 -0.2744 81.000000 7 0.1213 81.000000 8 -1.0688 81.000000 9 0.1213 81.000000 10 -0.0537 81.000000 11 0.4727 - 81.000000 12 1.0688 - 81.000000 13 -0.4727 - 81.000000 14 4.1634 + 81.000000 12 -1.0688 + 81.000000 13 0.4727 + 81.000000 14 -4.1634 82.000000 0 -0.7911 - 82.000000 1 0.2159 - 82.000000 2 3.0068 + 82.000000 1 0.2158 + 82.000000 2 -3.0068 82.000000 3 0.7911 - 82.000000 4 -0.2159 - 82.000000 5 -3.0068 + 82.000000 4 -0.2158 + 82.000000 5 3.0068 82.000000 6 -0.3129 82.000000 7 0.0854 82.000000 8 -1.1893 82.000000 9 0.0854 82.000000 10 -0.0233 82.000000 11 0.3245 - 82.000000 12 1.1893 - 82.000000 13 -0.3245 - 82.000000 14 4.5204 + 82.000000 12 -1.1893 + 82.000000 13 0.3245 + 82.000000 14 -4.5204 83.000000 0 -0.8244 83.000000 1 0.0964 - 83.000000 2 3.0678 + 83.000000 2 -3.0678 83.000000 3 0.8244 83.000000 4 -0.0964 - 83.000000 5 -3.0678 + 83.000000 5 3.0678 83.000000 6 -0.3398 83.000000 7 0.0397 83.000000 8 -1.2645 83.000000 9 0.0397 83.000000 10 -0.0046 83.000000 11 0.1478 - 83.000000 12 1.2645 - 83.000000 13 -0.1478 - 83.000000 14 4.7057 + 83.000000 12 -1.2645 + 83.000000 13 0.1478 + 83.000000 14 -4.7057 84.000000 0 -0.8395 84.000000 1 -0.0282 - 84.000000 2 3.0553 + 84.000000 2 -3.0553 84.000000 3 0.8395 84.000000 4 0.0282 - 84.000000 5 -3.0553 + 84.000000 5 3.0553 84.000000 6 -0.3524 84.000000 7 -0.0119 84.000000 8 -1.2825 84.000000 9 -0.0119 84.000000 10 -0.0004 84.000000 11 -0.0431 - 84.000000 12 1.2825 - 84.000000 13 0.0431 - 84.000000 14 4.6674 + 84.000000 12 -1.2825 + 84.000000 13 -0.0431 + 84.000000 14 -4.6674 85.000000 0 -0.8357 85.000000 1 -0.1552 - 85.000000 2 2.9720 + 85.000000 2 -2.9720 85.000000 3 0.8357 85.000000 4 0.1552 - 85.000000 5 -2.9720 + 85.000000 5 2.9720 85.000000 6 -0.3492 85.000000 7 -0.0649 85.000000 8 -1.2419 85.000000 9 -0.0649 85.000000 10 -0.0120 85.000000 11 -0.2306 - 85.000000 12 1.2419 - 85.000000 13 0.2306 - 85.000000 14 4.4165 + 85.000000 12 -1.2419 + 85.000000 13 -0.2306 + 85.000000 14 -4.4165 86.000000 0 -0.8126 86.000000 1 -0.2816 - 86.000000 2 2.8361 + 86.000000 2 -2.8361 86.000000 3 0.8126 86.000000 4 0.2816 - 86.000000 5 -2.8361 + 86.000000 5 2.8361 86.000000 6 -0.3301 86.000000 7 -0.1144 86.000000 8 -1.1523 86.000000 9 -0.1144 86.000000 10 -0.0397 86.000000 11 -0.3994 - 86.000000 12 1.1523 - 86.000000 13 0.3994 - 86.000000 14 4.0218 + 86.000000 12 -1.1523 + 86.000000 13 -0.3994 + 86.000000 14 -4.0218 87.000000 0 -0.7702 87.000000 1 -0.4045 - 87.000000 2 2.6773 + 87.000000 2 -2.6773 87.000000 3 0.7702 87.000000 4 0.4045 - 87.000000 5 -2.6773 + 87.000000 5 2.6773 87.000000 6 -0.2966 87.000000 7 -0.1558 87.000000 8 -1.0310 87.000000 9 -0.1558 87.000000 10 -0.0818 87.000000 11 -0.5415 - 87.000000 12 1.0310 - 87.000000 13 0.5415 - 87.000000 14 3.5839 + 87.000000 12 -1.0310 + 87.000000 13 -0.5415 + 87.000000 14 -3.5839 88.000000 0 -0.7092 88.000000 1 -0.5210 - 88.000000 2 2.5300 + 88.000000 2 -2.5300 88.000000 3 0.7092 88.000000 4 0.5210 - 88.000000 5 -2.5300 + 88.000000 5 2.5300 88.000000 6 -0.2515 88.000000 7 -0.1847 88.000000 8 -0.8971 88.000000 9 -0.1847 88.000000 10 -0.1357 88.000000 11 -0.6591 - 88.000000 12 0.8971 - 88.000000 13 0.6591 - 88.000000 14 3.2006 + 88.000000 12 -0.8971 + 88.000000 13 -0.6591 + 88.000000 14 -3.2006 89.000000 0 -0.6304 89.000000 1 -0.6282 - 89.000000 2 2.4265 + 89.000000 2 -2.4265 89.000000 3 0.6304 89.000000 4 0.6282 - 89.000000 5 -2.4265 + 89.000000 5 2.4265 89.000000 6 -0.1987 89.000000 7 -0.1980 89.000000 8 -0.7649 89.000000 9 -0.1980 89.000000 10 -0.1973 89.000000 11 -0.7622 - 89.000000 12 0.7649 - 89.000000 13 0.7622 - 89.000000 14 2.9440 + 89.000000 12 -0.7649 + 89.000000 13 -0.7622 + 89.000000 14 -2.9440 90.000000 0 -0.5354 90.000000 1 -0.7234 - 90.000000 2 2.3893 + 90.000000 2 -2.3893 90.000000 3 0.5354 90.000000 4 0.7234 - 90.000000 5 -2.3893 + 90.000000 5 2.3893 90.000000 6 -0.1433 90.000000 7 -0.1937 90.000000 8 -0.6397 90.000000 9 -0.1937 90.000000 10 -0.2617 90.000000 11 -0.8642 - 90.000000 12 0.6397 - 90.000000 13 0.8642 - 90.000000 14 2.8544 + 90.000000 12 -0.6397 + 90.000000 13 -0.8642 + 90.000000 14 -2.8544 91.000000 0 -0.4260 91.000000 1 -0.8041 - 91.000000 2 2.4265 + 91.000000 2 -2.4265 91.000000 3 0.4260 91.000000 4 0.8041 - 91.000000 5 -2.4265 + 91.000000 5 2.4265 91.000000 6 -0.0907 91.000000 7 -0.1713 91.000000 8 -0.5168 91.000000 9 -0.1713 91.000000 10 -0.3233 91.000000 11 -0.9756 - 91.000000 12 0.5168 - 91.000000 13 0.9756 - 91.000000 14 2.9440 - 92.000000 0 -0.3043 + 91.000000 12 -0.5168 + 91.000000 13 -0.9756 + 91.000000 14 -2.9440 + 92.000000 0 -0.3044 92.000000 1 -0.8682 - 92.000000 2 2.5300 - 92.000000 3 0.3043 + 92.000000 2 -2.5300 + 92.000000 3 0.3044 92.000000 4 0.8682 - 92.000000 5 -2.5300 + 92.000000 5 2.5300 92.000000 6 -0.0463 92.000000 7 -0.1321 92.000000 8 -0.3850 92.000000 9 -0.1321 92.000000 10 -0.3769 92.000000 11 -1.0983 - 92.000000 12 0.3850 - 92.000000 13 1.0983 - 92.000000 14 3.2006 + 92.000000 12 -0.3850 + 92.000000 13 -1.0983 + 92.000000 14 -3.2006 93.000000 0 -0.1731 93.000000 1 -0.9138 - 93.000000 2 2.6773 + 93.000000 2 -2.6773 93.000000 3 0.1731 93.000000 4 0.9138 - 93.000000 5 -2.6773 + 93.000000 5 2.6773 93.000000 6 -0.0150 93.000000 7 -0.0791 93.000000 8 -0.2317 93.000000 9 -0.0791 93.000000 10 -0.4175 93.000000 11 -1.2232 - 93.000000 12 0.2317 - 93.000000 13 1.2232 - 93.000000 14 3.5839 + 93.000000 12 -0.2317 + 93.000000 13 -1.2232 + 93.000000 14 -3.5839 94.000000 0 -0.0349 - 94.000000 1 -0.9394 - 94.000000 2 2.8361 + 94.000000 1 -0.9393 + 94.000000 2 -2.8361 94.000000 3 0.0349 - 94.000000 4 0.9394 - 94.000000 5 -2.8361 + 94.000000 4 0.9393 + 94.000000 5 2.8361 94.000000 6 -0.0006 94.000000 7 -0.0164 94.000000 8 -0.0495 94.000000 9 -0.0164 94.000000 10 -0.4412 94.000000 11 -1.3321 - 94.000000 12 0.0495 - 94.000000 13 1.3321 - 94.000000 14 4.0218 + 94.000000 12 -0.0495 + 94.000000 13 -1.3321 + 94.000000 14 -4.0218 95.000000 0 0.1070 95.000000 1 -0.9440 - 95.000000 2 2.9720 + 95.000000 2 -2.9720 95.000000 3 -0.1070 95.000000 4 0.9440 - 95.000000 5 -2.9720 + 95.000000 5 2.9720 95.000000 6 -0.0057 95.000000 7 0.0505 95.000000 8 0.1589 95.000000 9 0.0505 95.000000 10 -0.4455 95.000000 11 -1.4027 - 95.000000 12 -0.1589 - 95.000000 13 1.4027 - 95.000000 14 4.4165 + 95.000000 12 0.1589 + 95.000000 13 -1.4027 + 95.000000 14 -4.4165 96.000000 0 0.2494 96.000000 1 -0.9270 - 96.000000 2 3.0553 + 96.000000 2 -3.0553 96.000000 3 -0.2494 96.000000 4 0.9270 - 96.000000 5 -3.0553 + 96.000000 5 3.0553 96.000000 6 -0.0311 96.000000 7 0.1156 96.000000 8 0.3810 96.000000 9 0.1156 96.000000 10 -0.4297 96.000000 11 -1.4162 - 96.000000 12 -0.3810 - 96.000000 13 1.4162 - 96.000000 14 4.6674 + 96.000000 12 0.3810 + 96.000000 13 -1.4162 + 96.000000 14 -4.6674 97.000000 0 0.3892 97.000000 1 -0.8885 - 97.000000 2 3.0678 + 97.000000 2 -3.0678 97.000000 3 -0.3892 97.000000 4 0.8885 - 97.000000 5 -3.0678 + 97.000000 5 3.0678 97.000000 6 -0.0757 97.000000 7 0.1729 97.000000 8 0.5969 97.000000 9 0.1729 97.000000 10 -0.3947 97.000000 11 -1.3629 - 97.000000 12 -0.5969 - 97.000000 13 1.3629 - 97.000000 14 4.7057 + 97.000000 12 0.5969 + 97.000000 13 -1.3629 + 97.000000 14 -4.7057 98.000000 0 0.5229 98.000000 1 -0.8288 - 98.000000 2 3.0068 + 98.000000 2 -3.0068 98.000000 3 -0.5229 98.000000 4 0.8288 - 98.000000 5 -3.0068 + 98.000000 5 3.0068 98.000000 6 -0.1367 98.000000 7 0.2167 98.000000 8 0.7861 98.000000 9 0.2167 98.000000 10 -0.3435 98.000000 11 -1.2461 - 98.000000 12 -0.7861 - 98.000000 13 1.2461 - 98.000000 14 4.5204 + 98.000000 12 0.7861 + 98.000000 13 -1.2461 + 98.000000 14 -4.5204 99.000000 0 0.6474 99.000000 1 -0.7489 - 99.000000 2 2.8856 + 99.000000 2 -2.8856 99.000000 3 -0.6474 99.000000 4 0.7489 - 99.000000 5 -2.8856 + 99.000000 5 2.8856 99.000000 6 -0.2096 99.000000 7 0.2424 99.000000 8 0.9341 99.000000 9 0.2424 99.000000 10 -0.2805 99.000000 11 -1.0806 - 99.000000 12 -0.9341 - 99.000000 13 1.0806 - 99.000000 14 4.1634 + 99.000000 12 0.9341 + 99.000000 13 -1.0806 + 99.000000 14 -4.1634 100.000000 0 0.7597 100.000000 1 -0.6503 - 100.000000 2 2.7307 + 100.000000 2 -2.7307 100.000000 3 -0.7597 100.000000 4 0.6503 - 100.000000 5 -2.7307 + 100.000000 5 2.7307 100.000000 6 -0.2886 100.000000 7 0.2470 100.000000 8 1.0372 100.000000 9 0.2470 100.000000 10 -0.2114 100.000000 11 -0.8879 - 100.000000 12 -1.0372 - 100.000000 13 0.8879 - 100.000000 14 3.7283 + 100.000000 12 1.0372 + 100.000000 13 -0.8879 + 100.000000 14 -3.7283 101.000000 0 0.8568 101.000000 1 -0.5348 - 101.000000 2 2.5757 + 101.000000 2 -2.5757 101.000000 3 -0.8568 101.000000 4 0.5348 - 101.000000 5 -2.5757 + 101.000000 5 2.5757 101.000000 6 -0.3671 101.000000 7 0.2291 101.000000 8 1.1035 101.000000 9 0.2291 101.000000 10 -0.1430 101.000000 11 -0.6887 - 101.000000 12 -1.1035 - 101.000000 13 0.6887 - 101.000000 14 3.3171 + 101.000000 12 1.1035 + 101.000000 13 -0.6887 + 101.000000 14 -3.3171 102.000000 0 0.9363 102.000000 1 -0.4047 - 102.000000 2 2.4545 + 102.000000 2 -2.4545 102.000000 3 -0.9363 102.000000 4 0.4047 - 102.000000 5 -2.4545 + 102.000000 5 2.4545 102.000000 6 -0.4383 102.000000 7 0.1894 102.000000 8 1.1491 102.000000 9 0.1894 102.000000 10 -0.0819 102.000000 11 -0.4966 - 102.000000 12 -1.1491 - 102.000000 13 0.4966 - 102.000000 14 3.0123 + 102.000000 12 1.1491 + 102.000000 13 -0.4966 + 102.000000 14 -3.0123 103.000000 0 0.9959 103.000000 1 -0.2628 - 103.000000 2 2.3935 + 103.000000 2 -2.3935 103.000000 3 -0.9959 103.000000 4 0.2628 - 103.000000 5 -2.3935 + 103.000000 5 2.3935 103.000000 6 -0.4959 103.000000 7 0.1308 103.000000 8 1.1919 103.000000 9 0.1308 103.000000 10 -0.0345 103.000000 11 -0.3145 - 103.000000 12 -1.1919 - 103.000000 13 0.3145 - 103.000000 14 2.8645 + 103.000000 12 1.1919 + 103.000000 13 -0.3145 + 103.000000 14 -2.8645 104.000000 0 1.0339 104.000000 1 -0.1121 - 104.000000 2 2.4060 + 104.000000 2 -2.4060 104.000000 3 -1.0339 104.000000 4 0.1121 - 104.000000 5 -2.4060 + 104.000000 5 2.4060 104.000000 6 -0.5345 104.000000 7 0.0579 104.000000 8 1.2439 104.000000 9 0.0579 104.000000 10 -0.0063 104.000000 11 -0.1348 - 104.000000 12 -1.2439 - 104.000000 13 0.1348 - 104.000000 14 2.8945 + 104.000000 12 1.2439 + 104.000000 13 -0.1348 + 104.000000 14 -2.8945 105.000000 0 1.0491 105.000000 1 0.0441 - 105.000000 2 2.4893 + 105.000000 2 -2.4893 105.000000 3 -1.0491 105.000000 4 -0.0441 - 105.000000 5 -2.4893 + 105.000000 5 2.4893 105.000000 6 -0.5503 105.000000 7 -0.0231 105.000000 8 1.3057 105.000000 9 -0.0231 105.000000 10 -0.0010 105.000000 11 0.0549 - 105.000000 12 -1.3057 - 105.000000 13 -0.0549 - 105.000000 14 3.0983 + 105.000000 12 1.3057 + 105.000000 13 0.0549 + 105.000000 14 -3.0983 106.000000 0 1.0405 106.000000 1 0.2023 - 106.000000 2 2.6252 + 106.000000 2 -2.6252 106.000000 3 -1.0405 106.000000 4 -0.2023 - 106.000000 5 -2.6252 + 106.000000 5 2.6252 106.000000 6 -0.5413 106.000000 7 -0.1053 106.000000 8 1.3658 106.000000 9 -0.1053 106.000000 10 -0.0205 106.000000 11 0.2656 - 106.000000 12 -1.3658 - 106.000000 13 -0.2656 - 106.000000 14 3.4458 + 106.000000 12 1.3658 + 106.000000 13 0.2656 + 106.000000 14 -3.4458 107.000000 0 1.0080 107.000000 1 0.3589 - 107.000000 2 2.7841 + 107.000000 2 -2.7841 107.000000 3 -1.0080 107.000000 4 -0.3589 - 107.000000 5 -2.7841 - 107.000000 6 -0.5080 + 107.000000 5 2.7841 + 107.000000 6 -0.5081 107.000000 7 -0.1809 107.000000 8 1.4032 107.000000 9 -0.1809 107.000000 10 -0.0644 107.000000 11 0.4996 - 107.000000 12 -1.4032 - 107.000000 13 -0.4996 - 107.000000 14 3.8755 + 107.000000 12 1.4032 + 107.000000 13 0.4996 + 107.000000 14 -3.8755 108.000000 0 0.9519 108.000000 1 0.5102 - 108.000000 2 2.9313 + 108.000000 2 -2.9313 108.000000 3 -0.9519 108.000000 4 -0.5102 - 108.000000 5 -2.9313 + 108.000000 5 2.9313 108.000000 6 -0.4530 108.000000 7 -0.2428 108.000000 8 1.3951 108.000000 9 -0.2428 108.000000 10 -0.1302 108.000000 11 0.7478 - 108.000000 12 -1.3951 - 108.000000 13 -0.7478 - 108.000000 14 4.2963 + 108.000000 12 1.3951 + 108.000000 13 0.7478 + 108.000000 14 -4.2963 109.000000 0 0.8730 109.000000 1 0.6527 - 109.000000 2 3.0348 + 109.000000 2 -3.0348 109.000000 3 -0.8730 109.000000 4 -0.6527 - 109.000000 5 -3.0348 + 109.000000 5 3.0348 109.000000 6 -0.3810 109.000000 7 -0.2849 109.000000 8 1.3246 109.000000 9 -0.2849 109.000000 10 -0.2130 109.000000 11 0.9904 - 109.000000 12 -1.3246 - 109.000000 13 -0.9904 - 109.000000 14 4.6050 + 109.000000 12 1.3246 + 109.000000 13 0.9904 + 109.000000 14 -4.6050 110.000000 0 0.7726 110.000000 1 0.7830 - 110.000000 2 3.0720 + 110.000000 2 -3.0720 110.000000 3 -0.7726 110.000000 4 -0.7830 - 110.000000 5 -3.0720 + 110.000000 5 3.0720 110.000000 6 -0.2985 110.000000 7 -0.3025 110.000000 8 1.1868 110.000000 9 -0.3025 110.000000 10 -0.3065 110.000000 11 1.2026 - 110.000000 12 -1.1868 - 110.000000 13 -1.2026 - 110.000000 14 4.7186 + 110.000000 12 1.1868 + 110.000000 13 1.2026 + 110.000000 14 -4.7186 111.000000 0 0.6528 111.000000 1 0.8977 - 111.000000 2 3.0348 + 111.000000 2 -3.0348 111.000000 3 -0.6528 111.000000 4 -0.8977 - 111.000000 5 -3.0348 + 111.000000 5 3.0348 111.000000 6 -0.2131 111.000000 7 -0.2930 111.000000 8 0.9906 111.000000 9 -0.2930 111.000000 10 -0.4030 111.000000 11 1.3622 - 111.000000 12 -0.9906 - 111.000000 13 -1.3622 - 111.000000 14 4.6050 + 111.000000 12 0.9906 + 111.000000 13 1.3622 + 111.000000 14 -4.6050 112.000000 0 0.5160 112.000000 1 0.9941 - 112.000000 2 2.9313 + 112.000000 2 -2.9313 112.000000 3 -0.5160 112.000000 4 -0.9941 - 112.000000 5 -2.9313 + 112.000000 5 2.9313 112.000000 6 -0.1331 112.000000 7 -0.2565 112.000000 8 0.7562 112.000000 9 -0.2565 112.000000 10 -0.4941 112.000000 11 1.4570 - 112.000000 12 -0.7562 - 112.000000 13 -1.4570 - 112.000000 14 4.2963 + 112.000000 12 0.7562 + 112.000000 13 1.4570 + 112.000000 14 -4.2963 113.000000 0 0.3648 113.000000 1 1.0695 - 113.000000 2 2.7841 + 113.000000 2 -2.7841 113.000000 3 -0.3648 113.000000 4 -1.0695 - 113.000000 5 -2.7841 + 113.000000 5 2.7841 113.000000 6 -0.0666 113.000000 7 -0.1951 113.000000 8 0.5079 113.000000 9 -0.1951 113.000000 10 -0.5719 113.000000 11 1.4888 - 113.000000 12 -0.5079 - 113.000000 13 -1.4888 - 113.000000 14 3.8755 + 113.000000 12 0.5079 + 113.000000 13 1.4888 + 113.000000 14 -3.8755 114.000000 0 0.2027 114.000000 1 1.1218 - 114.000000 2 2.6252 + 114.000000 2 -2.6252 114.000000 3 -0.2027 114.000000 4 -1.1218 - 114.000000 5 -2.6252 + 114.000000 5 2.6252 114.000000 6 -0.0205 114.000000 7 -0.1137 114.000000 8 0.2661 114.000000 9 -0.1137 114.000000 10 -0.6293 114.000000 11 1.4725 - 114.000000 12 -0.2661 - 114.000000 13 -1.4725 - 114.000000 14 3.4458 + 114.000000 12 0.2661 + 114.000000 13 1.4725 + 114.000000 14 -3.4458 115.000000 0 0.0331 115.000000 1 1.1495 - 115.000000 2 2.4893 + 115.000000 2 -2.4893 115.000000 3 -0.0331 115.000000 4 -1.1495 - 115.000000 5 -2.4893 + 115.000000 5 2.4893 115.000000 6 -0.0005 115.000000 7 -0.0190 115.000000 8 0.0412 115.000000 9 -0.0190 115.000000 10 -0.6607 115.000000 11 1.4308 - 115.000000 12 -0.0412 - 115.000000 13 -1.4308 - 115.000000 14 3.0983 + 115.000000 12 0.0412 + 115.000000 13 1.4308 + 115.000000 14 -3.0983 116.000000 0 -0.1403 116.000000 1 1.1515 - 116.000000 2 2.4060 + 116.000000 2 -2.4060 116.000000 3 0.1403 116.000000 4 -1.1515 - 116.000000 5 -2.4060 + 116.000000 5 2.4060 116.000000 6 -0.0098 116.000000 7 0.0808 116.000000 8 -0.1688 116.000000 9 0.0808 116.000000 10 -0.6630 116.000000 11 1.3853 - 116.000000 12 0.1688 - 116.000000 13 -1.3853 - 116.000000 14 2.8945 + 116.000000 12 -0.1688 + 116.000000 13 1.3853 + 116.000000 14 -2.8945 117.000000 0 -0.3135 117.000000 1 1.1272 - 117.000000 2 2.3935 + 117.000000 2 -2.3935 117.000000 3 0.3135 117.000000 4 -1.1272 - 117.000000 5 -2.3935 + 117.000000 5 2.3935 117.000000 6 -0.0491 117.000000 7 0.1767 117.000000 8 -0.3752 117.000000 9 0.1767 117.000000 10 -0.6353 117.000000 11 1.3490 - 117.000000 12 0.3752 - 117.000000 13 -1.3490 - 117.000000 14 2.8645 + 117.000000 12 -0.3752 + 117.000000 13 1.3490 + 117.000000 14 -2.8645 118.000000 0 -0.4825 118.000000 1 1.0768 - 118.000000 2 2.4545 + 118.000000 2 -2.4545 118.000000 3 0.4825 118.000000 4 -1.0768 - 118.000000 5 -2.4545 + 118.000000 5 2.4545 118.000000 6 -0.1164 118.000000 7 0.2598 118.000000 8 -0.5921 118.000000 9 0.2598 118.000000 10 -0.5798 118.000000 11 1.3216 - 118.000000 12 0.5921 - 118.000000 13 -1.3216 - 118.000000 14 3.0123 + 118.000000 12 -0.5921 + 118.000000 13 1.3216 + 118.000000 14 -3.0123 119.000000 0 -0.6434 119.000000 1 1.0011 - 119.000000 2 2.5757 + 119.000000 2 -2.5757 119.000000 3 0.6434 119.000000 4 -1.0011 - 119.000000 5 -2.5757 + 119.000000 5 2.5757 119.000000 6 -0.2070 119.000000 7 0.3220 119.000000 8 -0.8286 119.000000 9 0.3220 119.000000 10 -0.5011 119.000000 11 1.2892 - 119.000000 12 0.8286 - 119.000000 13 -1.2892 - 119.000000 14 3.3171 + 119.000000 12 -0.8286 + 119.000000 13 1.2892 + 119.000000 14 -3.3171 120.000000 0 -0.7924 120.000000 1 0.9012 - 120.000000 2 2.7307 + 120.000000 2 -2.7307 120.000000 3 0.7924 120.000000 4 -0.9012 - 120.000000 5 -2.7307 + 120.000000 5 2.7307 120.000000 6 -0.3139 120.000000 7 0.3570 120.000000 8 -1.0819 120.000000 9 0.3570 120.000000 10 -0.4061 120.000000 11 1.2304 - 120.000000 12 1.0819 - 120.000000 13 -1.2304 - 120.000000 14 3.7283 + 120.000000 12 -1.0819 + 120.000000 13 1.2304 + 120.000000 14 -3.7283 121.000000 0 -0.9258 121.000000 1 0.7791 - 121.000000 2 2.8856 + 121.000000 2 -2.8856 121.000000 3 0.9258 121.000000 4 -0.7791 - 121.000000 5 -2.8856 + 121.000000 5 2.8856 121.000000 6 -0.4286 121.000000 7 0.3606 121.000000 8 -1.3358 121.000000 9 0.3606 121.000000 10 -0.3035 121.000000 11 1.1241 - 121.000000 12 1.3358 - 121.000000 13 -1.1241 - 121.000000 14 4.1634 + 121.000000 12 -1.3358 + 121.000000 13 1.1241 + 121.000000 14 -4.1634 122.000000 0 -1.0404 122.000000 1 0.6372 - 122.000000 2 3.0068 + 122.000000 2 -3.0068 122.000000 3 1.0404 122.000000 4 -0.6372 - 122.000000 5 -3.0068 + 122.000000 5 3.0068 122.000000 6 -0.5412 122.000000 7 0.3315 122.000000 8 -1.5641 122.000000 9 0.3315 122.000000 10 -0.2030 122.000000 11 0.9580 - 122.000000 12 1.5641 - 122.000000 13 -0.9580 - 122.000000 14 4.5204 + 122.000000 12 -1.5641 + 122.000000 13 0.9580 + 122.000000 14 -4.5204 123.000000 0 -1.1331 123.000000 1 0.4785 - 123.000000 2 3.0678 + 123.000000 2 -3.0678 123.000000 3 1.1331 123.000000 4 -0.4785 - 123.000000 5 -3.0678 + 123.000000 5 3.0678 123.000000 6 -0.6420 123.000000 7 0.2711 123.000000 8 -1.7381 123.000000 9 0.2711 123.000000 10 -0.1145 123.000000 11 0.7339 - 123.000000 12 1.7381 - 123.000000 13 -0.7339 - 123.000000 14 4.7057 + 123.000000 12 -1.7381 + 123.000000 13 0.7339 + 123.000000 14 -4.7057 124.000000 0 -1.2016 124.000000 1 0.3062 - 124.000000 2 3.0553 + 124.000000 2 -3.0553 124.000000 3 1.2016 124.000000 4 -0.3062 - 124.000000 5 -3.0553 + 124.000000 5 3.0553 124.000000 6 -0.7219 124.000000 7 0.1840 124.000000 8 -1.8356 124.000000 9 0.1840 124.000000 10 -0.0469 124.000000 11 0.4678 - 124.000000 12 1.8356 - 124.000000 13 -0.4678 - 124.000000 14 4.6674 + 124.000000 12 -1.8356 + 124.000000 13 0.4678 + 124.000000 14 -4.6674 125.000000 0 -1.2438 125.000000 1 0.1242 - 125.000000 2 2.9720 + 125.000000 2 -2.9720 125.000000 3 1.2438 125.000000 4 -0.1242 - 125.000000 5 -2.9720 + 125.000000 5 2.9720 125.000000 6 -0.7735 125.000000 7 0.0773 125.000000 8 -1.8483 125.000000 9 0.0773 125.000000 10 -0.0077 125.000000 11 0.1846 - 125.000000 12 1.8483 - 125.000000 13 -0.1846 - 125.000000 14 4.4165 + 125.000000 12 -1.8483 + 125.000000 13 0.1846 + 125.000000 14 -4.4165 126.000000 0 -1.2584 126.000000 1 -0.0635 - 126.000000 2 2.8361 + 126.000000 2 -2.8361 126.000000 3 1.2584 126.000000 4 0.0635 - 126.000000 5 -2.8361 + 126.000000 5 2.8361 126.000000 6 -0.7918 126.000000 7 -0.0400 126.000000 8 -1.7845 126.000000 9 -0.0400 126.000000 10 -0.0020 126.000000 11 -0.0901 - 126.000000 12 1.7845 - 126.000000 13 0.0901 - 126.000000 14 4.0218 + 126.000000 12 -1.7845 + 126.000000 13 -0.0901 + 126.000000 14 -4.0218 127.000000 0 -1.2446 127.000000 1 -0.2529 - 127.000000 2 2.6773 + 127.000000 2 -2.6773 127.000000 3 1.2446 127.000000 4 0.2529 - 127.000000 5 -2.6773 + 127.000000 5 2.6773 127.000000 6 -0.7745 127.000000 7 -0.1574 127.000000 8 -1.6660 127.000000 9 -0.1574 127.000000 10 -0.0320 127.000000 11 -0.3385 - 127.000000 12 1.6660 - 127.000000 13 0.3385 - 127.000000 14 3.5839 + 127.000000 12 -1.6660 + 127.000000 13 -0.3385 + 127.000000 14 -3.5839 128.000000 0 -1.2022 128.000000 1 -0.4394 - 128.000000 2 2.5300 + 128.000000 2 -2.5300 128.000000 3 1.2022 128.000000 4 0.4394 - 128.000000 5 -2.5300 + 128.000000 5 2.5300 128.000000 6 -0.7226 128.000000 7 -0.2642 128.000000 8 -1.5208 128.000000 9 -0.2642 128.000000 10 -0.0966 128.000000 11 -0.5559 - 128.000000 12 1.5208 - 128.000000 13 0.5559 - 128.000000 14 3.2006 + 128.000000 12 -1.5208 + 128.000000 13 -0.5559 + 128.000000 14 -3.2006 129.000000 0 -1.1318 129.000000 1 -0.6190 - 129.000000 2 2.4265 + 129.000000 2 -2.4265 129.000000 3 1.1318 129.000000 4 0.6190 - 129.000000 5 -2.4265 + 129.000000 5 2.4265 129.000000 6 -0.6405 129.000000 7 -0.3503 129.000000 8 -1.3732 129.000000 9 -0.3503 129.000000 10 -0.1916 129.000000 11 -0.7510 - 129.000000 12 1.3732 - 129.000000 13 0.7510 - 129.000000 14 2.9440 + 129.000000 12 -1.3732 + 129.000000 13 -0.7510 + 129.000000 14 -2.9440 130.000000 0 -1.0346 130.000000 1 -0.7872 - 130.000000 2 2.3893 + 130.000000 2 -2.3893 130.000000 3 1.0346 130.000000 4 0.7872 - 130.000000 5 -2.3893 + 130.000000 5 2.3893 130.000000 6 -0.5352 130.000000 7 -0.4072 130.000000 8 -1.2359 130.000000 9 -0.4072 130.000000 10 -0.3098 130.000000 11 -0.9404 - 130.000000 12 1.2359 - 130.000000 13 0.9404 - 130.000000 14 2.8544 + 130.000000 12 -1.2359 + 130.000000 13 -0.9404 + 130.000000 14 -2.8544 131.000000 0 -0.9123 131.000000 1 -0.9401 - 131.000000 2 2.4265 + 131.000000 2 -2.4265 131.000000 3 0.9123 131.000000 4 0.9401 - 131.000000 5 -2.4265 + 131.000000 5 2.4265 131.000000 6 -0.4161 131.000000 7 -0.4288 131.000000 8 -1.1068 131.000000 9 -0.4288 131.000000 10 -0.4419 131.000000 11 -1.1406 - 131.000000 12 1.1068 - 131.000000 13 1.1406 - 131.000000 14 2.9440 + 131.000000 12 -1.1068 + 131.000000 13 -1.1406 + 131.000000 14 -2.9440 132.000000 0 -0.7673 - 132.000000 1 -1.0740 - 132.000000 2 2.5300 + 132.000000 1 -1.0741 + 132.000000 2 -2.5300 132.000000 3 0.7673 - 132.000000 4 1.0740 - 132.000000 5 -2.5300 + 132.000000 4 1.0741 + 132.000000 5 2.5300 132.000000 6 -0.2944 132.000000 7 -0.4121 132.000000 8 -0.9707 132.000000 9 -0.4121 132.000000 10 -0.5768 132.000000 11 -1.3587 - 132.000000 12 0.9707 - 132.000000 13 1.3587 - 132.000000 14 3.2006 + 132.000000 12 -0.9707 + 132.000000 13 -1.3587 + 132.000000 14 -3.2006 133.000000 0 -0.6028 133.000000 1 -1.1856 - 133.000000 2 2.6773 + 133.000000 2 -2.6773 133.000000 3 0.6028 133.000000 4 1.1856 - 133.000000 5 -2.6773 + 133.000000 5 2.6773 133.000000 6 -0.1817 133.000000 7 -0.3573 133.000000 8 -0.8069 133.000000 9 -0.3573 133.000000 10 -0.7028 133.000000 11 -1.5870 - 133.000000 12 0.8069 - 133.000000 13 1.5870 - 133.000000 14 3.5839 + 133.000000 12 -0.8069 + 133.000000 13 -1.5870 + 133.000000 14 -3.5839 134.000000 0 -0.4220 134.000000 1 -1.2718 - 134.000000 2 2.8361 + 134.000000 2 -2.8361 134.000000 3 0.4220 134.000000 4 1.2718 - 134.000000 5 -2.8361 + 134.000000 5 2.8361 134.000000 6 -0.0890 134.000000 7 -0.2683 134.000000 8 -0.5984 134.000000 9 -0.2683 134.000000 10 -0.8088 134.000000 11 -1.8035 - 134.000000 12 0.5984 - 134.000000 13 1.8035 - 134.000000 14 4.0218 + 134.000000 12 -0.5984 + 134.000000 13 -1.8035 + 134.000000 14 -4.0218 135.000000 0 -0.2289 135.000000 1 -1.3305 - 135.000000 2 2.9720 + 135.000000 2 -2.9720 135.000000 3 0.2289 135.000000 4 1.3305 - 135.000000 5 -2.9720 + 135.000000 5 2.9720 135.000000 6 -0.0262 135.000000 7 -0.1522 135.000000 8 -0.3401 135.000000 9 -0.1522 135.000000 10 -0.8851 135.000000 11 -1.9771 - 135.000000 12 0.3401 - 135.000000 13 1.9771 - 135.000000 14 4.4165 + 135.000000 12 -0.3401 + 135.000000 13 -1.9771 + 135.000000 14 -4.4165 136.000000 0 -0.0277 136.000000 1 -1.3597 - 136.000000 2 3.0553 + 136.000000 2 -3.0553 136.000000 3 0.0277 136.000000 4 1.3597 - 136.000000 5 -3.0553 + 136.000000 5 3.0553 136.000000 6 -0.0004 136.000000 7 -0.0188 136.000000 8 -0.0423 136.000000 9 -0.0188 136.000000 10 -0.9244 - 136.000000 11 -2.0771 - 136.000000 12 0.0423 - 136.000000 13 2.0772 - 136.000000 14 4.6674 + 136.000000 11 -2.0772 + 136.000000 12 -0.0423 + 136.000000 13 -2.0772 + 136.000000 14 -4.6674 diff --git a/src/colvar/Torsion.cpp b/src/colvar/Torsion.cpp index 805388f89b84565fd1ea454662d8c79391ba6ec7..7a3a69212c0eab956175a1d8b1a428af48307ae9 100644 --- a/src/colvar/Torsion.cpp +++ b/src/colvar/Torsion.cpp @@ -107,7 +107,7 @@ do_cosine(false) checkRead(); if(atoms.size()==4){ - if(!(v1.empty()) && (v2.empty()) && (axis.empty())) + if(!(v1.empty() && v2.empty() && axis.empty())) error("ATOMS keyword is not compatible with VECTOR1, VECTOR2 and AXIS keywords"); log.printf(" between atoms %d %d %d %d\n",atoms[0].serial(),atoms[1].serial(),atoms[2].serial(),atoms[3].serial()); atoms.resize(6); diff --git a/src/core/GREX.cpp b/src/core/GREX.cpp index 871fc9af0ef7108619da2e75caafb2bfbed12d9b..001b0108f600389c80a990416d756b18123b77ec 100644 --- a/src/core/GREX.cpp +++ b/src/core/GREX.cpp @@ -25,14 +25,15 @@ #include "tools/Tools.h" #include "tools/Communicator.h" #include <sstream> +#include <unordered_map> #include "GREXEnum.inc" using namespace std; namespace PLMD{ -std::map<std::string, int> & GREXWordMap(){ - static std::map<std::string, int> word_map; +const std::unordered_map<std::string, int> & GREXWordMap(){ + static std::unordered_map<std::string, int> word_map; static bool init=false; if(!init){ #include "GREXMap.inc" @@ -73,7 +74,7 @@ void GREX::cmd(const string&key,void*val){ // do nothing } else { int iword=-1; - std::map<std::string, int>::const_iterator it=GREXWordMap().find(words[0]); + auto it=GREXWordMap().find(words[0]); if(it!=GREXWordMap().end()) iword=it->second; switch(iword){ case cmd_initialized: diff --git a/src/core/PlumedMain.cpp b/src/core/PlumedMain.cpp index 007cdf8ae8a6c534fdb3792a19bf5bcd7edf8806..e391a999a4fca189677d17afa1de3712a7f10940 100644 --- a/src/core/PlumedMain.cpp +++ b/src/core/PlumedMain.cpp @@ -43,6 +43,7 @@ #include <cstdlib> #include <cstring> #include <set> +#include <unordered_map> using namespace std; @@ -50,8 +51,8 @@ using namespace std; namespace PLMD{ -std::map<std::string, int> & plumedMainWordMap(){ - static std::map<std::string, int> word_map; +const std::unordered_map<std::string, int> & plumedMainWordMap(){ + static std::unordered_map<std::string, int> word_map; static bool init=false; if(!init){ #include "PlumedMainMap.inc" @@ -127,7 +128,7 @@ void PlumedMain::cmd(const std::string & word,void*val){ } else { int iword=-1; double d; - std::map<std::string, int>::const_iterator it=plumedMainWordMap().find(words[0]); + auto it=plumedMainWordMap().find(words[0]); if(it!=plumedMainWordMap().end()) iword=it->second; switch(iword) { case cmd_setBox: diff --git a/src/maketools/codecheck b/src/maketools/codecheck index 15b6bd2f21a623123de2bc858ab6849052005f39..89781a37143d7dee8a667cfb13bfba991aa5c09a 100755 --- a/src/maketools/codecheck +++ b/src/maketools/codecheck @@ -34,7 +34,7 @@ if [ $do_cppcheck == true ] ; then else files="$(echo */*.{h,cpp})" fi - cppcheck --std=c++03 --std=posix 4 -j 4 --platform=unix64 \ + cppcheck --std=c++11 --std=posix 4 -j 4 --platform=unix64 \ --template='[{file}:{line}] ({severity}) :{id}: {message}' --enable=all --inline-suppr --force \ $files fi diff --git a/src/multicolvar/DistanceFromContour.cpp b/src/multicolvar/DistanceFromContour.cpp index 0de8592ace12af95d3f9419eae32fd28278f01ec..35e792a735786ebca6435e5e2de9f98eb1328f01 100644 --- a/src/multicolvar/DistanceFromContour.cpp +++ b/src/multicolvar/DistanceFromContour.cpp @@ -264,36 +264,31 @@ void DistanceFromContour::calculate(){ // This deals with periodic boundary conditions - if we are inside the membrane the sum of the absolute // distances from the contours should add up to the spacing. When this is not the case we must be outside // the contour - if( predir==-1 && (fabs(root1[dir])+fabs(root2[dir]))>(spacing+pbc_param) ) predir=1; + // if( predir==-1 && (fabs(root1[dir])+fabs(root2[dir]))>(spacing+pbc_param) ) predir=1; // Set the final value to root that is closest to the "origin" = position of atom if( fabs(root1[dir])<fabs(root2[dir]) ){ getPntrToComponent("dist1")->set( predir*fabs(root1[dir]) ); getPntrToComponent("dist2")->set( fabs(root2[dir]) ); - getPntrToComponent("qdist")->set( predir*fabs(root1[dir])*fabs(root2[dir]) ); } else { getPntrToComponent("dist1")->set( predir*fabs(root2[dir]) ); getPntrToComponent("dist2")->set( fabs(root1[dir]) ); - getPntrToComponent("qdist")->set( predir*fabs(root2[dir])*fabs(root1[dir]) ); } + getPntrToComponent("qdist")->set( root2[dir]*root1[dir] ); // Now calculate the derivatives if( !doNotCalculateDerivatives() ){ Value* ival=myvalue_vessel->getFinalValue(); ival->clearDerivatives(); std::vector<double> root1v(3); for(unsigned i=0;i<3;++i) root1v[i]=root1[i]; derivTime=true; std::vector<double> der(3); getDifferenceFromContour( root1v, der ); double prefactor; - if( mybasemulticolvars[0]->isDensity() ){ - if( fabs(root1[dir])<fabs(root2[dir]) ) prefactor = predir*fabs(root1[dir]) / myderiv_vessel->getOutputValue(); - else prefactor = fabs(root2[dir]); - } else plumed_error(); + if( mybasemulticolvars[0]->isDensity() ) prefactor = root2[dir] / myderiv_vessel->getOutputValue(); + else plumed_error(); Value* val=getPntrToComponent("qdist"); for(unsigned i=0;i<val->getNumberOfDerivatives();++i) val->setDerivative( i, -prefactor*ival->getDerivative(i) ); ival->clearDerivatives(); std::vector<double> root2v(3); for(unsigned i=0;i<3;++i) root2v[i]=root2[i]; getDifferenceFromContour( root2v, der ); - if( mybasemulticolvars[0]->isDensity() ){ - if( fabs(root1[dir])<fabs(root2[dir]) ) prefactor = fabs(root2[dir]) / myderiv_vessel->getOutputValue(); - else prefactor = predir*fabs(root2[dir]) / myderiv_vessel->getOutputValue(); - } else plumed_error(); + if( mybasemulticolvars[0]->isDensity() ) prefactor = root1[dir] / myderiv_vessel->getOutputValue(); + else plumed_error(); for(unsigned i=0;i<val->getNumberOfDerivatives();++i) val->addDerivative( i, -prefactor*ival->getDerivative(i) ); } } diff --git a/src/tools/Kearsley.cpp b/src/tools/Kearsley.cpp deleted file mode 100644 index 0061b5e9a1c6883d5f2e268284ba5c8557fdc2a5..0000000000000000000000000000000000000000 --- a/src/tools/Kearsley.cpp +++ /dev/null @@ -1,874 +0,0 @@ -/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - Copyright (c) 2011-2016 The plumed team - (see the PEOPLE file at the root of the distribution for a list of names) - - See http://www.plumed.org for more information. - - This file is part of plumed, version 2. - - plumed is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - plumed 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with plumed. If not, see <http://www.gnu.org/licenses/>. -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -#include "Kearsley.h" -#include <cmath> -#include <iostream> -#include <cstdlib> -#include "Matrix.h" -#include "Tensor.h" -#include "Log.h" -#include "Matrix.h" -#include "Random.h" - -using namespace std; -namespace PLMD{ - -// put some notes - -Kearsley::Kearsley(const vector<Vector> &p0, const vector<Vector> &p1, const vector<double> &align, Log* &log): - log(log), - p0(p0), - p1(p1), - align(align), - com0_is_removed(false), - com1_is_removed(false), - err(0.0) -{ - // now make an initial allocation -// int n=p0.size(); - // eventually here one should make a "hard" resize of all the structures -// log->printf("Reallocating a size of %d atoms to kearsley structure\n",n); - -// try{ -// diff.resize(n); -// }catch(bad_alloc&) { -// cerr<<"Cannot allocate the vector in Kearsley"<<endl; -// } -// try{ -// diff.resize(n); -// }catch(bad_alloc&) { -// cerr<<"Cannot allocate the vector in Kearsley"<<endl; -// } - -} -// do the alignment - -double Kearsley::calculate(bool rmsd) { - // just an ad-hoc scaling factor - double myscale=1.; - // basic sanity check - if(p0.size()!=p1.size() || p1.size()!=align.size()){ - cerr<<"Kearsley: looks like you have not properly allocated the vectors: the two frames have different size"<<endl; - cerr<<"size of p0 is :"<<p0.size()<<endl; - cerr<<"size of p1 is :"<<p1.size()<<endl; - cerr<<"size of align is :"<<align.size()<<endl; - exit(0); - } - if(p0.empty() || p1.empty() ){ - cerr<<"Kearsley: looks like you have not properly allocated the vectors: they do not contain anything"<<endl; - exit(0); - } - Vector rr1,rr0; - Vector4d q; - double dddq[4][4][4],gamma[3][3][3],rrsq; - Matrix<double> m=Matrix<double>(4,4); -// double dm_r1[4][4][3],dm_r0[4][4][3]; - Vector dm_r1[4][4]; - Vector dm_r0[4][4]; - Tensor pi1,pi0; - Tensor d; - Tensor dinv; - Vector xx; - double totalign=0., s, tmp1, err; - unsigned i,j,k,l,ii,ll,jj,mm,n,nn,iii; - bool verbose=false; - - vector<int> alignmap; // on the fly map done for optimization - - unsigned natoms=p0.size(); - - - // calculate coms - - for(i=0;i<natoms;i++){ - if (align[i]>0.){ - alignmap.push_back(i); - totalign+=align[i]; - } - if (align[i]<0.){cerr<<"FOUND ALIGNMENT WEIGHT NEGATIVE!"<<endl;exit(0);}; - - } - - - // later will be implemented something for optimizing this piece of crap - - com0_is_removed=false; - com1_is_removed=false; - - bool do_center=true; // keep it for legacy code compatibility - - if(com0_is_removed==false){ - - xx.zero(); - - if(do_center) {// if you dont need to center no prob... - for(i=0;i<alignmap.size();i++){ - xx+=p0[alignmap[i]]*align[alignmap[i]]; - } - xx/=(totalign); - } - - com0=xx; - - if (p0reset.empty()){p0reset.resize(natoms);} - for(i=0;i<natoms;i++){ - p0reset[i]=p0[i]-xx; - } - com0_is_removed=true; - - if (verbose){ - log->printf("P0 RESET\n"); - for(i=0;i<natoms;i++){ - log->printf("ATOM %6u C ALA 1 %8.3f%8.3f%8.3f 1.00 1.00\n",i+1,p0reset[i][0]/myscale,p0reset[i][1]/myscale,p0reset[i][2]/myscale); - } - log->printf("END\n"); - } - - } - - if(com1_is_removed==false){ - - xx.zero(); - - if(do_center) {// if you dont need to center no prob... - for(i=0;i<alignmap.size();i++){ - xx+=p1[alignmap[i]]*align[alignmap[i]]; - } - xx/=(totalign); - } - - com1=xx; - - if (p1reset.empty()){p1reset.resize(natoms);} - - for(i=0;i<natoms;i++){ - p1reset[i]=p1[i]-xx; - } - com1_is_removed=true; - - if(verbose){ - log->printf("P1 RESET\n"); - for(i=0;i<natoms;i++){ - log->printf("ATOM %6u C ALA 1 %8.3f%8.3f%8.3f 1.00 1.00\n",i+1,p1reset[i][0]/myscale,p1reset[i][1]/myscale,p1reset[i][2]/myscale); - } - log->printf("END\n"); - } - - } - - bool fake=false; - if(fake){ - // case of trivial alignment - // set rotmat - rotmat0on1=Tensor::identity(); - if (p0reset.size()==0){p0reset.resize(natoms);} - if (p1reset.size()==0){p1reset.resize(natoms);} - - derrdp0.resize(natoms); - derrdp1.resize(natoms); - dmatdp0.resize(3*3*3*natoms);for(i=0;i<dmatdp0.size();i++)dmatdp0[i]=0.; - dmatdp1.resize(3*3*3*natoms);for(i=0;i<dmatdp1.size();i++)dmatdp1[i]=0.; - - err=0.; - for(i=0;i<natoms;i++){ - if(align[i]>0.)err+=align[i]*modulo2(p0reset[i]-p1reset[i]); - } - - return 0.; - } - // - // CLEAN M MATRIX - - m=0.; - - // ASSIGN MATRIX ELEMENTS USING ONLY THE ATOMS INVOLVED IN ALIGNMENT - - for(i=0;i<alignmap.size();i++){ - - k=alignmap[i]; - tmp1=sqrt(align[k]/totalign); - - // adopt scaled coordinates - - rr1=p1reset[k]*tmp1; - rr0=p0reset[k]*tmp1; - - rrsq=modulo2(rr0)+modulo2(rr1); - - m[0][0] += rrsq+2.*(-rr0[0]*rr1[0]-rr0[1]*rr1[1]-rr0[2]*rr1[2]); - m[1][1] += rrsq+2.*(-rr0[0]*rr1[0]+rr0[1]*rr1[1]+rr0[2]*rr1[2]); - m[2][2] += rrsq+2.*(+rr0[0]*rr1[0]-rr0[1]*rr1[1]+rr0[2]*rr1[2]); - m[3][3] += rrsq+2.*(+rr0[0]*rr1[0]+rr0[1]*rr1[1]-rr0[2]*rr1[2]); - m[0][1] += 2.*(-rr0[1]*rr1[2]+rr0[2]*rr1[1]); - m[0][2] += 2.*( rr0[0]*rr1[2]-rr0[2]*rr1[0]); - m[0][3] += 2.*(-rr0[0]*rr1[1]+rr0[1]*rr1[0]); - m[1][2] -= 2.*( rr0[0]*rr1[1]+rr0[1]*rr1[0]); - m[1][3] -= 2.*( rr0[0]*rr1[2]+rr0[2]*rr1[0]); - m[2][3] -= 2.*( rr0[1]*rr1[2]+rr0[2]*rr1[1]); - - }; - m[1][0] = m[0][1]; - m[2][0] = m[0][2]; - m[2][1] = m[1][2]; - m[3][0] = m[0][3]; - m[3][1] = m[1][3]; - m[3][2] = m[2][3]; - - // diagonalize the 4x4 matrix - - vector<double> eigenvals; - Matrix<double> eigenvecs; - - int diagerror=diagMat(m, eigenvals, eigenvecs ); - - if (diagerror!=0){cerr<<"DIAGONALIZATION FAILED WITH ERROR CODE "<<diagerror<<endl;exit(0);} - - s=1.0; - if(eigenvecs(0,0)<0.)s=-1.;//correct for negative values (?) - // eigenvecs are in rows!! - - q[0]=s*eigenvecs(0,0); - q[1]=s*eigenvecs(0,1); - q[2]=s*eigenvecs(0,2); - q[3]=s*eigenvecs(0,3); - err=eigenvals[0]; - - //log->printf(" ERR: %20.10f \n",err); - - if(verbose){ - log->printf(" ERR: %f \n",err); - for (i=0;i<4;i++){ - log->printf(" EIGENVALS: %f \n",eigenvals[i]); - } - } - - if(abs(eigenvals[0]-eigenvals[1])<1.e-8){ - cerr<<"DIAGONALIZATION: NON UNIQUE SOLUTION"<<endl;exit(0); - } - - /* - * the ROTATION matrix - */ - - d[0][0]=q[0]*q[0]+q[1]*q[1]-q[2]*q[2]-q[3]*q[3] ; - d[1][0]=2.0*(q[1]*q[2]-q[0]*q[3]); - d[2][0]=2.0*(q[1]*q[3]+q[0]*q[2]); - d[0][1]=2.0*(q[1]*q[2]+q[0]*q[3]); - d[1][1]=q[0]*q[0]+q[2]*q[2]-q[1]*q[1]-q[3]*q[3]; - d[2][1]=2.0*(q[2]*q[3]-q[0]*q[1]); - d[0][2]=2.0*(q[1]*q[3]-q[0]*q[2]); - d[1][2]=2.0*(q[2]*q[3]+q[0]*q[1]); - d[2][2]=q[0]*q[0]+q[3]*q[3]-q[1]*q[1]-q[2]*q[2]; - - /* - * first derivative in perturbation theory : derivative of the rotation matrix respect to the - * quternion vectors - */ - - dddq[0][0][0]= 2.0*q[0]; - dddq[1][0][0]=-2.0*q[3]; - dddq[2][0][0]= 2.0*q[2]; - dddq[0][1][0]= 2.0*q[3]; - dddq[1][1][0]= 2.0*q[0]; - dddq[2][1][0]=-2.0*q[1]; - dddq[0][2][0]=-2.0*q[2]; - dddq[1][2][0]= 2.0*q[1]; - dddq[2][2][0]= 2.0*q[0]; - - dddq[0][0][1]= 2.0*q[1]; - dddq[1][0][1]= 2.0*q[2]; - dddq[2][0][1]= 2.0*q[3]; - dddq[0][1][1]= 2.0*q[2]; - dddq[1][1][1]=-2.0*q[1]; - dddq[2][1][1]=-2.0*q[0]; - dddq[0][2][1]= 2.0*q[3]; - dddq[1][2][1]= 2.0*q[0]; - dddq[2][2][1]=-2.0*q[1]; - - dddq[0][0][2]=-2.0*q[2]; - dddq[1][0][2]= 2.0*q[1]; - dddq[2][0][2]= 2.0*q[0]; - dddq[0][1][2]= 2.0*q[1]; - dddq[1][1][2]= 2.0*q[2]; - dddq[2][1][2]= 2.0*q[3]; - dddq[0][2][2]=-2.0*q[0]; - dddq[1][2][2]= 2.0*q[3]; - dddq[2][2][2]=-2.0*q[2]; - - dddq[0][0][3]=-2.0*q[3]; - dddq[1][0][3]=-2.0*q[0]; - dddq[2][0][3]= 2.0*q[1]; - dddq[0][1][3]= 2.0*q[0]; - dddq[1][1][3]=-2.0*q[3]; - dddq[2][1][3]= 2.0*q[2]; - dddq[0][2][3]= 2.0*q[1]; - dddq[1][2][3]= 2.0*q[2]; - dddq[2][2][3]= 2.0*q[3]; - - /* - * Build gamma 3x3x3 matrix - */ - for(i=0;i<3;i++){ //direction - for(j=0;j<3;j++){ //direction - for(k=0;k<3;k++){ //eigenvector number - gamma[i][j][k]=0.0; - for(l=0;l<4;l++){ //components of each eigenvector in pert. series - if(abs(eigenvals[0]-eigenvals[k+1])<1.e-8){ - log->printf(" FOUND DEGENERACY IN RMSD_ESS ROUTINE \n"); - log->printf(" I'm DYING....\n"); - log->printf(" COPYING STACK HERE \n"); - log->printf(" P0\n"); - for(ll=0;ll<natoms;ll++)log->printf(" %f %f %f \n",p0reset[ll][0],p0reset[ll][1],p0reset[ll][2]); - log->printf(" P1\n"); - for(ll=0;ll<natoms;ll++)log->printf(" %f %f %f \n",p1reset[ll][0],p1reset[ll][1],p1reset[ll][2]); - exit(0); - } - else{ - gamma[i][j][k] += dddq[i][j][l]*eigenvecs(k+1,l)/(eigenvals[0]-eigenvals[k+1]); - } - } - //log->printf("GAMMA %2d %2d %2d V %12.6f\n",i,j,k,gamma[i][j][k]); - } - } - } - - // allocate various arrays - - dmatdp1.resize(3*3*3*natoms); - for(i=0;i<dmatdp1.size();i++)dmatdp1[i]=0.; - dmatdp0.resize(3*3*3*natoms); - for(i=0;i<dmatdp0.size();i++)dmatdp0[i]=0.; - - vector<double> dd_dr_temp;dd_dr_temp.resize(natoms); - - vector<Vector> derr_dr1; - derr_dr1.resize(natoms); - vector<Vector> derr_dr0; - derr_dr0.resize(natoms); - vector<Vector> array_3_n; - array_3_n.resize(natoms); - - - /* - * Table of Derivative of the quaternion matrix respect to atom position: needed only if simple - * alignment is required and no correction respect to the rotation matrix is wanted - */ - - for(iii=0;iii<alignmap.size();iii++){ - - i=alignmap[iii]; - tmp1=sqrt(align[i]/totalign); - - // once again: derivative respect to scaled distance - - rr1=2.*p1reset[i]*tmp1; - rr0=2.*p0reset[i]*tmp1; - - - dm_r1 [0][0][0]=(rr1[0]-rr0[0]); - dm_r1 [0][0][1]=(rr1[1]-rr0[1]); - dm_r1 [0][0][2]=(rr1[2]-rr0[2]); - - dm_r1 [0][1][0]=0.; - dm_r1 [0][1][1]= rr0[2]; - dm_r1 [0][1][2]=-rr0[1]; - - dm_r1 [0][2][0]=-rr0[2]; - dm_r1 [0][2][1]= 0.; - dm_r1 [0][2][2]= rr0[0]; - - dm_r1 [0][3][0]= rr0[1]; - dm_r1 [0][3][1]=-rr0[0]; - dm_r1 [0][3][2]= 0.; - - dm_r1 [1][1][0]=(rr1[0]-rr0[0]); - dm_r1 [1][1][1]=(rr1[1]+rr0[1]); - dm_r1 [1][1][2]=(rr1[2]+rr0[2]); - - dm_r1 [1][2][0]=-rr0[1]; - dm_r1 [1][2][1]=-rr0[0]; - dm_r1 [1][2][2]= 0.; - - dm_r1 [1][3][0]=-rr0[2]; - dm_r1 [1][3][1]= 0.; - dm_r1 [1][3][2]=-rr0[0]; - - dm_r1 [2][2][0]=(rr1[0]+rr0[0]); - dm_r1 [2][2][1]=(rr1[1]-rr0[1]); - dm_r1 [2][2][2]=(rr1[2]+rr0[2]); - - dm_r1 [2][3][0]=0.; - dm_r1 [2][3][1]=-rr0[2]; - dm_r1 [2][3][2]=-rr0[1]; - - dm_r1 [3][3][0]=(rr1[0]+rr0[0]); - dm_r1 [3][3][1]=(rr1[1]+rr0[1]); - dm_r1 [3][3][2]=(rr1[2]-rr0[2]); - /* - derivative respec to to the other vector - */ - dm_r0 [0][0][0]=-(rr1[0]-rr0[0]); - dm_r0 [0][0][1]=-(rr1[1]-rr0[1]); - dm_r0 [0][0][2]=-(rr1[2]-rr0[2]); - - dm_r0 [0][1][0]=0. ; - dm_r0 [0][1][1]=-rr1[2]; - dm_r0 [0][1][2]=rr1[1]; - - dm_r0 [0][2][0]= rr1[2]; - dm_r0 [0][2][1]= 0.; - dm_r0 [0][2][2]=-rr1[0]; - - dm_r0 [0][3][0]=-rr1[1] ; - dm_r0 [0][3][1]= rr1[0]; - dm_r0 [0][3][2]= 0.; - - dm_r0 [1][1][0]=-(rr1[0]-rr0[0]); - dm_r0 [1][1][1]=(rr1[1]+rr0[1]); - dm_r0 [1][1][2]=(rr1[2]+rr0[2]); - - dm_r0 [1][2][0]=-rr1[1]; - dm_r0 [1][2][1]=-rr1[0]; - dm_r0 [1][2][2]= 0.; - - dm_r0 [1][3][0]=-rr1[2]; - dm_r0 [1][3][1]= 0.; - dm_r0 [1][3][2]=-rr1[0]; - - dm_r0 [2][2][0]=(rr1[0]+rr0[0]); - dm_r0 [2][2][1]=-(rr1[1]-rr0[1]); - dm_r0 [2][2][2]=(rr1[2]+rr0[2]); - - dm_r0 [2][3][0]=0.; - dm_r0 [2][3][1]=-rr1[2]; - dm_r0 [2][3][2]=-rr1[1]; - - dm_r0 [3][3][0]=(rr1[0]+rr0[0]); - dm_r0 [3][3][1]=(rr1[1]+rr0[1]); - dm_r0 [3][3][2]=-(rr1[2]-rr0[2]); - /* - * write the diagonal - */ - - dm_r1[1][0]=dm_r1[0][1]; - dm_r1[2][0]=dm_r1[0][2]; - dm_r1[3][0]=dm_r1[0][3]; - dm_r1[2][1]=dm_r1[1][2]; - dm_r1[3][1]=dm_r1[1][3]; - dm_r1[3][2]=dm_r1[2][3]; - - dm_r0[1][0]=dm_r0[0][1]; - dm_r0[2][0]=dm_r0[0][2]; - dm_r0[3][0]=dm_r0[0][3]; - dm_r0[2][1]=dm_r0[1][2]; - dm_r0[3][1]=dm_r0[1][3]; - dm_r0[3][2]=dm_r0[2][3]; - - - //log->printf("DMDR0 ALIGN %f AT %d VAL %f\n",align[i],i,dm_r0[0][0][j]); - - - /* - * pi matrix : coefficents in per theory - */ - - pi0.zero(); - pi1.zero(); - derr_dr1[i].zero(); - derr_dr0[i].zero(); - - for(k=0;k<4;k++){ - for(l=0;l<4;l++){ - derr_dr1[i]+=(q[k]*q[l])*dm_r1[l][k]; - derr_dr0[i]+=(q[k]*q[l])*dm_r0[l][k]; - for(mm=0;mm<3;mm++)for(j=0;j<3;j++){ - pi0[mm][j]+=eigenvecs(mm+1,k)*dm_r0[l][k][j]*q[l]; - pi1[mm][j]+=eigenvecs(mm+1,k)*dm_r1[l][k][j]*q[l]; - }; - }; - }; -/* - derr_dr1[i]/=totalign; - derr_dr0[i]/=totalign; - - -*/ - - for(j=0;j<3;j++){ - for (k=0;k<3;k++){ - for(l=0;l<3;l++){ - int ind=j*3*3*natoms+k*3*natoms+l*natoms+i; - dmatdp0[ind]=0.; - dmatdp1[ind]=0.; - for(ii=0;ii<3;ii++){ - dmatdp1[ind]+=gamma[j][k][ii]*pi1[ii][l]; - dmatdp0[ind]+=gamma[j][k][ii]*pi0[ii][l]; - } - - } - - } - - } - } - - - - - // end of the calculation of the derivative of the rotation matrix - - /* - * Now correct for center of mass: only if needed - * - */ - - bool comcorr_r1=true; - - if(comcorr_r1){ - for(k=0;k<alignmap.size();k++){ - i=alignmap[k]; - tmp1=sqrt(align[i]/totalign); - array_3_n[i]=tmp1*derr_dr1[i]; - if(do_center){ - for(jj=0;jj<alignmap.size();jj++){ - j=alignmap[jj]; - array_3_n[i]-=tmp1*(align[j]/totalign)*derr_dr1[j]; - } - } - } - for(k=0;k<alignmap.size();k++){ - i=alignmap[k]; - derr_dr1[i]=array_3_n[i]; - } - } - - - bool do_comcorr_r0=true; - // - // correction for r0 frame - // - if(do_comcorr_r0){ - for(k=0;k<alignmap.size();k++){ - i=alignmap[k]; - tmp1=sqrt(align[i]/totalign); - array_3_n[i]=tmp1*derr_dr0[i]; - if(do_center){ - for(jj=0;jj<alignmap.size();jj++){ - j=alignmap[jj]; - array_3_n[i]-=tmp1*(align[j]/totalign)*derr_dr0[j]; - } - } - } - for(k=0;k<alignmap.size();k++){ - i=alignmap[k]; - derr_dr0[i]=array_3_n[i]; - } - } - - - bool do_der_r1=true; - bool do_der_r0=true; - bool do_der_rotmat=true; - - if(do_der_r1 && do_der_rotmat){ - for(i=0;i<3;i++){ - for(j=0;j<3;j++){ - for(k=0;k<3;k++){ - for(ll=0;ll<alignmap.size();ll++){ - l=alignmap[ll]; - int ind=i*3*3*natoms+j*3*natoms+k*natoms+l; - tmp1=sqrt(align[l]/totalign); - dd_dr_temp[l]=tmp1*dmatdp1[ind]; - if(do_center){ - for(nn=0;nn<alignmap.size();nn++){ - n=alignmap[nn]; - dd_dr_temp[l]-=dmatdp1[ind-l+n]*tmp1*align[n]/totalign; - } - } - - } - for(ll=0;ll<alignmap.size();ll++){ - l=alignmap[ll]; - int ind=i*3*3*natoms+j*3*natoms+k*natoms+l; - dmatdp1[ind]=dd_dr_temp[l]; - } - - } - } - } - - } - - if(do_der_r0 && do_der_rotmat){ - for(i=0;i<3;i++){ - for(j=0;j<3;j++){ - for(k=0;k<3;k++){ - for(ll=0;ll<alignmap.size();ll++){ - l=alignmap[ll]; - int ind=i*3*3*natoms+j*3*natoms+k*natoms+l; - tmp1=sqrt(align[l]/totalign); - dd_dr_temp[l]=tmp1*dmatdp0[ind]; - if(do_center){ - for(nn=0;nn<alignmap.size();nn++){ - n=alignmap[nn]; - dd_dr_temp[l]-=dmatdp0[ind-l+n]*tmp1*align[n]/totalign; - } - } - } - for(ll=0;ll<alignmap.size();ll++){ - l=alignmap[ll]; - int ind=i*3*3*natoms+j*3*natoms+k*natoms+l; - dmatdp0[ind]=dd_dr_temp[l]; - } - } - } - } - } - - - bool do_p1rotated=true; - if (do_p1rotated){ - // resize if not allocated - - if(p1.size()!=p1rotated.size())p1rotated.resize(p1.size()); - -// exit(0); - - for(i=0;i<natoms;i++) p1rotated[i]=matmul(d,p1reset[i]); - - // reallocate difference vectors - if(p1.size()!=diff1on0.size())diff1on0.resize(p1.size()); - for(i=0;i<natoms;i++){ - diff1on0[i]=p1rotated[i]-p0reset[i]; - } - - if(verbose){ - log->printf("P1-RESET-AND-ROTATED\n"); - for(i=0;i<natoms;i++){ - log->printf("ATOM %6u C ALA 2 %8.3f%8.3f%8.3f 1.00 1.00\n",i+1,p1rotated[i][0]/myscale,p1rotated[i][1]/myscale,p1rotated[i][2]/myscale); - } - log->printf("END\n"); - log->printf("P0-RESET\n"); - for(i=0;i<natoms;i++){ - log->printf("ATOM %6u C ALA 2 %8.3f%8.3f%8.3f 1.00 1.00\n",i+1,p0reset[i][0]/myscale,p0reset[i][1]/myscale,p0reset[i][2]/myscale); - } - log->printf("END\n"); - } - - } - - - - dinv=inverse(d); - - bool do_p0rotated=true; - if (do_p0rotated){ - if(p0.size()!=p0rotated.size())p0rotated.resize(p0.size()); - for(i=0;i<natoms;i++) p0rotated[i]=matmul(dinv,p0reset[i]); - if(p1.size()!=diff0on1.size())diff0on1.resize(p1.size()); - for(i=0;i<natoms;i++) diff0on1[i]=p0rotated[i]-p1reset[i]; - if(verbose){ - log->printf("P0-RESET AND INVERSE ROTATED\n"); - for(i=0;i<natoms;i++){ - log->printf("ATOM %6u C ALA 1 %8.3f%8.3f%8.3f 1.00 1.00\n",i+1,p0rotated[i][0]/myscale,p0rotated[i][1]/myscale,p0rotated[i][2]/myscale); - } - log->printf("END\n"); - log->printf("P1-RESET\n"); - for(i=0;i<natoms;i++){ - log->printf("ATOM %6u C ALA 2 %8.3f%8.3f%8.3f 1.00 1.00\n",i+1,p1reset[i][0]/myscale,p1reset[i][1]/myscale,p1reset[i][2]/myscale); - } - log->printf("END\n"); - } - } - // copy on the official vectors: - rotmat0on1=d; - rotmat1on0=dinv; - derrdp0.resize(natoms); - derrdp0=derr_dr0; - derrdp1.resize(natoms); - derrdp1=derr_dr1; - - // now rescale accordingly for rmsd instead of msd - if(rmsd){ - err=sqrt(err); - double tmp=0.5/err; - for(ii=0;ii<alignmap.size();ii++){ - i=alignmap[ii]; - derrdp0[i]*=tmp; - derrdp1[i]*=tmp; - } - - } - - return err; - -} -void Kearsley::assignP1(const std::vector<Vector> & p1) { - this->p1=p1; - com1_is_removed=false; -} -void Kearsley::assignP0(const std::vector<Vector> & p0) { - this->p0=p0; - com0_is_removed=false; -} - -void Kearsley::assignAlign(const std::vector<double> & align) { - this->align=align; -} - -void Kearsley::finiteDifferenceInterface(bool rmsd){ -log->printf("Entering rmsd finite difference test system for kearsley\n"); -log->printf("-------------------------------------------\n"); -log->printf("TEST1: derivative of the value (derr_dr0/derr_dr1)\n"); -//// test 1 -unsigned i,j,l,m; -double step=1.e-6,olderr,delta; -// messing up a bit with align weights -double delta1; -vector<double> align1; -align1.resize(p0.size()); -Random rnd; -for (i=0;i<p0.size();i++){ - // draw a random number - delta=rnd.RandU01(); - delta1=rnd.RandU01(); - if(delta>delta1){ - //if(delta>0.3){ - align1[i]=delta; - }else{align1[i]=0.;}; - // log->printf("ALIGN %d IS %8.3f\n",i,align1[i]); -} -assignAlign(align1); -//// get initial value of the error and derivative of it -olderr=calculate(rmsd); -log->printf("INITIAL ERROR VALUE: %e\n",olderr); -// store the matrix -Tensor old_rotmat0on1=rotmat0on1; - -//// get initial value of the error and derivative of it - -log->printf("TESTING: derrdp1 \n"); -for(unsigned j=0;j<3;j++){ - for(unsigned i=0;i<derrdp1.size();i++){ - // random displacement - delta=(rnd.RandU01()-0.5)*2*step; - p1[i][j]+=delta; - com1_is_removed=false; // this is required whenever the assignment is not done with the methods - com0_is_removed=false; // this is required whenever the assignment is not done with the methods - err=calculate(rmsd); - //log->printf("INITIAL ERROR VALUE: %e NEW ERROR %e DELTA %e ELEM %d %d \n",olderr,err,delta,i,j ); - p1[i][j]-=delta; - switch(j){ - case 0: - log->printf("TESTING: X %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f ALIGN %6.2f\n",i,derrdp1[i][j],(err-olderr)/delta,derrdp1[i][j]-(err-olderr)/delta,align[i]);break; - case 1: - log->printf("TESTING: Y %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f ALIGN %6.2f\n",i,derrdp1[i][j],(err-olderr)/delta,derrdp1[i][j]-(err-olderr)/delta,align[i]);break; - case 2: - log->printf("TESTING: Z %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f ALIGN %6.2f\n",i,derrdp1[i][j],(err-olderr)/delta,derrdp1[i][j]-(err-olderr)/delta,align[i]);break; - - } - } -} -//exit(0); -log->printf("TESTING: derrdp0 \n"); -for(unsigned j=0;j<3;j++){ - for(unsigned i=0;i<derrdp0.size();i++){ - // random displacement - delta=(rnd.RandU01()-0.5)*2*step; - p0[i][j]+=delta; - com0_is_removed=false; // this is required whenever the assignment is not done with the methods - com1_is_removed=false; // this is required whenever the assignment is not done with the methods - - err=calculate(rmsd); - p0[i][j]-=delta; - switch(j){ - case 0: - log->printf("TESTING: X %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f ALIGN %6.2f\n",i,derrdp0[i][j],(err-olderr)/delta,derrdp0[i][j]-(err-olderr)/delta,align[i]);break; - case 1: - log->printf("TESTING: Y %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f ALIGN %6.2f\n",i,derrdp0[i][j],(err-olderr)/delta,derrdp0[i][j]-(err-olderr)/delta,align[i]);break; - case 2: - log->printf("TESTING: Z %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f ALIGN %6.2f\n",i,derrdp0[i][j],(err-olderr)/delta,derrdp0[i][j]-(err-olderr)/delta,align[i]);break; - } - } -} - -log->printf("TESTING: dmatdp0 \n"); -for(l=0;l<3;l++){ - for(m=0;m<3;m++){ - for(j=0;j<3;j++){ - for(i=0;i<p0.size();i++){ - // random displacement - delta=(rnd.RandU01()-0.5)*2*step; - p0[i][j]+=delta; - com0_is_removed=false; - com1_is_removed=false; - calculate(rmsd); - p0[i][j]-=delta; - int ind=l*3*3*p0.size()+m*3*p0.size()+j*p0.size()+i; - switch(j){ - case 0: - log->printf("TESTING: DMATDP0 [ %u ][ %u ]: X %u ANAL %18.9f NUMER %18.9f DELTA %18.9f ALIGN %6.2f\n",l,m,i,dmatdp0[ind],(rotmat0on1[l][m]- old_rotmat0on1[l][m])/delta,dmatdp0[ind]-(rotmat0on1[l][m]- old_rotmat0on1[l][m])/delta,align[i]);break; - - case 1: - log->printf("TESTING: DMATDP0 [ %u ][ %u ]: Y %u ANAL %18.9f NUMER %18.9f DELTA %18.9f ALIGN %6.2f\n",l,m,i,dmatdp0[ind],(rotmat0on1[l][m]- old_rotmat0on1[l][m])/delta,dmatdp0[ind]-(rotmat0on1[l][m]- old_rotmat0on1[l][m])/delta,align[i]);break; - - case 2: - log->printf("TESTING: DMATDP0 [ %u ][ %u ]: Z %u ANAL %18.9f NUMER %18.9f DELTA %18.9f ALIGN %6.2f\n",l,m,i,dmatdp0[ind],(rotmat0on1[l][m]- old_rotmat0on1[l][m])/delta,dmatdp0[ind]-(rotmat0on1[l][m]- old_rotmat0on1[l][m])/delta,align[i]);break; - - } - } - } - } -} -log->printf("TESTING: dmatdp1 \n"); -for(l=0;l<3;l++){ - for(m=0;m<3;m++){ - for(j=0;j<3;j++){ - for(i=0;i<p1.size();i++){ - // random displacement - delta=(rnd.RandU01()-0.5)*2*step; - p1[i][j]+=delta; - com0_is_removed=false; - com1_is_removed=false; - calculate(rmsd); - p1[i][j]-=delta; - int ind=l*3*3*p1.size()+m*3*p1.size()+j*p1.size()+i; - switch(j){ - - case 0: - log->printf("TESTING: DMATDP1 [ %u ][ %u ]: X %u ANAL %18.9f NUMER %18.9f DELTA %18.9f ALIGN %6.2f\n",l,m,i,dmatdp1[ind],(rotmat0on1[l][m]- old_rotmat0on1[l][m])/delta,dmatdp1[ind]-(rotmat0on1[l][m]- old_rotmat0on1[l][m])/delta,align[i]);break; - - case 1: - log->printf("TESTING: DMATDP1 [ %u ][ %u ]: Y %u ANAL %18.9f NUMER %18.9f DELTA %18.9f ALIGN %6.2f\n",l,m,i,dmatdp1[ind],(rotmat0on1[l][m]- old_rotmat0on1[l][m])/delta,dmatdp1[ind]-(rotmat0on1[l][m]- old_rotmat0on1[l][m])/delta,align[i]);break; - - case 2: - log->printf("TESTING: DMATDP1 [ %u ][ %u ]: Z %u ANAL %18.9f NUMER %18.9f DELTA %18.9f ALIGN %6.2f\n",l,m,i,dmatdp1[ind],(rotmat0on1[l][m]- old_rotmat0on1[l][m])/delta,dmatdp1[ind]-(rotmat0on1[l][m]- old_rotmat0on1[l][m])/delta,align[i]);break; - - } - } - } - } -} - - exit(0); -} -} diff --git a/src/tools/Kearsley.h b/src/tools/Kearsley.h deleted file mode 100644 index 1a3de1f1d827ecdcc9b555c9e38994f78ba9c1f0..0000000000000000000000000000000000000000 --- a/src/tools/Kearsley.h +++ /dev/null @@ -1,239 +0,0 @@ -/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - Copyright (c) 2011-2016 The plumed team - (see the PEOPLE file at the root of the distribution for a list of names) - - See http://www.plumed.org for more information. - - This file is part of plumed, version 2. - - plumed is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - plumed 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with plumed. If not, see <http://www.gnu.org/licenses/>. -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -#ifndef __PLUMED_tools_Kearsley_h -#define __PLUMED_tools_Kearsley_h - -#include "Vector.h" -#include "Tensor.h" -#include <vector> - -namespace PLMD{ - -class Log; - -/*! A class that implements Kearsley's calculation - which is optimal alignment via quaternion and - analytical derivatives via perturbation theory - -In Kearsley algorithm (see, S. K. Kearsley, Acta Crystallogr., Sect. A: Found. Crystallogr. 45, 208 1989 ), -here adapted to included the COM reset, -one first calculates the COM reset position respect to frame \f$ \{x_0,y_0,z_0\} \f$ (running frame), -being \f$ w_{tot}^{al}=\sum_i w_{al}^i \f$ - -\f{eqnarray} -\tilde x_0^i=x_0^i-\sum_i \frac{w_{al}^i}{w_{tot}^{al}} x_0^i\\ -\tilde y_0^i=y_0^i-\sum_i \frac{w_{al}^i}{w_{tot}^{al}} y_0^i\\ -\tilde z_0^i=z_0^i-\sum_i \frac{w_{al}^i}{w_{tot}^{al}} z_0^i -\f} - -and the same is done with the reference one \f$ \{x_1,y_1,z_1\} \f$ -\f{eqnarray} -\tilde x_1^i=x_1^i-\sum_i \frac{w_{al}^i}{w_{tot}^{al}} x_1^i\\ -\tilde y_1^i=y_1^i-\sum_i \frac{w_{al}^i}{w_{tot}^{al}} y_1^i\\ -\tilde z_1^i=z_1^i-\sum_i \frac{w_{al}^i}{w_{tot}^{al}} z_1^i -\f} - -Then one can build the \f$ \{x_p,y_p,z_p\} \f$ and \f$ \{x_m,y_m,z_m\} \f$ -vectors of weighted summation and differences: -\f{eqnarray} -x_m^i=w_{al}^i(\tilde x_0^i-\tilde x_1^i)\\ -y_m^i=w_{al}^i(\tilde y_0^i-\tilde y_1^i)\\ -z_m^i=w_{al}^i(\tilde z_0^i-\tilde z_1^i) -\f} - -\f{eqnarray} -x_p^i=w_{al}^i(x_0^i+x_1^i)\\ -y_p^i=w_{al}^i(y_0^i+y_1^i)\\ -z_p^i=w_{al}^i(z_0^i+z_1^i) -\f} - - -Then one build the COM-resetted matrix - -\f{displaymath} -\mathbf{M}=\left[ -\begin{array}{cccc} -\sum ( {x}_{m}^{2}+{y}_{m}^{2}+{z}_{m}^{2}) & - \sum (y_{p}z_{m} -y_{m}z_{p}) & - \sum ( x_{m}z_{p} -x_{p}z_{m}) & - \sum (x_{p}y_{m}-x_{m}y_{p} ) \\ - \sum ( y_{p}z_{m} -y_{m}z_{p}) & -\sum ( {x}_{m}^{2}+{y}_{p}^{2}+{z}_{p}^{2}) & -\sum ( x_{m}y_{m} -x_{p}y_{p} ) & - \sum (x_{m}z_{m}-x_{p}z_{p} ) \\ - \sum (x_m z_p - x_p z_m ) & -\sum ( x_m y_m -x_p y_p) & -\sum ( {x}_{p}^{2}+{y}_{m}^{2}+{z}_{p}^{2}) & -\sum ( y_m z_m -y_p z_p) \\ - \sum (x_p y_m -x_m y_p ) & -\sum (x_m z_m - x_p z_p ) & -\sum (y_m z_m- y_p z_p ) & -\sum ( {x}_{p}^{2}+{y}_{p}^{2}+{z}_{m}^{2}) \\ -\end{array} -\right] -\f} - -by diagonalizing one obtains the mean square deviation by using the lowest eigenvalue \f$ \lambda_0 \f$ -\f{equation} -MSD= \frac{\lambda_{0}}{w_{tot}^{al}} -\f} - -The rotation matrix is obtained from the eigenvector corresponding to \f$ \lambda_0 \f$ eigenvalue -having components \f$ q_1, q_2, q_3, q_4 \f$ - -\f{displaymath} -\mathbf{R}=\left[ -\begin{array}{ccc} -q_1 ^2 + q_2 ^2 - q_3 ^2 - q_4^2 & -2(q_2 q_3 + q_1 q_4) & -2(q_1 q_4 -q_1 q_3 )\\ -2(q_2 q_3 - q_1 q_4) & -q_1 ^2 +q_3 ^2 -q_2 ^2 -q_4^2 & -2(q_3 q_4 - q_1 q_2)\\ -2( q_2 q_4 + q_1 q_3) & -2( q_3 q_4 - q_1 q_2) & -q_1^2 +q_4 ^2 - q_2^2 - q_3 ^2 \\ -\end{array} -\right] -\f} - -by using the perturbation theory one can retrieve the various derivatives: - -In derivative calculation we exploited the classical Perturbation Theory up to the first order. -In extensive manner, we introduce a perturbation over \f$\lambda_{0}\f$ correlated with -a pertubation of the states \f$\vert q_{0}\rangle \f$ (in bra-ket notation): -\f{displaymath} -[\mathbf{M}+d\mathbf{M}][\vert q_{0}\rangle + \vert dq_{0}\rangle ]= -[\lambda_{0}+d\lambda_{0}][\vert q_{0}\rangle +\vert dq_{0}\rangle ] -\f} -Grouping the zero order we recollect the unperturbed equation(see before). -To the first order: -\f{displaymath} -d\mathbf{M}q_{0}+\mathbf{M}\vert dq_{0}\rangle =d\lambda_{0}\vert q_{0}\rangle +\lambda_{0} \vert dq_{0}\rangle -\f} -Now we express \f$dq_{0}\f$ as linear combination of the other ortogonal eigenvectors: -\f{displaymath} -\vert dq_{0}\rangle =\sum_{j\neq0}c_{j}\vert q_{j}\rangle -\f} -thus we have -\f{displaymath} -d\mathbf{M}\vert q_{0}\rangle +\sum_{j\neq0}c_{j}\mathbf{M}\vert q_{j}\rangle= -d\lambda_{0}\vert q_{0}\rangle+\lambda_{0}\sum_{j\neq0}c_{j}\vert q_{j}\rangle -\f} -projecting onto the \f$q_{0}\f$ state and deleting the projection onto \f$\vert dq_{0}\rangle\f$ beacuse -of ortogonality: -\f{displaymath} -\langle q_{0}\vert d\mathbf{M}\vert q_{0}\rangle +\sum_{j\neq0}c_{j}\lambda_{j}\langle q_{0} \vert q_{j}\rangle= -d\lambda_{0}\langle q_{0}\vert q_{0}\rangle+\lambda_{0}\sum_{j\neq0}c_{j}\langle q_{0}\vert q_{j}\rangle -\f} -we get -\f{displaymath} -\langle q_{0}\vert d\mathbf{M}\vert q_{0}\rangle=d\lambda_{0} -\f} -So, using simple chain rules: -\f{displaymath} -\langle q_{0}\vert \frac{d\mathbf{M}}{dr_{k}^{\gamma}}\vert q_{0}\rangle -dr_{k}^{\gamma}=d\lambda_{0} -\f} -where here we used the notation \f$r_{k}^{\gamma}\f$ to denote an arbitrary position which can be -\f$\tilde x_0 ,\tilde y_0,\tilde z_0\f$ or \f$\tilde x_1 ,\tilde y_1,\tilde z_1\f$ -we get -\f{displaymath} -\langle q_{0}\vert \frac{d\mathbf{M}}{dr_{k}^{\gamma}}\vert q_{0}\rangle -=\frac{d\lambda_{0}}{dr_{k}^{\gamma}} -\f} - -The derivatives of the matrix \f$\frac{d\mathbf{M}}{dr_{k}^{\gamma}} \f$ can be readily obtained via the -chain rule -\f{displaymath} -\frac{d\mathbf{M}}{dr_{k}^{\gamma}}=\sum_{\l}^{nat}\sum_{\alpha}^{x,y,z} \frac{d\mathbf{M}}{dP_{l}^{\alpha}}\frac{dP_{l}^{\alpha}}{dr_{k}^{\gamma}} +\\ -\frac{d\mathbf{M}}{dM_{l}^{\alpha}}\frac{dM_{l}^{\alpha}}{dr_{k}^{\gamma}} -\f} - -where \f$ M_{l}^{\alpha} \f$ corresponds to \f$ x_m^{l},y_m^{l},z_m^{l} \f$ and -\f$ P_{l}^{\alpha} \f$ corresponds to \f$ x_p^{l},y_p^{l},z_p^{l} \f$ according to the \f$ \alpha \f$ component. -*/ - - -class Kearsley -{ - /// general log reference that needs to be initialized when constructed - Log* log; - /// position of atoms (first frame. In md is the running frame) - std::vector<Vector> p0; - /// position of atoms (second frame. In md is the reference frame) - std::vector<Vector> p1; - /// alignment weight: the rmsd/msd that it provides is only based on this scalar - std::vector<double> align; - - bool com0_is_removed; - bool com1_is_removed; - -public: - /// error: the distance between two frames (might be rmsd/msd. See below) - double err; - /// displacement: the vector that goes from the p0 onto p1 - std::vector<Vector> diff0on1; - /// displacement: the vector that goes from the p1 onto p0 (via inverse rotation) - std::vector<Vector> diff1on0; - - /// center of mass of p0 - Vector com0; - /// center of mass of p1 - Vector com1; - /// position resetted wrt coms p0 - std::vector<Vector> p0reset; - /// position resetted wrt coms p1 - std::vector<Vector> p1reset; - /// position rotated: p0 - std::vector<Vector> p0rotated; - /// position rotated: p1 - std::vector<Vector> p1rotated; - /// rotation matrices p0 on p1 and reverse (p1 over p0) - Tensor rotmat0on1,rotmat1on0; - /// derivatives: derivative of the error respect p0 - std::vector<Vector> derrdp0; - /// derivatives: derivative of the error respect p1 - std::vector<Vector> derrdp1; - /// derivative of the rotation matrix - /// note the dimension 3x3 x 3 x N - std::vector<double> dmatdp0; - std::vector<double> dmatdp1; - - /// constructor: need the two structure, the alignment vector and the log reference - Kearsley( const std::vector<Vector> &p0, const std::vector<Vector> &p1, const std::vector<double> &align , Log* &log); - /// switch the assignment of the structure p0 (e.g. at each md step) - void assignP0(const std::vector<Vector> & p0); - /// derivatives: derivative of the error respect p1 - void assignP1(const std::vector<Vector> & p1); - /// transfer the alignment vector - void assignAlign(const std::vector<double> & align); - /// finite differences of all the relevant quantities: takes a bool which decides if giving back rmsd or not (msd in this case) - void finiteDifferenceInterface(bool rmsd); - // this makes the real calculation: the rmsd bool decides wether doing rmsd or msd - double calculate( bool rmsd ); -}; - -} - -#endif - diff --git a/src/tools/OptimalAlignment.cpp b/src/tools/OptimalAlignment.cpp deleted file mode 100644 index eae4aabf63060fe96af7366c633a63c20c12594d..0000000000000000000000000000000000000000 --- a/src/tools/OptimalAlignment.cpp +++ /dev/null @@ -1,399 +0,0 @@ -/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - Copyright (c) 2011-2016 The plumed team - (see the PEOPLE file at the root of the distribution for a list of names) - - See http://www.plumed.org for more information. - - This file is part of plumed, version 2. - - plumed is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - plumed 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with plumed. If not, see <http://www.gnu.org/licenses/>. -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -#include "OptimalAlignment.h" -#include "Kearsley.h" -#include "Log.h" -#include <cmath> -#include <iostream> -#include <cstdlib> -#include "Random.h" - -using namespace std; -namespace PLMD{ - -OptimalAlignment::OptimalAlignment( const std::vector<double> & align, const std::vector<double> & displace, const std::vector<Vector> & p0, const std::vector<Vector> & p1 , Log* &log ) -:log(log){ - - // kearsley init to null - mykearsley=NULL; - if (mykearsley==NULL) { - mykearsley=new Kearsley(p0,p1,align,log); - } - // copy the structure into place - assignP0(p0); - assignP1(p1); - assignAlign(align); - assignDisplace(displace); - - // basic check - if(p0.size() != p1.size()){ - (this->log)->printf("THE SIZE OF THE TWO FRAMES TO BE ALIGNED ARE DIFFERENT\n"); - } - // fast behaviour: if all the alignment and displacement are 1.0 then go for fast - fast=true; - for (unsigned i=0;i<align.size();i++ ){ - if(align[i]!=displace[i] || align[i]!=1.0)fast=false; - } - -} - -OptimalAlignment::~OptimalAlignment(){ - if (mykearsley!=NULL)delete mykearsley; -} - -void OptimalAlignment::assignP0( const std::vector<Vector> & p0 ){ - this->p0=p0; - if(mykearsley!=NULL){mykearsley->assignP0(p0);}else{cerr<<"kearsley is not initialized"<<endl; exit(0);} -} - -void OptimalAlignment::assignP1( const std::vector<Vector> & p1 ){ - this->p1=p1; - if(mykearsley!=NULL){mykearsley->assignP1(p1);}else{cerr<<"kearsley is not initialized"<<endl; exit(0);} -} - -void OptimalAlignment::assignAlign( const std::vector<double> & align ){ - this->align=align; - if(mykearsley!=NULL){mykearsley->assignAlign(align);}else{cerr<<"kearsley is not initialized"<<endl; exit(0);} -} - -void OptimalAlignment::assignDisplace( const std::vector<double> & displace ){ - this->displace=displace; -} - - -double OptimalAlignment::calculate(bool squared, std::vector<Vector> & derivatives){ - - bool rmsd=!squared ; - - double err; - - // at this point everything should be already in place for calculating the alignment (p1,p2,align) - // here everything is done with kearsley algorithm. Extension to other optimal alignment algos is - // possible here below with a switch - - err=mykearsley->calculate(rmsd); // this calculates the MSD: transform into RMSD - - // check findiff alignment - //mykearsley->finiteDifferenceInterface(rmsd); - - if(fast){ - //log->printf("Doing fast: ERR %12.6f \n",err); - derrdp0=mykearsley->derrdp0; - derrdp1=mykearsley->derrdp1; - derivatives=derrdp0; - }else{ - /// TODO this interface really sucks since is strongly asymmetric should be re-engineered. - err=weightedAlignment(rmsd); - //log->printf("Doing slow: ERR %12.6f \n",err); - derivatives=derrdp0; - } - // destroy the kearsley object? - - return err; -} - -#ifdef __INTEL_COMPILER -#pragma intel optimization_level 2 -#endif -/// this does the weighed alignment if the vector of alignment is different from displacement -double OptimalAlignment::weightedAlignment( bool rmsd){ - double tmp0,tmp1,walign,wdisplace,const1,ret; - unsigned i,k,l,m,n,o,oo,mm; - - unsigned natoms=p0.size(); - - Kearsley *myk=mykearsley; /// just a shortcut - - /// TODO : these two blocks can be calculated once forever after the initialization (exception for certain methods?) - - /// clear derivatives - if (derrdp0.size()!=natoms)derrdp0.resize(natoms); - if (derrdp1.size()!=natoms)derrdp1.resize(natoms); - - // clear the container - for(i=0;i<natoms;i++){ - derrdp0[i][0]=derrdp0[i][1]=derrdp0[i][2]=0.; - derrdp1[i][0]=derrdp1[i][1]=derrdp1[i][2]=0.; - } - - walign=0.; - vector<int> alignmap; - for(i=0;i<natoms;i++){ - if (align[i]>0.){ - alignmap.push_back(i); - walign+=align[i]; - } - if (align[i]<0.){cerr<<"FOUND ALIGNMENT WEIGHT NEGATIVE!"<<endl;exit(0);}; - } - - wdisplace=0.; - vector<int> displacemap; - for(i=0;i<natoms;i++){ - if (displace[i]>0.){ - displacemap.push_back(i); - wdisplace+=displace[i]; - } - if (displace[i]<0.){cerr<<"FOUND ALIGNMENT WEIGHT NEGATIVE!"<<endl;exit(0);}; - } - - - tmp0=0.; - - vector<Vector> array_n_3; - array_n_3.resize(natoms); - for(i=0;i<array_n_3.size();i++)array_n_3[i][0]=array_n_3[i][1]=array_n_3[i][2]=0.; - - // err= (1/totdisplace) sum_k_l displace_k*((p0reset_k_l- sum_k_m rot_l_m*p1reset_k_m )**2) - - //for(kk=0;kk<displacemap.size();kk++){ - // k=displacemap[kk]; - for(k=0;k<natoms;k++){ - - for(l=0;l<3;l++){ - - tmp1=0.; - // contribution from rotated reference frame // - for(m=0;m<3;m++){ - tmp1-=myk->rotmat0on1[l][m]*myk->p1reset[k][m]; - } - - // contribution from running centered frame // - tmp1+= myk->p0reset[k][l]; - - array_n_3[k][l]=tmp1; // store coefficents for derivative usage// - tmp0+=tmp1*tmp1*displace[k]; //squared distance added// - } - - } - - tmp0=tmp0/wdisplace; - - // log->printf(" ERRR NEW %f \n",tmp0); - - ret=tmp0; - - /* DERIVATIVE CALCULATION:respect to running frame */ - for(k=0;k<natoms;k++){ - for(l=0;l<3;l++){ - - tmp1 =2.*array_n_3[k][l]*displace[k]/wdisplace ; //ok - - const1=2.*align[k]/(walign*wdisplace); - - if(const1>0.){ - for(oo=0;oo<displacemap.size();oo++){ - o=displacemap[oo]; - tmp1 -=const1*array_n_3[o][l]*displace[o]; //ok - } - } - - for(mm=0;mm<displacemap.size();mm++){ - m=displacemap[mm]; - const1=2.* displace[m]/wdisplace ; - for(n=0;n<3;n++){ - tmp0=0.; - for(o=0;o<3;o++){ - int ind=n*3*3*natoms+o*3*natoms+l*natoms+k; //ok - tmp0+=myk->dmatdp0[ind]*myk->p1reset[m][o]; - } - tmp0*=-const1*array_n_3[m][n]; - - tmp1+=tmp0; - } - } - - derrdp0[k][l]=tmp1; - - } - } - //exit(0); - - //return ret; - bool do_frameref_der=true; - - // derivatives of - // err= (1/totdisplace) sum_k_l displace_k*((p0reset_k_l- sum_m rot_l_m*p1reset_k_m )**2) - // respect p1: - // derr_dp1=(1/totdisplace) sum_k_l 2*displace_k*(p0reset_k_l- sum_m rot_l_m*p1reset_k_m ) - // *d/dp1 ( p0reset_k_l- sum_m rot_l_m*p1reset_k_m) - // = - // (1/totdisplace) sum_k_l 2*displace_k*(p0reset_k_l- sum_m rot_l_m*p1reset_k_m )* - // *(d/dp1 p0reset_k_l - // - sum_m (d/dp1 rot_l_m)*p1reset_k_m - // - sum_m rot_l_m*(d/dp1 p1reset_k_m ) ) - // = - // sum_k_l 2*displace_k/totdisplace* array_n_3_k_l - // *(- sum_m (d/dp1 rot_l_m)*p1reset_k_m - // - sum_m rot_l_m*(d/dp1 p1reset_k_m ) ) - - if(do_frameref_der){ - for(k=0;k<natoms;k++){ -// for(kk=0;kk<displacemap.size();kk++){ -// k=displacemap[kk]; - - for(l=0;l<3;l++){ - - tmp1=0.; - for(mm=0;mm<displacemap.size();mm++){ - m=displacemap[mm]; - const1=2.* displace[m]/wdisplace ; - for(n=0;n<3;n++){ - tmp0=0.; - for(o=0;o<3;o++){ - int ind=n*3*3*natoms+o*3*natoms+l*natoms+k; - tmp0+=myk->dmatdp1[ind]*myk->p1reset[m][o]; - } - tmp0*=-const1*array_n_3[m][n]; - tmp1+= tmp0; - } - - } - - tmp0=0.; - for(o=0;o<3;o++){ - tmp0+=array_n_3[k][o]*myk->rotmat0on1[o][l]; - } - tmp1+=-tmp0*2.*displace[k]/wdisplace; - - tmp0=0.; - - for(mm=0;mm<displacemap.size();mm++){ - m=displacemap[mm]; - for(o=0;o<3;o++){ - tmp0+=array_n_3[m][o]*myk->rotmat0on1[o][l]*displace[m]; - } - } - tmp1 += tmp0*2.*align[k]/(walign*wdisplace); - - derrdp1[k][l]=tmp1; - - } - } - } - - /// probably not really the way it should be - if (rmsd){ - ret=sqrt(ret); - double tmp=0.5/ret; - for(unsigned i=0;i<natoms;i++){ - derrdp0[i][0]=derrdp0[i][0]*tmp; - derrdp0[i][1]=derrdp0[i][1]*tmp; - derrdp0[i][2]=derrdp0[i][2]*tmp; - derrdp1[i][0]=derrdp1[i][0]*tmp; - derrdp1[i][1]=derrdp1[i][1]*tmp; - derrdp1[i][2]=derrdp1[i][2]*tmp; - - } - } - - return ret; -} - -double OptimalAlignment::weightedFindiffTest( bool rmsd){ - - Random rnd; - - log->printf("Entering rmsd finite difference test system\n "); - log->printf("RMSD OR MSD: %s\n",(rmsd)?"rmsd":"msd"); - log->printf("-------------------------------------------\n"); - log->printf("TEST1: derivative of the value (derr_dr0/derr_dr1)\n"); - //// test 1 - double step=1.e-8,olderr,delta,err; - vector<Vector> fakederivatives; - fakederivatives.resize(p0.size()); - fast=false; - // randomizing alignments and displacements -/* for (i=0;i<p0.size();i++){ - // draw a random number - delta=drand48(); - delta1=drand48(); - if(delta>delta1){ - align[i]=delta; - }else{align[i]=0.;}; - delta=drand48(); - delta1=drand48(); - if(delta>delta1){ - displace[i]=delta; - }else{displace[i]=0.;} - }*/ - //// get initial value of the error and derivative of it - assignAlign(align); - assignDisplace(displace); - olderr=calculate(rmsd, fakederivatives); - - log->printf("INITIAL ERROR VALUE: %e\n",olderr); - - // randomizing alignments and displacements - log->printf("TESTING: derrdp0 \n"); - - for(unsigned j=0;j<3;j++){ - for(unsigned i=0;i<derrdp0.size();i++){ - // random displacement - delta=(rnd.RandU01()-0.5)*2*step; - p0[i][j]+=delta; - assignP0( p0 ); - err=calculate(rmsd, fakederivatives); - p0[i][j]-=delta; - assignP0( p0 ); - switch(j){ - case 0: - log->printf("TESTING: X %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f DISP %6.2f ALIGN %6.2f \n",i,derrdp0[i][j],(err-olderr)/delta,derrdp0[i][j]-(err-olderr)/delta,displace[i],align[i]);break; - case 1: - log->printf("TESTING: Y %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f DISP %6.2f ALIGN %6.2f \n",i,derrdp0[i][j],(err-olderr)/delta,derrdp0[i][j]-(err-olderr)/delta,displace[i],align[i]);break; - case 2: - log->printf("TESTING: Z %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f DISP %6.2f ALIGN %6.2f \n",i,derrdp0[i][j],(err-olderr)/delta,derrdp0[i][j]-(err-olderr)/delta,displace[i],align[i]);break; - - } - } - } - - log->printf("TESTING: derrdp1 \n"); - for(unsigned j=0;j<3;j++){ - for(unsigned i=0;i<derrdp1.size();i++){ - // random displacement - delta=(rnd.RandU01()-0.5)*2*step; - p1[i][j]+=delta; - assignP1( p1 ); - err=calculate(rmsd, fakederivatives); - p1[i][j]-=delta; - assignP1( p1 ); - switch(j){ - case 0: - log->printf("TESTING: X %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f DISP %6.2f ALIGN %6.2f \n",i,derrdp1[i][j],(err-olderr)/delta,derrdp1[i][j]-(err-olderr)/delta,displace[i],align[i]);break; - case 1: - log->printf("TESTING: Y %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f DISP %6.2f ALIGN %6.2f \n",i,derrdp1[i][j],(err-olderr)/delta,derrdp1[i][j]-(err-olderr)/delta,displace[i],align[i]);break; - case 2: - log->printf("TESTING: Z %4u ANAL %18.9f NUMER %18.9f DELTA %18.9f DISP %6.2f ALIGN %6.2f \n",i,derrdp1[i][j],(err-olderr)/delta,derrdp1[i][j]-(err-olderr)/delta,displace[i],align[i]);break; - - } - } - } - exit(0); - -// This is to avoid warnings: - return 0.0; - -} - - - -} diff --git a/src/tools/OptimalAlignment.h b/src/tools/OptimalAlignment.h deleted file mode 100644 index 2718d2e8a2b3ba3f8431c893de4c47e1de8849ea..0000000000000000000000000000000000000000 --- a/src/tools/OptimalAlignment.h +++ /dev/null @@ -1,82 +0,0 @@ -/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - Copyright (c) 2011-2016 The plumed team - (see the PEOPLE file at the root of the distribution for a list of names) - - See http://www.plumed.org for more information. - - This file is part of plumed, version 2. - - plumed is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - plumed 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with plumed. If not, see <http://www.gnu.org/licenses/>. -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -#ifndef __PLUMED_tools_OptimalAlignment_h -#define __PLUMED_tools_OptimalAlignment_h - -#include "Vector.h" -#include "Tensor.h" -#include <vector> - -namespace PLMD{ - -class Log; -class Kearsley; - -/// A class that is intended to include or combine various optimal alignment algorithms - -class OptimalAlignment -{ -private: - /// a pointer to the object that performs the optimal alignment via quaternions - Kearsley *mykearsley; - /// displacement vector : a double that says if the coordinate should be used in calculating the RMSD/MSD - std::vector<double> displace; - /// alignment vector: a double that says if the atom has to be used in reset COM and makeing the alignment - std::vector<double> align; - /// position of one frame (generally the MD) - std::vector<Vector> p0; - /// position of the reference frames - std::vector<Vector> p1; - /// derivatives of the error respect to the p0 (MD running frame) - std::vector<Vector> derrdp0; - /// derivatives of the error respect to the p1 (static frame, do not remove: useful for SM) - std::vector<Vector> derrdp1; - /// the pointer to the logfile - Log* log; - /// a bool that decides to make the fast version (alignment vec= displacement vec) or the slower case - bool fast; - -public: - /// the contructor - OptimalAlignment( const std::vector<double> & align, const std::vector<double> & displace, const std::vector<Vector> & p0, const std::vector<Vector> & p1 , Log* &log ); - /// the destructor: delete kearsley - ~OptimalAlignment(); - /// assignment of the running frame p0 - void assignP0( const std::vector<Vector> & p0 ); - /// assignment to the reference frame p1 - void assignP1( const std::vector<Vector> & p1 ); - // this updates align runtime - void assignAlign( const std::vector<double> & align ); - // this updates displace runtime - void assignDisplace( const std::vector<double> & displace ); - /// this does the real calculation - double calculate( bool rmsd, std::vector<Vector> & derivatives); - /// this should perform the weighted alignment - double weightedAlignment( bool rmsd); - // a finite difference test - double weightedFindiffTest( bool rmsd); -}; - -} - -#endif - diff --git a/src/wrapper/Plumed.h b/src/wrapper/Plumed.h index aa3177744eeba57d3def0a883e6d92aa043a715a..60caea6e9819a3d7adc5abb0aea39473723df8bd 100644 --- a/src/wrapper/Plumed.h +++ b/src/wrapper/Plumed.h @@ -58,6 +58,8 @@ In the C and FORTRAN interfaces, all the routines are named plumed_*, to avoid potential name clashes. Notice that the entire plumed library is implemented in C++, and it is hidden inside the PLMD namespace. + If the used C++ compiler supports C++11, PLMD::Plumed object defines move semantics + so as to be usable in STL containers. That is, you can declare a std::vector<PLMD::Plumed>. Handlers to the plumed object can be converted among different representations, to allow inter-operability among languages. In C, there are tools to convert @@ -433,6 +435,25 @@ private: */ Plumed&operator=(const Plumed&); public: +/* + PLUMED 2.4 requires a C++11 compiler. + Anyway, since Plumed.h file might be redistributed with other codes + and it should be possible to combine it with earlier PLUMED versions, + we here explicitly check if C+11 is available before enabling move semantics. + This could still create problems if a compiler 'cheats', setting __cplusplus > 199711L + but not supporting move semantics. Hopefully will not happen! +*/ +#if __cplusplus > 199711L +/** Move constructor. + Only if move semantics is enabled. + It allows storing PLMD::Plumed objects in STL containers. +*/ + Plumed(Plumed&&); +/** Move assignment. + Only if move semantics is enabled. +*/ + Plumed& operator=(Plumed&&); +#endif /** Retrieve the C plumed structure for this object */ @@ -488,6 +509,21 @@ Plumed::Plumed(plumed p): reference(true) {} +#if __cplusplus > 199711L +inline +Plumed::Plumed(Plumed&& p): + main(p.main), + reference(p.reference) +{} + +inline +Plumed& Plumed::operator=(Plumed&& p){ + main=p.main; + reference=p.reference; + return *this; +} +#endif + inline Plumed::operator plumed()const{ return main;