diff --git a/.gitignore b/.gitignore
index 91aa94e85..7df232a6f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,197 @@
+### C++ ###
+# Prerequisites
+*.d
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+*.smod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
+
+### Linux ###
+*~
+
+# temporary files which can be created if a process still has a handle open of a deleted file
+.fuse_hidden*
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+# .nfs files are created when an open file is removed but is still being accessed
+.nfs*
+
+### macOS ###
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### PyCharm ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### PyCharm Patch ###
+# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
+
+# *.iml
+# modules.xml
+# .idea/misc.xml
+# *.ipr
+
+# Sonarlint plugin
+# https://plugins.jetbrains.com/plugin/7973-sonarlint
+.idea/**/sonarlint/
+
+# SonarQube Plugin
+# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
+.idea/**/sonarIssues.xml
+
+# Markdown Navigator plugin
+# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
+.idea/**/markdown-navigator.xml
+.idea/**/markdown-navigator-enh.xml
+.idea/**/markdown-navigator/
+
+# Cache file creation bug
+# See https://youtrack.jetbrains.com/issue/JBR-2257
+.idea/$CACHE_FILE$
+
+# CodeStream plugin
+# https://plugins.jetbrains.com/plugin/12206-codestream
+.idea/codestream.xml
+
+### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
-*.so
# Distribution / packaging
.Python
@@ -20,7 +207,6 @@ parts/
sdist/
var/
wheels/
-pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
@@ -50,6 +236,7 @@ coverage.xml
*.py,cover
.hypothesis/
.pytest_cache/
+cover/
# Translations
*.mo
@@ -72,6 +259,7 @@ instance/
docs/_build/
# PyBuilder
+.pybuilder/
target/
# Jupyter Notebook
@@ -82,7 +270,9 @@ profile_default/
ipython_config.py
# pyenv
-.python-version
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
@@ -91,6 +281,13 @@ ipython_config.py
# install all needed dependencies.
#Pipfile.lock
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
@@ -128,5 +325,447 @@ dmypy.json
# Pyre type checker
.pyre/
-# gitkeep
-.gitkeep
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+# JetBrains specific template is maintainted in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+!.vscode/*.code-snippets
+
+# Local History for Visual Studio Code
+.history/
+
+# Built Visual Studio Code Extensions
+*.vsix
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
+.ionide
+
+# Support for Project snippet scope
+
+### Windows ###
+# Windows thumbnail cache files
+Thumbs.db
+Thumbs.db:encryptable
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+### VisualStudio ###
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.iobj
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.tlog
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*.json
+coverage*.xml
+coverage*.info
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio 6 auto-generated project file (contains which files were open etc.)
+*.vbp
+
+# Visual Studio 6 workspace and project file (working project files containing files to include in project)
+*.dsw
+*.dsp
+
+# Visual Studio 6 technical files
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# Visual Studio History (VSHistory) files
+.vshistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd
+
+# VS Code files for those working on multiple tools
+*.code-workspace
+
+# Local History for Visual Studio Code
+
+# Windows Installer files from build outputs
+
+# JetBrains Rider
+*.sln.iml
+
+### VisualStudio Patch ###
+# Additional files built by Visual Studio
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 000000000..0a041280b
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/dmff/__init__.py b/dmff/__init__.py
index e69de29bb..19eacb97d 100644
--- a/dmff/__init__.py
+++ b/dmff/__init__.py
@@ -0,0 +1 @@
+import dmff.settings
\ No newline at end of file
diff --git a/dmff/admp/disp_pme.py b/dmff/admp/disp_pme.py
new file mode 100755
index 000000000..3df7d11d6
--- /dev/null
+++ b/dmff/admp/disp_pme.py
@@ -0,0 +1,353 @@
+import jax.numpy as jnp
+from jax import vmap, value_and_grad
+from dmff.utils import jit_condition
+from dmff.admp.spatial import pbc_shift
+from dmff.admp.pme import setup_ewald_parameters
+from dmff.admp.recip import generate_pme_recip, Ck_6, Ck_8, Ck_10
+from dmff.admp.pairwise import distribute_scalar, distribute_v3, distribute_dispcoeff
+from functools import partial
+
+class ADMPDispPmeForce:
+ '''
+ This is a convenient wrapper for dispersion PME calculations
+ It wrapps all the environment parameters of multipolar PME calculation
+ The so called "environment paramters" means parameters that do not need to be differentiable
+ '''
+
+ def __init__(self, box, covalent_map, rc, ethresh, pmax):
+ self.covalent_map = covalent_map
+ self.rc = rc
+ self.ethresh = ethresh
+ self.pmax = pmax
+ # Need a different function for dispersion ??? Need tests
+ kappa, K1, K2, K3 = setup_ewald_parameters(rc, ethresh, box)
+ self.kappa = kappa
+ self.K1 = K1
+ self.K2 = K2
+ self.K3 = K3
+ self.pme_order = 6
+ # setup calculators
+ self.refresh_calculators()
+ return
+
+
+ def generate_get_energy(self):
+ def get_energy(positions, box, pairs, c_list, mScales):
+ return energy_disp_pme(positions, box, pairs,
+ c_list, mScales, self.covalent_map,
+ self.kappa, self.K1, self.K2, self.K3, self.pmax,
+ self.d6_recip, self.d8_recip, self.d10_recip)
+ return get_energy
+
+
+ def update_env(self, attr, val):
+ '''
+ Update the environment of the calculator
+ '''
+ setattr(self, attr, val)
+ self.refresh_calculators()
+
+
+ def refresh_calculators(self):
+ '''
+ refresh the energy and force calculator according to the current environment
+ '''
+ self.d6_recip = generate_pme_recip(Ck_6, self.kappa, True, self.pme_order, self.K1, self.K2, self.K3, 0)
+ if self.pmax >= 8:
+ self.d8_recip = generate_pme_recip(Ck_8, self.kappa, True, self.pme_order, self.K1, self.K2, self.K3, 0)
+ else:
+ self.d8_recip = None
+ if self.pmax >= 10:
+ self.d10_recip = generate_pme_recip(Ck_10, self.kappa, True, self.pme_order, self.K1, self.K2, self.K3, 0)
+ else:
+ self.d10_recip = None
+ # create the energy calculator according to PME environment
+ self.get_energy = self.generate_get_energy()
+ self.get_forces = value_and_grad(self.get_energy)
+ return
+
+
+def energy_disp_pme(positions, box, pairs,
+ c_list, mScales, covalent_map,
+ kappa, K1, K2, K3, pmax,
+ recip_fn6, recip_fn8, recip_fn10):
+ '''
+ Top level wrapper for dispersion pme
+
+ Input:
+ positions:
+ Na * 3: positions
+ box:
+ 3 * 3: box, axes arranged in row
+ pairs:
+ Np * 2: interacting pair indices
+ c_list:
+ Na * (pmax-4)/2: atomic dispersion coefficients
+ mScales:
+ (Nexcl,): permanent multipole-multipole interaction exclusion scalings: 1-2, 1-3 ...
+ covalent_map:
+ Na * Na: topological distances between atoms, if i, j are topologically distant, then covalent_map[i, j] == 0
+ disp_pme_recip_fn:
+ function: the reciprocal calculator, see recip.py
+ kappa:
+ float: kappa in A^-1
+ K1, K2, K3:
+ int: max K for reciprocal calculations
+ pmax:
+ int array: maximal exponents (p) to compute, e.g., (6, 8, 10)
+
+ Output:
+ energy: total dispersion pme energy
+ '''
+
+ ene_real = disp_pme_real(positions, box, pairs, c_list, mScales, covalent_map, kappa, pmax)
+
+ ene_recip = recip_fn6(positions, box, c_list[:, 0, jnp.newaxis])
+ if pmax >= 8:
+ ene_recip += recip_fn8(positions, box, c_list[:, 1, jnp.newaxis])
+ if pmax >= 10:
+ ene_recip += recip_fn10(positions, box, c_list[:, 2, jnp.newaxis])
+
+ ene_self = disp_pme_self(c_list, kappa, pmax)
+
+ return ene_real + ene_recip + ene_self
+
+
+def disp_pme_real(positions, box, pairs,
+ c_list,
+ mScales, covalent_map,
+ kappa, pmax):
+ '''
+ This function calculates the dispersion real space energy
+ It expands the atomic parameters to pairwise parameters
+
+ Input:
+ positions:
+ Na * 3: positions
+ box:
+ 3 * 3: box, axes arranged in row
+ pairs:
+ Np * 2: interacting pair indices
+ c_list:
+ Na * (pmax-4)/2: atomic dispersion coefficients
+ mScales:
+ (Nexcl,): permanent multipole-multipole interaction exclusion scalings: 1-2, 1-3 ...
+ covalent_map:
+ Na * Na: topological distances between atoms, if i, j are topologically distant, then covalent_map[i, j] == 0
+ kappa:
+ float: kappa in A^-1
+ pmax:
+ int array: maximal exponents (p) to compute, e.g., (6, 8, 10)
+
+ Output:
+ ene: dispersion pme realspace energy
+ '''
+
+ # expand pairwise parameters
+ pairs = pairs[pairs[:, 0] < pairs[:, 1]]
+
+ box_inv = jnp.linalg.inv(box)
+
+ ri = distribute_v3(positions, pairs[:, 0])
+ rj = distribute_v3(positions, pairs[:, 1])
+ # ri = positions[pairs[:, 0]]
+ # rj = positions[pairs[:, 1]]
+ nbonds = covalent_map[pairs[:, 0], pairs[:, 1]]
+ mscales = distribute_scalar(mScales, nbonds-1)
+ # mscales = mScales[nbonds-1]
+
+ ci = distribute_dispcoeff(c_list, pairs[:, 0])
+ cj = distribute_dispcoeff(c_list, pairs[:, 1])
+ # ci = c_list[pairs[:, 0], :]
+ # cj = c_list[pairs[:, 1], :]
+
+ ene_real = jnp.sum(disp_pme_real_kernel(ri, rj, ci, cj, box, box_inv, mscales, kappa, pmax))
+
+ return jnp.sum(ene_real)
+
+
+@partial(vmap, in_axes=(0, 0, 0, 0, None, None, 0, None, None), out_axes=(0))
+@jit_condition(static_argnums=(8))
+def disp_pme_real_kernel(ri, rj, ci, cj, box, box_inv, mscales, kappa, pmax):
+ '''
+ The kernel to calculate the realspace dispersion energy
+
+ Inputs:
+ ri:
+ Np * 3: position i
+ rj:
+ Np * 3: position j
+ ci:
+ Np * (pmax-4)/2: dispersion coeffs of i, c6, c8, c10 etc
+ cj:
+ Np * (pmax-4)/2: dispersion coeffs of j, c6, c8, c10 etc
+ kappa:
+ float: kappa
+ pmax:
+ int: largest p in 1/r^p, assume starting from 6 with increment of 2
+
+ Output:
+ energy:
+ float: the dispersion pme energy
+ '''
+ dr = ri - rj
+ dr = pbc_shift(dr, box, box_inv)
+ dr2 = jnp.dot(dr, dr)
+ x2 = kappa * kappa * dr2
+ g = g_p(x2, pmax)
+ dr6 = dr2 * dr2 * dr2
+ ene = (mscales + g[0] - 1) * ci[0] * cj[0] / dr6
+ if pmax >= 8:
+ dr8 = dr6 * dr2
+ ene += (mscales + g[1] - 1) * ci[1] * cj[1] / dr8
+ if pmax >= 10:
+ dr10 = dr8 * dr2
+ ene += (mscales + g[2] - 1) * ci[2] * cj[2] / dr10
+ return ene
+
+
+def g_p(x2, pmax):
+ '''
+ Compute the g(x, p) function
+
+ Inputs:
+ x:
+ float: the input variable
+ pmax:
+ int: the maximal powers of dispersion, here we assume evenly spacing even powers starting from 6
+ e.g., (6,), (6, 8) or (6, 8, 10)
+
+ Outputs:
+ g:
+ (p-4)//2: g(x, p)
+ '''
+
+ x4 = x2 * x2
+ x8 = x4 * x4
+ exp_x2 = jnp.exp(-x2)
+ g6 = 1 + x2 + 0.5*x4
+ if pmax >= 8:
+ g8 = g6 + x4*x2/6
+ if pmax >= 10:
+ g10 = g8 + x8/24
+
+ if pmax == 6:
+ g = jnp.array([g6])
+ elif pmax == 8:
+ g = jnp.array([g6, g8])
+ elif pmax == 10:
+ g = jnp.array([g6, g8, g10])
+
+ return g * exp_x2
+
+
+@jit_condition(static_argnums=(2))
+def disp_pme_self(c_list, kappa, pmax):
+ '''
+ This function calculates the dispersion self energy
+
+ Inputs:
+ c_list:
+ Na * 3: dispersion susceptibilities C_6, C_8, C_10
+ kappa:
+ float: kappa used in dispersion
+
+ Output:
+ ene_self:
+ float: the self energy
+ '''
+ E_6 = -kappa**6/12 * jnp.sum(c_list[:, 0]**2)
+ if pmax >= 8:
+ E_8 = -kappa**8/48 * jnp.sum(c_list[:, 1]**2)
+ if pmax >= 10:
+ E_10 = -kappa**10/240 * jnp.sum(c_list[:, 2]**2)
+ E = E_6
+ if pmax >= 8:
+ E += E_8
+ if pmax >= 10:
+ E += E_10
+ return E
+
+
+# def validation(pdb):
+# xml = 'mpidwater.xml'
+# pdbinfo = read_pdb(pdb)
+# serials = pdbinfo['serials']
+# names = pdbinfo['names']
+# resNames = pdbinfo['resNames']
+# resSeqs = pdbinfo['resSeqs']
+# positions = pdbinfo['positions']
+# box = pdbinfo['box'] # a, b, c, α, β, γ
+# charges = pdbinfo['charges']
+# positions = jnp.asarray(positions)
+# lx, ly, lz, _, _, _ = box
+# box = jnp.eye(3)*jnp.array([lx, ly, lz])
+
+# mScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+# pScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+# dScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+
+# rc = 4 # in Angstrom
+# ethresh = 1e-4
+
+# n_atoms = len(serials)
+
+# atomTemplate, residueTemplate = read_xml(xml)
+# atomDicts, residueDicts = init_residues(serials, names, resNames, resSeqs, positions, charges, atomTemplate, residueTemplate)
+
+# covalent_map = assemble_covalent(residueDicts, n_atoms)
+# displacement_fn, shift_fn = space.periodic_general(box, fractional_coordinates=False)
+# neighbor_list_fn = partition.neighbor_list(displacement_fn, box, rc, 0, format=partition.OrderedSparse)
+# nbr = neighbor_list_fn.allocate(positions)
+# pairs = nbr.idx.T
+
+# pmax = 10
+# kappa, K1, K2, K3 = setup_ewald_parameters(rc, ethresh, box)
+# kappa = 0.657065221219616
+
+# # construct the C list
+# c_list = np.zeros((3,n_atoms))
+# nmol=int(n_atoms/3)
+# for i in range(nmol):
+# a = i*3
+# b = i*3+1
+# c = i*3+2
+# c_list[0][a]=37.19677405
+# c_list[0][b]=7.6111103
+# c_list[0][c]=7.6111103
+# c_list[1][a]=85.26810658
+# c_list[1][b]=11.90220148
+# c_list[1][c]=11.90220148
+# c_list[2][a]=134.44874488
+# c_list[2][b]=15.05074749
+# c_list[2][c]=15.05074749
+# c_list = jnp.array(c_list.T)
+
+
+# # Finish data preparation
+# # -------------------------------------------------------------------------------------
+# # pme_order = 6
+# # d6_recip = generate_pme_recip(Ck_6, kappa, True, pme_order, K1, K2, K3, 0)
+# # d8_recip = generate_pme_recip(Ck_8, kappa, True, pme_order, K1, K2, K3, 0)
+# # d10_recip = generate_pme_recip(Ck_10, kappa, True, pme_order, K1, K2, K3, 0)
+# # disp_pme_recip_fns = [d6_recip, d8_recip, d10_recip]
+# # energy_force_disp_pme = value_and_grad(energy_disp_pme)
+# # e, f = energy_force_disp_pme(positions, box, pairs, c_list, mScales, covalent_map, kappa, K1, K2, K3, pmax, *disp_pme_recip_fns)
+# # print('ok')
+# # e, f = energy_force_disp_pme(positions, box, pairs, c_list, mScales, covalent_map, kappa, K1, K2, K3, pmax, *disp_pme_recip_fns)
+# # print(e)
+
+# disp_pme_force = ADMPDispPmeForce(box, covalent_map, rc, ethresh, pmax)
+# disp_pme_force.update_env('kappa', 0.657065221219616)
+
+# print(c_list[:4])
+# E, F = disp_pme_force.get_forces(positions, box, pairs, c_list, mScales)
+# print('ok')
+# E, F = disp_pme_force.get_forces(positions, box, pairs, c_list, mScales)
+# print(E)
+# return
+
+
+# # below is the validation code
+# if __name__ == '__main__':
+# validation(sys.argv[1])
diff --git a/dmff/admp/multipole.py b/dmff/admp/multipole.py
new file mode 100644
index 000000000..c894db6fa
--- /dev/null
+++ b/dmff/admp/multipole.py
@@ -0,0 +1,199 @@
+import sys
+import jax.numpy as jnp
+from jax import vmap
+from dmff.utils import jit_condition
+from functools import partial
+
+# This module deals with the transformations and rotations of multipoles
+
+
+# The important conversion matrices used in multipoles
+rt3 = 1.73205080757
+inv_rt3 = 1.0/rt3
+# the dipole conversion matrices, cart2harm and harm2cart
+C1_h2c = jnp.array([[0, 1, 0],
+ [0, 0, 1],
+ [1, 0, 0]])
+C1_c2h = C1_h2c.T
+# the quadrupole conversion matrices
+C2_c2h = jnp.array([[ 0, 0, 1, 0, 0, 0],
+ [ 0, 0, 0, 0, 2*inv_rt3, 0],
+ [ 0, 0, 0, 0, 0, 2*inv_rt3],
+ [inv_rt3, -inv_rt3, 0, 0, 0, 0],
+ [ 0, 0, 0, 2*inv_rt3, 0, 0]])
+
+C2_h2c = jnp.array([[-0.5, 0, 0, rt3/2, 0],
+ [-0.5, 0, 0, -rt3/2, 0],
+ [ 1, 0, 0, 0, 0],
+ [ 0, 0, 0, 0, rt3/2],
+ [ 0, rt3/2, 0, 0, 0],
+ [ 0, 0, rt3/2, 0, 0]])
+
+
+@partial(vmap, in_axes=(0, None), out_axes=0)
+@jit_condition(static_argnums=(1))
+def convert_cart2harm(Theta, lmax):
+ '''
+ Convert the multipole moments in cartesian repr to spherical harmonic repr
+ Essentially, implementing the equations in Appendix E in Anthony's book
+
+ Inputs:
+ Theta:
+ n * N_cart: stores the cartesian multipoles of each site
+ lmax:
+ integer, the maximum L, currently only supports up to quadrupole
+
+ Outputs:
+ Q:
+ n * (l+1)^2, stores the spherical multipoles
+ '''
+ if lmax > 2:
+ sys.exit('l > 2 (beyond quadrupole) not supported')
+
+ # n_sites = Theta.shape[0]
+ n_harm = (lmax + 1)**2
+ # Q = jnp.zeros((n_sites, n_harm))
+ Q_mono = Theta[0:1]
+
+ # dipole
+ if lmax >= 1:
+ dipoles_cart = Theta[1:4].T
+ Q_dip = C1_c2h.dot(dipoles_cart).T
+ # quadrupole
+ if lmax >= 2:
+ quad_cart = Theta[4:10].T
+ Q_quad = C2_c2h.dot(quad_cart).T
+
+ if lmax == 0:
+ Q = Q_mono
+ elif lmax == 1:
+ Q = jnp.hstack([Q_mono, Q_dip])
+ else:
+ Q = jnp.hstack([Q_mono, Q_dip, Q_quad])
+
+ return Q
+
+
+@partial(vmap, in_axes=(0, 0), out_axes=0)
+@jit_condition(static_argnums=())
+def rot_ind_global2local(U_g, localframes):
+ '''
+ A special rotation function for just dipoles, aim for applying on induced dipoles
+ '''
+ zxy = jnp.array([2,0,1])
+ R1 = localframes[zxy][:,zxy]
+ U_l = jnp.dot(R1, U_g)
+ return U_l
+
+
+@partial(vmap, in_axes=(0, 0, None), out_axes=0)
+@jit_condition(static_argnums=(2))
+def rot_global2local(Q_gh, localframes, lmax=2):
+ '''
+ This function rotates harmonic moments Q from global frame to local frame
+
+ Input:
+ Q_gh:
+ n * (l+1)^2, stores the global harmonic multipole moments of each site
+ localframes:
+ n * 3 * 3, stores the Rotation matrix for each site, the R is defined as:
+ [r1, r2, r3]^T, with r1, r2, r3 being the local frame axes
+ lmax:
+ integer, the maximum multipole order
+
+ Output:
+ Q_lh:
+ n * (l+1)^2, stores the local harmonic multipole moments
+ '''
+ if lmax > 2:
+ raise NotImplementedError('l > 2 (beyond quadrupole) not supported')
+
+ # monopole
+ Q_lh_0 = Q_gh[0:1]
+ # for dipole
+ if lmax >= 1:
+ zxy = jnp.array([2,0,1])
+ # the rotation matrix
+ R1 = localframes[zxy][:,zxy]
+ # rotate
+ Q_lh_1 = jnp.dot(R1, Q_gh[1:4])
+ if lmax >= 2:
+ xx = localframes[0, 0]
+ xy = localframes[0, 1]
+ xz = localframes[0, 2]
+ yx = localframes[1, 0]
+ yy = localframes[1, 1]
+ yz = localframes[1, 2]
+ zx = localframes[2, 0]
+ zy = localframes[2, 1]
+ zz = localframes[2, 2]
+ quadrupoles = Q_gh[4:9]
+ # construct the local->global transformation matrix
+ # this is copied directly from the convert_mom_to_xml.py code
+ C2_gl_00 = (3*zz**2-1)/2
+ C2_gl_01 = rt3*zx*zz
+ C2_gl_02 = rt3*zy*zz
+ C2_gl_03 = (rt3*(-2*zy**2-zz**2+1))/2
+ C2_gl_04 = rt3*zx*zy
+ C2_gl_10 = rt3*xz*zz
+ C2_gl_11 = 2*xx*zz-yy
+ C2_gl_12 = yx+2*xy*zz
+ C2_gl_13 = -2*xy*zy-xz*zz
+ C2_gl_14 = xx*zy+zx*xy
+ C2_gl_20 = rt3*yz*zz
+ C2_gl_21 = 2*yx*zz+xy
+ C2_gl_22 = -xx+2*yy*zz
+ C2_gl_23 = -2*yy*zy-yz*zz
+ C2_gl_24 = yx*zy+zx*yy
+ C2_gl_30 = rt3*(-2*yz**2-zz**2+1)/2
+ C2_gl_31 = -2*yx*yz-zx*zz
+ C2_gl_32 = -2*yy*yz-zy*zz
+ C2_gl_33 = (4*yy**2+2*zy**2+2*yz**2+zz**2-3)/2
+ C2_gl_34 = -2*yx*yy-zx*zy
+ C2_gl_40 = rt3*xz*yz
+ C2_gl_41 = xx*yz+yx*xz
+ C2_gl_42 = xy*yz+yy*xz
+ C2_gl_43 = -2*xy*yy-xz*yz
+ C2_gl_44 = xx*yy+yx*xy
+ # rotate
+ C2_gl = jnp.array(
+ [
+ [C2_gl_00, C2_gl_10, C2_gl_20, C2_gl_30, C2_gl_40],
+ [C2_gl_01, C2_gl_11, C2_gl_21, C2_gl_31, C2_gl_41],
+ [C2_gl_02, C2_gl_12, C2_gl_22, C2_gl_32, C2_gl_42],
+ [C2_gl_03, C2_gl_13, C2_gl_23, C2_gl_33, C2_gl_43],
+ [C2_gl_04, C2_gl_14, C2_gl_24, C2_gl_34, C2_gl_44]
+ ]
+ ).swapaxes(0,1)
+ Q_lh_2 = jnp.einsum('jk,k->j', C2_gl, quadrupoles)
+ if lmax == 0:
+ Q_lh = Q_lh_0
+ elif lmax == 1:
+ Q_lh = jnp.hstack([Q_lh_0, Q_lh_1])
+ elif lmax == 2:
+ Q_lh = jnp.hstack([Q_lh_0, Q_lh_1, Q_lh_2])
+
+ return Q_lh
+
+
+# @jit_condition(static_argnums=(2))
+def rot_local2global(Q_lh, localframes, lmax=2):
+ '''
+ This function rotates harmonic moments Q from global frame to local frame
+ Simply use the rot_global2local, and localframe^-1
+
+ Input:
+ Q_lh:
+ n * (l+1)^2, stores the local harmonic multipole moments of each site
+ localframes:
+ n * 3 * 3, stores the Rotation matrix for each site, the R is defined as:
+ [r1, r2, r3]^T, with r1, r2, r3 being the local frame axes
+ lmax:
+ integer, the maximum multipole order
+
+ Output:
+ Q_gh:
+ n * (l+1)^2, stores the rotated global harmonic multipole moments
+ '''
+ return rot_global2local(Q_lh, jnp.swapaxes(localframes, -2, -1), lmax)
+
diff --git a/dmff/admp/pairwise.py b/dmff/admp/pairwise.py
new file mode 100755
index 000000000..a789cc0eb
--- /dev/null
+++ b/dmff/admp/pairwise.py
@@ -0,0 +1,214 @@
+import sys
+from jax import vmap
+import jax.numpy as jnp
+from dmff.utils import jit_condition
+from dmff.admp.spatial import v_pbc_shift
+from functools import partial
+
+# for debug
+# from jax_md import partition, space
+# from admp.parser import *
+# from admp.multipole import *
+# from jax import grad, value_and_grad
+# from admp.pme import *
+
+# jitted and vmapped parameter distributors
+# all three look identical, but they assume different input shapes
+# you should use different functions for different inputs, to avoid recompiling
+@partial(vmap, in_axes=(None, 0), out_axes=(0))
+@jit_condition(static_argnums=())
+def distribute_scalar(params, index):
+ return params[index]
+
+
+@partial(vmap, in_axes=(None, 0), out_axes=(0))
+@jit_condition(static_argnums=())
+def distribute_v3(pos, index):
+ return pos[index]
+
+
+@partial(vmap, in_axes=(None, 0), out_axes=(0))
+@jit_condition(static_argnums=())
+def distribute_multipoles(multipoles, index):
+ return multipoles[index]
+
+
+@partial(vmap, in_axes=(None, 0), out_axes=(0))
+@jit_condition(static_argnums=())
+def distribute_dispcoeff(c_list, index):
+ return c_list[index]
+
+
+def generate_pairwise_interaction(pair_int_kernel, covalent_map, static_args):
+ '''
+ This is a calculator generator for pairwise interaction
+
+ Input:
+ pair_int_kernel:
+ function type (dr, m, p1i, p1j, p2i, p2j) -> energy : the vectorized kernel function,
+ dr is the distance, m is the topological scaling factor, p1i, p1j, p2i, p2j are pairwise parameters
+
+ covalent_map:
+ Na * Na, int: the covalent_map matrix that marks the topological distances between atoms
+
+ static_args:
+ dict: a dictionary that stores all static global parameters (such as lmax, kappa, etc)
+
+ Output:
+ pair_int:
+ function type (positions, box, pairs, mScales, p1, p2, ...) -> energy
+ The pair interaction calculator. p1, p2 ... involved atomic parameters, the order should be consistent
+ with the order in kernel
+ '''
+
+ def pair_int(positions, box, pairs, mScales, *atomic_params):
+ pairs = pairs[pairs[:, 0] < pairs[:, 1]]
+ ri = distribute_v3(positions, pairs[:, 0])
+ rj = distribute_v3(positions, pairs[:, 1])
+ # ri = positions[pairs[:, 0]]
+ # rj = positions[pairs[:, 1]]
+ nbonds = covalent_map[pairs[:, 0], pairs[:, 1]]
+ mscales = distribute_scalar(mScales, nbonds-1)
+ # mscales = mScales[nbonds-1]
+ box_inv = jnp.linalg.inv(box)
+ dr = ri - rj
+ dr = v_pbc_shift(dr, box, box_inv)
+ dr = jnp.linalg.norm(dr, axis=1)
+
+ pair_params = []
+ for i, param in enumerate(atomic_params):
+ pair_params.append(distribute_scalar(param, pairs[:, 0]))
+ pair_params.append(distribute_scalar(param, pairs[:, 1]))
+ # pair_params.append(param[pairs[:, 0]])
+ # pair_params.append(param[pairs[:, 1]])
+
+ energy = jnp.sum(pair_int_kernel(dr, mscales, *pair_params))
+ return energy
+
+ return pair_int
+
+
+@vmap
+@jit_condition(static_argnums={})
+def TT_damping_qq_c6_kernel(dr, m, ai, aj, bi, bj, qi, qj, ci, cj):
+ a = jnp.sqrt(ai * aj)
+ b = jnp.sqrt(bi * bj)
+ c = ci * cj
+ q = qi * qj
+ r = dr * 1.889726878 # convert to bohr
+ br = b * r
+ br2 = br * br
+ br3 = br2 * br
+ br4 = br3 * br
+ br5 = br4 * br
+ br6 = br5 * br
+ exp_br = jnp.exp(-br)
+ f = 2625.5 * a * exp_br \
+ + (-2625.5) * exp_br * (1+br) * q / br \
+ + exp_br*(1+br+br2/2+br3/6+br4/24+br5/120+br6/720) * c / dr**6
+
+ return f * m
+
+
+def validation(pdb):
+ xml = 'mpidwater.xml'
+ pdbinfo = read_pdb(pdb)
+ serials = pdbinfo['serials']
+ names = pdbinfo['names']
+ resNames = pdbinfo['resNames']
+ resSeqs = pdbinfo['resSeqs']
+ positions = pdbinfo['positions']
+ box = pdbinfo['box'] # a, b, c, α, β, γ
+ charges = pdbinfo['charges']
+ positions = jnp.asarray(positions)
+ lx, ly, lz, _, _, _ = box
+ box = jnp.eye(3)*jnp.array([lx, ly, lz])
+
+ mScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+ pScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+ dScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+
+ rc = 4 # in Angstrom
+ ethresh = 1e-4
+
+ n_atoms = len(serials)
+
+ atomTemplate, residueTemplate = read_xml(xml)
+ atomDicts, residueDicts = init_residues(serials, names, resNames, resSeqs, positions, charges, atomTemplate, residueTemplate)
+
+ covalent_map = assemble_covalent(residueDicts, n_atoms)
+ displacement_fn, shift_fn = space.periodic_general(box, fractional_coordinates=False)
+ neighbor_list_fn = partition.neighbor_list(displacement_fn, box, rc, 0, format=partition.OrderedSparse)
+ nbr = neighbor_list_fn.allocate(positions)
+ pairs = nbr.idx.T
+
+ pmax = 10
+ kappa, K1, K2, K3 = setup_ewald_parameters(rc, ethresh, box)
+ kappa = 0.657065221219616
+
+ # construct the C list
+ c_list = np.zeros((3, n_atoms))
+ a_list = np.zeros(n_atoms)
+ q_list = np.zeros(n_atoms)
+ b_list = np.zeros(n_atoms)
+ nmol=int(n_atoms/3)
+ for i in range(nmol):
+ a = i*3
+ b = i*3+1
+ c = i*3+2
+ # dispersion coeff
+ c_list[0][a]=37.199677405
+ c_list[0][b]=7.6111103
+ c_list[0][c]=7.6111103
+ c_list[1][a]=85.26810658
+ c_list[1][b]=11.90220148
+ c_list[1][c]=11.90220148
+ c_list[2][a]=134.44874488
+ c_list[2][b]=15.05074749
+ c_list[2][c]=15.05074749
+ # q
+ q_list[a] = -0.741706
+ q_list[b] = 0.370853
+ q_list[c] = 0.370853
+ # b, Bohr^-1
+ b_list[a] = 2.00095977
+ b_list[b] = 1.999519942
+ b_list[c] = 1.999519942
+ # a, Hartree
+ a_list[a] = 458.3777
+ a_list[b] = 0.0317
+ a_list[c] = 0.0317
+
+
+ c_list = jnp.array(c_list)
+
+# @partial(vmap, in_axes=(0, 0, 0, 0), out_axes=(0))
+# @jit_condition(static_argnums=())
+# def disp6_pme_real_kernel(dr, m, ci, cj):
+# # unpack static arguments
+# kappa = static_args['kappa']
+# # calculate distance
+# dr2 = dr ** 2
+# dr6 = dr2 ** 3
+# # do calculation
+# x2 = kappa**2 * dr2
+# exp_x2 = jnp.exp(-x2)
+# x4 = x2 * x2
+# g = (1 + x2 + 0.5*x4) * exp_x2
+# return (m + g - 1) * ci * cj / dr6
+
+# static_args = {'kappa': kappa}
+# disp6_pme_real = generate_pairwise_interaction(disp6_pme_real_kernel, covalent_map, static_args)
+# print(disp6_pme_real(positions, box, pairs, mScales, c_list[0, :]))
+
+ TT_damping_qq_c6 = generate_pairwise_interaction(TT_damping_qq_c6_kernel, covalent_map, static_args={})
+
+ TT_damping_qq_c6(positions, box, pairs, mScales, a_list, b_list, q_list, c_list[0])
+ print('ok')
+ print(TT_damping_qq_c6(positions, box, pairs, mScales, a_list, b_list, q_list, c_list[0]))
+ return
+
+
+# below is the validation code
+if __name__ == '__main__':
+ validation(sys.argv[1])
diff --git a/dmff/admp/parser.py b/dmff/admp/parser.py
new file mode 100644
index 000000000..9ba07239b
--- /dev/null
+++ b/dmff/admp/parser.py
@@ -0,0 +1,477 @@
+# jichen: deprecated
+from xml.dom import minidom
+import numpy as np
+import warnings
+from collections import defaultdict
+
+def read_atom_line(line_full):
+ """
+ Read atom line from pdb format
+ HETATM 1 H14 ORTE 0 6.301 0.693 1.919 1.00 0.00 H
+
+ 1-6 7-11 13-16 17 18-20 22 23-26 27 28-30 31-38 39-46 47-54 55-60 61-66 67-72 73-76 77-78 79-80
+ ATOM serial name altLoc resName chainID resSeq iCode _ x y z occupancy tempFactor _ segID element charge
+ """
+
+ line = line_full.rstrip("\n")
+ type_atm = line[0:6]
+ if type_atm == "ATOM " or type_atm == "HETATM":
+
+ # Roy
+ serial = line[7:12].strip()
+
+ name = line[12:16].strip()
+
+ altLoc = line[16]
+ resName = line[17:21]
+ chainID = line[21] # Not used
+
+ resSeq = int(line[22:26].split()[0]) # sequence identifier
+ iCode = line[26] # insertion code, not used
+
+ # atomic coordinates
+ try:
+ coord = np.array(
+ [float(line[30:38]), float(line[38:46]), float(line[46:54])],
+ dtype=np.float64,
+ )
+ except ValueError:
+ raise ValueError("Invalid or missing coordinate(s)")
+
+ # occupancy & B factor
+ try:
+ occupancy = float(line[54:60])
+ except ValueError:
+ occupancy = None # Rather than arbitrary zero or one
+
+ if occupancy is not None and occupancy < 0:
+ warnings.warn("Negative occupancy in one or more atoms")
+
+ try:
+ bfactor = float(line[60:66])
+ except ValueError:
+ # The PDB use a default of zero if the data is missing
+ bfactor = 0.0
+
+ segid = line[72:76] # not used
+ element = line[76:78].strip().upper()
+ charge = line[79:81]
+
+ else:
+ raise ValueError("Only ATOM and HETATM supported")
+
+ return (
+ type_atm,
+ serial,
+ name,
+ altLoc,
+ resName.strip(),
+ chainID,
+ resSeq,
+ iCode,
+ coord,
+ occupancy,
+ bfactor,
+ segid,
+ element,
+ charge,
+ )
+
+def read_pdb(file):
+ """Read PDB files."""
+ fileobj = open(file, 'r')
+ orig = np.identity(3)
+ trans = np.zeros(3)
+ serials = []
+ names = []
+ altLocs = []
+ resNames = []
+ chainIDs = []
+ resSeqs = []
+ iCodes = []
+ positions = []
+ occupancies = []
+ tempFactors = []
+ segId = []
+ elements = []
+ charges = []
+ cell = None
+ pbc = None
+ cellpar = []
+ conects = {}
+ # make sure that only one frame is read
+ continue_read_atoms_flag = True
+ # serial starts at 1 and we need to discard it and just keep align with positions
+ id = 0
+
+ for line in fileobj.readlines():
+ if line.startswith('CRYST1'):
+ cellpar = [float(line[6:15]), # a
+ float(line[15:24]), # b
+ float(line[24:33]), # c
+ float(line[33:40]), # alpha
+ float(line[40:47]), # beta
+ float(line[47:54])] # gamma
+
+ for c in range(3):
+ if line.startswith('ORIGX' + '123'[c]):
+ orig[c] = [float(line[10:20]),
+ float(line[20:30]),
+ float(line[30:40])]
+ trans[c] = float(line[45:55])
+
+ if (
+ line.startswith("ATOM")
+ or line.startswith("HETATM")
+ and continue_read_atoms_flag
+ ):
+ # Atom name is arbitrary and does not necessarily
+ # contain the element symbol. The specification
+ # requires the element symbol to be in columns 77+78.
+ # Fall back to Atom name for files that do not follow
+ # the spec, e.g. packmol.
+
+ # line_info = type_atm, serial, name, altLoc, resName, chainID, resSeq, iCode, coord, occupancy, tempFactor, segid, element, charge
+ line_info = read_atom_line(line)
+
+ # serials.append(int(line_info[1]))
+ serials.append(id)
+ id += 1
+ names.append(line_info[2])
+ resNames.append(line_info[4])
+ resSeqs.append(line_info[6])
+ position = np.dot(orig, line_info[8]) + trans
+ positions.append(position)
+ if line_info[9] is not None:
+ occupancies.append(line_info[9])
+ tempFactors.append(line_info[10])
+ elements.append(line_info[-2])
+ charges.append(line_info[-1] or 0)
+
+ if line.startswith("END"):
+ # End of configuration reached
+ # According to the latest PDB file format (v3.30),
+ # this line should start with 'ENDMDL' (not 'END'),
+ # but in this way PDB trajectories from e.g. CP2K
+ # are supported (also VMD supports this format).
+ continue_read_atoms_flag = False
+ pass
+
+ if line.startswith("CONECT"):
+ l = line.split()
+ center_atom_idx = int(l[1])
+ bonded_atom_idx = [int(i) for i in l[2:]]
+
+ conects[center_atom_idx] = bonded_atom_idx
+ fileobj.close()
+
+ return {'serials': serials,
+ 'names': names,
+ 'resNames': resNames,
+ 'resSeqs': resSeqs,
+ 'positions': np.vstack(positions),
+ 'charges': charges,
+ 'connects': conects,
+ 'box': cellpar}
+
+def set_axis_type(atoms):
+ ZThenX = 0
+ Bisector = 1
+ ZBisect = 2
+ ThreeFold = 3
+ Zonly = 4
+ NoAxisType = 5
+ LastAxisTypeIndex = 6
+ kStrings = ['kz', 'kx', 'ky']
+
+ for atom in atoms:
+ atomType = atom['type']
+ kIndices = [atomType]
+
+ for kString in kStrings:
+
+ if kString in atom and atom[kString] != '':
+ kIndices.append(atom[kString])
+ atom['axis_indices'] = kIndices
+
+ # set axis type
+
+ kIndicesLen = len(kIndices)
+
+ if (kIndicesLen > 3):
+ ky = kIndices[3]
+ kyNegative = False
+ if ky.startswith('-'):
+ ky = kIndices[3] = ky[1:]
+ kyNegative = True
+ else:
+ ky = ""
+
+ if (kIndicesLen > 2):
+ kx = kIndices[2]
+ kxNegative = False
+ if kx.startswith('-'):
+ kx = kIndices[2] = kx[1:]
+ kxNegative = True
+ else:
+ kx = ""
+
+ if (kIndicesLen > 1):
+ kz = kIndices[1]
+ kzNegative = False
+ if kz.startswith('-'):
+ kz = kIndices[1] = kz[1:]
+ kzNegative = True
+ else:
+ kz = ""
+
+ while(len(kIndices) < 4):
+ kIndices.append("")
+
+ axisType = ZThenX
+ if (not kz):
+ axisType = NoAxisType
+ if (kz and not kx):
+ axisType = Zonly
+ if (kz and kzNegative or kx and kxNegative):
+ axisType = Bisector
+ if (kx and kxNegative and ky and kyNegative):
+ axisType = ZBisect
+ if (kz and kzNegative and kx and kxNegative and ky and kyNegative):
+ axisType = ThreeFold
+
+ atom['axisType'] = axisType
+
+ return atoms
+
+def read_xml(fileobj):
+
+ fileobj = minidom.parse(fileobj)
+
+ multipoles = fileobj.getElementsByTagName("Multipole")
+
+ residueTemplates = []
+ atomTemplates = []
+
+ for r in fileobj.getElementsByTagName('Residue'):
+
+ resName = r.getAttribute("name")
+ residueTemplate = {'resName': resName, 'atoms': [], }
+
+
+ for a in r.getElementsByTagName('Atom'):
+ atomName = a.getAttribute('name')
+ atomType = a.getAttribute('type')
+ atomTemplate = {'name': atomName, 'type': atomType}
+
+ residueTemplate['atoms'].append(atomTemplate)
+ atomTemplates.append(atomTemplate)
+
+ topo = defaultdict(list)
+ for b in r.getElementsByTagName('Bond'):
+
+ from_ = b.getAttribute('from')
+ to_ = b.getAttribute('to')
+ topo[from_].append(to_)
+ # topo[to_].append(from_)
+
+ residueTemplate['topo'] = dict(topo)
+ residueTemplates.append(residueTemplate)
+
+ for i, multipole in enumerate(multipoles):
+
+ multiDict = {
+ "c0": float(multipole.getAttribute("c0")),
+ "dX": float(multipole.getAttribute("dX")),
+ "dY": float(multipole.getAttribute("dY")),
+ "dZ": float(multipole.getAttribute("dZ")),
+ "qXX": float(multipole.getAttribute("qXX")),
+ "qXY": float(multipole.getAttribute("qXY")),
+ "qYY": float(multipole.getAttribute("qYY")),
+ "qXZ": float(multipole.getAttribute("qXZ")),
+ "qYZ": float(multipole.getAttribute("qYZ")),
+ "qZZ": float(multipole.getAttribute("qZZ")),
+ "oXXX": float(multipole.getAttribute("oXXX")),
+ "oXXY": float(multipole.getAttribute("oXXY")),
+ "oXYY": float(multipole.getAttribute("oXYY")),
+ "oYYY": float(multipole.getAttribute("oYYY")),
+ "oXXZ": float(multipole.getAttribute("oXXZ")),
+ "oXYZ": float(multipole.getAttribute("oXYZ")),
+ "oYYZ": float(multipole.getAttribute("oYYZ")),
+ "oXZZ": float(multipole.getAttribute("oXZZ")),
+ "oYZZ": float(multipole.getAttribute("oYZZ")),
+ "oZZZ": float(multipole.getAttribute("oZZZ")),
+ "kx": multipole.getAttribute("kx"),
+ "kz": multipole.getAttribute("kz"),
+ "ky": multipole.getAttribute("ky")
+ }
+
+ for template in atomTemplates:
+ if template['type'] == multipole.getAttribute("type"):
+ template.update(multiDict)
+
+
+ for p in fileobj.getElementsByTagName('Polarize'):
+
+ pxx = p.getAttribute('polarizabilityXX')
+ pyy = p.getAttribute('polarizabilityYY')
+ pzz = p.getAttribute('polarizabilityZZ')
+ thole = p.getAttribute('thole')
+ polarDict = {'polarizabilityXX': pxx, 'polarizabilityYY': pyy, 'polarizabilityZZ':pzz, 'thole': thole}
+
+ for template in atomTemplates:
+ if template['type'] == p.getAttribute('type'):
+ template.update(polarDict)
+
+ set_axis_type(atomTemplates)
+
+ return atomTemplates, residueTemplates
+
+class Atom:
+
+ def __init__(self, serial, name, resName, resSeq, position, charge, ) -> None:
+ self.serial = serial
+ self.name = name
+ self.position = position
+ self.charge = charge
+ self.resName = resName
+ self.charge = charge
+ self.linkAtom = []
+ self.resSeq = resSeq
+
+ def __eq__(self, o):
+ return o.serial == self.serial
+
+ def link(self, atom):
+ if atom not in self.linkAtom:
+ self.linkAtom.append(atom)
+ if self not in atom.linkAtom:
+ atom.linkAtom.append(self)
+
+ def __repr__(self) -> str:
+ return f'< Atom{self.serial}: {self.name} >'
+
+class Residue:
+
+ def __init__(self, resName, resSeq) -> None:
+ self.resName = resName
+ self.resSeq = resSeq
+ self.atoms = {}
+ self.topo = []
+ self.covalent_map = {}
+
+ def add(self, serial, atom):
+ self.atoms[serial] = atom
+
+ def __next__(self):
+ return next(self.atoms)
+
+ def __getitem__(self, name):
+ for atom in self.atoms.values():
+ if atom.name == name:
+ return atom
+
+ def __repr__(self) -> str:
+ return f'< Residue{self.resSeq}: {self.resName} >'
+
+def init_residues(serials, names, resNames, resSeqs, positions, charges, atomTemplates, residueTemplates):
+
+ residueDicts = {}
+ atomDicts = {}
+
+ for name, seq in zip(resNames, resSeqs):
+ if seq not in residueDicts:
+ residueDicts[seq] = Residue(name, seq)
+
+
+ # build up residue
+ for serial, name, resName, resSeq, position, charge in zip(serials, names, resNames, resSeqs, positions, charges):
+
+ atom = Atom(serial, name, resName, resSeq, position, charge)
+
+ for a in atomTemplates:
+ if name == a['name']:
+ for k, v in a.items():
+ setattr(atom, k, v)
+ atomDicts[serial] = atom
+
+ residueDicts[resSeq].add(atom.serial, atom)
+
+
+ # build up topo
+ for residue in residueDicts.values():
+
+ for residueTemplate in residueTemplates:
+ if residueTemplate['resName'] == residue.resName:
+ template = residueTemplate
+
+ for c, p in template['topo'].items():
+ ctemp = template['atoms'][int(c)]
+ catom = residue[ctemp['name']]
+
+ for pp in p:
+ ptemp = template['atoms'][int(pp)]
+ patom = residue[ptemp['name']]
+ catom.link(patom)
+
+ # build up axis indices
+ for residue in residueDicts.values():
+
+ for atom in residue.atoms.values():
+ indices = [index if index != '' else -1 for index in atom.axis_indices[1: ]]
+
+ for patom in residue.atoms.values():
+ if patom.serial == atom.serial:
+ continue
+ for i in range(len(indices)):
+ if indices[i] == patom.type:
+ indices[i] = patom.serial
+ break
+
+ atom.axis_indices = indices
+
+
+ # build up covalent map in residue
+ for i in residue.atoms.values():
+ visited = [i.serial]
+ residue.covalent_map[i.serial] = {}
+ for j in i.linkAtom:
+ residue.covalent_map[i.serial][j.serial] = 1
+ visited.append(j.serial)
+ for k in j.linkAtom:
+ if k.serial not in visited:
+ residue.covalent_map[i.serial][k.serial] = 2
+ visited.append(k.serial)
+ else:
+ continue
+ for l in k.linkAtom:
+ if l.serial not in visited:
+ residue.covalent_map[i.serial][l.serial] = 3
+ visited.append(l.serial)
+ else:
+ continue
+ for m in l.linkAtom:
+ if m.serial not in visited:
+ residue.covalent_map[i.serial][m.serial] = 4
+ visited.append(m.serial)
+ else:
+ continue
+
+ return atomDicts, residueDicts
+
+def assemble_covalent(residueDicts, natoms):
+
+ covalents = [c.covalent_map for c in residueDicts.values()]
+
+ covalent_map = np.zeros((natoms, natoms), dtype=int)
+
+ for covalent in covalents:
+
+ for c, p in covalent.items():
+
+ for pp, dr in p.items():
+
+ covalent_map[c][pp] = dr
+
+ return covalent_map
+
\ No newline at end of file
diff --git a/dmff/admp/pme.py b/dmff/admp/pme.py
new file mode 100755
index 000000000..f973d85a1
--- /dev/null
+++ b/dmff/admp/pme.py
@@ -0,0 +1,850 @@
+import sys
+import numpy as np
+import jax
+import jax.numpy as jnp
+from jax import grad, value_and_grad, vmap, jit
+from jax.scipy.special import erf
+from dmff.settings import DO_JIT
+from dmff.admp.settings import POL_CONV, MAX_N_POL
+from dmff.utils import jit_condition
+from dmff.admp.multipole import C1_c2h, convert_cart2harm
+from dmff.admp.multipole import rot_ind_global2local, rot_global2local, rot_local2global
+from dmff.admp.spatial import v_pbc_shift, generate_construct_local_frames, build_quasi_internal
+from dmff.admp.pairwise import distribute_scalar, distribute_v3, distribute_multipoles
+from functools import partial
+
+DIELECTRIC = 1389.35455846
+DEFAULT_THOLE_WIDTH = 0.3
+
+from dmff.admp.recip import generate_pme_recip, Ck_1
+
+# for debugging use only
+# from jax_md import partition, space
+# from admp.parser import *
+
+# from jax.config import config
+# config.update("jax_enable_x64", True)
+
+# Functions that are related to electrostatic pme
+
+class ADMPPmeForce:
+ '''
+ This is a convenient wrapper for multipolar PME calculations
+ It wrapps all the environment parameters of multipolar PME calculation
+ The so called "environment paramters" means parameters that do not need to be differentiable
+ '''
+
+ def __init__(self, box, axis_type, axis_indices, covalent_map, rc, ethresh, lmax, lpol=False):
+ self.axis_type = axis_type
+ self.axis_indices = axis_indices
+ self.rc = rc
+ self.ethresh = ethresh
+ self.lmax = int(lmax) # jichen: type checking
+ kappa, K1, K2, K3 = setup_ewald_parameters(rc, ethresh, box)
+ self.kappa = kappa
+ self.K1 = K1
+ self.K2 = K2
+ self.K3 = K3
+ self.pme_order = 6
+ self.covalent_map = covalent_map
+ self.lpol = lpol
+ self.n_atoms = int(covalent_map.shape[0]) # len(axis_type)
+
+ # setup calculators
+ self.refresh_calculators()
+ return
+
+
+ def generate_get_energy(self):
+ # if the force field is not polarizable
+ if not self.lpol:
+ def get_energy(positions, box, pairs, Q_local, mScales):
+ return energy_pme(positions, box, pairs,
+ Q_local, None, None, None,
+ mScales, None, None, self.covalent_map,
+ self.construct_local_frames, self.pme_recip,
+ self.kappa, self.K1, self.K2, self.K3, self.lmax, False)
+ return get_energy
+ else:
+ # this is the bare energy calculator, with Uind as explicit input
+ def energy_fn(positions, box, pairs, Q_local, Uind_global, pol, tholes, mScales, pScales, dScales):
+ return energy_pme(positions, box, pairs,
+ Q_local, Uind_global, pol, tholes,
+ mScales, pScales, dScales, self.covalent_map,
+ self.construct_local_frames, self.pme_recip,
+ self.kappa, self.K1, self.K2, self.K3, self.lmax, True)
+ self.energy_fn = energy_fn
+ self.grad_U_fn = grad(self.energy_fn, argnums=(4))
+ self.grad_pos_fn = grad(self.energy_fn, argnums=(0))
+ self.U_ind = jnp.zeros((self.n_atoms, 3))
+ # this is the wrapper that include a Uind optimizer
+ def get_energy(positions, box, pairs, Q_local, pol, tholes, mScales, pScales, dScales, U_init=self.U_ind):
+ self.U_ind, self.lconverg, self.n_cycle = self.optimize_Uind(positions, box, pairs, Q_local, pol, tholes, mScales, pScales, dScales, U_init=U_init)
+ # here we rely on Feynman-Hellman theorem, drop the term dV/dU*dU/dr !
+ # self.U_ind = jax.lax.stop_gradient(U_ind)
+ return self.energy_fn(positions, box, pairs, Q_local, self.U_ind, pol, tholes, mScales, pScales, dScales)
+ return get_energy
+
+
+ def update_env(self, attr, val):
+ '''
+ Update the environment of the calculator
+ '''
+ setattr(self, attr, val)
+ self.refresh_calculators()
+
+
+ def refresh_calculators(self):
+ '''
+ refresh the energy and force calculators according to the current environment
+ '''
+ if self.lmax > 0:
+ self.construct_local_frames = generate_construct_local_frames(self.axis_type, self.axis_indices)
+ else:
+ self.construct_local_frames = None
+ self.pme_recip = generate_pme_recip(Ck_1, self.kappa, False, self.pme_order, self.K1, self.K2, self.K3, self.lmax)
+ # generate the force calculator
+ self.get_energy = self.generate_get_energy()
+ self.get_forces = value_and_grad(self.get_energy)
+ return
+
+ def optimize_Uind(self, positions, box, pairs, Q_local, pol, tholes, mScales, pScales, dScales, U_init=None, maxiter=MAX_N_POL, thresh=POL_CONV):
+ '''
+ This function converges the induced dipole
+ Note that we cut all the gradient chain passing through this function as we assume Feynman-Hellman theorem
+ Gradients related to Uind should be dropped
+ '''
+ # Do not track gradient in Uind optimization
+ positions = jax.lax.stop_gradient(positions)
+ box = jax.lax.stop_gradient(box)
+ Q_local = jax.lax.stop_gradient(Q_local)
+ pol = jax.lax.stop_gradient(pol)
+ tholes = jax.lax.stop_gradient(tholes)
+ mScales = jax.lax.stop_gradient(mScales)
+ pScales = jax.lax.stop_gradient(pScales)
+ dScales = jax.lax.stop_gradient(dScales)
+ if U_init is None:
+ U = jnp.zeros((self.n_atoms, 3))
+ else:
+ U = U_init
+ site_filter = (pol>0.001) # focus on the actual polarizable sites
+
+ for i in range(maxiter):
+ field = self.grad_U_fn(positions, box, pairs, Q_local, U, pol, tholes, mScales, pScales, dScales)
+ E = self.energy_fn(positions, box, pairs, Q_local, U, pol, tholes, mScales, pScales, dScales)
+ # print(i, E, jnp.max(jnp.abs(field[site_filter])))
+ if jnp.max(jnp.abs(field[site_filter])) < thresh:
+ break
+ U = U - field * pol[:, jnp.newaxis] / DIELECTRIC
+ if i == maxiter-1:
+ flag = False
+ else: # converged
+ flag = True
+ return U, flag, i
+
+
+def setup_ewald_parameters(rc, ethresh, box):
+ '''
+ Given the cutoff distance, and the required precision, determine the parameters used in
+ Ewald sum, including: kappa, K1, K2, and K3.
+ The algorithm is exactly the same as OpenMM, see:
+ http://docs.openmm.org/latest/userguide/theory.html
+
+ Input:
+ rc:
+ float, the cutoff distance
+ ethresh:
+ float, required energy precision
+ box:
+ 3*3 matrix, box size, a, b, c arranged in rows
+
+ Output:
+ kappa:
+ float, the attenuation factor
+ K1, K2, K3:
+ integers, sizes of the k-points mesh
+ '''
+ kappa = jnp.sqrt(-jnp.log(2*ethresh))/rc
+ K1 = jnp.ceil(2 * kappa * box[0, 0] / 3 / ethresh**0.2)
+ K2 = jnp.ceil(2 * kappa * box[1, 1] / 3 / ethresh**0.2)
+ K3 = jnp.ceil(2 * kappa * box[2, 2] / 3 / ethresh**0.2)
+
+ return kappa, int(K1), int(K2), int(K3)
+
+
+# @jit_condition(static_argnums=())
+def energy_pme(positions, box, pairs,
+ Q_local, Uind_global, pol, tholes,
+ mScales, pScales, dScales, covalent_map,
+ construct_local_frame_fn, pme_recip_fn, kappa, K1, K2, K3, lmax, lpol):
+ '''
+ This is the top-level wrapper for multipole PME
+
+ Input:
+ positions:
+ Na * 3: positions
+ box:
+ 3 * 3: box
+ Q_local:
+ Na * (lmax+1)^2: harmonic multipoles of each site in local frame
+ Uind_global:
+ Na * 3: the induced dipole moment, in GLOBAL CARTESIAN!
+ pol:
+ (Na,) float: the polarizability of each site, unit in A**3
+ tholes:
+ (Na,) float: the thole damping widths for each atom, it's dimensionless, default is 8 according to MPID paper
+ mScales, pScale, dScale:
+ (Nexcl,): multipole-multipole interaction exclusion scalings: 1-2, 1-3 ...
+ for permanent-permanent, permanent-induced, induced-induced interactions
+ pairs:
+ Np * 2: interacting pair indices
+ covalent_map:
+ Na * Na: topological distances between atoms, if i, j are topologically distant, then covalent_map[i, j] == 0
+ construct_local_frame_fn:
+ function: local frame constructors, from generate_local_frame_constructor
+ pme_recip:
+ function: see recip.py, a reciprocal space calculator
+ kappa:
+ float: kappa in A^-1
+ K1, K2, K3:
+ int: max K for reciprocal calculations
+ lmax:
+ int: maximum L
+ bool:
+ int: if polarizable or not? if yes, 1, otherwise 0
+
+ Output:
+ energy: total pme energy
+ '''
+ # if doing a multipolar calculation
+ if lmax > 0:
+ local_frames = construct_local_frame_fn(positions, box)
+ Q_global = rot_local2global(Q_local, local_frames, lmax)
+ else:
+ if lpol:
+ # if fixed multipole only contains charge, and it's polarizable, then expand Q matrix
+ dips = jnp.zeros((Q_local.shape[0], 3))
+ Q_global = jnp.hstack((Q_global, dips))
+ lmax = 1
+ else:
+ Q_global = Q_local
+
+ # note we assume when lpol is True, lmax should be >= 1
+ if lpol:
+ # convert Uind to global harmonics, in accord with Q_global
+ U_ind = C1_c2h.dot(Uind_global.T).T
+ Q_global_tot = Q_global.at[:, 1:4].add(U_ind)
+ else:
+ Q_global_tot = Q_global
+
+ if lpol:
+ ene_real = pme_real(positions, box, pairs, Q_global, U_ind, pol, tholes,
+ mScales, pScales, dScales, covalent_map, kappa, lmax, True)
+ else:
+ ene_real = pme_real(positions, box, pairs, Q_global, None, None, None,
+ mScales, None, None, covalent_map, kappa, lmax, False)
+
+ ene_recip = pme_recip_fn(positions, box, Q_global_tot)
+
+ ene_self = pme_self(Q_global_tot, kappa, lmax)
+
+ if lpol:
+ ene_self += pol_penalty(U_ind, pol)
+
+ return ene_real + ene_recip + ene_self
+
+
+# @partial(vmap, in_axes=(0, 0, None, None), out_axes=0)
+@jit_condition(static_argnums=(3))
+def calc_e_perm(dr, mscales, kappa, lmax=2):
+
+ '''
+ This function calculates the ePermCoefs at once
+ ePermCoefs is basically the interaction tensor between permanent multipole components
+ Everything should be done in the so called quasi-internal (qi) frame
+ Energy = \sum_ij qiQI * ePermCoeff_ij * qiQJ
+
+ Inputs:
+ dr:
+ float: distance between one pair of particles
+ mscales:
+ float: scaling factor between permanent - permanent multipole interactions, for each pair
+ kappa:
+ float: \kappa in PME, unit in A^-1
+ lmax:
+ int: max L
+
+ Output:
+ cc, cd, dd_m0, dd_m1, cq, dq_m0, dq_m1, qq_m0, qq_m1, qq_m2:
+ n * 1 array: ePermCoefs
+ '''
+
+ # be aware of unit and dimension !!
+ rInv = 1 / dr
+ rInvVec = jnp.array([DIELECTRIC*(rInv**i) for i in range(0, 9)])
+ alphaRVec = jnp.array([(kappa*dr)**i for i in range(0, 10)])
+ X = 2 * jnp.exp(-alphaRVec[2]) / jnp.sqrt(np.pi)
+ tmp = jnp.array(alphaRVec[1])
+ doubleFactorial = 1
+ facCount = 1
+ erfAlphaR = erf(alphaRVec[1])
+
+ # bVec = jnp.empty((6, len(erfAlphaR)))
+ bVec = jnp.empty(6)
+
+ bVec = bVec.at[1].set(-erfAlphaR)
+ for i in range(2, 6):
+ bVec = bVec.at[i].set((bVec[i-1]+(tmp*X/doubleFactorial)))
+ facCount += 2
+ doubleFactorial *= facCount
+ tmp *= 2 * alphaRVec[2]
+
+ # C-C: 1
+ cc = rInvVec[1] * (mscales + bVec[2] - alphaRVec[1]*X)
+ if lmax >= 1:
+ # C-D
+ cd = rInvVec[2] * (mscales + bVec[2])
+ # D-D: 2
+ dd_m0 = -2/3 * rInvVec[3] * (3*(mscales + bVec[3]) + alphaRVec[3]*X)
+ dd_m1 = rInvVec[3] * (mscales + bVec[3] - (2/3)*alphaRVec[3]*X)
+ else:
+ cd = 0
+ dd_m0 = 0
+ dd_m1 = 0
+
+ if lmax >= 2:
+ ## C-Q: 1
+ cq = (mscales + bVec[3]) * rInvVec[3]
+ ## D-Q: 2
+ dq_m0 = rInvVec[4] * (3* (mscales + bVec[3]) + (4/3) * alphaRVec[5]*X)
+ dq_m1 = -jnp.sqrt(3) * rInvVec[4] * (mscales + bVec[3])
+ ## Q-Q
+ qq_m0 = rInvVec[5] * (6* (mscales + bVec[4]) + (4/45)* (-3 + 10*alphaRVec[2]) * alphaRVec[5]*X)
+ qq_m1 = - (4/15) * rInvVec[5] * (15*(mscales+bVec[4]) + alphaRVec[5]*X)
+ qq_m2 = rInvVec[5] * (mscales + bVec[4] - (4/15)*alphaRVec[5]*X)
+ else:
+ cq = 0
+ dq_m0 = 0
+ dq_m1 = 0
+ qq_m0 = 0
+ qq_m1 = 0
+ qq_m1 = 0
+ qq_m2 = 0
+
+ return cc, cd, dd_m0, dd_m1, cq, dq_m0, dq_m1, qq_m0, qq_m1, qq_m2
+
+
+@jit_condition(static_argnums=())
+def switch_val(x, x0, sigma, y0, y1):
+ '''
+ This is a Fermi function switches between y0 and y1, according to the value of x
+ y = y0 when x << x0
+ y = y1 when x >> x1
+ sigma control sthe switch width
+ '''
+ u = (x-x0) / sigma
+ w0 = 1 / (jnp.exp(u) + 1)
+ w1 = 1 - w0
+ return w0*y0 + w1*y1
+
+
+def gen_trim_val_0(thresh):
+ '''
+ Trim the value at zero point to avoid singularity
+ '''
+ def trim_val_0(x):
+ return jnp.piecewise(x, [x=thresh], [lambda x: jnp.array(thresh), lambda x: x])
+ if DO_JIT:
+ return jit(trim_val_0)
+ else:
+ return trim_val_0
+
+trim_val_0 = gen_trim_val_0(1e-8)
+
+
+def gen_trim_val_infty(thresh):
+ '''
+ Trime the value at infinity to avoid divergence
+ '''
+ def trim_val_infty(x):
+ return jnp.piecewise(x, [x=thresh], [lambda x: x, lambda x: jnp.array(thresh)])
+ if DO_JIT:
+ return jit(trim_val_infty)
+ else:
+ return trim_val_infty
+
+trim_val_infty = gen_trim_val_infty(1e8)
+
+
+@jit_condition(static_argnums=(7))
+def calc_e_ind(dr, thole1, thole2, dmp, pscales, dscales, kappa, lmax=2):
+
+ '''
+ This function calculates the eUindCoefs at once
+ ## compute the Thole damping factors for energies
+ eUindCoefs is basically the interaction tensor between permanent multipole components and induced dipoles
+ Everything should be done in the so called quasi-internal (qi) frame
+
+
+ Inputs:
+ dr:
+ float: distance between one pair of particles
+ dmp
+ float: damping factors between one pair of particles
+ mscales:
+ float: scaling factor between permanent - permanent multipole interactions, for each pair
+ pscales:
+ float: scaling factor between permanent - induced multipole interactions, for each pair
+ au:
+ float: for damping factors
+ kappa:
+ float: \kappa in PME, unit in A^-1
+ lmax:
+ int: max L
+
+ Output:
+ Interaction tensors components
+ '''
+ ## switch function
+
+ # a = 1/(jnp.exp((pscales-0.001)*10000)+1) * (thole1 + thole2) + 8/(jnp.exp((-pscales+0.01)*10000)+1)
+ a = switch_val(pscales, 1e-3, 1e-5, DEFAULT_THOLE_WIDTH, thole1+thole2)
+
+ dmp = trim_val_0(dmp)
+ u = trim_val_infty(dr/dmp)
+
+ ## au <= 50 aupi = au ;au> 50 aupi = 50
+ au = a * u
+ expau = jnp.piecewise(au, [au<50, au>=50], [lambda au: jnp.exp(-au), lambda au: jnp.array(0)])
+
+ ## compute the Thole damping factors for energies
+ au2 = trim_val_infty(au*au)
+ au3 = trim_val_infty(au2*au)
+ au4 = trim_val_infty(au3*au)
+ au5 = trim_val_infty(au4*au)
+ au6 = trim_val_infty(au5*au)
+
+ ## Thole damping factors for energies
+ thole_c = 1.0 - expau*(1.0 + au + 0.5*au2)
+ thole_d0 = 1.0 - expau*(1.0 + au + 0.5*au2 + au3/4.0)
+ thole_d1 = 1.0 - expau*(1.0 + au + 0.5*au2)
+ thole_q0 = 1.0 - expau*(1.0 + au + 0.5*au2 + au3/6.0 + au4/18.0)
+ thole_q1 = 1.0 - expau*(1.0 + au + 0.5*au2 + au3/6.0)
+ # copied from calc_e_perm
+ # be aware of unit and dimension !!
+ rInv = 1 / dr
+ rInvVec = jnp.array([DIELECTRIC*(rInv**i) for i in range(0, 9)])
+ alphaRVec = jnp.array([(kappa*dr)**i for i in range(0, 10)])
+ X = 2 * jnp.exp(-alphaRVec[2]) / jnp.sqrt(np.pi)
+ tmp = jnp.array(alphaRVec[1])
+ doubleFactorial = 1
+ facCount = 1
+ erfAlphaR = erf(alphaRVec[1])
+
+ #bVec = jnp.empty((6, len(erfAlphaR)))
+ bVec = jnp.empty(6)
+
+ bVec = bVec.at[1].set(-erfAlphaR)
+ for i in range(2, 6):
+ bVec = bVec.at[i].set((bVec[i-1]+(tmp*X/doubleFactorial)))
+ facCount += 2
+ doubleFactorial *= facCount
+ tmp *= 2 * alphaRVec[2]
+
+ ## C-Uind
+ cud = 2.0*rInvVec[2]*(pscales*thole_c + bVec[2])
+ if lmax >= 1:
+ ## D-Uind terms
+ dud_m0 = -2.0*2.0/3.0*rInvVec[3]*(3.0*(pscales*thole_d0 + bVec[3]) + alphaRVec[3]*X)
+ dud_m1 = 2.0*rInvVec[3]*(pscales*thole_d1 + bVec[3] - 2.0/3.0*alphaRVec[3]*X)
+ else:
+ dud_m0 = 0.0
+ dud_m1 = 0.0
+
+ if lmax >= 2:
+ ## Uind-Q
+ udq_m0 = 2.0*rInvVec[4]*(3.0*(pscales*thole_q0 + bVec[3]) + 4/3*alphaRVec[5]*X)
+ udq_m1 = -2.0*jnp.sqrt(3)*rInvVec[4]*(pscales*thole_q1 + bVec[3])
+ else:
+ udq_m0 = 0.0
+ udq_m1 = 0.0
+ ## Uind-Uind
+ uscales = 1
+ udud_m0 = -2.0/3.0*rInvVec[3]*(3.0*(uscales*thole_d0 + bVec[3]) + alphaRVec[3]*X)
+ udud_m1 = rInvVec[3]*(uscales*thole_d1 + bVec[3] - 2.0/3.0*alphaRVec[3]*X)
+ return cud, dud_m0, dud_m1, udq_m0, udq_m1, udud_m0, udud_m1
+
+
+
+@partial(vmap, in_axes=(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, None, None, None), out_axes=0)
+@jit_condition(static_argnums=(12, 13))
+def pme_real_kernel(dr, qiQI, qiQJ, qiUindI, qiUindJ, thole1, thole2, dmp, mscales, pscales, dscales, kappa, lmax=2, lpol=False):
+ '''
+ This is the heavy-lifting kernel function to compute the realspace multipolar PME
+ Vectorized over interacting pairs
+
+ Input:
+ dr:
+ float, the interatomic distances, (np) array if vectorized
+ qiQI:
+ [(lmax+1)^2] float array, the harmonic multipoles of site i in quasi-internal frame
+ qiQJ:
+ [(lmax+1)^2] float array, the harmonic multipoles of site j in quasi-internal frame
+ qiUindI
+ (3,) float array, the harmonic dipoles of site i in QI frame
+ qiUindJ
+ (3,) float array, the harmonic dipoles of site j in QI frame
+ thole1
+ float: thole damping coeff of site i
+ thole2
+ float: thole damping coeff of site j
+ dmp:
+ float: (pol1 * pol2)**1/6, distance rescaling params used in thole damping
+ mscale:
+ float, scaling factor between interacting sites (permanent-permanent)
+ pscale:
+ float, scaling factor between perm-ind interaction
+ dscale:
+ float, scaling factor between ind-ind interaction
+ kappa:
+ float, kappa in unit A^1
+ lmax:
+ int, maximum angular momentum
+ lpol:
+ bool, doing polarization?
+
+ Output:
+ energy:
+ float, realspace interaction energy between the sites
+ '''
+
+ cc, cd, dd_m0, dd_m1, cq, dq_m0, dq_m1, qq_m0, qq_m1, qq_m2 = calc_e_perm(dr, mscales, kappa, lmax)
+ if lpol:
+ cud, dud_m0, dud_m1, udq_m0, udq_m1, udud_m0, udud_m1 = calc_e_ind(dr, thole1, thole2, dmp, pscales, dscales, kappa, lmax)
+
+ Vij0 = cc*qiQI[0]
+ Vji0 = cc*qiQJ[0]
+ # C-Uind
+ if lpol:
+ Vij0 -= cud * qiUindI[0]
+ Vji0 += cud * qiUindJ[0]
+
+ if lmax >= 1:
+ # C-D
+ Vij0 = Vij0 - cd*qiQI[1]
+ Vji1 = -cd*qiQJ[0]
+ Vij1 = cd*qiQI[0]
+ Vji0 = Vji0 + cd*qiQJ[1]
+ # D-D m0
+ Vij1 += dd_m0 * qiQI[1]
+ Vji1 += dd_m0 * qiQJ[1]
+ # D-D m1
+ Vij2 = dd_m1*qiQI[2]
+ Vji2 = dd_m1*qiQJ[2]
+ Vij3 = dd_m1*qiQI[3]
+ Vji3 = dd_m1*qiQJ[3]
+ # D-Uind
+ if lpol:
+ Vij1 += dud_m0 * qiUindI[0]
+ Vji1 += dud_m0 * qiUindJ[0]
+ Vij2 += dud_m1 * qiUindI[1]
+ Vji2 += dud_m1 * qiUindJ[1]
+ Vij3 += dud_m1 * qiUindI[2]
+ Vji3 += dud_m1 * qiUindJ[2]
+
+ if lmax >= 2:
+ # C-Q
+ Vij0 = Vij0 + cq*qiQI[4]
+ Vji4 = cq*qiQJ[0]
+ Vij4 = cq*qiQI[0]
+ Vji0 = Vji0 + cq*qiQJ[4]
+ # D-Q m0
+ Vij1 += dq_m0*qiQI[4]
+ Vji4 += dq_m0*qiQJ[1]
+ # Q-D m0
+ Vij4 -= dq_m0*qiQI[1]
+ Vji1 -= dq_m0*qiQJ[4]
+ # D-Q m1
+ Vij2 = Vij2 + dq_m1*qiQI[5]
+ Vji5 = dq_m1*qiQJ[2]
+ Vij3 += dq_m1*qiQI[6]
+ Vji6 = dq_m1*qiQJ[3]
+ Vij5 = -(dq_m1*qiQI[2])
+ Vji2 += -(dq_m1*qiQJ[5])
+ Vij6 = -(dq_m1*qiQI[3])
+ Vji3 += -(dq_m1*qiQJ[6])
+ # Q-Q m0
+ Vij4 += qq_m0*qiQI[4]
+ Vji4 += qq_m0*qiQJ[4]
+ # Q-Q m1
+ Vij5 += qq_m1*qiQI[5]
+ Vji5 += qq_m1*qiQJ[5]
+ Vij6 += qq_m1*qiQI[6]
+ Vji6 += qq_m1*qiQJ[6]
+ # Q-Q m2
+ Vij7 = qq_m2*qiQI[7]
+ Vji7 = qq_m2*qiQJ[7]
+ Vij8 = qq_m2*qiQI[8]
+ Vji8 = qq_m2*qiQJ[8]
+ # Q-Uind
+ if lpol:
+ Vji4 += udq_m0*qiUindJ[0]
+ Vij4 -= udq_m0*qiUindI[0]
+ Vji5 += udq_m1*qiUindJ[1]
+ Vji6 += udq_m1*qiUindJ[2]
+ Vij5 -= udq_m1*qiUindI[1]
+ Vij6 -= udq_m1*qiUindI[2]
+
+ # Uind - Uind
+ if lpol:
+ Vij1dd = udud_m0 * qiUindI[0]
+ Vji1dd = udud_m0 * qiUindJ[0]
+ Vij2dd = udud_m1 * qiUindI[1]
+ Vji2dd = udud_m1 * qiUindJ[1]
+ Vij3dd = udud_m1 * qiUindI[2]
+ Vji3dd = udud_m1 * qiUindJ[2]
+ Vijdd = jnp.stack(( Vij1dd, Vij2dd, Vij3dd))
+ Vjidd = jnp.stack(( Vji1dd, Vji2dd, Vji3dd))
+
+ if lmax == 0:
+ Vij = Vij0
+ Vji = Vji0
+ elif lmax == 1:
+ Vij = jnp.stack((Vij0, Vij1, Vij2, Vij3))
+ Vji = jnp.stack((Vji0, Vji1, Vji2, Vji3))
+ elif lmax == 2:
+ Vij = jnp.stack((Vij0, Vij1, Vij2, Vij3, Vij4, Vij5, Vij6, Vij7, Vij8))
+ Vji = jnp.stack((Vji0, Vji1, Vji2, Vji3, Vji4, Vji5, Vji6, Vji7, Vji8))
+ else:
+ print('Error: Lmax must <= 2')
+
+ if lpol:
+ return jnp.array(0.5) * (jnp.sum(qiQJ*Vij) + jnp.sum(qiQI*Vji)) + jnp.array(0.5) * (jnp.sum(qiUindJ*Vijdd) + jnp.sum(qiUindI*Vjidd))
+ else:
+ return jnp.array(0.5) * (jnp.sum(qiQJ*Vij) + jnp.sum(qiQI*Vji))
+
+
+# @jit_condition(static_argnums=(7))
+def pme_real(positions, box, pairs,
+ Q_global, Uind_global, pol, tholes,
+ mScales, pScales, dScales, covalent_map,
+ kappa, lmax, lpol):
+ '''
+ This is the real space PME calculate function
+ NOTE: only deals with permanent-permanent multipole interactions
+ It expands the pairwise parameters, and then invoke pme_real_kernel
+ It seems pointless to jit it:
+ 1. the heavy-lifting kernel function is jitted and vmapped
+ 2. len(pairs) keeps changing throughout the simulation, the function would just recompile everytime
+
+ Input:
+ positions:
+ Na * 3: positions
+ box:
+ 3 * 3: box, axes arranged in row
+ pairs:
+ Np * 2: interacting pair indices
+ Q_global:
+ Na * (l+1)**2: harmonics multipoles of each atom, in global frame
+ Uind_global:
+ Na * 3: harmonic induced dipoles, in global frame
+ pol:
+ (Na,): polarizabilities
+ tholes:
+ (Na,): thole damping parameters
+ mScales:
+ (Nexcl,): permanent multipole-multipole interaction exclusion scalings: 1-2, 1-3 ...
+ covalent_map:
+ Na * Na: topological distances between atoms, if i, j are topologically distant, then covalent_map[i, j] == 0
+ kappa:
+ float: kappa in A^-1
+ lmax:
+ int: maximum L
+ lpol:
+ Bool: whether do a polarizable calculation?
+
+ Output:
+ ene: pme realspace energy
+ '''
+
+ # expand pairwise parameters, from atomic parameters
+ pairs = pairs[pairs[:, 0] < pairs[:, 1]]
+ box_inv = jnp.linalg.inv(box)
+ r1 = distribute_v3(positions, pairs[:, 0])
+ r2 = distribute_v3(positions, pairs[:, 1])
+ # r1 = positions[pairs[:, 0]]
+ # r2 = positions[pairs[:, 1]]
+ Q_extendi = distribute_multipoles(Q_global, pairs[:, 0])
+ Q_extendj = distribute_multipoles(Q_global, pairs[:, 1])
+ # Q_extendi = Q_global[pairs[:, 0]]
+ # Q_extendj = Q_global[pairs[:, 1]]
+ nbonds = covalent_map[pairs[:, 0], pairs[:, 1]]
+ indices = nbonds-1
+ mscales = distribute_scalar(mScales, indices)
+ # mscales = mScales[nbonds-1]
+ if lpol:
+ pol1 = distribute_scalar(pol, pairs[:, 0])
+ pol2 = distribute_scalar(pol, pairs[:, 1])
+ thole1 = distribute_scalar(tholes, pairs[:, 0])
+ thole2 = distribute_scalar(tholes, pairs[:, 1])
+ Uind_extendi = distribute_v3(Uind_global, pairs[:, 0])
+ Uind_extendj = distribute_v3(Uind_global, pairs[:, 1])
+ pscales = distribute_scalar(pScales, indices)
+ dscales = distribute_scalar(dScales, indices)
+ # pol1 = pol[pairs[:,0]]
+ # pol2 = pol[pairs[:,1]]
+ # thole1 = tholes[pairs[:,0]]
+ # thole2 = tholes[pairs[:,1]]
+ # Uind_extendi = Uind_global[pairs[:, 0]]
+ # Uind_extendj = Uind_global[pairs[:, 1]]
+ # pscales = pScales[nbonds-1]
+ # dscales = dScales[nbonds-1]
+ dmp = get_pair_dmp(pol1, pol2)
+ else:
+ Uind_extendi = None
+ Uind_extendj = None
+ pscales = None
+ dscales = None
+ thole1 = None
+ thole2 = None
+ dmp = None
+
+ # deals with geometries
+ dr = r1 - r2
+ dr = v_pbc_shift(dr, box, box_inv)
+ norm_dr = jnp.linalg.norm(dr, axis=-1)
+ Ri = build_quasi_internal(r1, r2, dr, norm_dr)
+ qiQI = rot_global2local(Q_extendi, Ri, lmax)
+ qiQJ = rot_global2local(Q_extendj, Ri, lmax)
+ if lpol:
+ qiUindI = rot_ind_global2local(Uind_extendi, Ri)
+ qiUindJ = rot_ind_global2local(Uind_extendj, Ri)
+ else:
+ qiUindI = None
+ qiUindJ = None
+
+ # everything should be pair-specific now
+ ene = jnp.sum(pme_real_kernel(norm_dr, qiQI, qiQJ, qiUindI, qiUindJ, thole1, thole2, dmp, mscales, pscales, dscales, kappa, lmax, lpol))
+
+ return ene
+
+
+@partial(vmap, in_axes=(0, 0), out_axes=(0))
+@jit_condition(static_argnums=())
+def get_pair_dmp(pol1, pol2):
+ return (pol1*pol2) ** (1/6)
+
+
+@jit_condition(static_argnums=(2))
+def pme_self(Q_h, kappa, lmax=2):
+ '''
+ This function calculates the PME self energy
+
+ Inputs:
+ Q:
+ Na * (lmax+1)^2: harmonic multipoles, local or global does not matter
+ kappa:
+ float: kappa used in PME
+
+ Output:
+ ene_self:
+ float: the self energy
+ '''
+ n_harms = (lmax + 1) ** 2
+ l_list = np.array([0] + [1,]*3 + [2,]*5)[:n_harms]
+ l_fac2 = np.array([1] + [3,]*3 + [15,]*5)[:n_harms]
+ factor = kappa/np.sqrt(np.pi) * (2*kappa**2)**l_list / l_fac2
+ return - jnp.sum(factor[np.newaxis] * Q_h**2) * DIELECTRIC
+
+
+@jit_condition(static_argnums=())
+def pol_penalty(U_ind, pol):
+ '''
+ The energy penalty for polarization of each site, currently only supports isotropic polarization:
+
+ Inputs:
+ U_ind:
+ Na * 3 float: induced dipoles, in isotropic polarization case, cartesian or harmonic does not matter
+ pol:
+ (Na,) float: polarizability
+ '''
+ # this is to remove the singularity when pol=0
+ pol_pi = trim_val_0(pol)
+ # pol_pi = pol/(jnp.exp((-pol+1e-08)*1e10)+1) + 1e-08/(jnp.exp((pol-1e-08)*1e10)+1)
+ return jnp.sum(0.5/pol_pi*(U_ind**2).T) * DIELECTRIC
+
+
+def validation(pdb):
+ xml = 'mpidwater.xml'
+ pdbinfo = read_pdb(pdb)
+ serials = pdbinfo['serials']
+ names = pdbinfo['names']
+ resNames = pdbinfo['resNames']
+ resSeqs = pdbinfo['resSeqs']
+ positions = pdbinfo['positions']
+ box = pdbinfo['box'] # a, b, c, α, β, γ
+ charges = pdbinfo['charges']
+ positions = jnp.asarray(positions)
+ lx, ly, lz, _, _, _ = box
+ box = jnp.eye(3)*jnp.array([lx, ly, lz])
+
+ mScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+ pScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+ dScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+
+ rc = 4 # in Angstrom
+ ethresh = 1e-4
+
+ n_atoms = len(serials)
+
+ atomTemplate, residueTemplate = read_xml(xml)
+ atomDicts, residueDicts = init_residues(serials, names, resNames, resSeqs, positions, charges, atomTemplate, residueTemplate)
+
+ Q = np.vstack(
+ [(atom.c0, atom.dX*10, atom.dY*10, atom.dZ*10, atom.qXX*300, atom.qYY*300, atom.qZZ*300, atom.qXY*300, atom.qXZ*300, atom.qYZ*300) for atom in atomDicts.values()]
+ )
+ Q = jnp.array(Q)
+ Q_local = convert_cart2harm(Q, 2)
+ axis_type = np.array(
+ [atom.axisType for atom in atomDicts.values()]
+ )
+ axis_indices = np.vstack(
+ [atom.axis_indices for atom in atomDicts.values()]
+ )
+ covalent_map = assemble_covalent(residueDicts, n_atoms)
+
+
+ displacement_fn, shift_fn = space.periodic_general(box, fractional_coordinates=False)
+ neighbor_list_fn = partition.neighbor_list(displacement_fn, box, rc, 0, format=partition.OrderedSparse)
+ nbr = neighbor_list_fn.allocate(positions)
+ pairs = nbr.idx.T
+ # pairs = pairs[pairs[:, 0] < pairs[:, 1]]
+
+ lmax = 2
+
+
+ # Finish data preparation
+ # -------------------------------------------------------------------------------------
+ # kappa, K1, K2, K3 = setup_ewald_parameters(rc, ethresh, box)
+ # # for debugging
+ # kappa = 0.657065221219616
+ # construct_local_frames_fn = generate_construct_local_frames(axis_type, axis_indices)
+ # energy_force_pme = value_and_grad(energy_pme)
+ # e, f = energy_force_pme(positions, box, pairs, Q_local, mScales, pScales, dScales, covalent_map, construct_local_frames_fn, kappa, K1, K2, K3, lmax)
+ # print('ok')
+ # e, f = energy_force_pme(positions, box, pairs, Q_local, mScales, pScales, dScales, covalent_map, construct_local_frames_fn, kappa, K1, K2, K3, lmax)
+ # print(e)
+
+ pme_force = ADMPPmeForce(box, axis_type, axis_indices, covalent_map, rc, ethresh, lmax)
+ pme_force.update_env('kappa', 0.657065221219616)
+
+ E, F = pme_force.get_forces(positions, box, pairs, Q_local, mScales)
+ print('ok')
+ E, F = pme_force.get_forces(positions, box, pairs, Q_local, mScales)
+ print(E)
+ return
+
+
+# below is the validation code
+if __name__ == '__main__':
+ validation(sys.argv[1])
diff --git a/dmff/admp/recip.py b/dmff/admp/recip.py
new file mode 100755
index 000000000..d0932586f
--- /dev/null
+++ b/dmff/admp/recip.py
@@ -0,0 +1,550 @@
+
+import numpy as np
+import jax.numpy as jnp
+import jax.scipy as jsp
+from jax import jit
+from dmff.settings import DO_JIT
+from dmff.admp.pme import DIELECTRIC
+
+# for debug
+# from admp.parser import *
+# from admp.multipole import *
+# from admp.spatial import *
+# from admp.pme import *
+# from jax.config import config
+# config.update("jax_enable_x64", True)
+
+sqrt_pi = 1.7724538509055159
+
+def generate_pme_recip(Ck_fn, kappa, gamma, pme_order, K1, K2, K3, lmax):
+
+ # Currently only supports pme_order=6
+ # Because only the 6-th order spline function is hard implemented
+ pme_order = 6
+ # global variables for the reciprocal module, all related to pme_order
+ bspline_range = jnp.arange(-pme_order//2, pme_order//2)
+ n_mesh = pme_order**3
+ shifts = jnp.array(jnp.meshgrid(bspline_range, bspline_range, bspline_range)).T.reshape((1, n_mesh, 3))
+
+ def pme_recip(positions, box, Q):
+ '''
+ The generated pme_recip space calculator
+ kappa, pme_order, K1, K2, K3, and lmax are passed and fixed when the calculator is generated
+ '''
+
+ def get_recip_vectors(N, box):
+ """
+ Computes reciprocal lattice vectors of the grid
+
+ Input:
+ N:
+ (3,)-shaped array, (K1, K2, K3)
+ box:
+ 3 x 3 matrix, box parallelepiped vectors arranged in TODO rows or columns?
+
+ Output:
+ Nj_Aji_star:
+ 3 x 3 matrix, the first index denotes reciprocal lattice vector, the second index is the component xyz.
+ (lattice vectors arranged in rows)
+ """
+ Nj_Aji_star = (N.reshape((1, 3)) * jnp.linalg.inv(box)).T
+ return Nj_Aji_star
+
+
+ def u_reference(R_a, Nj_Aji_star):
+ """
+ Each atom is meshed to dispersion_ORDER**3 points on the m-meshgrid.
+ This function computes the xyz-index of the reference point, which is the point on the meshgrid just above atomic coordinates,
+ and the corresponding values of xyz fractional displacements from real coordinate to the reference point.
+
+ Inputs:
+ R_a:
+ N_a * 3 matrix containing positions of sites
+ Nj_Aji_star:
+ 3 x 3 matrix, the first index denotes reciprocal lattice vector, the second index is the component xyz.
+ (lattice vectors arranged in rows)
+
+ Outputs:
+ m_u0:
+ N_a * 3 matrix, positions of the reference points of R_a on the m-meshgrid
+ u0:
+ N_a * 3 matrix, (R_a - R_m)*a_star values
+ """
+ R_in_m_basis = jnp.einsum("ij,kj->ki", Nj_Aji_star, R_a)
+ m_u0 = jnp.ceil(R_in_m_basis).astype(int)
+ u0 = (m_u0 - R_in_m_basis) + pme_order/2
+ return m_u0, u0
+
+ def bspline(u, order=pme_order):
+ """
+ Computes the cardinal B-spline function
+ """
+ if order == 6:
+ return jnp.piecewise(u,
+ [jnp.logical_and(u>=0, u<1.),
+ jnp.logical_and(u>=1, u<2.),
+ jnp.logical_and(u>=2, u<3.),
+ jnp.logical_and(u>=3, u<4.),
+ jnp.logical_and(u>=4, u<5.),
+ jnp.logical_and(u>=5, u<6.)],
+ [lambda u: u**5/120,
+ lambda u: u**5/120 - (u - 1)**5/20,
+ lambda u: u**5/120 + (u - 2)**5/8 - (u - 1)**5/20,
+ lambda u: u**5/120 - (u - 3)**5/6 + (u - 2)**5/8 - (u - 1)**5/20,
+ lambda u: u**5/24 - u**4 + 19*u**3/2 - 89*u**2/2 + 409*u/4 - 1829/20,
+ lambda u: -u**5/120 + u**4/4 - 3*u**3 + 18*u**2 - 54*u + 324/5] )
+
+
+ def bspline_prime(u, order=pme_order):
+ """
+ Computes first derivative of the cardinal B-spline function
+ """
+ if order == 6:
+ return jnp.piecewise(u,
+ [jnp.logical_and(u>=0., u<1.),
+ jnp.logical_and(u>=1., u<2.),
+ jnp.logical_and(u>=2., u<3.),
+ jnp.logical_and(u>=3., u<4.),
+ jnp.logical_and(u>=4., u<5.),
+ jnp.logical_and(u>=5., u<6.)],
+ [lambda u: u**4/24,
+ lambda u: u**4/24 - (u - 1)**4/4,
+ lambda u: u**4/24 + 5*(u - 2)**4/8 - (u - 1)**4/4,
+ lambda u: -5*u**4/12 + 6*u**3 - 63*u**2/2 + 71*u - 231/4,
+ lambda u: 5*u**4/24 - 4*u**3 + 57*u**2/2 - 89*u + 409/4,
+ lambda u: -u**4/24 + u**3 - 9*u**2 + 36*u - 54] )
+
+
+ def bspline_prime2(u, order=pme_order):
+ """
+ Computes second derivate of the cardinal B-spline function
+ """
+ if order == 6:
+ return jnp.piecewise(u,
+ [jnp.logical_and(u>=0., u<1.),
+ jnp.logical_and(u>=1., u<2.),
+ jnp.logical_and(u>=2., u<3.),
+ jnp.logical_and(u>=3., u<4.),
+ jnp.logical_and(u>=4., u<5.),
+ jnp.logical_and(u>=5., u<6.)],
+ [lambda u: u**3/6,
+ lambda u: u**3/6 - (u - 1)**3,
+ lambda u: 5*u**3/3 - 12*u**2 + 27*u - 19,
+ lambda u: -5*u**3/3 + 18*u**2 - 63*u + 71,
+ lambda u: 5*u**3/6 - 12*u**2 + 57*u - 89,
+ lambda u: -u**3/6 + 3*u**2 - 18*u + 36,] )
+
+
+ def theta_eval(u, M_u):
+ """
+ Evaluates the value of theta given 3D u values at ... points
+
+ Input:
+ u:
+ ... x 3 matrix
+
+ Output:
+ theta:
+ ... matrix
+ """
+ theta = jnp.prod(M_u, axis = -1)
+ return theta
+
+
+ def thetaprime_eval(u, Nj_Aji_star, M_u, Mprime_u):
+ """
+ First derivative of theta with respect to x,y,z directions
+
+ Input:
+ u
+ Nj_Aji_star:
+ reciprocal lattice vectors
+
+ Output:
+ N_a * 3 matrix
+ """
+
+ div = jnp.array([
+ Mprime_u[:, 0] * M_u[:, 1] * M_u[:, 2],
+ Mprime_u[:, 1] * M_u[:, 2] * M_u[:, 0],
+ Mprime_u[:, 2] * M_u[:, 0] * M_u[:, 1],
+ ]).T
+
+ # Notice that u = m_u0 - R_in_m_basis + 6/2
+ # therefore the Jacobian du_j/dx_i = - Nj_Aji_star
+ return jnp.einsum("ij,kj->ki", -Nj_Aji_star, div)
+
+
+ def theta2prime_eval(u, Nj_Aji_star, M_u, Mprime_u, M2prime_u):
+ """
+ compute the 3 x 3 second derivatives of theta with respect to xyz
+
+ Input:
+ u
+ Nj_Aji_star
+
+ Output:
+ N_A * 3 * 3
+ """
+
+ div_00 = M2prime_u[:, 0] * M_u[:, 1] * M_u[:, 2]
+ div_11 = M2prime_u[:, 1] * M_u[:, 0] * M_u[:, 2]
+ div_22 = M2prime_u[:, 2] * M_u[:, 0] * M_u[:, 1]
+
+ div_01 = Mprime_u[:, 0] * Mprime_u[:, 1] * M_u[:, 2]
+ div_02 = Mprime_u[:, 0] * Mprime_u[:, 2] * M_u[:, 1]
+ div_12 = Mprime_u[:, 1] * Mprime_u[:, 2] * M_u[:, 0]
+
+ div_10 = div_01
+ div_20 = div_02
+ div_21 = div_12
+
+ div = jnp.array([
+ [div_00, div_01, div_02],
+ [div_10, div_11, div_12],
+ [div_20, div_21, div_22],
+ ]).swapaxes(0, 2)
+
+ # Notice that u = m_u0 - R_in_m_basis + 6/2
+ # therefore the Jacobian du_j/dx_i = - Nj_Aji_star
+ return jnp.einsum("im,jn,kmn->kij", -Nj_Aji_star, -Nj_Aji_star, div)
+
+
+ def sph_harmonics_GO(u0, Nj_Aji_star):
+ '''
+ Find out the value of spherical harmonics GRADIENT OPERATORS, assume the order is:
+ 00, 10, 11c, 11s, 20, 21c, 21s, 22c, 22s, ...
+ Currently supports lmax <= 2
+
+ Inputs:
+ u0:
+ a N_a * 3 matrix containing all positions
+ Nj_Aji_star:
+ reciprocal lattice vectors in the m-grid
+ lmax:
+ int: max L
+
+ Output:
+ harmonics:
+ a Na * (6**3) * (l+1)^2 matrix, STGO operated on theta,
+ evaluated at 6*6*6 integer points about reference points m_u0
+ '''
+
+ n_harm = int((lmax + 1)**2)
+
+ N_a = u0.shape[0]
+ # mesh points around each site
+ u = (u0[:, jnp.newaxis, :] + shifts).reshape((N_a*n_mesh, 3))
+
+ M_u = bspline(u)
+ theta = theta_eval(u, M_u)
+ if lmax == 0:
+ return theta.reshape(N_a, n_mesh, n_harm)
+
+ # dipole
+ Mprime_u = bspline_prime(u)
+ thetaprime = thetaprime_eval(u, Nj_Aji_star, M_u, Mprime_u)
+ harmonics_1 = jnp.stack(
+ [theta,
+ thetaprime[:, 2],
+ thetaprime[:, 0],
+ thetaprime[:, 1]],
+ axis = -1
+ )
+
+ if lmax == 1:
+ return harmonics_1.reshape(N_a, n_mesh, n_harm)
+
+ # quadrapole
+ M2prime_u = bspline_prime2(u)
+ theta2prime = theta2prime_eval(u, Nj_Aji_star, M_u, Mprime_u, M2prime_u)
+ rt3 = jnp.sqrt(3)
+ harmonics_2 = jnp.hstack(
+ [harmonics_1,
+ jnp.stack([(3*theta2prime[:,2,2] - jnp.trace(theta2prime, axis1=1, axis2=2)) / 2,
+ rt3 * theta2prime[:, 0, 2],
+ rt3 * theta2prime[:, 1, 2],
+ rt3/2 * (theta2prime[:, 0, 0] - theta2prime[:, 1, 1]),
+ rt3 * theta2prime[:, 0, 1]], axis = 1)]
+ )
+ if lmax == 2:
+ return harmonics_2.reshape(N_a, n_mesh, n_harm)
+ else:
+ raise NotImplementedError('l > 2 (beyond quadrupole) not supported')
+
+
+ def Q_m_peratom(Q, sph_harms):
+ """
+ Computes . See eq. (49) of https://doi.org/10.1021/ct5007983
+
+ Inputs:
+ Q:
+ N_a * (l+1)**2 matrix containing global frame multipole moments up to lmax,
+ sph_harms:
+ N_a, 216, (l+1)**2
+ lmax:
+ int: maximal L
+
+ Output:
+ Q_m_pera:
+ N_a * 216 matrix, values of theta evaluated on a 6 * 6 block about the atoms
+ """
+
+ N_a = sph_harms.shape[0]
+
+ if lmax > 2:
+ raise NotImplementedError('l > 2 (beyond quadrupole) not supported')
+
+ Q_dbf = Q[:, 0:1]
+
+ if lmax >= 1:
+ Q_dbf = jnp.hstack([Q_dbf, Q[:,1:4]])
+ if lmax >= 2:
+ Q_dbf = jnp.hstack([Q_dbf, Q[:,4:9]/3])
+
+ Q_m_pera = jnp.sum(Q_dbf[:,jnp.newaxis,:]* sph_harms, axis=2)
+
+ assert Q_m_pera.shape == (N_a, n_mesh)
+ return Q_m_pera
+
+
+ def Q_mesh_on_m(Q_mesh_pera, m_u0, N):
+ """
+ Reduce the local Q_m_peratom into the global mesh
+
+ Input:
+ Q_mesh_pera, m_u0, N
+
+ Output:
+ Q_mesh:
+ Nx * Ny * Nz matrix
+ """
+ indices_arr = jnp.mod(m_u0[:,np.newaxis,:]+shifts, N[np.newaxis, np.newaxis, :])
+ ### jax trick implementation without using for loop
+ ### NOTICE: this implementation does not work with numpy!
+ Q_mesh = jnp.zeros((N[0], N[1], N[2]))
+ Q_mesh = Q_mesh.at[indices_arr[:, :, 0], indices_arr[:, :, 1], indices_arr[:, :, 2]].add(Q_mesh_pera)
+ return Q_mesh
+
+
+ def setup_kpts_integer(N):
+ """
+ Outputs:
+ kpts_int:
+ n_k * 3 matrix, n_k = N[0] * N[1] * N[2]
+ """
+ N_half = N.reshape(3)
+ kx, ky, kz = [jnp.roll(jnp.arange(- (N_half[i] - 1) // 2, (N_half[i] + 1) // 2 ), - (N_half[i] - 1) // 2) for i in range(3)]
+ kpts_int = jnp.hstack([ki.flatten()[:,jnp.newaxis] for ki in jnp.meshgrid(kz, kx, ky)])
+ return kpts_int
+
+
+ def setup_kpts(box, kpts_int):
+ '''
+ This function sets up the k-points used for reciprocal space calculations
+
+ Input:
+ box:
+ 3 * 3, three axis arranged in rows
+ kpts_int:
+ n_k * 3 matrix
+
+ Output:
+ kpts:
+ 4 * K, K=K1*K2*K3, contains kx, ky, kz, k^2 for each kpoint
+ '''
+ # in this array, a*, b*, c* (without 2*pi) are arranged in column
+ box_inv = jnp.linalg.inv(box)
+ # K * 3, coordinate in reciprocal space
+ kpts = 2 * jnp.pi * kpts_int.dot(box_inv)
+ ksq = jnp.sum(kpts**2, axis=1)
+ # 4 * K
+ kpts = jnp.hstack((kpts, ksq[:, jnp.newaxis])).T
+ return kpts
+
+
+ def spread_Q(positions, box, Q):
+ '''
+ This is the high level wrapper function, in charge of spreading the charges/multipoles on grid
+
+ Input:
+ positions:
+ Na * 3: positions of each site
+ box:
+ 3 * 3: box
+ Q:
+ Na * (lmax+1)**2: the multipole of each site in global frame
+
+ Output:
+ Q_mesh:
+ K1 * K2 * K3: the meshed multipoles
+
+ '''
+ Nj_Aji_star = get_recip_vectors(N, box)
+ # For each atom, find the reference mesh point, and u position of the site
+ m_u0, u0 = u_reference(positions, Nj_Aji_star)
+ # find out the STGO values of each grid point
+ sph_harms = sph_harmonics_GO(u0, Nj_Aji_star)
+ # find out the local meshed values for each site
+ Q_mesh_pera = Q_m_peratom(Q, sph_harms)
+ return Q_mesh_on_m(Q_mesh_pera, m_u0, N)
+
+ # spread Q
+ N = np.array([K1, K2, K3])
+ Q_mesh = spread_Q(positions, box, Q)
+ N = N.reshape(1, 1, 3)
+ kpts_int = setup_kpts_integer(N)
+ kpts = setup_kpts(box, kpts_int)
+ m = jnp.linspace(-pme_order//2+1, pme_order//2-1, pme_order-1).reshape(pme_order-1, 1, 1)
+ # m = jnp.linspace(-2,2,5).reshape(5, 1, 1)
+ theta_k = jnp.prod(
+ jnp.sum(
+ bspline(m + pme_order/2) * jnp.cos(2*jnp.pi*m*kpts_int[jnp.newaxis] / N),
+ axis = 0
+ ),
+ axis = 1
+ )
+ V = jnp.linalg.det(box)
+ S_k = jnp.fft.fftn(Q_mesh).flatten()
+ # for electrostatic, need to exclude gamma point
+ # for dispersion, need to include gamma point
+ if not gamma:
+ C_k = Ck_fn(kpts[3, 1:], kappa, V)
+ E_k = C_k * jnp.abs(S_k[1:] / theta_k[1:])**2
+ else:
+ C_k = Ck_fn(kpts[3, :], kappa, V)
+ # debug
+ # for i in range(1000):
+ # print('%15.8f%15.8f'%(jnp.real(C_k[i]), jnp.imag(C_k[i])))
+ E_k = C_k * jnp.abs(S_k / theta_k)**2
+
+ if not gamma: # doing electrics
+ return jnp.sum(E_k) * DIELECTRIC
+ else:
+ return jnp.sum(E_k)
+
+ if DO_JIT:
+ return jit(pme_recip, static_argnums=())
+ else:
+ return pme_recip
+
+
+def Ck_1(ksq, kappa, V):
+ return 2*jnp.pi/V/ksq * jnp.exp(-ksq/4/kappa**2)
+
+def Ck_6(ksq, kappa, V):
+ x2 = ksq / 4 / kappa**2
+ x = jnp.sqrt(x2)
+ x3 = x2 * x
+ exp_x2 = jnp.exp(-x2)
+ f = (1 - 2*x2)*exp_x2 + 2*x3*sqrt_pi*jsp.special.erfc(x)
+ return sqrt_pi*jnp.pi/2/V*kappa**3 * f / 3
+
+def Ck_8(ksq, kappa, V):
+ x2 = ksq / 4 / kappa**2
+ x = jnp.sqrt(x2)
+ x4 = x2 * x2
+ x5 = x4 * x
+ exp_x2 = jnp.exp(-x2)
+ f = (3 - 2*x2 + 4*x4)*exp_x2 - 4*x5*sqrt_pi*jsp.special.erfc(x)
+ return sqrt_pi*jnp.pi/2/V*kappa**5 * f / 45
+
+def Ck_10(ksq, kappa, V):
+ x2 = ksq / 4 / kappa**2
+ x = jnp.sqrt(x2)
+ x4 = x2 * x2
+ x6 = x4 * x2
+ x7 = x6 * x
+ exp_x2 = jnp.exp(-x2)
+ f = (15 - 6*x2 + 4*x4 - 8*x6)*exp_x2 + 8*x7*sqrt_pi*jsp.special.erfc(x)
+ return sqrt_pi*jnp.pi/2/V*kappa**7 * f / 1260
+
+
+# def validation(pdb):
+# jnp.set_printoptions(precision=32, suppress=True)
+# xml = 'mpidwater.xml'
+# pdbinfo = read_pdb(pdb)
+# serials = pdbinfo['serials']
+# names = pdbinfo['names']
+# resNames = pdbinfo['resNames']
+# resSeqs = pdbinfo['resSeqs']
+# positions = pdbinfo['positions']
+# box = pdbinfo['box'] # a, b, c, α, β, γ
+# charges = pdbinfo['charges']
+# positions = jnp.asarray(positions)
+# lx, ly, lz, _, _, _ = box
+# box = jnp.eye(3)*jnp.array([lx, ly, lz])
+
+# rc = 4 # in Angstrom
+# ethresh = 1e-4
+
+# n_atoms = len(serials)
+
+# atomTemplate, residueTemplate = read_xml(xml)
+# atomDicts, residueDicts = init_residues(serials, names, resNames, resSeqs, positions, charges, atomTemplate, residueTemplate)
+
+# Q = np.vstack(
+# [(atom.c0, atom.dX*10, atom.dY*10, atom.dZ*10, atom.qXX*300, atom.qYY*300, atom.qZZ*300, atom.qXY*300, atom.qXZ*300, atom.qYZ*300) for atom in atomDicts.values()]
+# )
+# Q = jnp.array(Q)
+# Q_local = convert_cart2harm(Q, 2)
+# axis_type = np.array(
+# [atom.axisType for atom in atomDicts.values()]
+# )
+# axis_indices = np.vstack(
+# [atom.axis_indices for atom in atomDicts.values()]
+# )
+# covalent_map = assemble_covalent(residueDicts, n_atoms)
+
+
+# # invoke pme energy calculator
+# # energy_pme(positions, box, Q_local, axis_type, axis_indices, nbr.idx, 2)
+# lmax = 2
+# kappa, K1, K2, K3 = setup_ewald_parameters(rc, ethresh, box)
+# # for debugging
+# kappa = 0.657065221219616
+# construct_local_frames_fn = generate_construct_local_frames(axis_type, axis_indices)
+# local_frames = construct_local_frames_fn(positions, box)
+# Q_global = rot_local2global(Q_local, local_frames, lmax)
+
+# pme_order = 6
+# energy_force_pme_recip = value_and_grad(generate_pme_recip(Ck_1, kappa, False, pme_order, K1, K2, K3, lmax))
+# energy_force_pme_recip(positions, box, Q_global)
+# print('ok')
+# E, F = energy_force_pme_recip(positions, box, Q_global)
+# print(E)
+
+# # construct the C list
+# c_list = np.zeros((3,n_atoms))
+# nmol=int(n_atoms/3)
+# for i in range(nmol):
+# a = i*3
+# b = i*3+1
+# c = i*3+2
+# c_list[0][a]=37.19677405
+# c_list[0][b]=7.6111103
+# c_list[0][c]=7.6111103
+# c_list[1][a]=85.26810658
+# c_list[1][b]=11.90220148
+# c_list[1][c]=11.90220148
+# c_list[2][a]=134.44874488
+# c_list[2][b]=15.05074749
+# c_list[2][c]=15.05074749
+# energy_force_d6_recip = value_and_grad(generate_pme_recip(Ck_6, kappa, True, pme_order, K1, K2, K3, 0))
+# energy_force_d8_recip = value_and_grad(generate_pme_recip(Ck_8, kappa, True, pme_order, K1, K2, K3, 0))
+# energy_force_d10_recip = value_and_grad(generate_pme_recip(Ck_10, kappa, True, pme_order, K1, K2, K3, 0))
+# E6, F6 = energy_force_d6_recip(positions, box, c_list[0, :, jnp.newaxis])
+# E8, F6 = energy_force_d8_recip(positions, box, c_list[1, :, jnp.newaxis])
+# E10, F10 = energy_force_d10_recip(positions, box, c_list[2, :, jnp.newaxis])
+# print('ok')
+# E6, F6 = energy_force_d6_recip(positions, box, c_list[0, :, jnp.newaxis])
+# E8, F6 = energy_force_d8_recip(positions, box, c_list[1, :, jnp.newaxis])
+# E10, F10 = energy_force_d10_recip(positions, box, c_list[2, :, jnp.newaxis])
+# print(E6, E8, E10)
+# print(E6 + E8 + E10)
+# return
+
+
+# # validation code
+# if __name__ == '__main__':
+# validation(sys.argv[1])
diff --git a/dmff/admp/settings.py b/dmff/admp/settings.py
new file mode 100644
index 000000000..f08e88162
--- /dev/null
+++ b/dmff/admp/settings.py
@@ -0,0 +1,3 @@
+# DEFAULT THRESHOLDS
+POL_CONV = 10.0 # gradient convergence thresh for induced dipoles
+MAX_N_POL = 30 # maximum number of cyles for optimizing induced dipole
\ No newline at end of file
diff --git a/dmff/admp/spatial.py b/dmff/admp/spatial.py
new file mode 100644
index 000000000..caceb9f15
--- /dev/null
+++ b/dmff/admp/spatial.py
@@ -0,0 +1,179 @@
+
+import jax.numpy as jnp
+from jax import vmap, jit
+import numpy as np
+from functools import partial
+from dmff.settings import DO_JIT
+from dmff.utils import jit_condition
+
+# This module deals with spatial geometric operations, mainly including:
+# 1. PBC related operations
+# 2. Local frame rotation operations
+
+@jit_condition(static_argnums=())
+def pbc_shift(drvecs, box, box_inv):
+ '''
+ Dealing with the pbc shifts of vectors
+
+ Inputs:
+ rvecs:
+ N * 3, a list of real space vectors in Cartesian
+ box:
+ 3 * 3, box matrix, with axes arranged in rows
+ box_inv:
+ 3 * 3, inverse of box matrix
+
+ Outputs:
+ rvecs:
+ N * 3, vectors that have been shifted, in Cartesian
+ '''
+ unshifted_dsvecs = drvecs.dot(box_inv)
+ dsvecs = unshifted_dsvecs - jnp.floor(unshifted_dsvecs + 0.5)
+ return dsvecs.dot(box)
+
+v_pbc_shift = vmap(pbc_shift, in_axes=(0, None, None), out_axes=0)
+
+def normalize(matrix, axis=1, ord=2):
+ '''
+ Normalise a matrix along one dimension
+ '''
+ normalised = matrix / jnp.linalg.norm(matrix, axis=axis, keepdims=True, ord=ord)
+ return normalised
+
+
+def generate_construct_local_frames(axis_types, axis_indices):
+ """
+ Generates the local frame constructor, common to the same physical system
+
+ inputs:
+ axis_types:
+ N, a len(N) integer array, labels the types of localframe transformation rules for each atom.
+ axis_indices:
+ N * 3, indices of z,x,y atoms of the localframe of each atom.
+
+ outputs:
+ construct_local_frames:
+ function type (positions, box) -> local_frames
+ """
+ ZThenX = 0
+ Bisector = 1
+ ZBisect = 2
+ ThreeFold = 3
+ Zonly = 4
+ NoAxisType = 5
+ LastAxisTypeIndex = 6
+
+ z_atoms = jnp.array(axis_indices[:, 0])
+ x_atoms = jnp.array(axis_indices[:, 1])
+ y_atoms = jnp.array(axis_indices[:, 2])
+
+ Zonly_filter = (axis_types == Zonly)
+ not_Zonly_filter = jnp.logical_not(Zonly_filter)
+ Bisector_filter = (axis_types == Bisector)
+ ZBisect_filter = (axis_types == ZBisect)
+ ThreeFold_filter = (axis_types == ThreeFold)
+
+ def construct_local_frames(positions, box):
+ '''
+ This function constructs the local frames for each site
+
+ Inputs:
+ positions:
+ N * 3: the positions matrix
+ box:
+ Outputs:
+ #jichen:
+ #NOTE: It doesn't seem to return Q
+ Q:
+ N*(lmax+1)^2, the multipole moments in global harmonics.
+ local_frames:
+ N*3*3, the local frames, axes arranged in rows
+ '''
+
+ positions = jnp.array(positions)
+ n_sites = positions.shape[0]
+ box_inv = jnp.linalg.inv(box)
+
+ ### Process the x, y, z vectors according to local axis rules
+ vec_z = pbc_shift(positions[z_atoms] - positions, box, box_inv)
+ vec_z = normalize(vec_z)
+ vec_x = jnp.zeros((n_sites, 3))
+ vec_y = jnp.zeros((n_sites, 3))
+ # Z-Only
+ x_of_vec_z = jnp.round(jnp.abs(vec_z[:,0]))
+ vec_x_Zonly = jnp.array([1.-x_of_vec_z, x_of_vec_z, jnp.zeros_like(x_of_vec_z)]).T
+ vec_x = vec_x.at[Zonly_filter].set(vec_x_Zonly)
+ # for those that are not Z-Only, get normalized vecX
+ vec_x_not_Zonly = positions[x_atoms[not_Zonly_filter]] - positions[not_Zonly_filter]
+ vec_x_not_Zonly = pbc_shift(vec_x_not_Zonly, box, box_inv)
+
+ vec_x = vec_x.at[not_Zonly_filter].set(normalize(vec_x_not_Zonly, axis=1))
+ # Bisector
+ if np.sum(Bisector_filter) > 0:
+ vec_z_Bisector = vec_z[Bisector_filter] + vec_x[Bisector_filter]
+ vec_z = vec_z.at[Bisector_filter].set(normalize(vec_z_Bisector, axis=1))
+ # z-bisector
+ if np.sum(ZBisect_filter) > 0:
+ vec_y_ZBisect = positions[y_atoms[ZBisect_filter]] - positions[ZBisect_filter]
+ vec_y_ZBisect = pbc_shift(vec_y_ZBisect, box, box_inv)
+ vec_y_ZBisect = normalize(vec_y_ZBisect, axis=1)
+ vec_x_ZBisect = vec_x[ZBisect_filter] + vec_y_ZBisect
+ vec_x = vec_x.at[ZBisect_filter].set(normalize(vec_x_ZBisect, axis=1))
+ # ThreeFold
+ if np.sum(ThreeFold_filter) > 0:
+ vec_x_threeFold = vec_x[ThreeFold_filter]
+ vec_z_threeFold = vec_z[ThreeFold_filter]
+
+ vec_y_threeFold = positions[y_atoms[ThreeFold_filter]] - positions[ThreeFold_filter]
+ vec_y_threeFold = pbc_shift(vec_y_threeFold, box, box_inv)
+ vec_y_threeFold = normalize(vec_y_threeFold, axis=1)
+ vec_z_threeFold += (vec_x_threeFold + vec_y_threeFold)
+ vec_z_threeFold = normalize(vec_z_threeFold)
+
+ vec_y = vec_y.at[ThreeFold_filter].set(vec_y_threeFold)
+ vec_z = vec_z.at[ThreeFold_filter].set(vec_z_threeFold)
+
+ # up to this point, z-axis should already be set up and normalized
+ xz_projection = jnp.sum(vec_x*vec_z, axis = 1, keepdims=True)
+ vec_x = normalize(vec_x - vec_z * xz_projection, axis=1)
+ # up to this point, x-axis should be ready
+ vec_y = jnp.cross(vec_z, vec_x)
+
+ return jnp.stack((vec_x, vec_y, vec_z), axis=1)
+
+ if DO_JIT:
+ return jit(construct_local_frames)
+ else:
+ return construct_local_frames
+
+@partial(vmap, in_axes=(0, 0, 0, 0), out_axes=0)
+@jit_condition(static_argnums=())
+def build_quasi_internal(r1, r2, dr, norm_dr):
+ '''
+ Build the quasi-internal frame between a pair of sites
+ In this frame, the z-axis is pointing from r2 to r1
+
+ Input:
+ r1:
+ N * 3, positions of the first vector
+ r2:
+ N * 3, positions of the second vector
+ dr:
+ N * 3, vector pointing from r1 to r2
+ norm_dr:
+ (N,), distances between r1 and r2
+
+ Output:
+ local_frames:
+ N * 3 * 3: local frames, three axes arranged in rows
+ '''
+ vectorZ = dr/norm_dr
+ # vectorX = jnp.where(jnp.logical_or(r1[:, 1] != r2[:, 1], r1[:, 2]!=r2[:, 2]).reshape((-1, 1)), vectorZ+jnp.array([1., 0., 0.]), vectorZ + jnp.array([0., 1., 0.]))
+ vectorX = jnp.where(jnp.logical_or(r1[1]!=r2[1], r1[2]!=r2[2]), vectorZ + jnp.array([1., 0., 0.]), vectorZ + jnp.array([0., 1., 0.]))
+ # dot = jnp.sum(vectorZ * vectorX, axis=1)
+ dot_xz = jnp.dot(vectorZ, vectorX)
+ vectorX -= vectorZ * dot_xz
+ vectorX = vectorX / jnp.linalg.norm(vectorX)
+ vectorY = jnp.cross(vectorZ, vectorX)
+ return jnp.stack([vectorX, vectorY, vectorZ])
+
diff --git a/dmff/api.py b/dmff/api.py
new file mode 100644
index 000000000..8d612ed51
--- /dev/null
+++ b/dmff/api.py
@@ -0,0 +1,514 @@
+#!/usr/bin/env python
+import openmm.app as app
+import openmm.unit as unit
+import numpy as np
+import jax.numpy as jnp
+from collections import defaultdict
+from .admp.disp_pme import ADMPDispPmeForce
+from .admp.multipole import convert_cart2harm, rot_local2global
+from .admp.pairwise import TT_damping_qq_c6_kernel, generate_pairwise_interaction
+from .admp.pme import ADMPPmeForce
+from .admp.spatial import generate_construct_local_frames
+from .admp.recip import Ck_1, generate_pme_recip
+from jax_md import space, partition
+from jax import grad
+import linecache
+
+
+
+def get_line_context(file_path, line_number):
+ return linecache.getline(file_path,line_number).strip()
+
+
+def build_covalent_map(data, max_neighbor):
+ n_atoms = len(data.atoms)
+ covalent_map = np.zeros((n_atoms, n_atoms), dtype=int)
+ for bond in data.bonds:
+ covalent_map[bond.atom1, bond.atom2] = 1
+ covalent_map[bond.atom2, bond.atom1] = 1
+ for n_curr in range(1, max_neighbor):
+ for i in range(n_atoms):
+ # current neighbors
+ j_list = np.where(
+ np.logical_and(covalent_map[i] <= n_curr, covalent_map[i] > 0)
+ )[0]
+ for j in j_list:
+ k_list = np.where(covalent_map[j] == 1)[0]
+ for k in k_list:
+ if k != i and k not in j_list:
+ covalent_map[i, k] = n_curr + 1
+ covalent_map[k, i] = n_curr + 1
+ return covalent_map
+
+
+def set_axis_type(map_atomtypes, types, params):
+
+ ZThenX = 0
+ Bisector = 1
+ ZBisect = 2
+ ThreeFold = 3
+ Zonly = 4
+ NoAxisType = 5
+ LastAxisTypeIndex = 6
+ kStrings = ["kz", "kx", "ky"]
+ axisIndices = []
+ axisTypes = []
+
+ for i in map_atomtypes:
+ atomType = types[i]
+
+ kIndices = [atomType]
+
+ for kString in kStrings:
+ kString_value = params[kString][i]
+ if kString_value != "":
+ kIndices.append(kString_value)
+ axisIndices.append(kIndices)
+
+ # set axis type
+
+ kIndicesLen = len(kIndices)
+
+ if kIndicesLen > 3:
+ ky = kIndices[3]
+ kyNegative = False
+ if ky.startswith("-"):
+ ky = kIndices[3] = ky[1:]
+ kyNegative = True
+ else:
+ ky = ""
+
+ if kIndicesLen > 2:
+ kx = kIndices[2]
+ kxNegative = False
+ if kx.startswith("-"):
+ kx = kIndices[2] = kx[1:]
+ kxNegative = True
+ else:
+ kx = ""
+
+ if kIndicesLen > 1:
+ kz = kIndices[1]
+ kzNegative = False
+ if kz.startswith("-"):
+ kz = kIndices[1] = kz[1:]
+ kzNegative = True
+ else:
+ kz = ""
+
+ while len(kIndices) < 4:
+ kIndices.append("")
+
+ axisType = ZThenX
+ if not kz:
+ axisType = NoAxisType
+ if kz and not kx:
+ axisType = Zonly
+ if kz and kzNegative or kx and kxNegative:
+ axisType = Bisector
+ if kx and kxNegative and ky and kyNegative:
+ axisType = ZBisect
+ if kz and kzNegative and kx and kxNegative and ky and kyNegative:
+ axisType = ThreeFold
+
+ axisTypes.append(axisType)
+
+ return np.array(axisTypes), np.array(axisIndices)
+
+
+class ADMPDispGenerator:
+ def __init__(self, hamiltonian):
+ self.ff = hamiltonian
+ self.params = {"A": [], "B": [], "Q": [], "C6": [], "C8": [], "C10": []}
+ self._jaxPotential = None
+ self.types = []
+ self.ethresh = 1.0e-5
+ self.pmax = 10
+
+ def registerAtomType(self, atom):
+ self.types.append(atom["type"])
+ self.params["A"].append(float(atom["A"]))
+ self.params["B"].append(float(atom["B"]))
+ self.params["Q"].append(float(atom["Q"]))
+ self.params["C6"].append(float(atom["C6"]))
+ self.params["C8"].append(float(atom["C8"]))
+ self.params["C10"].append(float(atom["C10"]))
+
+ @staticmethod
+ def parseElement(element, hamiltonian):
+ generator = ADMPDispGenerator(hamiltonian)
+ hamiltonian.registerGenerator(generator)
+ # covalent scales
+ mScales = []
+ for i in range(2, 7):
+ mScales.append(float(element.attrib["mScale1%d" % i]))
+ generator.params["mScales"] = mScales
+ for atomtype in element.findall("Atom"):
+ generator.registerAtomType(atomtype.attrib)
+ # jax it!
+ for k in generator.params.keys():
+ generator.params[k] = jnp.array(generator.params[k])
+ generator.types = np.array(generator.types)
+
+ def createForce(self, system, data, nonbondedMethod, nonbondedCutoff, args):
+
+ n_atoms = len(data.atoms)
+ # build index map
+ map_atomtype = np.zeros(n_atoms, dtype=int)
+ for i in range(n_atoms):
+ atype = data.atomType[data.atoms[i]]
+ map_atomtype[i] = np.where(self.types == atype)[0][0]
+ # build covalent map
+ covalent_map = build_covalent_map(data, 6)
+
+ # here box is only used to setup ewald parameters, no need to be differentiable
+ a, b, c = system.getDefaultPeriodicBoxVectors()
+ box = jnp.array([a._value, b._value, c._value]) * 10
+ # get the admp calculator
+ rc = nonbondedCutoff.value_in_unit(unit.angstrom)
+
+ # get calculator
+ Force_DispPME = ADMPDispPmeForce(box, covalent_map, rc, self.ethresh, self.pmax)
+ # debugging
+ # Force_DispPME.update_env('kappa', 0.657065221219616)
+ # Force_DispPME.update_env('K1', 96)
+ # Force_DispPME.update_env('K2', 96)
+ # Force_DispPME.update_env('K3', 96)
+ pot_fn_lr = Force_DispPME.get_energy
+ pot_fn_sr = generate_pairwise_interaction(
+ TT_damping_qq_c6_kernel, covalent_map, static_args={}
+ )
+
+ def potential_fn(positions, box, pairs, params):
+ mScales = params["mScales"]
+ a_list = (
+ params["A"][map_atomtype] / 2625.5
+ ) # kj/mol to au, as expected by TT_damping kernel
+ b_list = params["B"][map_atomtype] * 0.0529177249 # nm^-1 to au
+ q_list = params["Q"][map_atomtype]
+ c6_list = jnp.sqrt(params["C6"][map_atomtype] * 1e6)
+ c8_list = jnp.sqrt(params["C8"][map_atomtype] * 1e8)
+ c10_list = jnp.sqrt(params["C10"][map_atomtype] * 1e10)
+ c_list = jnp.vstack((c6_list, c8_list, c10_list))
+
+ E_sr = pot_fn_sr(
+ positions, box, pairs, mScales, a_list, b_list, q_list, c_list[0]
+ )
+ E_lr = pot_fn_lr(positions, box, pairs, c_list.T, mScales)
+ return E_sr - E_lr
+
+ self._jaxPotential = potential_fn
+ # self._top_data = data
+
+ def getJaxPotential(self):
+ return self._jaxPotential
+
+ def renderXML(self):
+ # generate xml force field file
+ pass
+
+
+# register all parsers
+app.forcefield.parsers["ADMPDispForce"] = ADMPDispGenerator.parseElement
+
+
+class ADMPPmeGenerator:
+ def __init__(self, hamiltonian):
+ self.ff = hamiltonian
+ self.kStrings = {
+ "kz": [],
+ "kx": [],
+ "ky": [],
+ }
+ self._input_params = {
+ "c0": [],
+ "dX": [],
+ "dY": [],
+ "dZ": [],
+ "qXX": [],
+ "qXY": [],
+ "qYY": [],
+ "qXZ": [],
+ "qYZ": [],
+ "qZZ": [],
+ "oXXX": [],
+ "oXXY": [],
+ "oXYY": [],
+ "oYYY": [],
+ "oXXZ": [],
+ "oXYZ": [],
+ "oYYZ": [],
+ "oXZZ": [],
+ "oYZZ": [],
+ "oZZZ": [],
+ "thole": [],
+ "polarizabilityXX": [],
+ "polarizabilityYY": [],
+ "polarizabilityZZ": []
+ }
+ # if more or optional input params
+ # self._input_params = defaultDict(list)
+ self._jaxPotential = None
+ self.types = []
+ self.ethresh = 1.0e-5
+ self.params = {}
+ self.lpol = False
+ self.ref_dip = ''
+
+ def registerAtomType(self, atom:dict):
+
+ self.types.append(atom.pop("type"))
+
+ kStrings = ["kz", "kx", "ky"]
+ for kString in kStrings:
+ if kString in atom:
+ self.kStrings[kString].append(atom.pop(kString))
+ else:
+ self.kStrings[kString].append("")
+
+ for k, v in atom.items():
+ self._input_params[k].append(float(v))
+
+ @staticmethod
+ def parseElement(element, hamiltonian):
+ generator = ADMPPmeGenerator(hamiltonian)
+ generator.lmax = int(element.attrib.get('lmax'))
+ generator.pmax = int(element.attrib.get('pmax'))
+
+ hamiltonian.registerGenerator(generator)
+
+ mScales = []
+ pScales = []
+ dScales = []
+ for i in range(2, 7):
+ mScales.append(float(element.attrib["mScale1%d" % i]))
+ pScales.append(float(element.attrib["pScale1%d" % i]))
+ dScales.append(float(element.attrib["dScale1%d" % i]))
+ generator.params["mScales"] = jnp.array(mScales)
+ generator.params["pScales"] = jnp.array(pScales)
+ generator.params["dScales"] = jnp.array(dScales)
+
+ if element.findall('Polarize'):
+ generator.lpol = True
+
+ for atomType in element.findall("Atom"):
+ atomAttrib = atomType.attrib
+ for polarInfo in element.findall("Polarize"):
+ polarAttrib = polarInfo.attrib
+ if polarInfo.attrib['type'] == atomAttrib['type']:
+ atomAttrib.update(polarAttrib)
+ break
+ generator.registerAtomType(atomAttrib)
+
+ for k in generator._input_params.keys():
+ generator._input_params[k] = jnp.array(generator._input_params[k])
+ generator.types = np.array(generator.types)
+
+ def createForce(self, system, data, nonbondedMethod, nonbondedCutoff, args):
+
+ n_atoms = len(data.atoms)
+ # build index map
+ map_atomtype = np.zeros(n_atoms, dtype=int)
+ for i in range(n_atoms):
+ atype = data.atomType[data.atoms[i]]
+ map_atomtype[i] = np.where(self.types == atype)[0][0]
+
+ # map atom multipole moments
+ p = self._input_params
+ Q = np.zeros((n_atoms, 10))
+ Q[:, 0] = p["c0"][map_atomtype]
+ Q[:, 1] = p["dX"][map_atomtype] * 10
+ Q[:, 2] = p["dY"][map_atomtype] * 10
+ Q[:, 3] = p["dZ"][map_atomtype] * 10
+ Q[:, 4] = p["qXX"][map_atomtype] * 300
+ Q[:, 5] = p["qYY"][map_atomtype] * 300
+ Q[:, 6] = p["qZZ"][map_atomtype] * 300
+ Q[:, 7] = p["qXY"][map_atomtype] * 300
+ Q[:, 8] = p["qXZ"][map_atomtype] * 300
+ Q[:, 9] = p["qYZ"][map_atomtype] * 300
+
+ # map polarization-related params
+ pol = jnp.vstack((p['polarizabilityXX'][map_atomtype], p['polarizabilityYY'][map_atomtype], p['polarizabilityZZ'][map_atomtype])).T.astype(jnp.float32)
+ pol = 1000*jnp.mean(pol,axis=1)
+ self.params['pol'] = pol
+
+ tholes = jnp.array(p['thole'][map_atomtype]).astype(jnp.float32)
+ tholes = jnp.mean(jnp.atleast_2d(tholes), axis=1)
+ self.params['tholes'] = tholes
+
+ # defaultTholeWidth = 8
+ Uind_global = jnp.zeros([n_atoms,3])
+ ref_dip = self.ref_dip
+ for i in range(n_atoms):
+ a = get_line_context(ref_dip, i+1)
+ b = a.split()
+ t = np.array([10*float(b[0]),10*float(b[1]),10*float(b[2])])
+ Uind_global = Uind_global.at[i].set(t)
+
+ # construct the C list
+ c_list = np.zeros((3, n_atoms))
+ a_list = np.zeros(n_atoms)
+ q_list = np.zeros(n_atoms)
+ b_list = np.zeros(n_atoms)
+
+
+ nmol=int(n_atoms/3) # WARNING: HARD CODE!
+ for i in range(nmol):
+ a = i*3
+ b = i*3+1
+ c = i*3+2
+ # dispersion coeff
+ c_list[0][a]=37.19677405
+ c_list[0][b]=7.6111103
+ c_list[0][c]=7.6111103
+ c_list[1][a]=85.26810658
+ c_list[1][b]=11.90220148
+ c_list[1][c]=11.90220148
+ c_list[2][a]=134.44874488
+ c_list[2][b]=15.05074749
+ c_list[2][c]=15.05074749
+ # q
+ q_list[a] = -0.741706
+ q_list[b] = 0.370853
+ q_list[c] = 0.370853
+ # b, Bohr^-1
+ b_list[a] = 2.00095977
+ b_list[b] = 1.999519942
+ b_list[c] = 1.999519942
+ # a, Hartree
+ a_list[a] = 458.3777
+ a_list[b] = 0.0317
+ a_list[c] = 0.0317
+
+ # add all differentiable params to self.params
+ Q = jnp.array(Q)
+ Q_local = convert_cart2harm(Q, 2)
+ self.params["Q_local"] = Q_local
+ # here box is only used to setup ewald parameters, no need to be differentiable
+ a, b, c = system.getDefaultPeriodicBoxVectors()
+ box = jnp.array([a._value, b._value, c._value]) * 10
+
+ # get the admp calculator
+ rc = nonbondedCutoff.value_in_unit(unit.angstrom)
+
+ # build covalent map
+ covalent_map = build_covalent_map(data, 6)
+
+ # build intra-molecule axis
+ self.axis_types, self.axis_indices = set_axis_type(
+ map_atomtype, self.types, self.kStrings
+ )
+ map_axis_indices = []
+ # map axis_indices
+ for i in range(n_atoms):
+ catom = data.atoms[i]
+ residue = catom.residue._atoms
+ atom_indices = [
+ index if index != "" else -1 for index in self.axis_indices[i][1:]
+ ]
+ for atom in residue:
+ if atom == catom:
+ continue
+ for i in range(len(atom_indices)):
+ if atom_indices[i] == data.atomType[atom]:
+ atom_indices[i] = atom.index
+ break
+ map_axis_indices.append(atom_indices)
+
+ self.axis_indices = np.array(map_axis_indices)
+
+ # Finish data preparation
+ # -------------------------------------------------------------------------------------
+ # parameters should be ready:
+ # geometric variables: positions, box
+ # atomic parameters: Q_local, c_list
+ # topological parameters: covalent_map, mScales, pScales, dScales
+ # general force field setting parameters: rc, ethresh, lmax, pmax
+
+ pme_force = ADMPPmeForce(
+ box,
+ self.axis_types,
+ self.axis_indices,
+ covalent_map,
+ rc,
+ self.ethresh,
+ self.lmax,
+ self.lpol
+ )
+ self.params['U_ind'] = pme_force.U_ind
+
+
+ def potential_fn(positions, box, pairs, params):
+
+ mScales = params["mScales"]
+ Q_local = params["Q_local"]
+
+
+ # positions, box, pairs, Q_local, mScales
+ if self.lpol:
+ pScales = params["pScales"]
+ dScales = params["dScales"]
+ U_ind = params["U_ind"]
+ return pme_force.get_energy(positions, box, pairs, Q_local, pol, tholes, mScales, pScales, dScales, U_init=U_ind)
+ else:
+ return pme_force.get_energy(positions, box, pairs, Q_local, mScales)
+
+ self._jaxPotential = potential_fn
+
+ def getJaxPotential(self):
+ return self._jaxPotential
+
+ def renderXML(self):
+ pass
+
+
+app.forcefield.parsers["ADMPPmeForce"] = ADMPPmeGenerator.parseElement
+
+
+class Hamiltonian(app.forcefield.ForceField):
+ def __init__(self, xmlname):
+ super().__init__(xmlname)
+ self._potentials = []
+
+ def createPotential(
+ self,
+ topology,
+ nonbondedMethod=app.NoCutoff,
+ nonbondedCutoff=1.0 * unit.nanometer,
+ ):
+ system = self.createSystem(
+ topology, nonbondedMethod=nonbondedMethod, nonbondedCutoff=nonbondedCutoff
+ )
+ # load_constraints_from_system_if_needed
+ # create potentials
+ for generator in self._forces:
+ potentialImpl = generator.getJaxPotential()
+ self._potentials.append(potentialImpl)
+ return [p for p in self._potentials]
+
+
+if __name__ == "__main__":
+ H = Hamiltonian("forcefield.xml")
+ generator = H.getGenerators()[0]
+ app.Topology.loadBondDefinitions("residues.xml")
+ pdb = app.PDBFile("../water1024.pdb")
+ rc = 4.0
+ potentials = H.createPotential(pdb.topology, nonbondedCutoff=rc * unit.angstrom)
+ pot_disp = potentials[0]
+
+ positions = jnp.array(pdb.positions._value) * 10
+ a, b, c = pdb.topology.getPeriodicBoxVectors()
+ box = jnp.array([a._value, b._value, c._value]) * 10
+
+ # neighbor list
+ displacement_fn, shift_fn = space.periodic_general(
+ box, fractional_coordinates=False
+ )
+ neighbor_list_fn = partition.neighbor_list(
+ displacement_fn, box, rc, 0, format=partition.OrderedSparse
+ )
+ nbr = neighbor_list_fn.allocate(positions)
+ pairs = nbr.idx.T
+
+ param_grad = grad(pot_disp, argnums=3)(positions, box, pairs, generator.params)
+ print(param_grad)
diff --git a/dmff/settings.py b/dmff/settings.py
new file mode 100644
index 000000000..fa2e2bd92
--- /dev/null
+++ b/dmff/settings.py
@@ -0,0 +1,8 @@
+from jax.config import config
+
+PRECISION = 'double' # 'double'
+
+DO_JIT = True
+
+if PRECISION == 'double':
+ config.update("jax_enable_x64", True)
diff --git a/dmff/utils.py b/dmff/utils.py
new file mode 100644
index 000000000..6182b8123
--- /dev/null
+++ b/dmff/utils.py
@@ -0,0 +1,10 @@
+from dmff.settings import DO_JIT
+from jax import jit
+
+def jit_condition(*args, **kwargs):
+ def jit_deco(func):
+ if DO_JIT:
+ return jit(func, *args, **kwargs)
+ else:
+ return func
+ return jit_deco
\ No newline at end of file
diff --git a/docs/.gitkeep b/docs/about.md
similarity index 100%
rename from docs/.gitkeep
rename to docs/about.md
diff --git a/docs/admp/README.md b/docs/admp/README.md
new file mode 100644
index 000000000..9ca538f1a
--- /dev/null
+++ b/docs/admp/README.md
@@ -0,0 +1,68 @@
+# ADMP
+
+Automatic Differentiable Multipolar Polarizable (ADMP) force field calculator.
+
+This module provides an auto-differentiable implementation of multipolar polarizable force fields, that resembles the behavior of [MPID](https://github.com/andysim/MPIDOpenMMPlugin) plugin of OpenMM. Supposedly, this module is developed for the following purposes:
+
+1. Achieving an easy calculation of force and virial of the multipolar polarizable forcefield.
+2. Allowing fluctuating (geometric-dependent) multipoles/polarizabilities in multipolar polarizable potentials.
+3. Allowing the calculation of derivatives of various force field parameters, thus achieving a more systematic and automatic parameter optimization scheme.
+
+The module is based on [JAX](https://github.com/google/jax) and [JAX-MD](https://github.com/google/jax-md) projects.
+
+
+
+## Installation
+
+### Dependencies
+
+ADMP module depends on the following packages, install them before using ADMP:
+
+1. Install [jax](https://github.com/google/jax) (pick the correct cuda version, see more details on their installation guide):
+
+ ```bash
+ pip install jax[cuda11_cudnn82] -f https://storage.googleapis.com/jax-releases/jax_releases.html
+ ```
+
+2. Install [jax-md](https://github.com/google/jax-md) :
+
+ ```bash
+ pip install jax-md --upgrade
+ ```
+
+ ADMP currently relies on the space and partition modules to provide neighbor list
+
+3. Install ADMP:
+
+ ADMP is a pure python module, just simply put it in your $PYTHONPATH.
+
+ ```bash
+ export PYTHONPATH=$PYTHONPATH:/path/to/admp
+ ```
+
+
+
+## Settings
+
+In `admp/settings.py`, you can modify some global settings, including:
+
+**PRECISION**: single or double precision
+
+**DO_JIT**: whether do jit or not.
+
+
+
+## Example
+
+We provide a MPID 1024 water box example. In water_1024 and water_pol_1024, we show both the nonpolarizable and the polarizable cases.
+
+```bash
+cd ./examples/water_1024
+./run_admp.py
+
+cd ./examples/water_pol_1024
+./run_admp.py
+```
+
+if `DO_JIT = True`, then the first run would be a bit slow, since it tries to do the jit compilation. Further executions of `get_forces` or `get_energy` should be much faster.
+
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 000000000..000ea3455
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,17 @@
+# Welcome to MkDocs
+
+For full documentation visit [mkdocs.org](https://www.mkdocs.org).
+
+## Commands
+
+* `mkdocs new [dir-name]` - Create a new project.
+* `mkdocs serve` - Start the live-reloading docs server.
+* `mkdocs build` - Build the documentation site.
+* `mkdocs -h` - Print help message and exit.
+
+## Project layout
+
+ mkdocs.yml # The configuration file.
+ docs/
+ index.md # The documentation homepage.
+ ... # Other markdown pages, images and other files.
diff --git a/docs/uder_guide/tutorial.md b/docs/uder_guide/tutorial.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/examples/openmm_api/dipole_1024 b/examples/openmm_api/dipole_1024
new file mode 100644
index 000000000..e1de509e9
--- /dev/null
+++ b/examples/openmm_api/dipole_1024
@@ -0,0 +1,3072 @@
+-9.78037e-05 -0.0102743 -0.00835381
+0 0 0
+0 0 0
+0.0016815 0.00104498 0.00955635
+0 0 0
+0 0 0
+0.0104807 0.0153637 -0.00934142
+0 0 0
+0 0 0
+0.00268184 0.00663563 -0.00085569
+0 0 0
+0 0 0
+0.000439397 0.0120955 -0.00798317
+0 0 0
+0 0 0
+0.00757021 0.00274864 -0.00405105
+0 0 0
+0 0 0
+-0.00374424 -0.00805664 0.00310999
+0 0 0
+0 0 0
+0.00300064 0.00103427 -0.00607688
+0 0 0
+0 0 0
+-0.00513748 0.00259173 0.0138984
+0 0 0
+0 0 0
+0.00611206 0.00178956 0.00330758
+0 0 0
+0 0 0
+0.00309779 -0.0123237 -0.00151633
+0 0 0
+0 0 0
+0.0112893 -0.000925505 -0.00345641
+0 0 0
+0 0 0
+-0.00823225 0.00481008 -0.00517028
+0 0 0
+0 0 0
+0.0105862 -0.0173504 0.00505209
+0 0 0
+0 0 0
+0.00507972 0.00427566 0.00207499
+0 0 0
+0 0 0
+-0.0160562 -0.00375995 -0.000162321
+0 0 0
+0 0 0
+-0.00232523 0.00223238 -0.00650886
+0 0 0
+0 0 0
+0.00907927 0.00168353 -0.00335751
+0 0 0
+0 0 0
+0.000391106 -0.00560563 0.0039132
+0 0 0
+0 0 0
+-0.00129292 -0.0139697 -0.0130065
+0 0 0
+0 0 0
+0.00253837 -0.0116289 -0.00520366
+0 0 0
+0 0 0
+-0.00331825 -0.00396823 -0.00218062
+0 0 0
+0 0 0
+0.0009465 -0.00202349 -0.00330577
+0 0 0
+0 0 0
+-0.0110558 -0.000308164 -0.00228239
+0 0 0
+0 0 0
+0.0124406 -0.00204707 -0.00693733
+0 0 0
+0 0 0
+-0.00173319 -0.00331657 0.00166376
+0 0 0
+0 0 0
+-0.00273922 0.00197408 -0.00392151
+0 0 0
+0 0 0
+-0.00667702 0.00334124 -0.0126923
+0 0 0
+0 0 0
+0.00498793 0.00726738 0.00236643
+0 0 0
+0 0 0
+-0.0100955 -0.0112588 0.0042185
+0 0 0
+0 0 0
+0.0026019 0.000417779 -0.00626278
+0 0 0
+0 0 0
+0.00249888 -0.00228331 0.00721147
+0 0 0
+0 0 0
+0.00445673 0.000574593 -0.00796422
+0 0 0
+0 0 0
+-0.000312778 3.41629e-05 0.000317727
+0 0 0
+0 0 0
+-0.00392655 0.00947377 -0.0015633
+0 0 0
+0 0 0
+-0.00386247 -0.0115072 -0.00401078
+0 0 0
+0 0 0
+-0.00888192 0.00884608 -0.000281786
+0 0 0
+0 0 0
+0.00827756 0.00138916 0.000213653
+0 0 0
+0 0 0
+-0.00314245 0.00726788 -0.000613722
+0 0 0
+0 0 0
+0.00755656 0.00489949 -0.00309753
+0 0 0
+0 0 0
+-0.00633686 0.0115392 0.000473853
+0 0 0
+0 0 0
+0.00195559 0.00604159 -0.00785683
+0 0 0
+0 0 0
+0.00611166 -0.00239653 0.00120471
+0 0 0
+0 0 0
+-0.00724835 -0.00466115 -0.00739829
+0 0 0
+0 0 0
+0.00293285 0.000757116 -0.00542986
+0 0 0
+0 0 0
+-0.00321717 0.00587291 -0.00449816
+0 0 0
+0 0 0
+0.00852951 -0.0073382 0.000909686
+0 0 0
+0 0 0
+0.00462385 0.00435736 0.00220974
+0 0 0
+0 0 0
+-0.000210808 -0.0099051 -0.00681186
+0 0 0
+0 0 0
+0.00519537 0.00774189 0.00934357
+0 0 0
+0 0 0
+-0.00791618 -0.00701282 -0.00573458
+0 0 0
+0 0 0
+-0.00353672 0.00218662 0.00116191
+0 0 0
+0 0 0
+-0.000824194 0.00763499 0.0101212
+0 0 0
+0 0 0
+-0.00582191 0.00637928 0.00340626
+0 0 0
+0 0 0
+0.00135849 0.000574534 0.00486814
+0 0 0
+0 0 0
+0.00672225 0.00484596 0.00758249
+0 0 0
+0 0 0
+0.000442829 0.00999001 -0.00079784
+0 0 0
+0 0 0
+-0.00374611 -0.0162288 0.0117805
+0 0 0
+0 0 0
+-0.00257662 0.00363066 -0.00124877
+0 0 0
+0 0 0
+-0.000491337 -0.00467918 0.0066654
+0 0 0
+0 0 0
+-0.00798403 0.00187673 -0.000592901
+0 0 0
+0 0 0
+0.000873825 -0.00367945 -0.00136084
+0 0 0
+0 0 0
+-0.0124228 -0.00596143 -0.0102283
+0 0 0
+0 0 0
+-0.000180247 0.000531004 -0.00128713
+0 0 0
+0 0 0
+-0.00415982 -0.0141561 0.00939265
+0 0 0
+0 0 0
+-0.0100344 0.0038062 0.00366314
+0 0 0
+0 0 0
+0.00392728 -0.00100683 0.00206949
+0 0 0
+0 0 0
+0.0115188 0.00717167 -0.00074889
+0 0 0
+0 0 0
+0.00628949 0.00640248 0.000293654
+0 0 0
+0 0 0
+-0.00909805 -0.000491437 0.00161602
+0 0 0
+0 0 0
+-0.00177572 0.00675042 0.00826887
+0 0 0
+0 0 0
+-0.00197614 0.0110562 -0.00612657
+0 0 0
+0 0 0
+0.00971752 -0.00739067 0.00357604
+0 0 0
+0 0 0
+0.000195267 -0.00786269 0.00607746
+0 0 0
+0 0 0
+-0.0103708 0.00245087 -0.00041738
+0 0 0
+0 0 0
+0.00256772 0.00215356 -0.000762005
+0 0 0
+0 0 0
+0.00379047 -0.000474574 -0.00298218
+0 0 0
+0 0 0
+-0.000165421 -0.00055532 0.0148757
+0 0 0
+0 0 0
+0.0111802 0.0136549 -0.0320468
+0 0 0
+0 0 0
+0.0153225 -0.0103171 -0.00227375
+0 0 0
+0 0 0
+-0.00212336 0.00274542 -0.00933705
+0 0 0
+0 0 0
+0.00616534 0.0130132 5.47625e-05
+0 0 0
+0 0 0
+-0.00929046 0.00852819 -0.00192719
+0 0 0
+0 0 0
+-0.00241705 0.00226907 -0.00449038
+0 0 0
+0 0 0
+-0.00920485 -0.00746917 0.000557805
+0 0 0
+0 0 0
+-0.0058951 0.00506319 0.00270818
+0 0 0
+0 0 0
+0.00583662 -0.0012291 0.00289874
+0 0 0
+0 0 0
+0.0094816 0.0109469 0.00114495
+0 0 0
+0 0 0
+-0.00838529 -0.00821476 -0.00669953
+0 0 0
+0 0 0
+0.00484815 -0.00317928 0.00731462
+0 0 0
+0 0 0
+0.00497919 0.00490789 -0.00180653
+0 0 0
+0 0 0
+0.00854981 0.010314 -0.00320549
+0 0 0
+0 0 0
+-0.00415836 -0.00892292 -0.00167608
+0 0 0
+0 0 0
+-0.00813587 0.0118199 0.00557071
+0 0 0
+0 0 0
+-0.00374275 0.000783917 0.0064928
+0 0 0
+0 0 0
+0.00324764 0.00810909 0.00293951
+0 0 0
+0 0 0
+-0.00546086 -0.00241054 0.0110425
+0 0 0
+0 0 0
+-0.0138394 0.00240158 0.00286925
+0 0 0
+0 0 0
+0.00511851 -0.000957279 -0.00176611
+0 0 0
+0 0 0
+0.0115771 -0.00931405 0.00416637
+0 0 0
+0 0 0
+-0.00225243 0.00246387 -0.00268514
+0 0 0
+0 0 0
+0.00691816 -0.00831442 -0.00121352
+0 0 0
+0 0 0
+-0.0063306 -7.31156e-05 0.00572808
+0 0 0
+0 0 0
+0.00167653 0.000132109 0.00343913
+0 0 0
+0 0 0
+-0.0070473 -1.97325e-05 -0.00325234
+0 0 0
+0 0 0
+-0.00632247 0.00179402 -0.000831321
+0 0 0
+0 0 0
+0.0011576 0.00842738 0.0113516
+0 0 0
+0 0 0
+-0.00183084 -0.00155541 0.00883301
+0 0 0
+0 0 0
+0.00855752 0.00973545 -0.00203578
+0 0 0
+0 0 0
+0.00460251 -0.00150441 0.00506528
+0 0 0
+0 0 0
+0.00819739 -0.00207966 -0.0023709
+0 0 0
+0 0 0
+0.000726014 0.00133864 -0.00837828
+0 0 0
+0 0 0
+0.00369728 0.000264355 0.00346401
+0 0 0
+0 0 0
+-0.00573303 -3.45729e-05 -0.00555133
+0 0 0
+0 0 0
+-0.00605226 -0.00217764 -0.000867023
+0 0 0
+0 0 0
+0.00851709 0.00977362 0.00438207
+0 0 0
+0 0 0
+-0.00262633 0.00541108 -0.000277135
+0 0 0
+0 0 0
+-0.00421868 -0.00682932 -0.00906488
+0 0 0
+0 0 0
+-0.00142311 -0.0044121 -0.00267245
+0 0 0
+0 0 0
+0.000599986 -0.00220729 0.00549257
+0 0 0
+0 0 0
+0.00717203 -0.00041221 0.000839776
+0 0 0
+0 0 0
+0.00742294 0.00505202 -0.0103032
+0 0 0
+0 0 0
+-0.0111505 0.00713828 0.00812535
+0 0 0
+0 0 0
+-0.00696046 0.00317351 0.0191618
+0 0 0
+0 0 0
+-0.00271005 -0.00500413 -0.00472108
+0 0 0
+0 0 0
+0.00053514 0.00124973 0.00329028
+0 0 0
+0 0 0
+0.00563814 0.00313616 -0.00026369
+0 0 0
+0 0 0
+0.00595883 -0.00569338 -0.00611885
+0 0 0
+0 0 0
+0.00934765 -0.00487378 -0.00983422
+0 0 0
+0 0 0
+0.00666574 0.000534592 0.00150635
+0 0 0
+0 0 0
+-0.00220394 4.45494e-05 0.00307866
+0 0 0
+0 0 0
+-0.00300268 -0.00505015 -0.00646803
+0 0 0
+0 0 0
+-0.00426093 0.00399821 0.00430969
+0 0 0
+0 0 0
+1.48552e-05 -0.00805093 0.00708488
+0 0 0
+0 0 0
+0.00200509 -0.00705536 0.00506572
+0 0 0
+0 0 0
+-0.00122102 0.00183551 0.00300795
+0 0 0
+0 0 0
+0.00216416 -0.000855585 0.00626019
+0 0 0
+0 0 0
+-0.00305724 -0.00194739 -0.00753175
+0 0 0
+0 0 0
+0.00749589 -0.00599059 -0.00142094
+0 0 0
+0 0 0
+-0.0120168 -0.000174821 0.0115427
+0 0 0
+0 0 0
+-0.00466727 0.00351428 0.000158967
+0 0 0
+0 0 0
+0.00485732 0.00239818 0.00676465
+0 0 0
+0 0 0
+-0.00503949 0.006335 -0.00551739
+0 0 0
+0 0 0
+0.00171117 -0.00296434 -0.00286245
+0 0 0
+0 0 0
+0.0122505 0.00883528 0.000622401
+0 0 0
+0 0 0
+-0.00164902 0.0044269 -0.000943952
+0 0 0
+0 0 0
+-0.00284898 -0.0144255 0.00235835
+0 0 0
+0 0 0
+-0.0165456 0.00239321 0.00289284
+0 0 0
+0 0 0
+-0.00349088 0.018868 0.00731126
+0 0 0
+0 0 0
+0.0026674 0.00167464 0.00127276
+0 0 0
+0 0 0
+0.000301781 -0.00243539 0.00916902
+0 0 0
+0 0 0
+0.00395351 0.0048905 0.00153711
+0 0 0
+0 0 0
+0.0173634 -0.0051964 -0.00931404
+0 0 0
+0 0 0
+-0.000329681 0.00648045 -0.0215546
+0 0 0
+0 0 0
+-0.00381817 -0.00415355 -0.00564167
+0 0 0
+0 0 0
+-0.00607825 0.0247509 -0.00142847
+0 0 0
+0 0 0
+0.0127189 0.00414365 -0.00481488
+0 0 0
+0 0 0
+0.0091679 -0.000535909 0.0127363
+0 0 0
+0 0 0
+-0.00545698 0.00499536 0.00473193
+0 0 0
+0 0 0
+0.01518 0.0142544 0.0123285
+0 0 0
+0 0 0
+-0.000168485 -0.00438238 0.00517892
+0 0 0
+0 0 0
+0.0123714 0.0058073 -0.00344789
+0 0 0
+0 0 0
+-0.00534167 0.00642355 -0.00244599
+0 0 0
+0 0 0
+-5.04759e-05 -0.00515571 0.00720749
+0 0 0
+0 0 0
+-0.00191556 -0.000748099 0.00149025
+0 0 0
+0 0 0
+0.00661331 0.000687613 -0.010089
+0 0 0
+0 0 0
+-1.26257e-05 -0.00515542 0.00494464
+0 0 0
+0 0 0
+0.00789357 -0.00877575 0.0132735
+0 0 0
+0 0 0
+-0.00507882 0.00816196 0.00899426
+0 0 0
+0 0 0
+-0.00772275 -0.0129865 -0.00602754
+0 0 0
+0 0 0
+-0.000565926 0.00545582 -5.91464e-05
+0 0 0
+0 0 0
+0.00109049 0.000202086 -0.00667453
+0 0 0
+0 0 0
+-0.0109158 -0.0123817 0.0094091
+0 0 0
+0 0 0
+0.00406096 0.00660004 -0.00386767
+0 0 0
+0 0 0
+0.00138359 0.00457259 0.00378496
+0 0 0
+0 0 0
+-0.00281692 0.00027646 -5.7857e-05
+0 0 0
+0 0 0
+0.00209406 0.00231404 0.0101979
+0 0 0
+0 0 0
+0.00367972 0.000890963 0.00273223
+0 0 0
+0 0 0
+-0.0111618 -0.00342381 -0.0123016
+0 0 0
+0 0 0
+-0.00486201 0.00574302 -0.0151186
+0 0 0
+0 0 0
+0.00497567 -0.000638303 -0.00333819
+0 0 0
+0 0 0
+-0.00292046 0.00976949 -0.00699919
+0 0 0
+0 0 0
+-0.00674894 0.00165761 0.0147542
+0 0 0
+0 0 0
+-0.00782643 -0.0077367 -0.00260987
+0 0 0
+0 0 0
+-0.00358134 -0.00303959 0.00114245
+0 0 0
+0 0 0
+0.000642828 -0.000335948 -0.000605209
+0 0 0
+0 0 0
+0.000740505 -0.00511259 -0.00503279
+0 0 0
+0 0 0
+-0.0054111 0.00134348 0.000486883
+0 0 0
+0 0 0
+-0.00516649 0.00567091 0.00305135
+0 0 0
+0 0 0
+0.000676043 0.00485579 0.000172391
+0 0 0
+0 0 0
+-0.00582053 -0.00402091 0.00033397
+0 0 0
+0 0 0
+0.00448973 0.00281377 -0.000227784
+0 0 0
+0 0 0
+0.00336178 0.00764535 -0.003802
+0 0 0
+0 0 0
+-0.00186275 0.00400589 0.00343895
+0 0 0
+0 0 0
+-0.00556406 -0.00528317 -0.00993338
+0 0 0
+0 0 0
+0.00199889 0.00195948 0.00458751
+0 0 0
+0 0 0
+-0.00353912 0.00494606 0.00680142
+0 0 0
+0 0 0
+0.00122442 0.0020615 0.00264405
+0 0 0
+0 0 0
+0.00721288 -0.00291954 0.00214669
+0 0 0
+0 0 0
+0.000453011 -0.00715159 0.00695737
+0 0 0
+0 0 0
+-0.00772907 -0.00301497 -0.0167101
+0 0 0
+0 0 0
+0.00840813 0.00133569 0.00613421
+0 0 0
+0 0 0
+0.00380602 0.0068309 0.00171629
+0 0 0
+0 0 0
+-0.000842832 0.00536671 -0.00349201
+0 0 0
+0 0 0
+-0.00930383 -0.000269109 0.00486243
+0 0 0
+0 0 0
+-0.00586819 0.00280701 -0.00832121
+0 0 0
+0 0 0
+0.00453673 -0.00212405 -0.00713174
+0 0 0
+0 0 0
+0.00378363 -0.00642744 -0.0019263
+0 0 0
+0 0 0
+-0.0017643 -0.000354975 0.00164927
+0 0 0
+0 0 0
+-0.00384344 -0.0118822 -0.00289207
+0 0 0
+0 0 0
+0.00653117 0.00974485 0.000399904
+0 0 0
+0 0 0
+0.00616974 -0.00482934 -0.0105603
+0 0 0
+0 0 0
+0.00487945 0.00496005 0.00550319
+0 0 0
+0 0 0
+-0.001882 0.00272243 -0.00392331
+0 0 0
+0 0 0
+-0.000258219 -0.00482456 -0.00125412
+0 0 0
+0 0 0
+0.0116988 0.00129067 -0.00170155
+0 0 0
+0 0 0
+0.0134901 -0.00518862 -0.000939032
+0 0 0
+0 0 0
+-0.00691896 0.0112497 -0.00346503
+0 0 0
+0 0 0
+-0.00223103 0.00535906 -4.1665e-05
+0 0 0
+0 0 0
+-2.84113e-05 -0.00198621 0.00316068
+0 0 0
+0 0 0
+0.00370225 0.0021758 -0.00100787
+0 0 0
+0 0 0
+0.000723029 -0.00813053 -0.0028756
+0 0 0
+0 0 0
+-0.00868476 0.00874568 -0.000411086
+0 0 0
+0 0 0
+0.00474037 0.0105608 0.008347
+0 0 0
+0 0 0
+0.00105959 -0.000831815 -0.00437098
+0 0 0
+0 0 0
+-0.0180633 0.000180752 0.00379154
+0 0 0
+0 0 0
+0.00180955 -0.00641551 -0.00596799
+0 0 0
+0 0 0
+0.00783451 0.00619785 -0.00527733
+0 0 0
+0 0 0
+0.00328143 0.00140044 0.0101086
+0 0 0
+0 0 0
+-0.00395973 0.000926564 -0.00639365
+0 0 0
+0 0 0
+0.0116767 0.00177171 0.00991388
+0 0 0
+0 0 0
+0.00125404 0.00278407 -0.00472855
+0 0 0
+0 0 0
+-0.00125579 0.000624749 0.0060266
+0 0 0
+0 0 0
+0.00024747 -0.000230718 0.00470209
+0 0 0
+0 0 0
+-0.0153942 0.00410741 -0.00831551
+0 0 0
+0 0 0
+0.0131303 0.00158128 0.00383424
+0 0 0
+0 0 0
+-0.00726297 -0.0099383 0.00170768
+0 0 0
+0 0 0
+0.0173814 0.00807743 0.00770488
+0 0 0
+0 0 0
+-0.00765138 -0.000946928 -0.0102351
+0 0 0
+0 0 0
+-0.00219384 0.00179744 -0.00375232
+0 0 0
+0 0 0
+-0.00690129 0.0079468 0.00535078
+0 0 0
+0 0 0
+0.00017198 -0.00910768 0.00467808
+0 0 0
+0 0 0
+-0.00634841 -0.00477623 -0.00380467
+0 0 0
+0 0 0
+0.00133153 -0.0059827 -0.00504477
+0 0 0
+0 0 0
+-0.00430244 0.0129161 0.00239997
+0 0 0
+0 0 0
+-0.00653367 0.00107805 -0.0130591
+0 0 0
+0 0 0
+-0.00474991 -0.0090749 -0.0041393
+0 0 0
+0 0 0
+-0.00241338 -0.00945678 0.00421321
+0 0 0
+0 0 0
+-0.00949361 -0.00939561 4.8179e-05
+0 0 0
+0 0 0
+0.00626106 0.00213605 -0.00219957
+0 0 0
+0 0 0
+-0.00376815 0.0090755 0.00511605
+0 0 0
+0 0 0
+-0.00447132 -0.000220265 -0.00298141
+0 0 0
+0 0 0
+0.000745011 0.00206621 0.00441078
+0 0 0
+0 0 0
+0.0102733 -0.00412785 0.00410222
+0 0 0
+0 0 0
+0.00360848 -0.00402273 -0.000746735
+0 0 0
+0 0 0
+0.00746014 0.00899694 -0.0134584
+0 0 0
+0 0 0
+0.00539365 -0.00126786 -0.00533281
+0 0 0
+0 0 0
+0.000201233 -0.00723488 0.00651435
+0 0 0
+0 0 0
+-0.00173645 0.0153581 0.00261489
+0 0 0
+0 0 0
+-0.00599782 -0.00428004 -0.000143669
+0 0 0
+0 0 0
+-0.00385636 0.0049054 0.00167299
+0 0 0
+0 0 0
+-0.000259804 -0.00526562 -0.00875804
+0 0 0
+0 0 0
+-0.0043669 0.00533465 0.00619663
+0 0 0
+0 0 0
+-1.55116e-05 -0.00285167 0.00319511
+0 0 0
+0 0 0
+-0.00521923 0.00560276 0.00942748
+0 0 0
+0 0 0
+0.0108202 0.000175836 -0.000185343
+0 0 0
+0 0 0
+-0.00212986 -0.00169513 0.00530598
+0 0 0
+0 0 0
+0.000363441 -0.0060767 -0.005465
+0 0 0
+0 0 0
+0.0101713 0.00244951 -0.00713465
+0 0 0
+0 0 0
+-0.00838637 0.0039302 -0.00185564
+0 0 0
+0 0 0
+0.00141554 -0.00437349 0.00569813
+0 0 0
+0 0 0
+-0.0039811 -0.00280294 0.00262114
+0 0 0
+0 0 0
+-0.00400322 0.00542208 0.00508549
+0 0 0
+0 0 0
+0.0100751 -0.00585201 -0.00463947
+0 0 0
+0 0 0
+-0.00199921 -0.0060068 -0.00381233
+0 0 0
+0 0 0
+-0.0110949 -0.00229428 -0.00284215
+0 0 0
+0 0 0
+0.00213449 0.00121657 0.00413121
+0 0 0
+0 0 0
+0.00383646 0.00514739 -0.0042205
+0 0 0
+0 0 0
+-0.0138627 0.00386019 -0.00174507
+0 0 0
+0 0 0
+0.000985244 -0.00173199 -0.0027879
+0 0 0
+0 0 0
+-0.00414753 0.00159845 0.0140703
+0 0 0
+0 0 0
+0.00521038 0.00703491 0.00261242
+0 0 0
+0 0 0
+0.00171624 0.00334721 -0.00399361
+0 0 0
+0 0 0
+-0.00341361 0.00249506 -0.00875424
+0 0 0
+0 0 0
+-0.00151917 -0.0129792 -0.000948598
+0 0 0
+0 0 0
+-0.000554986 0.00239804 0.00680182
+0 0 0
+0 0 0
+0.0113353 -0.0015979 -0.004464
+0 0 0
+0 0 0
+-0.00748076 -0.00433667 -0.00525681
+0 0 0
+0 0 0
+0.00349191 0.00795602 -0.000800224
+0 0 0
+0 0 0
+-0.00531439 0.00216725 0.00226485
+0 0 0
+0 0 0
+0.0136866 0.00306299 -0.00109613
+0 0 0
+0 0 0
+0.00598406 -0.00392106 0.0170531
+0 0 0
+0 0 0
+0.00403592 -0.00368901 0.00320945
+0 0 0
+0 0 0
+0.0036205 -0.00556539 -0.00198205
+0 0 0
+0 0 0
+-0.000840349 0.00848007 -0.0040412
+0 0 0
+0 0 0
+-0.00480765 0.00815207 -0.00245005
+0 0 0
+0 0 0
+-0.000278064 -0.00232045 0.00779664
+0 0 0
+0 0 0
+-0.00176203 -0.00320255 0.00373226
+0 0 0
+0 0 0
+0.00444392 -0.00370352 0.00473972
+0 0 0
+0 0 0
+0.000131495 0.0020028 -0.00140803
+0 0 0
+0 0 0
+-0.00755526 0.000769954 0.00504113
+0 0 0
+0 0 0
+-0.0122574 0.0074683 0.00139079
+0 0 0
+0 0 0
+0.00523569 0.00256379 0.011097
+0 0 0
+0 0 0
+-0.000944271 0.00510882 -0.00305778
+0 0 0
+0 0 0
+0.00380519 0.000803686 0.0139614
+0 0 0
+0 0 0
+0.00473881 0.00692148 -0.00141251
+0 0 0
+0 0 0
+0.00197562 0.00833919 -0.000823374
+0 0 0
+0 0 0
+-0.00923064 -0.00456113 -0.00523267
+0 0 0
+0 0 0
+0.007301 0.00165144 -0.00250631
+0 0 0
+0 0 0
+-0.00477963 0.0067898 -0.00160161
+0 0 0
+0 0 0
+-0.012516 -0.0052418 0.00839902
+0 0 0
+0 0 0
+0.00444699 -0.0102143 -0.00771269
+0 0 0
+0 0 0
+0.00409276 0.00234007 0.000916312
+0 0 0
+0 0 0
+0.00526719 -0.0185264 0.00325041
+0 0 0
+0 0 0
+0.00880466 0.00115263 -0.00446445
+0 0 0
+0 0 0
+-0.00670686 -0.00806671 0.00145852
+0 0 0
+0 0 0
+-0.00474324 -0.00648036 -0.00467019
+0 0 0
+0 0 0
+-0.00273532 -0.00396023 0.0137113
+0 0 0
+0 0 0
+0.0106414 0.00195623 -0.00958807
+0 0 0
+0 0 0
+-0.00208171 0.00647457 0.0136989
+0 0 0
+0 0 0
+-0.00277054 0.00697185 -0.000786607
+0 0 0
+0 0 0
+0.00443445 -7.24378e-05 0.012928
+0 0 0
+0 0 0
+-0.00665372 0.00161258 -0.00438756
+0 0 0
+0 0 0
+0.00491655 0.000643814 -0.00301866
+0 0 0
+0 0 0
+0.00497501 0.00911598 -0.00288485
+0 0 0
+0 0 0
+0.0137355 -0.000897699 0.00214739
+0 0 0
+0 0 0
+-0.00992127 -0.0115933 0.00142412
+0 0 0
+0 0 0
+0.010838 0.00745001 0.00533567
+0 0 0
+0 0 0
+0.00487711 -0.00411243 0.00792683
+0 0 0
+0 0 0
+-0.00617018 0.00341602 0.00568542
+0 0 0
+0 0 0
+-0.00648836 0.00118417 0.000778898
+0 0 0
+0 0 0
+0.0116769 -0.00494425 -0.0060414
+0 0 0
+0 0 0
+-0.00154938 -0.00822016 -0.0050833
+0 0 0
+0 0 0
+-0.00104108 0.00444053 -0.00407523
+0 0 0
+0 0 0
+-0.00423669 -0.00203121 0.00542422
+0 0 0
+0 0 0
+-0.00225517 0.00356842 -0.00501592
+0 0 0
+0 0 0
+0.00742022 -0.00558255 0.00207504
+0 0 0
+0 0 0
+0.00255928 -0.00463011 0.00157302
+0 0 0
+0 0 0
+-0.003772 -0.0144524 0.00145796
+0 0 0
+0 0 0
+0.00647517 -0.0100065 0.00908599
+0 0 0
+0 0 0
+-0.00513477 0.0070015 -0.00977665
+0 0 0
+0 0 0
+0.00615323 0.00135278 -0.000273292
+0 0 0
+0 0 0
+3.05568e-05 -0.00373847 -0.00697973
+0 0 0
+0 0 0
+-0.006153 0.00864248 0.00112156
+0 0 0
+0 0 0
+-0.00568615 -0.00401322 -0.0124605
+0 0 0
+0 0 0
+-0.00137967 0.0132382 -0.00871058
+0 0 0
+0 0 0
+0.00749187 0.00809359 0.0027655
+0 0 0
+0 0 0
+0.00344337 -0.000858053 -0.00261067
+0 0 0
+0 0 0
+0.00408897 -0.000775449 -0.00265952
+0 0 0
+0 0 0
+-0.00655454 -4.75993e-05 -0.00105503
+0 0 0
+0 0 0
+0.00816401 0.0113557 0.00755355
+0 0 0
+0 0 0
+0.00593666 0.00975993 0.00388305
+0 0 0
+0 0 0
+0.00275357 0.00385358 -0.00277543
+0 0 0
+0 0 0
+4.33332e-05 -0.00510193 0.008179
+0 0 0
+0 0 0
+-0.00872919 0.000734027 -0.00378913
+0 0 0
+0 0 0
+0.00617901 0.00769192 0.00419363
+0 0 0
+0 0 0
+-0.00109342 0.00751958 -0.00120446
+0 0 0
+0 0 0
+-0.00048848 -0.00316227 -0.00100535
+0 0 0
+0 0 0
+0.0071404 0.00331869 0.00237351
+0 0 0
+0 0 0
+-0.00528961 -0.00181138 0.00689482
+0 0 0
+0 0 0
+-0.00155324 0.00337207 -0.00375005
+0 0 0
+0 0 0
+-0.00495499 -0.000730756 -0.00124974
+0 0 0
+0 0 0
+0.00398968 0.0038799 0.0151003
+0 0 0
+0 0 0
+-0.00112601 -0.01042 -0.00604923
+0 0 0
+0 0 0
+0.00749994 0.016104 0.00779907
+0 0 0
+0 0 0
+-0.000534727 0.0124048 -0.00376745
+0 0 0
+0 0 0
+-0.00622813 0.00463624 0.00581452
+0 0 0
+0 0 0
+-0.00890926 -0.00442707 0.000775332
+0 0 0
+0 0 0
+-0.0026075 0.00403578 -0.00156429
+0 0 0
+0 0 0
+-0.00890408 0.00562807 -0.00448763
+0 0 0
+0 0 0
+0.00216716 -0.000597816 -3.25555e-05
+0 0 0
+0 0 0
+0.0106718 -0.00254772 0.00601397
+0 0 0
+0 0 0
+-0.00210315 0.010036 -0.00683073
+0 0 0
+0 0 0
+-0.00412363 -0.00501735 2.39248e-05
+0 0 0
+0 0 0
+0.00380111 0.00617459 -0.00894091
+0 0 0
+0 0 0
+2.74765e-05 0.00231631 0.00269336
+0 0 0
+0 0 0
+0.00811216 0.00334474 -0.00424563
+0 0 0
+0 0 0
+0.00523019 0.00516382 0.00493048
+0 0 0
+0 0 0
+-0.00872068 -0.00338244 -0.00143776
+0 0 0
+0 0 0
+-0.00513753 0.000501527 0.00871178
+0 0 0
+0 0 0
+0.00268232 0.00785662 -0.0110786
+0 0 0
+0 0 0
+-0.00708066 -0.00182925 0.00255259
+0 0 0
+0 0 0
+0.00574471 -0.00937093 0.00195592
+0 0 0
+0 0 0
+-0.0207558 0.00424519 -0.00411212
+0 0 0
+0 0 0
+-0.00269112 -5.50584e-05 0.0090933
+0 0 0
+0 0 0
+0.00649523 -0.00522534 0.0119984
+0 0 0
+0 0 0
+0.00184653 -0.00156135 0.00531749
+0 0 0
+0 0 0
+0.00455145 0.00165888 0.00475326
+0 0 0
+0 0 0
+0.00134256 -0.00393319 0.00145788
+0 0 0
+0 0 0
+-0.00820249 -0.00236175 0.00256002
+0 0 0
+0 0 0
+-0.00193078 -0.00184435 0.005038
+0 0 0
+0 0 0
+-0.0090793 0.0147179 0.00467211
+0 0 0
+0 0 0
+-0.0116564 0.00360824 -0.00770429
+0 0 0
+0 0 0
+0.00311589 0.00840098 0.0109078
+0 0 0
+0 0 0
+0.00716835 -0.00385999 -0.00127767
+0 0 0
+0 0 0
+0.00258053 -0.00080086 -0.00473543
+0 0 0
+0 0 0
+-0.00123194 0.00359063 -0.00066747
+0 0 0
+0 0 0
+-0.00951223 0.00627194 -0.0150627
+0 0 0
+0 0 0
+0.00486615 -0.00159079 -0.00148924
+0 0 0
+0 0 0
+0.00314454 -0.00596072 0.00406933
+0 0 0
+0 0 0
+0.00486675 0.00491107 -0.00886611
+0 0 0
+0 0 0
+0.000734497 0.000297587 -0.00596506
+0 0 0
+0 0 0
+-0.00161904 -0.00142299 0.00634615
+0 0 0
+0 0 0
+0.00675008 -0.0109899 0.000388379
+0 0 0
+0 0 0
+0.00144554 0.00213518 0.00559968
+0 0 0
+0 0 0
+-0.000720239 0.0134748 -0.00869992
+0 0 0
+0 0 0
+0.00717222 0.00113444 0.0055613
+0 0 0
+0 0 0
+0.00781443 0.000444542 0.0030511
+0 0 0
+0 0 0
+0.00221679 -0.000130216 -0.00548201
+0 0 0
+0 0 0
+0.00171526 0.00734596 0.00203386
+0 0 0
+0 0 0
+-0.0039064 -0.0104554 0.000399374
+0 0 0
+0 0 0
+0.00584727 0.00144045 0.000274483
+0 0 0
+0 0 0
+0.00516783 0.00426457 -0.0143043
+0 0 0
+0 0 0
+-0.00474601 -0.00235291 0.000397881
+0 0 0
+0 0 0
+0.00755857 0.00188103 0.00320434
+0 0 0
+0 0 0
+-0.00426726 -0.00109589 0.0165226
+0 0 0
+0 0 0
+0.00713365 -4.55887e-05 0.00195486
+0 0 0
+0 0 0
+0.00158311 -0.00927924 -0.00230793
+0 0 0
+0 0 0
+0.00620242 0.011783 -0.00438166
+0 0 0
+0 0 0
+-0.00539693 -0.00421021 -0.00527274
+0 0 0
+0 0 0
+0.000164041 0.00265239 0.00169114
+0 0 0
+0 0 0
+0.0119003 -0.000456783 -0.00861385
+0 0 0
+0 0 0
+0.00273708 -0.00317232 0.000571188
+0 0 0
+0 0 0
+-0.00277059 0.00613508 0.00955964
+0 0 0
+0 0 0
+6.20349e-05 0.000759368 -0.0112123
+0 0 0
+0 0 0
+0.00179608 -0.00155297 0.00512596
+0 0 0
+0 0 0
+0.000420892 0.0150032 -0.00647116
+0 0 0
+0 0 0
+0.00518406 -0.000423618 0.00292132
+0 0 0
+0 0 0
+-0.00573205 0.00112254 -0.000273207
+0 0 0
+0 0 0
+-3.81649e-05 0.00337933 -0.004071
+0 0 0
+0 0 0
+-0.000274954 0.00571913 -0.00981177
+0 0 0
+0 0 0
+-0.00359237 0.000524398 -0.000719584
+0 0 0
+0 0 0
+-0.00982088 0.00729321 -0.00721955
+0 0 0
+0 0 0
+-0.0113816 0.000116968 0.0111103
+0 0 0
+0 0 0
+0.00536528 -0.00558504 0.0092849
+0 0 0
+0 0 0
+0.00240374 0.000793927 -0.000829274
+0 0 0
+0 0 0
+0.0003959 0.0161029 -0.0123399
+0 0 0
+0 0 0
+0.00659893 -0.00457911 0.00316985
+0 0 0
+0 0 0
+-0.00396848 -0.00862119 -0.00176495
+0 0 0
+0 0 0
+-0.00423259 0.00311431 0.00191266
+0 0 0
+0 0 0
+-6.71786e-05 0.00323088 -0.00127701
+0 0 0
+0 0 0
+-0.00126559 0.000966813 -0.00750536
+0 0 0
+0 0 0
+-0.000425813 -0.00600583 -0.00668664
+0 0 0
+0 0 0
+0.000993072 -3.30014e-05 -0.00281287
+0 0 0
+0 0 0
+-0.00388765 0.00208246 -0.00637908
+0 0 0
+0 0 0
+-0.0102478 0.00383845 -0.00605035
+0 0 0
+0 0 0
+-0.00145633 -0.00272743 -0.00330614
+0 0 0
+0 0 0
+0.0038254 0.00343765 -0.00924427
+0 0 0
+0 0 0
+0.0029194 -0.00173355 0.0082147
+0 0 0
+0 0 0
+0.00389164 -0.00281645 0.00401902
+0 0 0
+0 0 0
+0.00132406 0.00645971 -0.00193459
+0 0 0
+0 0 0
+-0.00443555 -0.00367306 0.00211401
+0 0 0
+0 0 0
+0.00361644 -0.00554034 -0.000556487
+0 0 0
+0 0 0
+-0.00816652 -0.00301106 0.00159141
+0 0 0
+0 0 0
+0.000922533 0.00551613 -0.0034803
+0 0 0
+0 0 0
+-0.00448133 -0.00768579 -0.00542865
+0 0 0
+0 0 0
+-0.00897442 -0.00813054 0.00343739
+0 0 0
+0 0 0
+0.0112315 -0.00526866 -0.00205654
+0 0 0
+0 0 0
+0.00598647 -0.00469249 0.0135034
+0 0 0
+0 0 0
+0.00238385 0.00263148 0.00488815
+0 0 0
+0 0 0
+0.000201851 -0.00658192 -0.00837458
+0 0 0
+0 0 0
+-0.0129833 0.00404143 -0.0103602
+0 0 0
+0 0 0
+-0.00353081 0.00654926 -0.000838028
+0 0 0
+0 0 0
+-0.00206083 0.00264097 -0.00883039
+0 0 0
+0 0 0
+-0.0199792 0.00615182 -0.00858546
+0 0 0
+0 0 0
+0.0131274 0.00202401 -0.000880445
+0 0 0
+0 0 0
+-0.00237159 -0.00948707 0.00149959
+0 0 0
+0 0 0
+0.00241635 0.00267771 -0.000176131
+0 0 0
+0 0 0
+0.00466032 0.00565396 -0.00435013
+0 0 0
+0 0 0
+0.000495749 0.00112638 0.00391566
+0 0 0
+0 0 0
+0.00235042 0.00579774 0.00742377
+0 0 0
+0 0 0
+0.00335742 0.00318086 8.41622e-05
+0 0 0
+0 0 0
+-0.00426161 0.00155765 -0.00239891
+0 0 0
+0 0 0
+-0.00645769 -0.00152078 -0.00508459
+0 0 0
+0 0 0
+0.00171664 0.00734575 0.00876927
+0 0 0
+0 0 0
+-0.00683414 -0.012482 0.00482593
+0 0 0
+0 0 0
+-0.0087467 0.00263012 -0.00581131
+0 0 0
+0 0 0
+-0.00326845 -0.00187102 0.00124958
+0 0 0
+0 0 0
+-0.00513068 -0.000512351 0.000603066
+0 0 0
+0 0 0
+-0.00508731 -0.0020882 -0.00178493
+0 0 0
+0 0 0
+-0.00647826 -0.00178114 -0.0034949
+0 0 0
+0 0 0
+0.00400768 0.00141598 -0.00496786
+0 0 0
+0 0 0
+-0.00716939 0.00236964 -0.00102244
+0 0 0
+0 0 0
+-0.000564689 0.000163341 0.00357506
+0 0 0
+0 0 0
+-0.0111344 -0.00589656 0.00855062
+0 0 0
+0 0 0
+0.0103814 0.000813909 -0.013441
+0 0 0
+0 0 0
+0.0012136 0.0121394 0.00982309
+0 0 0
+0 0 0
+-0.00287196 0.00225899 -0.00108555
+0 0 0
+0 0 0
+-0.00196389 0.00432086 0.00501563
+0 0 0
+0 0 0
+-0.00299923 -0.00102258 -0.00351208
+0 0 0
+0 0 0
+0.00140759 -0.00436262 0.00199213
+0 0 0
+0 0 0
+-0.00274136 -0.00299786 -0.000191826
+0 0 0
+0 0 0
+0.00477441 -0.0100246 0.00471075
+0 0 0
+0 0 0
+0.00389904 0.00182929 -0.00386228
+0 0 0
+0 0 0
+0.000922772 -0.00512827 0.004667
+0 0 0
+0 0 0
+-0.00445715 0.00794886 -0.00728157
+0 0 0
+0 0 0
+0.00881122 -0.0161461 -0.00140791
+0 0 0
+0 0 0
+-0.00815015 0.00822859 -0.0128629
+0 0 0
+0 0 0
+-6.82674e-06 -0.00306171 0.00621439
+0 0 0
+0 0 0
+0.00369373 -0.0010271 0.00799434
+0 0 0
+0 0 0
+0.0132349 -0.000776803 -0.00606303
+0 0 0
+0 0 0
+0.000634928 -0.000281338 -0.012283
+0 0 0
+0 0 0
+-0.00644853 0.00306387 -0.010262
+0 0 0
+0 0 0
+-0.00212269 0.0036937 0.00533351
+0 0 0
+0 0 0
+0.00762542 -0.0021037 -0.00886201
+0 0 0
+0 0 0
+-0.0063626 -0.00563334 -0.0159235
+0 0 0
+0 0 0
+-0.00671488 0.00303675 0.0056239
+0 0 0
+0 0 0
+0.00750959 7.6692e-05 -0.00090799
+0 0 0
+0 0 0
+-0.0104471 0.00626451 -0.00326013
+0 0 0
+0 0 0
+-0.00836174 -0.001506 0.0021701
+0 0 0
+0 0 0
+-0.00440654 -0.00706568 -0.00848981
+0 0 0
+0 0 0
+-0.0100327 0.00672638 0.000298856
+0 0 0
+0 0 0
+0.009307 -0.00452801 -0.00688817
+0 0 0
+0 0 0
+0.00039989 0.00138093 -0.0193926
+0 0 0
+0 0 0
+0.0065403 -0.000380169 0.00320791
+0 0 0
+0 0 0
+-0.00315648 0.0072228 -0.0003275
+0 0 0
+0 0 0
+-0.0117857 -0.00589439 0.00195353
+0 0 0
+0 0 0
+0.00580987 -0.00343652 0.000966513
+0 0 0
+0 0 0
+-0.00448846 0.00277202 0.00742759
+0 0 0
+0 0 0
+-0.0114456 -0.00549094 -0.00280814
+0 0 0
+0 0 0
+-0.00327284 -0.00379359 0.0230008
+0 0 0
+0 0 0
+0.00614033 0.0127026 -0.00418378
+0 0 0
+0 0 0
+0.00554789 0.00184763 0.00266543
+0 0 0
+0 0 0
+0.00096221 0.00180696 0.00193641
+0 0 0
+0 0 0
+0.0140344 -0.00313163 0.000820456
+0 0 0
+0 0 0
+0.000117658 -0.0121214 -0.0054652
+0 0 0
+0 0 0
+-0.00183439 -0.00668513 0.00617271
+0 0 0
+0 0 0
+-0.00175261 0.0049828 -0.00995336
+0 0 0
+0 0 0
+-0.0056706 -0.00145515 -0.00606375
+0 0 0
+0 0 0
+0.00234411 -0.0118614 -0.00432863
+0 0 0
+0 0 0
+0.00998704 -0.00989919 0.00802651
+0 0 0
+0 0 0
+0.00486571 -0.0127314 0.0025783
+0 0 0
+0 0 0
+-0.00474719 0.00615223 0.00521325
+0 0 0
+0 0 0
+-0.00652802 0.0058852 0.00376914
+0 0 0
+0 0 0
+0.0091372 0.00450637 -0.00687716
+0 0 0
+0 0 0
+0.0041062 -0.00828464 0.00900524
+0 0 0
+0 0 0
+-0.00607062 -0.000622962 0.00315057
+0 0 0
+0 0 0
+0.00845301 -0.0065166 0.0018492
+0 0 0
+0 0 0
+0.0047877 0.00854886 0.00139394
+0 0 0
+0 0 0
+-0.0158224 -0.00143655 -0.00611237
+0 0 0
+0 0 0
+0.0043129 -0.00301445 0.00440395
+0 0 0
+0 0 0
+-0.00806805 0.00203253 0.00719313
+0 0 0
+0 0 0
+-0.00524786 -0.0130403 0.00655455
+0 0 0
+0 0 0
+-0.000175413 -0.00964908 0.00232741
+0 0 0
+0 0 0
+0.00368534 0.00590777 0.00288669
+0 0 0
+0 0 0
+0.00443607 -0.013501 0.00850765
+0 0 0
+0 0 0
+-0.00993035 0.00983662 0.00363892
+0 0 0
+0 0 0
+-0.00996917 -0.00152383 -0.00135017
+0 0 0
+0 0 0
+0.00526837 0.00607015 -0.0013118
+0 0 0
+0 0 0
+0.00609916 -0.0082983 -0.000264844
+0 0 0
+0 0 0
+-0.00387733 0.00590646 0.00393398
+0 0 0
+0 0 0
+-0.00846331 0.00206114 0.00653824
+0 0 0
+0 0 0
+0.00113531 -0.00612903 -0.00840422
+0 0 0
+0 0 0
+-0.00672038 -0.00109449 -0.000930985
+0 0 0
+0 0 0
+-0.000268656 0.00556976 0.0101456
+0 0 0
+0 0 0
+-0.00513066 -0.000557194 0.00731675
+0 0 0
+0 0 0
+-0.00906247 0.0105676 -0.00155757
+0 0 0
+0 0 0
+0.00179599 -0.0147625 0.00343308
+0 0 0
+0 0 0
+-0.0120912 -0.00666447 -0.0157528
+0 0 0
+0 0 0
+0.00373289 -0.00131986 0.00374035
+0 0 0
+0 0 0
+-0.00406617 -0.00176933 -0.00446159
+0 0 0
+0 0 0
+0.00102568 -0.00358104 0.0010095
+0 0 0
+0 0 0
+0.00415779 -0.00189882 0.00129712
+0 0 0
+0 0 0
+0.00426023 0.00663336 0.00123081
+0 0 0
+0 0 0
+-0.00660598 -0.00805062 0.00335618
+0 0 0
+0 0 0
+9.70251e-05 0.00534526 0.0105646
+0 0 0
+0 0 0
+-0.00764076 7.84859e-05 0.000601265
+0 0 0
+0 0 0
+-0.00578001 0.00734675 -0.0111852
+0 0 0
+0 0 0
+-0.0137841 0.0086404 0.0041699
+0 0 0
+0 0 0
+-0.000640876 0.00462616 -0.00215098
+0 0 0
+0 0 0
+-0.00431746 -0.00526841 -0.00733081
+0 0 0
+0 0 0
+0.00568041 -0.00135586 -0.00337801
+0 0 0
+0 0 0
+-0.00466626 -0.00185631 -0.000236038
+0 0 0
+0 0 0
+0.000291314 -0.0096219 -0.00859722
+0 0 0
+0 0 0
+-0.00680453 0.000138534 -0.00281652
+0 0 0
+0 0 0
+0.00259367 -0.00481295 -0.00671646
+0 0 0
+0 0 0
+0.00967184 -0.00861731 -0.00200471
+0 0 0
+0 0 0
+-0.00249749 -0.000653724 0.0102747
+0 0 0
+0 0 0
+-0.00141921 -0.00746222 -0.000300505
+0 0 0
+0 0 0
+0.014133 -0.00140395 0.00618404
+0 0 0
+0 0 0
+-0.00627151 -0.000221657 0.00293184
+0 0 0
+0 0 0
+0.00283671 0.00444701 0.0118262
+0 0 0
+0 0 0
+-0.00194982 0.00503133 -0.00311647
+0 0 0
+0 0 0
+0.00683718 -0.0020753 -0.00837432
+0 0 0
+0 0 0
+-0.0039261 -0.00339169 -0.00228657
+0 0 0
+0 0 0
+0.00891401 -0.0122539 0.00349816
+0 0 0
+0 0 0
+-0.00657787 0.011347 -0.00660283
+0 0 0
+0 0 0
+-0.00360846 -0.00227785 0.00821676
+0 0 0
+0 0 0
+0.000577046 0.00478593 0.00807533
+0 0 0
+0 0 0
+0.000932683 -0.00611472 0.00246673
+0 0 0
+0 0 0
+0.000135176 -0.0050431 -0.00584669
+0 0 0
+0 0 0
+0.00353952 0.0116529 0.00986702
+0 0 0
+0 0 0
+-0.00202005 -0.00421147 0.00344777
+0 0 0
+0 0 0
+-0.00844195 -0.0027405 0.00230446
+0 0 0
+0 0 0
+0.0108843 0.00743999 0.00408008
+0 0 0
+0 0 0
+-0.00648177 0.00332184 -0.013516
+0 0 0
+0 0 0
+0.0020348 -0.0019706 0.00143609
+0 0 0
+0 0 0
+-0.00894585 -0.00826925 -0.00178079
+0 0 0
+0 0 0
+0.00553935 -0.00267986 -0.00253104
+0 0 0
+0 0 0
+-0.00305134 0.00583623 -0.00739897
+0 0 0
+0 0 0
+-0.00394194 -1.32329e-05 -0.00999173
+0 0 0
+0 0 0
+0.00893717 0.00478107 0.00887741
+0 0 0
+0 0 0
+-0.00696607 0.0129804 0.00478155
+0 0 0
+0 0 0
+0.0125157 0.00775603 -0.00541937
+0 0 0
+0 0 0
+0.00614587 0.000334967 -0.00582479
+0 0 0
+0 0 0
+0.00444609 -0.00452177 -0.0024907
+0 0 0
+0 0 0
+0.00568596 0.00355087 0.00307766
+0 0 0
+0 0 0
+-0.000212521 -0.000481007 -0.0120924
+0 0 0
+0 0 0
+-0.00856549 0.016597 -0.0106743
+0 0 0
+0 0 0
+-0.00512974 -0.000323899 -0.00282713
+0 0 0
+0 0 0
+-0.00806675 0.00163984 0.00195218
+0 0 0
+0 0 0
+-0.00391853 0.00907969 0.0101102
+0 0 0
+0 0 0
+-0.0117093 0.00218797 -0.00634259
+0 0 0
+0 0 0
+-0.00666481 -0.0023475 -0.00114939
+0 0 0
+0 0 0
+-0.000952004 -0.0081216 -0.00373511
+0 0 0
+0 0 0
+0.00418 0.00620319 0.00874108
+0 0 0
+0 0 0
+-7.3767e-05 -0.0119971 -0.00115849
+0 0 0
+0 0 0
+-0.000935112 0.0157036 0.0039211
+0 0 0
+0 0 0
+0.00816722 0.000493054 0.000442144
+0 0 0
+0 0 0
+-0.005006 -0.00687349 0.00381331
+0 0 0
+0 0 0
+0.000310294 -0.00275964 0.00844087
+0 0 0
+0 0 0
+-0.00473476 0.00293338 0.000272867
+0 0 0
+0 0 0
+0.00329065 0.00126441 -0.0105791
+0 0 0
+0 0 0
+-0.00923369 -0.000577163 0.0135639
+0 0 0
+0 0 0
+0.00360204 -0.00329445 0.00371009
+0 0 0
+0 0 0
+0.00146911 -0.0030003 -0.000371737
+0 0 0
+0 0 0
+-0.00593852 0.00952163 -0.00246423
+0 0 0
+0 0 0
+-0.00163578 -0.00898604 -0.00119719
+0 0 0
+0 0 0
+-0.00508426 -0.00863963 -0.0139428
+0 0 0
+0 0 0
+0.0044922 0.00527153 0.00707722
+0 0 0
+0 0 0
+0.00728348 0.00751253 -0.0099345
+0 0 0
+0 0 0
+8.86933e-05 0.0100147 0.00144436
+0 0 0
+0 0 0
+-0.00548055 0.00521455 -0.00424488
+0 0 0
+0 0 0
+-0.00677277 0.00641124 0.00166722
+0 0 0
+0 0 0
+-0.00591776 -0.00591525 -0.00190804
+0 0 0
+0 0 0
+-0.010253 -0.00353694 0.0116582
+0 0 0
+0 0 0
+-0.00499866 0.000927067 -0.0141683
+0 0 0
+0 0 0
+-0.00109298 0.0137397 0.000236658
+0 0 0
+0 0 0
+0.00156093 -0.0074586 -0.00435637
+0 0 0
+0 0 0
+0.00327797 0.00453993 0.00278183
+0 0 0
+0 0 0
+0.00847486 0.000165894 0.00423954
+0 0 0
+0 0 0
+-0.00545126 -0.00682817 -0.00616332
+0 0 0
+0 0 0
+-0.0052267 0.00262957 -0.00801376
+0 0 0
+0 0 0
+0.00153231 0.0077808 -0.000502868
+0 0 0
+0 0 0
+0.013594 -0.00233411 0.00275977
+0 0 0
+0 0 0
+-0.00144232 -0.00147976 0.00287727
+0 0 0
+0 0 0
+0.00292824 0.00278037 0.0104937
+0 0 0
+0 0 0
+-0.00122869 -0.00234407 0.000856831
+0 0 0
+0 0 0
+-0.00244242 -0.00868411 0.00718042
+0 0 0
+0 0 0
+-0.00457629 -0.0017378 0.01069
+0 0 0
+0 0 0
+-0.00628042 0.00138652 -0.00337252
+0 0 0
+0 0 0
+0.00218209 0.00152358 0.00909022
+0 0 0
+0 0 0
+0.00454225 -0.00382933 0.008091
+0 0 0
+0 0 0
+-0.00472447 0.00667049 -0.0103612
+0 0 0
+0 0 0
+-0.0049081 -5.49436e-05 0.00439868
+0 0 0
+0 0 0
+-0.00954798 -0.000201512 0.0065845
+0 0 0
+0 0 0
+-0.00324526 0.000595447 -0.00381746
+0 0 0
+0 0 0
+-0.00763434 -0.00090205 -0.00194541
+0 0 0
+0 0 0
+0.00198814 0.00578744 -0.000779862
+0 0 0
+0 0 0
+-0.000688198 0.0114949 0.00414261
+0 0 0
+0 0 0
+-0.00108493 -0.00313957 -0.00620111
+0 0 0
+0 0 0
+0.00245007 -0.00596181 -0.00800479
+0 0 0
+0 0 0
+-0.00721706 0.00712942 -0.00672955
+0 0 0
+0 0 0
+-0.000701501 0.00887472 0.00321059
+0 0 0
+0 0 0
+-0.0032013 -0.00177762 -0.0021149
+0 0 0
+0 0 0
+-0.000538408 0.00312436 -0.00860098
+0 0 0
+0 0 0
+0.0103738 -0.00722214 0.00250009
+0 0 0
+0 0 0
+0.013557 0.00157096 0.00472307
+0 0 0
+0 0 0
+-0.00963088 -0.00358138 -0.000814807
+0 0 0
+0 0 0
+0.0068548 -0.0082624 -0.00229619
+0 0 0
+0 0 0
+0.00126239 0.00171394 -0.00198714
+0 0 0
+0 0 0
+-0.0122449 -0.00594919 -0.0113161
+0 0 0
+0 0 0
+0.0069462 -0.000991259 0.00430971
+0 0 0
+0 0 0
+0.00169472 -0.00382775 0.00688429
+0 0 0
+0 0 0
+-0.00374482 0.0041494 -0.00349341
+0 0 0
+0 0 0
+0.00264077 0.0153205 0.00356993
+0 0 0
+0 0 0
+-0.0106711 0.00333664 0.00207975
+0 0 0
+0 0 0
+0.00625512 -0.00722697 0.00975507
+0 0 0
+0 0 0
+0.00179893 -0.00375372 0.0045664
+0 0 0
+0 0 0
+0.00585751 -0.00985737 -0.00727691
+0 0 0
+0 0 0
+0.00721199 0.00517744 0.00515994
+0 0 0
+0 0 0
+0.00205052 -0.000386251 -0.00486549
+0 0 0
+0 0 0
+0.00105364 0.0160452 -0.0113438
+0 0 0
+0 0 0
+-0.00785129 -0.00560388 0.00536809
+0 0 0
+0 0 0
+-0.00642731 0.00201075 0.00106536
+0 0 0
+0 0 0
+-0.00355987 -0.00454537 -0.00620665
+0 0 0
+0 0 0
+-0.00272062 0.00612653 -0.00733389
+0 0 0
+0 0 0
+0.000837009 0.00405052 0.00204501
+0 0 0
+0 0 0
+-0.00418927 0.00105216 0.0122133
+0 0 0
+0 0 0
+0.000370949 -0.00971165 -0.00541682
+0 0 0
+0 0 0
+0.00161635 -0.00208605 0.00673349
+0 0 0
+0 0 0
+-0.00633673 -0.00565576 0.00532704
+0 0 0
+0 0 0
+-0.00299303 -0.00601764 0.00182298
+0 0 0
+0 0 0
+-0.00267721 -0.00125627 0.000978926
+0 0 0
+0 0 0
+0.00413449 0.0102757 0.0098778
+0 0 0
+0 0 0
+-0.00425208 0.00382595 -0.00677453
+0 0 0
+0 0 0
+0.00368786 0.00387968 -0.000680429
+0 0 0
+0 0 0
+-0.000685776 -0.0101526 -0.00606549
+0 0 0
+0 0 0
+-0.00527371 0.00606997 -0.00407649
+0 0 0
+0 0 0
+-0.00258942 0.00450496 -0.00198127
+0 0 0
+0 0 0
+0.00653295 0.00131165 -0.00270486
+0 0 0
+0 0 0
+0.00493812 0.00132769 0.000128465
+0 0 0
+0 0 0
+0.00075122 -0.00602458 -0.00201613
+0 0 0
+0 0 0
+-0.00189207 -0.00687412 0.00115203
+0 0 0
+0 0 0
+-0.00651757 0.00568151 -0.0165829
+0 0 0
+0 0 0
+-0.00961899 0.0117321 -0.0069444
+0 0 0
+0 0 0
+-0.00758893 -0.00520547 -0.0091916
+0 0 0
+0 0 0
+0.00906655 -0.00257775 -0.00258799
+0 0 0
+0 0 0
+0.0016406 0.00645168 0.00414394
+0 0 0
+0 0 0
+0.00725697 -0.00285952 0.00654003
+0 0 0
+0 0 0
+-0.00124541 -0.0105508 -0.000232969
+0 0 0
+0 0 0
+-0.0113455 0.00627594 -0.00212383
+0 0 0
+0 0 0
+-0.00913005 0.000598554 0.00108706
+0 0 0
+0 0 0
+0.00247467 0.00681867 -0.0201172
+0 0 0
+0 0 0
+0.00445474 0.000621027 0.00108281
+0 0 0
+0 0 0
+0.00444071 0.00681441 0.00261679
+0 0 0
+0 0 0
+0.0104057 -0.00192148 -0.0061863
+0 0 0
+0 0 0
+-0.0100562 -0.0174935 -0.00504894
+0 0 0
+0 0 0
+-0.000868037 0.0109987 0.00378853
+0 0 0
+0 0 0
+-0.00153837 -0.00645715 0.00337686
+0 0 0
+0 0 0
+0.000652098 -0.00717923 -0.000676504
+0 0 0
+0 0 0
+0.000768651 0.00294557 0.0124985
+0 0 0
+0 0 0
+0.00208068 -0.000570303 0.00543658
+0 0 0
+0 0 0
+0.0047356 -1.66905e-05 0.00314702
+0 0 0
+0 0 0
+-0.0142203 -0.00441478 0.00502748
+0 0 0
+0 0 0
+0.00088405 -0.00368142 -0.0116246
+0 0 0
+0 0 0
+-0.0030213 0.00258623 -0.00522554
+0 0 0
+0 0 0
+0.00104885 -0.0044973 0.000401285
+0 0 0
+0 0 0
+0.00403851 0.00431153 -0.00274422
+0 0 0
+0 0 0
+0.00668549 -0.00486322 -0.000175412
+0 0 0
+0 0 0
+-0.00856369 -0.0082385 -0.00214151
+0 0 0
+0 0 0
+0.00205549 1.6055e-05 0.000233047
+0 0 0
+0 0 0
+0.000879169 -0.00332036 0.00987067
+0 0 0
+0 0 0
+0.00650941 -0.0113659 0.00203311
+0 0 0
+0 0 0
+0.00993201 0.00348225 -0.00291356
+0 0 0
+0 0 0
+0.00635113 -0.00217627 0.0135891
+0 0 0
+0 0 0
+-0.00970261 0.00374055 0.000610234
+0 0 0
+0 0 0
+-0.00896266 0.00239459 -0.00431661
+0 0 0
+0 0 0
+0.00518756 0.00775965 -0.00282974
+0 0 0
+0 0 0
+0.00559174 0.00554503 -0.00120576
+0 0 0
+0 0 0
+0.00849337 0.0080557 0.00380591
+0 0 0
+0 0 0
+0.000540323 -0.00643334 -0.0105604
+0 0 0
+0 0 0
+-0.00156245 -0.00758462 0.0125086
+0 0 0
+0 0 0
+-0.00794204 -0.00250733 -0.00542299
+0 0 0
+0 0 0
+-0.00355442 -0.00290071 0.00246224
+0 0 0
+0 0 0
+0.00155884 0.0142457 0.00301892
+0 0 0
+0 0 0
+-0.00353128 -0.0034646 -0.0076479
+0 0 0
+0 0 0
+0.00685036 0.0069627 -0.000990677
+0 0 0
+0 0 0
+0.00496553 0.00213154 0.00553894
+0 0 0
+0 0 0
+0.0040824 -0.00511406 -0.00680455
+0 0 0
+0 0 0
+0.00133804 0.00170121 0.00385896
+0 0 0
+0 0 0
+-0.00530041 0.00241698 0.00141916
+0 0 0
+0 0 0
+-0.00402113 -5.69676e-05 -0.013654
+0 0 0
+0 0 0
+0.00518423 -0.000940459 -0.00482009
+0 0 0
+0 0 0
+-0.000447888 0.0113943 0.00594572
+0 0 0
+0 0 0
+0.0103079 -0.00855626 0.00113081
+0 0 0
+0 0 0
+-0.00154618 -0.0033909 0.00952552
+0 0 0
+0 0 0
+0.00294382 0.0113649 0.00235659
+0 0 0
+0 0 0
+0.011293 0.0023728 -0.00162058
+0 0 0
+0 0 0
+0.00667087 0.00673575 0.00830204
+0 0 0
+0 0 0
+-0.00457327 0.00738199 -0.00752211
+0 0 0
+0 0 0
+0.00240177 0.00386395 -0.00885774
+0 0 0
+0 0 0
+0.00179201 -0.0039175 0.011268
+0 0 0
+0 0 0
+-0.00550549 -0.00299643 -0.0141434
+0 0 0
+0 0 0
+0.0110754 -0.0107651 -0.00455432
+0 0 0
+0 0 0
+-0.0012042 0.0109416 0.0073278
+0 0 0
+0 0 0
+-0.00462405 0.00272162 -0.00563186
+0 0 0
+0 0 0
+-0.00446361 0.00305647 -0.00557687
+0 0 0
+0 0 0
+-0.00479249 -0.0023906 -0.00537644
+0 0 0
+0 0 0
+0.000218472 -7.79049e-05 0.00022778
+0 0 0
+0 0 0
+0.00126681 0.0043772 0.00223408
+0 0 0
+0 0 0
+0.00266291 0.0121499 0.00253468
+0 0 0
+0 0 0
+0.00377818 -0.00403103 -0.00662095
+0 0 0
+0 0 0
+0.00405306 -0.010958 0.000944912
+0 0 0
+0 0 0
+0.00623464 0.0055801 0.00221952
+0 0 0
+0 0 0
+0.00134412 -0.00560573 -0.012621
+0 0 0
+0 0 0
+-0.00265205 0.000862359 -0.00481339
+0 0 0
+0 0 0
+-0.00283012 -0.00196254 0.000205237
+0 0 0
+0 0 0
+0.0022089 -0.0122849 0.00789778
+0 0 0
+0 0 0
+-0.00402984 -0.00335158 0.00521635
+0 0 0
+0 0 0
+0.0031057 0.00584977 -0.00154202
+0 0 0
+0 0 0
+-0.00725435 0.00117917 0.00998382
+0 0 0
+0 0 0
+-0.00247647 0.0105986 -0.00100717
+0 0 0
+0 0 0
+0.00435314 -0.00189825 -0.00404794
+0 0 0
+0 0 0
+-0.00423777 -0.00447855 0.00218047
+0 0 0
+0 0 0
+-0.00463711 -0.0064934 0.00910422
+0 0 0
+0 0 0
+-0.00489351 0.00603709 -0.00850901
+0 0 0
+0 0 0
+0.00913155 -0.00641446 -0.00127634
+0 0 0
+0 0 0
+-0.0116451 -0.00531628 1.97697e-05
+0 0 0
+0 0 0
+0.00114345 0.00287383 0.000625807
+0 0 0
+0 0 0
+-0.00984348 0.00225724 0.00653502
+0 0 0
+0 0 0
+0.0104313 0.000975994 0.00900033
+0 0 0
+0 0 0
+0.00412859 -0.00696284 -0.00344809
+0 0 0
+0 0 0
+0.00959936 -2.24428e-05 -0.00563236
+0 0 0
+0 0 0
+-0.00542279 0.00593008 -0.00736143
+0 0 0
+0 0 0
+-0.00701754 0.00746588 -0.00270905
+0 0 0
+0 0 0
+0.00366143 0.0146677 -0.00151267
+0 0 0
+0 0 0
+-0.00199028 0.000338197 -0.0089612
+0 0 0
+0 0 0
+0.00734889 0.0127305 0.00299241
+0 0 0
+0 0 0
+-0.00370063 -0.00702647 0.00105398
+0 0 0
+0 0 0
+-0.0064799 0.00426535 -0.00660373
+0 0 0
+0 0 0
+0.00861007 0.00490722 0.00809692
+0 0 0
+0 0 0
+-0.00848755 -0.00619738 8.01654e-05
+0 0 0
+0 0 0
+-0.00122198 0.00320425 0.00112039
+0 0 0
+0 0 0
+0.000434575 -0.0117803 0.000588467
+0 0 0
+0 0 0
+-0.00429954 -0.00424946 0.00588094
+0 0 0
+0 0 0
+-0.00461824 -0.00575993 0.00395219
+0 0 0
+0 0 0
+0.00156002 -0.00364309 0.00287154
+0 0 0
+0 0 0
+-0.0135449 0.00692636 -9.61048e-05
+0 0 0
+0 0 0
+0.00301329 -0.00522957 4.33841e-05
+0 0 0
+0 0 0
+-0.00904321 -0.000580172 0.0102671
+0 0 0
+0 0 0
+0.00608885 -0.00260786 -0.00779211
+0 0 0
+0 0 0
+-0.0109682 -0.00622208 0.00550355
+0 0 0
+0 0 0
+-0.00584322 -0.00192433 0.00412798
+0 0 0
+0 0 0
+0.00193331 -0.00661704 -0.00897714
+0 0 0
+0 0 0
+-0.00626029 -0.000182871 0.00196085
+0 0 0
+0 0 0
+-0.0111207 0.00524003 -0.00665566
+0 0 0
+0 0 0
+-0.00203529 -0.00437267 -0.0111891
+0 0 0
+0 0 0
+-0.0125389 -0.00695139 -0.0177612
+0 0 0
+0 0 0
+0.0004607 0.000634291 -0.00501973
+0 0 0
+0 0 0
+0.0125397 -0.00189651 0.0100675
+0 0 0
+0 0 0
+0.00744698 0.000593423 0.00318608
+0 0 0
+0 0 0
+0.00596042 0.00660071 -0.000200972
+0 0 0
+0 0 0
+-0.000684264 -0.00357128 0.00573146
+0 0 0
+0 0 0
+-0.00714149 -0.00380266 -0.0105187
+0 0 0
+0 0 0
+-0.00324607 -3.62298e-05 -0.0119682
+0 0 0
+0 0 0
+-0.000248704 0.00558754 -0.00294958
+0 0 0
+0 0 0
+-0.00101406 -0.00137475 -0.00399083
+0 0 0
+0 0 0
+0.00235001 -0.00549346 0.00546981
+0 0 0
+0 0 0
+0.00333524 0.00497436 0.00746926
+0 0 0
+0 0 0
+-0.00289261 -0.0117721 0.00207717
+0 0 0
+0 0 0
+-0.000553619 -0.00352906 0.00206203
+0 0 0
+0 0 0
+0.0033346 -0.0108761 0.00297936
+0 0 0
+0 0 0
+0.00129912 0.00127006 -0.00603469
+0 0 0
+0 0 0
+-0.003248 0.00948256 0.0102724
+0 0 0
+0 0 0
+0.00504204 0.000582048 0.00231035
+0 0 0
+0 0 0
+-3.21583e-05 0.00332244 -0.00738979
+0 0 0
+0 0 0
+0.00404996 0.00528683 0.00549738
+0 0 0
+0 0 0
+0.00557042 0.00010409 0.00102332
+0 0 0
+0 0 0
+-0.000978292 -0.00942745 -0.0102206
+0 0 0
+0 0 0
+-0.00247267 0.00139915 -0.00120953
+0 0 0
+0 0 0
+0.00750863 -0.00548896 -0.0052133
+0 0 0
+0 0 0
+-0.00950094 -0.00880348 -0.0122136
+0 0 0
+0 0 0
+0.0127548 0.00111406 0.00105907
+0 0 0
+0 0 0
+0.00065762 -0.00351666 0.00697727
+0 0 0
+0 0 0
+0.00126355 -0.0073842 0.00410429
+0 0 0
+0 0 0
+0.0109397 -0.000316843 0.00137756
+0 0 0
+0 0 0
+-0.00307203 0.00134143 0.00646261
+0 0 0
+0 0 0
+-0.00574242 -0.00884047 4.17237e-05
+0 0 0
+0 0 0
+-0.00982327 0.000547087 0.00466283
+0 0 0
+0 0 0
+0.00752131 -0.00193961 0.00157548
+0 0 0
+0 0 0
+4.92052e-05 -0.00519096 -0.000872564
+0 0 0
+0 0 0
+0.00351649 -0.000915721 0.000970035
+0 0 0
+0 0 0
+-0.00372029 -8.73932e-05 -0.0251831
+0 0 0
+0 0 0
+-0.00400627 0.00625105 0.00251951
+0 0 0
+0 0 0
+-0.000110909 0.00508744 0.00839358
+0 0 0
+0 0 0
+0.00611326 -0.00306524 -0.00142923
+0 0 0
+0 0 0
+0.00782981 -0.00340906 -0.00406922
+0 0 0
+0 0 0
+-0.000190903 -0.00154263 0.00536751
+0 0 0
+0 0 0
+-9.94415e-05 0.00185335 0.0155899
+0 0 0
+0 0 0
+0.00893775 -0.0111177 0.00320353
+0 0 0
+0 0 0
+0.00184548 0.00450993 0.00755911
+0 0 0
+0 0 0
+-0.00626532 0.0015126 -0.0110263
+0 0 0
+0 0 0
+-0.00035839 -0.0115278 0.00671803
+0 0 0
+0 0 0
+0.00852357 0.00775893 0.010656
+0 0 0
+0 0 0
+-0.000584206 0.000401975 -0.00237751
+0 0 0
+0 0 0
+-0.00940081 0.00181776 -0.00437106
+0 0 0
+0 0 0
+-0.00440958 -0.0045427 -0.00257425
+0 0 0
+0 0 0
+0.00571874 -0.00294865 0.000157917
+0 0 0
+0 0 0
+-0.00579852 0.0107731 -0.0143884
+0 0 0
+0 0 0
+0.00233874 -0.00914445 -0.00207198
+0 0 0
+0 0 0
+-0.0033589 0.000132715 0.000128613
+0 0 0
+0 0 0
+0.000811778 0.00193113 0.00242102
+0 0 0
+0 0 0
+-0.0104932 0.0121363 0.0043542
+0 0 0
+0 0 0
+0.00363498 -0.000453257 -0.00337384
+0 0 0
+0 0 0
+0.000497956 -0.00385239 0.00251496
+0 0 0
+0 0 0
+-0.0101862 0.00296493 0.00487328
+0 0 0
+0 0 0
+-0.00505561 -0.00775103 -0.00768213
+0 0 0
+0 0 0
+0.00885604 0.00566288 -0.00328645
+0 0 0
+0 0 0
+0.0062952 0.00830102 0.00216781
+0 0 0
+0 0 0
+0.00579276 -0.017033 -0.00568634
+0 0 0
+0 0 0
+-0.00612657 0.00302543 -0.00770251
+0 0 0
+0 0 0
+0.00724789 -0.00588417 0.00484509
+0 0 0
+0 0 0
+0.0109628 0.00160406 -6.15701e-05
+0 0 0
+0 0 0
+-0.0123403 0.00423709 0.0112484
+0 0 0
+0 0 0
+-0.0130442 -0.0040637 0.00195937
+0 0 0
+0 0 0
+-0.00541778 -0.00486646 -0.00326898
+0 0 0
+0 0 0
+0.00679057 -0.0118113 -0.00518252
+0 0 0
+0 0 0
+0.00691046 -0.00670298 0.00687358
+0 0 0
+0 0 0
+0.012726 0.00195975 0.00763887
+0 0 0
+0 0 0
+-0.000351368 0.000794639 -0.000284427
+0 0 0
+0 0 0
+0.00474338 -0.0021102 -0.00328862
+0 0 0
+0 0 0
+0.00992445 0.00399988 -0.0100021
+0 0 0
+0 0 0
+0.00158099 -0.00380202 0.00174893
+0 0 0
+0 0 0
+-0.00917731 0.00298031 -0.000751761
+0 0 0
+0 0 0
+-0.00622 -0.00997059 -0.0030176
+0 0 0
+0 0 0
+0.00353776 -0.00753062 0.00108322
+0 0 0
+0 0 0
+-0.00213755 -0.00172107 0.00208727
+0 0 0
+0 0 0
+-0.00536599 0.00249697 0.00304377
+0 0 0
+0 0 0
+-0.0105118 0.00646966 -0.00959603
+0 0 0
+0 0 0
+0.0093702 -0.00629446 -0.00262255
+0 0 0
+0 0 0
+-0.000617183 0.00415869 -0.0036036
+0 0 0
+0 0 0
+-0.00223882 0.00326023 -0.00867628
+0 0 0
+0 0 0
+-0.00954368 0.00272875 0.00128662
+0 0 0
+0 0 0
+-0.00305069 -0.0092019 -0.00149377
+0 0 0
+0 0 0
+-0.00625916 -0.000305357 0.00722146
+0 0 0
+0 0 0
+-0.000873512 -0.00531736 -0.00484429
+0 0 0
+0 0 0
+-0.00855271 0.00148357 -0.00456348
+0 0 0
+0 0 0
+0.00114646 -0.00586984 -0.00397302
+0 0 0
+0 0 0
+-0.00250203 -0.0131919 -0.00736948
+0 0 0
+0 0 0
+-0.0110194 0.00211562 0.00727081
+0 0 0
+0 0 0
+0.00369183 0.00723357 -0.0017431
+0 0 0
+0 0 0
+0.000749892 0.0050456 0.00258543
+0 0 0
+0 0 0
+-0.0112303 0.00520155 0.00358491
+0 0 0
+0 0 0
+0.00349427 0.00795006 -0.00104609
+0 0 0
+0 0 0
+-0.00359159 -0.000510004 -0.00498805
+0 0 0
+0 0 0
+0.00578254 -0.00257889 -0.014409
+0 0 0
+0 0 0
+-0.00148936 -0.0171766 0.00489431
+0 0 0
+0 0 0
+0.0019544 -0.00401692 0.00123856
+0 0 0
+0 0 0
+-0.00792634 0.00296971 0.00345211
+0 0 0
+0 0 0
+-0.00900034 0.00162356 -0.00402187
+0 0 0
+0 0 0
+-0.00700408 0.00223818 0.000530966
+0 0 0
+0 0 0
+0.00751505 0.000119458 -0.00816129
+0 0 0
+0 0 0
+-0.0095314 -0.00361229 0.00538326
+0 0 0
+0 0 0
+0.00527518 -0.00670344 0.0123899
+0 0 0
+0 0 0
+-0.00414731 0.00463389 0.00481318
+0 0 0
+0 0 0
+0.00472485 -0.00412876 0.00242349
+0 0 0
+0 0 0
+0.00296657 -0.00213154 0.00303298
+0 0 0
+0 0 0
+0.00570969 -0.00609129 0.00413249
+0 0 0
+0 0 0
+0.00554785 -0.013248 0.00513741
+0 0 0
+0 0 0
+-0.00488045 0.0166785 0.0029506
+0 0 0
+0 0 0
+0.00596813 -0.00338202 -0.00889505
+0 0 0
+0 0 0
+-0.00881893 0.0234853 -0.00535284
+0 0 0
+0 0 0
+0.0024038 0.00235989 -0.00685012
+0 0 0
+0 0 0
+-0.00727718 0.00232433 -2.60207e-06
+0 0 0
+0 0 0
+0.0084121 -0.00505206 0.0114788
+0 0 0
+0 0 0
+-0.00408904 0.00101735 0.0021195
+0 0 0
+0 0 0
+-0.00492968 -0.00517093 -0.0034694
+0 0 0
+0 0 0
+0.00301953 -0.00856948 -0.0132677
+0 0 0
+0 0 0
+-0.00860963 -0.00217475 0.00292601
+0 0 0
+0 0 0
+0.0118756 -0.00375922 0.005592
+0 0 0
+0 0 0
+0.00793046 -0.00574258 -0.00316797
+0 0 0
+0 0 0
+-0.0123175 -0.0049586 0.00328871
+0 0 0
+0 0 0
+0.00589391 -0.00322245 -0.00328059
+0 0 0
+0 0 0
+0.00248801 0.0140689 0.00646859
+0 0 0
+0 0 0
+0.00244885 0.00148219 0.00724338
+0 0 0
+0 0 0
+-0.00644078 0.0069158 -0.00199153
+0 0 0
+0 0 0
+-0.00398382 -0.00100592 -0.0019101
+0 0 0
+0 0 0
+-0.000372825 0.00539226 -0.0030465
+0 0 0
+0 0 0
+-0.00615474 0.00218696 -0.00520429
+0 0 0
+0 0 0
+-0.00496496 0.00461637 0.00695779
+0 0 0
+0 0 0
+-0.00446577 0.00867272 0.00969173
+0 0 0
+0 0 0
+0.0031874 0.00615275 0.000261091
+0 0 0
+0 0 0
+-0.0124846 0.00719755 0.00172262
+0 0 0
+0 0 0
+0.00257773 0.00186176 0.010667
+0 0 0
+0 0 0
+0.00358038 -0.00473701 -0.00720138
+0 0 0
+0 0 0
+-0.0149694 -0.00185727 -0.00021333
+0 0 0
+0 0 0
+0.0116844 -0.00221036 -0.0105606
+0 0 0
+0 0 0
+-0.00495932 -0.00154283 0.00216972
+0 0 0
+0 0 0
+-0.0023859 0.00727233 0.000235702
+0 0 0
+0 0 0
+-0.00249437 -0.00441815 -0.00785604
+0 0 0
+0 0 0
+-0.00214143 0.00261316 0.005559
+0 0 0
+0 0 0
+-0.00894323 0.000187232 -0.00144013
+0 0 0
+0 0 0
+0.00220571 0.00042063 0.00377518
+0 0 0
+0 0 0
+0.000226757 -0.00167648 0.002453
+0 0 0
+0 0 0
+0.00376075 0.00355444 -0.00431163
+0 0 0
+0 0 0
+-0.000292835 -0.00119434 -0.00421732
+0 0 0
+0 0 0
+0.00607477 0.00739131 0.00211148
+0 0 0
+0 0 0
+-0.00285813 -0.00306359 0.00456848
+0 0 0
+0 0 0
+0.00457272 -0.00281938 0.00479818
+0 0 0
+0 0 0
+0.00525762 -0.00558723 -0.000263422
+0 0 0
+0 0 0
+0.00389116 -0.00061085 -0.00276716
+0 0 0
+0 0 0
+-0.000212171 0.00988596 0.0175778
+0 0 0
+0 0 0
+-0.00442928 0.00553819 0.00148617
+0 0 0
+0 0 0
+-0.000714365 0.00504897 0.00576845
+0 0 0
+0 0 0
+-6.04871e-05 -0.00401287 -0.00390048
+0 0 0
+0 0 0
+-0.000119989 -0.00251285 -0.00211363
+0 0 0
+0 0 0
+0.00391689 -0.00839261 0.00620425
+0 0 0
+0 0 0
+0.00326177 -0.00306444 -0.00790892
+0 0 0
+0 0 0
+-0.0107716 0.00878749 0.012136
+0 0 0
+0 0 0
+-0.000174977 0.00726454 -0.00845691
+0 0 0
+0 0 0
+0.0116929 -0.00381197 -0.00468123
+0 0 0
+0 0 0
+0.00240735 -0.0022603 0.00534874
+0 0 0
+0 0 0
+-0.00828426 0.0003366 0.000778236
+0 0 0
+0 0 0
+-0.00643031 0.00514468 0.00716998
+0 0 0
+0 0 0
+-0.00257209 0.00243096 -0.00225184
+0 0 0
+0 0 0
+0.0031409 0.00401869 -0.01195
+0 0 0
+0 0 0
+0.00165168 -0.00240414 -0.00373725
+0 0 0
+0 0 0
+-0.00407697 0.00332421 -0.000754158
+0 0 0
+0 0 0
+0.00199188 0.00663597 0.00688589
+0 0 0
+0 0 0
+0.00133673 0.00971044 0.0102803
+0 0 0
+0 0 0
+0.000938547 0.0160236 -0.00305169
+0 0 0
+0 0 0
+0.00747672 -0.0137858 -0.0151276
+0 0 0
+0 0 0
+0.00633957 -0.00224037 0.00392073
+0 0 0
+0 0 0
+0.00309508 0.00174343 -0.00101037
+0 0 0
+0 0 0
+0.00264439 -0.00576956 -0.00187585
+0 0 0
+0 0 0
+0.000205381 -0.00875209 -0.00415406
+0 0 0
+0 0 0
+-0.00277195 -0.00183453 -0.00107621
+0 0 0
+0 0 0
+-0.00120731 -0.00337214 0.0065902
+0 0 0
+0 0 0
+-0.0060859 0.0042336 0.0139527
+0 0 0
+0 0 0
+-0.00509155 0.00983039 0.00234542
+0 0 0
+0 0 0
+-0.00737223 0.00103777 -0.00631613
+0 0 0
+0 0 0
+-0.00367747 -0.00449546 0.00223596
+0 0 0
+0 0 0
+-0.00701202 0.0065699 0.00406277
+0 0 0
+0 0 0
+7.08958e-05 0.00213618 0.00202368
+0 0 0
+0 0 0
+0.00605811 -0.00302957 -0.00282395
+0 0 0
+0 0 0
+0.000540788 0.00650348 0.00448111
+0 0 0
+0 0 0
+0.00838991 0.00442437 -0.00348422
+0 0 0
+0 0 0
+0.000188726 0.00879206 0.00882294
+0 0 0
+0 0 0
+0.00152177 0.00773133 0.00158863
+0 0 0
+0 0 0
+0.0109321 0.000773107 0.00115965
+0 0 0
+0 0 0
+0.00170535 -0.00666294 -0.000112783
+0 0 0
+0 0 0
+-0.000355585 0.00518209 0.00322796
+0 0 0
+0 0 0
+-0.00471169 -0.0013209 0.00756496
+0 0 0
+0 0 0
+-0.00276636 -0.0086318 -0.00649012
+0 0 0
+0 0 0
+-0.00540162 0.0025303 -0.00997197
+0 0 0
+0 0 0
+0.00455967 0.000484408 -0.0125834
+0 0 0
+0 0 0
+0.00393133 -0.00620661 -0.00901512
+0 0 0
+0 0 0
+0.00485128 -0.00020091 -0.00435046
+0 0 0
+0 0 0
+0.0013977 -0.00814448 -0.00348025
+0 0 0
+0 0 0
+-0.00160682 -0.00519595 0.00168266
+0 0 0
+0 0 0
+0.000349327 -0.00199939 0.00643739
+0 0 0
+0 0 0
+-0.000660999 -0.00343742 0.00659076
+0 0 0
+0 0 0
+-0.00754331 0.0143451 -0.0101802
+0 0 0
+0 0 0
diff --git a/examples/openmm_api/forcefield.xml b/examples/openmm_api/forcefield.xml
new file mode 100644
index 000000000..f3e9c3f3d
--- /dev/null
+++ b/examples/openmm_api/forcefield.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/openmm_api/ref_out b/examples/openmm_api/ref_out
new file mode 100644
index 000000000..0ce55e4e2
--- /dev/null
+++ b/examples/openmm_api/ref_out
@@ -0,0 +1,3 @@
+166834.94
+[-8.7891670e+06 -1.6102563e+08 0.0000000e+00 0.0000000e+00
+ 1.7047870e+05]
diff --git a/examples/openmm_api/residues.xml b/examples/openmm_api/residues.xml
new file mode 100644
index 000000000..3d4f36fb8
--- /dev/null
+++ b/examples/openmm_api/residues.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/examples/openmm_api/run.py b/examples/openmm_api/run.py
new file mode 100755
index 000000000..b8565fcf1
--- /dev/null
+++ b/examples/openmm_api/run.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+import sys
+from pathlib import Path
+admp_path = Path(__file__).parent.parent.parent
+sys.path.append(str(admp_path))
+import openmm.app as app
+import openmm.unit as unit
+import jax.numpy as jnp
+from dmff.api import Hamiltonian
+from jax_md import space, partition
+from jax import grad
+
+
+if __name__ == '__main__':
+
+ H = Hamiltonian('forcefield.xml')
+ app.Topology.loadBondDefinitions("residues.xml")
+ pdb = app.PDBFile("water1024.pdb")
+ rc = 4.0
+ # generator stores all force field parameters
+ generator = H.getGenerators()
+ disp_generator = generator[0]
+ pme_generator = generator[1]
+ pme_generator.ref_dip = 'dipole_1024'
+ potentials = H.createPotential(pdb.topology, nonbondedCutoff=rc*unit.angstrom)
+ # pot_fn is the actual energy calculator
+ pot_disp = potentials[0]
+ pot_pme = potentials[1]
+
+ # construct inputs
+ positions = jnp.array(pdb.positions._value) * 10
+ a, b, c = pdb.topology.getPeriodicBoxVectors()
+ box = jnp.array([a._value, b._value, c._value]) * 10
+ # neighbor list
+ displacement_fn, shift_fn = space.periodic_general(box, fractional_coordinates=False)
+ neighbor_list_fn = partition.neighbor_list(displacement_fn, box, rc, 0, format=partition.OrderedSparse)
+ nbr = neighbor_list_fn.allocate(positions)
+ pairs = nbr.idx.T
+
+ print(pot_disp(positions, box, pairs, disp_generator.params))
+ param_grad = grad(pot_disp, argnums=3)(positions, box, pairs, generator[0].params)
+ print(param_grad['mScales'])
+
+ print(pot_pme(positions, box, pairs, pme_generator.params))
+ param_grad = grad(pot_pme, argnums=3)(positions, box, pairs, generator[1].params)
+ print(param_grad['mScales'])
+
+
diff --git a/examples/water_1024/mpidwater.xml b/examples/water_1024/mpidwater.xml
new file mode 100644
index 000000000..4d0c677b8
--- /dev/null
+++ b/examples/water_1024/mpidwater.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/water_1024/ref_out b/examples/water_1024/ref_out
new file mode 100644
index 000000000..d47bf8938
--- /dev/null
+++ b/examples/water_1024/ref_out
@@ -0,0 +1,6 @@
+Electrostatic Energy (kJ/mol)
+-133.75
+Dispersion Energy (kJ/mol)
+54660.043
+Tang-Tonnies Damping (kJ/mol)
+221523.0
diff --git a/examples/water_1024/run_admp.py b/examples/water_1024/run_admp.py
new file mode 100755
index 000000000..7bdb58204
--- /dev/null
+++ b/examples/water_1024/run_admp.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env python
+import sys
+from pathlib import Path
+admp_path = Path(__file__).parent.parent.parent
+sys.path.append(str(admp_path))
+import numpy as np
+import jax.numpy as jnp
+from jax import grad, value_and_grad
+from jax_md import partition, space
+from dmff.admp.multipole import convert_cart2harm
+from dmff.admp.pme import ADMPPmeForce
+from dmff.admp.disp_pme import ADMPDispPmeForce
+from dmff.admp.pairwise import generate_pairwise_interaction, TT_damping_qq_c6_kernel
+from dmff.admp.parser import *
+
+
+# below is the validation code
+if __name__ == '__main__':
+ pdb = 'water1024.pdb'
+ xml = 'mpidwater.xml'
+ pdbinfo = read_pdb(pdb)
+ serials = pdbinfo['serials']
+ names = pdbinfo['names']
+ resNames = pdbinfo['resNames']
+ resSeqs = pdbinfo['resSeqs']
+ positions = pdbinfo['positions']
+ box = pdbinfo['box'] # a, b, c, α, β, γ
+ charges = pdbinfo['charges']
+ positions = jnp.asarray(positions)
+ lx, ly, lz, _, _, _ = box
+ box = jnp.eye(3)*jnp.array([lx, ly, lz])
+
+ mScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+ pScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+ dScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+
+ rc = 4 # in Angstrom
+ ethresh = 1e-4
+
+ n_atoms = len(serials)
+
+ atomTemplate, residueTemplate = read_xml(xml)
+ atomDicts, residueDicts = init_residues(serials, names, resNames, resSeqs, positions, charges, atomTemplate, residueTemplate)
+
+ Q = np.vstack(
+ [(atom.c0, atom.dX*10, atom.dY*10, atom.dZ*10, atom.qXX*300, atom.qYY*300, atom.qZZ*300, atom.qXY*300, atom.qXZ*300, atom.qYZ*300) for atom in atomDicts.values()]
+ )
+ Q = jnp.array(Q)
+ Q_local = convert_cart2harm(Q, 2)
+ axis_type = np.array(
+ [atom.axisType for atom in atomDicts.values()]
+ )
+ axis_indices = np.vstack(
+ [atom.axis_indices for atom in atomDicts.values()]
+ )
+ covalent_map = assemble_covalent(residueDicts, n_atoms)
+
+
+ lmax = 2
+ pmax = 10
+
+ # construct the C list
+ c_list = np.zeros((3, n_atoms))
+ a_list = np.zeros(n_atoms)
+ q_list = np.zeros(n_atoms)
+ b_list = np.zeros(n_atoms)
+ nmol=int(n_atoms/3)
+ for i in range(nmol):
+ a = i*3
+ b = i*3+1
+ c = i*3+2
+ # dispersion coeff
+ c_list[0][a]=37.19677405
+ c_list[0][b]=7.6111103
+ c_list[0][c]=7.6111103
+ c_list[1][a]=85.26810658
+ c_list[1][b]=11.90220148
+ c_list[1][c]=11.90220148
+ c_list[2][a]=134.44874488
+ c_list[2][b]=15.05074749
+ c_list[2][c]=15.05074749
+ # q
+ q_list[a] = -0.741706
+ q_list[b] = 0.370853
+ q_list[c] = 0.370853
+ # b, Bohr^-1
+ b_list[a] = 2.00095977
+ b_list[b] = 1.999519942
+ b_list[c] = 1.999519942
+ # a, Hartree
+ a_list[a] = 458.3777
+ a_list[b] = 0.0317
+ a_list[c] = 0.0317
+
+ # Finish data preparation
+ # -------------------------------------------------------------------------------------
+ # parameters should be ready:
+ # geometric variables: positions, box
+ # atomic parameters: Q_local, c_list
+ # topological parameters: covalent_map, mScales, pScales, dScales
+ # general force field setting parameters: rc, ethresh, lmax, pmax
+
+
+ # get neighbor list using jax_md
+ displacement_fn, shift_fn = space.periodic_general(box, fractional_coordinates=False)
+ neighbor_list_fn = partition.neighbor_list(displacement_fn, box, rc, 0, format=partition.OrderedSparse)
+ nbr = neighbor_list_fn.allocate(positions)
+ pairs = nbr.idx.T
+
+ # electrostatic
+ pme_force = ADMPPmeForce(box, axis_type, axis_indices, covalent_map, rc, ethresh, lmax)
+ pme_force.update_env('kappa', 0.657065221219616)
+ E, F = pme_force.get_forces(positions, box, pairs, Q_local, mScales)
+ print('Electrostatic Energy (kJ/mol)')
+ # E = pme_force.get_energy(positions, box, pairs, Q_local, mScales, pScales, dScales)
+ E, F = pme_force.get_forces(positions, box, pairs, Q_local, mScales)
+ print(E)
+
+
+ # dispersion
+ disp_pme_force = ADMPDispPmeForce(box, covalent_map, rc, ethresh, pmax)
+ disp_pme_force.update_env('kappa', 0.657065221219616)
+ E, F = disp_pme_force.get_forces(positions, box, pairs, c_list.T, mScales)
+ print('Dispersion Energy (kJ/mol)')
+ # E = disp_pme_force.get_energy(positions, box, pairs, c_list.T, mScales)
+ E, F = disp_pme_force.get_forces(positions, box, pairs, c_list.T, mScales)
+ print(E)
+
+
+ # short range damping
+ TT_damping_qq_c6 = value_and_grad(generate_pairwise_interaction(TT_damping_qq_c6_kernel, covalent_map, static_args={}))
+ TT_damping_qq_c6(positions, box, pairs, mScales, a_list, b_list, q_list, c_list[0])
+ print('Tang-Tonnies Damping (kJ/mol)')
+ E, F = TT_damping_qq_c6(positions, box, pairs, mScales, a_list, b_list, q_list, c_list[0])
+ print(E)
+
diff --git a/examples/water_pol_1024/dipole_1024 b/examples/water_pol_1024/dipole_1024
new file mode 100644
index 000000000..e1de509e9
--- /dev/null
+++ b/examples/water_pol_1024/dipole_1024
@@ -0,0 +1,3072 @@
+-9.78037e-05 -0.0102743 -0.00835381
+0 0 0
+0 0 0
+0.0016815 0.00104498 0.00955635
+0 0 0
+0 0 0
+0.0104807 0.0153637 -0.00934142
+0 0 0
+0 0 0
+0.00268184 0.00663563 -0.00085569
+0 0 0
+0 0 0
+0.000439397 0.0120955 -0.00798317
+0 0 0
+0 0 0
+0.00757021 0.00274864 -0.00405105
+0 0 0
+0 0 0
+-0.00374424 -0.00805664 0.00310999
+0 0 0
+0 0 0
+0.00300064 0.00103427 -0.00607688
+0 0 0
+0 0 0
+-0.00513748 0.00259173 0.0138984
+0 0 0
+0 0 0
+0.00611206 0.00178956 0.00330758
+0 0 0
+0 0 0
+0.00309779 -0.0123237 -0.00151633
+0 0 0
+0 0 0
+0.0112893 -0.000925505 -0.00345641
+0 0 0
+0 0 0
+-0.00823225 0.00481008 -0.00517028
+0 0 0
+0 0 0
+0.0105862 -0.0173504 0.00505209
+0 0 0
+0 0 0
+0.00507972 0.00427566 0.00207499
+0 0 0
+0 0 0
+-0.0160562 -0.00375995 -0.000162321
+0 0 0
+0 0 0
+-0.00232523 0.00223238 -0.00650886
+0 0 0
+0 0 0
+0.00907927 0.00168353 -0.00335751
+0 0 0
+0 0 0
+0.000391106 -0.00560563 0.0039132
+0 0 0
+0 0 0
+-0.00129292 -0.0139697 -0.0130065
+0 0 0
+0 0 0
+0.00253837 -0.0116289 -0.00520366
+0 0 0
+0 0 0
+-0.00331825 -0.00396823 -0.00218062
+0 0 0
+0 0 0
+0.0009465 -0.00202349 -0.00330577
+0 0 0
+0 0 0
+-0.0110558 -0.000308164 -0.00228239
+0 0 0
+0 0 0
+0.0124406 -0.00204707 -0.00693733
+0 0 0
+0 0 0
+-0.00173319 -0.00331657 0.00166376
+0 0 0
+0 0 0
+-0.00273922 0.00197408 -0.00392151
+0 0 0
+0 0 0
+-0.00667702 0.00334124 -0.0126923
+0 0 0
+0 0 0
+0.00498793 0.00726738 0.00236643
+0 0 0
+0 0 0
+-0.0100955 -0.0112588 0.0042185
+0 0 0
+0 0 0
+0.0026019 0.000417779 -0.00626278
+0 0 0
+0 0 0
+0.00249888 -0.00228331 0.00721147
+0 0 0
+0 0 0
+0.00445673 0.000574593 -0.00796422
+0 0 0
+0 0 0
+-0.000312778 3.41629e-05 0.000317727
+0 0 0
+0 0 0
+-0.00392655 0.00947377 -0.0015633
+0 0 0
+0 0 0
+-0.00386247 -0.0115072 -0.00401078
+0 0 0
+0 0 0
+-0.00888192 0.00884608 -0.000281786
+0 0 0
+0 0 0
+0.00827756 0.00138916 0.000213653
+0 0 0
+0 0 0
+-0.00314245 0.00726788 -0.000613722
+0 0 0
+0 0 0
+0.00755656 0.00489949 -0.00309753
+0 0 0
+0 0 0
+-0.00633686 0.0115392 0.000473853
+0 0 0
+0 0 0
+0.00195559 0.00604159 -0.00785683
+0 0 0
+0 0 0
+0.00611166 -0.00239653 0.00120471
+0 0 0
+0 0 0
+-0.00724835 -0.00466115 -0.00739829
+0 0 0
+0 0 0
+0.00293285 0.000757116 -0.00542986
+0 0 0
+0 0 0
+-0.00321717 0.00587291 -0.00449816
+0 0 0
+0 0 0
+0.00852951 -0.0073382 0.000909686
+0 0 0
+0 0 0
+0.00462385 0.00435736 0.00220974
+0 0 0
+0 0 0
+-0.000210808 -0.0099051 -0.00681186
+0 0 0
+0 0 0
+0.00519537 0.00774189 0.00934357
+0 0 0
+0 0 0
+-0.00791618 -0.00701282 -0.00573458
+0 0 0
+0 0 0
+-0.00353672 0.00218662 0.00116191
+0 0 0
+0 0 0
+-0.000824194 0.00763499 0.0101212
+0 0 0
+0 0 0
+-0.00582191 0.00637928 0.00340626
+0 0 0
+0 0 0
+0.00135849 0.000574534 0.00486814
+0 0 0
+0 0 0
+0.00672225 0.00484596 0.00758249
+0 0 0
+0 0 0
+0.000442829 0.00999001 -0.00079784
+0 0 0
+0 0 0
+-0.00374611 -0.0162288 0.0117805
+0 0 0
+0 0 0
+-0.00257662 0.00363066 -0.00124877
+0 0 0
+0 0 0
+-0.000491337 -0.00467918 0.0066654
+0 0 0
+0 0 0
+-0.00798403 0.00187673 -0.000592901
+0 0 0
+0 0 0
+0.000873825 -0.00367945 -0.00136084
+0 0 0
+0 0 0
+-0.0124228 -0.00596143 -0.0102283
+0 0 0
+0 0 0
+-0.000180247 0.000531004 -0.00128713
+0 0 0
+0 0 0
+-0.00415982 -0.0141561 0.00939265
+0 0 0
+0 0 0
+-0.0100344 0.0038062 0.00366314
+0 0 0
+0 0 0
+0.00392728 -0.00100683 0.00206949
+0 0 0
+0 0 0
+0.0115188 0.00717167 -0.00074889
+0 0 0
+0 0 0
+0.00628949 0.00640248 0.000293654
+0 0 0
+0 0 0
+-0.00909805 -0.000491437 0.00161602
+0 0 0
+0 0 0
+-0.00177572 0.00675042 0.00826887
+0 0 0
+0 0 0
+-0.00197614 0.0110562 -0.00612657
+0 0 0
+0 0 0
+0.00971752 -0.00739067 0.00357604
+0 0 0
+0 0 0
+0.000195267 -0.00786269 0.00607746
+0 0 0
+0 0 0
+-0.0103708 0.00245087 -0.00041738
+0 0 0
+0 0 0
+0.00256772 0.00215356 -0.000762005
+0 0 0
+0 0 0
+0.00379047 -0.000474574 -0.00298218
+0 0 0
+0 0 0
+-0.000165421 -0.00055532 0.0148757
+0 0 0
+0 0 0
+0.0111802 0.0136549 -0.0320468
+0 0 0
+0 0 0
+0.0153225 -0.0103171 -0.00227375
+0 0 0
+0 0 0
+-0.00212336 0.00274542 -0.00933705
+0 0 0
+0 0 0
+0.00616534 0.0130132 5.47625e-05
+0 0 0
+0 0 0
+-0.00929046 0.00852819 -0.00192719
+0 0 0
+0 0 0
+-0.00241705 0.00226907 -0.00449038
+0 0 0
+0 0 0
+-0.00920485 -0.00746917 0.000557805
+0 0 0
+0 0 0
+-0.0058951 0.00506319 0.00270818
+0 0 0
+0 0 0
+0.00583662 -0.0012291 0.00289874
+0 0 0
+0 0 0
+0.0094816 0.0109469 0.00114495
+0 0 0
+0 0 0
+-0.00838529 -0.00821476 -0.00669953
+0 0 0
+0 0 0
+0.00484815 -0.00317928 0.00731462
+0 0 0
+0 0 0
+0.00497919 0.00490789 -0.00180653
+0 0 0
+0 0 0
+0.00854981 0.010314 -0.00320549
+0 0 0
+0 0 0
+-0.00415836 -0.00892292 -0.00167608
+0 0 0
+0 0 0
+-0.00813587 0.0118199 0.00557071
+0 0 0
+0 0 0
+-0.00374275 0.000783917 0.0064928
+0 0 0
+0 0 0
+0.00324764 0.00810909 0.00293951
+0 0 0
+0 0 0
+-0.00546086 -0.00241054 0.0110425
+0 0 0
+0 0 0
+-0.0138394 0.00240158 0.00286925
+0 0 0
+0 0 0
+0.00511851 -0.000957279 -0.00176611
+0 0 0
+0 0 0
+0.0115771 -0.00931405 0.00416637
+0 0 0
+0 0 0
+-0.00225243 0.00246387 -0.00268514
+0 0 0
+0 0 0
+0.00691816 -0.00831442 -0.00121352
+0 0 0
+0 0 0
+-0.0063306 -7.31156e-05 0.00572808
+0 0 0
+0 0 0
+0.00167653 0.000132109 0.00343913
+0 0 0
+0 0 0
+-0.0070473 -1.97325e-05 -0.00325234
+0 0 0
+0 0 0
+-0.00632247 0.00179402 -0.000831321
+0 0 0
+0 0 0
+0.0011576 0.00842738 0.0113516
+0 0 0
+0 0 0
+-0.00183084 -0.00155541 0.00883301
+0 0 0
+0 0 0
+0.00855752 0.00973545 -0.00203578
+0 0 0
+0 0 0
+0.00460251 -0.00150441 0.00506528
+0 0 0
+0 0 0
+0.00819739 -0.00207966 -0.0023709
+0 0 0
+0 0 0
+0.000726014 0.00133864 -0.00837828
+0 0 0
+0 0 0
+0.00369728 0.000264355 0.00346401
+0 0 0
+0 0 0
+-0.00573303 -3.45729e-05 -0.00555133
+0 0 0
+0 0 0
+-0.00605226 -0.00217764 -0.000867023
+0 0 0
+0 0 0
+0.00851709 0.00977362 0.00438207
+0 0 0
+0 0 0
+-0.00262633 0.00541108 -0.000277135
+0 0 0
+0 0 0
+-0.00421868 -0.00682932 -0.00906488
+0 0 0
+0 0 0
+-0.00142311 -0.0044121 -0.00267245
+0 0 0
+0 0 0
+0.000599986 -0.00220729 0.00549257
+0 0 0
+0 0 0
+0.00717203 -0.00041221 0.000839776
+0 0 0
+0 0 0
+0.00742294 0.00505202 -0.0103032
+0 0 0
+0 0 0
+-0.0111505 0.00713828 0.00812535
+0 0 0
+0 0 0
+-0.00696046 0.00317351 0.0191618
+0 0 0
+0 0 0
+-0.00271005 -0.00500413 -0.00472108
+0 0 0
+0 0 0
+0.00053514 0.00124973 0.00329028
+0 0 0
+0 0 0
+0.00563814 0.00313616 -0.00026369
+0 0 0
+0 0 0
+0.00595883 -0.00569338 -0.00611885
+0 0 0
+0 0 0
+0.00934765 -0.00487378 -0.00983422
+0 0 0
+0 0 0
+0.00666574 0.000534592 0.00150635
+0 0 0
+0 0 0
+-0.00220394 4.45494e-05 0.00307866
+0 0 0
+0 0 0
+-0.00300268 -0.00505015 -0.00646803
+0 0 0
+0 0 0
+-0.00426093 0.00399821 0.00430969
+0 0 0
+0 0 0
+1.48552e-05 -0.00805093 0.00708488
+0 0 0
+0 0 0
+0.00200509 -0.00705536 0.00506572
+0 0 0
+0 0 0
+-0.00122102 0.00183551 0.00300795
+0 0 0
+0 0 0
+0.00216416 -0.000855585 0.00626019
+0 0 0
+0 0 0
+-0.00305724 -0.00194739 -0.00753175
+0 0 0
+0 0 0
+0.00749589 -0.00599059 -0.00142094
+0 0 0
+0 0 0
+-0.0120168 -0.000174821 0.0115427
+0 0 0
+0 0 0
+-0.00466727 0.00351428 0.000158967
+0 0 0
+0 0 0
+0.00485732 0.00239818 0.00676465
+0 0 0
+0 0 0
+-0.00503949 0.006335 -0.00551739
+0 0 0
+0 0 0
+0.00171117 -0.00296434 -0.00286245
+0 0 0
+0 0 0
+0.0122505 0.00883528 0.000622401
+0 0 0
+0 0 0
+-0.00164902 0.0044269 -0.000943952
+0 0 0
+0 0 0
+-0.00284898 -0.0144255 0.00235835
+0 0 0
+0 0 0
+-0.0165456 0.00239321 0.00289284
+0 0 0
+0 0 0
+-0.00349088 0.018868 0.00731126
+0 0 0
+0 0 0
+0.0026674 0.00167464 0.00127276
+0 0 0
+0 0 0
+0.000301781 -0.00243539 0.00916902
+0 0 0
+0 0 0
+0.00395351 0.0048905 0.00153711
+0 0 0
+0 0 0
+0.0173634 -0.0051964 -0.00931404
+0 0 0
+0 0 0
+-0.000329681 0.00648045 -0.0215546
+0 0 0
+0 0 0
+-0.00381817 -0.00415355 -0.00564167
+0 0 0
+0 0 0
+-0.00607825 0.0247509 -0.00142847
+0 0 0
+0 0 0
+0.0127189 0.00414365 -0.00481488
+0 0 0
+0 0 0
+0.0091679 -0.000535909 0.0127363
+0 0 0
+0 0 0
+-0.00545698 0.00499536 0.00473193
+0 0 0
+0 0 0
+0.01518 0.0142544 0.0123285
+0 0 0
+0 0 0
+-0.000168485 -0.00438238 0.00517892
+0 0 0
+0 0 0
+0.0123714 0.0058073 -0.00344789
+0 0 0
+0 0 0
+-0.00534167 0.00642355 -0.00244599
+0 0 0
+0 0 0
+-5.04759e-05 -0.00515571 0.00720749
+0 0 0
+0 0 0
+-0.00191556 -0.000748099 0.00149025
+0 0 0
+0 0 0
+0.00661331 0.000687613 -0.010089
+0 0 0
+0 0 0
+-1.26257e-05 -0.00515542 0.00494464
+0 0 0
+0 0 0
+0.00789357 -0.00877575 0.0132735
+0 0 0
+0 0 0
+-0.00507882 0.00816196 0.00899426
+0 0 0
+0 0 0
+-0.00772275 -0.0129865 -0.00602754
+0 0 0
+0 0 0
+-0.000565926 0.00545582 -5.91464e-05
+0 0 0
+0 0 0
+0.00109049 0.000202086 -0.00667453
+0 0 0
+0 0 0
+-0.0109158 -0.0123817 0.0094091
+0 0 0
+0 0 0
+0.00406096 0.00660004 -0.00386767
+0 0 0
+0 0 0
+0.00138359 0.00457259 0.00378496
+0 0 0
+0 0 0
+-0.00281692 0.00027646 -5.7857e-05
+0 0 0
+0 0 0
+0.00209406 0.00231404 0.0101979
+0 0 0
+0 0 0
+0.00367972 0.000890963 0.00273223
+0 0 0
+0 0 0
+-0.0111618 -0.00342381 -0.0123016
+0 0 0
+0 0 0
+-0.00486201 0.00574302 -0.0151186
+0 0 0
+0 0 0
+0.00497567 -0.000638303 -0.00333819
+0 0 0
+0 0 0
+-0.00292046 0.00976949 -0.00699919
+0 0 0
+0 0 0
+-0.00674894 0.00165761 0.0147542
+0 0 0
+0 0 0
+-0.00782643 -0.0077367 -0.00260987
+0 0 0
+0 0 0
+-0.00358134 -0.00303959 0.00114245
+0 0 0
+0 0 0
+0.000642828 -0.000335948 -0.000605209
+0 0 0
+0 0 0
+0.000740505 -0.00511259 -0.00503279
+0 0 0
+0 0 0
+-0.0054111 0.00134348 0.000486883
+0 0 0
+0 0 0
+-0.00516649 0.00567091 0.00305135
+0 0 0
+0 0 0
+0.000676043 0.00485579 0.000172391
+0 0 0
+0 0 0
+-0.00582053 -0.00402091 0.00033397
+0 0 0
+0 0 0
+0.00448973 0.00281377 -0.000227784
+0 0 0
+0 0 0
+0.00336178 0.00764535 -0.003802
+0 0 0
+0 0 0
+-0.00186275 0.00400589 0.00343895
+0 0 0
+0 0 0
+-0.00556406 -0.00528317 -0.00993338
+0 0 0
+0 0 0
+0.00199889 0.00195948 0.00458751
+0 0 0
+0 0 0
+-0.00353912 0.00494606 0.00680142
+0 0 0
+0 0 0
+0.00122442 0.0020615 0.00264405
+0 0 0
+0 0 0
+0.00721288 -0.00291954 0.00214669
+0 0 0
+0 0 0
+0.000453011 -0.00715159 0.00695737
+0 0 0
+0 0 0
+-0.00772907 -0.00301497 -0.0167101
+0 0 0
+0 0 0
+0.00840813 0.00133569 0.00613421
+0 0 0
+0 0 0
+0.00380602 0.0068309 0.00171629
+0 0 0
+0 0 0
+-0.000842832 0.00536671 -0.00349201
+0 0 0
+0 0 0
+-0.00930383 -0.000269109 0.00486243
+0 0 0
+0 0 0
+-0.00586819 0.00280701 -0.00832121
+0 0 0
+0 0 0
+0.00453673 -0.00212405 -0.00713174
+0 0 0
+0 0 0
+0.00378363 -0.00642744 -0.0019263
+0 0 0
+0 0 0
+-0.0017643 -0.000354975 0.00164927
+0 0 0
+0 0 0
+-0.00384344 -0.0118822 -0.00289207
+0 0 0
+0 0 0
+0.00653117 0.00974485 0.000399904
+0 0 0
+0 0 0
+0.00616974 -0.00482934 -0.0105603
+0 0 0
+0 0 0
+0.00487945 0.00496005 0.00550319
+0 0 0
+0 0 0
+-0.001882 0.00272243 -0.00392331
+0 0 0
+0 0 0
+-0.000258219 -0.00482456 -0.00125412
+0 0 0
+0 0 0
+0.0116988 0.00129067 -0.00170155
+0 0 0
+0 0 0
+0.0134901 -0.00518862 -0.000939032
+0 0 0
+0 0 0
+-0.00691896 0.0112497 -0.00346503
+0 0 0
+0 0 0
+-0.00223103 0.00535906 -4.1665e-05
+0 0 0
+0 0 0
+-2.84113e-05 -0.00198621 0.00316068
+0 0 0
+0 0 0
+0.00370225 0.0021758 -0.00100787
+0 0 0
+0 0 0
+0.000723029 -0.00813053 -0.0028756
+0 0 0
+0 0 0
+-0.00868476 0.00874568 -0.000411086
+0 0 0
+0 0 0
+0.00474037 0.0105608 0.008347
+0 0 0
+0 0 0
+0.00105959 -0.000831815 -0.00437098
+0 0 0
+0 0 0
+-0.0180633 0.000180752 0.00379154
+0 0 0
+0 0 0
+0.00180955 -0.00641551 -0.00596799
+0 0 0
+0 0 0
+0.00783451 0.00619785 -0.00527733
+0 0 0
+0 0 0
+0.00328143 0.00140044 0.0101086
+0 0 0
+0 0 0
+-0.00395973 0.000926564 -0.00639365
+0 0 0
+0 0 0
+0.0116767 0.00177171 0.00991388
+0 0 0
+0 0 0
+0.00125404 0.00278407 -0.00472855
+0 0 0
+0 0 0
+-0.00125579 0.000624749 0.0060266
+0 0 0
+0 0 0
+0.00024747 -0.000230718 0.00470209
+0 0 0
+0 0 0
+-0.0153942 0.00410741 -0.00831551
+0 0 0
+0 0 0
+0.0131303 0.00158128 0.00383424
+0 0 0
+0 0 0
+-0.00726297 -0.0099383 0.00170768
+0 0 0
+0 0 0
+0.0173814 0.00807743 0.00770488
+0 0 0
+0 0 0
+-0.00765138 -0.000946928 -0.0102351
+0 0 0
+0 0 0
+-0.00219384 0.00179744 -0.00375232
+0 0 0
+0 0 0
+-0.00690129 0.0079468 0.00535078
+0 0 0
+0 0 0
+0.00017198 -0.00910768 0.00467808
+0 0 0
+0 0 0
+-0.00634841 -0.00477623 -0.00380467
+0 0 0
+0 0 0
+0.00133153 -0.0059827 -0.00504477
+0 0 0
+0 0 0
+-0.00430244 0.0129161 0.00239997
+0 0 0
+0 0 0
+-0.00653367 0.00107805 -0.0130591
+0 0 0
+0 0 0
+-0.00474991 -0.0090749 -0.0041393
+0 0 0
+0 0 0
+-0.00241338 -0.00945678 0.00421321
+0 0 0
+0 0 0
+-0.00949361 -0.00939561 4.8179e-05
+0 0 0
+0 0 0
+0.00626106 0.00213605 -0.00219957
+0 0 0
+0 0 0
+-0.00376815 0.0090755 0.00511605
+0 0 0
+0 0 0
+-0.00447132 -0.000220265 -0.00298141
+0 0 0
+0 0 0
+0.000745011 0.00206621 0.00441078
+0 0 0
+0 0 0
+0.0102733 -0.00412785 0.00410222
+0 0 0
+0 0 0
+0.00360848 -0.00402273 -0.000746735
+0 0 0
+0 0 0
+0.00746014 0.00899694 -0.0134584
+0 0 0
+0 0 0
+0.00539365 -0.00126786 -0.00533281
+0 0 0
+0 0 0
+0.000201233 -0.00723488 0.00651435
+0 0 0
+0 0 0
+-0.00173645 0.0153581 0.00261489
+0 0 0
+0 0 0
+-0.00599782 -0.00428004 -0.000143669
+0 0 0
+0 0 0
+-0.00385636 0.0049054 0.00167299
+0 0 0
+0 0 0
+-0.000259804 -0.00526562 -0.00875804
+0 0 0
+0 0 0
+-0.0043669 0.00533465 0.00619663
+0 0 0
+0 0 0
+-1.55116e-05 -0.00285167 0.00319511
+0 0 0
+0 0 0
+-0.00521923 0.00560276 0.00942748
+0 0 0
+0 0 0
+0.0108202 0.000175836 -0.000185343
+0 0 0
+0 0 0
+-0.00212986 -0.00169513 0.00530598
+0 0 0
+0 0 0
+0.000363441 -0.0060767 -0.005465
+0 0 0
+0 0 0
+0.0101713 0.00244951 -0.00713465
+0 0 0
+0 0 0
+-0.00838637 0.0039302 -0.00185564
+0 0 0
+0 0 0
+0.00141554 -0.00437349 0.00569813
+0 0 0
+0 0 0
+-0.0039811 -0.00280294 0.00262114
+0 0 0
+0 0 0
+-0.00400322 0.00542208 0.00508549
+0 0 0
+0 0 0
+0.0100751 -0.00585201 -0.00463947
+0 0 0
+0 0 0
+-0.00199921 -0.0060068 -0.00381233
+0 0 0
+0 0 0
+-0.0110949 -0.00229428 -0.00284215
+0 0 0
+0 0 0
+0.00213449 0.00121657 0.00413121
+0 0 0
+0 0 0
+0.00383646 0.00514739 -0.0042205
+0 0 0
+0 0 0
+-0.0138627 0.00386019 -0.00174507
+0 0 0
+0 0 0
+0.000985244 -0.00173199 -0.0027879
+0 0 0
+0 0 0
+-0.00414753 0.00159845 0.0140703
+0 0 0
+0 0 0
+0.00521038 0.00703491 0.00261242
+0 0 0
+0 0 0
+0.00171624 0.00334721 -0.00399361
+0 0 0
+0 0 0
+-0.00341361 0.00249506 -0.00875424
+0 0 0
+0 0 0
+-0.00151917 -0.0129792 -0.000948598
+0 0 0
+0 0 0
+-0.000554986 0.00239804 0.00680182
+0 0 0
+0 0 0
+0.0113353 -0.0015979 -0.004464
+0 0 0
+0 0 0
+-0.00748076 -0.00433667 -0.00525681
+0 0 0
+0 0 0
+0.00349191 0.00795602 -0.000800224
+0 0 0
+0 0 0
+-0.00531439 0.00216725 0.00226485
+0 0 0
+0 0 0
+0.0136866 0.00306299 -0.00109613
+0 0 0
+0 0 0
+0.00598406 -0.00392106 0.0170531
+0 0 0
+0 0 0
+0.00403592 -0.00368901 0.00320945
+0 0 0
+0 0 0
+0.0036205 -0.00556539 -0.00198205
+0 0 0
+0 0 0
+-0.000840349 0.00848007 -0.0040412
+0 0 0
+0 0 0
+-0.00480765 0.00815207 -0.00245005
+0 0 0
+0 0 0
+-0.000278064 -0.00232045 0.00779664
+0 0 0
+0 0 0
+-0.00176203 -0.00320255 0.00373226
+0 0 0
+0 0 0
+0.00444392 -0.00370352 0.00473972
+0 0 0
+0 0 0
+0.000131495 0.0020028 -0.00140803
+0 0 0
+0 0 0
+-0.00755526 0.000769954 0.00504113
+0 0 0
+0 0 0
+-0.0122574 0.0074683 0.00139079
+0 0 0
+0 0 0
+0.00523569 0.00256379 0.011097
+0 0 0
+0 0 0
+-0.000944271 0.00510882 -0.00305778
+0 0 0
+0 0 0
+0.00380519 0.000803686 0.0139614
+0 0 0
+0 0 0
+0.00473881 0.00692148 -0.00141251
+0 0 0
+0 0 0
+0.00197562 0.00833919 -0.000823374
+0 0 0
+0 0 0
+-0.00923064 -0.00456113 -0.00523267
+0 0 0
+0 0 0
+0.007301 0.00165144 -0.00250631
+0 0 0
+0 0 0
+-0.00477963 0.0067898 -0.00160161
+0 0 0
+0 0 0
+-0.012516 -0.0052418 0.00839902
+0 0 0
+0 0 0
+0.00444699 -0.0102143 -0.00771269
+0 0 0
+0 0 0
+0.00409276 0.00234007 0.000916312
+0 0 0
+0 0 0
+0.00526719 -0.0185264 0.00325041
+0 0 0
+0 0 0
+0.00880466 0.00115263 -0.00446445
+0 0 0
+0 0 0
+-0.00670686 -0.00806671 0.00145852
+0 0 0
+0 0 0
+-0.00474324 -0.00648036 -0.00467019
+0 0 0
+0 0 0
+-0.00273532 -0.00396023 0.0137113
+0 0 0
+0 0 0
+0.0106414 0.00195623 -0.00958807
+0 0 0
+0 0 0
+-0.00208171 0.00647457 0.0136989
+0 0 0
+0 0 0
+-0.00277054 0.00697185 -0.000786607
+0 0 0
+0 0 0
+0.00443445 -7.24378e-05 0.012928
+0 0 0
+0 0 0
+-0.00665372 0.00161258 -0.00438756
+0 0 0
+0 0 0
+0.00491655 0.000643814 -0.00301866
+0 0 0
+0 0 0
+0.00497501 0.00911598 -0.00288485
+0 0 0
+0 0 0
+0.0137355 -0.000897699 0.00214739
+0 0 0
+0 0 0
+-0.00992127 -0.0115933 0.00142412
+0 0 0
+0 0 0
+0.010838 0.00745001 0.00533567
+0 0 0
+0 0 0
+0.00487711 -0.00411243 0.00792683
+0 0 0
+0 0 0
+-0.00617018 0.00341602 0.00568542
+0 0 0
+0 0 0
+-0.00648836 0.00118417 0.000778898
+0 0 0
+0 0 0
+0.0116769 -0.00494425 -0.0060414
+0 0 0
+0 0 0
+-0.00154938 -0.00822016 -0.0050833
+0 0 0
+0 0 0
+-0.00104108 0.00444053 -0.00407523
+0 0 0
+0 0 0
+-0.00423669 -0.00203121 0.00542422
+0 0 0
+0 0 0
+-0.00225517 0.00356842 -0.00501592
+0 0 0
+0 0 0
+0.00742022 -0.00558255 0.00207504
+0 0 0
+0 0 0
+0.00255928 -0.00463011 0.00157302
+0 0 0
+0 0 0
+-0.003772 -0.0144524 0.00145796
+0 0 0
+0 0 0
+0.00647517 -0.0100065 0.00908599
+0 0 0
+0 0 0
+-0.00513477 0.0070015 -0.00977665
+0 0 0
+0 0 0
+0.00615323 0.00135278 -0.000273292
+0 0 0
+0 0 0
+3.05568e-05 -0.00373847 -0.00697973
+0 0 0
+0 0 0
+-0.006153 0.00864248 0.00112156
+0 0 0
+0 0 0
+-0.00568615 -0.00401322 -0.0124605
+0 0 0
+0 0 0
+-0.00137967 0.0132382 -0.00871058
+0 0 0
+0 0 0
+0.00749187 0.00809359 0.0027655
+0 0 0
+0 0 0
+0.00344337 -0.000858053 -0.00261067
+0 0 0
+0 0 0
+0.00408897 -0.000775449 -0.00265952
+0 0 0
+0 0 0
+-0.00655454 -4.75993e-05 -0.00105503
+0 0 0
+0 0 0
+0.00816401 0.0113557 0.00755355
+0 0 0
+0 0 0
+0.00593666 0.00975993 0.00388305
+0 0 0
+0 0 0
+0.00275357 0.00385358 -0.00277543
+0 0 0
+0 0 0
+4.33332e-05 -0.00510193 0.008179
+0 0 0
+0 0 0
+-0.00872919 0.000734027 -0.00378913
+0 0 0
+0 0 0
+0.00617901 0.00769192 0.00419363
+0 0 0
+0 0 0
+-0.00109342 0.00751958 -0.00120446
+0 0 0
+0 0 0
+-0.00048848 -0.00316227 -0.00100535
+0 0 0
+0 0 0
+0.0071404 0.00331869 0.00237351
+0 0 0
+0 0 0
+-0.00528961 -0.00181138 0.00689482
+0 0 0
+0 0 0
+-0.00155324 0.00337207 -0.00375005
+0 0 0
+0 0 0
+-0.00495499 -0.000730756 -0.00124974
+0 0 0
+0 0 0
+0.00398968 0.0038799 0.0151003
+0 0 0
+0 0 0
+-0.00112601 -0.01042 -0.00604923
+0 0 0
+0 0 0
+0.00749994 0.016104 0.00779907
+0 0 0
+0 0 0
+-0.000534727 0.0124048 -0.00376745
+0 0 0
+0 0 0
+-0.00622813 0.00463624 0.00581452
+0 0 0
+0 0 0
+-0.00890926 -0.00442707 0.000775332
+0 0 0
+0 0 0
+-0.0026075 0.00403578 -0.00156429
+0 0 0
+0 0 0
+-0.00890408 0.00562807 -0.00448763
+0 0 0
+0 0 0
+0.00216716 -0.000597816 -3.25555e-05
+0 0 0
+0 0 0
+0.0106718 -0.00254772 0.00601397
+0 0 0
+0 0 0
+-0.00210315 0.010036 -0.00683073
+0 0 0
+0 0 0
+-0.00412363 -0.00501735 2.39248e-05
+0 0 0
+0 0 0
+0.00380111 0.00617459 -0.00894091
+0 0 0
+0 0 0
+2.74765e-05 0.00231631 0.00269336
+0 0 0
+0 0 0
+0.00811216 0.00334474 -0.00424563
+0 0 0
+0 0 0
+0.00523019 0.00516382 0.00493048
+0 0 0
+0 0 0
+-0.00872068 -0.00338244 -0.00143776
+0 0 0
+0 0 0
+-0.00513753 0.000501527 0.00871178
+0 0 0
+0 0 0
+0.00268232 0.00785662 -0.0110786
+0 0 0
+0 0 0
+-0.00708066 -0.00182925 0.00255259
+0 0 0
+0 0 0
+0.00574471 -0.00937093 0.00195592
+0 0 0
+0 0 0
+-0.0207558 0.00424519 -0.00411212
+0 0 0
+0 0 0
+-0.00269112 -5.50584e-05 0.0090933
+0 0 0
+0 0 0
+0.00649523 -0.00522534 0.0119984
+0 0 0
+0 0 0
+0.00184653 -0.00156135 0.00531749
+0 0 0
+0 0 0
+0.00455145 0.00165888 0.00475326
+0 0 0
+0 0 0
+0.00134256 -0.00393319 0.00145788
+0 0 0
+0 0 0
+-0.00820249 -0.00236175 0.00256002
+0 0 0
+0 0 0
+-0.00193078 -0.00184435 0.005038
+0 0 0
+0 0 0
+-0.0090793 0.0147179 0.00467211
+0 0 0
+0 0 0
+-0.0116564 0.00360824 -0.00770429
+0 0 0
+0 0 0
+0.00311589 0.00840098 0.0109078
+0 0 0
+0 0 0
+0.00716835 -0.00385999 -0.00127767
+0 0 0
+0 0 0
+0.00258053 -0.00080086 -0.00473543
+0 0 0
+0 0 0
+-0.00123194 0.00359063 -0.00066747
+0 0 0
+0 0 0
+-0.00951223 0.00627194 -0.0150627
+0 0 0
+0 0 0
+0.00486615 -0.00159079 -0.00148924
+0 0 0
+0 0 0
+0.00314454 -0.00596072 0.00406933
+0 0 0
+0 0 0
+0.00486675 0.00491107 -0.00886611
+0 0 0
+0 0 0
+0.000734497 0.000297587 -0.00596506
+0 0 0
+0 0 0
+-0.00161904 -0.00142299 0.00634615
+0 0 0
+0 0 0
+0.00675008 -0.0109899 0.000388379
+0 0 0
+0 0 0
+0.00144554 0.00213518 0.00559968
+0 0 0
+0 0 0
+-0.000720239 0.0134748 -0.00869992
+0 0 0
+0 0 0
+0.00717222 0.00113444 0.0055613
+0 0 0
+0 0 0
+0.00781443 0.000444542 0.0030511
+0 0 0
+0 0 0
+0.00221679 -0.000130216 -0.00548201
+0 0 0
+0 0 0
+0.00171526 0.00734596 0.00203386
+0 0 0
+0 0 0
+-0.0039064 -0.0104554 0.000399374
+0 0 0
+0 0 0
+0.00584727 0.00144045 0.000274483
+0 0 0
+0 0 0
+0.00516783 0.00426457 -0.0143043
+0 0 0
+0 0 0
+-0.00474601 -0.00235291 0.000397881
+0 0 0
+0 0 0
+0.00755857 0.00188103 0.00320434
+0 0 0
+0 0 0
+-0.00426726 -0.00109589 0.0165226
+0 0 0
+0 0 0
+0.00713365 -4.55887e-05 0.00195486
+0 0 0
+0 0 0
+0.00158311 -0.00927924 -0.00230793
+0 0 0
+0 0 0
+0.00620242 0.011783 -0.00438166
+0 0 0
+0 0 0
+-0.00539693 -0.00421021 -0.00527274
+0 0 0
+0 0 0
+0.000164041 0.00265239 0.00169114
+0 0 0
+0 0 0
+0.0119003 -0.000456783 -0.00861385
+0 0 0
+0 0 0
+0.00273708 -0.00317232 0.000571188
+0 0 0
+0 0 0
+-0.00277059 0.00613508 0.00955964
+0 0 0
+0 0 0
+6.20349e-05 0.000759368 -0.0112123
+0 0 0
+0 0 0
+0.00179608 -0.00155297 0.00512596
+0 0 0
+0 0 0
+0.000420892 0.0150032 -0.00647116
+0 0 0
+0 0 0
+0.00518406 -0.000423618 0.00292132
+0 0 0
+0 0 0
+-0.00573205 0.00112254 -0.000273207
+0 0 0
+0 0 0
+-3.81649e-05 0.00337933 -0.004071
+0 0 0
+0 0 0
+-0.000274954 0.00571913 -0.00981177
+0 0 0
+0 0 0
+-0.00359237 0.000524398 -0.000719584
+0 0 0
+0 0 0
+-0.00982088 0.00729321 -0.00721955
+0 0 0
+0 0 0
+-0.0113816 0.000116968 0.0111103
+0 0 0
+0 0 0
+0.00536528 -0.00558504 0.0092849
+0 0 0
+0 0 0
+0.00240374 0.000793927 -0.000829274
+0 0 0
+0 0 0
+0.0003959 0.0161029 -0.0123399
+0 0 0
+0 0 0
+0.00659893 -0.00457911 0.00316985
+0 0 0
+0 0 0
+-0.00396848 -0.00862119 -0.00176495
+0 0 0
+0 0 0
+-0.00423259 0.00311431 0.00191266
+0 0 0
+0 0 0
+-6.71786e-05 0.00323088 -0.00127701
+0 0 0
+0 0 0
+-0.00126559 0.000966813 -0.00750536
+0 0 0
+0 0 0
+-0.000425813 -0.00600583 -0.00668664
+0 0 0
+0 0 0
+0.000993072 -3.30014e-05 -0.00281287
+0 0 0
+0 0 0
+-0.00388765 0.00208246 -0.00637908
+0 0 0
+0 0 0
+-0.0102478 0.00383845 -0.00605035
+0 0 0
+0 0 0
+-0.00145633 -0.00272743 -0.00330614
+0 0 0
+0 0 0
+0.0038254 0.00343765 -0.00924427
+0 0 0
+0 0 0
+0.0029194 -0.00173355 0.0082147
+0 0 0
+0 0 0
+0.00389164 -0.00281645 0.00401902
+0 0 0
+0 0 0
+0.00132406 0.00645971 -0.00193459
+0 0 0
+0 0 0
+-0.00443555 -0.00367306 0.00211401
+0 0 0
+0 0 0
+0.00361644 -0.00554034 -0.000556487
+0 0 0
+0 0 0
+-0.00816652 -0.00301106 0.00159141
+0 0 0
+0 0 0
+0.000922533 0.00551613 -0.0034803
+0 0 0
+0 0 0
+-0.00448133 -0.00768579 -0.00542865
+0 0 0
+0 0 0
+-0.00897442 -0.00813054 0.00343739
+0 0 0
+0 0 0
+0.0112315 -0.00526866 -0.00205654
+0 0 0
+0 0 0
+0.00598647 -0.00469249 0.0135034
+0 0 0
+0 0 0
+0.00238385 0.00263148 0.00488815
+0 0 0
+0 0 0
+0.000201851 -0.00658192 -0.00837458
+0 0 0
+0 0 0
+-0.0129833 0.00404143 -0.0103602
+0 0 0
+0 0 0
+-0.00353081 0.00654926 -0.000838028
+0 0 0
+0 0 0
+-0.00206083 0.00264097 -0.00883039
+0 0 0
+0 0 0
+-0.0199792 0.00615182 -0.00858546
+0 0 0
+0 0 0
+0.0131274 0.00202401 -0.000880445
+0 0 0
+0 0 0
+-0.00237159 -0.00948707 0.00149959
+0 0 0
+0 0 0
+0.00241635 0.00267771 -0.000176131
+0 0 0
+0 0 0
+0.00466032 0.00565396 -0.00435013
+0 0 0
+0 0 0
+0.000495749 0.00112638 0.00391566
+0 0 0
+0 0 0
+0.00235042 0.00579774 0.00742377
+0 0 0
+0 0 0
+0.00335742 0.00318086 8.41622e-05
+0 0 0
+0 0 0
+-0.00426161 0.00155765 -0.00239891
+0 0 0
+0 0 0
+-0.00645769 -0.00152078 -0.00508459
+0 0 0
+0 0 0
+0.00171664 0.00734575 0.00876927
+0 0 0
+0 0 0
+-0.00683414 -0.012482 0.00482593
+0 0 0
+0 0 0
+-0.0087467 0.00263012 -0.00581131
+0 0 0
+0 0 0
+-0.00326845 -0.00187102 0.00124958
+0 0 0
+0 0 0
+-0.00513068 -0.000512351 0.000603066
+0 0 0
+0 0 0
+-0.00508731 -0.0020882 -0.00178493
+0 0 0
+0 0 0
+-0.00647826 -0.00178114 -0.0034949
+0 0 0
+0 0 0
+0.00400768 0.00141598 -0.00496786
+0 0 0
+0 0 0
+-0.00716939 0.00236964 -0.00102244
+0 0 0
+0 0 0
+-0.000564689 0.000163341 0.00357506
+0 0 0
+0 0 0
+-0.0111344 -0.00589656 0.00855062
+0 0 0
+0 0 0
+0.0103814 0.000813909 -0.013441
+0 0 0
+0 0 0
+0.0012136 0.0121394 0.00982309
+0 0 0
+0 0 0
+-0.00287196 0.00225899 -0.00108555
+0 0 0
+0 0 0
+-0.00196389 0.00432086 0.00501563
+0 0 0
+0 0 0
+-0.00299923 -0.00102258 -0.00351208
+0 0 0
+0 0 0
+0.00140759 -0.00436262 0.00199213
+0 0 0
+0 0 0
+-0.00274136 -0.00299786 -0.000191826
+0 0 0
+0 0 0
+0.00477441 -0.0100246 0.00471075
+0 0 0
+0 0 0
+0.00389904 0.00182929 -0.00386228
+0 0 0
+0 0 0
+0.000922772 -0.00512827 0.004667
+0 0 0
+0 0 0
+-0.00445715 0.00794886 -0.00728157
+0 0 0
+0 0 0
+0.00881122 -0.0161461 -0.00140791
+0 0 0
+0 0 0
+-0.00815015 0.00822859 -0.0128629
+0 0 0
+0 0 0
+-6.82674e-06 -0.00306171 0.00621439
+0 0 0
+0 0 0
+0.00369373 -0.0010271 0.00799434
+0 0 0
+0 0 0
+0.0132349 -0.000776803 -0.00606303
+0 0 0
+0 0 0
+0.000634928 -0.000281338 -0.012283
+0 0 0
+0 0 0
+-0.00644853 0.00306387 -0.010262
+0 0 0
+0 0 0
+-0.00212269 0.0036937 0.00533351
+0 0 0
+0 0 0
+0.00762542 -0.0021037 -0.00886201
+0 0 0
+0 0 0
+-0.0063626 -0.00563334 -0.0159235
+0 0 0
+0 0 0
+-0.00671488 0.00303675 0.0056239
+0 0 0
+0 0 0
+0.00750959 7.6692e-05 -0.00090799
+0 0 0
+0 0 0
+-0.0104471 0.00626451 -0.00326013
+0 0 0
+0 0 0
+-0.00836174 -0.001506 0.0021701
+0 0 0
+0 0 0
+-0.00440654 -0.00706568 -0.00848981
+0 0 0
+0 0 0
+-0.0100327 0.00672638 0.000298856
+0 0 0
+0 0 0
+0.009307 -0.00452801 -0.00688817
+0 0 0
+0 0 0
+0.00039989 0.00138093 -0.0193926
+0 0 0
+0 0 0
+0.0065403 -0.000380169 0.00320791
+0 0 0
+0 0 0
+-0.00315648 0.0072228 -0.0003275
+0 0 0
+0 0 0
+-0.0117857 -0.00589439 0.00195353
+0 0 0
+0 0 0
+0.00580987 -0.00343652 0.000966513
+0 0 0
+0 0 0
+-0.00448846 0.00277202 0.00742759
+0 0 0
+0 0 0
+-0.0114456 -0.00549094 -0.00280814
+0 0 0
+0 0 0
+-0.00327284 -0.00379359 0.0230008
+0 0 0
+0 0 0
+0.00614033 0.0127026 -0.00418378
+0 0 0
+0 0 0
+0.00554789 0.00184763 0.00266543
+0 0 0
+0 0 0
+0.00096221 0.00180696 0.00193641
+0 0 0
+0 0 0
+0.0140344 -0.00313163 0.000820456
+0 0 0
+0 0 0
+0.000117658 -0.0121214 -0.0054652
+0 0 0
+0 0 0
+-0.00183439 -0.00668513 0.00617271
+0 0 0
+0 0 0
+-0.00175261 0.0049828 -0.00995336
+0 0 0
+0 0 0
+-0.0056706 -0.00145515 -0.00606375
+0 0 0
+0 0 0
+0.00234411 -0.0118614 -0.00432863
+0 0 0
+0 0 0
+0.00998704 -0.00989919 0.00802651
+0 0 0
+0 0 0
+0.00486571 -0.0127314 0.0025783
+0 0 0
+0 0 0
+-0.00474719 0.00615223 0.00521325
+0 0 0
+0 0 0
+-0.00652802 0.0058852 0.00376914
+0 0 0
+0 0 0
+0.0091372 0.00450637 -0.00687716
+0 0 0
+0 0 0
+0.0041062 -0.00828464 0.00900524
+0 0 0
+0 0 0
+-0.00607062 -0.000622962 0.00315057
+0 0 0
+0 0 0
+0.00845301 -0.0065166 0.0018492
+0 0 0
+0 0 0
+0.0047877 0.00854886 0.00139394
+0 0 0
+0 0 0
+-0.0158224 -0.00143655 -0.00611237
+0 0 0
+0 0 0
+0.0043129 -0.00301445 0.00440395
+0 0 0
+0 0 0
+-0.00806805 0.00203253 0.00719313
+0 0 0
+0 0 0
+-0.00524786 -0.0130403 0.00655455
+0 0 0
+0 0 0
+-0.000175413 -0.00964908 0.00232741
+0 0 0
+0 0 0
+0.00368534 0.00590777 0.00288669
+0 0 0
+0 0 0
+0.00443607 -0.013501 0.00850765
+0 0 0
+0 0 0
+-0.00993035 0.00983662 0.00363892
+0 0 0
+0 0 0
+-0.00996917 -0.00152383 -0.00135017
+0 0 0
+0 0 0
+0.00526837 0.00607015 -0.0013118
+0 0 0
+0 0 0
+0.00609916 -0.0082983 -0.000264844
+0 0 0
+0 0 0
+-0.00387733 0.00590646 0.00393398
+0 0 0
+0 0 0
+-0.00846331 0.00206114 0.00653824
+0 0 0
+0 0 0
+0.00113531 -0.00612903 -0.00840422
+0 0 0
+0 0 0
+-0.00672038 -0.00109449 -0.000930985
+0 0 0
+0 0 0
+-0.000268656 0.00556976 0.0101456
+0 0 0
+0 0 0
+-0.00513066 -0.000557194 0.00731675
+0 0 0
+0 0 0
+-0.00906247 0.0105676 -0.00155757
+0 0 0
+0 0 0
+0.00179599 -0.0147625 0.00343308
+0 0 0
+0 0 0
+-0.0120912 -0.00666447 -0.0157528
+0 0 0
+0 0 0
+0.00373289 -0.00131986 0.00374035
+0 0 0
+0 0 0
+-0.00406617 -0.00176933 -0.00446159
+0 0 0
+0 0 0
+0.00102568 -0.00358104 0.0010095
+0 0 0
+0 0 0
+0.00415779 -0.00189882 0.00129712
+0 0 0
+0 0 0
+0.00426023 0.00663336 0.00123081
+0 0 0
+0 0 0
+-0.00660598 -0.00805062 0.00335618
+0 0 0
+0 0 0
+9.70251e-05 0.00534526 0.0105646
+0 0 0
+0 0 0
+-0.00764076 7.84859e-05 0.000601265
+0 0 0
+0 0 0
+-0.00578001 0.00734675 -0.0111852
+0 0 0
+0 0 0
+-0.0137841 0.0086404 0.0041699
+0 0 0
+0 0 0
+-0.000640876 0.00462616 -0.00215098
+0 0 0
+0 0 0
+-0.00431746 -0.00526841 -0.00733081
+0 0 0
+0 0 0
+0.00568041 -0.00135586 -0.00337801
+0 0 0
+0 0 0
+-0.00466626 -0.00185631 -0.000236038
+0 0 0
+0 0 0
+0.000291314 -0.0096219 -0.00859722
+0 0 0
+0 0 0
+-0.00680453 0.000138534 -0.00281652
+0 0 0
+0 0 0
+0.00259367 -0.00481295 -0.00671646
+0 0 0
+0 0 0
+0.00967184 -0.00861731 -0.00200471
+0 0 0
+0 0 0
+-0.00249749 -0.000653724 0.0102747
+0 0 0
+0 0 0
+-0.00141921 -0.00746222 -0.000300505
+0 0 0
+0 0 0
+0.014133 -0.00140395 0.00618404
+0 0 0
+0 0 0
+-0.00627151 -0.000221657 0.00293184
+0 0 0
+0 0 0
+0.00283671 0.00444701 0.0118262
+0 0 0
+0 0 0
+-0.00194982 0.00503133 -0.00311647
+0 0 0
+0 0 0
+0.00683718 -0.0020753 -0.00837432
+0 0 0
+0 0 0
+-0.0039261 -0.00339169 -0.00228657
+0 0 0
+0 0 0
+0.00891401 -0.0122539 0.00349816
+0 0 0
+0 0 0
+-0.00657787 0.011347 -0.00660283
+0 0 0
+0 0 0
+-0.00360846 -0.00227785 0.00821676
+0 0 0
+0 0 0
+0.000577046 0.00478593 0.00807533
+0 0 0
+0 0 0
+0.000932683 -0.00611472 0.00246673
+0 0 0
+0 0 0
+0.000135176 -0.0050431 -0.00584669
+0 0 0
+0 0 0
+0.00353952 0.0116529 0.00986702
+0 0 0
+0 0 0
+-0.00202005 -0.00421147 0.00344777
+0 0 0
+0 0 0
+-0.00844195 -0.0027405 0.00230446
+0 0 0
+0 0 0
+0.0108843 0.00743999 0.00408008
+0 0 0
+0 0 0
+-0.00648177 0.00332184 -0.013516
+0 0 0
+0 0 0
+0.0020348 -0.0019706 0.00143609
+0 0 0
+0 0 0
+-0.00894585 -0.00826925 -0.00178079
+0 0 0
+0 0 0
+0.00553935 -0.00267986 -0.00253104
+0 0 0
+0 0 0
+-0.00305134 0.00583623 -0.00739897
+0 0 0
+0 0 0
+-0.00394194 -1.32329e-05 -0.00999173
+0 0 0
+0 0 0
+0.00893717 0.00478107 0.00887741
+0 0 0
+0 0 0
+-0.00696607 0.0129804 0.00478155
+0 0 0
+0 0 0
+0.0125157 0.00775603 -0.00541937
+0 0 0
+0 0 0
+0.00614587 0.000334967 -0.00582479
+0 0 0
+0 0 0
+0.00444609 -0.00452177 -0.0024907
+0 0 0
+0 0 0
+0.00568596 0.00355087 0.00307766
+0 0 0
+0 0 0
+-0.000212521 -0.000481007 -0.0120924
+0 0 0
+0 0 0
+-0.00856549 0.016597 -0.0106743
+0 0 0
+0 0 0
+-0.00512974 -0.000323899 -0.00282713
+0 0 0
+0 0 0
+-0.00806675 0.00163984 0.00195218
+0 0 0
+0 0 0
+-0.00391853 0.00907969 0.0101102
+0 0 0
+0 0 0
+-0.0117093 0.00218797 -0.00634259
+0 0 0
+0 0 0
+-0.00666481 -0.0023475 -0.00114939
+0 0 0
+0 0 0
+-0.000952004 -0.0081216 -0.00373511
+0 0 0
+0 0 0
+0.00418 0.00620319 0.00874108
+0 0 0
+0 0 0
+-7.3767e-05 -0.0119971 -0.00115849
+0 0 0
+0 0 0
+-0.000935112 0.0157036 0.0039211
+0 0 0
+0 0 0
+0.00816722 0.000493054 0.000442144
+0 0 0
+0 0 0
+-0.005006 -0.00687349 0.00381331
+0 0 0
+0 0 0
+0.000310294 -0.00275964 0.00844087
+0 0 0
+0 0 0
+-0.00473476 0.00293338 0.000272867
+0 0 0
+0 0 0
+0.00329065 0.00126441 -0.0105791
+0 0 0
+0 0 0
+-0.00923369 -0.000577163 0.0135639
+0 0 0
+0 0 0
+0.00360204 -0.00329445 0.00371009
+0 0 0
+0 0 0
+0.00146911 -0.0030003 -0.000371737
+0 0 0
+0 0 0
+-0.00593852 0.00952163 -0.00246423
+0 0 0
+0 0 0
+-0.00163578 -0.00898604 -0.00119719
+0 0 0
+0 0 0
+-0.00508426 -0.00863963 -0.0139428
+0 0 0
+0 0 0
+0.0044922 0.00527153 0.00707722
+0 0 0
+0 0 0
+0.00728348 0.00751253 -0.0099345
+0 0 0
+0 0 0
+8.86933e-05 0.0100147 0.00144436
+0 0 0
+0 0 0
+-0.00548055 0.00521455 -0.00424488
+0 0 0
+0 0 0
+-0.00677277 0.00641124 0.00166722
+0 0 0
+0 0 0
+-0.00591776 -0.00591525 -0.00190804
+0 0 0
+0 0 0
+-0.010253 -0.00353694 0.0116582
+0 0 0
+0 0 0
+-0.00499866 0.000927067 -0.0141683
+0 0 0
+0 0 0
+-0.00109298 0.0137397 0.000236658
+0 0 0
+0 0 0
+0.00156093 -0.0074586 -0.00435637
+0 0 0
+0 0 0
+0.00327797 0.00453993 0.00278183
+0 0 0
+0 0 0
+0.00847486 0.000165894 0.00423954
+0 0 0
+0 0 0
+-0.00545126 -0.00682817 -0.00616332
+0 0 0
+0 0 0
+-0.0052267 0.00262957 -0.00801376
+0 0 0
+0 0 0
+0.00153231 0.0077808 -0.000502868
+0 0 0
+0 0 0
+0.013594 -0.00233411 0.00275977
+0 0 0
+0 0 0
+-0.00144232 -0.00147976 0.00287727
+0 0 0
+0 0 0
+0.00292824 0.00278037 0.0104937
+0 0 0
+0 0 0
+-0.00122869 -0.00234407 0.000856831
+0 0 0
+0 0 0
+-0.00244242 -0.00868411 0.00718042
+0 0 0
+0 0 0
+-0.00457629 -0.0017378 0.01069
+0 0 0
+0 0 0
+-0.00628042 0.00138652 -0.00337252
+0 0 0
+0 0 0
+0.00218209 0.00152358 0.00909022
+0 0 0
+0 0 0
+0.00454225 -0.00382933 0.008091
+0 0 0
+0 0 0
+-0.00472447 0.00667049 -0.0103612
+0 0 0
+0 0 0
+-0.0049081 -5.49436e-05 0.00439868
+0 0 0
+0 0 0
+-0.00954798 -0.000201512 0.0065845
+0 0 0
+0 0 0
+-0.00324526 0.000595447 -0.00381746
+0 0 0
+0 0 0
+-0.00763434 -0.00090205 -0.00194541
+0 0 0
+0 0 0
+0.00198814 0.00578744 -0.000779862
+0 0 0
+0 0 0
+-0.000688198 0.0114949 0.00414261
+0 0 0
+0 0 0
+-0.00108493 -0.00313957 -0.00620111
+0 0 0
+0 0 0
+0.00245007 -0.00596181 -0.00800479
+0 0 0
+0 0 0
+-0.00721706 0.00712942 -0.00672955
+0 0 0
+0 0 0
+-0.000701501 0.00887472 0.00321059
+0 0 0
+0 0 0
+-0.0032013 -0.00177762 -0.0021149
+0 0 0
+0 0 0
+-0.000538408 0.00312436 -0.00860098
+0 0 0
+0 0 0
+0.0103738 -0.00722214 0.00250009
+0 0 0
+0 0 0
+0.013557 0.00157096 0.00472307
+0 0 0
+0 0 0
+-0.00963088 -0.00358138 -0.000814807
+0 0 0
+0 0 0
+0.0068548 -0.0082624 -0.00229619
+0 0 0
+0 0 0
+0.00126239 0.00171394 -0.00198714
+0 0 0
+0 0 0
+-0.0122449 -0.00594919 -0.0113161
+0 0 0
+0 0 0
+0.0069462 -0.000991259 0.00430971
+0 0 0
+0 0 0
+0.00169472 -0.00382775 0.00688429
+0 0 0
+0 0 0
+-0.00374482 0.0041494 -0.00349341
+0 0 0
+0 0 0
+0.00264077 0.0153205 0.00356993
+0 0 0
+0 0 0
+-0.0106711 0.00333664 0.00207975
+0 0 0
+0 0 0
+0.00625512 -0.00722697 0.00975507
+0 0 0
+0 0 0
+0.00179893 -0.00375372 0.0045664
+0 0 0
+0 0 0
+0.00585751 -0.00985737 -0.00727691
+0 0 0
+0 0 0
+0.00721199 0.00517744 0.00515994
+0 0 0
+0 0 0
+0.00205052 -0.000386251 -0.00486549
+0 0 0
+0 0 0
+0.00105364 0.0160452 -0.0113438
+0 0 0
+0 0 0
+-0.00785129 -0.00560388 0.00536809
+0 0 0
+0 0 0
+-0.00642731 0.00201075 0.00106536
+0 0 0
+0 0 0
+-0.00355987 -0.00454537 -0.00620665
+0 0 0
+0 0 0
+-0.00272062 0.00612653 -0.00733389
+0 0 0
+0 0 0
+0.000837009 0.00405052 0.00204501
+0 0 0
+0 0 0
+-0.00418927 0.00105216 0.0122133
+0 0 0
+0 0 0
+0.000370949 -0.00971165 -0.00541682
+0 0 0
+0 0 0
+0.00161635 -0.00208605 0.00673349
+0 0 0
+0 0 0
+-0.00633673 -0.00565576 0.00532704
+0 0 0
+0 0 0
+-0.00299303 -0.00601764 0.00182298
+0 0 0
+0 0 0
+-0.00267721 -0.00125627 0.000978926
+0 0 0
+0 0 0
+0.00413449 0.0102757 0.0098778
+0 0 0
+0 0 0
+-0.00425208 0.00382595 -0.00677453
+0 0 0
+0 0 0
+0.00368786 0.00387968 -0.000680429
+0 0 0
+0 0 0
+-0.000685776 -0.0101526 -0.00606549
+0 0 0
+0 0 0
+-0.00527371 0.00606997 -0.00407649
+0 0 0
+0 0 0
+-0.00258942 0.00450496 -0.00198127
+0 0 0
+0 0 0
+0.00653295 0.00131165 -0.00270486
+0 0 0
+0 0 0
+0.00493812 0.00132769 0.000128465
+0 0 0
+0 0 0
+0.00075122 -0.00602458 -0.00201613
+0 0 0
+0 0 0
+-0.00189207 -0.00687412 0.00115203
+0 0 0
+0 0 0
+-0.00651757 0.00568151 -0.0165829
+0 0 0
+0 0 0
+-0.00961899 0.0117321 -0.0069444
+0 0 0
+0 0 0
+-0.00758893 -0.00520547 -0.0091916
+0 0 0
+0 0 0
+0.00906655 -0.00257775 -0.00258799
+0 0 0
+0 0 0
+0.0016406 0.00645168 0.00414394
+0 0 0
+0 0 0
+0.00725697 -0.00285952 0.00654003
+0 0 0
+0 0 0
+-0.00124541 -0.0105508 -0.000232969
+0 0 0
+0 0 0
+-0.0113455 0.00627594 -0.00212383
+0 0 0
+0 0 0
+-0.00913005 0.000598554 0.00108706
+0 0 0
+0 0 0
+0.00247467 0.00681867 -0.0201172
+0 0 0
+0 0 0
+0.00445474 0.000621027 0.00108281
+0 0 0
+0 0 0
+0.00444071 0.00681441 0.00261679
+0 0 0
+0 0 0
+0.0104057 -0.00192148 -0.0061863
+0 0 0
+0 0 0
+-0.0100562 -0.0174935 -0.00504894
+0 0 0
+0 0 0
+-0.000868037 0.0109987 0.00378853
+0 0 0
+0 0 0
+-0.00153837 -0.00645715 0.00337686
+0 0 0
+0 0 0
+0.000652098 -0.00717923 -0.000676504
+0 0 0
+0 0 0
+0.000768651 0.00294557 0.0124985
+0 0 0
+0 0 0
+0.00208068 -0.000570303 0.00543658
+0 0 0
+0 0 0
+0.0047356 -1.66905e-05 0.00314702
+0 0 0
+0 0 0
+-0.0142203 -0.00441478 0.00502748
+0 0 0
+0 0 0
+0.00088405 -0.00368142 -0.0116246
+0 0 0
+0 0 0
+-0.0030213 0.00258623 -0.00522554
+0 0 0
+0 0 0
+0.00104885 -0.0044973 0.000401285
+0 0 0
+0 0 0
+0.00403851 0.00431153 -0.00274422
+0 0 0
+0 0 0
+0.00668549 -0.00486322 -0.000175412
+0 0 0
+0 0 0
+-0.00856369 -0.0082385 -0.00214151
+0 0 0
+0 0 0
+0.00205549 1.6055e-05 0.000233047
+0 0 0
+0 0 0
+0.000879169 -0.00332036 0.00987067
+0 0 0
+0 0 0
+0.00650941 -0.0113659 0.00203311
+0 0 0
+0 0 0
+0.00993201 0.00348225 -0.00291356
+0 0 0
+0 0 0
+0.00635113 -0.00217627 0.0135891
+0 0 0
+0 0 0
+-0.00970261 0.00374055 0.000610234
+0 0 0
+0 0 0
+-0.00896266 0.00239459 -0.00431661
+0 0 0
+0 0 0
+0.00518756 0.00775965 -0.00282974
+0 0 0
+0 0 0
+0.00559174 0.00554503 -0.00120576
+0 0 0
+0 0 0
+0.00849337 0.0080557 0.00380591
+0 0 0
+0 0 0
+0.000540323 -0.00643334 -0.0105604
+0 0 0
+0 0 0
+-0.00156245 -0.00758462 0.0125086
+0 0 0
+0 0 0
+-0.00794204 -0.00250733 -0.00542299
+0 0 0
+0 0 0
+-0.00355442 -0.00290071 0.00246224
+0 0 0
+0 0 0
+0.00155884 0.0142457 0.00301892
+0 0 0
+0 0 0
+-0.00353128 -0.0034646 -0.0076479
+0 0 0
+0 0 0
+0.00685036 0.0069627 -0.000990677
+0 0 0
+0 0 0
+0.00496553 0.00213154 0.00553894
+0 0 0
+0 0 0
+0.0040824 -0.00511406 -0.00680455
+0 0 0
+0 0 0
+0.00133804 0.00170121 0.00385896
+0 0 0
+0 0 0
+-0.00530041 0.00241698 0.00141916
+0 0 0
+0 0 0
+-0.00402113 -5.69676e-05 -0.013654
+0 0 0
+0 0 0
+0.00518423 -0.000940459 -0.00482009
+0 0 0
+0 0 0
+-0.000447888 0.0113943 0.00594572
+0 0 0
+0 0 0
+0.0103079 -0.00855626 0.00113081
+0 0 0
+0 0 0
+-0.00154618 -0.0033909 0.00952552
+0 0 0
+0 0 0
+0.00294382 0.0113649 0.00235659
+0 0 0
+0 0 0
+0.011293 0.0023728 -0.00162058
+0 0 0
+0 0 0
+0.00667087 0.00673575 0.00830204
+0 0 0
+0 0 0
+-0.00457327 0.00738199 -0.00752211
+0 0 0
+0 0 0
+0.00240177 0.00386395 -0.00885774
+0 0 0
+0 0 0
+0.00179201 -0.0039175 0.011268
+0 0 0
+0 0 0
+-0.00550549 -0.00299643 -0.0141434
+0 0 0
+0 0 0
+0.0110754 -0.0107651 -0.00455432
+0 0 0
+0 0 0
+-0.0012042 0.0109416 0.0073278
+0 0 0
+0 0 0
+-0.00462405 0.00272162 -0.00563186
+0 0 0
+0 0 0
+-0.00446361 0.00305647 -0.00557687
+0 0 0
+0 0 0
+-0.00479249 -0.0023906 -0.00537644
+0 0 0
+0 0 0
+0.000218472 -7.79049e-05 0.00022778
+0 0 0
+0 0 0
+0.00126681 0.0043772 0.00223408
+0 0 0
+0 0 0
+0.00266291 0.0121499 0.00253468
+0 0 0
+0 0 0
+0.00377818 -0.00403103 -0.00662095
+0 0 0
+0 0 0
+0.00405306 -0.010958 0.000944912
+0 0 0
+0 0 0
+0.00623464 0.0055801 0.00221952
+0 0 0
+0 0 0
+0.00134412 -0.00560573 -0.012621
+0 0 0
+0 0 0
+-0.00265205 0.000862359 -0.00481339
+0 0 0
+0 0 0
+-0.00283012 -0.00196254 0.000205237
+0 0 0
+0 0 0
+0.0022089 -0.0122849 0.00789778
+0 0 0
+0 0 0
+-0.00402984 -0.00335158 0.00521635
+0 0 0
+0 0 0
+0.0031057 0.00584977 -0.00154202
+0 0 0
+0 0 0
+-0.00725435 0.00117917 0.00998382
+0 0 0
+0 0 0
+-0.00247647 0.0105986 -0.00100717
+0 0 0
+0 0 0
+0.00435314 -0.00189825 -0.00404794
+0 0 0
+0 0 0
+-0.00423777 -0.00447855 0.00218047
+0 0 0
+0 0 0
+-0.00463711 -0.0064934 0.00910422
+0 0 0
+0 0 0
+-0.00489351 0.00603709 -0.00850901
+0 0 0
+0 0 0
+0.00913155 -0.00641446 -0.00127634
+0 0 0
+0 0 0
+-0.0116451 -0.00531628 1.97697e-05
+0 0 0
+0 0 0
+0.00114345 0.00287383 0.000625807
+0 0 0
+0 0 0
+-0.00984348 0.00225724 0.00653502
+0 0 0
+0 0 0
+0.0104313 0.000975994 0.00900033
+0 0 0
+0 0 0
+0.00412859 -0.00696284 -0.00344809
+0 0 0
+0 0 0
+0.00959936 -2.24428e-05 -0.00563236
+0 0 0
+0 0 0
+-0.00542279 0.00593008 -0.00736143
+0 0 0
+0 0 0
+-0.00701754 0.00746588 -0.00270905
+0 0 0
+0 0 0
+0.00366143 0.0146677 -0.00151267
+0 0 0
+0 0 0
+-0.00199028 0.000338197 -0.0089612
+0 0 0
+0 0 0
+0.00734889 0.0127305 0.00299241
+0 0 0
+0 0 0
+-0.00370063 -0.00702647 0.00105398
+0 0 0
+0 0 0
+-0.0064799 0.00426535 -0.00660373
+0 0 0
+0 0 0
+0.00861007 0.00490722 0.00809692
+0 0 0
+0 0 0
+-0.00848755 -0.00619738 8.01654e-05
+0 0 0
+0 0 0
+-0.00122198 0.00320425 0.00112039
+0 0 0
+0 0 0
+0.000434575 -0.0117803 0.000588467
+0 0 0
+0 0 0
+-0.00429954 -0.00424946 0.00588094
+0 0 0
+0 0 0
+-0.00461824 -0.00575993 0.00395219
+0 0 0
+0 0 0
+0.00156002 -0.00364309 0.00287154
+0 0 0
+0 0 0
+-0.0135449 0.00692636 -9.61048e-05
+0 0 0
+0 0 0
+0.00301329 -0.00522957 4.33841e-05
+0 0 0
+0 0 0
+-0.00904321 -0.000580172 0.0102671
+0 0 0
+0 0 0
+0.00608885 -0.00260786 -0.00779211
+0 0 0
+0 0 0
+-0.0109682 -0.00622208 0.00550355
+0 0 0
+0 0 0
+-0.00584322 -0.00192433 0.00412798
+0 0 0
+0 0 0
+0.00193331 -0.00661704 -0.00897714
+0 0 0
+0 0 0
+-0.00626029 -0.000182871 0.00196085
+0 0 0
+0 0 0
+-0.0111207 0.00524003 -0.00665566
+0 0 0
+0 0 0
+-0.00203529 -0.00437267 -0.0111891
+0 0 0
+0 0 0
+-0.0125389 -0.00695139 -0.0177612
+0 0 0
+0 0 0
+0.0004607 0.000634291 -0.00501973
+0 0 0
+0 0 0
+0.0125397 -0.00189651 0.0100675
+0 0 0
+0 0 0
+0.00744698 0.000593423 0.00318608
+0 0 0
+0 0 0
+0.00596042 0.00660071 -0.000200972
+0 0 0
+0 0 0
+-0.000684264 -0.00357128 0.00573146
+0 0 0
+0 0 0
+-0.00714149 -0.00380266 -0.0105187
+0 0 0
+0 0 0
+-0.00324607 -3.62298e-05 -0.0119682
+0 0 0
+0 0 0
+-0.000248704 0.00558754 -0.00294958
+0 0 0
+0 0 0
+-0.00101406 -0.00137475 -0.00399083
+0 0 0
+0 0 0
+0.00235001 -0.00549346 0.00546981
+0 0 0
+0 0 0
+0.00333524 0.00497436 0.00746926
+0 0 0
+0 0 0
+-0.00289261 -0.0117721 0.00207717
+0 0 0
+0 0 0
+-0.000553619 -0.00352906 0.00206203
+0 0 0
+0 0 0
+0.0033346 -0.0108761 0.00297936
+0 0 0
+0 0 0
+0.00129912 0.00127006 -0.00603469
+0 0 0
+0 0 0
+-0.003248 0.00948256 0.0102724
+0 0 0
+0 0 0
+0.00504204 0.000582048 0.00231035
+0 0 0
+0 0 0
+-3.21583e-05 0.00332244 -0.00738979
+0 0 0
+0 0 0
+0.00404996 0.00528683 0.00549738
+0 0 0
+0 0 0
+0.00557042 0.00010409 0.00102332
+0 0 0
+0 0 0
+-0.000978292 -0.00942745 -0.0102206
+0 0 0
+0 0 0
+-0.00247267 0.00139915 -0.00120953
+0 0 0
+0 0 0
+0.00750863 -0.00548896 -0.0052133
+0 0 0
+0 0 0
+-0.00950094 -0.00880348 -0.0122136
+0 0 0
+0 0 0
+0.0127548 0.00111406 0.00105907
+0 0 0
+0 0 0
+0.00065762 -0.00351666 0.00697727
+0 0 0
+0 0 0
+0.00126355 -0.0073842 0.00410429
+0 0 0
+0 0 0
+0.0109397 -0.000316843 0.00137756
+0 0 0
+0 0 0
+-0.00307203 0.00134143 0.00646261
+0 0 0
+0 0 0
+-0.00574242 -0.00884047 4.17237e-05
+0 0 0
+0 0 0
+-0.00982327 0.000547087 0.00466283
+0 0 0
+0 0 0
+0.00752131 -0.00193961 0.00157548
+0 0 0
+0 0 0
+4.92052e-05 -0.00519096 -0.000872564
+0 0 0
+0 0 0
+0.00351649 -0.000915721 0.000970035
+0 0 0
+0 0 0
+-0.00372029 -8.73932e-05 -0.0251831
+0 0 0
+0 0 0
+-0.00400627 0.00625105 0.00251951
+0 0 0
+0 0 0
+-0.000110909 0.00508744 0.00839358
+0 0 0
+0 0 0
+0.00611326 -0.00306524 -0.00142923
+0 0 0
+0 0 0
+0.00782981 -0.00340906 -0.00406922
+0 0 0
+0 0 0
+-0.000190903 -0.00154263 0.00536751
+0 0 0
+0 0 0
+-9.94415e-05 0.00185335 0.0155899
+0 0 0
+0 0 0
+0.00893775 -0.0111177 0.00320353
+0 0 0
+0 0 0
+0.00184548 0.00450993 0.00755911
+0 0 0
+0 0 0
+-0.00626532 0.0015126 -0.0110263
+0 0 0
+0 0 0
+-0.00035839 -0.0115278 0.00671803
+0 0 0
+0 0 0
+0.00852357 0.00775893 0.010656
+0 0 0
+0 0 0
+-0.000584206 0.000401975 -0.00237751
+0 0 0
+0 0 0
+-0.00940081 0.00181776 -0.00437106
+0 0 0
+0 0 0
+-0.00440958 -0.0045427 -0.00257425
+0 0 0
+0 0 0
+0.00571874 -0.00294865 0.000157917
+0 0 0
+0 0 0
+-0.00579852 0.0107731 -0.0143884
+0 0 0
+0 0 0
+0.00233874 -0.00914445 -0.00207198
+0 0 0
+0 0 0
+-0.0033589 0.000132715 0.000128613
+0 0 0
+0 0 0
+0.000811778 0.00193113 0.00242102
+0 0 0
+0 0 0
+-0.0104932 0.0121363 0.0043542
+0 0 0
+0 0 0
+0.00363498 -0.000453257 -0.00337384
+0 0 0
+0 0 0
+0.000497956 -0.00385239 0.00251496
+0 0 0
+0 0 0
+-0.0101862 0.00296493 0.00487328
+0 0 0
+0 0 0
+-0.00505561 -0.00775103 -0.00768213
+0 0 0
+0 0 0
+0.00885604 0.00566288 -0.00328645
+0 0 0
+0 0 0
+0.0062952 0.00830102 0.00216781
+0 0 0
+0 0 0
+0.00579276 -0.017033 -0.00568634
+0 0 0
+0 0 0
+-0.00612657 0.00302543 -0.00770251
+0 0 0
+0 0 0
+0.00724789 -0.00588417 0.00484509
+0 0 0
+0 0 0
+0.0109628 0.00160406 -6.15701e-05
+0 0 0
+0 0 0
+-0.0123403 0.00423709 0.0112484
+0 0 0
+0 0 0
+-0.0130442 -0.0040637 0.00195937
+0 0 0
+0 0 0
+-0.00541778 -0.00486646 -0.00326898
+0 0 0
+0 0 0
+0.00679057 -0.0118113 -0.00518252
+0 0 0
+0 0 0
+0.00691046 -0.00670298 0.00687358
+0 0 0
+0 0 0
+0.012726 0.00195975 0.00763887
+0 0 0
+0 0 0
+-0.000351368 0.000794639 -0.000284427
+0 0 0
+0 0 0
+0.00474338 -0.0021102 -0.00328862
+0 0 0
+0 0 0
+0.00992445 0.00399988 -0.0100021
+0 0 0
+0 0 0
+0.00158099 -0.00380202 0.00174893
+0 0 0
+0 0 0
+-0.00917731 0.00298031 -0.000751761
+0 0 0
+0 0 0
+-0.00622 -0.00997059 -0.0030176
+0 0 0
+0 0 0
+0.00353776 -0.00753062 0.00108322
+0 0 0
+0 0 0
+-0.00213755 -0.00172107 0.00208727
+0 0 0
+0 0 0
+-0.00536599 0.00249697 0.00304377
+0 0 0
+0 0 0
+-0.0105118 0.00646966 -0.00959603
+0 0 0
+0 0 0
+0.0093702 -0.00629446 -0.00262255
+0 0 0
+0 0 0
+-0.000617183 0.00415869 -0.0036036
+0 0 0
+0 0 0
+-0.00223882 0.00326023 -0.00867628
+0 0 0
+0 0 0
+-0.00954368 0.00272875 0.00128662
+0 0 0
+0 0 0
+-0.00305069 -0.0092019 -0.00149377
+0 0 0
+0 0 0
+-0.00625916 -0.000305357 0.00722146
+0 0 0
+0 0 0
+-0.000873512 -0.00531736 -0.00484429
+0 0 0
+0 0 0
+-0.00855271 0.00148357 -0.00456348
+0 0 0
+0 0 0
+0.00114646 -0.00586984 -0.00397302
+0 0 0
+0 0 0
+-0.00250203 -0.0131919 -0.00736948
+0 0 0
+0 0 0
+-0.0110194 0.00211562 0.00727081
+0 0 0
+0 0 0
+0.00369183 0.00723357 -0.0017431
+0 0 0
+0 0 0
+0.000749892 0.0050456 0.00258543
+0 0 0
+0 0 0
+-0.0112303 0.00520155 0.00358491
+0 0 0
+0 0 0
+0.00349427 0.00795006 -0.00104609
+0 0 0
+0 0 0
+-0.00359159 -0.000510004 -0.00498805
+0 0 0
+0 0 0
+0.00578254 -0.00257889 -0.014409
+0 0 0
+0 0 0
+-0.00148936 -0.0171766 0.00489431
+0 0 0
+0 0 0
+0.0019544 -0.00401692 0.00123856
+0 0 0
+0 0 0
+-0.00792634 0.00296971 0.00345211
+0 0 0
+0 0 0
+-0.00900034 0.00162356 -0.00402187
+0 0 0
+0 0 0
+-0.00700408 0.00223818 0.000530966
+0 0 0
+0 0 0
+0.00751505 0.000119458 -0.00816129
+0 0 0
+0 0 0
+-0.0095314 -0.00361229 0.00538326
+0 0 0
+0 0 0
+0.00527518 -0.00670344 0.0123899
+0 0 0
+0 0 0
+-0.00414731 0.00463389 0.00481318
+0 0 0
+0 0 0
+0.00472485 -0.00412876 0.00242349
+0 0 0
+0 0 0
+0.00296657 -0.00213154 0.00303298
+0 0 0
+0 0 0
+0.00570969 -0.00609129 0.00413249
+0 0 0
+0 0 0
+0.00554785 -0.013248 0.00513741
+0 0 0
+0 0 0
+-0.00488045 0.0166785 0.0029506
+0 0 0
+0 0 0
+0.00596813 -0.00338202 -0.00889505
+0 0 0
+0 0 0
+-0.00881893 0.0234853 -0.00535284
+0 0 0
+0 0 0
+0.0024038 0.00235989 -0.00685012
+0 0 0
+0 0 0
+-0.00727718 0.00232433 -2.60207e-06
+0 0 0
+0 0 0
+0.0084121 -0.00505206 0.0114788
+0 0 0
+0 0 0
+-0.00408904 0.00101735 0.0021195
+0 0 0
+0 0 0
+-0.00492968 -0.00517093 -0.0034694
+0 0 0
+0 0 0
+0.00301953 -0.00856948 -0.0132677
+0 0 0
+0 0 0
+-0.00860963 -0.00217475 0.00292601
+0 0 0
+0 0 0
+0.0118756 -0.00375922 0.005592
+0 0 0
+0 0 0
+0.00793046 -0.00574258 -0.00316797
+0 0 0
+0 0 0
+-0.0123175 -0.0049586 0.00328871
+0 0 0
+0 0 0
+0.00589391 -0.00322245 -0.00328059
+0 0 0
+0 0 0
+0.00248801 0.0140689 0.00646859
+0 0 0
+0 0 0
+0.00244885 0.00148219 0.00724338
+0 0 0
+0 0 0
+-0.00644078 0.0069158 -0.00199153
+0 0 0
+0 0 0
+-0.00398382 -0.00100592 -0.0019101
+0 0 0
+0 0 0
+-0.000372825 0.00539226 -0.0030465
+0 0 0
+0 0 0
+-0.00615474 0.00218696 -0.00520429
+0 0 0
+0 0 0
+-0.00496496 0.00461637 0.00695779
+0 0 0
+0 0 0
+-0.00446577 0.00867272 0.00969173
+0 0 0
+0 0 0
+0.0031874 0.00615275 0.000261091
+0 0 0
+0 0 0
+-0.0124846 0.00719755 0.00172262
+0 0 0
+0 0 0
+0.00257773 0.00186176 0.010667
+0 0 0
+0 0 0
+0.00358038 -0.00473701 -0.00720138
+0 0 0
+0 0 0
+-0.0149694 -0.00185727 -0.00021333
+0 0 0
+0 0 0
+0.0116844 -0.00221036 -0.0105606
+0 0 0
+0 0 0
+-0.00495932 -0.00154283 0.00216972
+0 0 0
+0 0 0
+-0.0023859 0.00727233 0.000235702
+0 0 0
+0 0 0
+-0.00249437 -0.00441815 -0.00785604
+0 0 0
+0 0 0
+-0.00214143 0.00261316 0.005559
+0 0 0
+0 0 0
+-0.00894323 0.000187232 -0.00144013
+0 0 0
+0 0 0
+0.00220571 0.00042063 0.00377518
+0 0 0
+0 0 0
+0.000226757 -0.00167648 0.002453
+0 0 0
+0 0 0
+0.00376075 0.00355444 -0.00431163
+0 0 0
+0 0 0
+-0.000292835 -0.00119434 -0.00421732
+0 0 0
+0 0 0
+0.00607477 0.00739131 0.00211148
+0 0 0
+0 0 0
+-0.00285813 -0.00306359 0.00456848
+0 0 0
+0 0 0
+0.00457272 -0.00281938 0.00479818
+0 0 0
+0 0 0
+0.00525762 -0.00558723 -0.000263422
+0 0 0
+0 0 0
+0.00389116 -0.00061085 -0.00276716
+0 0 0
+0 0 0
+-0.000212171 0.00988596 0.0175778
+0 0 0
+0 0 0
+-0.00442928 0.00553819 0.00148617
+0 0 0
+0 0 0
+-0.000714365 0.00504897 0.00576845
+0 0 0
+0 0 0
+-6.04871e-05 -0.00401287 -0.00390048
+0 0 0
+0 0 0
+-0.000119989 -0.00251285 -0.00211363
+0 0 0
+0 0 0
+0.00391689 -0.00839261 0.00620425
+0 0 0
+0 0 0
+0.00326177 -0.00306444 -0.00790892
+0 0 0
+0 0 0
+-0.0107716 0.00878749 0.012136
+0 0 0
+0 0 0
+-0.000174977 0.00726454 -0.00845691
+0 0 0
+0 0 0
+0.0116929 -0.00381197 -0.00468123
+0 0 0
+0 0 0
+0.00240735 -0.0022603 0.00534874
+0 0 0
+0 0 0
+-0.00828426 0.0003366 0.000778236
+0 0 0
+0 0 0
+-0.00643031 0.00514468 0.00716998
+0 0 0
+0 0 0
+-0.00257209 0.00243096 -0.00225184
+0 0 0
+0 0 0
+0.0031409 0.00401869 -0.01195
+0 0 0
+0 0 0
+0.00165168 -0.00240414 -0.00373725
+0 0 0
+0 0 0
+-0.00407697 0.00332421 -0.000754158
+0 0 0
+0 0 0
+0.00199188 0.00663597 0.00688589
+0 0 0
+0 0 0
+0.00133673 0.00971044 0.0102803
+0 0 0
+0 0 0
+0.000938547 0.0160236 -0.00305169
+0 0 0
+0 0 0
+0.00747672 -0.0137858 -0.0151276
+0 0 0
+0 0 0
+0.00633957 -0.00224037 0.00392073
+0 0 0
+0 0 0
+0.00309508 0.00174343 -0.00101037
+0 0 0
+0 0 0
+0.00264439 -0.00576956 -0.00187585
+0 0 0
+0 0 0
+0.000205381 -0.00875209 -0.00415406
+0 0 0
+0 0 0
+-0.00277195 -0.00183453 -0.00107621
+0 0 0
+0 0 0
+-0.00120731 -0.00337214 0.0065902
+0 0 0
+0 0 0
+-0.0060859 0.0042336 0.0139527
+0 0 0
+0 0 0
+-0.00509155 0.00983039 0.00234542
+0 0 0
+0 0 0
+-0.00737223 0.00103777 -0.00631613
+0 0 0
+0 0 0
+-0.00367747 -0.00449546 0.00223596
+0 0 0
+0 0 0
+-0.00701202 0.0065699 0.00406277
+0 0 0
+0 0 0
+7.08958e-05 0.00213618 0.00202368
+0 0 0
+0 0 0
+0.00605811 -0.00302957 -0.00282395
+0 0 0
+0 0 0
+0.000540788 0.00650348 0.00448111
+0 0 0
+0 0 0
+0.00838991 0.00442437 -0.00348422
+0 0 0
+0 0 0
+0.000188726 0.00879206 0.00882294
+0 0 0
+0 0 0
+0.00152177 0.00773133 0.00158863
+0 0 0
+0 0 0
+0.0109321 0.000773107 0.00115965
+0 0 0
+0 0 0
+0.00170535 -0.00666294 -0.000112783
+0 0 0
+0 0 0
+-0.000355585 0.00518209 0.00322796
+0 0 0
+0 0 0
+-0.00471169 -0.0013209 0.00756496
+0 0 0
+0 0 0
+-0.00276636 -0.0086318 -0.00649012
+0 0 0
+0 0 0
+-0.00540162 0.0025303 -0.00997197
+0 0 0
+0 0 0
+0.00455967 0.000484408 -0.0125834
+0 0 0
+0 0 0
+0.00393133 -0.00620661 -0.00901512
+0 0 0
+0 0 0
+0.00485128 -0.00020091 -0.00435046
+0 0 0
+0 0 0
+0.0013977 -0.00814448 -0.00348025
+0 0 0
+0 0 0
+-0.00160682 -0.00519595 0.00168266
+0 0 0
+0 0 0
+0.000349327 -0.00199939 0.00643739
+0 0 0
+0 0 0
+-0.000660999 -0.00343742 0.00659076
+0 0 0
+0 0 0
+-0.00754331 0.0143451 -0.0101802
+0 0 0
+0 0 0
diff --git a/examples/water_pol_1024/dipole_2 b/examples/water_pol_1024/dipole_2
new file mode 100644
index 000000000..42502a4ad
--- /dev/null
+++ b/examples/water_pol_1024/dipole_2
@@ -0,0 +1,6 @@
+2.01895e-05 6.37427e-06 3.93395e-06
+0 0 0
+0 0 0
+4.695950802904462e-06 5.065391118436792e-06 4.843786768364899e-05
+0 0 0
+0 0 0
diff --git a/examples/water_pol_1024/mpidwater.xml b/examples/water_pol_1024/mpidwater.xml
new file mode 100644
index 000000000..a5a77c819
--- /dev/null
+++ b/examples/water_pol_1024/mpidwater.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/water_pol_1024/ref_out b/examples/water_pol_1024/ref_out
new file mode 100644
index 000000000..91dc38b55
--- /dev/null
+++ b/examples/water_pol_1024/ref_out
@@ -0,0 +1,3073 @@
+# Electrostatic Energy (kJ/mol)
+-0.000978037 -0.000978037 -0.0009246344
+-0.102743 -0.102743 -0.10276242
+-0.0835381 -0.0835381 -0.083497904
+0.016815 0.016815 0.016769728
+0.0104498 0.0104498 0.010405844
+0.0955635 0.0955635 0.09559388
+0.104807 0.104807 0.10483148
+0.153637 0.153637 0.15365247
+-0.0934142 -0.0934142 -0.09342755
+0.0268184 0.0268184 0.026805144
+0.0663563 0.0663563 0.06643988
+-0.0085569 -0.0085569 -0.008542149
+0.00439397 0.00439397 0.0043884227
+0.120955 0.120955 0.120904334
+-0.0798317 -0.0798317 -0.07980968
+0.0757021 0.0757021 0.07567475
+0.0274864 0.0274864 0.027549084
+-0.0405105 -0.0405105 -0.040603403
+-0.0374424 -0.0374424 -0.03742649
+-0.0805664 -0.0805664 -0.08054199
+0.0310999 0.0310999 0.031121153
+0.0300064 0.0300064 0.030048737
+0.0103427 0.0103427 0.010275945
+-0.0607688 -0.0607688 -0.06081114
+-0.0513748 -0.0513748 -0.051406108
+0.0259173 0.0259173 0.025934193
+0.138984 0.138984 0.13898748
+0.0611206 0.0611206 0.06107753
+0.0178956 0.0178956 0.017873581
+0.0330758 0.0330758 0.03311796
+0.0309779 0.0309779 0.030901458
+-0.123237 -0.123237 -0.123242036
+-0.0151633 -0.0151633 -0.015105004
+0.112893 0.112893 0.112837195
+-0.00925505 -0.00925505 -0.009250057
+-0.0345641 -0.0345641 -0.034557477
+-0.0823225 -0.0823225 -0.082265384
+0.0481008 0.0481008 0.048090007
+-0.0517028 -0.0517028 -0.051708378
+0.105862 0.105862 0.105848126
+-0.173504 -0.173504 -0.17351273
+0.0505209 0.0505209 0.050505754
+0.0507972 0.0507972 0.050819334
+0.0427566 0.0427566 0.042736936
+0.0207499 0.0207499 0.020860381
+-0.160562 -0.160562 -0.160556
+-0.0375995 -0.0375995 -0.037627235
+-0.00162321 -0.00162321 -0.0016356776
+-0.0232523 -0.0232523 -0.0232629
+0.0223238 0.0223238 0.022284439
+-0.0650886 -0.0650886 -0.0650988
+0.0907927 0.0907927 0.09082768
+0.0168353 0.0168353 0.016714016
+-0.0335751 -0.0335751 -0.033563048
+0.00391106 0.00391106 0.0038506608
+-0.0560563 -0.0560563 -0.056059826
+0.039132 0.039132 0.03908429
+-0.0129292 -0.0129292 -0.01287703
+-0.139697 -0.139697 -0.13972948
+-0.130065 -0.130065 -0.13009194
+0.0253837 0.0253837 0.025352951
+-0.116289 -0.116289 -0.116327606
+-0.0520366 -0.0520366 -0.052090168
+-0.0331825 -0.0331825 -0.033208787
+-0.0396823 -0.0396823 -0.039764084
+-0.0218062 -0.0218062 -0.021800652
+0.009465 0.009465 0.00946171
+-0.0202349 -0.0202349 -0.02020945
+-0.0330577 -0.0330577 -0.033009358
+-0.110558 -0.110558 -0.110641055
+-0.00308164 -0.00308164 -0.0032061008
+-0.0228239 -0.0228239 -0.022786988
+0.124406 0.124406 0.1244152
+-0.0204707 -0.0204707 -0.020548275
+-0.0693733 -0.0693733 -0.06936826
+-0.0173319 -0.0173319 -0.017314244
+-0.0331657 -0.0331657 -0.033111963
+0.0166376 0.0166376 0.016573595
+-0.0273922 -0.0273922 -0.027289782
+0.0197408 0.0197408 0.01972867
+-0.0392151 -0.0392151 -0.039176192
+-0.0667702 -0.0667702 -0.06685412
+0.0334124 0.0334124 0.033450983
+-0.126923 -0.126923 -0.12693891
+0.0498793 0.0498793 0.049883366
+0.0726738 0.0726738 0.07270083
+0.0236643 0.0236643 0.02365815
+-0.100955 -0.100955 -0.10097964
+-0.112588 -0.112588 -0.11249905
+0.042185 0.042185 0.04217768
+0.026019 0.026019 0.026027782
+0.00417779 0.00417779 0.0040939604
+-0.0626278 -0.0626278 -0.06261677
+0.0249888 0.0249888 0.024839833
+-0.0228331 -0.0228331 -0.02278179
+0.0721147 0.0721147 0.07204127
+0.0445673 0.0445673 0.044642683
+0.00574593 0.00574593 0.0056889006
+-0.0796422 -0.0796422 -0.07966513
+-0.00312778 -0.00312778 -0.00310903
+0.000341629 0.000341629 0.00032416594
+0.00317727 0.00317727 0.0032193258
+-0.0392655 -0.0392655 -0.039211046
+0.0947377 0.0947377 0.094688065
+-0.015633 -0.015633 -0.015599208
+-0.0386247 -0.0386247 -0.038676944
+-0.115072 -0.115072 -0.11509355
+-0.0401078 -0.0401078 -0.040103845
+-0.0888192 -0.0888192 -0.08882104
+0.0884608 0.0884608 0.088482276
+-0.00281786 -0.00281786 -0.0027755555
+0.0827756 0.0827756 0.082758315
+0.0138916 0.0138916 0.013870654
+0.00213653 0.00213653 0.0021471833
+-0.0314245 -0.0314245 -0.031465173
+0.0726788 0.0726788 0.072577395
+-0.00613722 -0.00613722 -0.0061118966
+0.0755656 0.0755656 0.075477205
+0.0489949 0.0489949 0.048945636
+-0.0309753 -0.0309753 -0.030980904
+-0.0633686 -0.0633686 -0.063331515
+0.115392 0.115392 0.11540095
+0.00473853 0.00473853 0.004746145
+0.0195559 0.0195559 0.0195736
+0.0604159 0.0604159 0.060439475
+-0.0785683 -0.0785683 -0.078627884
+0.0611166 0.0611166 0.061059937
+-0.0239653 -0.0239653 -0.023952626
+0.0120471 0.0120471 0.011997648
+-0.0724835 -0.0724835 -0.072497904
+-0.0466115 -0.0466115 -0.04660019
+-0.0739829 -0.0739829 -0.074007384
+0.0293285 0.0293285 0.02935563
+0.00757116 0.00757116 0.007629278
+-0.0542986 -0.0542986 -0.054337583
+-0.0321717 -0.0321717 -0.03217816
+0.0587291 0.0587291 0.058676615
+-0.0449816 -0.0449816 -0.045017943
+0.0852951 0.0852951 0.08532782
+-0.073382 -0.073382 -0.07333848
+0.00909686 0.00909686 0.009140668
+0.0462385 0.0462385 0.046188693
+0.0435736 0.0435736 0.043652207
+0.0220974 0.0220974 0.022020265
+-0.00210808 -0.00210808 -0.002062888
+-0.099051 -0.099051 -0.099001996
+-0.0681186 -0.0681186 -0.06808492
+0.0519537 0.0519537 0.051970724
+0.0774189 0.0774189 0.07739804
+0.0934357 0.0934357 0.093465924
+-0.0791618 -0.0791618 -0.07919154
+-0.0701282 -0.0701282 -0.07018024
+-0.0573458 -0.0573458 -0.05735159
+-0.0353672 -0.0353672 -0.03540227
+0.0218662 0.0218662 0.02181031
+0.0116191 0.0116191 0.011622794
+-0.00824194 -0.00824194 -0.008287224
+0.0763499 0.0763499 0.076203
+0.101212 0.101212 0.10113292
+-0.0582191 -0.0582191 -0.05811282
+0.0637928 0.0637928 0.06371929
+0.0340626 0.0340626 0.034065444
+0.0135849 0.0135849 0.013641203
+0.00574534 0.00574534 0.0057200785
+0.0486814 0.0486814 0.048708744
+0.0672225 0.0672225 0.0671852
+0.0484596 0.0484596 0.048546817
+0.0758249 0.0758249 0.07579618
+0.00442829 0.00442829 0.004520492
+0.0999001 0.0999001 0.09987887
+-0.0079784 -0.0079784 -0.007969893
+-0.0374611 -0.0374611 -0.037525218
+-0.162288 -0.162288 -0.1623232
+0.117805 0.117805 0.11780985
+-0.0257662 -0.0257662 -0.025942147
+0.0363066 0.0363066 0.036364634
+-0.0124877 -0.0124877 -0.012436032
+-0.00491337 -0.00491337 -0.0049312925
+-0.0467918 -0.0467918 -0.046847787
+0.066654 0.066654 0.06670604
+-0.0798403 -0.0798403 -0.07975273
+0.0187673 0.0187673 0.018869242
+-0.00592901 -0.00592901 -0.0059065702
+0.00873825 0.00873825 0.0087352665
+-0.0367945 -0.0367945 -0.036789756
+-0.0136084 -0.0136084 -0.013591378
+-0.124228 -0.124228 -0.12422042
+-0.0596143 -0.0596143 -0.059556626
+-0.102283 -0.102283 -0.1022434
+-0.00180247 -0.00180247 -0.0017969046
+0.00531004 0.00531004 0.0053812126
+-0.0128713 -0.0128713 -0.0128396
+-0.0415982 -0.0415982 -0.041574072
+-0.141561 -0.141561 -0.14159442
+0.0939265 0.0939265 0.093931176
+-0.100344 -0.100344 -0.100434124
+0.038062 0.038062 0.038143303
+0.0366314 0.0366314 0.03660018
+0.0392728 0.0392728 0.03925713
+-0.0100683 -0.0100683 -0.010067229
+0.0206949 0.0206949 0.020763243
+0.115188 0.115188 0.115222864
+0.0717167 0.0717167 0.07169772
+-0.0074889 -0.0074889 -0.0074028266
+0.0628949 0.0628949 0.062811285
+0.0640248 0.0640248 0.063950494
+0.00293654 0.00293654 0.0029404445
+-0.0909805 -0.0909805 -0.09095735
+-0.00491437 -0.00491437 -0.004932307
+0.0161602 0.0161602 0.016175274
+-0.0177572 -0.0177572 -0.017717754
+0.0675042 0.0675042 0.06759375
+0.0826887 0.0826887 0.08271368
+-0.0197614 -0.0197614 -0.019786801
+0.110562 0.110562 0.11055801
+-0.0612657 -0.0612657 -0.06124725
+0.0971752 0.0971752 0.09724281
+-0.0739067 -0.0739067 -0.073933385
+0.0357604 0.0357604 0.035735052
+0.00195267 0.00195267 0.0018636361
+-0.0786269 -0.0786269 -0.078644186
+0.0607746 0.0607746 0.060787506
+-0.103708 -0.103708 -0.10375059
+0.0245087 0.0245087 0.024471499
+-0.0041738 -0.0041738 -0.0041777147
+0.0256772 0.0256772 0.025716968
+0.0215356 0.0215356 0.021548763
+-0.00762005 -0.00762005 -0.0075874007
+0.0379047 0.0379047 0.037899196
+-0.00474574 -0.00474574 -0.004721765
+-0.0298218 -0.0298218 -0.02978809
+-0.00165421 -0.00165421 -0.001588367
+-0.0055532 -0.0055532 -0.005577109
+0.148757 0.148757 0.14871967
+0.111802 0.111802 0.1117918
+0.136549 0.136549 0.13650532
+-0.320468 -0.320468 -0.320462
+0.153225 0.153225 0.1532618
+-0.103171 -0.103171 -0.103167646
+-0.0227375 -0.0227375 -0.022724075
+-0.0212336 -0.0212336 -0.02118464
+0.0274542 0.0274542 0.0274457
+-0.0933705 -0.0933705 -0.093353316
+0.0616534 0.0616534 0.061680783
+0.130132 0.130132 0.13006534
+0.000547625 0.000547625 0.0005443875
+-0.0929046 -0.0929046 -0.0928586
+0.0852819 0.0852819 0.08526703
+-0.0192719 -0.0192719 -0.019286837
+-0.0241705 -0.0241705 -0.02414068
+0.0226907 0.0226907 0.022724058
+-0.0449038 -0.0449038 -0.04484582
+-0.0920485 -0.0920485 -0.092061274
+-0.0746917 -0.0746917 -0.07470347
+0.00557805 0.00557805 0.0055826753
+-0.058951 -0.058951 -0.058880307
+0.0506319 0.0506319 0.050631188
+0.0270818 0.0270818 0.027078094
+0.0583662 0.0583662 0.058420297
+-0.012291 -0.012291 -0.012270804
+0.0289874 0.0289874 0.028918037
+0.094816 0.094816 0.09479927
+0.109469 0.109469 0.10941394
+0.0114495 0.0114495 0.011429634
+-0.0838529 -0.0838529 -0.08382618
+-0.0821476 -0.0821476 -0.08226805
+-0.0669953 -0.0669953 -0.06700538
+0.0484815 0.0484815 0.048445
+-0.0317928 -0.0317928 -0.031828027
+0.0731462 0.0731462 0.07308662
+0.0497919 0.0497919 0.049735937
+0.0490789 0.0490789 0.04901715
+-0.0180653 -0.0180653 -0.018020714
+0.0854981 0.0854981 0.085526675
+0.10314 0.10314 0.10313643
+-0.0320549 -0.0320549 -0.032034438
+-0.0415836 -0.0415836 -0.041452892
+-0.0892292 -0.0892292 -0.08931292
+-0.0167608 -0.0167608 -0.016893212
+-0.0813587 -0.0813587 -0.08136736
+0.118199 0.118199 0.11820802
+0.0557071 0.0557071 0.055674415
+-0.0374275 -0.0374275 -0.037347678
+0.00783917 0.00783917 0.007890913
+0.064928 0.064928 0.06490861
+0.0324764 0.0324764 0.032358546
+0.0810909 0.0810909 0.081053086
+0.0293951 0.0293951 0.029413521
+-0.0546086 -0.0546086 -0.054644782
+-0.0241054 -0.0241054 -0.024175035
+0.110425 0.110425 0.11037773
+-0.138394 -0.138394 -0.13835248
+0.0240158 0.0240158 0.024092274
+0.0286925 0.0286925 0.028710723
+0.0511851 0.0511851 0.05115573
+-0.00957279 -0.00957279 -0.009556607
+-0.0176611 -0.0176611 -0.017636163
+0.115771 0.115771 0.115647905
+-0.0931405 -0.0931405 -0.0932004
+0.0416637 0.0416637 0.04166412
+-0.0225243 -0.0225243 -0.022508865
+0.0246387 0.0246387 0.024664078
+-0.0268514 -0.0268514 -0.026871089
+0.0691816 0.0691816 0.06925517
+-0.0831442 -0.0831442 -0.083175905
+-0.0121352 -0.0121352 -0.012140918
+-0.063306 -0.063306 -0.063314565
+-0.000731156 -0.000731156 -0.0007906423
+0.0572808 0.0572808 0.05725406
+0.0167653 0.0167653 0.016748115
+0.00132109 0.00132109 0.0013432668
+0.0343913 0.0343913 0.03439927
+-0.070473 -0.070473 -0.07034348
+-0.000197325 -0.000197325 -0.00022306282
+-0.0325234 -0.0325234 -0.03252341
+-0.0632247 -0.0632247 -0.063233584
+0.0179402 0.0179402 0.018001547
+-0.00831321 -0.00831321 -0.008367036
+0.011576 0.011576 0.011544401
+0.0842738 0.0842738 0.08426384
+0.113516 0.113516 0.113547295
+-0.0183084 -0.0183084 -0.01828569
+-0.0155541 -0.0155541 -0.015506277
+0.0883301 0.0883301 0.08831494
+0.0855752 0.0855752 0.08555199
+0.0973545 0.0973545 0.097332194
+-0.0203578 -0.0203578 -0.02033434
+0.0460251 0.0460251 0.04597338
+-0.0150441 -0.0150441 -0.015036516
+0.0506528 0.0506528 0.05069877
+0.0819739 0.0819739 0.08200692
+-0.0207966 -0.0207966 -0.02084392
+-0.023709 -0.023709 -0.023692662
+0.00726014 0.00726014 0.0072076796
+0.0133864 0.0133864 0.013446498
+-0.0837828 -0.0837828 -0.083746195
+0.0369728 0.0369728 0.037029732
+0.00264355 0.00264355 0.0025497533
+0.0346401 0.0346401 0.034631062
+-0.0573303 -0.0573303 -0.057336174
+-0.000345729 -0.000345729 -0.00031636766
+-0.0555133 -0.0555133 -0.05546037
+-0.0605226 -0.0605226 -0.060453672
+-0.0217764 -0.0217764 -0.021712417
+-0.00867023 -0.00867023 -0.00864398
+0.0851709 0.0851709 0.08517248
+0.0977362 0.0977362 0.0977924
+0.0438207 0.0438207 0.043830406
+-0.0262633 -0.0262633 -0.02630143
+0.0541108 0.0541108 0.054002594
+-0.00277135 -0.00277135 -0.0027500156
+-0.0421868 -0.0421868 -0.042181313
+-0.0682932 -0.0682932 -0.06830339
+-0.0906488 -0.0906488 -0.090633914
+-0.0142311 -0.0142311 -0.014231458
+-0.044121 -0.044121 -0.04405326
+-0.0267245 -0.0267245 -0.026804943
+0.00599986 0.00599986 0.006063796
+-0.0220729 -0.0220729 -0.022104705
+0.0549257 0.0549257 0.054954786
+0.0717203 0.0717203 0.071416795
+-0.0041221 -0.0041221 -0.0045175864
+0.00839776 0.00839776 0.008010078
+0.0742294 0.0742294 0.074223205
+0.0505202 0.0505202 0.050530117
+-0.103032 -0.103032 -0.10296632
+-0.111505 -0.111505 -0.1114385
+0.0713828 0.0713828 0.07128953
+0.0812535 0.0812535 0.08125133
+-0.0696046 -0.0696046 -0.06953201
+0.0317351 0.0317351 0.031725746
+0.191618 0.191618 0.19170819
+-0.0271005 -0.0271005 -0.027154604
+-0.0500413 -0.0500413 -0.05005042
+-0.0472108 -0.0472108 -0.04719324
+0.0053514 0.0053514 0.0053838626
+0.0124973 0.0124973 0.0124764675
+0.0329028 0.0329028 0.032932777
+0.0563814 0.0563814 0.05650941
+0.0313616 0.0313616 0.03134748
+-0.0026369 -0.0026369 -0.0026502088
+0.0595883 0.0595883 0.059607018
+-0.0569338 -0.0569338 -0.05686537
+-0.0611885 -0.0611885 -0.0611406
+0.0934765 0.0934765 0.093386136
+-0.0487378 -0.0487378 -0.04873834
+-0.0983422 -0.0983422 -0.09837132
+0.0666574 0.0666574 0.06668272
+0.00534592 0.00534592 0.0053037493
+0.0150635 0.0150635 0.015073055
+-0.0220394 -0.0220394 -0.022029564
+0.000445494 0.000445494 0.0003903388
+0.0307866 0.0307866 0.030863453
+-0.0300268 -0.0300268 -0.030039322
+-0.0505015 -0.0505015 -0.050498396
+-0.0646803 -0.0646803 -0.06464473
+-0.0426093 -0.0426093 -0.04255173
+0.0399821 0.0399821 0.04000971
+0.0430969 0.0430969 0.043079548
+0.000148552 0.000148552 0.00017447675
+-0.0805093 -0.0805093 -0.08046747
+0.0708488 0.0708488 0.07086003
+0.0200509 0.0200509 0.020118237
+-0.0705536 -0.0705536 -0.07058954
+0.0506572 0.0506572 0.050692085
+-0.0122102 -0.0122102 -0.012164909
+0.0183551 0.0183551 0.01833989
+0.0300795 0.0300795 0.030003676
+0.0216416 0.0216416 0.021638526
+-0.00855585 -0.00855585 -0.008507666
+0.0626019 0.0626019 0.06259921
+-0.0305724 -0.0305724 -0.030623136
+-0.0194739 -0.0194739 -0.019429276
+-0.0753175 -0.0753175 -0.075274296
+0.0749589 0.0749589 0.07486764
+-0.0599059 -0.0599059 -0.05999522
+-0.0142094 -0.0142094 -0.014298606
+-0.120168 -0.120168 -0.12021608
+-0.00174821 -0.00174821 -0.0017270832
+0.115427 0.115427 0.1154785
+-0.0466727 -0.0466727 -0.046653453
+0.0351428 0.0351428 0.035201807
+0.00158967 0.00158967 0.0015880888
+0.0485732 0.0485732 0.048497256
+0.0239818 0.0239818 0.024035318
+0.0676465 0.0676465 0.06762412
+-0.0503949 -0.0503949 -0.050405674
+0.06335 0.06335 0.06344261
+-0.0551739 -0.0551739 -0.05515479
+0.0171117 0.0171117 0.01710396
+-0.0296434 -0.0296434 -0.029561397
+-0.0286245 -0.0286245 -0.028648516
+0.122505 0.122505 0.122483484
+0.0883528 0.0883528 0.08828129
+0.00622401 0.00622401 0.006211636
+-0.0164902 -0.0164902 -0.016565526
+0.044269 0.044269 0.044243645
+-0.00943952 -0.00943952 -0.009446201
+-0.0284898 -0.0284898 -0.028470602
+-0.144255 -0.144255 -0.14422207
+0.0235835 0.0235835 0.023642592
+-0.165456 -0.165456 -0.16543144
+0.0239321 0.0239321 0.02401142
+0.0289284 0.0289284 0.028922588
+-0.0349088 -0.0349088 -0.034977466
+0.18868 0.18868 0.1886104
+0.0731126 0.0731126 0.073079534
+0.026674 0.026674 0.026653694
+0.0167464 0.0167464 0.016700147
+0.0127276 0.0127276 0.012732642
+0.00301781 0.00301781 0.002982808
+-0.0243539 -0.0243539 -0.024304384
+0.0916902 0.0916902 0.09165049
+0.0395351 0.0395351 0.039512184
+0.048905 0.048905 0.04893874
+0.0153711 0.0153711 0.015392842
+0.173634 0.173634 0.17356655
+-0.051964 -0.051964 -0.05194865
+-0.0931404 -0.0931404 -0.09315098
+-0.00329681 -0.00329681 -0.0033676748
+0.0648045 0.0648045 0.06490087
+-0.215546 -0.215546 -0.2155796
+-0.0381817 -0.0381817 -0.038123492
+-0.0415355 -0.0415355 -0.04153915
+-0.0564167 -0.0564167 -0.0564277
+-0.0607825 -0.0607825 -0.060738847
+0.247509 0.247509 0.2474871
+-0.0142847 -0.0142847 -0.0142726395
+0.127189 0.127189 0.12717684
+0.0414365 0.0414365 0.041432805
+-0.0481488 -0.0481488 -0.048198383
+0.091679 0.091679 0.09170518
+-0.00535909 -0.00535909 -0.0053386516
+0.127363 0.127363 0.12732728
+-0.0545698 -0.0545698 -0.054447155
+0.0499536 0.0499536 0.049858663
+0.0473193 0.0473193 0.047307327
+0.1518 0.1518 0.15178397
+0.142544 0.142544 0.14255878
+0.123285 0.123285 0.12326857
+-0.00168485 -0.00168485 -0.0016656278
+-0.0438238 -0.0438238 -0.043788813
+0.0517892 0.0517892 0.051851828
+0.123714 0.123714 0.12371712
+0.058073 0.058073 0.058191456
+-0.0344789 -0.0344789 -0.034499742
+-0.0534167 -0.0534167 -0.05344029
+0.0642355 0.0642355 0.064225726
+-0.0244599 -0.0244599 -0.024514249
+-0.000504759 -0.000504759 -0.0004750383
+-0.0515571 -0.0515571 -0.0516359
+0.0720749 0.0720749 0.07213558
+-0.0191556 -0.0191556 -0.019135823
+-0.00748099 -0.00748099 -0.0074171904
+0.0149025 0.0149025 0.014971369
+0.0661331 0.0661331 0.06616049
+0.00687613 0.00687613 0.0068635982
+-0.10089 -0.10089 -0.10087709
+-0.000126257 -0.000126257 -5.8867907e-05
+-0.0515542 -0.0515542 -0.05158547
+0.0494464 0.0494464 0.049372014
+0.0789357 0.0789357 0.07894717
+-0.0877575 -0.0877575 -0.08772386
+0.132735 0.132735 0.13276571
+-0.0507882 -0.0507882 -0.050832137
+0.0816196 0.0816196 0.08164445
+0.0899426 0.0899426 0.08990606
+-0.0772275 -0.0772275 -0.077208914
+-0.129865 -0.129865 -0.12986654
+-0.0602754 -0.0602754 -0.06026847
+-0.00565926 -0.00565926 -0.005628257
+0.0545582 0.0545582 0.05456818
+-0.000591464 -0.000591464 -0.000547855
+0.0109049 0.0109049 0.010935737
+0.00202086 0.00202086 0.0019697614
+-0.0667453 -0.0667453 -0.06673539
+-0.109158 -0.109158 -0.10911136
+-0.123817 -0.123817 -0.12378063
+0.094091 0.094091 0.09409644
+0.0406096 0.0406096 0.040673077
+0.0660004 0.0660004 0.065971866
+-0.0386767 -0.0386767 -0.03864897
+0.0138359 0.0138359 0.013837757
+0.0457259 0.0457259 0.045742396
+0.0378496 0.0378496 0.037902102
+-0.0281692 -0.0281692 -0.028176215
+0.0027646 0.0027646 0.0028850376
+-0.00057857 -0.00057857 -0.00048496103
+0.0209406 0.0209406 0.02092412
+0.0231404 0.0231404 0.023189994
+0.101979 0.101979 0.10201614
+0.0367972 0.0367972 0.03673919
+0.00890963 0.00890963 0.008917613
+0.0273223 0.0273223 0.027303418
+-0.111618 -0.111618 -0.11158279
+-0.0342381 -0.0342381 -0.034251023
+-0.123016 -0.123016 -0.12299197
+-0.0486201 -0.0486201 -0.04865022
+0.0574302 0.0574302 0.057468362
+-0.151186 -0.151186 -0.15108526
+0.0497567 0.0497567 0.04978037
+-0.00638303 -0.00638303 -0.006367388
+-0.0333819 -0.0333819 -0.033373326
+-0.0292046 -0.0292046 -0.029315235
+0.0976949 0.0976949 0.09771331
+-0.0699919 -0.0699919 -0.069950856
+-0.0674894 -0.0674894 -0.06751139
+0.0165761 0.0165761 0.016496163
+0.147542 0.147542 0.14754157
+-0.0782643 -0.0782643 -0.07828735
+-0.077367 -0.077367 -0.07732352
+-0.0260987 -0.0260987 -0.02612918
+-0.0358134 -0.0358134 -0.035857227
+-0.0303959 -0.0303959 -0.030399794
+0.0114245 0.0114245 0.011449049
+0.00642828 0.00642828 0.0063042156
+-0.00335948 -0.00335948 -0.0033678
+-0.00605209 -0.00605209 -0.0060780626
+0.00740505 0.00740505 0.0073841615
+-0.0511259 -0.0511259 -0.051108476
+-0.0503279 -0.0503279 -0.050352864
+-0.054111 -0.054111 -0.05406063
+0.0134348 0.0134348 0.01349147
+0.00486883 0.00486883 0.0048382413
+-0.0516649 -0.0516649 -0.051658496
+0.0567091 0.0567091 0.056750327
+0.0305135 0.0305135 0.03045678
+0.00676043 0.00676043 0.0067658816
+0.0485579 0.0485579 0.048576593
+0.00172391 0.00172391 0.0017526016
+-0.0582053 -0.0582053 -0.058226902
+-0.0402091 -0.0402091 -0.040189646
+0.0033397 0.0033397 0.0033619627
+0.0448973 0.0448973 0.04495632
+0.0281377 0.0281377 0.02821355
+-0.00227784 -0.00227784 -0.0022286046
+0.0336178 0.0336178 0.033550844
+0.0764535 0.0764535 0.07646347
+-0.03802 -0.03802 -0.03802947
+-0.0186275 -0.0186275 -0.018704426
+0.0400589 0.0400589 0.040103953
+0.0343895 0.0343895 0.034432862
+-0.0556406 -0.0556406 -0.055633236
+-0.0528317 -0.0528317 -0.052845314
+-0.0993338 -0.0993338 -0.09935563
+0.0199889 0.0199889 0.019997537
+0.0195948 0.0195948 0.019483626
+0.0458751 0.0458751 0.045930494
+-0.0353912 -0.0353912 -0.035378076
+0.0494606 0.0494606 0.049478162
+0.0680142 0.0680142 0.067981705
+0.0122442 0.0122442 0.012223012
+0.020615 0.020615 0.020558702
+0.0264405 0.0264405 0.02637688
+0.0721288 0.0721288 0.07221041
+-0.0291954 -0.0291954 -0.02912812
+0.0214669 0.0214669 0.02144871
+0.00453011 0.00453011 0.004514062
+-0.0715159 -0.0715159 -0.07163367
+0.0695737 0.0695737 0.06956942
+-0.0772907 -0.0772907 -0.077249974
+-0.0301497 -0.0301497 -0.030114504
+-0.167101 -0.167101 -0.16704655
+0.0840813 0.0840813 0.084006295
+0.0133569 0.0133569 0.013344025
+0.0613421 0.0613421 0.061376873
+0.0380602 0.0380602 0.038032543
+0.068309 0.068309 0.06829414
+0.0171629 0.0171629 0.017126132
+-0.00842832 -0.00842832 -0.00833476
+0.0536671 0.0536671 0.05371084
+-0.0349201 -0.0349201 -0.034962937
+-0.0930383 -0.0930383 -0.093111895
+-0.00269109 -0.00269109 -0.0026276987
+0.0486243 0.0486243 0.048629157
+-0.0586819 -0.0586819 -0.058664754
+0.0280701 0.0280701 0.028171837
+-0.0832121 -0.0832121 -0.083201714
+0.0453673 0.0453673 0.045281235
+-0.0212405 -0.0212405 -0.021267701
+-0.0713174 -0.0713174 -0.07131481
+0.0378363 0.0378363 0.03787766
+-0.0642744 -0.0642744 -0.06435213
+-0.019263 -0.019263 -0.019242104
+-0.017643 -0.017643 -0.017635528
+-0.00354975 -0.00354975 -0.0036338123
+0.0164927 0.0164927 0.01642857
+-0.0384344 -0.0384344 -0.038522836
+-0.118822 -0.118822 -0.11873856
+-0.0289207 -0.0289207 -0.028928017
+0.0653117 0.0653117 0.06524595
+0.0974485 0.0974485 0.0975431
+0.00399904 0.00399904 0.0039572134
+0.0616974 0.0616974 0.061706454
+-0.0482934 -0.0482934 -0.04830551
+-0.105603 -0.105603 -0.10562928
+0.0487945 0.0487945 0.048828475
+0.0496005 0.0496005 0.049598396
+0.0550319 0.0550319 0.055021226
+-0.01882 -0.01882 -0.018827742
+0.0272243 0.0272243 0.027290192
+-0.0392331 -0.0392331 -0.03919644
+-0.00258219 -0.00258219 -0.0026215166
+-0.0482456 -0.0482456 -0.048237372
+-0.0125412 -0.0125412 -0.012498348
+0.116988 0.116988 0.117036074
+0.0129067 0.0129067 0.012946096
+-0.0170155 -0.0170155 -0.017046172
+0.134901 0.134901 0.13491307
+-0.0518862 -0.0518862 -0.051802173
+-0.00939032 -0.00939032 -0.009417973
+-0.0691896 -0.0691896 -0.06922547
+0.112497 0.112497 0.11242077
+-0.0346503 -0.0346503 -0.034687042
+-0.0223103 -0.0223103 -0.022289256
+0.0535906 0.0535906 0.053550642
+-0.00041665 -0.00041665 -0.00045859633
+-0.000284113 -0.000284113 -0.00023498808
+-0.0198621 -0.0198621 -0.019939108
+0.0316068 0.0316068 0.031546198
+0.0370225 0.0370225 0.0370861
+0.021758 0.021758 0.02172047
+-0.0100787 -0.0100787 -0.010078262
+0.00723029 0.00723029 0.007237036
+-0.0813053 -0.0813053 -0.08130844
+-0.028756 -0.028756 -0.028813183
+-0.0868476 -0.0868476 -0.086828455
+0.0874568 0.0874568 0.08743954
+-0.00411086 -0.00411086 -0.0041121477
+0.0474037 0.0474037 0.047444735
+0.105608 0.105608 0.1054752
+0.08347 0.08347 0.08344441
+0.0105959 0.0105959 0.010661325
+-0.00831815 -0.00831815 -0.008238073
+-0.0437098 -0.0437098 -0.04363599
+-0.180633 -0.180633 -0.18064776
+0.00180752 0.00180752 0.0018405609
+0.0379154 0.0379154 0.0379527
+0.0180955 0.0180955 0.018181404
+-0.0641551 -0.0641551 -0.06419607
+-0.0596799 -0.0596799 -0.059718557
+0.0783451 0.0783451 0.07825375
+0.0619785 0.0619785 0.06200181
+-0.0527733 -0.0527733 -0.052714422
+0.0328143 0.0328143 0.032752816
+0.0140044 0.0140044 0.014086648
+0.101086 0.101086 0.10117824
+-0.0395973 -0.0395973 -0.039591826
+0.00926564 0.00926564 0.009366283
+-0.0639365 -0.0639365 -0.063931786
+0.116767 0.116767 0.11681646
+0.0177171 0.0177171 0.017741183
+0.0991388 0.0991388 0.09915266
+0.0125404 0.0125404 0.012597302
+0.0278407 0.0278407 0.027890783
+-0.0472855 -0.0472855 -0.047250323
+-0.0125579 -0.0125579 -0.012456636
+0.00624749 0.00624749 0.006312309
+0.060266 0.060266 0.060302492
+0.0024747 0.0024747 0.0024431287
+-0.00230718 -0.00230718 -0.0023275912
+0.0470209 0.0470209 0.04702269
+-0.153942 -0.153942 -0.14941238
+0.0410741 0.0410741 0.04174838
+-0.0831551 -0.0831551 -0.08160383
+0.131303 0.131303 0.13129333
+0.0158128 0.0158128 0.01576147
+0.0383424 0.0383424 0.038375523
+-0.0726297 -0.0726297 -0.072602056
+-0.099383 -0.099383 -0.099393
+0.0170768 0.0170768 0.01708737
+0.173814 0.173814 0.17382908
+0.0807743 0.0807743 0.08081902
+0.0770488 0.0770488 0.07708429
+-0.0765138 -0.0765138 -0.07657379
+-0.00946928 -0.00946928 -0.009490019
+-0.102351 -0.102351 -0.10236798
+-0.0219384 -0.0219384 -0.021976773
+0.0179744 0.0179744 0.018017422
+-0.0375232 -0.0375232 -0.037506413
+-0.0690129 -0.0690129 -0.06899768
+0.079468 0.079468 0.07944785
+0.0535078 0.0535078 0.053501338
+0.0017198 0.0017198 0.0017013837
+-0.0910768 -0.0910768 -0.0910576
+0.0467808 0.0467808 0.046825644
+-0.0634841 -0.0634841 -0.063488625
+-0.0477623 -0.0477623 -0.047782123
+-0.0380467 -0.0380467 -0.037982993
+0.0133153 0.0133153 0.013313786
+-0.059827 -0.059827 -0.05982348
+-0.0504477 -0.0504477 -0.050439376
+-0.0430244 -0.0430244 -0.04306354
+0.129161 0.129161 0.1290939
+0.0239997 0.0239997 0.023976618
+-0.0653367 -0.0653367 -0.0653571
+0.0107805 0.0107805 0.010740332
+-0.130591 -0.130591 -0.13058831
+-0.0474991 -0.0474991 -0.047475643
+-0.090749 -0.090749 -0.09077105
+-0.041393 -0.041393 -0.041361053
+-0.0241338 -0.0241338 -0.024113169
+-0.0945678 -0.0945678 -0.09451697
+0.0421321 0.0421321 0.042132944
+-0.0949361 -0.0949361 -0.094967954
+-0.0939561 -0.0939561 -0.093949415
+0.00048179 0.00048179 0.00044340367
+0.0626106 0.0626106 0.06271468
+0.0213605 0.0213605 0.021386068
+-0.0219957 -0.0219957 -0.021999482
+-0.0376815 -0.0376815 -0.03767361
+0.090755 0.090755 0.09067855
+0.0511605 0.0511605 0.0511636
+-0.0447132 -0.0447132 -0.04469984
+-0.00220265 -0.00220265 -0.0022478804
+-0.0298141 -0.0298141 -0.029827833
+0.00745011 0.00745011 0.0073990375
+0.0206621 0.0206621 0.020619877
+0.0441078 0.0441078 0.04410012
+0.102733 0.102733 0.102646105
+-0.0412785 -0.0412785 -0.04124272
+0.0410222 0.0410222 0.040997718
+0.0360848 0.0360848 0.036148906
+-0.0402273 -0.0402273 -0.04025776
+-0.00746735 -0.00746735 -0.0073620225
+0.0746014 0.0746014 0.074619174
+0.0899694 0.0899694 0.09001647
+-0.134584 -0.134584 -0.13458636
+0.0539365 0.0539365 0.053968243
+-0.0126786 -0.0126786 -0.01270712
+-0.0533281 -0.0533281 -0.05332347
+0.00201233 0.00201233 0.002049239
+-0.0723488 -0.0723488 -0.072312616
+0.0651435 0.0651435 0.06515518
+-0.0173645 -0.0173645 -0.017332995
+0.153581 0.153581 0.15354158
+0.0261489 0.0261489 0.026170699
+-0.0599782 -0.0599782 -0.059936535
+-0.0428004 -0.0428004 -0.04278651
+-0.00143669 -0.00143669 -0.0014251182
+-0.0385636 -0.0385636 -0.038541146
+0.049054 0.049054 0.049017347
+0.0167299 0.0167299 0.016696198
+-0.00259804 -0.00259804 -0.00256729
+-0.0526562 -0.0526562 -0.052690446
+-0.0875804 -0.0875804 -0.08759451
+-0.043669 -0.043669 -0.043737266
+0.0533465 0.0533465 0.053258117
+0.0619663 0.0619663 0.061994318
+-0.000155116 -0.000155116 -0.00018958788
+-0.0285167 -0.0285167 -0.028569937
+0.0319511 0.0319511 0.031990714
+-0.0521923 -0.0521923 -0.05218167
+0.0560276 0.0560276 0.05603425
+0.0942748 0.0942748 0.0942532
+0.108202 0.108202 0.10816768
+0.00175836 0.00175836 0.0017989136
+-0.00185343 -0.00185343 -0.0018708399
+-0.0212986 -0.0212986 -0.021323772
+-0.0169513 -0.0169513 -0.016944367
+0.0530598 0.0530598 0.05311359
+0.00363441 0.00363441 0.003649728
+-0.060767 -0.060767 -0.06063083
+-0.05465 -0.05465 -0.054605987
+0.101713 0.101713 0.10164195
+0.0244951 0.0244951 0.02444864
+-0.0713465 -0.0713465 -0.07133801
+-0.0838637 -0.0838637 -0.08388545
+0.039302 0.039302 0.03940227
+-0.0185564 -0.0185564 -0.01851858
+0.0141554 0.0141554 0.0141757205
+-0.0437349 -0.0437349 -0.043808535
+0.0569813 0.0569813 0.05694466
+-0.039811 -0.039811 -0.039831873
+-0.0280294 -0.0280294 -0.028057078
+0.0262114 0.0262114 0.026181499
+-0.0400322 -0.0400322 -0.0400995
+0.0542208 0.0542208 0.054288052
+0.0508549 0.0508549 0.050866865
+0.100751 0.100751 0.10076652
+-0.0585201 -0.0585201 -0.058498852
+-0.0463947 -0.0463947 -0.04642066
+-0.0199921 -0.0199921 -0.02005236
+-0.060068 -0.060068 -0.060039457
+-0.0381233 -0.0381233 -0.03814983
+-0.110949 -0.110949 -0.11096546
+-0.0229428 -0.0229428 -0.022922106
+-0.0284215 -0.0284215 -0.028453194
+0.0213449 0.0213449 0.021391315
+0.0121657 0.0121657 0.012169787
+0.0413121 0.0413121 0.041325983
+0.0383646 0.0383646 0.03837806
+0.0514739 0.0514739 0.051489245
+-0.042205 -0.042205 -0.042261016
+-0.138627 -0.138627 -0.13855985
+0.0386019 0.0386019 0.038608484
+-0.0174507 -0.0174507 -0.01736189
+0.00985244 0.00985244 0.009901398
+-0.0173199 -0.0173199 -0.017261585
+-0.027879 -0.027879 -0.027932368
+-0.0414753 -0.0414753 -0.04147169
+0.0159845 0.0159845 0.015926508
+0.140703 0.140703 0.14063962
+0.0521038 0.0521038 0.05207543
+0.0703491 0.0703491 0.07023953
+0.0261242 0.0261242 0.026175078
+0.0171624 0.0171624 0.017182127
+0.0334721 0.0334721 0.03345795
+-0.0399361 -0.0399361 -0.039986953
+-0.0341361 -0.0341361 -0.034084707
+0.0249506 0.0249506 0.024856536
+-0.0875424 -0.0875424 -0.087542124
+-0.0151917 -0.0151917 -0.015210526
+-0.129792 -0.129792 -0.12975551
+-0.00948598 -0.00948598 -0.009451041
+-0.00554986 -0.00554986 -0.0055829585
+0.0239804 0.0239804 0.023937197
+0.0680182 0.0680182 0.06802007
+0.113353 0.113353 0.11337092
+-0.015979 -0.015979 -0.016067434
+-0.04464 -0.04464 -0.044643786
+-0.0748076 -0.0748076 -0.074832015
+-0.0433667 -0.0433667 -0.04338265
+-0.0525681 -0.0525681 -0.0525122
+0.0349191 0.0349191 0.03488914
+0.0795602 0.0795602 0.079538286
+-0.00800224 -0.00800224 -0.008007131
+-0.0531439 -0.0531439 -0.053129774
+0.0216725 0.0216725 0.021665614
+0.0226485 0.0226485 0.022623993
+0.136866 0.136866 0.13681646
+0.0306299 0.0306299 0.030607369
+-0.0109613 -0.0109613 -0.01096969
+0.0598406 0.0598406 0.059798375
+-0.0392106 -0.0392106 -0.039235845
+0.170531 0.170531 0.17058675
+0.0403592 0.0403592 0.040356684
+-0.0368901 -0.0368901 -0.03690076
+0.0320945 0.0320945 0.032156706
+0.036205 0.036205 0.03618427
+-0.0556539 -0.0556539 -0.055787712
+-0.0198205 -0.0198205 -0.019840155
+-0.00840349 -0.00840349 -0.008454934
+0.0848007 0.0848007 0.084692314
+-0.040412 -0.040412 -0.040426068
+-0.0480765 -0.0480765 -0.048184805
+0.0815207 0.0815207 0.081417546
+-0.0245005 -0.0245005 -0.024445947
+-0.00278064 -0.00278064 -0.0027197222
+-0.0232045 -0.0232045 -0.02311829
+0.0779664 0.0779664 0.07799131
+-0.0176203 -0.0176203 -0.017530745
+-0.0320255 -0.0320255 -0.032014526
+0.0373226 0.0373226 0.03730119
+0.0444392 0.0444392 0.044160523
+-0.0370352 -0.0370352 -0.037072603
+0.0473972 0.0473972 0.047261633
+0.00131495 0.00131495 0.0013093955
+0.020028 0.020028 0.020076625
+-0.0140803 -0.0140803 -0.0140895685
+-0.0755526 -0.0755526 -0.075480975
+0.00769954 0.00769954 0.0076996163
+0.0504113 0.0504113 0.050469782
+-0.122574 -0.122574 -0.12259985
+0.074683 0.074683 0.07464443
+0.0139079 0.0139079 0.013928779
+0.0523569 0.0523569 0.052397538
+0.0256379 0.0256379 0.025603013
+0.11097 0.11097 0.110913895
+-0.00944271 -0.00944271 -0.009409368
+0.0510882 0.0510882 0.051079348
+-0.0305778 -0.0305778 -0.030532341
+0.0380519 0.0380519 0.038017124
+0.00803686 0.00803686 0.008103841
+0.139614 0.139614 0.139666
+0.0473881 0.0473881 0.047331274
+0.0692148 0.0692148 0.06908636
+-0.0141251 -0.0141251 -0.014022274
+0.0197562 0.0197562 0.01986622
+0.0833919 0.0833919 0.083416685
+-0.00823374 -0.00823374 -0.00824355
+-0.0923064 -0.0923064 -0.09226588
+-0.0456113 -0.0456113 -0.045557547
+-0.0523267 -0.0523267 -0.052353363
+0.07301 0.07301 0.07308669
+0.0165144 0.0165144 0.016584579
+-0.0250631 -0.0250631 -0.025074998
+-0.0477963 -0.0477963 -0.047825575
+0.067898 0.067898 0.067909576
+-0.0160161 -0.0160161 -0.015992677
+-0.12516 -0.12516 -0.12519102
+-0.052418 -0.052418 -0.052500203
+0.0839902 0.0839902 0.08397679
+0.0444699 0.0444699 0.04445716
+-0.102143 -0.102143 -0.10206411
+-0.0771269 -0.0771269 -0.07715754
+0.0409276 0.0409276 0.041005667
+0.0234007 0.0234007 0.02346379
+0.00916312 0.00916312 0.009180912
+0.0526719 0.0526719 0.05269781
+-0.185264 -0.185264 -0.1853373
+0.0325041 0.0325041 0.032511465
+0.0880466 0.0880466 0.08805812
+0.0115263 0.0115263 0.011483652
+-0.0446445 -0.0446445 -0.04464499
+-0.0670686 -0.0670686 -0.06708262
+-0.0806671 -0.0806671 -0.0807302
+0.0145852 0.0145852 0.014546666
+-0.0474324 -0.0474324 -0.04743393
+-0.0648036 -0.0648036 -0.06486718
+-0.0467019 -0.0467019 -0.046696067
+-0.0273532 -0.0273532 -0.027354473
+-0.0396023 -0.0396023 -0.039656006
+0.137113 0.137113 0.13710736
+0.106414 0.106414 0.10633078
+0.0195623 0.0195623 0.019489774
+-0.0958807 -0.0958807 -0.095848605
+-0.0208171 -0.0208171 -0.020769956
+0.0647457 0.0647457 0.064704835
+0.136989 0.136989 0.13697861
+-0.0277054 -0.0277054 -0.027706884
+0.0697185 0.0697185 0.06971711
+-0.00786607 -0.00786607 -0.007843345
+0.0443445 0.0443445 0.044354465
+-0.000724378 -0.000724378 -0.0006966809
+0.12928 0.12928 0.12922756
+-0.0665372 -0.0665372 -0.0664408
+0.0161258 0.0161258 0.016123328
+-0.0438756 -0.0438756 -0.043888
+0.0491655 0.0491655 0.04917484
+0.00643814 0.00643814 0.006436539
+-0.0301866 -0.0301866 -0.030207396
+0.0497501 0.0497501 0.049746018
+0.0911598 0.0911598 0.09129677
+-0.0288485 -0.0288485 -0.0288151
+0.137355 0.137355 0.13742389
+-0.00897699 -0.00897699 -0.008921055
+0.0214739 0.0214739 0.021497447
+-0.0992127 -0.0992127 -0.09919841
+-0.115933 -0.115933 -0.115954794
+0.0142412 0.0142412 0.014269172
+0.10838 0.10838 0.10842157
+0.0745001 0.0745001 0.07450687
+0.0533567 0.0533567 0.053341635
+0.0487711 0.0487711 0.048766572
+-0.0411243 -0.0411243 -0.041141193
+0.0792683 0.0792683 0.07926304
+-0.0617018 -0.0617018 -0.061770804
+0.0341602 0.0341602 0.034173157
+0.0568542 0.0568542 0.05683252
+-0.0648836 -0.0648836 -0.064922616
+0.0118417 0.0118417 0.011902964
+0.00778898 0.00778898 0.007805857
+0.116769 0.116769 0.11675959
+-0.0494425 -0.0494425 -0.049448144
+-0.060414 -0.060414 -0.060450204
+-0.0154938 -0.0154938 -0.01555047
+-0.0822016 -0.0822016 -0.0821788
+-0.050833 -0.050833 -0.05081562
+-0.0104108 -0.0104108 -0.010440993
+0.0444053 0.0444053 0.044453043
+-0.0407523 -0.0407523 -0.040710375
+-0.0423669 -0.0423669 -0.042472072
+-0.0203121 -0.0203121 -0.020339439
+0.0542422 0.0542422 0.054191798
+-0.0225517 -0.0225517 -0.022570185
+0.0356842 0.0356842 0.035777383
+-0.0501592 -0.0501592 -0.05010812
+0.0742022 0.0742022 0.074233465
+-0.0558255 -0.0558255 -0.055790745
+0.0207504 0.0207504 0.020712063
+0.0255928 0.0255928 0.025600003
+-0.0463011 -0.0463011 -0.046288423
+0.0157302 0.0157302 0.01574946
+-0.03772 -0.03772 -0.0376623
+-0.144524 -0.144524 -0.14443612
+0.0145796 0.0145796 0.01455948
+0.0647517 0.0647517 0.06478271
+-0.100065 -0.100065 -0.10003655
+0.0908599 0.0908599 0.09084611
+-0.0513477 -0.0513477 -0.05126509
+0.070015 0.070015 0.069919266
+-0.0977665 -0.0977665 -0.09774943
+0.0615323 0.0615323 0.061486278
+0.0135278 0.0135278 0.013600254
+-0.00273292 -0.00273292 -0.0026968557
+0.000305568 0.000305568 0.0004334638
+-0.0373847 -0.0373847 -0.03735422
+-0.0697973 -0.0697973 -0.069791906
+-0.06153 -0.06153 -0.06142717
+0.0864248 0.0864248 0.08640939
+0.0112156 0.0112156 0.011226344
+-0.0568615 -0.0568615 -0.056853984
+-0.0401322 -0.0401322 -0.040051904
+-0.124605 -0.124605 -0.12458015
+-0.0137967 -0.0137967 -0.013783445
+0.132382 0.132382 0.1322967
+-0.0871058 -0.0871058 -0.08707982
+0.0749187 0.0749187 0.07486181
+0.0809359 0.0809359 0.08096662
+0.027655 0.027655 0.027661249
+0.0344337 0.0344337 0.03446527
+-0.00858053 -0.00858053 -0.008621932
+-0.0261067 -0.0261067 -0.026145086
+0.0408897 0.0408897 0.040963758
+-0.00775449 -0.00775449 -0.007682222
+-0.0265952 -0.0265952 -0.026583867
+-0.0655454 -0.0655454 -0.0655132
+-0.000475993 -0.000475993 -0.0005172427
+-0.0105503 -0.0105503 -0.0105624935
+0.0816401 0.0816401 0.08163104
+0.113557 0.113557 0.1135213
+0.0755355 0.0755355 0.07550894
+0.0593666 0.0593666 0.059311528
+0.0975993 0.0975993 0.09757025
+0.0388305 0.0388305 0.038741373
+0.0275357 0.0275357 0.02757709
+0.0385358 0.0385358 0.038590584
+-0.0277543 -0.0277543 -0.02780062
+0.000433332 0.000433332 0.0005050111
+-0.0510193 -0.0510193 -0.05098515
+0.08179 0.08179 0.081870966
+-0.0872919 -0.0872919 -0.08731402
+0.00734027 0.00734027 0.007283832
+-0.0378913 -0.0378913 -0.037871283
+0.0617901 0.0617901 0.061830785
+0.0769192 0.0769192 0.076927505
+0.0419363 0.0419363 0.04189387
+-0.0109342 -0.0109342 -0.011022599
+0.0751958 0.0751958 0.07508607
+-0.0120446 -0.0120446 -0.012070233
+-0.0048848 -0.0048848 -0.0048766434
+-0.0316227 -0.0316227 -0.03164348
+-0.0100535 -0.0100535 -0.010017975
+0.071404 0.071404 0.07144815
+0.0331869 0.0331869 0.03314915
+0.0237351 0.0237351 0.023749892
+-0.0528961 -0.0528961 -0.052953366
+-0.0181138 -0.0181138 -0.018151224
+0.0689482 0.0689482 0.06903739
+-0.0155324 -0.0155324 -0.015537909
+0.0337207 0.0337207 0.03369353
+-0.0375005 -0.0375005 -0.037492804
+-0.0495499 -0.0495499 -0.04956788
+-0.00730756 -0.00730756 -0.0072928295
+-0.0124974 -0.0124974 -0.012574386
+0.0398968 0.0398968 0.039862573
+0.038799 0.038799 0.038736943
+0.151003 0.151003 0.15101038
+-0.0112601 -0.0112601 -0.011323404
+-0.1042 -0.1042 -0.104242064
+-0.0604923 -0.0604923 -0.060413133
+0.0749994 0.0749994 0.07502918
+0.16104 0.16104 0.16100053
+0.0779907 0.0779907 0.07801083
+-0.00534727 -0.00534727 -0.005313203
+0.124048 0.124048 0.12399019
+-0.0376745 -0.0376745 -0.037678078
+-0.0622813 -0.0622813 -0.062343113
+0.0463624 0.0463624 0.046315737
+0.0581452 0.0581452 0.058161546
+-0.0890926 -0.0890926 -0.089063056
+-0.0442707 -0.0442707 -0.044269502
+0.00775332 0.00775332 0.0077869114
+-0.026075 -0.026075 -0.026068013
+0.0403578 0.0403578 0.040286373
+-0.0156429 -0.0156429 -0.015584711
+-0.0890408 -0.0890408 -0.08902721
+0.0562807 0.0562807 0.056332454
+-0.0448763 -0.0448763 -0.04486762
+0.0216716 0.0216716 0.021678286
+-0.00597816 -0.00597816 -0.006024822
+-0.000325555 -0.000325555 -0.00034543182
+0.106718 0.106718 0.10671521
+-0.0254772 -0.0254772 -0.025506947
+0.0601397 0.0601397 0.060183443
+-0.0210315 -0.0210315 -0.021034297
+0.10036 0.10036 0.10027193
+-0.0683073 -0.0683073 -0.06831659
+-0.0412363 -0.0412363 -0.04133351
+-0.0501735 -0.0501735 -0.0501235
+0.000239248 0.000239248 0.00020345644
+0.0380111 0.0380111 0.038072057
+0.0617459 0.0617459 0.061797332
+-0.0894091 -0.0894091 -0.089405455
+0.000274765 0.000274765 0.00028201865
+0.0231631 0.0231631 0.023166372
+0.0269336 0.0269336 0.026971841
+0.0811216 0.0811216 0.081153125
+0.0334474 0.0334474 0.033439014
+-0.0424563 -0.0424563 -0.042408127
+0.0523019 0.0523019 0.052323677
+0.0516382 0.0516382 0.051646903
+0.0493048 0.0493048 0.04933305
+-0.0872068 -0.0872068 -0.08726056
+-0.0338244 -0.0338244 -0.033791926
+-0.0143776 -0.0143776 -0.014422964
+-0.0513753 -0.0513753 -0.051365256
+0.00501527 0.00501527 0.0050571556
+0.0871178 0.0871178 0.08712342
+0.0268232 0.0268232 0.026858715
+0.0785662 0.0785662 0.078585334
+-0.110786 -0.110786 -0.11078214
+-0.0708066 -0.0708066 -0.070812985
+-0.0182925 -0.0182925 -0.018236343
+0.0255259 0.0255259 0.025540547
+0.0574471 0.0574471 0.057518225
+-0.0937093 -0.0937093 -0.093632124
+0.0195592 0.0195592 0.019553041
+-0.207558 -0.207558 -0.2076023
+0.0424519 0.0424519 0.04240585
+-0.0411212 -0.0411212 -0.041080788
+-0.0269112 -0.0269112 -0.027022915
+-0.000550584 -0.000550584 -0.0005307989
+0.090933 0.090933 0.0909548
+0.0649523 0.0649523 0.06497167
+-0.0522534 -0.0522534 -0.052297693
+0.119984 0.119984 0.120004125
+0.0184653 0.0184653 0.018556928
+-0.0156135 -0.0156135 -0.015525621
+0.0531749 0.0531749 0.05332741
+0.0455145 0.0455145 0.045554027
+0.0165888 0.0165888 0.016504792
+0.0475326 0.0475326 0.047550064
+0.0134256 0.0134256 0.013461235
+-0.0393319 -0.0393319 -0.039233167
+0.0145788 0.0145788 0.014608827
+-0.0820249 -0.0820249 -0.082045294
+-0.0236175 -0.0236175 -0.02357322
+0.0256002 0.0256002 0.025584953
+-0.0193078 -0.0193078 -0.019229753
+-0.0184435 -0.0184435 -0.018457899
+0.05038 0.05038 0.05040062
+-0.090793 -0.090793 -0.09082028
+0.147179 0.147179 0.14715964
+0.0467211 0.0467211 0.0467787
+-0.116564 -0.116564 -0.11653443
+0.0360824 0.0360824 0.036051434
+-0.0770429 -0.0770429 -0.07708202
+0.0311589 0.0311589 0.031215755
+0.0840098 0.0840098 0.08411211
+0.109078 0.109078 0.109117694
+0.0716835 0.0716835 0.071794905
+-0.0385999 -0.0385999 -0.038598366
+-0.0127767 -0.0127767 -0.01275059
+0.0258053 0.0258053 0.025800923
+-0.0080086 -0.0080086 -0.007990382
+-0.0473543 -0.0473543 -0.047363013
+-0.0123194 -0.0123194 -0.012281261
+0.0359063 0.0359063 0.03589811
+-0.0066747 -0.0066747 -0.0066737444
+-0.0951223 -0.0951223 -0.095197864
+0.0627194 0.0627194 0.062763415
+-0.150627 -0.150627 -0.1506041
+0.0486615 0.0486615 0.048683893
+-0.0159079 -0.0159079 -0.015838148
+-0.0148924 -0.0148924 -0.014852185
+0.0314454 0.0314454 0.031347603
+-0.0596072 -0.0596072 -0.05970118
+0.0406933 0.0406933 0.040636886
+0.0486675 0.0486675 0.04870105
+0.0491107 0.0491107 0.049104676
+-0.0886611 -0.0886611 -0.08861704
+0.00734497 0.00734497 0.0073537463
+0.00297587 0.00297587 0.0029524455
+-0.0596506 -0.0596506 -0.05967608
+-0.0161904 -0.0161904 -0.01623508
+-0.0142299 -0.0142299 -0.014221735
+0.0634615 0.0634615 0.06347761
+0.0675008 0.0675008 0.06757233
+-0.109899 -0.109899 -0.10987822
+0.00388379 0.00388379 0.0038508626
+0.0144554 0.0144554 0.0144366985
+0.0213518 0.0213518 0.021355735
+0.0559968 0.0559968 0.056067683
+-0.00720239 -0.00720239 -0.0071361414
+0.134748 0.134748 0.13473086
+-0.0869992 -0.0869992 -0.08700988
+0.0717222 0.0717222 0.07176838
+0.0113444 0.0113444 0.0112238135
+0.055613 0.055613 0.055615775
+0.0781443 0.0781443 0.078150816
+0.00444542 0.00444542 0.0045172456
+0.030511 0.030511 0.030529171
+0.0221679 0.0221679 0.022236308
+-0.00130216 -0.00130216 -0.0013423365
+-0.0548201 -0.0548201 -0.0548323
+0.0171526 0.0171526 0.017174084
+0.0734596 0.0734596 0.0734516
+0.0203386 0.0203386 0.020319328
+-0.039064 -0.039064 -0.039055705
+-0.104554 -0.104554 -0.10455625
+0.00399374 0.00399374 0.0039675776
+0.0584727 0.0584727 0.058427267
+0.0144045 0.0144045 0.01449256
+0.00274483 0.00274483 0.002729416
+0.0516783 0.0516783 0.05165551
+0.0426457 0.0426457 0.04265496
+-0.143043 -0.143043 -0.14302076
+-0.0474601 -0.0474601 -0.047424827
+-0.0235291 -0.0235291 -0.02351799
+0.00397881 0.00397881 0.003913895
+0.0755857 0.0755857 0.0756445
+0.0188103 0.0188103 0.018742964
+0.0320434 0.0320434 0.03202454
+-0.0426726 -0.0426726 -0.04270244
+-0.0109589 -0.0109589 -0.010922261
+0.165226 0.165226 0.16524918
+0.0713365 0.0713365 0.07134113
+-0.000455887 -0.000455887 -0.0004992221
+0.0195486 0.0195486 0.019565431
+0.0158311 0.0158311 0.015893696
+-0.0927924 -0.0927924 -0.09278986
+-0.0230793 -0.0230793 -0.02308256
+0.0620242 0.0620242 0.06195776
+0.11783 0.11783 0.11786229
+-0.0438166 -0.0438166 -0.043845788
+-0.0539693 -0.0539693 -0.05397217
+-0.0421021 -0.0421021 -0.042201944
+-0.0527274 -0.0527274 -0.052726027
+0.00164041 0.00164041 0.0016074675
+0.0265239 0.0265239 0.02655601
+0.0169114 0.0169114 0.016954185
+0.119003 0.119003 0.11900151
+-0.00456783 -0.00456783 -0.0045542903
+-0.0861385 -0.0861385 -0.08613362
+0.0273708 0.0273708 0.02730675
+-0.0317232 -0.0317232 -0.031739496
+0.00571188 0.00571188 0.0057490584
+-0.0277059 -0.0277059 -0.027689464
+0.0613508 0.0613508 0.06136403
+0.0955964 0.0955964 0.09558663
+0.000620349 0.000620349 0.0006069185
+0.00759368 0.00759368 0.007588307
+-0.112123 -0.112123 -0.112107225
+0.0179608 0.0179608 0.017896688
+-0.0155297 -0.0155297 -0.015496184
+0.0512596 0.0512596 0.051313594
+0.00420892 0.00420892 0.004255999
+0.150032 0.150032 0.14998835
+-0.0647116 -0.0647116 -0.064711146
+0.0518406 0.0518406 0.051811345
+-0.00423618 -0.00423618 -0.004319561
+0.0292132 0.0292132 0.029273052
+-0.0573205 -0.0573205 -0.0573938
+0.0112254 0.0112254 0.011255282
+-0.00273207 -0.00273207 -0.002748545
+-0.000381649 -0.000381649 -0.00078121125
+0.0337933 0.0337933 0.03390094
+-0.04071 -0.04071 -0.04049545
+-0.00274954 -0.00274954 -0.0027571002
+0.0571913 0.0571913 0.05718805
+-0.0981177 -0.0981177 -0.09813824
+-0.0359237 -0.0359237 -0.035857517
+0.00524398 0.00524398 0.005161849
+-0.00719584 -0.00719584 -0.007141306
+-0.0982088 -0.0982088 -0.098246105
+0.0729321 0.0729321 0.07283468
+-0.0721955 -0.0721955 -0.072167754
+-0.113816 -0.113816 -0.113866515
+0.00116968 0.00116968 0.0011724827
+0.111103 0.111103 0.111069
+0.0536528 0.0536528 0.0536314
+-0.0558504 -0.0558504 -0.05580376
+0.092849 0.092849 0.09285073
+0.0240374 0.0240374 0.02410394
+0.00793927 0.00793927 0.007952023
+-0.00829274 -0.00829274 -0.008257631
+0.003959 0.003959 0.003999776
+0.161029 0.161029 0.16097423
+-0.123399 -0.123399 -0.12344682
+0.0659893 0.0659893 0.066055946
+-0.0457911 -0.0457911 -0.045815084
+0.0316985 0.0316985 0.031727917
+-0.0396848 -0.0396848 -0.039680943
+-0.0862119 -0.0862119 -0.086265296
+-0.0176495 -0.0176495 -0.017664384
+-0.0423259 -0.0423259 -0.0422841
+0.0311431 0.0311431 0.031191206
+0.0191266 0.0191266 0.019137109
+-0.000671786 -0.000671786 -0.00075043936
+0.0323088 0.0323088 0.032332174
+-0.0127701 -0.0127701 -0.012820452
+-0.0126559 -0.0126559 -0.012688624
+0.00966813 0.00966813 0.009648792
+-0.0750536 -0.0750536 -0.07504255
+-0.00425813 -0.00425813 -0.004273076
+-0.0600583 -0.0600583 -0.06002048
+-0.0668664 -0.0668664 -0.066844516
+0.00993072 0.00993072 0.009870558
+-0.000330014 -0.000330014 -0.00027225073
+-0.0281287 -0.0281287 -0.028092688
+-0.0388765 -0.0388765 -0.03881945
+0.0208246 0.0208246 0.020855004
+-0.0637908 -0.0637908 -0.06382004
+-0.102478 -0.102478 -0.10253476
+0.0383845 0.0383845 0.038464714
+-0.0605035 -0.0605035 -0.060505584
+-0.0145633 -0.0145633 -0.01454383
+-0.0272743 -0.0272743 -0.027192399
+-0.0330614 -0.0330614 -0.033045962
+0.038254 0.038254 0.03822874
+0.0343765 0.0343765 0.034469415
+-0.0924427 -0.0924427 -0.09244162
+0.029194 0.029194 0.029161932
+-0.0173355 -0.0173355 -0.01729626
+0.082147 0.082147 0.08215476
+0.0389164 0.0389164 0.03889167
+-0.0281645 -0.0281645 -0.028199483
+0.0401902 0.0401902 0.040175337
+0.0132406 0.0132406 0.013250682
+0.0645971 0.0645971 0.06450971
+-0.0193459 -0.0193459 -0.019391602
+-0.0443555 -0.0443555 -0.044417556
+-0.0367306 -0.0367306 -0.036630932
+0.0211401 0.0211401 0.021158393
+0.0361644 0.0361644 0.036200695
+-0.0554034 -0.0554034 -0.05540141
+-0.00556487 -0.00556487 -0.005577911
+-0.0816652 -0.0816652 -0.081669025
+-0.0301106 -0.0301106 -0.03010537
+0.0159141 0.0159141 0.015895613
+0.00922533 0.00922533 0.009307846
+0.0551613 0.0551613 0.055167414
+-0.034803 -0.034803 -0.034776025
+-0.0448133 -0.0448133 -0.04477542
+-0.0768579 -0.0768579 -0.07682061
+-0.0542865 -0.0542865 -0.054314945
+-0.0897442 -0.0897442 -0.08979361
+-0.0813054 -0.0813054 -0.081378244
+0.0343739 0.0343739 0.034351412
+0.112315 0.112315 0.11229557
+-0.0526866 -0.0526866 -0.052671067
+-0.0205654 -0.0205654 -0.02058297
+0.0598647 0.0598647 0.05985919
+-0.0469249 -0.0469249 -0.0469533
+0.135034 0.135034 0.13502136
+0.0238385 0.0238385 0.02389685
+0.0263148 0.0263148 0.026215438
+0.0488815 0.0488815 0.04893545
+0.00201851 0.00201851 0.0019801678
+-0.0658192 -0.0658192 -0.06580696
+-0.0837458 -0.0837458 -0.08373445
+-0.129833 -0.129833 -0.12979588
+0.0404143 0.0404143 0.040343504
+-0.103602 -0.103602 -0.10357632
+-0.0353081 -0.0353081 -0.03527155
+0.0654926 0.0654926 0.06546452
+-0.00838028 -0.00838028 -0.008370963
+-0.0206083 -0.0206083 -0.020615673
+0.0264097 0.0264097 0.02638662
+-0.0883039 -0.0883039 -0.08819907
+-0.199792 -0.199792 -0.19988258
+0.0615182 0.0615182 0.061526734
+-0.0858546 -0.0858546 -0.08583875
+0.131274 0.131274 0.1313016
+0.0202401 0.0202401 0.020275258
+-0.00880445 -0.00880445 -0.008783383
+-0.0237159 -0.0237159 -0.023654938
+-0.0948707 -0.0948707 -0.09487982
+0.0149959 0.0149959 0.015040154
+0.0241635 0.0241635 0.024163842
+0.0267771 0.0267771 0.026896823
+-0.00176131 -0.00176131 -0.0017794454
+0.0466032 0.0466032 0.046693534
+0.0565396 0.0565396 0.05651203
+-0.0435013 -0.0435013 -0.04349548
+0.00495749 0.00495749 0.0049449718
+0.0112638 0.0112638 0.01133373
+0.0391566 0.0391566 0.039178696
+0.0235042 0.0235042 0.023554733
+0.0579774 0.0579774 0.058005024
+0.0742377 0.0742377 0.07424889
+0.0335742 0.0335742 0.03350042
+0.0318086 0.0318086 0.031804264
+0.000841622 0.000841622 0.0008667805
+-0.0426161 -0.0426161 -0.04272762
+0.0155765 0.0155765 0.015654849
+-0.0239891 -0.0239891 -0.02398827
+-0.0645769 -0.0645769 -0.06470475
+-0.0152078 -0.0152078 -0.015206831
+-0.0508459 -0.0508459 -0.050899737
+0.0171664 0.0171664 0.01720979
+0.0734575 0.0734575 0.07349155
+0.0876927 0.0876927 0.0877091
+-0.0683414 -0.0683414 -0.0683125
+-0.12482 -0.12482 -0.124821916
+0.0482593 0.0482593 0.048256755
+-0.087467 -0.087467 -0.08742404
+0.0263012 0.0263012 0.026281873
+-0.0581131 -0.0581131 -0.058089986
+-0.0326845 -0.0326845 -0.032694906
+-0.0187102 -0.0187102 -0.018689863
+0.0124958 0.0124958 0.012533374
+-0.0513068 -0.0513068 -0.051281895
+-0.00512351 -0.00512351 -0.005046563
+0.00603066 0.00603066 0.0060560983
+-0.0508731 -0.0508731 -0.050895084
+-0.020882 -0.020882 -0.020893747
+-0.0178493 -0.0178493 -0.017849311
+-0.0647826 -0.0647826 -0.06485125
+-0.0178114 -0.0178114 -0.017806234
+-0.034949 -0.034949 -0.03495108
+0.0400768 0.0400768 0.04003734
+0.0141598 0.0141598 0.014080052
+-0.0496786 -0.0496786 -0.049678817
+-0.0716939 -0.0716939 -0.07164615
+0.0236964 0.0236964 0.023652755
+-0.0102244 -0.0102244 -0.010178352
+-0.00564689 -0.00564689 -0.005616271
+0.00163341 0.00163341 0.001709497
+0.0357506 0.0357506 0.03574455
+-0.111344 -0.111344 -0.11121674
+-0.0589656 -0.0589656 -0.058812346
+0.0855062 0.0855062 0.08519821
+0.103814 0.103814 0.10378334
+0.00813909 0.00813909 0.008057803
+-0.13441 -0.13441 -0.13441874
+0.012136 0.012136 0.012152014
+0.121394 0.121394 0.12139798
+0.0982309 0.0982309 0.098144636
+-0.0287196 -0.0287196 -0.028812345
+0.0225899 0.0225899 0.02262093
+-0.0108555 -0.0108555 -0.010835968
+-0.0196389 -0.0196389 -0.019675482
+0.0432086 0.0432086 0.043277442
+0.0501563 0.0501563 0.05015038
+-0.0299923 -0.0299923 -0.029977538
+-0.0102258 -0.0102258 -0.010287727
+-0.0351208 -0.0351208 -0.035162047
+0.0140759 0.0140759 0.014032644
+-0.0436262 -0.0436262 -0.0436738
+0.0199213 0.0199213 0.019941702
+-0.0274136 -0.0274136 -0.027426517
+-0.0299786 -0.0299786 -0.030004429
+-0.00191826 -0.00191826 -0.0019297563
+0.0477441 0.0477441 0.047761485
+-0.100246 -0.100246 -0.10026969
+0.0471075 0.0471075 0.047084637
+0.0389904 0.0389904 0.038887408
+0.0182929 0.0182929 0.018220112
+-0.0386228 -0.0386228 -0.038701266
+0.00922772 0.00922772 0.009217131
+-0.0512827 -0.0512827 -0.051297177
+0.04667 0.04667 0.04663697
+-0.0445715 -0.0445715 -0.044575337
+0.0794886 0.0794886 0.07954514
+-0.0728157 -0.0728157 -0.07286434
+0.0881122 0.0881122 0.08809336
+-0.161461 -0.161461 -0.16142757
+-0.0140791 -0.0140791 -0.014112079
+-0.0815015 -0.0815015 -0.081449136
+0.0822859 0.0822859 0.08233692
+-0.128629 -0.128629 -0.12857832
+-6.82674e-05 -6.82674e-05 -0.000114556424
+-0.0306171 -0.0306171 -0.030729007
+0.0621439 0.0621439 0.062120523
+0.0369373 0.0369373 0.03697083
+-0.010271 -0.010271 -0.010301267
+0.0799434 0.0799434 0.07995286
+0.132349 0.132349 0.13244738
+-0.00776803 -0.00776803 -0.0077290824
+-0.0606303 -0.0606303 -0.0606329
+0.00634928 0.00634928 0.0063524023
+-0.00281338 -0.00281338 -0.0027983356
+-0.12283 -0.12283 -0.12279041
+-0.0644853 -0.0644853 -0.06452653
+0.0306387 0.0306387 0.03071631
+-0.10262 -0.10262 -0.1026218
+-0.0212269 -0.0212269 -0.021314966
+0.036937 0.036937 0.036907673
+0.0533351 0.0533351 0.05334275
+0.0762542 0.0762542 0.07620977
+-0.021037 -0.021037 -0.020976562
+-0.0886201 -0.0886201 -0.08866313
+-0.063626 -0.063626 -0.063586384
+-0.0563334 -0.0563334 -0.056299675
+-0.159235 -0.159235 -0.15921143
+-0.0671488 -0.0671488 -0.06711692
+0.0303675 0.0303675 0.030342413
+0.056239 0.056239 0.056213394
+0.0750959 0.0750959 0.07507753
+0.00076692 0.00076692 0.00069061195
+-0.0090799 -0.0090799 -0.009135325
+-0.104471 -0.104471 -0.104425825
+0.0626451 0.0626451 0.06263234
+-0.0326013 -0.0326013 -0.032657877
+-0.0836174 -0.0836174 -0.08361447
+-0.01506 -0.01506 -0.014996768
+0.021701 0.021701 0.021741824
+-0.0440654 -0.0440654 -0.044102028
+-0.0706568 -0.0706568 -0.07058154
+-0.0848981 -0.0848981 -0.084884256
+-0.100327 -0.100327 -0.10035988
+0.0672638 0.0672638 0.06728508
+0.00298856 0.00298856 0.0029561291
+0.09307 0.09307 0.093101025
+-0.0452801 -0.0452801 -0.04519128
+-0.0688817 -0.0688817 -0.06888905
+0.0039989 0.0039989 0.0039989534
+0.0138093 0.0138093 0.01385549
+-0.193926 -0.193926 -0.19389978
+0.065403 0.065403 0.06538664
+-0.00380169 -0.00380169 -0.0037977188
+0.0320791 0.0320791 0.032068092
+-0.0315648 -0.0315648 -0.031609956
+0.072228 0.072228 0.072157554
+-0.003275 -0.003275 -0.0032727774
+-0.117857 -0.117857 -0.11794696
+-0.0589439 -0.0589439 -0.058971595
+0.0195353 0.0195353 0.019517032
+0.0580987 0.0580987 0.058089506
+-0.0343652 -0.0343652 -0.034322165
+0.00966513 0.00966513 0.0096585
+-0.0448846 -0.0448846 -0.04486057
+0.0277202 0.0277202 0.027755534
+0.0742759 0.0742759 0.07431889
+-0.114456 -0.114456 -0.114478245
+-0.0549094 -0.0549094 -0.05491402
+-0.0280814 -0.0280814 -0.02808397
+-0.0327284 -0.0327284 -0.03271479
+-0.0379359 -0.0379359 -0.03788582
+0.230008 0.230008 0.22999278
+0.0614033 0.0614033 0.061309237
+0.127026 0.127026 0.12697268
+-0.0418378 -0.0418378 -0.04177747
+0.0554789 0.0554789 0.05556076
+0.0184763 0.0184763 0.01854224
+0.0266543 0.0266543 0.026558159
+0.0096221 0.0096221 0.009683125
+0.0180696 0.0180696 0.018050022
+0.0193641 0.0193641 0.019365229
+0.140344 0.140344 0.14032614
+-0.0313163 -0.0313163 -0.031341642
+0.00820456 0.00820456 0.008143307
+0.00117658 0.00117658 0.0012545312
+-0.121214 -0.121214 -0.12126723
+-0.054652 -0.054652 -0.05454728
+-0.0183439 -0.0183439 -0.018348662
+-0.0668513 -0.0668513 -0.06688733
+0.0617271 0.0617271 0.06174377
+-0.0175261 -0.0175261 -0.01754248
+0.049828 0.049828 0.049749084
+-0.0995336 -0.0995336 -0.099573776
+-0.056706 -0.056706 -0.056798417
+-0.0145515 -0.0145515 -0.014601551
+-0.0606375 -0.0606375 -0.060668863
+0.0234411 0.0234411 0.02351543
+-0.118614 -0.118614 -0.11859751
+-0.0432863 -0.0432863 -0.043216094
+0.0998704 0.0998704 0.099800766
+-0.0989919 -0.0989919 -0.09887356
+0.0802651 0.0802651 0.08021362
+0.0486571 0.0486571 0.048675306
+-0.127314 -0.127314 -0.12727097
+0.025783 0.025783 0.025711646
+-0.0474719 -0.0474719 -0.047420226
+0.0615223 0.0615223 0.061460312
+0.0521325 0.0521325 0.05216102
+-0.0652802 -0.0652802 -0.06531856
+0.058852 0.058852 0.05894792
+0.0376914 0.0376914 0.03763494
+0.091372 0.091372 0.09136017
+0.0450637 0.0450637 0.045024093
+-0.0687716 -0.0687716 -0.06871038
+0.041062 0.041062 0.041034967
+-0.0828464 -0.0828464 -0.08284562
+0.0900524 0.0900524 0.08997067
+-0.0607062 -0.0607062 -0.060673963
+-0.00622962 -0.00622962 -0.0062628295
+0.0315057 0.0315057 0.03152907
+0.0845301 0.0845301 0.08456287
+-0.065166 -0.065166 -0.06520025
+0.018492 0.018492 0.01848135
+0.047877 0.047877 0.048017174
+0.0854886 0.0854886 0.08556354
+0.0139394 0.0139394 0.01397255
+-0.158224 -0.158224 -0.15822797
+-0.0143655 -0.0143655 -0.014380796
+-0.0611237 -0.0611237 -0.061114848
+0.043129 0.043129 0.043206405
+-0.0301445 -0.0301445 -0.030163478
+0.0440395 0.0440395 0.044018544
+-0.0806805 -0.0806805 -0.08064959
+0.0203253 0.0203253 0.020401672
+0.0719313 0.0719313 0.07195835
+-0.0524786 -0.0524786 -0.05248842
+-0.130403 -0.130403 -0.13034025
+0.0655455 0.0655455 0.065547325
+-0.00175413 -0.00175413 -0.0017687901
+-0.0964908 -0.0964908 -0.09645052
+0.0232741 0.0232741 0.02321953
+0.0368534 0.0368534 0.036894366
+0.0590777 0.0590777 0.05914649
+0.0288669 0.0288669 0.028831113
+0.0443607 0.0443607 0.04437453
+-0.13501 -0.13501 -0.1349884
+0.0850765 0.0850765 0.085042216
+-0.0993035 -0.0993035 -0.09931085
+0.0983662 0.0983662 0.09844103
+0.0363892 0.0363892 0.036404476
+-0.0996917 -0.0996917 -0.09966904
+-0.0152383 -0.0152383 -0.015259713
+-0.0135017 -0.0135017 -0.013541313
+0.0526837 0.0526837 0.05267212
+0.0607015 0.0607015 0.0606642
+-0.013118 -0.013118 -0.01317117
+0.0609916 0.0609916 0.061044846
+-0.082983 -0.082983 -0.08290163
+-0.00264844 -0.00264844 -0.002654505
+-0.0387733 -0.0387733 -0.038805258
+0.0590646 0.0590646 0.05901609
+0.0393398 0.0393398 0.039366633
+-0.0846331 -0.0846331 -0.0846397
+0.0206114 0.0206114 0.02055374
+0.0653824 0.0653824 0.06539393
+0.0113531 0.0113531 0.011392293
+-0.0612903 -0.0612903 -0.061375264
+-0.0840422 -0.0840422 -0.08402338
+-0.0672038 -0.0672038 -0.06719546
+-0.0109449 -0.0109449 -0.010888741
+-0.00930985 -0.00930985 -0.009308281
+-0.00268656 -0.00268656 -0.0026164842
+0.0556976 0.0556976 0.055620726
+0.101456 0.101456 0.10142655
+-0.0513066 -0.0513066 -0.05130399
+-0.00557194 -0.00557194 -0.0055165407
+0.0731675 0.0731675 0.0731653
+-0.0906247 -0.0906247 -0.09069344
+0.105676 0.105676 0.10558644
+-0.0155757 -0.0155757 -0.015627323
+0.0179599 0.0179599 0.017960785
+-0.147625 -0.147625 -0.14769003
+0.0343308 0.0343308 0.034371924
+-0.120912 -0.120912 -0.12091128
+-0.0666447 -0.0666447 -0.06659279
+-0.157528 -0.157528 -0.15753032
+0.0373289 0.0373289 0.037273873
+-0.0131986 -0.0131986 -0.013159553
+0.0374035 0.0374035 0.03741687
+-0.0406617 -0.0406617 -0.04062675
+-0.0176933 -0.0176933 -0.017679889
+-0.0446159 -0.0446159 -0.04464699
+0.0102568 0.0102568 0.010273402
+-0.0358104 -0.0358104 -0.035783704
+0.010095 0.010095 0.010063791
+0.0415779 0.0415779 0.04161036
+-0.0189882 -0.0189882 -0.018946502
+0.0129712 0.0129712 0.012975148
+0.0426023 0.0426023 0.04260588
+0.0663336 0.0663336 0.066292696
+0.0123081 0.0123081 0.012390993
+-0.0660598 -0.0660598 -0.06601224
+-0.0805062 -0.0805062 -0.08059793
+0.0335618 0.0335618 0.033618756
+0.000970251 0.000970251 0.00091493997
+0.0534526 0.0534526 0.053552486
+0.105646 0.105646 0.105677426
+-0.0764076 -0.0764076 -0.076404534
+0.000784859 0.000784859 0.00078725006
+0.00601265 0.00601265 0.006034782
+-0.0578001 -0.0578001 -0.05783107
+0.0734675 0.0734675 0.07345792
+-0.111852 -0.111852 -0.111881465
+-0.137841 -0.137841 -0.13775137
+0.086404 0.086404 0.08631717
+0.041699 0.041699 0.04170403
+-0.00640876 -0.00640876 -0.006344748
+0.0462616 0.0462616 0.046323333
+-0.0215098 -0.0215098 -0.021477466
+-0.0431746 -0.0431746 -0.043161098
+-0.0526841 -0.0526841 -0.05263645
+-0.0733081 -0.0733081 -0.073295034
+0.0568041 0.0568041 0.056755748
+-0.0135586 -0.0135586 -0.013578153
+-0.0337801 -0.0337801 -0.033748943
+-0.0466626 -0.0466626 -0.046600584
+-0.0185631 -0.0185631 -0.01854749
+-0.00236038 -0.00236038 -0.002371483
+0.00291314 0.00291314 0.0029367215
+-0.096219 -0.096219 -0.09612156
+-0.0859722 -0.0859722 -0.085985176
+-0.0680453 -0.0680453 -0.06808266
+0.00138534 0.00138534 0.0014156506
+-0.0281652 -0.0281652 -0.028207613
+0.0259367 0.0259367 0.02593799
+-0.0481295 -0.0481295 -0.048088223
+-0.0671646 -0.0671646 -0.067200944
+0.0967184 0.0967184 0.0966916
+-0.0861731 -0.0861731 -0.08626476
+-0.0200471 -0.0200471 -0.019995403
+-0.0249749 -0.0249749 -0.024907606
+-0.00653724 -0.00653724 -0.00649345
+0.102747 0.102747 0.102711625
+-0.0141921 -0.0141921 -0.014188153
+-0.0746222 -0.0746222 -0.07469667
+-0.00300505 -0.00300505 -0.0029975518
+0.14133 0.14133 0.14126514
+-0.0140395 -0.0140395 -0.014053917
+0.0618404 0.0618404 0.06182529
+-0.0627151 -0.0627151 -0.06268016
+-0.00221657 -0.00221657 -0.0021621466
+0.0293184 0.0293184 0.029342268
+0.0283671 0.0283671 0.028355274
+0.0444701 0.0444701 0.04444345
+0.118262 0.118262 0.118225
+-0.0194982 -0.0194982 -0.01947501
+0.0503133 0.0503133 0.050353765
+-0.0311647 -0.0311647 -0.031208083
+0.0683718 0.0683718 0.06838112
+-0.020753 -0.020753 -0.020374948
+-0.0837432 -0.0837432 -0.08361723
+-0.039261 -0.039261 -0.039310083
+-0.0339169 -0.0339169 -0.033909325
+-0.0228657 -0.0228657 -0.022813471
+0.0891401 0.0891401 0.08913361
+-0.122539 -0.122539 -0.12257277
+0.0349816 0.0349816 0.034994505
+-0.0657787 -0.0657787 -0.06570944
+0.11347 0.11347 0.11355097
+-0.0660283 -0.0660283 -0.06608495
+-0.0360846 -0.0360846 -0.036073253
+-0.0227785 -0.0227785 -0.022784114
+0.0821676 0.0821676 0.08216841
+0.00577046 0.00577046 0.0057925642
+0.0478593 0.0478593 0.047872875
+0.0807533 0.0807533 0.08074302
+0.00932683 0.00932683 0.009287417
+-0.0611472 -0.0611472 -0.061109465
+0.0246673 0.0246673 0.024710834
+0.00135176 0.00135176 0.0013805972
+-0.050431 -0.050431 -0.050438702
+-0.0584669 -0.0584669 -0.058450762
+0.0353952 0.0353952 0.035427768
+0.116529 0.116529 0.11641231
+0.0986702 0.0986702 0.09864399
+-0.0202005 -0.0202005 -0.0202289
+-0.0421147 -0.0421147 -0.04210291
+0.0344777 0.0344777 0.034470968
+-0.0844195 -0.0844195 -0.08442584
+-0.027405 -0.027405 -0.02737937
+0.0230446 0.0230446 0.02308166
+0.108843 0.108843 0.108843684
+0.0743999 0.0743999 0.07441694
+0.0408008 0.0408008 0.040758323
+-0.0648177 -0.0648177 -0.06478075
+0.0332184 0.0332184 0.033217184
+-0.13516 -0.13516 -0.13516635
+0.020348 0.020348 0.020325523
+-0.019706 -0.019706 -0.019689381
+0.0143609 0.0143609 0.014394265
+-0.0894585 -0.0894585 -0.08946538
+-0.0826925 -0.0826925 -0.08271616
+-0.0178079 -0.0178079 -0.017774826
+0.0553935 0.0553935 0.055414107
+-0.0267986 -0.0267986 -0.026737604
+-0.0253104 -0.0253104 -0.025286786
+-0.0305134 -0.0305134 -0.03044664
+0.0583623 0.0583623 0.058239717
+-0.0739897 -0.0739897 -0.07397549
+-0.0394194 -0.0394194 -0.039450143
+-0.000132329 -0.000132329 -0.00015328724
+-0.0999173 -0.0999173 -0.0999704
+0.0893717 0.0893717 0.08944228
+0.0478107 0.0478107 0.04776287
+0.0887741 0.0887741 0.08878326
+-0.0696607 -0.0696607 -0.06958674
+0.129804 0.129804 0.1297302
+0.0478155 0.0478155 0.04775043
+0.125157 0.125157 0.12519418
+0.0775603 0.0775603 0.07753955
+-0.0541937 -0.0541937 -0.054195408
+0.0614587 0.0614587 0.06153245
+0.00334967 0.00334967 0.0033751328
+-0.0582479 -0.0582479 -0.058207035
+0.0444609 0.0444609 0.044414658
+-0.0452177 -0.0452177 -0.045146216
+-0.024907 -0.024907 -0.024937047
+0.0568596 0.0568596 0.05683513
+0.0355087 0.0355087 0.035511367
+0.0307766 0.0307766 0.030797122
+-0.00212521 -0.00212521 -0.0020298092
+-0.00481007 -0.00481007 -0.0048410916
+-0.120924 -0.120924 -0.12094744
+-0.0856549 -0.0856549 -0.08565664
+0.16597 0.16597 0.1659452
+-0.106743 -0.106743 -0.10668079
+-0.0512974 -0.0512974 -0.05125545
+-0.00323899 -0.00323899 -0.0031625642
+-0.0282713 -0.0282713 -0.028228128
+-0.0806675 -0.0806675 -0.08066508
+0.0163984 0.0163984 0.01638767
+0.0195218 0.0195218 0.01946576
+-0.0391853 -0.0391853 -0.039197374
+0.0907969 0.0907969 0.09079135
+0.101102 0.101102 0.101091355
+-0.117093 -0.117093 -0.11710716
+0.0218797 0.0218797 0.022054927
+-0.0634259 -0.0634259 -0.06343277
+-0.0666481 -0.0666481 -0.06656244
+-0.023475 -0.023475 -0.023497976
+-0.0114939 -0.0114939 -0.011538402
+-0.00952004 -0.00952004 -0.009535399
+-0.081216 -0.081216 -0.08127379
+-0.0373511 -0.0373511 -0.037335366
+0.0418 0.0418 0.04177978
+0.0620319 0.0620319 0.06208473
+0.0874108 0.0874108 0.08738615
+-0.00073767 -0.00073767 -0.00080882123
+-0.119971 -0.119971 -0.11997311
+-0.0115849 -0.0115849 -0.011538207
+-0.00935112 -0.00935112 -0.0093574505
+0.157036 0.157036 0.15695307
+0.039211 0.039211 0.039215673
+0.0816722 0.0816722 0.081654474
+0.00493054 0.00493054 0.004860576
+0.00442144 0.00442144 0.004434237
+-0.05006 -0.05006 -0.050047968
+-0.0687349 -0.0687349 -0.06868344
+0.0381331 0.0381331 0.03813907
+0.00310294 0.00310294 0.0030840726
+-0.0275964 -0.0275964 -0.027565658
+0.0844087 0.0844087 0.08444983
+-0.0473476 -0.0473476 -0.04737299
+0.0293338 0.0293338 0.029398927
+0.00272867 0.00272867 0.0027301218
+0.0329065 0.0329065 0.03288811
+0.0126441 0.0126441 0.012627144
+-0.105791 -0.105791 -0.105803624
+-0.0923369 -0.0923369 -0.092287466
+-0.00577163 -0.00577163 -0.0058081266
+0.135639 0.135639 0.13562426
+0.0360204 0.0360204 0.035972465
+-0.0329445 -0.0329445 -0.032870665
+0.0371009 0.0371009 0.037076972
+0.0146911 0.0146911 0.01470151
+-0.030003 -0.030003 -0.029953975
+-0.00371737 -0.00371737 -0.0036859924
+-0.0593852 -0.0593852 -0.05931457
+0.0952163 0.0952163 0.095210396
+-0.0246423 -0.0246423 -0.024598423
+-0.0163578 -0.0163578 -0.016338982
+-0.0898604 -0.0898604 -0.08990089
+-0.0119719 -0.0119719 -0.01193727
+-0.0508426 -0.0508426 -0.050880272
+-0.0863963 -0.0863963 -0.08638418
+-0.139428 -0.139428 -0.13939841
+0.044922 0.044922 0.044963956
+0.0527153 0.0527153 0.052735124
+0.0707722 0.0707722 0.07078028
+0.0728348 0.0728348 0.072717845
+0.0751253 0.0751253 0.07516432
+-0.099345 -0.099345 -0.09936808
+0.000886933 0.000886933 0.0008535402
+0.100147 0.100147 0.10002974
+0.0144436 0.0144436 0.014406132
+-0.0548055 -0.0548055 -0.054791737
+0.0521455 0.0521455 0.05205637
+-0.0424488 -0.0424488 -0.04238053
+-0.0677277 -0.0677277 -0.06771327
+0.0641124 0.0641124 0.064183824
+0.0166722 0.0166722 0.016757583
+-0.0591776 -0.0591776 -0.059138272
+-0.0591525 -0.0591525 -0.05912139
+-0.0190804 -0.0190804 -0.019084536
+-0.10253 -0.10253 -0.10247874
+-0.0353694 -0.0353694 -0.03544923
+0.116582 0.116582 0.11647328
+-0.0499866 -0.0499866 -0.049947012
+0.00927067 0.00927067 0.009411542
+-0.141683 -0.141683 -0.14174482
+-0.0109298 -0.0109298 -0.010858529
+0.137397 0.137397 0.13739519
+0.00236658 0.00236658 0.002402675
+0.0156093 0.0156093 0.015648007
+-0.074586 -0.074586 -0.07454647
+-0.0435637 -0.0435637 -0.04357019
+0.0327797 0.0327797 0.032780796
+0.0453993 0.0453993 0.04542561
+0.0278183 0.0278183 0.02783575
+0.0847486 0.0847486 0.08473176
+0.00165894 0.00165894 0.0017167843
+0.0423954 0.0423954 0.042386282
+-0.0545126 -0.0545126 -0.05447223
+-0.0682817 -0.0682817 -0.068182796
+-0.0616332 -0.0616332 -0.06163884
+-0.052267 -0.052267 -0.05231152
+0.0262957 0.0262957 0.026332106
+-0.0801376 -0.0801376 -0.08010776
+0.0153231 0.0153231 0.015409228
+0.077808 0.077808 0.07786243
+-0.00502868 -0.00502868 -0.005022384
+0.13594 0.13594 0.13589193
+-0.0233411 -0.0233411 -0.023414833
+0.0275977 0.0275977 0.027610838
+-0.0144232 -0.0144232 -0.014375772
+-0.0147976 -0.0147976 -0.014871436
+0.0287727 0.0287727 0.028799146
+0.0292824 0.0292824 0.029300544
+0.0278037 0.0278037 0.02793182
+0.104937 0.104937 0.104922645
+-0.0122869 -0.0122869 -0.012254082
+-0.0234407 -0.0234407 -0.023480596
+0.00856831 0.00856831 0.008537365
+-0.0244242 -0.0244242 -0.02441801
+-0.0868411 -0.0868411 -0.08684312
+0.0718042 0.0718042 0.071875304
+-0.0457629 -0.0457629 -0.045794476
+-0.017378 -0.017378 -0.017362481
+0.1069 0.1069 0.10684584
+-0.0628042 -0.0628042 -0.06271363
+0.0138652 0.0138652 0.013929314
+-0.0337252 -0.0337252 -0.03367596
+0.0218209 0.0218209 0.021786034
+0.0152358 0.0152358 0.015164762
+0.0909022 0.0909022 0.0909644
+0.0454225 0.0454225 0.04539511
+-0.0382933 -0.0382933 -0.038292896
+0.08091 0.08091 0.08094908
+-0.0472447 -0.0472447 -0.04726853
+0.0667049 0.0667049 0.06668231
+-0.103612 -0.103612 -0.10359235
+-0.049081 -0.049081 -0.04907777
+-0.000549436 -0.000549436 -0.0004916626
+0.0439868 0.0439868 0.044015534
+-0.0954798 -0.0954798 -0.09561605
+-0.00201512 -0.00201512 -0.0019462825
+0.065845 0.065845 0.06593018
+-0.0324526 -0.0324526 -0.03246917
+0.00595447 0.00595447 0.005847421
+-0.0381746 -0.0381746 -0.038145147
+-0.0763434 -0.0763434 -0.076285325
+-0.0090205 -0.0090205 -0.008988769
+-0.0194541 -0.0194541 -0.019486977
+0.0198814 0.0198814 0.019945333
+0.0578744 0.0578744 0.057843234
+-0.00779862 -0.00779862 -0.007828754
+-0.00688198 -0.00688198 -0.0068542785
+0.114949 0.114949 0.114938736
+0.0414261 0.0414261 0.041446954
+-0.0108493 -0.0108493 -0.010900693
+-0.0313957 -0.0313957 -0.03139675
+-0.0620111 -0.0620111 -0.061976742
+0.0245007 0.0245007 0.024535123
+-0.0596181 -0.0596181 -0.059675917
+-0.0800479 -0.0800479 -0.08004785
+-0.0721706 -0.0721706 -0.07228958
+0.0712942 0.0712942 0.07136295
+-0.0672955 -0.0672955 -0.06730062
+-0.00701501 -0.00701501 -0.0070987646
+0.0887472 0.0887472 0.08871434
+0.0321059 0.0321059 0.032125935
+-0.032013 -0.032013 -0.032000996
+-0.0177762 -0.0177762 -0.017772123
+-0.021149 -0.021149 -0.021079823
+-0.00538408 -0.00538408 -0.0054166135
+0.0312436 0.0312436 0.031240718
+-0.0860098 -0.0860098 -0.08601078
+0.103738 0.103738 0.10376508
+-0.0722214 -0.0722214 -0.07231265
+0.0250009 0.0250009 0.024923565
+0.13557 0.13557 0.13558029
+0.0157096 0.0157096 0.015778916
+0.0472307 0.0472307 0.0472252
+-0.0963088 -0.0963088 -0.096369356
+-0.0358138 -0.0358138 -0.035886716
+-0.00814807 -0.00814807 -0.008090855
+0.068548 0.068548 0.0685595
+-0.082624 -0.082624 -0.082615964
+-0.0229619 -0.0229619 -0.02293562
+0.0126239 0.0126239 0.012654734
+0.0171394 0.0171394 0.017105896
+-0.0198714 -0.0198714 -0.019911509
+-0.122449 -0.122449 -0.12242488
+-0.0594919 -0.0594919 -0.0595273
+-0.113161 -0.113161 -0.11316117
+0.069462 0.069462 0.069519006
+-0.00991259 -0.00991259 -0.009877172
+0.0430971 0.0430971 0.0430664
+0.0169472 0.0169472 0.016898643
+-0.0382775 -0.0382775 -0.0382272
+0.0688429 0.0688429 0.06884726
+-0.0374482 -0.0374482 -0.037465066
+0.041494 0.041494 0.04143241
+-0.0349341 -0.0349341 -0.034972917
+0.0264077 0.0264077 0.026458204
+0.153205 0.153205 0.15322417
+0.0356993 0.0356993 0.03568475
+-0.106711 -0.106711 -0.10678004
+0.0333664 0.0333664 0.033271328
+0.0207975 0.0207975 0.020805744
+0.0625512 0.0625512 0.062596366
+-0.0722697 -0.0722697 -0.07226944
+0.0975507 0.0975507 0.09749513
+0.0179893 0.0179893 0.0179676
+-0.0375372 -0.0375372 -0.03756214
+0.045664 0.045664 0.045679647
+0.0585751 0.0585751 0.058555666
+-0.0985737 -0.0985737 -0.09858013
+-0.0727691 -0.0727691 -0.07272761
+0.0721199 0.0721199 0.07218393
+0.0517744 0.0517744 0.051673066
+0.0515994 0.0515994 0.05160527
+0.0205052 0.0205052 0.020445772
+-0.00386251 -0.00386251 -0.003795895
+-0.0486549 -0.0486549 -0.048673753
+0.0105364 0.0105364 0.0105583565
+0.160452 0.160452 0.16044924
+-0.113438 -0.113438 -0.11343136
+-0.0785129 -0.0785129 -0.078465946
+-0.0560388 -0.0560388 -0.056093283
+0.0536809 0.0536809 0.053691704
+-0.0642731 -0.0642731 -0.064265
+0.0201075 0.0201075 0.020157829
+0.0106536 0.0106536 0.010642538
+-0.0355987 -0.0355987 -0.035565346
+-0.0454537 -0.0454537 -0.045440912
+-0.0620665 -0.0620665 -0.06206365
+-0.0272062 -0.0272062 -0.027187437
+0.0612653 0.0612653 0.061301578
+-0.0733389 -0.0733389 -0.07337231
+0.00837009 0.00837009 0.008374023
+0.0405052 0.0405052 0.040423438
+0.0204501 0.0204501 0.020442493
+-0.0418927 -0.0418927 -0.041916654
+0.0105216 0.0105216 0.010561548
+0.122133 0.122133 0.12210324
+0.00370949 0.00370949 0.0037304105
+-0.0971165 -0.0971165 -0.097141325
+-0.0541682 -0.0541682 -0.054090302
+0.0161635 0.0161635 0.016158251
+-0.0208605 -0.0208605 -0.020812143
+0.0673349 0.0673349 0.06736189
+-0.0633673 -0.0633673 -0.063401625
+-0.0565576 -0.0565576 -0.056726836
+0.0532704 0.0532704 0.053237885
+-0.0299303 -0.0299303 -0.029882072
+-0.0601764 -0.0601764 -0.060223345
+0.0182298 0.0182298 0.018281268
+-0.0267721 -0.0267721 -0.026727114
+-0.0125627 -0.0125627 -0.012559479
+0.00978926 0.00978926 0.009759318
+0.0413449 0.0413449 0.04128813
+0.102757 0.102757 0.10273017
+0.098778 0.098778 0.09876594
+-0.0425208 -0.0425208 -0.04252229
+0.0382595 0.0382595 0.0382022
+-0.0677453 -0.0677453 -0.06778083
+0.0368786 0.0368786 0.036713816
+0.0387968 0.0387968 0.038876865
+-0.00680429 -0.00680429 -0.006870442
+-0.00685776 -0.00685776 -0.0068468386
+-0.101526 -0.101526 -0.101483405
+-0.0606549 -0.0606549 -0.06064562
+-0.0527371 -0.0527371 -0.052721415
+0.0606997 0.0606997 0.06074581
+-0.0407649 -0.0407649 -0.04074453
+-0.0258942 -0.0258942 -0.025877262
+0.0450496 0.0450496 0.04506841
+-0.0198127 -0.0198127 -0.019834692
+0.0653295 0.0653295 0.063548855
+0.0131165 0.0131165 0.012560136
+-0.0270486 -0.0270486 -0.027730048
+0.0493812 0.0493812 0.049279153
+0.0132769 0.0132769 0.01329281
+0.00128465 0.00128465 0.0013202822
+0.0075122 0.0075122 0.007344263
+-0.0602458 -0.0602458 -0.060155343
+-0.0201613 -0.0201613 -0.020290755
+-0.0189207 -0.0189207 -0.019044869
+-0.0687412 -0.0687412 -0.06869008
+0.0115203 0.0115203 0.011514476
+-0.0651757 -0.0651757 -0.065190904
+0.0568151 0.0568151 0.056824174
+-0.165829 -0.165829 -0.16590108
+-0.0961899 -0.0961899 -0.09629134
+0.117321 0.117321 0.117344886
+-0.069444 -0.069444 -0.06948144
+-0.0758893 -0.0758893 -0.07596233
+-0.0520547 -0.0520547 -0.052019056
+-0.091916 -0.091916 -0.091919035
+0.0906655 0.0906655 0.09065038
+-0.0257775 -0.0257775 -0.02585599
+-0.0258799 -0.0258799 -0.025864083
+0.016406 0.016406 0.016447462
+0.0645168 0.0645168 0.06455054
+0.0414394 0.0414394 0.041431654
+0.0725697 0.0725697 0.07246278
+-0.0285952 -0.0285952 -0.028636375
+0.0654003 0.0654003 0.065450974
+-0.0124541 -0.0124541 -0.012471621
+-0.105508 -0.105508 -0.10541832
+-0.00232969 -0.00232969 -0.0023675107
+-0.113455 -0.113455 -0.11350907
+0.0627594 0.0627594 0.06280739
+-0.0212383 -0.0212383 -0.021236135
+-0.0913005 -0.0913005 -0.09125328
+0.00598554 0.00598554 0.0059865513
+0.0108706 0.0108706 0.010862056
+0.0247467 0.0247467 0.024718242
+0.0681867 0.0681867 0.06815658
+-0.201172 -0.201172 -0.2011568
+0.0445474 0.0445474 0.044542953
+0.00621027 0.00621027 0.006214836
+0.0108281 0.0108281 0.010823693
+0.0444071 0.0444071 0.04438869
+0.0681441 0.0681441 0.06821475
+0.0261679 0.0261679 0.026186502
+0.104057 0.104057 0.10402984
+-0.0192148 -0.0192148 -0.019237652
+-0.061863 -0.061863 -0.061868526
+-0.100562 -0.100562 -0.10056375
+-0.174935 -0.174935 -0.17489253
+-0.0504894 -0.0504894 -0.05045724
+-0.00868037 -0.00868037 -0.008671147
+0.109987 0.109987 0.10999509
+0.0378853 0.0378853 0.0378752
+-0.0153837 -0.0153837 -0.015431937
+-0.0645715 -0.0645715 -0.064584166
+0.0337686 0.0337686 0.033684697
+0.00652098 0.00652098 0.0066065337
+-0.0717923 -0.0717923 -0.07183438
+-0.00676504 -0.00676504 -0.0067488356
+0.00768651 0.00768651 0.0076687634
+0.0294557 0.0294557 0.029386263
+0.124985 0.124985 0.12499362
+0.0208068 0.0208068 0.020712422
+-0.00570303 -0.00570303 -0.005650172
+0.0543658 0.0543658 0.054416515
+0.047356 0.047356 0.047363058
+-0.000166905 -0.000166905 -0.00026267444
+0.0314702 0.0314702 0.031472173
+-0.142203 -0.142203 -0.14220797
+-0.0441478 -0.0441478 -0.04412939
+0.0502748 0.0502748 0.050256476
+0.0088405 0.0088405 0.00884938
+-0.0368142 -0.0368142 -0.036851324
+-0.116246 -0.116246 -0.116251364
+-0.030213 -0.030213 -0.030285662
+0.0258623 0.0258623 0.025867386
+-0.0522554 -0.0522554 -0.052261777
+0.0104885 0.0104885 0.010398379
+-0.044973 -0.044973 -0.044935014
+0.00401285 0.00401285 0.0040488215
+0.0403851 0.0403851 0.040387828
+0.0431153 0.0431153 0.04310458
+-0.0274422 -0.0274422 -0.027486866
+0.0668549 0.0668549 0.066849284
+-0.0486322 -0.0486322 -0.04857478
+-0.00175412 -0.00175412 -0.0017943874
+-0.0856369 -0.0856369 -0.08568595
+-0.082385 -0.082385 -0.082406715
+-0.0214151 -0.0214151 -0.021392617
+0.0205549 0.0205549 0.02052435
+0.00016055 0.00016055 0.0002526406
+0.00233047 0.00233047 0.0023066176
+0.00879169 0.00879169 0.008800809
+-0.0332036 -0.0332036 -0.03327772
+0.0987067 0.0987067 0.098684646
+0.0650941 0.0650941 0.06509907
+-0.113659 -0.113659 -0.1135951
+0.0203311 0.0203311 0.020318296
+0.0993201 0.0993201 0.099293314
+0.0348225 0.0348225 0.034882937
+-0.0291356 -0.0291356 -0.029116752
+0.0635113 0.0635113 0.06347595
+-0.0217627 -0.0217627 -0.021750346
+0.135891 0.135891 0.13591813
+-0.0970261 -0.0970261 -0.09694596
+0.0374055 0.0374055 0.03740065
+0.00610234 0.00610234 0.0061593307
+-0.0896266 -0.0896266 -0.08967177
+0.0239459 0.0239459 0.023894044
+-0.0431661 -0.0431661 -0.04317255
+0.0518756 0.0518756 0.051889062
+0.0775965 0.0775965 0.077600576
+-0.0282974 -0.0282974 -0.028272888
+0.0559174 0.0559174 0.055839237
+0.0554503 0.0554503 0.055508584
+-0.0120576 -0.0120576 -0.012114349
+0.0849337 0.0849337 0.084910356
+0.080557 0.080557 0.08058339
+0.0380591 0.0380591 0.038029734
+0.00540323 0.00540323 0.0054182876
+-0.0643334 -0.0643334 -0.0644162
+-0.105604 -0.105604 -0.10557482
+-0.0156245 -0.0156245 -0.015680585
+-0.0758462 -0.0758462 -0.075828984
+0.125086 0.125086 0.12512782
+-0.0794204 -0.0794204 -0.07951003
+-0.0250733 -0.0250733 -0.025099738
+-0.0542299 -0.0542299 -0.054210275
+-0.0355442 -0.0355442 -0.035416495
+-0.0290071 -0.0290071 -0.028867984
+0.0246224 0.0246224 0.024535364
+0.0155884 0.0155884 0.015496487
+0.142457 0.142457 0.14241824
+0.0301892 0.0301892 0.030193299
+-0.0353128 -0.0353128 -0.035291553
+-0.034646 -0.034646 -0.034552746
+-0.076479 -0.076479 -0.07645503
+0.0685036 0.0685036 0.0685914
+0.069627 0.069627 0.069690965
+-0.00990677 -0.00990677 -0.009907756
+0.0496553 0.0496553 0.049620975
+0.0213154 0.0213154 0.021248367
+0.0553894 0.0553894 0.05532668
+0.040824 0.040824 0.04085294
+-0.0511406 -0.0511406 -0.05111299
+-0.0680455 -0.0680455 -0.06801835
+0.0133804 0.0133804 0.013353203
+0.0170121 0.0170121 0.017006978
+0.0385896 0.0385896 0.03854809
+-0.0530041 -0.0530041 -0.053109676
+0.0241698 0.0241698 0.024184803
+0.0141916 0.0141916 0.014153055
+-0.0402113 -0.0402113 -0.04006792
+-0.000569676 -0.000569676 -0.0006702582
+-0.13654 -0.13654 -0.13650785
+0.0518423 0.0518423 0.051772334
+-0.00940459 -0.00940459 -0.009319658
+-0.0482009 -0.0482009 -0.048213623
+-0.00447888 -0.00447888 -0.0043950737
+0.113943 0.113943 0.113900125
+0.0594572 0.0594572 0.05941948
+0.103079 0.103079 0.10315112
+-0.0855626 -0.0855626 -0.08553877
+0.0113081 0.0113081 0.011336735
+-0.0154618 -0.0154618 -0.015491187
+-0.033909 -0.033909 -0.033992127
+0.0952552 0.0952552 0.0953087
+0.0294382 0.0294382 0.029429603
+0.113649 0.113649 0.113634825
+0.0235659 0.0235659 0.023508372
+0.11293 0.11293 0.11286213
+0.023728 0.023728 0.023652654
+-0.0162058 -0.0162058 -0.01625625
+0.0667087 0.0667087 0.066647194
+0.0673575 0.0673575 0.06740708
+0.0830204 0.0830204 0.08301531
+-0.0457327 -0.0457327 -0.045825146
+0.0738199 0.0738199 0.073850125
+-0.0752211 -0.0752211 -0.07526195
+0.0240177 0.0240177 0.024092205
+0.0386395 0.0386395 0.038650252
+-0.0885774 -0.0885774 -0.0885861
+0.0179201 0.0179201 0.01797733
+-0.039175 -0.039175 -0.03919632
+0.11268 0.11268 0.112693675
+-0.0550549 -0.0550549 -0.055018403
+-0.0299643 -0.0299643 -0.029884055
+-0.141434 -0.141434 -0.14147717
+0.110754 0.110754 0.11071699
+-0.107651 -0.107651 -0.10760163
+-0.0455432 -0.0455432 -0.045497105
+-0.012042 -0.012042 -0.0119741075
+0.109416 0.109416 0.109392494
+0.073278 0.073278 0.0732587
+-0.0462405 -0.0462405 -0.046213582
+0.0272162 0.0272162 0.027271522
+-0.0563186 -0.0563186 -0.05630755
+-0.0446361 -0.0446361 -0.04460717
+0.0305647 0.0305647 0.030523201
+-0.0557687 -0.0557687 -0.055741932
+-0.0479249 -0.0479249 -0.047937624
+-0.023906 -0.023906 -0.023875492
+-0.0537644 -0.0537644 -0.053748645
+0.00218472 0.00218472 0.0021465463
+-0.000779049 -0.000779049 -0.00083052856
+0.0022778 0.0022778 0.0022685404
+0.0126681 0.0126681 0.012680041
+0.043772 0.043772 0.043749586
+0.0223408 0.0223408 0.022354469
+0.0266291 0.0266291 0.026646165
+0.121499 0.121499 0.12138782
+0.0253468 0.0253468 0.025397506
+0.0377818 0.0377818 0.0377314
+-0.0403103 -0.0403103 -0.040256646
+-0.0662095 -0.0662095 -0.06622906
+0.0405306 0.0405306 0.040533822
+-0.10958 -0.10958 -0.10960723
+0.00944912 0.00944912 0.009476006
+0.0623464 0.0623464 0.062355973
+0.055801 0.055801 0.055819783
+0.0221952 0.0221952 0.022166394
+0.0134412 0.0134412 0.013442905
+-0.0560573 -0.0560573 -0.05608861
+-0.12621 -0.12621 -0.1261997
+-0.0265205 -0.0265205 -0.026556242
+0.00862359 0.00862359 0.008567935
+-0.0481339 -0.0481339 -0.048155714
+-0.0283012 -0.0283012 -0.028260969
+-0.0196254 -0.0196254 -0.019623313
+0.00205237 0.00205237 0.0020186426
+0.022089 0.022089 0.02204921
+-0.122849 -0.122849 -0.12279869
+0.0789778 0.0789778 0.07898782
+-0.0402984 -0.0402984 -0.040276244
+-0.0335158 -0.0335158 -0.033414874
+0.0521635 0.0521635 0.052156553
+0.031057 0.031057 0.031020744
+0.0584977 0.0584977 0.05845134
+-0.0154202 -0.0154202 -0.015364136
+-0.0725435 -0.0725435 -0.07262463
+0.0117917 0.0117917 0.011833
+0.0998382 0.0998382 0.099867694
+-0.0247647 -0.0247647 -0.024710074
+0.105986 0.105986 0.1059885
+-0.0100717 -0.0100717 -0.010075309
+0.0435314 0.0435314 0.043545034
+-0.0189825 -0.0189825 -0.019025734
+-0.0404794 -0.0404794 -0.04043869
+-0.0423777 -0.0423777 -0.042344213
+-0.0447855 -0.0447855 -0.04482793
+0.0218047 0.0218047 0.021792714
+-0.0463711 -0.0463711 -0.04642492
+-0.064934 -0.064934 -0.06492613
+0.0910422 0.0910422 0.091035426
+-0.0489351 -0.0489351 -0.04895391
+0.0603709 0.0603709 0.06044712
+-0.0850901 -0.0850901 -0.0850987
+0.0913155 0.0913155 0.0913612
+-0.0641446 -0.0641446 -0.06412176
+-0.0127634 -0.0127634 -0.012735101
+-0.116451 -0.116451 -0.1163738
+-0.0531628 -0.0531628 -0.053229835
+0.000197697 0.000197697 0.00018919629
+0.0114345 0.0114345 0.0113792615
+0.0287383 0.0287383 0.028686507
+0.00625807 0.00625807 0.006245597
+-0.0984348 -0.0984348 -0.09841171
+0.0225724 0.0225724 0.022713035
+0.0653502 0.0653502 0.065352894
+0.104313 0.104313 0.10434943
+0.00975994 0.00975994 0.009799947
+0.0900033 0.0900033 0.08998954
+0.0412859 0.0412859 0.041346032
+-0.0696284 -0.0696284 -0.06974265
+-0.0344809 -0.0344809 -0.034353647
+0.0959936 0.0959936 0.09603264
+-0.000224428 -0.000224428 -0.000100798905
+-0.0563236 -0.0563236 -0.05634051
+-0.0542279 -0.0542279 -0.05421701
+0.0593008 0.0593008 0.059310455
+-0.0736143 -0.0736143 -0.07360547
+-0.0701754 -0.0701754 -0.07024004
+0.0746588 0.0746588 0.074643426
+-0.0270905 -0.0270905 -0.027111357
+0.0366143 0.0366143 0.036646057
+0.146677 0.146677 0.14661472
+-0.0151267 -0.0151267 -0.015085728
+-0.0199028 -0.0199028 -0.019842556
+0.00338197 0.00338197 0.003421091
+-0.089612 -0.089612 -0.08958834
+0.0734889 0.0734889 0.073495016
+0.127305 0.127305 0.12729107
+0.0299241 0.0299241 0.029891573
+-0.0370063 -0.0370063 -0.037073124
+-0.0702647 -0.0702647 -0.070319444
+0.0105398 0.0105398 0.0104981335
+-0.064799 -0.064799 -0.06482139
+0.0426535 0.0426535 0.04260677
+-0.0660373 -0.0660373 -0.06611329
+0.0861007 0.0861007 0.08616066
+0.0490722 0.0490722 0.049035557
+0.0809692 0.0809692 0.08097627
+-0.0848755 -0.0848755 -0.084808856
+-0.0619738 -0.0619738 -0.06193638
+0.000801654 0.000801654 0.00082206
+-0.0122198 -0.0122198 -0.012222651
+0.0320425 0.0320425 0.03196071
+0.0112039 0.0112039 0.011302248
+0.00434575 0.00434575 0.0043118126
+-0.117803 -0.117803 -0.1177249
+0.00588467 0.00588467 0.0058990708
+-0.0429954 -0.0429954 -0.0430038
+-0.0424946 -0.0424946 -0.04247967
+0.0588094 0.0588094 0.05875394
+-0.0461824 -0.0461824 -0.046221863
+-0.0575993 -0.0575993 -0.057607405
+0.0395219 0.0395219 0.03949615
+0.0156002 0.0156002 0.015631346
+-0.0364309 -0.0364309 -0.036389023
+0.0287154 0.0287154 0.028725365
+-0.135449 -0.135449 -0.13539602
+0.0692636 0.0692636 0.06925555
+-0.000961048 -0.000961048 -0.0009338064
+0.0301329 0.0301329 0.030127995
+-0.0522957 -0.0522957 -0.052305322
+0.000433841 0.000433841 0.00043728514
+-0.0904321 -0.0904321 -0.09050494
+-0.00580172 -0.00580172 -0.005814375
+0.102671 0.102671 0.1027054
+0.0608885 0.0608885 0.060925353
+-0.0260786 -0.0260786 -0.026053492
+-0.0779211 -0.0779211 -0.07787416
+-0.109682 -0.109682 -0.10967532
+-0.0622208 -0.0622208 -0.06220493
+0.0550355 0.0550355 0.055011943
+-0.0584322 -0.0584322 -0.05846103
+-0.0192433 -0.0192433 -0.019295106
+0.0412798 0.0412798 0.041346874
+0.0193331 0.0193331 0.019346545
+-0.0661704 -0.0661704 -0.066100016
+-0.0897714 -0.0897714 -0.08984625
+-0.0626029 -0.0626029 -0.062639855
+-0.00182871 -0.00182871 -0.0018671232
+0.0196085 0.0196085 0.019565118
+-0.111207 -0.111207 -0.11117698
+0.0524003 0.0524003 0.052290983
+-0.0665566 -0.0665566 -0.06652917
+-0.0203529 -0.0203529 -0.020393062
+-0.0437267 -0.0437267 -0.043630645
+-0.111891 -0.111891 -0.111966655
+-0.125389 -0.125389 -0.1253675
+-0.0695139 -0.0695139 -0.069466256
+-0.177612 -0.177612 -0.17762074
+0.004607 0.004607 0.004641447
+0.00634291 0.00634291 0.0062695476
+-0.0501973 -0.0501973 -0.050201632
+0.125397 0.125397 0.12541963
+-0.0189651 -0.0189651 -0.018976027
+0.100675 0.100675 0.100683175
+0.0744698 0.0744698 0.07447119
+0.00593423 0.00593423 0.005887086
+0.0318608 0.0318608 0.03184636
+0.0596042 0.0596042 0.059564065
+0.0660071 0.0660071 0.066081844
+-0.00200972 -0.00200972 -0.0020398472
+-0.00684264 -0.00684264 -0.0068072313
+-0.0357128 -0.0357128 -0.03577973
+0.0573146 0.0573146 0.05734056
+-0.0714149 -0.0714149 -0.07143784
+-0.0380266 -0.0380266 -0.03798495
+-0.105187 -0.105187 -0.10523367
+-0.0324607 -0.0324607 -0.03243933
+-0.000362298 -0.000362298 -0.00043659465
+-0.119682 -0.119682 -0.11970768
+-0.00248704 -0.00248704 -0.002507893
+0.0558754 0.0558754 0.055879
+-0.0294958 -0.0294958 -0.029487317
+-0.0101406 -0.0101406 -0.010160227
+-0.0137475 -0.0137475 -0.013699713
+-0.0399083 -0.0399083 -0.039874654
+0.0235001 0.0235001 0.023443218
+-0.0549346 -0.0549346 -0.054933906
+0.0546981 0.0546981 0.054676842
+0.0333524 0.0333524 0.033283856
+0.0497436 0.0497436 0.049772978
+0.0746926 0.0746926 0.07462021
+-0.0289261 -0.0289261 -0.028915107
+-0.117721 -0.117721 -0.11769794
+0.0207717 0.0207717 0.020784413
+-0.00553619 -0.00553619 -0.0055749537
+-0.0352906 -0.0352906 -0.0352532
+0.0206203 0.0206203 0.020634646
+0.033346 0.033346 0.033415135
+-0.108761 -0.108761 -0.10871414
+0.0297936 0.0297936 0.029812481
+0.0129912 0.0129912 0.012934469
+0.0127006 0.0127006 0.01270212
+-0.0603469 -0.0603469 -0.06035471
+-0.03248 -0.03248 -0.03249423
+0.0948256 0.0948256 0.09474368
+0.102724 0.102724 0.10269508
+0.0504204 0.0504204 0.050471958
+0.00582048 0.00582048 0.0058233235
+0.0231035 0.0231035 0.023070537
+-0.000321583 -0.000321583 -0.00033782687
+0.0332244 0.0332244 0.03326472
+-0.0738979 -0.0738979 -0.07393195
+0.0404996 0.0404996 0.040451095
+0.0528683 0.0528683 0.05278967
+0.0549738 0.0549738 0.05499771
+0.0557042 0.0557042 0.055770677
+0.0010409 0.0010409 0.0010872481
+0.0102332 0.0102332 0.010238134
+-0.00978292 -0.00978292 -0.009863126
+-0.0942745 -0.0942745 -0.09430438
+-0.102206 -0.102206 -0.10226178
+-0.0247267 -0.0247267 -0.024846265
+0.0139915 0.0139915 0.013942821
+-0.0120953 -0.0120953 -0.012075094
+0.0750863 0.0750863 0.07512529
+-0.0548896 -0.0548896 -0.054884538
+-0.052133 -0.052133 -0.052118357
+-0.0950094 -0.0950094 -0.09499057
+-0.0880348 -0.0880348 -0.08812188
+-0.122136 -0.122136 -0.12210558
+0.127548 0.127548 0.12756854
+0.0111406 0.0111406 0.011160664
+0.0105907 0.0105907 0.010605771
+0.0065762 0.0065762 0.006562799
+-0.0351666 -0.0351666 -0.03517154
+0.0697727 0.0697727 0.06977864
+0.0126355 0.0126355 0.012604938
+-0.073842 -0.073842 -0.07380401
+0.0410429 0.0410429 0.04097954
+0.109397 0.109397 0.10952044
+-0.00316843 -0.00316843 -0.0030700418
+0.0137756 0.0137756 0.013799545
+-0.0307203 -0.0307203 -0.030674944
+0.0134143 0.0134143 0.013381147
+0.0646261 0.0646261 0.0645974
+-0.0574242 -0.0574242 -0.057503752
+-0.0884047 -0.0884047 -0.08841738
+0.000417237 0.000417237 0.00043495235
+-0.0982327 -0.0982327 -0.09812572
+0.00547087 0.00547087 0.005449254
+0.0466283 0.0466283 0.04658278
+0.0752131 0.0752131 0.0751709
+-0.0193961 -0.0193961 -0.019434571
+0.0157548 0.0157548 0.015757926
+0.000492052 0.000492052 0.00046263108
+-0.0519096 -0.0519096 -0.05192722
+-0.00872564 -0.00872564 -0.008644283
+0.0351649 0.0351649 0.035209924
+-0.00915721 -0.00915721 -0.009278846
+0.00970035 0.00970035 0.009668035
+-0.0372029 -0.0372029 -0.037226208
+-0.000873932 -0.000873932 -0.0009631093
+-0.251831 -0.251831 -0.25182322
+-0.0400627 -0.0400627 -0.040044826
+0.0625105 0.0625105 0.06255036
+0.0251951 0.0251951 0.025196616
+-0.00110909 -0.00110909 -0.0012099562
+0.0508744 0.0508744 0.050851233
+0.0839358 0.0839358 0.08394366
+0.0611326 0.0611326 0.061150882
+-0.0306524 -0.0306524 -0.030672742
+-0.0142923 -0.0142923 -0.01429936
+0.0782981 0.0782981 0.07831465
+-0.0340906 -0.0340906 -0.034129728
+-0.0406922 -0.0406922 -0.040687922
+-0.00190903 -0.00190903 -0.0018788439
+-0.0154263 -0.0154263 -0.015352844
+0.0536751 0.0536751 0.053676013
+-0.000994415 -0.000994415 -0.0010392334
+0.0185335 0.0185335 0.018535316
+0.155899 0.155899 0.15584104
+0.0893775 0.0893775 0.089352734
+-0.111177 -0.111177 -0.111148246
+0.0320353 0.0320353 0.03199425
+0.0184548 0.0184548 0.018502066
+0.0450993 0.0450993 0.045133486
+0.0755911 0.0755911 0.075550646
+-0.0626532 -0.0626532 -0.06265763
+0.015126 0.015126 0.015190043
+-0.110263 -0.110263 -0.110224254
+-0.0035839 -0.0035839 -0.0036353788
+-0.115278 -0.115278 -0.11518425
+0.0671803 0.0671803 0.06714461
+0.0852357 0.0852357 0.08526698
+0.0775893 0.0775893 0.07759853
+0.10656 0.10656 0.10654521
+-0.00584206 -0.00584206 -0.005844357
+0.00401975 0.00401975 0.004092442
+-0.0237751 -0.0237751 -0.023775017
+-0.0940081 -0.0940081 -0.09397868
+0.0181776 0.0181776 0.018081728
+-0.0437106 -0.0437106 -0.043747026
+-0.0440958 -0.0440958 -0.044111554
+-0.045427 -0.045427 -0.0454743
+-0.0257425 -0.0257425 -0.025765387
+0.0571874 0.0571874 0.05721998
+-0.0294865 -0.0294865 -0.029432153
+0.00157917 0.00157917 0.0015823772
+-0.0579852 -0.0579852 -0.058039136
+0.107731 0.107731 0.107779086
+-0.143884 -0.143884 -0.14385153
+0.0233874 0.0233874 0.023373505
+-0.0914445 -0.0914445 -0.09145619
+-0.0207198 -0.0207198 -0.020686693
+-0.033589 -0.033589 -0.03362317
+0.00132715 0.00132715 0.0013438321
+0.00128613 0.00128613 0.0012488896
+0.00811778 0.00811778 0.008089237
+0.0193113 0.0193113 0.019284895
+0.0242102 0.0242102 0.024198906
+-0.104932 -0.104932 -0.10489804
+0.121363 0.121363 0.12142037
+0.043542 0.043542 0.043512803
+0.0363498 0.0363498 0.03631507
+-0.00453257 -0.00453257 -0.004622524
+-0.0337384 -0.0337384 -0.033750545
+0.00497956 0.00497956 0.0049228645
+-0.0385239 -0.0385239 -0.03855254
+0.0251496 0.0251496 0.025192613
+-0.101862 -0.101862 -0.1018984
+0.0296493 0.0296493 0.029629875
+0.0487328 0.0487328 0.048736364
+-0.0505561 -0.0505561 -0.050591517
+-0.0775103 -0.0775103 -0.07742422
+-0.0768213 -0.0768213 -0.0768429
+0.0885604 0.0885604 0.08869284
+0.0566288 0.0566288 0.056630634
+-0.0328645 -0.0328645 -0.032726433
+0.062952 0.062952 0.062996194
+0.0830102 0.0830102 0.083017714
+0.0216781 0.0216781 0.021688638
+0.0579276 0.0579276 0.057989005
+-0.17033 -0.17033 -0.17032683
+-0.0568634 -0.0568634 -0.0568728
+-0.0612657 -0.0612657 -0.0612654
+0.0302543 0.0302543 0.030299619
+-0.0770251 -0.0770251 -0.077066906
+0.0724789 0.0724789 0.07246711
+-0.0588417 -0.0588417 -0.05871445
+0.0484509 0.0484509 0.048475273
+0.109628 0.109628 0.10968635
+0.0160406 0.0160406 0.016084366
+-0.000615701 -0.000615701 -0.0006413227
+-0.123403 -0.123403 -0.123460315
+0.0423709 0.0423709 0.042399447
+0.112484 0.112484 0.11247445
+-0.130442 -0.130442 -0.1304992
+-0.040637 -0.040637 -0.040724695
+0.0195937 0.0195937 0.01960201
+-0.0541778 -0.0541778 -0.05413411
+-0.0486646 -0.0486646 -0.0486591
+-0.0326898 -0.0326898 -0.032708887
+0.0679057 0.0679057 0.06785193
+-0.118113 -0.118113 -0.11799962
+-0.0518252 -0.0518252 -0.051886756
+0.0691046 0.0691046 0.069105625
+-0.0670298 -0.0670298 -0.06704078
+0.0687358 0.0687358 0.06871386
+0.12726 0.12726 0.12733394
+0.0195975 0.0195975 0.019531311
+0.0763887 0.0763887 0.076399095
+-0.00351368 -0.00351368 -0.003492542
+0.00794639 0.00794639 0.007940965
+-0.00284427 -0.00284427 -0.0028040374
+0.0474338 0.0474338 0.047419004
+-0.021102 -0.021102 -0.021105751
+-0.0328862 -0.0328862 -0.0328358
+0.0992445 0.0992445 0.09923928
+0.0399988 0.0399988 0.03993963
+-0.100021 -0.100021 -0.100040846
+0.0158099 0.0158099 0.01584396
+-0.0380202 -0.0380202 -0.037928972
+0.0174893 0.0174893 0.017509164
+-0.0917731 -0.0917731 -0.09182301
+0.0298031 0.0298031 0.02986073
+-0.00751761 -0.00751761 -0.0074917404
+-0.0622 -0.0622 -0.06220415
+-0.0997059 -0.0997059 -0.09966756
+-0.030176 -0.030176 -0.030203754
+0.0353776 0.0353776 0.035317823
+-0.0753062 -0.0753062 -0.07523302
+0.0108322 0.0108322 0.010830806
+-0.0213755 -0.0213755 -0.021357298
+-0.0172107 -0.0172107 -0.017231515
+0.0208727 0.0208727 0.020891597
+-0.0536599 -0.0536599 -0.05376668
+0.0249697 0.0249697 0.025061946
+0.0304377 0.0304377 0.030453399
+-0.105118 -0.105118 -0.10516515
+0.0646966 0.0646966 0.06463083
+-0.0959603 -0.0959603 -0.095905274
+0.093702 0.093702 0.09379875
+-0.0629446 -0.0629446 -0.06300265
+-0.0262255 -0.0262255 -0.026215108
+-0.00617183 -0.00617183 -0.006121784
+0.0415869 0.0415869 0.041678324
+-0.036036 -0.036036 -0.036014877
+-0.0223882 -0.0223882 -0.022330135
+0.0326023 0.0326023 0.032589648
+-0.0867628 -0.0867628 -0.086768426
+-0.0954368 -0.0954368 -0.09546708
+0.0272875 0.0272875 0.02721846
+0.0128662 0.0128662 0.012820251
+-0.0305069 -0.0305069 -0.030448057
+-0.092019 -0.092019 -0.09198614
+-0.0149377 -0.0149377 -0.014934914
+-0.0625916 -0.0625916 -0.062567
+-0.00305357 -0.00305357 -0.0030371884
+0.0722146 0.0722146 0.07216981
+-0.00873512 -0.00873512 -0.008695676
+-0.0531736 -0.0531736 -0.053157292
+-0.0484429 -0.0484429 -0.048401304
+-0.0855271 -0.0855271 -0.085597135
+0.0148357 0.0148357 0.014825563
+-0.0456348 -0.0456348 -0.045671962
+0.0114646 0.0114646 0.011505541
+-0.0586984 -0.0586984 -0.058801834
+-0.0397302 -0.0397302 -0.039727885
+-0.0250203 -0.0250203 -0.025032908
+-0.131919 -0.131919 -0.13191967
+-0.0736948 -0.0736948 -0.073677205
+-0.110194 -0.110194 -0.11021208
+0.0211562 0.0211562 0.02109224
+0.0727081 0.0727081 0.072723456
+0.0369183 0.0369183 0.03698812
+0.0723357 0.0723357 0.072268605
+-0.017431 -0.017431 -0.017460857
+0.00749892 0.00749892 0.0074753775
+0.050456 0.050456 0.050454907
+0.0258543 0.0258543 0.025820952
+-0.112303 -0.112303 -0.11229571
+0.0520155 0.0520155 0.0520164
+0.0358491 0.0358491 0.035807427
+0.0349427 0.0349427 0.03488902
+0.0795006 0.0795006 0.07937991
+-0.0104609 -0.0104609 -0.010502077
+-0.0359159 -0.0359159 -0.03592191
+-0.00510004 -0.00510004 -0.005084798
+-0.0498805 -0.0498805 -0.049922876
+0.0578254 0.0578254 0.057800807
+-0.0257889 -0.0257889 -0.025783865
+-0.14409 -0.14409 -0.14406858
+-0.0148936 -0.0148936 -0.0148869185
+-0.171766 -0.171766 -0.17175888
+0.0489431 0.0489431 0.048936218
+0.019544 0.019544 0.019574234
+-0.0401692 -0.0401692 -0.040153172
+0.0123856 0.0123856 0.012435238
+-0.0792634 -0.0792634 -0.07917383
+0.0296971 0.0296971 0.029664624
+0.0345211 0.0345211 0.03458682
+-0.0900034 -0.0900034 -0.0899951
+0.0162356 0.0162356 0.016267188
+-0.0402187 -0.0402187 -0.040243924
+-0.0700408 -0.0700408 -0.070027925
+0.0223818 0.0223818 0.022471799
+0.00530966 0.00530966 0.005328087
+0.0751505 0.0751505 0.0751541
+0.00119458 0.00119458 0.0011800046
+-0.0816129 -0.0816129 -0.08160132
+-0.095314 -0.095314 -0.09525526
+-0.0361229 -0.0361229 -0.03618493
+0.0538326 0.0538326 0.05382881
+0.0527518 0.0527518 0.052761424
+-0.0670344 -0.0670344 -0.06702412
+0.123899 0.123899 0.12388165
+-0.0414731 -0.0414731 -0.0414573
+0.0463389 0.0463389 0.046347763
+0.0481318 0.0481318 0.04817151
+0.0472485 0.0472485 0.047253225
+-0.0412876 -0.0412876 -0.04126516
+0.0242349 0.0242349 0.024232922
+0.0296657 0.0296657 0.029632922
+-0.0213154 -0.0213154 -0.0212901
+0.0303298 0.0303298 0.030339861
+0.0570969 0.0570969 0.05706974
+-0.0609129 -0.0609129 -0.060931202
+0.0413249 0.0413249 0.041304007
+0.0554785 0.0554785 0.05547666
+-0.13248 -0.13248 -0.13240714
+0.0513741 0.0513741 0.051388945
+-0.0488045 -0.0488045 -0.04873839
+0.166785 0.166785 0.16676743
+0.029506 0.029506 0.029495351
+0.0596813 0.0596813 0.059752524
+-0.0338202 -0.0338202 -0.03383169
+-0.0889505 -0.0889505 -0.08900255
+-0.0881893 -0.0881893 -0.088172995
+0.234853 0.234853 0.23478763
+-0.0535284 -0.0535284 -0.053499922
+0.024038 0.024038 0.023992369
+0.0235989 0.0235989 0.02367001
+-0.0685012 -0.0685012 -0.06848342
+-0.0727718 -0.0727718 -0.07274055
+0.0232433 0.0232433 0.023288675
+-2.60207e-05 -2.60207e-05 7.2411267e-06
+0.084121 0.084121 0.08417554
+-0.0505206 -0.0505206 -0.05048407
+0.114788 0.114788 0.114795424
+-0.0408904 -0.0408904 -0.040817156
+0.0101735 0.0101735 0.010192279
+0.021195 0.021195 0.021178685
+-0.0492968 -0.0492968 -0.049343843
+-0.0517093 -0.0517093 -0.051617213
+-0.034694 -0.034694 -0.034654588
+0.0301953 0.0301953 0.030290969
+-0.0856948 -0.0856948 -0.08575306
+-0.132677 -0.132677 -0.13265069
+-0.0860963 -0.0860963 -0.086116895
+-0.0217475 -0.0217475 -0.02181348
+0.0292601 0.0292601 0.02923618
+0.118756 0.118756 0.11888943
+-0.0375922 -0.0375922 -0.037545394
+0.05592 0.05592 0.055929393
+0.0793046 0.0793046 0.079322435
+-0.0574258 -0.0574258 -0.057429045
+-0.0316797 -0.0316797 -0.03166637
+-0.123175 -0.123175 -0.12318407
+-0.049586 -0.049586 -0.049498845
+0.0328871 0.0328871 0.032866154
+0.0589391 0.0589391 0.058885932
+-0.0322245 -0.0322245 -0.032270286
+-0.0328059 -0.0328059 -0.032817
+0.0248801 0.0248801 0.024820583
+0.140689 0.140689 0.14063202
+0.0646859 0.0646859 0.06465066
+0.0244885 0.0244885 0.024484742
+0.0148219 0.0148219 0.014839581
+0.0724338 0.0724338 0.07250619
+-0.0644078 -0.0644078 -0.06435682
+0.069158 0.069158 0.069156855
+-0.0199153 -0.0199153 -0.019983448
+-0.0398382 -0.0398382 -0.03984849
+-0.0100592 -0.0100592 -0.010077896
+-0.019101 -0.019101 -0.019116063
+-0.00372825 -0.00372825 -0.0036967034
+0.0539226 0.0539226 0.05396298
+-0.030465 -0.030465 -0.03045959
+-0.0615474 -0.0615474 -0.061530016
+0.0218696 0.0218696 0.021830918
+-0.0520429 -0.0520429 -0.052097768
+-0.0496496 -0.0496496 -0.04968536
+0.0461637 0.0461637 0.04613579
+0.0695779 0.0695779 0.06964411
+-0.0446577 -0.0446577 -0.044683043
+0.0867272 0.0867272 0.08670162
+0.0969173 0.0969173 0.09688279
+0.031874 0.031874 0.03185224
+0.0615275 0.0615275 0.06148705
+0.00261091 0.00261091 0.002603725
+-0.124846 -0.124846 -0.124950774
+0.0719755 0.0719755 0.071942575
+0.0172262 0.0172262 0.017201489
+0.0257773 0.0257773 0.025768617
+0.0186176 0.0186176 0.018673
+0.10667 0.10667 0.10659512
+0.0358038 0.0358038 0.03585492
+-0.0473701 -0.0473701 -0.04737718
+-0.0720138 -0.0720138 -0.07195809
+-0.149694 -0.149694 -0.14968392
+-0.0185727 -0.0185727 -0.018574683
+-0.0021333 -0.0021333 -0.002112729
+0.116844 0.116844 0.1168205
+-0.0221036 -0.0221036 -0.022188062
+-0.105606 -0.105606 -0.10559037
+-0.0495932 -0.0495932 -0.04962039
+-0.0154283 -0.0154283 -0.0154039385
+0.0216972 0.0216972 0.021682883
+-0.023859 -0.023859 -0.02393035
+0.0727233 0.0727233 0.072656855
+0.00235702 0.00235702 0.002192869
+-0.0249437 -0.0249437 -0.024897685
+-0.0441815 -0.0441815 -0.044181053
+-0.0785604 -0.0785604 -0.07854881
+-0.0214143 -0.0214143 -0.021390798
+0.0261316 0.0261316 0.026130779
+0.05559 0.05559 0.055579107
+-0.0894323 -0.0894323 -0.08939903
+0.00187232 0.00187232 0.0018359482
+-0.0144013 -0.0144013 -0.014440874
+0.0220571 0.0220571 0.022168064
+0.0042063 0.0042063 0.004316924
+0.0377518 0.0377518 0.03781719
+0.00226757 0.00226757 0.0022503464
+-0.0167648 -0.0167648 -0.016809378
+0.02453 0.02453 0.024582008
+0.0376075 0.0376075 0.03761014
+0.0355444 0.0355444 0.035597358
+-0.0431163 -0.0431163 -0.043137595
+-0.00292835 -0.00292835 -0.002900396
+-0.0119434 -0.0119434 -0.011987337
+-0.0421732 -0.0421732 -0.042128276
+0.0607477 0.0607477 0.060740758
+0.0739131 0.0739131 0.073857404
+0.0211148 0.0211148 0.021112287
+-0.0285813 -0.0285813 -0.028608978
+-0.0306359 -0.0306359 -0.030586356
+0.0456848 0.0456848 0.04571463
+0.0457272 0.0457272 0.045704674
+-0.0281938 -0.0281938 -0.02824827
+0.0479818 0.0479818 0.04796238
+0.0525762 0.0525762 0.05255879
+-0.0558723 -0.0558723 -0.055851463
+-0.00263422 -0.00263422 -0.0026420366
+0.0389116 0.0389116 0.03896648
+-0.0061085 -0.0061085 -0.006091655
+-0.0276716 -0.0276716 -0.027686967
+-0.00212171 -0.00212171 -0.0020859574
+0.0988596 0.0988596 0.098780885
+0.175778 0.175778 0.17580117
+-0.0442928 -0.0442928 -0.04426858
+0.0553819 0.0553819 0.055373974
+0.0148617 0.0148617 0.014862953
+-0.00714365 -0.00714365 -0.0071105515
+0.0504897 0.0504897 0.050451484
+0.0576845 0.0576845 0.05770395
+-0.000604871 -0.000604871 -0.00061396376
+-0.0401287 -0.0401287 -0.04008099
+-0.0390048 -0.0390048 -0.03899735
+-0.00119989 -0.00119989 -0.0012120683
+-0.0251285 -0.0251285 -0.025094792
+-0.0211363 -0.0211363 -0.021150805
+0.0391689 0.0391689 0.03921568
+-0.0839261 -0.0839261 -0.08379716
+0.0620425 0.0620425 0.06198009
+0.0326177 0.0326177 0.032555133
+-0.0306444 -0.0306444 -0.030611413
+-0.0790892 -0.0790892 -0.079093225
+-0.107716 -0.107716 -0.10779965
+0.0878749 0.0878749 0.08788612
+0.12136 0.12136 0.12138388
+-0.00174977 -0.00174977 -0.0018372085
+0.0726454 0.0726454 0.07259194
+-0.0845691 -0.0845691 -0.08455591
+0.116929 0.116929 0.11696619
+-0.0381197 -0.0381197 -0.038145397
+-0.0468123 -0.0468123 -0.046744402
+0.0240735 0.0240735 0.024024125
+-0.022603 -0.022603 -0.02252546
+0.0534874 0.0534874 0.053432614
+-0.0828426 -0.0828426 -0.08284001
+0.003366 0.003366 0.003406904
+0.00778236 0.00778236 0.007851078
+-0.0643031 -0.0643031 -0.064303875
+0.0514468 0.0514468 0.05138501
+0.0716998 0.0716998 0.07166252
+-0.0257209 -0.0257209 -0.025774486
+0.0243096 0.0243096 0.024378609
+-0.0225184 -0.0225184 -0.022525603
+0.031409 0.031409 0.03141225
+0.0401869 0.0401869 0.04018131
+-0.1195 -0.1195 -0.11951884
+0.0165168 0.0165168 0.016554426
+-0.0240414 -0.0240414 -0.023956466
+-0.0373725 -0.0373725 -0.037395336
+-0.0407697 -0.0407697 -0.040819615
+0.0332421 0.0332421 0.033291906
+-0.00754158 -0.00754158 -0.0075704255
+0.0199188 0.0199188 0.01999654
+0.0663597 0.0663597 0.06632339
+0.0688589 0.0688589 0.06884411
+0.0133673 0.0133673 0.013387215
+0.0971044 0.0971044 0.097119115
+0.102803 0.102803 0.102777764
+0.00938547 0.00938547 0.009364086
+0.160236 0.160236 0.16025816
+-0.0305169 -0.0305169 -0.03054933
+0.0747672 0.0747672 0.074723616
+-0.137858 -0.137858 -0.13776623
+-0.151276 -0.151276 -0.15133135
+0.0633957 0.0633957 0.06333039
+-0.0224037 -0.0224037 -0.022501182
+0.0392073 0.0392073 0.039172962
+0.0309508 0.0309508 0.030915659
+0.0174343 0.0174343 0.017357783
+-0.0101037 -0.0101037 -0.010083081
+0.0264439 0.0264439 0.026457759
+-0.0576956 -0.0576956 -0.05771321
+-0.0187585 -0.0187585 -0.018766977
+0.00205381 0.00205381 0.0021756454
+-0.0875209 -0.0875209 -0.08755011
+-0.0415406 -0.0415406 -0.041581176
+-0.0277195 -0.0277195 -0.027704056
+-0.0183453 -0.0183453 -0.018364776
+-0.0107621 -0.0107621 -0.010832958
+-0.0120731 -0.0120731 -0.012079538
+-0.0337214 -0.0337214 -0.03375252
+0.065902 0.065902 0.06590601
+-0.060859 -0.060859 -0.06077236
+0.042336 0.042336 0.042232875
+0.139527 0.139527 0.13954715
+-0.0509155 -0.0509155 -0.05094152
+0.0983039 0.0983039 0.09832716
+0.0234542 0.0234542 0.02343624
+-0.0737223 -0.0737223 -0.07372452
+0.0103777 0.0103777 0.010351855
+-0.0631613 -0.0631613 -0.063185535
+-0.0367747 -0.0367747 -0.036795113
+-0.0449546 -0.0449546 -0.045001723
+0.0223596 0.0223596 0.022341395
+-0.0701202 -0.0701202 -0.070166945
+0.065699 0.065699 0.06570724
+0.0406277 0.0406277 0.040615655
+0.000708958 0.000708958 0.0007275257
+0.0213618 0.0213618 0.02131688
+0.0202368 0.0202368 0.02023607
+0.0605811 0.0605811 0.060570043
+-0.0302957 -0.0302957 -0.030321699
+-0.0282395 -0.0282395 -0.028242948
+0.00540788 0.00540788 0.0053549125
+0.0650348 0.0650348 0.06498315
+0.0448111 0.0448111 0.044774108
+0.0838991 0.0838991 0.083921894
+0.0442437 0.0442437 0.044239137
+-0.0348422 -0.0348422 -0.03492027
+0.00188726 0.00188726 0.0019028411
+0.0879206 0.0879206 0.08783293
+0.0882294 0.0882294 0.08825567
+0.0152177 0.0152177 0.015145334
+0.0773133 0.0773133 0.07734549
+0.0158863 0.0158863 0.015845869
+0.109321 0.109321 0.109338135
+0.00773107 0.00773107 0.0077058747
+0.0115965 0.0115965 0.011528763
+0.0170535 0.0170535 0.017016213
+-0.0666294 -0.0666294 -0.066641666
+-0.00112783 -0.00112783 -0.0011166632
+-0.00355585 -0.00355585 -0.0034963605
+0.0518209 0.0518209 0.051885065
+0.0322796 0.0322796 0.032280225
+-0.0471169 -0.0471169 -0.04713362
+-0.013209 -0.013209 -0.0132643925
+0.0756496 0.0756496 0.0756714
+-0.0276636 -0.0276636 -0.027677482
+-0.086318 -0.086318 -0.08638061
+-0.0649012 -0.0649012 -0.064899705
+-0.0540162 -0.0540162 -0.054084264
+0.025303 0.025303 0.025289338
+-0.0997197 -0.0997197 -0.09969645
+0.0455967 0.0455967 0.045643996
+0.00484408 0.00484408 0.004908245
+-0.125834 -0.125834 -0.12582307
+0.0393133 0.0393133 0.039301254
+-0.0620661 -0.0620661 -0.062025998
+-0.0901512 -0.0901512 -0.09004348
+0.0485128 0.0485128 0.048540827
+-0.0020091 -0.0020091 -0.001980303
+-0.0435046 -0.0435046 -0.04353811
+0.013977 0.013977 0.013941965
+-0.0814448 -0.0814448 -0.08144607
+-0.0348025 -0.0348025 -0.034851782
+-0.0160682 -0.0160682 -0.0160532
+-0.0519595 -0.0519595 -0.05191193
+0.0168266 0.0168266 0.016854612
+0.00349327 0.00349327 0.0034794677
+-0.0199939 -0.0199939 -0.020003606
+0.0643739 0.0643739 0.06437569
+-0.00660999 -0.00660999 -0.006582463
+-0.0343742 -0.0343742 -0.034369513
+0.0659076 0.0659076 0.06590523
+-0.0754331 -0.0754331 -0.07535247
+0.143451 0.143451 0.14341389
+-0.101802 -0.101802 -0.10180697
diff --git a/examples/water_pol_1024/run_admp.py b/examples/water_pol_1024/run_admp.py
new file mode 100755
index 000000000..65679e25f
--- /dev/null
+++ b/examples/water_pol_1024/run_admp.py
@@ -0,0 +1,147 @@
+#!/usr/bin/env python
+import sys
+from pathlib import Path
+admp_path = Path(__file__).parent.parent.parent
+sys.path.append(str(admp_path))
+import numpy as np
+import jax.numpy as jnp
+from jax_md import partition, space
+from dmff.admp.multipole import convert_cart2harm
+from dmff.admp.pme import ADMPPmeForce
+from dmff.admp.parser import *
+
+
+import linecache
+def get_line_context(file_path, line_number):
+ return linecache.getline(file_path,line_number).strip()
+
+# below is the validation code
+if __name__ == '__main__':
+ pdb = str('water1024.pdb')
+ xml = str('mpidwater.xml')
+ ref_dip = str('dipole_1024')
+ pdbinfo = read_pdb(pdb)
+ serials = pdbinfo['serials']
+ names = pdbinfo['names']
+ resNames = pdbinfo['resNames']
+ resSeqs = pdbinfo['resSeqs']
+ positions = pdbinfo['positions']
+ box = pdbinfo['box'] # a, b, c, α, β, γ
+ charges = pdbinfo['charges']
+ positions = jnp.asarray(positions)
+ lx, ly, lz, _, _, _ = box
+ box = jnp.eye(3)*jnp.array([lx, ly, lz])
+
+ mScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+ pScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+ dScales = jnp.array([0.0, 0.0, 0.0, 1.0, 1.0])
+
+ rc = 4 # in Angstrom
+ ethresh = 1e-4
+
+ n_atoms = len(serials)
+
+ atomTemplate, residueTemplate = read_xml(xml)
+ atomDicts, residueDicts = init_residues(serials, names, resNames, resSeqs, positions, charges, atomTemplate, residueTemplate)
+
+ Q = np.vstack(
+ [(atom.c0, atom.dX*10, atom.dY*10, atom.dZ*10, atom.qXX*300, atom.qYY*300, atom.qZZ*300, atom.qXY*300, atom.qXZ*300, atom.qYZ*300) for atom in atomDicts.values()]
+ )
+ Q = jnp.array(Q)
+ Q_local = convert_cart2harm(Q, 2)
+ axis_type = np.array(
+ [atom.axisType for atom in atomDicts.values()]
+ )
+ axis_indices = np.vstack(
+ [atom.axis_indices for atom in atomDicts.values()]
+ )
+ covalent_map = assemble_covalent(residueDicts, n_atoms)
+
+ ## ind paras
+ pol = np.vstack(
+ [(atom.polarizabilityXX, atom.polarizabilityYY, atom.polarizabilityZZ) for atom in atomDicts.values()]
+ )
+ pol = jnp.array(pol.astype(np.float32))
+ pol = 1000*jnp.mean(pol,axis=1)
+
+ tholes = np.vstack(
+ [atom.thole for atom in atomDicts.values()]
+ )
+ tholes = jnp.array(tholes.astype(np.float32))
+ tholes = jnp.mean(tholes,axis=1)
+ defaultTholeWidth=8
+
+ Uind_global = jnp.zeros([n_atoms,3])
+ for i in range(n_atoms):
+ a = get_line_context(ref_dip,i+1)
+ b = a.split()
+ t = np.array([10*float(b[0]),10*float(b[1]),10*float(b[2])])
+ Uind_global = Uind_global.at[i].set(t)
+
+
+
+ lmax = 2
+ pmax = 10
+
+ # construct the C list
+ c_list = np.zeros((3, n_atoms))
+ a_list = np.zeros(n_atoms)
+ q_list = np.zeros(n_atoms)
+ b_list = np.zeros(n_atoms)
+ nmol=int(n_atoms/3)
+ for i in range(nmol):
+ a = i*3
+ b = i*3+1
+ c = i*3+2
+ # dispersion coeff
+ c_list[0][a]=37.19677405
+ c_list[0][b]=7.6111103
+ c_list[0][c]=7.6111103
+ c_list[1][a]=85.26810658
+ c_list[1][b]=11.90220148
+ c_list[1][c]=11.90220148
+ c_list[2][a]=134.44874488
+ c_list[2][b]=15.05074749
+ c_list[2][c]=15.05074749
+ # q
+ q_list[a] = -0.741706
+ q_list[b] = 0.370853
+ q_list[c] = 0.370853
+ # b, Bohr^-1
+ b_list[a] = 2.00095977
+ b_list[b] = 1.999519942
+ b_list[c] = 1.999519942
+ # a, Hartree
+ a_list[a] = 458.3777
+ a_list[b] = 0.0317
+ a_list[c] = 0.0317
+
+ # Finish data preparation
+ # -------------------------------------------------------------------------------------
+ # parameters should be ready:
+ # geometric variables: positions, box
+ # atomic parameters: Q_local, c_list
+ # topological parameters: covalent_map, mScales, pScales, dScales
+ # general force field setting parameters: rc, ethresh, lmax, pmax
+
+
+ # get neighbor list using jax_md
+ displacement_fn, shift_fn = space.periodic_general(box, fractional_coordinates=False)
+ neighbor_list_fn = partition.neighbor_list(displacement_fn, box, rc, 0, format=partition.OrderedSparse)
+ nbr = neighbor_list_fn.allocate(positions)
+ pairs = nbr.idx.T
+
+ # electrostatic
+ pme_force = ADMPPmeForce(box, axis_type, axis_indices, covalent_map, rc, ethresh, lmax, lpol=True)
+ pme_force.update_env('kappa', 0.657065221219616)
+ E, F = pme_force.get_forces(positions, box, pairs, Q_local, pol, tholes, mScales, pScales, dScales)
+ print('# Electrostatic Energy (kJ/mol)')
+ # E = pme_force.get_energy(positions, box, pairs, Q_local, mScales, pScales, dScales)
+ E, F = pme_force.get_forces(positions, box, pairs, Q_local, pol, tholes, mScales, pScales, dScales, U_init=pme_force.U_ind)
+ print(E)
+ U_ind = pme_force.U_ind
+ # compare U_ind with reference
+ # for i in range(1024):
+ # for j in range(3):
+ # print(Uind_global[i*3, j], Uind_global[i*3, j], U_ind[i*3, j])
+
diff --git a/mkdocs.yml b/mkdocs.yml
new file mode 100644
index 000000000..14a7a7497
--- /dev/null
+++ b/mkdocs.yml
@@ -0,0 +1,9 @@
+site_name: DMFF
+nav:
+ - Home: 'index.md'
+ - About: 'about.md'
+ - 'User Guide':
+ - 'tutorial': 'tutorial.md'
+ - 'Modules':
+ - 'ADMP':
+theme: readthedocs
diff --git a/setup.py b/setup.py
index e69de29bb..e8ef2b134 100644
--- a/setup.py
+++ b/setup.py
@@ -0,0 +1,22 @@
+from setuptools import setup, find_packages
+
+install_requires = [
+ "numpy",
+ "jax_md",
+ "openmm",
+]
+setup(
+ name='dmff',
+ version='0.0.1',
+ author='dptech.net',
+ # author_email='hermite@dptech.net',
+ description=('DMFF.'),
+ url='https://github.com/deepmodeling/DMFF',
+ license=None,
+ keywords='Differentiable',
+ install_requires=install_requires,
+ packages=find_packages(),
+ zip_safe=False,
+ #packages=packages,
+ entry_points={},
+ include_package_data=True)
\ No newline at end of file
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/test_multipole.py b/tests/test_multipole.py
new file mode 100644
index 000000000..7e1064ac7
--- /dev/null
+++ b/tests/test_multipole.py
@@ -0,0 +1,189 @@
+import jax.numpy as jnp
+import numpy as np
+import numpy.testing as npt
+import pytest
+from admp.multipole import convert_cart2harm
+from admp.multipole import rot_global2local, rot_local2global
+
+class TestMultipoleGeometry:
+ @pytest.mark.parametrize(
+ "theta, expected",
+ [
+ (
+ jnp.array(
+ [
+ [
+ -1.0614,
+ 0.0,
+ 0.0,
+ -0.23671684,
+ 0.0452889,
+ 0.026121,
+ -0.0714102,
+ 0.0,
+ 0.0,
+ 0.0,
+ ],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [
+ -1.0614,
+ 0.0,
+ 0.0,
+ -0.23671684,
+ 0.0452889,
+ 0.026121,
+ -0.0714102,
+ 0.0,
+ 0.0,
+ 0.0,
+ ],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ ]
+ ),
+ jnp.array(
+ [
+ [
+ -1.0614,
+ -0.23671684,
+ 0.0,
+ 0.0,
+ -0.0714102,
+ 0.0,
+ 0.0,
+ 0.01106659,
+ 0.0,
+ ],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [
+ -1.0614,
+ -0.23671684,
+ 0.0,
+ 0.0,
+ -0.0714102,
+ 0.0,
+ 0.0,
+ 0.01106659,
+ 0.0,
+ ],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ ]
+ ),
+ )
+ ],
+ )
+ def test_convert_cart2harm(self, theta, expected):
+
+ Q = convert_cart2harm(theta, 2)
+ npt.assert_allclose(Q, expected, rtol=1e-6)
+
+ @pytest.mark.parametrize(
+ "Q_global, Q_local, local_frames",
+ [
+ (
+ jnp.array(
+ [
+ [
+ -1.0614,
+ -0.22052474,
+ -0.06001501,
+ 0.06165953,
+ -0.05764905,
+ -0.03114612,
+ 0.02651503,
+ 0.01010778,
+ 0.01109856,
+ ],
+ [0.5307, 0.0, -0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [
+ -1.0614,
+ -0.04308845,
+ 0.22035345,
+ 0.07498398,
+ 0.02345808,
+ 0.01798866,
+ 0.01008533,
+ -0.05205911,
+ -0.03919373,
+ ],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ ]
+ ),
+ jnp.array(
+ [
+ [
+ -1.0614,
+ -0.23671684,
+ 0.0,
+ 0.0,
+ -0.0714102,
+ 0.0,
+ 0.0,
+ 0.01106659,
+ 0.0,
+ ],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [
+ -1.0614,
+ -0.23671684,
+ 0.0,
+ 0.0,
+ -0.0714102,
+ 0.0,
+ 0.0,
+ 0.01106659,
+ 0.0,
+ ],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ [0.5307, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
+ ]
+ ),
+ jnp.array(
+ [
+ [
+ [-0.96165454, -0.17201543, 0.21361469],
+ [0.10460715, -0.95003253, -0.29410106],
+ [0.2535308, -0.26047802, 0.9315972],
+ ],
+ [
+ [-0.38687626, -0.3113036, 0.8679958],
+ [-0.10460713, 0.9500325, 0.2941011],
+ [-0.91617906, 0.02298216, -0.4001096],
+ ],
+ [
+ [0.7882788, -0.10109846, 0.606956],
+ [0.10460714, -0.95003265, -0.29410112],
+ [0.60636103, 0.29532564, -0.7383151],
+ ],
+ [
+ [0.2869897, -0.94232714, -0.17221032],
+ [0.22607784, -0.10806667, 0.96809626],
+ [-0.93087363, -0.3167666, 0.18202528],
+ ],
+ [
+ [-0.5616504, -0.8264594, 0.03890521],
+ [-0.22607785, 0.10806668, -0.9680963],
+ [0.79588807, -0.5525272, -0.24753988],
+ ],
+ [
+ [-0.9122986, 0.32489008, 0.24931434],
+ [0.22607782, -0.10806666, 0.9680962],
+ [0.3414673, 0.9395574, 0.02513866],
+ ],
+ ]
+ ),
+ )
+ ],
+ )
+ def test_rot_global_local(self, Q_global, Q_local, local_frames):
+
+ ans_Q = rot_local2global(Q_local, local_frames, 2)
+ npt.assert_allclose(ans_Q, Q_global, rtol=1e-6, atol=1e-6)
+ ans_Q = rot_global2local(Q_global, local_frames, 2)
+ npt.assert_allclose(ans_Q, Q_local, rtol=1e-6, atol=1e-6)
diff --git a/tests/test_sptial.py b/tests/test_sptial.py
new file mode 100644
index 000000000..e13c8d863
--- /dev/null
+++ b/tests/test_sptial.py
@@ -0,0 +1,143 @@
+import jax.numpy as jnp
+import numpy as np
+import numpy.testing as npt
+import pytest
+from admp.spatial import (build_quasi_internal,
+ generate_construct_local_frames, pbc_shift,
+ v_pbc_shift)
+
+
+class TestSpatial:
+ @pytest.mark.parametrize(
+ "r1, r2, dr, norm_dr, expected",
+ [
+ (
+ jnp.array([[0, 0, 0]]),
+ jnp.array([[1, 0, 0]]),
+ jnp.array([[1, 0, 0]]),
+ jnp.array([1.0,]),
+ jnp.array([[[0.0, 1.0, 0.0], [0, 0, 1], [1, 0, 0]]]),
+ ),
+ (
+ jnp.array([[0, 0, 0]]),
+ jnp.array([[1, 1, 0]]),
+ jnp.array([[1, 1, 0]]),
+ jnp.array([1.414213,]),
+ jnp.array(
+ [
+ [
+ [0.70710534, -0.70710814, 0.0],
+ [0.0, 0.0, -1.0000004],
+ [0.70710707, 0.70710707, 0.0],
+ ]
+ ]
+ ),
+ ),
+ ],
+ )
+ def test_build_quasi_internal(self, r1, r2, dr, norm_dr, expected):
+
+ local_frames = build_quasi_internal(r1, r2, dr, norm_dr)
+ npt.assert_allclose(local_frames, expected)
+
+ @pytest.mark.parametrize(
+ "drvecs, box, box_inv, expected",
+ [
+ (
+ jnp.array([[0, 0, 0]]),
+ jnp.array([[4, 0, 0], [0, 4, 0], [0, 0, 4]]),
+ jnp.array([[0.25, 0, 0], [0, 0.25, 0], [0, 0, 0.25]]),
+ jnp.array([[0, 0, 0]]),
+ ),
+ (
+ jnp.array([[3, 0, 0], [0, 3, 0], [0, 0, 3]]),
+ jnp.array([[4, 0, 0], [0, 4, 0], [0, 0, 4]]),
+ jnp.array([[0.25, 0, 0], [0, 0.25, 0], [0, 0, 0.25]]),
+ jnp.array([[-1, 0, 0], [0, -1, 0], [0, 0, -1]]),
+ ),
+ (
+ jnp.array([[2, 0, 0], [0, 2, 0], [0, 0, 2]]),
+ jnp.array([[4, 0, 0], [0, 4, 0], [0, 0, 4]]),
+ jnp.array([[0.25, 0, 0], [0, 0.25, 0], [0, 0, 0.25]]),
+ jnp.array([[-2, 0, 0], [0, -2, 0], [0, 0, -2]]),
+ ),
+ ],
+ )
+ def test_pbc_shift(self, drvecs, box, box_inv, expected):
+ npt.assert_allclose(pbc_shift(drvecs, box, box_inv), expected)
+ npt.assert_allclose(v_pbc_shift(drvecs, box, box_inv), expected)
+
+ @pytest.mark.parametrize(
+ "axis_types, axis_indices, positions, box, expected_local_frames",
+ [
+ (
+ np.array([1, 0, 0, 1, 0, 0]),
+ np.array(
+ [
+ [1, 2, -1],
+ [0, 2, -1],
+ [0, 1, -1],
+ [4, 5, -1],
+ [3, 5, -1],
+ [3, 4, -1],
+ ]
+ ),
+ jnp.array(
+ [
+ [1.562, 24.46, 21.149],
+ [2.439, 24.438, 21.532],
+ [0.983, 24.178, 21.854],
+ [4.788, 24.609, 0.994],
+ [4.026, 25.138, 1.231],
+ [4.462, 23.712, 0.97],
+ ]
+ ),
+ jnp.array([[31.289, 0.0, 0.0], [0.0, 31.289, 0.0], [0.0, 0.0, 31.289]]),
+ np.array(
+ [
+ [
+ [-0.96165454, -0.17201543, 0.21361469],
+ [0.10460715, -0.95003253, -0.29410106],
+ [0.2535308, -0.26047802, 0.9315972],
+ ],
+ [
+ [-0.38687626, -0.3113036, 0.8679958],
+ [-0.10460713, 0.9500325, 0.2941011],
+ [-0.91617906, 0.02298216, -0.4001096],
+ ],
+ [
+ [0.7882788, -0.10109846, 0.606956],
+ [0.10460714, -0.95003265, -0.29410112],
+ [0.60636103, 0.29532564, -0.7383151],
+ ],
+ [
+ [0.2869897, -0.94232714, -0.17221032],
+ [0.22607784, -0.10806667, 0.96809626],
+ [-0.93087363, -0.3167666, 0.18202528],
+ ],
+ [
+ [-0.5616504, -0.8264594, 0.03890521],
+ [-0.22607785, 0.10806668, -0.9680963],
+ [0.79588807, -0.5525272, -0.24753988],
+ ],
+ [
+ [-0.9122986, 0.32489008, 0.24931434],
+ [0.22607782, -0.10806666, 0.9680962],
+ [0.3414673, 0.9395574, 0.02513866],
+ ],
+ ]
+ ),
+ )
+ ],
+ )
+ def test_generate_construct_local_frames(
+ self, axis_types, axis_indices, positions, box, expected_local_frames
+ ):
+ construct_local_frame_fn = generate_construct_local_frames(
+ axis_types, axis_indices
+ )
+ assert construct_local_frame_fn
+ npt.assert_allclose(
+ construct_local_frame_fn(positions, box), expected_local_frames, rtol=1e-6
+ )
+