diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1a7a35e61f..86418574ce 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -101,7 +101,8 @@ src/group.* @sjplimp src/improper.* @sjplimp src/info.* @akohlmey src/kspace.* @sjplimp -src/lmptyp.h @sjplimp +src/lmptype.h @sjplimp +src/label_map.* @jrgissing @akohlmey src/library.* @sjplimp @akohlmey src/main.cpp @sjplimp src/min_*.* @sjplimp diff --git a/.github/release_steps.md b/.github/release_steps.md new file mode 100644 index 0000000000..15ddd59768 --- /dev/null +++ b/.github/release_steps.md @@ -0,0 +1,108 @@ +# LAMMPS Release Steps + +The following notes chronicle the current steps for preparing and publishing LAMMPS releases. For +definitions of LAMMPS versions and releases mean, please refer to [the corresponding section in the +LAMMPS manual](https://docs.lammps.org/Manual_version.html). + +## LAMMPS Feature Release + +A LAMMPS feature release is currently prepared after about 500 to 750 commits to the 'develop' +branch or after a period of four weeks up to two months. This is not a fixed rule, though, since +external circumstances can cause delays in preparing a release, or pull requests that are desired to +be merged for the release are not yet completed. + +### Preparing a 'next\_release' branch + +Create a 'next\_release' branch off 'develop' and make the following changes: + +- set the LAMMPS\_VERSION define to the planned release date in src/version.h in the format + "D Mmm YYYY" or "DD Mmm YYYY" +- remove the LAMMPS\_UPDATE define in src/version.h +- update the release date in doc/lammps.1 +- update all TBD arguments for ..versionadded::, ..versionchanged:: ..deprecated:: to the + planned release date in the format "DMmmYYYY" or "DDMmmYYYY" +- check release notes for merged new features and check if ..versionadded:: or ..versionchanged:: + are missing and need to be added +Submit this pull request, rebase if needed. This is the last pull request merged for the release +and should not contain any other changes. (Exceptions: this document, last minute trivial(!) changes). + +This PR shall not be merged before **all** pending tests have completed and cleared. If needed, a +bugfix pull request should be created and merged to clear all tests. + +### Create release on GitHub + +When all pending pull requests for the release are merged and have cleared testing, the +'next\_release' branch is merged into 'develop'. + +Check out 'develop' locally, pull the latest changes, merge them into 'release', apply a suitable +release tag (for historical reasons the tag starts with "patch_" followed by the date, and finally +push everything back to GitHub. Example: + +``` +git checkout develop +git pull +git checkout release +git pull +git merge --ff-only develop +git tag -s -m "LAMMPS feature release 19 November 2024" patch_19Nov2024 +git push git@github.com:lammps/lammps.git --tags develop release +``` + +Go to https://github.com/lammps/lammps/releases and create a new (draft) release page or check the +existing draft for any necessary changes from pull requests that were merged but are not listed. +Then select the applied tag for the release in the "Choose a tag" dropdown list. Go to the bottom of +the list and select the "Set as pre-release" checkbox. The "Set as the latest release" button is +reserved for stable releases and updates to them. + +If everything is in order, you can click on the "Publish release" button. Otherwise, click on "Save +draft" and finish pending tasks until you can return to edit the release page and publish it. + +### Update download website, prepare pre-compiled packages, update packages to GitHub + +Publishing the release on GitHub will trigger the Temple Jenkins cluster to update +the https://docs.lammps.org/ website with the documentation for the new feature release +and it will create a tarball for download (which contains the translated manual). + +Build a fully static LAMMPS installation using a musl-libc cross-compiler, install into a +lammps-static folder, and create a tarball called lammps-linux-x86_64-19Nov2024.tar.gz (or using a +corresponding date with a future release) from the lammps-static folder and upload it to GitHub +with: + +``` +gh release upload patch_19Nov2024 ~/Downloads/lammps-linux-x86_64-19Nov2024.tar.gz +``` + + +## LAMMPS Stable Release + +A LAMMPS stable release is prepared about once per year in the months July, August, or September. +One (or two, if needed) feature releases before the stable release shall contain only bug fixes +or minor feature updates in optional packages. Also substantial changes to the core of the code +shall be applied rather toward the beginning of a development cycle between two stable releases +than toward the end. The intention is to stablilize significant change to the core and have +outside users and developers try them out during the development cycle; the sooner the changes +are included, the better chances for spotting peripheral bugs and issues. + +### Prerequesites + +Before making a stable release all remaining backported bugfixes shall be released as a (final) +stable update release (see below). + +A LAMMPS stable release process starts like a feature release (see above), only that this feature +release is called a "Stable Release Candidate" and no assets are uploaded to GitHub. + +### Synchronize 'maintenance' branch with 'release' + +The state of the 'release' branch is then transferred to the 'maintenance' branch (which will +have diverged significantly from 'release' due to the selectively backported bug fixes). + +### Fast-forward merge of 'maintenance' into 'stable' and apply tag + +At this point it should be possible to do a fast-forward merge of 'maintenance' to 'stable' +and then apply the stable\_DMmmYYYY tag. + +### Push branches and tags + + + +## LAMMPS Stable Update Release diff --git a/.github/workflows/kokkos-regression.yaml b/.github/workflows/kokkos-regression.yaml new file mode 100644 index 0000000000..a475c1eb7b --- /dev/null +++ b/.github/workflows/kokkos-regression.yaml @@ -0,0 +1,126 @@ +# GitHub action to build LAMMPS on Linux and run selected regression tests +name: "Kokkos OpenMP Regression Test" + +on: + push: + branches: + - develop + + workflow_dispatch: + +jobs: + build: + name: Build LAMMPS with Kokkos OpenMP + # restrict to official LAMMPS repository + if: ${{ github.repository == 'lammps/lammps' }} + runs-on: ubuntu-latest + env: + CCACHE_DIR: ${{ github.workspace }}/.ccache + strategy: + max-parallel: 6 + matrix: + idx: [ 'pair-0', 'pair-1', 'fix-0', 'fix-1', 'compute', 'misc' ] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 2 + show-progress: false + + - name: Install extra packages + run: | + sudo apt-get update + sudo apt-get install -y ccache ninja-build libeigen3-dev \ + libcurl4-openssl-dev python3-dev \ + mpi-default-bin mpi-default-dev + + - name: Create Build Environment + run: mkdir build + + - name: Set up ccache + uses: actions/cache@v4 + with: + path: ${{ env.CCACHE_DIR }} + key: linux-kokkos-ccache-${{ github.sha }} + restore-keys: linux-kokkos-ccache- + + - name: Building LAMMPS via CMake + shell: bash + run: | + ccache -z + python3 -m venv linuxenv + source linuxenv/bin/activate + python3 -m pip install --upgrade pip + python3 -m pip install numpy pyyaml junit_xml + cmake -S cmake -B build \ + -C cmake/presets/gcc.cmake \ + -C cmake/presets/basic.cmake \ + -C cmake/presets/kokkos-openmp.cmake \ + -D CMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -D CMAKE_C_COMPILER_LAUNCHER=ccache \ + -D BUILD_SHARED_LIBS=off \ + -D DOWNLOAD_POTENTIALS=off \ + -D PKG_AMOEBA=on \ + -D PKG_ASPHERE=on \ + -D PKG_BROWNIAN=on \ + -D PKG_CLASS2=on \ + -D PKG_COLLOID=on \ + -D PKG_CORESHELL=on \ + -D PKG_DIPOLE=on \ + -D PKG_DPD-BASIC=on \ + -D PKG_EXTRA-COMPUTE=on \ + -D PKG_EXTRA-FIX=on \ + -D PKG_EXTRA-MOLECULE=on \ + -D PKG_EXTRA-PAIR=on \ + -D PKG_GRANULAR=on \ + -D PKG_LEPTON=on \ + -D PKG_MC=on \ + -D PKG_MEAM=on \ + -D PKG_POEMS=on \ + -D PKG_PYTHON=on \ + -D PKG_QEQ=on \ + -D PKG_REAXFF=on \ + -D PKG_REPLICA=on \ + -D PKG_SRD=on \ + -D PKG_SPH=on \ + -D PKG_VORONOI=on \ + -G Ninja + cmake --build build + ccache -s + + - name: Run Regression Tests for Selected Examples + shell: bash + run: | + source linuxenv/bin/activate + python3 tools/regression-tests/get_kokkos_input.py \ + --examples-top-level=examples --batch-size=50 \ + --filter-out="balance;fire;gcmc;granregion;hyper;mc;mdi;mliap;neb;pace;prd;pour;python;rigid;snap;streitz;shear;ttm" + + export OMP_PROC_BIND=false + python3 tools/regression-tests/run_tests.py \ + --lmp-bin=build/lmp \ + --config-file=tools/regression-tests/config_kokkos_openmp.yaml \ + --list-input=input-list-${{ matrix.idx }}-kk.txt \ + --output-file=output-${{ matrix.idx }}.xml \ + --progress-file=progress-${{ matrix.idx }}.yaml \ + --log-file=run-${{ matrix.idx }}.log \ + --quick-max=100 + + tar -cvf kokkos-regression-test-${{ matrix.idx }}.tar run-${{ matrix.idx }}.log progress-${{ matrix.idx }}.yaml output-${{ matrix.idx }}.xml + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: kokkos-regression-test-artifact-${{ matrix.idx }} + path: kokkos-regression-test-${{ matrix.idx }}.tar + + merge: + runs-on: ubuntu-latest + needs: build + steps: + - name: Merge Artifacts + uses: actions/upload-artifact/merge@v4 + with: + name: merged-kokkos-regresssion-artifact + pattern: kokkos-regression-test-artifact-* diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 8d57e237b3..cf10e8b544 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -141,7 +141,7 @@ endif() # silence nvcc warnings if((PKG_KOKKOS) AND (Kokkos_ENABLE_CUDA) AND NOT (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) - set(CMAKE_TUNE_DEFAULT "${CMAKE_TUNE_DEFAULT} -Xcudafe --diag_suppress=unrecognized_pragma -Xcudafe --diag_suppress=128") + set(CMAKE_TUNE_DEFAULT "${CMAKE_TUNE_DEFAULT}" "-Xcudafe --diag_suppress=unrecognized_pragma,--diag_suppress=128") endif() # we require C++11 without extensions. Kokkos requires at least C++17 (currently) @@ -588,13 +588,8 @@ endif() set(CMAKE_TUNE_FLAGS "${CMAKE_TUNE_DEFAULT}" CACHE STRING "Compiler and machine specific optimization flags (compilation only)") separate_arguments(CMAKE_TUNE_FLAGS) -foreach(_FLAG ${CMAKE_TUNE_FLAGS}) - target_compile_options(lammps PRIVATE ${_FLAG}) - # skip these flags when linking the main executable - if(NOT (("${_FLAG}" STREQUAL "-Xcudafe") OR (("${_FLAG}" STREQUAL "--diag_suppress=unrecognized_pragma")))) - target_compile_options(lmp PRIVATE ${_FLAG}) - endif() -endforeach() +target_compile_options(lammps PRIVATE ${CMAKE_TUNE_FLAGS}) +target_compile_options(lmp PRIVATE ${CMAKE_TUNE_FLAGS}) ######################################################################## # Basic system tests (standard libraries, headers, functions, types) # ######################################################################## diff --git a/cmake/Modules/FindVORO.cmake b/cmake/Modules/FindVORO.cmake index 3f0fe98ff1..80bcfcfb53 100644 --- a/cmake/Modules/FindVORO.cmake +++ b/cmake/Modules/FindVORO.cmake @@ -21,9 +21,9 @@ if(VORO_FOUND) set(VORO_LIBRARIES ${VORO_LIBRARY}) set(VORO_INCLUDE_DIRS ${VORO_INCLUDE_DIR}) - if(NOT TARGET VORO::VORO) - add_library(VORO::VORO UNKNOWN IMPORTED) - set_target_properties(VORO::VORO PROPERTIES + if(NOT TARGET VORO::voro++) + add_library(VORO::voro++ UNKNOWN IMPORTED) + set_target_properties(VORO::voro++ PROPERTIES IMPORTED_LOCATION "${VORO_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${VORO_INCLUDE_DIR}") endif() diff --git a/cmake/Modules/Packages/KOKKOS.cmake b/cmake/Modules/Packages/KOKKOS.cmake index adb3abab6b..ddd2daefcd 100644 --- a/cmake/Modules/Packages/KOKKOS.cmake +++ b/cmake/Modules/Packages/KOKKOS.cmake @@ -130,6 +130,7 @@ set(KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/kokkos.cpp ${KOKKOS_PKG_SOURCES_DIR}/atom_vec_kokkos.cpp ${KOKKOS_PKG_SOURCES_DIR}/comm_kokkos.cpp ${KOKKOS_PKG_SOURCES_DIR}/comm_tiled_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/group_kokkos.cpp ${KOKKOS_PKG_SOURCES_DIR}/min_kokkos.cpp ${KOKKOS_PKG_SOURCES_DIR}/min_linesearch_kokkos.cpp ${KOKKOS_PKG_SOURCES_DIR}/neighbor_kokkos.cpp diff --git a/cmake/Modules/Packages/VORONOI.cmake b/cmake/Modules/Packages/VORONOI.cmake index c010469677..cbc350340f 100644 --- a/cmake/Modules/Packages/VORONOI.cmake +++ b/cmake/Modules/Packages/VORONOI.cmake @@ -54,5 +54,5 @@ else() if(NOT VORO_FOUND) message(FATAL_ERROR "Voro++ library not found. Help CMake to find it by setting VORO_LIBRARY and VORO_INCLUDE_DIR, or set DOWNLOAD_VORO=ON to download it") endif() - target_link_libraries(lammps PRIVATE VORO::VORO) + target_link_libraries(lammps PRIVATE VORO::voro++) endif() diff --git a/doc/documentation_conventions.md b/doc/documentation_conventions.md index c4757b85e9..e02b0c77a3 100644 --- a/doc/documentation_conventions.md +++ b/doc/documentation_conventions.md @@ -10,7 +10,7 @@ Last change: 2022-12-30 In fall 2019, the LAMMPS documentation file format has changed from a home grown markup designed to generate HTML format files only, to -[reStructuredText](https://docutils.sourceforge.io/rst.html>. For a +[reStructuredText](https://docutils.sourceforge.io/rst.html>). For a transition period all files in the old .txt format were transparently converted to .rst and then processed. The `txt2rst tool` is still included in the distribution to obtain an initial .rst file for legacy @@ -45,8 +45,7 @@ what kind of information and sections are needed. ## Formatting conventions -For headlines we try to follow the conventions posted here: -https://documentation-style-guide-sphinx.readthedocs.io/en/latest/style-guide.html#headings +For headlines we try to follow the conventions posted [here](https://documentation-style-guide-sphinx.readthedocs.io/en/latest/style-guide.html#headings). It seems to be sufficient to have this consistent only within any single file and it is not (yet) enforced strictly, but making this globally consistent makes it easier to move sections around. @@ -64,7 +63,7 @@ Groups of shell commands or LAMMPS input script or C/C++/Python source code should be typeset into a `.. code-block::` section. A syntax highlighting extension for LAMMPS input scripts is provided, so `LAMMPS` can be used to indicate the language in the code block in addition to -`bash`, `c`, `c++`, `console`, `csh`, `diff', `fortran`, `json`, `make`, +`bash`, `c`, `c++`, `console`, `csh`, `diff`, `fortran`, `json`, `make`, `perl`, `powershell`, `python`, `sh`, or `tcl`, `text`, or `yaml`. When no syntax style is indicated, no syntax highlighting is performed. When typesetting commands executed on the shell, please do not prefix @@ -84,7 +83,7 @@ block can be used, followed by multiple `.. tab::` blocks, one for each alternative. This is only used for HTML output. For other outputs, the `.. tabs::` directive is transparently removed and the individual `.. tab::` blocks will be replaced with an -`.. admonition::`` block. Thus in PDF and ePUB output those will +`.. admonition::` block. Thus in PDF and ePUB output those will be realized as sequential and plain notes. Special remarks can be highlighted with a `.. note::` block and diff --git a/doc/doxygen/Doxyfile.in b/doc/doxygen/Doxyfile.in index e905d5a64d..e3a5415b20 100644 --- a/doc/doxygen/Doxyfile.in +++ b/doc/doxygen/Doxyfile.in @@ -2,7 +2,7 @@ DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "LAMMPS Programmer's Guide" -PROJECT_NUMBER = "4 May 2022" +PROJECT_NUMBER = "19 November 2024" PROJECT_BRIEF = "Documentation of the LAMMPS library interface and Python wrapper" PROJECT_LOGO = lammps-logo.png CREATE_SUBDIRS = NO diff --git a/doc/github-development-workflow.md b/doc/github-development-workflow.md index e16ae82764..69bf00b707 100644 --- a/doc/github-development-workflow.md +++ b/doc/github-development-workflow.md @@ -6,7 +6,9 @@ choices the LAMMPS developers have agreed on. Git and GitHub provide the tools, but do not set policies, so it is up to the developers to come to an agreement as to how to define and interpret policies. This document is likely to change as our experiences and needs change, and we try to -adapt it accordingly. Last change 2023-02-10. +adapt it accordingly. + +Last change: 2023-02-10 ## Table of Contents @@ -72,7 +74,7 @@ be assigned to signal urgency to merge this pull request quickly. People can be assigned to review a pull request in two ways: * They can be assigned manually to review a pull request - by the submitter or a LAMMPS developer + by the submitter or a LAMMPS developer. * They can be automatically assigned, because a developer's GitHub handle matches a file pattern in the `.github/CODEOWNERS` file, which associates developers with the code they contributed and @@ -86,9 +88,9 @@ required before merging, in addition to passing all automated compilation and unit tests. Merging counts as implicit approval, so does submission of a pull request (by a LAMMPS developer). So the person doing the merge may not also submit an approving review. The GitHub -feature, that reviews from code owners are "hard" reviews (i.e. they -must all approve before merging is allowed), is currently disabled. -It is in the discretion of the merge maintainer to assess when a +feature that reviews from code owners are "hard" reviews (i.e. they +must all approve before merging is allowed) is currently disabled. +It is at the discretion of the merge maintainer to assess when a sufficient degree of approval has been reached, especially from external collaborators. Reviews may be (automatically) dismissed, when the reviewed code has been changed. Review may be requested a second time. @@ -147,7 +149,8 @@ only contain bug fixes, feature additions to peripheral functionality, and documentation updates. In between stable releases, bug fixes and infrastructure updates are back-ported from the "develop" branch to the "maintenance" branch and occasionally merged into "stable" and published -as update releases. +as update releases. Further explanation of LAMMPS versions can be found +[in the documentation](https://docs.lammps.org/Manual_version.html). ## Project Management diff --git a/doc/lammps.1 b/doc/lammps.1 index 75581bd008..cb52813a4d 100644 --- a/doc/lammps.1 +++ b/doc/lammps.1 @@ -1,7 +1,7 @@ -.TH LAMMPS "1" "29 August 2024" "2024-08-29" +.TH LAMMPS "1" "19 November 2024" "2024-11-19" .SH NAME .B LAMMPS -\- Molecular Dynamics Simulator. Version 29 August 2024 +\- Molecular Dynamics Simulator. Version 19 November 2024 .SH SYNOPSIS .B lmp diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index 232a209613..04d1a9969a 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -43,7 +43,7 @@ OPT. * :doc:`brownian/asphere ` * :doc:`brownian/sphere ` * :doc:`charge/regulation ` - * :doc:`cmap ` + * :doc:`cmap (k) ` * :doc:`colvars ` * :doc:`controller ` * :doc:`damping/cundall ` @@ -134,7 +134,7 @@ OPT. * :doc:`nve/dot ` * :doc:`nve/dotc/langevin ` * :doc:`nve/eff ` - * :doc:`nve/limit ` + * :doc:`nve/limit (k) ` * :doc:`nve/line ` * :doc:`nve/manifold/rattle ` * :doc:`nve/noforce ` @@ -187,10 +187,11 @@ OPT. * :doc:`qeq/slater ` * :doc:`qmmm ` * :doc:`qtb ` + * :doc:`qtpie/reaxff ` * :doc:`rattle ` * :doc:`reaxff/bonds (k) ` * :doc:`reaxff/species (k) ` - * :doc:`recenter ` + * :doc:`recenter (k) ` * :doc:`restrain ` * :doc:`rheo ` * :doc:`rheo/oxidation ` @@ -268,7 +269,7 @@ OPT. * :doc:`wall/piston ` * :doc:`wall/reflect (k) ` * :doc:`wall/reflect/stochastic ` - * :doc:`wall/region ` + * :doc:`wall/region (k) ` * :doc:`wall/region/ees ` * :doc:`wall/srd ` * :doc:`wall/table ` diff --git a/doc/src/Developer_comm_ops.rst b/doc/src/Developer_comm_ops.rst index 116b4d6ad8..66947de74f 100644 --- a/doc/src/Developer_comm_ops.rst +++ b/doc/src/Developer_comm_ops.rst @@ -79,19 +79,19 @@ containing ``double`` values. To correctly store integers that may be 64-bit (bigint, tagint, imageint) in the buffer, you need to use the :ref:`ubuf union ` construct. -The *Fix*, *Compute*, and *Dump* classes can also invoke the same kind -of forward and reverse communication operations using the same *Comm* -class methods. Likewise, the same pack/unpack methods and +The *Fix*, *Bond*, *Compute*, and *Dump* classes can also invoke the +same kind of forward and reverse communication operations using the +same *Comm* class methods. Likewise, the same pack/unpack methods and comm_forward/comm_reverse variables must be defined by the calling -*Fix*, *Compute*, or *Dump* class. +*Fix*, *Bond*, *Compute*, or *Dump* class. -For *Fix* classes, there is an optional second argument to the +For all of these classes, there is an optional second argument to the *forward_comm()* and *reverse_comm()* call which can be used when the -fix performs multiple modes of communication, with different numbers -of values per atom. The fix should set the *comm_forward* and +class performs multiple modes of communication, with different numbers +of values per atom. The class should set the *comm_forward* and *comm_reverse* variables to the maximum value, but can invoke the communication for a particular mode with a smaller value. For this -to work, the *pack_forward_comm()*, etc methods typically use a class +to work, the *pack_forward_comm()*, etc. methods typically use a class member variable to choose which values to pack/unpack into/from the buffer. diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index c798784106..09f3d893db 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -54,3 +54,26 @@ header of a data file (e.g. the number of atoms) is larger than the number of lines provided (e.g. in the corresponding Atoms section) and then LAMMPS will continue reading into the next section and that would have a completely different format. + +.. _err0003: + +Illegal variable command: expected X arguments but found Y +---------------------------------------------------------- + +This error indicates that there are the wrong number of arguments for a +specific variable command, but a common reason for that is a variable +expression that has whitespace but is not enclosed in single or double +quotes. + +To explain, the LAMMPS input parser reads and processes lines. The +resulting line is broken down into "words". Those are usually +individual commands, labels, names, values separated by whitespace (a +space or tab character). For "words" that may contain whitespace, they +have to be enclosed in single (') or double (") quotes. The parser will +then remove the outermost pair of quotes and then pass that string as +"word" to the variable command. + +Thus missing quotes or accidental extra whitespace will lead to the +error shown in the header because the unquoted whitespace will result +in the text being broken into more "words", i.e. the variable expression +being split. diff --git a/doc/src/Howto_bioFF.rst b/doc/src/Howto_bioFF.rst index 72dcec2d31..92dd45b9b6 100644 --- a/doc/src/Howto_bioFF.rst +++ b/doc/src/Howto_bioFF.rst @@ -1,5 +1,5 @@ -CHARMM, AMBER, COMPASS, and DREIDING force fields -================================================= +CHARMM, AMBER, COMPASS, DREIDING, and OPLS force fields +======================================================= A compact summary of the concepts, definitions, and properties of force fields with explicit bonded interactions (like the ones discussed @@ -236,6 +236,40 @@ documentation for the formula it computes. * :doc:`special_bonds ` dreiding +OPLS +---- + +OPLS (Optimized Potentials for Liquid Simulations) is a general force +field for atomistic simulation of organic molecules in solvent. It was +developed by the `Jorgensen group +`_ at Purdue University and +later at Yale University. Multiple versions of the OPLS parameters +exist for united atom representations (OPLS-UA) and for all-atom +representations (OPLS-AA). + +This force field is based on atom types mapped to specific functional +groups in organic and biological molecules. Each atom includes a +static, partial atomic charge reflecting the oxidation state of the +element derived from its bonded neighbors :ref:`(Jorgensen) +` and computed based on increments determined by the +atom type of the atoms bond to it. + +The interaction styles listed below compute force field formulas that +are fully or in part consistent with the OPLS style force fields. See +each command's documentation for the formula it computes. Some are only +compatible with a subset of OPLS interactions. + +* :doc:`bond_style ` harmonic +* :doc:`angle_style ` harmonic +* :doc:`dihedral_style ` opls +* :doc:`improper_style ` cvff +* :doc:`improper_style ` fourier +* :doc:`improper_style ` harmonic +* :doc:`pair_style ` lj/cut/coul/cut +* :doc:`pair_style ` lj/cut/coul/long +* :doc:`pair_modify ` geometric +* :doc:`special_bonds ` lj/coul 0.0 0.0 0.5 + ---------- .. _Typelabel2: @@ -266,3 +300,6 @@ documentation for the formula it computes. **(Mayo)** Mayo, Olfason, Goddard III (1990). J Phys Chem, 94, 8897-8909. https://doi.org/10.1021/j100389a010 +.. _howto-Jorgensen: + +**(Jorgensen)** Jorgensen, Tirado-Rives (1988). J Am Chem Soc, 110, 1657-1666. https://doi.org/10.1021/ja00214a001 diff --git a/doc/src/Howto_bpm.rst b/doc/src/Howto_bpm.rst index 86e091fcef..f2aa1fc0a3 100644 --- a/doc/src/Howto_bpm.rst +++ b/doc/src/Howto_bpm.rst @@ -5,7 +5,11 @@ The BPM package implements bonded particle models which can be used to simulate mesoscale solids. Solids are constructed as a collection of particles, which each represent a coarse-grained region of space much larger than the atomistic scale. Particles within a solid region are -then connected by a network of bonds to provide solid elasticity. +then connected by a network of bonds to model solid elasticity. +There are many names for methods that are based on similar (or +equivalent) capabilities to those in this package, including, but not +limited to, cohesive beam models, bonded DEMs, lattice spring models, +mass spring models, and lattice particle methods. Unlike traditional bonds in molecular dynamics, the equilibrium bond length can vary between bonds. Bonds store the reference state. This @@ -42,7 +46,8 @@ Currently, there are two types of bonds included in the BPM package. The first bond style, :doc:`bond bpm/spring `, only applies pairwise, central body forces. Point particles must have :doc:`bond atom style ` and may be thought of as nodes in a spring -network. Alternatively, the second bond style, :doc:`bond bpm/rotational +network. An optional multibody term can be used to adjust the network's +Poisson's ratio. Alternatively, the second bond style, :doc:`bond bpm/rotational `, resolves tangential forces and torques arising with the shearing, bending, and twisting of the bond due to rotation or displacement of particles. Particles are similar to those used in the @@ -55,8 +60,9 @@ orientation similar to :doc:`fix nve/asphere `. In addition to bond styles, a new pair style :doc:`pair bpm/spring ` was added to accompany the bpm/spring bond -style. This pair style is simply a hookean repulsion with similar -velocity damping as its sister bond style. +style. By default, this pair style is simply a hookean repulsion with +similar velocity damping as its sister bond style, but optional +arguments can be used to modify the force. ---------- diff --git a/doc/src/Howto_chunk.rst b/doc/src/Howto_chunk.rst index f8655b745d..ea000eb22f 100644 --- a/doc/src/Howto_chunk.rst +++ b/doc/src/Howto_chunk.rst @@ -58,28 +58,30 @@ chunk ID for an individual atom can also be static (e.g. a molecule ID), or dynamic (e.g. what spatial bin an atom is in as it moves). Note that this compute allows the per-atom output of other -:doc:`computes `, :doc:`fixes `, and -:doc:`variables ` to be used to define chunk IDs for each -atom. This means you can write your own compute or fix to output a -per-atom quantity to use as chunk ID. See the :doc:`Modify ` -doc pages for info on how to do this. You can also define a :doc:`per-atom variable ` in the input script that uses a formula to -generate a chunk ID for each atom. +:doc:`computes `, :doc:`fixes `, and :doc:`variables +` to be used to define chunk IDs for each atom. This means +you can write your own compute or fix to output a per-atom quantity to +use as chunk ID. See the :doc:`Modify ` doc pages for info on +how to do this. You can also define a :doc:`per-atom variable +` in the input script that uses a formula to generate a chunk +ID for each atom. Fix ave/chunk command: ---------------------- -This fix takes the ID of a :doc:`compute chunk/atom ` command as input. For each chunk, -it then sums one or more specified per-atom values over the atoms in -each chunk. The per-atom values can be any atom property, such as -velocity, force, charge, potential energy, kinetic energy, stress, -etc. Additional keywords are defined for per-chunk properties like -density and temperature. More generally any per-atom value generated -by other :doc:`computes `, :doc:`fixes `, and :doc:`per-atom variables `, can be summed over atoms in each chunk. +This fix takes the ID of a :doc:`compute chunk/atom +` command as input. For each chunk, it then sums +one or more specified per-atom values over the atoms in each chunk. The +per-atom values can be any atom property, such as velocity, force, +charge, potential energy, kinetic energy, stress, etc. Additional +keywords are defined for per-chunk properties like density and +temperature. More generally any per-atom value generated by other +:doc:`computes `, :doc:`fixes `, and :doc:`per-atom +variables `, can be summed over atoms in each chunk. Similar to other averaging fixes, this fix allows the summed per-chunk values to be time-averaged in various ways, and output to a file. The -fix produces a global array as output with one row of values per -chunk. +fix produces a global array as output with one row of values per chunk. Compute \*/chunk commands: -------------------------- @@ -97,17 +99,20 @@ category: * :doc:`compute torque/chunk ` * :doc:`compute vcm/chunk ` -They each take the ID of a :doc:`compute chunk/atom ` command as input. As their names -indicate, they calculate the center-of-mass, radius of gyration, -moments of inertia, mean-squared displacement, temperature, torque, -and velocity of center-of-mass for each chunk of atoms. The :doc:`compute property/chunk ` command can tally the -count of atoms in each chunk and extract other per-chunk properties. +They each take the ID of a :doc:`compute chunk/atom +` command as input. As their names indicate, they +calculate the center-of-mass, radius of gyration, moments of inertia, +mean-squared displacement, temperature, torque, and velocity of +center-of-mass for each chunk of atoms. The :doc:`compute +property/chunk ` command can tally the count of +atoms in each chunk and extract other per-chunk properties. -The reason these various calculations are not part of the :doc:`fix ave/chunk command `, is that each requires a more +The reason these various calculations are not part of the :doc:`fix +ave/chunk command `, is that each requires a more complicated operation than simply summing and averaging over per-atom -values in each chunk. For example, many of them require calculation -of a center of mass, which requires summing mass\*position over the -atoms and then dividing by summed mass. +values in each chunk. For example, many of them require calculation of +a center of mass, which requires summing mass\*position over the atoms +and then dividing by summed mass. All of these computes produce a global vector or global array as output, with one or more values per chunk. The output can be used in @@ -118,9 +123,10 @@ various ways: * As input to the :doc:`fix ave/histo ` command to histogram values across chunks. E.g. a histogram of cluster sizes or molecule diffusion rates. -* As input to special functions of :doc:`equal-style variables `, like sum() and max() and ave(). E.g. to - find the largest cluster or fastest diffusing molecule or average - radius-of-gyration of a set of molecules (chunks). +* As input to special functions of :doc:`equal-style variables + `, like sum() and max() and ave(). E.g. to find the largest + cluster or fastest diffusing molecule or average radius-of-gyration of + a set of molecules (chunks). Other chunk commands: --------------------- @@ -138,9 +144,10 @@ spatially average per-chunk values calculated by a per-chunk compute. The :doc:`compute reduce/chunk ` command reduces a peratom value across the atoms in each chunk to produce a value per -chunk. When used with the :doc:`compute chunk/spread/atom ` command it can -create peratom values that induce a new set of chunks with a second -:doc:`compute chunk/atom ` command. +chunk. When used with the :doc:`compute chunk/spread/atom +` command it can create peratom values that +induce a new set of chunks with a second :doc:`compute chunk/atom +` command. Example calculations with chunks -------------------------------- diff --git a/doc/src/Howto_rheo.rst b/doc/src/Howto_rheo.rst index 90f9ff82d0..2407fd484d 100644 --- a/doc/src/Howto_rheo.rst +++ b/doc/src/Howto_rheo.rst @@ -15,8 +15,9 @@ details of the system, or develop new capabilities. For instance, the numerics associated with calculating gradients, reproducing kernels, etc. are separated into distinct classes to simplify the development of new integration schemes which can call these calculations. Additional numerical details can be found in -:ref:`(Clemmer) `. Example movies illustrating some of these -capabilities are found at https://www.lammps.org/movies.html#rheopackage. +:ref:`(Palermo) ` and :ref:`(Clemmer) `. +Example movies illustrating some of these capabilities are found at +https://www.lammps.org/movies.html#rheopackage. Note, if you simply want to run a traditional SPH simulation, the :ref:`SPH package ` package is likely better suited for your application. It has fewer advanced @@ -70,7 +71,7 @@ particles to solid (e.g. with the :doc:`set ` command), (b) create bpm bonds between the particles (see the :doc:`bpm howto ` page for more details), and (c) use :doc:`pair rheo/solid ` to apply repulsive contact forces between distinct solid bodies. Akin to pair rheo, -pair rheo/solid considers a particles fluid/solid phase to determine whether to +pair rheo/solid considers a particle's fluid/solid phase to determine whether to apply forces. However, unlike pair rheo, pair rheo/solid does obey special bond settings such that contact forces do not have to be calculated between two bonded solid particles in the same elastic body. @@ -79,10 +80,10 @@ In systems with thermal evolution, fix rheo/thermal can optionally set a melting/solidification temperature allowing particles to dynamically swap their state between fluid and solid when the temperature exceeds or drops below the critical temperature, respectively. Using the *react* option, one can specify a maximum -bond length and a bond type. Then, when solidifying, particles will search their +bond length and a bond type. Then, when solidifying, particles search their local neighbors and automatically create bonds with any neighboring solid particles -in range. For BPM bond styles, bonds will then use the immediate position of the two -particles to calculate a reference state. When melting, particles will delete any +in range. For BPM bond styles, bonds then use the immediate position of the two +particles to calculate a reference state. When melting, particles delete any bonds of the specified type when reverting to a fluid state. Special bonds are updated as bonds are created/broken. @@ -107,6 +108,10 @@ criteria for creating/deleting a bond or altering force calculations). ---------- +.. _howto_rheo_palermo: + +**(Palermo)** Palermo, Wolf, Clemmer, O'Connor, Phys. Fluids, 36, 113337 (2024). + .. _howto_rheo_clemmer: **(Clemmer)** Clemmer, Pierce, O'Connor, Nevins, Jones, Lechman, Tencer, Appl. Math. Model., 130, 310-326 (2024). diff --git a/doc/src/Intro_authors.rst b/doc/src/Intro_authors.rst index 84470ba3a0..38f1102595 100644 --- a/doc/src/Intro_authors.rst +++ b/doc/src/Intro_authors.rst @@ -8,6 +8,8 @@ send an email to all of them at this address: "developers at lammps.org". General questions about LAMMPS should be posted in the `LAMMPS forum on MatSci `_. +.. We need to keep this file in sync with https://www.lammps.org/authors.html + .. raw:: latex \small @@ -27,7 +29,7 @@ lammps.org". General questions about LAMMPS should be posted in the * - `Steve Plimpton `_ - SNL (retired) - sjplimp at gmail.com - - MD kernels, parallel algorithms & scalability, code structure and design + - original author, MD kernels, parallel algorithms & scalability, code structure and design * - `Aidan Thompson `_ - SNL - athomps at sandia.gov diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index 466d4134cb..9afd0d1b98 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -2789,14 +2789,15 @@ implements smoothed particle hydrodynamics (SPH) for liquids. See the related :ref:`MACHDYN package ` package for smooth Mach dynamics (SMD) for solids. -This package contains ideal gas, Lennard-Jones equation of states, -Tait, and full support for complete (i.e. internal-energy dependent) -equations of state. It allows for plain or Monaghans XSPH integration -of the equations of motion. It has options for density continuity or -density summation to propagate the density field. It has -:doc:`set ` command options to set the internal energy and density -of particles from the input script and allows the same quantities to -be output with thermodynamic output or to dump files via the :doc:`compute property/atom ` command. +This package contains ideal gas, Lennard-Jones equation of states, Tait, +and full support for complete (i.e. internal-energy dependent) equations +of state. It allows for plain or Monaghans XSPH integration of the +equations of motion. It has options for density continuity or density +summation to propagate the density field. It has :doc:`set ` +command options to set the internal energy and density of particles from +the input script and allows the same quantities to be output with +thermodynamic output or to dump files via the :doc:`compute +property/atom ` command. **Author:** Georg Ganzenmuller (Fraunhofer-Institute for High-Speed Dynamics, Ernst Mach Institute, Germany). @@ -2809,6 +2810,17 @@ Dynamics, Ernst Mach Institute, Germany). * ``examples/PACKAGES/sph`` * https://www.lammps.org/movies.html#sph +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + +.. note:: + + Please also note, that the :ref:`RHEO package ` offers + similar functionality in a more modern and flexible implementation. + ---------- .. _PKG-SPIN: diff --git a/doc/src/bond_bpm_rotational.rst b/doc/src/bond_bpm_rotational.rst index 3ecd1cf950..cfbd01dd99 100644 --- a/doc/src/bond_bpm_rotational.rst +++ b/doc/src/bond_bpm_rotational.rst @@ -132,8 +132,8 @@ or :doc:`read_restart ` commands: * :math:`k_b` (force*distance/radians units) * :math:`f_{r,c}` (force units) * :math:`f_{s,c}` (force units) -* :math:`\tau_{b,c}` (force*distance units) * :math:`\tau_{t,c}` (force*distance units) +* :math:`\tau_{b,c}` (force*distance units) * :math:`\gamma_n` (force/velocity units) * :math:`\gamma_s` (force/velocity units) * :math:`\gamma_r` (force*distance/velocity units) @@ -154,8 +154,11 @@ page on BPMs. If the *break* keyword is set to *no*, LAMMPS assumes bonds should not break during a simulation run. This will prevent some unnecessary calculation. -However, if a bond reaches a damage criterion greater than one, -it will trigger an error. +The recommended bond communication distance no longer depends on bond failure +coefficients (which are ignored) but instead corresponds to the typical heuristic +maximum strain used by typical non-bpm bond styles. Similar behavior to *break no* +can also be attained by setting arbitrarily high values for all four failure +coefficients. One cannot use *break no* with *smooth yes*. If the *store/local* keyword is used, an internal fix will track bonds that break during the simulation. Whenever a bond breaks, data is processed diff --git a/doc/src/bond_bpm_spring.rst b/doc/src/bond_bpm_spring.rst index 81582bd5ea..0a43a62159 100644 --- a/doc/src/bond_bpm_spring.rst +++ b/doc/src/bond_bpm_spring.rst @@ -10,7 +10,7 @@ Syntax bond_style bpm/spring keyword value attribute1 attribute2 ... -* optional keyword = *overlay/pair* or *store/local* or *smooth* or *break* +* optional keyword = *overlay/pair* or *store/local* or *smooth* or *break* or *volume/factor* .. parsed-literal:: @@ -36,6 +36,9 @@ Syntax *break* value = *yes* or *no* indicates whether bonds break during a run + *volume/factor* value = *yes* or *no* + indicates whether forces include the volumetric contribution + Examples """""""" @@ -44,6 +47,9 @@ Examples bond_style bpm/spring bond_coeff 1 1.0 0.05 0.1 + bond_style bpm/spring volume/factor yes + bond_coeff 1 1.0 0.05 0.1 0.5 + bond_style bpm/spring myfix 1000 time id1 id2 dump 1 all local 1000 dump.broken f_myfix[1] f_myfix[2] f_myfix[3] dump_modify 1 write_header no @@ -97,15 +103,6 @@ approach the critical strain w = 1.0 - \left( \frac{r - r_0}{r_0 \epsilon_c} \right)^8 . -The following coefficients must be defined for each bond type via the -:doc:`bond_coeff ` command as in the example above, or in -the data file or restart files read by the :doc:`read_data -` or :doc:`read_restart ` commands: - -* :math:`k` (force/distance units) -* :math:`\epsilon_c` (unit less) -* :math:`\gamma` (force/velocity units) - If the *normalize* keyword is set to *yes*, the elastic bond force will be normalized by :math:`r_0` such that :math:`k` must be given in force units. @@ -120,8 +117,48 @@ page on BPMs. If the *break* keyword is set to *no*, LAMMPS assumes bonds should not break during a simulation run. This will prevent some unnecessary calculation. -However, if a bond reaches a strain greater than :math:`\epsilon_c`, -it will trigger an error. +The recommended bond communication distance no longer depends on the value of +:math:`\epsilon_c` (which is ignored) but instead corresponds to the typical +heuristic maximum strain used by typical non-bpm bond styles. Similar behavior +to *break no* can also be attained by setting an arbitrarily high value of +:math:`\epsilon_c`. One cannot use *break no* with *smooth yes*. + +.. versionadded:: TBD + +The *volume/factor* keyword toggles whether an additional multibody +contribution is added to he force using the formulation in +:ref:`(Clemmer2) `, + +.. math:: + + \alpha_v \left(\left[\frac{V_i + V_j}{V_{0,i} + V_{0,j}}\right]^{1/3} - \frac{r_{ij}}{r_{0,ij}}\right) + +where :math:`\alpha_v` is a user specified coefficient and :math:`V_i` +and :math:`V_{0,i}` are estimates of the current and local volume +of atom :math:`i`. These volumes are calculated as the sum of current +or initial bond lengths cubed. In 2D, the volume is replaced with an area +calculated using bond lengths squared and the cube root in the above equation +is accordingly replaced with a square root. This approximation assumes bonds +are evenly distributed on a spherical surface and neglects constant prefactors +which are irrelevant since only the ratio of volumes matters. This term may be +used to adjust the Poisson's ratio. + +If a bond is broken (or created), :math:`V_{0,i}` is updated by subtracting +(or adding) that bond's contribution. + +The following coefficients must be defined for each bond type via the +:doc:`bond_coeff ` command as in the example above, or in +the data file or restart files read by the :doc:`read_data +` or :doc:`read_restart ` commands: + +* :math:`k` (force/distance units) +* :math:`\epsilon_c` (unit less) +* :math:`\gamma` (force/velocity units) + +Additionally, if *volume/factor* is set to *yes*, a fourth coefficient +must be provided: + +* :math:`a_v` (force units) If the *store/local* keyword is used, an internal fix will track bonds that break during the simulation. Whenever a bond breaks, data is processed @@ -213,7 +250,7 @@ Related commands Default """"""" -The option defaults are *overlay/pair* = *no*, *smooth* = *yes*, *normalize* = *no*, and *break* = *yes* +The option defaults are *overlay/pair* = *no*, *smooth* = *yes*, *normalize* = *no*, *break* = *yes*, and *volume/factor* = *no* ---------- @@ -224,3 +261,7 @@ The option defaults are *overlay/pair* = *no*, *smooth* = *yes*, *normalize* = * .. _Groot4: **(Groot)** Groot and Warren, J Chem Phys, 107, 4423-35 (1997). + +.. _multibody-Clemmer: + +**(Clemmer2)** Clemmer, Monti, Lechman, Soft Matter, 20, 1702 (2024). diff --git a/doc/src/compute_angle_local.rst b/doc/src/compute_angle_local.rst index 126dd309af..d4491c6945 100644 --- a/doc/src/compute_angle_local.rst +++ b/doc/src/compute_angle_local.rst @@ -78,7 +78,7 @@ system and output the statistics in various ways: compute 2 all angle/local eng theta v_cos v_cossq set theta t dump 1 all local 100 tmp.dump c_1[*] c_2[*] - compute 3 all reduce ave c_2[*] + compute 3 all reduce ave c_2[*] inputs local thermo_style custom step temp press c_3[*] fix 10 all ave/histo 10 10 100 -1 1 20 c_2[3] mode vector file tmp.histo diff --git a/doc/src/compute_bond_local.rst b/doc/src/compute_bond_local.rst index 5036358c8c..e070d507b1 100644 --- a/doc/src/compute_bond_local.rst +++ b/doc/src/compute_bond_local.rst @@ -139,7 +139,7 @@ output the statistics in various ways: compute 2 all bond/local engpot dist v_dsq set dist d dump 1 all local 100 tmp.dump c_1[*] c_2[*] - compute 3 all reduce ave c_2[*] + compute 3 all reduce ave c_2[*] inputs local thermo_style custom step temp press c_3[*] fix 10 all ave/histo 10 10 100 0 6 20 c_2[3] mode vector file tmp.histo diff --git a/doc/src/compute_dihedral_local.rst b/doc/src/compute_dihedral_local.rst index 291b870373..d809cd39ce 100644 --- a/doc/src/compute_dihedral_local.rst +++ b/doc/src/compute_dihedral_local.rst @@ -76,7 +76,7 @@ angle in the system and output the statistics in various ways: compute 2 all dihedral/local phi v_cos v_cossq set phi p dump 1 all local 100 tmp.dump c_1[*] c_2[*] - compute 3 all reduce ave c_2[*] + compute 3 all reduce ave c_2[*] inputs local thermo_style custom step temp press c_3[*] fix 10 all ave/histo 10 10 100 -1 1 20 c_2[2] mode vector file tmp.histo diff --git a/doc/src/compute_reduce.rst b/doc/src/compute_reduce.rst index 9eafe7cd5a..e5c99a478f 100644 --- a/doc/src/compute_reduce.rst +++ b/doc/src/compute_reduce.rst @@ -206,11 +206,13 @@ IDs and the bond stretch will be printed with thermodynamic output. The *inputs* keyword allows selection of whether all the inputs are per-atom or local quantities. As noted above, all the inputs must be -the same kind (per-atom or local). Per-atom is the default setting. -If a compute or fix is specified as an input, it must produce per-atom -or local data to match this setting. If it produces both, e.g. for +the same kind (per-atom or local). Per-atom is the default setting. If +a compute or fix is specified as an input, it must produce per-atom or +local data to match this setting. If it produces both, like for example the :doc:`compute voronoi/atom ` command, then -this keyword selects between them. +this keyword selects between them. If a compute *only* produces local +data, like for example the :doc:`compute bond/local command +`, the setting "inputs local" is *required*. ---------- diff --git a/doc/src/compute_reduce_chunk.rst b/doc/src/compute_reduce_chunk.rst index 8ec19ade66..eeadd50a97 100644 --- a/doc/src/compute_reduce_chunk.rst +++ b/doc/src/compute_reduce_chunk.rst @@ -37,55 +37,57 @@ Description Define a calculation that reduces one or more per-atom vectors into per-chunk values. This can be useful for diagnostic output. Or when -used in conjunction with the :doc:`compute chunk/spread/atom ` command it can be -used to create per-atom values that induce a new set of chunks with a -second :doc:`compute chunk/atom ` command. An -example is given below. +used in conjunction with the :doc:`compute chunk/spread/atom +` command it can be used to create per-atom +values that induce a new set of chunks with a second :doc:`compute +chunk/atom ` command. An example is given below. -In LAMMPS, chunks are collections of atoms defined by a :doc:`compute chunk/atom ` command, which assigns each atom -to a single chunk (or no chunk). The ID for this command is specified -as chunkID. For example, a single chunk could be the atoms in a -molecule or atoms in a spatial bin. See the :doc:`compute chunk/atom ` and :doc:`Howto chunk ` -doc pages for details of how chunks can be defined and examples of how -they can be used to measure properties of a system. +In LAMMPS, chunks are collections of atoms defined by a :doc:`compute +chunk/atom ` command, which assigns each atom to a +single chunk (or no chunk). The ID for this command is specified as +chunkID. For example, a single chunk could be the atoms in a molecule +or atoms in a spatial bin. See the :doc:`compute chunk/atom +` and :doc:`Howto chunk ` doc pages for +details of how chunks can be defined and examples of how they can be +used to measure properties of a system. For each atom, this compute accesses its chunk ID from the specified -*chunkID* compute. The per-atom value from an input contributes -to a per-chunk value corresponding the the chunk ID. +*chunkID* compute. The per-atom value from an input contributes to a +per-chunk value corresponding the chunk ID. The reduction operation is specified by the *mode* setting and is performed over all the per-atom values from the atoms in each chunk. -The *sum* option adds the pre-atom values to a per-chunk total. The -*min* or *max* options find the minimum or maximum value of the -per-atom values for each chunk. +The *sum* option adds the per-atom values to a per-chunk total. The +*min* or *max* options find the minimum or maximum value of the per-atom +values for each chunk. -Note that only atoms in the specified group contribute to the -reduction operation. If the *chunkID* compute returns a 0 for the -chunk ID of an atom (i.e., the atom is not in a chunk defined by the -:doc:`compute chunk/atom ` command), that atom will -also not contribute to the reduction operation. An input that is a -compute or fix may define its own group which affects the quantities -it returns. For example, a compute with return a zero value for atoms -that are not in the group specified for that compute. +Note that only atoms in the specified group contribute to the reduction +operation. If the *chunkID* compute returns a 0 for the chunk ID of an +atom (i.e., the atom is not in a chunk defined by the :doc:`compute +chunk/atom ` command), that atom will also not +contribute to the reduction operation. An input that is a compute or +fix may define its own group which affects the quantities it returns. +For example, a compute will return a zero value for atoms that are not +in the group specified for that compute. Each listed input is operated on independently. Each input can be the -result of a :doc:`compute ` or :doc:`fix ` or the evaluation -of an atom-style :doc:`variable `. +result of a :doc:`compute ` or :doc:`fix ` or the +evaluation of an atom-style :doc:`variable `. -Note that for values from a compute or fix, the bracketed index I can -be specified using a wildcard asterisk with the index to effectively +Note that for values from a compute or fix, the bracketed index I can be +specified using a wildcard asterisk with the index to effectively specify multiple values. This takes the form "\*" or "\*n" or "m\*" or -"m\*n". If :math:`N` is the size of the vector (for *mode* = scalar) or the -number of columns in the array (for *mode* = vector), then an asterisk -with no numeric values means all indices from 1 to :math:`N`. A leading -asterisk means all indices from 1 to n (inclusive). A trailing -asterisk means all indices from n to :math:`N` (inclusive). A middle asterisk -means all indices from m to n (inclusive). +"m\*n". If :math:`N` is the size of the vector (for *mode* = scalar) or +the number of columns in the array (for *mode* = vector), then an +asterisk with no numeric values means all indices from 1 to :math:`N`. +A leading asterisk means all indices from 1 to n (inclusive). A +trailing asterisk means all indices from n to :math:`N` (inclusive). A +middle asterisk means all indices from m to n (inclusive). Using a wildcard is the same as if the individual columns of the array -had been listed one by one. For example, the following two compute reduce/chunk -commands are equivalent, since the -:doc:`compute property/chunk ` command creates a per-atom +had been listed one by one. For example, the following two compute +reduce/chunk commands are equivalent, since the :doc:`compute +property/chunk ` command creates a per-atom array with 3 columns: .. code-block:: LAMMPS @@ -164,13 +166,14 @@ Output info """"""""""" This compute calculates a global vector if a single input value is -specified, otherwise a global array is output. The number of columns -in the array is the number of inputs provided. The length of the -vector or the number of vector elements or array rows = the number of -chunks *Nchunk* as calculated by the specified :doc:`compute chunk/atom ` command. The vector or array can -be accessed by any command that uses global values from a compute as -input. See the :doc:`Howto output ` page for an -overview of LAMMPS output options. +specified, otherwise a global array is output. The number of columns in +the array is the number of inputs provided. The length of the vector or +the number of vector elements or array rows = the number of chunks +*Nchunk* as calculated by the specified :doc:`compute chunk/atom +` command. The vector or array can be accessed by +any command that uses global values from a compute as input. See the +:doc:`Howto output ` page for an overview of LAMMPS output +options. The per-atom values for the vector or each column of the array will be in whatever :doc:`units ` the corresponding input value is in. @@ -183,7 +186,9 @@ Restrictions Related commands """""""""""""""" -:doc:`compute chunk/atom `, :doc:`compute reduce `, :doc:`compute chunk/spread/atom ` +:doc:`compute chunk/atom `, +:doc:`compute reduce `, +:doc:`compute chunk/spread/atom ` Default """"""" diff --git a/doc/src/compute_sph_e_atom.rst b/doc/src/compute_sph_e_atom.rst index d557eb7920..44ff765a6a 100644 --- a/doc/src/compute_sph_e_atom.rst +++ b/doc/src/compute_sph_e_atom.rst @@ -33,6 +33,12 @@ particle. See `this PDF guide `_ to using SPH in LAMMPS. +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + The value of the internal energy will be 0.0 for atoms not in the specified compute group. diff --git a/doc/src/compute_sph_rho_atom.rst b/doc/src/compute_sph_rho_atom.rst index 6e8579476a..6ed6bf70c1 100644 --- a/doc/src/compute_sph_rho_atom.rst +++ b/doc/src/compute_sph_rho_atom.rst @@ -32,6 +32,12 @@ kernel function interpolation using "pair style sph/rhosum". See `this PDF guide `_ to using SPH in LAMMPS. +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + The value of the SPH density will be 0.0 for atoms not in the specified compute group. diff --git a/doc/src/compute_sph_t_atom.rst b/doc/src/compute_sph_t_atom.rst index 3383c26145..8bbab4ca7d 100644 --- a/doc/src/compute_sph_t_atom.rst +++ b/doc/src/compute_sph_t_atom.rst @@ -37,6 +37,12 @@ particles, i.e. a Smooth-Particle Hydrodynamics particle. See `this PDF guide `_ to using SPH in LAMMPS. +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + The value of the internal energy will be 0.0 for atoms not in the specified compute group. diff --git a/doc/src/compute_stress_curvilinear.rst b/doc/src/compute_stress_curvilinear.rst index 022a87058f..6ec3ab18bf 100644 --- a/doc/src/compute_stress_curvilinear.rst +++ b/doc/src/compute_stress_curvilinear.rst @@ -87,7 +87,7 @@ This array can be output with :doc:`fix ave/time `, .. code-block:: LAMMPS - compute 1 all stress/spherical 0 0 0 0.1 10 + compute p all stress/spherical 0 0 0 0.1 10 fix 2 all ave/time 100 1 100 c_p[*] file dump_p.out mode vector The values calculated by this compute are "intensive". The stress diff --git a/doc/src/compute_stress_mop.rst b/doc/src/compute_stress_mop.rst index b4779b8bf3..31c81b5df7 100644 --- a/doc/src/compute_stress_mop.rst +++ b/doc/src/compute_stress_mop.rst @@ -129,6 +129,9 @@ package ` doc page on for more info. The method is implemented for orthogonal simulation boxes whose size does not change in time, and axis-aligned planes. +Contributions from bonds, angles, and dihedrals are not compatible +with MPI parallel runs. + The method only works with two-body pair interactions, because it requires the class method ``Pair::single()`` to be implemented, which is not possible for manybody potentials. In particular, compute diff --git a/doc/src/compute_temp_partial.rst b/doc/src/compute_temp_partial.rst index 43691c048e..b6803f2c9c 100644 --- a/doc/src/compute_temp_partial.rst +++ b/doc/src/compute_temp_partial.rst @@ -46,7 +46,7 @@ degrees of freedom. A symmetric tensor, stored as a six-element vector, is also calculated by this compute for use in the computation of a pressure tensor by the -:doc:`compute pressue ` command. The formula for +:doc:`compute pressure ` command. The formula for the components of the tensor is the same as the above expression for :math:`E_\mathrm{kin}`, except that the 1/2 factor is NOT included and the :math:`v_i^2` is replaced by :math:`v_{i,x} v_{i,y}` for the diff --git a/doc/src/fix.rst b/doc/src/fix.rst index ee52be224e..9af607601b 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -366,6 +366,7 @@ accelerated styles exist. * :doc:`qeq/slater ` - charge equilibration via Slater method * :doc:`qmmm ` - functionality to enable a quantum mechanics/molecular mechanics coupling * :doc:`qtb ` - implement quantum thermal bath scheme +* :doc:`qtpie/reaxff ` - apply QTPIE charge equilibration * :doc:`rattle ` - RATTLE constraints on bonds and/or angles * :doc:`reaxff/bonds ` - write out ReaxFF bond information * :doc:`reaxff/species ` - write out ReaxFF molecule information diff --git a/doc/src/fix_acks2_reaxff.rst b/doc/src/fix_acks2_reaxff.rst index ebb1b48051..79a9cf8ea6 100644 --- a/doc/src/fix_acks2_reaxff.rst +++ b/doc/src/fix_acks2_reaxff.rst @@ -111,7 +111,8 @@ LAMMPS was built with that package. See the :doc:`Build package This fix does not correctly handle interactions involving multiple periodic images of the same atom. Hence, it should not be used for -periodic cell dimensions less than :math:`10~\AA`. +periodic cell dimensions smaller than the non-bonded cutoff radius, +which is typically :math:`10~\AA` for ReaxFF simulations. This fix may be used in combination with :doc:`fix efield ` and will apply the external electric field during charge equilibration, @@ -122,7 +123,8 @@ components in non-periodic directions. Related commands """""""""""""""" -:doc:`pair_style reaxff `, :doc:`fix qeq/reaxff ` +:doc:`pair_style reaxff `, :doc:`fix qeq/reaxff `, +:doc:`fix qtpi/reaxff ` Default """"""" diff --git a/doc/src/fix_adapt.rst b/doc/src/fix_adapt.rst index 7eaf1081f3..1ddf80cbdb 100644 --- a/doc/src/fix_adapt.rst +++ b/doc/src/fix_adapt.rst @@ -119,6 +119,14 @@ style supports it. Note that the :doc:`pair_style ` and to specify these parameters initially; the fix adapt command simply overrides the parameters. +.. note:: + + Pair_coeff settings must be made **explicitly** in order for fix + adapt to be able to change them. Settings inferred from mixing + are not suitable. If necessary all mixed settings can be output + to a file using the :doc:`write_coeff command ` and + then the desired mixed pair_coeff settings copied from that file. + The *pstyle* argument is the name of the pair style. If :doc:`pair_style hybrid or hybrid/overlay ` is used, *pstyle* should be a sub-style name. If there are multiple @@ -323,7 +331,7 @@ If :doc:`bond_style hybrid ` is used, *bstyle* should be a sub-style name. The bond styles that currently work with fix adapt are: +-----------------------------------------------------+---------------------------+------------+ -| :doc:`class2 ` | r0 | type bonds | +| :doc:`class2 ` | k2,k3,k4,r0 | type bonds | +-----------------------------------------------------+---------------------------+------------+ | :doc:`fene ` | k,r0 | type bonds | +-----------------------------------------------------+---------------------------+------------+ @@ -331,6 +339,8 @@ sub-style name. The bond styles that currently work with fix adapt are: +-----------------------------------------------------+---------------------------+------------+ | :doc:`fene/nm ` | k,r0 | type bonds | +-----------------------------------------------------+---------------------------+------------+ +| :doc:`gaussian ` | alpha,width,r0 | type bonds | ++-----------------------------------------------------+---------------------------+------------+ | :doc:`gromos ` | k,r0 | type bonds | +-----------------------------------------------------+---------------------------+------------+ | :doc:`harmonic ` | k,r0 | type bonds | @@ -343,9 +353,9 @@ sub-style name. The bond styles that currently work with fix adapt are: +-----------------------------------------------------+---------------------------+------------+ | :doc:`mm3 ` | k,r0 | type bonds | +-----------------------------------------------------+---------------------------+------------+ -| :doc:`morse ` | r0 | type bonds | +| :doc:`morse ` | d0,alpha,r0 | type bonds | +-----------------------------------------------------+---------------------------+------------+ -| :doc:`nonlinear ` | epsilon,r0 | type bonds | +| :doc:`nonlinear ` | lamda,epsilon,r0 | type bonds | +-----------------------------------------------------+---------------------------+------------+ ---------- @@ -369,31 +379,37 @@ all types from 1 to :math:`N`. A leading asterisk means all types from If :doc:`angle_style hybrid ` is used, *astyle* should be a sub-style name. The angle styles that currently work with fix adapt are: -+--------------------------------------------------------------------+-----------------+-------------+ -| :doc:`harmonic ` | k,theta0 | type angles | -+--------------------------------------------------------------------+-----------------+-------------+ -| :doc:`charmm ` | k,theta0 | type angles | -+--------------------------------------------------------------------+-----------------+-------------+ -| :doc:`class2 ` | k2,k3,k4,theta0 | type angles | -+--------------------------------------------------------------------+-----------------+-------------+ -| :doc:`cosine ` | k | type angles | -+--------------------------------------------------------------------+-----------------+-------------+ -| :doc:`cosine/periodic ` | k,b,n | type angles | -+--------------------------------------------------------------------+-----------------+-------------+ -| :doc:`cosine/squared/restricted ` | k,theta0 | type angles | -+--------------------------------------------------------------------+-----------------+-------------+ -| :doc:`dipole ` | k,gamma0 | type angles | -+--------------------------------------------------------------------+-----------------+-------------+ -| :doc:`fourier ` | k,c0,c1,c2 | type angles | -+--------------------------------------------------------------------+-----------------+-------------+ -| :doc:`fourier/simple ` | k,c,n | type angles | -+--------------------------------------------------------------------+-----------------+-------------+ -| :doc:`mm3 ` | k,theta0 | type angles | -+--------------------------------------------------------------------+-----------------+-------------+ -| :doc:`quartic ` | k2,k3,k4,theta0 | type angles | -+--------------------------------------------------------------------+-----------------+-------------+ -| :doc:`spica ` | k,theta0 | type angles | -+--------------------------------------------------------------------+-----------------+-------------+ ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`harmonic ` | k,theta0 | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`charmm ` | k,theta0 | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`class2 ` | k2,k3,k4,theta0 | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`cosine ` | k | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`cosine/delta ` | k | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`cosine/periodic ` | k,b,n | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`cosine/squared ` | k,theta0 | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`cosine/squared/restricted ` | k,theta0 | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`dipole ` | k,gamma0 | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`fourier ` | k,c0,c1,c2 | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`fourier/simple ` | k,c,n | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`gaussian ` | alpha,width,theta0 | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`mm3 ` | k,theta0 | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`quartic ` | k2,k3,k4,theta0 | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ +| :doc:`spica ` | k,theta0 | type angles | ++--------------------------------------------------------------------+--------------------+-------------+ Note that internally, theta0 is stored in radians, so the variable this fix uses to reset theta0 needs to generate values in radians. diff --git a/doc/src/fix_adapt_fep.rst b/doc/src/fix_adapt_fep.rst index 3bcdfc5035..981a1c5298 100644 --- a/doc/src/fix_adapt_fep.rst +++ b/doc/src/fix_adapt_fep.rst @@ -116,12 +116,22 @@ style supports it. Note that the :doc:`pair_style ` and to specify these parameters initially; the fix adapt command simply overrides the parameters. -The *pstyle* argument is the name of the pair style. If :doc:`pair_style hybrid or hybrid/overlay ` is used, *pstyle* should be -a sub-style name. For example, *pstyle* could be specified as "soft" -or "lubricate". The *pparam* argument is the name of the parameter to -change. This is the current list of pair styles and parameters that -can be varied by this fix. See the doc pages for individual pair -styles and their energy formulas for the meaning of these parameters: +.. note:: + + Pair_coeff settings must be made **explicitly** in order for fix + adapt/fep to be able to change them. Settings inferred from mixing + are not suitable. If necessary all mixed settings can be output + to a file using the :doc:`write_coeff command ` and + then the desired mixed pair_coeff settings copied from that file. + +The *pstyle* argument is the name of the pair style. If +:doc:`pair_style hybrid or hybrid/overlay ` is used, +*pstyle* should be a sub-style name. For example, *pstyle* could be +specified as "soft" or "lubricate". The *pparam* argument is the name +of the parameter to change. This is the current list of pair styles and +parameters that can be varied by this fix. See the doc pages for +individual pair styles and their energy formulas for the meaning of +these parameters: +------------------------------------------------------------------------------+-------------------------+------------+ | :doc:`born ` | a,b,c | type pairs | diff --git a/doc/src/fix_atom_swap.rst b/doc/src/fix_atom_swap.rst index 48f5b33a74..fd4a2f7245 100644 --- a/doc/src/fix_atom_swap.rst +++ b/doc/src/fix_atom_swap.rst @@ -119,15 +119,14 @@ groups of atoms that have different charges, these charges will not be changed when the atom types change. Since this fix computes total potential energies before and after -proposed swaps, so even complicated potential energy calculations are -OK, including the following: +proposed swaps, even complicated potential energy calculations are +acceptable, including the following: * long-range electrostatics (:math:`k`-space) * many body pair styles -* hybrid pair styles -* eam pair styles +* hybrid pair styles (with restrictions) +* EAM pair styles * triclinic systems -* need to include potential energy contributions from other fixes Some fixes have an associated potential energy. Examples of such fixes include: :doc:`efield `, :doc:`gravity `, @@ -181,6 +180,10 @@ This fix is part of the MC package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +When this fix is used with a :doc:`hybrid pair style ` +system, only swaps between atom types of the same sub-style (or +combination of sub-styles) are permitted. + This fix cannot be used with systems that do not have per-type masses (e.g. atom style sphere) since the implemented algorithm pre-computes velocity rescaling factors from per-type masses and ignores any per-atom diff --git a/doc/src/fix_cmap.rst b/doc/src/fix_cmap.rst index 316ad5d038..ccca88232b 100644 --- a/doc/src/fix_cmap.rst +++ b/doc/src/fix_cmap.rst @@ -1,8 +1,11 @@ .. index:: fix cmap +.. index:: fix cmap/kk fix cmap command ================ +Accelerator Variants: *cmap/kk* + Syntax """""" @@ -141,6 +144,12 @@ outermost level. MUST not disable the :doc:`fix_modify ` *energy* option for this fix. +---------- + +.. include:: accel_styles.rst + +---------- + Restrictions """""""""""" diff --git a/doc/src/fix_colvars.rst b/doc/src/fix_colvars.rst index 4730e29c67..21a9d06714 100644 --- a/doc/src/fix_colvars.rst +++ b/doc/src/fix_colvars.rst @@ -1,8 +1,11 @@ .. index:: fix colvars +.. index:: fix colvars/kk fix colvars command =================== +Accelerator Variants: *colvars/kk* + Syntax """""" @@ -118,6 +121,16 @@ thermostat target temperature. The *seed* keyword contains the seed for the random number generator that will be used in the colvars module. +---------- + +.. note:: + + Fix colvars/kk is not really ported to KOKKOS, since the colvars + library has not been ported to KOKKOS. It merely has some + optimizations to reduce the data transfers between host and device + for KOKKOS with GPUs. + +---------- Restarting """""""""" diff --git a/doc/src/fix_external.rst b/doc/src/fix_external.rst index 44dd0929ee..fa10248a42 100644 --- a/doc/src/fix_external.rst +++ b/doc/src/fix_external.rst @@ -139,9 +139,9 @@ properties are: void set_vector_length(int n); void set_vector(int idx, double val); -These allow to set per-atom energy contributions, per-atom stress -contributions, the length and individual values of a global vector -of properties that the caller code may want to communicate to LAMMPS +These enable setting per-atom energy and per-atom stress contributions, +the length and individual values of a global vector of properties that +the caller code may want to communicate to LAMMPS (e.g. for use in :doc:`fix ave/time ` or in :doc:`equal-style variables ` or for :doc:`custom thermo output `. @@ -173,9 +173,19 @@ stress/atom ` commands. The former can be accessed by :doc:`thermodynamic output `. The default setting for this fix is :doc:`fix_modify virial yes `. -This fix computes a global scalar which can be accessed by various -:doc:`output commands `. The scalar is the potential -energy discussed above. The scalar stored by this fix is "extensive". +This fix computes a global scalar, a global vector, and a per-atom array +which can be accessed by various :doc:`output commands `. +The scalar is the potential energy discussed above. The scalar stored +by this fix is "extensive". +The global vector has a custom length and needs to be set by the external +program using the +:cpp:func:`lammps_fix_external_set_vector() ` +and :cpp:func:`lammps_fix_external_set_vector_length() +` +calls of the LAMMPS library interface or the equivalent call of the Python +or Fortran modules. +The per-atom array has 3 values for each atom and is the applied external +force. No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. diff --git a/doc/src/fix_halt.rst b/doc/src/fix_halt.rst index 25331804aa..0bcf2fb5ea 100644 --- a/doc/src/fix_halt.rst +++ b/doc/src/fix_halt.rst @@ -101,7 +101,7 @@ hstyle = bondmax option. .. code-block:: LAMMPS compute bdist all bond/local dist - compute bmax all reduce max c_bdist + compute bmax all reduce max c_bdist inputs local variable bondmax equal c_bmax Thus these two versions of a fix halt command will do the same thing: diff --git a/doc/src/fix_langevin.rst b/doc/src/fix_langevin.rst index e04805427e..30e4c48270 100644 --- a/doc/src/fix_langevin.rst +++ b/doc/src/fix_langevin.rst @@ -231,12 +231,6 @@ the particles. As described below, this energy can then be printed out or added to the potential energy of the system to monitor energy conservation. -.. note:: - - This accumulated energy does NOT include kinetic energy removed - by the *zero* flag. LAMMPS will print a warning when both options are - active. - The keyword *zero* can be used to eliminate drift due to the thermostat. Because the random forces on different atoms are independent, they do not sum exactly to zero. As a result, this fix diff --git a/doc/src/fix_nve_limit.rst b/doc/src/fix_nve_limit.rst index 23517aea40..3533a63ebc 100644 --- a/doc/src/fix_nve_limit.rst +++ b/doc/src/fix_nve_limit.rst @@ -1,8 +1,11 @@ .. index:: fix nve/limit +.. index:: fix nve/limit/kk fix nve/limit command ===================== +Accelerator Variants: *nve/limit/kk* + Syntax """""" @@ -79,6 +82,12 @@ is "extensive". No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. +---------- + +.. include:: accel_styles.rst + +---------- + Restrictions """""""""""" none diff --git a/doc/src/fix_qeq.rst b/doc/src/fix_qeq.rst index fd317666d0..06a1f98375 100644 --- a/doc/src/fix_qeq.rst +++ b/doc/src/fix_qeq.rst @@ -190,7 +190,7 @@ on atoms via the matrix inversion method. A tolerance of 1.0e-6 is usually a good number. Keyword *alpha* can be used to change the Slater type orbital exponent. -.. versionadded:: TBD +.. versionadded:: 19Nov2024 The *qeq/ctip* style describes partial charges on atoms in the same way as style *qeq/shielded* but also enables the definition of charge diff --git a/doc/src/fix_qeq_reaxff.rst b/doc/src/fix_qeq_reaxff.rst index e90842ea6a..e1a09c4fc3 100644 --- a/doc/src/fix_qeq_reaxff.rst +++ b/doc/src/fix_qeq_reaxff.rst @@ -124,7 +124,8 @@ LAMMPS was built with that package. See the :doc:`Build package This fix does not correctly handle interactions involving multiple periodic images of the same atom. Hence, it should not be used for -periodic cell dimensions less than 10 Angstroms. +periodic cell dimensions smaller than the non-bonded cutoff radius, +which is typically :math:`10~\AA` for ReaxFF simulations. This fix may be used in combination with :doc:`fix efield ` and will apply the external electric field during charge equilibration, @@ -138,7 +139,8 @@ as an atom-style variable using the *potential* keyword for `fix efield`. Related commands """""""""""""""" -:doc:`pair_style reaxff `, :doc:`fix qeq/shielded ` +:doc:`pair_style reaxff `, :doc:`fix qeq/shielded `, +:doc:`fix acks2/reaxff `, :doc:`fix qtpie/reaxff ` Default """"""" diff --git a/doc/src/fix_qtpie_reaxff.rst b/doc/src/fix_qtpie_reaxff.rst new file mode 100644 index 0000000000..e96cbec459 --- /dev/null +++ b/doc/src/fix_qtpie_reaxff.rst @@ -0,0 +1,200 @@ +.. index:: fix qtpie/reaxff + +fix qtpie/reaxff command +======================== + +Syntax +"""""" + +.. code-block:: LAMMPS + + fix ID group-ID qtpie/reaxff Nevery cutlo cuthi tolerance params gfile args + +* ID, group-ID are documented in :doc:`fix ` command +* qtpie/reaxff = style name of this fix command +* Nevery = perform QTPIE every this many steps +* cutlo,cuthi = lo and hi cutoff for Taper radius +* tolerance = precision to which charges will be equilibrated +* params = reaxff or a filename +* gfile = the name of a file containing Gaussian orbital exponents +* one or more keywords or keyword/value pairs may be appended + + .. parsed-literal:: + + keyword = *maxiter* + *maxiter* N = limit the number of iterations to *N* + +Examples +"""""""" + +.. code-block:: LAMMPS + + fix 1 all qtpie/reaxff 1 0.0 10.0 1.0e-6 reaxff exp.qtpie + fix 1 all qtpie/reaxff 1 0.0 10.0 1.0e-6 params.qtpie exp.qtpie maxiter 500 + +Description +""""""""""" + +.. versionadded:: 19Nov2024 + +The QTPIE charge equilibration method is an extension of the QEq charge +equilibration method. With QTPIE, the partial charges on individual atoms +are computed by minimizing the electrostatic energy of the system in the +same way as the QEq method but where the absolute electronegativity, +:math:`\chi_i`, of each atom in the QEq charge equilibration scheme +:ref:`(Rappe and Goddard) ` is replaced with an effective +electronegativity given by :ref:`(Chen) ` + +.. math:: + \chi_{\mathrm{eff},i} = \frac{\sum_{j=1}^{N} (\chi_i - \chi_j) S_{ij}} + {\sum_{m=1}^{N}S_{im}}, + +which acts to penalize long-range charge transfer seen with the QEq charge +equilibration scheme. In this equation, :math:`N` is the number of atoms in +the system and :math:`S_{ij}` is the overlap integral between atom :math:`i` +and atom :math:`j`. + +The effect of an external electric field can be incorporated into the QTPIE +method by modifying the absolute or effective electronegativities of each +atom :ref:`(Chen) `. This fix models the effect of an external +electric field by using the effective electronegativity given in +:ref:`(Gergs) `: + +.. math:: + \chi_{\mathrm{eff},i} = \frac{\sum_{j=1}^{N} (\chi_i - \chi_j + \phi_i - \phi_j) S_{ij}} + {\sum_{m=1}^{N}S_{im}}, + +where :math:`\phi_i` and :math:`\phi_j` are the electric +potentials at the positions of atom :math:`i` and :math:`j` +due to the external electric field. + +This fix is typically used in conjunction with the ReaxFF force +field model as implemented in the :doc:`pair_style reaxff ` +command, but it can be used with any potential in LAMMPS, so long as it +defines and uses charges on each atom. For more technical details about the +charge equilibration performed by `fix qtpie/reaxff`, which is the same as in +:doc:`fix qeq/reaxff ` except for the use of +:math:`\chi_{\mathrm{eff},i}`, please refer to :ref:`(Aktulga) `. +To be explicit, this fix replaces :math:`\chi_k` of eq. 3 in +:ref:`(Aktulga) ` with :math:`\chi_{\mathrm{eff},k}`. + +This fix requires the absolute electronegativity, :math:`\chi`, in eV, the +self-Coulomb potential, :math:`\eta`, in eV, and the shielded Coulomb +constant, :math:`\gamma`, in :math:`\AA^{-1}`. If the *params* setting above +is the word "reaxff", then these are extracted from the +:doc:`pair_style reaxff ` command and the ReaxFF force field +file it reads in. If a file name is specified for *params*, then the +parameters are taken from the specified file and the file must contain +one line for each atom type. The latter form must be used when performing +QTPIE with a non-ReaxFF potential. Each line should be formatted as follows, +ensuring that the parameters are given in units of eV, eV, and :math:`\AA^{-1}`, +respectively: + +.. parsed-literal:: + + itype chi eta gamma + +where *itype* is the atom type from 1 to Ntypes. Note that eta is +defined here as twice the eta value in the ReaxFF file. + +The overlap integrals in the equation for :math:`\chi_{\mathrm{eff},i}` +are computed by using normalized 1s Gaussian type orbitals. The Gaussian +orbital exponents, :math:`\alpha`, that are needed to compute the overlap +integrals are taken from the file given by *gfile*. +This file must contain one line for each atom type and provide the Gaussian +orbital exponent for each atom type in units of inverse square Bohr radius. +Each line should be formatted as follows: + +.. parsed-literal:: + + itype alpha + +Empty lines or any text following the pound sign (#) are ignored. An example +*gfile* for a system with two atom types is + +.. parsed-literal:: + + # An example gfile. Exponents are taken from Table 2.2 of Chen, J. (2009). + # Theory and applications of fluctuating-charge models. + # The units of the exponents are 1 / (Bohr radius)^2 . + 1 0.2240 # O + 2 0.5434 # H + +The optional *maxiter* keyword allows changing the max number +of iterations in the linear solver. The default value is 200. + +.. note:: + + In order to solve the self-consistent equations for electronegativity + equalization, LAMMPS imposes the additional constraint that all the + charges in the fix group must add up to zero. The initial charge + assignments should also satisfy this constraint. LAMMPS will print a + warning if that is not the case. + +Restart, fix_modify, output, run start/stop, minimize info +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +No information about this fix is written to :doc:`binary restart files +`. This fix computes a global scalar (the number of +iterations) and a per-atom vector (the effective electronegativity), which +can be accessed by various :doc:`output commands `. +No parameter of this fix can be used with the *start/stop* keywords of +the :doc:`run ` command. + +This fix is invoked during :doc:`energy minimization `. + +Restrictions +"""""""""""" + +This fix is part of the REAXFF package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package +` page for more info. + +This fix does not correctly handle interactions involving multiple +periodic images of the same atom. Hence, it should not be used for +periodic cell dimensions smaller than the non-bonded cutoff radius, +which is typically :math:`10~\AA` for ReaxFF simulations. + +This fix may be used in combination with :doc:`fix efield ` +and will apply the external electric field during charge equilibration, +but there may be only one fix efield instance used and the electric field +must be applied to all atoms in the system. Consequently, `fix efield` must +be used with *group-ID* all and must not be used with the keyword *region*. +Equal-style variables can be used for electric field vector +components without any further settings. Atom-style variables can be used +for spatially-varying electric field vector components, but the resulting +electric potential must be specified as an atom-style variable using +the *potential* keyword for `fix efield`. + +Related commands +"""""""""""""""" + +:doc:`pair_style reaxff `, :doc:`fix qeq/reaxff `, +:doc:`fix acks2/reaxff ` + +Default +""""""" + +maxiter 200 + +---------- + +.. _Rappe3: + +**(Rappe)** Rappe and Goddard III, Journal of Physical Chemistry, 95, +3358-3363 (1991). + +.. _qtpie-Chen: + +**(Chen)** Chen, Jiahao. Theory and applications of fluctuating-charge models. +University of Illinois at Urbana-Champaign, 2009. + +.. _Gergs: + +**(Gergs)** Gergs, Dirkmann and Mussenbrock. +Journal of Applied Physics 123.24 (2018). + +.. _qeq-Aktulga2: + +**(Aktulga)** Aktulga, Fogarty, Pandit, Grama, Parallel Computing, 38, +245-259 (2012). diff --git a/doc/src/fix_recenter.rst b/doc/src/fix_recenter.rst index 9991904b37..60a8a674d0 100644 --- a/doc/src/fix_recenter.rst +++ b/doc/src/fix_recenter.rst @@ -1,8 +1,11 @@ .. index:: fix recenter +.. index:: fix recenter/kk fix recenter command ==================== +Accelerator Variants: *recenter/kk* + Syntax """""" @@ -113,6 +116,12 @@ The scalar and vector values calculated by this fix are "extensive". No parameter of this fix can be used with the *start/stop* keywords of the :doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. +---------- + +.. include:: accel_styles.rst + +---------- + Restrictions """""""""""" diff --git a/doc/src/fix_rheo.rst b/doc/src/fix_rheo.rst index eb88ef0536..ef18d19f82 100644 --- a/doc/src/fix_rheo.rst +++ b/doc/src/fix_rheo.rst @@ -16,21 +16,36 @@ Syntax * kstyle = *quintic* or *RK0* or *RK1* or *RK2* * zmin = minimal number of neighbors for reproducing kernels * zero or more keyword/value pairs may be appended to args -* keyword = *thermal* or *interface/reconstruct* or *surface/detection* or *shift* or *rho/sum* or *density* or *self/mass* or *speed/sound* +* keyword = *thermal* or *interface/reconstruct* or *surface/detection* or *shift* or *rho/sum* or *density* or *speed/sound* .. parsed-literal:: - *thermal* values = none, turns on thermal evolution - *interface/reconstruct* values = none, reconstructs interfaces with solid particles - *surface/detection* values = *sdstyle* *limit* *limit/splash* - *sdstyle* = *coordination* or *divergence* - *limit* = threshold for surface particles - *limit/splash* = threshold for splash particles - *shift* values = none, turns on velocity shifting - *rho/sum* values = none, uses the kernel to compute the density of particles - *self/mass* values = none, a particle uses its own mass in a rho summation - *density* values = *rho01*, ... *rho0N* (density) - *speed/sound* values = *cs0*, ... *csN* (velocity) + *thermal* turns on thermal evolution + values = none + *interface/reconstruct* reconstructs interfaces with solid particles + values = none + *surface/detection* detects free-surfaces with an absence of particles + values = *sdstyle* *limit* *limit/splash* + *sdstyle* = *coordination* or *divergence* + *limit* = threshold for surface particles + *limit/splash* = threshold for splash particles (unitless) + *shift* turns on velocity shifting + values = none + optional args = *exclude/type* or *scale/cross/type* + *exclude/type* values = *types* + *types* = list of types + *scale/cross/type* values = *shiftscale* *cmin* *wmin* + *shiftscale* = fraction of shifting in normal direction to preserve (unitless) + *cmin* = minimum color function value required for scaling (unitless) + *wmin* = minimum local same-type support required for any shifting (unitless) + *rho/sum* density evolution performed by a kernel summation + values = none + optional args = *self/mass* + *self/mass* values = none, a particle uses its own mass in summation + *density* specify equilibrium densities for each atom type + values = *rho01*, ... *rho0N* (density) + *speed/sound* specify speeds of sound for each atom type + values = *cs0*, ... *csN* (velocity) Examples """""""" @@ -39,6 +54,8 @@ Examples fix 1 all rheo 3.0 quintic 0 thermal density 0.1 0.1 speed/sound 10.0 1.0 fix 1 all rheo 3.0 RK1 10 shift surface/detection coordination 40 + fix 1 all rheo 3.0 RK1 10 shift exclude/type 2*4 scale/cross/type 0.05 0.02 0.5 + fix 1 all rheo 3.0 RK1 10 rhosum self/mass Description """"""""""" @@ -46,8 +63,10 @@ Description .. versionadded:: 29Aug2024 Perform time integration for RHEO particles, updating positions, velocities, -and densities. For an overview of other features available in the RHEO package, -see :doc:`the RHEO howto `. +and densities. For a detailed breakdown of the integration timestep and +numerical details, see :ref:`(Palermo) `. For an overview +and list of other features available in the RHEO package, see +:doc:`the RHEO howto `. The type of kernel is specified using *kstyle* and the cutoff is *cut*. Four kernels are currently available. The *quintic* kernel is a standard quintic @@ -70,16 +89,51 @@ and velocity of solid particles are alternatively reconstructed for every fluid-solid interaction to ensure no-slip and pressure-balanced boundaries. This is done by estimating the location of the fluid-solid interface and extrapolating fluid particle properties across the interface to calculate a -temporary apparent density and velocity for a solid particle. +temporary apparent density and velocity for a solid particle. The numerical +details are the same as those described in +:ref:`(Palermo) ` except there is an additional +restriction that the reconstructed solid density cannot be less than the +equilibrium density. This prevents fluid particles from sticking to solid +surfaces. A modified form of Fickian particle shifting can be enabled with the *shift* keyword. This effectively shifts particle positions to generate a -more uniform spatial distribution. Shifting currently does not consider the +more uniform spatial distribution. By default, shifting does not consider the type of a particle and therefore may be inappropriate in systems consisting -of multiple fluid phases. +of multiple atom types representing multiple fluid phases. However, two +optional sub-arguments can follow the *shift* keyword, *exclude/type* and +*scale/cross/type* to adjust shifting at fluid interfaces. -In systems with free surfaces, the *surface/detection* keyword can be used -to classify the location of particles as being within the bulk fluid, on a +The *exclude/type* option lets the user specify a list of atom types which +are not shifted, *types*. A wild-card asterisk can be used in place +of or in conjunction with the *types* argument to toggle shifting for +multiple atom types. This takes the form "\*" or "\*n" or "m\*" +or "m\*n". If :math:`N` is the number of atom types, then an asterisk with +no numeric values means all types from 1 to :math:`N`. A leading asterisk +means all types from 1 to n (inclusive). A trailing asterisk means all types +from m to :math:`N` (inclusive). A middle asterisk means all types from m to n +(inclusive). + +The *scale/cross/type* option is designed to handle interfaces between fluids +made up of different atom types. Similar to the method by +:ref:`(Yang) `, a color function is calculated and used to +estimate a local interfacial normal vector. Shifting along this normal direction +is rescaled by a factor of *scaleshift*, such that a value of *scaleshift* of +zero implies there is no shifting in the normal direction and a value of +*scaleshift* of one implies no change in behavior. This scaling is only applied +to atoms with a color function value greater than *cmin*. To handle scenarios +of a small inclusion of one fluid type (e.g. a single atom) inside another, +the degree of same-type support is calculated + +.. math:: + W_{i,\mathrm{same}} = \sum_{j} W_{ij} \delta_{ij} + +where :math:`\delta_{ij}` is zero if atoms :math:`i` and :math:`j` have different +types but unity otherwise. If :math:`W_{i,\mathrm{same}}` is ever less than the +specified value of *wmin*, shifting is turned off for particle :math:`i` + +In systems with free surfaces (atom-vacuum), the *surface/detection* keyword +can classify the location of particles as being within the bulk fluid, on a free surface, or isolated from other particles in a splash or droplet. Shifting is then disabled in the normal direction away from the free surface to prevent particles from diffusing away. Surface detection can also be used @@ -101,10 +155,9 @@ threshold for this classification is set by the numerical value of By default, RHEO integrates particles' densities using a mass diffusion equation. Alternatively, one can update densities every timestep by performing a kernel summation of the masses of neighboring particles by specifying the *rho/sum* -keyword. - -The *self/mass* keyword modifies the behavior of the density summation in *rho/sum*. -Typically, the density :math:`\rho` of a particle is calculated as the sum over neighbors +keyword. Following this keyword, one may include the optional *self/mass* sub-argument +which modifies the behavior of the density summation. Typically, the density +:math:`\rho` of a particle is calculated as the sum over neighbors .. math:: \rho_i = \sum_{j} W_{ij} M_j @@ -120,7 +173,9 @@ equilibrium density *rho0*. The *speed/sound* keyword is used to specify the speed of sound of each of the N particle types. It must be followed by N numerical values specifying each type's -speed of sound *cs*. +speed of sound *cs*. These values may be ignored if the pressure equation of +state has a non-constant speed of sound, as discussed further in +:doc:`fix rheo/pressure `. Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -163,6 +218,14 @@ Default ---------- +.. _fix_rheo_palermo: + +**(Palermo)** Palermo, Wolf, Clemmer, O'Connor, Phys. Fluids, 36, 113337 (2024). + +.. _fix_rheo_yang: + +**(Yang)** Yang, Rakhsha, Hu, Negrut, J. Comp. Physics, 458, 111079 (2022). + .. _fix_rheo_hu: -**(Hu)** Hu, and Adams J. Comp. Physics, 213, 844-861 (2006). +**(Hu)** Hu, and Adams, J. Comp. Physics, 213, 844-861 (2006). diff --git a/doc/src/fix_rheo_pressure.rst b/doc/src/fix_rheo_pressure.rst index 2a714b298b..7d5d08ddd1 100644 --- a/doc/src/fix_rheo_pressure.rst +++ b/doc/src/fix_rheo_pressure.rst @@ -14,13 +14,16 @@ Syntax * rheo/pressure = style name of this fix command * one or more types and pressure styles must be appended * types = lists of types (see below) -* pstyle = *linear* or *taitwater* or *cubic* +* pstyle = *linear* or *tait/water* or *tait/general* or *cubic* or *ideal/gas* or *background* .. parsed-literal:: *linear* args = none - *taitwater* args = none + *tait/water* args = none + *tait/general* args = exponent :math:`gamma` (unitless) *cubic* args = cubic prefactor :math:`A_3` (pressure/density\^2) + *ideal/gas* args = heat capacity ratio :math:`gamma` (unitless) + *background* args = background pressure :math:`P[b]` (pressure) Examples """""""" @@ -29,6 +32,7 @@ Examples fix 1 all rheo/pressure * linear fix 1 all rheo/pressure 1 linear 2 cubic 10.0 + fix 1 all rheo/pressure * linear * background 0.1 Description """"""""""" @@ -40,13 +44,12 @@ define different equations of state for different atom types. An equation must be specified for every atom type. One first defines the atom *types*. A wild-card asterisk can be used in place -of or in conjunction with the *types* argument to set the coefficients for -multiple pairs of atom types. This takes the form "\*" or "\*n" or "m\*" -or "m\*n". If :math:`N` is the number of atom types, then an asterisk with -no numeric values means all types from 1 to :math:`N`. A leading asterisk -means all types from 1 to n (inclusive). A trailing asterisk means all types -from m to :math:`N` (inclusive). A middle asterisk means all types from m to n -(inclusive). +of or in conjunction with the *types* argument to set values for multiple atom +types. This takes the form "\*" or "\*n" or "m\*" or "m\*n". If :math:`N` is +the number of atom types, then an asterisk with no numeric values means all types +from 1 to :math:`N`. A leading asterisk means all types from 1 to n (inclusive). +A trailing asterisk means all types from m to :math:`N` (inclusive). A middle +asterisk means all types from m to n (inclusive). The *types* definition is followed by the pressure style, *pstyle*. Current options *linear*, *taitwater*, and *cubic*. Style *linear* is a linear @@ -54,7 +57,7 @@ equation of state with a particle pressure :math:`P` calculated as .. math:: - P = c (\rho - \rho_0) + P = c^2 (\rho - \rho_0) where :math:`c` is the speed of sound, :math:`\rho_0` is the equilibrium density, and :math:`\rho` is the current density of a particle. The numerical values of @@ -63,14 +66,39 @@ is a cubic equation of state which has an extra argument :math:`A_3`, .. math:: - P = c ((\rho - \rho_0) + A_3 (\rho - \rho_0)^3) . + P = c^2 ((\rho - \rho_0) + A_3 (\rho - \rho_0)^3) . -Style *taitwater* is Tait's equation of state: +Style *tait/water* is Tait's equation of state: .. math:: P = \frac{c^2 \rho_0}{7} \biggl[\left(\frac{\rho}{\rho_0}\right)^{7} - 1\biggr]. +Style *tait/general* generalizes this equation of state + +.. math:: + + P = \frac{c^2 \rho_0}{\gamma} \biggl[\left(\frac{\rho}{\rho_0}\right)^{\gamma} - 1\biggr]. + +where :math:`\gamma` is an exponent. + +Style *ideal/gas* is the ideal gas equation of state + +.. math:: + + P = (\gamma - 1) \rho e + +where :math:`\gamma` is the heat capacity ratio and :math:`e` is the internal energy of +a particle per unit mass. This style is only compatible with atom style rheo/thermal. +Note that when using this style, the speed of sound is no longer constant such that the +value of :math:`c` specified in :doc:`fix rheo ` is not used. + +The *background* style acts differently than the rest as it +only adds a constant background pressure shift :math:`P[b]` +to all atoms of the designated types. Therefore, this style +must be used in conjunction with another style that specifies +an equation of state. + Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" diff --git a/doc/src/fix_rheo_thermal.rst b/doc/src/fix_rheo_thermal.rst index 214bc1db86..bc0e8dbfd0 100644 --- a/doc/src/fix_rheo_thermal.rst +++ b/doc/src/fix_rheo_thermal.rst @@ -70,13 +70,13 @@ of the energy is used to shift energies. This may be inappropriate in systems with multiple atom types with different specific heats. For each property, one must first define a list of atom types. A wild-card -asterisk can be used in place of or in conjunction with the *types* argument -to set the coefficients for multiple pairs of atom types. This takes the -form "\*" or "\*n" or "m\*" or "m\*n". If :math:`N` is the number of atom -types, then an asterisk with no numeric values means all types from 1 to -:math:`N`. A leading asterisk means all types from 1 to n (inclusive). -A trailing asterisk means all types from m to :math:`N` (inclusive). A -middle asterisk means all types from m to n (inclusive). +asterisk can be used in place of or in conjunction with the *types* argument to +set values for multiple atom types. This takes the form "\*" or "\*n" or "m\*" +or "m\*n". If :math:`N` is the number of atom types, then an asterisk with no +numeric values means all types from 1 to :math:`N`. A leading asterisk means +all types from 1 to n (inclusive). A trailing asterisk means all types from m +to :math:`N` (inclusive). A middle asterisk means all types from m to n +(inclusive). The *types* definition for each property is followed by the style. Currently, the only option is *constant*. Style *constant* simply applies a constant value diff --git a/doc/src/fix_rheo_viscosity.rst b/doc/src/fix_rheo_viscosity.rst index 804059e6f8..4d72d9b209 100644 --- a/doc/src/fix_rheo_viscosity.rst +++ b/doc/src/fix_rheo_viscosity.rst @@ -45,13 +45,12 @@ viscosities for different atom types, but a viscosity must be specified for every atom type. One first defines the atom *types*. A wild-card asterisk can be used in place -of or in conjunction with the *types* argument to set the coefficients for -multiple pairs of atom types. This takes the form "\*" or "\*n" or "m\*" -or "m\*n". If :math:`N` is the number of atom types, then an asterisk with -no numeric values means all types from 1 to :math:`N`. A leading asterisk -means all types from 1 to n (inclusive). A trailing asterisk means all types -from m to :math:`N` (inclusive). A middle asterisk means all types from m to n -(inclusive). +of or in conjunction with the *types* argument to set values for multiple atom +types. This takes the form "\*" or "\*n" or "m\*" or "m\*n". If :math:`N` is +the number of atom types, then an asterisk with no numeric values means all types +from 1 to :math:`N`. A leading asterisk means all types from 1 to n (inclusive). +A trailing asterisk means all types from m to :math:`N` (inclusive). A middle +asterisk means all types from m to n (inclusive). The *types* definition is followed by the viscosity style, *vstyle*. Two options are available, *constant* and *power*. Style *constant* simply diff --git a/doc/src/fix_sph.rst b/doc/src/fix_sph.rst index 4932485b03..09989d2fa0 100644 --- a/doc/src/fix_sph.rst +++ b/doc/src/fix_sph.rst @@ -32,6 +32,12 @@ Hydrodynamics. See `this PDF guide `_ to using SPH in LAMMPS. +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" diff --git a/doc/src/fix_sph_stationary.rst b/doc/src/fix_sph_stationary.rst index 07bedad4c3..57914d22b1 100644 --- a/doc/src/fix_sph_stationary.rst +++ b/doc/src/fix_sph_stationary.rst @@ -32,6 +32,12 @@ space. SPH stands for Smoothed Particle Hydrodynamics. See `this PDF guide `_ to using SPH in LAMMPS. +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" diff --git a/doc/src/fix_spring_self.rst b/doc/src/fix_spring_self.rst index 4453fd61c5..a78e7575f8 100644 --- a/doc/src/fix_spring_self.rst +++ b/doc/src/fix_spring_self.rst @@ -13,7 +13,7 @@ Syntax * ID, group-ID are documented in :doc:`fix ` command * spring/self = style name of this fix command -* K = spring constant (force/distance units) +* K = spring constant (force/distance units), can be a variable (see below) * dir = xyz, xy, xz, yz, x, y, or z (optional, default: xyz) Examples @@ -22,6 +22,7 @@ Examples .. code-block:: LAMMPS fix tether boundary-atoms spring/self 10.0 + fix var all spring/self v_kvar fix zrest move spring/self 10.0 z Description @@ -42,6 +43,22 @@ directions, but it can be limited to the xy-, xz-, yz-plane and the x-, y-, or z-direction, thus restraining the atoms to a line or a plane, respectively. +The force constant *k* can be specified as an equal-style or atom-style +:doc:`variable `. If the value is a variable, it should be specified +as v_name, where name is the variable name. In this case, the variable +will be evaluated each time step, and its value(s) will be used as +force constant for the spring force. + +Equal-style variables can specify formulas with various mathematical +functions and include :doc:`thermo_style ` command +keywords for the simulation box parameters, time step, and elapsed time. +Thus, it is easy to specify a time-dependent force field. + +Atom-style variables can specify the same formulas as equal-style +variables but can also include per-atom values, such as atom +coordinates. Thus, it is easy to specify a spatially-dependent force +field with optional time-dependence as well. + Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -89,7 +106,9 @@ invoked by the :doc:`minimize ` command. Restrictions """""""""""" - none + +The KOKKOS version, *fix spring/self/kk* may only be used with a constant +value of K, not a variable. Related commands """""""""""""""" diff --git a/doc/src/fix_wall_region.rst b/doc/src/fix_wall_region.rst index 466319c12e..67b9b9cdb2 100644 --- a/doc/src/fix_wall_region.rst +++ b/doc/src/fix_wall_region.rst @@ -1,8 +1,11 @@ .. index:: fix wall/region +.. index:: fix wall/region/kk fix wall/region command ======================= +Accelerator Variants: *wall/region/kk* + Syntax """""" @@ -234,6 +237,12 @@ invoked by the :doc:`minimize ` command. minimized), you MUST enable the :doc:`fix_modify ` *energy* option for this fix. +---------- + +.. include:: accel_styles.rst + +---------- + Restrictions """""""""""" none diff --git a/doc/src/group.rst b/doc/src/group.rst index 15ab0c9dc8..a7a29467ff 100644 --- a/doc/src/group.rst +++ b/doc/src/group.rst @@ -162,7 +162,7 @@ potential energy is above the threshold value :math:`-3.0`. compute 1 all pe/atom compute 2 all reduce sum c_1 thermo_style custom step temp pe c_2 - run 0 + run 0 post no variable eatom atom "c_1 > -3.0" group hienergy variable eatom @@ -173,7 +173,7 @@ Note that these lines compute 2 all reduce sum c_1 thermo_style custom step temp pe c_2 - run 0 + run 0 post no are necessary to ensure that the "eatom" variable is current when the group command invokes it. Because the eatom variable computes the diff --git a/doc/src/pair_bpm_spring.rst b/doc/src/pair_bpm_spring.rst index 7dfa9bc12c..068efff577 100644 --- a/doc/src/pair_bpm_spring.rst +++ b/doc/src/pair_bpm_spring.rst @@ -8,7 +8,14 @@ Syntax .. code-block:: LAMMPS - pair_style bpm/spring + pair_style bpm/spring keyword value ... + +* optional keyword = *anharmonic* + + .. parsed-literal:: + + *anharmonic* value = *yes* or *no* + whether forces include the anharmonic term Examples """""""" @@ -17,7 +24,8 @@ Examples pair_style bpm/spring pair_coeff * * 1.0 1.0 1.0 - pair_coeff 1 1 1.0 1.0 1.0 + pair_style bpm/spring anharmonic yes + pair_coeff 1 1 1.0 1.0 1.0 50.0 Description """"""""""" @@ -28,12 +36,16 @@ Style *bpm/spring* computes pairwise forces with the formula .. math:: - F = k (r - r_c) + F = k (r - r_c) + k_a (r - r_c)^3 -where :math:`k` is a stiffness and :math:`r_c` is the cutoff length. -An additional damping force is also applied to interacting -particles. The force is proportional to the difference in the -normal velocity of particles +where :math:`k` is a stiffness, :math:`r_c` is the cutoff +length, and :math:`k_a` is an optional anharmonic cubic prefactor +that can be enabled using the *anharmonic* keyword. The anharmonic +term may be useful in scenarios that need to prevent large particle overlap. + +An additional damping force is also applied to interacting particles. +The force is proportional to the difference in the normal velocity of +particles .. math:: @@ -73,6 +85,12 @@ commands, or by mixing as described below: * :math:`r_c` (distance units) * :math:`\gamma` (force/velocity units) +.. versionadded:: TBD + +Additionally, if *anharmonic* is set to *yes*, a fourth coefficient +must be provided: + +* :math:`k_a` (force/distance\^3 units) ---------- @@ -117,4 +135,5 @@ Related commands Default """"""" -none +The option defaults are *anharmonic* = *no* + diff --git a/doc/src/pair_coul.rst b/doc/src/pair_coul.rst index 17e9358754..77c0e0b18b 100644 --- a/doc/src/pair_coul.rst +++ b/doc/src/pair_coul.rst @@ -180,7 +180,7 @@ coulomb styles in :doc:`hybrid pair styles `. ---------- -.. versionadded:: TBD +.. versionadded:: 19Nov2024 Style *coul/ctip* computes the Coulomb interactions as described in :ref:`Plummer `. It uses the the damped shifted model as in diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index e0f15ccd62..11a460e9ca 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -235,12 +235,15 @@ given by: .. math:: - \eta_n = \alpha (m_{eff}k_n)^{1/2} + \eta_n = \alpha (m_{eff}k_{nd})^{1/2} -For normal contact models based on material parameters, :math:`k_n = 4/3Ea`. This -damping model is not compatible with cohesive normal models such as *JKR* or *DMT*. -The parameter :math:`\alpha` is related to the restitution coefficient *e* -according to: +where :math:`k_{nd}` is an effective harmonic stiffness equal to the ratio of +the normal force to the overlap. For example, :math:`k_{nd} = 4/3Ea` for a +Hertz contact model based on material parameters with :math:`a` being +the contact radius of :math:`\sqrt{\delta R}`. For Hooke, :math:`k_{nd}` +is simply the spring constant or :math:`k_{n}`. This damping model is not +compatible with cohesive normal models such as *JKR* or *DMT*. The parameter +:math:`\alpha` is related to the restitution coefficient *e* according to: .. math:: @@ -251,25 +254,26 @@ of the normal contact model parameters should be between 0 and 1, but no error check is performed on this. The *coeff_restitution* model is useful when a specific normal coefficient of -restitution :math:`e` is required. In these models, the normal coefficient of -restitution :math:`e` is specified as an input. Following the approach of -:ref:`(Brilliantov et al) `, when using the *hooke* normal model, -*coeff_restitution* calculates the damping coefficient as: +restitution :math:`e` is required. It operates much like the *Tsuji* model +but, the normal coefficient of restitution :math:`e` is specified as an input +in place of the usual :math:`\eta_{n0}` value in the normal model. Following +the approach of :ref:`(Brilliantov et al) `, when using the *hooke* +normal model, *coeff_restitution* then calculates the damping coefficient as: .. math:: - \eta_n = \sqrt{\frac{4m_{eff}k_n}{1+\left( \frac{\pi}{\log(e)}\right)^2}} , + \eta_n = \sqrt{\frac{4m_{eff}k_{nd}}{1+\left( \frac{\pi}{\log(e)}\right)^2}} , +where :math:`k_{nd}` is the same stiffness defined in the above *Tsuji* model. For any other normal model, e.g. the *hertz* and *hertz/material* models, the damping coefficient is: .. math:: - \eta_n = -2\sqrt{\frac{5}{6}}\frac{\log(e)}{\sqrt{\pi^2+(\log(e))^2}}(R_{eff} \delta_{ij})^{\frac{1}{4}}\sqrt{\frac{3}{2}k_n m_{eff}} , + \eta_n = -2\sqrt{\frac{5}{6}}\frac{\log(e)}{\sqrt{\pi^2+(\log(e))^2}}\sqrt{\frac{3}{2}k_{nd} m_{eff}} , -where :math:`k_n = \frac{4}{3} E_{eff}` for the *hertz/material* model. Since -*coeff_restitution* accounts for the effective mass, effective radius, and -pairwise overlaps (except when used with the *hooke* normal model) when calculating +Since *coeff_restitution* accounts for the effective mass, effective radius, +and pairwise overlaps (except when used with the *hooke* normal model) when calculating the damping coefficient, it accurately reproduces the specified coefficient of restitution for both monodisperse and polydisperse particle pairs. This damping model is not compatible with cohesive normal models such as *JKR* or *DMT*. diff --git a/doc/src/pair_reaxff.rst b/doc/src/pair_reaxff.rst index 03d53d1ff4..495572dc0e 100644 --- a/doc/src/pair_reaxff.rst +++ b/doc/src/pair_reaxff.rst @@ -20,7 +20,7 @@ Syntax .. parsed-literal:: keyword = *checkqeq* or *lgvdw* or *safezone* or *mincap* or *minhbonds* or *tabulate* or *list/blocking* - *checkqeq* value = *yes* or *no* = whether or not to require qeq/reaxff or acks2/reaxff fix + *checkqeq* value = *yes* or *no* = whether or not to require one of fix qeq/reaxff, fix acks2/reaxff or fix qtpie/reaxff *enobonds* value = *yes* or *no* = whether or not to tally energy of atoms with no bonds *lgvdw* value = *yes* or *no* = whether or not to use a low gradient vdW correction *safezone* = factor used for array allocation @@ -120,20 +120,22 @@ up that process. The ReaxFF parameter files provided were created using a charge equilibration (QEq) model for handling the electrostatic interactions. -Therefore, by default, LAMMPS requires that either the -:doc:`fix qeq/reaxff ` or the -:doc:`fix qeq/shielded ` or :doc:`fix acks2/reaxff ` -command be used with -*pair_style reaxff* when simulating a ReaxFF model, to equilibrate -the charges each timestep. +Therefore, by default, LAMMPS requires that +:doc:`fix qeq/reaxff ` or :doc:`fix qeq/shielded ` +or :doc:`fix acks2/reaxff ` +or :doc:`fix qtpie/reaxff ` +is used with *pair_style reaxff* when simulating a ReaxFF model, +to equilibrate the charges at each timestep. +See the :doc:`fix qeq/reaxff ` or :doc:`fix qeq/shielded ` +or :doc:`fix acks2/reaxff ` +or :doc:`fix qtpie/reaxff ` +command documentation for more details. Using the keyword *checkqeq* with the value *no* turns off the check for the QEq fixes, allowing a simulation to be run without charge equilibration. In this case, the static charges you assign to each atom will be used for computing the electrostatic interactions in -the system. See the :doc:`fix qeq/reaxff ` or -:doc:`fix qeq/shielded ` or :doc:`fix acks2/reaxff ` -command documentation for more details. +the system. Using the optional keyword *lgvdw* with the value *yes* turns on the low-gradient correction of ReaxFF for long-range London Dispersion, @@ -372,8 +374,8 @@ Related commands """""""""""""""" :doc:`pair_coeff `, :doc:`fix qeq/reaxff `, -:doc:`fix acks2/reaxff `, :doc:`fix reaxff/bonds `, -:doc:`fix reaxff/species `, +:doc:`fix acks2/reaxff `, :doc:`fix qtpie/reaxff `, +:doc:`fix reaxff/bonds `, :doc:`fix reaxff/species `, :doc:`compute reaxff/atom ` Default diff --git a/doc/src/pair_sph_heatconduction.rst b/doc/src/pair_sph_heatconduction.rst index 33472b64c7..5510c546d3 100644 --- a/doc/src/pair_sph_heatconduction.rst +++ b/doc/src/pair_sph_heatconduction.rst @@ -30,6 +30,12 @@ The transport model is the diffusion equation for the internal energy. See `this PDF guide `_ to using SPH in LAMMPS. +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + The following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples above. diff --git a/doc/src/pair_sph_idealgas.rst b/doc/src/pair_sph_idealgas.rst index 02949849c4..3bf357e2d2 100644 --- a/doc/src/pair_sph_idealgas.rst +++ b/doc/src/pair_sph_idealgas.rst @@ -36,6 +36,12 @@ particles from interpenetrating :ref:`(Monaghan) `. See `this PDF guide `_ to using SPH in LAMMPS. +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + The following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples above. diff --git a/doc/src/pair_sph_lj.rst b/doc/src/pair_sph_lj.rst index 4dbccc41de..53264c609b 100644 --- a/doc/src/pair_sph_lj.rst +++ b/doc/src/pair_sph_lj.rst @@ -34,6 +34,12 @@ interpenetrating :ref:`(Monaghan) `. See `this PDF guide `_ to using SPH in LAMMPS. +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + The following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples above. diff --git a/doc/src/pair_sph_rhosum.rst b/doc/src/pair_sph_rhosum.rst index ecbff98486..6194bacc09 100644 --- a/doc/src/pair_sph_rhosum.rst +++ b/doc/src/pair_sph_rhosum.rst @@ -29,6 +29,12 @@ SPH particles by kernel function interpolation, every Nstep timesteps. See `this PDF guide `_ to using SPH in LAMMPS. +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + The following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples above. diff --git a/doc/src/pair_sph_taitwater.rst b/doc/src/pair_sph_taitwater.rst index f25b69a969..bb88361f4b 100644 --- a/doc/src/pair_sph_taitwater.rst +++ b/doc/src/pair_sph_taitwater.rst @@ -41,6 +41,12 @@ prevent particles from interpenetrating :ref:`(Monaghan) `. See `this PDF guide `_ to using SPH in LAMMPS. +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + The following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples above. diff --git a/doc/src/pair_sph_taitwater_morris.rst b/doc/src/pair_sph_taitwater_morris.rst index cd8346364b..adef2c09c2 100644 --- a/doc/src/pair_sph_taitwater_morris.rst +++ b/doc/src/pair_sph_taitwater_morris.rst @@ -37,6 +37,12 @@ This pair style also computes laminar viscosity :ref:`(Morris) `. See `this PDF guide `_ to using SPH in LAMMPS. +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + The following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples above. diff --git a/doc/src/region.rst b/doc/src/region.rst index 3a27c4b5ff..94feee6ad4 100644 --- a/doc/src/region.rst +++ b/doc/src/region.rst @@ -3,6 +3,8 @@ region command ============== +Accelerator Variants: *block/kk*, *sphere/kk* + Syntax """""" @@ -74,7 +76,7 @@ Syntax Rx,Ry,Rz = axis of rotation vector *open* value = integer from 1-6 corresponding to face index (see below) -* accelerated styles (with same args) = *block/kk* +* accelerated styles (with same args) = *block/kk, sphere/kk* Examples """""""" @@ -401,9 +403,9 @@ sub-regions can be defined with the *open* keyword. .. note:: - Currently, only *block* style regions are supported by Kokkos. The + Currently, only *block* and *sphere* style regions are supported by KOKKOS. The code using the region (such as a fix or compute) must also be - supported by Kokkos or no acceleration will occur. + supported by KOKKOS or no acceleration will occur. ---------- diff --git a/doc/src/set.rst b/doc/src/set.rst index 6ef654c5a7..6be590e9b6 100644 --- a/doc/src/set.rst +++ b/doc/src/set.rst @@ -516,6 +516,12 @@ Keywords *sph/e*, *sph/cv*, and *sph/rho* set the energy, heat capacity, and density of smoothed particle hydrodynamics (SPH) particles. See `this PDF guide `_ to using SPH in LAMMPS. +.. note:: + + Please note that the SPH PDF guide file has not been updated for + many years and thus does not reflect the current *syntax* of the + SPH package commands. For that please refer to the LAMMPS manual. + Keyword *smd/mass/density* sets the mass of all selected particles, but it is only applicable to the Smooth Mach Dynamics package MACHDYN. It assumes that the particle volume has already been correctly set and diff --git a/doc/utils/check-styles.py b/doc/utils/check-styles.py index 89c8920760..6e4d133cd4 100644 --- a/doc/utils/check-styles.py +++ b/doc/utils/check-styles.py @@ -73,8 +73,6 @@ omp = re.compile("(.+)/omp\\s*$") opt = re.compile("(.+)/opt\\s*$") removed = re.compile("(.*)Deprecated$") -accel_pattern = re.compile(r"^.. include::\s+accel_styles.rst$") - def require_accel_include(path): found = False needs = False @@ -94,6 +92,7 @@ def require_accel_include(path): if kokkos.match(line): needs = True if intel.match(line): needs = True if opt.match(line): needs = True + if path == "src/fix_colvars.rst": needs = False m = cmd_pattern.match(line) if m: if gpu.match(line): needs = True @@ -167,7 +166,9 @@ def check_style(filename, dirname, pattern, styles, name, suffix=False, skip=set # known undocumented aliases we need to skip if c in skip: continue s = c - if suffix: s = add_suffix(styles, c) + if suffix: + s = add_suffix(styles, c) + if s == 'colvars (k)' : continue if not s in matches: if not styles[c]['removed']: print(f"{name} style entry {s} is missing or incomplete in {filename}") @@ -300,7 +301,7 @@ for command_type, entries in index.items(): print("Total number of style index entries:", total_index) skip_angle = ('sdk') -skip_fix = ('python', 'NEIGH_HISTORY/omp','acks2/reax','qeq/reax','reax/c/bonds','reax/c/species', 'pimd') +skip_fix = ('python', 'NEIGH_HISTORY/omp','acks2/reax','qeq/reax','reax/c/bonds','reax/c/species', 'pimd', 'colvars/kk') skip_pair = ('meam/c','lj/sf','reax/c','lj/sdk','lj/sdk/coul/long','lj/sdk/coul/msm') skip_compute = ('pressure/cylinder') diff --git a/doc/utils/requirements.txt b/doc/utils/requirements.txt index 4b9e1a4e48..acf575fe58 100644 --- a/doc/utils/requirements.txt +++ b/doc/utils/requirements.txt @@ -1,4 +1,4 @@ -Sphinx >= 5.3.0, <9.0 +Sphinx >= 5.3.0, <8.2.0 sphinxcontrib-spelling sphinxcontrib-jquery sphinx-design diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 2754e4bb1c..67db18a17d 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -815,6 +815,7 @@ dipoleflag dir Direc dirname +Dirkmann discoverable discretization discretized @@ -976,6 +977,7 @@ elaplong elastance Electroneg electronegative +electronegativities electronegativity electroneutral electroneutrality @@ -1286,12 +1288,14 @@ gcc gcmc gdot GeC +Geesthacht Geier gencode Geocomputing georg Georg Geotechnica +Gergs germain Germann Germano @@ -1304,6 +1308,7 @@ gettimeofday geturl gewald Gezelter +gfile Gflop gfortran ghostneigh @@ -1711,6 +1716,7 @@ Jewett jgissing ji Jiang +Jiahao Jiao jik JIK @@ -2365,6 +2371,7 @@ mui Mukherjee Mulders Müller +Mulliken mult multi multibody @@ -2389,6 +2396,7 @@ Murdick Murtola Murty Muser +Mussenbrock mutexes Muto muVT @@ -2491,6 +2499,7 @@ neel Neel Neelov Negre +Negrut nelem Nelement Nelements @@ -3072,6 +3081,7 @@ qqr qqrd Qsb qtb +qtpie quadratically quadrupolar quadrupole @@ -3107,6 +3117,7 @@ Rafferty rahman Rahman Rajamanickam +Rakhsha Ralf Raman ramped @@ -4219,6 +4230,7 @@ zeeman Zeeman Zemer zenodo +Zentrum Zepeda zflag Zhang diff --git a/examples/bpm/impact/in.bpm.impact.rotational b/examples/bpm/impact/in.bpm.impact.rotational index 698fa22fb8..caca37ddc0 100644 --- a/examples/bpm/impact/in.bpm.impact.rotational +++ b/examples/bpm/impact/in.bpm.impact.rotational @@ -45,7 +45,7 @@ thermo 100 thermo_modify lost ignore lost/bond ignore #dump 1 all custom 100 atomDump id radius x y z c_nbond -dump 2 all local 100 brokenDump f_brkbond[1] f_brkbond[2] f_brkbond[3] -dump_modify 2 header no +#dump 2 all local 100 brokenDump f_brkbond[1] f_brkbond[2] f_brkbond[3] +#dump_modify 2 header no run 7500 diff --git a/examples/bpm/impact/in.bpm.impact.spring b/examples/bpm/impact/in.bpm.impact.spring index 7c5c56841b..d135de6f9e 100644 --- a/examples/bpm/impact/in.bpm.impact.spring +++ b/examples/bpm/impact/in.bpm.impact.spring @@ -47,7 +47,7 @@ thermo 100 thermo_modify lost ignore lost/bond ignore #dump 1 all custom 100 atomDump id x y z c_nbond -dump 2 all local 100 brokenDump f_brkbond[1] f_brkbond[2] f_brkbond[3] -dump_modify 2 header no +#dump 2 all local 100 brokenDump f_brkbond[1] f_brkbond[2] f_brkbond[3] +#dump_modify 2 header no run 7500 diff --git a/examples/bpm/pour/in.bpm.pour b/examples/bpm/pour/in.bpm.pour index d9bb60674a..05c6334b66 100644 --- a/examples/bpm/pour/in.bpm.pour +++ b/examples/bpm/pour/in.bpm.pour @@ -13,9 +13,9 @@ region wall_cyl cylinder z 0.0 0.0 10.0 EDGE EDGE side in region dropzone cylinder z 0.0 0.0 10.0 40.0 50.0 side in pair_style gran/hertz/history 1.0 NULL 0.5 NULL 0.1 1 -bond_style bpm/rotational +bond_style bpm/rotational break no smooth no pair_coeff 1 1 -bond_coeff 1 1.0 0.2 0.01 0.01 2.0 0.4 0.02 0.02 0.2 0.04 0.002 0.002 +bond_coeff 1 1.0 0.2 0.01 0.01 0.0 0.0 0.0 0.0 0.2 0.04 0.002 0.002 compute nbond all nbond/atom compute tbond all reduce sum c_nbond diff --git a/examples/bpm/pour/log.29Aug2024.bpm.pour.g++.4 b/examples/bpm/pour/log.29Aug2024.bpm.pour.g++.4 new file mode 100644 index 0000000000..6c7de49699 --- /dev/null +++ b/examples/bpm/pour/log.29Aug2024.bpm.pour.g++.4 @@ -0,0 +1,1117 @@ +LAMMPS (29 Aug 2024 - Development - patch_29Aug2024-1045-gbcd123c882-modified) +units lj +dimension 3 +boundary m m m +atom_style bpm/sphere +special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0 +newton on off +comm_modify vel yes cutoff 3.3 +region box block -15 15 -15 15 0 60.0 +create_box 1 box bond/types 1 extra/bond/per/atom 15 extra/special/per/atom 50 +Created orthogonal box = (-15 -15 0) to (15 15 60) + 1 by 1 by 4 MPI processor grid + +molecule my_mol "rect.mol" +Read molecule template my_mol: +#Made with create_mol.py + 1 molecules + 0 fragments + 63 atoms with max type 1 + 297 bonds with max type 1 + 0 angles with max type 0 + 0 dihedrals with max type 0 + 0 impropers with max type 0 +region wall_cyl cylinder z 0.0 0.0 10.0 EDGE EDGE side in +region dropzone cylinder z 0.0 0.0 10.0 40.0 50.0 side in + +pair_style gran/hertz/history 1.0 NULL 0.5 NULL 0.1 1 +bond_style bpm/rotational break no smooth no +pair_coeff 1 1 +bond_coeff 1 1.0 0.2 0.01 0.01 0.0 0.0 0.0 0.0 0.2 0.04 0.002 0.002 + +compute nbond all nbond/atom +compute tbond all reduce sum c_nbond +compute bond_ids all property/local batom1 batom2 +compute bond_properties all bond/local dist b1 + +compute_modify thermo_temp dynamic/dof yes + +fix 1 all wall/gran hertz/history 1.0 NULL 0.5 NULL 0.1 1 zplane 0.0 NULL +fix 2 all wall/gran/region hertz/history 1.0 NULL 0.5 NULL 0.1 1 region wall_cyl +fix 3 all gravity 1e-4 vector 0 0 -1 +fix 4 all deposit 40 0 1500 712511343 mol my_mol region dropzone near 2.0 vz -0.05 -0.05 +fix 5 all nve/bpm/sphere + +timestep 0.05 +thermo_style custom step ke pe pxx pyy pzz c_tbond +thermo 100 +#dump 1 all custom 500 atomDump id radius x y z c_nbond mol +#dump 2 all local 500 bondDump c_bond_ids[*] c_bond_properties[*] +#dump_modify 2 colname 1 "id1" colname 2 "id2" colname 3 "r" colname 4 "r0" + +run 100000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- BPM bond style: doi:10.1039/D3SM01373A + +@Article{Clemmer2024, + author = {Clemmer, Joel T. and Monti, Joseph M. and Lechman, Jeremy B.}, + title = {A soft departure from jamming: the compaction of deformable + granular matter under high pressures}, + journal = {Soft Matter}, + year = 2024, + volume = 20, + number = 8, + pages = {1702--1718} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 1.3 + ghost atom cutoff = 3.3 + binsize = 0.65, bins = 47 47 93 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair gran/hertz/history, perpetual + attributes: half, newton on, size, history + pair build: half/size/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 6.515 | 6.515 | 6.515 Mbytes + Step KinEng PotEng Pxx Pyy Pzz c_tbond + 0 -0 0 0 0 0 0 + 100 0.0018406759 0 1.2842737e-05 1.3192741e-05 6.1270887e-06 9.4285714 + 200 0.0026054014 0 -9.5238083e-07 4.4390007e-07 2.276027e-06 9.4285714 + 300 0.0036876407 0 -5.2887136e-06 9.5842023e-06 8.3748245e-07 9.4285714 + 400 0.0060252036 0 2.3582937e-05 1.8361861e-05 1.2642656e-05 9.4285714 + 500 0.0074741299 0 -1.789193e-05 3.8580093e-06 -5.0297601e-06 9.4285714 + 600 0.0078175447 0 3.7847082e-06 1.354617e-05 4.1601826e-06 9.4285714 + 700 0.0075880478 0 3.1036029e-06 1.2109603e-05 4.9483946e-06 9.4285714 + 800 0.0074266449 0 -1.4461829e-05 1.231522e-05 -6.7784934e-06 9.4285714 + 900 0.0075837676 0 1.0006431e-05 1.2964224e-05 8.8504998e-06 9.4285714 + 1000 0.0076126304 0 -6.1355256e-06 1.265311e-05 -2.0447118e-06 9.4285714 + 1100 0.0075597634 0 -5.5773504e-06 1.0844777e-05 -3.2960871e-06 9.4285714 + 1200 0.0075328709 0 7.0782206e-06 1.4050653e-05 8.5204975e-06 9.4285714 + 1300 0.0075974351 0 -4.7397195e-06 8.655509e-06 -3.6821711e-06 9.4285714 + 1400 0.0076539613 0 1.0961299e-06 7.9537258e-06 1.2313306e-06 9.4285714 + 1500 0.0076352731 0 3.6111676e-06 1.3125368e-05 5.3101288e-06 9.4285714 + 1600 0.006006423 0 4.7160229e-06 1.5369588e-05 5.0636281e-06 9.4285714 + 1700 0.0080558565 0 7.8138607e-06 2.5257606e-05 1.2709614e-05 9.4285714 + 1800 0.0087849017 0 4.7097929e-06 1.966114e-05 5.0951652e-07 9.4285714 + 1900 0.0087235023 0 4.7873946e-06 1.8019354e-05 2.2496878e-06 9.4285714 + 2000 0.0087131313 0 6.1634351e-06 2.642983e-05 9.0915635e-06 9.4285714 + 2100 0.008427469 0 5.3623387e-06 2.1009078e-05 5.0556283e-06 9.4285714 + 2200 0.0083345607 0 9.7696141e-06 1.8720631e-05 1.0714556e-05 9.4285714 + 2300 0.0083235047 0 6.1986454e-06 1.9747014e-05 3.9220739e-06 9.4285714 + 2400 0.0082916184 0 5.3395802e-06 1.2889835e-05 6.1613557e-06 9.4285714 + 2500 0.0083652166 0 7.0237704e-06 1.8243183e-05 9.9892969e-06 9.4285714 + 2600 0.0083853283 0 4.1611558e-06 1.8566616e-05 5.5120232e-06 9.4285714 + 2700 0.0083229797 0 4.0701286e-06 1.7705798e-05 8.0682541e-06 9.4285714 + 2800 0.0074176723 0 1.1231842e-05 1.4199577e-05 1.0018115e-05 9.4285714 + 2900 0.0073053678 0 7.9279614e-06 1.2570524e-05 9.674908e-06 9.4285714 + 3000 0.0072005684 0 1.2447603e-05 1.7406357e-05 1.0520344e-05 9.4285714 + 3100 0.0048043541 0 2.89055e-05 2.6265305e-05 1.5509896e-05 9.4285714 + 3200 0.0045874892 0 2.4366752e-05 2.0971746e-05 1.7512311e-05 9.4285714 + 3300 0.00479499 0 6.021348e-06 1.2638208e-05 1.4128913e-05 9.4285714 + 3400 0.0048641255 0 2.1441827e-06 9.1775809e-06 1.2309026e-05 9.4285714 + 3500 0.0048481043 0 3.3249511e-06 1.0477521e-05 1.1741911e-05 9.4285714 + 3600 0.0048035761 0 3.8169024e-06 1.4538411e-05 1.2859132e-05 9.4285714 + 3700 0.0046219191 0 4.4420388e-06 1.0004242e-05 1.4136739e-05 9.4285714 + 3800 0.0046060044 0 7.9607264e-06 9.9082273e-06 1.5708136e-05 9.4285714 + 3900 0.0047638587 0 4.9188998e-06 1.3013033e-05 1.2345204e-05 9.4285714 + 4000 0.0049124607 0 5.6510434e-06 1.0154486e-05 1.8085305e-05 9.4285714 + 4100 0.0047106573 0 8.7061818e-06 1.0447188e-05 1.5757898e-05 9.4285714 + 4200 0.003655308 0 3.3017508e-05 3.8729974e-05 1.4755823e-05 9.4285714 + 4300 0.0032761502 0 2.6270899e-05 2.6447932e-05 2.6415843e-05 9.4285714 + 4400 0.0033725658 0 -4.4338353e-06 -1.8747385e-06 1.268695e-05 9.4285714 + 4500 0.0034856288 0 4.2831181e-06 3.3568464e-06 1.6551102e-05 9.4285714 + 4600 0.0030478282 0 4.6046245e-06 5.3455529e-06 2.3135533e-05 9.4285714 + 4700 0.0031168245 0 -2.3364455e-06 1.744307e-06 6.045743e-06 9.4285714 + 4800 0.0031397141 0 3.3093281e-06 3.9055709e-06 1.3666494e-05 9.4285714 + 4900 0.0030578915 0 6.0355899e-06 8.7494431e-06 1.7257175e-05 9.4285714 + 5000 0.0030452045 0 5.7724451e-06 1.607533e-05 7.5387143e-06 9.4285714 + 5100 0.0030773764 0 7.389729e-06 2.1460966e-05 1.0105443e-05 9.4285714 + 5200 0.0030534891 0 7.3340938e-06 2.0052503e-05 8.0875475e-06 9.4285714 + 5300 0.0030589672 0 6.9554983e-06 1.1388617e-05 1.4195538e-05 9.4285714 + 5400 0.0032172786 0 7.0973329e-06 8.4663931e-06 1.0162238e-05 9.4285714 + 5500 0.0032559194 0 5.3565838e-06 5.1852677e-06 3.4336799e-06 9.4285714 + 5600 0.0031908895 0 4.6499297e-06 2.8091094e-06 1.8285395e-05 9.4285714 + 5700 0.0032642757 0 5.709388e-06 4.8224286e-06 1.6427643e-05 9.4285714 + 5800 0.0030990615 0 8.253728e-06 1.0455638e-06 1.659029e-05 9.4285714 + 5900 0.0026341939 0 8.4035319e-06 2.0755718e-06 4.1054501e-05 9.4285714 + 6000 0.0027655242 0 4.248363e-06 5.4168004e-06 1.9470693e-05 9.4285714 + 6100 0.0026042044 0 3.670903e-06 3.4725767e-06 2.1091794e-05 9.4285714 + 6200 0.0028149804 0 4.721359e-06 -7.2919257e-07 2.3223456e-05 9.4285714 + 6300 0.0027103158 0 -6.2559432e-06 1.1706141e-06 1.7446499e-05 9.4285714 + 6400 0.0034563482 0 1.3811125e-05 3.3362683e-05 3.6303419e-05 9.4285714 + 6500 0.0039685735 0 3.9092295e-06 1.7179813e-05 2.1443394e-05 9.4285714 + 6600 0.0040730075 0 -1.730953e-05 1.0027223e-05 1.9674811e-05 9.4285714 + 6700 0.0040325237 0 1.6130719e-05 2.6480155e-05 3.2469986e-05 9.4285714 + 6800 0.0038015372 0 -9.5613177e-06 7.8642293e-06 1.7383877e-05 9.4285714 + 6900 0.0036803202 0 3.3124034e-06 2.8618724e-05 2.7477522e-05 9.4285714 + 7000 0.0033569979 0 1.6030635e-05 5.6277841e-05 4.9488628e-05 9.4285714 + 7100 0.0032876107 0 -9.0485051e-06 3.6383737e-05 2.8925748e-05 9.4285714 + 7200 0.0033908789 0 1.5638438e-05 2.019761e-05 2.8351014e-05 9.4285714 + 7300 0.0035973172 0 -2.0912017e-06 3.6426312e-05 2.4620627e-05 9.4285714 + 7400 0.0036958962 0 -1.3556805e-05 1.1980602e-06 2.2187656e-05 9.4285714 + 7500 0.0037303282 0 1.019358e-05 5.0014974e-06 2.8719888e-05 9.4285714 + 7600 0.0033149916 0 -2.8759622e-06 1.780461e-05 2.7947196e-05 9.4285714 + 7700 0.0034044865 0 4.9316432e-06 -1.3625503e-06 3.0763568e-05 9.4285714 + 7800 0.0037019149 0 1.1189745e-05 6.7366535e-06 3.4816302e-05 9.4285714 + 7900 0.0040016102 0 8.7286599e-06 6.2720751e-06 3.2812711e-05 9.4285714 + 8000 0.0042965823 0 2.3411444e-05 3.1433134e-06 3.6061346e-05 9.4285714 + 8100 0.0049063753 0 2.7128565e-05 7.8650816e-06 3.9110887e-05 9.4285714 + 8200 0.0053524021 0 2.12025e-05 2.9333857e-07 2.5869295e-05 9.4285714 + 8300 0.0052649528 0 2.829196e-05 7.422076e-06 3.2087371e-05 9.4285714 + 8400 0.0052972403 0 2.7200353e-05 1.1049251e-05 4.289512e-05 9.4285714 + 8500 0.0053915935 0 2.9502963e-05 2.9511501e-06 1.6795137e-05 9.4285714 + 8600 0.0053485581 0 3.3169978e-05 5.1868554e-06 2.9428884e-05 9.4285714 + 8700 0.0053414432 0 2.5011908e-05 -1.1061007e-06 4.2577101e-05 9.4285714 + 8800 0.0054352149 0 2.9763406e-05 -1.4099082e-06 1.8442013e-05 9.4285714 + 8900 0.0054817226 0 3.5732941e-05 1.2926928e-06 2.5512543e-05 9.4285714 + 9000 0.0054728461 0 2.7669858e-05 -1.8779558e-06 2.9398806e-05 9.4285714 + 9100 0.0048751494 0 2.6241102e-05 7.2474601e-07 3.5364646e-05 9.4285714 + 9200 0.0049235623 0 3.1465366e-05 1.8587675e-06 3.6884994e-05 9.4285714 + 9300 0.0049408639 0 3.0163037e-05 4.7937501e-06 2.2278557e-05 9.4285714 + 9400 0.0047722286 0 3.0651769e-05 2.0118875e-06 3.8611885e-05 9.4285714 + 9500 0.004531602 0 3.0764127e-05 3.0365718e-06 4.2239782e-05 9.4285714 + 9600 0.0044175792 0 1.6872324e-05 6.3060434e-06 3.5262607e-05 9.4285714 + 9700 0.0044167782 0 2.1136761e-05 5.018754e-06 4.6071459e-05 9.4285714 + 9800 0.0045545638 0 1.9049762e-05 2.4071844e-08 4.8968051e-05 9.4285714 + 9900 0.0047725617 0 3.8862098e-07 -9.2384823e-07 4.5715335e-05 9.4285714 + 10000 0.0047366384 0 9.9108305e-06 8.6495895e-06 3.7838372e-05 9.4285714 + 10100 0.0045925429 0 1.6501456e-05 9.7018497e-06 5.9118233e-05 9.4285714 + 10200 0.0045829044 0 2.3104532e-05 1.0151386e-05 5.5272533e-05 9.4285714 + 10300 0.0044545165 0 3.6515058e-05 2.122633e-05 4.0700397e-05 9.4285714 + 10400 0.0041971922 0 5.0801964e-05 8.0635585e-06 5.6192525e-05 9.4285714 + 10500 0.0042997418 0 3.4801704e-05 1.6066531e-05 5.1783335e-05 9.4285714 + 10600 0.0045718981 0 1.4755359e-06 1.5228806e-05 5.7583702e-05 9.4285714 + 10700 0.0054414967 0 3.999002e-06 8.4499806e-06 5.5171884e-05 9.4285714 + 10800 0.0056085076 0 2.8633627e-06 6.20922e-05 6.0022516e-05 9.4285714 + 10900 0.0052604017 0 5.877959e-06 7.9455011e-05 6.2139123e-05 9.4285714 + 11000 0.0053082441 0 9.1658522e-06 3.4007617e-05 4.2130515e-05 9.4285714 + 11100 0.0051714794 0 -3.1065631e-06 3.1123238e-05 3.7584396e-05 9.4285714 + 11200 0.0051148957 0 1.7374829e-06 5.4777942e-05 4.1123475e-05 9.4285714 + 11300 0.0053229225 0 7.3698463e-06 2.7007909e-05 4.1734231e-05 9.4285714 + 11400 0.0053758011 0 4.5797202e-06 1.1387222e-05 3.8484692e-05 9.4285714 + 11500 0.0051526414 0 2.9815496e-06 4.0393593e-05 4.3663943e-05 9.4285714 + 11600 0.0050898777 0 9.2528053e-06 4.6193681e-05 3.9414289e-05 9.4285714 + 11700 0.0052834511 0 3.6915941e-06 1.5583056e-05 4.2291524e-05 9.4285714 + 11800 0.0053705655 0 5.0167866e-06 1.7777568e-05 5.2655103e-05 9.4285714 + 11900 0.005038774 0 7.9846192e-06 5.1767433e-05 5.2516309e-05 9.4285714 + 12000 0.0049088358 0 1.3229998e-05 3.8692056e-05 5.4513873e-05 9.4285714 + 12100 0.0047131753 0 1.2151329e-05 1.5646141e-05 5.6905538e-05 9.4285714 + 12200 0.0047612378 0 7.2037098e-06 2.3541684e-05 5.1618792e-05 9.4285714 + 12300 0.0045291737 0 6.104216e-06 4.762899e-05 4.2697528e-05 9.4285714 + 12400 0.0046419825 0 1.61855e-05 4.0805231e-05 6.3641318e-05 9.4285714 + 12500 0.0047344433 0 2.4764754e-06 1.8802629e-05 4.8520155e-05 9.4285714 + 12600 0.0045536662 0 4.4271877e-06 5.2628041e-05 5.2207058e-05 9.4285714 + 12700 0.0041503561 0 1.6357247e-05 6.4219786e-05 7.1176195e-05 9.4285714 + 12800 0.0040016029 0 1.1879602e-05 2.3353654e-05 5.6103249e-05 9.4285714 + 12900 0.004171103 0 9.7673848e-06 1.1371969e-05 5.7698324e-05 9.4285714 + 13000 0.0042998958 0 3.1783984e-06 -1.9279498e-06 4.7565927e-05 9.4285714 + 13100 0.0044022014 0 5.5668891e-06 1.393307e-05 5.0604817e-05 9.4285714 + 13200 0.004355277 0 1.0149489e-05 2.4470591e-05 1.8274094e-05 9.4285714 + 13300 0.00450282 0 1.9030821e-06 1.2227582e-05 4.1965075e-05 9.4285714 + 13400 0.0045092683 0 2.9859349e-06 2.1014692e-05 4.8962971e-05 9.4285714 + 13500 0.0041619694 0 7.7977801e-06 2.9009145e-05 4.2163221e-05 9.4285714 + 13600 0.0036824743 0 1.6182689e-05 2.5555515e-05 5.5692705e-05 9.4285714 + 13700 0.0034193768 0 7.2162797e-06 1.4255376e-05 7.2093853e-05 9.4285714 + 13800 0.0036164855 0 5.3843232e-06 3.9591399e-05 7.0739752e-05 9.4285714 + 13900 0.0038578089 0 1.4313784e-05 1.7378028e-05 4.5907547e-05 9.4285714 + 14000 0.0044935876 0 2.5495441e-05 1.0141425e-05 4.5846529e-05 9.4285714 + 14100 0.0046832712 0 9.1104149e-06 1.8529163e-05 5.4273779e-05 9.4285714 + 14200 0.0044686568 0 1.6934692e-05 1.9350858e-05 6.4902787e-05 9.4285714 + 14300 0.004479708 0 2.3124792e-05 3.6035361e-05 5.6198632e-05 9.4285714 + 14400 0.0046304597 0 1.3511672e-05 5.7385237e-06 4.6890692e-05 9.4285714 + 14500 0.0046647072 0 9.4307276e-06 1.0367238e-05 5.0773988e-05 9.4285714 + 14600 0.004501411 0 1.3956753e-05 2.9384019e-05 6.0183e-05 9.4285714 + 14700 0.004342392 0 2.3511793e-05 2.5269096e-05 6.2266367e-05 9.4285714 + 14800 0.0041117854 0 2.7295081e-05 2.8828313e-05 4.893365e-05 9.4285714 + 14900 0.0038091078 0 2.5620881e-05 3.9233141e-05 6.2321946e-05 9.4285714 + 15000 0.0037323488 0 3.2540975e-05 3.920845e-05 7.1140798e-05 9.4285714 + 15100 0.0039478757 0 4.5419989e-05 1.769503e-05 6.4596906e-05 9.4285714 + 15200 0.00467894 0 1.7092964e-05 1.3667883e-05 6.1202598e-05 9.4285714 + 15300 0.0049365228 0 3.6248068e-05 1.3488388e-05 7.0851898e-05 9.4285714 + 15400 0.004877392 0 4.767314e-05 2.597402e-05 5.529912e-05 9.4285714 + 15500 0.0049573148 0 3.7779933e-05 1.9140403e-05 6.116208e-05 9.4285714 + 15600 0.0049927433 0 2.0560768e-05 1.8251382e-05 6.0988289e-05 9.4285714 + 15700 0.0048703913 0 3.3189927e-05 2.160701e-05 6.4055442e-05 9.4285714 + 15800 0.0046293835 0 6.2944952e-05 1.8863222e-05 7.8874809e-05 9.4285714 + 15900 0.0044328498 0 3.5627449e-05 2.5340865e-05 0.00012458268 9.4285714 + 16000 0.004528302 0 2.8554904e-05 1.8623497e-05 0.00010924446 9.4285714 + 16100 0.0045247349 0 4.4396368e-05 1.8292407e-05 5.7642082e-05 9.4285714 + 16200 0.0045236352 0 3.0387021e-05 1.7555075e-05 5.4919568e-05 9.4285714 + 16300 0.0046088719 0 1.7967935e-05 2.044582e-05 5.0372645e-05 9.4285714 + 16400 0.0043337401 0 5.4381937e-05 1.5302671e-05 6.250539e-05 9.4285714 + 16500 0.0042687717 0 4.8872403e-05 1.2851863e-05 7.5358534e-05 9.4285714 + 16600 0.0039673921 0 7.0455035e-06 3.1074749e-05 5.9409944e-05 9.4285714 + 16700 0.0039819976 0 4.0095618e-05 1.2175972e-05 7.531403e-05 9.4285714 + 16800 0.0040030294 0 1.6647469e-05 2.3871103e-05 7.1682472e-05 9.4285714 + 16900 0.0039453757 0 1.3492698e-05 3.6847549e-05 5.9312859e-05 9.4285714 + 17000 0.0040422183 0 4.3781676e-05 1.908762e-05 6.4893015e-05 9.4285714 + 17100 0.0042850054 0 1.7326749e-05 6.1383562e-05 7.2513048e-05 9.4285714 + 17200 0.0043992382 0 1.7726582e-05 2.6471964e-05 6.6950628e-05 9.4285714 + 17300 0.0044284607 0 2.9699481e-05 3.725102e-05 5.4556058e-05 9.4285714 + 17400 0.0043496384 0 2.0535337e-05 2.9446559e-05 5.6131214e-05 9.4285714 + 17500 0.0041364123 0 7.5867295e-05 2.6195015e-05 6.5687048e-05 9.4285714 + 17600 0.0043163506 0 3.3078885e-05 3.8960282e-05 4.7978657e-05 9.4285714 + 17700 0.0042848109 0 1.8757206e-05 2.1841254e-05 2.503573e-05 9.4285714 + 17800 0.0042690741 0 6.6596452e-05 4.8301029e-05 5.0141884e-05 9.4285714 + 17900 0.0043341866 0 1.1220588e-05 3.1803304e-05 3.2237681e-05 9.4285714 + 18000 0.0035849989 0 3.2191699e-05 2.0254501e-05 3.5691091e-05 9.4285714 + 18100 0.0033744551 0 4.6704352e-05 4.6728596e-05 4.6116181e-05 9.4285714 + 18200 0.003324376 0 1.7222589e-05 2.8972869e-05 4.6692246e-05 9.4285714 + 18300 0.003443015 0 3.3708783e-05 4.0578071e-05 4.1304156e-05 9.4285714 + 18400 0.0034771941 0 1.9020433e-05 2.178227e-05 2.9481174e-05 9.4285714 + 18500 0.0034547284 0 1.0445159e-05 1.6107453e-05 4.0891808e-05 9.4285714 + 18600 0.0033938539 0 2.4916162e-05 4.6313484e-05 3.9147806e-05 9.4285714 + 18700 0.0034939014 0 6.7473151e-06 2.419571e-05 3.4096388e-05 9.4285714 + 18800 0.0035298107 0 9.2615938e-06 2.0435624e-05 4.0027701e-05 9.4285714 + 18900 0.0034538446 0 1.9667538e-05 3.4856249e-05 4.0535345e-05 9.4285714 + 19000 0.0034539236 0 6.0689241e-06 3.1626714e-05 4.2237034e-05 9.4285714 + 19100 0.0035174783 0 1.2903682e-05 2.9365824e-05 4.3881457e-05 9.4285714 + 19200 0.0033445131 0 2.5194723e-05 2.7839851e-05 3.3595747e-05 9.4285714 + 19300 0.0028023352 0 3.9299467e-05 3.421431e-05 3.6811429e-05 9.4285714 + 19400 0.0028277692 0 5.0485519e-05 3.8839168e-05 5.1436409e-05 9.4285714 + 19500 0.0030224983 0 -3.0877104e-06 2.3878903e-05 4.021401e-05 9.4285714 + 19600 0.0029078482 0 1.3861201e-05 2.0586401e-05 4.0794975e-05 9.4285714 + 19700 0.0028081549 0 2.8760708e-05 3.772136e-05 6.7202136e-05 9.4285714 + 19800 0.0026851731 0 1.3931802e-05 2.3860731e-05 4.7388853e-05 9.4285714 + 19900 0.0026975277 0 3.4791835e-05 2.5427085e-05 5.4413472e-05 9.4285714 + 20000 0.0026687893 0 1.6822937e-05 3.9225833e-05 5.6980824e-05 9.4285714 + 20100 0.0026330898 0 1.1031642e-05 2.2844628e-05 4.2104562e-05 9.4285714 + 20200 0.0026679077 0 2.3881008e-05 2.2455096e-05 5.500639e-05 9.4285714 + 20300 0.0026289936 0 9.4168874e-06 1.9492641e-05 2.7106714e-05 9.4285714 + 20400 0.0026753194 0 1.7136984e-05 2.4020701e-05 4.2640066e-05 9.4285714 + 20500 0.0026964569 0 1.6969094e-05 3.0883636e-05 6.0287458e-05 9.4285714 + 20600 0.0026269439 0 9.6646122e-06 2.8909527e-05 4.9243574e-05 9.4285714 + 20700 0.0026201713 0 1.9068877e-05 3.6242157e-05 6.7510183e-05 9.4285714 + 20800 0.0026363656 0 1.3051409e-05 2.8567791e-05 5.9242441e-05 9.4285714 + 20900 0.0026284811 0 1.5045945e-05 2.4293652e-05 4.6903807e-05 9.4285714 + 21000 0.0026298958 0 2.4962817e-05 3.1540396e-05 5.4680405e-05 9.4285714 + 21100 0.002604006 0 2.7578851e-05 3.1380626e-05 5.8067042e-05 9.4285714 + 21200 0.0027927517 0 3.1845898e-05 3.2007867e-05 6.3361581e-05 9.4285714 + 21300 0.0029464871 0 3.197127e-05 2.9654558e-05 4.1022177e-05 9.4285714 + 21400 0.0029674816 0 2.6486572e-05 2.0325981e-05 3.7670362e-05 9.4285714 + 21500 0.002912776 0 3.5552261e-05 2.7419521e-05 5.5226397e-05 9.4285714 + 21600 0.0029212892 0 3.4940001e-05 2.9678696e-05 4.1148653e-05 9.4285714 + 21700 0.0028936576 0 2.8733596e-05 9.7531127e-06 3.7294738e-05 9.4285714 + 21800 0.0028981796 0 3.1017838e-05 2.6444029e-05 5.2821294e-05 9.4285714 + 21900 0.002968785 0 1.9867243e-05 2.2082759e-05 3.9817653e-05 9.4285714 + 22000 0.0029604007 0 1.7428713e-05 8.7224328e-06 3.6979721e-05 9.4285714 + 22100 0.0029222376 0 2.3025841e-05 2.861972e-05 5.2686893e-05 9.4285714 + 22200 0.0029471754 0 1.8465043e-05 2.3715222e-05 4.6426097e-05 9.4285714 + 22300 0.0029823066 0 1.2807162e-05 1.7072316e-05 4.8354244e-05 9.4285714 + 22400 0.0029412962 0 1.6465914e-05 2.347325e-05 5.6917929e-05 9.4285714 + 22500 0.0028655139 0 2.2182748e-05 2.8248379e-05 5.5210541e-05 9.4285714 + 22600 0.0027709226 0 1.8330383e-05 4.5796728e-05 8.9424893e-05 9.4285714 + 22700 0.0028335444 0 1.0794836e-05 1.5620726e-05 7.9801128e-05 9.4285714 + 22800 0.0030243092 0 1.7915933e-05 3.2888516e-05 6.5184341e-05 9.4285714 + 22900 0.0031287494 0 2.0074168e-05 4.0303447e-05 5.396891e-05 9.4285714 + 23000 0.003048872 0 1.075768e-05 2.4000183e-05 6.5941388e-05 9.4285714 + 23100 0.0027838253 0 2.2866446e-05 2.3320252e-05 0.00015840066 9.4285714 + 23200 0.0029031692 0 2.7371814e-05 2.683469e-05 0.00011397097 9.4285714 + 23300 0.0029059127 0 2.2202618e-05 2.8777361e-05 2.1259229e-05 9.4285714 + 23400 0.0029582597 0 2.2700584e-05 1.6282524e-05 7.6538142e-05 9.4285714 + 23500 0.0029521383 0 2.6859026e-05 2.2932873e-05 4.0941095e-05 9.4285714 + 23600 0.0029228867 0 2.4875138e-05 2.7804937e-05 2.8934466e-05 9.4285714 + 23700 0.0028943096 0 1.9718571e-05 1.4993543e-05 7.5133746e-05 9.4285714 + 23800 0.0029111728 0 2.4710626e-05 1.279522e-05 2.6813271e-05 9.4285714 + 23900 0.0029743263 0 2.3073352e-05 2.1115768e-05 4.3417285e-05 9.4285714 + 24000 0.0029355354 0 2.1277639e-05 2.586278e-05 5.5266393e-05 9.4285714 + 24100 0.0029425744 0 3.2172061e-05 4.3513795e-05 4.8639202e-05 9.4285714 + 24200 0.0032349673 0 3.8101771e-05 6.7292467e-05 0.0001190773 9.4285714 + 24300 0.0034153051 0 3.4075318e-05 6.6839985e-05 0.00013642068 9.4285714 + 24400 0.0034558648 0 3.1647065e-05 6.0821256e-05 7.203515e-05 9.4285714 + 24500 0.0035254928 0 3.019316e-05 6.4864759e-05 6.2608529e-05 9.4285714 + 24600 0.0034129673 0 4.465623e-05 3.4278486e-05 4.4270355e-05 9.4285714 + 24700 0.0032950508 0 2.8086189e-05 3.7647476e-05 5.6217167e-05 9.4285714 + 24800 0.0031179674 0 4.376804e-05 6.4837034e-05 6.5034414e-05 9.4285714 + 24900 0.0030993997 0 3.5972925e-05 5.4258179e-05 6.1953835e-05 9.4285714 + 25000 0.003166692 0 1.7121966e-05 5.4520195e-05 3.4905587e-05 9.4285714 + 25100 0.0031258131 0 3.9987619e-05 3.5030482e-05 7.1147285e-05 9.4285714 + 25200 0.0031053643 0 2.158721e-05 3.011678e-05 2.2839818e-05 9.4285714 + 25300 0.0030425175 0 3.5836353e-05 4.8994542e-05 4.2361866e-05 9.4285714 + 25400 0.0030697508 0 3.4532992e-05 3.5394575e-05 7.7662436e-05 9.4285714 + 25500 0.0030265652 0 1.2788641e-05 3.456828e-05 1.8632765e-05 9.4285714 + 25600 0.0027854019 0 3.6160824e-05 4.9326634e-05 3.4903881e-05 9.4285714 + 25700 0.0028863761 0 3.840907e-05 4.1429963e-05 7.011236e-05 9.4285714 + 25800 0.0030375994 0 1.1848635e-05 5.6471514e-05 8.5822151e-05 9.4285714 + 25900 0.0033244234 0 2.6175192e-05 6.2309979e-05 8.3432675e-05 9.4285714 + 26000 0.0032704519 0 2.3370636e-05 6.0648401e-05 5.2281928e-05 9.4285714 + 26100 0.0032524997 0 3.6328695e-05 7.3664927e-05 7.8937335e-05 9.4285714 + 26200 0.0030450557 0 1.8263791e-05 4.6620677e-05 4.5818953e-05 9.4285714 + 26300 0.0030253351 0 2.8774136e-05 5.4096161e-05 5.4812315e-05 9.4285714 + 26400 0.0029455796 0 4.4417916e-05 6.0172227e-05 6.0149768e-05 9.4285714 + 26500 0.0028372947 0 -2.0730073e-06 4.7335202e-05 2.3269097e-05 9.4285714 + 26600 0.0029562991 0 2.070073e-05 5.6966531e-05 9.3985132e-05 9.4285714 + 26700 0.0030361889 0 5.7796002e-06 4.6360033e-05 4.3035903e-05 9.4285714 + 26800 0.0028356261 0 3.3174559e-06 3.5846145e-05 2.2735238e-05 9.4285714 + 26900 0.0027324168 0 4.2939853e-05 5.5772402e-05 0.00010805685 9.4285714 + 27000 0.0027044867 0 7.8667443e-06 3.4991619e-05 4.0072467e-05 9.4285714 + 27100 0.0027499364 0 1.674757e-05 3.6711387e-05 6.6791962e-05 9.4285714 + 27200 0.0029250481 0 2.8155772e-05 4.2978943e-05 9.6473699e-05 9.4285714 + 27300 0.0030158344 0 1.3970557e-05 4.8436237e-05 2.4882137e-05 9.4285714 + 27400 0.0032437671 0 3.667415e-05 6.1044185e-05 9.0533929e-05 9.4285714 + 27500 0.0033991773 0 3.3791012e-05 5.2560616e-05 5.2567118e-05 9.4285714 + 27600 0.0033755497 0 2.6601154e-05 5.4840839e-05 2.4778685e-05 9.4285714 + 27700 0.003341232 0 3.5163367e-05 6.1738936e-05 9.6411856e-05 9.4285714 + 27800 0.0033359321 0 3.6419649e-05 6.0233228e-05 3.6462476e-05 9.4285714 + 27900 0.0031467882 0 4.7281738e-05 7.3131877e-05 6.2080263e-05 9.4285714 + 28000 0.0030039755 0 3.3085654e-05 6.7467092e-05 9.0186854e-05 9.4285714 + 28100 0.0029442723 0 2.7184194e-05 4.3266302e-05 3.7188839e-05 9.4285714 + 28200 0.0030644278 0 3.3666048e-05 4.89101e-05 7.5088002e-05 9.4285714 + 28300 0.0028827994 0 2.6674012e-05 6.5020248e-05 4.7900086e-05 9.4285714 + 28400 0.0026614407 0 3.0428743e-05 7.4752674e-05 6.39704e-05 9.4285714 + 28500 0.0027765045 0 2.8174749e-05 5.096122e-05 5.1669328e-05 9.4285714 + 28600 0.0030152691 0 3.4100234e-05 3.4660136e-05 5.8784917e-06 9.4285714 + 28700 0.0033309751 0 5.9203687e-05 3.8696406e-05 5.458022e-05 9.4285714 + 28800 0.0031989581 0 5.1614625e-05 4.616862e-05 6.6601563e-05 9.4285714 + 28900 0.0031151751 0 5.1465877e-05 4.0566825e-05 6.3555446e-05 9.4285714 + 29000 0.003089706 0 5.8452412e-05 4.0068825e-05 6.6735272e-05 9.4285714 + 29100 0.0030529555 0 3.05057e-05 4.5172836e-05 5.2640638e-05 9.4285714 + 29200 0.0028957496 0 6.647284e-05 3.4622222e-05 8.8937577e-05 9.4285714 + 29300 0.0029588155 0 6.3904028e-05 2.3006184e-05 6.4583725e-05 9.4285714 + 29400 0.0029889131 0 2.2230884e-05 2.3139347e-05 6.0516718e-05 9.4285714 + 29500 0.0029388631 0 7.3295891e-05 4.5005748e-05 7.6512988e-05 9.4285714 + 29600 0.0027740662 0 5.6213825e-05 9.9266881e-06 6.7177696e-05 9.4285714 + 29700 0.0026955305 0 5.2321745e-05 1.9264846e-05 5.7946132e-05 9.4285714 + 29800 0.0027025528 0 9.3402593e-05 2.4652423e-05 6.265756e-05 9.4285714 + 29900 0.0026965517 0 3.5522889e-05 1.3150417e-05 6.8882458e-05 9.4285714 + 30000 0.0027512162 0 6.9903581e-05 5.3093763e-05 7.4585465e-05 9.4285714 + 30100 0.0027653321 0 5.2114669e-05 5.8309368e-05 8.6657127e-05 9.4285714 + 30200 0.0027252764 0 2.5562279e-05 3.6691671e-05 6.1597617e-05 9.4285714 + 30300 0.002762022 0 7.3522187e-05 5.9543426e-05 6.1414296e-05 9.4285714 + 30400 0.0028136672 0 2.3623954e-05 2.8735471e-05 6.4297095e-05 9.4285714 + 30500 0.0027741385 0 3.4073413e-05 2.9952486e-05 5.2135446e-05 9.4285714 + 30600 0.0026774151 0 8.2053427e-05 5.3495062e-05 6.1894922e-05 9.4285714 + 30700 0.002382759 0 8.9621432e-05 4.1140036e-05 5.7369718e-05 9.4285714 + 30800 0.0023050315 0 6.0265486e-05 4.5265038e-05 6.7561108e-05 9.4285714 + 30900 0.0023526912 0 6.2348183e-05 3.8610724e-05 5.6183525e-05 9.4285714 + 31000 0.0024037159 0 3.060603e-05 2.1183409e-05 4.8509428e-05 9.4285714 + 31100 0.0024205525 0 1.4541393e-05 4.0296696e-05 4.0624138e-05 9.4285714 + 31200 0.002479098 0 2.65321e-05 2.5543962e-05 5.2920997e-05 9.4285714 + 31300 0.0024549881 0 2.2457425e-05 2.5817816e-05 2.2618345e-05 9.4285714 + 31400 0.0024174905 0 2.8411091e-05 4.6323026e-05 2.742185e-05 9.4285714 + 31500 0.0023657867 0 4.0418758e-05 2.901528e-05 6.6833788e-05 9.4285714 + 31600 0.0023350557 0 4.8383998e-05 4.293807e-05 6.3690065e-05 9.4285714 + 31700 0.0023542614 0 4.0385719e-05 3.7515825e-05 7.4201666e-05 9.4285714 + 31800 0.0022486008 0 4.1963334e-05 4.4781906e-05 9.0390115e-05 9.4285714 + 31900 0.0021107741 0 4.3303725e-05 8.3980448e-05 9.4747474e-05 9.4285714 + 32000 0.0021409832 0 3.4424967e-05 4.9593168e-05 7.3387421e-05 9.4285714 + 32100 0.002112582 0 4.7321632e-05 5.6435933e-05 7.7418185e-05 9.4285714 + 32200 0.0021181679 0 4.5619956e-05 5.4866557e-05 8.8283379e-05 9.4285714 + 32300 0.0021725432 0 1.9405944e-05 1.7827062e-05 6.5588249e-05 9.4285714 + 32400 0.002155614 0 9.77053e-06 3.906653e-05 6.2711643e-05 9.4285714 + 32500 0.0020913829 0 3.0949029e-05 3.2112083e-05 6.4933997e-05 9.4285714 + 32600 0.0021150191 0 3.3154279e-05 2.2091201e-05 7.2286108e-05 9.4285714 + 32700 0.0021451254 0 1.2183567e-05 3.858576e-05 7.4937884e-05 9.4285714 + 32800 0.0020237876 0 2.5929013e-05 2.374572e-05 5.7803736e-05 9.4285714 + 32900 0.0018430119 0 4.4815874e-05 3.7026303e-05 6.3135552e-05 9.4285714 + 33000 0.001740025 0 5.0536575e-05 3.6552583e-05 8.1299772e-05 9.4285714 + 33100 0.001850659 0 1.7289313e-05 2.4296393e-05 7.4344406e-05 9.4285714 + 33200 0.0019069567 0 2.8383197e-05 2.545114e-05 5.1689294e-05 9.4285714 + 33300 0.0018991164 0 5.3200864e-05 2.9076164e-05 5.8744953e-05 9.4285714 + 33400 0.0019290637 0 3.0752441e-05 2.1315269e-05 5.2584662e-05 9.4285714 + 33500 0.0019834442 0 2.9456567e-05 2.3256078e-05 3.5779121e-05 9.4285714 + 33600 0.0019565002 0 2.5217029e-05 2.2677295e-05 5.6496298e-05 9.4285714 + 33700 0.0018575375 0 2.821171e-05 2.0403816e-05 6.2551543e-05 9.4285714 + 33800 0.0018887919 0 2.6929853e-05 3.3889941e-05 6.0934332e-05 9.4285714 + 33900 0.0019353541 0 8.384222e-06 2.365232e-05 5.2177522e-05 9.4285714 + 34000 0.0018764353 0 2.8643415e-05 1.9409741e-05 5.0765557e-05 9.4285714 + 34100 0.0018406672 0 4.0233194e-05 3.3990188e-05 6.13824e-05 9.4285714 + 34200 0.0018900768 0 1.5846665e-05 2.4168382e-05 4.5389662e-05 9.4285714 + 34300 0.0019127939 0 2.7748442e-05 1.6511224e-05 3.7366391e-05 9.4285714 + 34400 0.0018996098 0 2.9191353e-05 1.896553e-05 5.3487603e-05 9.4285714 + 34500 0.0018825592 0 1.866335e-05 1.9347641e-05 5.1453414e-05 9.4285714 + 34600 0.0018729661 0 3.5547556e-05 3.7123705e-05 6.8952045e-05 9.4285714 + 34700 0.0018508656 0 3.9275598e-05 3.2698716e-05 7.9564684e-05 9.4285714 + 34800 0.0018146827 0 4.8101818e-05 1.9935529e-05 6.2366778e-05 9.4285714 + 34900 0.0017427349 0 5.8017525e-05 2.8778292e-05 8.1697529e-05 9.4285714 + 35000 0.0017514892 0 4.3069739e-05 1.0742082e-05 8.686099e-05 9.4285714 + 35100 0.0016552485 0 2.7806181e-05 6.0559071e-06 6.7244873e-05 9.4285714 + 35200 0.0015221994 0 4.1590056e-05 4.5313058e-05 9.6370975e-05 9.4285714 + 35300 0.0015315851 0 1.9506433e-05 2.4700328e-05 6.6583926e-05 9.4285714 + 35400 0.00158809 0 1.598001e-05 1.362832e-05 5.5220566e-05 9.4285714 + 35500 0.0015914104 0 3.5008197e-05 2.3856051e-05 8.2330414e-05 9.4285714 + 35600 0.001565483 0 2.6440925e-05 1.8005684e-05 6.084583e-05 9.4285714 + 35700 0.001571479 0 2.6919893e-05 2.5244538e-05 5.3346479e-05 9.4285714 + 35800 0.001571655 0 1.1813324e-05 1.8804279e-05 7.1799089e-05 9.4285714 + 35900 0.0015263597 0 1.759118e-05 1.9915199e-05 7.7600393e-05 9.4285714 + 36000 0.0014257136 0 2.1964044e-05 4.327892e-05 8.5323153e-05 9.4285714 + 36100 0.0014617841 0 1.8296209e-05 3.7253493e-05 6.5934539e-05 9.4285714 + 36200 0.0016033662 0 3.1342381e-05 2.1968676e-05 7.7572239e-05 9.4285714 + 36300 0.0016273885 0 1.3210354e-05 3.3088408e-05 7.3360746e-05 9.4285714 + 36400 0.001862934 0 2.262698e-05 4.4262761e-05 7.3251945e-05 9.4285714 + 36500 0.0019494493 0 1.4107819e-05 4.1171949e-05 5.4901336e-05 9.4285714 + 36600 0.0018953399 0 9.8679977e-06 4.3238901e-05 5.971232e-05 9.4285714 + 36700 0.0018409505 0 2.6783499e-05 3.9781779e-05 6.9249517e-05 9.4285714 + 36800 0.0018940846 0 1.3701003e-05 4.258314e-05 3.6849223e-05 9.4285714 + 36900 0.0019312011 0 6.8081135e-06 3.9322831e-05 4.4692334e-05 9.4285714 + 37000 0.0018848971 0 2.2438749e-05 2.6801011e-05 5.7182853e-05 9.4285714 + 37100 0.0018577956 0 2.0496208e-05 3.9862599e-05 5.8943261e-05 9.4285714 + 37200 0.0017303772 0 8.5763161e-06 4.1761678e-05 6.1854001e-05 9.4285714 + 37300 0.0016211525 0 1.5769353e-05 8.6262611e-06 4.6250651e-05 9.4285714 + 37400 0.0015754306 0 3.3022684e-05 3.8367443e-05 7.1019436e-05 9.4285714 + 37500 0.0015691406 0 2.0349234e-05 4.878697e-05 9.2676001e-05 9.4285714 + 37600 0.0015775583 0 1.5362628e-05 2.437589e-05 8.0842202e-05 9.4285714 + 37700 0.0016543347 0 4.335544e-05 3.6582121e-05 8.6191322e-05 9.4285714 + 37800 0.0016215571 0 2.2281322e-05 3.5787505e-05 7.382495e-05 9.4285714 + 37900 0.001570463 0 7.4371724e-06 5.394285e-05 5.178288e-05 9.4285714 + 38000 0.0016528658 0 1.7676821e-05 4.6549715e-05 7.4939039e-05 9.4285714 + 38100 0.0016484889 0 5.8587299e-06 -4.9107938e-07 5.7645076e-05 9.4285714 + 38200 0.0015984293 0 1.0671822e-05 3.4470822e-05 6.3745018e-05 9.4285714 + 38300 0.0015710865 0 4.4087264e-06 6.1197092e-05 6.8343309e-05 9.4285714 + 38400 0.0015793526 0 4.7461657e-06 3.7878407e-05 4.7745506e-05 9.4285714 + 38500 0.00159328 0 2.0539368e-05 3.9420528e-05 6.0739849e-05 9.4285714 + 38600 0.0015628995 0 2.4761081e-06 2.7232923e-05 6.5840751e-05 9.4285714 + 38700 0.0015511665 0 1.3285488e-05 3.1789534e-05 6.571997e-05 9.4285714 + 38800 0.0015047736 0 3.5850221e-05 5.0541292e-05 7.4329443e-05 9.4285714 + 38900 0.0014543448 0 1.9520164e-05 3.3703216e-05 8.2553257e-05 9.4285714 + 39000 0.0014049414 0 2.0563188e-05 4.6282108e-05 9.573642e-05 9.4285714 + 39100 0.0013592667 0 3.7448207e-05 3.3625511e-05 7.9968675e-05 9.4285714 + 39200 0.0014283692 0 1.4613867e-05 1.4624639e-05 7.8329315e-05 9.4285714 + 39300 0.0014980879 0 2.632332e-05 2.5830124e-05 6.7754562e-05 9.4285714 + 39400 0.0015239204 0 5.0406984e-05 2.4875194e-05 5.8899223e-05 9.4285714 + 39500 0.0015827769 0 4.6007741e-05 4.3947253e-05 7.1960056e-05 9.4285714 + 39600 0.0016911946 0 4.2152926e-05 4.2468337e-05 6.8038708e-05 9.4285714 + 39700 0.0017371562 0 5.4576123e-05 3.818247e-05 5.3315764e-05 9.4285714 + 39800 0.0016905784 0 4.8696801e-05 5.1934452e-05 5.9622933e-05 9.4285714 + 39900 0.0016679735 0 4.9650941e-05 6.2065498e-05 6.7678814e-05 9.4285714 + 40000 0.0016804728 0 2.6936787e-05 3.6772729e-05 6.8197494e-05 9.4285714 + 40100 0.0016953728 0 3.2845556e-05 4.8277263e-07 6.2189335e-05 9.4285714 + 40200 0.001661138 0 3.6282353e-05 3.4426968e-05 5.4259796e-05 9.4285714 + 40300 0.0016646181 0 2.7467829e-05 3.1713464e-05 5.914136e-05 9.4285714 + 40400 0.0016460484 0 4.8049299e-05 1.6139482e-05 7.0993842e-05 9.4285714 + 40500 0.001584111 0 4.8662486e-05 4.9496364e-05 6.603143e-05 9.4285714 + 40600 0.0015294729 0 3.802145e-05 3.1760814e-05 6.8855123e-05 9.4285714 + 40700 0.0015176504 0 4.0052592e-05 3.1861316e-05 7.8780588e-05 9.4285714 + 40800 0.0015605556 0 2.7701428e-05 2.423322e-05 6.4544184e-05 9.4285714 + 40900 0.0015536145 0 1.3848621e-05 -6.1126439e-07 6.3259453e-05 9.4285714 + 41000 0.0015310077 0 2.8421261e-05 3.4918038e-05 6.7797468e-05 9.4285714 + 41100 0.0015247209 0 2.0741223e-05 2.9128868e-05 6.029826e-05 9.4285714 + 41200 0.0015059107 0 1.6000876e-05 6.6996209e-06 7.9823117e-05 9.4285714 + 41300 0.0014429996 0 3.3652684e-05 3.1548027e-05 9.5593662e-05 9.4285714 + 41400 0.0014050396 0 6.5381009e-06 4.2947868e-05 9.4137894e-05 9.4285714 + 41500 0.0013865248 0 -6.6520071e-06 2.2003908e-05 7.078385e-05 9.4285714 + 41600 0.0013961027 0 2.2230932e-05 3.7090424e-05 0.00011151118 9.4285714 + 41700 0.0014117253 0 3.0130095e-05 3.6007809e-05 7.8176416e-05 9.4285714 + 41800 0.0013882283 0 1.3288874e-05 2.7573529e-05 5.9201334e-05 9.4285714 + 41900 0.0013753318 0 1.6984699e-05 3.6009436e-05 0.0001074797 9.4285714 + 42000 0.0013513945 0 1.7069135e-05 2.7993012e-05 9.1820042e-05 9.4285714 + 42100 0.0013863187 0 1.1155401e-05 4.553084e-05 9.7133876e-05 9.4285714 + 42200 0.0014933369 0 2.0831243e-05 5.087146e-05 8.784321e-05 9.4285714 + 42300 0.0015198423 0 1.0125181e-05 2.4600202e-05 6.2380383e-05 9.4285714 + 42400 0.0015221508 0 6.7561665e-06 3.6631691e-05 9.2684019e-05 9.4285714 + 42500 0.0015024243 0 2.7000681e-05 3.4307844e-05 6.7639862e-05 9.4285714 + 42600 0.0014893063 0 2.2128038e-05 3.5609622e-05 6.1427776e-05 9.4285714 + 42700 0.001499974 0 1.9097097e-05 3.4788871e-05 9.5912141e-05 9.4285714 + 42800 0.0015009281 0 2.4859527e-05 1.9268361e-05 6.8128418e-05 9.4285714 + 42900 0.0015031569 0 2.5009903e-05 2.9940853e-05 6.0578918e-05 9.4285714 + 43000 0.0014454794 0 4.4527001e-05 3.0364691e-05 7.4964032e-05 9.4285714 + 43100 0.001404434 0 5.8064814e-05 2.0201863e-05 7.0949978e-05 9.4285714 + 43200 0.0014048357 0 3.506138e-05 3.4776921e-05 8.0565203e-05 9.4285714 + 43300 0.0014138482 0 2.3721192e-05 3.2374127e-05 6.6747875e-05 9.4285714 + 43400 0.0013970565 0 1.9946066e-05 3.2758634e-05 7.3460323e-05 9.4285714 + 43500 0.0013955246 0 2.0121957e-05 3.8102995e-05 7.8275265e-05 9.4285714 + 43600 0.0014327655 0 2.6929081e-05 2.1831174e-05 6.7351934e-05 9.4285714 + 43700 0.0015031566 0 2.8744415e-05 3.5314431e-05 6.7917455e-05 9.4285714 + 43800 0.0016007805 0 4.9300269e-05 5.2531669e-05 8.1673155e-05 9.4285714 + 43900 0.0016871966 0 5.7903055e-05 5.8931487e-05 7.2381839e-05 9.4285714 + 44000 0.0017433511 0 4.8323375e-05 5.7285131e-05 3.9859077e-05 9.4285714 + 44100 0.0017096036 0 3.6345002e-05 4.5060973e-05 7.2336376e-05 9.4285714 + 44200 0.0016524366 0 4.6380669e-05 6.3320421e-05 9.6708837e-05 9.4285714 + 44300 0.0016566529 0 3.5636796e-05 7.6368249e-05 7.62331e-05 9.4285714 + 44400 0.0016503804 0 3.9172358e-05 5.6168788e-05 6.4579533e-05 9.4285714 + 44500 0.0016126454 0 4.4554414e-05 6.5633847e-05 8.287072e-05 9.4285714 + 44600 0.0015820491 0 3.3726182e-05 9.0977476e-05 8.5942347e-05 9.4285714 + 44700 0.0012596787 0 4.4895722e-05 5.9163212e-05 6.9212547e-05 9.4285714 + 44800 0.0012150743 0 3.6359427e-05 4.1282726e-05 9.0699449e-05 9.4285714 + 44900 0.0012437188 0 3.4560213e-05 3.0722383e-05 5.9605755e-05 9.4285714 + 45000 0.0012779821 0 4.1282676e-05 5.0767841e-05 5.6288275e-05 9.4285714 + 45100 0.0012623526 0 3.4476846e-05 2.9773147e-05 5.2191912e-05 9.4285714 + 45200 0.0012896009 0 4.114665e-05 2.5284854e-05 6.0876039e-05 9.4285714 + 45300 0.0012853341 0 4.8527658e-05 2.0069362e-05 6.6996527e-05 9.4285714 + 45400 0.0013361987 0 4.5881621e-05 1.8001757e-05 6.7234675e-05 9.4285714 + 45500 0.0013927353 0 4.6101251e-05 1.3981484e-05 6.3492122e-05 9.4285714 + 45600 0.0014198964 0 5.5443094e-05 2.1179803e-05 7.0197111e-05 9.4285714 + 45700 0.0014801207 0 7.0984118e-05 2.8583955e-05 6.7700562e-05 9.4285714 + 45800 0.0015579503 0 6.937725e-05 3.4791292e-05 5.9678447e-05 9.4285714 + 45900 0.0015584674 0 7.0115212e-05 4.7527248e-05 7.0089399e-05 9.4285714 + 46000 0.0014923368 0 6.8734502e-05 3.8294697e-05 5.6331338e-05 9.4285714 + 46100 0.0014912511 0 6.4174805e-05 2.4795442e-05 5.3006287e-05 9.4285714 + 46200 0.0015162305 0 5.9799315e-05 3.9482509e-05 5.9487266e-05 9.4285714 + 46300 0.0015497448 0 4.3674411e-05 3.2802877e-05 4.4985426e-05 9.4285714 + 46400 0.0015709594 0 4.5263389e-05 -5.3960008e-06 4.5841288e-05 9.4285714 + 46500 0.0015640817 0 3.6981938e-05 3.5353885e-05 4.9564163e-05 9.4285714 + 46600 0.001550004 0 3.2474916e-05 4.153406e-05 5.1697382e-05 9.4285714 + 46700 0.0015974044 0 4.6324057e-05 1.1509938e-05 5.9560845e-05 9.4285714 + 46800 0.0016632586 0 4.490488e-05 3.5296632e-05 6.1766018e-05 9.4285714 + 46900 0.0016794098 0 4.4301704e-05 3.7788616e-05 5.967362e-05 9.4285714 + 47000 0.0017580945 0 6.6504945e-05 4.9082566e-05 6.5533612e-05 9.4285714 + 47100 0.0018650028 0 5.145719e-05 5.215116e-05 6.3205077e-05 9.4285714 + 47200 0.0018852648 0 6.3537699e-05 5.5242241e-05 6.4040264e-05 9.4285714 + 47300 0.0018012411 0 6.5902624e-05 6.8503287e-05 5.3278653e-05 9.4285714 + 47400 0.0017813175 0 4.1247872e-05 6.0288292e-05 5.5158267e-05 9.4285714 + 47500 0.0017712621 0 5.8794427e-05 4.8192973e-05 3.9564999e-05 9.4285714 + 47600 0.0014983113 0 6.1528046e-05 3.9452241e-05 5.2456251e-05 9.4285714 + 47700 0.0014210781 0 3.9534178e-05 3.3213677e-05 6.019428e-05 9.4285714 + 47800 0.0015248822 0 5.2526977e-05 4.2140167e-05 2.5787538e-05 9.4285714 + 47900 0.0015982347 0 3.7157073e-05 3.2482618e-05 4.3174668e-05 9.4285714 + 48000 0.0016017453 0 4.7591793e-05 1.5611074e-05 5.2033754e-05 9.4285714 + 48100 0.0015951994 0 6.1254157e-05 3.4175393e-05 4.3900481e-05 9.4285714 + 48200 0.0016917466 0 5.7967266e-05 5.0193865e-05 6.2494378e-05 9.4285714 + 48300 0.0018311545 0 6.8256986e-05 4.865834e-05 7.4005593e-05 9.4285714 + 48400 0.001663258 0 8.4355633e-05 3.2852117e-05 6.6773781e-05 9.4285714 + 48500 0.0015451602 0 5.2025572e-05 3.6312967e-05 7.1034232e-05 9.4285714 + 48600 0.0015809499 0 4.4287332e-05 4.2386687e-05 5.9021201e-05 9.4285714 + 48700 0.0015622921 0 4.0603813e-05 3.1889011e-05 5.419145e-05 9.4285714 + 48800 0.0015452556 0 5.6411924e-05 2.9309787e-05 5.9778868e-05 9.4285714 + 48900 0.0015809688 0 3.4077578e-05 3.7449741e-05 6.5423745e-05 9.4285714 + 49000 0.0015096577 0 3.4921753e-05 4.6405011e-05 5.4124634e-05 9.4285714 + 49100 0.0014794912 0 4.725593e-05 7.3468911e-05 8.4504595e-05 9.4285714 + 49200 0.0013908791 0 6.2532426e-05 7.2584645e-05 7.7992763e-05 9.4285714 + 49300 0.001331941 0 8.3970791e-05 5.6802893e-05 8.5864931e-05 9.4285714 + 49400 0.0012849302 0 3.5098043e-05 4.8687728e-05 8.4263421e-05 9.4285714 + 49500 0.0012703335 0 3.2337991e-05 4.1421455e-05 6.363085e-05 9.4285714 + 49600 0.0013663929 0 3.6702318e-05 3.5124696e-05 6.3491658e-05 9.4285714 + 49700 0.0014410308 0 3.2939374e-06 2.2368693e-05 6.7690366e-05 9.4285714 + 49800 0.0013777961 0 2.1557945e-05 4.0513612e-05 5.3381336e-05 9.4285714 + 49900 0.0013630247 0 3.7282249e-05 4.5943806e-05 6.7644867e-05 9.4285714 + 50000 0.001430246 0 1.7303432e-05 2.193594e-05 6.4740083e-05 9.4285714 + 50100 0.0014144645 0 1.5676512e-05 3.6056804e-05 5.6289473e-05 9.4285714 + 50200 0.001306106 0 3.1980903e-05 4.9952019e-05 7.5959001e-05 9.4285714 + 50300 0.0012870177 0 5.047748e-05 5.174361e-05 7.9115671e-05 9.4285714 + 50400 0.0013497605 0 2.1318565e-05 4.1118782e-05 6.7052102e-05 9.4285714 + 50500 0.0013387412 0 4.1054827e-07 2.106858e-05 6.7436309e-05 9.4285714 + 50600 0.0012977904 0 6.0369247e-05 4.0912426e-05 7.5786036e-05 9.4285714 + 50700 0.0012999712 0 4.9274273e-05 3.3964501e-05 7.3552972e-05 9.4285714 + 50800 0.0012646646 0 3.9810791e-05 4.6119904e-05 7.3660024e-05 9.4285714 + 50900 0.0011627247 0 6.3221966e-05 3.4209985e-05 9.1260766e-05 9.4285714 + 51000 0.0011224602 0 3.1336367e-06 2.1749266e-05 6.8170284e-05 9.4285714 + 51100 0.0011554569 0 6.1200658e-05 4.0983542e-05 8.1784697e-05 9.4285714 + 51200 0.0012349075 0 6.6381864e-05 1.3005243e-05 6.5810605e-05 9.4285714 + 51300 0.0011920985 0 -1.0744783e-05 1.5340585e-05 6.7493128e-05 9.4285714 + 51400 0.0011810026 0 6.6593256e-05 4.128025e-05 0.00010941824 9.4285714 + 51500 0.0011861699 0 5.6645968e-05 2.8472362e-05 6.0511711e-05 9.4285714 + 51600 0.0012240206 0 2.1100894e-05 2.7935451e-05 6.4717546e-05 9.4285714 + 51700 0.0012104336 0 4.3108243e-05 3.976457e-05 0.00011078365 9.4285714 + 51800 0.0011824965 0 2.2269955e-05 4.8730228e-05 7.6176372e-05 9.4285714 + 51900 0.0012107078 0 3.7297559e-05 4.7362219e-05 9.2333509e-05 9.4285714 + 52000 0.0012180885 0 4.8181798e-05 3.4816739e-05 9.0290946e-05 9.4285714 + 52100 0.0011780719 0 2.9276832e-05 3.8790922e-05 8.494653e-05 9.4285714 + 52200 0.001104839 0 4.2588723e-05 4.2660056e-05 0.00011393396 9.4285714 + 52300 0.0011123145 0 4.357949e-05 3.2344034e-05 8.1936335e-05 9.4285714 + 52400 0.001096837 0 3.9790937e-05 3.689969e-05 7.9488273e-05 9.4285714 + 52500 0.0010926267 0 5.6825751e-05 4.8418389e-05 0.00010830164 9.4285714 + 52600 0.001115873 0 4.2951455e-05 4.8266165e-05 6.4679129e-05 9.4285714 + 52700 0.0011356205 0 5.6118811e-05 4.895045e-05 8.6317038e-05 9.4285714 + 52800 0.0011692645 0 6.8584886e-05 5.5147538e-05 9.9726278e-05 9.4285714 + 52900 0.0012447646 0 6.0890903e-05 6.5997e-05 8.0185069e-05 9.4285714 + 53000 0.0013276016 0 7.1286295e-05 6.0747485e-05 7.2816682e-05 9.4285714 + 53100 0.0013039314 0 6.4064864e-05 5.7518336e-05 6.4392756e-05 9.4285714 + 53200 0.0013038847 0 4.578846e-05 5.6853804e-05 8.6664313e-05 9.4285714 + 53300 0.0012978484 0 4.7008936e-05 5.5328947e-05 7.9406136e-05 9.4285714 + 53400 0.0013091507 0 5.2916548e-05 5.1537072e-05 5.1246436e-05 9.4285714 + 53500 0.0013048663 0 4.887723e-05 4.4807236e-05 6.2430874e-05 9.4285714 + 53600 0.0013009978 0 5.0592564e-05 4.0312326e-05 8.2420432e-05 9.4285714 + 53700 0.0013064131 0 5.4132133e-05 4.5874464e-05 4.3559251e-05 9.4285714 + 53800 0.0013021898 0 4.6217323e-05 5.6786468e-05 4.3986938e-05 9.4285714 + 53900 0.0012686345 0 5.0198667e-05 5.44896e-05 7.5000702e-05 9.4285714 + 54000 0.0012358914 0 5.1789644e-05 4.4583221e-05 6.8402278e-05 9.4285714 + 54100 0.0012408854 0 3.5815839e-05 4.2287352e-05 6.1390329e-05 9.4285714 + 54200 0.0011858358 0 3.9605034e-05 5.5897001e-05 6.7527358e-05 9.4285714 + 54300 0.0011203314 0 3.8253997e-05 3.7780626e-05 8.8316894e-05 9.4285714 + 54400 0.0011203585 0 4.0304312e-05 2.4198377e-05 9.2599368e-05 9.4285714 + 54500 0.0011366429 0 4.1873664e-05 4.3368258e-05 6.9453987e-05 9.4285714 + 54600 0.00111231 0 3.9662859e-05 4.6808661e-05 5.3358965e-05 9.4285714 + 54700 0.0011082223 0 3.2408762e-05 4.2094332e-05 7.2484409e-05 9.4285714 + 54800 0.0011153521 0 3.8035279e-05 3.3439276e-05 7.0959277e-05 9.4285714 + 54900 0.0010956569 0 3.1503844e-05 3.0480363e-05 6.0807879e-05 9.4285714 + 55000 0.00094683736 0 6.3050995e-05 9.1381836e-05 7.4157459e-05 9.4285714 + 55100 0.00085738884 0 5.4162732e-05 8.8233107e-05 8.2117059e-05 9.4285714 + 55200 0.00089232191 0 3.4880035e-05 2.4444005e-05 7.8094552e-05 9.4285714 + 55300 0.00090181492 0 5.4646961e-05 5.228637e-05 9.2572385e-05 9.4285714 + 55400 0.00088962176 0 4.5252166e-05 3.8983853e-05 6.5678103e-05 9.4285714 + 55500 0.00088926437 0 3.493832e-05 4.1363235e-05 4.3893091e-05 9.4285714 + 55600 0.00095128085 0 4.8488772e-05 6.8535054e-05 7.2264114e-05 9.4285714 + 55700 0.00089306718 0 3.4508106e-05 3.0466257e-05 4.7314243e-05 9.4285714 + 55800 0.00088062835 0 4.390357e-05 7.2304456e-05 7.9656825e-05 9.4285714 + 55900 0.00086938762 0 3.5602471e-05 3.7012762e-05 8.7961418e-05 9.4285714 + 56000 0.00084791645 0 2.4587324e-05 2.8420646e-05 8.6520499e-05 9.4285714 + 56100 0.00084908574 0 3.5988814e-05 6.8661771e-05 9.6568652e-05 9.4285714 + 56200 0.00084939412 0 6.6449608e-06 1.7476822e-05 6.7373409e-05 9.4285714 + 56300 0.0008363476 0 2.1711741e-05 3.3757906e-05 8.0761495e-05 9.4285714 + 56400 0.000794016 0 4.2003796e-05 5.1055073e-05 8.1681457e-05 9.4285714 + 56500 0.00081851325 0 2.0938565e-05 2.464949e-05 6.0320994e-05 9.4285714 + 56600 0.00082053882 0 3.0131161e-05 3.6296626e-05 5.8942389e-05 9.4285714 + 56700 0.00080313789 0 4.3200674e-05 3.4818428e-05 6.8080951e-05 9.4285714 + 56800 0.00080862283 0 2.7953944e-05 2.593842e-05 5.4136841e-05 9.4285714 + 56900 0.00080797804 0 3.1435725e-05 3.9907489e-05 5.4523729e-05 9.4285714 + 57000 0.00078565112 0 2.4966072e-05 4.2140354e-05 5.5759038e-05 9.4285714 + 57100 0.00079399786 0 2.8332972e-05 3.7413633e-05 4.9670756e-05 9.4285714 + 57200 0.0008000982 0 3.2204636e-05 2.8811183e-05 5.4247256e-05 9.4285714 + 57300 0.00080246804 0 2.2681395e-05 2.6046921e-05 5.7216619e-05 9.4285714 + 57400 0.0007877642 0 3.7947776e-05 3.2523017e-05 5.6053358e-05 9.4285714 + 57500 0.0007860211 0 5.0162479e-05 3.7111684e-05 6.2390457e-05 9.4285714 + 57600 0.00078336961 0 3.864222e-05 2.8991529e-05 5.8708077e-05 9.4285714 + 57700 0.00077615739 0 3.8565434e-05 3.3513366e-05 6.0053094e-05 9.4285714 + 57800 0.00077454851 0 3.0389748e-05 3.7613017e-05 6.8094181e-05 9.4285714 + 57900 0.00077662304 0 2.5354181e-05 3.7021458e-05 6.7217863e-05 9.4285714 + 58000 0.00078848282 0 2.6979538e-05 3.3746385e-05 6.4561227e-05 9.4285714 + 58100 0.00078272979 0 1.9243521e-05 2.8559736e-05 6.6141835e-05 9.4285714 + 58200 0.00076149968 0 1.9535014e-05 3.789365e-05 7.0052408e-05 9.4285714 + 58300 0.000763035 0 2.1948531e-05 3.954981e-05 7.7015059e-05 9.4285714 + 58400 0.00075915903 0 1.7591078e-05 2.2258504e-05 7.479081e-05 9.4285714 + 58500 0.00075047498 0 1.7244716e-05 2.6122357e-05 7.8382408e-05 9.4285714 + 58600 0.00078842521 0 1.4192266e-05 2.9266351e-05 8.0160703e-05 9.4285714 + 58700 0.00080531146 0 7.0538516e-06 1.9408586e-05 7.0982863e-05 9.4285714 + 58800 0.00079267656 0 2.0630753e-05 2.7136197e-05 7.1915268e-05 9.4285714 + 58900 0.00077837989 0 1.9950131e-05 2.9283262e-05 7.0607767e-05 9.4285714 + 59000 0.00076268915 0 1.3125986e-05 3.1633975e-05 7.4519831e-05 9.4285714 + 59100 0.00073382081 0 3.5020254e-05 3.812067e-05 7.734654e-05 9.4285714 + 59200 0.00069392884 0 5.6280181e-05 4.4920134e-05 6.7334762e-05 9.4285714 + 59300 0.00067699597 0 5.1625332e-05 4.3045634e-05 6.6447686e-05 9.4285714 + 59400 0.00070838508 0 3.5638472e-05 2.5879928e-05 6.5337589e-05 9.4285714 + 59500 0.00071669183 0 3.3154936e-05 3.4826944e-05 6.4729304e-05 9.4285714 + 59600 0.00065855704 0 3.0591887e-05 3.0291762e-05 8.449991e-05 9.4285714 + 59700 0.00061671139 0 3.0392665e-05 1.6863434e-05 8.6504376e-05 9.4285714 + 59800 0.00062189217 0 2.1511805e-05 2.5294946e-05 6.538177e-05 9.4285714 + 59900 0.00063915137 0 2.0531708e-05 2.9665491e-05 8.5551338e-05 9.4285714 + 60000 0.00063508738 0 2.0200579e-05 2.4325355e-05 7.9201221e-05 9.4285714 + 60100 0.00063014175 0 1.9049912e-05 2.3743517e-05 5.7107412e-05 9.4285714 + 60200 0.00059917116 0 4.0182823e-05 2.8869854e-05 7.3792291e-05 9.4285714 + 60300 0.00060452978 0 3.8177138e-05 3.6712461e-05 6.2351083e-05 9.4285714 + 60400 0.0006225319 0 1.9134976e-05 2.0279448e-05 5.2938213e-05 9.4285714 + 60500 0.00062247798 0 4.1048478e-05 1.5742494e-05 5.4139494e-05 9.4285714 + 60600 0.00060151604 0 3.3494483e-05 2.8924931e-05 5.0894613e-05 9.4285714 + 60700 0.00057977549 0 2.522371e-05 2.0748979e-05 7.1254971e-05 9.4285714 + 60800 0.00057013518 0 5.0410904e-05 2.7782967e-05 7.0369653e-05 9.4285714 + 60900 0.00056670422 0 3.1423247e-05 3.7439116e-05 5.7451888e-05 9.4285714 + 61000 0.00056267995 0 2.0779974e-05 2.1570651e-05 6.3299948e-05 9.4285714 + 61100 0.00055922981 0 3.3539257e-05 2.4373735e-05 5.5286713e-05 9.4285714 + 61200 0.00057884989 0 2.4218281e-05 3.8059418e-05 4.8780832e-05 9.4285714 + 61300 0.00056896374 0 2.9412667e-05 2.2561342e-05 5.7409361e-05 9.4285714 + 61400 0.00055403782 0 4.0698115e-05 3.0700937e-05 6.1253039e-05 9.4285714 + 61500 0.00054575955 0 3.3523659e-05 4.0547532e-05 5.7254845e-05 9.4285714 + 61600 0.00054534484 0 3.2863762e-05 3.3623403e-05 6.2684641e-05 9.4285714 + 61700 0.00053575752 0 3.1820619e-05 3.7735983e-05 5.6446619e-05 9.4285714 + 61800 0.00050924136 0 3.7547282e-05 2.1982693e-05 6.0035121e-05 9.4285714 + 61900 0.00050726904 0 5.0881295e-05 2.4289477e-05 6.8832171e-05 9.4285714 + 62000 0.00049551903 0 3.6291861e-05 3.7971418e-05 5.9652751e-05 9.4285714 + 62100 0.00047134428 0 4.2864103e-05 2.4080638e-05 6.5786273e-05 9.4285714 + 62200 0.00047770022 0 3.3424968e-05 2.8470305e-05 6.0100111e-05 9.4285714 + 62300 0.00049816357 0 2.1047065e-05 3.066098e-05 5.3128554e-05 9.4285714 + 62400 0.0005160559 0 2.375004e-05 1.6124191e-05 6.0422951e-05 9.4285714 + 62500 0.00049840793 0 2.0983461e-05 1.8649261e-05 6.4444257e-05 9.4285714 + 62600 0.00048816935 0 2.7000406e-05 1.8925499e-05 6.6470797e-05 9.4285714 + 62700 0.00050525774 0 1.5590225e-05 1.7140838e-05 6.3637e-05 9.4285714 + 62800 0.00050739365 0 1.7831244e-05 2.1337053e-05 5.686189e-05 9.4285714 + 62900 0.00049282098 0 3.4169385e-05 2.5655648e-05 6.2726495e-05 9.4285714 + 63000 0.00048572981 0 2.2415807e-05 3.0454484e-05 6.9931482e-05 9.4285714 + 63100 0.00048503597 0 2.0711857e-05 2.4803488e-05 6.0398964e-05 9.4285714 + 63200 0.00048736674 0 2.6715094e-05 2.4610161e-05 5.3406159e-05 9.4285714 + 63300 0.000495187 0 1.7302806e-05 2.9173052e-05 6.0607802e-05 9.4285714 + 63400 0.00049057 0 2.4793546e-05 2.2947412e-05 6.3932937e-05 9.4285714 + 63500 0.00049454241 0 2.7460546e-05 2.295346e-05 6.236266e-05 9.4285714 + 63600 0.00050750934 0 1.8870306e-05 2.1796594e-05 5.1992068e-05 9.4285714 + 63700 0.00050223819 0 2.3354837e-05 2.6101961e-05 5.555683e-05 9.4285714 + 63800 0.00049825851 0 2.4450955e-05 2.5205531e-05 5.9007169e-05 9.4285714 + 63900 0.00050446329 0 2.9018575e-05 1.8664962e-05 5.8195442e-05 9.4285714 + 64000 0.00050123425 0 2.5293131e-05 2.6077288e-05 6.7028726e-05 9.4285714 + 64100 0.00049398396 0 2.0032697e-05 1.9407169e-05 6.3194814e-05 9.4285714 + 64200 0.00048958916 0 2.8155148e-05 1.5927368e-05 6.0175096e-05 9.4285714 + 64300 0.00049084865 0 3.9751773e-05 2.4517852e-05 6.0313962e-05 9.4285714 + 64400 0.00048910757 0 4.4735032e-05 1.5405562e-05 5.3540443e-05 9.4285714 + 64500 0.00048471727 0 3.5535228e-05 1.6802982e-05 6.0214621e-05 9.4285714 + 64600 0.00047890045 0 2.7671036e-05 2.5143761e-05 6.0460667e-05 9.4285714 + 64700 0.00048854524 0 2.4772991e-05 2.2127364e-05 5.2755828e-05 9.4285714 + 64800 0.00049397887 0 2.6143367e-05 3.0107165e-05 5.5672921e-05 9.4285714 + 64900 0.00048156538 0 2.7324051e-05 2.7397209e-05 6.2207257e-05 9.4285714 + 65000 0.00046910086 0 2.3107446e-05 2.1342305e-05 5.9462521e-05 9.4285714 + 65100 0.00047018569 0 2.8373353e-05 2.5607705e-05 6.0074709e-05 9.4285714 + 65200 0.00046171565 0 3.4532098e-05 2.6330991e-05 6.3506249e-05 9.4285714 + 65300 0.00045355106 0 4.0659619e-05 3.9365784e-05 6.5750756e-05 9.4285714 + 65400 0.0004513268 0 3.8718945e-05 3.7824685e-05 6.3873217e-05 9.4285714 + 65500 0.00045328094 0 3.3417102e-05 2.8215995e-05 6.5933345e-05 9.4285714 + 65600 0.00045594277 0 2.5411307e-05 3.5413971e-05 6.7042626e-05 9.4285714 + 65700 0.00044893271 0 2.7761122e-05 3.0781129e-05 6.674899e-05 9.4285714 + 65800 0.00043673665 0 3.137767e-05 2.7133886e-05 6.9153693e-05 9.4285714 + 65900 0.00044417684 0 3.2415712e-05 3.0361507e-05 6.9191067e-05 9.4285714 + 66000 0.00043734522 0 4.0325917e-05 3.1024803e-05 6.6938523e-05 9.4285714 + 66100 0.00042196243 0 3.2753785e-05 3.2032259e-05 7.3193885e-05 9.4285714 + 66200 0.00041973452 0 4.0164148e-05 2.8338884e-05 8.1948511e-05 9.4285714 + 66300 0.00041436701 0 6.2963257e-05 2.9034625e-05 7.9302556e-05 9.4285714 + 66400 0.0003941513 0 4.5872689e-05 3.7807303e-05 8.1728593e-05 9.4285714 + 66500 0.0003836529 0 5.6445215e-05 4.2270969e-05 8.2747199e-05 9.4285714 + 66600 0.00038465213 0 5.3263887e-05 3.9719425e-05 7.9149461e-05 9.4285714 + 66700 0.00038894992 0 4.20255e-05 4.566467e-05 7.8879149e-05 9.4285714 + 66800 0.00036070492 0 5.566745e-05 5.7759724e-05 8.9987504e-05 9.4285714 + 66900 0.00034297457 0 5.3259574e-05 6.8869365e-05 9.177822e-05 9.4285714 + 67000 0.00035071188 0 4.8313416e-05 6.0559453e-05 8.5500562e-05 9.4285714 + 67100 0.00035503575 0 3.097501e-05 4.3472679e-05 7.9626917e-05 9.4285714 + 67200 0.00034128431 0 3.4720585e-05 4.816892e-05 7.8514087e-05 9.4285714 + 67300 0.00031836785 0 4.5282712e-05 5.2691067e-05 7.7424489e-05 9.4285714 + 67400 0.00030663661 0 3.5113049e-05 4.9635601e-05 7.4666973e-05 9.4285714 + 67500 0.00029481791 0 3.9138377e-05 5.1053527e-05 7.2565942e-05 9.4285714 + 67600 0.00028910904 0 4.9257505e-05 5.6455991e-05 7.5528344e-05 9.4285714 + 67700 0.00027183249 0 5.505267e-05 5.4725918e-05 7.5520601e-05 9.4285714 + 67800 0.00025778954 0 5.5325298e-05 5.581733e-05 7.8035058e-05 9.4285714 + 67900 0.00024581296 0 4.8759439e-05 6.1088154e-05 8.1274762e-05 9.4285714 + 68000 0.00022556887 0 5.1728122e-05 5.3916307e-05 8.9568848e-05 9.4285714 + 68100 0.00022448115 0 5.0575203e-05 5.8938015e-05 8.6660799e-05 9.4285714 + 68200 0.0002316233 0 4.4277765e-05 5.6650457e-05 8.0759893e-05 9.4285714 + 68300 0.00022986293 0 4.3595152e-05 5.2689036e-05 8.3692076e-05 9.4285714 + 68400 0.00021976837 0 4.2832179e-05 5.7513019e-05 8.1198068e-05 9.4285714 + 68500 0.00018897003 0 4.677852e-05 5.1979086e-05 8.5959875e-05 9.4285714 + 68600 0.00014377952 0 4.7381465e-05 5.6949726e-05 9.151628e-05 9.4285714 + 68700 0.00014928898 0 4.2459064e-05 6.2648099e-05 8.1113559e-05 9.4285714 + 68800 0.00013847203 0 4.4769387e-05 4.5920285e-05 7.7943736e-05 9.4285714 + 68900 0.0001453686 0 4.7948908e-05 5.259867e-05 7.4055916e-05 9.4285714 + 69000 0.00014381237 0 4.3553764e-05 4.756036e-05 6.5598289e-05 9.4285714 + 69100 0.00013007965 0 4.6134105e-05 4.7607098e-05 6.1441724e-05 9.4285714 + 69200 0.00011982704 0 5.0774605e-05 5.3204128e-05 6.2701345e-05 9.4285714 + 69300 0.0001073918 0 5.1263139e-05 4.4305203e-05 6.3369506e-05 9.4285714 + 69400 0.00010300942 0 5.312369e-05 4.9407563e-05 6.2971639e-05 9.4285714 + 69500 0.00010143661 0 4.9484624e-05 4.0749275e-05 5.8373181e-05 9.4285714 + 69600 9.5766951e-05 0 5.3182235e-05 3.9451127e-05 5.2956094e-05 9.4285714 + 69700 9.405894e-05 0 5.0889773e-05 5.2300193e-05 5.180931e-05 9.4285714 + 69800 9.155205e-05 0 4.5530419e-05 4.4750489e-05 4.7063405e-05 9.4285714 + 69900 8.3575059e-05 0 5.1875899e-05 4.5141456e-05 4.4792127e-05 9.4285714 + 70000 8.0849168e-05 0 5.0510582e-05 4.2408643e-05 4.3239916e-05 9.4285714 + 70100 7.9858942e-05 0 4.8451567e-05 3.8982149e-05 4.1476956e-05 9.4285714 + 70200 7.8446618e-05 0 4.9559105e-05 4.6017946e-05 3.5209068e-05 9.4285714 + 70300 7.6228967e-05 0 4.7433543e-05 4.3268345e-05 2.7621423e-05 9.4285714 + 70400 7.5535961e-05 0 4.7847776e-05 4.0413247e-05 2.6006838e-05 9.4285714 + 70500 7.2914033e-05 0 4.3404817e-05 3.9523798e-05 2.4762482e-05 9.4285714 + 70600 7.001623e-05 0 3.9124987e-05 3.5339131e-05 2.3946554e-05 9.4285714 + 70700 6.9345352e-05 0 3.8804511e-05 3.6473219e-05 2.3502972e-05 9.4285714 + 70800 6.7381899e-05 0 3.5778441e-05 3.276663e-05 2.1027252e-05 9.4285714 + 70900 6.673365e-05 0 3.5855151e-05 2.8077966e-05 2.0184825e-05 9.4285714 + 71000 6.4393975e-05 0 3.3009782e-05 2.7699989e-05 1.8237771e-05 9.4285714 + 71100 6.1555918e-05 0 2.8624835e-05 2.576401e-05 1.8960569e-05 9.4285714 + 71200 6.1429325e-05 0 3.0464999e-05 2.6188175e-05 2.0334819e-05 9.4285714 + 71300 5.8364826e-05 0 2.8291632e-05 2.3606625e-05 1.9246418e-05 9.4285714 + 71400 5.3846239e-05 0 2.6414313e-05 2.1759211e-05 2.1300148e-05 9.4285714 + 71500 5.3386791e-05 0 2.5737816e-05 2.6710408e-05 2.1834767e-05 9.4285714 + 71600 5.2112201e-05 0 2.1997188e-05 2.1884657e-05 1.9589075e-05 9.4285714 + 71700 4.916249e-05 0 2.2918375e-05 2.1297948e-05 2.0672761e-05 9.4285714 + 71800 4.8669983e-05 0 2.4730445e-05 2.4511543e-05 2.0440236e-05 9.4285714 + 71900 4.7395793e-05 0 2.3453111e-05 2.0652588e-05 1.9998911e-05 9.4285714 + 72000 4.4713447e-05 0 2.2119599e-05 2.2138141e-05 2.2079011e-05 9.4285714 + 72100 4.3022032e-05 0 1.8471121e-05 2.4818397e-05 1.9810872e-05 9.4285714 + 72200 4.1819469e-05 0 1.7361261e-05 2.3170878e-05 1.7396464e-05 9.4285714 + 72300 4.1569642e-05 0 1.7188696e-05 2.2677614e-05 1.7473342e-05 9.4285714 + 72400 4.1455667e-05 0 1.5934592e-05 1.8779856e-05 1.6337526e-05 9.4285714 + 72500 3.8515638e-05 0 1.7547874e-05 1.716531e-05 1.6885439e-05 9.4285714 + 72600 3.7079221e-05 0 1.6548905e-05 1.8511957e-05 1.6952109e-05 9.4285714 + 72700 3.7528089e-05 0 1.4246302e-05 1.5867495e-05 1.6161381e-05 9.4285714 + 72800 3.6049364e-05 0 1.8833776e-05 1.7179469e-05 1.5973306e-05 9.4285714 + 72900 3.4591506e-05 0 1.9956377e-05 1.8701776e-05 1.3709089e-05 9.4285714 + 73000 3.4970032e-05 0 1.8075313e-05 1.4532012e-05 1.2838392e-05 9.4285714 + 73100 3.327333e-05 0 2.0377402e-05 1.4746802e-05 1.3174848e-05 9.4285714 + 73200 3.0281514e-05 0 2.1176452e-05 1.6279637e-05 1.2969012e-05 9.4285714 + 73300 2.879307e-05 0 2.0115434e-05 1.8148456e-05 1.4477019e-05 9.4285714 + 73400 2.8447528e-05 0 1.9106581e-05 1.8624285e-05 1.6277835e-05 9.4285714 + 73500 2.8615374e-05 0 1.6724941e-05 1.6782518e-05 1.6898605e-05 9.4285714 + 73600 2.9026224e-05 0 1.6437383e-05 1.6260007e-05 1.6848848e-05 9.4285714 + 73700 2.7975895e-05 0 1.5671211e-05 1.7419391e-05 1.6924342e-05 9.4285714 + 73800 2.7350029e-05 0 1.4519367e-05 1.8731887e-05 1.8856029e-05 9.4285714 + 73900 2.7431161e-05 0 1.490756e-05 1.7069783e-05 1.9473746e-05 9.4285714 + 74000 2.5856587e-05 0 1.556091e-05 1.6738345e-05 1.988592e-05 9.4285714 + 74100 2.4029451e-05 0 1.8493847e-05 1.972869e-05 2.1803916e-05 9.4285714 + 74200 2.3269039e-05 0 2.0487994e-05 1.9033504e-05 2.2472082e-05 9.4285714 + 74300 2.3162218e-05 0 1.9277527e-05 1.697003e-05 2.2756976e-05 9.4285714 + 74400 2.3049943e-05 0 1.846898e-05 1.7752958e-05 2.4781843e-05 9.4285714 + 74500 2.2761406e-05 0 1.7509804e-05 1.8174651e-05 2.6663831e-05 9.4285714 + 74600 2.2252277e-05 0 1.6713289e-05 1.9523723e-05 2.7825587e-05 9.4285714 + 74700 2.1705652e-05 0 1.6875501e-05 2.1777677e-05 2.7519983e-05 9.4285714 + 74800 2.0873837e-05 0 1.7085358e-05 2.3229265e-05 2.6672146e-05 9.4285714 + 74900 1.9872481e-05 0 1.7027531e-05 2.1292304e-05 2.6803e-05 9.4285714 + 75000 1.9762066e-05 0 1.6216075e-05 1.8536763e-05 2.6939852e-05 9.4285714 + 75100 2.0098758e-05 0 1.6400035e-05 1.9019963e-05 2.6158196e-05 9.4285714 + 75200 1.9426569e-05 0 1.780149e-05 2.0405573e-05 2.505744e-05 9.4285714 + 75300 1.917251e-05 0 1.7713161e-05 2.1994264e-05 2.4545388e-05 9.4285714 + 75400 1.8766917e-05 0 1.7379831e-05 2.1971358e-05 2.5001618e-05 9.4285714 + 75500 1.7887889e-05 0 1.786967e-05 2.1939442e-05 2.5400409e-05 9.4285714 + 75600 1.8303322e-05 0 1.6977953e-05 2.3193804e-05 2.5400433e-05 9.4285714 + 75700 1.9082517e-05 0 1.7229534e-05 2.1958941e-05 2.5230497e-05 9.4285714 + 75800 1.9485569e-05 0 1.7619186e-05 1.9983256e-05 2.4308542e-05 9.4285714 + 75900 1.8706506e-05 0 1.7152735e-05 2.0208405e-05 2.4370657e-05 9.4285714 + 76000 1.7796264e-05 0 1.6180567e-05 1.9162625e-05 2.4508438e-05 9.4285714 + 76100 1.7704752e-05 0 1.7147485e-05 1.8780835e-05 2.411906e-05 9.4285714 + 76200 1.7337087e-05 0 1.7066664e-05 1.9037755e-05 2.4885279e-05 9.4285714 + 76300 1.7006364e-05 0 1.5657859e-05 1.9993234e-05 2.5187476e-05 9.4285714 + 76400 1.7669688e-05 0 1.7303569e-05 2.1460675e-05 2.4359878e-05 9.4285714 + 76500 1.8256507e-05 0 1.7721232e-05 2.0044166e-05 2.355598e-05 9.4285714 + 76600 1.7751511e-05 0 1.7307193e-05 2.0330753e-05 2.3681577e-05 9.4285714 + 76700 1.7640861e-05 0 1.7470398e-05 2.0464662e-05 2.4300443e-05 9.4285714 + 76800 1.8237528e-05 0 1.5306195e-05 1.7485864e-05 2.3821137e-05 9.4285714 + 76900 1.8559968e-05 0 1.4312772e-05 1.7346668e-05 2.2561587e-05 9.4285714 + 77000 1.8183149e-05 0 1.5262962e-05 1.7837843e-05 2.1884382e-05 9.4285714 + 77100 1.7069042e-05 0 1.4601499e-05 1.829281e-05 2.2565978e-05 9.4285714 + 77200 1.6390254e-05 0 1.4955984e-05 1.9369399e-05 2.3709371e-05 9.4285714 + 77300 1.6643218e-05 0 1.5638971e-05 1.8295309e-05 2.5074229e-05 9.4285714 + 77400 1.6518811e-05 0 1.5400737e-05 1.7604452e-05 2.6591759e-05 9.4285714 + 77500 1.6152548e-05 0 1.6583097e-05 1.7792754e-05 2.8143492e-05 9.4285714 + 77600 1.7459415e-05 0 1.623967e-05 1.6730063e-05 2.8067496e-05 9.4285714 + 77700 1.818602e-05 0 1.5762413e-05 1.7153058e-05 2.7587967e-05 9.4285714 + 77800 1.7735287e-05 0 1.7191859e-05 1.8830012e-05 2.8173949e-05 9.4285714 + 77900 1.768324e-05 0 1.7202961e-05 1.9238865e-05 2.9209791e-05 9.4285714 + 78000 1.7995393e-05 0 1.7039881e-05 2.035006e-05 3.020306e-05 9.4285714 + 78100 1.7914043e-05 0 1.7891516e-05 2.2362325e-05 3.0800062e-05 9.4285714 + 78200 1.7544427e-05 0 1.7535007e-05 2.2936844e-05 3.0476136e-05 9.4285714 + 78300 1.7882361e-05 0 1.6816555e-05 2.2842657e-05 3.1506572e-05 9.4285714 + 78400 1.7797947e-05 0 1.7345526e-05 2.3528118e-05 3.3510861e-05 9.4285714 + 78500 1.6889982e-05 0 1.746546e-05 2.467755e-05 3.4176651e-05 9.4285714 + 78600 1.6527531e-05 0 1.7449464e-05 2.4381906e-05 3.4332003e-05 9.4285714 + 78700 1.7017292e-05 0 1.7247297e-05 2.2114433e-05 3.3981671e-05 9.4285714 + 78800 1.7671938e-05 0 1.6820676e-05 1.9968128e-05 3.332308e-05 9.4285714 + 78900 1.7924346e-05 0 1.7369249e-05 1.8663831e-05 3.2896227e-05 9.4285714 + 79000 1.7423145e-05 0 1.7927282e-05 1.8294211e-05 3.2984144e-05 9.4285714 + 79100 1.6963265e-05 0 1.7470957e-05 1.922162e-05 3.3182581e-05 9.4285714 + 79200 1.6505832e-05 0 1.7400086e-05 1.9975905e-05 3.3106108e-05 9.4285714 + 79300 1.5726279e-05 0 1.8791334e-05 2.1322452e-05 3.4461225e-05 9.4285714 + 79400 1.5594021e-05 0 2.0887345e-05 2.2687613e-05 3.4362179e-05 9.4285714 + 79500 1.5907072e-05 0 2.0890931e-05 2.2270309e-05 3.2242966e-05 9.4285714 + 79600 1.6091341e-05 0 1.9023313e-05 2.2134246e-05 3.1080998e-05 9.4285714 + 79700 1.6609821e-05 0 1.8293936e-05 2.2380186e-05 2.8726937e-05 9.4285714 + 79800 1.6569905e-05 0 1.8301928e-05 2.165699e-05 2.6991613e-05 9.4285714 + 79900 1.6068388e-05 0 1.8467561e-05 2.1476835e-05 2.7925917e-05 9.4285714 + 80000 1.5910921e-05 0 1.8920566e-05 2.0939671e-05 2.7480548e-05 9.4285714 + 80100 1.5734317e-05 0 1.9339594e-05 2.1057886e-05 2.7047234e-05 9.4285714 + 80200 1.4926813e-05 0 1.9878949e-05 2.1090643e-05 2.8171816e-05 9.4285714 + 80300 1.3783112e-05 0 2.0246239e-05 1.9792868e-05 2.8848561e-05 9.4285714 + 80400 1.3610254e-05 0 1.9985684e-05 2.0000467e-05 2.8884255e-05 9.4285714 + 80500 1.3989108e-05 0 1.9501011e-05 2.0577095e-05 2.7781763e-05 9.4285714 + 80600 1.4186107e-05 0 1.9725118e-05 1.9615411e-05 2.6259747e-05 9.4285714 + 80700 1.4068548e-05 0 2.0361245e-05 2.0088354e-05 2.5466152e-05 9.4285714 + 80800 1.3605892e-05 0 2.2025912e-05 2.0956019e-05 2.5715033e-05 9.4285714 + 80900 1.3474842e-05 0 2.3145996e-05 2.1570348e-05 2.7589345e-05 9.4285714 + 81000 1.2797245e-05 0 2.1131492e-05 2.2391141e-05 2.8857371e-05 9.4285714 + 81100 1.2111671e-05 0 1.9570648e-05 2.297832e-05 2.9547386e-05 9.4285714 + 81200 1.2503716e-05 0 1.8975163e-05 2.2542497e-05 2.9590019e-05 9.4285714 + 81300 1.2859283e-05 0 1.6903598e-05 2.1579533e-05 2.8467761e-05 9.4285714 + 81400 1.2693841e-05 0 1.67322e-05 2.2270293e-05 2.7700769e-05 9.4285714 + 81500 1.2453307e-05 0 1.759208e-05 2.2414998e-05 2.6982571e-05 9.4285714 + 81600 1.2452531e-05 0 1.8556552e-05 2.2274468e-05 2.6461568e-05 9.4285714 + 81700 1.2446125e-05 0 1.9644544e-05 2.2358194e-05 2.6749742e-05 9.4285714 + 81800 1.2163166e-05 0 1.9357956e-05 2.2110998e-05 2.7638592e-05 9.4285714 + 81900 1.2465826e-05 0 1.8922778e-05 2.189582e-05 2.7698008e-05 9.4285714 + 82000 1.2925088e-05 0 1.906024e-05 2.1498087e-05 2.7024139e-05 9.4285714 + 82100 1.2728333e-05 0 1.9243525e-05 2.0579426e-05 2.6809164e-05 9.4285714 + 82200 1.2335093e-05 0 1.963964e-05 2.0312761e-05 2.759139e-05 9.4285714 + 82300 1.1933277e-05 0 2.0641527e-05 2.0428921e-05 2.8218766e-05 9.4285714 + 82400 1.2009506e-05 0 2.0561735e-05 2.1040496e-05 2.795312e-05 9.4285714 + 82500 1.1733615e-05 0 1.9357593e-05 2.1527976e-05 2.7186852e-05 9.4285714 + 82600 1.1532561e-05 0 1.9923004e-05 2.0870361e-05 2.6440559e-05 9.4285714 + 82700 1.1827976e-05 0 2.0835067e-05 2.0670966e-05 2.5788333e-05 9.4285714 + 82800 1.184935e-05 0 2.1182444e-05 2.1182423e-05 2.6266551e-05 9.4285714 + 82900 1.1682778e-05 0 2.1813617e-05 2.2135635e-05 2.8436608e-05 9.4285714 + 83000 1.1619346e-05 0 2.1384423e-05 2.2752934e-05 2.950742e-05 9.4285714 + 83100 1.1016956e-05 0 2.0671019e-05 2.3277308e-05 3.064537e-05 9.4285714 + 83200 1.032127e-05 0 2.0124129e-05 2.3596651e-05 3.2160911e-05 9.4285714 + 83300 1.0127831e-05 0 1.9244913e-05 2.184731e-05 3.2859693e-05 9.4285714 + 83400 9.8386687e-06 0 1.9476381e-05 2.1605263e-05 3.4090261e-05 9.4285714 + 83500 9.1250766e-06 0 1.9883376e-05 2.2816311e-05 3.4043926e-05 9.4285714 + 83600 9.3232966e-06 0 1.9291021e-05 2.2085339e-05 3.1998949e-05 9.4285714 + 83700 9.6051945e-06 0 1.861147e-05 2.1797856e-05 3.024079e-05 9.4285714 + 83800 9.7047054e-06 0 1.8556585e-05 2.1529e-05 2.8842836e-05 9.4285714 + 83900 9.5519797e-06 0 1.9451371e-05 2.147397e-05 2.8218569e-05 9.4285714 + 84000 8.9765645e-06 0 2.1248852e-05 2.2900978e-05 2.8523886e-05 9.4285714 + 84100 8.8401475e-06 0 2.1813454e-05 2.3217945e-05 2.8203956e-05 9.4285714 + 84200 9.1081598e-06 0 2.0841493e-05 2.2640456e-05 2.8507967e-05 9.4285714 + 84300 9.133309e-06 0 2.0350405e-05 2.2313282e-05 2.9163429e-05 9.4285714 + 84400 9.0232336e-06 0 1.9869412e-05 2.1747862e-05 2.891624e-05 9.4285714 + 84500 9.0150135e-06 0 1.9669642e-05 2.1292995e-05 2.8884265e-05 9.4285714 + 84600 8.7504119e-06 0 1.9098291e-05 2.1117708e-05 2.9200315e-05 9.4285714 + 84700 7.7738787e-06 0 1.8566837e-05 2.1793757e-05 3.0190079e-05 9.4285714 + 84800 7.3443767e-06 0 1.8217822e-05 2.2484608e-05 2.9667101e-05 9.4285714 + 84900 7.6801643e-06 0 1.78525e-05 2.2877485e-05 2.832008e-05 9.4285714 + 85000 7.7195643e-06 0 1.800592e-05 2.3068248e-05 2.7915486e-05 9.4285714 + 85100 7.6499144e-06 0 1.8530442e-05 2.2898047e-05 2.8227078e-05 9.4285714 + 85200 7.32082e-06 0 1.9116444e-05 2.2906818e-05 2.7936188e-05 9.4285714 + 85300 7.1428279e-06 0 1.943214e-05 2.2867713e-05 2.7178667e-05 9.4285714 + 85400 6.9909138e-06 0 1.9200984e-05 2.28646e-05 2.6991324e-05 9.4285714 + 85500 6.884213e-06 0 1.9100717e-05 2.3013486e-05 2.6873435e-05 9.4285714 + 85600 6.7202361e-06 0 1.9526136e-05 2.3798531e-05 2.6888726e-05 9.4285714 + 85700 5.9758383e-06 0 2.045899e-05 2.4666306e-05 2.7257045e-05 9.4285714 + 85800 5.0096659e-06 0 2.0246158e-05 2.5355108e-05 2.8233262e-05 9.4285714 + 85900 4.5280067e-06 0 1.9707385e-05 2.5784389e-05 2.8855408e-05 9.4285714 + 86000 4.4772165e-06 0 1.921428e-05 2.5140915e-05 2.8714319e-05 9.4285714 + 86100 4.5351652e-06 0 1.924609e-05 2.4846555e-05 2.8007203e-05 9.4285714 + 86200 4.513446e-06 0 1.9920375e-05 2.4535727e-05 2.7780126e-05 9.4285714 + 86300 4.3055665e-06 0 2.0846388e-05 2.3758795e-05 2.7427779e-05 9.4285714 + 86400 4.2716968e-06 0 2.1353493e-05 2.3371464e-05 2.683057e-05 9.4285714 + 86500 4.2116921e-06 0 2.1134644e-05 2.3609037e-05 2.6799178e-05 9.4285714 + 86600 4.0128801e-06 0 2.1174e-05 2.3766447e-05 2.667212e-05 9.4285714 + 86700 4.1389561e-06 0 2.0750284e-05 2.3884837e-05 2.6517752e-05 9.4285714 + 86800 4.1881267e-06 0 1.9884415e-05 2.404381e-05 2.692584e-05 9.4285714 + 86900 3.9364494e-06 0 1.9517858e-05 2.3729685e-05 2.7122115e-05 9.4285714 + 87000 3.8839998e-06 0 1.9058007e-05 2.3177165e-05 2.7145809e-05 9.4285714 + 87100 3.853393e-06 0 1.9045357e-05 2.3041034e-05 2.7686016e-05 9.4285714 + 87200 3.6787772e-06 0 1.9355987e-05 2.3027685e-05 2.8072243e-05 9.4285714 + 87300 3.5766377e-06 0 1.9682253e-05 2.302215e-05 2.7817335e-05 9.4285714 + 87400 3.5075159e-06 0 1.989737e-05 2.3236677e-05 2.7298161e-05 9.4285714 + 87500 3.4900915e-06 0 1.9981654e-05 2.2924327e-05 2.6621041e-05 9.4285714 + 87600 3.5749174e-06 0 2.0142749e-05 2.2288497e-05 2.631543e-05 9.4285714 + 87700 3.545282e-06 0 2.00507e-05 2.1963235e-05 2.6240158e-05 9.4285714 + 87800 3.4612528e-06 0 1.9815216e-05 2.2121027e-05 2.6274717e-05 9.4285714 + 87900 3.4086212e-06 0 1.990072e-05 2.271949e-05 2.6730622e-05 9.4285714 + 88000 3.278284e-06 0 1.9650403e-05 2.3066277e-05 2.6973038e-05 9.4285714 + 88100 3.1997643e-06 0 1.919048e-05 2.3081334e-05 2.6947187e-05 9.4285714 + 88200 3.2624358e-06 0 1.8973985e-05 2.2906477e-05 2.6892086e-05 9.4285714 + 88300 3.3028659e-06 0 1.8752751e-05 2.266086e-05 2.6579262e-05 9.4285714 + 88400 3.2647999e-06 0 1.8770468e-05 2.2485793e-05 2.6586544e-05 9.4285714 + 88500 3.2137586e-06 0 1.9037269e-05 2.2328608e-05 2.6742029e-05 9.4285714 + 88600 3.2293896e-06 0 1.9222047e-05 2.2383294e-05 2.6620011e-05 9.4285714 + 88700 3.3400536e-06 0 1.888424e-05 2.2433025e-05 2.6490047e-05 9.4285714 + 88800 3.5028811e-06 0 1.823889e-05 2.2206966e-05 2.6031108e-05 9.4285714 + 88900 3.6626472e-06 0 1.7903656e-05 2.1911498e-05 2.5333618e-05 9.4285714 + 89000 3.7951908e-06 0 1.7988475e-05 2.1636822e-05 2.4914335e-05 9.4285714 + 89100 3.8810219e-06 0 1.8101467e-05 2.155905e-05 2.4596941e-05 9.4285714 + 89200 3.894077e-06 0 1.8336389e-05 2.1836116e-05 2.4575669e-05 9.4285714 + 89300 3.8931426e-06 0 1.8625676e-05 2.1981098e-05 2.4694483e-05 9.4285714 + 89400 3.8817963e-06 0 1.8971752e-05 2.1735872e-05 2.4588005e-05 9.4285714 + 89500 3.8639803e-06 0 1.9001381e-05 2.1209383e-05 2.4389848e-05 9.4285714 + 89600 3.9144586e-06 0 1.8747776e-05 2.0721312e-05 2.4222564e-05 9.4285714 + 89700 3.9129514e-06 0 1.8325344e-05 2.0471643e-05 2.4183077e-05 9.4285714 + 89800 3.7950695e-06 0 1.7998801e-05 2.0839569e-05 2.4353111e-05 9.4285714 + 89900 3.6663436e-06 0 1.7964905e-05 2.1624148e-05 2.4826112e-05 9.4285714 + 90000 3.5927353e-06 0 1.801633e-05 2.2048976e-05 2.4975196e-05 9.4285714 + 90100 3.6742798e-06 0 1.8129296e-05 2.2272958e-05 2.5014266e-05 9.4285714 + 90200 3.8196011e-06 0 1.8331029e-05 2.2181403e-05 2.4974527e-05 9.4285714 + 90300 3.8593906e-06 0 1.8550247e-05 2.2456259e-05 2.4906423e-05 9.4285714 + 90400 3.8238761e-06 0 1.8776214e-05 2.27429e-05 2.5362061e-05 9.4285714 + 90500 3.8375645e-06 0 1.8735064e-05 2.288521e-05 2.5931468e-05 9.4285714 + 90600 3.871899e-06 0 1.8598154e-05 2.342248e-05 2.6213633e-05 9.4285714 + 90700 3.8600363e-06 0 1.8556115e-05 2.353577e-05 2.6446203e-05 9.4285714 + 90800 3.8414152e-06 0 1.8554966e-05 2.3337777e-05 2.6580207e-05 9.4285714 + 90900 3.8154503e-06 0 1.890433e-05 2.2945653e-05 2.6879013e-05 9.4285714 + 91000 3.8511411e-06 0 1.9073005e-05 2.2336708e-05 2.7339501e-05 9.4285714 + 91100 3.9255325e-06 0 1.8914868e-05 2.2082842e-05 2.7574868e-05 9.4285714 + 91200 3.9297568e-06 0 1.8888208e-05 2.2010365e-05 2.7638604e-05 9.4285714 + 91300 3.9376913e-06 0 1.8874023e-05 2.2167459e-05 2.7740522e-05 9.4285714 + 91400 3.9192344e-06 0 1.9042767e-05 2.2717308e-05 2.7767191e-05 9.4285714 + 91500 3.8937727e-06 0 1.9634969e-05 2.3006426e-05 2.781538e-05 9.4285714 + 91600 3.921792e-06 0 1.9908826e-05 2.3188912e-05 2.7914222e-05 9.4285714 + 91700 3.8385848e-06 0 2.0213988e-05 2.344425e-05 2.8264386e-05 9.4285714 + 91800 3.6627259e-06 0 2.0497775e-05 2.3459994e-05 2.851886e-05 9.4285714 + 91900 3.5557229e-06 0 2.0136408e-05 2.3401237e-05 2.8798841e-05 9.4285714 + 92000 3.4183571e-06 0 2.0062255e-05 2.3649732e-05 2.9017732e-05 9.4285714 + 92100 3.286238e-06 0 2.02647e-05 2.3418325e-05 2.9155509e-05 9.4285714 + 92200 3.2252379e-06 0 2.0123472e-05 2.3636953e-05 2.9499923e-05 9.4285714 + 92300 3.2079641e-06 0 2.0275237e-05 2.3497334e-05 2.9647567e-05 9.4285714 + 92400 3.2259153e-06 0 2.0708703e-05 2.3099328e-05 2.9725269e-05 9.4285714 + 92500 3.3176983e-06 0 2.0438928e-05 2.3152393e-05 2.9592355e-05 9.4285714 + 92600 3.4754655e-06 0 2.0050115e-05 2.2662299e-05 2.9029002e-05 9.4285714 + 92700 3.5547985e-06 0 1.9798732e-05 2.2652731e-05 2.8413585e-05 9.4285714 + 92800 3.5217221e-06 0 1.988581e-05 2.3242446e-05 2.7864789e-05 9.4285714 + 92900 3.4830557e-06 0 2.0344291e-05 2.3437444e-05 2.7433339e-05 9.4285714 + 93000 3.5067848e-06 0 2.0026148e-05 2.3432841e-05 2.7260475e-05 9.4285714 + 93100 3.5613504e-06 0 1.9577789e-05 2.3350015e-05 2.7083996e-05 9.4285714 + 93200 3.5908192e-06 0 1.9144805e-05 2.2948321e-05 2.681918e-05 9.4285714 + 93300 3.6740418e-06 0 1.8487647e-05 2.2653173e-05 2.663755e-05 9.4285714 + 93400 3.7748516e-06 0 1.8488145e-05 2.2206179e-05 2.6480609e-05 9.4285714 + 93500 3.778067e-06 0 1.8380908e-05 2.1922993e-05 2.6390489e-05 9.4285714 + 93600 3.7950568e-06 0 1.8060505e-05 2.1818583e-05 2.6190461e-05 9.4285714 + 93700 3.902705e-06 0 1.8237874e-05 2.1387385e-05 2.580064e-05 9.4285714 + 93800 4.0019776e-06 0 1.8164284e-05 2.1231985e-05 2.5433884e-05 9.4285714 + 93900 4.058159e-06 0 1.8377519e-05 2.1116447e-05 2.5137932e-05 9.4285714 + 94000 4.1283039e-06 0 1.8691191e-05 2.0876996e-05 2.4948455e-05 9.4285714 + 94100 4.2352778e-06 0 1.8843744e-05 2.099217e-05 2.4821732e-05 9.4285714 + 94200 4.3082247e-06 0 1.9170735e-05 2.1187718e-05 2.4694007e-05 9.4285714 + 94300 4.357307e-06 0 1.9318899e-05 2.1165729e-05 2.4530933e-05 9.4285714 + 94400 4.4732817e-06 0 1.9379988e-05 2.1186172e-05 2.4309742e-05 9.4285714 + 94500 4.6143854e-06 0 1.9558025e-05 2.1010424e-05 2.4038303e-05 9.4285714 + 94600 4.739653e-06 0 1.9432883e-05 2.0885805e-05 2.3708797e-05 9.4285714 + 94700 4.8269276e-06 0 1.9225637e-05 2.0882097e-05 2.3615952e-05 9.4285714 + 94800 4.857571e-06 0 1.8648603e-05 2.0623127e-05 2.3843756e-05 9.4285714 + 94900 4.8387125e-06 0 1.7910494e-05 2.0653984e-05 2.4297454e-05 9.4285714 + 95000 4.7464338e-06 0 1.7524663e-05 2.1137372e-05 2.487821e-05 9.4285714 + 95100 4.4415589e-06 0 1.7540549e-05 2.1418891e-05 2.5499867e-05 9.4285714 + 95200 4.0268314e-06 0 1.7679307e-05 2.1403088e-05 2.5993178e-05 9.4285714 + 95300 3.7118025e-06 0 1.7925499e-05 2.1371139e-05 2.6377462e-05 9.4285714 + 95400 3.5288195e-06 0 1.8250412e-05 2.1387355e-05 2.6738319e-05 9.4285714 + 95500 3.4810828e-06 0 1.86484e-05 2.1399182e-05 2.7164649e-05 9.4285714 + 95600 3.5067551e-06 0 1.8915884e-05 2.1279427e-05 2.7470424e-05 9.4285714 + 95700 3.5278226e-06 0 1.9125631e-05 2.1219557e-05 2.7511986e-05 9.4285714 + 95800 3.5358542e-06 0 1.950961e-05 2.137663e-05 2.7601212e-05 9.4285714 + 95900 3.4501042e-06 0 1.9911824e-05 2.1777137e-05 2.7767027e-05 9.4285714 + 96000 3.331983e-06 0 1.9929882e-05 2.1659572e-05 2.7990694e-05 9.4285714 + 96100 3.2445136e-06 0 1.9787703e-05 2.1336326e-05 2.8200624e-05 9.4285714 + 96200 3.2599723e-06 0 1.9512823e-05 2.1402652e-05 2.8362702e-05 9.4285714 + 96300 3.3524759e-06 0 1.938361e-05 2.1219971e-05 2.8324964e-05 9.4285714 + 96400 3.4049862e-06 0 1.9566809e-05 2.1188455e-05 2.8344235e-05 9.4285714 + 96500 3.4560149e-06 0 1.9931983e-05 2.146743e-05 2.8486867e-05 9.4285714 + 96600 3.5377003e-06 0 2.0127624e-05 2.1453131e-05 2.8502924e-05 9.4285714 + 96700 3.5789688e-06 0 2.0205767e-05 2.1634778e-05 2.8535866e-05 9.4285714 + 96800 3.6009525e-06 0 2.0265564e-05 2.2163095e-05 2.8519643e-05 9.4285714 + 96900 3.6398358e-06 0 2.0186048e-05 2.2344187e-05 2.8242524e-05 9.4285714 + 97000 3.6926637e-06 0 2.0170213e-05 2.2358775e-05 2.7911553e-05 9.4285714 + 97100 3.7577286e-06 0 1.9995042e-05 2.2293935e-05 2.7592964e-05 9.4285714 + 97200 3.7951338e-06 0 1.972518e-05 2.2500533e-05 2.7324564e-05 9.4285714 + 97300 3.7915088e-06 0 1.9577123e-05 2.3151642e-05 2.7299762e-05 9.4285714 + 97400 3.7485224e-06 0 1.9324456e-05 2.30806e-05 2.7089915e-05 9.4285714 + 97500 3.7004488e-06 0 1.9219566e-05 2.2917658e-05 2.6888759e-05 9.4285714 + 97600 3.5146189e-06 0 1.9216453e-05 2.3350177e-05 2.6561724e-05 9.4285714 + 97700 3.2092658e-06 0 1.9210005e-05 2.3618954e-05 2.6020575e-05 9.4285714 + 97800 3.0741264e-06 0 1.8785442e-05 2.3901093e-05 2.5609259e-05 9.4285714 + 97900 3.2689032e-06 0 1.8332069e-05 2.3813462e-05 2.5281581e-05 9.4285714 + 98000 3.4879184e-06 0 1.7639391e-05 2.3233496e-05 2.5115654e-05 9.4285714 + 98100 3.0702391e-06 0 1.7345936e-05 2.36305e-05 2.524874e-05 9.4285714 + 98200 2.9214268e-06 0 1.7751691e-05 2.3810696e-05 2.5038638e-05 9.4285714 + 98300 2.9373287e-06 0 1.7414606e-05 2.3325178e-05 2.4758312e-05 9.4285714 + 98400 2.879615e-06 0 1.8218541e-05 2.3403674e-05 2.4845847e-05 9.4285714 + 98500 2.848204e-06 0 1.9008342e-05 2.3138169e-05 2.481977e-05 9.4285714 + 98600 2.7263423e-06 0 1.8559461e-05 2.2912112e-05 2.4778725e-05 9.4285714 + 98700 2.6065427e-06 0 1.8899571e-05 2.2936881e-05 2.4788275e-05 9.4285714 + 98800 2.4965223e-06 0 1.812463e-05 2.2777276e-05 2.4817472e-05 9.4285714 + 98900 2.5312476e-06 0 1.7188063e-05 2.2549286e-05 2.4758508e-05 9.4285714 + 99000 2.6511883e-06 0 1.7634415e-05 2.2369995e-05 2.4688578e-05 9.4285714 + 99100 2.7173422e-06 0 1.7730299e-05 2.1958527e-05 2.4725265e-05 9.4285714 + 99200 2.7416008e-06 0 1.7354475e-05 2.1383708e-05 2.4972238e-05 9.4285714 + 99300 2.7403492e-06 0 1.7710033e-05 2.0999817e-05 2.5194177e-05 9.4285714 + 99400 2.6759704e-06 0 1.7805932e-05 2.0887012e-05 2.5239724e-05 9.4285714 + 99500 2.7350974e-06 0 1.7591419e-05 2.1055636e-05 2.5010401e-05 9.4285714 + 99600 2.8807532e-06 0 1.7598054e-05 2.1135294e-05 2.4759587e-05 9.4285714 + 99700 2.9230897e-06 0 1.7610982e-05 2.1212426e-05 2.4583469e-05 9.4285714 + 99800 2.9159336e-06 0 1.7740095e-05 2.1476279e-05 2.4546909e-05 9.4285714 + 99900 2.8532894e-06 0 1.7977152e-05 2.14971e-05 2.4856973e-05 9.4285714 + 100000 2.7133352e-06 0 1.8003971e-05 2.1327905e-05 2.5243646e-05 9.4285714 +Loop time of 183.342 on 4 procs for 100000 steps with 2520 atoms + +Performance: 2356254.720 tau/day, 545.429 timesteps/s, 1.374 Matom-step/s +99.8% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.025623 | 1.0356 | 3.8189 | 158.0 | 0.56 +Bond | 2.5126 | 46.913 | 155.81 | 920.8 | 25.59 +Neigh | 2.6046 | 2.623 | 2.6318 | 0.7 | 1.43 +Comm | 2.0083 | 41.613 | 149.8 | 970.4 | 22.70 +Output | 0.12287 | 0.90946 | 1.6958 | 80.6 | 0.50 +Modify | 0.52882 | 5.0973 | 16.247 | 286.1 | 2.78 +Other | | 85.15 | | | 46.44 + +Nlocal: 630 ave 2514 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 +Nghost: 49.75 ave 193 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 +Neighs: 2476 ave 9897 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 9904 +Ave neighs/atom = 3.9301587 +Ave special neighs/atom = 36.31746 +Neighbor list builds = 4880 +Dangerous builds = 0 +Total wall time: 0:03:03 diff --git a/examples/bpm/pour/log.4May2022.bpm.pour.g++.4 b/examples/bpm/pour/log.4May2022.bpm.pour.g++.4 deleted file mode 100644 index 5fc31df976..0000000000 --- a/examples/bpm/pour/log.4May2022.bpm.pour.g++.4 +++ /dev/null @@ -1,1096 +0,0 @@ -LAMMPS (4 May 2022) -units lj -dimension 3 -boundary m m m -atom_style bpm/sphere -special_bonds lj 0.0 1.0 1.0 coul 1.0 1.0 1.0 -newton on off -comm_modify vel yes cutoff 3.3 -region box block -15 15 -15 15 0 60.0 -create_box 1 box bond/types 1 extra/bond/per/atom 15 extra/special/per/atom 50 -Created orthogonal box = (-15 -15 0) to (15 15 60) - 1 by 1 by 4 MPI processor grid - -molecule my_mol "rect.mol" -Read molecule template my_mol: - 1 molecules - 0 fragments - 63 atoms with max type 1 - 297 bonds with max type 1 - 0 angles with max type 0 - 0 dihedrals with max type 0 - 0 impropers with max type 0 -region wall_cyl cylinder z 0.0 0.0 10.0 EDGE EDGE side in -region dropzone cylinder z 0.0 0.0 10.0 40.0 50.0 side in - -pair_style gran/hertz/history 1.0 NULL 0.5 NULL 0.1 1 -bond_style bpm/rotational -pair_coeff 1 1 -bond_coeff 1 1.0 0.2 0.01 0.01 2.0 0.4 0.02 0.02 0.2 0.04 0.002 0.002 - -compute nbond all nbond/atom -compute tbond all reduce sum c_nbond -compute bond_ids all property/local batom1 batom2 -compute bond_properties all bond/local dist b1 - -compute_modify thermo_temp dynamic/dof yes - -fix 1 all wall/gran hertz/history 1.0 NULL 0.5 NULL 0.1 1 zplane 0.0 NULL -fix 2 all wall/gran/region hertz/history 1.0 NULL 0.5 NULL 0.1 1 region wall_cyl -fix 3 all gravity 1e-4 vector 0 0 -1 -fix 4 all deposit 40 0 1500 712511343 mol my_mol region dropzone near 2.0 vz -0.05 -0.05 -fix 5 all nve/bpm/sphere - -timestep 0.05 -thermo_style custom step ke pe pxx pyy pzz c_tbond -thermo 100 -#dump 1 all custom 500 atomDump id radius x y z c_nbond mol -#dump 2 all local 500 bondDump c_bond_ids[*] c_bond_properties[*] -#dump_modify 2 colname 1 "id1" colname 2 "id2" colname 3 "r" colname 4 "r0" - -run 100000 -Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 1.3 - ghost atom cutoff = 3.3 - binsize = 0.65, bins = 47 47 93 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair gran/hertz/history, perpetual - attributes: half, newton on, size, history - pair build: half/size/bin/newton - stencil: half/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 6.515 | 6.515 | 6.515 Mbytes - Step KinEng PotEng Pxx Pyy Pzz c_tbond - 0 -0 0 0 0 0 0 - 100 0.0018331948 0 1.2795343e-05 1.3162764e-05 6.0889226e-06 9.4285714 - 200 0.0025933558 0 -9.7246963e-07 4.2628093e-07 2.254606e-06 9.4285714 - 300 0.0036964813 0 -5.214277e-06 9.6942542e-06 8.1928448e-07 9.4285714 - 400 0.0060104433 0 2.3353405e-05 1.8273171e-05 1.2647691e-05 9.4285714 - 500 0.0074435972 0 -1.7839575e-05 3.8686256e-06 -5.120219e-06 9.4285714 - 600 0.0077862298 0 3.8676586e-06 1.3499487e-05 4.1914953e-06 9.4285714 - 700 0.0075577591 0 2.995232e-06 1.2051677e-05 4.8789862e-06 9.4285714 - 800 0.0073958844 0 -1.4258432e-05 1.2272397e-05 -6.8630878e-06 9.4285714 - 900 0.007553697 0 9.9219152e-06 1.2918228e-05 8.8713909e-06 9.4285714 - 1000 0.0075815901 0 -6.1095276e-06 1.2607282e-05 -2.1917025e-06 9.4285714 - 1100 0.0075277384 0 -5.4044191e-06 1.0815313e-05 -3.3464998e-06 9.4285714 - 1200 0.0075026507 0 6.9770766e-06 1.3988236e-05 8.5114688e-06 9.4285714 - 1300 0.0075665473 0 -4.6433628e-06 8.6190703e-06 -3.8381153e-06 9.4285714 - 1400 0.0076224701 0 1.1589382e-06 7.9617716e-06 1.1941326e-06 9.4285714 - 1500 0.007603467 0 3.5774148e-06 1.3039063e-05 5.2641947e-06 9.4285714 - 1600 0.0059810407 0 4.8299936e-06 1.5343107e-05 4.8809408e-06 9.4285714 - 1700 0.0080230318 0 7.7953676e-06 2.5215962e-05 1.2492975e-05 9.4285714 - 1800 0.0087482398 0 4.7318071e-06 1.9559769e-05 4.2711986e-07 9.4285714 - 1900 0.0086877574 0 4.8038566e-06 1.8020212e-05 2.1297032e-06 9.4285714 - 2000 0.0086771118 0 6.1316671e-06 2.6348435e-05 8.9167408e-06 9.4285714 - 2100 0.0084670091 0 5.0586292e-06 1.9876458e-05 4.6539619e-06 9.4285714 - 2200 0.0083650907 0 9.4046949e-06 1.9264472e-05 1.0344742e-05 9.4285714 - 2300 0.0083549595 0 6.3002517e-06 2.0954839e-05 3.9631836e-06 9.4285714 - 2400 0.0083151535 0 4.9801292e-06 1.2138211e-05 6.2493867e-06 9.4285714 - 2500 0.0083898757 0 6.8667997e-06 1.9182698e-05 9.8363046e-06 9.4285714 - 2600 0.0084145705 0 4.1851e-06 1.8890376e-05 5.497773e-06 9.4285714 - 2700 0.0082712696 0 4.9701934e-06 1.7886474e-05 8.3184582e-06 9.4285714 - 2800 0.0073688706 0 1.144302e-05 1.3902577e-05 9.8542094e-06 9.4285714 - 2900 0.0072732669 0 8.2228374e-06 1.2550063e-05 8.7486939e-06 9.4285714 - 3000 0.0072225948 0 1.1788696e-05 1.6856873e-05 1.0219519e-05 9.4285714 - 3100 0.0048244969 0 2.6913622e-05 2.6037751e-05 1.5435674e-05 9.4285714 - 3200 0.0045717035 0 2.3464139e-05 2.1215606e-05 1.7659066e-05 9.4285714 - 3300 0.0047679567 0 6.5564192e-06 1.2866169e-05 1.4234937e-05 9.4285714 - 3400 0.0048448212 0 2.6268527e-06 9.1565649e-06 1.2387928e-05 9.4285714 - 3500 0.0048364711 0 2.8817245e-06 1.0066061e-05 1.1158512e-05 9.4285714 - 3600 0.0047125947 0 4.936496e-06 1.4195118e-05 1.5418285e-05 9.4285714 - 3700 0.0045641049 0 5.9769788e-06 9.8945153e-06 2.0158644e-05 9.4285714 - 3800 0.0045540235 0 6.1868269e-06 9.9425305e-06 1.6312008e-05 9.4285714 - 3900 0.0047271202 0 4.6825739e-06 1.3424496e-05 1.3234307e-05 9.4285714 - 4000 0.0049115261 0 5.5722312e-06 9.2060522e-06 1.6284048e-05 9.4285714 - 4100 0.0046819157 0 7.2200038e-06 1.0870694e-05 1.0519325e-05 9.4285714 - 4200 0.0035133816 0 3.6321041e-05 4.1100939e-05 1.8321255e-05 9.4285714 - 4300 0.0031933917 0 2.4951011e-05 2.5521457e-05 2.588421e-05 9.4285714 - 4400 0.0033515272 0 -5.6220845e-06 -2.4430502e-06 1.0942893e-05 9.4285714 - 4500 0.0034928951 0 6.2053481e-06 4.7764245e-06 1.991749e-05 9.4285714 - 4600 0.0029992338 0 2.369557e-06 4.59349e-06 2.0911379e-05 9.4285714 - 4700 0.0030650658 0 -2.7066449e-06 1.83391e-06 6.7096837e-06 9.4285714 - 4800 0.0031180382 0 3.4620044e-06 3.3494935e-06 1.7175961e-05 9.4285714 - 4900 0.0030365003 0 3.6295178e-06 6.2514468e-06 1.3401316e-05 9.4285714 - 5000 0.0030259714 0 5.1566588e-06 1.3494605e-05 9.7456367e-06 9.4285714 - 5100 0.0030499975 0 6.7608769e-06 1.9415863e-05 1.2078691e-05 9.4285714 - 5200 0.003005436 0 6.7275739e-06 2.0656574e-05 5.906659e-06 9.4285714 - 5300 0.0030000941 0 6.9641454e-06 1.54531e-05 1.7021736e-05 9.4285714 - 5400 0.0031465827 0 6.540246e-06 1.0837198e-05 1.0192016e-05 9.4285714 - 5500 0.0031981585 0 4.9292412e-06 4.6915838e-06 3.029257e-06 9.4285714 - 5600 0.0031525115 0 4.3125052e-06 2.8841432e-06 1.9324111e-05 9.4285714 - 5700 0.0032128781 0 5.1973159e-06 4.7261232e-06 1.5155154e-05 9.4285714 - 5800 0.0030092855 0 5.1574375e-06 1.3330205e-06 1.6470501e-05 9.4285714 - 5900 0.0025015767 0 9.468608e-06 6.3045435e-06 3.0961055e-05 9.4285714 - 6000 0.0024438438 0 8.0212466e-06 1.0032087e-05 2.8378471e-05 9.4285714 - 6100 0.0023816456 0 3.7802286e-06 -3.8999559e-06 1.8398107e-05 9.4285714 - 6200 0.0024459343 0 5.9964052e-07 8.2000754e-07 1.6404949e-05 9.4285714 - 6300 0.0025205884 0 4.7129599e-06 8.6972388e-06 2.9892106e-05 9.4285714 - 6400 0.0033754198 0 6.5856871e-06 2.3744673e-05 2.4721217e-05 9.4285714 - 6500 0.0037812296 0 1.376462e-07 2.0230253e-05 1.9719688e-05 9.4285714 - 6600 0.0038043567 0 -2.2279638e-06 1.4780176e-05 2.3799652e-05 9.4285714 - 6700 0.0038213959 0 1.1073632e-05 2.2516034e-05 2.5410459e-05 9.4285714 - 6800 0.0036977776 0 -1.0765937e-05 1.3667142e-05 1.7835133e-05 9.4285714 - 6900 0.0034769765 0 6.7509492e-06 2.840882e-05 2.435267e-05 9.4285714 - 7000 0.0031526409 0 1.4168552e-05 4.4965769e-05 4.5646226e-05 9.4285714 - 7100 0.00317737 0 -5.4803238e-06 3.1967885e-05 2.9211214e-05 9.4285714 - 7200 0.0034448361 0 4.8507597e-06 2.1591795e-05 2.3816498e-05 9.4285714 - 7300 0.0036147362 0 -2.791278e-06 2.9367843e-05 2.072129e-05 9.4285714 - 7400 0.0035651675 0 -1.6177129e-06 7.9033092e-06 2.3377855e-05 9.4285714 - 7500 0.0036394064 0 5.7414518e-06 1.246586e-05 2.8461253e-05 9.4285714 - 7600 0.0033086177 0 -3.6547872e-06 1.9730955e-05 2.8892436e-05 9.4285714 - 7700 0.0033410425 0 6.9618203e-06 6.4576188e-06 3.1766455e-05 9.4285714 - 7800 0.0035764747 0 1.2110077e-05 6.3850506e-06 3.5436107e-05 9.4285714 - 7900 0.0039500913 0 1.1250888e-05 5.2728547e-06 3.4972007e-05 9.4285714 - 8000 0.0042963353 0 1.8776503e-05 4.2083124e-06 3.5010281e-05 9.4285714 - 8100 0.0048297614 0 2.5603506e-05 3.3748362e-06 4.0838382e-05 9.4285714 - 8200 0.0052301447 0 2.2727386e-05 4.8879987e-06 3.4821083e-05 9.4285714 - 8300 0.005169511 0 2.5022891e-05 1.0062389e-05 3.3976429e-05 9.4285714 - 8400 0.005224324 0 2.4238943e-05 7.0296204e-06 4.2543264e-05 9.4285714 - 8500 0.0053049309 0 2.6217015e-05 1.0282354e-06 2.6559275e-05 9.4285714 - 8600 0.0052459952 0 3.0123571e-05 -5.4843616e-07 3.3857424e-05 9.4285714 - 8700 0.0052955657 0 2.3843911e-05 -3.117634e-06 3.9683886e-05 9.4285714 - 8800 0.0053972257 0 2.6944951e-05 -1.9297854e-06 2.1931602e-05 9.4285714 - 8900 0.0053679679 0 3.1169997e-05 -9.4576351e-07 3.1987255e-05 9.4285714 - 9000 0.0053793586 0 2.6261243e-05 -3.1509839e-07 3.3111749e-05 9.4285714 - 9100 0.0048447626 0 2.5562708e-05 9.5708437e-07 3.1370618e-05 9.4285714 - 9200 0.0048688926 0 2.8696471e-05 1.7677464e-06 3.5234397e-05 9.4285714 - 9300 0.0048538957 0 2.9337564e-05 6.1059713e-06 2.8008268e-05 9.4285714 - 9400 0.0046986454 0 3.0831262e-05 4.6561014e-06 3.5247122e-05 9.4285714 - 9500 0.0046145139 0 2.6082124e-05 4.2214681e-06 3.2773769e-05 9.4285714 - 9600 0.0045277961 0 1.2434258e-05 8.6375534e-06 2.284049e-05 9.4285714 - 9700 0.0043935298 0 2.5929984e-05 1.409283e-05 4.9159861e-05 9.4285714 - 9800 0.0045363488 0 1.9700734e-05 7.7797381e-06 4.4404362e-05 9.4285714 - 9900 0.0046509978 0 4.052959e-07 1.0265502e-06 3.1360974e-05 9.4285714 - 10000 0.0046493894 0 1.6553229e-05 1.0076346e-05 5.1789914e-05 9.4285714 - 10100 0.0046514856 0 1.8327939e-05 9.8302174e-06 3.7624599e-05 9.4285714 - 10200 0.0046209533 0 2.4256813e-05 1.3730576e-05 3.1575089e-05 9.4285714 - 10300 0.0044651031 0 3.3601226e-05 2.3983568e-05 5.6565625e-05 9.4285714 - 10400 0.0041834162 0 4.805126e-05 7.6642091e-06 4.2641571e-05 9.4285714 - 10500 0.0043218845 0 4.6826294e-05 1.9078519e-05 3.6250139e-05 9.4285714 - 10600 0.0045795722 0 8.2629139e-06 1.6451196e-05 5.4195508e-05 9.4285714 - 10700 0.0053833569 0 5.3717062e-06 6.8337125e-06 4.9804395e-05 9.4285714 - 10800 0.0056805981 0 1.0439371e-05 6.3964706e-05 5.0857116e-05 9.4285714 - 10900 0.0057157307 0 8.6953546e-06 6.7276441e-05 3.9725389e-05 9.4285714 - 11000 0.005696424 0 8.1149094e-06 2.2104406e-05 5.1852506e-05 9.4285714 - 11100 0.0052078884 0 1.5579258e-05 5.0215785e-05 9.2364613e-05 9.4285714 - 11200 0.0052849159 0 2.443959e-05 6.5869489e-05 5.1237777e-05 9.4285714 - 11300 0.0054074494 0 -2.0510258e-05 2.0196205e-05 2.5051885e-05 9.4285714 - 11400 0.0055432168 0 1.5343164e-05 2.5482368e-05 5.4336948e-05 9.4285714 - 11500 0.0054679467 0 -8.3474301e-06 3.553783e-05 5.2027159e-05 9.4285714 - 11600 0.0052706441 0 -1.5151807e-05 3.9562266e-05 5.7900102e-05 9.4285714 - 11700 0.0053724243 0 2.9852987e-05 4.4807737e-05 5.5405662e-05 9.4285714 - 11800 0.0054759961 0 -2.4309686e-05 3.0092677e-06 5.4742672e-05 9.4285714 - 11900 0.0051146604 0 5.1194747e-06 2.8620342e-05 6.4679345e-05 9.4285714 - 12000 0.0049723565 0 2.675912e-05 4.6202817e-05 4.7309269e-05 9.4285714 - 12100 0.0046920113 0 8.7155181e-06 1.0297631e-05 5.3185103e-05 9.4285714 - 12200 0.0049570244 0 1.6383054e-05 2.2699433e-05 6.347138e-05 9.4285714 - 12300 0.0049181458 0 -2.6116723e-05 3.300058e-05 5.177444e-05 9.4285714 - 12400 0.0049245342 0 1.7614092e-05 2.1986541e-05 6.3820521e-05 9.4285714 - 12500 0.0049753042 0 1.7024231e-05 2.7328487e-05 4.8334342e-05 9.4285714 - 12600 0.0048148791 0 -1.7042812e-05 3.3512772e-05 5.9422643e-05 9.4285714 - 12700 0.0043852178 0 1.1418683e-05 6.3690455e-05 7.8362127e-05 9.4285714 - 12800 0.0041967317 0 6.1295424e-06 2.691552e-05 5.3900077e-05 9.4285714 - 12900 0.0041911278 0 1.1373508e-05 -9.9114041e-06 5.6629663e-05 9.4285714 - 13000 0.0043107924 0 8.5398832e-06 1.2632925e-05 5.6578871e-05 9.4285714 - 13100 0.0043976521 0 -1.9373679e-05 2.745136e-05 5.4632008e-05 9.4285714 - 13200 0.0043474635 0 2.0343582e-05 1.7768236e-05 1.1895158e-05 9.4285714 - 13300 0.0044593969 0 1.0895451e-05 2.1880107e-05 3.4032783e-05 9.4285714 - 13400 0.0044814342 0 -1.3547218e-05 1.9974451e-05 4.4513918e-05 9.4285714 - 13500 0.0043982498 0 1.0722877e-05 2.3728571e-05 2.7665112e-05 9.4285714 - 13600 0.0039378503 0 1.2229889e-05 3.0770266e-05 5.2614428e-05 9.4285714 - 13700 0.0036474735 0 9.5048999e-06 1.6734153e-05 7.4271827e-05 9.4285714 - 13800 0.0038236277 0 1.6680429e-05 4.7691782e-05 9.2160112e-05 9.4285714 - 13900 0.0040574402 0 6.7570974e-06 3.6492091e-05 5.2053836e-05 9.4285714 - 14000 0.0046440817 0 2.7735053e-05 6.6227204e-06 3.9436561e-05 9.4285714 - 14100 0.0048045755 0 2.0601942e-05 2.959681e-05 4.9880076e-05 9.4285714 - 14200 0.004634799 0 8.0658747e-06 5.2774385e-06 5.2189551e-05 9.4285714 - 14300 0.0046822822 0 2.1714615e-05 3.0364731e-05 5.2132518e-05 9.4285714 - 14400 0.0048282958 0 2.0587615e-05 2.530458e-05 4.4110535e-05 9.4285714 - 14500 0.004799276 0 1.0813724e-05 2.2458541e-06 4.4546542e-05 9.4285714 - 14600 0.0046554419 0 1.859323e-05 4.5863598e-05 5.9021103e-05 9.4285714 - 14700 0.0045262414 0 2.0625232e-05 3.9707287e-05 6.1007118e-05 9.4285714 - 14800 0.0043347498 0 1.6697069e-05 3.1666259e-05 4.7172267e-05 9.4285714 - 14900 0.0040641791 0 1.3497064e-05 5.9866835e-05 6.6917505e-05 9.4285714 - 15000 0.0040014911 0 7.1453431e-06 2.5483385e-05 6.7987038e-05 9.4285714 - 15100 0.0040015198 0 4.2135705e-05 2.0671772e-05 6.4280017e-05 9.4285714 - 15200 0.004656209 0 2.6684328e-05 4.474018e-05 5.916807e-05 9.4285714 - 15300 0.0047390215 0 3.3127952e-05 4.6355585e-06 5.6740658e-05 9.4285714 - 15400 0.0047219857 0 5.6866539e-05 4.8092122e-05 6.3199152e-05 9.4285714 - 15500 0.0049597215 0 3.4278993e-05 2.5111668e-05 6.5359107e-05 9.4285714 - 15600 0.0049081505 0 1.2068327e-05 6.9210759e-06 6.2272418e-05 9.4285714 - 15700 0.0047978977 0 4.7482116e-05 5.8014048e-05 5.5647569e-05 9.4285714 - 15800 0.0048176861 0 5.0196994e-05 5.8789855e-06 4.5752404e-05 9.4285714 - 15900 0.0049895331 0 2.0966545e-05 1.4091817e-05 4.9992598e-05 9.4285714 - 16000 0.0049288669 0 2.268795e-05 3.980733e-05 5.1840856e-05 9.4285714 - 16100 0.0048010252 0 2.6781521e-05 1.2145851e-05 5.6545128e-05 9.4285714 - 16200 0.0047925554 0 4.0057978e-05 3.9037828e-05 5.8580861e-05 9.4285714 - 16300 0.0047652048 0 2.9783669e-05 4.8617786e-05 5.7899464e-05 9.4285714 - 16400 0.0043495894 0 4.1024094e-05 2.2097063e-05 7.9895344e-05 9.4285714 - 16500 0.0042677893 0 4.9740295e-05 3.3483257e-05 7.2860145e-05 9.4285714 - 16600 0.0039924053 0 1.7513538e-05 4.3222405e-05 6.2148808e-05 9.4285714 - 16700 0.004110225 0 4.4412384e-05 9.35409e-06 6.8831113e-05 9.4285714 - 16800 0.0041003344 0 2.4419982e-05 2.7202073e-05 6.5806688e-05 9.4285714 - 16900 0.0040916821 0 1.4965068e-05 3.6816647e-05 7.2328503e-05 9.4285714 - 17000 0.0039812122 0 4.3173586e-05 4.3996263e-05 7.7949852e-05 9.4285714 - 17100 0.0042480582 0 4.1959057e-05 6.6432813e-05 6.3893449e-05 9.4285714 - 17200 0.0044450353 0 3.1558002e-05 4.6146848e-05 5.5409103e-05 9.4285714 - 17300 0.0045016689 0 3.8307434e-05 3.6423601e-05 4.6361333e-05 9.4285714 - 17400 0.0044798864 0 3.6969292e-05 3.0041841e-05 5.013181e-05 9.4285714 - 17500 0.0044624458 0 4.5965488e-05 2.640968e-05 6.3999899e-05 9.4285714 - 17600 0.0044477024 0 2.0966517e-05 1.8953464e-05 4.7160807e-05 9.4285714 - 17700 0.0044103517 0 2.7440925e-05 3.0023335e-05 2.6847111e-05 9.4285714 - 17800 0.004341948 0 3.7548931e-05 2.7684114e-05 5.1464098e-05 9.4285714 - 17900 0.0042623319 0 3.2079768e-05 2.0530818e-05 3.5314593e-05 9.4285714 - 18000 0.003726239 0 2.5075988e-05 3.3133097e-05 4.1995217e-05 9.4285714 - 18100 0.0034893305 0 1.3220245e-05 3.020125e-05 7.1713105e-05 9.4285714 - 18200 0.0035481187 0 3.2523043e-05 2.7387192e-05 3.6749668e-05 9.4285714 - 18300 0.0036251402 0 4.5667311e-05 2.9230799e-05 7.1782706e-05 9.4285714 - 18400 0.0036369749 0 -1.014622e-06 3.5201729e-05 3.9709522e-05 9.4285714 - 18500 0.0034279849 0 2.1947889e-05 3.9001906e-05 3.3701879e-05 9.4285714 - 18600 0.0033615572 0 5.3790038e-05 3.9573549e-05 8.1596316e-05 9.4285714 - 18700 0.003406225 0 7.3625431e-06 3.4584743e-05 4.8640801e-05 9.4285714 - 18800 0.0034922323 0 2.6182422e-05 3.1791119e-05 4.170957e-05 9.4285714 - 18900 0.0034820625 0 2.9857402e-05 2.5799449e-05 5.5291228e-05 9.4285714 - 19000 0.0033272524 0 1.844591e-05 4.0826323e-05 6.2101661e-05 9.4285714 - 19100 0.0034010912 0 3.0145616e-05 3.644045e-05 6.0246878e-05 9.4285714 - 19200 0.0030932535 0 8.7227973e-06 2.9814304e-05 4.6597247e-05 9.4285714 - 19300 0.002624051 0 6.3914236e-05 2.9323041e-05 6.0029293e-05 9.4285714 - 19400 0.0027583806 0 4.2039411e-05 2.7933876e-05 4.8958797e-05 9.4285714 - 19500 0.0029775174 0 -2.6335479e-05 2.2879667e-05 4.4610482e-05 9.4285714 - 19600 0.0028689969 0 3.5884554e-05 2.1352512e-05 6.0208946e-05 9.4285714 - 19700 0.0026399127 0 1.8473989e-05 2.2707825e-05 6.171175e-05 9.4285714 - 19800 0.0025439904 0 -1.2073435e-06 2.0399124e-05 6.9687415e-05 9.4285714 - 19900 0.0027074939 0 3.0062292e-05 3.2667714e-05 5.1372476e-05 9.4285714 - 20000 0.0027181793 0 -1.7035119e-06 1.177054e-05 4.0159702e-05 9.4285714 - 20100 0.0027315362 0 -1.3742365e-06 2.3564155e-05 5.7172718e-05 9.4285714 - 20200 0.0027204191 0 2.0041145e-05 2.052408e-05 4.7725285e-05 9.4285714 - 20300 0.0026457344 0 3.3984829e-06 4.8524174e-06 5.3280292e-05 9.4285714 - 20400 0.0026592475 0 5.1173158e-06 3.9458314e-05 5.5560611e-05 9.4285714 - 20500 0.0026129298 0 2.419217e-05 2.7154017e-05 5.5129038e-05 9.4285714 - 20600 0.0026532045 0 1.9753712e-05 1.46246e-05 4.9293256e-05 9.4285714 - 20700 0.0026172433 0 1.0984198e-06 3.1572908e-05 4.2775817e-05 9.4285714 - 20800 0.0025282343 0 1.9683388e-05 2.2901129e-05 5.64033e-05 9.4285714 - 20900 0.0025383322 0 2.2352257e-05 2.534911e-05 6.380687e-05 9.4285714 - 21000 0.0024848857 0 1.4023463e-05 2.6731904e-05 5.2051725e-05 9.4285714 - 21100 0.0025091105 0 2.7673099e-05 2.9475402e-05 7.684648e-05 9.4285714 - 21200 0.0027229411 0 6.1574133e-06 2.5611393e-05 5.6801847e-05 9.4285714 - 21300 0.0028888226 0 1.9686043e-05 1.033069e-05 3.656491e-05 9.4285714 - 21400 0.0029336429 0 2.3706857e-05 1.5440041e-05 6.4192795e-05 9.4285714 - 21500 0.0029354446 0 4.443655e-06 1.8094788e-05 3.797507e-05 9.4285714 - 21600 0.0029270648 0 2.4289752e-05 1.6933392e-05 3.9618516e-05 9.4285714 - 21700 0.0029288781 0 2.2403205e-05 1.3655312e-05 6.3273854e-05 9.4285714 - 21800 0.002884005 0 9.5665801e-06 1.2718071e-05 5.613979e-05 9.4285714 - 21900 0.0028362206 0 1.6764675e-05 2.2612976e-05 5.3866016e-05 9.4285714 - 22000 0.0027784436 0 2.0373617e-05 2.134133e-05 5.6687534e-05 9.4285714 - 22100 0.0027479829 0 3.1605707e-05 2.9016826e-05 5.0412111e-05 9.4285714 - 22200 0.0027598842 0 3.1818095e-05 1.898738e-05 6.5167547e-05 9.4285714 - 22300 0.0026078138 0 1.4200853e-05 2.8283323e-05 6.7071904e-05 9.4285714 - 22400 0.0026057112 0 2.7502142e-05 4.1407395e-05 8.4619483e-05 9.4285714 - 22500 0.0026641722 0 9.9423891e-06 1.4635552e-05 6.8501238e-05 9.4285714 - 22600 0.0023728105 0 6.7736501e-06 3.0299151e-05 5.894177e-05 9.4285714 - 22700 0.0021999097 0 3.4516939e-05 4.5285607e-05 8.996035e-05 9.4285714 - 22800 0.002178124 0 2.9545388e-05 1.9567086e-05 9.6343476e-05 9.4285714 - 22900 0.0022903704 0 4.8666623e-06 1.5551535e-05 5.8697755e-05 9.4285714 - 23000 0.0022114595 0 3.9089014e-05 1.3185973e-05 7.0843777e-05 9.4285714 - 23100 0.0022473179 0 3.0609778e-05 1.6190628e-05 7.2843834e-05 9.4285714 - 23200 0.0022787302 0 1.3694799e-05 2.8211464e-06 3.8403815e-05 9.4285714 - 23300 0.002254193 0 1.0608785e-05 2.087358e-05 6.337886e-05 9.4285714 - 23400 0.0022032528 0 2.914759e-05 2.8493674e-05 6.0474318e-05 9.4285714 - 23500 0.0022103262 0 2.9804777e-05 1.2383546e-05 4.0491877e-05 9.4285714 - 23600 0.0022767949 0 1.8461506e-05 2.3591158e-05 5.2725816e-05 9.4285714 - 23700 0.002283034 0 1.9374068e-05 2.570172e-05 4.622802e-05 9.4285714 - 23800 0.0022293403 0 3.3214067e-05 1.0752104e-05 4.2971028e-05 9.4285714 - 23900 0.0022421499 0 3.3973428e-05 1.4548851e-05 4.8022214e-05 9.4285714 - 24000 0.0022708179 0 1.3175798e-05 1.5539147e-05 4.5563964e-05 9.4285714 - 24100 0.0022311644 0 1.320215e-05 1.3317185e-05 5.7572825e-05 9.4285714 - 24200 0.0022566051 0 2.3442037e-05 7.9298663e-06 5.2246081e-05 9.4285714 - 24300 0.0022547585 0 2.1667142e-05 6.4075914e-06 5.1028376e-05 9.4285714 - 24400 0.0022901257 0 3.8132396e-05 1.5652454e-05 7.8308938e-05 9.4285714 - 24500 0.0023537103 0 1.7910524e-05 1.573637e-05 6.9737249e-05 9.4285714 - 24600 0.0023613708 0 4.9912312e-05 1.9777052e-05 4.9415062e-05 9.4285714 - 24700 0.0023237992 0 5.4833746e-05 2.9532114e-05 7.4218996e-05 9.4285714 - 24800 0.0024221927 0 4.0966596e-05 6.3998314e-06 5.9553095e-05 9.4285714 - 24900 0.0025882547 0 6.045015e-05 6.220892e-06 5.4328816e-05 9.4285714 - 25000 0.0027152266 0 5.4969197e-05 2.6430135e-05 4.603937e-05 9.4285714 - 25100 0.0028201154 0 4.3938431e-05 3.0418239e-06 5.8688084e-05 9.4285714 - 25200 0.0029086169 0 3.9184289e-05 -1.53382e-06 4.5684354e-05 9.4285714 - 25300 0.0028528211 0 4.4996759e-05 2.6609485e-06 4.2673517e-05 9.4285714 - 25400 0.0027655631 0 4.2432926e-05 2.1473821e-05 6.8108741e-05 9.4285714 - 25500 0.0027631455 0 5.0514226e-05 2.7797928e-05 5.8437613e-05 9.4285714 - 25600 0.0027455338 0 4.3507582e-05 -1.0456464e-05 5.1578934e-05 9.4285714 - 25700 0.0027314337 0 3.7998608e-05 2.5300155e-05 5.954794e-05 9.4285714 - 25800 0.0026789336 0 5.6853762e-05 2.33174e-05 5.8401995e-05 9.4285714 - 25900 0.0026686904 0 6.7084502e-05 -1.1954024e-05 5.9379012e-05 9.4285714 - 26000 0.0026703643 0 5.6882192e-05 2.5357526e-05 5.608238e-05 9.4285714 - 26100 0.0026825353 0 5.3411638e-05 2.2603349e-05 5.7143751e-05 9.4285714 - 26200 0.0026825174 0 4.4889326e-05 6.9889785e-06 5.8696773e-05 9.4285714 - 26300 0.0025517718 0 5.0976225e-05 2.6619688e-05 6.2081286e-05 9.4285714 - 26400 0.002448155 0 4.6795755e-05 2.6745973e-05 6.9058563e-05 9.4285714 - 26500 0.0023334395 0 3.6329495e-05 2.1444416e-05 6.3642539e-05 9.4285714 - 26600 0.0023097701 0 1.4550567e-05 2.0382944e-05 7.4206161e-05 9.4285714 - 26700 0.0023614287 0 3.6837945e-05 7.9340854e-06 4.7722434e-05 9.4285714 - 26800 0.0023955623 0 3.3758906e-05 1.7850933e-05 5.5370197e-05 9.4285714 - 26900 0.0019993736 0 2.401514e-05 7.8783626e-06 6.8777068e-05 9.4285714 - 27000 0.0019497677 0 3.4976669e-05 2.0510247e-05 8.2493412e-05 9.4285714 - 27100 0.0020363076 0 3.0367221e-05 2.8074655e-05 6.8056692e-05 9.4285714 - 27200 0.0021974785 0 2.8659262e-05 1.6294524e-05 5.6354701e-05 9.4285714 - 27300 0.002350289 0 4.0543677e-05 3.479231e-05 9.0764702e-05 9.4285714 - 27400 0.0026460053 0 3.662854e-05 3.4426146e-05 5.8695061e-05 9.4285714 - 27500 0.0027599044 0 2.6446889e-05 2.899965e-05 3.1521376e-05 9.4285714 - 27600 0.0026660556 0 3.9779618e-05 4.4458176e-05 6.7754246e-05 9.4285714 - 27700 0.0026060398 0 4.7271306e-05 3.8365324e-05 8.0132483e-05 9.4285714 - 27800 0.002724511 0 3.2724273e-05 3.0569502e-05 3.8076705e-05 9.4285714 - 27900 0.0027318479 0 3.2565575e-05 4.4661949e-05 3.5502056e-05 9.4285714 - 28000 0.0026231478 0 3.0921183e-05 6.0356667e-05 6.119464e-05 9.4285714 - 28100 0.0025508556 0 3.8236605e-05 7.3664001e-05 6.7713451e-05 9.4285714 - 28200 0.0025807152 0 2.9349952e-05 7.4140709e-05 6.1882214e-05 9.4285714 - 28300 0.0024074206 0 4.7886113e-05 5.3408061e-05 7.1587209e-05 9.4285714 - 28400 0.0021292859 0 3.9661978e-05 4.0501829e-05 8.4104354e-05 9.4285714 - 28500 0.0022172558 0 9.263267e-06 3.0058013e-05 6.6166187e-05 9.4285714 - 28600 0.0022653927 0 1.0971373e-05 3.0295081e-05 5.9537447e-05 9.4285714 - 28700 0.0025914898 0 3.6755792e-05 6.2489978e-05 7.3424188e-05 9.4285714 - 28800 0.0028276024 0 3.411427e-05 6.1657699e-05 5.2554821e-05 9.4285714 - 28900 0.0029326653 0 2.9451988e-05 5.2815959e-05 4.9287892e-05 9.4285714 - 29000 0.002965493 0 4.3028891e-05 5.075017e-05 4.0608877e-05 9.4285714 - 29100 0.0029096903 0 2.3691422e-05 5.351833e-05 5.2666702e-05 9.4285714 - 29200 0.0028604262 0 2.3683149e-05 7.0673759e-05 5.6222633e-05 9.4285714 - 29300 0.0028093312 0 2.7695636e-05 3.7456562e-05 5.2008785e-05 9.4285714 - 29400 0.0026786162 0 1.7501321e-05 4.5402961e-05 3.9525304e-05 9.4285714 - 29500 0.0025387867 0 2.6252438e-05 0.00011675762 5.4076857e-05 9.4285714 - 29600 0.0026569564 0 2.0179873e-05 3.5543954e-05 5.8794028e-05 9.4285714 - 29700 0.0027207144 0 1.4132151e-05 -1.0930379e-05 4.9793098e-05 9.4285714 - 29800 0.0026892821 0 1.5975512e-05 3.2195344e-05 7.7929499e-05 9.4285714 - 29900 0.002643369 0 9.7678707e-06 1.514329e-05 6.9299393e-05 9.4285714 - 30000 0.0026484998 0 1.8316171e-05 2.1415077e-05 7.6825888e-05 9.4285714 - 30100 0.0028058509 0 2.8010974e-05 3.0588454e-05 8.9088871e-05 9.4285714 - 30200 0.0030353215 0 3.0063085e-05 2.9104606e-05 5.9605817e-05 9.4285714 - 30300 0.0030244988 0 5.9349189e-05 5.3259974e-05 8.9481653e-05 9.4285714 - 30400 0.0030855053 0 3.9650015e-05 3.414212e-05 7.0405413e-05 9.4285714 - 30500 0.0031141819 0 1.5522675e-05 3.9813856e-05 3.5114379e-05 9.4285714 - 30600 0.0030115458 0 6.207961e-05 6.9753316e-05 7.8366207e-05 9.4285714 - 30700 0.0029700178 0 5.3239082e-05 6.3389177e-05 5.4097351e-05 9.4285714 - 30800 0.0029985358 0 5.2375856e-05 5.1058091e-05 3.3422572e-05 9.4285714 - 30900 0.0029689517 0 7.9332461e-05 4.3886728e-05 5.4365146e-05 9.4285714 - 31000 0.0029622718 0 4.1523447e-05 3.6825764e-05 4.5694556e-05 9.4285714 - 31100 0.0029693917 0 3.9693868e-05 3.1903074e-05 5.8747157e-05 9.4285714 - 31200 0.0027246348 0 4.7276494e-05 2.7079375e-05 7.6416899e-05 9.4285714 - 31300 0.0025368424 0 2.0106344e-05 1.9267294e-05 6.5804133e-05 9.4285714 - 31400 0.0023736698 0 3.4928557e-05 2.8361754e-05 7.2137201e-05 9.4285714 - 31500 0.0023946514 0 4.2754557e-05 3.7950211e-05 8.8735068e-05 9.4285714 - 31600 0.0025648037 0 3.7965284e-05 3.50089e-05 8.1900334e-05 9.4285714 - 31700 0.0026956511 0 4.4264259e-05 3.1634807e-05 7.4263237e-05 9.4285714 - 31800 0.002677722 0 4.2244917e-05 3.2173533e-05 8.3389862e-05 9.4285714 - 31900 0.0026705496 0 3.6129898e-05 4.4926239e-05 0.00010110824 9.4285714 - 32000 0.0026466417 0 2.9725035e-05 2.3414537e-05 7.220946e-05 9.4285714 - 32100 0.0026464292 0 5.4134116e-05 3.4177457e-05 6.0288821e-05 9.4285714 - 32200 0.0023705665 0 8.9404512e-05 4.9292654e-05 7.4340835e-05 9.4285714 - 32300 0.0023183595 0 3.1106601e-05 1.969535e-05 7.2988393e-05 9.4285714 - 32400 0.0023882969 0 3.0033e-05 3.3991058e-05 7.1203923e-05 9.4285714 - 32500 0.0023801754 0 2.0067694e-05 3.609562e-05 7.429963e-05 9.4285714 - 32600 0.0024127958 0 1.860145e-05 1.673518e-05 6.100357e-05 9.4285714 - 32700 0.0024031675 0 1.6548008e-05 3.1315194e-05 8.701554e-05 9.4285714 - 32800 0.0023770089 0 3.1288811e-05 3.9427918e-05 5.6604914e-05 9.4285714 - 32900 0.0023568819 0 2.1325065e-05 3.2192459e-05 4.8319222e-05 9.4285714 - 33000 0.0023407285 0 2.2054448e-05 2.8803406e-05 5.5905315e-05 9.4285714 - 33100 0.002327332 0 4.0361707e-05 3.7589399e-05 4.2886312e-05 9.4285714 - 33200 0.0023912585 0 -9.7229548e-07 2.5787094e-05 6.5015833e-05 9.4285714 - 33300 0.0022984153 0 3.2373497e-05 2.5040091e-05 6.9835525e-05 9.4285714 - 33400 0.0022416368 0 2.669143e-05 3.3965765e-05 6.2323403e-05 9.4285714 - 33500 0.0022470637 0 2.3937493e-05 3.2027546e-05 6.683839e-05 9.4285714 - 33600 0.002256129 0 5.0952751e-05 1.2468902e-05 8.4446592e-05 9.4285714 - 33700 0.0022125246 0 3.093841e-05 2.8287747e-05 6.9499172e-05 9.4285714 - 33800 0.0021842197 0 3.5838423e-05 4.2090475e-05 6.9350286e-05 9.4285714 - 33900 0.0021690567 0 2.1933016e-05 2.3178404e-05 6.7082352e-05 9.4285714 - 34000 0.0022206311 0 1.6269784e-05 1.1538009e-05 6.9266998e-05 9.4285714 - 34100 0.0022494061 0 9.1490397e-06 2.3350968e-05 6.8389039e-05 9.4285714 - 34200 0.0022085859 0 1.1855555e-05 3.1674183e-05 7.1002559e-05 9.4285714 - 34300 0.0021855633 0 3.6129131e-05 3.1747187e-05 7.3965145e-05 9.4285714 - 34400 0.0021798298 0 2.9737106e-05 3.3328648e-05 6.9329253e-05 9.4285714 - 34500 0.0021267289 0 3.0875724e-05 3.9773694e-05 7.6428461e-05 9.4285714 - 34600 0.0020466804 0 4.5953975e-05 3.604981e-05 9.1419852e-05 9.4285714 - 34700 0.0020969555 0 2.1591871e-05 2.7684452e-05 7.3703867e-05 9.4285714 - 34800 0.0022946237 0 2.5522835e-05 5.2438515e-05 7.4505556e-05 9.4285714 - 34900 0.0024490201 0 3.0917851e-05 4.7710261e-05 6.8019936e-05 9.4285714 - 35000 0.0023320217 0 1.3576325e-05 2.3430256e-05 9.5266861e-05 9.4285714 - 35100 0.0021890324 0 3.4077104e-05 7.0143939e-05 0.00014586007 9.4285714 - 35200 0.0022124553 0 3.9202113e-05 6.7232341e-05 0.00011830019 9.4285714 - 35300 0.0022584165 0 3.2352745e-05 3.4532597e-05 0.00010884414 9.4285714 - 35400 0.0022737238 0 2.6169969e-05 5.4509206e-05 0.00013180587 9.4285714 - 35500 0.0021537481 0 1.3607191e-05 6.4837671e-05 0.00010851886 9.4285714 - 35600 0.0019831613 0 3.7737426e-05 3.5351631e-05 0.00011069142 9.4285714 - 35700 0.0019041909 0 5.8970853e-05 4.7427627e-05 8.3590155e-05 9.4285714 - 35800 0.0018216502 0 2.0975612e-05 6.7395457e-05 8.6545139e-05 9.4285714 - 35900 0.0018071574 0 4.9077297e-05 5.6297007e-05 8.6311389e-05 9.4285714 - 36000 0.0018645267 0 4.3766063e-05 6.3882304e-05 7.7447784e-05 9.4285714 - 36100 0.0018474198 0 2.7934971e-05 4.1953568e-05 7.3607852e-05 9.4285714 - 36200 0.0017366166 0 6.3710459e-05 5.0034173e-05 8.7289442e-05 9.4285714 - 36300 0.0016630877 0 7.6673753e-05 7.2721043e-05 6.987444e-05 9.4285714 - 36400 0.0016809967 0 7.7155302e-05 5.3898957e-05 5.1930662e-05 9.4285714 - 36500 0.0017478488 0 4.3901858e-05 4.0429824e-05 5.2253472e-05 9.4285714 - 36600 0.0017244649 0 2.428819e-05 4.6012488e-05 3.7569881e-05 9.4285714 - 36700 0.001694793 0 4.1551489e-05 5.7262857e-05 5.4986708e-05 9.4285714 - 36800 0.0016321204 0 2.4522843e-05 6.8176422e-05 5.0512524e-05 9.4285714 - 36900 0.0015208954 0 2.4066113e-05 6.9956589e-05 3.100353e-05 9.4285714 - 37000 0.0014068755 0 3.7418687e-05 3.3424302e-05 4.5889741e-05 9.4285714 - 37100 0.0013361229 0 2.3700045e-05 5.9655032e-05 5.8355744e-05 9.4285714 - 37200 0.001331474 0 2.4647885e-05 2.9564413e-05 6.151617e-05 9.4285714 - 37300 0.0013895388 0 3.1218344e-05 5.3264584e-05 5.4150714e-05 9.4285714 - 37400 0.001407333 0 2.9698504e-05 3.9474095e-05 6.2202002e-05 9.4285714 - 37500 0.0013815772 0 1.8291183e-05 3.6964703e-05 4.5117987e-05 9.4285714 - 37600 0.001367937 0 7.4389408e-06 4.5115277e-05 6.3566279e-05 9.4285714 - 37700 0.0013781896 0 1.1284658e-05 3.3828999e-05 3.0356852e-05 9.4285714 - 37800 0.0013938097 0 7.4598099e-06 2.7777999e-05 4.0234563e-05 9.4285714 - 37900 0.0013788852 0 1.5446137e-05 3.4929786e-05 5.4102572e-05 9.4285714 - 38000 0.0013409916 0 1.4441923e-05 3.3307632e-05 3.9082488e-05 9.4285714 - 38100 0.0013548793 0 6.7717499e-06 2.1259364e-05 6.6745044e-05 9.4285714 - 38200 0.0013619894 0 6.5554231e-06 2.8685491e-05 5.3680355e-05 9.4285714 - 38300 0.0013593654 0 1.056312e-05 2.2266742e-05 4.345309e-05 9.4285714 - 38400 0.0013488508 0 1.557872e-05 2.3814902e-05 6.6112512e-05 9.4285714 - 38500 0.0013399961 0 1.5993586e-05 2.3166151e-05 6.6558579e-05 9.4285714 - 38600 0.0013473117 0 1.5515364e-05 1.4310057e-05 5.3828044e-05 9.4285714 - 38700 0.0013275262 0 1.3467545e-05 3.6691606e-05 5.4651816e-05 9.4285714 - 38800 0.001304838 0 1.2622031e-05 1.8240819e-05 6.8478029e-05 9.4285714 - 38900 0.0012981525 0 1.5965351e-05 7.301553e-07 6.0493525e-05 9.4285714 - 39000 0.0013241474 0 1.090791e-05 1.3786425e-05 5.8612758e-05 9.4285714 - 39100 0.0013302715 0 1.3962184e-05 7.7290833e-06 7.2626585e-05 9.4285714 - 39200 0.0013338793 0 1.9124677e-05 1.2103012e-05 6.4272665e-05 9.4285714 - 39300 0.001337749 0 1.2034083e-05 2.0304797e-05 5.5832191e-05 9.4285714 - 39400 0.0014184127 0 2.3587723e-05 2.6667391e-05 6.1393117e-05 9.4285714 - 39500 0.0015076229 0 3.3529982e-05 2.8742772e-05 5.1854875e-05 9.4285714 - 39600 0.001584196 0 3.329731e-05 3.2142836e-05 5.5667568e-05 9.4285714 - 39700 0.0016673141 0 4.3874089e-05 3.911096e-05 6.1078216e-05 9.4285714 - 39800 0.0016983633 0 3.5412377e-05 3.3834797e-05 4.7630906e-05 9.4285714 - 39900 0.001721388 0 3.933382e-05 3.2179967e-05 4.124963e-05 9.4285714 - 40000 0.0016511866 0 4.0224006e-05 3.6540739e-05 6.1229941e-05 9.4285714 - 40100 0.0015902117 0 3.6395621e-05 3.46428e-05 5.5755476e-05 9.4285714 - 40200 0.0016248457 0 3.4583893e-05 3.816918e-05 4.6174117e-05 9.4285714 - 40300 0.001639017 0 3.2218286e-05 2.1195869e-05 5.094444e-05 9.4285714 - 40400 0.0015947128 0 3.6248764e-05 2.1295273e-05 6.3147523e-05 9.4285714 - 40500 0.0014886812 0 4.7131763e-05 2.4191444e-05 7.2883457e-05 9.4285714 - 40600 0.001483951 0 3.6448135e-05 2.6739025e-05 5.5832321e-05 9.4285714 - 40700 0.0014877422 0 3.5828172e-05 1.4229622e-05 5.437453e-05 9.4285714 - 40800 0.0014974798 0 3.9713792e-05 5.9573135e-06 7.8424652e-05 9.4285714 - 40900 0.0014499802 0 3.0640365e-05 1.6594208e-05 5.5042674e-05 9.4285714 - 41000 0.001395913 0 4.4086797e-05 2.1374448e-05 6.842533e-05 9.4285714 - 41100 0.0014079985 0 3.4018478e-05 4.769345e-06 8.7786364e-05 9.4285714 - 41200 0.0014187083 0 2.5282617e-05 1.068147e-05 4.998439e-05 9.4285714 - 41300 0.0014072972 0 3.8324312e-05 2.7053184e-05 7.2652898e-05 9.4285714 - 41400 0.0014168981 0 2.2198923e-05 2.385181e-05 5.9696044e-05 9.4285714 - 41500 0.0014248439 0 2.2507889e-05 2.4943991e-05 4.8133783e-05 9.4285714 - 41600 0.0014225044 0 1.7477309e-05 2.4821833e-05 7.3031953e-05 9.4285714 - 41700 0.0014075811 0 6.0477226e-06 3.3082497e-05 4.6074646e-05 9.4285714 - 41800 0.0012680617 0 4.0229918e-05 4.5845799e-05 4.7760436e-05 9.4285714 - 41900 0.0010587818 0 8.7500075e-05 2.7520625e-05 8.5329729e-05 9.4285714 - 42000 0.0010007004 0 7.957049e-05 2.7796479e-05 7.179911e-05 9.4285714 - 42100 0.0011304402 0 6.7932609e-05 3.0223682e-05 8.4046251e-05 9.4285714 - 42200 0.0012833154 0 4.4695908e-05 3.1025337e-05 8.6333525e-05 9.4285714 - 42300 0.0013573853 0 3.7885389e-06 3.242561e-05 4.6636393e-05 9.4285714 - 42400 0.0013330633 0 2.5305413e-05 3.6210128e-05 7.9624924e-05 9.4285714 - 42500 0.0012896373 0 4.4892704e-05 4.5307645e-05 8.8376567e-05 9.4285714 - 42600 0.001296775 0 1.2123487e-05 3.1329317e-05 4.689266e-05 9.4285714 - 42700 0.0013193969 0 2.5015346e-05 3.7644129e-05 6.9158547e-05 9.4285714 - 42800 0.0013144903 0 2.7945886e-05 4.3976185e-05 7.2258209e-05 9.4285714 - 42900 0.0013053554 0 2.4932516e-05 2.56847e-05 5.5060153e-05 9.4285714 - 43000 0.0013061323 0 3.505508e-05 3.6703149e-05 6.4102162e-05 9.4285714 - 43100 0.0013149372 0 2.038307e-05 3.6535953e-05 7.001205e-05 9.4285714 - 43200 0.0013063189 0 2.268783e-05 3.1284363e-05 7.1489703e-05 9.4285714 - 43300 0.0012669853 0 4.2151966e-05 3.9616841e-05 8.600203e-05 9.4285714 - 43400 0.0012238388 0 5.3831605e-05 3.1663968e-05 0.00010748716 9.4285714 - 43500 0.0012053096 0 4.8917941e-05 4.1146437e-05 8.2504846e-05 9.4285714 - 43600 0.001243323 0 5.6671957e-05 4.1809653e-05 6.8354881e-05 9.4285714 - 43700 0.001354992 0 6.1374672e-05 3.8833483e-05 7.767147e-05 9.4285714 - 43800 0.0015252788 0 5.8329091e-05 4.5092041e-05 6.9458926e-05 9.4285714 - 43900 0.0016845587 0 5.2409784e-05 4.1549162e-05 6.3318187e-05 9.4285714 - 44000 0.0016987088 0 4.7336939e-05 3.8434001e-05 3.9736647e-05 9.4285714 - 44100 0.0016663634 0 5.3015191e-05 4.4114496e-05 6.0593021e-05 9.4285714 - 44200 0.0016642734 0 5.214706e-05 4.2354707e-05 7.5907264e-05 9.4285714 - 44300 0.0016877933 0 5.0208545e-05 4.4720314e-05 4.2475579e-05 9.4285714 - 44400 0.0016937941 0 5.5355055e-05 4.3854147e-05 5.5002022e-05 9.4285714 - 44500 0.001658184 0 3.9777309e-05 4.0596489e-05 7.2900309e-05 9.4285714 - 44600 0.0016202756 0 2.9046764e-05 4.4611362e-05 8.4216927e-05 9.4285714 - 44700 0.0012624519 0 5.8118979e-05 5.1336615e-05 8.5097154e-05 9.4285714 - 44800 0.0012148648 0 4.7990064e-05 4.5865246e-05 0.00010159441 9.4285714 - 44900 0.0012565599 0 2.0587612e-05 1.8054993e-05 7.9471736e-05 9.4285714 - 45000 0.0012298496 0 5.4851152e-05 4.3491138e-05 8.0059008e-05 9.4285714 - 45100 0.0012274205 0 5.2324153e-05 3.6704358e-05 8.9721391e-05 9.4285714 - 45200 0.0012389066 0 3.7648091e-05 4.0944545e-05 9.5234226e-05 9.4285714 - 45300 0.0012251609 0 6.0261206e-05 5.1852752e-05 9.0949936e-05 9.4285714 - 45400 0.0012814774 0 6.4393391e-05 3.7667283e-05 7.6665383e-05 9.4285714 - 45500 0.0013450626 0 5.3955889e-05 3.333518e-05 6.2323361e-05 9.4285714 - 45600 0.0013741472 0 7.6840597e-05 4.8885582e-05 7.5101429e-05 9.4285714 - 45700 0.0014351223 0 6.9926667e-05 4.095132e-05 6.4348005e-05 9.4285714 - 45800 0.0015284371 0 6.5168141e-05 5.0243258e-05 5.8089422e-05 9.4285714 - 45900 0.001575355 0 6.7430051e-05 6.1147022e-05 7.5616361e-05 9.4285714 - 46000 0.0015147792 0 5.974587e-05 5.4339958e-05 6.89933e-05 9.4285714 - 46100 0.0014504182 0 5.7541539e-05 5.0006578e-05 7.0543678e-05 9.4285714 - 46200 0.0014410639 0 5.8653588e-05 5.2586065e-05 8.1219081e-05 9.4285714 - 46300 0.0014810525 0 4.7027763e-05 3.957261e-05 4.9542345e-05 9.4285714 - 46400 0.0014640215 0 4.979541e-05 1.7965262e-05 6.0180114e-05 9.4285714 - 46500 0.0014424933 0 5.8745985e-05 5.7017286e-05 6.8960391e-05 9.4285714 - 46600 0.001441165 0 6.0140939e-05 4.6475918e-05 5.6358378e-05 9.4285714 - 46700 0.0015025344 0 5.7998976e-05 1.9007372e-05 6.9395672e-05 9.4285714 - 46800 0.0015582176 0 5.9436654e-05 4.8677122e-05 5.618251e-05 9.4285714 - 46900 0.0015803324 0 5.4329951e-05 4.4548088e-05 4.6224761e-05 9.4285714 - 47000 0.001675143 0 6.7118862e-05 5.1584703e-05 6.351515e-05 9.4285714 - 47100 0.0017769921 0 6.6842957e-05 5.3736059e-05 5.062399e-05 9.4285714 - 47200 0.0018358006 0 7.1689975e-05 5.6118418e-05 4.7990149e-05 9.4285714 - 47300 0.0017951326 0 7.4127289e-05 7.3816363e-05 5.0104237e-05 9.4285714 - 47400 0.0017057371 0 7.2774664e-05 4.7651294e-05 3.5218695e-05 9.4285714 - 47500 0.0016744493 0 6.6367496e-05 5.9365352e-05 5.0217044e-05 9.4285714 - 47600 0.0014031951 0 7.8136546e-05 6.6155937e-05 6.7384693e-05 9.4285714 - 47700 0.0013373039 0 7.0639329e-05 2.511137e-05 3.9534806e-05 9.4285714 - 47800 0.0014704003 0 6.5287146e-05 6.1682091e-05 5.2105143e-05 9.4285714 - 47900 0.0014934525 0 5.7380229e-05 6.0784906e-05 5.1933873e-05 9.4285714 - 48000 0.0014895856 0 5.7777082e-05 3.2566077e-05 5.6885486e-05 9.4285714 - 48100 0.00146967 0 6.2296437e-05 5.9058125e-05 8.2342951e-05 9.4285714 - 48200 0.0015682986 0 5.6963813e-05 6.9617445e-05 5.2534658e-05 9.4285714 - 48300 0.0017163505 0 6.1379044e-05 7.1818241e-05 5.7325956e-05 9.4285714 - 48400 0.0014261936 0 7.3161005e-05 6.1824088e-05 8.2548349e-05 9.4285714 - 48500 0.0014236361 0 6.1449743e-05 4.8278985e-05 4.0124971e-05 9.4285714 - 48600 0.0014562257 0 4.5352973e-05 6.5203729e-05 2.9114173e-05 9.4285714 - 48700 0.0013758282 0 5.142512e-05 5.5645429e-05 5.0808976e-05 9.4285714 - 48800 0.0014316476 0 4.7089175e-05 2.3932718e-05 6.2491645e-05 9.4285714 - 48900 0.0014805023 0 3.202017e-05 2.5779532e-05 2.4693407e-05 9.4285714 - 49000 0.0013776549 0 4.5921287e-05 3.5365771e-05 4.1227618e-05 9.4285714 - 49100 0.0013617488 0 3.9474501e-05 4.6966656e-05 9.1036599e-05 9.4285714 - 49200 0.0013342401 0 7.8714486e-05 3.901494e-05 4.6082427e-05 9.4285714 - 49300 0.001276486 0 8.5308627e-05 4.9747481e-05 6.6920379e-05 9.4285714 - 49400 0.0011795288 0 5.385526e-05 7.1565933e-05 7.5941735e-05 9.4285714 - 49500 0.0011435859 0 6.7438968e-05 5.252065e-05 4.4969603e-05 9.4285714 - 49600 0.001247689 0 4.8189516e-05 5.606737e-05 7.5562669e-05 9.4285714 - 49700 0.0013371245 0 3.0586887e-05 3.3461339e-05 5.7168685e-05 9.4285714 - 49800 0.001301722 0 3.5961521e-05 4.0225086e-05 5.5419691e-05 9.4285714 - 49900 0.0012728363 0 3.781088e-05 6.7681947e-05 7.3469228e-05 9.4285714 - 50000 0.0013286836 0 2.0747917e-05 3.2920899e-05 5.6036366e-05 9.4285714 - 50100 0.0013460063 0 2.2076031e-05 3.3652205e-05 6.008755e-05 9.4285714 - 50200 0.0012868089 0 2.9384106e-05 5.6767755e-05 7.0843856e-05 9.4285714 - 50300 0.0012765172 0 3.4521368e-05 4.9418831e-05 7.0177943e-05 9.4285714 - 50400 0.0012703222 0 3.6291462e-05 6.8474511e-05 7.0682948e-05 9.4285714 - 50500 0.0011906512 0 4.1093781e-05 7.1478191e-05 7.2068398e-05 9.4285714 - 50600 0.0011537339 0 3.1556882e-05 4.1722061e-05 7.9155785e-05 9.4285714 - 50700 0.0011267336 0 2.9306562e-05 5.3537978e-05 0.00010138475 9.4285714 - 50800 0.0011753482 0 4.1295435e-05 4.117216e-05 0.00010940627 9.4285714 - 50900 0.0011919232 0 3.5291826e-05 2.7690085e-05 6.4859546e-05 9.4285714 - 51000 0.0011838525 0 3.7804427e-05 4.3372281e-05 7.4969581e-05 9.4285714 - 51100 0.0011883954 0 6.1459693e-05 4.6697285e-05 7.7009321e-05 9.4285714 - 51200 0.0012349694 0 4.8996624e-05 3.1792466e-05 4.2980098e-05 9.4285714 - 51300 0.0012337432 0 3.0225925e-05 3.3059018e-05 6.4590344e-05 9.4285714 - 51400 0.0011577306 0 8.2698384e-05 3.8030266e-05 9.1759993e-05 9.4285714 - 51500 0.0011811724 0 5.9469946e-05 3.0730225e-05 9.4515804e-05 9.4285714 - 51600 0.0012159313 0 4.752115e-05 2.2092938e-05 8.3450965e-05 9.4285714 - 51700 0.0011936762 0 5.9485961e-05 3.9926221e-05 9.155953e-05 9.4285714 - 51800 0.00119466 0 3.5951585e-05 4.0938525e-05 8.2492561e-05 9.4285714 - 51900 0.0012013641 0 3.9985087e-05 3.1268943e-05 6.9196585e-05 9.4285714 - 52000 0.0011652185 0 4.7598806e-05 4.0944772e-05 8.152202e-05 9.4285714 - 52100 0.0011222289 0 3.739268e-05 4.0163882e-05 7.9877837e-05 9.4285714 - 52200 0.0011223637 0 4.1767012e-05 4.3238615e-05 8.1620009e-05 9.4285714 - 52300 0.00108781 0 4.2621468e-05 4.8449175e-05 8.8351917e-05 9.4285714 - 52400 0.0010329114 0 4.2272037e-05 4.6831094e-05 9.0371289e-05 9.4285714 - 52500 0.0010414794 0 5.8841141e-05 4.2908938e-05 9.7364103e-05 9.4285714 - 52600 0.0011160581 0 5.0413342e-05 4.0018307e-05 8.1832238e-05 9.4285714 - 52700 0.0011365494 0 5.4799404e-05 3.9990197e-05 6.8582155e-05 9.4285714 - 52800 0.0011528486 0 5.9449422e-05 4.4180114e-05 7.8135764e-05 9.4285714 - 52900 0.001215765 0 7.724582e-05 6.6093449e-05 0.0001064278 9.4285714 - 53000 0.0013368124 0 7.3703922e-05 5.0858461e-05 7.6836114e-05 9.4285714 - 53100 0.0013407312 0 6.2171068e-05 5.3889729e-05 6.880048e-05 9.4285714 - 53200 0.0013326843 0 6.4548253e-05 6.224984e-05 8.4641195e-05 9.4285714 - 53300 0.0013239729 0 6.0319543e-05 5.8209843e-05 6.5588436e-05 9.4285714 - 53400 0.0013217143 0 5.3952234e-05 6.2188072e-05 5.7866618e-05 9.4285714 - 53500 0.0012781803 0 6.1927188e-05 7.8771424e-05 6.5769719e-05 9.4285714 - 53600 0.001268382 0 6.6769939e-05 6.7552155e-05 7.9292264e-05 9.4285714 - 53700 0.0012069904 0 6.3035353e-05 7.6839293e-05 6.4761494e-05 9.4285714 - 53800 0.0011968988 0 7.7775234e-05 8.0850068e-05 6.4073986e-05 9.4285714 - 53900 0.0011731954 0 7.8942799e-05 6.415663e-05 6.8798682e-05 9.4285714 - 54000 0.0011606061 0 7.0843597e-05 6.4421097e-05 5.9264639e-05 9.4285714 - 54100 0.0011658982 0 7.3791408e-05 5.9714351e-05 5.9388294e-05 9.4285714 - 54200 0.0011195165 0 7.5062867e-05 5.1967479e-05 6.6867658e-05 9.4285714 - 54300 0.0010220393 0 7.1628947e-05 5.5455247e-05 7.5330768e-05 9.4285714 - 54400 0.0010086172 0 7.5800982e-05 4.2581182e-05 9.7752447e-05 9.4285714 - 54500 0.0010183988 0 6.9462298e-05 2.7534816e-05 9.3677455e-05 9.4285714 - 54600 0.0010068716 0 6.3307701e-05 4.0044863e-05 6.4661139e-05 9.4285714 - 54700 0.00099012603 0 6.054033e-05 3.7788592e-05 7.4230926e-05 9.4285714 - 54800 0.0009683722 0 7.7618706e-05 3.4929403e-05 8.2615118e-05 9.4285714 - 54900 0.00097629715 0 6.0748376e-05 4.7953003e-05 6.5727568e-05 9.4285714 - 55000 0.00095157382 0 5.7032086e-05 3.6371601e-05 6.1479859e-05 9.4285714 - 55100 0.00090688968 0 6.6813633e-05 3.8068449e-05 6.0136453e-05 9.4285714 - 55200 0.00088813057 0 5.4468645e-05 4.2209266e-05 5.6362466e-05 9.4285714 - 55300 0.00092557007 0 4.5622928e-05 3.7235869e-05 5.519561e-05 9.4285714 - 55400 0.00091327263 0 3.1184159e-05 4.7698311e-05 4.1473986e-05 9.4285714 - 55500 0.00079921186 0 4.2037172e-05 5.9276972e-05 5.152938e-05 9.4285714 - 55600 0.00081947901 0 5.355572e-05 6.752627e-05 7.3883049e-05 9.4285714 - 55700 0.00084804465 0 1.9648479e-05 2.4946587e-05 7.3095049e-05 9.4285714 - 55800 0.00085118568 0 2.6490199e-05 4.8069956e-05 5.690315e-05 9.4285714 - 55900 0.00079015144 0 5.1906966e-05 3.7090677e-05 6.8990067e-05 9.4285714 - 56000 0.00077424122 0 5.5619324e-05 2.6584622e-05 7.9553055e-05 9.4285714 - 56100 0.00078729859 0 5.7527201e-05 5.8252464e-05 5.5596022e-05 9.4285714 - 56200 0.00073803593 0 6.0864638e-05 2.5528312e-05 6.7041285e-05 9.4285714 - 56300 0.00072042566 0 6.6197657e-05 2.6713058e-05 8.9317267e-05 9.4285714 - 56400 0.00072618636 0 7.0243805e-05 4.6306853e-05 6.6723713e-05 9.4285714 - 56500 0.00072889383 0 6.1503242e-05 3.1283082e-05 5.6818079e-05 9.4285714 - 56600 0.00071687768 0 6.0574003e-05 3.8132065e-05 7.2674723e-05 9.4285714 - 56700 0.00070767909 0 6.2668821e-05 3.182732e-05 6.6720519e-05 9.4285714 - 56800 0.0007079533 0 5.0107283e-05 2.8951951e-05 7.3466661e-05 9.4285714 - 56900 0.00068006672 0 6.2013944e-05 5.565292e-05 6.162706e-05 9.4285714 - 57000 0.000671041 0 6.7800283e-05 4.9108988e-05 5.0514824e-05 9.4285714 - 57100 0.00074371147 0 6.0778783e-05 4.6623614e-05 7.0016036e-05 9.4285714 - 57200 0.00081400221 0 6.6854831e-05 5.6455913e-05 4.7909892e-05 9.4285714 - 57300 0.000917037 0 6.037679e-05 5.831922e-05 3.0276201e-05 9.4285714 - 57400 0.00094626663 0 3.6929202e-05 5.5118126e-05 6.3066718e-05 9.4285714 - 57500 0.00093346301 0 4.2929284e-05 6.1155376e-05 5.975267e-05 9.4285714 - 57600 0.00093999622 0 5.4774372e-05 5.4704358e-05 6.248684e-05 9.4285714 - 57700 0.00094337314 0 5.1052798e-05 5.8541842e-05 7.5050098e-05 9.4285714 - 57800 0.00092645123 0 5.4055981e-05 6.1848007e-05 6.7174441e-05 9.4285714 - 57900 0.00091253668 0 4.336952e-05 5.0710047e-05 6.1963165e-05 9.4285714 - 58000 0.0009262852 0 4.2890115e-05 4.3909161e-05 6.5498785e-05 9.4285714 - 58100 0.00093298888 0 3.4648981e-05 3.9769303e-05 4.8809176e-05 9.4285714 - 58200 0.00093354721 0 2.9625295e-05 3.8316918e-05 4.9736312e-05 9.4285714 - 58300 0.00093283167 0 3.7120772e-05 3.3230543e-05 5.9892908e-05 9.4285714 - 58400 0.00093485322 0 3.2158058e-05 3.1324318e-05 4.9175918e-05 9.4285714 - 58500 0.00092566721 0 3.7365351e-05 2.89221e-05 5.5349063e-05 9.4285714 - 58600 0.00093205032 0 5.0065939e-05 5.3559803e-05 6.3571654e-05 9.4285714 - 58700 0.00094034992 0 3.8592173e-05 3.491305e-05 6.5379756e-05 9.4285714 - 58800 0.00096489026 0 4.1216942e-05 2.6009902e-05 7.102403e-05 9.4285714 - 58900 0.00097781296 0 6.3787952e-05 5.0445974e-05 6.6836738e-05 9.4285714 - 59000 0.00095088201 0 3.1388682e-05 2.6786636e-05 7.0766736e-05 9.4285714 - 59100 0.00092096092 0 4.7421629e-05 4.3182864e-05 7.2537665e-05 9.4285714 - 59200 0.0009112309 0 5.9256553e-05 5.4527325e-05 6.2965257e-05 9.4285714 - 59300 0.00090372653 0 3.3360205e-05 4.1028509e-05 6.9712928e-05 9.4285714 - 59400 0.00086115007 0 5.1420253e-05 8.2036947e-05 6.6038419e-05 9.4285714 - 59500 0.00078451189 0 7.66347e-05 7.591886e-05 6.2707873e-05 9.4285714 - 59600 0.00078587175 0 3.7807167e-05 3.6366682e-05 6.7965056e-05 9.4285714 - 59700 0.00080103949 0 5.7673906e-05 4.7966293e-05 7.051971e-05 9.4285714 - 59800 0.00078782591 0 4.4966944e-05 4.2368336e-05 6.5414206e-05 9.4285714 - 59900 0.00077243837 0 2.4721291e-05 4.6742391e-05 6.6324623e-05 9.4285714 - 60000 0.00075159859 0 5.8959702e-05 5.3911659e-05 7.3517042e-05 9.4285714 - 60100 0.00072169229 0 5.5959875e-05 5.9933611e-05 7.0405063e-05 9.4285714 - 60200 0.00067937954 0 8.4634924e-05 6.6869788e-05 7.3608653e-05 9.4285714 - 60300 0.00067260226 0 0.0001081277 4.7614083e-05 7.0175997e-05 9.4285714 - 60400 0.00069286984 0 5.9196097e-05 4.3191533e-05 5.2139603e-05 9.4285714 - 60500 0.00069736312 0 5.085609e-05 5.5875528e-05 6.6887124e-05 9.4285714 - 60600 0.00069858614 0 4.9289319e-05 4.5459761e-05 7.1668508e-05 9.4285714 - 60700 0.00069821214 0 3.1823553e-05 3.3716244e-05 5.5201529e-05 9.4285714 - 60800 0.0007035508 0 5.1159207e-05 3.5328208e-05 6.3688313e-05 9.4285714 - 60900 0.00070770846 0 4.0687682e-05 2.1755707e-05 6.6080801e-05 9.4285714 - 61000 0.00070195965 0 3.7971557e-05 2.1957987e-05 6.0082676e-05 9.4285714 - 61100 0.00067865064 0 5.7377129e-05 2.5987671e-05 6.872458e-05 9.4285714 - 61200 0.00063690893 0 3.9606468e-05 2.5848129e-05 6.6201193e-05 9.4285714 - 61300 0.00064194236 0 5.2441034e-05 3.4655185e-05 5.8671505e-05 9.4285714 - 61400 0.00063121847 0 4.7935018e-05 2.2491486e-05 5.8084377e-05 9.4285714 - 61500 0.00065356029 0 3.7527612e-05 2.0937477e-05 4.887051e-05 9.4285714 - 61600 0.00066743886 0 3.8559623e-05 2.5014056e-05 4.3951677e-05 9.4285714 - 61700 0.00064876312 0 3.2600293e-05 2.2241219e-05 5.700072e-05 9.4285714 - 61800 0.00063251553 0 3.7962233e-05 2.4996757e-05 6.3827843e-05 9.4285714 - 61900 0.00065196202 0 4.1125532e-05 2.1960645e-05 5.3369952e-05 9.4285714 - 62000 0.00066211487 0 3.5477887e-05 2.2798208e-05 4.6798579e-05 9.4285714 - 62100 0.00063838911 0 4.2783526e-05 3.0011478e-05 5.2953097e-05 9.4285714 - 62200 0.00062154839 0 4.2874196e-05 2.533148e-05 6.0806919e-05 9.4285714 - 62300 0.00063042258 0 3.7398998e-05 2.3748859e-05 5.50952e-05 9.4285714 - 62400 0.00064307282 0 4.2219258e-05 2.4395739e-05 4.2906023e-05 9.4285714 - 62500 0.00062261967 0 4.3025073e-05 2.0264778e-05 4.8658599e-05 9.4285714 - 62600 0.00053916399 0 3.5096062e-05 2.6627415e-05 6.589849e-05 9.4285714 - 62700 0.00057010612 0 3.1052104e-05 2.4098754e-05 5.5807999e-05 9.4285714 - 62800 0.00057237373 0 2.4705173e-05 2.7289243e-05 5.0697954e-05 9.4285714 - 62900 0.00056115858 0 3.4438793e-05 2.5529621e-05 6.6910453e-05 9.4285714 - 63000 0.0005691916 0 3.2831951e-05 3.4373261e-05 6.7414973e-05 9.4285714 - 63100 0.00056814223 0 3.0683193e-05 4.0598453e-05 6.0776437e-05 9.4285714 - 63200 0.00055359969 0 3.3021543e-05 2.205701e-05 6.6701949e-05 9.4285714 - 63300 0.00053663894 0 2.9793234e-05 2.4124459e-05 6.7366363e-05 9.4285714 - 63400 0.00055318219 0 3.5076151e-05 3.7492408e-05 6.7248496e-05 9.4285714 - 63500 0.0005601025 0 3.1596017e-05 2.838392e-05 5.758537e-05 9.4285714 - 63600 0.00054583913 0 3.1887335e-05 3.3258333e-05 6.4545104e-05 9.4285714 - 63700 0.00053483868 0 4.1596672e-05 3.1294263e-05 7.517425e-05 9.4285714 - 63800 0.00055522493 0 3.672744e-05 2.2703198e-05 5.6489688e-05 9.4285714 - 63900 0.00056121598 0 3.7366567e-05 3.3134619e-05 5.2202899e-05 9.4285714 - 64000 0.00054407633 0 4.3628447e-05 2.8715277e-05 6.6320822e-05 9.4285714 - 64100 0.00053661653 0 3.9455768e-05 2.7513024e-05 6.5322037e-05 9.4285714 - 64200 0.00055006192 0 3.8096257e-05 3.5652328e-05 5.7299498e-05 9.4285714 - 64300 0.00055163304 0 3.6955416e-05 3.1648454e-05 5.7391176e-05 9.4285714 - 64400 0.00053078787 0 3.7098375e-05 3.3595793e-05 6.6463932e-05 9.4285714 - 64500 0.00052058058 0 4.6628247e-05 3.4753784e-05 7.0892035e-05 9.4285714 - 64600 0.00052834957 0 4.414476e-05 3.6395151e-05 6.316293e-05 9.4285714 - 64700 0.00051311026 0 3.5727083e-05 3.8183336e-05 6.671273e-05 9.4285714 - 64800 0.00048606856 0 4.2559508e-05 4.0103891e-05 8.1477875e-05 9.4285714 - 64900 0.00047345864 0 5.0985821e-05 4.0731547e-05 7.1758651e-05 9.4285714 - 65000 0.00048454696 0 4.7098363e-05 4.2424083e-05 5.9782966e-05 9.4285714 - 65100 0.00048928041 0 3.8488893e-05 3.3069689e-05 6.763104e-05 9.4285714 - 65200 0.00047037779 0 3.7164979e-05 2.9130535e-05 6.7155792e-05 9.4285714 - 65300 0.000474477 0 3.9218249e-05 4.196618e-05 6.8795241e-05 9.4285714 - 65400 0.00047558993 0 3.8521073e-05 3.1043813e-05 7.1815292e-05 9.4285714 - 65500 0.00046258212 0 4.1593649e-05 3.414273e-05 7.5432256e-05 9.4285714 - 65600 0.00044433429 0 3.5579651e-05 5.4040477e-05 7.7356068e-05 9.4285714 - 65700 0.00045238336 0 3.9273267e-05 4.3267794e-05 6.3398702e-05 9.4285714 - 65800 0.00045926142 0 3.9114883e-05 4.3180432e-05 5.1925433e-05 9.4285714 - 65900 0.00045814994 0 3.5346175e-05 4.9168887e-05 5.5917302e-05 9.4285714 - 66000 0.00045395179 0 4.1802785e-05 4.1841434e-05 5.4654623e-05 9.4285714 - 66100 0.00044097892 0 4.303704e-05 4.8028086e-05 5.8818816e-05 9.4285714 - 66200 0.00041508101 0 4.8543666e-05 3.9621607e-05 7.3522108e-05 9.4285714 - 66300 0.00041227685 0 5.2084505e-05 4.5979245e-05 6.8430336e-05 9.4285714 - 66400 0.00039539458 0 4.6843181e-05 6.5667377e-05 6.7548286e-05 9.4285714 - 66500 0.00038647539 0 4.608784e-05 4.6277662e-05 6.9495307e-05 9.4285714 - 66600 0.00037432719 0 4.3913456e-05 3.8070862e-05 6.6935341e-05 9.4285714 - 66700 0.00035679642 0 5.5360539e-05 5.3483363e-05 7.063512e-05 9.4285714 - 66800 0.00034618795 0 5.847549e-05 4.4325179e-05 7.0488097e-05 9.4285714 - 66900 0.00032906055 0 5.8213474e-05 3.75252e-05 6.6649118e-05 9.4285714 - 67000 0.00031945785 0 6.3298441e-05 5.2701267e-05 7.7167191e-05 9.4285714 - 67100 0.00031672216 0 4.489739e-05 3.7559519e-05 7.3281523e-05 9.4285714 - 67200 0.00030445379 0 4.5513665e-05 4.0230046e-05 7.5439548e-05 9.4285714 - 67300 0.00028386109 0 5.0694754e-05 5.3700723e-05 8.5557097e-05 9.4285714 - 67400 0.00028463754 0 3.8391205e-05 3.3590941e-05 7.797623e-05 9.4285714 - 67500 0.00028212316 0 4.2863805e-05 4.5202441e-05 7.749573e-05 9.4285714 - 67600 0.00027447589 0 5.543118e-05 5.8396501e-05 7.4714483e-05 9.4285714 - 67700 0.00026388856 0 5.0592736e-05 4.4055104e-05 6.9911544e-05 9.4285714 - 67800 0.00024769801 0 6.5177148e-05 4.5745739e-05 6.5602599e-05 9.4285714 - 67900 0.00024192231 0 6.9377263e-05 4.6139865e-05 5.8414044e-05 9.4285714 - 68000 0.00023732277 0 5.0197197e-05 3.9809922e-05 5.4178627e-05 9.4285714 - 68100 0.0002230537 0 5.4643625e-05 4.3410202e-05 5.8363052e-05 9.4285714 - 68200 0.00020295655 0 5.7973425e-05 4.2934462e-05 5.3811509e-05 9.4285714 - 68300 0.0002040692 0 5.3065138e-05 3.4839799e-05 4.2275493e-05 9.4285714 - 68400 0.0001928169 0 6.1792781e-05 3.7412012e-05 4.3570824e-05 9.4285714 - 68500 0.00019326451 0 5.2340518e-05 3.8984277e-05 4.7626124e-05 9.4285714 - 68600 0.00019061041 0 3.3931824e-05 3.7677933e-05 4.0928013e-05 9.4285714 - 68700 0.00017904605 0 4.0673445e-05 4.3141559e-05 3.9727826e-05 9.4285714 - 68800 0.00017200167 0 3.8350528e-05 4.2946416e-05 3.8465748e-05 9.4285714 - 68900 0.00016728354 0 3.1344975e-05 4.3170379e-05 3.887812e-05 9.4285714 - 69000 0.00015703321 0 3.5673797e-05 4.8001887e-05 3.8324617e-05 9.4285714 - 69100 0.00014835113 0 4.4420071e-05 4.5039258e-05 3.7284097e-05 9.4285714 - 69200 0.00014631648 0 4.5177892e-05 3.9830143e-05 4.212271e-05 9.4285714 - 69300 0.00014587978 0 4.3274932e-05 3.563871e-05 4.1406359e-05 9.4285714 - 69400 0.0001418924 0 4.1983462e-05 3.3903645e-05 3.9133291e-05 9.4285714 - 69500 0.00013332024 0 4.1111435e-05 3.5405818e-05 4.5389867e-05 9.4285714 - 69600 0.00013320187 0 4.3136478e-05 3.8499769e-05 4.2978866e-05 9.4285714 - 69700 0.00013039836 0 3.9889343e-05 3.984009e-05 3.8089701e-05 9.4285714 - 69800 0.00012003394 0 4.0502669e-05 3.8418635e-05 4.4259944e-05 9.4285714 - 69900 0.00011651147 0 4.3215219e-05 3.6715848e-05 3.8146062e-05 9.4285714 - 70000 0.00012197106 0 3.5974329e-05 3.7263458e-05 3.1823087e-05 9.4285714 - 70100 0.00011813389 0 3.3261682e-05 3.922066e-05 3.7223065e-05 9.4285714 - 70200 0.00011097253 0 4.3507998e-05 4.1005238e-05 3.6828442e-05 9.4285714 - 70300 0.00010887364 0 4.2691098e-05 4.1645364e-05 3.1923473e-05 9.4285714 - 70400 0.00010916786 0 3.8897532e-05 3.8882274e-05 3.0505603e-05 9.4285714 - 70500 0.00010031774 0 4.4471407e-05 3.8144163e-05 3.4373186e-05 9.4285714 - 70600 9.1002834e-05 0 4.7098547e-05 3.649462e-05 3.426412e-05 9.4285714 - 70700 8.9186179e-05 0 4.3097819e-05 3.3856047e-05 2.6847974e-05 9.4285714 - 70800 9.1206485e-05 0 3.7704331e-05 3.2681829e-05 2.5848378e-05 9.4285714 - 70900 9.2333335e-05 0 3.5465377e-05 2.9981706e-05 2.5583227e-05 9.4285714 - 71000 9.1646266e-05 0 3.5132909e-05 2.8584216e-05 1.9282618e-05 9.4285714 - 71100 8.9976882e-05 0 3.1203655e-05 2.8088468e-05 2.108987e-05 9.4285714 - 71200 8.7702811e-05 0 2.9776889e-05 2.7094367e-05 2.4903607e-05 9.4285714 - 71300 8.6905185e-05 0 3.0520731e-05 2.732226e-05 2.3630509e-05 9.4285714 - 71400 8.5684023e-05 0 3.1640955e-05 2.8295849e-05 2.5514683e-05 9.4285714 - 71500 8.303695e-05 0 3.1906051e-05 2.8942238e-05 2.6131204e-05 9.4285714 - 71600 8.0199459e-05 0 3.0761704e-05 2.9470436e-05 2.487383e-05 9.4285714 - 71700 7.8917712e-05 0 3.2914973e-05 2.7677434e-05 2.5055145e-05 9.4285714 - 71800 8.006745e-05 0 3.1497824e-05 2.5000482e-05 2.4489101e-05 9.4285714 - 71900 7.8740588e-05 0 2.6991222e-05 2.460004e-05 2.3419712e-05 9.4285714 - 72000 7.758597e-05 0 2.8819401e-05 2.2478384e-05 2.4645592e-05 9.4285714 - 72100 7.7221401e-05 0 2.5009767e-05 1.991734e-05 2.4408972e-05 9.4285714 - 72200 7.6375029e-05 0 2.2842085e-05 2.1163227e-05 2.2915187e-05 9.4285714 - 72300 7.2834947e-05 0 2.6583555e-05 2.3097898e-05 2.3018668e-05 9.4285714 - 72400 7.2648265e-05 0 2.236431e-05 2.2607332e-05 2.3603044e-05 9.4285714 - 72500 7.3708292e-05 0 2.0776311e-05 2.25305e-05 2.4103466e-05 9.4285714 - 72600 7.1153221e-05 0 2.4306783e-05 2.313245e-05 2.3536247e-05 9.4285714 - 72700 6.9093949e-05 0 2.3601182e-05 2.178735e-05 2.3525837e-05 9.4285714 - 72800 7.0003138e-05 0 2.575131e-05 2.0944617e-05 2.5430066e-05 9.4285714 - 72900 7.097186e-05 0 2.6452603e-05 2.1328369e-05 2.53877e-05 9.4285714 - 73000 6.9754446e-05 0 2.213547e-05 2.0988145e-05 2.4646738e-05 9.4285714 - 73100 6.8919462e-05 0 2.2747069e-05 2.1416306e-05 2.4400352e-05 9.4285714 - 73200 7.0813485e-05 0 2.2484425e-05 2.0251199e-05 2.3243164e-05 9.4285714 - 73300 7.2448906e-05 0 1.9804724e-05 1.9246194e-05 2.1950811e-05 9.4285714 - 73400 7.1636811e-05 0 2.1255199e-05 2.0486399e-05 2.1055118e-05 9.4285714 - 73500 7.0735739e-05 0 2.0995952e-05 2.0423027e-05 2.0958957e-05 9.4285714 - 73600 7.103569e-05 0 2.0353207e-05 1.8013285e-05 2.1741465e-05 9.4285714 - 73700 7.1516165e-05 0 2.2806996e-05 1.7981222e-05 2.0668719e-05 9.4285714 - 73800 7.0454708e-05 0 2.2580346e-05 2.035185e-05 1.8435762e-05 9.4285714 - 73900 7.0921505e-05 0 2.1137284e-05 1.954202e-05 1.8049504e-05 9.4285714 - 74000 7.3462894e-05 0 2.0796149e-05 1.672734e-05 1.7886189e-05 9.4285714 - 74100 7.3200399e-05 0 1.9484009e-05 1.6171253e-05 1.7946802e-05 9.4285714 - 74200 7.1848724e-05 0 1.9770963e-05 1.743579e-05 1.9028311e-05 9.4285714 - 74300 7.2382347e-05 0 2.0879182e-05 1.7718467e-05 2.0981856e-05 9.4285714 - 74400 7.3931763e-05 0 2.0659065e-05 1.6936936e-05 2.2013677e-05 9.4285714 - 74500 7.4402751e-05 0 2.1252227e-05 1.8306621e-05 2.2140434e-05 9.4285714 - 74600 7.3859362e-05 0 2.1524301e-05 1.984441e-05 2.2433352e-05 9.4285714 - 74700 7.5361374e-05 0 2.0479515e-05 1.8257955e-05 2.2346749e-05 9.4285714 - 74800 7.7630509e-05 0 1.9658252e-05 1.7440486e-05 2.2082059e-05 9.4285714 - 74900 7.7455142e-05 0 1.9321421e-05 1.8948852e-05 2.2192267e-05 9.4285714 - 75000 7.6480769e-05 0 1.9864233e-05 1.958709e-05 2.2733891e-05 9.4285714 - 75100 7.7275693e-05 0 2.0777179e-05 1.8582778e-05 2.3848355e-05 9.4285714 - 75200 7.8822667e-05 0 2.0204804e-05 1.83074e-05 2.4082458e-05 9.4285714 - 75300 7.923137e-05 0 2.0681311e-05 2.0382671e-05 2.5228862e-05 9.4285714 - 75400 7.9015035e-05 0 2.1545898e-05 2.0989157e-05 2.7089143e-05 9.4285714 - 75500 8.0621162e-05 0 2.0520236e-05 1.9823266e-05 2.7897725e-05 9.4285714 - 75600 8.2299447e-05 0 1.9866765e-05 2.0164834e-05 2.7806735e-05 9.4285714 - 75700 8.1993378e-05 0 1.969152e-05 2.0690749e-05 2.7317517e-05 9.4285714 - 75800 8.1758987e-05 0 2.1884472e-05 2.0805882e-05 2.7195769e-05 9.4285714 - 75900 8.3084215e-05 0 2.4065485e-05 2.0289009e-05 2.8137854e-05 9.4285714 - 76000 8.197148e-05 0 2.3344459e-05 2.1043448e-05 2.9166608e-05 9.4285714 - 76100 7.3534139e-05 0 2.3656353e-05 2.1820885e-05 3.1715958e-05 9.4285714 - 76200 6.8283079e-05 0 1.8356974e-05 2.3351418e-05 3.3215539e-05 9.4285714 - 76300 7.8227289e-05 0 1.7533203e-05 2.0633655e-05 2.9627901e-05 9.4285714 - 76400 8.2994806e-05 0 2.2219758e-05 1.9318399e-05 2.6222999e-05 9.4285714 - 76500 8.3014892e-05 0 2.0667316e-05 2.3535727e-05 2.7388901e-05 9.4285714 - 76600 8.4226362e-05 0 1.8578669e-05 1.9657192e-05 2.6838122e-05 9.4285714 - 76700 8.6131526e-05 0 2.1318346e-05 1.9704283e-05 2.730706e-05 9.4285714 - 76800 8.5731394e-05 0 2.1580982e-05 2.4368187e-05 2.8520608e-05 9.4285714 - 76900 8.5941781e-05 0 2.0964064e-05 2.1327147e-05 2.8452609e-05 9.4285714 - 77000 8.8001094e-05 0 2.1055465e-05 2.1153136e-05 2.9261736e-05 9.4285714 - 77100 8.7224729e-05 0 2.157166e-05 2.54706e-05 3.1080633e-05 9.4285714 - 77200 8.4102799e-05 0 2.3215324e-05 2.4317882e-05 3.2166454e-05 9.4285714 - 77300 8.0313409e-05 0 2.3799728e-05 2.6151429e-05 3.549803e-05 9.4285714 - 77400 7.9230413e-05 0 2.5607704e-05 2.6668597e-05 3.4909306e-05 9.4285714 - 77500 7.811033e-05 0 2.7044141e-05 2.3924967e-05 3.6517465e-05 9.4285714 - 77600 7.7683573e-05 0 2.8108404e-05 2.590653e-05 4.0314953e-05 9.4285714 - 77700 7.5680467e-05 0 2.7599437e-05 2.6044761e-05 4.0283563e-05 9.4285714 - 77800 7.3449559e-05 0 2.8230675e-05 2.6304803e-05 4.0873298e-05 9.4285714 - 77900 7.3292429e-05 0 2.9736972e-05 2.7258167e-05 4.1876044e-05 9.4285714 - 78000 7.2392133e-05 0 3.1088456e-05 2.6772279e-05 4.2237468e-05 9.4285714 - 78100 7.0315679e-05 0 3.2315727e-05 2.629787e-05 4.2149426e-05 9.4285714 - 78200 7.1047062e-05 0 3.1623093e-05 2.447182e-05 4.0466876e-05 9.4285714 - 78300 6.8370248e-05 0 3.0139466e-05 2.3241895e-05 4.2084152e-05 9.4285714 - 78400 6.5550877e-05 0 3.5775791e-05 2.5111452e-05 4.5314214e-05 9.4285714 - 78500 6.1683926e-05 0 3.8020582e-05 2.4959462e-05 4.6453459e-05 9.4285714 - 78600 6.024047e-05 0 3.2986067e-05 2.5137808e-05 4.5563449e-05 9.4285714 - 78700 5.8543178e-05 0 3.3264031e-05 2.7364741e-05 4.56211e-05 9.4285714 - 78800 5.5383435e-05 0 3.3858442e-05 2.688989e-05 4.3178362e-05 9.4285714 - 78900 5.6871546e-05 0 3.3719755e-05 2.876403e-05 4.0383023e-05 9.4285714 - 79000 5.7192958e-05 0 3.419205e-05 3.2389045e-05 3.7915888e-05 9.4285714 - 79100 4.9998926e-05 0 3.9072498e-05 3.2982953e-05 4.5441877e-05 9.4285714 - 79200 4.9597887e-05 0 3.9993615e-05 3.3651972e-05 4.2214811e-05 9.4285714 - 79300 4.8603326e-05 0 3.4873095e-05 2.8101438e-05 2.9613495e-05 9.4285714 - 79400 4.7839304e-05 0 3.7935926e-05 2.6994548e-05 3.9174337e-05 9.4285714 - 79500 4.5739018e-05 0 3.7706927e-05 2.8505307e-05 3.9904116e-05 9.4285714 - 79600 4.2632104e-05 0 3.6880213e-05 3.0862386e-05 3.7417378e-05 9.4285714 - 79700 4.2716432e-05 0 3.862769e-05 3.295245e-05 4.4025915e-05 9.4285714 - 79800 4.3345358e-05 0 3.3850977e-05 2.8351966e-05 3.6271267e-05 9.4285714 - 79900 4.2476967e-05 0 3.1294363e-05 3.0560471e-05 3.5478598e-05 9.4285714 - 80000 4.0478442e-05 0 3.266321e-05 3.0397886e-05 3.74445e-05 9.4285714 - 80100 3.7842198e-05 0 3.3319254e-05 2.6553639e-05 3.0532809e-05 9.4285714 - 80200 2.8735215e-05 0 3.5014894e-05 3.2176514e-05 3.410418e-05 9.4285714 - 80300 2.5008575e-05 0 3.4679934e-05 3.3840734e-05 3.4314525e-05 9.4285714 - 80400 2.7560228e-05 0 3.2852873e-05 2.8962633e-05 3.0394406e-05 9.4285714 - 80500 3.0888649e-05 0 3.1507484e-05 2.597095e-05 3.271808e-05 9.4285714 - 80600 3.2512804e-05 0 3.0931277e-05 2.304269e-05 3.0253759e-05 9.4285714 - 80700 3.0635649e-05 0 3.1660238e-05 2.2282821e-05 2.8199016e-05 9.4285714 - 80800 2.7803874e-05 0 3.1776181e-05 2.4038027e-05 2.845472e-05 9.4285714 - 80900 2.7488104e-05 0 3.1599213e-05 2.3316746e-05 2.5212454e-05 9.4285714 - 81000 2.5760367e-05 0 3.5293658e-05 2.354429e-05 2.7532559e-05 9.4285714 - 81100 2.0516969e-05 0 3.67195e-05 2.8706508e-05 2.9782185e-05 9.4285714 - 81200 1.7005384e-05 0 3.5049273e-05 2.3159655e-05 2.8465517e-05 9.4285714 - 81300 1.8000969e-05 0 3.3259531e-05 2.0532469e-05 3.0967269e-05 9.4285714 - 81400 1.8404948e-05 0 2.8386836e-05 2.4730451e-05 2.8965301e-05 9.4285714 - 81500 1.7001638e-05 0 2.6431741e-05 2.1156098e-05 2.5679646e-05 9.4285714 - 81600 1.718853e-05 0 2.6737455e-05 2.2477484e-05 2.9190604e-05 9.4285714 - 81700 1.7653551e-05 0 2.5412396e-05 2.4251603e-05 2.8969143e-05 9.4285714 - 81800 1.60697e-05 0 2.5869197e-05 2.308932e-05 2.7379341e-05 9.4285714 - 81900 1.5286837e-05 0 2.6529612e-05 2.5419771e-05 2.8440593e-05 9.4285714 - 82000 1.6023107e-05 0 2.5756598e-05 2.4387052e-05 2.6106537e-05 9.4285714 - 82100 1.5242285e-05 0 2.7061408e-05 2.3032818e-05 2.4388599e-05 9.4285714 - 82200 1.3697011e-05 0 2.8635719e-05 2.3780226e-05 2.4906811e-05 9.4285714 - 82300 1.3126258e-05 0 2.9891427e-05 2.2014465e-05 2.4307976e-05 9.4285714 - 82400 1.3101796e-05 0 2.974623e-05 2.1196997e-05 2.3335031e-05 9.4285714 - 82500 1.2930812e-05 0 2.776572e-05 2.1405191e-05 2.1856013e-05 9.4285714 - 82600 1.2105591e-05 0 2.677033e-05 2.1158183e-05 2.1053083e-05 9.4285714 - 82700 1.1430058e-05 0 2.6491101e-05 2.2185095e-05 2.1741395e-05 9.4285714 - 82800 1.1220674e-05 0 2.5798118e-05 2.2107127e-05 2.2026313e-05 9.4285714 - 82900 1.0833337e-05 0 2.6248963e-05 2.2128181e-05 2.2633178e-05 9.4285714 - 83000 9.6966107e-06 0 2.6264061e-05 2.2728458e-05 2.4189433e-05 9.4285714 - 83100 9.7912048e-06 0 2.5500083e-05 2.1832923e-05 2.4004267e-05 9.4285714 - 83200 1.0342776e-05 0 2.5894996e-05 2.1114752e-05 2.2781046e-05 9.4285714 - 83300 9.1053605e-06 0 2.6844449e-05 2.1683135e-05 2.3018942e-05 9.4285714 - 83400 8.1376574e-06 0 2.7698506e-05 2.1715141e-05 2.3249723e-05 9.4285714 - 83500 8.3013823e-06 0 2.7841933e-05 2.1301843e-05 2.2608819e-05 9.4285714 - 83600 7.5747246e-06 0 2.7285945e-05 2.1917666e-05 2.1940362e-05 9.4285714 - 83700 6.7051973e-06 0 2.6570578e-05 2.2457872e-05 2.1768e-05 9.4285714 - 83800 6.7732855e-06 0 2.5876203e-05 2.1870094e-05 2.1810098e-05 9.4285714 - 83900 6.455146e-06 0 2.613284e-05 2.1133229e-05 2.141307e-05 9.4285714 - 84000 6.033363e-06 0 2.5796758e-05 2.0740854e-05 2.1789962e-05 9.4285714 - 84100 6.1544361e-06 0 2.4880893e-05 2.034968e-05 2.2632001e-05 9.4285714 - 84200 5.8120515e-06 0 2.4372967e-05 2.0939262e-05 2.3739495e-05 9.4285714 - 84300 5.5925414e-06 0 2.5190413e-05 2.2054067e-05 2.5134858e-05 9.4285714 - 84400 5.9495987e-06 0 2.5163487e-05 2.2235018e-05 2.5089027e-05 9.4285714 - 84500 5.7713446e-06 0 2.5203284e-05 2.2008136e-05 2.4683255e-05 9.4285714 - 84600 5.2346414e-06 0 2.5750616e-05 2.2385286e-05 2.5060127e-05 9.4285714 - 84700 5.3677312e-06 0 2.5671418e-05 2.2504517e-05 2.477615e-05 9.4285714 - 84800 5.5545452e-06 0 2.5270776e-05 2.203669e-05 2.4371077e-05 9.4285714 - 84900 5.35857e-06 0 2.4990364e-05 2.1994432e-05 2.4434211e-05 9.4285714 - 85000 5.4081539e-06 0 2.4614554e-05 2.1826659e-05 2.4080584e-05 9.4285714 - 85100 5.6686315e-06 0 2.4255405e-05 2.1348341e-05 2.3692087e-05 9.4285714 - 85200 5.6470622e-06 0 2.4490625e-05 2.1444906e-05 2.3461274e-05 9.4285714 - 85300 5.4542991e-06 0 2.5038089e-05 2.159186e-05 2.3411228e-05 9.4285714 - 85400 5.5974388e-06 0 2.5208624e-05 2.1456353e-05 2.3090313e-05 9.4285714 - 85500 5.9109345e-06 0 2.5019187e-05 2.1326993e-05 2.2631876e-05 9.4285714 - 85600 5.8895141e-06 0 2.4816097e-05 2.1032266e-05 2.2641694e-05 9.4285714 - 85700 5.8470051e-06 0 2.4753057e-05 2.1011299e-05 2.2893303e-05 9.4285714 - 85800 6.060997e-06 0 2.4718385e-05 2.1024683e-05 2.3160395e-05 9.4285714 - 85900 6.1217894e-06 0 2.4939406e-05 2.0910983e-05 2.3606002e-05 9.4285714 - 86000 5.7550467e-06 0 2.5292227e-05 2.1210494e-05 2.3980265e-05 9.4285714 - 86100 5.6513685e-06 0 2.5336254e-05 2.1695151e-05 2.4295958e-05 9.4285714 - 86200 5.7555479e-06 0 2.5214702e-05 2.2162992e-05 2.4153262e-05 9.4285714 - 86300 5.7587322e-06 0 2.5471626e-05 2.2752108e-05 2.4566282e-05 9.4285714 - 86400 5.8389333e-06 0 2.5581374e-05 2.2866696e-05 2.5080456e-05 9.4285714 - 86500 5.9431034e-06 0 2.5603078e-05 2.2611552e-05 2.557061e-05 9.4285714 - 86600 5.9655129e-06 0 2.5809196e-05 2.2505729e-05 2.5920358e-05 9.4285714 - 86700 6.042955e-06 0 2.5516399e-05 2.207345e-05 2.4941272e-05 9.4285714 - 86800 6.2666413e-06 0 2.5017309e-05 2.1757271e-05 2.4325659e-05 9.4285714 - 86900 6.5118003e-06 0 2.4709906e-05 2.1733726e-05 2.4359289e-05 9.4285714 - 87000 6.7509257e-06 0 2.424948e-05 2.1511123e-05 2.4005052e-05 9.4285714 - 87100 6.9118143e-06 0 2.4403465e-05 2.1411555e-05 2.4138929e-05 9.4285714 - 87200 6.9983412e-06 0 2.4855429e-05 2.1301042e-05 2.4635518e-05 9.4285714 - 87300 7.2267392e-06 0 2.4726242e-05 2.1200486e-05 2.4816636e-05 9.4285714 - 87400 7.3928522e-06 0 2.4568177e-05 2.1782095e-05 2.546145e-05 9.4285714 - 87500 7.1675783e-06 0 2.4583963e-05 2.2927936e-05 2.610685e-05 9.4285714 - 87600 6.9310557e-06 0 2.4419972e-05 2.3641933e-05 2.674206e-05 9.4285714 - 87700 6.8020949e-06 0 2.4799319e-05 2.3877016e-05 2.686282e-05 9.4285714 - 87800 6.7871509e-06 0 2.5501599e-05 2.3391832e-05 2.6476337e-05 9.4285714 - 87900 7.1459737e-06 0 2.5746275e-05 2.2468174e-05 2.6106668e-05 9.4285714 - 88000 7.4791665e-06 0 2.6452673e-05 2.2371733e-05 2.6426643e-05 9.4285714 - 88100 7.4418527e-06 0 2.7237517e-05 2.2696988e-05 2.6866222e-05 9.4285714 - 88200 6.8171325e-06 0 2.835739e-05 2.2805248e-05 2.7767937e-05 9.4285714 - 88300 5.9535317e-06 0 3.0022892e-05 2.3162212e-05 2.9121854e-05 9.4285714 - 88400 5.8054385e-06 0 3.0267499e-05 2.4036541e-05 2.9451731e-05 9.4285714 - 88500 5.7381974e-06 0 2.987853e-05 2.4412659e-05 2.9022854e-05 9.4285714 - 88600 5.8193958e-06 0 2.9306631e-05 2.4291387e-05 2.9042278e-05 9.4285714 - 88700 5.7843884e-06 0 2.8474902e-05 2.407517e-05 2.9342631e-05 9.4285714 - 88800 5.36122e-06 0 2.9228687e-05 2.4074387e-05 3.0069005e-05 9.4285714 - 88900 4.9662584e-06 0 2.9640221e-05 2.4381438e-05 3.0842974e-05 9.4285714 - 89000 5.0244565e-06 0 2.9242167e-05 2.3718494e-05 3.0959647e-05 9.4285714 - 89100 5.2140172e-06 0 2.9460854e-05 2.2966219e-05 3.0745899e-05 9.4285714 - 89200 5.4241028e-06 0 2.8931798e-05 2.2787347e-05 3.0505146e-05 9.4285714 - 89300 5.354843e-06 0 2.8226483e-05 2.2430309e-05 3.0543304e-05 9.4285714 - 89400 4.9583346e-06 0 2.8529104e-05 2.2510089e-05 3.0744349e-05 9.4285714 - 89500 4.7804845e-06 0 2.8283425e-05 2.3168387e-05 3.0368794e-05 9.4285714 - 89600 4.5353969e-06 0 2.8369715e-05 2.3890917e-05 2.9944272e-05 9.4285714 - 89700 4.3528727e-06 0 2.916536e-05 2.4717547e-05 2.9897586e-05 9.4285714 - 89800 4.0677397e-06 0 2.9671051e-05 2.5069631e-05 2.9727134e-05 9.4285714 - 89900 3.4743886e-06 0 3.0546148e-05 2.5204424e-05 2.9429413e-05 9.4285714 - 90000 2.9448035e-06 0 3.1386975e-05 2.504163e-05 2.8941476e-05 9.4285714 - 90100 2.8584378e-06 0 3.0989836e-05 2.426512e-05 2.8680422e-05 9.4285714 - 90200 3.0154097e-06 0 3.0109363e-05 2.3659678e-05 2.879077e-05 9.4285714 - 90300 3.0998012e-06 0 2.9214408e-05 2.3299406e-05 2.8821376e-05 9.4285714 - 90400 3.0622205e-06 0 2.866651e-05 2.2666679e-05 2.8865145e-05 9.4285714 - 90500 2.8987354e-06 0 2.8403824e-05 2.1925714e-05 2.8481892e-05 9.4285714 - 90600 2.6710434e-06 0 2.8143313e-05 2.1522559e-05 2.8171438e-05 9.4285714 - 90700 2.4095074e-06 0 2.8048981e-05 2.1523007e-05 2.8016792e-05 9.4285714 - 90800 2.202904e-06 0 2.8166412e-05 2.1813639e-05 2.7412255e-05 9.4285714 - 90900 2.3181295e-06 0 2.8435465e-05 2.2251451e-05 2.6819024e-05 9.4285714 - 91000 2.3141951e-06 0 2.8538853e-05 2.2733208e-05 2.6507917e-05 9.4285714 - 91100 2.0683071e-06 0 2.8191515e-05 2.3157829e-05 2.609377e-05 9.4285714 - 91200 1.8857219e-06 0 2.7771042e-05 2.3580857e-05 2.55034e-05 9.4285714 - 91300 1.8327584e-06 0 2.7428616e-05 2.360497e-05 2.4609829e-05 9.4285714 - 91400 1.804747e-06 0 2.713938e-05 2.3052505e-05 2.3890628e-05 9.4285714 - 91500 1.6349771e-06 0 2.7072497e-05 2.2465059e-05 2.3592759e-05 9.4285714 - 91600 1.5216476e-06 0 2.6887207e-05 2.1845019e-05 2.327018e-05 9.4285714 - 91700 1.6141413e-06 0 2.6727574e-05 2.134873e-05 2.3175757e-05 9.4285714 - 91800 1.6435107e-06 0 2.6837186e-05 2.1372811e-05 2.3272056e-05 9.4285714 - 91900 1.5649292e-06 0 2.6814814e-05 2.149563e-05 2.3262763e-05 9.4285714 - 92000 1.5598003e-06 0 2.6894688e-05 2.1612813e-05 2.3333181e-05 9.4285714 - 92100 1.5645521e-06 0 2.7093666e-05 2.1677323e-05 2.3393885e-05 9.4285714 - 92200 1.5384794e-06 0 2.725352e-05 2.1871439e-05 2.3309607e-05 9.4285714 - 92300 1.5428705e-06 0 2.7534493e-05 2.2028165e-05 2.3281919e-05 9.4285714 - 92400 1.5481835e-06 0 2.7738128e-05 2.1877013e-05 2.3365103e-05 9.4285714 - 92500 1.5193765e-06 0 2.7807402e-05 2.1697756e-05 2.3422801e-05 9.4285714 - 92600 1.4779648e-06 0 2.7822075e-05 2.1595936e-05 2.3653604e-05 9.4285714 - 92700 1.4401385e-06 0 2.7498575e-05 2.1565328e-05 2.3855716e-05 9.4285714 - 92800 1.4263884e-06 0 2.7219859e-05 2.1753979e-05 2.3901241e-05 9.4285714 - 92900 1.4318392e-06 0 2.696367e-05 2.202186e-05 2.4060393e-05 9.4285714 - 93000 1.4336111e-06 0 2.6591513e-05 2.2195157e-05 2.4122065e-05 9.4285714 - 93100 1.4541758e-06 0 2.6692487e-05 2.2344968e-05 2.4065021e-05 9.4285714 - 93200 1.4657669e-06 0 2.7168313e-05 2.2538418e-05 2.4214674e-05 9.4285714 - 93300 1.4040886e-06 0 2.7561907e-05 2.2761637e-05 2.4475223e-05 9.4285714 - 93400 1.2988064e-06 0 2.7861831e-05 2.2852224e-05 2.4956596e-05 9.4285714 - 93500 1.2005872e-06 0 2.7794033e-05 2.2910857e-05 2.5291935e-05 9.4285714 - 93600 1.1148329e-06 0 2.7652398e-05 2.3024188e-05 2.5433821e-05 9.4285714 - 93700 1.0710007e-06 0 2.7712404e-05 2.3143904e-05 2.5669435e-05 9.4285714 - 93800 1.0923979e-06 0 2.7720612e-05 2.3112739e-05 2.5821686e-05 9.4285714 - 93900 1.1070785e-06 0 2.7887865e-05 2.3159397e-05 2.5903855e-05 9.4285714 - 94000 1.0836182e-06 0 2.8174509e-05 2.3354232e-05 2.6074704e-05 9.4285714 - 94100 1.0712532e-06 0 2.8077928e-05 2.3330714e-05 2.6150142e-05 9.4285714 - 94200 1.1089242e-06 0 2.802336e-05 2.3220275e-05 2.6308674e-05 9.4285714 - 94300 1.1709624e-06 0 2.7885676e-05 2.3027073e-05 2.647883e-05 9.4285714 - 94400 1.1698851e-06 0 2.7597204e-05 2.2765961e-05 2.6575165e-05 9.4285714 - 94500 1.1331311e-06 0 2.7664548e-05 2.2696186e-05 2.6782703e-05 9.4285714 - 94600 1.1611176e-06 0 2.7821396e-05 2.2709988e-05 2.6961488e-05 9.4285714 - 94700 1.2014763e-06 0 2.8024363e-05 2.2788622e-05 2.7146644e-05 9.4285714 - 94800 1.1833928e-06 0 2.8490371e-05 2.3037146e-05 2.7316537e-05 9.4285714 - 94900 1.1648449e-06 0 2.8748715e-05 2.3166372e-05 2.7288373e-05 9.4285714 - 95000 1.1252279e-06 0 2.8777487e-05 2.3105996e-05 2.7264426e-05 9.4285714 - 95100 1.0516851e-06 0 2.8696839e-05 2.2985372e-05 2.7310067e-05 9.4285714 - 95200 1.0245214e-06 0 2.8641497e-05 2.2873e-05 2.7310438e-05 9.4285714 - 95300 1.0235812e-06 0 2.8690066e-05 2.3000448e-05 2.7335977e-05 9.4285714 - 95400 9.6956254e-07 0 2.8724738e-05 2.3259027e-05 2.7322308e-05 9.4285714 - 95500 8.9262312e-07 0 2.8843131e-05 2.3531751e-05 2.7254991e-05 9.4285714 - 95600 8.6064987e-07 0 2.8996711e-05 2.3635882e-05 2.7093251e-05 9.4285714 - 95700 8.7096432e-07 0 2.8878604e-05 2.3473478e-05 2.6743784e-05 9.4285714 - 95800 8.5278957e-07 0 2.8703214e-05 2.3266697e-05 2.6409822e-05 9.4285714 - 95900 7.9717781e-07 0 2.8645528e-05 2.3062215e-05 2.6251555e-05 9.4285714 - 96000 7.7875968e-07 0 2.8643986e-05 2.2987641e-05 2.6323848e-05 9.4285714 - 96100 7.8525813e-07 0 2.8773044e-05 2.3055913e-05 2.6556088e-05 9.4285714 - 96200 7.7518366e-07 0 2.8878871e-05 2.3101151e-05 2.6812081e-05 9.4285714 - 96300 7.6015915e-07 0 2.8820245e-05 2.3136672e-05 2.6915584e-05 9.4285714 - 96400 7.4067407e-07 0 2.8661992e-05 2.3169734e-05 2.6801804e-05 9.4285714 - 96500 7.0061605e-07 0 2.8400346e-05 2.3121121e-05 2.6529198e-05 9.4285714 - 96600 6.6164038e-07 0 2.8306211e-05 2.3011655e-05 2.6142152e-05 9.4285714 - 96700 6.5255615e-07 0 2.8340108e-05 2.2886154e-05 2.5768282e-05 9.4285714 - 96800 6.5992528e-07 0 2.8315654e-05 2.2712955e-05 2.5506907e-05 9.4285714 - 96900 6.618124e-07 0 2.8440952e-05 2.2580367e-05 2.5361502e-05 9.4285714 - 97000 6.7139818e-07 0 2.8508432e-05 2.253211e-05 2.5304698e-05 9.4285714 - 97100 6.8703272e-07 0 2.8403291e-05 2.25734e-05 2.5272649e-05 9.4285714 - 97200 6.9368757e-07 0 2.8254045e-05 2.2793415e-05 2.5257036e-05 9.4285714 - 97300 6.9652913e-07 0 2.8016561e-05 2.3040992e-05 2.5228068e-05 9.4285714 - 97400 6.9671901e-07 0 2.7837036e-05 2.330333e-05 2.5157239e-05 9.4285714 - 97500 6.891306e-07 0 2.7789433e-05 2.3471237e-05 2.5141846e-05 9.4285714 - 97600 6.76426e-07 0 2.7838847e-05 2.3472664e-05 2.518892e-05 9.4285714 - 97700 6.5763751e-07 0 2.794167e-05 2.3370888e-05 2.5139127e-05 9.4285714 - 97800 6.4854556e-07 0 2.7951511e-05 2.3224106e-05 2.5036326e-05 9.4285714 - 97900 6.5336861e-07 0 2.7923239e-05 2.3092342e-05 2.4920514e-05 9.4285714 - 98000 6.6394525e-07 0 2.7871431e-05 2.2947013e-05 2.480383e-05 9.4285714 - 98100 6.8885885e-07 0 2.7765273e-05 2.2790639e-05 2.4801777e-05 9.4285714 - 98200 7.2201864e-07 0 2.7755504e-05 2.2661812e-05 2.4861739e-05 9.4285714 - 98300 7.3816538e-07 0 2.7765573e-05 2.258486e-05 2.4844206e-05 9.4285714 - 98400 7.3631403e-07 0 2.7757701e-05 2.2578908e-05 2.4841191e-05 9.4285714 - 98500 7.2568853e-07 0 2.7848802e-05 2.2595958e-05 2.4892777e-05 9.4285714 - 98600 7.0490905e-07 0 2.7912207e-05 2.2591875e-05 2.4898698e-05 9.4285714 - 98700 6.8484202e-07 0 2.8009272e-05 2.2597685e-05 2.4985899e-05 9.4285714 - 98800 6.6994522e-07 0 2.8202402e-05 2.2643734e-05 2.5127513e-05 9.4285714 - 98900 6.2867752e-07 0 2.8292405e-05 2.2674349e-05 2.5309578e-05 9.4285714 - 99000 5.6999626e-07 0 2.8348569e-05 2.2698075e-05 2.5569326e-05 9.4285714 - 99100 5.2675078e-07 0 2.838436e-05 2.2796837e-05 2.5828965e-05 9.4285714 - 99200 4.9993032e-07 0 2.8326221e-05 2.2925652e-05 2.6095918e-05 9.4285714 - 99300 4.8034362e-07 0 2.8358043e-05 2.3048697e-05 2.6357518e-05 9.4285714 - 99400 4.633455e-07 0 2.8395008e-05 2.3187019e-05 2.6590148e-05 9.4285714 - 99500 4.423417e-07 0 2.840813e-05 2.3327273e-05 2.679518e-05 9.4285714 - 99600 4.2336865e-07 0 2.8409328e-05 2.3446846e-05 2.6875881e-05 9.4285714 - 99700 4.0950396e-07 0 2.831088e-05 2.347619e-05 2.6867125e-05 9.4285714 - 99800 3.8946719e-07 0 2.8187415e-05 2.3361958e-05 2.6862163e-05 9.4285714 - 99900 3.5789226e-07 0 2.8087326e-05 2.3222723e-05 2.6889683e-05 9.4285714 - 100000 3.23165e-07 0 2.7995448e-05 2.3145322e-05 2.7024051e-05 9.4285714 -Loop time of 205.426 on 4 procs for 100000 steps with 2520 atoms - -Performance: 2102947.143 tau/day, 486.793 timesteps/s -98.8% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.17838 | 1.2371 | 4.1955 | 153.6 | 0.60 -Bond | 3.018 | 52.249 | 174.87 | 982.2 | 25.43 -Neigh | 3.0057 | 3.0272 | 3.0411 | 0.8 | 1.47 -Comm | 2.8631 | 70.899 | 175.73 | 758.8 | 34.51 -Output | 0.1676 | 1.5052 | 3.0742 | 109.6 | 0.73 -Modify | 1.0679 | 5.7589 | 17.359 | 279.9 | 2.80 -Other | | 70.75 | | | 34.44 - -Nlocal: 630 ave 2513 max 0 min -Histogram: 3 0 0 0 0 0 0 0 0 1 -Nghost: 39.25 ave 150 max 0 min -Histogram: 3 0 0 0 0 0 0 0 0 1 -Neighs: 2458 ave 9821 max 0 min -Histogram: 3 0 0 0 0 0 0 0 0 1 - -Total # of neighbors = 9832 -Ave neighs/atom = 3.9015873 -Ave special neighs/atom = 36.31746 -Neighbor list builds = 5178 -Dangerous builds = 314 -Total wall time: 0:03:25 diff --git a/examples/comb/README b/examples/comb/README index 0fdacfaef0..cb0ae368a3 100644 --- a/examples/comb/README +++ b/examples/comb/README @@ -20,5 +20,3 @@ Examples: 4. in.comb.Cu2O.elastic: Cu2O crystal, qeq on, minimizes, then calculates elastic constants 5. in.comb.HfO2: HfO2 polymorphs: Monoclinic HfO2 NVT @ 300K -6. in.comb.CuaS: Metallic Cu and amorphous silica interface, qeq on, - five step NVE run diff --git a/examples/comb/data.CuaS b/examples/comb/data.CuaS deleted file mode 100644 index 6039bce56a..0000000000 --- a/examples/comb/data.CuaS +++ /dev/null @@ -1,4147 +0,0 @@ -Transfromed from dump file 240089.dump - - 4126 atoms - 0 bonds - 0 angles - 0 dihedrals - 0 impropers - - 3 atom types - 0 bond types - 0 angle types - 0 dihedral types - 0 improper types - - 0.000000000000000E+000 60.4000000000000 xlo xhi - 0.000000000000000E+000 29.7600000000000 ylo yhi - 0.000000000000000E+000 29.7600000000000 zlo zhi - 0.0000000 0.0000000 0.0000000 xy xz yz - - Atoms - - 1 2 -1.5368900 12.1717000 0.4080250 5.4646100 - 2 2 -1.7044300 0.5602200 14.3770000 13.8990000 - 3 2 -1.6215100 1.5055000 13.5219000 0.5516700 - 4 2 -1.4700300 8.9731600 0.9027140 8.1504600 - 5 1 2.7243100 4.1740200 7.9774300 1.3186600 - 6 2 -1.6113900 0.1464830 6.3396600 2.1301600 - 7 2 -1.6120200 4.2918800 2.1859800 5.1092400 - 8 1 2.1983400 1.2837900 7.3036900 1.5887700 - 9 2 -1.5718600 3.8048100 9.3568400 2.2242400 - 10 1 2.7279600 2.9510000 1.3594100 5.1666200 - 11 1 2.5423100 2.2505500 5.7225300 7.2319200 - 12 2 -1.5870300 2.3555800 1.3088300 8.4835200 - 13 1 2.5689100 2.1342400 8.6397300 5.7452200 - 14 2 -1.5394400 1.8088100 1.8138600 6.1646100 - 15 2 -1.6206300 3.5163700 0.3456770 10.4105000 - 16 1 2.6216800 9.2633800 7.3310300 13.9759000 - 17 2 -1.6309000 1.5601700 7.0550300 6.5198000 - 18 2 -1.6429500 1.5821400 4.2357700 7.6013900 - 19 2 -1.6247000 4.1661600 6.8881800 2.6601800 - 20 1 1.9449200 1.8836900 4.8823200 13.0377000 - 21 2 -1.6140300 2.2967900 6.2024200 9.0152700 - 22 1 2.6742600 12.2449000 14.8469000 2.5420300 - 23 2 -1.6627500 2.3707500 4.6051100 0.2986830 - 24 1 2.6864100 2.0339300 14.5581000 1.9695500 - 25 2 -1.6762200 1.7991000 8.8757800 4.1359600 - 26 1 2.6768000 2.5507500 10.0126000 2.9292800 - 27 1 2.4694900 2.2285600 13.7702000 7.0218500 - 28 2 -1.5807100 2.8132600 11.3877000 3.6897800 - 29 2 -1.5099300 3.7249900 12.3879000 14.0392000 - 30 2 -1.5816800 1.8983000 12.7376000 5.9525800 - 31 2 -1.6086100 3.2093400 10.3221000 9.0758300 - 32 2 -1.6655100 4.0574200 14.5371000 1.9830700 - 33 1 2.6472900 1.8625600 10.8911000 8.3730800 - 34 2 -1.5178900 7.6693000 2.1612200 0.8724280 - 35 2 -1.6151200 2.2094700 12.7205000 8.4444300 - 36 2 -1.6518800 0.4143860 7.3627400 14.1016000 - 37 2 -1.6662100 2.5940700 7.8480100 12.4540000 - 38 2 -1.6741800 0.3553690 10.2579000 9.6243400 - 39 2 -1.6703800 1.5515000 9.8580700 6.7018200 - 40 1 2.6446300 2.0765800 7.7415800 13.9914000 - 41 2 -1.5977400 2.7757300 0.5925440 12.5758000 - 42 2 -1.6446300 2.3687000 2.5209700 2.1816000 - 43 2 -1.6750000 1.3843200 10.3343000 1.2599200 - 44 1 2.7888000 7.7002100 6.3545400 2.5116900 - 45 1 2.7490000 6.4620300 2.1743400 1.8792400 - 46 2 -1.5838500 6.3979500 5.6547400 3.4494500 - 47 2 -1.5493100 9.1658400 0.9823320 3.3657800 - 48 2 -1.6336500 5.0991900 2.9611800 1.2105700 - 49 2 -1.4921000 7.2558600 7.5711600 1.6101500 - 50 1 2.7054700 14.4620000 0.5135390 7.6389500 - 51 1 2.6094100 6.4779600 4.1891100 4.1353100 - 52 1 2.7489600 5.1488000 6.9800400 3.9667000 - 53 1 2.7624100 5.8350600 5.6903700 9.6098800 - 54 1 2.5873400 4.9592900 3.2757900 6.2399100 - 55 1 2.7266800 2.2797700 2.6514800 7.5277900 - 56 1 2.7596600 5.4385500 7.0669700 6.9279300 - 57 2 -1.5608000 5.9936900 4.1853700 5.5884900 - 58 2 -1.6286000 4.5321500 6.6802400 5.4623900 - 59 2 -1.5741200 4.3569700 5.5828600 10.6531000 - 60 2 -1.5862400 6.3830000 1.8197500 8.4997700 - 61 2 -1.5883300 3.9748600 3.1741600 7.4861300 - 62 2 -1.5999200 5.3115000 5.8086900 8.0241300 - 63 2 -1.5464900 6.4841900 4.1916500 9.9214500 - 64 2 -1.5789600 7.1244000 2.9173300 3.3670500 - 65 2 -1.5088200 8.8403700 6.0606300 3.6249700 - 66 1 2.6902000 6.0902300 2.6988600 9.7338100 - 67 1 2.6040100 2.9574800 4.9176500 10.2503000 - 68 1 2.6778400 4.2006900 1.1910800 14.0163000 - 69 1 2.6410200 3.7077800 2.0774200 11.4335000 - 70 1 2.7874700 6.8496500 8.6557600 12.7521000 - 71 2 -1.6058500 9.9653800 5.4060600 10.3955000 - 72 2 -1.6139000 6.8893800 9.4187700 14.3385000 - 73 2 -1.6362800 1.6014200 5.0762200 11.4931000 - 74 2 -1.5882400 7.8325600 0.5264250 13.0271000 - 75 2 -1.6724400 3.9081700 2.5956400 13.0412000 - 76 2 -1.5850800 8.0393700 3.1640700 13.3327000 - 77 2 -1.5992200 3.0642100 3.1978500 10.4224000 - 78 2 -1.6198400 5.9791700 1.1844700 14.0119000 - 79 2 -1.6455400 5.6751600 2.1447000 11.2320000 - 80 2 -1.5754000 7.1647700 6.7204200 9.5814100 - 81 2 -1.6335000 9.9751300 10.1907000 14.7464000 - 82 1 2.7219600 7.6690000 14.0632000 2.1677400 - 83 1 2.7641400 7.0129500 11.4214000 1.9916300 - 84 2 -1.6092500 6.3324400 13.1465000 2.9286500 - 85 2 -1.5149300 8.8281200 8.8098600 4.4233700 - 86 2 -1.5781400 5.5681300 11.1632000 1.2556600 - 87 2 -1.6165800 7.4924300 13.3110000 0.7779300 - 88 1 2.8128700 7.3151800 8.8232900 5.2334800 - 89 1 2.6467300 4.9924100 13.8094000 3.5363100 - 90 1 2.7901600 5.7659300 13.8746000 8.6313300 - 91 1 2.7487700 4.6872700 9.3713300 8.9627000 - 92 1 2.7136600 3.2414800 11.9545000 5.1831600 - 93 2 -1.5421400 6.9145000 10.3031000 5.9506400 - 94 2 -1.5826500 4.4641400 13.4897000 9.6881200 - 95 2 -1.5308200 8.7115300 10.5203000 9.3858100 - 96 1 2.7645600 5.9955000 11.0282000 7.1062700 - 97 2 -1.5734900 6.2861500 12.5678000 7.6270000 - 98 2 -1.6414800 4.4094300 8.2374200 7.7122700 - 99 2 -1.5537900 4.2599600 13.2214000 4.7561000 - 100 2 -1.5937900 6.9187300 7.6328700 6.3924400 - 101 2 -1.5512000 5.9422000 8.3640800 4.1922300 - 102 2 -1.5430300 8.6484900 12.9035000 2.6840700 - 103 1 2.7916900 7.2640200 10.5693000 10.0173000 - 104 1 2.7013600 2.9464200 13.3433000 9.8916900 - 105 1 2.8097300 6.4981000 14.2301000 14.0513000 - 106 1 2.7766000 4.1749100 8.6872100 11.9668000 - 107 2 -1.5356700 1.7627000 14.0822000 10.4319000 - 108 2 -1.5087300 7.0703500 11.9777000 10.6920000 - 109 2 -1.5980300 10.9557000 14.7051000 9.4617700 - 110 2 -1.5570300 4.6421500 8.5688500 10.3544000 - 111 2 -1.5090800 6.5710800 13.0739000 12.9852000 - 112 2 -1.5068300 5.3773800 8.0647600 12.7595000 - 113 2 -1.5825400 7.0671400 9.5130100 11.3206000 - 114 2 -1.5961600 5.9933500 10.2320000 8.6328900 - 115 2 -1.5755900 6.9927500 14.7127000 9.3744800 - 116 1 2.8669700 3.2710500 10.9112000 13.9472000 - 117 2 -1.6175300 1.5791300 10.7165000 14.3736000 - 118 2 -1.5700000 3.6285500 10.2433000 12.3416000 - 119 2 -1.5693200 8.1681900 14.4178000 14.3170000 - 120 2 -1.5973600 12.5358000 0.6572410 14.1779000 - 121 2 -1.4875400 13.2459000 3.8594500 1.1080300 - 122 2 -1.5990800 1.1617000 14.2489000 3.3626300 - 123 2 -1.6374500 2.4118000 7.7822800 0.6301080 - 124 1 2.7659700 12.4387000 4.9965700 1.6468800 - 125 1 2.7626200 10.1360000 0.5699560 2.0559400 - 126 1 2.8130600 11.3061000 7.7493200 0.7889240 - 127 2 -1.5661100 10.8884000 4.9003300 2.1287500 - 128 2 -1.6372700 12.6527000 6.6792800 1.1302500 - 129 1 2.7234600 12.1213000 1.4373900 4.4121000 - 130 1 2.8080500 10.1852000 5.1692700 3.6313400 - 131 1 2.7410700 11.0862000 5.8083700 7.3848300 - 132 1 2.7997500 8.0760900 2.0665400 7.4370800 - 133 1 2.7863800 8.4966400 2.2679700 4.1117400 - 134 1 2.7582700 11.7062000 7.4540800 4.9182900 - 135 2 -1.5405100 13.4678000 3.4918400 7.5684400 - 136 2 -1.5308100 11.2965000 6.0646700 4.3396400 - 137 2 -1.5371600 9.5667300 6.1545400 7.8589500 - 138 2 -1.5770500 10.4244000 0.3483110 10.3436000 - 139 2 -1.5561400 7.6745100 1.8618200 5.7969300 - 140 2 -1.5895000 11.6612000 7.1977000 6.5792800 - 141 2 -1.5507400 11.4353000 4.4774000 6.5051800 - 142 2 -1.5778000 9.6190600 3.5142700 4.1963200 - 143 2 -1.6151200 11.8330000 0.8197470 2.8983400 - 144 2 -1.5673200 13.8801000 6.1965800 3.0215300 - 145 1 2.7272700 9.0576100 0.7419120 9.7121100 - 146 1 2.7451100 8.7255800 6.7315300 9.1452700 - 147 1 2.6000800 12.0961000 6.8994000 14.7773000 - 148 1 2.6001500 9.3190800 0.2738610 13.7808000 - 149 1 2.6050300 6.9547800 2.0165000 12.8077000 - 150 1 2.6574100 11.6190000 8.5534400 12.1486000 - 151 2 -1.6670600 8.9886900 2.4953500 10.6017000 - 152 1 2.5616600 11.5447000 5.9290800 10.3477000 - 153 2 -1.6477600 0.8376510 0.5059940 14.7868000 - 154 1 2.5830400 9.8430200 3.3333800 13.8908000 - 155 2 -1.6355900 10.9809000 7.4250200 13.6612000 - 156 2 -1.6787200 10.7759000 3.7792300 12.3687000 - 157 2 -1.5737400 8.1648000 7.4863200 12.9271000 - 158 2 -1.5058100 8.6226400 3.4322500 7.8319600 - 159 2 -1.6366000 12.1706000 5.4749400 8.9199000 - 160 2 -1.6212600 10.1999000 1.6733500 14.2537000 - 161 1 2.3217100 1.5050700 0.0351454 13.4107000 - 162 1 2.8338800 9.4287700 9.4571400 2.7839600 - 163 2 -1.6362600 10.9324000 13.5974000 2.8907300 - 164 2 -1.5618300 13.4017000 10.9431000 3.0234600 - 165 2 -1.5384900 7.9200500 10.2421000 2.4141200 - 166 1 2.8706200 10.5114000 12.3050000 1.3282900 - 167 2 -1.5445600 10.3790000 8.1598900 2.2393300 - 168 3 0.2986670 0.7934790 5.6953000 3.9373400 - 169 1 2.7909000 11.9192000 10.4505000 3.6510300 - 170 1 2.7520100 9.2319500 13.1807000 4.2384000 - 171 1 2.6792300 10.1934000 14.3089000 8.1655000 - 172 1 2.8102700 10.0113000 9.6948700 8.9792500 - 173 1 2.7874300 10.3880000 11.3498000 6.4376800 - 174 2 -1.5532200 11.8791000 11.1586000 5.2039100 - 175 2 -1.5169000 14.3426000 9.9337000 5.8703000 - 176 2 -1.5976300 10.1750000 12.8885000 7.4913700 - 177 2 -1.5735300 12.7160000 11.2426000 7.4433200 - 178 2 -1.5803100 9.9846500 9.9866000 7.2243900 - 179 2 -1.5465900 9.4101900 11.9226000 5.1351300 - 180 2 -1.5914200 12.2179000 8.7346800 4.1541400 - 181 2 -1.5813200 10.5652000 10.7222000 2.7662000 - 182 2 -1.5833800 13.6582000 14.1980000 1.5406900 - 183 1 2.7677000 10.8067000 13.3524000 12.4986000 - 184 1 2.6910000 9.6771600 10.3446000 13.1204000 - 185 1 2.8157700 7.7708600 12.4703000 12.0076000 - 186 2 -1.5693900 11.6032000 10.1032000 9.5255000 - 187 2 -1.6012900 10.6966000 13.2393000 14.1306000 - 188 2 -1.5473000 8.4666300 11.2399000 12.9084000 - 189 2 -1.6288300 11.8516000 12.1087000 11.8800000 - 190 2 -1.5540600 10.3530000 9.4628600 12.0815000 - 191 2 -1.5874800 9.2734400 13.3336000 11.7899000 - 192 2 -1.6339900 12.0455000 7.1314800 11.2333000 - 193 2 -1.5750700 9.5784400 8.0977400 9.5126200 - 194 2 -1.6454100 4.2124400 11.0442000 6.3274200 - 195 2 -1.5061000 11.6320000 9.3739100 0.0846117 - 196 1 2.7022500 14.4093000 7.3595000 1.9734600 - 197 1 2.6937100 14.8574000 5.5225800 4.3371500 - 198 1 2.7201800 12.4453000 0.9569840 10.1321000 - 199 1 2.7579800 12.9030000 3.8690100 6.0356600 - 200 2 -1.4290000 14.6134000 0.1584970 12.2093000 - 201 2 -1.5602100 13.9891000 5.0653000 5.5268800 - 202 2 -1.5840200 12.8061000 2.8537700 4.6820600 - 203 2 -1.6150900 13.1820000 0.6596580 8.6583100 - 204 1 2.5939800 12.6880000 3.4014500 12.0103000 - 205 1 2.6619800 13.6672000 4.6000300 8.6492000 - 206 1 2.8199600 14.0064000 0.6232000 13.5290000 - 207 1 2.5395700 9.6342400 3.9429200 10.8428000 - 208 2 -1.6557400 14.1541000 4.4577200 11.6615000 - 209 2 -1.5717400 13.9016000 2.5088700 12.7325000 - 210 2 -1.6468200 12.3445000 2.5864700 10.5520000 - 211 1 2.6670300 3.7190500 0.3329020 8.7703000 - 212 1 2.8093000 14.7839000 10.4800000 2.3165100 - 213 2 -1.5580000 6.5597400 0.5230030 2.4634700 - 214 2 -1.5390600 12.0866000 12.2895000 0.6829230 - 215 1 2.7709100 13.0826000 10.2806000 8.8724400 - 216 1 2.8038700 13.5277000 11.2828000 6.0795800 - 217 2 -1.5658200 13.9303000 9.0285000 8.2486100 - 218 2 -1.5733100 14.2778000 12.6307000 5.4219500 - 219 1 2.7488600 14.1453000 8.5047600 13.7188000 - 220 1 2.6955300 13.2574000 11.1457000 11.9598000 - 221 2 -1.6059700 12.9394000 9.4642100 12.6929000 - 222 2 -1.5723000 14.4068000 7.1699200 12.8234000 - 223 2 -1.6284400 14.2422000 12.0057000 13.1381000 - 224 2 -1.6312600 14.0110000 10.5590000 10.5599000 - 225 2 -1.5740300 14.9723000 5.3602000 8.8375800 - 226 2 -1.4287300 10.1562000 1.5055000 0.9203180 - 227 1 2.6770800 14.7868000 12.1337000 14.6510000 - 228 2 -1.5566800 14.3111000 8.8759600 1.4543600 - 229 1 2.4168700 1.3727200 3.2829600 3.2063700 - 230 2 -1.5916800 1.9552000 4.1794500 4.5401000 - 231 3 0.4197030 0.0086996 0.5612590 3.0259000 - 232 2 -1.5019000 8.1396000 5.7628100 1.0924900 - 233 1 2.0279400 1.8831900 7.6176700 9.5151400 - 234 3 0.3339330 0.8838550 9.0260400 8.3090800 - 235 3 0.3818910 0.3576280 2.0133300 4.6435100 - 236 2 -1.4733900 2.6363300 0.0816984 4.5217500 - 237 2 -1.6287000 15.0252000 1.4519500 6.1427400 - 238 2 -1.6457800 8.3225400 14.3493000 5.1547200 - 239 1 2.7591100 8.0673900 7.3147100 0.1367910 - 240 2 -1.5453000 9.9438200 13.5475000 0.2081590 - 241 1 2.7625500 8.8960600 1.1565600 0.1659920 - 242 1 2.7241900 3.2414800 3.1413400 0.8089070 - 243 3 0.2917570 0.0559674 4.2838200 2.3214300 - 244 2 -1.5552000 14.9432000 12.7378000 8.8501500 - 245 1 2.7191700 14.9454000 14.3011000 8.5981400 - 246 1 2.6251400 4.6669000 11.5090000 0.0678038 - 247 2 -1.5350000 9.5766700 10.9610000 0.0091379 - 248 1 2.8157400 15.0954000 8.8716200 6.9277600 - 249 1 2.5957200 4.6166500 14.5152000 19.0436000 - 250 2 -1.5819100 3.4635900 1.3201700 20.4201000 - 251 2 -1.5327700 8.6026000 0.5245280 18.8369000 - 252 2 -1.6350500 1.2652800 6.0073600 24.0408000 - 253 2 -1.6100300 1.3348100 1.2712900 22.4975000 - 254 2 -1.5790500 2.7330000 4.6706400 19.7101000 - 255 2 -1.5460600 3.3438200 1.4783800 15.4007000 - 256 1 2.0067700 0.6113760 0.6373720 16.8148000 - 257 1 2.6927700 1.7232200 5.5309100 18.9403000 - 258 2 -1.5742700 4.2893500 2.4242700 17.8681000 - 259 1 2.5249600 1.2691400 14.3796000 23.2498000 - 260 2 -1.5478900 2.1401400 0.9588500 17.1304000 - 261 2 -1.5146600 4.4799400 5.8969600 16.8919000 - 262 1 2.5574500 1.3645100 8.0208300 20.5824000 - 263 2 -1.6164100 2.3785700 11.8027000 25.0276000 - 264 2 -1.6771800 1.1279900 13.4405000 21.7923000 - 265 2 -1.5987600 3.1014200 14.4126000 18.6125000 - 266 1 2.5564200 2.1499200 12.0135000 21.0229000 - 267 2 -1.5741100 1.6708700 13.0296000 17.1055000 - 268 2 -1.6007100 1.4894700 9.2089400 19.5995000 - 269 2 -1.6607400 1.7095500 12.3128000 19.4964000 - 270 2 -1.6376100 0.6649770 13.7103000 24.6046000 - 271 1 2.5772400 1.8773700 13.1136000 25.9739000 - 272 1 2.7146900 14.1947000 4.7898800 25.2917000 - 273 1 2.4278900 1.5148600 13.9539000 18.8224000 - 274 1 2.7216000 7.4065500 0.2619710 20.2254000 - 275 1 2.7610500 3.7017100 4.7225400 21.2800000 - 276 1 2.8203700 7.0866200 5.1614700 23.8225000 - 277 1 2.5027300 2.0195900 0.7322930 23.9251000 - 278 1 2.6044900 2.4620300 1.9822600 21.4678000 - 279 1 2.7822700 5.8720900 7.9673600 22.9649000 - 280 2 -1.5429200 7.2836300 1.6577300 21.0197000 - 281 2 -1.5836300 3.2719300 6.1723900 22.1565000 - 282 2 -1.5447500 6.7035000 6.5852700 23.0372000 - 283 2 -1.5998500 6.8134300 3.5632600 23.1632000 - 284 2 -1.6080400 2.7366600 3.4141100 22.0539000 - 285 2 -1.5276500 5.9065500 0.4994620 19.3826000 - 286 2 -1.5064600 7.7988800 5.4731400 20.6378000 - 287 1 2.8098700 5.7047000 9.6118600 15.5901000 - 288 1 2.6768800 6.3850200 1.6319000 15.5103000 - 289 1 2.7120200 3.0627800 5.8348800 16.2962000 - 290 1 2.8189800 6.4272900 4.9959600 19.8737000 - 291 1 2.7058300 4.7046200 1.4888100 19.2460000 - 292 1 2.6795900 3.2052000 2.5255100 16.6338000 - 293 2 -1.5661800 2.5762600 11.1211000 22.1606000 - 294 2 -1.5749200 6.5235300 3.1111300 15.8983000 - 295 2 -1.5873100 5.1639900 4.3516300 20.9169000 - 296 2 -1.5874300 5.7742900 8.3700000 16.8093000 - 297 2 -1.5437800 5.7615900 6.4423000 19.0828000 - 298 2 -1.6106800 6.7083600 3.7539700 18.7682000 - 299 2 -1.6611700 2.5998600 4.0546700 15.8729000 - 300 2 -1.6177300 9.0946700 6.8989700 15.4528000 - 301 1 2.7890400 5.5567500 9.7356100 20.3182000 - 302 1 2.6477700 5.6899600 13.4687000 22.8632000 - 303 1 2.7338300 4.1732400 9.1371900 25.1647000 - 304 1 2.6805400 3.3622400 11.6126000 23.7185000 - 305 2 -1.5403800 6.0332300 10.9066000 21.2524000 - 306 2 -1.6705400 4.1041300 13.1732000 23.1183000 - 307 2 -1.5584900 4.3757500 10.4547000 24.1155000 - 308 2 -1.6090800 6.9262700 12.2948000 23.1092000 - 309 2 -1.5818400 4.8216000 7.9810500 24.2488000 - 310 2 -1.5933100 2.9972700 11.3530000 29.3330000 - 311 2 -1.5794500 5.1887600 8.4866500 21.4836000 - 312 2 -1.6094700 4.2052800 10.2699000 19.3469000 - 313 2 -1.5687300 7.9799200 12.3881000 19.5290000 - 314 1 2.6850600 2.6998900 14.1768000 16.2940000 - 315 1 2.7343100 5.3861300 12.6800000 16.6553000 - 316 1 2.7382300 7.0004300 13.5143000 19.1594000 - 317 1 2.7501300 3.0587200 9.4332100 18.5117000 - 318 1 2.6492200 2.5864700 11.7422000 17.1525000 - 319 2 -1.6382900 6.0926700 14.0787000 15.8178000 - 320 2 -1.6660900 5.7094000 14.1948000 20.3544000 - 321 2 -1.5699400 7.0947300 9.3818200 19.6062000 - 322 2 -1.5636200 2.4426300 10.2515000 17.2913000 - 323 2 -1.5747300 5.5725400 0.0867556 28.8017000 - 324 2 -1.5749500 5.5489700 13.1528000 18.3188000 - 325 2 -1.5681800 3.5717500 7.9156600 18.4642000 - 326 2 -1.5569900 3.7002800 12.8045000 16.6235000 - 327 2 -1.6099600 1.7395200 6.0958000 17.4120000 - 328 2 -1.6145800 3.6190600 4.9580900 24.8406000 - 329 1 2.7735400 14.5308000 0.4618240 19.9090000 - 330 1 2.8537200 11.7839000 1.6792800 20.7713000 - 331 1 2.8373600 9.3474600 4.9502800 21.1176000 - 332 1 2.6198000 13.1502000 6.6253500 23.5775000 - 333 2 -1.4704300 8.6143900 5.2261200 24.3506000 - 334 1 2.8117600 7.8992200 2.5119800 22.2894000 - 335 1 2.8106700 10.0913000 7.4717300 22.8471000 - 336 2 -1.5329200 12.4725000 2.9877800 21.5856000 - 337 2 -1.5671500 10.1331000 6.0017400 22.1480000 - 338 2 -1.5955600 10.4533000 3.1952600 24.5462000 - 339 2 -1.5454900 7.9940800 1.1716800 23.4517000 - 340 2 -1.6409200 1.2781500 12.8436000 27.6158000 - 341 2 -1.5541200 11.9338000 7.5240200 23.4260000 - 342 2 -1.5962200 9.0585500 3.4248800 21.7115000 - 343 2 -1.5381500 10.8800000 2.1541400 19.2182000 - 344 2 -1.5905400 12.6319000 6.3100400 19.7557000 - 345 2 -1.5732500 9.6163000 10.5670000 24.8617000 - 346 1 2.6974800 11.6181000 1.3122000 15.3761000 - 347 1 2.6799600 9.6005500 5.4756900 16.3801000 - 348 1 2.7689500 11.6349000 5.2031900 18.9696000 - 349 1 2.7213800 9.5019600 1.9045800 18.7499000 - 350 1 2.7332400 7.4165800 3.5565800 17.2752000 - 351 1 2.6794600 10.6588000 7.8123300 17.9003000 - 352 2 -1.5829700 12.1644000 2.6824100 15.9535000 - 353 2 -1.5613800 10.2571000 4.8395600 19.7469000 - 354 2 -1.4652600 12.9795000 0.8774730 20.0625000 - 355 2 -1.5828600 8.6935600 2.2211900 17.4263000 - 356 2 -1.6246000 10.8301000 6.2264800 17.4828000 - 357 2 -1.5362800 12.4504000 4.0880800 18.2498000 - 358 2 -1.5278000 8.3726900 4.8613500 17.1399000 - 359 1 2.7876700 11.1681000 9.7960000 20.9119000 - 360 1 2.7228500 9.6033900 12.2653000 19.8107000 - 361 1 2.7108200 12.0859000 13.9407000 24.1505000 - 362 1 2.7591900 8.4613100 9.3591900 24.5594000 - 363 1 2.6594300 7.0272000 10.8479000 22.3941000 - 364 2 -1.5321700 11.7591000 11.1199000 21.6342000 - 365 2 -1.6336300 9.5317800 13.4770000 21.3723000 - 366 2 -1.6292600 7.2377500 9.5009700 23.2228000 - 367 1 2.6502200 14.9311000 9.8786000 23.7716000 - 368 2 -1.5390100 12.3286000 12.3581000 23.8986000 - 369 2 -1.5044200 9.2164400 8.0001900 24.1516000 - 370 2 -1.5923500 9.7723400 10.5827000 19.8954000 - 371 2 -1.5771000 10.0682000 8.8411000 21.8123000 - 372 1 2.7014700 8.9927400 10.8574000 15.9968000 - 373 2 -1.6265000 13.2135000 14.0596000 19.8183000 - 374 1 2.6783700 10.3632000 14.8568000 21.5887000 - 375 1 2.7149000 13.2137000 8.9576900 16.4469000 - 376 1 2.7880900 9.3739300 13.8220000 15.1974000 - 377 1 2.7247700 11.7565000 14.3852000 18.9625000 - 378 1 2.7671400 8.6360700 9.4576000 19.0113000 - 379 2 -1.6049900 5.8953400 11.1921000 16.3966000 - 380 2 -1.6245100 13.3903000 10.6919000 15.9980000 - 381 2 -1.6056900 10.7054000 13.0256000 18.7918000 - 382 2 -1.5571500 12.3825000 9.2036800 19.9872000 - 383 2 -1.5826900 8.6492900 10.0055000 17.2465000 - 384 2 -1.5551200 9.5531600 8.1385700 18.8747000 - 385 2 -1.5953700 8.8731300 12.4232000 16.0418000 - 386 2 -1.6275200 11.6014000 8.8317000 17.0781000 - 387 1 2.8125700 5.0433100 7.1460500 17.7971000 - 388 1 2.6257600 2.0656700 4.8772000 24.8977000 - 389 1 2.7745500 14.0031000 6.1958200 20.7384000 - 390 1 2.7994200 13.6525000 3.6730800 22.4483000 - 391 2 -1.6302800 14.8707000 7.7498000 21.1479000 - 392 2 -1.6802200 14.4988000 6.5417700 24.6127000 - 393 2 -1.6183100 13.5100000 5.6233400 22.3209000 - 394 2 -1.6037500 0.8688830 6.5845200 19.9229000 - 395 1 2.7557500 14.4895000 5.4343500 15.8548000 - 396 3 0.3732260 0.6167470 4.4183500 17.6093000 - 397 1 2.7995500 13.2202000 2.9959300 17.2393000 - 398 2 -1.6387000 14.4722000 6.8527400 16.8829000 - 399 2 -1.5807100 13.5185000 1.3614000 17.8400000 - 400 2 -1.5491100 14.4357000 3.9858800 16.6377000 - 401 1 2.7170100 14.5014000 13.7422000 20.9378000 - 402 1 2.7941800 12.9445000 11.5084000 22.6497000 - 403 2 -1.5465900 13.6966000 10.1332000 23.0191000 - 404 1 2.4925800 2.0825700 9.9880700 29.5533000 - 405 2 -1.5641300 14.1883000 12.6835000 22.1211000 - 406 2 -1.5666700 14.9300000 10.5292000 20.0724000 - 407 1 2.7200100 13.5656000 14.4690000 16.2128000 - 408 1 2.7836800 13.7189000 9.9044300 19.2321000 - 409 1 2.6353200 12.9357000 11.8638000 17.0733000 - 410 2 -1.5845900 12.9962000 11.4552000 18.5137000 - 411 2 -1.6053800 14.2510000 8.9981200 17.8543000 - 412 2 -1.5602000 13.6461000 12.8736000 16.0588000 - 413 1 2.8152300 14.0966000 0.7310060 24.6664000 - 414 2 -1.6002300 13.6592000 3.6722200 24.0840000 - 415 2 -1.6110600 1.3007700 8.0993200 22.1991000 - 416 2 -1.6345400 1.2536400 3.8625300 25.8778000 - 417 2 -1.3844700 10.6431000 0.9951060 21.4710000 - 418 2 -1.5646100 14.8103000 9.5263200 25.3073000 - 419 1 2.6054400 2.2035300 6.9872800 23.0500000 - 420 2 -1.5500500 12.4892000 1.0024000 24.4957000 - 421 2 -1.5880300 6.5776000 14.8264000 23.3261000 - 422 2 -1.6187400 10.6113000 14.1706000 24.9280000 - 423 2 -1.5174100 6.7101100 0.5782860 16.5321000 - 424 2 -1.6384500 12.2594000 9.2570700 25.6247000 - 425 2 -1.6233800 1.5595900 1.3012600 25.3793000 - 426 2 -1.5716800 0.7653070 2.0824500 28.1046000 - 427 1 2.4439700 1.6097300 2.3414300 26.8312000 - 428 1 2.6147000 2.8170200 5.8292200 29.0824000 - 429 2 -1.4690500 6.0918300 2.0265600 27.2868000 - 430 1 2.5953800 13.7427000 8.5287800 25.8224000 - 431 1 2.5188900 2.1119500 8.0825600 27.2441000 - 432 2 -1.6504600 1.4810500 9.3146100 28.1910000 - 433 1 2.7144500 15.0064000 13.6868000 25.9453000 - 434 2 -1.6436900 1.8236400 6.5456500 27.8736000 - 435 2 -1.6203800 12.9349000 5.6416400 14.9712000 - 436 2 -1.6318100 2.4857100 8.4080100 25.7423000 - 437 2 -1.5231600 7.2848200 1.2640100 25.8505000 - 438 2 -1.6495300 5.1087700 0.3901280 25.8029000 - 439 1 2.5994000 5.8030100 1.8719000 25.4975000 - 440 1 2.7739900 4.8780500 5.2773700 25.9639000 - 441 2 -1.6057600 10.0749000 4.5485200 15.0045000 - 442 1 2.7463000 5.4187900 7.1064900 28.4127000 - 443 2 -1.5627800 8.8369200 1.7792200 28.3422000 - 444 2 -1.5711300 7.0625000 7.1945100 28.5868000 - 445 2 -1.5742200 6.6353000 3.7272400 28.5991000 - 446 1 2.8164900 5.2549000 3.1085200 28.4103000 - 447 2 -1.5890800 11.5211000 0.2305180 16.6638000 - 448 1 2.6985600 6.5083900 9.7582700 26.9342000 - 449 2 -1.5972600 7.5993900 14.7765000 18.1986000 - 450 2 -1.5673500 6.8633300 11.0997000 27.7081000 - 451 2 -1.6052100 5.0620600 12.6886000 28.8543000 - 452 2 -1.5928000 7.3008900 13.9681000 28.1062000 - 453 2 -1.5559300 4.2848900 6.4111400 29.4974000 - 454 1 2.6871400 6.2228600 12.6797000 27.5822000 - 455 2 -1.5621300 4.8558700 6.7635100 26.9487000 - 456 2 -1.4825300 3.8054100 2.7994200 29.0238000 - 457 2 -1.5168500 6.1657300 4.9318600 25.1980000 - 458 2 -1.6315500 5.4483800 13.1521000 26.1987000 - 459 1 2.7478100 8.5324700 0.8459950 24.8657000 - 460 2 -1.5372000 9.9667600 0.7409850 25.4138000 - 461 1 2.8166600 9.4913300 4.3148800 25.3641000 - 462 1 2.7434200 12.0124000 4.3307500 26.9565000 - 463 1 2.8371500 7.8641000 2.7728700 27.5949000 - 464 1 2.7906500 10.0825000 9.7491200 28.9306000 - 465 2 -1.5756600 11.2378000 7.4819600 28.6600000 - 466 2 -1.5767300 10.4370000 4.7887700 26.6463000 - 467 2 -1.5021900 8.3385900 3.5901000 26.3362000 - 468 2 -1.6195700 12.7086000 5.3999000 25.7976000 - 469 2 -1.5661100 11.9399000 2.7340300 26.7747000 - 470 2 -1.6668600 13.5937000 14.4002000 24.9525000 - 471 1 2.7801100 10.9743000 10.3980000 26.0919000 - 472 1 2.6977900 10.2100000 14.2843000 26.4747000 - 473 1 2.7423300 8.8117900 13.7622000 28.8620000 - 474 2 -1.5871300 12.0617000 11.5999000 26.9741000 - 475 2 -1.5733200 12.3487000 14.5235000 28.6225000 - 476 2 -1.4980600 13.9360000 12.9045000 28.7259000 - 477 2 -1.5810100 2.8728600 14.3608000 26.1371000 - 478 2 -1.5580200 9.3994700 13.3353000 27.3247000 - 479 2 -1.5384900 10.0235000 9.6589000 27.3247000 - 480 2 -1.5928300 4.9389500 9.6125100 26.6373000 - 481 1 2.7593300 12.5846000 0.0199036 17.6849000 - 482 1 2.6636400 12.2361000 7.0242800 27.6900000 - 483 2 -1.6187800 14.4472000 1.7180200 26.0746000 - 484 2 -1.6612600 4.9399900 8.5070300 29.4752000 - 485 2 -1.5740500 13.7885000 7.5957000 27.1251000 - 486 2 -1.6153700 2.9690900 6.8960400 15.0413000 - 487 1 2.6653000 14.7891000 9.4904200 29.5148000 - 488 1 2.7677400 13.5809000 11.7513000 27.7910000 - 489 2 -1.6102800 14.5617000 10.3803000 28.0953000 - 490 1 2.5730200 2.0305800 12.7304000 29.0291000 - 491 2 -1.5878200 14.7942000 12.0845000 26.5144000 - 492 2 -1.5733100 13.0097000 5.7263600 28.1399000 - 493 2 -1.5989800 4.4123700 4.0890000 27.0936000 - 494 1 2.8034200 11.3401000 1.8368300 25.2012000 - 495 2 -1.5463600 7.4374200 9.1129400 25.8795000 - 496 2 -1.6066100 13.0947000 8.1727400 14.9780000 - 497 2 -1.5568400 15.0019000 5.1525000 20.1077000 - 498 2 -1.5188500 15.0971000 3.3024300 22.1235000 - 499 1 2.6293200 4.3692200 14.8041000 26.1240000 - 500 1 2.8087900 12.9837000 13.5086000 29.7472000 - 501 2 -1.6037200 9.3996400 8.2012000 29.7553000 - 502 2 -1.6009000 4.1738200 9.7881200 14.8960000 - 503 2 -1.5393500 9.1246100 26.1052000 11.9543000 - 504 2 -1.9231200 5.6755600 17.6202000 2.2972500 - 505 1 2.4571000 1.7921800 17.6614000 0.9816150 - 506 2 -1.6739400 1.4887000 16.1520000 1.5435100 - 507 1 2.5801800 2.6073000 16.8684000 6.1195800 - 508 2 -1.5816000 3.1938800 15.8316000 12.6034000 - 509 1 2.4527300 1.7689800 22.3104000 1.8760300 - 510 2 -1.7299100 3.9767800 19.7571000 2.8246000 - 511 2 -1.5755100 1.7415200 23.9051000 1.4352000 - 512 1 2.4372800 5.0613700 16.9522000 3.6676300 - 513 1 2.6809600 2.2071400 19.1387000 3.6112100 - 514 1 2.7928100 1.1170100 23.7302000 7.1244500 - 515 2 -1.5921200 1.5868300 19.9830000 4.7865800 - 516 2 -1.5873400 1.1234000 18.4814000 8.7423500 - 517 2 -1.6013700 14.4800000 29.6434000 1.9820300 - 518 2 -1.6060300 1.2371300 21.9571000 6.7307500 - 519 2 -1.6422300 2.1965400 17.4411000 4.6141300 - 520 2 -1.6253200 1.4181900 22.3599000 3.3414700 - 521 1 2.7609300 1.8911300 19.5622000 9.6383500 - 522 1 2.5387600 2.0319100 22.9558000 13.1681000 - 523 1 2.4231100 0.5167890 24.7025000 1.3835400 - 524 2 -1.6230700 0.6380080 23.5051000 13.5477000 - 525 2 -1.6198800 2.2759200 21.5498000 12.4528000 - 526 2 -1.5217900 1.5860000 21.0417000 9.4213900 - 527 2 -1.5416300 2.6920300 24.2895000 7.1240700 - 528 2 -1.6047900 1.3238200 26.1509000 1.5739400 - 529 1 2.7192900 14.4667000 26.1330000 1.0001500 - 530 1 2.5853900 7.2833800 17.0422000 2.0167800 - 531 2 -1.6264100 7.5552800 15.5698000 2.4906600 - 532 1 2.6610300 5.4667000 16.0322000 6.3081400 - 533 2 -1.6366500 5.0984400 15.7156000 4.4792300 - 534 3 0.3645500 0.3270670 26.6758000 3.2821400 - 535 1 2.8238100 4.8512300 16.4461000 12.3922000 - 536 2 -1.5372800 11.6250000 25.3134000 10.6924000 - 537 2 -1.5686600 5.8471700 15.5295000 13.2882000 - 538 1 2.7995700 5.0539600 23.7306000 2.5331800 - 539 1 2.6969600 5.0582000 21.2531000 4.6442200 - 540 1 2.7500000 3.2480200 25.5637000 1.0849300 - 541 2 -1.5363300 4.3224800 22.6785000 3.5294500 - 542 2 -1.6111700 7.9929100 18.3320000 3.2907600 - 543 1 2.3188400 4.9528000 19.0599000 1.5260100 - 544 2 -1.4836100 4.1078400 24.2201000 1.4072500 - 545 2 -1.5920800 5.9762600 22.4479000 1.3892500 - 546 2 -1.6166100 2.1005400 21.5814000 0.5031990 - 547 1 2.7221700 7.1321700 19.1111000 5.5623900 - 548 1 2.7459100 2.7498100 23.0588000 4.3242700 - 549 1 2.8877300 6.0258800 22.6004000 7.5116400 - 550 1 2.8090300 4.7033000 18.9868000 7.4356900 - 551 1 2.7650900 2.3704200 20.9006000 6.0829200 - 552 2 -1.4446000 6.1778000 19.2039000 6.8808800 - 553 2 -1.4782200 5.2742300 24.2621000 7.5323900 - 554 2 -1.5544900 7.2190400 17.3759000 9.2620800 - 555 2 -1.5797400 3.3614300 19.7770000 6.8036800 - 556 2 -1.4984600 5.2702600 21.7496000 8.5665900 - 557 2 -1.6285100 4.1811400 17.2631000 6.5614100 - 558 2 -1.5189000 3.3402800 21.7827000 5.1913100 - 559 2 -1.6575200 6.9435900 16.7003000 6.0904000 - 560 2 -1.6424000 5.8335600 19.7447000 4.5987200 - 561 2 -1.4834200 5.8558100 22.0210000 5.8552000 - 562 1 2.8124000 5.8620800 18.1417000 10.1062000 - 563 1 2.7666500 4.0422200 25.1071000 7.1336800 - 564 1 2.7193800 5.3362500 22.4099000 12.0930000 - 565 1 2.6692000 4.1082300 18.1222000 14.4535000 - 566 1 2.5940600 2.5089400 19.8728000 12.6174000 - 567 1 2.6904700 4.2287500 25.3234000 11.5604000 - 568 2 -1.6042700 6.2477700 19.5994000 10.9297000 - 569 2 -1.6081800 4.4933200 23.7079000 11.4508000 - 570 2 -1.6481600 4.8065600 21.7106000 13.4677000 - 571 2 -1.5706900 7.4187000 17.9803000 13.1556000 - 572 2 -1.5994300 2.7786400 19.0830000 14.0784000 - 573 2 -1.6272600 5.2537600 26.4705000 10.9281000 - 574 2 -1.5550200 6.8452100 22.1879000 11.6759000 - 575 2 -1.5390100 4.7793100 17.9200000 13.1913000 - 576 2 -1.5382500 2.2565100 19.1237000 11.2418000 - 577 2 -1.5725800 5.3159500 16.7852000 10.8972000 - 578 2 -1.5279100 4.6575100 18.4972000 8.9754600 - 579 2 -1.4874900 7.7123100 22.9663000 7.8700500 - 580 1 2.6563400 7.2948000 19.4467000 14.0471000 - 581 1 2.8086100 10.0978000 20.5681000 13.5728000 - 582 2 -1.5255500 2.7648600 24.6355000 4.4128200 - 583 2 -1.5786000 12.2702000 29.4756000 11.1837000 - 584 1 2.6764700 10.5413000 16.5840000 0.6823800 - 585 1 2.6916600 8.4439300 15.7081000 6.1720500 - 586 1 2.7104100 13.0555000 15.3692000 12.9350000 - 587 1 2.7223100 7.9399000 16.0010000 9.4063900 - 588 1 2.7458700 10.9092000 15.8840000 10.7224000 - 589 2 -1.6131000 8.9534700 15.4197000 7.8528000 - 590 1 2.7274300 11.8797000 26.5011000 9.6611700 - 591 2 -0.6578570 8.6301400 19.4542000 10.8421000 - 592 1 2.7913100 11.1555000 21.1904000 1.1045400 - 593 1 2.6858600 9.0110400 19.4194000 2.4081200 - 594 1 2.7691600 10.0335000 23.9477000 1.7249100 - 595 2 -1.6387000 7.9534900 20.5679000 1.4034300 - 596 2 -1.5676700 10.5170000 21.8539000 14.4709000 - 597 2 -1.5191900 10.8084000 22.7925000 0.8497250 - 598 2 -1.6091600 8.3841400 17.8671000 1.1763100 - 599 1 2.6995800 11.6034000 17.6000000 3.5554000 - 600 1 2.8063800 7.5972200 22.0667000 2.0131400 - 601 1 2.8318000 11.9652000 22.7528000 6.9372900 - 602 1 2.7882200 10.0106000 18.2551000 6.0579500 - 603 1 2.7925800 12.3647000 23.8807000 4.0527300 - 604 2 -1.5973300 11.4125000 18.4944000 4.9956700 - 605 2 -1.4058900 7.7095500 22.0211000 3.4704900 - 606 2 -1.5781400 10.6619000 22.9516000 8.1183900 - 607 2 -1.4830100 13.0462000 17.7691000 8.0691300 - 608 2 -1.5238700 8.7273200 19.2476000 5.7601400 - 609 2 -1.5490000 12.1192000 23.9966000 5.6965700 - 610 2 -1.5122300 11.6074000 21.3857000 6.0322000 - 611 2 -1.5789100 9.6294100 16.6456000 5.6670700 - 612 2 -1.5561900 8.4397000 23.3628000 1.4026200 - 613 2 -1.6022400 12.3241000 16.0411000 3.8081400 - 614 2 -1.5816700 10.6099000 17.6651000 2.3431200 - 615 2 -1.5216000 12.8189000 21.2099000 1.5129300 - 616 1 2.8010200 11.7744000 18.3558000 8.8429000 - 617 1 2.8332300 9.0299400 22.8032000 9.0048600 - 618 1 2.8051700 11.1718000 23.3159000 14.0207000 - 619 1 2.6939200 8.4694400 16.8733000 12.5215000 - 620 1 2.7866000 7.8026000 20.7151000 11.1180000 - 621 1 2.8061700 10.0442000 24.7041000 11.3844000 - 622 2 -1.4946100 12.0988000 19.9328000 9.3192400 - 623 2 -1.5084100 9.2128700 24.0446000 10.1360000 - 624 2 -1.4545500 11.7115000 18.0919000 12.8287000 - 625 2 -1.5875500 8.2966800 20.3923000 13.1174000 - 626 2 -1.5542400 10.2530000 23.8567000 12.7656000 - 627 2 -1.4249900 10.8566000 20.5509000 12.2744000 - 628 2 -1.6540400 9.0380600 16.2006000 10.9464000 - 629 2 -1.4753300 8.6698300 21.4258000 9.7455200 - 630 2 -1.5130800 11.5049000 17.2465000 10.1593000 - 631 2 -1.5422900 10.5365000 18.3970000 7.6320900 - 632 2 -1.5366300 13.5524000 22.8220000 7.6632600 - 633 1 2.8093300 10.8615000 17.7235000 14.0920000 - 634 2 -1.5640800 9.6918800 16.6794000 13.4088000 - 635 2 -1.5847600 12.8676000 23.2813000 13.7917000 - 636 2 -1.5443600 10.3468000 20.3752000 2.3930400 - 637 2 -1.5706300 10.7727000 23.9345000 3.2012900 - 638 2 -1.5506600 13.4380000 22.6851000 3.6877000 - 639 2 -0.6419120 11.9213000 21.9244000 10.9331000 - 640 2 -1.5467600 10.2885000 19.1451000 14.5097000 - 641 2 -1.5423800 5.0096300 25.5696000 0.0615873 - 642 2 -1.7053700 14.6117000 15.4058000 9.8358400 - 643 1 2.7119800 14.7648000 18.0451000 0.4488230 - 644 2 -1.5408100 13.1408000 18.3046000 0.9600250 - 645 1 2.8160500 13.7487000 21.1621000 2.8724300 - 646 1 2.8676000 14.3212000 18.6139000 7.6964600 - 647 1 2.8103900 12.5539000 20.0740000 5.4751600 - 648 2 -1.6246300 11.6725000 15.3739000 1.0443300 - 649 2 -1.4777700 13.6276000 19.7351000 6.5408800 - 650 2 -1.6272100 0.7520550 26.6685000 14.6244000 - 651 2 -1.5543800 13.1929000 20.1470000 4.0349500 - 652 1 2.8299400 14.4713000 22.9388000 9.0958600 - 653 1 2.8201200 13.1621000 18.6018000 12.7253000 - 654 1 2.8098500 12.7673000 20.8734000 10.5985000 - 655 2 -1.5722900 14.4656000 24.4525000 9.7640400 - 656 2 -1.5012800 13.4249000 19.6575000 11.5785000 - 657 2 -1.5820600 13.8614000 16.6730000 12.3087000 - 658 2 -1.4865700 14.0391000 21.8201000 10.1214000 - 659 2 -1.5982800 13.7616000 19.1827000 14.2373000 - 660 2 -1.5003000 12.9539000 25.3089000 3.4956700 - 661 1 2.7115300 13.2407000 15.7973000 5.2985500 - 662 2 -1.6195100 9.9970800 25.6552000 1.0218000 - 663 2 -1.6949400 0.3839280 24.2471000 8.7811500 - 664 2 -1.6647700 1.1969400 17.3420000 13.8954000 - 665 1 2.4399400 4.6751300 15.4551000 0.4146770 - 666 2 -1.6792700 1.3264100 18.8787000 2.1809000 - 667 2 -1.6759200 2.6838500 25.7265000 12.0780000 - 668 2 -1.5689400 5.6687400 25.1138000 3.5283100 - 669 2 -1.5266000 3.3088900 27.1189000 1.3051000 - 670 2 -1.5898500 4.5543000 26.5261000 6.3082700 - 671 2 -1.6046300 11.2582000 27.3538000 3.2940800 - 672 1 2.7195600 1.9795000 15.5698000 13.7434000 - 673 2 -1.6249400 1.1365500 27.5065000 7.4771600 - 674 2 -1.5706800 3.5801700 26.5335000 8.2534600 - 675 2 -1.5612500 14.5383000 27.0851000 10.9825000 - 676 2 -1.5640000 4.1514400 29.4145000 14.8620000 - 677 2 -1.9292300 3.8913200 17.9006000 0.3014590 - 678 2 -1.3291900 10.1801000 29.0364000 1.3717400 - 679 2 -1.6388500 13.0964000 27.1403000 5.5008500 - 680 1 2.6860900 12.5598000 26.6386000 4.0774400 - 681 1 2.7223400 14.0224000 26.9994000 7.0324400 - 682 1 2.6158100 13.3790000 28.9063000 0.8110540 - 683 1 2.5924800 14.5367000 29.3545000 3.6388300 - 684 2 -1.6092600 9.8986000 28.6307000 12.8575000 - 685 1 2.7087200 10.7242000 28.7916000 11.2183000 - 686 2 -1.5632000 7.4254700 27.6518000 13.5716000 - 687 2 -1.5452500 10.7868000 27.5838000 10.1619000 - 688 1 2.6802600 6.7331700 29.0302000 13.2938000 - 689 2 -0.6858040 14.0199000 28.5098000 13.2839000 - 690 1 2.7794500 8.9566600 26.9386000 13.2867000 - 691 1 2.6524200 2.2336500 26.7367000 13.4511000 - 692 2 -1.4436300 6.6616600 27.3115000 5.1543900 - 693 2 -1.6268600 11.6800000 14.9203000 12.0789000 - 694 1 2.7030000 10.0449000 27.5344000 2.1122500 - 695 2 -1.6364500 0.0462051 28.5128000 3.9423300 - 696 1 2.8090100 5.4826300 26.6339000 4.4344300 - 697 2 -1.5763100 14.4026000 16.8589000 4.9468200 - 698 1 2.7893500 1.5973300 28.9932000 3.8617100 - 699 3 0.4951330 0.6026780 28.7504000 5.8229400 - 700 2 -1.5986800 5.0606900 28.6096000 9.0585300 - 701 2 -1.6320400 1.8037800 28.3045000 12.7008000 - 702 2 -1.3558600 9.3213100 26.0858000 14.5734000 - 703 2 -1.5841400 5.7023000 28.9275000 11.9967000 - 704 1 2.5071700 2.7628400 28.7277000 11.2450000 - 705 1 2.4675200 2.0904700 26.9501000 8.6207900 - 706 1 2.7048100 6.0361300 28.3857000 10.4724000 - 707 2 -1.6522200 1.8060600 27.9115000 10.1032000 - 708 2 -1.4541900 6.0153500 27.9210000 1.6388400 - 709 2 -1.4857500 4.4222500 27.6340000 3.6399200 - 710 2 -1.5442100 3.8751300 29.2255000 7.3649700 - 711 2 -1.6640100 7.6824800 29.1583000 10.2235000 - 712 2 -1.5103600 3.5178600 26.8023000 14.3082000 - 713 3 0.4499670 1.9410100 27.0224000 4.8143100 - 714 1 2.7232200 4.5557600 27.7137000 7.5448600 - 715 1 2.7326100 7.1984500 28.8190000 1.9678700 - 716 2 -1.4900800 4.1714400 29.5574000 1.2464600 - 717 2 -1.5530400 8.4781600 27.7217000 2.5530200 - 718 2 -1.5902100 13.1038000 27.4178000 1.1794800 - 719 1 2.8285700 4.4550100 28.1220000 2.0393200 - 720 2 -1.4879800 2.0375500 28.5627000 2.5169000 - 721 1 2.7115700 1.0686800 27.7987000 1.6991400 - 722 2 -1.6047200 12.7733000 26.7744000 8.3137700 - 723 2 -1.6009800 12.5096000 15.1563000 6.4163600 - 724 2 -1.5709500 8.3018200 29.4642000 0.4800630 - 725 2 -1.6767900 1.8351600 15.4965000 6.8596100 - 726 2 -1.6344800 4.4968900 24.2190000 14.4550000 - 727 3 0.4875510 0.3149100 19.9737000 13.5647000 - 728 1 2.7752800 14.1882000 22.9038000 14.7598000 - 729 2 -1.5778200 0.0949927 24.4103000 5.7561200 - 730 1 2.7149300 14.9975000 28.2635000 12.0225000 - 731 2 -1.6075700 15.0326000 28.5710000 7.3461000 - 732 2 -1.6817400 13.3737000 14.9411000 14.4424000 - 733 2 -1.6065500 5.0237800 14.9408000 7.3966700 - 734 2 -1.6005400 0.0197857 28.3108000 0.7083360 - 735 1 2.8321800 4.3593900 26.1816000 19.8970000 - 736 2 -1.5745300 8.8260600 26.2837000 22.3329000 - 737 1 2.6921700 4.2361500 16.9755000 17.3502000 - 738 1 2.6319000 1.3124300 16.8392000 17.9717000 - 739 1 2.6562500 2.0180400 17.1304000 21.9348000 - 740 2 -1.6065500 1.8297000 18.6732000 22.4439000 - 741 1 2.5521700 1.9160200 23.3455000 23.1759000 - 742 2 -1.6378200 2.7872300 21.1485000 24.2073000 - 743 2 -1.6282500 0.5935710 17.0939000 19.9046000 - 744 2 -1.5643700 3.6400900 21.8882000 19.6559000 - 745 1 2.8026700 8.9626900 26.6658000 18.1593000 - 746 1 2.7952400 15.0546000 24.7156000 28.5041000 - 747 1 2.7618700 1.9959600 21.9833000 19.3676000 - 748 2 -1.6070000 1.2795800 20.4185000 15.3670000 - 749 2 -1.6284800 1.0214700 21.5930000 20.7205000 - 750 2 -1.5947900 1.3163000 15.9891000 23.0820000 - 751 2 -1.6041200 1.7788500 23.5368000 18.6596000 - 752 2 -1.5882400 1.5936700 21.0575000 17.9910000 - 753 2 -1.5508900 2.8663800 17.3338000 18.0426000 - 754 2 -1.6256100 0.4019430 17.6118000 16.6249000 - 755 2 -1.5570400 2.8480900 25.2490000 16.7314000 - 756 2 -1.5739700 1.4278000 24.4641000 22.1141000 - 757 1 2.6596600 5.1682900 17.1049000 21.3409000 - 758 2 -1.6752100 3.5060900 16.5585000 21.4007000 - 759 2 -1.6460700 14.9925000 16.6649000 29.4142000 - 760 2 -1.6437000 10.8556000 15.3646000 20.0487000 - 761 1 2.4381600 8.0824400 15.1111000 23.5205000 - 762 1 2.7669900 14.1303000 21.9385000 24.7457000 - 763 2 -1.6573200 1.2211500 15.2167000 17.6941000 - 764 1 2.7608200 6.8326300 15.5257000 16.9010000 - 765 1 2.7733700 6.8756000 18.4808000 19.2141000 - 766 1 2.7776500 4.6510600 21.4798000 20.8629000 - 767 1 2.6751300 4.9242600 17.4292000 24.2875000 - 768 1 2.6779000 3.1209000 19.6940000 23.0055000 - 769 1 2.7035400 5.7246600 23.5846000 22.9535000 - 770 2 -1.5451500 7.5212800 19.0564000 20.7198000 - 771 2 -1.6041000 4.7030500 22.6173000 22.1834000 - 772 2 -1.6653500 3.6983500 18.4843000 24.1625000 - 773 2 -1.6413800 6.8454000 23.0146000 24.2906000 - 774 2 -1.5680300 7.7538600 20.2582000 23.2313000 - 775 2 -1.6300000 5.8129400 17.4151000 22.8511000 - 776 2 -1.6013500 4.0690400 20.0346000 21.7395000 - 777 2 -1.5483600 5.8516000 17.2378000 20.0188000 - 778 2 -1.6031400 5.8231900 19.3744000 18.3306000 - 779 2 -1.6072200 8.8079100 22.0779000 20.1613000 - 780 2 -1.6049300 12.0108000 20.3977000 21.2357000 - 781 1 2.7760100 4.6907900 22.8168000 15.2284000 - 782 1 2.7652200 7.2507600 22.0460000 19.3823000 - 783 1 2.7689500 5.4736000 20.4423000 16.8820000 - 784 1 2.7259000 2.4284600 21.0572000 16.5575000 - 785 2 -1.6439400 7.0773700 20.1628000 15.4934000 - 786 2 -1.5592000 5.6924100 21.9959000 16.1675000 - 787 2 -1.5427000 6.2182800 21.3996000 20.4029000 - 788 2 -1.5313400 8.3204300 17.9722000 18.5318000 - 789 2 -1.6794900 3.8669200 20.1272000 16.7109000 - 790 2 -1.5753000 6.9223700 23.6670000 19.2433000 - 791 2 -1.5051800 7.2778500 21.4912000 17.8417000 - 792 2 -1.6054300 5.1417600 15.7385000 17.8048000 - 793 2 -1.5270700 7.0847600 16.8056000 16.1494000 - 794 2 -1.5728800 4.3399400 17.6194000 15.8863000 - 795 2 -1.5851900 8.3412800 23.4807000 15.6575000 - 796 1 2.7607500 6.9340100 25.0437000 20.0911000 - 797 2 -1.6033000 4.8373400 24.5583000 23.9162000 - 798 2 -1.6279100 0.9379400 23.1662000 24.4031000 - 799 1 2.8383100 4.1299400 26.3464000 15.8921000 - 800 2 -1.5908400 3.1119400 22.4161000 15.9551000 - 801 1 2.6155600 12.9604000 16.2336000 22.0890000 - 802 1 2.5625000 7.5736800 19.5815000 24.5427000 - 803 1 2.7900900 11.0184000 15.9831000 16.5461000 - 804 1 2.6370100 12.1208000 18.7100000 29.4768000 - 805 1 2.7510900 12.1531000 18.8693000 20.3291000 - 806 1 2.6351500 9.8095600 23.2667000 20.3474000 - 807 1 2.5913500 10.0359000 17.4834000 23.7101000 - 808 1 2.6757700 8.3837100 19.4946000 21.9002000 - 809 1 2.6603000 11.2125000 24.4249000 22.7083000 - 810 2 -1.6288200 10.8359000 21.4375000 23.5969000 - 811 2 -1.6090200 9.7667100 23.9869000 21.9353000 - 812 2 -1.6292800 14.3705000 17.3545000 24.6602000 - 813 2 -1.6287100 9.6413500 18.5533000 22.4818000 - 814 2 -1.5832900 10.9361000 24.2341000 24.1885000 - 815 2 -1.6030000 9.3029200 15.8324000 22.8960000 - 816 1 2.5533400 11.7917000 20.7057000 22.6671000 - 817 2 -1.6278600 12.4370000 17.6816000 21.7588000 - 818 2 -1.5561800 10.5581000 18.7633000 19.7837000 - 819 2 -1.5256600 13.7077000 23.2088000 20.0856000 - 820 2 -1.6463900 11.3769000 17.2081000 24.5768000 - 821 2 -1.5941900 8.3152400 25.8179000 19.5437000 - 822 2 -1.5489500 10.9828000 24.2977000 15.3273000 - 823 1 2.8246700 12.9486000 25.2125000 16.6230000 - 824 1 2.7891400 12.4440000 23.2218000 18.9341000 - 825 1 2.7478300 9.8711400 17.9801000 18.6390000 - 826 1 2.7682700 8.2139900 21.9417000 16.4664000 - 827 1 2.7548000 9.5234900 24.8615000 15.6664000 - 828 2 -1.5181700 12.0543000 19.9845000 16.5333000 - 829 1 2.7421600 2.9293300 24.5539000 18.1102000 - 830 2 -1.5878000 10.9667000 23.9199000 19.5931000 - 831 2 -1.5409100 13.0730000 18.3715000 19.2010000 - 832 2 -1.5176000 12.6220000 23.9572000 17.4864000 - 833 2 -1.5623300 11.8597000 21.6584000 18.5441000 - 834 2 -1.5472100 10.7055000 17.1283000 17.6628000 - 835 2 -1.6102300 9.6370600 21.2440000 17.0925000 - 836 2 -1.5795000 11.5722000 16.8193000 15.2109000 - 837 1 2.6328000 8.4782500 24.7992000 22.4391000 - 838 2 -1.4268400 12.6399000 26.5595000 16.0356000 - 839 2 -1.5587000 12.3651000 23.6497000 22.1625000 - 840 2 -1.5765700 7.0982100 24.3819000 21.8827000 - 841 2 -1.5179100 4.1578300 24.9527000 18.8234000 - 842 2 -1.5794300 13.3238000 26.4570000 18.5052000 - 843 2 -1.5167700 9.4970600 25.5089000 17.1937000 - 844 1 2.5044400 1.4118100 18.6735000 14.9185000 - 845 1 2.8267100 13.9324000 23.4723000 21.7590000 - 846 2 -1.5501700 14.8558000 24.7176000 22.2162000 - 847 2 -1.6104100 14.2578000 20.1968000 24.3825000 - 848 2 -1.6126600 14.3546000 22.3560000 23.1108000 - 849 1 2.7603800 1.8564000 25.9454000 21.1877000 - 850 2 -1.6397100 4.7034500 16.1587000 25.2398000 - 851 1 2.8043100 13.6306000 19.9168000 15.8997000 - 852 3 0.3372550 0.1770650 16.2066000 21.4413000 - 853 1 2.7624200 14.7963000 18.7580000 18.5733000 - 854 1 2.7579400 11.2136000 20.9846000 17.3093000 - 855 2 -1.5877200 14.4371000 24.6095000 15.7490000 - 856 2 -1.5175300 14.6315000 19.0786000 16.8943000 - 857 2 -1.6251800 14.4990000 15.6526000 22.1227000 - 858 2 -1.5641300 13.8442000 21.6557000 15.7713000 - 859 1 2.7724700 13.3776000 27.2531000 25.1270000 - 860 2 -1.6593900 8.6914500 18.2219000 25.0089000 - 861 2 -1.2879200 5.4683000 25.9693000 16.2867000 - 862 2 -1.5038700 5.8385600 26.0526000 20.4284000 - 863 2 -1.6231800 14.4707000 25.9947000 25.3299000 - 864 2 -1.5387500 3.3156000 25.5466000 20.9813000 - 865 2 -1.5843000 11.8079000 26.9106000 21.0484000 - 866 2 -1.5457800 12.5140000 26.9303000 23.8532000 - 867 2 -1.9297200 6.2525400 16.3982000 29.5194000 - 868 2 -1.6293500 8.2108400 25.4373000 25.5650000 - 869 2 -1.6202600 2.8753600 25.1851000 29.0047000 - 870 1 2.4573800 2.4253500 20.8716000 25.7185000 - 871 1 2.5600900 1.5812900 18.2701000 26.8298000 - 872 1 2.4583100 1.4105600 24.6924000 28.1522000 - 873 2 -1.9229400 1.8594600 18.6074000 28.9578000 - 874 2 -1.9299700 3.4904000 19.4029000 27.1195000 - 875 2 -1.6028300 3.5482500 15.6803000 29.2320000 - 876 2 -1.6046200 0.7576950 25.7615000 26.9632000 - 877 2 -1.6095400 0.9441120 16.9727000 26.6954000 - 878 1 2.6144200 6.7997800 15.3863000 27.7695000 - 879 2 -1.9238800 5.3796700 21.4629000 26.3233000 - 880 1 2.6188000 7.9732600 17.5229000 26.3633000 - 881 1 2.5347000 5.3278100 19.7128000 26.7828000 - 882 1 2.4318000 4.3500300 16.8824000 28.6031000 - 883 1 2.5001600 3.5556600 19.2600000 28.9335000 - 884 1 2.7302300 4.6167700 24.5374000 28.6990000 - 885 2 -1.9269800 7.7746600 18.3278000 28.0008000 - 886 2 -1.6402000 4.3240800 22.7269000 28.9064000 - 887 1 2.7250000 8.1416200 29.5839000 17.0885000 - 888 2 -1.6024500 5.1465200 15.6028000 27.6570000 - 889 2 -1.6881900 5.0142000 20.0809000 29.3115000 - 890 2 -1.6329600 7.6096200 16.0264000 26.4367000 - 891 2 -1.6374200 7.4830200 23.1686000 27.0619000 - 892 1 2.7230800 11.1243000 22.7805000 24.9401000 - 893 2 -1.5817200 5.3172100 25.0878000 27.4437000 - 894 1 2.8031900 11.9519000 15.9392000 28.3208000 - 895 2 -1.6273200 10.5313000 15.6534000 27.1091000 - 896 2 -1.5494500 9.8814000 22.7793000 26.0418000 - 897 1 2.6985900 8.9446600 23.9410000 26.7746000 - 898 1 2.7123300 4.2191500 29.5922000 29.4944000 - 899 2 -1.5804400 12.5506000 18.8908000 26.3598000 - 900 2 -1.6136100 9.7016000 24.6818000 28.0944000 - 901 2 -1.5168900 11.4174000 17.2311000 29.2568000 - 902 2 -1.5463100 13.0198000 16.6160000 27.1150000 - 903 2 -1.5781600 12.4486000 27.5764000 26.7174000 - 904 1 2.7008800 13.6061000 19.6170000 27.3251000 - 905 2 -1.6255000 11.8605000 14.9755000 22.5441000 - 906 2 -1.5423400 14.4572000 23.1452000 28.3996000 - 907 2 -1.4842700 13.6044000 19.0335000 28.7178000 - 908 2 -1.5526000 9.8642200 14.9301000 16.2219000 - 909 2 -1.5153400 14.2380000 20.9346000 26.9812000 - 910 1 2.7280200 12.7667000 17.2634000 25.6705000 - 911 2 -1.5627800 14.0421000 25.9155000 29.1202000 - 912 2 -1.6857400 2.8086500 15.3371000 15.2290000 - 913 1 2.6511300 6.5324800 22.8735000 25.8327000 - 914 2 -1.6339600 1.8505100 23.0407000 27.8370000 - 915 2 -1.9309800 6.3499400 18.7028000 25.5933000 - 916 2 -1.6305500 1.1393800 19.8749000 26.2230000 - 917 2 -1.5725300 12.6255000 22.4421000 25.3188000 - 918 2 -1.6350000 14.3195000 28.8310000 25.4807000 - 919 1 2.6532500 8.0572000 17.5335000 29.5411000 - 920 2 -1.5768600 8.3004100 26.7791000 29.1004000 - 921 2 -1.6193200 13.1100000 29.3620000 29.0694000 - 922 1 2.6742600 12.0153000 28.4695000 27.9552000 - 923 1 2.8417200 14.8104000 27.3579000 18.5519000 - 924 2 -1.4611900 7.9053300 29.1153000 27.4865000 - 925 2 -1.6355100 10.5056000 28.3240000 28.4559000 - 926 1 2.7565600 8.3473700 28.4122000 28.7869000 - 927 2 -1.5773600 5.7412200 26.5154000 25.3630000 - 928 2 -1.5697300 3.7656700 27.2873000 27.1691000 - 929 2 -1.6195100 3.0273000 29.5553000 28.3624000 - 930 2 -1.5591700 6.2157400 27.8696000 27.5329000 - 931 1 2.6581100 2.7816500 28.4983000 27.1590000 - 932 1 2.7365000 5.3055800 26.6326000 26.9779000 - 933 2 -1.6233600 1.5809000 28.2751000 26.1332000 - 934 1 2.7174500 1.2551900 26.7020000 25.3507000 - 935 1 2.7879100 11.9489000 27.3586000 19.4158000 - 936 2 -1.4792300 3.5536600 27.9035000 16.7242000 - 937 2 -1.6387900 2.7918000 26.0946000 24.7979000 - 938 1 2.6817900 7.3119200 26.5784000 25.0007000 - 939 1 2.2951700 5.4259900 21.8329000 29.6574000 - 940 1 2.6317200 2.8253700 29.2863000 16.0864000 - 941 2 -1.6026300 8.8841300 29.6104000 15.4290000 - 942 2 -1.4384100 12.9302000 28.6080000 18.8822000 - 943 2 -1.4152200 12.9955000 28.9263000 22.2818000 - 944 1 2.8435300 11.9278000 27.8874000 22.5051000 - 945 2 -1.5630600 8.0591700 27.9565000 17.5181000 - 946 3 0.2212210 0.3714930 25.8055000 29.6027000 - 947 1 2.7889300 6.2294300 29.5067000 27.2511000 - 948 2 -1.6874500 11.0871000 20.0103000 29.4996000 - 949 2 -1.6499300 0.5845090 26.1376000 19.8899000 - 950 2 -1.5951700 1.9863300 27.5720000 21.9786000 - 951 2 -1.5795300 7.7563100 27.7723000 24.0498000 - 952 2 -1.4912100 10.2778000 28.2446000 22.9354000 - 953 1 2.8160900 8.6807100 27.8960000 22.4879000 - 954 2 -1.5520300 10.4590000 27.5492000 18.8070000 - 955 1 2.1152000 0.6497460 27.2220000 16.1206000 - 956 2 -1.4840800 3.8541400 27.6453000 19.6222000 - 957 2 -1.6145600 1.0583600 28.6737000 16.5218000 - 958 2 -1.4661200 7.7495800 28.7066000 21.2409000 - 959 2 -1.5673100 4.5215100 27.2163000 23.0778000 - 960 1 2.6713100 3.3466500 28.1434000 22.5848000 - 961 1 2.7131600 4.4436700 26.2009000 24.2981000 - 962 1 2.2810300 2.7586700 22.1384000 28.8492000 - 963 1 2.7122500 9.3762300 25.6272000 29.3048000 - 964 2 -1.6153800 3.2355900 29.5621000 23.4789000 - 965 2 -1.5465700 14.8359000 29.1262000 18.5863000 - 966 2 -1.5682200 14.7705000 14.8808000 17.0492000 - 967 2 -1.6189400 9.1580400 16.1870000 29.5215000 - 968 2 -1.5882000 12.1617000 14.9229000 17.2521000 - 969 1 2.6721500 17.7053000 12.3497000 0.8333460 - 970 2 -1.6720000 20.6773000 0.2615210 14.7541000 - 971 2 -1.6569500 28.7780000 8.0499300 1.3100100 - 972 2 -1.6051500 16.0357000 0.4430960 8.3613400 - 973 2 -1.5409400 28.7330000 1.7128300 14.3475000 - 974 1 2.6670800 15.8635000 1.1135900 1.8545100 - 975 2 -1.5457100 18.1967000 14.2190000 9.8448100 - 976 2 -1.6507700 15.4540000 14.2689000 3.5039000 - 977 1 2.7947800 29.4870000 14.2818000 14.7672000 - 978 2 -1.6270100 26.8453000 14.7342000 1.2763400 - 979 2 -1.5630700 26.0867000 10.3858000 14.5698000 - 980 2 -1.5474200 16.5882000 7.9930100 4.1977400 - 981 2 -1.6303200 25.7898000 0.5184430 4.7540700 - 982 2 -1.5369600 18.5363000 5.2808800 14.3651000 - 983 2 -1.5890200 21.0903000 14.6571000 11.7830000 - 984 2 -1.6027400 15.4893000 0.9825010 3.6124600 - 985 1 2.7795800 17.1200000 5.5248400 2.3854500 - 986 2 -1.5885900 16.0246000 4.8035500 3.5618800 - 987 2 -1.5977500 15.9866000 6.6988000 1.6795200 - 988 2 -1.4933900 17.8540000 4.9867700 0.8996230 - 989 1 2.6692700 15.9552000 1.9147000 4.8874900 - 990 1 2.8082000 16.1935000 5.9723200 7.6789200 - 991 2 -1.5212000 17.2634000 2.6903300 4.8879500 - 992 2 -1.5661100 25.5931000 13.1040000 14.5815000 - 993 2 -1.6109100 18.2701000 0.9782160 9.5773100 - 994 2 -1.5830500 15.4181000 7.1858500 6.8434600 - 995 2 -1.5802400 16.6866000 4.4656700 6.7207100 - 996 2 -1.5722100 26.3020000 5.6206800 2.2606400 - 997 2 -1.5697900 18.5486000 5.6633700 3.3021700 - 998 1 2.7339300 16.5888000 0.9166860 10.0378000 - 999 1 2.8289700 16.9981000 5.1046000 13.6630000 - 1000 1 2.7717900 15.3142000 6.7124100 11.6386000 - 1001 2 -1.6151500 15.8967000 2.3321800 10.6665000 - 1002 2 -1.5427300 20.4175000 0.2197870 1.5114400 - 1003 2 -1.5159600 16.6569000 6.0100500 12.1936000 - 1004 2 -1.5298700 16.4393000 3.5180400 13.1662000 - 1005 1 2.7442600 15.3193000 3.1664300 12.1043000 - 1006 2 -1.5457100 17.5560000 6.3483200 8.4880000 - 1007 1 2.7143700 15.6690000 14.3673000 1.7716200 - 1008 2 -1.5746700 18.4609000 8.8826900 2.3566700 - 1009 2 -1.5581700 16.2814000 12.9808000 1.2314400 - 1010 1 2.8125700 17.3111000 9.2951100 3.7497400 - 1011 1 2.7383400 15.6229000 13.0867000 4.6591300 - 1012 2 -1.6032500 18.9376000 6.9321900 6.0303000 - 1013 2 -1.5445500 16.5688000 9.5551800 7.0968100 - 1014 1 2.7510900 18.3298000 13.2782000 10.9790000 - 1015 2 -1.6060700 18.4348000 10.2819000 4.7135200 - 1016 2 -1.6386000 16.1730000 10.4101000 3.1876700 - 1017 1 2.7928600 20.1373000 10.5420000 4.9866700 - 1018 1 2.7922800 15.5944000 9.7278200 10.7163000 - 1019 2 -1.5769000 18.3749000 10.7153000 0.3594170 - 1020 1 2.7574900 16.9661000 14.1154000 13.5832000 - 1021 2 -1.5621200 16.3281000 10.3185000 12.0216000 - 1022 2 -1.5155400 18.0909000 8.3629700 14.4300000 - 1023 2 -1.5661800 17.4643000 12.9159000 12.3378000 - 1024 2 -1.5605700 15.3166000 8.0073700 10.6943000 - 1025 2 -1.6462100 15.4539000 9.1633800 14.3149000 - 1026 2 -1.5506000 18.5586000 13.0218000 14.7028000 - 1027 2 -1.5270900 16.9688000 12.6849000 5.3162300 - 1028 2 -1.5777300 18.6510000 0.2876910 2.8590300 - 1029 1 2.7834900 19.8793000 1.5148300 2.4356000 - 1030 1 2.7960400 19.4443000 4.1840700 0.6809990 - 1031 2 -1.6385000 19.2689000 2.7017800 1.3838500 - 1032 1 2.7648700 19.2753000 5.8387600 4.7523700 - 1033 1 2.7523700 18.8360000 2.4920800 8.8619500 - 1034 1 2.7485400 17.9278000 3.4556300 6.1561400 - 1035 2 -1.5859300 18.4194000 2.3955900 7.2731000 - 1036 2 -1.5899500 19.3698000 4.4989500 5.7682400 - 1037 1 2.8088800 18.8185000 5.4670700 9.1786300 - 1038 1 2.7587200 19.7886000 0.7425400 13.2492000 - 1039 2 -1.4483900 19.8181000 2.0603400 12.5754000 - 1040 2 -1.4616400 19.4982000 6.0245600 10.4719000 - 1041 2 -1.5466500 18.3026000 3.9061900 9.3437500 - 1042 1 2.6806100 19.0696000 9.5210800 1.1126300 - 1043 2 -1.5823600 18.7946000 12.8310000 2.1491500 - 1044 1 2.8259100 17.5873000 10.1015000 8.3028500 - 1045 1 2.7829900 17.8979000 12.6852000 6.6470500 - 1046 2 -1.5532000 18.9545000 9.0167500 8.0677900 - 1047 2 -1.5136400 18.2739000 14.1634000 6.8595800 - 1048 1 2.7212200 19.3726000 8.2549500 6.7799600 - 1049 1 2.8459900 19.3401000 9.0292700 13.5319000 - 1050 1 2.8093700 17.6893000 11.1799000 12.3007000 - 1051 2 -1.4250900 18.6319000 10.5249000 13.2546000 - 1052 2 -1.4662200 19.3238000 8.2716500 11.9354000 - 1053 2 -1.4669600 18.6225000 11.7810000 10.9747000 - 1054 2 -1.5212900 16.6510000 10.0657000 9.5719300 - 1055 2 -1.6172000 15.3617000 0.5848450 14.6271000 - 1056 1 2.7759900 17.0275000 0.3290490 14.7155000 - 1057 2 -1.5719100 18.0573000 11.6276000 7.7928000 - 1058 2 -1.5445800 16.0033000 2.6493400 1.3899000 - 1059 1 2.7475100 25.7614000 11.7619000 13.8449000 - 1060 2 -1.5834400 21.1741000 4.1055200 0.6064320 - 1061 2 -1.5621400 25.6050000 6.9195900 5.0659300 - 1062 1 2.6473500 22.0916000 1.2400400 4.1514500 - 1063 2 -1.6308000 27.2199000 9.4524800 10.7220000 - 1064 2 -1.6435300 25.2623000 5.2601900 8.4660100 - 1065 2 -1.5982500 16.5722000 0.9657100 0.2575230 - 1066 2 -1.5325800 20.6117000 1.8726300 3.9267300 - 1067 1 2.7624600 22.4623000 11.3962000 0.6832750 - 1068 2 -1.5881400 23.1276000 10.9418000 6.1264100 - 1069 1 2.7751400 23.7529000 14.1977000 8.4779400 - 1070 1 2.7681300 21.9684000 6.0372900 2.9517800 - 1071 2 -1.5855000 20.9521000 6.2682000 4.2792800 - 1072 2 -1.5765300 21.6802000 6.7396000 1.4673300 - 1073 2 -1.6208700 22.5896000 4.3167200 2.9079200 - 1074 1 2.6987400 20.6814000 4.5436000 6.7769400 - 1075 1 2.5618600 24.8638000 1.6886800 4.1844800 - 1076 1 2.4644500 22.9342000 7.4370500 6.4414200 - 1077 2 -1.6031300 22.7945000 1.0975200 8.2998300 - 1078 2 -1.6547800 22.6885000 6.0086300 7.1348600 - 1079 2 -1.6234600 21.9228000 3.6097900 6.3493800 - 1080 2 -1.5192800 24.8355000 7.7635300 1.0969500 - 1081 2 -1.5879400 23.5004000 6.5002600 3.5823800 - 1082 1 2.7558700 21.6084000 1.2255900 9.4761300 - 1083 1 2.8540200 21.8597000 5.3805500 13.2275000 - 1084 1 2.8377400 20.3027000 7.2214800 11.1726000 - 1085 2 -1.6119400 22.4582000 1.3849000 10.9048000 - 1086 1 2.7710500 19.9670000 13.9081000 14.6445000 - 1087 2 -1.5555000 23.0795000 1.3706500 14.1688000 - 1088 2 -1.4838900 21.2296000 6.6155100 12.3582000 - 1089 2 -1.4987500 21.7819000 4.1353600 12.0294000 - 1090 2 -1.5500800 20.5370000 2.3386600 8.9553000 - 1091 1 2.7074600 23.0806000 7.7749000 10.1385000 - 1092 2 -1.4978100 23.3989000 5.6223100 13.5835000 - 1093 1 2.8083300 20.4464000 12.5861000 2.6795100 - 1094 2 -1.5545700 20.6626000 11.1047000 3.3641800 - 1095 2 -1.5237300 21.1467000 12.3922000 1.0628500 - 1096 1 2.7711900 24.2281000 9.2803900 1.8612600 - 1097 1 2.8137400 22.2522000 12.3916000 6.2774800 - 1098 2 -1.6166300 23.8647000 9.4207900 3.6232300 - 1099 2 -1.5487100 23.7175000 7.4337800 11.4890000 - 1100 2 -1.4935100 23.0914000 13.2714000 5.2032900 - 1101 2 -1.6641900 24.3742000 7.9498000 9.0751000 - 1102 2 -1.5609600 22.8204000 9.9636200 1.1358600 - 1103 2 -1.5062600 21.4324000 13.6844000 3.2435800 - 1104 1 2.8172900 22.2075000 13.6939000 12.6760000 - 1105 2 -1.4256200 21.5546000 10.0448000 11.5252000 - 1106 2 -1.4767200 21.1847000 13.2334000 13.8332000 - 1107 2 -1.5030400 23.2721000 8.6018800 14.0844000 - 1108 2 -1.5813800 20.6912000 11.7803000 5.8796300 - 1109 2 -1.5598700 22.8469000 12.5099000 11.6864000 - 1110 2 -1.5521900 21.6233000 7.6323700 9.7867100 - 1111 2 -0.6334960 20.5713000 8.3904400 13.9833000 - 1112 2 -1.5529500 21.2709000 5.1371300 14.7518000 - 1113 2 -1.5699100 23.4672000 14.6267000 13.4688000 - 1114 2 -1.5160100 24.6058000 0.5316340 12.0237000 - 1115 2 -1.6482200 24.9578000 2.6035800 2.8400200 - 1116 1 2.6854500 23.8551000 3.7716600 2.1949900 - 1117 1 2.6759900 24.5314000 5.9707000 4.6809300 - 1118 1 2.7370800 24.3987000 1.0867100 8.0457900 - 1119 1 2.6458400 23.4257000 3.1287000 6.0787300 - 1120 2 -1.6541300 24.5232000 2.4898900 7.1457400 - 1121 2 -1.6364300 24.5187000 4.5094700 5.4068100 - 1122 2 -1.5835500 23.4460000 1.9552200 4.7979100 - 1123 1 2.4570000 23.5516000 5.0735600 8.5027100 - 1124 1 2.8436800 24.5234000 1.7403200 13.1782000 - 1125 1 2.7744500 22.8694000 3.2096900 11.4577000 - 1126 2 -1.4818000 24.1808000 3.0187000 12.3142000 - 1127 2 -1.6137300 23.3368000 4.0990500 9.7597600 - 1128 2 -1.5791600 23.8418000 12.3311000 0.2159250 - 1129 2 -1.6125700 20.4848000 9.0950300 5.8393600 - 1130 2 -1.5557400 24.1571000 13.1219000 2.7107700 - 1131 2 -1.6169700 24.0552000 8.5540200 6.5018500 - 1132 1 2.8149900 23.0118000 14.0591000 3.8914200 - 1133 1 2.6286400 25.3487000 8.6411500 7.7369200 - 1134 1 2.6429100 24.1764000 10.0995000 5.1609500 - 1135 2 -1.5889700 24.8575000 12.8127000 9.1220700 - 1136 2 -1.5791500 22.4493000 13.2774000 7.7340500 - 1137 1 2.6891700 24.5318000 11.3226000 8.8143400 - 1138 1 2.8035300 24.1760000 8.4908700 12.8333000 - 1139 1 2.8237900 22.7786000 10.8602000 11.2792000 - 1140 2 -1.5912300 24.0795000 10.0054000 11.9564000 - 1141 2 -1.5637600 23.2711000 10.7651000 9.5427800 - 1142 2 -1.6571800 25.7021000 10.1834000 8.3426800 - 1143 2 -1.5551200 27.7651000 0.3753310 11.8758000 - 1144 2 -1.6448500 25.6504000 1.1570500 9.1698800 - 1145 1 2.7852100 25.2686000 6.1348700 1.0061400 - 1146 2 -1.5912300 25.3984000 10.2447000 1.1581200 - 1147 2 -1.5673200 29.0014000 4.0234000 11.1071000 - 1148 2 -1.5962100 20.2727000 5.2761800 8.1069800 - 1149 1 2.7717300 29.7767000 0.4897570 13.3879000 - 1150 2 -1.5834700 25.7069000 10.6420000 5.2709800 - 1151 1 2.6424400 24.6659000 13.4345000 1.2170500 - 1152 2 -1.5779800 25.9664000 11.8526000 12.2007000 - 1153 1 2.5898300 24.8138000 0.8276360 0.3384170 - 1154 2 -1.6156900 29.8743000 11.1761000 1.9430300 - 1155 2 -1.5656500 29.9110000 13.5010000 12.3478000 - 1156 2 -1.6067800 29.5629000 8.5908200 12.6920000 - 1157 2 -1.5786000 28.7261000 11.2166000 13.2955000 - 1158 1 2.6325300 28.9822000 12.3338000 12.2411000 - 1159 1 2.7201200 29.4004000 9.9476200 14.0025000 - 1160 2 -1.6179200 27.7299000 12.4042000 3.9207300 - 1161 2 -1.6416900 29.6880000 8.1686400 6.8898700 - 1162 2 -1.5609400 28.3850000 10.4901000 5.8350400 - 1163 1 2.7699400 27.1785000 10.6789000 4.5883300 - 1164 1 2.5893300 29.4581000 9.7410300 6.6229600 - 1165 1 2.6559500 28.7999000 13.5728000 3.5954200 - 1166 2 -1.5418200 27.4172000 11.8531000 0.5029320 - 1167 2 -1.6363900 29.5257000 14.0401000 1.5475600 - 1168 2 -1.6727600 22.1459000 1.0484700 2.3869700 - 1169 1 2.6711500 28.5310000 11.1013000 1.1783500 - 1170 2 -1.5855700 15.7714000 14.8277000 7.3379100 - 1171 1 2.5207300 26.2042000 5.6270300 9.7907100 - 1172 2 -1.6276100 29.5504000 6.3280100 9.9366500 - 1173 1 2.6872700 29.8050000 7.0757300 13.1692000 - 1174 1 2.6975800 27.7900000 3.5552700 12.0739000 - 1175 1 2.6541700 29.0323000 4.6625500 9.5501800 - 1176 2 -1.5638000 29.6783000 3.3057700 5.3678600 - 1177 2 -1.6454500 28.1105000 1.7789300 7.1373400 - 1178 2 -1.5902600 30.0519000 4.3356400 8.2954900 - 1179 1 2.6560700 28.8888000 2.0368700 5.7746900 - 1180 1 2.7148500 28.7071000 0.6789080 8.2313500 - 1181 1 2.7571200 29.6532000 4.5196300 4.3109100 - 1182 2 -1.6380400 28.4847000 0.9998070 4.5917800 - 1183 2 -1.6305400 28.2033000 11.8894000 10.7935000 - 1184 1 2.5233700 26.7198000 11.2121000 11.0125000 - 1185 2 -1.5718600 28.1231000 7.1386700 4.2974000 - 1186 2 -1.6763700 26.7723000 7.8004200 7.2882300 - 1187 1 2.0473400 28.2819000 9.0712900 9.5989400 - 1188 2 -1.5789700 27.3204000 9.4803600 3.4916300 - 1189 1 2.7795900 28.4339000 8.3645700 3.0726700 - 1190 2 -1.5813000 29.9249000 9.0444100 3.4881000 - 1191 2 -1.5095500 25.7853000 8.2914900 12.8778000 - 1192 2 -1.5438800 25.7767000 1.7988600 14.2292000 - 1193 2 -1.5038100 24.4512000 4.6014000 1.0782500 - 1194 2 -1.5938200 27.3757000 4.6853800 9.0416400 - 1195 2 -1.5644900 27.3902000 4.1642200 13.4607000 - 1196 2 -1.5901000 28.4902000 6.4086100 13.6081000 - 1197 2 -1.5350600 25.8807000 6.2526200 14.3397000 - 1198 2 -1.6437600 26.7693000 6.7198800 10.8082000 - 1199 2 -1.6114900 26.7895000 2.8798300 10.9559000 - 1200 1 2.5657400 26.7063000 8.1601400 11.7241000 - 1201 1 2.7692800 27.2977000 5.6038000 14.4379000 - 1202 1 2.7748800 26.8778000 1.4359400 10.2367000 - 1203 2 -1.5592000 28.0580000 4.2142900 3.6884700 - 1204 2 -1.5976400 27.3261000 5.2239700 6.3547600 - 1205 2 -1.5960500 28.0233000 0.5626790 9.6775100 - 1206 1 2.7258400 27.0765000 6.7757400 5.6208300 - 1207 1 2.5135600 26.7361000 4.5013800 7.5563100 - 1208 1 2.7408400 27.4155000 4.5490400 2.2970900 - 1209 2 -1.5837700 27.8154000 3.7382800 0.8897930 - 1210 2 -1.6028500 29.9901000 2.4331200 0.9437030 - 1211 1 2.6238300 29.8764000 1.0697800 1.6256100 - 1212 2 -1.5338500 15.1565000 10.6944000 0.7782400 - 1213 2 -1.5553400 20.1179000 8.7410500 0.1667200 - 1214 2 -1.6038800 29.1804000 14.6496000 4.7612300 - 1215 1 2.6369100 28.2891000 14.8354000 0.2990260 - 1216 2 -1.4509700 20.6083000 10.1121000 14.7352000 - 1217 1 2.7748500 24.2817000 14.3136000 14.8609000 - 1218 2 -1.6302500 18.1980000 0.0146118 13.2201000 - 1219 2 -1.5562900 24.8432000 14.8205000 7.4622100 - 1220 2 -1.5071900 22.9647000 10.9786000 14.8568000 - 1221 1 2.7828300 24.3343000 5.8547100 14.8305000 - 1222 1 2.7716800 27.2165000 1.2650200 14.8806000 - 1223 2 -1.6095300 16.2825000 9.4732700 23.2329000 - 1224 2 -1.5912400 18.9027000 8.7664400 24.1655000 - 1225 1 2.7104200 26.4218000 0.3940430 20.5054000 - 1226 1 2.8432300 15.8817000 1.9363600 22.1275000 - 1227 1 2.6719500 16.5272000 6.2690300 24.1162000 - 1228 1 2.7524100 16.4423000 8.2695400 21.6454000 - 1229 2 -1.4967300 17.3860000 2.3274000 22.5530000 - 1230 2 -1.6041400 20.6259000 6.6728100 24.5858000 - 1231 2 -1.5638200 16.8322000 7.1023300 22.7851000 - 1232 2 -1.6065800 16.9756000 4.5902000 23.9999000 - 1233 2 -1.5563200 15.5850000 1.3457300 20.5731000 - 1234 2 -1.5149900 17.6779000 5.3915000 20.8793000 - 1235 2 -1.5870700 17.7232000 6.8244400 25.2719000 - 1236 2 -1.5723800 23.9792000 14.6940000 25.3235000 - 1237 2 -1.4913200 18.4692000 0.9312680 27.8292000 - 1238 1 2.8371500 16.6304000 5.1313300 19.6037000 - 1239 1 2.7835600 15.7261000 7.4436500 17.7249000 - 1240 2 -1.5366500 17.7721000 1.2186300 15.6755000 - 1241 2 -1.6249000 16.1757000 12.9655000 14.9397000 - 1242 2 -1.5513500 16.5478000 6.6497500 18.8127000 - 1243 2 -1.5674000 17.5567000 4.0422300 18.7281000 - 1244 1 2.7796500 16.5655000 10.8168000 20.4630000 - 1245 2 -1.5442900 16.9827000 11.7844000 21.7302000 - 1246 2 -1.5701900 17.2193000 9.3079300 20.7882000 - 1247 2 -1.5422100 18.9741000 13.8657000 19.4755000 - 1248 1 2.5852700 17.7583000 14.5188000 24.6204000 - 1249 1 2.8139700 16.9400000 9.0179700 15.3066000 - 1250 1 2.8401700 18.1673000 12.8335000 18.4900000 - 1251 2 -1.5535500 17.1990000 10.6218000 15.7391000 - 1252 2 -1.5034500 17.2583000 13.1863000 17.1424000 - 1253 2 -1.6828800 15.9960000 14.1712000 20.5819000 - 1254 2 -1.5513000 17.3885000 11.5790000 19.2753000 - 1255 2 -1.4980500 16.7366000 8.2574200 16.7677000 - 1256 1 2.8264700 19.2621000 5.6341100 20.9424000 - 1257 1 2.7395600 17.8546000 3.2066100 23.6550000 - 1258 2 -1.5651100 18.7621000 2.5301900 24.8634000 - 1259 1 2.8438300 19.7567000 5.5079800 15.5418000 - 1260 1 2.8290600 19.3304000 3.8691000 18.3594000 - 1261 2 -1.5387500 19.9893000 4.6709900 19.6986000 - 1262 2 -1.5440400 20.0501000 2.1561100 18.5360000 - 1263 2 -1.5056200 19.5624000 4.5089400 16.9253000 - 1264 1 2.6874800 17.6976000 9.8748200 24.2821000 - 1265 1 2.6870000 18.3981000 12.0101000 22.2540000 - 1266 2 -1.6132500 18.4350000 11.2684000 23.6963000 - 1267 2 -1.5700500 19.8293000 5.1859500 22.4770000 - 1268 2 -1.6427900 19.4972000 13.1231000 21.9513000 - 1269 1 2.8417900 17.9784000 12.0461000 15.8696000 - 1270 2 -1.5230300 19.0921000 11.9587000 17.3512000 - 1271 2 -1.4996600 20.0784000 9.3926800 17.6309000 - 1272 2 -1.6321000 16.5326000 13.5884000 24.9596000 - 1273 1 2.8139100 22.1586000 9.5482600 14.9115000 - 1274 1 2.6399400 19.1966000 7.3113900 24.7867000 - 1275 1 2.7970700 23.5219000 12.4537000 28.2570000 - 1276 2 -1.5524100 22.7847000 0.0663426 19.0498000 - 1277 1 2.5910800 15.1394000 6.6267200 28.1584000 - 1278 1 2.7053500 20.8707000 7.2259100 29.5777000 - 1279 1 2.5991800 28.7191000 8.6672700 29.1961000 - 1280 1 2.7933200 25.0199000 14.1115000 26.5474000 - 1281 1 2.6628700 16.3308000 2.5580400 29.6204000 - 1282 2 -1.4614000 20.4397000 0.9105840 20.9110000 - 1283 2 -1.6068500 19.0929000 14.8691000 25.4881000 - 1284 2 -1.5548500 16.8207000 1.7615300 26.1558000 - 1285 1 2.7709400 17.8388000 5.6294600 28.9877000 - 1286 1 2.7542300 15.5333000 2.7285600 26.6661000 - 1287 2 -1.6033200 16.4903000 5.7742200 28.2122000 - 1288 2 -1.5970900 19.5808000 12.0845000 26.5063000 - 1289 2 -1.5316300 19.4987000 10.1083000 27.4731000 - 1290 1 2.6823700 16.0147000 10.8651000 26.9110000 - 1291 2 -1.5797500 17.0868000 11.5681000 28.2203000 - 1292 2 -1.4961600 24.3492000 6.6461300 28.8790000 - 1293 2 -1.5656900 19.0361000 12.5619000 29.2219000 - 1294 2 -1.6290200 17.1756000 10.1666000 25.8559000 - 1295 1 2.7489400 18.3130000 1.4051600 26.0090000 - 1296 2 -1.5059900 20.1918000 0.8021750 26.8650000 - 1297 1 2.6925800 20.1656000 13.7398000 26.3661000 - 1298 1 2.6770600 20.2468000 10.6951000 26.1206000 - 1299 1 2.7479800 18.6699000 11.2573000 28.3228000 - 1300 2 -1.5613500 18.7965000 4.1092800 28.7669000 - 1301 2 -1.5725200 19.3888000 6.1770100 29.5648000 - 1302 1 2.7758800 25.4371000 3.0829800 25.0999000 - 1303 2 -1.5437300 23.4891000 0.4296600 21.5636000 - 1304 2 -1.5769000 24.0836000 2.6456300 24.3112000 - 1305 1 2.6287700 25.1020000 8.7999900 21.2756000 - 1306 2 -1.5563400 24.6792000 13.5064000 18.4375000 - 1307 2 -1.5316100 22.0995000 4.3156100 23.8001000 - 1308 1 2.7209500 23.4589000 1.7478700 20.8571000 - 1309 1 2.7915600 24.0270000 6.3528000 22.4979000 - 1310 1 2.8475600 21.4758000 7.5334900 20.3481000 - 1311 2 -1.5485000 23.1971000 3.0141200 21.6768000 - 1312 2 -1.5343200 19.9360000 7.1471300 20.7108000 - 1313 2 -1.5809100 22.3546000 6.4351200 22.2059000 - 1314 2 -1.5401000 21.8914000 11.6503000 17.1843000 - 1315 1 2.7090700 21.2388000 5.5890200 23.3331000 - 1316 2 -1.4109900 22.6109000 1.7259000 19.6148000 - 1317 2 -1.5747200 24.7677000 4.3480700 15.5846000 - 1318 2 -1.6122100 24.5556000 7.2911000 23.8738000 - 1319 1 2.7431800 22.1231000 0.8151480 15.3651000 - 1320 1 2.8851200 20.9244000 8.0185200 17.3002000 - 1321 2 -1.5366300 22.2537000 2.0941300 16.7982000 - 1322 2 -1.5284800 20.0502000 6.9582400 16.4408000 - 1323 2 -1.4979300 21.5691000 7.4341800 18.7881000 - 1324 2 -1.5502300 24.5699000 2.5886400 17.7507000 - 1325 1 2.8178000 22.1484000 10.6429000 20.2527000 - 1326 1 2.7969500 20.3858000 14.1378000 20.3333000 - 1327 1 2.8069900 22.8741000 13.8966000 24.3940000 - 1328 2 -1.5505900 22.5045000 11.4819000 21.6949000 - 1329 1 2.5993400 28.8955000 3.0691500 29.6969000 - 1330 2 -1.5447600 23.5980000 12.3404000 23.9136000 - 1331 2 -1.6098400 23.6779000 5.4074800 19.2982000 - 1332 2 -1.5619100 20.7914000 11.0165000 19.4340000 - 1333 2 -1.7026400 15.5232000 3.0214400 28.3677000 - 1334 2 -1.5653800 22.1022000 9.0021500 20.8167000 - 1335 1 2.8237300 23.1686000 14.2648000 18.9524000 - 1336 1 2.8426200 20.4631000 10.9942000 17.7789000 - 1337 2 -1.7083800 20.4100000 14.3964000 16.2066000 - 1338 2 -1.5520200 21.7330000 13.6435000 19.5984000 - 1339 2 -1.5866600 23.6415000 10.8531000 19.5639000 - 1340 2 -1.5423200 22.1402000 8.8015500 16.4517000 - 1341 1 2.7203900 25.1227000 5.8526700 19.4861000 - 1342 1 2.7882400 23.4884000 3.6394700 23.1608000 - 1343 2 -1.6003300 24.8374000 7.1174500 21.1073000 - 1344 2 -1.5108600 24.5095000 4.9057900 22.7679000 - 1345 1 2.7164800 23.2914000 1.5239000 18.0120000 - 1346 1 2.7679200 24.8986000 7.7220300 17.1226000 - 1347 2 -1.5427600 24.0699000 6.7694500 16.1843000 - 1348 2 -1.6574900 25.5431000 1.6507100 20.5277000 - 1349 1 2.7456800 25.0839000 14.3952000 21.3361000 - 1350 1 2.7807800 24.8718000 8.8275000 24.3110000 - 1351 1 2.7434100 23.8148000 11.5741000 22.5573000 - 1352 2 -1.6369100 24.4518000 9.6666200 22.5621000 - 1353 2 -1.6265100 25.2104000 12.6448000 21.8916000 - 1354 2 -1.5212900 15.3418000 4.2524000 26.0996000 - 1355 1 2.7086800 22.0871000 3.4429000 29.3160000 - 1356 1 2.8160600 24.7356000 10.4337000 18.3945000 - 1357 1 2.8753500 23.1693000 11.8299000 16.1836000 - 1358 2 -1.5179500 24.4974000 11.0620000 16.9503000 - 1359 2 -1.5879700 24.5532000 8.8133600 18.2786000 - 1360 2 -1.4414400 23.3892000 13.3730000 15.7792000 - 1361 1 2.6260300 24.8972000 3.8440400 16.9431000 - 1362 2 -1.5366500 24.1591000 9.1450400 25.7169000 - 1363 1 2.5554000 29.6811000 13.2830000 20.4257000 - 1364 1 2.8152200 25.7439000 7.3257600 28.4940000 - 1365 2 -1.5521500 25.2346000 2.0339700 26.5050000 - 1366 2 -1.5473500 25.6680000 8.9868300 28.5891000 - 1367 2 -1.5129600 25.9418000 13.0034000 25.6162000 - 1368 2 -1.6227400 26.3256000 10.5317000 19.0910000 - 1369 2 -1.6368700 28.1289000 6.2454100 25.2679000 - 1370 2 -1.4850600 28.8331000 13.9731000 28.6613000 - 1371 1 2.5252000 30.0117000 5.9035500 28.8041000 - 1372 1 2.6333400 28.0097000 12.0875000 28.0719000 - 1373 2 -1.6668200 28.8135000 7.0750100 28.4156000 - 1374 1 2.6917400 26.8145000 5.5877900 26.2507000 - 1375 2 -1.6589700 29.1016000 9.4078800 25.8041000 - 1376 2 -1.6118700 29.6989000 4.3013400 28.5896000 - 1377 2 -1.6560300 28.7344000 1.3844500 28.5394000 - 1378 1 2.5760400 29.4575000 4.0191600 26.8847000 - 1379 2 -1.5897300 27.8757000 4.1873300 26.7465000 - 1380 2 -1.6385600 28.5239000 12.0855000 26.3559000 - 1381 1 2.6209500 29.6500000 10.9043000 25.6856000 - 1382 1 2.6352600 28.8861000 7.5755000 24.8193000 - 1383 2 -1.5086100 26.1644000 6.8574000 27.0439000 - 1384 2 -1.6415800 27.9120000 1.0270900 26.1391000 - 1385 1 2.6474800 26.3032000 0.8811020 26.5681000 - 1386 1 2.5150300 29.2070000 1.2821200 27.0435000 - 1387 2 -1.5888500 21.4475000 13.4862000 25.2919000 - 1388 1 2.7526200 27.3755000 12.9560000 25.0052000 - 1389 2 -1.5013800 26.4361000 11.4822000 28.1897000 - 1390 1 2.7697400 26.0490000 10.2816000 29.4461000 - 1391 2 -1.6099400 29.0758000 0.6108710 18.0123000 - 1392 1 2.7244700 20.9819000 1.3228600 19.6158000 - 1393 2 -1.5548000 28.6392000 12.9284000 15.5305000 - 1394 2 -1.6173300 28.1508000 14.5060000 25.0687000 - 1395 2 -1.4485400 29.9129000 11.5899000 17.7081000 - 1396 1 2.8185900 28.4819000 12.0593000 16.9454000 - 1397 2 -1.5400300 29.2674000 11.1842000 29.0440000 - 1398 2 -1.6234100 30.1519000 2.4293900 26.6376000 - 1399 2 -1.6112600 23.9160000 1.9726800 29.3954000 - 1400 2 -1.6006900 28.6366000 12.3792000 21.4201000 - 1401 1 2.5439600 27.6911000 9.0632000 22.8479000 - 1402 1 2.7774700 20.0540000 1.2878000 28.4466000 - 1403 1 2.6947400 29.2179000 11.4253000 23.0334000 - 1404 1 2.6935300 23.0083000 7.1137800 28.4706000 - 1405 2 -1.5696700 21.4602000 2.0862100 28.7141000 - 1406 2 -1.5025700 21.7035000 6.4472600 28.4908000 - 1407 2 -1.5431600 23.0278000 3.5010600 27.7064000 - 1408 2 -1.5833200 29.3198000 3.4868500 17.0796000 - 1409 2 -1.5953400 28.3637000 2.4120500 19.2630000 - 1410 2 -1.5690400 29.5419000 6.4530000 16.8406000 - 1411 1 2.7312300 28.3076000 2.2311700 17.5328000 - 1412 1 2.6267500 29.6277000 1.1046600 19.5312000 - 1413 1 2.6423500 29.1234000 6.8571800 19.8536000 - 1414 1 2.7579800 29.4035000 4.8655700 16.1463000 - 1415 2 -1.4991500 25.6490000 4.5880100 25.5369000 - 1416 2 -1.6415100 29.6047000 2.0249300 23.5174000 - 1417 1 2.7659500 23.1259000 9.8602200 26.8019000 - 1418 2 -1.5531400 23.8081000 11.1621000 27.4215000 - 1419 1 2.6914300 20.4360000 13.1654000 29.2741000 - 1420 2 -1.5718300 21.9797000 12.0726000 28.8711000 - 1421 2 -1.6502000 22.4861000 8.5803800 28.1040000 - 1422 2 -1.5961000 20.5498000 14.1401000 27.9186000 - 1423 2 -1.5289900 21.6615000 10.1980000 25.8318000 - 1424 2 -1.6307800 15.5337000 8.0335700 28.9007000 - 1425 2 -1.6237700 25.8368000 6.6400100 18.0603000 - 1426 2 -1.5980300 26.5727000 8.1801700 16.5997000 - 1427 2 -1.6527900 27.6407000 12.9618000 18.1753000 - 1428 2 -1.5056800 28.9866000 10.1414000 19.6472000 - 1429 2 -1.5585600 26.4429000 13.6904000 20.4508000 - 1430 2 -1.5271200 27.5696000 10.7202000 16.7091000 - 1431 1 2.7479800 26.2846000 13.7161000 18.6782000 - 1432 1 2.7882400 27.1329000 9.6473000 15.6751000 - 1433 2 -1.4855900 24.0027000 13.7630000 27.7123000 - 1434 2 -1.6378800 26.7070000 9.0477100 21.1635000 - 1435 2 -1.6690200 15.4670000 14.7981000 27.0414000 - 1436 2 -1.6061100 27.7469000 12.2803000 23.5064000 - 1437 1 2.6322900 26.9116000 12.4943000 21.4971000 - 1438 1 2.7144900 27.6022000 9.4993000 19.4967000 - 1439 2 -1.6159900 27.7670000 5.4831000 16.0269000 - 1440 1 2.6976200 27.6004000 4.0371200 20.2777000 - 1441 2 -1.6588400 28.9004000 0.4032970 20.9447000 - 1442 2 -1.6635800 28.6293000 5.3302300 19.7522000 - 1443 2 -1.5632200 27.0997000 1.7340400 16.6739000 - 1444 1 2.6811200 27.5354000 7.0407200 17.3027000 - 1445 2 -1.6378900 28.0480000 7.7591900 18.9442000 - 1446 2 -1.6084400 27.9986000 3.8191700 21.9749000 - 1447 2 -1.5803400 28.4130000 7.7303500 23.2962000 - 1448 2 -1.5874400 26.7430000 2.4666000 23.9913000 - 1449 1 2.6332700 28.0402000 2.8317600 23.2773000 - 1450 1 2.7336900 23.6173000 1.8963800 27.3953000 - 1451 2 -1.5382200 28.8868000 10.0252000 22.5711000 - 1452 2 -1.5289700 29.7383000 14.7949000 21.0714000 - 1453 2 -1.6207400 26.5180000 9.3826900 23.9969000 - 1454 2 -1.6021400 26.2227000 4.5396500 19.5919000 - 1455 2 -1.6160600 26.3066000 0.6876380 29.6688000 - 1456 2 -1.5545600 28.0665000 9.9948400 29.3844000 - 1457 2 -1.5082400 28.3959000 9.1233000 14.9295000 - 1458 2 -1.4961700 26.4309000 6.3335700 29.5794000 - 1459 2 -1.5316100 15.1822000 1.0873000 23.4158000 - 1460 2 -1.5189500 23.3266000 0.3257770 27.4639000 - 1461 2 -1.6952400 30.1198000 8.9417200 17.4341000 - 1462 2 -1.5964700 15.8769000 5.6356800 14.9131000 - 1463 2 -1.6038200 30.1780000 11.3765000 24.2463000 - 1464 1 2.7288300 20.0565000 25.9652000 0.6946430 - 1465 2 -1.5588000 16.7586000 25.8750000 9.8688700 - 1466 1 2.7083100 18.0679000 26.5806000 9.3274100 - 1467 2 -0.5976980 20.4323000 22.3096000 14.5702000 - 1468 2 -1.5744000 15.5621000 18.0090000 6.9219500 - 1469 2 -0.6475310 15.7117000 22.6060000 1.0777300 - 1470 2 -1.5620900 20.1902000 29.1130000 12.1703000 - 1471 2 -1.5261900 19.8045000 17.6697000 6.8887400 - 1472 2 -1.6634000 26.8323000 29.6610000 2.5212600 - 1473 1 2.8133600 17.2732000 21.7800000 10.2833000 - 1474 2 -1.6242500 18.0470000 26.3351000 6.0839200 - 1475 2 -1.5231800 16.3156000 19.0899000 4.6411300 - 1476 2 -1.5833500 16.4732000 15.5300000 0.9460870 - 1477 1 2.8055000 17.4320000 15.6052000 7.0206900 - 1478 1 2.7804800 15.9183000 17.5823000 5.3843100 - 1479 1 2.7718500 25.1352000 26.6258000 5.7920900 - 1480 1 2.8901900 30.1603000 21.8026000 2.4002400 - 1481 2 -1.5016500 17.1029000 16.5119000 5.5828400 - 1482 1 2.7640100 15.3327000 16.2093000 11.2783000 - 1483 2 -1.5566500 15.4708000 18.2373000 2.0901100 - 1484 2 -1.5208900 17.8209000 16.3039000 8.3736900 - 1485 1 2.7169200 16.7586000 23.4633000 0.8954730 - 1486 2 -1.5337300 15.3958000 20.7498000 2.6226700 - 1487 2 -1.6216100 23.0996000 27.1385000 2.6431400 - 1488 1 2.8566700 16.3774000 19.4159000 2.9491000 - 1489 1 2.8052600 17.0671000 22.4667000 7.3100400 - 1490 1 2.6923800 19.5053000 26.1221000 5.4000800 - 1491 2 -1.5148700 17.9372000 18.7903000 2.7436700 - 1492 2 -1.5868500 16.3453000 22.4105000 8.8187800 - 1493 2 -1.4892200 16.4761000 21.3399000 6.3610900 - 1494 1 2.7554400 29.6463000 25.0036000 1.5314100 - 1495 2 -1.5633100 17.6168000 23.3230000 2.4698800 - 1496 1 2.8581200 16.4190000 18.9443000 9.8603100 - 1497 1 2.8521900 16.5432000 23.6342000 12.7884000 - 1498 1 2.8158900 15.2949000 25.6228000 10.6451000 - 1499 2 -1.5871200 17.8888000 18.9388000 8.7692200 - 1500 2 -1.5996100 15.5557000 22.7519000 13.9113000 - 1501 2 -1.5277400 15.7599000 24.9618000 12.1901000 - 1502 2 -1.5107800 17.0024000 22.8894000 11.4028000 - 1503 2 -1.5420200 16.1920000 17.5563000 10.9353000 - 1504 2 -1.5734800 29.9719000 16.8136000 2.4954300 - 1505 2 -1.5709400 18.7188000 22.2388000 7.4399700 - 1506 2 -1.5582800 17.9657000 23.8384000 13.6949000 - 1507 2 -1.5321800 16.1285000 25.5911000 4.3932300 - 1508 2 -1.4469900 18.4796000 18.1734000 0.3008800 - 1509 1 2.8237900 20.0356000 15.8624000 12.2322000 - 1510 1 2.8814700 18.9922000 19.0139000 1.5551300 - 1511 2 -1.5076200 19.9479000 22.1037000 2.6595900 - 1512 2 -1.6122300 18.1888000 20.2814000 0.6296350 - 1513 1 2.7978900 18.4370000 22.1173000 3.0573400 - 1514 1 2.8270600 19.0496000 18.9559000 7.4885200 - 1515 1 2.8248300 17.3029000 20.3936000 5.4342200 - 1516 2 -1.5855100 19.8681000 24.7374000 4.6900300 - 1517 2 -1.4912600 18.5683000 19.7673000 6.1715500 - 1518 2 -1.5704300 17.6353000 20.9871000 3.8902500 - 1519 1 2.7893300 19.7937000 21.8033000 8.5929800 - 1520 2 -0.6572500 19.3641000 19.1932000 12.6074000 - 1521 2 -1.4922100 19.0173000 16.2638000 10.9892000 - 1522 2 -1.5240100 18.9154000 21.6953000 9.9000900 - 1523 1 2.8118700 18.8971000 15.7935000 9.4061000 - 1524 2 -1.5442700 17.0055000 23.8521000 6.3918400 - 1525 1 2.7819200 16.6295000 25.3516000 5.9460800 - 1526 2 -1.4743700 16.7727000 20.3422000 10.7310000 - 1527 2 -1.5687900 19.0068000 25.3909000 8.6380700 - 1528 2 -0.6246890 20.1254000 23.5725000 0.6600390 - 1529 2 -1.5882500 18.7944000 27.9072000 10.3882000 - 1530 1 2.6506700 19.0962000 29.2226000 9.2738400 - 1531 1 2.6973100 18.8421000 28.1699000 12.0444000 - 1532 2 -1.6168000 20.7369000 27.2590000 4.7648100 - 1533 1 2.8606100 18.6316000 28.3078000 1.9924700 - 1534 2 -1.5932000 19.2730000 29.1660000 6.1392400 - 1535 2 -1.5600200 16.0500000 27.5159000 13.0975000 - 1536 1 2.7524400 21.8822000 27.9543000 9.0358500 - 1537 1 2.7698200 17.2220000 26.9885000 13.9936000 - 1538 1 2.6220500 29.8726000 21.1942000 8.9297000 - 1539 2 -1.6580800 16.3208000 29.1784000 10.6626000 - 1540 2 -1.5657800 18.5554000 26.9717000 13.0266000 - 1541 2 -1.5648400 17.9165000 28.1349000 8.4076900 - 1542 1 2.6220700 16.6152000 28.6859000 7.6709600 - 1543 2 -1.6087100 15.2304000 28.1657000 4.2372900 - 1544 2 -1.5956000 15.4382000 26.8051000 2.0124800 - 1545 2 -1.5552800 17.7212000 27.5804000 3.3170300 - 1546 2 -1.5732200 20.0868000 27.4181000 1.9176800 - 1547 2 -1.5224900 17.5252000 28.5696000 0.7543700 - 1548 1 2.7140700 16.2705000 26.8883000 3.4019900 - 1549 2 -0.6501390 18.7680000 26.1858000 1.2362400 - 1550 1 2.8380300 28.5278000 20.2176000 0.0551573 - 1551 2 -1.5339300 25.2497000 23.3023000 10.7806000 - 1552 1 2.8118400 21.9880000 16.3723000 8.7424000 - 1553 1 2.8670600 20.9876000 16.7093000 5.8579300 - 1554 2 -1.3898700 20.3283000 15.4611000 5.3702800 - 1555 2 -1.5477000 20.4697000 15.7160000 8.9334300 - 1556 2 -1.5354400 22.2324000 16.6241000 7.1109400 - 1557 2 -1.5793600 23.2497000 15.5218000 9.3654000 - 1558 2 -1.5337500 24.8784000 18.5948000 0.4315710 - 1559 1 2.8084600 20.9329000 22.5777000 1.2178700 - 1560 2 -1.5135100 23.0109000 18.2870000 2.3350900 - 1561 2 -0.6330400 20.7880000 25.0717000 1.3506700 - 1562 2 -1.4788300 21.1137000 21.1308000 0.3711060 - 1563 1 2.8686900 21.5704000 17.6718000 2.8421700 - 1564 1 2.7834600 23.5383000 24.4319000 7.3227200 - 1565 1 2.7978000 21.3384000 23.7825000 5.2899900 - 1566 1 2.7237200 21.9236000 19.5164000 8.3583400 - 1567 2 -1.6113800 20.3923000 20.1126000 8.2053500 - 1568 2 -1.5764800 23.0441000 19.9026000 7.3504800 - 1569 2 -1.4000600 21.3372000 22.3801000 5.5038500 - 1570 2 -1.5021900 24.1821000 23.2713000 6.4654300 - 1571 2 -1.4924800 21.4420000 17.6563000 4.5534000 - 1572 2 -1.4335000 20.4721000 18.9074000 2.1501600 - 1573 2 -1.4954500 22.3852000 23.2166000 2.1198000 - 1574 2 -1.5776500 24.0588000 19.1457000 11.8697000 - 1575 1 2.7207900 22.7877000 23.7063000 13.1086000 - 1576 1 2.7613900 20.7515000 18.9097000 12.7960000 - 1577 1 2.7658900 20.5449000 24.8473000 8.4626600 - 1578 2 -1.5217200 21.5702000 19.8664000 11.6524000 - 1579 2 -1.5609500 20.8015000 23.2065000 8.7896700 - 1580 2 -1.6127400 21.8985000 24.9192000 13.9370000 - 1581 2 -1.5070900 22.7750000 23.8985000 11.5651000 - 1582 2 -1.6365900 15.5778000 24.8177000 0.3700820 - 1583 2 -1.6097000 22.1281000 18.1029000 9.2442000 - 1584 2 -1.5077200 23.5709000 24.0220000 8.8921600 - 1585 2 -1.5116300 20.9967000 17.2441000 12.4491000 - 1586 2 -1.5565200 21.3196000 19.0560000 14.2920000 - 1587 2 -1.5455100 24.2943000 25.8553000 6.9974500 - 1588 2 -1.6727800 21.1376000 25.0014000 6.7786000 - 1589 2 -1.6358600 22.5665000 24.7850000 4.3459500 - 1590 2 -1.6076400 21.3531000 26.4024000 9.3873500 - 1591 2 -1.5486700 24.6353000 15.0019000 1.0189200 - 1592 1 2.8295800 24.6013000 16.8024000 4.5264100 - 1593 2 -1.5439500 23.5782000 15.5832000 4.1140000 - 1594 1 2.8506400 24.0092000 19.3552000 1.6812600 - 1595 2 -1.4533000 23.4051000 20.5109000 0.7707100 - 1596 2 -1.3208000 21.2487000 16.4031000 1.9917000 - 1597 1 2.8199900 23.6392000 23.6509000 3.0696600 - 1598 1 2.8113900 24.3077000 19.3015000 6.3386600 - 1599 1 2.8604300 25.2034000 22.3927000 5.3121200 - 1600 2 -1.5338100 24.9272000 24.5615000 2.5922200 - 1601 2 -1.5177200 25.1198000 20.6633000 5.9154100 - 1602 2 -1.4842100 24.0469000 18.2171000 5.0500300 - 1603 2 -1.5155000 24.2905000 22.4982000 3.9791500 - 1604 1 2.8243500 23.6869000 23.1580000 10.2749000 - 1605 1 2.7618800 22.9405000 20.6393000 11.6910000 - 1606 2 -1.5715800 23.2341000 21.5077000 10.3134000 - 1607 2 -1.5925800 23.1617000 21.9365000 13.0257000 - 1608 2 -1.5252100 25.8477000 16.3845000 5.5711900 - 1609 2 -1.5733800 25.1136000 25.6901000 12.3725000 - 1610 2 -1.5089600 25.4109000 25.6685000 4.6407200 - 1611 1 2.6712500 22.3756000 26.5905000 4.1363200 - 1612 2 -1.6170800 28.3005000 28.8315000 7.7523800 - 1613 2 -1.5264900 29.3965000 28.4964000 12.5728000 - 1614 1 2.7870700 28.0877000 28.6461000 11.5743000 - 1615 1 2.7353200 29.6573000 26.9479000 13.4724000 - 1616 2 -1.6083000 28.5657000 27.4234000 9.8155900 - 1617 1 2.6822400 29.3337000 27.8313000 8.4865200 - 1618 2 -1.5695400 23.2887000 28.5107000 10.0626000 - 1619 2 -1.5100000 25.7179000 27.6471000 14.2938000 - 1620 2 -1.5602000 26.3030000 27.6683000 6.1603300 - 1621 2 -1.5130400 28.0974000 26.7255000 14.1509000 - 1622 2 -1.6591600 27.7603000 29.4103000 14.6250000 - 1623 2 -1.6013700 26.7972000 27.6069000 11.4972000 - 1624 1 2.7803500 25.2595000 27.2786000 12.6929000 - 1625 1 2.6904100 26.3626000 28.3047000 7.5747200 - 1626 1 2.7251600 27.0814000 27.9988000 1.9478100 - 1627 2 -1.6075300 27.8702000 27.9940000 3.5315700 - 1628 1 2.7118900 28.7816000 26.6038000 3.9552900 - 1629 2 -1.6122900 29.6340000 26.4151000 2.4786600 - 1630 1 2.7984200 27.2741000 26.2917000 9.6312100 - 1631 1 2.7687000 29.9619000 17.1400000 10.7576000 - 1632 2 -1.5561800 26.2307000 27.2065000 8.6913000 - 1633 2 -1.6245800 24.6986000 29.3728000 7.1752600 - 1634 2 -1.5586800 29.3503000 22.4762000 12.6187000 - 1635 2 -1.5521800 25.3957000 19.7222000 2.6712200 - 1636 2 -1.5701700 29.6992000 15.5304000 10.5347000 - 1637 2 -1.5749600 25.3416000 18.3294000 7.3070000 - 1638 2 -1.6274900 15.9993000 14.9251000 12.2303000 - 1639 2 -1.5958200 28.0398000 25.1045000 8.0875100 - 1640 2 -1.4649700 28.9016000 19.1028000 1.1492700 - 1641 1 2.5007100 24.2937000 17.7528000 11.3529000 - 1642 1 2.8109400 28.3514000 23.5478000 4.3460100 - 1643 2 -1.5824800 28.7583000 20.9195000 10.0819000 - 1644 1 2.6580700 27.1825000 20.6250000 10.6534000 - 1645 2 -1.5668800 25.8239000 27.0126000 2.2463200 - 1646 2 -1.5660700 29.6490000 19.5719000 5.9129300 - 1647 1 2.7731000 28.4800000 20.3533000 4.6955400 - 1648 1 2.7285400 29.1871000 18.5082000 7.1385200 - 1649 2 -1.6555900 21.9274000 29.5755000 5.1211500 - 1650 1 2.7786200 28.8398000 17.5516000 1.4260900 - 1651 2 -1.5890700 29.4134000 16.9974000 6.7295700 - 1652 1 2.7430500 29.0120000 15.3968000 6.6627100 - 1653 2 -1.5884500 29.3475000 22.4789000 8.0594800 - 1654 2 -1.5392600 27.1163000 25.0641000 10.6714000 - 1655 2 -1.6005800 27.6230000 25.2799000 3.7884000 - 1656 1 2.6910900 27.3272000 29.7016000 4.1619500 - 1657 2 -1.5760200 27.0664000 21.1838000 12.1620000 - 1658 2 -1.6008000 29.8748000 26.8318000 5.1790000 - 1659 2 -1.5980300 28.3081000 17.6129000 10.5151000 - 1660 2 -1.6107200 25.5896000 16.8367000 11.2609000 - 1661 2 -0.6492430 27.9023000 20.9765000 5.9142500 - 1662 2 -1.5516400 26.7880000 23.6581000 13.0201000 - 1663 2 -1.5448700 28.8263000 18.2363000 14.2747000 - 1664 1 2.7771100 26.0554000 24.4464000 11.7194000 - 1665 1 2.6609600 27.7956000 22.5400000 12.8351000 - 1666 1 2.7375200 26.4263000 18.8167000 8.3879300 - 1667 2 -1.4838800 29.0309000 23.7449000 2.4109100 - 1668 2 -1.4255900 28.3931000 21.8900000 3.8179400 - 1669 2 -1.5515800 27.9339000 19.0820000 7.8957200 - 1670 2 -1.5392900 29.0728000 24.1013000 5.7296200 - 1671 2 -1.5718800 27.5511000 19.0338000 4.2324200 - 1672 1 2.7705900 26.0856000 25.4214000 3.2322700 - 1673 1 2.8375400 29.2187000 24.2054000 7.3772600 - 1674 1 2.7796000 26.5288000 18.5928000 3.0614800 - 1675 2 -1.5994000 27.1953000 17.5072000 1.9735600 - 1676 2 -1.5970000 27.7169000 27.9845000 0.5947180 - 1677 1 2.6094300 26.9383000 16.7874000 10.2475000 - 1678 1 2.7287200 25.7676000 16.0142000 1.7372700 - 1679 2 -1.5826400 27.5215000 15.1793000 7.3461300 - 1680 2 -1.5398900 26.4346000 17.0972000 8.7950300 - 1681 1 2.7778100 25.9658000 15.9468000 7.1811700 - 1682 2 -1.6240500 26.1716000 19.7754000 9.7095800 - 1683 2 -1.5811900 29.9708000 25.7977000 12.2254000 - 1684 2 -1.4603000 26.5707000 23.1201000 5.2441500 - 1685 2 -1.5178700 29.3425000 21.6057000 0.8175430 - 1686 2 -1.5848400 25.4619000 16.9646000 3.0748000 - 1687 1 2.7659000 23.5091000 29.3379000 11.4032000 - 1688 2 -1.5623500 23.6608000 27.4940000 5.2119100 - 1689 1 2.6644300 23.2792000 28.6676000 6.2398600 - 1690 2 -1.6818400 23.8058000 29.2880000 0.6326190 - 1691 2 -1.5303300 30.1231000 20.4179000 3.3202100 - 1692 1 2.7343900 24.3916000 27.3755000 1.5324600 - 1693 2 -1.5134500 23.9308000 28.1103000 12.4986000 - 1694 1 2.6373500 20.3508000 28.7861000 5.1436000 - 1695 2 -1.5643300 22.2699000 28.0108000 7.4372700 - 1696 2 -1.6191100 20.7812000 29.3594000 9.2062900 - 1697 2 -1.5438400 28.4860000 24.9218000 0.1441480 - 1698 2 -1.5950200 15.3144000 25.9521000 7.0561500 - 1699 1 2.6588900 17.5102000 16.7816000 0.1345940 - 1700 2 -1.4290900 24.4646000 27.3008000 0.0127936 - 1701 2 -1.5355400 29.5412000 29.5330000 0.5814070 - 1702 1 2.7351900 22.0308000 29.6567000 1.0469600 - 1703 2 -1.4592600 28.4193000 14.9715000 13.7506000 - 1704 2 -1.6024100 19.1656000 14.9492000 13.4588000 - 1705 2 -1.5631000 15.1187000 19.2133000 8.9756200 - 1706 2 -1.5901300 23.9316000 23.7575000 14.8738000 - 1707 2 -1.4221100 25.3473000 23.2329000 0.0271609 - 1708 1 2.7234100 24.4494000 26.0610000 18.9594000 - 1709 1 2.7437800 23.0430000 26.8255000 21.7989000 - 1710 2 -1.5506700 17.6299000 23.3324000 29.4037000 - 1711 2 -1.6198100 21.9868000 27.1098000 15.9963000 - 1712 2 -1.5494500 22.7694000 15.2742000 17.7913000 - 1713 1 2.7225700 26.5886000 22.5327000 29.6399000 - 1714 1 2.7937500 19.3379000 26.6224000 19.0017000 - 1715 2 -1.5901900 18.2998000 17.4973000 25.3077000 - 1716 2 -1.5801700 25.3121000 28.9050000 20.4226000 - 1717 1 2.6387400 15.6527000 16.4066000 23.3154000 - 1718 1 2.8325100 17.3000000 16.9492000 18.8887000 - 1719 2 -1.6259200 16.9073000 15.3715000 23.0945000 - 1720 2 -1.4665500 17.2438000 15.8157000 17.6676000 - 1721 1 2.6779200 16.9298000 15.2541000 21.4344000 - 1722 2 -1.5536900 17.0281000 25.7796000 14.9671000 - 1723 1 2.7916000 16.4646000 24.7876000 22.6119000 - 1724 2 -1.4815600 19.5153000 22.2425000 22.2230000 - 1725 2 -1.5293500 16.5240000 24.2795000 24.4044000 - 1726 2 -1.5134600 17.4602000 16.3924000 20.5674000 - 1727 2 -1.5486400 16.0136000 17.9227000 23.2845000 - 1728 2 -1.4574900 15.7182000 17.4461000 18.9642000 - 1729 2 -1.5073900 22.9366000 29.6366000 16.5399000 - 1730 2 -1.4764300 18.9113000 23.7048000 19.8628000 - 1731 2 -1.5398700 17.7205000 21.6859000 24.3608000 - 1732 2 -1.3640600 19.2002000 17.8245000 15.2444000 - 1733 1 2.8051800 17.6741000 24.0280000 18.3757000 - 1734 1 2.7679000 15.8773000 25.3911000 16.1427000 - 1735 2 -0.6431340 17.8116000 22.5968000 17.9743000 - 1736 2 -1.4254200 16.3252000 24.3094000 18.9730000 - 1737 2 -1.4749800 18.4568000 18.0666000 18.5543000 - 1738 2 -1.5172100 17.1496000 24.3064000 16.4640000 - 1739 2 -1.4959900 17.3832000 23.6580000 22.0464000 - 1740 1 2.7105300 16.7731000 22.8206000 24.9102000 - 1741 2 -1.6089000 15.6401000 26.7563000 17.0355000 - 1742 1 2.7407200 15.1384000 21.7936000 27.9472000 - 1743 2 -1.4888100 16.9950000 26.2185000 22.3266000 - 1744 2 -1.6423400 29.6347000 15.3556000 16.1389000 - 1745 1 2.8502300 18.9755000 23.6286000 21.4231000 - 1746 2 -1.5645500 19.8702000 24.9908000 22.0878000 - 1747 1 2.8190500 19.4502000 21.9725000 23.8715000 - 1748 2 -1.5664300 26.3636000 14.9023000 27.1220000 - 1749 1 2.8357300 20.0736000 17.9806000 18.4157000 - 1750 2 -1.5556200 19.6549000 25.4192000 15.5288000 - 1751 2 -1.5491800 21.9293000 28.8384000 29.4296000 - 1752 2 -0.6023630 19.7859000 22.6031000 15.7315000 - 1753 2 -1.4687600 18.5805000 25.5660000 18.2086000 - 1754 1 2.7535300 19.7160000 16.6493000 25.3098000 - 1755 2 -1.2615000 19.7500000 23.2534000 24.4643000 - 1756 2 -1.5905200 17.5246000 26.3335000 25.3894000 - 1757 1 2.7817700 16.0400000 25.1622000 25.5963000 - 1758 2 -1.4872500 15.1975000 19.9753000 19.4442000 - 1759 2 -1.5394900 16.0305000 24.9366000 27.1917000 - 1760 1 2.7807300 15.8105000 15.9487000 28.2658000 - 1761 2 -1.5105400 17.7628000 15.6896000 28.9249000 - 1762 2 -1.6178200 15.4524000 22.6604000 25.6839000 - 1763 1 2.7466800 17.3689000 18.1454000 26.5362000 - 1764 1 2.7498000 15.2003000 18.8629000 24.5856000 - 1765 2 -1.5500000 16.0788000 20.7345000 28.7343000 - 1766 2 -1.5497000 16.7881000 17.0675000 27.4830000 - 1767 2 -1.5776600 16.1766000 19.0406000 25.8122000 - 1768 2 -1.4598900 19.5701000 21.4844000 26.9576000 - 1769 1 2.7211000 19.8987000 20.1623000 27.4293000 - 1770 1 2.7550200 17.3983000 19.6643000 29.1111000 - 1771 2 -1.5742100 18.3281000 19.4133000 27.6999000 - 1772 1 2.6716000 15.7127000 28.6770000 26.2989000 - 1773 2 -1.4353300 16.4432000 18.1206000 29.4736000 - 1774 1 2.7969000 19.7305000 28.7349000 27.1244000 - 1775 2 -1.6389600 16.2032000 28.7356000 27.8287000 - 1776 2 -1.5654700 18.6955000 29.1025000 25.8488000 - 1777 2 -1.4988500 16.6269000 28.5134000 24.9280000 - 1778 2 -1.5381700 18.5814000 27.1906000 20.2243000 - 1779 2 -1.5624300 19.3356000 28.0850000 17.6411000 - 1780 1 2.6259200 18.5201000 28.0917000 16.4433000 - 1781 2 -1.2874600 16.9394000 28.7880000 21.5721000 - 1782 1 2.8079400 18.0921000 27.8717000 24.7131000 - 1783 2 -1.5730000 17.5445000 28.2762000 15.2978000 - 1784 2 -1.5810500 15.7945000 27.0594000 19.9228000 - 1785 1 2.8701900 17.0171000 27.3993000 21.0370000 - 1786 2 -1.5134100 19.3068000 27.5237000 23.6543000 - 1787 2 -1.5911400 22.0655000 26.2337000 22.9608000 - 1788 1 2.7382700 22.2929000 21.2797000 24.6216000 - 1789 2 -1.5693200 25.1567000 23.6442000 24.6059000 - 1790 2 -1.5690500 23.2076000 25.7750000 20.2207000 - 1791 1 2.7167200 25.5873000 16.5321000 23.5169000 - 1792 1 2.7856100 20.2835000 26.0463000 23.4478000 - 1793 2 -0.6276730 20.3460000 25.5230000 24.7059000 - 1794 2 -1.6318100 24.5195000 24.1965000 22.2431000 - 1795 2 -1.5852300 22.7286000 22.7202000 23.7850000 - 1796 1 2.8141500 21.4463000 16.1273000 22.4853000 - 1797 2 -1.5624900 20.5914000 15.5168000 21.2068000 - 1798 2 -1.6188200 23.6055000 21.5423000 16.6485000 - 1799 1 2.7949600 21.3636000 15.6706000 17.0158000 - 1800 2 -1.5424500 21.5802000 16.7514000 15.7691000 - 1801 1 2.7758200 22.1891000 18.2541000 20.5220000 - 1802 1 2.6685100 23.8440000 23.8033000 23.6226000 - 1803 2 -1.5783400 23.0005000 19.8176000 20.8410000 - 1804 2 -1.5447300 20.7617000 20.8122000 24.3625000 - 1805 2 -1.5952500 20.3317000 16.4804000 23.7357000 - 1806 2 -1.6238000 24.6338000 24.3342000 18.4077000 - 1807 2 -1.5149700 22.1901000 17.4942000 21.9474000 - 1808 2 -1.5225100 20.7795000 18.4989000 19.8599000 - 1809 2 -1.5522800 24.5781000 21.6111000 19.1943000 - 1810 1 2.8132400 20.6589000 18.1554000 15.4946000 - 1811 1 2.7220100 21.7864000 24.9429000 19.7185000 - 1812 2 -1.5167500 21.9169000 23.4803000 19.7124000 - 1813 2 -1.5481500 23.3702000 17.5667000 19.4464000 - 1814 2 -1.5106100 20.7464000 18.7764000 17.1385000 - 1815 2 -1.5119000 20.4717000 16.3960000 18.1852000 - 1816 2 -1.4915600 19.3421000 29.2751000 28.7286000 - 1817 1 2.7559400 21.2474000 25.3530000 15.4344000 - 1818 2 -1.6025000 25.9150000 15.3369000 22.4896000 - 1819 2 -1.5838400 25.1448000 15.6362000 15.5842000 - 1820 2 -1.5957800 20.9449000 26.1669000 19.1010000 - 1821 1 2.6477300 23.7926000 20.3993000 22.0795000 - 1822 2 -1.5811300 23.3987000 20.1221000 23.6340000 - 1823 2 -1.5857500 24.6742000 17.7720000 23.3579000 - 1824 2 -1.6199100 25.2325000 21.2791000 22.0245000 - 1825 2 -1.5874800 22.1431000 24.2504000 16.5013000 - 1826 1 2.6156600 23.0281000 22.9918000 16.0634000 - 1827 1 2.6346300 24.8035000 17.9335000 19.0367000 - 1828 1 2.5761000 24.0479000 20.6541000 18.0195000 - 1829 1 2.5965800 24.9644000 23.1437000 19.4245000 - 1830 2 -1.6110800 24.8054000 19.1890000 17.9618000 - 1831 1 2.7343200 24.1221000 18.7209000 24.5461000 - 1832 2 -1.5085300 25.9220000 26.3829000 27.1568000 - 1833 1 2.5926000 29.2234000 27.6324000 25.0770000 - 1834 2 -1.6054400 25.8262000 29.1517000 26.7751000 - 1835 2 -1.5548500 27.8464000 28.3431000 27.9036000 - 1836 1 2.7780300 26.7386000 27.7197000 26.9393000 - 1837 2 -1.5743600 27.6927000 27.7104000 25.2983000 - 1838 2 -1.4248100 21.9084000 24.8658000 27.0244000 - 1839 1 2.6739800 26.4925000 27.0682000 22.5948000 - 1840 2 -1.6028000 29.6489000 27.6886000 18.3826000 - 1841 1 2.7186300 28.4348000 28.7510000 17.7921000 - 1842 1 2.4066300 29.2464000 29.0151000 22.1333000 - 1843 2 -1.5512000 27.3190000 28.7672000 19.2261000 - 1844 2 -1.6171000 27.5456000 27.9576000 16.6699000 - 1845 2 -1.6067700 29.7769000 28.6816000 23.7754000 - 1846 2 -1.5689100 25.7610000 26.4068000 19.7140000 - 1847 2 -1.6624800 27.4182000 28.2962000 21.6930000 - 1848 1 2.7515400 27.0542000 27.3290000 20.0539000 - 1849 1 2.8004500 27.2379000 19.5612000 25.0325000 - 1850 1 2.6249400 27.8635000 29.2682000 29.3643000 - 1851 2 -1.5919900 25.6320000 19.0417000 25.2433000 - 1852 2 -1.5859900 29.5679000 19.8755000 18.9568000 - 1853 2 -1.6043400 16.5987000 15.3176000 15.0397000 - 1854 2 -1.4821900 28.0393000 24.9199000 27.0056000 - 1855 1 2.8465800 29.3744000 24.7208000 28.5189000 - 1856 1 2.6909900 29.9601000 18.3529000 19.2801000 - 1857 2 -1.5021800 22.5962000 28.0105000 20.9372000 - 1858 2 -1.5808400 28.2129000 16.7190000 26.8622000 - 1859 2 -1.4196900 27.5036000 18.9696000 28.7483000 - 1860 1 2.7480200 18.2979000 24.4462000 15.1534000 - 1861 2 -1.4810900 26.8127000 23.0379000 28.1001000 - 1862 2 -1.4519000 28.2648000 19.7489000 26.0691000 - 1863 1 2.8001500 25.7121000 24.9648000 27.9116000 - 1864 1 2.7504600 25.6185000 19.1452000 28.9080000 - 1865 1 2.7793800 28.4993000 24.6928000 25.6137000 - 1866 1 2.7968700 27.2009000 15.7797000 26.0384000 - 1867 2 -1.5614500 25.8659000 21.4923000 26.0493000 - 1868 1 2.7631000 27.7484000 17.5548000 28.1275000 - 1869 2 -1.4491500 29.7402000 20.5775000 28.6620000 - 1870 2 -1.5016100 25.9835000 17.7502000 28.1171000 - 1871 1 2.7337600 26.4017000 22.6610000 25.0665000 - 1872 2 -1.5166300 27.6861000 23.6142000 24.9010000 - 1873 2 -1.6029400 28.3676000 26.4757000 20.1857000 - 1874 1 2.7291100 29.6409000 26.4883000 19.3501000 - 1875 2 -1.5057400 24.2593000 24.2725000 27.5786000 - 1876 2 -1.4206700 19.8879000 26.2710000 28.9586000 - 1877 2 -1.6109600 26.9447000 25.4676000 22.5098000 - 1878 2 -1.6122400 23.9391000 27.1929000 17.8048000 - 1879 1 2.7447700 29.0969000 20.9056000 17.7346000 - 1880 2 -1.6115100 29.7328000 16.3178000 23.5258000 - 1881 1 2.4935300 24.9117000 24.8505000 15.2773000 - 1882 1 2.7704900 29.6673000 18.0631000 23.8988000 - 1883 1 2.7330500 17.4155000 29.4070000 29.1357000 - 1884 2 -1.6391300 24.8313000 27.1092000 22.6739000 - 1885 2 -1.5760500 28.6732000 23.5912000 15.5962000 - 1886 2 -1.5559800 27.1448000 17.4169000 16.4002000 - 1887 2 -1.6372300 27.6903000 21.8066000 18.3555000 - 1888 2 -1.5999800 27.8711000 24.3828000 18.0780000 - 1889 2 -1.5639700 28.7344000 17.8019000 20.3921000 - 1890 2 -1.5891800 26.3019000 23.4910000 20.2644000 - 1891 2 -1.5890900 28.5883000 19.9284000 16.3751000 - 1892 1 2.6614000 27.7114000 24.5173000 16.4616000 - 1893 1 2.6956400 27.7767000 23.0860000 19.3046000 - 1894 1 2.7259400 28.3368000 18.3813000 15.7647000 - 1895 2 -1.5939600 28.7605000 22.9766000 20.6896000 - 1896 2 -0.6393120 26.0485000 24.9582000 29.2617000 - 1897 2 -1.5848600 26.9833000 21.1376000 23.9467000 - 1898 2 -1.5885200 28.0747000 18.4875000 23.8507000 - 1899 2 -1.6412400 27.4808000 20.0296000 21.4115000 - 1900 1 2.4565900 26.1425000 24.1935000 21.7553000 - 1901 1 2.6066100 27.4172000 18.5455000 20.7908000 - 1902 2 -1.5962200 26.4796000 15.3269000 18.0171000 - 1903 2 -1.5749300 22.9872000 18.3367000 25.6630000 - 1904 1 2.7881600 21.9945000 17.9103000 27.0993000 - 1905 1 2.7390500 23.4668000 29.1575000 20.2769000 - 1906 2 -1.5932100 21.3566000 19.5932000 27.7491000 - 1907 1 2.7409200 27.2493000 27.8669000 14.9528000 - 1908 2 -1.5833100 22.4028000 22.6256000 28.9966000 - 1909 2 -1.3541000 22.6735000 17.2538000 28.1980000 - 1910 2 -1.5861100 20.6189000 17.1928000 26.4818000 - 1911 2 -1.5785400 23.1385000 21.5391000 26.0893000 - 1912 2 -1.5366100 26.3136000 16.3401000 24.8692000 - 1913 2 -1.5800000 29.4367000 25.8624000 24.6939000 - 1914 2 -1.4426700 22.0914000 25.5118000 28.9885000 - 1915 2 -1.5934600 26.1973000 25.0337000 16.0314000 - 1916 1 2.5791100 26.7665000 20.9603000 22.4308000 - 1917 2 -1.6332100 25.9734000 17.9660000 20.2702000 - 1918 1 2.6982600 26.3502000 15.9115000 16.5495000 - 1919 1 2.8317600 22.7861000 24.1025000 28.2105000 - 1920 1 2.7515700 23.2378000 28.5598000 28.4939000 - 1921 1 2.8550200 21.4710000 26.3401000 27.6197000 - 1922 2 -1.4521200 22.8784000 27.4462000 27.4599000 - 1923 2 -1.5408200 20.4716000 27.4224000 26.8188000 - 1924 1 2.7135700 24.5394000 21.3385000 26.9000000 - 1925 1 2.7784800 22.5958000 20.8765000 29.1314000 - 1926 2 -1.6258500 24.2723000 20.4589000 28.1661000 - 1927 1 2.7014300 22.6538000 28.1185000 17.1514000 - 1928 2 -1.5193500 29.9313000 23.2837000 28.0370000 - 1929 2 -1.6286000 30.1017000 23.7147000 22.8844000 - 1930 2 -1.5297100 30.1131000 26.0786000 27.7798000 - 1931 2 -1.6834200 30.1146000 17.3313000 18.0018000 - 1932 2 -1.5867300 22.5791000 14.9189000 23.1016000 - 1933 2 -1.5983200 26.8673000 20.8701000 29.7422000 - 1934 1 2.7865500 16.3230000 14.8887000 16.6060000 - 1935 1 2.7080200 29.7673000 14.8924000 24.8043000 - 1936 2 -1.6319200 28.4285000 16.5193000 29.7385000 - 1937 2 -1.5231200 23.9733000 14.8914000 20.4311000 - 1938 1 2.6090400 37.9965000 3.8393000 4.9080200 - 1939 2 -1.6389400 36.0954000 7.1795400 12.7777000 - 1940 2 -1.6428800 33.2335000 14.5415000 7.6825200 - 1941 2 -1.6264600 38.7765000 6.9239700 4.3574800 - 1942 2 -1.6510700 38.0821000 1.1906800 2.6537800 - 1943 2 -1.6703000 36.9293000 7.9142900 9.1975500 - 1944 1 2.5859900 34.5306000 2.4366300 12.8029000 - 1945 3 0.3114410 40.7420000 14.6228000 10.5978000 - 1946 2 -1.7088500 34.5258000 12.8462000 9.9588300 - 1947 1 2.6664400 32.4384000 9.0103600 11.7044000 - 1948 3 0.2513860 40.7052000 14.7368000 7.8220500 - 1949 2 -1.6375500 33.1006000 11.5976000 7.8204200 - 1950 2 -1.6094000 33.9608000 12.2287000 5.3365900 - 1951 1 2.7940800 32.6164000 13.2285000 4.4538600 - 1952 2 -1.5720300 34.9531000 13.8082000 2.1548300 - 1953 1 2.6966700 36.7235000 14.7692000 7.1664500 - 1954 2 -1.6146000 32.6519000 4.6132600 9.3082900 - 1955 2 -1.5905200 33.5509000 7.0203700 11.7173000 - 1956 2 -1.6163200 33.1199000 1.6599700 12.9482000 - 1957 1 2.7588900 31.6741000 2.3934100 11.9719000 - 1958 1 2.5623900 34.5868000 6.5810000 12.7268000 - 1959 2 -1.6420900 34.2216000 4.7171600 5.0699000 - 1960 2 -1.6390200 34.8959000 3.3204300 8.9127900 - 1961 2 -1.6219900 34.1347000 1.9099700 5.7635400 - 1962 2 -1.6897200 33.4810000 7.2137700 3.3776700 - 1963 1 2.2768000 31.8465000 10.8196000 8.4102000 - 1964 1 2.6813800 32.9222000 2.9578000 5.1404500 - 1965 1 2.6547300 34.2155000 0.9141610 6.9682800 - 1966 1 2.6865700 33.5051000 3.4450000 10.0730000 - 1967 1 2.5483800 34.1432000 5.7950700 3.7067800 - 1968 1 2.7080000 34.1851000 3.7681600 0.8977110 - 1969 2 -1.6322900 30.9109000 10.2518000 14.5707000 - 1970 2 -1.6437200 30.3387000 10.6098000 7.9784200 - 1971 2 -1.5868500 31.4154000 10.5966000 11.4214000 - 1972 2 -1.6036400 33.4781000 12.6725000 12.7910000 - 1973 2 -1.5062500 32.9660000 9.0908900 13.3040000 - 1974 2 -1.5207600 31.2023000 13.8337000 14.6290000 - 1975 2 -1.6196100 31.3330000 8.3666300 10.2494000 - 1976 1 2.8071900 32.6820000 14.1148000 14.0633000 - 1977 3 -0.0429721 44.2622000 14.8590000 13.1849000 - 1978 1 2.3410500 31.6837000 11.7661000 10.5079000 - 1979 2 -1.4978600 32.2526000 10.1889000 3.5570200 - 1980 2 -1.6571100 31.9872000 8.4788100 5.4587100 - 1981 2 -1.5915200 31.6736000 13.1550000 5.7834700 - 1982 2 -1.6329500 33.8463000 9.5988800 10.6402000 - 1983 2 -1.6420900 31.3378000 13.2480000 10.1992000 - 1984 2 -1.5834400 31.9049000 12.9142000 2.8570400 - 1985 1 2.6727800 31.7280000 14.1748000 6.9681300 - 1986 1 2.6988300 32.9915000 8.9996200 4.1840600 - 1987 2 -1.4812700 32.4777000 13.1039000 0.5060130 - 1988 3 0.2557590 40.8472000 14.6342000 5.4181100 - 1989 2 -1.5802800 34.5217000 9.4141800 4.4896800 - 1990 1 2.7492000 30.9860000 9.9208900 2.7593900 - 1991 1 2.6023300 31.4499000 13.8576000 1.1735600 - 1992 2 -1.6165100 33.1676000 4.5909500 14.5497000 - 1993 2 -1.5741700 30.3434000 14.7165000 7.4653500 - 1994 2 -1.5483100 31.6252000 3.9295900 12.4375000 - 1995 2 -1.5760700 31.1635000 6.3686500 13.0928000 - 1996 2 -1.3891200 35.8251000 14.7569000 8.5018600 - 1997 2 -1.6117100 32.3343000 2.2312400 10.4191000 - 1998 1 2.8066300 31.6801000 4.8324900 13.8038000 - 1999 1 2.7491400 31.8627000 0.8764730 9.2976600 - 2000 2 -1.9382200 33.4187000 4.9258800 2.0586300 - 2001 1 2.4772800 36.1388000 0.8574980 0.2884200 - 2002 2 -1.6249200 32.3044000 3.6036300 6.5693800 - 2003 2 -1.6139200 31.7767000 6.3326100 7.2350000 - 2004 2 -1.6347000 33.1128000 0.9263920 8.1760700 - 2005 2 -1.6422100 30.5877000 5.9690700 4.8775200 - 2006 2 -1.6009200 32.1364000 2.3590200 3.8971000 - 2007 1 2.7262500 30.8742000 7.1476400 5.9948100 - 2008 1 2.7386100 31.6157000 4.6581600 7.7357900 - 2009 1 2.7274400 31.8479000 0.6875680 3.8345900 - 2010 1 2.6591700 34.2275000 0.4923590 2.0893700 - 2011 2 -1.9265700 31.2460000 6.1715400 0.5489690 - 2012 2 -1.5664800 30.5182000 4.4989700 2.7780500 - 2013 2 -1.9276000 33.3882000 2.1301600 0.6932290 - 2014 1 2.7055400 31.5849000 5.1266300 1.9432900 - 2015 2 -1.6527300 37.0429000 0.0661035 5.4231200 - 2016 1 2.7413500 34.2404000 14.4707000 9.0759900 - 2017 1 2.5145300 30.9128000 6.9688100 10.1030000 - 2018 2 -1.6024500 31.0174000 0.2296730 2.1852400 - 2019 2 -1.7187300 31.7446000 9.0216500 1.3988400 - 2020 2 -1.6248500 34.5159000 3.5261500 11.5169000 - 2021 2 -1.6139300 38.7692000 13.2485000 9.4673800 - 2022 2 -1.6137100 39.1081000 11.6508000 14.1355000 - 2023 1 1.9878000 36.6577000 9.4963900 9.4788500 - 2024 1 2.7570000 37.7422000 11.4033000 13.0864000 - 2025 2 -1.6549600 38.5643000 6.3629200 7.3532600 - 2026 1 2.1975500 36.2368000 11.8587000 7.6018000 - 2027 2 -1.6019300 39.3004000 8.7010500 6.2312000 - 2028 2 -1.5993900 38.6731000 11.3826000 5.8257700 - 2029 1 2.7171000 37.7660000 12.7143000 5.1302900 - 2030 1 2.4018000 37.1988000 6.6388000 8.1422900 - 2031 1 2.4143700 38.8480000 7.1659700 5.9393900 - 2032 2 -1.6681000 38.1586000 9.0705100 1.1556400 - 2033 1 2.6019500 38.9820000 10.2213000 1.9743500 - 2034 3 -0.0404006 44.4148000 14.8634000 8.1378900 - 2035 2 -1.6666300 39.6508000 3.8072900 4.9194600 - 2036 2 -1.6342300 38.3146000 0.8179480 7.4191600 - 2037 1 2.5079000 35.3150000 4.7142800 6.2506700 - 2038 1 2.6001800 37.4105000 1.8063200 6.4232500 - 2039 1 1.6198000 39.3963000 3.8276200 1.8299700 - 2040 1 2.3226900 35.2564000 9.8663100 11.2234000 - 2041 2 -1.5628300 37.1627000 9.8244000 13.5978000 - 2042 1 2.7477200 37.3294000 8.1941400 14.1156000 - 2043 2 -1.6560200 36.9226000 11.0829000 8.9395600 - 2044 2 -1.5544500 36.8264000 12.9319000 12.8355000 - 2045 2 -1.5799000 35.2073000 14.4364000 12.1280000 - 2046 2 -1.5883000 35.6937000 11.1768000 11.8722000 - 2047 2 -1.6036400 38.8384000 7.5913900 13.8059000 - 2048 2 -1.6561800 38.4808000 11.1351000 11.2896000 - 2049 1 2.7609600 34.8296000 12.7943000 11.8625000 - 2050 1 2.7746600 36.8889000 14.4952000 13.5423000 - 2051 1 2.4684600 37.9715000 12.1135000 10.0790000 - 2052 2 -1.5816800 39.9794000 11.2678000 1.2641600 - 2053 2 -1.6256100 37.0291000 9.4476200 5.0202900 - 2054 1 2.5059400 34.4786000 7.6964700 7.0003800 - 2055 2 -1.6083700 36.8488000 13.0236000 6.7579100 - 2056 2 -1.6340200 38.7487000 13.7723000 4.2610300 - 2057 1 2.4507700 34.1790000 11.5109000 6.6669700 - 2058 1 2.6717200 38.6234000 9.8523100 5.1979500 - 2059 2 -1.5476600 35.9720000 9.9274200 2.3528600 - 2060 2 -1.5826500 36.4035000 12.0187000 0.3691590 - 2061 2 -1.6305100 36.5223000 11.8475000 4.2527500 - 2062 2 -1.6174300 39.2599000 9.9108100 3.5537500 - 2063 1 2.7568300 35.8706000 10.2829000 3.9861300 - 2064 1 2.7685100 35.9279000 13.7228000 0.8746280 - 2065 2 -1.5870300 35.9235000 1.1996300 7.3752500 - 2066 2 -1.6411000 35.7098000 2.4956900 13.7176000 - 2067 2 -1.6535100 36.3979000 1.2892500 9.9008400 - 2068 3 0.2366140 40.2438000 0.2488650 7.8286100 - 2069 1 2.5396200 35.8981000 2.2424800 8.6193900 - 2070 2 -1.5947200 33.1325000 14.7490000 4.2569100 - 2071 2 -1.9337900 34.4702000 9.3582100 7.3793000 - 2072 2 -1.9126000 35.2385000 1.8596000 3.0219100 - 2073 2 -1.9581000 35.5915000 6.3673400 7.0734100 - 2074 2 -1.9319100 36.8199000 3.6295200 6.7525300 - 2075 2 -1.5893800 37.4922000 2.2791100 4.9401200 - 2076 1 2.6375700 36.6428000 1.1131400 4.1180800 - 2077 2 -1.9195700 39.1901000 5.5965000 1.7203400 - 2078 2 -1.6462200 36.5520000 7.2151700 2.4331000 - 2079 1 1.4733800 37.9259000 2.7165200 1.8020500 - 2080 2 -1.9241500 37.0875000 4.8777900 3.7598900 - 2081 1 2.6364200 36.4673000 8.5724100 1.5703800 - 2082 1 2.7115400 37.8451000 6.6009800 3.0320300 - 2083 3 -0.0426042 44.5750000 7.1865400 0.7782000 - 2084 3 0.0479593 40.6673000 2.2259000 0.4534770 - 2085 3 -0.0542478 42.5047000 1.0364400 1.9331400 - 2086 3 -0.0399543 44.5456000 2.1932500 0.8880890 - 2087 3 0.2020540 41.0553000 4.5496700 0.7667180 - 2088 3 -0.0204118 42.7120000 3.4432600 2.1086200 - 2089 3 -0.0394067 44.5816000 4.7100200 0.7901290 - 2090 3 0.0129862 42.6807000 5.8233700 2.1600800 - 2091 3 -0.0417319 44.6398000 7.2605000 3.2761800 - 2092 3 0.1132880 40.7508000 2.3471100 3.1474700 - 2093 3 -0.0128892 42.6151000 1.2052500 4.4385800 - 2094 3 -0.0432956 44.5887000 2.3206600 3.4087700 - 2095 3 0.2647260 40.4383000 4.8986300 3.4056400 - 2096 3 0.0296947 42.5982000 3.6571100 4.5831700 - 2097 3 -0.0386198 44.5971000 4.7828100 3.2896200 - 2098 3 0.0328510 42.5990000 6.0879600 4.6510800 - 2099 3 -0.0432873 44.5615000 7.3237300 5.7259200 - 2100 3 0.2705700 40.8695000 2.3598900 5.9092800 - 2101 3 0.0159870 42.5575000 1.1773100 6.9651500 - 2102 3 -0.0367191 44.4928000 2.4088800 5.8701000 - 2103 3 0.2850860 40.9134000 4.9806900 6.1281700 - 2104 3 0.0212076 42.5788000 3.6911100 7.1122800 - 2105 3 -0.0356418 44.5340000 4.8729800 5.8072700 - 2106 3 0.0071547 42.6700000 6.2155000 7.1071300 - 2107 1 2.6188200 30.4643000 14.4158000 11.1740000 - 2108 3 -0.0440142 44.4943000 14.7588000 5.6292600 - 2109 2 -1.5366600 31.2663000 0.3271250 14.1897000 - 2110 2 -1.6038100 30.3467000 1.0692100 8.4223200 - 2111 3 -0.0426540 44.3934000 14.6860000 0.7290600 - 2112 3 0.2112940 41.0357000 7.0249000 1.0276300 - 2113 3 0.3002220 41.0753000 7.4051400 3.3787800 - 2114 3 0.2287490 40.9935000 7.4107800 5.8083500 - 2115 3 0.2810460 40.8205000 9.4229400 0.8379400 - 2116 3 0.0180806 42.8097000 8.4089400 2.0180300 - 2117 3 -0.0376103 44.6108000 9.7064300 0.7261220 - 2118 3 0.0849711 42.4926000 11.1575000 1.7333000 - 2119 3 -0.0316880 44.3887000 12.2841000 0.5818890 - 2120 3 0.0741614 42.4496000 13.4303000 1.9753200 - 2121 3 0.2796480 41.1994000 9.7706300 3.0845200 - 2122 3 0.0236759 42.8203000 8.5663000 4.4817300 - 2123 3 -0.0391291 44.5825000 9.8585700 3.1553100 - 2124 3 0.4163290 40.8199000 12.3586000 3.3993700 - 2125 3 0.0444003 42.6984000 11.1715000 4.3272400 - 2126 3 -0.0336740 44.5026000 12.4209000 3.0556900 - 2127 3 0.0399202 42.6184000 13.6129000 4.3418900 - 2128 3 0.2862130 41.0576000 9.8829900 5.5026600 - 2129 3 0.0037348 42.6774000 8.6737500 6.9243000 - 2130 3 -0.0451645 44.5870000 9.8119200 5.6663100 - 2131 3 0.2980070 41.0509000 12.2724000 5.7582000 - 2132 3 0.0108019 42.6956000 11.0856000 6.8906500 - 2133 3 -0.0435120 44.5626000 12.3205000 5.6394500 - 2134 1 2.3287000 34.0009000 7.4110100 0.1436620 - 2135 3 0.0209105 42.6548000 13.5475000 6.9241600 - 2136 3 -0.0457582 44.5801000 7.4558000 8.2777300 - 2137 3 0.1719250 40.7459000 2.5555700 8.2907600 - 2138 3 0.0170183 42.3829000 1.1314800 9.3924600 - 2139 3 -0.0393856 44.4849000 2.4970200 8.3619000 - 2140 3 0.1581960 40.8692000 4.9902000 8.5039000 - 2141 3 -0.0256888 42.4764000 3.7309300 9.6675200 - 2142 3 -0.0420615 44.5745000 4.9931600 8.3546900 - 2143 3 -0.0263213 42.6558000 6.2528000 9.5846600 - 2144 3 -0.0457591 44.5514000 7.2797600 10.6702000 - 2145 3 0.1132380 40.6863000 2.6098800 10.7405000 - 2146 3 0.0106834 42.3051000 0.8594500 11.8928000 - 2147 3 -0.0427872 44.3862000 2.2095300 10.6955000 - 2148 3 0.0744802 40.7493000 5.0046700 10.8372000 - 2149 3 -0.0226310 42.5048000 3.4484900 12.0952000 - 2150 3 -0.0451519 44.5030000 4.7092200 10.7525000 - 2151 3 -0.0184646 42.5602000 6.0406000 11.9466000 - 2152 3 -0.0411867 44.4841000 7.3834200 13.1469000 - 2153 3 0.1703840 40.5536000 2.1985600 13.0720000 - 2154 3 -0.0049063 42.5188000 1.0457000 14.2617000 - 2155 3 -0.0396177 44.4677000 2.3388200 13.2746000 - 2156 3 0.1557850 40.8190000 4.6795400 13.2586000 - 2157 3 0.0040215 42.5883000 3.5411700 14.6334000 - 2158 3 -0.0404906 44.5060000 4.8750100 13.2182000 - 2159 3 0.0178562 42.5611000 6.0454900 14.2962000 - 2160 2 -1.5731900 30.3875000 1.4099900 12.1149000 - 2161 3 0.1622120 40.7031000 7.4249200 8.2551100 - 2162 3 0.1094860 40.7115000 7.3939100 10.6720000 - 2163 3 0.2374270 40.8909000 7.3479700 13.0709000 - 2164 3 0.1927590 40.7924000 9.8736400 7.9316400 - 2165 3 -0.0193979 42.5492000 8.5818600 9.3284600 - 2166 3 -0.0474309 44.5380000 9.8742200 8.1912300 - 2167 3 0.2756210 40.8358000 12.3431000 8.2814200 - 2168 3 0.0101965 42.6176000 11.1081000 9.3631400 - 2169 3 -0.0430963 44.5729000 12.3511000 8.1285300 - 2170 3 0.0363086 42.5905000 13.5917000 9.3601900 - 2171 3 0.1837090 40.7407000 9.8705500 10.3843000 - 2172 3 0.0021895 42.5560000 8.6214600 11.8022000 - 2173 3 -0.0457294 44.4775000 9.7585300 10.5895000 - 2174 3 0.3039440 40.8019000 12.2963000 10.6786000 - 2175 3 0.0259489 42.5782000 11.1331000 11.8447000 - 2176 3 -0.0411358 44.4767000 12.3502000 10.6745000 - 2177 3 0.0293572 42.4698000 13.6231000 11.8726000 - 2178 3 0.3262150 40.7068000 10.0232000 12.9980000 - 2179 3 0.0470490 42.5667000 8.6402200 14.2106000 - 2180 3 -0.0408487 44.4966000 9.8474900 13.0645000 - 2181 3 0.3453960 40.6225000 12.4902000 13.0244000 - 2182 3 0.0630231 42.5237000 11.0691000 14.2706000 - 2183 3 -0.0409447 44.4101000 12.3347000 13.1287000 - 2184 3 0.0373145 42.3479000 13.5537000 14.3253000 - 2185 2 -1.6202800 36.9779000 2.4546800 0.4205190 - 2186 2 -1.5828400 35.4293000 8.2531600 0.2832190 - 2187 3 0.3148700 40.1241000 13.8783000 0.6078910 - 2188 2 -1.6163400 37.2371000 0.0627433 12.0620000 - 2189 3 0.2169030 40.6266000 0.1028350 5.5054200 - 2190 1 2.5650400 35.7354000 0.1894210 10.9612000 - 2191 3 0.2527560 40.1394000 0.0151446 12.6019000 - 2192 1 2.4642300 31.6936000 8.0482100 0.1086160 - 2193 2 -1.6926100 38.2388000 2.5384200 15.1843000 - 2194 1 2.6439700 36.9520000 1.4514600 22.1675000 - 2195 1 2.7850900 30.3550000 10.2146000 18.4894000 - 2196 2 -1.6041200 39.7759000 10.4922000 24.2663000 - 2197 1 2.5191500 37.0600000 11.9170000 21.2870000 - 2198 2 -1.6141400 38.6161000 13.7533000 24.9260000 - 2199 2 -1.6158900 36.1039000 4.8489800 19.9517000 - 2200 2 -1.5643200 32.0411000 12.8256000 25.2946000 - 2201 2 -1.6391800 31.9731000 13.2252000 28.4987000 - 2202 1 2.6215200 33.4714000 13.9670000 29.0287000 - 2203 1 2.1248500 39.1514000 8.9845400 24.8389000 - 2204 2 -1.9301000 32.7590000 2.8186400 27.4939000 - 2205 2 -1.6242300 33.3978000 10.5454000 29.4592000 - 2206 1 2.4728000 31.6327000 2.7989900 25.7065000 - 2207 2 -1.6207500 33.7396000 11.6145000 26.7231000 - 2208 2 -1.6577800 32.4731000 9.1438900 26.1690000 - 2209 2 -1.6863700 30.4868000 4.5958100 14.9617000 - 2210 1 2.5995500 32.3198000 12.2376000 26.6546000 - 2211 2 -1.6021800 31.3870000 6.9151000 28.1498000 - 2212 2 -1.6203800 30.7221000 7.0874500 25.4445000 - 2213 1 2.5319900 31.4744000 7.8108800 26.8266000 - 2214 3 0.1068710 40.4152000 14.7663000 21.1748000 - 2215 1 2.6870300 32.3618000 1.7061100 28.9383000 - 2216 1 2.5942100 33.9404000 10.1029000 26.2478000 - 2217 2 -1.6866000 31.1537000 11.2552000 27.5493000 - 2218 2 -1.6800500 31.8894000 0.6942700 25.2328000 - 2219 1 2.4686100 30.3175000 10.3939000 28.5289000 - 2220 2 -1.5467500 34.9846000 7.7682500 18.0556000 - 2221 2 -1.6077100 35.1166000 10.5148000 18.1461000 - 2222 1 2.8050800 33.9623000 11.0382000 16.9661000 - 2223 1 2.8177500 35.3449000 9.0555900 19.0289000 - 2224 2 -1.5698900 34.7816000 11.7960000 23.6086000 - 2225 1 2.7724500 34.0488000 12.3431000 22.2326000 - 2226 1 2.6946000 35.0956000 13.2507000 19.4656000 - 2227 2 -1.5704700 33.4762000 4.6565000 17.6787000 - 2228 2 -1.5548000 34.7475000 6.2458400 15.8329000 - 2229 1 2.7624600 32.5364000 1.1156300 18.1040000 - 2230 1 2.6749700 34.7706000 1.8660900 19.9962000 - 2231 1 2.7803200 34.1379000 4.7300200 16.0341000 - 2232 2 -1.5992500 33.6415000 6.1822500 20.2258000 - 2233 2 -1.5531000 35.1466000 5.2305700 23.4160000 - 2234 2 -1.5910700 35.9733000 6.9024000 21.5845000 - 2235 1 2.7537400 33.9019000 4.0109300 23.7444000 - 2236 1 2.8233500 34.9786000 5.5212900 21.1055000 - 2237 2 -1.5798700 33.9017000 14.1108000 15.1661000 - 2238 2 -1.5858200 31.6425000 7.7922700 15.4691000 - 2239 2 -1.5893300 32.8908000 12.2697000 17.5899000 - 2240 2 -1.5708400 34.3780000 9.3633700 20.3061000 - 2241 2 -1.5866700 31.0755000 12.8866000 19.8889000 - 2242 2 -1.5671100 33.3220000 9.7941900 16.1566000 - 2243 1 2.7860100 32.1953000 13.3859000 18.7006000 - 2244 2 -1.5156800 33.7485000 13.8597000 19.4641000 - 2245 2 -1.5624600 31.8488000 9.9787300 19.4003000 - 2246 2 -1.5764000 32.2369000 8.6213800 22.0645000 - 2247 1 2.6857100 37.5645000 14.4568000 26.0243000 - 2248 2 -1.5377500 33.0168000 11.3530000 21.5170000 - 2249 1 2.7288100 32.5616000 13.9980000 24.2278000 - 2250 2 -1.5649700 33.4332000 13.7573000 22.8697000 - 2251 1 2.7995900 32.8513000 9.7645700 20.7266000 - 2252 2 -1.5963100 31.4069000 4.8568400 19.3554000 - 2253 2 -1.5410100 32.0661000 7.0984800 18.0578000 - 2254 2 -1.5612700 33.4027000 1.4201800 19.6573000 - 2255 2 -1.4796000 33.3941000 1.4053600 16.7553000 - 2256 1 2.7661100 30.9771000 7.5140800 16.9079000 - 2257 2 -1.6258700 30.3512000 14.6601000 26.4163000 - 2258 2 -1.5863400 31.0478000 2.0313500 19.1412000 - 2259 2 -1.5491600 34.5813000 2.5976600 24.4489000 - 2260 2 -1.5809600 31.0894000 3.1144000 21.5589000 - 2261 2 -1.5862900 31.3334000 6.1347100 23.1122000 - 2262 1 2.5352000 31.0601000 1.9889000 22.5975000 - 2263 2 -1.6214000 33.8266000 4.0251500 21.9931000 - 2264 1 2.6899200 31.3505000 7.2826700 21.9086000 - 2265 1 2.6488500 31.2856000 5.6750100 24.7374000 - 2266 1 2.6405100 31.1573000 3.4581400 19.8899000 - 2267 1 2.7875100 32.7209000 5.8927700 18.8847000 - 2268 2 -1.5056400 31.3951000 0.3878980 22.6417000 - 2269 3 0.2717330 40.5384000 14.4927000 15.5851000 - 2270 2 -1.6031100 35.1908000 9.6490800 25.4663000 - 2271 2 -1.5866000 33.6960000 14.8426000 25.3511000 - 2272 2 -1.6540900 32.3299000 4.0119100 24.5010000 - 2273 2 -1.5755200 38.6417000 13.9011000 19.5642000 - 2274 2 -1.5740200 30.6554000 4.4216300 25.8125000 - 2275 2 -1.7184400 38.7631000 10.1313000 28.0418000 - 2276 1 2.6828000 37.6653000 11.5387000 28.9550000 - 2277 2 -1.6505100 38.9652000 1.9679600 28.3309000 - 2278 2 -1.5379200 34.4050000 12.7260000 29.3747000 - 2279 2 -1.6311900 39.5293000 8.0304800 26.3445000 - 2280 1 2.4731100 37.5296000 3.0712100 28.5908000 - 2281 2 -1.6297800 37.2385000 7.6258200 27.9463000 - 2282 2 -1.6648100 33.9377000 0.1393190 23.4353000 - 2283 2 -1.6139600 36.0387000 13.8326000 26.3453000 - 2284 2 -1.6676200 35.2503000 0.1831250 25.8888000 - 2285 1 1.9842600 38.8521000 8.4145800 27.8615000 - 2286 1 2.6396900 34.6924000 3.9338900 27.2071000 - 2287 2 -1.9306400 36.0861000 2.7623100 27.4896000 - 2288 2 -1.5774400 38.0278000 4.7392000 28.3956000 - 2289 1 2.5586100 35.9197000 8.7049000 28.2886000 - 2290 1 2.0343100 37.0916000 5.9058000 27.7549000 - 2291 1 2.6221900 36.4147000 2.4732300 15.2265000 - 2292 2 -1.9124900 34.3034000 7.7821700 28.1858000 - 2293 2 -1.6225300 36.0976000 10.4564000 28.4753000 - 2294 1 2.4732400 32.2384000 11.6993000 29.5854000 - 2295 3 -0.0494516 44.4024000 14.7222000 20.6555000 - 2296 1 2.6115400 38.3365000 12.2910000 24.0422000 - 2297 1 2.5879400 37.7827000 10.6624000 16.6951000 - 2298 2 -1.4856500 38.4945000 9.4406600 16.7578000 - 2299 2 -1.5193600 36.0783000 0.6547970 23.2118000 - 2300 2 -1.6094200 35.5179000 12.5688000 20.9711000 - 2301 2 -1.6519900 39.5657000 4.6698300 23.0345000 - 2302 2 -1.6411100 38.0834000 12.6525000 22.4074000 - 2303 2 -1.6499400 37.8132000 0.7853140 18.0268000 - 2304 1 2.3455500 37.4208000 2.4215800 18.2090000 - 2305 2 -1.6272700 39.8168000 1.7731200 25.4816000 - 2306 1 2.4228100 38.4910000 3.5398900 24.0780000 - 2307 1 2.4698200 38.9139000 1.1371300 26.7769000 - 2308 1 2.3434000 38.6478000 5.4595500 21.7517000 - 2309 2 -1.5477400 36.4730000 8.0835700 15.5636000 - 2310 2 -1.5822800 35.0405000 11.8202000 15.8834000 - 2311 2 -1.6081200 38.2714000 12.1599000 17.2251000 - 2312 2 -1.5951000 40.1683000 9.3729600 19.6634000 - 2313 2 -1.6092600 36.1782000 13.5368000 18.3696000 - 2314 1 2.6232800 37.8382000 13.5525000 17.9552000 - 2315 1 2.7364500 35.2239000 13.3096000 15.4555000 - 2316 2 -1.5766000 36.6181000 13.8071000 15.1022000 - 2317 2 -1.6056300 37.2188000 11.3300000 24.7011000 - 2318 3 -0.0471097 44.3068000 14.7136000 15.5932000 - 2319 2 -1.5853600 37.0585000 8.7755500 19.2570000 - 2320 2 -1.7113500 38.1549000 8.4485400 21.9491000 - 2321 2 -1.6073100 36.0102000 9.5766600 22.9170000 - 2322 2 -1.5579700 37.7543000 10.9674000 20.3324000 - 2323 1 2.7245000 35.7528000 10.5452000 24.1750000 - 2324 1 2.7176000 38.3196000 9.2705400 20.1727000 - 2325 2 -1.6393900 38.2987000 3.5833500 18.6489000 - 2326 2 -1.5791400 37.2442000 6.1582700 17.6779000 - 2327 2 -1.6258600 35.6243000 1.4380400 18.7124000 - 2328 2 -1.6863100 38.0539000 0.1448910 21.1117000 - 2329 2 -1.5773600 38.7213000 5.7426500 20.2274000 - 2330 2 -1.6101700 36.0075000 0.9636840 15.9285000 - 2331 1 2.8063700 35.7825000 7.1164100 16.7946000 - 2332 1 2.6807200 37.3322000 5.3755800 18.9934000 - 2333 2 -1.6648800 35.5636000 3.6539800 16.0934000 - 2334 2 -1.4930800 33.1306000 0.0573043 27.6374000 - 2335 2 -1.6682900 34.8222000 5.0674000 25.8980000 - 2336 2 -1.6383900 35.9597000 2.0885500 21.0540000 - 2337 2 -1.6692800 37.4928000 4.6177400 24.9603000 - 2338 2 -1.6581800 36.8111000 7.1847700 24.2494000 - 2339 2 -1.6304400 37.9609000 2.5767200 22.8298000 - 2340 1 2.7108600 36.4770000 8.0089100 22.6082000 - 2341 1 2.7352900 34.8879000 1.1399900 24.5286000 - 2342 1 2.5303900 36.1306000 5.7567800 24.7331000 - 2343 3 0.1802460 40.6940000 14.6930000 17.9450000 - 2344 3 -0.0431549 44.4833000 7.3315000 15.5610000 - 2345 3 0.1964950 40.7476000 2.3627000 15.5404000 - 2346 3 -0.0217526 42.5054000 1.1113300 16.7913000 - 2347 3 -0.0402996 44.4758000 2.2691600 15.7048000 - 2348 3 0.2342140 40.6566000 4.7796900 15.7283000 - 2349 3 -0.0011981 42.4586000 3.5658300 16.9962000 - 2350 3 -0.0417371 44.4935000 4.8577500 15.6202000 - 2351 3 0.0189208 42.5605000 5.9785800 16.7775000 - 2352 3 -0.0420658 44.4477000 7.3144500 18.0687000 - 2353 3 0.1615760 40.5110000 2.4601600 18.0591000 - 2354 3 0.0005650 42.3148000 1.1636400 19.1655000 - 2355 3 -0.0458556 44.3975000 2.3768900 18.2522000 - 2356 3 0.2373640 40.4844000 4.8397700 18.1868000 - 2357 3 0.0055532 42.3697000 3.5770400 19.5340000 - 2358 3 -0.0461099 44.4715000 4.8302200 18.0517000 - 2359 3 0.0403172 42.5137000 6.0280600 19.1481000 - 2360 3 -0.0405299 44.4159000 7.3396100 20.5729000 - 2361 3 0.2294740 40.4543000 2.5510500 20.4788000 - 2362 3 0.0330638 42.1489000 1.0867600 21.5801000 - 2363 3 -0.0438272 44.2179000 2.3321300 20.7633000 - 2364 3 0.2848280 40.2903000 4.7771600 21.0937000 - 2365 3 0.0394942 42.2335000 3.5048600 22.0945000 - 2366 3 -0.0439449 44.3394000 4.7095200 20.5181000 - 2367 3 0.0312149 42.5316000 6.0514100 21.6203000 - 2368 3 -0.0459691 44.3498000 14.4640000 25.6078000 - 2369 3 0.2720940 40.2638000 0.2712400 19.9166000 - 2370 3 0.2719040 40.8691000 14.5845000 25.8043000 - 2371 3 0.3198820 40.7674000 7.1442600 15.3935000 - 2372 3 0.3454210 40.5180000 7.3129300 17.7432000 - 2373 3 0.3812460 39.3723000 7.5320800 19.6188000 - 2374 3 0.3544720 40.6595000 9.5749300 15.4183000 - 2375 3 0.0564233 42.6136000 8.4397500 16.7281000 - 2376 3 -0.0427827 44.4545000 9.7795200 15.5744000 - 2377 3 0.3293470 40.7527000 12.0599000 15.5194000 - 2378 3 0.0527431 42.5397000 10.9759000 16.7661000 - 2379 3 -0.0452229 44.4147000 12.2550000 15.5789000 - 2380 3 0.0118097 42.4682000 13.4905000 16.7830000 - 2381 3 0.4205130 40.8893000 9.7873700 17.8344000 - 2382 3 0.0942226 42.5094000 8.3927800 19.3676000 - 2383 3 -0.0380279 44.3590000 9.7769300 18.1353000 - 2384 3 0.3126380 40.7169000 12.2373000 17.9188000 - 2385 3 0.0773201 42.3169000 11.0163000 19.3768000 - 2386 3 -0.0460441 44.3284000 12.2879000 18.0686000 - 2387 3 0.3577340 40.5009000 14.6501000 28.1617000 - 2388 3 -0.0031271 42.1691000 13.3865000 19.4515000 - 2389 3 0.4017470 40.1851000 10.0807000 21.4526000 - 2390 3 0.0459468 42.5130000 8.5155600 21.9706000 - 2391 3 -0.0352222 44.3208000 9.8132200 20.5988000 - 2392 3 0.3318650 40.1840000 12.2301000 21.0036000 - 2393 3 0.0510214 42.3167000 11.2344000 21.8823000 - 2394 3 -0.0429962 44.2412000 12.2915000 20.5568000 - 2395 3 0.3068490 40.7313000 12.0956000 28.7423000 - 2396 3 0.0063834 42.4488000 13.7203000 21.9282000 - 2397 3 -0.0472316 44.4219000 7.2587000 23.0059000 - 2398 3 0.3051780 40.4885000 2.8647800 23.7054000 - 2399 3 0.1067230 41.8754000 1.0280300 24.1595000 - 2400 3 -0.0386060 44.1451000 2.2219800 23.1573000 - 2401 3 0.2671530 40.1534000 4.8089100 25.2523000 - 2402 3 0.0281050 42.6144000 3.4727600 24.5567000 - 2403 3 -0.0427878 44.3914000 4.6978400 22.9936000 - 2404 3 0.0017462 42.5674000 6.0424500 24.0749000 - 2405 3 -0.0472361 44.5770000 7.3168900 25.6291000 - 2406 3 0.3553240 38.3423000 3.2734600 26.0911000 - 2407 3 0.0346055 42.4846000 0.9698010 26.6347000 - 2408 3 -0.0347261 44.4445000 2.2295500 25.7318000 - 2409 3 0.2279620 38.4409000 6.1637400 26.0836000 - 2410 3 0.0184090 42.6352000 3.5361800 26.8924000 - 2411 3 -0.0430042 44.4081000 4.8648500 25.5961000 - 2412 3 -0.0144153 42.3505000 5.9450000 26.6310000 - 2413 3 -0.0459331 44.4840000 7.0074400 28.0412000 - 2414 3 0.1920430 40.8927000 2.2648800 27.8513000 - 2415 3 -0.0212193 42.4647000 0.8726320 29.2200000 - 2416 3 -0.0349456 44.5341000 2.0435700 28.1389000 - 2417 3 0.1655870 40.5525000 4.6318100 28.0231000 - 2418 3 -0.0159694 42.7136000 3.2629500 29.3290000 - 2419 3 -0.0406802 44.5398000 4.5366400 28.0144000 - 2420 3 -0.0108769 42.6829000 5.8362400 29.1716000 - 2421 3 -0.0451977 44.4574000 14.6102000 28.0877000 - 2422 2 -1.9208000 34.7510000 4.5652100 29.2046000 - 2423 3 0.2423540 40.3643000 6.6535700 22.5827000 - 2424 3 0.1987080 40.5307000 7.1164500 24.7886000 - 2425 3 0.1239000 40.4805000 7.0067300 28.4764000 - 2426 3 0.2849660 40.6117000 8.8211900 23.2315000 - 2427 3 -0.0006376 42.6657000 8.4244800 24.5536000 - 2428 3 -0.0428281 44.3814000 9.8745600 23.0556000 - 2429 3 0.2844280 40.5122000 12.7815000 23.1534000 - 2430 3 0.0397099 42.3086000 10.8099000 24.2499000 - 2431 3 -0.0404932 44.2924000 12.4834000 23.0176000 - 2432 2 -1.6436400 30.5907000 8.9084900 28.7584000 - 2433 3 0.0204429 42.4203000 13.1965000 24.4765000 - 2434 3 0.2809220 40.6206000 9.6236100 25.8841000 - 2435 3 -0.0061411 42.5704000 8.2907100 27.0409000 - 2436 3 -0.0458333 44.5320000 9.7525200 25.5782000 - 2437 3 0.3716610 39.9774000 12.2099000 25.3191000 - 2438 3 0.0119327 42.5728000 10.8351000 26.7178000 - 2439 3 -0.0440243 44.3624000 12.0975000 25.4235000 - 2440 3 0.0312757 42.4715000 13.2503000 27.0522000 - 2441 3 0.2175300 40.8372000 9.4480700 28.2356000 - 2442 3 -0.0101010 42.6570000 8.2629600 29.4092000 - 2443 3 -0.0455748 44.5728000 9.5144100 28.0229000 - 2444 3 0.4761050 38.9004000 11.9250000 27.4013000 - 2445 3 0.0287906 42.7073000 10.7729000 29.1407000 - 2446 3 -0.0423287 44.5060000 12.0963000 27.8402000 - 2447 2 -1.5366600 38.2728000 13.1071000 28.7802000 - 2448 3 0.0209748 42.3717000 13.6013000 29.3542000 - 2449 1 2.6476700 34.6239000 14.5502000 26.5939000 - 2450 3 -0.0506293 44.3263000 14.8197000 18.0495000 - 2451 1 2.6726300 34.9658000 11.2243000 29.4853000 - 2452 1 2.5609000 34.4515000 0.4695540 15.7183000 - 2453 3 0.3922040 40.2559000 0.1455890 22.6346000 - 2454 2 -1.4921400 31.7717000 0.2847730 28.8482000 - 2455 2 -1.6103300 30.9617000 14.4661000 23.6531000 - 2456 2 -1.4338900 36.8861000 0.0636379 29.0516000 - 2457 1 2.7131500 30.2229000 14.6443000 28.0121000 - 2458 2 -1.5892900 30.3203000 7.3973900 20.7207000 - 2459 1 2.7618800 32.2380000 9.2978100 14.9185000 - 2460 2 -1.5775700 31.5331000 14.8577000 18.1969000 - 2461 3 -0.0429559 44.4385000 14.9672000 3.1283500 - 2462 3 -0.0492481 44.4784000 17.1358000 0.7063310 - 2463 2 -1.5190300 35.2535000 26.4155000 12.7939000 - 2464 2 -1.6025600 35.0728000 26.4742000 7.0551000 - 2465 2 -1.4270900 32.8796000 28.0895000 12.8729000 - 2466 2 -1.5891900 32.1397000 26.4093000 10.7420000 - 2467 1 2.7213100 37.3501000 18.9329000 1.0605800 - 2468 1 2.6949400 34.4001000 27.9410000 12.9153000 - 2469 1 2.6493200 33.8647000 27.5719000 7.1899000 - 2470 2 -1.6618300 33.3235000 28.6911000 0.8228290 - 2471 1 2.5642000 34.1419000 27.3668000 1.3310800 - 2472 3 0.0005629 42.5183000 15.8896000 6.7783300 - 2473 2 -1.6218600 30.8672000 27.6410000 8.3016000 - 2474 2 -1.5498400 31.8899000 29.2381000 10.0640000 - 2475 1 2.7654400 32.1968000 27.6798000 9.7131800 - 2476 2 -1.6185800 33.6130000 27.5723000 8.8645700 - 2477 1 2.5968900 33.8738000 28.3067000 4.1563300 - 2478 2 -1.6285300 34.0037000 27.2654000 2.9462200 - 2479 2 -1.6710800 32.9820000 27.5807000 5.6265200 - 2480 1 2.6525500 31.3871000 26.5839000 5.0490100 - 2481 2 -1.5469900 31.1475000 17.5822000 0.7213000 - 2482 2 -1.6439700 30.7113000 24.9131000 0.3539740 - 2483 2 -1.5503100 30.5158000 22.9531000 3.8324600 - 2484 2 -1.5810100 33.7689000 19.8905000 12.5794000 - 2485 1 2.7077600 33.0793000 21.0056000 11.5605000 - 2486 1 2.8030800 34.6177000 18.4821000 13.3784000 - 2487 2 -1.6123400 33.0253000 17.3360000 2.9086400 - 2488 2 -1.6141300 34.3695000 17.2685000 5.6733000 - 2489 1 2.6119500 34.4741000 17.4946000 7.3580400 - 2490 1 2.7243400 31.1578000 20.0047000 6.3054200 - 2491 3 0.0023273 42.4457000 15.9369000 1.8484300 - 2492 2 -1.4587300 33.6325000 20.2557000 1.3467700 - 2493 2 -1.5209600 34.1959000 17.3105000 12.2305000 - 2494 2 -1.5921200 33.8092000 15.5231000 10.1905000 - 2495 1 2.7926500 34.0216000 15.1988000 3.0181300 - 2496 1 2.6667500 30.5634000 21.4486000 12.4865000 - 2497 2 -1.5706500 31.7471000 25.5092000 3.9385600 - 2498 3 0.2527430 40.6138000 14.9871000 3.0147900 - 2499 3 -0.0235595 44.3755000 29.5762000 10.7473000 - 2500 2 -1.5969500 30.6180000 19.5707000 7.8851800 - 2501 2 -1.5914100 31.2084000 17.6276000 9.5786400 - 2502 2 -1.5486600 30.6272000 17.3246000 12.2937000 - 2503 2 -1.5950600 32.1021000 21.9024000 12.5716000 - 2504 2 -1.4749300 32.2328000 24.6362000 12.9358000 - 2505 3 0.2468010 40.3697000 26.5440000 14.4965000 - 2506 2 -1.5904000 31.4012000 23.8698000 10.3466000 - 2507 2 -1.6436900 31.6817000 20.4110000 9.8118300 - 2508 1 2.8058400 31.3806000 25.1656000 11.7191000 - 2509 2 -1.6097400 31.2212000 29.7488000 5.0378500 - 2510 1 2.7656000 32.6198000 23.3218000 13.7596000 - 2511 1 2.7332800 31.8854000 24.0560000 8.8179100 - 2512 1 2.6810500 31.9473000 18.9590000 9.0104000 - 2513 2 -1.5510700 33.0182000 23.0764000 2.8829500 - 2514 2 -1.5128300 34.3400000 21.9744000 5.9566800 - 2515 1 2.7800100 31.6361000 16.8979000 2.0344500 - 2516 2 -1.5504500 34.0678000 21.6982000 10.5119000 - 2517 3 -0.0473862 44.4238000 19.8316000 3.1821400 - 2518 2 -1.6315900 33.7085000 18.6048000 8.2859600 - 2519 2 -1.5798600 33.1210000 23.4944000 8.0875700 - 2520 2 -1.5300500 32.3690000 23.7428000 5.5476200 - 2521 2 -1.5853300 32.1426000 18.7281000 5.5058800 - 2522 1 2.8466800 31.9038000 23.7753000 3.9881300 - 2523 1 2.7939100 32.9982000 22.6522000 6.5841100 - 2524 2 -1.5731900 31.8708000 21.4030000 6.6317400 - 2525 1 2.7172400 33.1834000 18.1538000 4.5259300 - 2526 2 -1.4982400 34.3117000 23.1812000 0.5439700 - 2527 2 -1.5736400 34.2158000 19.1317000 3.7113100 - 2528 2 -1.5706700 31.4215000 22.0999000 1.2236200 - 2529 1 2.8044300 33.0945000 22.3097000 1.3306600 - 2530 2 -1.5734000 32.8039000 15.2738000 12.9171000 - 2531 1 2.8202000 34.0273000 15.7568000 11.9417000 - 2532 2 -1.5977500 32.3109000 15.3362000 1.8178700 - 2533 2 -1.5603500 30.8039000 24.7453000 7.9016500 - 2534 3 -0.0348612 44.4554000 29.5673000 13.1122000 - 2535 2 -1.6731500 40.0628000 28.2735000 8.9849100 - 2536 2 -1.5915500 38.6358000 27.7764000 13.1206000 - 2537 1 2.4912100 37.6875000 28.3389000 12.0274000 - 2538 1 2.3676800 38.1191000 26.8677000 14.3903000 - 2539 2 -1.6210100 37.6979000 28.3454000 7.8644500 - 2540 1 2.5350000 36.5234000 29.2129000 6.9433500 - 2541 1 2.3285000 38.3698000 26.7882000 7.7193900 - 2542 2 -1.6790100 39.2818000 25.7007000 6.4071500 - 2543 1 1.7847500 38.5854000 29.4433000 2.0440400 - 2544 2 -1.5774400 34.9792000 28.7981000 14.0752000 - 2545 2 -1.6504700 36.6294000 28.1088000 10.6381000 - 2546 1 2.5013000 36.3619000 26.4676000 9.8922600 - 2547 2 -1.6582000 38.7504000 17.8094000 1.3581800 - 2548 2 -1.5916900 34.8466000 29.0445000 6.9499500 - 2549 1 2.4849600 36.9270000 27.8264000 3.9285300 - 2550 2 -1.5968800 38.4096000 28.0878000 2.9612700 - 2551 2 -1.6504500 36.8126000 26.7722000 5.0959800 - 2552 2 -1.6615400 35.7222000 29.0145000 3.6788700 - 2553 2 -1.5681100 34.1119000 26.0542000 0.5111180 - 2554 2 -1.6314500 39.2366000 16.2552000 10.1321000 - 2555 2 -1.6177000 39.3018000 22.1303000 10.9211000 - 2556 2 -1.6435200 40.4300000 24.6850000 11.4451000 - 2557 1 2.6918100 38.1095000 21.2869000 11.8587000 - 2558 1 2.4879400 39.3182000 23.7167000 10.4755000 - 2559 2 -1.6390100 39.4968000 22.7507000 5.6711200 - 2560 2 -1.6315400 38.5743000 19.7596000 4.6105200 - 2561 1 2.5098000 38.2798000 21.1053000 5.8568800 - 2562 1 2.3217600 38.5301000 16.2385000 8.7125400 - 2563 1 2.4279500 39.0873000 24.3189000 5.3058800 - 2564 1 2.6547200 32.7514000 29.5411000 13.5961000 - 2565 2 -1.6145500 38.4008000 15.0663000 12.5634000 - 2566 1 2.7728000 35.6043000 22.7501000 5.5522400 - 2567 1 2.5187700 38.2343000 16.2281000 11.5069000 - 2568 2 -1.6732600 36.9126000 25.5427000 11.0802000 - 2569 2 -1.5974700 37.3445000 25.8623000 8.6736800 - 2570 3 -0.0386621 44.3825000 29.4843000 0.6434740 - 2571 2 -1.6591200 38.8367000 23.7443000 8.8423300 - 2572 2 -1.7312200 38.1305000 19.2065000 8.2052000 - 2573 2 -1.5487100 37.0958000 17.2581000 11.2005000 - 2574 2 -1.6114500 36.6477000 21.9387000 11.6505000 - 2575 2 -1.5850900 36.2828000 18.8584000 13.2313000 - 2576 2 -1.6208900 38.5755000 21.8493000 14.0685000 - 2577 2 -1.6305100 37.0838000 24.2044000 13.3057000 - 2578 2 -1.6095400 39.3791000 18.4653000 14.5099000 - 2579 2 -1.4891000 34.8585000 23.8787000 11.5678000 - 2580 2 -1.5933600 38.1721000 19.7063000 11.6008000 - 2581 1 2.7810700 35.7962000 24.8187000 12.3466000 - 2582 1 2.7526300 37.4440000 22.9897000 14.5852000 - 2583 1 2.7823400 35.4357000 22.6363000 10.6552000 - 2584 1 2.7345900 36.7839000 18.8490000 11.6514000 - 2585 2 -1.5704200 38.5190000 24.5628000 3.8750700 - 2586 2 -1.5578800 36.6871000 19.3102000 2.4264900 - 2587 2 -1.6132400 37.0604000 17.6439000 4.7972700 - 2588 2 -1.5702600 36.9527000 21.5155000 6.4064300 - 2589 2 -1.5950200 36.4619000 24.1402000 6.8179100 - 2590 2 -1.5634600 35.9745000 19.3484000 10.1837000 - 2591 2 -1.6092600 36.1358000 23.2195000 9.2735400 - 2592 2 -1.5045700 35.0483000 24.5182000 5.2075700 - 2593 1 2.7460000 35.7731000 25.5650000 5.9761900 - 2594 1 2.6618900 36.2186000 18.9409000 8.7200400 - 2595 1 2.6674300 37.1591000 24.0141000 8.3151000 - 2596 1 2.6050800 37.3858000 18.8550000 3.8676800 - 2597 2 -1.5849400 37.8786000 22.9397000 1.6770000 - 2598 2 -1.5822200 36.1098000 24.8008000 2.2033700 - 2599 2 -1.5638100 35.9013000 17.6097000 7.9333900 - 2600 2 -1.5780700 36.4096000 22.6145000 3.9850200 - 2601 1 2.6460100 35.0632000 24.7684000 0.6317380 - 2602 1 2.7457900 34.4946000 18.9764000 1.9594600 - 2603 1 2.7364800 37.1174000 23.8069000 2.9691800 - 2604 2 -1.6028700 36.3582000 16.0176000 13.9005000 - 2605 2 -1.6221800 38.2971000 15.4802000 7.4347800 - 2606 2 -1.6009300 36.0002000 15.2424000 5.8910900 - 2607 3 0.1933820 40.5831000 17.0443000 5.5439000 - 2608 2 -1.5135200 35.3196000 16.1164000 3.4411500 - 2609 1 2.7231900 35.7440000 16.4558000 4.8657100 - 2610 2 -1.6360200 34.4070000 29.3836000 11.6454000 - 2611 1 2.7102500 37.2640000 22.3076000 0.2836400 - 2612 2 -1.6478200 36.0517000 15.2888000 0.3057750 - 2613 1 2.2360700 38.6623000 29.3993000 8.6879200 - 2614 3 -0.0028571 42.2246000 18.5932000 4.2612800 - 2615 2 -1.5806300 34.0254000 23.2674000 14.5154000 - 2616 3 0.0609931 40.5454000 29.5153000 0.8420810 - 2617 3 0.2996010 40.6221000 17.0864000 0.5326760 - 2618 2 -1.4630400 30.5104000 27.1008000 14.6869000 - 2619 3 0.2542120 40.5147000 19.8782000 2.9574400 - 2620 2 -1.5741600 31.4600000 18.6993000 14.6078000 - 2621 3 -0.0518354 44.3639000 17.4381000 3.1042300 - 2622 3 0.0021564 42.5760000 28.1199000 13.9487000 - 2623 3 -0.0380849 44.5199000 27.0862000 12.8336000 - 2624 3 0.0131642 42.5419000 25.5914000 14.1372000 - 2625 3 0.2438840 39.1843000 25.9632000 12.5911000 - 2626 3 -0.0443065 44.4931000 24.6928000 12.9867000 - 2627 3 0.0157797 42.3388000 23.2536000 14.0147000 - 2628 3 0.4194290 39.9584000 24.1343000 13.8790000 - 2629 3 0.0872926 40.9919000 27.6473000 12.1722000 - 2630 3 -0.0241479 44.5813000 27.2088000 10.3273000 - 2631 3 0.0463882 42.6496000 25.9507000 11.5198000 - 2632 3 0.4137760 39.1676000 27.3559000 10.6707000 - 2633 3 -0.0407892 44.5586000 24.7869000 10.5332000 - 2634 3 0.0323307 42.6693000 23.4944000 11.6354000 - 2635 3 0.3400250 40.5378000 25.6297000 9.6729000 - 2636 3 0.1311600 42.5780000 28.4713000 9.4682500 - 2637 2 -1.5914900 35.6336000 18.1913000 0.8203390 - 2638 3 -0.0218398 44.5045000 27.3898000 7.8948200 - 2639 3 0.0864110 42.6924000 26.0896000 8.9821200 - 2640 3 0.3991030 40.4376000 26.7696000 7.7370100 - 2641 3 -0.0391167 44.7210000 24.9438000 8.0323700 - 2642 3 0.0349021 42.8733000 23.7207000 9.1615700 - 2643 3 0.3220270 41.1564000 24.5400000 7.6665500 - 2644 3 0.0762304 40.5742000 29.4278000 3.1708300 - 2645 3 0.3756260 40.0039000 21.9620000 12.7410000 - 2646 3 0.3168550 41.1438000 22.4675000 10.1543000 - 2647 3 0.3600220 40.0315000 21.5642000 8.2586300 - 2648 3 -0.0045901 42.4342000 16.1146000 4.2455400 - 2649 3 0.1789290 40.4818000 17.3255000 3.1627600 - 2650 3 -0.0400464 44.3701000 14.9095000 10.6337000 - 2651 3 -0.0461056 44.3737000 22.2670000 13.0272000 - 2652 3 0.0447803 42.2967000 20.8160000 14.1561000 - 2653 3 -0.0433018 44.3044000 19.8190000 13.0236000 - 2654 3 0.1996390 41.5232000 18.5714000 14.1316000 - 2655 3 0.4877690 38.6943000 20.0074000 13.4700000 - 2656 3 -0.0430665 44.3113000 17.3408000 13.0370000 - 2657 3 0.0239974 42.2867000 16.2527000 14.2228000 - 2658 3 0.4290300 39.9490000 17.2111000 12.3870000 - 2659 3 -0.0482942 44.4136000 22.2221000 10.4237000 - 2660 3 0.0574230 42.4517000 21.0475000 11.6386000 - 2661 3 -0.0502039 44.3850000 19.7713000 10.5525000 - 2662 3 0.0498660 42.3188000 18.5064000 11.8729000 - 2663 3 0.2821180 40.7010000 20.1487000 10.1351000 - 2664 3 -0.0464781 44.2794000 17.3672000 10.5684000 - 2665 3 0.0292513 42.3261000 16.1251000 11.7093000 - 2666 3 0.2702090 40.5977000 17.8457000 10.2515000 - 2667 3 -0.0485804 44.5300000 22.2538000 7.9666400 - 2668 3 0.0045988 42.5579000 20.9879000 9.0544600 - 2669 3 -0.0506401 44.5326000 19.8040000 8.0309000 - 2670 3 -0.0067686 42.5677000 18.5446000 9.2308900 - 2671 3 0.2135500 40.6551000 19.3345000 7.8548800 - 2672 3 -0.0481219 44.4605000 17.3657000 8.0241900 - 2673 3 0.0220533 42.4464000 16.1384000 9.2226600 - 2674 3 0.2221020 40.3939000 17.0468000 7.9994900 - 2675 3 -0.0272134 44.5895000 22.1462000 0.5977070 - 2676 3 0.0400311 42.5665000 20.7333000 1.8607500 - 2677 3 0.0742281 42.1012000 28.6414000 7.0663900 - 2678 3 -0.0371514 44.5679000 27.3308000 5.4408500 - 2679 3 0.0818805 42.6521000 26.2386000 6.5634600 - 2680 3 0.3060750 40.7373000 27.4385000 5.2622000 - 2681 3 -0.0416296 44.6550000 24.9198000 5.2733600 - 2682 3 0.0066060 43.1653000 23.8103000 6.6842700 - 2683 3 0.2123190 41.1343000 24.8059000 5.2525700 - 2684 3 -0.0120275 42.5608000 28.5360000 4.2686200 - 2685 3 -0.0471460 44.4516000 27.2282000 2.9869300 - 2686 3 0.0107727 42.6547000 26.0182000 4.0199900 - 2687 3 0.1426600 40.7169000 26.9977000 2.8911400 - 2688 3 -0.0459691 44.5665000 24.7631000 2.8546300 - 2689 3 0.0032265 42.7153000 23.4475000 4.1952100 - 2690 3 0.3724250 40.8130000 24.5941000 2.7749900 - 2691 3 -0.0522802 42.4066000 28.2072000 1.6296100 - 2692 3 0.0224190 42.4116000 21.1568000 4.2815800 - 2693 3 -0.0447167 44.3654000 27.0905000 0.5909140 - 2694 3 -0.0116905 42.5055000 25.7159000 1.6114800 - 2695 3 0.0974685 40.5957000 26.8679000 0.4572890 - 2696 3 -0.0382167 44.5427000 24.6543000 0.4253340 - 2697 3 0.0396548 42.3344000 23.1179000 1.6794000 - 2698 3 0.2696300 40.6379000 24.4056000 0.4637400 - 2699 3 0.2600010 41.3263000 22.4341000 6.4077800 - 2700 3 0.3123750 40.3548000 22.3238000 3.2960800 - 2701 3 0.3987560 39.6345000 22.2183000 0.8904380 - 2702 3 -0.0422801 44.5247000 22.2567000 3.0020300 - 2703 3 -0.0379870 44.5232000 19.6277000 0.7228990 - 2704 3 0.0050831 42.2864000 18.2914000 1.8484900 - 2705 3 0.3489470 40.7315000 19.6943000 0.5606640 - 2706 3 -0.0448119 44.6001000 22.1923000 5.4109200 - 2707 3 0.0057273 42.6316000 20.6165000 6.7433200 - 2708 3 -0.0497615 44.4171000 19.6329000 5.5021600 - 2709 3 -0.0101879 42.5087000 18.2221000 6.7172200 - 2710 3 0.2710130 40.0962000 20.9016000 5.0713200 - 2711 3 -0.0510117 44.4150000 17.1868000 5.4994800 - 2712 3 0.3023680 40.6035000 14.9439000 13.0015000 - 2713 1 2.8049800 30.3615000 18.4302000 13.4391000 - 2714 1 2.6742900 30.9697000 28.6186000 0.6330030 - 2715 3 0.2780300 38.8587000 29.6721000 10.7447000 - 2716 3 -0.0452392 44.4712000 29.6389000 3.1604300 - 2717 2 -1.5692500 33.2930000 29.6765000 3.4259600 - 2718 3 -0.0225151 44.4027000 29.7492000 8.3187600 - 2719 2 -1.6453200 30.2558000 19.9098000 12.5114000 - 2720 2 -1.1439000 35.3089000 29.6795000 1.2238800 - 2721 3 -0.0380493 44.4825000 29.7552000 5.6751400 - 2722 1 2.7120200 37.1293000 16.2671000 16.8332000 - 2723 2 -1.6529700 38.2534000 15.1245000 17.3545000 - 2724 1 2.6421700 37.1435000 17.8390000 21.6433000 - 2725 1 2.8270100 35.3306000 23.0528000 21.4461000 - 2726 1 2.6701000 37.7202000 22.8768000 24.5843000 - 2727 1 2.7573400 35.3256000 24.7266000 23.9898000 - 2728 2 -1.5660100 36.8282000 19.3992000 22.3043000 - 2729 2 -1.4981000 35.3080000 24.4003000 22.4450000 - 2730 2 -1.6275600 36.9884000 24.3913000 24.2859000 - 2731 2 -1.5880500 38.2348000 21.9057000 23.3663000 - 2732 2 -1.5605400 35.0811000 21.7999000 22.4700000 - 2733 2 -1.6534700 37.2216000 16.5307000 22.8808000 - 2734 1 2.7694800 37.2684000 24.2576000 17.3082000 - 2735 2 -1.6610300 36.2838000 17.2365000 20.3240000 - 2736 2 -1.6235300 38.2423000 18.9475000 18.4107000 - 2737 3 0.3389330 39.9518000 29.0945000 24.7421000 - 2738 2 -1.6445700 38.8326000 20.8665000 20.1350000 - 2739 1 2.6535400 36.4086000 16.6341000 24.2526000 - 2740 3 -0.0493183 44.3897000 17.0528000 25.5647000 - 2741 1 2.6813200 34.1145000 26.5210000 26.0536000 - 2742 1 2.6955900 31.4331000 26.7429000 27.7599000 - 2743 2 -1.6190100 30.8102000 28.2501000 26.6436000 - 2744 2 -1.6033800 31.8639000 27.6881000 29.0909000 - 2745 1 2.6010000 33.5099000 28.6430000 28.7489000 - 2746 2 -1.6120200 32.8077000 28.3926000 25.2337000 - 2747 2 -1.5524300 34.3766000 28.2785000 19.1629000 - 2748 1 2.8109500 32.7542000 27.9799000 18.8256000 - 2749 1 2.5605100 33.2001000 28.7573000 23.8454000 - 2750 2 -1.6071500 33.5705000 26.5465000 21.4724000 - 2751 2 -1.5600700 35.1913000 17.5390000 24.2177000 - 2752 2 -1.6548600 31.9727000 28.1336000 20.3990000 - 2753 2 -1.5563800 32.1827000 29.3822000 18.0123000 - 2754 2 -1.5183400 32.1785000 28.0790000 23.0790000 - 2755 1 2.7575700 32.1091000 27.1510000 21.7153000 - 2756 3 0.1849060 40.6579000 29.6204000 17.6190000 - 2757 2 -1.6044300 34.4700000 23.4655000 24.9212000 - 2758 2 -1.5517200 33.5992000 18.3012000 26.1915000 - 2759 2 -1.5256500 34.2618000 21.6238000 27.0048000 - 2760 1 2.7897100 30.5498000 21.9804000 28.9748000 - 2761 1 2.8337300 32.5952000 21.6182000 27.2867000 - 2762 1 2.6074500 31.9607000 29.5206000 26.5997000 - 2763 2 -1.6083100 30.7654000 18.0560000 25.2317000 - 2764 2 -1.5163200 31.4072000 18.2900000 27.8778000 - 2765 2 -1.5100400 32.1399000 21.8693000 28.7383000 - 2766 2 -1.5098300 31.9251000 20.3969000 26.5108000 - 2767 1 2.8332400 31.6667000 18.8392000 26.4116000 - 2768 2 -1.4992000 32.1644000 22.9270000 26.1173000 - 2769 2 -1.6215600 31.1093000 15.8344000 28.6516000 - 2770 1 2.7475500 31.8736000 17.3500000 29.0472000 - 2771 2 -1.5994700 32.8793000 26.1850000 27.0156000 - 2772 2 -1.3089300 35.1950000 25.8129000 19.6259000 - 2773 2 -1.5740200 34.0137000 21.1641000 16.5442000 - 2774 1 2.7899200 33.6551000 20.0595000 17.7359000 - 2775 1 2.8606000 34.8065000 22.6063000 15.8912000 - 2776 2 -1.5456000 34.1292000 20.1878000 24.4320000 - 2777 1 2.8045000 33.7587000 20.9598000 23.0570000 - 2778 2 -1.5783600 30.8760000 25.4766000 19.4363000 - 2779 2 -1.5638300 32.0836000 16.5402000 16.0403000 - 2780 2 -1.5246200 33.5459000 29.0139000 15.0802000 - 2781 2 -1.5627200 33.1619000 20.8821000 19.0810000 - 2782 2 -1.5466700 32.6546000 23.5430000 18.2757000 - 2783 2 -1.5646300 33.6743000 17.1754000 19.4258000 - 2784 2 -1.6222200 31.3794000 22.3794000 20.6501000 - 2785 1 2.5091800 35.6352000 29.6179000 18.1740000 - 2786 2 -1.5699300 32.6807000 18.9083000 17.1670000 - 2787 1 2.8202500 31.8870000 25.0568000 18.0566000 - 2788 2 -1.4946700 36.5764000 20.9980000 29.5613000 - 2789 1 2.8010400 32.9320000 22.4319000 19.4922000 - 2790 3 0.0265302 42.6254000 15.7160000 26.9062000 - 2791 1 2.8014000 32.6255000 18.0965000 15.6725000 - 2792 2 -1.4690200 34.0883000 22.9763000 20.4666000 - 2793 2 -1.5632400 31.4598000 18.4081000 20.2659000 - 2794 2 -1.6282500 31.9551000 16.3704000 21.6752000 - 2795 1 2.6498800 31.6143000 19.4839000 21.5093000 - 2796 2 -1.5510400 32.6415000 22.1592000 23.4622000 - 2797 2 -1.5635800 32.0212000 24.8199000 24.2652000 - 2798 2 -1.6341600 34.2218000 14.9661000 28.1024000 - 2799 2 -1.5925200 33.0885000 19.8758000 21.9381000 - 2800 1 2.7751200 30.6299000 25.1907000 23.4991000 - 2801 1 2.0024600 37.5529000 29.3044000 16.4564000 - 2802 1 2.6423500 32.4330000 17.1061000 20.3133000 - 2803 1 2.7466200 30.4051000 23.2489000 16.1976000 - 2804 1 2.7495600 30.9086000 15.9081000 17.0147000 - 2805 1 2.6663300 30.5830000 15.5904000 22.1905000 - 2806 1 2.8080500 34.7025000 18.8825000 25.2568000 - 2807 2 -1.6168500 30.7373000 26.2937000 22.2255000 - 2808 2 -1.5322600 32.6776000 26.5560000 18.0080000 - 2809 1 2.7921400 32.7631000 23.2745000 24.6664000 - 2810 3 0.2002500 40.3970000 14.9053000 23.5221000 - 2811 2 -1.6009600 35.0818000 28.4157000 28.2319000 - 2812 2 -1.5801300 35.6319000 26.4212000 26.8146000 - 2813 2 -1.6182300 39.7151000 27.4259000 22.7997000 - 2814 1 2.5392000 38.0629000 27.4914000 22.0161000 - 2815 2 -1.6012800 37.7835000 25.8947000 17.7072000 - 2816 2 -1.4812300 35.0628000 26.1297000 15.9280000 - 2817 2 -1.7072700 40.0126000 27.3902000 18.7060000 - 2818 2 -1.5541200 35.5491000 28.9612000 16.6578000 - 2819 1 2.8073500 34.8369000 26.9901000 20.4252000 - 2820 2 -1.5710100 36.8172000 27.9459000 23.0526000 - 2821 2 -1.5839500 37.4242000 26.9239000 20.5144000 - 2822 1 2.5875000 35.5529000 28.9921000 22.6799000 - 2823 2 -1.6046600 37.3445000 28.6842000 18.4836000 - 2824 1 2.6885500 37.8833000 27.0190000 18.8090000 - 2825 2 -1.6008800 35.1684000 28.5431000 21.2984000 - 2826 1 2.3033700 38.7775000 23.4842000 27.4931000 - 2827 2 -1.5730000 36.2887000 19.2875000 25.7587000 - 2828 2 -1.5920900 38.3757000 20.3892000 26.8980000 - 2829 2 -1.6137200 30.5015000 19.2225000 22.6732000 - 2830 1 2.7084200 37.5130000 20.8286000 28.2253000 - 2831 2 -1.6275300 38.2267000 25.0433000 27.6333000 - 2832 2 -1.5856000 36.3020000 17.2147000 28.0385000 - 2833 2 -1.5430500 36.1901000 22.1530000 15.1375000 - 2834 2 -1.7022100 41.3495000 22.1622000 29.2843000 - 2835 2 -1.6000200 36.3440000 25.1616000 29.4104000 - 2836 2 -1.5887600 35.6637000 23.7926000 27.3375000 - 2837 1 2.5738500 31.4621000 29.3212000 23.8532000 - 2838 1 2.7174000 36.3785000 25.3136000 27.7073000 - 2839 1 2.7921900 35.2426000 22.6096000 26.2092000 - 2840 1 2.7805200 37.5535000 16.8784000 27.1283000 - 2841 2 -1.6076600 36.6519000 22.0576000 25.5572000 - 2842 1 2.4721400 38.6923000 19.2897000 19.8781000 - 2843 1 2.7304800 36.1795000 29.4529000 27.2303000 - 2844 3 0.3432970 40.7941000 19.6290000 25.4479000 - 2845 2 -1.5842500 38.3057000 15.4090000 27.1429000 - 2846 2 -1.6022000 38.5068000 17.9659000 26.5076000 - 2847 2 -1.5237700 37.9856000 22.3849000 28.5654000 - 2848 2 -1.5596100 37.0581000 16.0510000 25.5420000 - 2849 2 -1.6209800 39.0833000 23.1930000 25.8310000 - 2850 1 2.7472100 37.4654000 22.1558000 19.4645000 - 2851 2 -1.6466700 38.5672000 19.4677000 24.2215000 - 2852 1 2.6291800 37.6816000 20.4130000 23.2100000 - 2853 1 2.7107500 37.9558000 19.2871000 25.7380000 - 2854 1 1.9034900 38.3830000 15.0399000 20.5066000 - 2855 2 -1.6128000 34.5839000 26.1244000 24.5608000 - 2856 1 2.7328200 36.7816000 19.7586000 17.5879000 - 2857 1 2.7262600 35.1640000 17.5780000 18.8558000 - 2858 2 -1.6389300 38.1820000 24.0855000 15.7098000 - 2859 2 -1.5627500 37.6586000 17.3162000 15.8954000 - 2860 2 -1.5739000 35.8879000 16.5459000 17.7674000 - 2861 2 -1.5893600 36.6068000 21.1090000 18.5250000 - 2862 2 -1.5981400 38.2210000 23.2500000 18.5022000 - 2863 2 -1.5873100 35.2601000 19.0705000 18.1482000 - 2864 2 -1.6608700 38.7849000 18.0413000 20.9681000 - 2865 2 -1.5628100 36.9026000 22.8359000 20.7555000 - 2866 2 -1.5456800 35.7897000 23.6238000 17.0902000 - 2867 2 -1.5785600 37.1475000 19.7573000 16.0179000 - 2868 3 0.0255884 42.4453000 25.9391000 16.8761000 - 2869 3 -0.0364132 44.2633000 29.3855000 27.6667000 - 2870 2 -1.4474200 30.7595000 24.7009000 16.8901000 - 2871 2 -1.6798100 37.4303000 27.7809000 15.4896000 - 2872 2 -1.5982200 33.6529000 17.0377000 29.5175000 - 2873 3 -0.0481341 44.3856000 24.4062000 15.4737000 - 2874 3 0.0180174 42.4023000 23.4430000 16.5846000 - 2875 3 0.3493200 40.6288000 24.7472000 15.9077000 - 2876 3 0.2707840 40.6979000 22.1860000 20.2542000 - 2877 3 0.2717810 40.4646000 22.2191000 17.8843000 - 2878 3 -0.0338902 44.2569000 29.5890000 20.2714000 - 2879 1 2.6397000 35.1156000 27.6031000 15.6287000 - 2880 3 0.2874960 40.6350000 22.3606000 15.4756000 - 2881 3 -0.0457121 44.3237000 26.8826000 15.3868000 - 2882 3 0.0030441 42.2427000 28.3820000 16.3939000 - 2883 3 0.3354070 40.3240000 24.6527000 18.1741000 - 2884 3 0.0289950 42.2274000 23.4994000 18.9883000 - 2885 3 -0.0416675 44.3030000 24.8124000 17.8909000 - 2886 3 0.3417180 40.1200000 26.8324000 16.7754000 - 2887 3 0.0833443 42.0888000 25.9805000 19.2156000 - 2888 3 -0.0320324 44.2173000 27.3036000 17.9459000 - 2889 3 0.0542019 42.5581000 18.2932000 26.8463000 - 2890 3 0.0730544 42.3166000 28.4369000 18.9569000 - 2891 3 0.2022890 40.6033000 17.2483000 23.2602000 - 2892 3 0.3025980 40.1710000 24.5412000 20.6058000 - 2893 3 0.0141414 42.2605000 23.4564000 21.5274000 - 2894 3 -0.0416443 44.1899000 24.6617000 20.2671000 - 2895 3 -0.0016576 42.4239000 15.8255000 24.4347000 - 2896 3 0.3246610 40.1379000 26.9202000 20.8417000 - 2897 3 0.0265289 42.1978000 25.8653000 21.6532000 - 2898 3 -0.0257901 44.1344000 27.1084000 20.5191000 - 2899 3 -0.0323371 44.0645000 29.5061000 22.7094000 - 2900 3 -0.0491702 44.4839000 17.3482000 23.1023000 - 2901 3 0.3312010 40.7863000 17.0068000 25.9500000 - 2902 3 0.2661420 40.7155000 19.6291000 22.8720000 - 2903 3 -0.0326828 42.2977000 28.2967000 28.7830000 - 2904 3 -0.0450992 44.3798000 26.9494000 27.8923000 - 2905 3 -0.0043532 42.4352000 25.9174000 29.0622000 - 2906 3 0.1706390 40.4846000 27.0530000 27.7206000 - 2907 3 -0.0401922 44.4673000 24.5420000 27.5540000 - 2908 3 0.0842779 42.8716000 23.5776000 28.9723000 - 2909 3 0.2308690 40.6978000 24.5232000 27.9556000 - 2910 3 -0.0488358 44.2569000 22.2714000 20.4900000 - 2911 3 0.0138362 42.5147000 20.9923000 21.6515000 - 2912 3 -0.0479037 44.3990000 19.7345000 20.4418000 - 2913 3 -0.0024247 41.9281000 28.3289000 26.2744000 - 2914 2 -1.6939600 31.4839000 22.8892000 15.0001000 - 2915 3 -0.0063480 42.5526000 18.5630000 21.8324000 - 2916 3 0.2278880 40.8089000 19.6742000 20.4484000 - 2917 3 -0.0494035 44.4008000 17.2634000 20.4934000 - 2918 3 -0.0271394 42.4333000 16.0581000 21.9719000 - 2919 3 -0.0469907 44.1937000 27.0039000 25.4648000 - 2920 3 0.1532870 40.9066000 17.2920000 20.6226000 - 2921 3 -0.0499659 44.3138000 22.3449000 17.9861000 - 2922 3 0.0119278 42.4904000 21.0154000 19.2132000 - 2923 3 -0.0487054 44.3114000 19.7924000 17.8815000 - 2924 3 -0.0043692 42.3346000 25.8264000 26.6715000 - 2925 3 -0.0111520 42.5327000 18.4212000 19.1756000 - 2926 3 0.2466130 40.5923000 19.8438000 18.0047000 - 2927 3 0.2678650 39.9695000 26.8537000 25.2707000 - 2928 3 -0.0489537 44.3723000 17.3078000 17.8728000 - 2929 3 -0.0490314 44.2519000 24.6353000 25.1731000 - 2930 3 0.0417768 42.4226000 23.1423000 26.4847000 - 2931 3 -0.0313674 42.4509000 15.8279000 19.4454000 - 2932 3 0.2153240 40.7072000 17.3732000 18.1503000 - 2933 3 -0.0487070 44.3318000 21.9568000 15.4632000 - 2934 3 0.0091696 42.3240000 20.9740000 16.6988000 - 2935 3 0.2654650 40.5587000 24.6553000 25.5331000 - 2936 3 -0.0445503 44.3346000 19.5010000 15.4735000 - 2937 3 0.0241151 42.1712000 18.5685000 16.5050000 - 2938 3 0.3956360 40.2022000 20.1320000 15.4213000 - 2939 3 -0.0432846 44.3562000 17.1135000 15.5041000 - 2940 3 0.0005774 42.3581000 16.0914000 16.9116000 - 2941 3 0.0986448 41.8970000 28.3924000 23.6812000 - 2942 3 0.3658540 40.4709000 16.9016000 15.5835000 - 2943 3 0.0579359 42.0025000 28.4719000 21.2853000 - 2944 1 2.7945100 35.3031000 16.7951000 29.4055000 - 2945 3 -0.0401456 44.1125000 27.0619000 23.0129000 - 2946 3 0.0180053 42.1047000 25.8556000 24.1824000 - 2947 3 0.4650280 38.1303000 25.4781000 22.9596000 - 2948 3 -0.0495797 44.1797000 24.6782000 22.6768000 - 2949 3 0.0281130 42.3249000 23.3773000 24.0416000 - 2950 3 -0.0451602 44.3335000 29.4728000 15.5342000 - 2951 3 0.0155854 42.5062000 18.3242000 24.2951000 - 2952 3 0.2641020 40.3220000 24.5264000 23.0377000 - 2953 3 0.4039760 40.4517000 22.0877000 27.5086000 - 2954 3 0.4122520 40.6534000 22.0114000 25.0735000 - 2955 3 -0.0486567 44.5117000 19.8447000 23.0474000 - 2956 3 0.3138420 40.6682000 22.0751000 22.6498000 - 2957 3 0.0249862 42.5212000 20.8502000 24.1594000 - 2958 3 -0.0497879 44.3291000 22.2913000 22.9453000 - 2959 3 0.1553630 39.6146000 29.0767000 15.7260000 - 2960 3 -0.0357076 44.0771000 29.4686000 25.1871000 - 2961 3 -0.0280926 44.4780000 22.1204000 27.8586000 - 2962 3 0.1184350 42.9088000 20.8210000 29.2237000 - 2963 3 -0.0369186 44.5373000 19.6205000 27.9532000 - 2964 3 0.0610255 42.5870000 18.5500000 29.2232000 - 2965 3 0.5138380 40.4380000 19.4468000 28.0611000 - 2966 3 -0.0479056 44.4320000 17.1326000 28.0345000 - 2967 3 0.0324198 42.5793000 16.0832000 29.2275000 - 2968 3 0.4055470 39.0277000 17.5314000 28.6191000 - 2969 3 -0.0442181 44.3628000 22.0736000 25.4246000 - 2970 3 0.0480730 42.5180000 20.6947000 26.7862000 - 2971 3 -0.0461617 44.3360000 19.5564000 25.4800000 - 2972 3 -0.0396749 44.3669000 29.6901000 17.9327000 - 2973 1 2.7314000 37.5611000 18.6204000 14.9112000 - 2974 2 -1.5903500 37.8565000 29.6941000 26.6614000 - 2975 2 -1.5983500 30.2093000 22.0592000 17.3530000 - 2976 2 -1.6091700 38.3015000 20.0040000 29.6175000 - 2977 3 0.1703220 40.4468000 29.6896000 27.9093000 - 2978 1 2.6879800 30.2216000 23.0611000 21.4011000 - 2979 3 -0.0437198 44.4207000 14.9128000 23.1289000 - 2980 1 2.3845600 38.1920000 29.7333000 19.4423000 - 2981 2 -1.5806000 34.1463000 18.2015000 14.9341000 - 2982 3 -0.0218192 48.3026000 14.7980000 3.1457300 - 2983 3 0.2046960 59.8738000 0.1175990 10.3178000 - 2984 3 -0.0220607 52.0629000 14.8046000 12.8539000 - 2985 3 -0.0221586 52.1828000 14.8258000 5.5363600 - 2986 3 -0.0489148 55.8149000 7.3257900 0.7131380 - 2987 3 0.2118530 59.8569000 8.0371500 0.3980890 - 2988 3 -0.0463530 55.9056000 2.4086300 0.8266680 - 2989 3 0.0419270 57.8711000 1.3283400 2.0735800 - 2990 3 0.3099710 59.8500000 2.5109200 0.4845220 - 2991 3 -0.0454912 55.6694000 4.7870100 0.3598880 - 2992 3 0.0345491 57.9736000 3.7893300 1.8563700 - 2993 3 0.3259850 59.6373000 4.7934400 0.3387910 - 2994 3 0.0321630 58.0087000 6.3774000 1.9340100 - 2995 3 -0.0504198 55.9477000 7.3346400 3.2270800 - 2996 3 0.2157080 59.8886000 7.9375800 2.9938100 - 2997 3 -0.0377293 56.1088000 2.4651700 3.2435800 - 2998 3 0.0923988 58.1429000 1.2789900 4.3805400 - 2999 3 -0.0217444 52.1029000 14.7617000 3.0847000 - 3000 3 -0.0449738 56.0214000 4.9190400 2.8807700 - 3001 3 0.0531770 57.9882000 3.6587600 4.3398700 - 3002 3 0.2622510 59.4541000 0.3415870 0.8177710 - 3003 3 0.0303682 57.9901000 5.9963500 4.2427300 - 3004 3 -0.0490910 55.9786000 7.3074100 5.6875400 - 3005 3 0.2825990 59.7546000 7.2324700 5.2721200 - 3006 3 -0.0422316 56.0978000 2.4807100 5.7141000 - 3007 3 0.0629313 58.5171000 0.9126650 6.7075700 - 3008 3 -0.0187768 52.0601000 14.7718000 0.6417620 - 3009 3 -0.0463073 56.0135000 4.8959000 5.3731400 - 3010 3 0.0212918 58.0983000 3.4096700 6.8186500 - 3011 3 0.3567770 60.0081000 4.4209600 5.5178300 - 3012 3 0.0064323 58.0611000 5.8997500 6.6878900 - 3013 3 -0.0218425 46.4396000 0.9832320 2.0297000 - 3014 3 -0.0259382 46.4313000 3.5545900 1.9929900 - 3015 3 -0.0288308 46.4364000 6.0634200 1.9991400 - 3016 3 -0.0262280 46.4653000 1.1132100 4.5479200 - 3017 3 -0.0288157 46.4782000 3.6580700 4.5580100 - 3018 3 -0.0311374 46.4930000 6.1084700 4.5288600 - 3019 3 -0.0284623 46.3899000 1.1856000 7.0243800 - 3020 3 -0.0297932 46.4324000 3.6903400 6.9938100 - 3021 3 -0.0305605 46.4248000 6.1407000 7.0055500 - 3022 3 -0.0218268 48.2750000 7.3077800 0.7250000 - 3023 3 -0.0226187 52.0471000 7.3271100 0.6660380 - 3024 3 -0.0180567 48.2872000 2.3477400 0.7022000 - 3025 3 -0.0191549 50.2272000 1.1300200 1.9313500 - 3026 3 -0.0213259 52.0768000 2.3569500 0.6298180 - 3027 3 -0.0347140 54.0453000 1.1501200 1.8631600 - 3028 3 -0.0207058 48.2489000 4.8368800 0.7205420 - 3029 3 -0.0231480 50.1769000 3.5888100 1.9289100 - 3030 3 -0.0227658 52.0184000 4.8357900 0.7016360 - 3031 3 -0.0361021 53.9774000 3.6404200 1.8608100 - 3032 3 -0.0240418 50.1600000 6.0874200 1.9563100 - 3033 3 -0.0347129 54.0100000 6.1128100 1.9309000 - 3034 3 -0.0262170 48.3248000 7.3509400 3.2262700 - 3035 3 -0.0261283 52.1161000 7.3201300 3.1359300 - 3036 3 -0.0229518 48.3069000 2.3716900 3.2299800 - 3037 3 -0.0220766 50.2862000 1.1804000 4.4013000 - 3038 3 -0.0257755 52.1514000 2.3801800 3.1401300 - 3039 3 -0.0362821 54.1477000 1.2001200 4.2949300 - 3040 3 -0.0253923 48.2840000 4.8757100 3.2461900 - 3041 3 -0.0255691 50.2365000 3.6512800 4.3949600 - 3042 3 -0.0267330 52.1106000 4.8479900 3.1699900 - 3043 3 -0.0378608 54.1073000 3.6475100 4.3245300 - 3044 3 -0.0260384 50.2169000 6.1374400 4.4260100 - 3045 3 -0.0364395 54.0139000 6.1344700 4.3806400 - 3046 3 -0.0265944 48.3681000 7.3787100 5.7195400 - 3047 3 -0.0268520 52.1841000 7.4041500 5.6516300 - 3048 3 -0.0249922 48.3310000 2.4078300 5.7231000 - 3049 3 -0.0226965 50.2947000 1.2226000 6.8751300 - 3050 3 -0.0265734 52.1821000 2.4425800 5.6079800 - 3051 3 -0.0358411 54.0864000 1.2422100 6.7438800 - 3052 3 -0.0264545 48.3505000 4.9121900 5.7417800 - 3053 3 -0.0257464 50.2556000 3.6602300 6.8772200 - 3054 3 -0.0274278 52.1507000 4.9132400 5.6218300 - 3055 3 -0.0366953 54.0833000 3.6785900 6.8184700 - 3056 3 -0.0260996 50.2759000 6.1767700 6.8812100 - 3057 3 -0.0357214 54.0615000 6.1269600 6.8765300 - 3058 3 -0.0483465 55.8288000 9.8554100 0.6130030 - 3059 3 -0.0082582 57.8730000 8.7638500 1.6065800 - 3060 3 0.2417720 59.3826000 10.2700000 0.4164320 - 3061 3 -0.0459894 55.7890000 12.4000000 0.6457680 - 3062 3 0.0125497 57.8464000 11.2143000 2.0153300 - 3063 3 0.2902350 59.5501000 12.5751000 0.4473010 - 3064 3 0.0249372 57.7894000 13.5838000 1.6081500 - 3065 3 -0.0524560 55.9003000 9.8263100 3.1002700 - 3066 3 0.0013511 57.8622000 8.7379200 4.1422900 - 3067 3 0.2746270 59.8129000 10.1790000 2.8627900 - 3068 3 -0.0486281 55.9249000 12.3281000 3.1551400 - 3069 3 0.0120664 57.9701000 11.1322000 4.4152400 - 3070 3 0.3290470 59.7468000 12.4959000 3.0138000 - 3071 3 0.0445975 58.0129000 13.6110000 4.2080000 - 3072 3 -0.0496218 55.9742000 9.9016500 5.6024600 - 3073 3 0.0120203 57.8485000 8.5067000 6.6640000 - 3074 3 0.2637930 59.6521000 9.8122200 5.6115700 - 3075 3 -0.0509271 56.0352000 12.3588000 5.6145400 - 3076 3 0.0215506 57.9180000 10.9917000 6.9759100 - 3077 3 0.3164520 59.8634000 12.2045000 5.4265700 - 3078 3 0.0208929 58.1941000 13.4683000 6.6281400 - 3079 3 -0.0188580 48.3071000 14.7185000 0.6891800 - 3080 3 -0.0313341 46.4425000 8.5920400 2.0238000 - 3081 3 -0.0423059 55.9072000 0.0223576 12.7270000 - 3082 3 -0.0318614 46.4132000 11.0673000 1.8931600 - 3083 2 -1.6329500 59.8844000 2.5594600 3.0267000 - 3084 3 -0.0356574 54.1047000 13.5270000 14.1789000 - 3085 3 -0.0310716 46.3387000 13.5329000 1.9016400 - 3086 3 -0.0331673 46.4361000 8.6096100 4.4416300 - 3087 3 -0.0342195 46.4624000 11.1213000 4.3802400 - 3088 3 -0.0217746 48.2647000 14.8005000 10.5653000 - 3089 3 -0.0325662 46.3992000 13.6232000 4.3866400 - 3090 3 -0.0319945 46.4203000 8.5876000 6.9185500 - 3091 3 -0.0331499 46.4378000 11.0739000 6.9087000 - 3092 3 -0.0191654 50.1461000 13.5057000 14.1791000 - 3093 3 -0.0313392 46.4135000 13.5514000 6.9017900 - 3094 3 -0.0224295 48.2874000 9.8189100 0.6831610 - 3095 3 -0.0239806 50.2254000 8.5766300 1.9227300 - 3096 3 -0.0227652 52.0494000 9.8242800 0.6520840 - 3097 3 -0.0345648 53.9946000 8.5874700 1.9332100 - 3098 3 -0.0210825 48.2958000 12.2711000 0.7083960 - 3099 3 -0.0235650 50.2010000 11.0833000 1.9652300 - 3100 3 -0.0218611 52.0599000 12.2895000 0.6745460 - 3101 3 -0.0347295 54.0083000 11.0722000 1.9213900 - 3102 3 -0.0511671 56.1428000 14.8198000 5.2461300 - 3103 3 -0.0205164 50.2061000 13.5538000 1.9444200 - 3104 3 -0.0399016 56.1137000 14.7993000 12.7356000 - 3105 3 -0.0340852 53.9731000 13.5897000 1.9673100 - 3106 3 -0.0265216 48.3354000 9.8137600 3.1915500 - 3107 3 -0.0259451 50.2786000 8.6321700 4.4178300 - 3108 3 -0.0259001 52.1229000 9.8358400 3.1607200 - 3109 3 -0.0363077 54.0258000 8.5825800 4.4059500 - 3110 3 -0.0250637 48.3287000 12.3256000 3.1886700 - 3111 3 -0.0255397 50.2746000 11.1085000 4.4293900 - 3112 3 -0.0254597 52.1493000 12.3047000 3.1644500 - 3113 3 -0.0368899 54.0132000 11.0716000 4.3861400 - 3114 3 -0.0367659 56.0455000 0.0653863 5.4080700 - 3115 3 -0.0225202 50.2376000 13.5959000 4.3925400 - 3116 3 -0.0216721 50.1741000 11.0436000 14.3145000 - 3117 3 -0.0357667 54.1044000 13.5950000 4.4171200 - 3118 3 -0.0265394 48.3806000 9.8744200 5.6571300 - 3119 3 -0.0259798 50.2953000 8.6905400 6.9127000 - 3120 3 -0.0270031 52.1558000 9.8939000 5.6964900 - 3121 3 -0.0356886 54.0764000 8.6114600 6.8707200 - 3122 3 -0.0252488 48.3560000 12.3778000 5.6438200 - 3123 3 -0.0255576 50.3120000 11.1773000 6.9116600 - 3124 3 -0.0262325 52.1599000 12.3750000 5.6324600 - 3125 3 -0.0364734 54.0934000 11.1383000 6.8601400 - 3126 3 -0.0244003 48.2386000 12.3151000 13.0908000 - 3127 3 -0.0228719 50.2525000 13.6383000 6.8176200 - 3128 3 -0.0323354 54.0858000 8.6109800 14.4164000 - 3129 3 -0.0375310 54.1555000 13.6065000 6.8763700 - 3130 3 -0.0482196 56.0147000 7.3147200 8.1178100 - 3131 3 0.1799730 59.7238000 7.3547500 7.7276400 - 3132 3 -0.0488744 56.0056000 2.4565400 8.1130400 - 3133 3 -0.0001668 58.1654000 1.1830400 9.1715800 - 3134 3 0.2745530 60.3124000 2.1893900 7.8483200 - 3135 3 -0.0496417 56.0764000 4.9072600 7.8790300 - 3136 3 -0.0180697 57.8280000 3.6381000 9.3609900 - 3137 3 0.1773610 59.5615000 4.7551500 8.1867400 - 3138 3 -0.0260792 57.9784000 6.1764100 9.2785400 - 3139 3 -0.0458110 56.0610000 7.5583300 10.5314000 - 3140 3 -0.0215294 48.2976000 14.8154000 8.0958600 - 3141 3 -0.0499069 55.9648000 2.4586900 10.5802000 - 3142 3 -0.0273413 57.9719000 1.3437300 11.6438000 - 3143 3 0.1451440 59.8164000 2.5136000 10.5229000 - 3144 3 -0.0484601 55.9391000 5.0486000 10.4638000 - 3145 3 -0.0305493 57.9453000 3.7233400 11.9277000 - 3146 3 0.1119580 59.5789000 4.9401400 10.7251000 - 3147 3 -0.0115371 57.7156000 6.1454900 11.7781000 - 3148 3 -0.0349589 56.0712000 7.4531000 13.1139000 - 3149 3 0.2257290 59.7345000 7.1939600 12.1537000 - 3150 3 -0.0460264 55.9309000 2.5608300 13.0127000 - 3151 3 -0.0096220 57.8034000 1.3084500 14.0888000 - 3152 3 0.1299440 59.7782000 2.6476700 13.0357000 - 3153 3 -0.0429006 55.9325000 4.9969700 13.0317000 - 3154 3 -0.0087153 57.9831000 3.7254700 14.3372000 - 3155 3 0.1547560 60.0375000 4.9589000 13.1115000 - 3156 3 0.0514107 58.1068000 6.0928900 14.1680000 - 3157 3 -0.0286866 46.4179000 1.2862100 9.5379400 - 3158 3 -0.0298628 46.4432000 3.6961600 9.4710700 - 3159 3 -0.0297331 46.4858000 6.1768800 9.4557100 - 3160 3 -0.0279879 46.3069000 1.0250600 12.0309000 - 3161 3 -0.0295175 46.3885000 3.5286500 11.8873000 - 3162 3 -0.0304178 46.3725000 6.1141700 11.9230000 - 3163 3 -0.0260462 46.3081000 1.0207700 14.4873000 - 3164 3 -0.0273458 46.3889000 3.5653200 14.3693000 - 3165 3 -0.0303472 46.3961000 6.1157600 14.3627000 - 3166 3 -0.0257814 48.3609000 7.4458800 8.1955800 - 3167 3 -0.0265715 52.2118000 7.4144900 8.1445000 - 3168 3 -0.0251054 48.3176000 2.4790400 8.1725400 - 3169 3 -0.0226442 50.2584000 1.2367700 9.3492500 - 3170 3 -0.0252044 52.1896000 2.4716400 8.0839300 - 3171 3 -0.0329727 54.0515000 1.2177600 9.2424400 - 3172 3 -0.0262836 48.3469000 4.9383100 8.1938500 - 3173 3 -0.0256623 50.2649000 3.7244500 9.3644500 - 3174 3 -0.0264505 52.1656000 4.9518700 8.1127800 - 3175 3 -0.0341849 54.0527000 3.7384200 9.3148500 - 3176 3 -0.0260580 50.3135000 6.2039600 9.3547300 - 3177 3 -0.0345248 54.0758000 6.2174700 9.3455500 - 3178 3 -0.0257683 48.4031000 7.4216200 10.6669000 - 3179 3 -0.0271682 52.2352000 7.4652600 10.6263000 - 3180 3 -0.0246314 48.3614000 2.4543500 10.6052000 - 3181 3 -0.0214712 50.1964000 1.1869200 11.8115000 - 3182 3 -0.0244957 52.1721000 2.4724300 10.5591000 - 3183 3 -0.0300785 54.0143000 1.2487700 11.7226000 - 3184 3 -0.0256044 48.3577000 4.9475800 10.6429000 - 3185 3 -0.0249113 50.2555000 3.6633800 11.8363000 - 3186 3 -0.0264613 52.1725000 4.9469200 10.6015000 - 3187 3 -0.0324413 54.0455000 3.7266700 11.7667000 - 3188 3 -0.0254492 50.3379000 6.1536400 11.8326000 - 3189 3 -0.0330095 54.1287000 6.2579500 11.7931000 - 3190 3 -0.0248013 48.3737000 7.3529600 13.0860000 - 3191 3 -0.0252778 52.2205000 7.3977500 13.1275000 - 3192 3 -0.0228785 48.2538000 2.3874500 13.0756000 - 3193 3 -0.0179971 50.1340000 1.1448900 14.2475000 - 3194 3 -0.0224833 52.1123000 2.3886500 12.9914000 - 3195 3 -0.0254860 53.9825000 1.1646800 14.2052000 - 3196 3 -0.0243548 48.3107000 4.8820500 13.0856000 - 3197 3 -0.0210947 50.1527000 3.5931700 14.3143000 - 3198 3 -0.0248357 52.1813000 4.9052300 13.0431000 - 3199 3 -0.0288819 53.9688000 3.6606400 14.2487000 - 3200 3 -0.0220214 50.2353000 6.0815700 14.3116000 - 3201 3 -0.0301427 54.1171000 6.1523300 14.2465000 - 3202 3 -0.0430501 55.9797000 9.8035800 8.1712900 - 3203 3 0.0196798 57.8877000 8.6053000 9.1752000 - 3204 3 0.1660880 59.7834000 0.1240340 12.7241000 - 3205 3 -0.0496899 56.0848000 12.3705000 8.0806200 - 3206 3 0.0618343 57.8865000 11.0467000 9.4502600 - 3207 3 0.3146330 60.0914000 12.0323000 7.9236100 - 3208 3 -0.0259356 52.1445000 9.8881500 13.1080000 - 3209 3 0.0302649 58.1200000 13.4797000 9.0562500 - 3210 3 -0.0408146 56.0385000 9.9904600 10.7052000 - 3211 3 0.0207072 57.9030000 8.7706800 11.7805000 - 3212 3 0.3118410 60.1613000 9.4229300 11.3385000 - 3213 3 -0.0464836 56.1063000 12.4205000 10.5518000 - 3214 3 0.0609586 58.1460000 11.1439000 11.8887000 - 3215 3 0.3743110 59.8280000 12.5092000 10.3445000 - 3216 3 -0.0221745 50.2355000 8.5784200 14.3281000 - 3217 3 0.0655297 58.1177000 13.5813000 11.7316000 - 3218 3 0.2996510 60.0719000 14.4703000 7.7555900 - 3219 3 -0.0387129 56.1356000 9.9069200 13.1796000 - 3220 3 0.0782301 58.0710000 8.5362700 14.5978000 - 3221 3 0.3558480 59.7643000 9.6002600 13.4446000 - 3222 3 -0.0446465 56.0866000 12.3120000 12.9999000 - 3223 3 0.0572704 58.1355000 11.0529000 14.3455000 - 3224 3 0.4679830 59.9873000 12.3339000 12.7446000 - 3225 3 -0.0252348 48.3191000 9.8614700 13.0747000 - 3226 3 0.0822605 58.0130000 13.4689000 14.1863000 - 3227 3 -0.0394721 54.1252000 13.6221000 11.7558000 - 3228 3 -0.0222026 48.2748000 14.8438000 5.6195000 - 3229 3 -0.0311357 46.4862000 8.6125100 9.4116000 - 3230 3 -0.0327683 46.4259000 11.0804000 9.4162000 - 3231 3 0.2947240 59.7502000 14.8608000 10.2603000 - 3232 3 -0.0316444 46.3810000 13.6249000 9.4177400 - 3233 3 -0.0322891 46.4169000 8.6089500 11.8931000 - 3234 3 -0.0341835 46.3606000 11.1236000 11.8588000 - 3235 3 -0.0351942 54.0677000 11.0395000 14.3074000 - 3236 3 -0.0335865 46.3228000 13.5905000 11.8578000 - 3237 3 -0.0329591 46.4043000 8.6236100 14.3793000 - 3238 3 -0.0340175 46.3290000 11.0862000 14.3459000 - 3239 3 -0.0570753 56.1866000 14.8397000 7.6908500 - 3240 3 -0.0252452 52.1378000 12.3723000 13.0873000 - 3241 3 -0.0327453 46.2579000 13.5260000 14.3254000 - 3242 3 -0.0256924 48.3469000 9.9164300 8.1343700 - 3243 3 -0.0259002 50.3351000 8.6852200 9.3821100 - 3244 3 -0.0267631 52.2271000 9.9236500 8.1354400 - 3245 3 -0.0357104 54.0991000 8.6884300 9.3843200 - 3246 3 -0.0247447 48.3337000 12.3598000 8.1168400 - 3247 3 -0.0257837 50.3022000 11.1485000 9.3919500 - 3248 3 -0.0264078 52.1878000 12.4536000 8.1540000 - 3249 3 -0.0370015 54.1435000 11.1927000 9.3514100 - 3250 3 -0.0204686 48.2780000 14.7745000 13.0518000 - 3251 3 -0.0231853 50.2373000 13.6190000 9.2856400 - 3252 3 -0.0229202 50.1401000 13.5907000 11.7214000 - 3253 3 -0.0384102 54.1413000 13.6365000 9.3216300 - 3254 3 -0.0260506 48.3729000 9.8635900 10.6239000 - 3255 3 -0.0255156 50.3285000 8.6467200 11.8518000 - 3256 3 -0.0274798 52.2394000 9.9388800 10.6304000 - 3257 3 -0.0355273 54.1265000 8.7806900 11.9609000 - 3258 3 -0.0255098 48.2921000 12.3065000 10.5819000 - 3259 3 -0.0252676 50.2495000 11.1542000 11.8759000 - 3260 3 -0.0271371 52.1752000 12.4401000 10.6310000 - 3261 3 -0.0378273 54.1040000 11.2176000 11.8948000 - 3262 3 0.2538560 60.1965000 7.4219200 9.9347900 - 3263 3 -0.0239477 52.1571000 14.8479000 10.3477000 - 3264 3 -0.0453629 55.9852000 14.7590000 2.8628000 - 3265 3 -0.0481904 56.1980000 14.8345000 10.1904000 - 3266 3 -0.0474478 56.0178000 0.0237003 10.2532000 - 3267 3 -0.0453692 56.0629000 0.0043727 7.8107800 - 3268 3 -0.0447860 55.8675000 14.8722000 0.4134070 - 3269 3 -0.0223759 52.1704000 14.6350000 17.7947000 - 3270 3 -0.0500973 55.9591000 14.5620000 17.7126000 - 3271 3 -0.0209629 48.1512000 14.7667000 22.9497000 - 3272 3 0.2052890 59.5601000 0.2137460 20.4977000 - 3273 3 -0.0226364 50.1042000 13.5296000 24.1541000 - 3274 3 -0.0259843 48.2436000 9.8311500 25.5075000 - 3275 3 -0.0215995 52.0257000 14.7722000 25.3982000 - 3276 3 0.4811840 59.6664000 14.6944000 15.5044000 - 3277 3 -0.0260450 51.9539000 9.8348200 25.4325000 - 3278 3 -0.0248083 48.2142000 12.3192000 25.4569000 - 3279 3 0.2366430 59.4288000 14.6448000 22.8918000 - 3280 3 -0.0425887 55.7791000 14.7434000 27.7418000 - 3281 3 -0.0254160 50.1392000 8.5551500 26.7285000 - 3282 3 -0.0350274 56.0595000 7.3235700 15.5831000 - 3283 3 0.3206850 59.8920000 7.2479400 16.0605000 - 3284 3 -0.0455428 55.7955000 2.3302000 15.4280000 - 3285 3 -0.0264849 57.4015000 0.9260830 16.6233000 - 3286 3 0.1820110 59.6561000 2.3642800 15.4957000 - 3287 3 -0.0402349 55.9734000 4.7695200 15.4053000 - 3288 3 0.0253968 57.6724000 3.5001100 16.7206000 - 3289 3 0.2648880 59.9421000 4.7919100 15.5625000 - 3290 3 0.0379163 57.8855000 6.0199600 16.6280000 - 3291 3 -0.0445011 55.9979000 7.2449400 18.0754000 - 3292 3 0.2989880 59.7350000 7.3202300 18.3342000 - 3293 3 -0.0460752 55.7536000 2.2854900 17.9306000 - 3294 3 -0.0086840 57.6175000 1.0281800 19.1871000 - 3295 3 0.2103390 59.2911000 1.6589400 17.6038000 - 3296 3 -0.0382434 55.9656000 4.7940300 17.8926000 - 3297 3 0.0609962 57.8431000 3.4588500 19.1759000 - 3298 3 -0.0204798 52.1381000 14.7144000 15.3365000 - 3299 3 0.0543859 57.8634000 5.9965700 19.2158000 - 3300 3 -0.0455432 55.8684000 7.2988800 20.5542000 - 3301 3 0.2595730 59.5917000 7.3540000 20.7701000 - 3302 3 -0.0435079 55.7622000 2.3839600 20.3932000 - 3303 3 0.0070034 57.7391000 1.3317300 21.6470000 - 3304 3 0.2768960 59.6173000 2.6191400 20.6782000 - 3305 3 -0.0394425 55.8646000 4.8866200 20.3044000 - 3306 3 0.0290510 57.6926000 3.7745800 21.5715000 - 3307 3 0.3257380 60.1897000 4.7853100 19.7375000 - 3308 3 0.0237852 57.7398000 6.1347900 21.8309000 - 3309 3 -0.0272426 46.3356000 1.0960500 16.9227000 - 3310 3 -0.0302087 46.3768000 3.6046000 16.8360000 - 3311 3 -0.0330335 46.3530000 6.1172400 16.8551000 - 3312 3 -0.0301021 46.2230000 1.2260700 19.4068000 - 3313 3 -0.0327538 46.2958000 3.6383600 19.3353000 - 3314 3 -0.0338970 46.2697000 6.0883700 19.2928000 - 3315 3 -0.0308683 46.1354000 1.0012100 21.8394000 - 3316 3 -0.0326131 46.2433000 3.4792300 21.7574000 - 3317 3 -0.0329810 46.2590000 6.0182900 21.7436000 - 3318 3 -0.0229832 48.3110000 7.3552000 15.5360000 - 3319 3 -0.0234937 52.1306000 7.2975700 15.5760000 - 3320 3 -0.0194727 48.2441000 2.2896600 15.5612000 - 3321 3 -0.0190874 50.1678000 1.1059500 16.7137000 - 3322 3 -0.0200286 52.0569000 2.3706000 15.4397000 - 3323 3 -0.0290395 53.8629000 1.0738800 16.7021000 - 3324 3 -0.0219806 48.2693000 4.8024400 15.5574000 - 3325 3 -0.0234752 50.1343000 3.5803400 16.7698000 - 3326 3 -0.0231981 52.1086000 4.8535200 15.4856000 - 3327 3 -0.0331781 53.9383000 3.5567200 16.7035000 - 3328 3 -0.0242940 50.1564000 6.0469000 16.7860000 - 3329 3 -0.0345714 54.0383000 6.0482800 16.7086000 - 3330 3 -0.0265202 48.2328000 7.3089800 18.0189000 - 3331 3 -0.0269077 52.0349000 7.2913700 18.0379000 - 3332 3 -0.0236421 48.2487000 2.3243900 18.0772000 - 3333 3 -0.0216826 50.1271000 1.1163700 19.2252000 - 3334 3 -0.0242552 52.0068000 2.3602100 17.9731000 - 3335 3 -0.0318880 53.8865000 1.1307100 19.1590000 - 3336 3 -0.0259474 48.2437000 4.8332300 18.0426000 - 3337 3 -0.0255242 50.0985000 3.5942200 19.2575000 - 3338 3 -0.0266168 52.0711000 4.8348700 17.9662000 - 3339 3 -0.0351804 53.9391000 3.5984900 19.1437000 - 3340 3 -0.0260269 50.1053000 6.0418600 19.2955000 - 3341 3 -0.0362462 54.0013000 6.1544800 19.1525000 - 3342 3 -0.0269242 48.1802000 7.3160400 20.5257000 - 3343 3 -0.0269094 52.0308000 7.3041600 20.4844000 - 3344 3 -0.0250902 48.1886000 2.3355200 20.5647000 - 3345 3 -0.0220274 50.0462000 1.1137000 21.7174000 - 3346 3 -0.0250226 52.0260000 2.3732000 20.4575000 - 3347 3 -0.0333400 53.8931000 1.1171400 21.6311000 - 3348 3 -0.0265871 48.1789000 4.8375600 20.5874000 - 3349 3 -0.0255555 50.0780000 3.5995200 21.7108000 - 3350 3 -0.0272727 52.0529000 4.8634700 20.4476000 - 3351 3 -0.0357994 53.8682000 3.6180700 21.6434000 - 3352 3 -0.0259083 50.0965000 6.0641700 21.7952000 - 3353 3 -0.0359452 53.9298000 6.1134000 21.6673000 - 3354 3 -0.0441325 56.0723000 9.8101800 15.6179000 - 3355 3 0.0276460 58.0537000 8.5665800 16.9977000 - 3356 3 0.3720590 60.1333000 9.6759600 15.7871000 - 3357 3 -0.0508917 56.1105000 12.2412000 15.4418000 - 3358 3 0.0152125 58.1967000 10.9262000 16.7910000 - 3359 3 0.3661400 60.0198000 12.3564000 15.1624000 - 3360 3 -0.0335895 53.8653000 13.5639000 24.0862000 - 3361 3 0.0329945 58.0284000 13.3298000 16.6586000 - 3362 3 -0.0463687 55.9467000 14.7032000 15.1863000 - 3363 3 -0.0537410 56.0048000 9.7173200 18.0544000 - 3364 3 0.0024898 57.8913000 8.4578300 19.3490000 - 3365 3 0.2433630 59.9011000 9.7689600 18.1041000 - 3366 3 -0.0570501 56.0690000 12.1168000 17.9031000 - 3367 3 -0.0214932 57.9798000 10.9731000 19.1931000 - 3368 3 0.1968750 59.8164000 12.4952000 18.4052000 - 3369 3 -0.0203465 57.8420000 13.4902000 19.1734000 - 3370 3 -0.0344498 53.8695000 11.0607000 26.6471000 - 3371 3 -0.0524934 55.9087000 9.8535400 20.4703000 - 3372 3 -0.0056229 57.7140000 8.6483900 21.7406000 - 3373 3 0.2112040 59.5807000 9.7575900 20.5126000 - 3374 3 -0.0545850 55.9128000 12.2852000 20.4296000 - 3375 3 -0.0168180 57.7303000 11.0977000 21.8414000 - 3376 3 0.2200670 59.5598000 12.2080000 20.7353000 - 3377 3 -0.0027566 57.7343000 13.5133000 21.6434000 - 3378 3 -0.0350286 46.3624000 8.6129800 16.8452000 - 3379 3 -0.0355805 46.2985000 11.0542000 16.8424000 - 3380 3 0.2423540 59.9157000 14.4045000 20.0596000 - 3381 3 -0.0300974 53.9111000 13.5608000 29.1704000 - 3382 3 -0.0328554 46.2786000 13.5264000 16.7710000 - 3383 3 -0.0342520 46.2825000 8.5716500 19.3006000 - 3384 3 -0.0340655 46.2401000 11.0273000 19.2911000 - 3385 3 -0.0316573 46.2338000 13.4939000 19.2356000 - 3386 3 -0.0334578 46.2957000 8.5712700 21.7561000 - 3387 3 -0.0325682 46.2386000 11.0464000 21.7653000 - 3388 3 -0.0177344 50.1637000 13.5156000 29.2149000 - 3389 3 -0.0299327 46.2872000 13.5033000 21.7775000 - 3390 3 -0.0236286 48.2495000 9.8458700 15.5621000 - 3391 3 -0.0243170 50.1736000 8.5230300 16.7914000 - 3392 3 -0.0232914 52.0982000 9.8013700 15.5722000 - 3393 3 -0.0355987 54.0114000 8.4528400 16.8652000 - 3394 3 -0.0221988 48.2107000 12.3045000 15.5423000 - 3395 3 -0.0240079 50.1468000 11.0312000 16.7566000 - 3396 3 -0.0227256 52.0852000 12.3066000 15.5320000 - 3397 3 -0.0363767 54.0533000 10.8997000 16.7124000 - 3398 3 -0.0210113 50.1728000 11.0302000 29.2446000 - 3399 3 -0.0217970 50.1013000 13.5247000 16.6999000 - 3400 3 -0.0233191 48.2488000 12.2813000 27.9680000 - 3401 3 -0.0363076 54.0912000 13.3344000 16.6061000 - 3402 3 -0.0268361 48.2139000 9.7822500 18.0306000 - 3403 3 -0.0259965 50.1682000 8.5156300 19.2836000 - 3404 3 -0.0261202 52.1059000 9.7814600 18.0228000 - 3405 3 -0.0363008 53.9949000 8.6212400 19.2669000 - 3406 3 -0.0254233 48.1579000 12.2534000 17.9986000 - 3407 3 -0.0257422 50.1443000 11.0121000 19.2286000 - 3408 3 -0.0250230 52.1229000 12.2465000 17.9704000 - 3409 3 -0.0361557 54.0519000 11.0563000 19.1857000 - 3410 3 -0.0308231 53.8884000 8.5901900 29.1851000 - 3411 3 -0.0234895 50.1077000 13.5030000 19.1632000 - 3412 3 -0.0248545 50.1522000 11.0550000 26.7515000 - 3413 3 -0.0352717 54.0824000 13.4881000 19.1065000 - 3414 3 -0.0269861 48.2320000 9.7951500 20.5042000 - 3415 3 -0.0257527 50.1093000 8.5560400 21.7829000 - 3416 3 -0.0262747 52.0421000 9.7994700 20.4802000 - 3417 3 -0.0351043 53.8918000 8.6183000 21.7182000 - 3418 3 -0.0256954 48.1552000 12.2447000 20.4607000 - 3419 3 -0.0254873 50.0945000 11.0301000 21.6936000 - 3420 3 -0.0254883 52.0819000 12.2783000 20.4053000 - 3421 3 -0.0343572 53.9075000 11.0678000 21.6685000 - 3422 2 -1.6726100 60.2973000 2.9468800 18.7159000 - 3423 3 -0.0230683 50.1031000 13.4946000 21.6221000 - 3424 3 -0.0252190 51.9830000 12.3191000 25.4211000 - 3425 3 -0.0335302 53.9376000 13.5720000 21.6110000 - 3426 3 -0.0477694 55.7674000 7.3742700 23.1209000 - 3427 3 0.2171870 59.4718000 7.3568100 23.1936000 - 3428 3 -0.0461269 55.7724000 2.4287400 22.8451000 - 3429 3 0.0173050 57.7543000 1.1483400 24.1690000 - 3430 3 0.2754200 59.4593000 2.3027800 22.9868000 - 3431 3 -0.0450745 55.7802000 4.9401800 22.7979000 - 3432 3 0.0323996 57.6521000 3.6535900 23.9586000 - 3433 3 0.2844900 59.6284000 4.9359300 22.9413000 - 3434 3 0.0108902 57.7127000 6.1471700 24.3753000 - 3435 3 -0.0487694 55.6957000 7.3029000 25.5991000 - 3436 3 0.2229370 59.5512000 7.4266600 25.5685000 - 3437 3 -0.0467758 55.7639000 2.3612100 25.3261000 - 3438 3 0.0081181 57.6266000 1.1905700 26.6006000 - 3439 3 0.2948610 59.4422000 2.7117600 25.3152000 - 3440 3 -0.0461427 55.7561000 4.8903000 25.2218000 - 3441 3 0.0249775 57.5746000 3.7125900 26.5214000 - 3442 3 0.3089180 59.4346000 5.0350600 25.4602000 - 3443 3 0.0087490 57.7558000 6.1529700 26.8493000 - 3444 3 -0.0484335 55.6618000 7.2406400 27.9989000 - 3445 3 0.2539820 59.7491000 7.1594200 27.8908000 - 3446 3 -0.0479176 55.7716000 2.3639500 27.9537000 - 3447 3 0.0088430 57.6706000 1.2828900 29.3096000 - 3448 3 0.2564850 59.1302000 2.4312800 27.9220000 - 3449 3 -0.0469930 55.6927000 4.8272300 27.7013000 - 3450 3 0.0199831 57.6595000 3.8142800 29.0944000 - 3451 3 0.2831760 59.5627000 4.7148200 27.8662000 - 3452 3 0.0134571 57.9193000 6.2827700 29.2696000 - 3453 3 -0.0303155 46.1544000 1.0548000 24.3874000 - 3454 3 -0.0315625 46.1700000 3.5386100 24.2423000 - 3455 3 -0.0321265 46.3263000 6.0489700 24.2542000 - 3456 3 -0.0257736 46.2999000 0.9364840 26.8033000 - 3457 3 -0.0282760 46.3780000 3.3987300 26.6471000 - 3458 3 -0.0296868 46.3818000 5.9590000 26.7536000 - 3459 3 -0.0203337 46.3981000 0.9553290 29.3294000 - 3460 3 -0.0237399 46.4110000 3.4694300 29.2390000 - 3461 3 -0.0269622 46.4209000 5.9694100 29.2457000 - 3462 3 -0.0266238 48.1788000 7.3235300 23.0328000 - 3463 3 -0.0267214 51.9790000 7.3137700 22.9575000 - 3464 3 -0.0250055 48.0758000 2.3280900 23.0476000 - 3465 3 -0.0220199 50.0254000 1.1431600 24.2009000 - 3466 3 -0.0255579 51.9519000 2.3555600 22.9221000 - 3467 3 -0.0335855 53.8699000 1.1179100 24.0959000 - 3468 3 -0.0260977 48.1330000 4.8235500 23.0419000 - 3469 3 -0.0256053 50.0585000 3.5883000 24.1880000 - 3470 3 -0.0272587 51.9695000 4.8378100 22.9360000 - 3471 3 -0.0356654 53.8708000 3.5611700 24.1282000 - 3472 3 -0.0259036 50.0914000 6.0698700 24.2623000 - 3473 3 -0.0357321 53.8338000 6.0468100 24.1414000 - 3474 3 -0.0256089 48.2634000 7.3073600 25.4867000 - 3475 3 -0.0263450 51.9756000 7.2882800 25.4342000 - 3476 3 -0.0245687 48.1270000 2.2447100 25.4885000 - 3477 3 -0.0208599 50.0542000 1.0823400 26.6569000 - 3478 3 -0.0250388 51.9541000 2.3342700 25.3814000 - 3479 3 -0.0336618 53.9578000 1.1187100 26.6360000 - 3480 3 -0.0260757 48.2168000 4.7773900 25.4841000 - 3481 3 -0.0246587 50.0618000 3.5366500 26.6828000 - 3482 3 -0.0265746 51.9519000 4.7952900 25.4267000 - 3483 3 -0.0351594 53.8828000 3.5606100 26.5848000 - 3484 3 -0.0254430 50.0832000 6.0036400 26.7354000 - 3485 3 -0.0347978 53.7853000 6.0150000 26.6349000 - 3486 3 -0.0236560 48.2752000 7.2574600 27.9877000 - 3487 3 -0.0245594 51.9775000 7.3140900 27.9386000 - 3488 3 -0.0213464 48.2341000 2.2425800 27.9813000 - 3489 3 -0.0171888 50.1628000 1.0772000 29.1574000 - 3490 3 -0.0229304 52.0215000 2.3209600 27.8680000 - 3491 3 -0.0320145 54.0030000 1.1386800 29.1808000 - 3492 3 -0.0235409 48.2436000 4.7400400 27.9749000 - 3493 3 -0.0206775 50.1168000 3.5298700 29.2011000 - 3494 3 -0.0247432 51.9664000 4.8005100 27.9071000 - 3495 3 -0.0321102 53.8304000 3.6023900 29.1126000 - 3496 3 -0.0216679 50.1234000 6.0010900 29.2234000 - 3497 3 -0.0308352 53.7976000 6.1052300 29.1858000 - 3498 3 -0.0499709 55.7856000 9.8297100 22.9095000 - 3499 3 -0.0115555 57.6584000 8.5947400 24.1631000 - 3500 3 0.2018280 59.4931000 9.7914700 22.8999000 - 3501 3 -0.0496257 55.7944000 12.3761000 22.9463000 - 3502 3 -0.0155908 57.6530000 11.1213000 24.2514000 - 3503 3 0.2139240 59.5920000 12.1791000 23.1887000 - 3504 3 -0.0242798 52.0069000 9.8235200 27.9232000 - 3505 3 0.0074441 57.6748000 13.4898000 24.0606000 - 3506 3 -0.0216755 50.1416000 8.5263700 29.2087000 - 3507 3 -0.0501104 55.6776000 9.7323400 25.3506000 - 3508 3 -0.0094436 57.7036000 8.4988000 26.5928000 - 3509 3 0.1833720 59.4342000 9.7727200 25.3617000 - 3510 3 -0.0484171 55.7219000 12.2454000 25.3677000 - 3511 3 -0.0128492 57.5614000 10.9215000 26.7540000 - 3512 3 0.2080570 59.3697000 12.1015000 25.6143000 - 3513 3 -0.0244631 48.2650000 9.8196300 28.0087000 - 3514 3 0.0132748 57.6053000 13.4352000 26.5496000 - 3515 3 -0.0333463 53.8591000 13.5402000 26.6359000 - 3516 3 -0.0475071 55.6908000 9.7072200 27.7993000 - 3517 3 -0.0027751 57.6429000 8.5970200 28.9911000 - 3518 3 0.2134990 59.3991000 9.7338100 27.8311000 - 3519 3 -0.0459362 55.7565000 12.2903000 27.8865000 - 3520 3 0.0027290 57.5163000 11.1652000 29.2007000 - 3521 3 0.1992530 59.2690000 12.1165000 27.9561000 - 3522 3 0.0260438 57.6621000 13.6654000 28.9600000 - 3523 3 -0.0326334 46.3628000 8.5717100 24.2088000 - 3524 3 -0.0323857 46.2968000 11.0789000 24.2437000 - 3525 3 -0.0308036 46.2762000 13.5858000 24.2531000 - 3526 3 -0.0318822 46.4786000 8.4768900 26.7412000 - 3527 3 -0.0328339 46.4192000 10.9736000 26.7104000 - 3528 3 -0.0340287 53.7722000 8.5316900 26.6577000 - 3529 3 -0.0310611 53.9659000 11.1065000 29.1867000 - 3530 3 -0.0317339 46.3316000 13.4662000 26.7348000 - 3531 3 -0.0293958 46.4200000 8.5080300 29.2308000 - 3532 3 -0.0311332 46.3584000 11.0559000 29.1747000 - 3533 3 -0.0234273 52.0394000 12.2828000 27.9324000 - 3534 3 -0.0308400 46.3316000 13.4880000 29.2087000 - 3535 3 -0.0266216 48.2335000 9.8405500 23.0370000 - 3536 3 -0.0258527 50.1014000 8.6017200 24.2691000 - 3537 3 -0.0261279 51.9489000 9.7855400 22.9531000 - 3538 3 -0.0346087 53.8119000 8.5537000 24.1780000 - 3539 3 -0.0249644 48.1937000 12.2902000 22.9618000 - 3540 3 -0.0254325 50.1175000 11.0924000 24.2106000 - 3541 3 -0.0253976 52.0024000 12.2901000 22.9006000 - 3542 3 -0.0344868 53.8205000 11.0765000 24.1524000 - 3543 3 -0.0214943 50.1311000 13.4984000 26.7053000 - 3544 3 -0.0186088 48.2597000 14.7472000 15.4861000 - 3545 3 0.2862760 59.6146000 0.3026760 25.5354000 - 3546 3 -0.0226491 52.0793000 14.7274000 20.2932000 - 3547 3 -0.0224395 51.9999000 14.7800000 22.8223000 - 3548 3 -0.0431074 55.7837000 14.6986000 25.2113000 - 3549 3 -0.0215550 48.1908000 14.7610000 25.4304000 - 3550 3 -0.0206882 48.1437000 14.7150000 20.4568000 - 3551 3 -0.0199842 52.0478000 14.7500000 27.9327000 - 3552 3 -0.0205615 48.2047000 14.7236000 27.9325000 - 3553 3 -0.0206403 48.1805000 14.7274000 17.9635000 - 3554 3 -0.0477310 55.9018000 14.7181000 20.2644000 - 3555 3 0.3118800 59.7919000 14.5733000 27.6629000 - 3556 3 0.2317270 59.5422000 0.1107380 28.0830000 - 3557 3 -0.0234028 52.1895000 29.6953000 3.0664900 - 3558 3 -0.0458243 55.9490000 29.6352000 0.6069450 - 3559 3 -0.0323437 46.3309000 16.0507000 6.9012400 - 3560 3 0.3774690 60.1333000 29.5402000 8.0461500 - 3561 3 -0.0202061 48.2568000 29.6395000 13.0141000 - 3562 3 0.3487900 59.7907000 14.9047000 0.2222720 - 3563 3 -0.0158069 48.3400000 29.5844000 0.7388870 - 3564 3 -0.0213066 50.1786000 25.9500000 14.2037000 - 3565 3 -0.0243634 48.2706000 27.1413000 12.9106000 - 3566 3 -0.0364874 53.7986000 23.4280000 14.2176000 - 3567 3 -0.0261579 51.9960000 24.7399000 12.9583000 - 3568 3 -0.0218760 50.1252000 23.4197000 14.2143000 - 3569 3 -0.0250037 48.3071000 24.6686000 12.9260000 - 3570 3 -0.0315770 53.9602000 28.5352000 11.7218000 - 3571 3 -0.0226365 50.1968000 28.4724000 11.6906000 - 3572 3 -0.0337197 46.3505000 16.1277000 4.3071700 - 3573 3 -0.0372504 53.9198000 26.0318000 11.7103000 - 3574 3 -0.0265585 52.1042000 27.2750000 10.4494000 - 3575 3 -0.0251606 50.2027000 25.9887000 11.6859000 - 3576 3 -0.0268091 48.3326000 27.2668000 10.4514000 - 3577 3 -0.0390244 53.9132000 23.5891000 11.7895000 - 3578 3 -0.0282932 52.0662000 24.7859000 10.4777000 - 3579 3 -0.0254875 50.1414000 23.4244000 11.7325000 - 3580 3 -0.0274099 48.3037000 24.7478000 10.4658000 - 3581 3 -0.0360866 54.0214000 28.5114000 9.2440400 - 3582 3 -0.0242068 50.2433000 28.5096000 9.2177600 - 3583 3 -0.0395675 54.0331000 26.0562000 9.2128300 - 3584 3 -0.0274860 52.1671000 27.2541000 7.9806300 - 3585 3 -0.0258184 50.1456000 26.0281000 9.2102300 - 3586 3 -0.0265007 48.3701000 27.2485000 7.9788300 - 3587 3 -0.0408988 53.9903000 23.5674000 9.3244900 - 3588 3 -0.0283415 52.0812000 24.8046000 8.0686900 - 3589 3 -0.0258034 50.1412000 23.5253000 9.2317800 - 3590 3 -0.0272737 48.3052000 24.7494000 7.9657400 - 3591 3 -0.0285079 46.3585000 28.3659000 14.2196000 - 3592 3 -0.0236068 52.0411000 27.2354000 12.9405000 - 3593 3 -0.0182027 52.0881000 29.7062000 12.9564000 - 3594 3 -0.0315724 46.3729000 25.8963000 14.2045000 - 3595 3 -0.0324964 46.3782000 23.3821000 14.1951000 - 3596 3 -0.0303106 46.3771000 28.3976000 11.6995000 - 3597 3 -0.0322542 53.8705000 25.9442000 14.2269000 - 3598 3 -0.0333797 46.3903000 18.6367000 4.4198200 - 3599 3 -0.0334883 46.4147000 25.9180000 11.7119000 - 3600 3 -0.0344131 46.4018000 23.4723000 11.6964000 - 3601 3 -0.0293351 46.4483000 28.6006000 9.2569900 - 3602 3 -0.0327290 46.5168000 26.0647000 9.2203300 - 3603 3 -0.0338567 46.3879000 23.5449000 9.2144500 - 3604 3 -0.0209674 52.0846000 17.2555000 0.6129200 - 3605 3 -0.0030578 57.5139000 28.5439000 14.1820000 - 3606 3 -0.0226043 48.3179000 29.7429000 10.5562000 - 3607 3 0.2228170 59.3971000 27.5607000 13.0077000 - 3608 3 0.0098751 57.6093000 25.9467000 14.2344000 - 3609 3 -0.0448996 55.7094000 27.2789000 13.0623000 - 3610 3 0.3290250 59.5071000 24.9452000 13.1138000 - 3611 3 0.0606164 57.6886000 23.4662000 14.2817000 - 3612 3 -0.0421516 55.7896000 24.7173000 12.9996000 - 3613 3 -0.0070377 57.8297000 28.6595000 11.4635000 - 3614 3 0.5458020 60.3062000 20.3773000 10.3766000 - 3615 3 0.2749250 59.7265000 27.4800000 10.5358000 - 3616 3 0.0253537 57.7322000 26.2640000 11.8822000 - 3617 3 -0.0488725 55.8189000 27.3244000 10.6044000 - 3618 3 0.3296510 59.6165000 25.1283000 10.8600000 - 3619 3 0.0978978 57.8751000 23.7651000 11.8622000 - 3620 3 -0.0418130 55.8506000 24.8793000 10.5647000 - 3621 3 0.0261757 58.0598000 28.4336000 8.9968300 - 3622 3 0.3633740 59.6899000 26.8719000 8.1286100 - 3623 3 0.0437554 57.7912000 26.0429000 9.5221000 - 3624 3 -0.0463358 55.9576000 27.3251000 8.1304100 - 3625 3 0.3309110 58.9489000 24.6736000 7.9619200 - 3626 3 0.0877145 57.8143000 23.4890000 9.5239900 - 3627 3 -0.0441304 56.0275000 24.8278000 8.0722700 - 3628 3 -0.0367835 53.9326000 21.0059000 14.4081000 - 3629 3 -0.0276873 51.9732000 22.2188000 13.0012000 - 3630 3 -0.0219274 50.0828000 20.8914000 14.2542000 - 3631 3 -0.0244655 48.2662000 22.0923000 12.9218000 - 3632 3 -0.0365138 53.9822000 18.5148000 14.3068000 - 3633 3 -0.0278787 52.0923000 19.7407000 13.1037000 - 3634 3 -0.0210691 50.2001000 18.4322000 14.3073000 - 3635 3 -0.0244842 48.2189000 19.6322000 13.0438000 - 3636 3 -0.0373472 54.0360000 16.0143000 13.9487000 - 3637 3 -0.0262573 52.0798000 17.2916000 13.0194000 - 3638 3 -0.0174222 50.2564000 15.9859000 14.2510000 - 3639 3 -0.0225444 48.2964000 17.2016000 13.0397000 - 3640 3 -0.0354970 53.9066000 21.0844000 11.9228000 - 3641 3 -0.0294668 52.0242000 22.2926000 10.5430000 - 3642 3 -0.0256615 50.1467000 20.9583000 11.7859000 - 3643 3 -0.0260330 48.2491000 22.2736000 10.4907000 - 3644 3 -0.0338558 53.9786000 18.4975000 11.8496000 - 3645 3 -0.0292598 52.0501000 19.7766000 10.6203000 - 3646 3 -0.0250410 50.1706000 18.5014000 11.8192000 - 3647 3 -0.0257686 48.2430000 19.8187000 10.6017000 - 3648 3 -0.0385351 54.0730000 16.0389000 11.5008000 - 3649 3 -0.0275468 52.0388000 17.3224000 10.5461000 - 3650 3 -0.0212060 50.1905000 16.0527000 11.7350000 - 3651 3 -0.0245271 48.2908000 17.2963000 10.5611000 - 3652 3 -0.0387535 53.9172000 21.0397000 9.4491500 - 3653 3 -0.0286783 52.0742000 22.3102000 8.1164700 - 3654 3 -0.0260363 50.1416000 21.0340000 9.3405500 - 3655 3 -0.0259422 48.2788000 22.2493000 7.9938400 - 3656 3 -0.0375932 53.9832000 18.5169000 9.4196800 - 3657 3 -0.0284603 52.1041000 19.8071000 8.1347700 - 3658 3 -0.0256351 50.1405000 18.5636000 9.3122400 - 3659 3 -0.0256446 48.2710000 19.7891000 8.0400000 - 3660 3 -0.0389649 54.1738000 16.0299000 9.0361600 - 3661 3 -0.0264978 52.0953000 17.3560000 8.0712200 - 3662 3 -0.0224076 50.1957000 16.0553000 9.2616800 - 3663 3 -0.0247327 48.2362000 17.3063000 8.0844500 - 3664 3 -0.0315419 46.3172000 20.9115000 14.2289000 - 3665 3 -0.0309815 46.3032000 18.3626000 14.1970000 - 3666 3 -0.0303578 46.2766000 15.9570000 14.2956000 - 3667 3 -0.0340081 46.2800000 20.9964000 11.7405000 - 3668 3 -0.0338577 46.3075000 18.4975000 11.7092000 - 3669 3 -0.0321733 46.3065000 16.0630000 11.9109000 - 3670 3 -0.0335232 46.4061000 21.0377000 9.2460500 - 3671 3 -0.0335557 46.3404000 18.5970000 9.2691500 - 3672 3 -0.0319635 46.3009000 16.1648000 9.4485100 - 3673 3 0.4346480 59.6058000 22.0993000 13.0365000 - 3674 3 0.0826321 57.5631000 20.9530000 14.3052000 - 3675 3 -0.0286703 55.7420000 22.2623000 13.1703000 - 3676 3 -0.0317577 46.4081000 20.9852000 6.6844300 - 3677 3 0.1263390 57.9031000 18.4617000 14.0171000 - 3678 3 -0.0018989 55.8659000 19.6961000 13.1391000 - 3679 3 0.4913150 60.0612000 17.9913000 12.5708000 - 3680 3 0.0792308 57.8789000 15.9546000 13.9150000 - 3681 3 -0.0179609 55.9053000 17.2615000 12.8325000 - 3682 3 0.4836270 60.0091000 22.7816000 10.7299000 - 3683 3 0.1848000 57.5974000 21.2985000 11.8837000 - 3684 3 -0.0255370 55.8246000 22.4254000 10.7010000 - 3685 3 -0.0323882 46.3505000 18.5481000 6.7916000 - 3686 3 0.2564020 57.4813000 18.5806000 11.6320000 - 3687 3 0.0004294 55.8101000 19.9611000 10.5909000 - 3688 3 0.4242840 60.0717000 17.1381000 10.3488000 - 3689 3 0.0864075 58.1075000 16.2939000 11.6043000 - 3690 3 -0.0211281 55.9416000 17.2667000 10.3833000 - 3691 3 0.3824280 59.6295000 22.4177000 8.4515500 - 3692 3 0.0998906 58.0396000 21.0095000 9.5623200 - 3693 3 -0.0430977 55.7713000 22.2193000 8.2514100 - 3694 3 0.4143590 59.7392000 20.1385000 8.0062900 - 3695 3 0.1243730 58.4209000 18.5559000 9.3106700 - 3696 3 -0.0420701 55.8204000 19.6667000 8.2208500 - 3697 3 0.2881740 59.8185000 16.8997000 7.7299600 - 3698 3 0.0393450 58.0482000 15.9951000 9.0652900 - 3699 3 -0.0511215 56.1465000 17.2298000 7.9856200 - 3700 3 -0.0376298 54.0532000 28.5117000 6.7523600 - 3701 3 -0.0330267 46.4127000 20.9515000 1.8576500 - 3702 3 -0.0240132 50.3057000 28.4946000 6.7907100 - 3703 3 -0.0221404 48.3198000 17.2110000 0.6613800 - 3704 3 -0.0400957 54.0378000 26.0643000 6.7996800 - 3705 3 -0.0276551 52.1807000 27.2500000 5.5410800 - 3706 3 -0.0257932 50.1961000 26.0034000 6.7429400 - 3707 3 -0.0251729 48.3850000 27.2526000 5.4075000 - 3708 3 -0.0402435 53.9380000 23.5484000 6.8399000 - 3709 3 -0.0278698 52.1077000 24.7636000 5.5915900 - 3710 3 -0.0257855 50.1955000 23.5380000 6.7866900 - 3711 3 -0.0264611 48.3324000 24.7475000 5.4551600 - 3712 3 -0.0377519 54.0520000 28.4390000 4.2850800 - 3713 3 -0.0235142 50.2909000 28.4932000 4.3322400 - 3714 2 -1.6145300 59.0669000 19.7660000 12.1507000 - 3715 3 -0.0395213 54.0156000 25.9640000 4.2999800 - 3716 3 -0.0268199 52.1903000 27.2083000 3.0402000 - 3717 3 -0.0257182 50.2812000 26.0097000 4.2455500 - 3718 3 -0.0239787 48.3698000 27.1926000 2.9283400 - 3719 3 -0.0391061 53.9069000 23.4523000 4.3048800 - 3720 3 -0.0265995 52.0901000 24.7775000 3.0371700 - 3721 3 -0.0257630 50.2694000 23.5146000 4.3286200 - 3722 3 -0.0258283 48.3808000 24.7306000 2.9853500 - 3723 3 -0.0359027 54.0211000 28.4330000 1.7911700 - 3724 3 0.3849520 60.2447000 15.5657000 12.4378000 - 3725 3 -0.0215727 50.2895000 28.4278000 1.8171600 - 3726 3 -0.0364490 54.0088000 25.9199000 1.8011800 - 3727 3 -0.0227806 52.1288000 27.2033000 0.5335730 - 3728 3 -0.0238277 50.2148000 25.9518000 1.7271200 - 3729 3 -0.0199475 48.2278000 27.1464000 0.4569770 - 3730 3 -0.0357845 53.9600000 23.3995000 1.7611500 - 3731 3 -0.0230321 52.1098000 24.7252000 0.5368630 - 3732 3 -0.0239657 50.1909000 23.4708000 1.7707800 - 3733 3 -0.0224722 48.2861000 24.6719000 0.5145120 - 3734 3 -0.0294080 46.5086000 28.5347000 6.7811600 - 3735 3 -0.0183042 50.1149000 28.4318000 14.1522000 - 3736 3 -0.0190819 48.3445000 29.6310000 3.2024600 - 3737 3 -0.0321248 46.5009000 26.1363000 6.6175000 - 3738 3 -0.0327155 46.4060000 23.5428000 6.7564100 - 3739 3 -0.0275216 46.4364000 28.4299000 4.3067200 - 3740 3 -0.0324816 46.4557000 21.0538000 4.2738200 - 3741 3 -0.0316289 46.4728000 26.0577000 4.1073700 - 3742 3 -0.0323817 46.4844000 23.5373000 4.2441600 - 3743 3 -0.0243707 46.3664000 28.3287000 1.7767900 - 3744 3 -0.0256910 53.8282000 28.4364000 14.2462000 - 3745 3 -0.0294192 46.4048000 25.9136000 1.7138400 - 3746 3 -0.0320568 46.4709000 23.4424000 1.7994800 - 3747 3 0.1007220 58.6610000 28.2924000 6.5290600 - 3748 3 -0.0352147 46.4079000 18.4199000 1.9917400 - 3749 3 -0.0343095 46.3908000 16.0105000 1.9061300 - 3750 3 0.0503580 57.6821000 26.0821000 6.7794500 - 3751 3 -0.0417354 55.9547000 27.3878000 5.6004800 - 3752 3 0.3290490 60.0303000 26.5466000 5.5225800 - 3753 3 0.0451359 57.4394000 23.3437000 6.8485200 - 3754 3 -0.0458314 55.9862000 17.3015000 0.5604120 - 3755 3 0.0245836 57.9753000 16.0789000 1.5900800 - 3756 3 0.2712350 59.9339000 17.3566000 0.4487810 - 3757 3 -0.0441735 55.9140000 19.7200000 0.8954660 - 3758 3 0.0474552 58.0773000 18.6156000 1.9198500 - 3759 3 0.2887720 59.9313000 19.8155000 0.6192220 - 3760 3 -0.0450304 55.7797000 22.0722000 0.5765430 - 3761 3 0.0139472 57.7662000 20.9505000 2.1312000 - 3762 3 0.2333300 60.0761000 21.8195000 1.5565100 - 3763 3 -0.0461652 56.0691000 17.2027000 3.0077300 - 3764 3 0.0457993 58.0970000 16.1745000 4.0549600 - 3765 3 0.3641620 59.8963000 17.2961000 2.9467600 - 3766 3 -0.0462414 55.8916000 19.6252000 3.3009300 - 3767 3 0.0358922 58.0737000 18.5296000 4.4168900 - 3768 3 0.3303930 59.6798000 19.9831000 3.2226800 - 3769 3 -0.0531555 55.7543000 22.0944000 3.1164700 - 3770 3 0.0113054 57.6102000 21.0245000 4.5797200 - 3771 3 0.2118930 59.2967000 22.3843000 3.6612700 - 3772 3 -0.0535371 56.1110000 17.2581000 5.5206000 - 3773 3 0.0216434 58.1555000 15.9739000 6.4442000 - 3774 3 0.3915390 60.1354000 17.5534000 5.3290900 - 3775 3 -0.0535095 55.8590000 19.6067000 5.7793300 - 3776 3 0.0190552 58.1023000 18.3764000 6.8800300 - 3777 3 0.2805330 59.6035000 19.8428000 5.6653900 - 3778 3 -0.0539936 55.6962000 22.2560000 5.6312300 - 3779 3 0.0350803 57.6057000 20.7893000 7.0959200 - 3780 3 0.2620160 59.1971000 22.0318000 6.0330000 - 3781 3 -0.0511156 55.7952000 24.8407000 5.5622900 - 3782 3 0.1148230 57.9133000 28.6544000 4.2450300 - 3783 3 -0.0208884 48.4252000 29.7048000 5.6296100 - 3784 3 0.0385919 57.7327000 26.1647000 4.2685400 - 3785 3 -0.0442816 55.8167000 27.1645000 3.1159700 - 3786 3 0.2688120 59.5249000 24.7210000 2.8954500 - 3787 3 -0.0027707 57.6389000 23.7360000 4.5270300 - 3788 3 -0.0533101 55.8076000 24.6420000 3.1107900 - 3789 3 0.0400112 57.6066000 28.3662000 1.8919200 - 3790 3 -0.0206130 50.2288000 16.0059000 1.8637000 - 3791 3 0.2564240 58.8444000 26.9285000 0.6405520 - 3792 3 0.0094224 57.5021000 25.6652000 1.9218900 - 3793 3 -0.0462286 55.9114000 27.1020000 0.6110910 - 3794 2 -1.7026100 59.9123000 24.0330000 0.0289520 - 3795 3 -0.0073000 57.6755000 23.3023000 1.9501700 - 3796 3 -0.0434117 55.8114000 24.5710000 0.5465840 - 3797 3 -0.0410068 53.9631000 20.9844000 6.9011200 - 3798 3 -0.0276150 52.1131000 22.2400000 5.6316900 - 3799 3 -0.0255618 50.2181000 21.0164000 6.8699800 - 3800 3 -0.0257113 48.3475000 22.2542000 5.5148600 - 3801 3 -0.0405711 53.9992000 18.4949000 6.9562900 - 3802 3 -0.0274803 52.1278000 19.7270000 5.6188000 - 3803 3 -0.0252374 50.2115000 18.5359000 6.8308100 - 3804 3 -0.0254181 48.3303000 19.7859000 5.5796200 - 3805 3 -0.0377816 54.2095000 16.0274000 6.5658900 - 3806 3 -0.0257926 52.1303000 17.2393000 5.6167100 - 3807 3 -0.0227705 50.1688000 16.0911000 6.8075200 - 3808 3 -0.0249896 48.2706000 17.3048000 5.6050600 - 3809 3 -0.0386389 53.9491000 20.9718000 4.3763900 - 3810 3 -0.0266558 52.0636000 22.2436000 3.0792200 - 3811 3 -0.0255370 50.2702000 20.9616000 4.3558600 - 3812 3 -0.0261779 48.3874000 22.2645000 3.0501300 - 3813 3 -0.0376723 54.0236000 18.4588000 4.4353700 - 3814 3 -0.0263065 52.1271000 19.6943000 3.0749200 - 3815 3 -0.0251433 50.2652000 18.4724000 4.3604700 - 3816 3 -0.0259827 48.3140000 19.7674000 3.1332700 - 3817 3 -0.0345319 54.0740000 16.0243000 4.1289900 - 3818 3 -0.0247554 52.1138000 17.2323000 3.1240300 - 3819 3 -0.0226227 50.2201000 16.0127000 4.3440900 - 3820 3 -0.0248862 48.3295000 17.2587000 3.1431400 - 3821 3 -0.0348057 53.9297000 20.9420000 1.8583400 - 3822 3 -0.0227381 51.9910000 22.2286000 0.5653540 - 3823 3 -0.0237541 50.1949000 20.9765000 1.8393200 - 3824 3 -0.0233782 48.2990000 22.1892000 0.5546070 - 3825 3 -0.0347406 53.9978000 18.4207000 1.9435800 - 3826 3 -0.0227000 52.0507000 19.7124000 0.6220320 - 3827 3 -0.0234759 50.1970000 18.4871000 1.8785900 - 3828 3 -0.0236788 48.2588000 19.6886000 0.6805470 - 3829 3 -0.0323290 53.9693000 16.0379000 1.7059600 - 3830 3 -0.0224785 48.4199000 29.7407000 8.0838900 - 3831 3 -0.0195645 52.1160000 29.6594000 0.5753920 - 3832 3 -0.0213620 52.1306000 29.7472000 10.4912000 - 3833 3 -0.0235664 52.2092000 29.7552000 8.0321100 - 3834 3 0.3024530 59.7383000 14.9581000 2.6571700 - 3835 3 -0.0240924 52.1821000 29.7211000 5.5306900 - 3836 3 -0.0229319 52.1714000 14.9376000 7.9158300 - 3837 3 0.3748700 59.8798000 14.9219000 5.1573300 - 3838 3 -0.0370823 55.9878000 29.7461000 2.9965000 - 3839 3 -0.0171391 52.0287000 29.6646000 15.4534000 - 3840 3 -0.0469170 55.7113000 29.6722000 20.3655000 - 3841 3 -0.0214437 48.2482000 29.6492000 17.9706000 - 3842 3 0.2408430 59.6423000 29.6061000 22.8403000 - 3843 3 -0.0211195 51.9972000 29.6143000 17.9711000 - 3844 3 -0.0332844 46.3141000 23.3874000 16.7025000 - 3845 3 -0.0315056 46.2854000 25.8497000 16.6770000 - 3846 3 -0.0204971 52.0376000 29.6555000 27.8408000 - 3847 3 -0.0180098 48.2463000 29.5716000 15.5002000 - 3848 3 -0.0212006 50.1217000 25.9052000 29.0213000 - 3849 3 -0.0331222 53.9770000 28.3986000 29.0795000 - 3850 3 -0.0290528 46.2812000 28.3525000 16.6570000 - 3851 3 -0.0226747 48.1521000 27.1434000 27.7416000 - 3852 3 -0.0325365 53.9365000 23.3956000 29.0266000 - 3853 3 -0.0335954 46.2432000 23.4838000 19.1585000 - 3854 3 -0.0255831 52.0373000 24.6916000 27.8277000 - 3855 3 -0.0218406 50.1486000 23.4297000 29.0403000 - 3856 3 -0.0249214 48.2093000 24.6177000 27.8048000 - 3857 3 -0.0314649 46.2538000 26.0369000 19.2223000 - 3858 3 -0.0355584 53.9442000 28.4345000 26.6198000 - 3859 3 -0.0293628 46.2120000 28.4819000 19.1120000 - 3860 3 -0.0231419 50.1345000 28.3584000 26.5984000 - 3861 3 -0.0339462 46.2779000 23.4252000 21.5963000 - 3862 3 -0.0369436 53.9080000 25.9365000 26.5848000 - 3863 3 -0.0268484 51.9947000 27.1748000 25.3153000 - 3864 3 -0.0331876 46.1654000 25.8395000 21.7145000 - 3865 3 0.0148941 57.7821000 28.4635000 21.7072000 - 3866 3 -0.0462800 55.8056000 29.6144000 25.2509000 - 3867 3 -0.0251564 50.1149000 25.8726000 26.5546000 - 3868 3 -0.0257143 48.1833000 27.1316000 25.3100000 - 3869 3 -0.0371387 53.8968000 23.3804000 26.5202000 - 3870 3 0.2442820 59.5303000 27.6787000 20.2016000 - 3871 3 0.0703033 57.8811000 26.0056000 21.4244000 - 3872 3 -0.0458676 55.7539000 27.1294000 20.5389000 - 3873 3 0.3694260 59.7085000 24.4332000 20.0928000 - 3874 3 0.0482902 57.7752000 23.4391000 21.5653000 - 3875 3 -0.0462432 55.8755000 24.6988000 20.3287000 - 3876 3 -0.0275629 51.9983000 24.6610000 25.3453000 - 3877 3 -0.0251992 50.1394000 23.4249000 26.5526000 - 3878 3 -0.0426741 55.6667000 29.5695000 15.3573000 - 3879 3 -0.0216588 57.5010000 28.3578000 19.2135000 - 3880 3 -0.0318473 46.3232000 16.1245000 24.3218000 - 3881 3 0.1757470 59.7394000 26.6431000 17.7165000 - 3882 3 -0.0264269 48.2107000 24.6637000 25.3202000 - 3883 3 -0.0355532 53.9026000 28.4026000 24.0839000 - 3884 3 0.0277764 57.7704000 25.8642000 19.0386000 - 3885 3 -0.0521244 55.7180000 26.9795000 18.0243000 - 3886 3 0.2540530 59.9107000 24.3080000 17.7962000 - 3887 3 0.0246518 57.7383000 23.3902000 19.0702000 - 3888 3 -0.0243225 50.0400000 28.4406000 24.1242000 - 3889 3 -0.0523154 55.8311000 24.5114000 17.8589000 - 3890 3 -0.0234389 48.0699000 29.6401000 22.9721000 - 3891 3 -0.0358663 57.5282000 28.1838000 16.8055000 - 3892 3 -0.0225378 51.9773000 29.6277000 20.4569000 - 3893 3 0.1478470 59.1129000 27.2044000 15.4147000 - 3894 3 -0.0171828 57.7534000 25.6175000 16.7076000 - 3895 3 -0.0379503 53.8918000 25.9701000 24.1024000 - 3896 3 -0.0268744 51.9845000 27.1883000 22.8844000 - 3897 3 -0.0260642 50.0376000 25.9302000 24.0632000 - 3898 3 -0.0464096 55.6978000 27.1597000 15.5853000 - 3899 3 0.2489000 59.5639000 24.2794000 15.4727000 - 3900 3 0.0100249 57.8109000 23.1203000 16.6879000 - 3901 3 -0.0472573 55.7236000 24.5953000 15.4295000 - 3902 3 -0.0384843 53.9704000 20.9488000 21.8872000 - 3903 3 -0.0269516 52.0476000 22.1999000 20.4699000 - 3904 3 -0.0268509 48.0792000 27.1867000 22.8257000 - 3905 3 -0.0257188 50.1492000 20.9804000 21.6319000 - 3906 3 -0.0259893 48.1780000 22.1995000 20.3391000 - 3907 3 -0.0380944 53.9268000 23.5232000 23.9634000 - 3908 3 -0.0274676 51.9943000 24.6680000 22.8602000 - 3909 3 -0.0259233 50.1061000 23.4217000 24.0568000 - 3910 3 -0.0370358 53.8703000 18.4788000 21.5694000 - 3911 3 -0.0269565 51.9769000 19.7190000 20.4325000 - 3912 3 -0.0251249 50.0806000 18.4997000 21.6916000 - 3913 3 -0.0255699 48.1957000 19.7618000 20.3881000 - 3914 3 -0.0329284 53.9034000 15.9890000 21.5152000 - 3915 3 -0.0252670 52.0001000 17.2157000 20.3962000 - 3916 3 -0.0264171 48.1626000 24.6838000 22.8259000 - 3917 3 -0.0220106 50.0774000 15.9774000 21.6843000 - 3918 3 -0.0236335 48.1809000 17.2289000 20.4208000 - 3919 3 -0.0223826 46.2301000 28.3224000 29.0016000 - 3920 3 -0.0385181 53.9338000 20.9075000 19.4225000 - 3921 3 -0.0265658 52.0351000 22.0864000 18.0010000 - 3922 3 -0.0247776 52.0832000 27.1446000 27.8212000 - 3923 2 -1.5975800 60.3167000 26.9170000 24.2787000 - 3924 3 -0.0257496 50.1117000 20.9357000 19.1665000 - 3925 3 -0.0254118 48.1558000 22.1213000 17.8640000 - 3926 3 -0.0380542 53.9363000 18.4465000 19.1436000 - 3927 3 -0.0266151 51.9919000 19.6316000 17.9929000 - 3928 3 -0.0248764 50.0794000 18.4871000 19.2340000 - 3929 3 -0.0249761 48.2009000 19.6536000 17.9227000 - 3930 3 -0.0279241 46.3700000 25.8703000 29.0017000 - 3931 3 -0.0342364 53.9919000 15.9494000 18.9716000 - 3932 3 -0.0248102 52.0498000 17.1297000 17.9733000 - 3933 3 -0.0210394 50.0679000 16.0078000 19.2335000 - 3934 3 -0.0230334 48.2028000 17.1910000 17.9317000 - 3935 3 -0.0390258 54.0210000 20.8349000 16.9530000 - 3936 3 -0.0238572 51.9693000 22.1477000 15.4881000 - 3937 3 -0.0239016 50.1472000 20.9111000 16.7142000 - 3938 3 -0.0225286 48.2348000 22.1511000 15.4038000 - 3939 3 -0.0300931 46.3816000 23.4081000 29.0859000 - 3940 3 -0.0385712 53.9997000 18.3350000 16.7659000 - 3941 3 -0.0242068 52.0438000 19.6665000 15.5493000 - 3942 3 -0.0228323 50.1493000 18.4309000 16.7784000 - 3943 3 -0.0216818 48.2096000 19.6474000 15.5016000 - 3944 3 -0.0351837 54.0709000 15.8563000 16.4398000 - 3945 3 -0.0278381 46.1429000 28.2650000 26.4334000 - 3946 3 -0.0223849 52.1143000 17.2276000 15.5258000 - 3947 3 -0.0186461 50.1619000 15.9951000 16.7512000 - 3948 3 -0.0196493 48.2377000 17.1693000 15.4780000 - 3949 3 -0.0326167 46.2607000 21.0039000 21.6345000 - 3950 3 -0.0331814 54.0472000 25.8910000 29.0810000 - 3951 3 -0.0319799 46.3551000 18.4877000 21.6413000 - 3952 3 -0.0319910 46.3192000 25.7706000 26.5229000 - 3953 3 -0.0299750 46.3219000 16.0487000 21.6901000 - 3954 3 -0.0332920 46.2317000 20.9432000 19.1788000 - 3955 3 -0.0317942 46.2701000 18.4805000 19.1180000 - 3956 3 -0.0298937 46.3329000 15.9873000 19.1754000 - 3957 3 -0.0332819 46.3240000 23.2984000 26.5859000 - 3958 3 -0.0331621 46.2531000 20.9017000 16.7014000 - 3959 3 -0.0321510 46.2605000 18.4117000 16.6644000 - 3960 3 -0.0316966 46.1033000 28.3771000 24.0300000 - 3961 3 -0.0302020 46.2923000 15.9537000 16.7398000 - 3962 3 -0.0187301 50.2141000 28.3641000 29.0858000 - 3963 3 -0.0310982 46.1551000 28.3118000 21.5422000 - 3964 3 -0.0339300 46.2208000 25.9550000 24.1512000 - 3965 3 -0.0226876 48.2663000 24.6585000 15.4139000 - 3966 3 -0.0240988 50.1111000 23.3771000 16.7046000 - 3967 3 -0.0225342 51.9698000 24.6766000 15.4793000 - 3968 3 -0.0365833 53.8361000 23.3254000 16.6698000 - 3969 3 -0.0218064 48.1907000 27.0894000 15.4092000 - 3970 3 -0.0239032 50.0903000 25.9042000 16.7358000 - 3971 3 -0.0209404 51.9866000 27.1683000 15.4338000 - 3972 3 -0.0333639 53.8329000 25.8486000 16.7334000 - 3973 3 -0.0340933 46.2387000 23.6076000 24.0881000 - 3974 3 -0.0217771 50.1126000 28.3907000 16.6584000 - 3975 3 -0.0299150 53.8064000 28.3380000 16.7605000 - 3976 3 -0.0261626 48.1873000 24.6403000 17.9042000 - 3977 3 -0.0257394 50.0955000 23.3863000 19.1687000 - 3978 3 -0.0260858 52.0190000 24.6049000 17.9805000 - 3979 3 -0.0381062 53.9770000 23.2967000 19.0808000 - 3980 3 -0.0254630 48.1918000 27.1586000 17.8818000 - 3981 3 -0.0258696 50.0917000 25.8896000 19.2061000 - 3982 3 -0.0248699 51.9626000 27.1055000 17.9709000 - 3983 3 -0.0360550 53.8677000 25.7921000 19.2831000 - 3984 3 -0.0241348 50.1020000 28.3708000 19.2123000 - 3985 3 -0.0338841 46.3934000 18.6219000 24.2575000 - 3986 3 -0.0330986 53.8744000 28.3559000 19.2013000 - 3987 3 0.3580560 59.5191000 22.2151000 20.2591000 - 3988 3 0.0293805 57.8800000 20.8918000 21.7693000 - 3989 3 -0.0509579 55.9215000 22.0617000 20.5549000 - 3990 3 0.3195770 59.7849000 19.2434000 20.5688000 - 3991 3 0.0199569 57.7344000 18.4280000 21.6461000 - 3992 3 -0.0514239 55.8967000 19.6252000 20.4749000 - 3993 3 -0.0230472 51.9963000 29.6650000 22.8896000 - 3994 3 0.0304181 57.9069000 16.0059000 21.4439000 - 3995 3 -0.0469478 55.8730000 17.1392000 20.3338000 - 3996 3 0.2978610 59.6609000 22.0638000 17.8381000 - 3997 3 0.0194643 57.9308000 20.7149000 19.3497000 - 3998 3 -0.0546279 55.9363000 21.9124000 18.1592000 - 3999 3 0.3260800 59.9009000 19.6445000 18.3187000 - 4000 3 0.0308091 57.8648000 18.3379000 19.1748000 - 4001 3 -0.0535062 55.9507000 19.4861000 18.0754000 - 4002 3 0.3431900 59.8448000 17.2277000 18.4413000 - 4003 3 0.0238314 57.7200000 15.9634000 19.0152000 - 4004 3 -0.0486321 55.8889000 17.1180000 17.7443000 - 4005 3 0.3542640 59.5521000 21.8182000 15.3731000 - 4006 3 0.0292323 57.9679000 20.6393000 16.8761000 - 4007 3 -0.0473496 55.7822000 22.1184000 15.6695000 - 4008 3 0.3269410 60.2392000 19.3908000 16.0754000 - 4009 3 0.0440832 57.9204000 18.2439000 16.7205000 - 4010 3 -0.0417709 55.9699000 19.5813000 15.6223000 - 4011 3 0.4143400 59.3112000 16.9839000 15.2379000 - 4012 3 0.0548697 57.6904000 15.7837000 16.4622000 - 4013 3 -0.0409691 55.9071000 17.2156000 15.2562000 - 4014 3 -0.0269305 48.1455000 24.6821000 20.3683000 - 4015 3 -0.0257371 50.0875000 23.4473000 21.6128000 - 4016 3 -0.0273658 52.0023000 24.6429000 20.4553000 - 4017 3 -0.0385283 54.0089000 23.4160000 21.5022000 - 4018 3 -0.0264990 48.1359000 27.1569000 20.3649000 - 4019 3 -0.0260054 50.0635000 25.9173000 21.6291000 - 4020 3 -0.0263781 51.9974000 27.1604000 20.4589000 - 4021 3 -0.0368282 53.9106000 25.8862000 21.7275000 - 4022 3 -0.0243368 50.0556000 28.4151000 21.6833000 - 4023 3 -0.0349361 53.9161000 28.3988000 21.6463000 - 4024 3 -0.0470080 55.7412000 17.3575000 22.7947000 - 4025 3 0.0300810 57.6187000 16.0642000 23.8827000 - 4026 3 0.3027070 59.5347000 17.3106000 23.1474000 - 4027 3 -0.0517202 55.9022000 19.8407000 22.9201000 - 4028 3 0.0118903 57.6859000 18.6534000 24.1177000 - 4029 3 0.2615240 59.6179000 19.7737000 23.0127000 - 4030 3 -0.0482584 55.9804000 22.3168000 23.0112000 - 4031 3 0.0183001 57.9236000 21.1096000 24.3550000 - 4032 3 0.3314690 59.4384000 22.2908000 22.9654000 - 4033 3 -0.0469513 55.8127000 17.2586000 25.3227000 - 4034 3 0.0307594 57.6735000 15.8425000 26.5572000 - 4035 3 0.2912650 59.2131000 17.2683000 25.3590000 - 4036 3 -0.0506005 55.8523000 19.7653000 25.4562000 - 4037 3 0.0197204 57.7118000 18.4508000 26.7162000 - 4038 3 0.2570010 59.4459000 19.5852000 25.4723000 - 4039 3 -0.0340504 46.3437000 21.1250000 24.1815000 - 4040 3 0.0000895 57.6659000 28.5633000 29.1218000 - 4041 3 -0.0184412 48.2542000 29.5195000 27.9972000 - 4042 3 0.2382200 59.4593000 27.2316000 28.1814000 - 4043 3 0.0328832 57.5339000 25.7443000 28.9031000 - 4044 3 -0.0471391 55.8298000 27.1852000 27.8793000 - 4045 3 0.3048900 59.7130000 24.5673000 27.7712000 - 4046 3 0.0494212 57.5842000 23.3178000 29.0619000 - 4047 3 -0.0410571 55.7257000 24.6667000 27.5986000 - 4048 3 0.1394180 59.4517000 29.1069000 18.0240000 - 4049 3 0.0126334 57.6429000 28.5643000 26.7260000 - 4050 3 0.3282380 59.4266000 27.4672000 25.9018000 - 4051 3 0.0459713 57.7445000 25.9264000 26.5065000 - 4052 3 -0.0422294 55.8121000 27.1602000 25.5045000 - 4053 3 -0.0218907 48.1149000 29.5064000 25.5014000 - 4054 3 0.0475012 57.7170000 23.4161000 26.6412000 - 4055 3 -0.0413539 55.8754000 24.7573000 25.1495000 - 4056 3 0.0393502 57.9379000 28.4682000 24.1980000 - 4057 3 -0.0498623 55.6496000 29.4713000 17.8844000 - 4058 3 0.3579620 59.7486000 27.3034000 22.3654000 - 4059 3 0.0846827 57.9475000 26.0634000 23.8904000 - 4060 3 -0.0416706 55.9226000 27.2330000 23.0418000 - 4061 3 0.4144010 59.6836000 24.6686000 22.3777000 - 4062 3 0.0579729 57.9520000 23.6836000 24.1591000 - 4063 3 -0.0415801 55.9401000 24.7743000 22.7631000 - 4064 3 -0.0470102 55.8747000 22.2870000 25.3977000 - 4065 3 -0.0325900 53.9197000 20.9544000 29.1451000 - 4066 3 -0.0252713 51.9705000 22.2014000 27.8254000 - 4067 3 -0.0215203 50.1203000 20.9263000 29.1051000 - 4068 3 0.0163123 57.8054000 20.8790000 26.9811000 - 4069 3 0.3239580 59.4675000 22.0466000 25.7171000 - 4070 3 -0.0466434 55.8531000 17.1907000 27.8798000 - 4071 3 0.0223390 57.8382000 16.1062000 28.9463000 - 4072 3 0.2951960 59.6289000 17.3052000 27.7912000 - 4073 3 -0.0254288 48.2436000 22.1657000 27.8208000 - 4074 3 -0.0487161 55.9024000 19.6916000 28.1326000 - 4075 3 0.0165942 58.0060000 18.5228000 29.2175000 - 4076 3 -0.0233931 48.1496000 29.6441000 20.4484000 - 4077 3 0.2655730 59.6866000 19.7214000 27.9764000 - 4078 3 -0.0451442 55.7994000 22.1965000 27.8437000 - 4079 3 0.0176820 57.9561000 20.9815000 29.4661000 - 4080 3 0.3136480 59.5519000 22.1595000 28.1209000 - 4081 3 -0.0327849 53.9837000 18.3965000 29.2188000 - 4082 3 -0.0251809 52.0368000 19.6849000 27.8981000 - 4083 3 -0.0211174 50.1153000 18.4564000 29.1392000 - 4084 3 -0.0257119 48.2146000 19.6724000 27.8909000 - 4085 3 -0.0308822 53.9732000 15.9902000 29.0494000 - 4086 3 -0.0237809 52.0726000 17.2004000 27.8785000 - 4087 3 -0.0190504 50.1298000 16.0088000 29.1338000 - 4088 3 -0.0242244 48.2102000 17.1858000 27.9164000 - 4089 3 -0.0371550 53.9334000 20.9066000 26.7264000 - 4090 3 -0.0273229 51.9874000 22.1764000 25.3235000 - 4091 3 -0.0251048 50.1075000 20.9130000 26.6023000 - 4092 3 -0.0264908 48.2493000 22.1835000 25.3443000 - 4093 3 -0.0365670 53.9622000 18.4583000 26.6562000 - 4094 3 -0.0265758 52.0318000 19.6912000 25.4020000 - 4095 3 -0.0250548 50.1330000 18.4146000 26.6852000 - 4096 3 -0.0264955 48.2823000 19.7044000 25.4177000 - 4097 3 -0.0333169 53.9648000 16.0243000 26.5592000 - 4098 3 -0.0255533 52.0420000 17.2120000 25.3658000 - 4099 3 -0.0227575 50.1345000 15.9474000 26.6791000 - 4100 3 -0.0252664 48.2595000 17.2185000 25.4445000 - 4101 3 -0.0378319 53.9663000 21.0358000 24.2893000 - 4102 3 -0.0270289 52.0423000 22.1827000 22.8960000 - 4103 3 -0.0258445 50.1433000 20.9454000 24.1097000 - 4104 3 -0.0259965 48.2046000 22.2165000 22.8162000 - 4105 3 -0.0367784 53.9188000 18.5513000 24.0845000 - 4106 3 -0.0268339 52.0156000 19.7186000 22.8964000 - 4107 3 -0.0256674 50.1773000 18.4594000 24.1749000 - 4108 3 -0.0260103 48.2370000 19.7738000 22.9121000 - 4109 3 -0.0330134 53.9629000 16.0622000 24.0630000 - 4110 3 -0.0254280 52.0206000 17.2449000 22.8686000 - 4111 3 -0.0229569 50.1378000 15.9634000 24.1728000 - 4112 3 -0.0243826 48.2441000 17.2526000 22.9462000 - 4113 3 -0.0321034 46.3987000 20.9352000 29.1261000 - 4114 3 -0.0343693 46.4246000 18.4726000 29.1960000 - 4115 3 -0.0329440 46.4132000 15.9662000 29.2095000 - 4116 3 -0.0345617 46.3267000 20.8373000 26.6296000 - 4117 3 -0.0358395 46.3295000 18.3585000 26.6877000 - 4118 3 -0.0344154 46.2979000 15.9382000 26.7743000 - 4119 3 0.1673490 59.1921000 29.6743000 15.4677000 - 4120 3 0.2994070 59.4640000 14.9872000 17.7896000 - 4121 3 -0.0499140 55.8210000 29.6900000 27.9096000 - 4122 3 -0.0227879 52.0164000 29.6528000 25.3616000 - 4123 3 -0.0439987 55.8257000 14.8862000 22.6898000 - 4124 3 -0.0449410 55.8639000 29.7222000 22.7932000 - 4125 3 0.4011260 60.2539000 24.9842000 24.5885000 - 4126 3 0.2888120 59.4294000 14.9051000 25.3258000 diff --git a/examples/reaxff/water/gauss_exp.txt b/examples/reaxff/water/gauss_exp.txt new file mode 100644 index 0000000000..4210471e9f --- /dev/null +++ b/examples/reaxff/water/gauss_exp.txt @@ -0,0 +1,5 @@ +# Gaussian orbital exponents (required for fix qtpie/reaxff) taken from Table 2.2 +# of Chen, J. (2009). Theory and applications of fluctuating-charge models. +# The units of the exponents are 1 / (Bohr radius)^2 . +1 0.2240 # O +2 0.5434 # H diff --git a/examples/reaxff/water/in.water.qtpie b/examples/reaxff/water/in.water.qtpie new file mode 100644 index 0000000000..a8f8759444 --- /dev/null +++ b/examples/reaxff/water/in.water.qtpie @@ -0,0 +1,29 @@ +# QTPIE Water + +boundary p p p +units real +atom_style charge + +read_data data.water + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * qeq_ff.water O H +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all qtpie/reaxff 1 0.0 10.0 1.0e-6 reaxff gauss_exp.txt +fix 2 all nvt temp 300 300 50.0 + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 diff --git a/examples/reaxff/water/in.water.qtpie.field b/examples/reaxff/water/in.water.qtpie.field new file mode 100644 index 0000000000..e5ac77484f --- /dev/null +++ b/examples/reaxff/water/in.water.qtpie.field @@ -0,0 +1,30 @@ +# QTPIE Water + +boundary p p p +units real +atom_style charge + +read_data data.water + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * qeq_ff.water O H +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all qtpie/reaxff 1 0.0 10.0 1.0e-6 reaxff gauss_exp.txt +fix 2 all nvt temp 300 300 50.0 +fix 3 all efield 0.0 0.0 0.05 + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 diff --git a/examples/reaxff/water/log.29Aug24.reaxff.water-qtpie-field.g++.1 b/examples/reaxff/water/log.29Aug24.reaxff.water-qtpie-field.g++.1 new file mode 100644 index 0000000000..33221ff080 --- /dev/null +++ b/examples/reaxff/water/log.29Aug24.reaxff.water-qtpie-field.g++.1 @@ -0,0 +1,127 @@ +LAMMPS (29 Aug 2024 - Development - patch_29Aug2024-76-g3f232caf9b) + using 1 OpenMP thread(s) per MPI task +# QTPIE Water + +boundary p p p +units real +atom_style charge + +read_data data.water +Reading data file ... + orthogonal box = (0 0 0) to (31.043046 31.043046 31.043046) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 3000 atoms + read_data CPU = 0.056 seconds + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z +replicate 1 $y $z +replicate 1 1 $z +replicate 1 1 1 +Replication is creating a 1x1x1 = 1 times larger system... + orthogonal box = (0 0 0) to (31.043046 31.043046 31.043046) + 1 by 1 by 1 MPI processor grid + 3000 atoms + replicate CPU = 0.001 seconds + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * qeq_ff.water O H +WARNING: Changed valency_val to valency_boc for X (src/REAXFF/reaxff_ffield.cpp:294) +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all qtpie/reaxff 1 0.0 10.0 1.0e-6 reaxff gauss_exp.txt +fix 2 all nvt temp 300 300 50.0 +fix 3 all efield 0.0 0.0 0.05 + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- Type Label Framework: https://doi.org/10.1021/acs.jpcb.3c08419 + +@Article{Gissinger24, + author = {Jacob R. Gissinger, Ilia Nikiforov, Yaser Afshar, Brendon Waters, Moon-ki Choi, Daniel S. Karls, Alexander Stukowski, Wonpil Im, Hendrik Heinz, Axel Kohlmeyer, and Ellad B. Tadmor}, + title = {Type Label Framework for Bonded Force Fields in LAMMPS}, + journal = {J. Phys. Chem. B}, + year = 2024, + volume = 128, + number = 13, + pages = {3282–-3297} +} + +- pair reaxff command: doi:10.1016/j.parco.2011.08.005 + +@Article{Aktulga12, + author = {H. M. Aktulga and J. C. Fogarty and S. A. Pandit and A. Y. Grama}, + title = {Parallel Reactive Molecular Dynamics: {N}umerical Methods and Algorithmic Techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + number = {4--5}, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/ghost/newtoff + stencil: full/ghost/bin/3d + bin: standard + (2) fix qtpie/reaxff, perpetual, copy from (1) + attributes: half, newton off + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 539.2 | 539.2 | 539.2 Mbytes + Step Temp Press Density Volume + 0 300 10137.041 1 29915.273 + 10 296.09128 3564.7969 1 29915.273 + 20 293.04308 10299.201 1 29915.273 +Loop time of 10.7863 on 1 procs for 20 steps with 3000 atoms + +Performance: 0.080 ns/day, 299.620 hours/ns, 1.854 timesteps/s, 5.563 katom-step/s +100.0% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 4.7275 | 4.7275 | 4.7275 | 0.0 | 43.83 +Neigh | 0.17533 | 0.17533 | 0.17533 | 0.0 | 1.63 +Comm | 0.0017376 | 0.0017376 | 0.0017376 | 0.0 | 0.02 +Output | 8.2065e-05 | 8.2065e-05 | 8.2065e-05 | 0.0 | 0.00 +Modify | 5.8812 | 5.8812 | 5.8812 | 0.0 | 54.52 +Other | | 0.0005226 | | | 0.00 + +Nlocal: 3000 ave 3000 max 3000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 11077 ave 11077 max 11077 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 971775 ave 971775 max 971775 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 971775 +Ave neighs/atom = 323.925 +Neighbor list builds = 2 +Dangerous builds = 0 +Total wall time: 0:00:12 diff --git a/examples/reaxff/water/log.29Aug24.reaxff.water-qtpie-field.g++.4 b/examples/reaxff/water/log.29Aug24.reaxff.water-qtpie-field.g++.4 new file mode 100644 index 0000000000..07a348604e --- /dev/null +++ b/examples/reaxff/water/log.29Aug24.reaxff.water-qtpie-field.g++.4 @@ -0,0 +1,127 @@ +LAMMPS (29 Aug 2024 - Development - patch_29Aug2024-76-g3f232caf9b) + using 1 OpenMP thread(s) per MPI task +# QTPIE Water + +boundary p p p +units real +atom_style charge + +read_data data.water +Reading data file ... + orthogonal box = (0 0 0) to (31.043046 31.043046 31.043046) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 3000 atoms + read_data CPU = 0.053 seconds + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z +replicate 1 $y $z +replicate 1 1 $z +replicate 1 1 1 +Replication is creating a 1x1x1 = 1 times larger system... + orthogonal box = (0 0 0) to (31.043046 31.043046 31.043046) + 1 by 2 by 2 MPI processor grid + 3000 atoms + replicate CPU = 0.002 seconds + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * qeq_ff.water O H +WARNING: Changed valency_val to valency_boc for X (src/REAXFF/reaxff_ffield.cpp:294) +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all qtpie/reaxff 1 0.0 10.0 1.0e-6 reaxff gauss_exp.txt +fix 2 all nvt temp 300 300 50.0 +fix 3 all efield 0.0 0.0 0.05 + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- Type Label Framework: https://doi.org/10.1021/acs.jpcb.3c08419 + +@Article{Gissinger24, + author = {Jacob R. Gissinger, Ilia Nikiforov, Yaser Afshar, Brendon Waters, Moon-ki Choi, Daniel S. Karls, Alexander Stukowski, Wonpil Im, Hendrik Heinz, Axel Kohlmeyer, and Ellad B. Tadmor}, + title = {Type Label Framework for Bonded Force Fields in LAMMPS}, + journal = {J. Phys. Chem. B}, + year = 2024, + volume = 128, + number = 13, + pages = {3282–-3297} +} + +- pair reaxff command: doi:10.1016/j.parco.2011.08.005 + +@Article{Aktulga12, + author = {H. M. Aktulga and J. C. Fogarty and S. A. Pandit and A. Y. Grama}, + title = {Parallel Reactive Molecular Dynamics: {N}umerical Methods and Algorithmic Techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + number = {4--5}, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/ghost/newtoff + stencil: full/ghost/bin/3d + bin: standard + (2) fix qtpie/reaxff, perpetual, copy from (1) + attributes: half, newton off + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 260.5 | 262.2 | 263.6 Mbytes + Step Temp Press Density Volume + 0 300 10137.041 1 29915.273 + 10 296.09128 3564.7969 1 29915.273 + 20 293.04308 10299.201 1 29915.273 +Loop time of 3.14492 on 4 procs for 20 steps with 3000 atoms + +Performance: 0.275 ns/day, 87.359 hours/ns, 6.359 timesteps/s, 19.078 katom-step/s +99.6% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.6557 | 1.6847 | 1.7281 | 2.1 | 53.57 +Neigh | 0.086503 | 0.086968 | 0.087627 | 0.2 | 2.77 +Comm | 0.003309 | 0.046699 | 0.075729 | 12.4 | 1.48 +Output | 5.0156e-05 | 5.483e-05 | 6.8111e-05 | 0.0 | 0.00 +Modify | 1.3254 | 1.3261 | 1.3266 | 0.0 | 42.16 +Other | | 0.0004552 | | | 0.01 + +Nlocal: 750 ave 760 max 735 min +Histogram: 1 0 0 0 1 0 0 0 0 2 +Nghost: 6230.5 ave 6253 max 6193 min +Histogram: 1 0 0 0 0 0 1 0 1 1 +Neighs: 276995 ave 280886 max 271360 min +Histogram: 1 0 0 0 1 0 0 0 1 1 + +Total # of neighbors = 1107981 +Ave neighs/atom = 369.327 +Neighbor list builds = 2 +Dangerous builds = 0 +Total wall time: 0:00:03 diff --git a/examples/reaxff/water/log.29Aug24.reaxff.water-qtpie.g++.1 b/examples/reaxff/water/log.29Aug24.reaxff.water-qtpie.g++.1 new file mode 100644 index 0000000000..1187a755ee --- /dev/null +++ b/examples/reaxff/water/log.29Aug24.reaxff.water-qtpie.g++.1 @@ -0,0 +1,126 @@ +LAMMPS (29 Aug 2024 - Development - patch_29Aug2024-76-g3f232caf9b) + using 1 OpenMP thread(s) per MPI task +# QTPIE Water + +boundary p p p +units real +atom_style charge + +read_data data.water +Reading data file ... + orthogonal box = (0 0 0) to (31.043046 31.043046 31.043046) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 3000 atoms + read_data CPU = 0.055 seconds + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z +replicate 1 $y $z +replicate 1 1 $z +replicate 1 1 1 +Replication is creating a 1x1x1 = 1 times larger system... + orthogonal box = (0 0 0) to (31.043046 31.043046 31.043046) + 1 by 1 by 1 MPI processor grid + 3000 atoms + replicate CPU = 0.001 seconds + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * qeq_ff.water O H +WARNING: Changed valency_val to valency_boc for X (src/REAXFF/reaxff_ffield.cpp:294) +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all qtpie/reaxff 1 0.0 10.0 1.0e-6 reaxff gauss_exp.txt +fix 2 all nvt temp 300 300 50.0 + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- Type Label Framework: https://doi.org/10.1021/acs.jpcb.3c08419 + +@Article{Gissinger24, + author = {Jacob R. Gissinger, Ilia Nikiforov, Yaser Afshar, Brendon Waters, Moon-ki Choi, Daniel S. Karls, Alexander Stukowski, Wonpil Im, Hendrik Heinz, Axel Kohlmeyer, and Ellad B. Tadmor}, + title = {Type Label Framework for Bonded Force Fields in LAMMPS}, + journal = {J. Phys. Chem. B}, + year = 2024, + volume = 128, + number = 13, + pages = {3282–-3297} +} + +- pair reaxff command: doi:10.1016/j.parco.2011.08.005 + +@Article{Aktulga12, + author = {H. M. Aktulga and J. C. Fogarty and S. A. Pandit and A. Y. Grama}, + title = {Parallel Reactive Molecular Dynamics: {N}umerical Methods and Algorithmic Techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + number = {4--5}, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/ghost/newtoff + stencil: full/ghost/bin/3d + bin: standard + (2) fix qtpie/reaxff, perpetual, copy from (1) + attributes: half, newton off + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 539.2 | 539.2 | 539.2 Mbytes + Step Temp Press Density Volume + 0 300 10138.375 1 29915.273 + 10 295.97879 3575.2769 1 29915.273 + 20 292.76583 10309.128 1 29915.273 +Loop time of 10.8138 on 1 procs for 20 steps with 3000 atoms + +Performance: 0.080 ns/day, 300.383 hours/ns, 1.849 timesteps/s, 5.548 katom-step/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 4.7177 | 4.7177 | 4.7177 | 0.0 | 43.63 +Neigh | 0.17607 | 0.17607 | 0.17607 | 0.0 | 1.63 +Comm | 0.0017295 | 0.0017295 | 0.0017295 | 0.0 | 0.02 +Output | 8.5431e-05 | 8.5431e-05 | 8.5431e-05 | 0.0 | 0.00 +Modify | 5.9177 | 5.9177 | 5.9177 | 0.0 | 54.72 +Other | | 0.0004911 | | | 0.00 + +Nlocal: 3000 ave 3000 max 3000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 11077 ave 11077 max 11077 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 971830 ave 971830 max 971830 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 971830 +Ave neighs/atom = 323.94333 +Neighbor list builds = 2 +Dangerous builds = 0 +Total wall time: 0:00:12 diff --git a/examples/reaxff/water/log.29Aug24.reaxff.water-qtpie.g++.4 b/examples/reaxff/water/log.29Aug24.reaxff.water-qtpie.g++.4 new file mode 100644 index 0000000000..372156b6a2 --- /dev/null +++ b/examples/reaxff/water/log.29Aug24.reaxff.water-qtpie.g++.4 @@ -0,0 +1,126 @@ +LAMMPS (29 Aug 2024 - Development - patch_29Aug2024-76-g3f232caf9b) + using 1 OpenMP thread(s) per MPI task +# QTPIE Water + +boundary p p p +units real +atom_style charge + +read_data data.water +Reading data file ... + orthogonal box = (0 0 0) to (31.043046 31.043046 31.043046) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 3000 atoms + read_data CPU = 0.053 seconds + +variable x index 1 +variable y index 1 +variable z index 1 + +replicate $x $y $z +replicate 1 $y $z +replicate 1 1 $z +replicate 1 1 1 +Replication is creating a 1x1x1 = 1 times larger system... + orthogonal box = (0 0 0) to (31.043046 31.043046 31.043046) + 1 by 2 by 2 MPI processor grid + 3000 atoms + replicate CPU = 0.002 seconds + +pair_style reaxff NULL safezone 3.0 mincap 150 +pair_coeff * * qeq_ff.water O H +WARNING: Changed valency_val to valency_boc for X (src/REAXFF/reaxff_ffield.cpp:294) +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +velocity all create 300.0 4928459 rot yes dist gaussian + +fix 1 all qtpie/reaxff 1 0.0 10.0 1.0e-6 reaxff gauss_exp.txt +fix 2 all nvt temp 300 300 50.0 + +timestep 0.5 +thermo 10 +thermo_style custom step temp press density vol + +run 20 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- Type Label Framework: https://doi.org/10.1021/acs.jpcb.3c08419 + +@Article{Gissinger24, + author = {Jacob R. Gissinger, Ilia Nikiforov, Yaser Afshar, Brendon Waters, Moon-ki Choi, Daniel S. Karls, Alexander Stukowski, Wonpil Im, Hendrik Heinz, Axel Kohlmeyer, and Ellad B. Tadmor}, + title = {Type Label Framework for Bonded Force Fields in LAMMPS}, + journal = {J. Phys. Chem. B}, + year = 2024, + volume = 128, + number = 13, + pages = {3282–-3297} +} + +- pair reaxff command: doi:10.1016/j.parco.2011.08.005 + +@Article{Aktulga12, + author = {H. M. Aktulga and J. C. Fogarty and S. A. Pandit and A. Y. Grama}, + title = {Parallel Reactive Molecular Dynamics: {N}umerical Methods and Algorithmic Techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + number = {4--5}, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 6 6 6 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/ghost/newtoff + stencil: full/ghost/bin/3d + bin: standard + (2) fix qtpie/reaxff, perpetual, copy from (1) + attributes: half, newton off + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 260.5 | 262.2 | 263.6 Mbytes + Step Temp Press Density Volume + 0 300 10138.375 1 29915.273 + 10 295.97879 3575.2769 1 29915.273 + 20 292.76583 10309.128 1 29915.273 +Loop time of 3.13598 on 4 procs for 20 steps with 3000 atoms + +Performance: 0.276 ns/day, 87.111 hours/ns, 6.378 timesteps/s, 19.133 katom-step/s +99.6% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.6622 | 1.695 | 1.7252 | 2.2 | 54.05 +Neigh | 0.086543 | 0.087117 | 0.087848 | 0.2 | 2.78 +Comm | 0.0048192 | 0.035002 | 0.067754 | 15.4 | 1.12 +Output | 4.8033e-05 | 5.3375e-05 | 6.6893e-05 | 0.0 | 0.00 +Modify | 1.3176 | 1.3183 | 1.3189 | 0.0 | 42.04 +Other | | 0.0004753 | | | 0.02 + +Nlocal: 750 ave 760 max 735 min +Histogram: 1 0 0 0 1 0 0 0 0 2 +Nghost: 6229.5 ave 6253 max 6191 min +Histogram: 1 0 0 0 0 0 1 0 1 1 +Neighs: 277011 ave 280900 max 271380 min +Histogram: 1 0 0 0 1 0 0 0 1 1 + +Total # of neighbors = 1108044 +Ave neighs/atom = 369.348 +Neighbor list builds = 2 +Dangerous builds = 0 +Total wall time: 0:00:03 diff --git a/examples/threebody/log.08Oct24.mos2.sw.mod.g++.4 b/examples/threebody/log.08Oct24.mos2.sw.mod.g++.4 new file mode 100644 index 0000000000..f0941f2532 --- /dev/null +++ b/examples/threebody/log.08Oct24.mos2.sw.mod.g++.4 @@ -0,0 +1,102 @@ +LAMMPS (29 Aug 2024 - Development - patch_29Aug2024-512-g13c57ab9b5) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# monolayer MoS2 +units metal +boundary p p f +processors * * 1 + +atom_style atomic +read_data single_layer_MoS2.data +Reading data file ... + triclinic box = (0 0 -100) to (51.15232 44.299209 100) with tilt (25.57616 0 0) +WARNING: Triclinic box skew is large. LAMMPS will run inefficiently. (src/domain.cpp:221) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 768 atoms + read_data CPU = 0.003 seconds + +mass * 32.065 # mass of sulphur atom , uint: a.u.=1.66X10^(-27)kg +mass 1 95.94 # mass of molebdenum atom , uint: a.u.=1.66X10^(-27)kg + +########################## Define potentials ################################ +pair_style sw/mod maxdelcs 0.25 0.35 +pair_coeff * * tmd.sw.mod Mo S S +Reading sw potential file tmd.sw.mod with DATE: 2018-03-26 +######################################################################### + +### Simulation settings #### +timestep 0.001 +velocity all create 300.0 12345 + +############################ + +# Output +thermo 500 +thermo_style custom step etotal pe ke temp +thermo_modify lost warn + +###### Run molecular dynamics ###### +fix thermostat all nve +run 5000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: +- Type Label Framework: https://doi.org/10.1021/acs.jpcb.3c08419 +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.158796 + ghost atom cutoff = 5.158796 + binsize = 2.579398, bins = 30 18 78 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair sw/mod, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.165 | 3.165 | 3.165 Mbytes + Step TotEng PotEng KinEng Temp + 0 -899.28605 -929.02881 29.742759 300 + 500 -899.28626 -922.45519 23.168929 233.69313 + 1000 -899.29247 -925.86547 26.573002 268.02828 + 1500 -899.27957 -916.95478 17.675214 178.28084 + 2000 -899.28171 -918.38728 19.105573 192.70814 + 2500 -899.28732 -922.50423 23.21691 234.17709 + 3000 -899.28195 -918.74112 19.459174 196.27473 + 3500 -899.27944 -918.03105 18.751604 189.13784 + 4000 -899.28397 -920.50737 21.223397 214.06955 + 4500 -899.28386 -919.79154 20.507685 206.85053 + 5000 -899.28077 -918.78947 19.508698 196.77425 +Loop time of 0.595509 on 4 procs for 5000 steps with 768 atoms + +Performance: 725.430 ns/day, 0.033 hours/ns, 8396.182 timesteps/s, 6.448 Matom-step/s +99.9% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.4603 | 0.49732 | 0.54269 | 4.2 | 83.51 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.03293 | 0.078347 | 0.11558 | 10.6 | 13.16 +Output | 0.00010079 | 0.00010935 | 0.00012827 | 0.0 | 0.02 +Modify | 0.0073413 | 0.0082665 | 0.0091767 | 0.7 | 1.39 +Other | | 0.01146 | | | 1.92 + +Nlocal: 192 ave 194 max 190 min +Histogram: 1 0 0 0 0 2 0 0 0 1 +Nghost: 194 ave 196 max 192 min +Histogram: 1 0 0 0 0 2 0 0 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 5120 ave 5170 max 5070 min +Histogram: 1 0 0 0 0 2 0 0 0 1 + +Total # of neighbors = 20480 +Ave neighs/atom = 26.666667 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/tracker/contact_history.dat b/examples/tracker/contact_history.dat index 898aab4ef6..e5889a0642 100644 --- a/examples/tracker/contact_history.dat +++ b/examples/tracker/contact_history.dat @@ -1,8122 +1,20813 @@ -16 68 0 0.5 -17 37 0 0.5 -162 210 0 0.5 -174 163 0 0.5 -179 255 0 0.5 -96 161 0 0.505 -111 162 0 0.505 -156 231 0 0.505 -210 150 0 0.505 -226 246 0 0.505 -254 202 0 0.505 -31 82 0 0.51 -95 144 0 0.51 -116 80 0 0.51 -143 255 0 0.51 -153 165 0 0.51 -192 240 0 0.51 -227 247 0 0.51 -12 124 0 0.515 -18 39 0 0.515 -22 102 0 0.515 -34 55 0 0.515 -62 78 0 0.515 -128 188 0 0.515 -146 134 0 0.515 -50 14 0 0.52 -58 74 0 0.52 -69 134 0 0.52 -126 186 0 0.52 -143 242 0 0.52 -167 227 0 0.52 -213 37 0 0.52 -52 8 0 0.525 -69 149 0 0.525 -93 26 0 0.525 -154 144 0 0.525 -156 236 0 0.525 -180 228 0 0.525 -180 197 0 0.525 -256 1 0 0.525 -59 123 0 0.53 -84 160 0 0.53 -105 165 0 0.53 -154 151 0 0.53 -156 213 0 0.53 -158 99 0 0.53 -192 251 0 0.53 -217 21 0 0.53 -254 208 0 0.53 -31 84 0 0.535 -66 146 0 0.535 -77 129 0 0.535 -181 229 0 0.535 -203 54 0 0.535 -244 208 0 0.535 -99 174 0 0.54 -109 157 0 0.54 -187 236 0 0.54 -249 192 0 0.54 -6 54 0 0.545 -96 144 0 0.545 -109 169 0 0.545 -115 182 0 0.545 -131 206 0 0.545 -176 228 0 0.545 -203 14 0 0.545 -224 41 0 0.545 -228 256 0 0.545 -247 56 0 0.545 -18 86 0 0.55 -34 255 0 0.55 -45 90 0 0.55 -59 124 0 0.55 -111 164 0 0.55 -117 183 0.035 0.55 -193 221 0 0.55 -223 1 0 0.55 -242 206 0 0.55 -249 201 0 0.55 -256 14 0 0.55 -3 115 0 0.555 -92 165 0 0.555 -108 186 0 0.555 -128 144 0 0.555 -146 214 0 0.555 -166 246 0 0.555 -219 93 0.045 0.555 -15 68 0 0.56 -76 130 0.06 0.56 -105 123 0 0.56 -124 72 0 0.56 -137 128 0 0.56 -164 212 0 0.56 -194 207 0 0.56 -194 14 0 0.56 -244 63 0 0.56 -1 16 0 0.565 -20 100 0 0.565 -41 53 0 0.565 -76 154 0 0.565 -103 171 0 0.565 -119 246 0.045 0.565 -144 222 0 0.565 -167 155 0 0.565 -170 175 0 0.565 -241 36 0.065 0.565 -244 56 0 0.565 -28 109 0 0.57 -53 60 0 0.57 -55 123 0 0.57 -87 102 0.065 0.57 -176 256 0 0.57 -194 6 0 0.57 -233 232 0 0.57 -249 135 0 0.57 -11 123 0 0.575 -55 98 0 0.575 -71 183 0 0.575 -145 160 0 0.575 -174 162 0 0.575 -209 1 0 0.575 -38 98 0 0.58 -55 114 0 0.58 -62 242 0 0.58 -68 88 0 0.58 -86 38 0 0.58 -92 152 0 0.58 -112 100 0 0.58 -198 2 0 0.58 -229 241 0 0.58 -8 68 0 0.585 -11 186 0.07 0.585 -48 108 0 0.585 -71 131 0 0.585 -146 87 0 0.585 -165 156 0 0.585 -171 236 0 0.585 -208 193 0 0.585 -210 230 0 0.585 -224 28 0 0.585 -1 31 0 0.59 -3 116 0 0.59 -31 68 0 0.59 -78 27 0 0.59 -154 172 0 0.59 -179 227 0 0.59 -215 2 0 0.59 -231 53 0 0.59 -238 168 0.09 0.59 -15 81 0 0.595 -17 22 0.06 0.595 -45 28 0 0.595 -73 25 0 0.595 -78 84 0 0.595 -104 124 0 0.595 -137 77 0 0.595 -148 228 0 0.595 -162 148 0 0.595 -76 217 0.05 0.6 -116 130 0 0.6 -125 75 0 0.6 -144 218 0 0.6 -177 242 0 0.6 -179 195 0 0.6 -207 50 0 0.6 -45 106 0 0.605 -50 15 0 0.605 -120 129 0 0.605 -163 183 0 0.605 -180 195 0 0.605 -252 53 0 0.605 -6 69 0 0.61 -15 66 0 0.61 -15 29 0 0.61 -69 121 0 0.61 -82 162 0 0.61 -97 158 0 0.61 -97 162 0 0.61 -160 212 0 0.61 -191 251 0 0.61 -215 19 0 0.61 -15 5 0.045 0.615 -22 105 0 0.615 -38 105 0 0.615 -48 126 0 0.615 -78 29 0 0.615 -78 32 0 0.615 -145 151 0.07 0.615 -147 223 0 0.615 -156 229 0 0.615 -206 1 0 0.615 -207 78 0.06 0.615 -224 228 0 0.615 -24 84 0 0.62 -47 100 0 0.62 -88 156 0 0.62 -127 186 0 0.62 -158 163 0 0.62 -168 246 0 0.62 -253 206 0.04 0.62 -31 66 0 0.625 -70 92 0 0.625 -115 131 0 0.625 -177 225 0 0.625 -210 34 0 0.625 -234 246 0 0.625 -244 64 0 0.625 -23 103 0 0.63 -51 15 0 0.63 -91 88 0.045 0.63 -103 183 0 0.63 -106 11 0.03 0.63 -113 3 0 0.63 -140 152 0 0.63 -158 100 0 0.63 -166 184 0 0.63 -194 18 0 0.63 -252 56 0 0.63 -25 87 0.045 0.635 -125 11 0 0.635 -181 230 0 0.635 -193 253 0 0.635 -196 216 0 0.635 -214 37 0 0.635 -254 251 0 0.635 -1 19 0 0.64 -16 128 0 0.64 -27 75 0 0.64 -38 121 0 0.64 -68 82 0 0.64 -133 132 0 0.64 -135 9 0.135 0.64 -179 49 0.085 0.64 -184 232 0 0.64 -249 179 0.05 0.64 -20 22 0.05 0.645 -31 3 0 0.645 -115 129 0 0.645 -132 161 0.09 0.645 -193 62 0 0.645 -245 41 0.11 0.645 -137 192 0 0.65 -144 223 0 0.65 -147 175 0 0.65 -177 253 0 0.65 -193 5 0 0.65 -4 33 0.06 0.655 -31 65 0 0.655 -32 81 0 0.655 -57 125 0 0.655 -62 206 0 0.655 -81 132 0.05 0.655 -159 14 0.035 0.655 -210 37 0 0.655 -215 232 0.06 0.655 -222 14 0 0.655 -256 48 0 0.655 -4 29 0 0.66 -13 27 0 0.66 -14 32 0 0.66 -23 20 0.12 0.66 -82 161 0 0.66 -125 102 0.04 0.66 -177 141 0 0.66 -200 56 0 0.66 -238 242 0 0.66 -245 135 0 0.66 -250 204 0 0.66 -48 121 0 0.665 -57 102 0 0.665 -66 129 0 0.665 -134 201 0 0.665 -148 238 0 0.665 -161 212 0.045 0.665 -171 251 0 0.665 -189 169 0 0.665 -227 45 0.095 0.665 -21 1 0 0.67 -32 80 0 0.67 -54 12 0 0.67 -101 92 0 0.67 -103 151 0 0.67 -175 221 0 0.67 -196 8 0 0.67 -4 23 0.105 0.675 -84 132 0 0.675 -114 182 0 0.675 -118 98 0 0.675 -126 129 0 0.675 -133 145 0 0.675 -138 205 0 0.675 -175 223 0.125 0.675 -199 211 0 0.675 -209 197 0 0.675 -223 227 0 0.675 -225 255 0 0.675 -9 29 0 0.68 -33 22 0.04 0.68 -39 87 0 0.68 -52 66 0 0.68 -56 121 0 0.68 -72 91 0.17 0.68 -73 85 0 0.68 -103 163 0 0.68 -154 140 0 0.68 -202 222 0 0.68 -211 31 0 0.68 -33 81 0 0.685 -83 76 0.055 0.685 -147 168 0.07 0.685 -148 17 0.155 0.685 -148 216 0 0.685 -194 223 0 0.685 -216 20 0 0.685 -217 9 0 0.685 -232 252 0 0.685 -233 250 0.065 0.685 -54 11 0 0.69 -77 189 0 0.69 -97 145 0 0.69 -141 130 0.065 0.69 -186 129 0.045 0.69 -196 197 0 0.69 -219 239 0.18 0.69 -224 251 0.05 0.69 -247 39 0 0.69 -38 36 0.055 0.695 -62 208 0 0.695 -71 188 0 0.695 -159 211 0 0.695 -176 162 0.045 0.695 -245 250 0.08 0.695 -246 232 0 0.695 -24 36 0.17 0.7 -26 86 0 0.7 -54 121 0 0.7 -76 88 0 0.7 -159 203 0.115 0.7 -162 225 0 0.7 -165 151 0 0.7 -206 2 0 0.7 -243 252 0.05 0.7 -251 239 0 0.7 -4 24 0 0.705 -7 75 0 0.705 -27 95 0 0.705 -77 127 0 0.705 -88 136 0 0.705 -125 190 0 0.705 -193 14 0 0.705 -234 252 0 0.705 -30 34 0 0.71 -91 144 0 0.71 -102 183 0.13 0.71 -217 200 0 0.71 -72 132 0 0.715 -76 139 0 0.715 -91 103 0 0.715 -134 188 0 0.715 -142 149 0.17 0.715 -159 207 0 0.715 -28 48 0 0.72 -28 108 0 0.72 -90 102 0 0.72 -209 229 0 0.72 -235 255 0 0.72 -240 36 0 0.72 -3 79 0 0.725 -20 37 0 0.725 -26 89 0 0.725 -97 173 0 0.725 -134 246 0 0.725 -207 10 0 0.725 -209 21 0 0.725 -231 33 0.13 0.725 -247 34 0 0.725 -72 152 0 0.73 -196 21 0 0.73 -206 211 0 0.73 -232 55 0 0.73 -43 122 0.085 0.735 -109 122 0.08 0.735 -132 163 0.205 0.735 -134 144 0.045 0.735 -148 30 0.09 0.735 -157 139 0 0.735 -178 226 0.185 0.735 -231 243 0 0.735 -11 79 0 0.74 -19 87 0 0.74 -30 238 0 0.74 -75 139 0 0.74 -76 188 0 0.74 -76 144 0 0.74 -107 237 0.075 0.74 -113 67 0 0.74 -120 183 0 0.74 -131 196 0 0.74 -133 85 0.145 0.74 -159 29 0.055 0.74 -182 130 0 0.74 -196 213 0 0.74 -214 245 0.05 0.74 -230 252 0 0.74 -249 232 0 0.74 -26 12 0 0.745 -27 73 0 0.745 -79 66 0 0.745 -85 153 0.15 0.745 -89 19 0.18 0.745 -149 209 0 0.745 -150 155 0 0.745 -155 235 0 0.745 -192 131 0.24 0.745 -4 47 0.05 0.75 -6 26 0.25 0.75 -74 29 0 0.75 -76 156 0 0.75 -87 165 0 0.75 -157 222 0 0.75 -159 194 0 0.75 -164 184 0 0.75 -196 52 0 0.75 -239 32 0 0.75 -43 111 0.13 0.755 -101 169 0.22 0.755 -166 234 0 0.755 -213 17 0 0.755 -213 23 0.185 0.755 -65 141 0 0.76 -95 161 0 0.76 -108 127 0.05 0.76 -110 122 0 0.76 -164 183 0.12 0.76 -174 115 0 0.76 -179 225 0 0.76 -188 197 0 0.76 -227 47 0 0.76 -254 159 0.045 0.76 -6 18 0 0.765 -42 122 0 0.765 -49 14 0.24 0.765 -104 183 0 0.765 -245 251 0.22 0.765 -1 211 0 0.77 -1 66 0 0.77 -77 27 0 0.77 -97 174 0 0.77 -149 161 0 0.77 -199 21 0 0.77 -233 245 0 0.77 -233 253 0.08 0.77 -19 145 0.175 0.775 -20 145 0.09 0.775 -46 43 0 0.775 -50 62 0 0.775 -52 67 0 0.775 -68 85 0 0.775 -90 170 0 0.775 -94 161 0 0.775 -131 209 0 0.775 -172 226 0.235 0.775 -194 212 0 0.775 -202 29 0 0.775 -252 200 0 0.775 -20 68 0 0.78 -30 4 0 0.78 -49 5 0 0.78 -70 75 0 0.78 -127 65 0 0.78 -127 192 0 0.78 -145 85 0 0.78 -184 226 0 0.78 -221 14 0 0.78 -249 41 0 0.78 -254 15 0.095 0.78 -6 231 0.215 0.785 -47 19 0 0.785 -119 169 0 0.785 -142 66 0.145 0.785 -196 5 0 0.785 -47 95 0 0.79 -51 67 0 0.79 -91 85 0.1 0.79 -99 181 0 0.79 -130 195 0.1 0.79 -151 163 0 0.79 -171 238 0 0.79 -195 62 0 0.79 -240 110 0.065 0.79 -8 73 0 0.795 -78 83 0 0.795 -79 96 0.07 0.795 -84 162 0 0.795 -126 67 0 0.795 -131 200 0 0.795 -194 206 0 0.795 -207 9 0.17 0.795 -216 34 0 0.795 -1 7 0.245 0.8 -6 220 0 0.8 -20 88 0 0.8 -23 90 0 0.8 -70 68 0.3 0.8 -151 231 0 0.8 -154 167 0 0.8 -196 18 0 0.8 -220 23 0 0.8 -223 4 0 0.8 -241 197 0 0.8 -9 14 0.2 0.805 -54 8 0 0.805 -85 130 0 0.805 -105 167 0.23 0.805 -107 122 0.13 0.805 -118 108 0 0.805 -180 141 0 0.805 -214 6 0 0.805 -232 56 0 0.805 -233 204 0.21 0.805 -244 209 0.265 0.805 -248 203 0.285 0.805 -40 7 0.305 0.81 -61 122 0 0.81 -85 165 0.19 0.81 -98 119 0 0.81 -123 169 0 0.81 -125 100 0 0.81 -144 158 0 0.81 -200 4 0.175 0.81 -8 114 0 0.815 -41 34 0.045 0.815 -100 128 0.265 0.815 -105 119 0 0.815 -105 153 0 0.815 -165 183 0 0.815 -201 21 0.1 0.815 -223 18 0 0.815 -63 57 0.085 0.82 -75 134 0 0.82 -76 136 0 0.82 -79 81 0 0.82 -80 160 0 0.82 -84 115 0.305 0.82 -97 146 0 0.82 -106 189 0 0.82 -108 176 0.305 0.82 -144 156 0 0.82 -148 229 0 0.82 -151 230 0.225 0.82 -156 204 0 0.82 -165 119 0 0.82 -206 15 0.095 0.82 -222 208 0 0.82 -227 53 0 0.82 -20 101 0 0.825 -35 56 0.045 0.825 -39 89 0 0.825 -60 8 0.245 0.825 -84 175 0 0.825 -185 176 0 0.825 -194 17 0 0.825 -195 201 0.145 0.825 -223 195 0 0.825 -1 197 0 0.83 -22 34 0 0.83 -80 144 0 0.83 -97 177 0 0.83 -131 243 0 0.83 -193 49 0.315 0.83 -241 240 0 0.83 -246 205 0.06 0.83 -50 36 0 0.835 -73 134 0 0.835 -107 187 0 0.835 -119 168 0 0.835 -142 146 0.105 0.835 -155 169 0 0.835 -198 248 0 0.835 -200 54 0 0.835 -213 199 0 0.835 -150 218 0 0.84 -174 238 0 0.84 -31 111 0.27 0.845 -40 86 0 0.845 -61 106 0 0.845 -70 114 0 0.845 -86 98 0 0.845 -94 35 0 0.845 -99 168 0 0.845 -127 178 0 0.845 -132 197 0 0.845 -166 123 0 0.845 -194 148 0 0.845 -198 5 0 0.845 -72 140 0 0.85 -74 186 0 0.85 -76 150 0 0.85 -82 87 0 0.85 -87 99 0.3 0.85 -92 102 0 0.85 -187 137 0 0.85 -189 124 0 0.85 -207 202 0 0.85 -211 239 0.165 0.85 -237 255 0 0.85 -241 256 0 0.85 -61 11 0 0.855 -129 144 0 0.855 -144 160 0 0.855 -147 198 0 0.855 -155 220 0 0.855 -174 253 0 0.855 -192 244 0 0.855 -227 36 0 0.855 -241 227 0 0.855 -17 24 0 0.86 -48 111 0 0.86 -127 180 0 0.86 -136 201 0 0.86 -163 243 0.24 0.86 -240 63 0 0.86 -9 206 0.255 0.865 -9 221 0.21 0.865 -19 86 0 0.865 -39 53 0 0.865 -97 161 0 0.865 -129 209 0.285 0.865 -147 173 0.145 0.865 -198 195 0 0.865 -239 110 0.045 0.865 -247 197 0 0.865 -6 24 0 0.87 -19 7 0.165 0.87 -59 113 0.045 0.87 -152 172 0 0.87 -160 225 0.32 0.87 -186 254 0 0.87 -196 4 0 0.87 -196 29 0 0.87 -212 36 0 0.87 -213 148 0 0.87 -6 27 0 0.875 -65 83 0 0.875 -91 186 0.065 0.875 -94 100 0 0.875 -99 102 0 0.875 -189 249 0.215 0.875 -191 131 0 0.875 -198 210 0 0.875 -206 195 0 0.875 -239 35 0 0.875 -116 141 0 0.88 -127 187 0 0.88 -132 173 0.28 0.88 -139 13 0.135 0.88 -142 83 0 0.88 -167 234 0 0.88 -167 247 0.245 0.88 -179 228 0 0.88 -198 211 0 0.88 -201 23 0.38 0.88 -235 59 0 0.88 -19 37 0 0.885 -45 94 0 0.885 -46 15 0.335 0.885 -69 182 0 0.885 -77 186 0 0.885 -132 149 0 0.885 -134 202 0 0.885 -135 199 0 0.885 -150 140 0 0.885 -161 209 0 0.885 -167 236 0 0.885 -169 187 0 0.885 -205 204 0 0.885 -206 212 0 0.885 -250 207 0 0.885 -40 69 0.31 0.89 -52 16 0 0.89 -72 184 0 0.89 -127 121 0.39 0.89 -130 197 0 0.89 -138 150 0 0.89 -218 10 0 0.89 -221 239 0 0.89 -31 48 0.38 0.895 -83 132 0 0.895 -95 160 0 0.895 -134 155 0 0.895 -155 233 0 0.895 -169 176 0 0.895 -192 207 0 0.895 -205 9 0 0.895 -212 22 0.11 0.895 -223 15 0 0.895 -227 49 0 0.895 -230 44 0.05 0.895 -243 197 0 0.895 -20 83 0 0.9 -36 101 0 0.9 -77 157 0 0.9 -212 231 0.12 0.9 -235 238 0 0.9 -24 87 0 0.905 -26 109 0 0.905 -55 53 0 0.905 -61 113 0 0.905 -80 129 0 0.905 -118 75 0 0.905 -131 248 0 0.905 -185 245 0 0.905 -241 62 0 0.905 -46 126 0 0.91 -48 94 0 0.91 -99 164 0 0.91 -108 128 0 0.91 -134 157 0.335 0.91 -142 173 0.035 0.91 -171 253 0 0.91 -172 253 0 0.91 -193 148 0.22 0.91 -197 54 0 0.91 -17 35 0 0.915 -60 75 0 0.915 -65 93 0.25 0.915 -82 150 0 0.915 -87 101 0 0.915 -166 124 0 0.915 -168 216 0.315 0.915 -169 183 0 0.915 -174 116 0 0.915 -207 221 0 0.915 -235 256 0.17 0.915 -248 200 0 0.915 -6 74 0 0.92 -60 120 0.395 0.92 -119 170 0 0.92 -129 206 0 0.92 -130 184 0 0.92 -188 202 0 0.92 -199 215 0 0.92 -229 239 0.215 0.92 -244 199 0.265 0.92 -251 207 0 0.92 -46 207 0.045 0.925 -47 84 0 0.925 -64 127 0 0.925 -95 173 0 0.925 -118 66 0 0.925 -126 141 0 0.925 -164 227 0 0.925 -199 1 0.15 0.925 -213 18 0 0.925 -13 57 0 0.93 -20 111 0 0.93 -123 183 0 0.93 -127 114 0 0.93 -142 131 0 0.93 -156 249 0.05 0.93 -187 180 0.25 0.93 -12 69 0 0.935 -82 111 0 0.935 -87 167 0 0.935 -137 250 0 0.935 -155 214 0 0.935 -196 62 0 0.935 -200 1 0 0.935 -204 231 0.07 0.935 -204 224 0 0.935 -216 35 0 0.935 -123 253 0.29 0.94 -145 100 0.395 0.94 -224 48 0 0.94 -12 75 0 0.945 -19 101 0 0.945 -39 56 0.425 0.945 -51 162 0.12 0.945 -59 127 0 0.945 -84 104 0 0.945 -112 116 0 0.945 -113 122 0.075 0.945 -124 183 0 0.945 -135 252 0 0.945 -155 204 0 0.945 -249 205 0 0.945 -19 88 0 0.95 -33 53 0 0.95 -39 48 0.27 0.95 -52 122 0.26 0.95 -92 173 0 0.95 -93 141 0 0.95 -99 117 0 0.95 -137 246 0 0.95 -175 235 0 0.95 -203 57 0 0.95 -228 63 0 0.95 -35 84 0 0.955 -60 69 0 0.955 -77 113 0 0.955 -104 182 0 0.955 -127 79 0 0.955 -135 203 0 0.955 -141 193 0 0.955 -145 194 0 0.955 -148 227 0 0.955 -240 57 0.4 0.955 -256 52 0 0.955 -3 23 0.28 0.96 -10 47 0.405 0.96 -23 35 0.14 0.96 -36 56 0 0.96 -56 104 0 0.96 -60 89 0.175 0.96 -133 147 0 0.96 -136 217 0 0.96 -137 183 0 0.96 -144 193 0 0.96 -185 246 0 0.96 -192 241 0 0.96 -192 202 0 0.96 -194 1 0 0.96 -194 21 0 0.96 -245 252 0 0.96 -42 27 0.385 0.965 -42 109 0 0.965 -87 107 0 0.965 -124 69 0 0.965 -139 143 0 0.965 -192 238 0 0.965 -206 30 0 0.965 -215 37 0 0.965 -230 219 0.385 0.965 -240 59 0 0.965 -27 48 0.135 0.97 -89 69 0 0.97 -92 170 0 0.97 -215 8 0 0.97 -255 59 0.44 0.97 -16 81 0 0.975 -22 40 0 0.975 -31 110 0.245 0.975 -38 106 0 0.975 -130 209 0 0.975 -135 155 0 0.975 -138 188 0 0.975 -139 253 0 0.975 -152 164 0.235 0.975 -213 5 0 0.975 -215 18 0 0.975 -251 63 0 0.975 -36 117 0 0.98 -71 184 0 0.98 -98 120 0 0.98 -112 113 0 0.98 -182 248 0.05 0.98 -214 226 0 0.98 -217 10 0 0.98 -229 179 0 0.98 -236 256 0 0.98 -245 236 0 0.98 -205 15 0.425 0.985 -226 53 0 0.985 -239 62 0.475 0.985 -3 83 0.385 0.99 -67 182 0 0.99 -73 93 0.25 0.99 -76 149 0 0.99 -135 248 0 0.99 -135 204 0 0.99 -139 58 0.165 0.99 -158 129 0.21 0.99 -230 215 0.1 0.99 -234 254 0.44 0.99 -236 253 0 0.99 -245 227 0 0.99 -6 28 0 0.995 -33 63 0 0.995 -43 101 0.41 0.995 -88 153 0 0.995 -99 167 0 0.995 -134 156 0 0.995 -185 165 0 0.995 -192 255 0 0.995 -248 58 0.21 0.995 -6 85 0 1 -122 190 0 1 -143 148 0.34 1 -234 255 0 1 -247 253 0.425 1 -2 30 0 1.005 -30 16 0.4 1.005 -33 109 0.325 1.005 -107 167 0 1.005 -124 184 0 1.005 -219 240 0.4 1.005 -232 44 0 1.005 -240 44 0.435 1.005 -19 70 0 1.01 -41 102 0 1.01 -46 59 0 1.01 -89 75 0 1.01 -90 173 0 1.01 -122 116 0.12 1.01 -160 208 0 1.01 -181 163 0 1.01 -9 27 0 1.015 -13 25 0.46 1.015 -20 34 0 1.015 -30 35 0 1.015 -43 37 0.45 1.015 -69 181 0.48 1.015 -74 128 0 1.015 -89 66 0.44 1.015 -139 221 0 1.015 -148 206 0 1.015 -207 63 0 1.015 -210 197 0.48 1.015 -220 240 0.22 1.015 -234 205 0.18 1.015 -242 54 0.405 1.015 -252 5 0 1.015 -6 89 0 1.02 -17 45 0 1.02 -17 93 0 1.02 -23 83 0 1.02 -23 88 0 1.02 -133 68 0 1.02 -143 160 0.08 1.02 -202 58 0 1.02 -227 238 0 1.02 -20 85 0 1.025 -39 166 0.29 1.025 -60 10 0 1.025 -79 131 0.095 1.025 -128 114 0.385 1.025 -134 217 0 1.025 -143 208 0 1.025 -207 126 0.06 1.025 -217 6 0 1.025 -229 217 0.125 1.025 -248 1 0 1.025 -41 48 0 1.03 -43 108 0 1.03 -46 109 0 1.03 -67 184 0 1.03 -69 76 0 1.03 -92 112 0 1.03 -99 166 0 1.03 -118 123 0 1.03 -136 246 0.43 1.03 -143 194 0 1.03 -195 7 0.175 1.03 -197 8 0.405 1.03 -229 249 0 1.03 -17 66 0 1.035 -43 103 0 1.035 -64 10 0 1.035 -139 208 0 1.035 -181 246 0 1.035 -196 15 0 1.035 -242 228 0 1.035 -247 53 0 1.035 -6 10 0 1.04 -16 90 0.41 1.04 -50 69 0.39 1.04 -98 56 0 1.04 -112 191 0 1.04 -139 205 0 1.04 -233 42 0 1.04 -248 250 0.065 1.04 -3 85 0 1.045 -9 89 0 1.045 -31 109 0 1.045 -32 92 0 1.045 -43 102 0 1.045 -94 173 0 1.045 -95 143 0 1.045 -151 204 0 1.045 -169 229 0.22 1.045 -181 241 0 1.045 -188 191 0.33 1.045 -194 209 0 1.045 -198 21 0 1.045 -208 220 0.49 1.045 -6 58 0 1.05 -7 10 0 1.05 -38 58 0.25 1.05 -133 83 0 1.05 -147 197 0 1.05 -209 216 0 1.05 -8 25 0 1.055 -13 73 0.28 1.055 -17 81 0 1.055 -50 114 0 1.055 -73 10 0 1.055 -76 135 0 1.055 -112 177 0 1.055 -129 244 0.06 1.055 -137 202 0 1.055 -176 255 0 1.055 -195 52 0 1.055 -222 227 0 1.055 -231 43 0.48 1.055 -244 206 0 1.055 -2 70 0.475 1.06 -9 8 0.36 1.06 -19 84 0 1.06 -45 63 0 1.06 -132 212 0.165 1.06 -159 30 0.055 1.06 -210 164 0 1.06 -236 106 0.505 1.06 -3 71 0.36 1.065 -29 110 0.26 1.065 -100 176 0 1.065 -135 250 0 1.065 -149 140 0 1.065 -175 255 0 1.065 -195 54 0 1.065 -201 54 0 1.065 -224 61 0.115 1.065 -230 250 0 1.065 -235 46 0 1.065 -239 97 0.54 1.065 -3 70 0 1.07 -17 97 0 1.07 -43 92 0 1.07 -45 49 0 1.07 -69 137 0 1.07 -71 136 0 1.07 -115 79 0 1.07 -130 158 0.135 1.07 -133 246 0 1.07 -192 159 0.075 1.07 -213 212 0 1.07 -228 1 0.3 1.07 -6 208 0.28 1.075 -6 219 0 1.075 -39 92 0 1.075 -188 205 0 1.075 -239 34 0 1.075 -251 41 0 1.075 -254 142 0 1.075 -31 90 0 1.08 -54 58 0 1.08 -71 123 0 1.08 -74 141 0 1.08 -94 174 0 1.08 -106 117 0.365 1.08 -154 175 0 1.08 -222 47 0.135 1.08 -242 247 0.5 1.08 -17 82 0 1.085 -22 19 0 1.085 -74 86 0.41 1.085 -140 208 0 1.085 -169 220 0.43 1.085 -179 238 0 1.085 -219 42 0.105 1.085 -5 85 0.375 1.09 -23 37 0 1.09 -24 43 0.43 1.09 -104 106 0.57 1.09 -105 172 0.31 1.09 -105 171 0.225 1.09 -109 100 0 1.09 -149 217 0 1.09 -158 143 0.06 1.09 -162 238 0 1.09 -200 12 0 1.09 -217 231 0 1.09 -220 10 0 1.09 -228 62 0 1.09 -8 76 0.255 1.095 -17 47 0 1.095 -58 7 0 1.095 -67 137 0.53 1.095 -72 182 0 1.095 -174 100 0 1.095 -196 30 0 1.095 -196 20 0.48 1.095 -227 239 0 1.095 -228 110 0.24 1.095 -251 55 0.49 1.095 -16 89 0 1.1 -23 43 0 1.1 -45 255 0 1.1 -53 98 0 1.1 -92 111 0.205 1.1 -147 227 0 1.1 -168 227 0 1.1 -186 246 0 1.1 -201 25 0 1.1 -19 68 0 1.105 -50 196 0 1.105 -105 170 0 1.105 -115 189 0.105 1.105 -214 21 0 1.105 -226 247 0 1.105 -7 25 0 1.11 -50 40 0 1.11 -192 249 0.59 1.11 -200 25 0 1.11 -17 94 0 1.115 -26 31 0 1.115 -50 52 0 1.115 -58 10 0 1.115 -101 119 0 1.115 -130 143 0 1.115 -159 208 0 1.115 -192 251 0.6 1.115 -201 10 0 1.115 -233 187 0 1.115 -235 48 0 1.115 -249 203 0 1.115 -13 29 0 1.12 -45 97 0 1.12 -53 115 0.44 1.12 -130 210 0.48 1.12 -159 219 0 1.12 -165 178 0.48 1.12 -195 4 0 1.12 -213 209 0 1.12 -216 33 0 1.12 -219 231 0 1.12 -223 33 0 1.12 -233 251 0 1.12 -235 253 0 1.12 -42 110 0 1.125 -118 58 0.18 1.125 -136 215 0 1.125 -165 245 0.395 1.125 -175 227 0 1.125 -231 23 0 1.125 -248 251 0.45 1.125 -6 19 0 1.13 -24 102 0 1.13 -30 227 0 1.13 -37 102 0 1.13 -61 126 0 1.13 -115 191 0 1.13 -140 159 0.46 1.13 -152 212 0 1.13 -191 207 0.275 1.13 -196 3 0 1.13 -198 199 0 1.13 -237 228 0 1.13 -17 32 0 1.135 -22 35 0 1.135 -90 127 0.62 1.135 -119 184 0 1.135 -132 160 0 1.135 -142 180 0.29 1.135 -222 31 0.535 1.135 -9 200 0 1.14 -36 100 0 1.14 -50 51 0 1.14 -50 118 0.37 1.14 -85 98 0.63 1.14 -88 168 0 1.14 -111 83 0.315 1.14 -136 140 0 1.14 -145 154 0.54 1.14 -159 217 0.5 1.14 -178 161 0.435 1.14 -195 15 0 1.14 -246 202 0.445 1.14 -11 25 0.495 1.145 -13 221 0 1.145 -45 31 0 1.145 -46 64 0 1.145 -48 90 0 1.145 -114 179 0.645 1.145 -136 153 0 1.145 -164 49 0.645 1.145 -204 58 0 1.145 -226 255 0 1.145 -239 31 0.52 1.145 -13 122 0 1.15 -46 113 0 1.15 -70 67 0 1.15 -92 172 0 1.15 -130 179 0.385 1.15 -157 143 0 1.15 -159 171 0.34 1.15 -161 179 0.35 1.15 -189 205 0 1.15 -198 252 0 1.15 -116 161 0.615 1.155 -124 135 0 1.155 -137 136 0 1.155 -144 132 0 1.155 -148 224 0.135 1.155 -159 156 0.455 1.155 -216 19 0 1.155 -225 45 0.215 1.155 -19 23 0 1.16 -55 48 0.14 1.16 -130 242 0 1.16 -140 205 0 1.16 -157 132 0 1.16 -210 30 0 1.16 -220 251 0.21 1.16 -222 33 0 1.16 -236 48 0 1.16 -256 63 0 1.16 -1 113 0.32 1.165 -11 89 0 1.165 -50 60 0.385 1.165 -62 116 0.655 1.165 -93 92 0 1.165 -232 51 0 1.165 -239 255 0 1.165 -247 40 0 1.165 -3 20 0.42 1.17 -11 27 0 1.17 -55 64 0.475 1.17 -73 128 0 1.17 -93 105 0.525 1.17 -155 148 0.61 1.17 -199 203 0 1.17 -207 11 0 1.17 -207 64 0 1.17 -218 42 0 1.17 -7 121 0 1.175 -43 154 0.515 1.175 -87 105 0 1.175 -92 158 0.42 1.175 -137 197 0.465 1.175 -199 251 0.62 1.175 -243 207 0.675 1.175 -2 52 0 1.18 -188 248 0.37 1.18 -191 49 0.65 1.18 -229 183 0 1.18 -92 106 0 1.185 -125 116 0 1.185 -128 142 0 1.185 -186 249 0 1.185 -247 61 0.14 1.185 -8 88 0.575 1.19 -14 80 0.685 1.19 -35 103 0.185 1.19 -75 96 0.19 1.19 -13 93 0 1.195 -31 97 0 1.195 -61 110 0 1.195 -61 60 0 1.195 -201 5 0 1.195 -209 33 0 1.195 -210 168 0 1.195 -217 29 0.6 1.195 -218 251 0.24 1.195 -223 47 0 1.195 -5 12 0.525 1.2 -16 96 0 1.2 -30 14 0 1.2 -44 63 0.09 1.2 -67 85 0 1.2 -78 158 0 1.2 -114 131 0.265 1.2 -177 187 0.185 1.2 -185 135 0 1.2 -225 49 0 1.2 -233 22 0.65 1.2 -236 61 0 1.2 -237 164 0 1.2 -247 203 0.205 1.2 -39 119 0.2 1.205 -45 110 0 1.205 -104 172 0.17 1.205 -155 132 0.63 1.205 -13 204 0 1.21 -31 43 0.62 1.21 -44 119 0.355 1.21 -55 71 0.38 1.21 -75 95 0 1.21 -93 28 0 1.21 -130 190 0 1.21 -169 188 0.055 1.21 -201 7 0.04 1.21 -216 8 0.38 1.21 -226 38 0 1.21 -12 32 0 1.215 -12 86 0 1.215 -19 72 0 1.215 -24 98 0 1.215 -104 116 0.47 1.215 -105 48 0 1.215 -123 177 0.57 1.215 -160 220 0.42 1.215 -212 34 0 1.215 -214 221 0.545 1.215 -232 36 0 1.215 -248 201 0 1.215 -8 20 0 1.22 -14 29 0 1.22 -87 96 0.15 1.22 -93 75 0 1.22 -98 103 0 1.22 -159 218 0 1.22 -216 38 0 1.22 -26 37 0.36 1.225 -92 174 0.405 1.225 -16 94 0 1.23 -17 78 0 1.23 -31 96 0 1.23 -101 84 0 1.23 -153 152 0 1.23 -159 224 0 1.23 -169 181 0.28 1.23 -179 195 0.73 1.23 -7 124 0 1.235 -22 43 0 1.235 -133 66 0 1.235 -140 219 0 1.235 -206 10 0 1.235 -206 29 0 1.235 -215 27 0.475 1.235 -223 27 0.685 1.235 -232 40 0 1.235 -43 86 0 1.24 -44 64 0.445 1.24 -61 57 0 1.24 -92 109 0 1.24 -107 153 0 1.24 -112 79 0.445 1.24 -143 140 0.375 1.24 -13 60 0 1.245 -43 91 0 1.245 -120 184 0 1.245 -129 195 0.07 1.245 -187 247 0.41 1.245 -191 228 0 1.245 -206 14 0 1.245 -228 50 0 1.245 -246 58 0 1.245 -20 24 0 1.25 -93 107 0.54 1.25 -109 170 0 1.25 -125 177 0.615 1.25 -156 176 0 1.25 -177 173 0 1.25 -183 38 0.63 1.25 -222 229 0.735 1.25 -239 232 0.57 1.25 -250 62 0.435 1.25 -14 94 0.275 1.255 -25 37 0.08 1.255 -45 10 0.275 1.255 -97 115 0 1.255 -106 166 0 1.255 -164 255 0 1.255 -236 40 0.49 1.255 -247 240 0.65 1.255 -247 256 0.31 1.255 -34 110 0 1.26 -87 152 0 1.26 -93 25 0.33 1.26 -185 76 0.645 1.26 -188 236 0.74 1.26 -196 16 0 1.26 -212 238 0 1.26 -216 28 0.375 1.26 -222 164 0.63 1.26 -8 28 0.515 1.265 -49 97 0.68 1.265 -61 44 0 1.265 -70 133 0 1.265 -80 190 0 1.265 -100 116 0 1.265 -103 115 0.645 1.265 -122 141 0.52 1.265 -126 178 0.76 1.265 -132 211 0 1.265 -161 168 0 1.265 -168 38 0.665 1.265 -173 187 0.745 1.265 -183 231 0.69 1.265 -188 245 0 1.265 -254 250 0 1.265 -41 90 0.605 1.27 -44 118 0.3 1.27 -54 9 0 1.27 -133 138 0.425 1.27 -138 135 0 1.27 -167 227 0.695 1.27 -211 232 0.715 1.27 -232 18 0 1.27 -246 256 0.22 1.27 -13 12 0 1.275 -16 25 0.395 1.275 -67 81 0 1.275 -115 161 0 1.275 -157 150 0.135 1.275 -166 112 0.16 1.275 -175 168 0.51 1.275 -191 225 0 1.275 -206 16 0.165 1.275 -242 6 0.74 1.275 -8 89 0 1.28 -22 232 0 1.28 -55 9 0.49 1.28 -118 182 0 1.28 -142 140 0.775 1.28 -143 209 0 1.28 -166 156 0 1.28 -42 25 0.135 1.285 -103 153 0 1.285 -132 244 0 1.285 -164 193 0.61 1.285 -164 244 0.475 1.285 -199 58 0 1.285 -212 232 0.515 1.285 -231 42 0 1.285 -15 95 0.77 1.29 -46 232 0.64 1.29 -58 74 0.64 1.29 -114 100 0 1.29 -132 223 0 1.29 -210 33 0 1.29 -217 223 0.685 1.29 -17 15 0 1.295 -23 105 0 1.295 -44 108 0 1.295 -71 83 0 1.295 -83 103 0 1.295 -143 202 0 1.295 -153 167 0 1.295 -155 209 0.645 1.295 -174 113 0 1.295 -174 177 0 1.295 -181 230 0.72 1.295 -188 235 0.64 1.295 -196 200 0 1.295 -218 231 0 1.295 -16 79 0 1.3 -78 84 0.7 1.3 -125 185 0.53 1.3 -143 147 0 1.3 -144 159 0 1.3 -159 202 0 1.3 -187 235 0 1.3 -213 225 0.34 1.3 -44 122 0 1.305 -66 136 0.66 1.305 -70 149 0 1.305 -80 111 0.195 1.305 -145 165 0.25 1.305 -191 144 0.41 1.305 -236 199 0.715 1.305 -238 42 0.57 1.305 -21 89 0 1.31 -42 36 0.8 1.31 -67 87 0.75 1.31 -68 134 0.8 1.31 -134 146 0.69 1.31 -198 152 0 1.31 -218 209 0.72 1.31 -222 228 0 1.31 -48 127 0 1.315 -91 150 0 1.315 -109 113 0 1.315 -139 141 0 1.315 -191 141 0 1.315 -209 29 0.33 1.315 -216 219 0.65 1.315 -219 209 0.765 1.315 -18 28 0.48 1.32 -48 107 0 1.32 -81 149 0 1.32 -116 179 0.615 1.32 -181 226 0 1.32 -191 250 0 1.32 -218 175 0 1.32 -239 42 0 1.32 -240 205 0.6 1.32 -251 38 0.235 1.32 -254 251 0.765 1.32 -22 10 0.44 1.325 -22 105 0.675 1.325 -28 102 0 1.325 -30 211 0 1.325 -106 127 0 1.325 -198 233 0.645 1.325 -205 49 0.63 1.325 -217 26 0 1.325 -222 211 0 1.325 -225 245 0 1.325 -28 35 0.47 1.33 -44 112 0 1.33 -44 117 0.375 1.33 -52 79 0 1.33 -92 166 0 1.33 -125 77 0 1.33 -132 221 0 1.33 -145 173 0 1.33 -183 243 0 1.33 -41 59 0 1.335 -70 83 0 1.335 -85 84 0 1.335 -109 189 0 1.335 -128 178 0.65 1.335 -171 148 0.245 1.335 -205 209 0.415 1.335 -217 208 0 1.335 -48 57 0 1.34 -82 165 0 1.34 -88 161 0 1.34 -147 212 0 1.34 -207 58 0 1.34 -215 10 0 1.34 -237 212 0 1.34 -241 205 0.305 1.34 -242 2 0 1.34 -247 59 0.135 1.34 -254 46 0.77 1.34 -82 149 0 1.345 -100 117 0 1.345 -118 104 0 1.345 -174 148 0 1.345 -214 249 0.275 1.345 -223 26 0.56 1.345 -22 235 0.67 1.35 -67 147 0.63 1.35 -68 148 0.6 1.35 -188 240 0.775 1.35 -209 14 0 1.35 -223 45 0 1.35 -237 42 0 1.35 -50 38 0 1.355 -118 178 0 1.355 -175 232 0.755 1.355 -208 209 0 1.355 -223 25 0.555 1.355 -243 230 0 1.355 -16 20 0.625 1.36 -27 157 0.795 1.36 -36 65 0.22 1.36 -48 121 0.735 1.36 -68 180 0.44 1.36 -110 126 0 1.36 -114 180 0.41 1.36 -139 248 0.25 1.36 -182 247 0.54 1.36 -183 199 0.61 1.36 -13 59 0 1.365 -49 126 0 1.365 -57 64 0 1.365 -151 229 0 1.365 -198 141 0.825 1.365 -220 43 0.3 1.365 -248 9 0 1.365 -12 90 0 1.37 -52 127 0 1.37 -65 117 0 1.37 -191 186 0 1.37 -9 122 0.305 1.375 -70 150 0.57 1.375 -114 102 0.435 1.375 -122 182 0.705 1.375 -142 205 0 1.375 -156 219 0 1.375 -217 203 0 1.375 -33 113 0 1.38 -141 250 0.7 1.38 -173 225 0 1.38 -184 230 0.815 1.38 -226 184 0.825 1.38 -239 36 0 1.38 -7 74 0 1.385 -23 91 0 1.385 -43 89 0 1.385 -75 87 0 1.385 -140 221 0 1.385 -162 230 0.85 1.385 -178 72 0 1.385 -240 252 0.75 1.385 -240 47 0.56 1.385 -106 124 0 1.39 -129 83 0 1.39 -232 35 0 1.39 -23 29 0.865 1.395 -49 65 0.21 1.395 -87 198 0.85 1.395 -93 43 0 1.395 -101 169 0.81 1.395 -101 108 0 1.395 -105 37 0.49 1.395 -107 234 0.085 1.395 -207 78 0.78 1.395 -237 187 0 1.395 -244 36 0 1.395 -253 42 0 1.395 -253 1 0.87 1.395 -21 97 0.73 1.4 -49 195 0 1.4 -51 119 0 1.4 -57 122 0 1.4 -86 167 0.5 1.4 -132 17 0.635 1.4 -151 165 0.735 1.4 -188 141 0 1.4 -251 11 0.8 1.4 -85 27 0.325 1.405 -129 72 0 1.405 -140 218 0 1.405 -164 192 0.395 1.405 -193 243 0 1.405 -196 1 0 1.405 -224 238 0 1.405 -4 129 0.82 1.41 -78 94 0 1.41 -115 168 0 1.41 -142 144 0 1.41 -144 255 0.51 1.41 -196 256 0.585 1.41 -197 203 0.445 1.41 -204 89 0.775 1.41 -206 255 0.155 1.41 -255 42 0 1.41 -22 101 0 1.415 -66 129 0.83 1.415 -68 131 0 1.415 -80 140 0 1.415 -159 212 0 1.415 -22 89 0 1.42 -56 102 0 1.42 -72 131 0 1.42 -114 104 0 1.42 -153 233 0 1.42 -153 171 0 1.42 -169 249 0 1.42 -182 192 0.835 1.42 -202 12 0.81 1.42 -253 196 0.89 1.42 -3 117 0 1.425 -5 117 0.585 1.425 -71 131 0.695 1.425 -125 15 0.745 1.425 -175 187 0.13 1.425 -190 179 0.615 1.425 -210 161 0 1.425 -214 204 0 1.425 -3 95 0.81 1.43 -25 91 0.755 1.43 -35 114 0.92 1.43 -100 189 0 1.43 -152 161 0 1.43 -171 191 0 1.43 -173 238 0 1.43 -176 225 0 1.43 -177 226 0 1.43 -214 219 0 1.43 -46 244 0 1.435 -51 127 0 1.435 -60 74 0 1.435 -78 129 0 1.435 -93 154 0 1.435 -164 131 0.155 1.435 -221 201 0.465 1.435 -243 40 0 1.435 -16 95 0 1.44 -32 84 0.74 1.44 -63 79 0.345 1.44 -116 117 0 1.44 -157 233 0.345 1.44 -180 183 0.87 1.44 -200 209 0 1.44 -214 26 0.32 1.44 -13 63 0 1.445 -49 5 0.92 1.445 -86 166 0 1.445 -156 234 0 1.445 -176 46 0.79 1.445 -193 14 0.895 1.445 -200 212 0.18 1.445 -218 249 0.26 1.445 -17 29 0 1.45 -52 77 0 1.45 -116 164 0 1.45 -130 148 0.445 1.45 -210 232 0 1.45 -213 2 0 1.45 -222 46 0.635 1.45 -4 84 0 1.455 -50 9 0.725 1.455 -74 124 0 1.455 -104 119 0 1.455 -106 170 0 1.455 -119 162 0 1.455 -147 200 0 1.455 -177 166 0.95 1.455 -177 168 0 1.455 -180 135 0.94 1.455 -190 144 0 1.455 -193 238 0.52 1.455 -214 227 0 1.455 -232 39 0 1.455 -252 202 0 1.455 -32 42 0 1.46 -88 108 0.465 1.46 -106 123 0 1.46 -113 161 0.675 1.46 -129 95 0 1.46 -159 205 0 1.46 -178 68 0 1.46 -212 216 0 1.46 -12 31 0.445 1.465 -49 207 0 1.465 -103 119 0 1.465 -105 185 0 1.465 -109 98 0.47 1.465 -205 195 0.885 1.465 -207 52 0 1.465 -78 145 0 1.47 -80 92 0 1.47 -106 169 0 1.47 -129 149 0.915 1.47 -133 245 0.84 1.47 -151 200 0 1.47 -180 195 0.75 1.47 -237 225 0 1.47 -241 239 0 1.47 -11 91 0 1.475 -16 3 0.9 1.475 -75 71 0 1.475 -83 161 0 1.475 -97 161 0.945 1.475 -120 68 0 1.475 -126 115 0 1.475 -134 186 0.27 1.475 -137 192 0.665 1.475 -177 238 0 1.475 -185 233 0 1.475 -185 144 0.885 1.475 -218 170 0.26 1.475 -242 49 0 1.475 -243 57 0.885 1.475 -254 144 0 1.475 -11 23 0.59 1.48 -13 74 0 1.48 -27 80 0 1.48 -37 104 0.895 1.48 -49 56 0 1.48 -99 152 0 1.48 -146 173 0.26 1.48 -154 189 0.595 1.48 -185 192 0.75 1.48 -194 53 0.97 1.48 -213 21 0 1.48 -215 236 0.24 1.48 -243 3 0.75 1.48 -11 31 0.465 1.485 -75 182 0 1.485 -140 214 0 1.485 -185 128 0 1.485 -79 96 0.875 1.49 -80 84 0.75 1.49 -103 233 0.395 1.49 -120 180 0 1.49 -137 141 0 1.49 -143 250 0.57 1.49 -156 170 0 1.49 -160 170 0.435 1.49 -205 16 0.97 1.49 -208 27 0 1.49 -241 46 0 1.49 -253 228 0 1.49 -256 202 0 1.49 -13 77 0 1.495 -23 73 0 1.495 -31 77 0 1.495 -77 95 0 1.495 -107 233 0.245 1.495 -125 98 0.83 1.495 -133 198 0 1.495 -156 230 0 1.495 -163 212 0 1.495 -171 175 0 1.495 -174 218 0.785 1.495 -193 245 0.755 1.495 -210 228 0 1.495 -34 118 0.96 1.5 -52 16 0.97 1.5 -79 144 0 1.5 -93 84 0 1.5 -103 170 0 1.5 -104 121 0 1.5 -120 136 0.56 1.5 -133 186 0.5 1.5 -138 221 0.67 1.5 -155 171 0 1.5 -231 40 0.38 1.5 -243 56 0 1.5 -247 9 0.54 1.5 -255 16 0.97 1.5 -5 9 0 1.505 -64 124 0.63 1.505 -69 73 0 1.505 -85 145 0.905 1.505 -85 150 0 1.505 -90 110 0 1.505 -103 112 0.575 1.505 -130 180 0 1.505 -168 170 0.99 1.505 -178 226 0.98 1.505 -180 196 0.965 1.505 -191 245 0.785 1.505 -196 255 0.27 1.505 -205 132 0 1.505 -205 14 0 1.505 -222 29 0 1.505 -229 34 0 1.505 -46 98 0.395 1.51 -57 5 0.84 1.51 -64 76 0.765 1.51 -78 67 0 1.51 -78 141 0 1.51 -133 168 0.91 1.51 -161 229 0 1.51 -185 230 0 1.51 -187 180 1 1.51 -208 26 0 1.51 -217 230 0.17 1.51 -6 69 0.64 1.515 -12 29 0 1.515 -25 45 0.39 1.515 -47 51 1.005 1.515 -111 163 0.84 1.515 -128 141 0 1.515 -131 246 0 1.515 -149 198 0 1.515 -154 110 0.85 1.515 -162 172 0.415 1.515 -200 229 0.865 1.515 -204 5 0.625 1.515 -204 21 0 1.515 -207 4 0 1.515 -214 200 0 1.515 -220 39 0.865 1.515 -229 18 0 1.515 -231 54 0.495 1.515 -27 87 0 1.52 -52 68 0.16 1.52 -90 150 0 1.52 -102 71 0.575 1.52 -108 230 0.665 1.52 -133 197 0 1.52 -134 138 0 1.52 -172 186 0.595 1.52 -215 24 0 1.52 -32 44 0 1.525 -34 5 0.965 1.525 -46 53 0.09 1.525 -47 127 0.695 1.525 -91 79 0.865 1.525 -101 106 0.24 1.525 -104 120 0 1.525 -174 235 0.96 1.525 -216 235 1.025 1.525 -41 249 0.875 1.53 -99 102 1.005 1.53 -116 145 1.015 1.53 -134 139 0 1.53 -173 163 0.125 1.53 -176 241 0 1.53 -253 193 0.695 1.53 -28 42 0 1.535 -52 117 0 1.535 -93 158 0 1.535 -116 95 0.905 1.535 -134 91 0 1.535 -138 139 0 1.535 -139 136 0.315 1.535 -155 224 0 1.535 -167 215 0 1.535 -171 239 0.9 1.535 -190 238 0 1.535 -205 221 0 1.535 -212 229 0 1.535 -227 40 0 1.535 -254 53 0.885 1.535 -44 47 0.74 1.54 -67 95 0 1.54 -87 80 0.495 1.54 -163 176 0.285 1.54 -181 245 0 1.54 -184 186 0.66 1.54 -37 117 0.335 1.545 -71 186 0 1.545 -126 95 0.615 1.545 -137 157 0 1.545 -154 148 0.39 1.545 -193 2 0 1.545 -224 225 0 1.545 -241 53 0 1.545 -11 93 0 1.55 -12 21 0 1.55 -18 40 0 1.55 -49 245 0.61 1.55 -93 79 0 1.55 -120 135 0.68 1.55 -128 68 0.41 1.55 -140 246 0 1.55 -157 198 0.8 1.55 -183 235 0.67 1.55 -185 250 0 1.55 -212 24 0.54 1.55 -214 211 0 1.55 -12 27 0 1.555 -46 1 0.395 1.555 -80 160 0.955 1.555 -137 80 0 1.555 -163 245 0 1.555 -177 117 0 1.555 -106 110 0 1.56 -126 143 1.05 1.56 -152 200 0 1.56 -187 238 0 1.56 -204 27 0 1.56 -253 141 0.76 1.56 -56 14 0.985 1.565 -73 72 0 1.565 -73 134 1.05 1.565 -104 161 0 1.565 -119 172 0 1.565 -143 238 1.045 1.565 -183 186 0.325 1.565 -204 8 0.725 1.565 -215 230 1.05 1.565 -215 29 0.615 1.565 -239 243 0 1.565 -256 57 0 1.565 -10 95 0.985 1.57 -14 95 0.475 1.57 -64 79 0 1.57 -80 154 0 1.57 -86 108 0 1.57 -128 143 0.76 1.57 -134 197 0 1.57 -187 255 0.105 1.57 -195 212 0.49 1.57 -241 1 0 1.57 -19 35 0 1.575 -46 51 0 1.575 -87 186 0.92 1.575 -109 169 0.95 1.575 -115 128 0.36 1.575 -118 23 1.07 1.575 -145 131 0 1.575 -156 224 0 1.575 -207 16 0 1.575 -214 232 0 1.575 -31 3 0.945 1.58 -36 127 0 1.58 -64 74 0 1.58 -65 145 0 1.58 -106 119 0 1.58 -177 242 0.89 1.58 -239 32 0.98 1.58 -17 10 0.4 1.585 -32 36 0.85 1.585 -41 34 0.925 1.585 -51 126 0 1.585 -92 218 0.135 1.585 -155 233 1.08 1.585 -177 253 0.93 1.585 -194 248 0.655 1.585 -215 224 0.775 1.585 -217 224 0 1.585 -227 243 0 1.585 -241 195 0 1.585 -1 54 0.295 1.59 -30 110 0 1.59 -31 65 1.01 1.59 -38 43 0.38 1.59 -39 60 0.725 1.59 -124 79 0.64 1.59 -127 115 0 1.59 -128 67 1.08 1.59 -134 214 0 1.59 -136 50 1.025 1.59 -139 200 0.935 1.59 -170 144 0.965 1.59 -181 170 0.97 1.59 -222 234 0 1.59 -229 33 0 1.59 -236 240 0 1.59 -241 61 0.775 1.59 -5 72 0.74 1.595 -29 33 0 1.595 -31 80 0 1.595 -38 59 0 1.595 -63 115 0.355 1.595 -66 84 0 1.595 -97 127 0 1.595 -118 72 0 1.595 -118 87 1.025 1.595 -138 202 0 1.595 -155 208 0 1.595 -177 143 0.925 1.595 -179 229 1.005 1.595 -180 50 0.85 1.595 -188 256 0.375 1.595 -193 5 0.865 1.595 -195 31 1.035 1.595 -241 34 0 1.595 -243 35 0.64 1.595 -7 67 0.97 1.6 -28 109 1.075 1.6 -48 98 1.09 1.6 -60 102 0 1.6 -78 157 0.53 1.6 -114 78 0 1.6 -155 237 0 1.6 -160 234 0 1.6 -174 175 0 1.6 -179 248 0 1.6 -183 57 0.645 1.6 -11 70 0 1.605 -16 75 0 1.605 -63 189 0.725 1.605 -65 72 0 1.605 -107 160 0 1.605 -116 191 0 1.605 -163 179 0 1.605 -214 41 0 1.605 -223 32 0 1.605 -253 206 0.745 1.605 -17 30 0 1.61 -17 33 0 1.61 -26 46 0 1.61 -43 96 0 1.61 -43 121 0 1.61 -46 110 0 1.61 -62 77 0 1.61 -96 148 0.61 1.61 -104 127 1.03 1.61 -147 167 0 1.61 -164 129 0.675 1.61 -177 175 0 1.61 -191 193 0 1.61 -212 35 0 1.61 -226 50 0 1.61 -15 56 0.98 1.615 -26 61 0.07 1.615 -56 178 0.38 1.615 -74 137 0 1.615 -188 203 0 1.615 -213 201 0 1.615 -241 189 0.62 1.615 -32 110 0 1.62 -49 40 0 1.62 -79 191 0 1.62 -86 165 0 1.62 -89 169 0.945 1.62 -93 157 0 1.62 -95 160 1.12 1.62 -113 189 0 1.62 -114 14 0.96 1.62 -152 162 0 1.62 -158 218 0.585 1.62 -207 200 0.94 1.62 -234 175 0 1.62 -15 67 0.985 1.625 -93 76 0.215 1.625 -107 157 0 1.625 -125 75 0.745 1.625 -132 195 0 1.625 -154 159 0 1.625 -190 77 0 1.625 -193 1 0 1.625 -211 228 0.825 1.625 -215 208 0.495 1.625 -215 235 0.325 1.625 -10 94 0.395 1.63 -19 99 0 1.63 -111 113 0.605 1.63 -115 164 0 1.63 -125 189 0 1.63 -136 17 1.1 1.63 -153 158 0.51 1.63 -170 230 0.17 1.63 -234 218 0 1.63 -247 39 0.845 1.63 -253 244 0 1.63 -31 95 0 1.635 -37 53 0 1.635 -49 50 0 1.635 -74 71 0 1.635 -85 146 0 1.635 -116 141 1.055 1.635 -122 71 0.58 1.635 -152 232 0.39 1.635 -204 41 0.13 1.635 -217 235 0 1.635 -54 104 1.01 1.64 -156 235 0 1.64 -177 163 0 1.64 -185 75 0 1.64 -234 220 0 1.64 -241 143 0.845 1.64 -1 31 1 1.645 -63 77 0 1.645 -98 161 0 1.645 -103 168 0 1.645 -118 67 0 1.645 -119 75 0 1.645 -126 76 1.1 1.645 -154 234 0 1.645 -163 127 0.94 1.645 -176 218 0 1.645 -191 179 0 1.645 -9 71 0.77 1.65 -18 39 0.655 1.65 -46 32 0 1.65 -59 16 0.985 1.65 -123 249 0.21 1.65 -135 150 1.005 1.65 -136 200 0 1.65 -176 226 0.815 1.65 -220 42 0 1.65 -229 21 0.17 1.65 -248 42 0.965 1.65 -32 18 1.05 1.655 -62 110 0 1.655 -82 110 0.265 1.655 -84 209 1.12 1.655 -92 140 0 1.655 -151 233 0 1.655 -153 221 0.62 1.655 -174 164 0 1.655 -178 245 0 1.655 -241 240 0.89 1.655 -53 117 0 1.66 -66 146 0.66 1.66 -100 229 1.11 1.66 -138 159 0 1.66 -217 171 0 1.66 -227 39 0.92 1.66 -228 40 0.36 1.66 -32 33 0 1.665 -37 86 0 1.665 -52 67 0.82 1.665 -72 91 0.975 1.665 -81 100 0.695 1.665 -101 181 0 1.665 -207 31 0.46 1.665 -207 3 0 1.665 -228 54 0.64 1.665 -234 26 0.56 1.665 -241 253 0 1.665 -254 184 0.995 1.665 -15 10 0 1.67 -26 59 0.05 1.67 -49 54 0.145 1.67 -57 119 0.85 1.67 -59 75 0 1.67 -60 112 1.12 1.67 -77 192 0.83 1.67 -224 41 1.035 1.67 -247 45 1.095 1.67 -4 99 0.87 1.675 -27 20 0.97 1.675 -70 124 0 1.675 -102 168 0.93 1.675 -123 191 0 1.675 -154 221 0 1.675 -179 232 0 1.675 -191 143 0 1.675 -229 248 0.33 1.675 -236 105 0.925 1.675 -242 228 1.14 1.675 -63 78 0.65 1.68 -75 137 0 1.68 -122 137 0.54 1.68 -130 150 0.74 1.68 -148 176 0 1.68 -149 100 1.01 1.68 -156 172 0 1.68 -26 240 0 1.685 -34 117 0 1.685 -74 122 0 1.685 -79 127 1.12 1.685 -80 94 0 1.685 -84 160 0.725 1.685 -96 169 0 1.685 -107 189 0 1.685 -117 69 0 1.685 -120 166 0 1.685 -128 138 0 1.685 -137 144 0 1.685 -15 79 0 1.69 -45 41 0 1.69 -49 110 0 1.69 -142 209 0 1.69 -150 218 0.93 1.69 -162 232 0.965 1.69 -188 197 0.94 1.69 -191 244 0 1.69 -210 167 0 1.69 -210 226 0 1.69 -247 58 0 1.69 -12 72 0.65 1.695 -31 2 0 1.695 -37 55 0 1.695 -45 57 1.1 1.695 -45 109 0 1.695 -66 116 0.97 1.695 -68 146 0 1.695 -74 79 0 1.695 -116 77 0 1.695 -173 209 0.305 1.695 -211 239 1.175 1.695 -215 12 0 1.695 -254 50 0 1.695 -255 63 0 1.695 -10 4 1.065 1.7 -89 134 0 1.7 -109 161 0 1.7 -157 148 0.405 1.7 -171 236 1.065 1.7 -178 191 0 1.7 -183 248 0 1.7 -216 228 1.085 1.7 -3 18 0.495 1.705 -15 66 0.96 1.705 -26 48 0 1.705 -31 15 0 1.705 -89 150 0 1.705 -93 138 0 1.705 -93 145 1.095 1.705 -120 129 0.7 1.705 -183 144 0.805 1.705 -193 13 1.015 1.705 -196 219 1.125 1.705 -199 69 0.18 1.705 -10 80 0.555 1.71 -23 101 0 1.71 -84 149 0 1.71 -106 73 0.595 1.71 -174 192 0.715 1.71 -233 41 0 1.71 -14 8 0.155 1.715 -17 16 0 1.715 -26 47 0 1.715 -27 94 0 1.715 -93 27 0 1.715 -121 189 0 1.715 -136 209 0 1.715 -175 255 1.21 1.715 -211 31 0.86 1.715 -222 226 0.66 1.715 -238 58 1.11 1.715 -241 49 0 1.715 -18 98 0 1.72 -83 163 0 1.72 -134 198 0 1.72 -141 209 1.13 1.72 -254 194 0.135 1.72 -21 39 0.665 1.725 -23 39 0 1.725 -27 48 1.145 1.725 -68 192 0.745 1.725 -148 127 0.905 1.725 -174 75 1.2 1.725 -196 224 0.56 1.725 -208 30 0 1.725 -213 209 1.22 1.725 -242 200 0 1.725 -242 199 0 1.725 -17 224 0 1.73 -62 114 0.85 1.73 -63 121 0.44 1.73 -71 91 0 1.73 -109 99 0.62 1.73 -123 183 1.125 1.73 -168 131 0.885 1.73 -170 235 0.115 1.73 -177 176 0 1.73 -178 168 0 1.73 -184 232 0.92 1.73 -185 189 0 1.73 -190 161 0.73 1.73 -57 105 0.795 1.735 -68 193 0.555 1.735 -71 77 0.88 1.735 -112 77 0.305 1.735 -139 192 0 1.735 -191 129 0 1.735 -210 165 0 1.735 -237 249 0 1.735 -252 12 0 1.735 -1 69 0.24 1.74 -4 145 0.47 1.74 -10 47 0.985 1.74 -11 71 0 1.74 -13 126 0 1.74 -14 69 0.88 1.74 -15 69 0.895 1.74 -27 76 0 1.74 -40 52 0 1.74 -102 178 0.535 1.74 -138 158 0 1.74 -178 194 0.645 1.74 -252 73 0.7 1.74 -6 53 0.855 1.745 -16 27 0 1.745 -26 239 0.525 1.745 -27 96 0 1.745 -59 110 0 1.745 -113 79 0 1.745 -114 110 1.155 1.745 -153 206 0.845 1.745 -155 196 0.715 1.745 -189 249 0.995 1.745 -225 30 0 1.745 -227 101 1.015 1.745 -13 10 0 1.75 -26 90 0 1.75 -66 94 0.21 1.75 -83 151 0 1.75 -84 152 0 1.75 -89 101 0.935 1.75 -100 102 0.61 1.75 -137 77 0.925 1.75 -196 203 0.615 1.75 -196 202 0.68 1.75 -238 13 1.11 1.75 -5 15 0.995 1.755 -6 3 0.5 1.755 -18 88 1.24 1.755 -106 11 1.255 1.755 -111 175 0 1.755 -112 113 1.045 1.755 -144 196 0.705 1.755 -195 7 1.105 1.755 -212 10 1.24 1.755 -224 33 0 1.755 -229 243 0 1.755 -248 6 0.7 1.755 -49 98 0 1.76 -66 132 1.165 1.76 -80 90 0 1.76 -89 44 1.08 1.76 -121 169 0 1.76 -126 69 0.845 1.76 -135 6 0.295 1.76 -161 162 0 1.76 -225 243 0 1.76 -234 239 0 1.76 -78 128 0 1.765 -93 126 1.125 1.765 -102 179 1.015 1.765 -111 189 0 1.765 -124 172 0.225 1.765 -213 231 0 1.765 -28 107 0 1.77 -127 129 1.19 1.77 -234 238 0 1.77 -1 63 0 1.775 -49 114 0 1.775 -60 124 0 1.775 -71 138 0 1.775 -84 132 0.845 1.775 -145 160 0.68 1.775 -185 71 0 1.775 -196 160 0.915 1.775 -53 7 0 1.78 -100 147 1.14 1.78 -107 158 0 1.78 -111 148 0 1.78 -118 3 0 1.78 -138 154 0 1.78 -140 203 0 1.78 -162 229 0 1.78 -183 251 0.54 1.78 -202 26 0.955 1.78 -210 231 0 1.78 -219 20 1.145 1.78 -34 55 1.015 1.785 -37 99 0.945 1.785 -53 118 0 1.785 -75 206 1.255 1.785 -92 165 1.005 1.785 -100 173 0 1.785 -142 136 1.13 1.785 -180 194 0.255 1.785 -185 249 0 1.785 -198 220 0 1.785 -215 206 0.94 1.785 -219 236 0.235 1.785 -219 43 0 1.785 -28 55 1.035 1.79 -101 110 1.28 1.79 -111 177 0 1.79 -113 129 1.115 1.79 -157 196 1.255 1.79 -160 175 0 1.79 -198 221 0.505 1.79 -204 70 0.86 1.79 -208 64 0 1.79 -216 226 0 1.79 -63 123 0.805 1.795 -66 142 1.09 1.795 -124 166 0.965 1.795 -155 223 0.355 1.795 -167 170 0 1.795 -202 29 0.81 1.795 -254 195 0 1.795 -10 19 1.055 1.8 -46 125 0 1.8 -62 128 0.385 1.8 -64 12 0 1.8 -83 165 0 1.8 -121 172 0.47 1.8 -149 229 0 1.8 -158 206 0.515 1.8 -109 121 1.025 1.805 -133 139 0.035 1.805 -180 136 0.83 1.805 -188 247 0.4 1.805 -201 12 0.065 1.805 -64 3 1.22 1.81 -68 136 0.305 1.81 -115 129 0.7 1.81 -139 151 0 1.81 -160 209 0 1.81 -13 65 1.13 1.815 -25 38 1.14 1.815 -28 40 0.4 1.815 -51 15 0.815 1.815 -81 146 0 1.815 -89 80 0 1.815 -123 143 0.63 1.815 -160 148 0 1.815 -233 247 0 1.815 -247 250 0 1.815 -51 67 0.94 1.82 -117 67 0 1.82 -119 170 0.96 1.82 -161 241 0.305 1.82 -207 221 1.085 1.82 -245 54 0 1.82 -5 65 0 1.825 -10 20 0.81 1.825 -36 109 0 1.825 -144 223 0.72 1.825 -199 2 0 1.825 -231 23 1.215 1.825 -4 96 0.72 1.83 -35 102 0 1.83 -134 217 1.045 1.83 -249 240 0 1.83 -14 21 0.925 1.835 -37 245 0 1.835 -45 255 1.21 1.835 -108 128 1.33 1.835 -222 17 0 1.835 -244 54 0.71 1.835 -56 181 1.065 1.84 -81 98 0.64 1.84 -119 72 0.695 1.84 -161 165 0 1.84 -216 236 0.535 1.84 -252 208 0.34 1.84 -2 7 0 1.845 -34 3 1.005 1.845 -43 60 1.31 1.845 -70 138 0 1.845 -73 128 1.24 1.845 -91 68 1.255 1.845 -100 176 1.135 1.845 -130 194 0 1.845 -183 194 0.835 1.845 -61 244 0 1.85 -81 110 0.73 1.85 -96 99 0.89 1.85 -141 223 1.135 1.85 -170 249 0 1.85 -200 231 1.205 1.85 -208 20 1 1.85 -49 125 1.29 1.855 -68 143 0 1.855 -103 121 0 1.855 -110 162 1.28 1.855 -114 7 0 1.855 -124 128 0 1.855 -125 96 1 1.855 -138 206 0.73 1.855 -149 140 1.205 1.855 -165 216 1.16 1.855 -204 74 0.755 1.855 -211 6 0 1.855 -4 79 0 1.86 -33 40 0 1.86 -106 128 0 1.86 -122 192 0.78 1.86 -142 221 0.805 1.86 -183 197 0 1.86 -211 231 0.11 1.86 -6 54 0.695 1.865 -19 29 1.055 1.865 -46 58 1.035 1.865 -78 76 0.81 1.865 -124 189 0.96 1.865 -139 206 0 1.865 -141 193 1.025 1.865 -145 141 0 1.865 -183 252 0 1.865 -227 97 0.555 1.865 -228 244 0 1.865 -240 58 0.425 1.865 -246 118 1.3 1.865 -5 14 0.165 1.87 -22 12 0 1.87 -51 110 0 1.87 -74 75 0 1.87 -94 112 1.35 1.87 -110 104 1.115 1.87 -120 130 0 1.87 -181 164 0 1.87 -214 236 0 1.87 -215 231 0 1.87 -241 225 0 1.87 -46 52 0 1.875 -134 150 0 1.875 -141 203 0.79 1.875 -145 129 0 1.875 -236 28 0.265 1.875 -237 206 1.355 1.875 -242 232 0 1.875 -244 51 0.835 1.875 -13 48 0.975 1.88 -47 174 1.34 1.88 -50 7 0 1.88 -72 135 0 1.88 -112 192 0 1.88 -147 161 0 1.88 -156 206 1.18 1.88 -246 256 1.285 1.88 -6 85 1.275 1.885 -17 20 0 1.885 -39 150 1.245 1.885 -94 146 0.93 1.885 -96 171 0 1.885 -151 197 0 1.885 -173 164 0 1.885 -180 184 0 1.885 -187 246 0 1.885 -213 50 1.11 1.885 -235 38 0.47 1.885 -40 53 0 1.89 -123 253 0.965 1.89 -142 193 0 1.89 -181 69 1.225 1.89 -186 253 0 1.89 -242 139 0.9 1.89 -246 38 0.55 1.89 -252 13 0 1.89 -254 203 0 1.89 -22 7 1.115 1.895 -24 89 0 1.895 -60 70 0 1.895 -109 171 0.06 1.895 -113 181 1.16 1.895 -124 183 1.125 1.895 -143 194 1.2 1.895 -167 179 0 1.895 -183 187 0 1.895 -183 201 0.64 1.895 -190 68 0 1.895 -219 212 1.36 1.895 -228 52 0 1.895 -245 38 0 1.895 -247 118 1.275 1.895 -70 130 0 1.9 -94 91 0 1.9 -153 80 0 1.9 -225 20 0.815 1.9 -237 209 0.54 1.9 -247 40 1.305 1.9 -5 52 0 1.905 -23 18 0 1.905 -61 207 0 1.905 -80 145 0 1.905 -82 103 0 1.905 -90 171 0.1 1.905 -94 101 1.385 1.905 -110 115 0 1.905 -131 139 0.805 1.905 -138 198 0.625 1.905 -219 41 0 1.905 -233 188 0.425 1.905 -238 30 0.84 1.905 -249 253 0 1.905 -4 97 0.28 1.91 -25 105 0 1.91 -37 54 0.11 1.91 -56 73 0 1.91 -68 129 0 1.91 -99 127 0.615 1.91 -154 217 0 1.91 -179 230 0 1.91 -204 26 0 1.91 -249 61 0 1.91 -254 251 1.34 1.91 -3 85 1.165 1.915 -3 130 1.125 1.915 -47 107 1.26 1.915 -55 124 0 1.915 -57 53 0 1.915 -91 107 0 1.915 -166 184 0.69 1.915 -194 243 0.705 1.915 -220 38 0 1.915 -238 248 1.355 1.915 -32 80 0.72 1.92 -50 211 1.045 1.92 -56 72 0.67 1.92 -67 182 1.245 1.92 -75 76 0 1.92 -100 152 0.635 1.92 -172 189 0 1.92 -185 131 1.31 1.92 -187 61 0.5 1.92 -216 232 0 1.92 -239 227 1.215 1.92 -252 43 1.335 1.92 -255 208 0.985 1.92 -51 178 0.065 1.925 -62 60 0.78 1.925 -66 145 0 1.925 -111 164 0.84 1.925 -166 249 0 1.925 -200 9 1.26 1.925 -230 248 0 1.925 -255 5 1.085 1.925 -12 85 0 1.93 -27 91 0 1.93 -35 110 0 1.93 -51 181 0.95 1.93 -87 157 0.105 1.93 -110 146 1.205 1.93 -148 238 1.395 1.93 -153 142 0.8 1.93 -158 171 0 1.93 -175 224 0 1.93 -185 168 0 1.93 -8 130 1 1.935 -41 43 0 1.935 -66 35 1.38 1.935 -182 50 1.16 1.935 -194 209 1.135 1.935 -210 222 0 1.935 -220 247 0.055 1.935 -243 54 0 1.935 -20 125 1.275 1.94 -47 112 1.255 1.94 -81 88 0 1.94 -87 77 1.275 1.94 -108 179 1.13 1.94 -166 152 0 1.94 -190 193 0 1.94 -226 38 1.39 1.94 -27 47 0 1.945 -74 87 0 1.945 -81 109 0.205 1.945 -108 189 0 1.945 -162 175 0 1.945 -222 238 0 1.945 -91 103 1.35 1.95 -118 69 0 1.95 -124 108 0 1.95 -138 151 0 1.95 -144 207 0 1.95 -183 198 1.155 1.95 -46 63 0 1.955 -52 54 0.71 1.955 -56 67 0 1.955 -62 208 0.955 1.955 -63 99 1.355 1.955 -114 130 0 1.955 -142 146 1.065 1.955 -33 110 0 1.96 -47 96 0 1.96 -90 160 0.585 1.96 -94 113 1.415 1.96 -140 206 0.515 1.96 -147 165 0 1.96 -166 139 1.41 1.96 -17 216 0 1.965 -119 67 0 1.965 -130 86 1.35 1.965 -151 186 1.235 1.965 -173 189 0 1.965 -25 43 0 1.97 -37 57 0.36 1.97 -76 141 0.31 1.97 -130 213 0 1.97 -132 146 0 1.97 -134 184 0 1.97 -138 217 0 1.97 -158 156 0.45 1.97 -185 167 0 1.97 -228 97 0.585 1.97 -12 86 1.365 1.975 -69 145 0.915 1.975 -83 152 0 1.975 -87 138 0 1.975 -111 146 0 1.975 -161 224 1.38 1.975 -220 24 0.625 1.975 -226 244 0 1.975 -76 80 0 1.98 -100 167 0.76 1.98 -110 164 1.23 1.98 -129 184 0 1.98 -218 240 0 1.98 -220 249 0.035 1.98 -249 38 0 1.98 -93 33 1.35 1.985 -107 150 0 1.985 -111 98 0.575 1.985 -114 129 0 1.985 -142 99 1.335 1.985 -167 188 1.375 1.985 -5 85 1.39 1.99 -25 236 0.245 1.99 -45 36 0 1.99 -47 58 1.245 1.99 -50 8 0 1.99 -102 124 0 1.99 -104 152 0.865 1.99 -131 197 0 1.99 -146 209 0 1.99 -159 152 1.13 1.99 -159 163 0.975 1.99 -213 146 0 1.99 -220 45 0 1.99 -236 24 0.88 1.99 -42 105 0 1.995 -112 169 0 1.995 -135 50 0.77 1.995 -142 156 0.91 1.995 -166 229 0 1.995 -181 167 0 1.995 -213 6 0 1.995 -122 189 0 2 -214 221 1.47 2 -26 105 0 2.005 -117 122 1.455 2.005 -130 137 0.945 2.005 -174 100 1.165 2.005 -210 239 0 2.005 -218 30 0 2.005 -4 94 0 2.01 -22 232 1.4 2.01 -30 106 1.355 2.01 -66 97 0.805 2.01 -87 155 0 2.01 -102 167 0.195 2.01 -129 135 0.9 2.01 -168 188 0.44 2.01 -183 243 1.42 2.01 -183 250 0 2.01 -17 8 0 2.015 -134 140 0 2.015 -151 202 0 2.015 -184 187 1.48 2.015 -195 248 0 2.015 -207 15 0 2.015 -31 33 0 2.02 -53 8 0.9 2.02 -202 216 1.335 2.02 -205 193 0 2.02 -224 47 0 2.02 -13 219 0 2.025 -30 63 1.385 2.025 -74 153 0 2.025 -227 236 0.925 2.025 -229 249 1.41 2.025 -21 38 1.49 2.03 -32 142 1.525 2.03 -87 182 0.91 2.03 -104 168 0 2.03 -132 157 1.41 2.03 -154 84 0.29 2.03 -163 239 0.27 2.03 -181 73 1.01 2.03 -202 22 0.89 2.03 -202 10 0 2.03 -214 25 0 2.03 -2 83 1.48 2.035 -6 216 0 2.035 -65 132 1.205 2.035 -72 153 0 2.035 -87 217 0.585 2.035 -136 215 1.355 2.035 -4 85 0 2.04 -22 38 0 2.04 -28 91 0 2.04 -37 81 1.46 2.04 -57 43 0 2.04 -100 168 0 2.04 -121 187 1.525 2.04 -131 50 0.07 2.04 -254 141 0 2.04 -48 34 1.3 2.045 -100 179 0.38 2.045 -188 230 0.415 2.045 -222 163 0 2.045 -224 20 0.785 2.045 -240 29 0.46 2.045 -59 174 1.32 2.05 -134 124 0 2.05 -135 202 0 2.05 -142 154 0 2.05 -158 163 0.86 2.05 -171 221 0 2.05 -184 151 1.205 2.05 -247 251 0 2.05 -255 248 1.355 2.05 -46 94 1.105 2.055 -88 213 1.445 2.055 -92 104 1.38 2.055 -164 242 0 2.055 -164 239 0 2.055 -204 216 0 2.055 -215 8 1.48 2.055 -240 43 0.73 2.055 -250 199 0 2.055 -19 97 0 2.06 -121 140 1.485 2.06 -137 86 1.52 2.06 -149 217 1.155 2.06 -161 225 0 2.06 -218 236 0 2.06 -25 235 0 2.065 -42 107 1.545 2.065 -87 90 0 2.065 -94 18 0.31 2.065 -105 117 1.14 2.065 -112 172 0 2.065 -118 77 1.405 2.065 -187 198 1.4 2.065 -222 146 0.46 2.065 -226 239 0 2.065 -226 253 1.005 2.065 -20 110 0 2.07 -62 122 0 2.07 -66 149 0 2.07 -166 230 0 2.07 -217 229 1.52 2.07 -241 194 0.515 2.07 -18 68 1.535 2.075 -52 248 1.325 2.075 -69 129 0.8 2.075 -114 180 1.385 2.075 -133 194 0 2.075 -145 173 1.375 2.075 -153 90 0 2.075 -164 253 0 2.075 -203 197 1.51 2.075 -224 93 1.5 2.075 -228 51 0 2.075 -28 43 0 2.08 -31 18 0 2.08 -49 58 1.095 2.08 -59 124 0.605 2.08 -75 157 0 2.08 -119 151 1.525 2.08 -133 149 0 2.08 -145 143 0 2.08 -148 17 1.515 2.08 -159 146 0.39 2.08 -230 250 1.21 2.08 -233 25 1.4 2.08 -246 53 0.72 2.08 -38 42 0 2.085 -39 115 1.4 2.085 -75 153 0 2.085 -102 133 0.905 2.085 -180 244 0 2.085 -87 140 0 2.09 -123 116 0.165 2.09 -126 189 0 2.09 -245 255 1.09 2.09 -17 239 0 2.095 -37 97 0.545 2.095 -46 97 0 2.095 -72 150 0 2.095 -91 109 0 2.095 -115 121 1.33 2.095 -168 175 1.305 2.095 -195 6 0 2.095 -197 202 0.555 2.095 -227 46 0 2.095 -17 227 0 2.1 -32 68 1.49 2.1 -65 129 0 2.1 -72 103 1.425 2.1 -123 250 0.285 2.1 -148 227 1.57 2.1 -228 48 0.96 2.1 -19 94 0 2.105 -28 106 0 2.105 -64 190 1.37 2.105 -68 157 0.92 2.105 -85 97 0.55 2.105 -88 148 1.055 2.105 -99 152 1.595 2.105 -139 230 1.545 2.105 -252 16 1.16 2.105 -4 130 0.75 2.11 -35 44 1.5 2.11 -75 144 0 2.11 -76 149 1.565 2.11 -93 111 0 2.11 -101 169 1.495 2.11 -146 216 1.205 2.11 -166 214 0 2.11 -166 226 0 2.11 -191 207 1.46 2.11 -191 242 0 2.11 -212 94 1.39 2.11 -218 10 1.45 2.11 -224 209 0.275 2.11 -224 212 0 2.11 -231 25 0 2.11 -102 188 1.34 2.115 -123 205 1.34 2.115 -138 92 0 2.115 -189 141 0 2.115 -203 10 0 2.115 -206 224 0 2.115 -212 48 1.4 2.115 -217 237 0 2.115 -2 15 0 2.12 -23 74 0 2.12 -35 57 1.56 2.12 -39 42 0 2.12 -72 132 1.25 2.12 -143 256 0.63 2.12 -154 172 0.625 2.12 -198 206 0.77 2.12 -208 77 0.935 2.12 -212 29 0 2.12 -227 81 1.29 2.12 -20 98 0 2.125 -93 91 0 2.125 -102 73 0.62 2.125 -144 157 0 2.125 -151 157 0.255 2.125 -160 176 0 2.125 -175 227 1.5 2.125 -9 70 0.4 2.13 -57 11 0 2.13 -70 77 1.045 2.13 -93 89 0 2.13 -95 98 1.57 2.13 -106 92 1.495 2.13 -123 79 0 2.13 -138 182 0 2.13 -164 179 0 2.13 -228 253 1.58 2.13 -42 54 1.3 2.135 -66 99 0.635 2.135 -73 87 0 2.135 -95 132 0 2.135 -142 206 0 2.135 -147 229 0 2.135 -154 127 0.39 2.135 -195 199 0 2.135 -224 48 1.02 2.135 -238 1 0.71 2.135 -44 117 1.39 2.14 -51 102 0 2.14 -71 140 0 2.14 -159 17 0.29 2.14 -199 11 0 2.14 -212 97 0.585 2.14 -26 221 0 2.145 -109 157 0.75 2.145 -131 244 0 2.145 -147 17 0.955 2.145 -18 95 1.28 2.15 -27 57 1.515 2.15 -66 86 0.6 2.15 -106 101 1.545 2.15 -158 109 0 2.15 -166 234 1.395 2.15 -191 256 0 2.15 -195 53 0 2.15 -218 231 1.46 2.15 -225 34 0 2.15 -239 18 0 2.15 -246 195 0.605 2.15 -102 182 0 2.155 -126 129 0.725 2.155 -62 16 0 2.16 -79 145 0 2.16 -102 172 0.155 2.16 -125 154 0.555 2.16 -132 222 0 2.16 -154 167 1.17 2.16 -162 102 0.295 2.16 -178 185 1.19 2.16 -178 184 0 2.16 -245 53 0 2.16 -13 31 0 2.165 -39 118 0.375 2.165 -90 108 0 2.165 -123 189 0 2.165 -123 141 0 2.165 -135 246 0 2.165 -190 242 0.755 2.165 -192 193 0 2.165 -221 10 0 2.165 -5 22 1.09 2.17 -58 7 1.62 2.17 -91 79 1.59 2.17 -91 214 1.575 2.17 -93 97 0 2.17 -148 229 0.85 2.17 -175 18 1.62 2.17 -177 166 1.62 2.17 -201 13 0 2.17 -210 146 0 2.17 -226 179 0 2.17 -66 88 0 2.175 -78 130 1.115 2.175 -108 214 1.165 2.175 -108 156 0 2.175 -147 214 0 2.175 -154 166 1.485 2.175 -166 180 1.57 2.175 -221 235 0 2.175 -249 203 1.2 2.175 -42 118 1.36 2.18 -96 110 0.76 2.18 -133 188 0 2.18 -154 176 0 2.18 -14 18 0.845 2.185 -120 102 0 2.185 -175 45 0.21 2.185 -182 197 0 2.185 -209 21 1.525 2.185 -223 10 0 2.185 -3 134 1.58 2.19 -18 97 0 2.19 -55 86 1.1 2.19 -68 84 0 2.19 -68 94 0 2.19 -112 189 0 2.19 -127 146 0.97 2.19 -134 242 1.65 2.19 -152 231 0 2.19 -171 189 0 2.19 -201 206 0.53 2.19 -217 167 0 2.19 -237 212 1.37 2.19 -5 70 0 2.195 -123 144 0.385 2.195 -136 197 0 2.195 -148 150 1.475 2.195 -162 184 0.335 2.195 -219 74 1.095 2.195 -254 250 1.58 2.195 -22 82 0 2.2 -23 27 0 2.2 -79 242 1.7 2.2 -103 115 1.31 2.2 -148 165 0 2.2 -162 172 1.675 2.2 -166 233 0 2.2 -169 229 1.435 2.2 -5 71 0.57 2.205 -35 114 1.505 2.205 -111 128 1.07 2.205 -124 184 1.32 2.205 -178 136 0.49 2.205 -187 207 1.56 2.205 -210 217 1.35 2.205 -223 218 0 2.205 -237 223 0 2.205 -243 199 0 2.205 -2 24 0 2.21 -25 24 0 2.21 -28 32 0 2.21 -49 3 0 2.21 -59 108 0 2.21 -63 111 1.095 2.21 -121 71 0 2.21 -143 244 0 2.21 -149 156 0 2.21 -179 244 0 2.21 -247 51 1.6 2.21 -249 9 1.665 2.21 -252 38 0 2.21 -40 178 1.305 2.215 -99 147 0 2.215 -126 141 0.965 2.215 -245 228 0 2.215 -20 111 1.295 2.22 -32 44 1.625 2.22 -59 185 1.285 2.22 -69 95 0.89 2.22 -149 194 0 2.22 -187 202 1.205 2.22 -14 212 0 2.225 -32 107 0 2.225 -43 55 0 2.225 -56 70 0 2.225 -88 162 0 2.225 -146 229 0 2.225 -148 216 1.53 2.225 -187 206 0.93 2.225 -242 143 0.845 2.225 -255 196 1.675 2.225 -12 80 0.275 2.23 -29 125 1.35 2.23 -56 21 1.315 2.23 -79 83 1.52 2.23 -86 156 0.505 2.23 -93 109 0 2.23 -103 174 1.68 2.23 -105 185 1.715 2.23 -160 235 0 2.23 -93 142 0 2.235 -178 119 0 2.235 -183 231 1.725 2.235 -192 157 1.145 2.235 -200 24 0.495 2.235 -2 71 1.6 2.24 -8 73 1.605 2.24 -13 11 0 2.24 -16 68 0.735 2.24 -22 235 1.455 2.24 -26 85 1.675 2.24 -62 78 0.56 2.24 -69 149 0.905 2.24 -72 147 0 2.24 -88 97 0 2.24 -90 112 0 2.24 -93 83 1.225 2.24 -95 149 1.115 2.24 -96 97 0 2.24 -174 185 0.52 2.24 -233 231 0 2.24 -251 29 1.48 2.24 -100 150 0.78 2.245 -101 27 1.625 2.245 -106 89 1.11 2.245 -145 193 0 2.245 -166 245 0 2.245 -240 225 0 2.245 -40 60 0 2.25 -102 115 0 2.25 -119 184 1.21 2.25 -132 213 0 2.25 -159 237 0 2.25 -174 121 0.6 2.25 -206 218 0 2.25 -81 24 0 2.255 -108 127 1.555 2.255 -134 194 0 2.255 -138 89 0 2.255 -142 173 0.97 2.255 -151 160 0.855 2.255 -181 139 0.8 2.255 -248 115 1.605 2.255 -30 25 1.01 2.26 -38 60 0 2.26 -44 90 0 2.26 -120 124 0 2.26 -154 112 0 2.26 -158 239 1.095 2.26 -170 205 1.455 2.26 -177 179 0 2.26 -193 255 0 2.26 -196 31 0 2.26 -13 209 1.75 2.265 -26 23 0 2.265 -39 51 0 2.265 -59 105 0 2.265 -84 165 0 2.265 -85 10 1.73 2.265 -92 174 1.35 2.265 -103 152 0 2.265 -133 121 0.565 2.265 -187 13 1.36 2.265 -195 227 1.245 2.265 -203 215 0.73 2.265 -248 113 1.65 2.265 -249 256 0 2.265 -4 83 0 2.27 -31 235 1.6 2.27 -48 60 0.815 2.27 -106 154 0.15 2.27 -128 129 0 2.27 -177 131 0 2.27 -181 124 0 2.27 -195 22 1.31 2.27 -239 225 0 2.27 -251 47 1.75 2.27 -16 138 1.5 2.275 -26 89 1.075 2.275 -27 40 1.66 2.275 -33 113 1.495 2.275 -79 95 0 2.275 -121 138 1.545 2.275 -127 188 1.675 2.275 -158 240 1.455 2.275 -187 201 0.875 2.275 -218 41 0 2.275 -220 221 0 2.275 -237 31 1.57 2.275 -2 78 0 2.28 -26 21 1.69 2.28 -32 106 0 2.28 -33 52 1.095 2.28 -79 157 0 2.28 -124 179 1.395 2.28 -162 119 1.595 2.28 -170 250 0 2.28 -177 120 0 2.28 -184 186 1.725 2.28 -196 239 1.23 2.28 -215 221 0.47 2.28 -217 206 0.545 2.28 -249 60 1.335 2.28 -25 44 0.06 2.285 -26 32 0 2.285 -63 190 1.01 2.285 -171 236 1.745 2.285 -239 19 1.24 2.285 -35 55 1.01 2.29 -38 115 1.77 2.29 -70 90 0.925 2.29 -112 234 0.125 2.29 -183 236 0 2.29 -205 198 1.31 2.29 -210 150 0.78 2.29 -211 41 1.71 2.29 -221 25 0.305 2.29 -229 218 1.55 2.29 -232 18 1.605 2.29 -253 201 1.78 2.29 -65 83 1.005 2.295 -93 77 0 2.295 -126 192 0.84 2.295 -8 119 1.61 2.3 -20 96 0.64 2.3 -29 20 0 2.3 -40 107 1.66 2.3 -78 69 0.58 2.3 -95 147 0.345 2.3 -103 112 1.74 2.3 -107 117 1.505 2.3 -158 176 0 2.3 -248 6 1.79 2.3 -23 82 0 2.305 -32 77 1.57 2.305 -40 133 1.72 2.305 -46 53 1.79 2.305 -80 155 0 2.305 -237 202 1.305 2.305 -237 29 0 2.305 -249 44 0.86 2.305 -14 30 1.795 2.31 -14 68 0.515 2.31 -95 222 1.46 2.31 -105 104 0 2.31 -163 231 0 2.31 -178 71 0 2.31 -193 148 1.55 2.31 -196 18 1.79 2.31 -209 227 0 2.31 -252 62 0.75 2.31 -35 117 0 2.315 -114 119 0 2.315 -157 206 0.49 2.315 -162 167 0 2.315 -224 32 0 2.315 -225 41 1.795 2.315 -228 38 0.585 2.315 -238 245 0.695 2.315 -4 142 0.62 2.32 -36 3 1.6 2.32 -49 98 1.81 2.32 -76 157 0 2.32 -81 101 0.75 2.32 -110 189 0.77 2.32 -161 253 1.315 2.32 -186 135 0 2.32 -186 201 0.68 2.32 -187 141 0 2.32 -220 232 0 2.32 -40 199 0.705 2.325 -40 59 1.64 2.325 -60 71 0 2.325 -76 135 1.605 2.325 -77 68 0 2.325 -171 220 0 2.325 -215 229 0 2.325 -223 224 0 2.325 -234 203 1.535 2.325 -245 34 0 2.325 -256 16 0 2.325 -8 137 1.525 2.33 -15 19 0.85 2.33 -25 39 0 2.33 -35 115 0 2.33 -67 145 0 2.33 -81 97 0 2.33 -99 115 0 2.33 -100 117 1.825 2.33 -112 161 1.315 2.33 -128 161 0.985 2.33 -133 180 0 2.33 -146 115 1.795 2.33 -168 38 1.44 2.33 -170 251 0.17 2.33 -173 175 0 2.33 -187 254 0 2.33 -213 169 1.445 2.33 -4 67 0 2.335 -57 9 0 2.335 -78 79 0 2.335 -112 138 1.735 2.335 -154 170 0 2.335 -187 252 0 2.335 -212 45 0 2.335 -217 6 1.34 2.335 -15 68 0.66 2.34 -44 89 1.835 2.34 -47 59 0.72 2.34 -53 69 0.42 2.34 -92 160 0 2.34 -181 140 1.405 2.34 -237 30 0 2.34 -247 244 1.495 2.34 -64 16 0 2.345 -82 41 0.985 2.345 -207 19 0.9 2.345 -212 232 1.735 2.345 -232 41 0 2.345 -3 133 1.565 2.35 -16 122 0 2.35 -22 236 0 2.35 -42 199 0.95 2.35 -45 20 0 2.35 -123 172 0 2.35 -188 189 0 2.35 -201 42 1.4 2.35 -212 43 1.42 2.35 -223 15 1.685 2.35 -249 199 1.39 2.35 -12 93 0 2.355 -12 32 1.585 2.355 -26 30 0 2.355 -29 94 0 2.355 -36 65 1.56 2.355 -36 126 0 2.355 -45 228 0 2.355 -84 163 0 2.355 -129 253 1.83 2.355 -143 222 1.58 2.355 -159 173 0 2.355 -161 234 1.18 2.355 -164 243 0 2.355 -193 225 1.765 2.355 -194 225 1.775 2.355 -200 56 1.39 2.355 -223 29 0 2.355 -36 116 0 2.36 -61 34 1.235 2.36 -98 102 0 2.36 -128 189 0 2.36 -213 160 1.755 2.36 -232 44 1.3 2.36 -2 52 1.355 2.365 -29 47 0 2.365 -30 235 0 2.365 -53 116 1.815 2.365 -95 146 0.315 2.365 -152 169 0 2.365 -168 171 1.835 2.365 -15 81 1.825 2.37 -41 54 0.075 2.37 -42 9 1 2.37 -48 126 0.69 2.37 -78 67 1.78 2.37 -101 89 1.825 2.37 -108 122 0 2.37 -231 101 1.815 2.37 -241 49 1.75 2.37 -1 69 1.8 2.375 -14 77 0 2.375 -20 109 0 2.375 -25 32 0 2.375 -36 115 0 2.375 -62 9 1.015 2.375 -96 107 0 2.375 -128 191 0 2.375 -137 138 0 2.375 -140 157 0 2.375 -169 220 1.375 2.375 -195 18 0.935 2.375 -203 42 1.36 2.375 -217 221 0 2.375 -9 121 1.8 2.38 -13 202 0 2.38 -125 108 0 2.38 -127 241 1.22 2.38 -145 210 0 2.38 -158 127 0.825 2.38 -187 255 1.775 2.38 -232 35 1.455 2.38 -49 38 1.845 2.385 -118 182 1.415 2.385 -126 127 0 2.385 -158 237 0 2.385 -172 250 0 2.385 -184 155 1.83 2.385 -219 32 0 2.385 -234 58 1.325 2.385 -235 256 1.76 2.385 -14 80 1.375 2.39 -21 101 0.595 2.39 -32 91 0 2.39 -105 121 0 2.39 -126 110 1.435 2.39 -145 196 0.99 2.39 -191 129 1.82 2.39 -217 169 0.175 2.39 -235 58 1.605 2.39 -34 1 0.445 2.395 -46 29 0.275 2.395 -142 222 1.03 2.395 -163 227 0 2.395 -214 231 0 2.395 -241 248 0 2.395 -13 16 0 2.4 -26 232 1.58 2.4 -43 58 1.085 2.4 -63 107 1.025 2.4 -74 20 1.16 2.4 -77 157 1.11 2.4 -96 174 0 2.4 -143 210 1.545 2.4 -161 228 1.605 2.4 -168 34 1.73 2.4 -250 57 0 2.4 -32 89 0 2.405 -64 114 1.65 2.405 -138 205 1.815 2.405 -163 211 0.225 2.405 -185 153 1.865 2.405 -238 34 0 2.405 -24 97 0 2.41 -35 52 0.87 2.41 -43 62 1.255 2.41 -48 122 0 2.41 -96 222 1.185 2.41 -133 184 0 2.41 -165 238 1.75 2.41 -169 160 0 2.41 -174 156 0.485 2.41 -180 193 0 2.41 -8 83 0 2.415 -13 204 1.42 2.415 -21 89 1.855 2.415 -84 175 0.875 2.415 -115 164 1.7 2.415 -116 134 1.525 2.415 -160 171 0 2.415 -160 198 1.23 2.415 -160 240 0.355 2.415 -226 34 0 2.415 -234 42 0 2.415 -8 24 0 2.42 -46 34 0 2.42 -48 1 0.965 2.42 -67 95 1.635 2.42 -87 99 1.91 2.42 -186 157 0.045 2.42 -226 227 0 2.42 -14 12 1.755 2.425 -25 85 0 2.425 -180 132 0 2.425 -188 252 0 2.425 -82 38 1.245 2.43 -120 162 0 2.43 -142 94 0 2.43 -153 194 1.845 2.43 -189 144 0.4 2.43 -191 243 0.64 2.43 -207 208 0 2.43 -247 53 1.225 2.43 -22 66 1.52 2.435 -41 35 0.385 2.435 -70 151 1.115 2.435 -99 150 0 2.435 -111 159 0.35 2.435 -153 184 1.805 2.435 -171 239 1.615 2.435 -251 9 0.54 2.435 -253 243 1 2.435 -35 177 1.455 2.44 -73 140 1.165 2.44 -112 113 1.865 2.44 -160 220 1.46 2.44 -172 246 0 2.44 -191 251 0.75 2.44 -223 219 0 2.44 -244 34 0 2.44 -249 42 0 2.44 -17 225 0 2.445 -58 121 0 2.445 -98 190 1.415 2.445 -116 130 0.78 2.445 -175 165 0.475 2.445 -181 123 1.82 2.445 -207 209 0 2.445 -222 196 0 2.445 -38 99 1.905 2.45 -87 145 1.94 2.45 -120 179 0 2.45 -125 73 1.82 2.45 -175 241 0 2.45 -180 183 1.525 2.45 -191 205 0 2.45 -222 206 0 2.45 -235 27 1.225 2.45 -246 42 1.31 2.45 -252 205 0 2.45 -12 121 1.695 2.455 -13 221 1.54 2.455 -21 83 1.345 2.455 -49 43 1.365 2.455 -58 78 1.255 2.455 -70 124 1.77 2.455 -74 68 1.125 2.455 -81 111 0 2.455 -120 116 0 2.455 -120 182 0 2.455 -174 122 0.56 2.455 -191 165 1.36 2.455 -254 206 0 2.455 -63 174 0.71 2.46 -78 75 0 2.46 -79 136 1.36 2.46 -134 146 1.945 2.46 -163 37 1.595 2.46 -172 252 1.565 2.46 -188 251 0 2.46 -238 50 1.84 2.46 -251 13 0 2.46 -254 1 0 2.46 -17 31 0 2.465 -35 103 1.37 2.465 -48 11 0.955 2.465 -48 113 0 2.465 -75 68 0.745 2.465 -82 28 0.345 2.465 -92 213 1.075 2.465 -95 88 1.255 2.465 -96 92 0 2.465 -99 166 1.73 2.465 -172 179 0.215 2.465 -188 205 1.225 2.465 -204 7 0 2.465 -233 221 0.125 2.465 -240 243 1.855 2.465 -248 7 0 2.465 -23 24 0 2.47 -52 120 0.71 2.47 -59 62 0 2.47 -65 190 0 2.47 -73 182 0 2.47 -112 173 0 2.47 -114 104 1.93 2.47 -158 97 1.81 2.47 -165 228 1.875 2.47 -175 196 1.56 2.47 -203 12 0 2.47 -215 7 1.55 2.47 -226 212 0 2.47 -235 43 0 2.47 -14 10 0 2.475 -15 75 0.66 2.475 -34 199 0.895 2.475 -58 12 0 2.475 -79 69 1.445 2.475 -82 40 0 2.475 -147 207 1.72 2.475 -169 176 1.015 2.475 -187 238 1.895 2.475 -207 211 0.83 2.475 -226 231 0 2.475 -236 50 1.875 2.475 -49 56 1.855 2.48 -85 76 0 2.48 -114 190 0 2.48 -126 121 1.48 2.48 -255 34 0.655 2.48 -15 12 1.64 2.485 -44 101 0 2.485 -49 113 0 2.485 -58 77 0 2.485 -59 12 1.82 2.485 -72 84 1.855 2.485 -85 27 1.61 2.485 -125 60 1.01 2.485 -139 153 0 2.485 -231 50 1.88 2.485 -10 73 1.745 2.49 -17 18 0 2.49 -79 147 1.52 2.49 -127 175 0.45 2.49 -142 90 1.22 2.49 -142 111 0.14 2.49 -147 194 0 2.49 -46 19 1.33 2.495 -61 59 0 2.495 -133 242 0 2.495 -171 251 1.025 2.495 -204 223 0.345 2.495 -225 24 1.37 2.495 -17 16 1.77 2.5 -49 15 0 2.5 -81 134 1.93 2.5 -87 213 0.91 2.5 -87 147 1.765 2.5 -140 245 1.875 2.5 -168 57 1.745 2.5 -170 140 1.655 2.5 -203 59 1.895 2.5 -234 256 0 2.5 -31 209 0.525 2.505 -40 150 1.65 2.505 -45 57 1.91 2.505 -49 97 1.345 2.505 -58 55 0 2.505 -71 83 1.59 2.505 -80 134 1.94 2.505 -81 145 0 2.505 -95 159 0 2.505 -102 119 0 2.505 -103 90 0 2.505 -165 242 1.915 2.505 -180 131 0 2.505 -254 132 0 2.505 -56 116 0.535 2.51 -75 132 1.375 2.51 -112 190 0 2.51 -114 131 1.485 2.51 -125 123 0 2.51 -146 214 0.605 2.51 -155 201 0 2.51 -170 235 2.005 2.51 -207 5 0.805 2.51 -237 189 0.285 2.51 -49 64 0 2.515 -70 27 0 2.515 -166 164 0.54 2.515 -170 139 1.02 2.515 -156 221 0 2.52 -217 208 1.865 2.52 -65 177 0 2.525 -114 162 0.35 2.525 -133 140 0 2.525 -170 233 0 2.525 -207 2 0 2.525 -213 229 0 2.525 -220 24 2.02 2.525 -220 27 0 2.525 -251 30 1.195 2.525 -80 129 0.95 2.53 -100 166 0.55 2.53 -128 186 0 2.53 -134 145 0.715 2.53 -138 90 0 2.53 -147 206 2.015 2.53 -227 8 0.89 2.53 -70 91 0 2.535 -128 176 0.4 2.535 -161 190 1.915 2.535 -168 139 1.05 2.535 -187 256 0 2.535 -189 132 2.03 2.535 -19 83 0 2.54 -28 101 0 2.54 -50 34 0 2.54 -58 112 1.885 2.54 -84 104 1.095 2.54 -133 79 1.815 2.54 -134 159 2.035 2.54 -145 151 1.875 2.54 -152 37 1.98 2.54 -167 37 1.95 2.54 -170 119 1.88 2.54 -171 139 1.87 2.54 -41 248 0.945 2.545 -74 75 2.025 2.545 -99 180 2.02 2.545 -184 210 1.645 2.545 -188 155 1.76 2.545 -202 223 0 2.545 -221 29 0 2.545 -228 19 1.69 2.545 -233 251 1.22 2.545 -250 48 1.59 2.545 -11 10 0 2.55 -45 250 1.195 2.55 -45 59 0 2.55 -79 254 0.625 2.55 -98 180 1.475 2.55 -134 79 1.585 2.55 -153 188 1.805 2.55 -251 49 1.255 2.55 -12 138 0.62 2.555 -35 54 0.645 2.555 -68 159 0.78 2.555 -80 159 0 2.555 -93 96 0 2.555 -116 181 0.505 2.555 -128 192 0 2.555 -157 239 1.985 2.555 -158 156 2.055 2.555 -168 227 1.575 2.555 -213 163 0 2.555 -228 53 0 2.555 -251 238 0 2.555 -28 38 0 2.56 -84 159 0.77 2.56 -156 144 1.785 2.56 -175 253 0 2.56 -194 22 1.64 2.56 -207 136 1.26 2.56 -235 41 0 2.56 -31 19 0 2.565 -73 188 1.43 2.565 -99 165 0 2.565 -158 110 1.15 2.565 -162 128 1.895 2.565 -36 15 0.135 2.57 -124 157 1.645 2.57 -153 215 0.675 2.57 -207 53 0.715 2.57 -214 157 1.58 2.57 -217 141 0.83 2.57 -217 25 0 2.57 -37 28 0 2.575 -39 99 0 2.575 -81 77 1.805 2.575 -127 237 1.27 2.575 -156 198 0 2.575 -181 164 1.94 2.575 -217 157 0 2.575 -225 30 2.03 2.575 -49 24 1.9 2.58 -104 179 0 2.58 -139 57 1.78 2.58 -168 26 1.82 2.58 -194 21 1.995 2.58 -212 24 1.765 2.58 -238 53 0.745 2.58 -246 203 0 2.58 -18 83 0.88 2.585 -25 105 2.085 2.585 -70 74 0 2.585 -71 179 1.93 2.585 -86 107 0 2.585 -127 254 1.35 2.585 -165 247 1.86 2.585 -213 155 1.16 2.585 -246 55 2.025 2.585 -26 55 1.155 2.59 -62 4 1.64 2.59 -84 113 1.61 2.59 -126 186 1.095 2.59 -207 210 1.205 2.59 -212 34 1.42 2.59 -244 211 1.475 2.59 -252 121 2 2.59 -7 85 0 2.595 -36 110 0 2.595 -48 15 0.8 2.595 -99 163 0 2.595 -114 118 0 2.595 -125 121 0 2.595 -139 242 2.035 2.595 -165 184 2.005 2.595 -247 41 0 2.595 -253 206 2.03 2.595 -82 39 0 2.6 -118 70 0 2.6 -125 105 0 2.6 -31 81 0 2.605 -36 100 1.325 2.605 -48 112 0 2.605 -53 57 2.09 2.605 -83 151 1.87 2.605 -84 149 1.835 2.605 -116 189 0 2.605 -129 147 0 2.605 -235 46 1.14 2.605 -247 55 0 2.605 -249 45 0.85 2.605 -62 65 0 2.61 -64 123 0.71 2.61 -73 186 0 2.61 -82 104 0 2.61 -112 186 0 2.61 -128 67 1.765 2.61 -138 156 0 2.61 -164 183 1.635 2.61 -178 80 2.03 2.61 -209 37 1.635 2.61 -241 244 0 2.61 -99 148 0 2.615 -103 121 1.94 2.615 -156 219 1.815 2.615 -32 105 0 2.62 -65 134 1.56 2.62 -84 176 1.385 2.62 -90 97 2.055 2.62 -99 86 0 2.62 -109 122 1.625 2.62 -114 134 1.435 2.62 -114 79 0 2.62 -173 221 0 2.62 -197 211 0 2.62 -218 200 1.72 2.62 -256 208 0 2.62 -38 105 1.04 2.625 -43 36 0.99 2.625 -45 238 0 2.625 -45 49 1.255 2.625 -63 84 1.64 2.625 -93 68 0 2.625 -125 126 0 2.625 -155 250 0.79 2.625 -161 226 0 2.625 -241 189 1.71 2.625 -252 48 0.9 2.625 -64 80 0.7 2.63 -125 15 1.9 2.63 -178 191 1.855 2.63 -233 29 1.465 2.63 -14 66 0.29 2.635 -35 53 0 2.635 -42 15 2.025 2.635 -44 107 0 2.635 -84 88 0 2.635 -118 69 2.065 2.635 -139 199 0 2.635 -142 161 1.72 2.635 -165 254 1.965 2.635 -165 232 1.12 2.635 -219 235 0 2.635 -223 228 2.04 2.635 -44 103 0.58 2.64 -56 67 2 2.64 -63 115 1.64 2.64 -65 75 0.81 2.64 -67 147 1.485 2.64 -69 76 2.065 2.64 -96 105 0 2.64 -114 7 1.87 2.64 -13 2 1.045 2.645 -63 65 0 2.645 -63 100 1.6 2.645 -63 75 0.97 2.645 -124 80 0.205 2.645 -125 75 1.84 2.645 -126 124 1.01 2.645 -127 129 1.885 2.645 -160 205 2.035 2.645 -180 232 2.045 2.645 -226 240 0.99 2.645 -233 239 1.655 2.645 -1 16 0.825 2.65 -2 53 0.745 2.65 -15 113 0 2.65 -20 63 1.37 2.65 -73 70 0 2.65 -123 80 0.21 2.65 -127 222 1.37 2.65 -127 240 1.315 2.65 -153 141 0.39 2.65 -154 103 0 2.65 -34 52 0 2.655 -69 88 2.095 2.655 -130 161 2.145 2.655 -154 222 0.245 2.655 -159 131 1.8 2.655 -166 167 0 2.655 -166 179 0 2.655 -168 248 0 2.655 -231 85 1.91 2.655 -12 96 1.73 2.66 -63 109 0 2.66 -64 109 1.555 2.66 -84 180 1.78 2.66 -92 171 0 2.66 -96 109 0 2.66 -103 171 0.62 2.66 -120 98 1.34 2.66 -127 253 1.235 2.66 -127 238 1.28 2.66 -173 239 0.225 2.66 -220 23 0.855 2.66 -254 253 0 2.66 -1 68 1.815 2.665 -92 157 0 2.665 -154 108 0 2.665 -178 68 2.03 2.665 -184 200 0 2.665 -236 61 1.435 2.665 -83 86 0 2.67 -138 132 2.075 2.67 -139 9 0.105 2.67 -155 208 1.735 2.67 -165 225 0 2.67 -168 246 0.775 2.67 -229 34 1.81 2.67 -254 17 1.095 2.67 -40 100 0.625 2.675 -51 100 0 2.675 -54 101 0.62 2.675 -74 158 1.86 2.675 -103 214 0.67 2.675 -108 162 2.135 2.675 -168 50 1.025 2.675 -175 243 0.58 2.675 -189 228 2.11 2.675 -210 198 1.875 2.675 -214 235 0 2.675 -242 200 1.815 2.675 -29 48 0.075 2.68 -43 107 0 2.68 -61 43 0 2.68 -64 65 0 2.68 -74 142 0.25 2.68 -123 190 0 2.68 -127 173 0 2.68 -127 186 1.97 2.68 -153 213 0.645 2.68 -161 46 1.6 2.68 -162 182 0.375 2.68 -168 242 0 2.68 -196 216 1.655 2.68 -205 221 1.575 2.68 -12 85 2.175 2.685 -49 52 0 2.685 -62 35 2.035 2.685 -71 182 0 2.685 -87 83 0 2.685 -130 99 0.78 2.685 -143 253 0.645 2.685 -146 136 0 2.685 -238 30 2.085 2.685 -16 96 1.99 2.69 -36 177 1.345 2.69 -45 58 1.045 2.69 -93 80 0 2.69 -113 79 1.87 2.69 -120 68 2.035 2.69 -156 222 0.345 2.69 -161 163 0 2.69 -177 165 0.475 2.69 -244 200 0.17 2.69 -250 42 0 2.69 -4 21 0 2.695 -11 124 0 2.695 -74 141 1.78 2.695 -83 104 0.82 2.695 -110 180 1.54 2.695 -139 6 0.495 2.695 -190 253 0 2.695 -211 8 0 2.695 -242 198 1.945 2.695 -250 62 1.375 2.695 -143 147 1.445 2.7 -167 234 0.995 2.7 -168 37 1.3 2.7 -176 239 0 2.7 -185 245 1.775 2.7 -233 22 1.39 2.7 -243 52 0 2.7 -255 3 0.96 2.7 -13 5 2.055 2.705 -24 83 0 2.705 -55 98 1.9 2.705 -87 146 1.955 2.705 -100 149 1.905 2.705 -101 117 0 2.705 -135 147 0.51 2.705 -146 108 2.19 2.705 -159 152 2.15 2.705 -238 13 1.815 2.705 -247 59 2.205 2.705 -248 1 1.15 2.705 -56 98 1.93 2.71 -58 125 0.43 2.71 -87 169 0 2.71 -153 160 0 2.71 -249 242 2.09 2.71 -35 100 0 2.715 -52 68 1.78 2.715 -86 104 0 2.715 -104 149 1.405 2.715 -104 167 0 2.715 -153 144 0 2.715 -162 242 0.55 2.715 -175 174 2.075 2.715 -248 98 1.665 2.715 -54 102 0 2.72 -91 169 0 2.72 -106 123 2 2.72 -110 190 1.16 2.72 -141 156 0.88 2.72 -152 196 1.57 2.72 -176 45 0.565 2.72 -201 16 1.195 2.72 -252 55 0 2.72 -61 52 0 2.725 -71 91 1.81 2.725 -88 164 1.73 2.725 -111 141 2 2.725 -125 11 1.165 2.725 -140 141 0 2.725 -177 187 2.13 2.725 -183 242 0 2.725 -203 52 1.92 2.725 -204 74 2.13 2.725 -75 253 2.105 2.73 -83 103 2.14 2.73 -90 169 0 2.73 -160 196 1.955 2.73 -233 45 0.74 2.73 -241 246 0.815 2.73 -247 42 0 2.73 -4 72 0.51 2.735 -39 98 0 2.735 -55 56 0 2.735 -60 16 0.21 2.735 -85 104 0.89 2.735 -126 123 0 2.735 -140 160 0 2.735 -209 240 1.32 2.735 -210 21 0 2.735 -223 21 2.235 2.735 -235 245 2.2 2.735 -21 69 0 2.74 -58 44 0 2.74 -81 8 0 2.74 -88 100 0.37 2.74 -139 60 2.19 2.74 -158 174 0 2.74 -161 189 0 2.74 -195 53 2.2 2.74 -210 244 1.635 2.74 -220 37 0 2.74 -225 21 1.235 2.74 -8 89 1.455 2.745 -58 106 0.435 2.745 -75 140 0 2.745 -100 165 0 2.745 -118 9 0.355 2.745 -165 180 1.295 2.745 -204 78 2.075 2.745 -216 24 0 2.745 -220 28 0 2.745 -62 14 0 2.75 -62 126 0 2.75 -64 75 0 2.75 -100 103 0.475 2.75 -119 179 0 2.75 -125 177 2.1 2.75 -140 205 1.23 2.75 -215 10 1.415 2.75 -225 2 1.805 2.75 -245 198 1.545 2.75 -77 140 2.25 2.755 -80 192 0 2.755 -81 21 0.105 2.755 -128 180 0.34 2.755 -172 45 2.165 2.755 -175 149 2.12 2.755 -175 176 0 2.755 -175 255 1.83 2.755 -192 202 1.485 2.755 -252 5 2.1 2.755 -8 82 0 2.76 -51 162 0.975 2.76 -131 147 0 2.76 -197 3 1.96 2.76 -252 54 0 2.76 -254 53 1.54 2.76 -38 53 0 2.765 -40 97 0 2.765 -67 87 1.54 2.765 -70 83 1.42 2.765 -113 80 1.8 2.765 -139 256 0 2.765 -144 251 0.695 2.765 -162 131 0.425 2.765 -177 161 0 2.765 -186 253 1.955 2.765 -187 251 0 2.765 -218 29 0 2.765 -73 16 0 2.77 -172 251 0 2.77 -222 234 2.145 2.77 -226 209 1.24 2.77 -233 236 0 2.77 -69 136 1.245 2.775 -81 67 1.74 2.775 -100 181 0 2.775 -146 175 0 2.775 -158 191 1.63 2.775 -183 198 2.13 2.775 -211 81 1.465 2.775 -231 28 0 2.775 -244 197 0 2.775 -245 201 1.415 2.775 -8 67 0 2.78 -19 24 0 2.78 -56 119 0 2.78 -62 3 0 2.78 -62 98 2.135 2.78 -64 78 0 2.78 -165 145 1.43 2.78 -225 20 1.995 2.78 -252 106 1.375 2.78 -252 7 0 2.78 -5 114 0 2.785 -73 80 0 2.785 -116 132 1.025 2.785 -127 234 1.215 2.785 -148 226 0 2.785 -193 206 0 2.785 -244 184 0.47 2.785 -8 86 0 2.79 -24 87 2.175 2.79 -103 167 0 2.79 -103 233 1.615 2.79 -106 11 1.995 2.79 -110 187 2.065 2.79 -181 242 0 2.79 -196 225 1.21 2.79 -199 9 0 2.79 -253 15 2.245 2.79 -103 172 0 2.795 -106 54 1.27 2.795 -119 186 0.425 2.795 -126 112 0 2.795 -128 187 0 2.795 -160 215 1.03 2.795 -182 155 1.34 2.795 -189 206 2.095 2.795 -211 3 0.33 2.795 -211 24 0 2.795 -5 4 0 2.8 -22 89 1.49 2.8 -59 9 0.425 2.8 -60 126 2.12 2.8 -173 234 0 2.8 -191 209 2.08 2.8 -237 236 0 2.8 -185 186 0 2.805 -242 3 2.265 2.805 -248 114 1.295 2.805 -114 78 1.685 2.81 -157 169 0.095 2.81 -187 240 0 2.81 -197 54 2.05 2.81 -254 195 1.865 2.81 -64 127 2.29 2.815 -88 167 0 2.815 -121 186 0 2.815 -137 77 2.14 2.815 -192 240 2.25 2.815 -254 240 0 2.815 -65 178 0 2.82 -72 76 0 2.82 -82 100 0 2.82 -97 178 2.235 2.82 -130 84 0.575 2.82 -162 175 2.11 2.82 -170 240 0.285 2.82 -227 101 2.04 2.82 -8 68 1.23 2.825 -97 164 2.02 2.825 -113 181 1.955 2.825 -133 132 1.205 2.825 -197 118 2.07 2.825 -219 27 0 2.825 -249 197 1.6 2.825 -12 137 1.145 2.83 -14 211 0 2.83 -61 1 0.735 2.83 -103 151 0.785 2.83 -113 117 0 2.83 -113 133 1.67 2.83 -116 162 0 2.83 -116 131 0 2.83 -128 178 1.485 2.83 -237 187 2.115 2.83 -245 197 0 2.83 -55 101 0 2.835 -62 50 2.295 2.835 -78 158 2.335 2.835 -100 116 1.62 2.835 -237 251 0 2.835 -10 96 0.495 2.84 -49 1 0 2.84 -56 6 0.8 2.84 -119 183 0 2.84 -126 177 0 2.84 -138 202 1.68 2.84 -139 251 0 2.84 -150 173 2.19 2.84 -192 140 0.375 2.84 -207 194 0.72 2.84 -238 129 1.885 2.84 -22 7 2.005 2.845 -22 8 0 2.845 -25 8 1.405 2.845 -62 248 1.89 2.845 -67 196 2.27 2.845 -97 191 2.155 2.845 -103 156 0 2.845 -146 191 1.73 2.845 -182 197 2.265 2.845 -208 1 1.06 2.845 -227 82 0.6 2.845 -47 100 2.145 2.85 -61 203 0 2.85 -114 199 0.975 2.85 -140 203 2.04 2.85 -142 196 0.815 2.85 -207 1 0 2.85 -248 35 0.96 2.85 -12 92 1.685 2.855 -53 199 0 2.855 -65 128 0 2.855 -100 115 0 2.855 -142 84 0 2.855 -206 211 1.865 2.855 -240 205 2.13 2.855 -6 71 1.085 2.86 -7 72 0 2.86 -33 248 1.495 2.86 -89 150 2.19 2.86 -145 141 1.91 2.86 -177 176 2.04 2.86 -210 220 1.14 2.86 -215 199 1.845 2.86 -242 197 0 2.86 -5 69 0 2.865 -14 2 0 2.865 -99 164 1.16 2.865 -110 116 0 2.865 -135 196 2.27 2.865 -148 196 0.135 2.865 -150 218 1.965 2.865 -180 240 1.87 2.865 -247 34 0.855 2.865 -256 4 2.14 2.865 -23 69 0 2.87 -65 133 1.405 2.87 -94 170 2.23 2.87 -138 188 1.775 2.87 -166 163 0 2.87 -180 228 2.055 2.87 -195 66 1.455 2.87 -5 53 0 2.875 -39 146 2.155 2.875 -130 196 1.635 2.875 -138 159 1.795 2.875 -151 173 2.205 2.875 -206 1 1.685 2.875 -231 106 2.255 2.875 -23 72 0 2.88 -38 98 1.76 2.88 -104 169 0 2.88 -107 187 2.175 2.88 -114 72 0 2.88 -128 80 0 2.88 -191 241 0 2.88 -207 14 0 2.88 -211 82 0.66 2.88 -12 105 2.21 2.885 -18 39 2.025 2.885 -33 216 2.255 2.885 -41 90 2.38 2.885 -61 15 0 2.885 -91 86 0 2.885 -109 127 0 2.885 -182 151 0.815 2.885 -191 225 1.3 2.885 -202 16 0.905 2.885 -19 69 0 2.89 -37 98 0 2.89 -138 160 0 2.89 -152 218 1.885 2.89 -184 136 0 2.89 -199 69 2.075 2.89 -236 43 0 2.89 -144 15 2.215 2.895 -184 215 1.385 2.895 -217 160 0 2.895 -226 129 2.18 2.895 -228 247 1.24 2.895 -242 206 2.34 2.895 -208 20 2.375 2.9 -217 224 1.82 2.9 -235 246 2.05 2.9 -43 64 1.285 2.905 -70 39 1.275 2.905 -82 36 0.215 2.905 -92 155 0 2.905 -101 105 0 2.905 -154 158 0 2.905 -180 187 1.835 2.905 -184 204 1.655 2.905 -244 246 0.855 2.905 -256 17 1.87 2.905 -70 29 2.34 2.91 -70 101 1.055 2.91 -85 130 0.83 2.91 -88 214 1.02 2.91 -117 179 0.82 2.91 -122 177 2.08 2.91 -125 100 2.215 2.91 -145 136 0 2.91 -162 185 0.4 2.91 -182 186 0 2.91 -201 200 0 2.91 -229 44 2.055 2.91 -41 101 0 2.915 -51 99 0.085 2.915 -70 105 1.015 2.915 -76 182 0 2.915 -80 132 0.97 2.915 -107 183 2.4 2.915 -131 196 1.005 2.915 -135 155 1.1 2.915 -175 48 2.395 2.915 -211 30 2.015 2.915 -215 203 2.305 2.915 -85 69 0 2.92 -133 151 0 2.92 -217 173 1.745 2.92 -218 26 0 2.92 -238 205 0.205 2.92 -241 194 2.165 2.92 -2 114 1.33 2.925 -55 11 0 2.925 -70 103 1.42 2.925 -80 143 0 2.925 -87 135 0.6 2.925 -99 149 0 2.925 -111 176 0 2.925 -128 115 1.835 2.925 -172 232 1.105 2.925 -180 243 0 2.925 -189 175 0 2.925 -197 57 1.725 2.925 -248 115 2.41 2.925 -11 75 0 2.93 -33 51 0 2.93 -42 11 1.01 2.93 -79 193 1.165 2.93 -115 183 1.71 2.93 -192 238 2.225 2.93 -238 244 0 2.93 -241 228 0 2.93 -242 2 1.99 2.93 -12 154 2.19 2.935 -39 90 0 2.935 -41 92 2.4 2.935 -56 133 0.56 2.935 -77 141 0 2.935 -116 187 2.315 2.935 -208 17 0 2.935 -224 10 0 2.935 -227 248 2.19 2.935 -12 27 1.59 2.94 -54 98 0.76 2.94 -72 89 0 2.94 -90 102 1.5 2.94 -107 234 2.06 2.94 -125 95 2.44 2.94 -177 191 0 2.94 -180 46 2.425 2.94 -185 168 2.075 2.94 -215 16 1.975 2.94 -255 206 1.71 2.94 -12 41 2.3 2.945 -19 95 0.515 2.945 -95 100 1.235 2.945 -218 25 0 2.945 -236 64 2.35 2.945 -29 105 0.69 2.95 -35 95 2.045 2.95 -122 188 1.2 2.95 -207 17 0.4 2.95 -227 34 0 2.95 -254 175 0.535 2.95 -254 194 1.99 2.95 -27 92 0 2.955 -28 72 1.325 2.955 -30 37 2.215 2.955 -47 95 1.16 2.955 -47 83 2.355 2.955 -70 153 0 2.955 -71 135 0 2.955 -87 214 0.635 2.955 -94 158 0 2.955 -178 71 2.43 2.955 -179 197 0 2.955 -207 223 0 2.955 -213 6 2.415 2.955 -224 44 1.785 2.955 -228 248 0.49 2.955 -104 226 1.985 2.96 -104 168 2.135 2.96 -109 166 2.37 2.96 -124 92 1.805 2.96 -165 234 2.355 2.96 -190 238 1.88 2.96 -215 12 1.995 2.96 -218 45 0 2.96 -248 3 1.315 2.96 -30 95 1.83 2.965 -41 34 1.605 2.965 -42 90 2.435 2.965 -54 69 0 2.965 -56 60 0 2.965 -157 143 1.42 2.965 -256 204 1.335 2.965 -12 153 1.445 2.97 -28 91 2.25 2.97 -51 101 0 2.97 -54 6 1.935 2.97 -85 150 2.405 2.97 -120 59 2.465 2.97 -163 191 0.695 2.97 -170 183 0 2.97 -170 182 0.295 2.97 -193 13 1.715 2.97 -214 160 0.515 2.97 -17 20 1.985 2.975 -20 21 0 2.975 -102 122 0 2.975 -116 143 0.885 2.975 -123 249 2.43 2.975 -142 193 2.22 2.975 -153 88 2.185 2.975 -224 231 1.89 2.975 -42 122 0.985 2.98 -55 170 2.385 2.98 -132 13 1.97 2.98 -206 16 1.505 2.98 -213 144 1.785 2.98 -227 20 0 2.98 -49 13 0.945 2.985 -72 153 2.4 2.985 -169 185 0 2.985 -196 3 2.32 2.985 -204 199 0 2.985 -7 69 0 2.99 -19 47 0.87 2.99 -51 128 2.1 2.99 -76 186 0 2.99 -93 35 2.39 2.99 -121 187 2.23 2.99 -161 209 1.135 2.99 -195 198 1.645 2.99 -208 81 2.465 2.99 -6 89 2.075 2.995 -67 83 0 2.995 -119 138 1.16 2.995 -130 163 2.185 2.995 -137 214 2.39 2.995 -138 154 2.065 2.995 -144 249 0.67 2.995 -159 17 2.215 2.995 -169 234 0 2.995 -213 25 2.27 2.995 -3 93 1.24 3 -17 197 2.425 3 -117 134 2.46 3 -121 183 2.35 3 -126 67 0.85 3 -137 186 0 3 -144 25 2.215 3 -226 249 2.32 3 -8 134 1.415 3.005 -9 65 2.355 3.005 -21 33 0 3.005 -28 103 0 3.005 -73 170 2.245 3.005 -92 90 0 3.005 -101 115 0 3.005 -110 191 1.465 3.005 -138 143 0 3.005 -209 30 0 3.005 -13 3 0.99 3.01 -74 65 1.175 3.01 -40 178 2.43 3.015 -52 67 1.725 3.015 -66 67 0 3.015 -107 191 2.455 3.015 -114 181 0 3.015 -160 31 1.915 3.015 -211 35 2.37 3.015 -247 197 1.62 3.015 -12 86 2.04 3.02 -14 3 0 3.02 -70 149 1.335 3.02 -85 134 0 3.02 -111 191 1.13 3.02 -123 183 1.965 3.02 -137 155 0 3.02 -193 255 2.28 3.02 -209 20 0.79 3.02 -210 206 2.125 3.02 -223 3 2.245 3.02 -226 172 1.975 3.02 -249 198 1.535 3.02 -6 120 1.925 3.025 -29 90 0 3.025 -40 114 0 3.025 -47 90 0 3.025 -78 83 1.755 3.025 -89 95 2.415 3.025 -106 185 0 3.025 -117 76 2.28 3.025 -182 250 0 3.025 -206 17 0 3.025 -237 31 2.455 3.025 -252 38 2.325 3.025 -37 53 1.695 3.03 -37 51 0 3.03 -199 133 2.5 3.03 -206 19 1.71 3.03 -224 41 1.78 3.03 -248 197 0 3.03 -16 19 0.835 3.035 -75 129 0.96 3.035 -86 153 0 3.035 -124 151 1.35 3.035 -176 46 1.595 3.035 -180 175 0.54 3.035 -213 196 2.265 3.035 -228 34 0 3.035 -235 57 0 3.035 -26 16 2.425 3.04 -55 169 2.43 3.04 -105 157 1.955 3.04 -110 176 1.445 3.04 -117 124 0 3.04 -119 151 2.495 3.04 -132 17 1.505 3.04 -168 171 2.44 3.04 -174 177 2.14 3.04 -201 73 2.43 3.04 -203 17 1.365 3.04 -205 204 1.325 3.04 -247 198 2.42 3.04 -4 30 2.315 3.045 -8 18 0 3.045 -40 53 2.395 3.045 -74 4 1.04 3.045 -89 157 0.57 3.045 -98 117 0 3.045 -198 199 1.51 3.045 -218 31 1.575 3.045 -234 45 0.22 3.045 -247 118 2.455 3.045 -5 12 2.52 3.05 -24 51 1.575 3.05 -44 64 2.345 3.05 -45 64 1.425 3.05 -52 9 2.34 3.05 -84 147 0 3.05 -98 116 0 3.05 -116 133 0.915 3.05 -117 183 1.65 3.05 -137 132 2.355 3.05 -189 203 2.13 3.05 -190 164 0 3.05 -223 33 2.185 3.05 -234 224 0 3.05 -238 242 0.685 3.05 -53 98 1.89 3.055 -86 90 0 3.055 -96 89 0 3.055 -139 205 1.285 3.055 -140 214 1.52 3.055 -145 209 0 3.055 -200 3 0 3.055 -202 143 1.65 3.055 -202 205 0 3.055 -223 200 2.33 3.055 -3 18 2.245 3.06 -27 154 0.465 3.06 -31 44 2.485 3.06 -62 37 2.26 3.06 -66 133 2.285 3.06 -78 89 2.32 3.06 -166 170 0 3.06 -206 4 1.92 3.06 -255 52 0 3.06 -17 221 0 3.065 -59 170 2.28 3.065 -98 181 0 3.065 -108 184 2.495 3.065 -110 177 0.615 3.065 -119 72 2.49 3.065 -126 76 2.425 3.065 -166 168 0 3.065 -196 200 1.77 3.065 -45 256 1.06 3.07 -55 133 2.505 3.07 -86 156 2.455 3.07 -86 165 2.495 3.07 -102 183 1.145 3.07 -125 170 0 3.07 -147 100 2.445 3.07 -153 233 2.015 3.07 -167 237 1.685 3.07 -206 31 0.095 3.07 -224 251 1.135 3.07 -228 255 0 3.07 -2 69 0 3.075 -15 3 0 3.075 -27 103 1.22 3.075 -32 42 2.51 3.075 -70 130 2.38 3.075 -109 170 1.88 3.075 -142 145 0 3.075 -143 17 1.345 3.075 -176 224 0 3.075 -201 118 2.165 3.075 -208 74 0.385 3.075 -37 99 2.44 3.08 -46 256 0 3.08 -58 7 2.575 3.08 -62 203 0 3.08 -75 191 2.3 3.08 -116 129 0 3.08 -136 140 1.24 3.08 -139 155 0 3.08 -152 194 0 3.08 -170 177 2.175 3.08 -180 253 0 3.08 -213 242 0.525 3.08 -244 206 1.83 3.08 -33 98 0 3.085 -39 165 2.47 3.085 -49 51 0 3.085 -67 117 2.035 3.085 -145 132 0 3.085 -176 164 0 3.085 -243 3 1.625 3.085 -55 165 2.5 3.09 -106 73 2.045 3.09 -123 155 1.425 3.09 -155 205 0 3.09 -169 121 2.355 3.09 -181 134 0.845 3.09 -198 60 2.295 3.09 -104 185 0 3.095 -158 196 1.025 3.095 -164 255 2.535 3.095 -185 241 2.185 3.095 -189 186 0 3.095 -227 236 2.135 3.095 -230 251 0 3.095 -233 229 0 3.095 -24 98 1.325 3.1 -44 112 2.225 3.1 -49 56 2.565 3.1 -54 185 1.725 3.1 -65 20 2.425 3.1 -76 96 0 3.1 -102 233 2.54 3.1 -117 241 2.335 3.1 -181 226 2.265 3.1 -206 195 1.89 3.1 -211 231 2.56 3.1 -13 50 1.96 3.105 -63 177 0.675 3.105 -74 81 1.365 3.105 -78 76 2.415 3.105 -103 185 0 3.105 -105 214 2.59 3.105 -106 90 0 3.105 -130 150 1.745 3.105 -147 214 2.33 3.105 -154 141 2.09 3.105 -186 204 2.525 3.105 -208 11 0 3.105 -216 224 1.985 3.105 -224 16 2.34 3.105 -241 193 0 3.105 -247 250 1.85 3.105 -14 52 0 3.11 -101 100 0 3.11 -108 168 0.15 3.11 -153 157 0 3.11 -179 210 2.08 3.11 -235 184 2.495 3.11 -252 205 2.605 3.11 -10 95 2.115 3.115 -40 185 1.45 3.115 -48 99 2.585 3.115 -73 52 2.585 3.115 -76 155 0 3.115 -119 89 2.42 3.115 -179 140 1.335 3.115 -181 193 2.095 3.115 -34 88 2.485 3.12 -40 56 0 3.12 -85 98 2.25 3.12 -162 129 0.675 3.12 -193 243 2.12 3.12 -222 180 2.45 3.12 -22 236 2.475 3.125 -27 90 0 3.125 -67 241 2.375 3.125 -87 124 0.695 3.125 -153 152 1.77 3.125 -157 171 0 3.125 -163 209 0 3.125 -29 24 2.405 3.13 -50 3 0 3.13 -55 110 2.56 3.13 -67 182 2.6 3.13 -83 97 0 3.13 -108 230 1.61 3.13 -109 121 1.86 3.13 -140 246 1.74 3.13 -158 100 1.145 3.13 -192 159 1.43 3.13 -210 17 0 3.13 -229 235 1.6 3.13 -61 252 0 3.135 -149 209 2.125 3.135 -153 150 0 3.135 -160 171 2.58 3.135 -174 190 0 3.135 -174 253 1.175 3.135 -202 31 0.935 3.135 -221 32 2.5 3.135 -45 252 1.13 3.14 -70 137 0 3.14 -75 155 0.635 3.14 -214 194 1.67 3.14 -215 31 1.96 3.14 -249 135 2.255 3.14 -23 18 2.015 3.145 -27 111 2.055 3.145 -50 1 0 3.145 -107 176 0 3.145 -130 209 2.14 3.145 -143 14 2.27 3.145 -151 194 0 3.145 -164 240 0 3.145 -205 9 1.21 3.145 -218 216 0.94 3.145 -241 135 2.235 3.145 -5 1 0 3.15 -94 36 0.97 3.15 -120 67 0 3.15 -140 218 1.55 3.15 -175 232 1.37 3.15 -207 203 0 3.15 -15 74 0.2 3.155 -19 23 2.225 3.155 -67 162 0.495 3.155 -76 80 2.585 3.155 -96 84 0 3.155 -169 168 0 3.155 -174 238 2.355 3.155 -201 59 1.925 3.155 -222 31 1.545 3.155 -233 157 1.88 3.155 -243 194 2.185 3.155 -250 197 0.695 3.155 -48 109 0 3.16 -70 133 1.39 3.16 -143 208 1.505 3.16 -43 95 1.9 3.165 -51 67 2.11 3.165 -65 70 2.505 3.165 -164 178 0 3.165 -38 60 2.375 3.17 -41 103 2.045 3.17 -203 126 2.19 3.17 -205 17 0.985 3.17 -9 122 1.435 3.175 -57 112 2.4 3.175 -93 95 0 3.175 -105 233 2.545 3.175 -125 90 0.265 3.175 -146 178 2.44 3.175 -172 252 2.55 3.175 -184 60 2.66 3.175 -190 191 0 3.175 -28 90 0 3.18 -41 31 2.305 3.18 -115 241 1.59 3.18 -118 104 2.49 3.18 -153 149 0 3.18 -173 176 0 3.18 -200 212 2.605 3.18 -212 216 2.06 3.18 -244 203 2.085 3.18 -32 83 2.245 3.185 -64 4 2.685 3.185 -82 34 0.34 3.185 -95 97 0 3.185 -108 235 2.225 3.185 -130 179 2.62 3.185 -214 211 2.545 3.185 -226 178 2.295 3.185 -240 252 2.68 3.185 -2 20 0 3.19 -6 31 2.58 3.19 -11 53 2.65 3.19 -68 84 2.345 3.19 -78 43 2.54 3.19 -81 84 0 3.19 -163 211 2.49 3.19 -167 211 2.535 3.19 -170 235 2.56 3.19 -174 192 2.34 3.19 -218 22 0.59 3.19 -250 11 2.2 3.19 -37 236 0 3.195 -38 121 2.03 3.195 -169 170 0 3.195 -172 240 2.615 3.195 -194 17 1.01 3.195 -207 62 0 3.195 -236 54 0 3.195 -26 109 2.485 3.2 -38 106 1.125 3.2 -75 234 2.42 3.2 -89 155 2.395 3.2 -93 82 1.275 3.2 -94 101 2.7 3.2 -113 79 2.695 3.2 -171 220 2.59 3.2 -230 246 0 3.2 -242 199 2.495 3.2 -39 150 2.15 3.205 -103 115 2.6 3.205 -104 179 2.65 3.205 -112 77 1.91 3.205 -120 131 0 3.205 -142 160 0 3.205 -143 244 2.39 3.205 -207 253 0 3.205 -212 36 0.99 3.205 -249 140 1.94 3.205 -249 58 0 3.205 -122 74 2.06 3.21 -129 206 1.76 3.21 -140 197 0 3.21 -146 97 1 3.21 -148 211 0 3.21 -157 107 2.015 3.21 -172 253 2.345 3.21 -181 140 2.545 3.21 -202 6 0 3.21 -216 19 2.04 3.21 -235 31 2.315 3.21 -45 62 0.28 3.215 -53 8 2.225 3.215 -54 103 2.205 3.215 -61 58 0 3.215 -62 11 0 3.215 -75 178 1.745 3.215 -83 100 0.405 3.215 -90 107 0 3.215 -123 76 0.49 3.215 -131 254 0 3.215 -193 254 0 3.215 -207 144 2.325 3.215 -207 195 0 3.215 -41 109 2.17 3.22 -93 2 1.33 3.22 -100 178 0 3.22 -190 255 1.88 3.22 -212 82 0.645 3.22 -217 22 0.145 3.22 -53 69 2.4 3.225 -111 108 1.12 3.225 -122 96 2.385 3.225 -178 168 2.53 3.225 -213 218 1.145 3.225 -233 165 0.825 3.225 -243 57 2.26 3.225 -7 91 2.315 3.23 -57 166 2.355 3.23 -81 116 2.115 3.23 -158 173 0 3.23 -202 14 1.855 3.23 -206 256 0 3.23 -222 171 0 3.23 -5 71 2.35 3.235 -14 53 0.91 3.235 -48 52 0.695 3.235 -100 175 0 3.235 -112 176 0 3.235 -122 76 0.615 3.235 -127 171 0.25 3.235 -136 242 0 3.235 -146 127 2.735 3.235 -147 223 2.005 3.235 -157 191 2.39 3.235 -182 242 0 3.235 -23 119 2.605 3.24 -120 104 1.845 3.24 -207 159 1.05 3.24 -225 223 0 3.24 -227 247 2.06 3.24 -233 170 2.71 3.24 -7 86 2.07 3.245 -55 125 0.375 3.245 -56 69 0 3.245 -81 101 2.57 3.245 -100 163 0 3.245 -148 223 0 3.245 -181 123 2.515 3.245 -207 186 2.555 3.245 -9 76 0.74 3.25 -113 67 0.925 3.25 -142 136 2.07 3.25 -172 224 1.89 3.25 -172 245 0 3.25 -187 155 1.15 3.25 -212 17 0 3.25 -228 230 2.35 3.25 -234 186 0.455 3.25 -39 169 2.065 3.255 -45 20 2.74 3.255 -48 35 2.095 3.255 -75 205 1.36 3.255 -78 94 2.185 3.255 -92 108 0 3.255 -94 68 2.675 3.255 -107 127 0 3.255 -194 211 0 3.255 -194 216 0 3.255 -15 19 2.73 3.26 -17 82 2.68 3.26 -109 103 1.675 3.26 -111 102 2.31 3.26 -128 79 0 3.26 -175 20 2.4 3.26 -179 217 2.4 3.26 -256 59 0 3.26 -55 109 1.415 3.265 -61 125 0 3.265 -72 145 0 3.265 -75 144 2.545 3.265 -78 82 2.115 3.265 -81 130 0 3.265 -94 89 2.65 3.265 -111 127 0 3.265 -139 131 2.745 3.265 -152 22 1.335 3.265 -204 60 0.29 3.265 -62 17 1.7 3.27 -76 138 0 3.27 -122 114 2.635 3.27 -156 171 0 3.27 -176 186 2.055 3.27 -223 5 2.525 3.27 -226 50 1.7 3.27 -37 57 2.015 3.275 -50 60 2.18 3.275 -58 52 1.05 3.275 -65 122 1.455 3.275 -106 169 2.155 3.275 -133 162 0.525 3.275 -146 161 0 3.275 -188 246 0 3.275 -224 42 0 3.275 -225 22 1.395 3.275 -61 42 0 3.28 -81 43 2.625 3.28 -111 128 2.43 3.28 -145 150 1.41 3.28 -146 102 2.14 3.28 -149 159 1.115 3.28 -167 224 1.95 3.28 -172 176 0 3.28 -181 139 2.61 3.28 -207 206 0 3.28 -223 46 1.675 3.28 -226 184 2.465 3.28 -44 166 2.23 3.285 -48 58 0.47 3.285 -57 119 2.585 3.285 -71 82 2.605 3.285 -103 145 1.965 3.285 -130 145 0 3.285 -146 100 0 3.285 -166 73 2.315 3.285 -172 231 0 3.285 -184 195 0 3.285 -188 245 1.335 3.285 -206 15 1.795 3.285 -216 25 0 3.285 -27 112 2.09 3.29 -81 157 2.675 3.29 -166 137 2.775 3.29 -207 49 2.355 3.29 -18 28 1.5 3.295 -51 166 2.125 3.295 -78 30 2.17 3.295 -109 171 2 3.295 -117 162 0 3.295 -126 3 0 3.295 -196 53 2.775 3.295 -204 7 2.53 3.295 -231 50 2.62 3.295 -249 201 0.82 3.295 -253 203 0 3.295 -36 64 0.355 3.3 -44 109 0 3.3 -56 70 2.34 3.3 -81 69 0 3.3 -99 103 0 3.3 -192 155 0.535 3.3 -216 28 1.73 3.3 -223 30 0 3.3 -51 98 0 3.305 -107 97 2.105 3.305 -161 239 0.295 3.305 -204 10 0 3.305 -216 23 0 3.305 -88 145 0 3.31 -104 100 0 3.31 -107 75 2.445 3.31 -113 122 1.02 3.31 -126 69 2.57 3.31 -149 193 1.195 3.31 -206 212 1.575 3.31 -216 18 0 3.31 -249 50 1.4 3.31 -6 10 1.345 3.315 -14 20 0 3.315 -32 89 2.58 3.315 -62 58 0 3.315 -62 114 1.82 3.315 -62 196 2.76 3.32 -62 126 2.81 3.32 -68 145 0 3.32 -126 17 2.575 3.32 -136 211 0 3.32 -154 171 0 3.32 -158 218 2.81 3.32 -188 186 0 3.32 -244 126 2.785 3.32 -256 126 2.155 3.32 -42 107 2.82 3.325 -139 245 0.945 3.325 -143 254 0 3.325 -160 100 2.8 3.325 -172 26 1.745 3.325 -212 16 2.51 3.325 -230 37 0 3.325 -254 184 2 3.325 -4 82 0 3.33 -95 174 1.72 3.33 -131 245 0 3.33 -148 239 0 3.33 -151 165 2.8 3.33 -167 219 2.76 3.33 -180 49 2.38 3.33 -236 50 2.555 3.33 -241 230 2.165 3.33 -256 11 0 3.33 -42 97 2.46 3.335 -58 63 0 3.335 -66 99 2.25 3.335 -127 164 0 3.335 -150 241 2.475 3.335 -170 186 0 3.335 -179 244 2.345 3.335 -236 245 1.02 3.335 -249 224 2.8 3.335 -2 82 0.535 3.34 -49 50 1.815 3.34 -128 177 0 3.34 -174 164 2.225 3.34 -229 35 2.835 3.34 -245 252 1.02 3.34 -2 87 2.705 3.345 -47 51 1.745 3.345 -63 11 0 3.345 -80 130 1.425 3.345 -111 233 2.11 3.345 -144 221 0 3.345 -164 245 0 3.345 -170 249 1.95 3.345 -178 184 2.835 3.345 -195 3 0 3.345 -249 251 0 3.345 -1 8 0 3.35 -24 92 2.47 3.35 -27 32 0 3.35 -59 77 0 3.35 -179 195 1.745 3.35 -227 35 0 3.35 -4 69 0 3.355 -19 35 2.075 3.355 -48 243 2.795 3.355 -50 53 0 3.355 -59 12 2.655 3.355 -69 82 0.875 3.355 -84 222 0.905 3.355 -170 140 2.84 3.355 -190 186 0 3.355 -203 12 2.83 3.355 -50 118 2.35 3.36 -55 64 1.72 3.36 -55 123 2.02 3.36 -58 255 0 3.36 -59 97 2.855 3.36 -61 64 0 3.36 -105 171 1.34 3.36 -111 222 0.72 3.36 -177 254 0 3.36 -221 20 1.99 3.36 -225 193 2.65 3.36 -230 245 0 3.36 -14 30 2.335 3.365 -84 160 2.515 3.365 -86 169 0 3.365 -146 168 0 3.365 -4 90 2.675 3.37 -42 47 0 3.37 -46 42 0 3.37 -75 140 2.87 3.37 -80 72 2.07 3.37 -86 166 1.8 3.37 -89 102 2.045 3.37 -94 105 1.945 3.37 -167 200 2.535 3.37 -172 236 0 3.37 -228 24 0.895 3.37 -240 93 2.745 3.37 -1 2 0 3.375 -55 185 0.43 3.375 -106 171 2.875 3.375 -122 190 1.055 3.375 -122 192 1.925 3.375 -146 183 1.91 3.375 -175 30 0.115 3.375 -201 64 2.49 3.375 -206 58 2.36 3.375 -66 24 0 3.38 -73 28 2.535 3.38 -106 117 1.155 3.38 -125 105 2.71 3.38 -190 254 0 3.38 -238 36 0.29 3.38 -256 52 1.28 3.38 -54 181 1.215 3.385 -178 254 0 3.385 -180 143 0 3.385 -180 168 0 3.385 -202 29 2.005 3.385 -203 31 0.945 3.385 -206 132 0 3.385 -214 171 0.3 3.385 -4 31 0 3.39 -199 40 2.425 3.39 -240 47 2.785 3.39 -244 194 0 3.39 -244 64 2.775 3.39 -4 77 0 3.395 -10 102 2.435 3.395 -11 65 1.55 3.395 -60 8 1.615 3.395 -126 95 2.415 3.395 -142 206 2.545 3.395 -167 22 1.865 3.395 -188 192 0 3.395 -197 56 1.59 3.395 -223 20 0 3.395 -14 74 0.535 3.4 -65 83 2.375 3.4 -96 140 2.855 3.4 -131 195 0 3.4 -163 220 1.535 3.4 -170 253 0 3.4 -179 5 2.6 3.4 -196 15 2.645 3.4 -227 66 1.345 3.4 -254 196 0 3.4 -256 36 2.035 3.4 -1 120 2.815 3.405 -4 85 2.885 3.405 -22 24 0 3.405 -22 44 0 3.405 -45 47 0 3.405 -52 56 0 3.405 -57 8 2.57 3.405 -68 101 2.56 3.405 -137 67 1.335 3.405 -164 232 0.165 3.405 -172 229 0 3.405 -246 215 1.375 3.405 -75 141 0 3.41 -92 166 1.37 3.41 -125 107 0 3.41 -126 93 2.285 3.41 -144 253 0.375 3.41 -155 203 0 3.41 -189 251 1.15 3.41 -197 211 2.745 3.41 -243 184 0 3.41 -22 39 0 3.415 -38 166 2.06 3.415 -45 16 2.515 3.415 -224 27 0 3.415 -228 85 2.9 3.415 -237 208 2.595 3.415 -126 32 2.515 3.42 -135 245 0.75 3.42 -195 215 1.445 3.42 -196 1 1.575 3.42 -197 70 2.14 3.42 -202 239 1.945 3.42 -218 29 2.87 3.42 -238 243 0 3.42 -19 72 2.01 3.425 -39 125 2.735 3.425 -105 121 2.86 3.425 -107 122 0.865 3.425 -122 186 0 3.425 -167 228 2.075 3.425 -197 60 1.625 3.425 -200 85 1.35 3.425 -255 33 1.97 3.425 -38 103 1.865 3.43 -43 99 2.55 3.43 -62 250 2.785 3.43 -75 188 0 3.43 -75 143 0.6 3.43 -154 160 0 3.43 -172 220 0 3.43 -203 60 0 3.43 -204 28 0 3.43 -241 172 1.995 3.43 -246 12 2.85 3.43 -247 5 1.665 3.43 -11 112 1.245 3.435 -16 27 2.17 3.435 -22 37 0 3.435 -45 39 2.84 3.435 -45 63 1.385 3.435 -81 111 2.805 3.435 -118 181 0 3.435 -123 190 2.81 3.435 -213 184 0.56 3.435 -247 242 1.155 3.435 -248 8 2.36 3.435 -49 244 0 3.44 -54 177 2.94 3.44 -60 23 1.69 3.44 -95 160 2.555 3.44 -100 253 2.94 3.44 -142 149 1.785 3.44 -144 6 1.425 3.44 -155 208 2.69 3.44 -199 115 2.435 3.44 -236 118 2.38 3.44 -22 85 0 3.445 -60 25 2.135 3.445 -184 56 2.81 3.445 -214 29 2.885 3.445 -234 198 2.68 3.445 -246 195 2.265 3.445 -246 203 2.655 3.445 -45 59 2.625 3.45 -134 82 1.545 3.45 -173 220 2.055 3.45 -179 213 1.795 3.45 -209 5 2.925 3.45 -217 167 2.25 3.45 -221 29 2.905 3.45 -238 30 2.83 3.45 -241 188 2.38 3.45 -1 69 2.42 3.455 -55 251 2.78 3.455 -57 40 0 3.455 -93 74 0 3.455 -149 67 0 3.455 -190 242 2.28 3.455 -191 205 2.695 3.455 -194 8 2.705 3.455 -203 239 2.925 3.455 -241 247 1.255 3.455 -250 196 2.925 3.455 -253 49 0 3.455 -254 247 2.22 3.455 -24 87 2.85 3.46 -49 247 2.58 3.46 -65 79 0 3.46 -112 169 2.115 3.46 -144 13 0.525 3.46 -153 139 2.84 3.46 -153 215 2.88 3.46 -205 221 2.915 3.46 -212 43 2.48 3.46 -236 39 0 3.46 -12 121 2.54 3.465 -45 94 2.45 3.465 -65 67 0 3.465 -94 74 0 3.465 -95 149 2.91 3.465 -164 237 2.775 3.465 -227 33 0 3.465 -233 176 0 3.465 -248 40 0.375 3.465 -125 174 0 3.47 -131 184 0 3.47 -133 68 1.985 3.47 -175 227 2.72 3.47 -179 198 1.555 3.47 -191 250 2.905 3.47 -192 140 2.91 3.47 -255 64 0 3.47 -52 17 1.795 3.475 -83 103 2.8 3.475 -109 108 0 3.475 -147 167 2.39 3.475 -154 172 2.935 3.475 -211 70 2.44 3.475 -226 36 2.695 3.475 -231 85 2.83 3.475 -242 184 0 3.475 -17 93 1.36 3.48 -54 104 1.81 3.48 -150 171 0 3.48 -179 243 0 3.48 -189 48 2.595 3.48 -214 168 0 3.48 -217 184 1.385 3.48 -221 16 1.575 3.48 -223 66 1.955 3.48 -226 212 2.845 3.48 -246 59 2.105 3.48 -246 120 2.355 3.48 -248 39 0.94 3.48 -41 87 2.54 3.485 -44 125 0 3.485 -81 47 0 3.485 -139 213 0.675 3.485 -139 193 2.9 3.485 -150 220 1.365 3.485 -246 8 2.31 3.485 -13 221 2.505 3.49 -15 17 1.34 3.49 -65 158 2.535 3.49 -109 169 1.66 3.49 -127 69 2.99 3.49 -191 62 2.895 3.49 -195 197 0 3.49 -211 8 2.945 3.49 -231 40 1.645 3.49 -103 177 2.845 3.495 -136 167 2.045 3.495 -151 220 0 3.495 -155 219 0 3.495 -174 98 2.76 3.495 -204 216 2.885 3.495 -211 4 0 3.495 -225 21 2.785 3.495 -241 249 2.06 3.495 -9 90 2.68 3.5 -38 104 1.85 3.5 -65 90 2.82 3.5 -164 61 2.59 3.5 -226 33 0 3.5 -243 52 2.865 3.5 -12 138 2.66 3.505 -91 105 0 3.505 -100 226 0.44 3.505 -117 131 1.66 3.505 -129 184 2.15 3.505 -181 254 2.08 3.505 -225 220 1.43 3.505 -1 93 1.595 3.51 -61 53 1.7 3.51 -84 158 0 3.51 -88 166 0 3.51 -94 27 1.9 3.51 -100 254 1.76 3.51 -104 108 0 3.51 -122 79 0 3.51 -129 13 1.83 3.51 -153 141 3.005 3.51 -159 13 2.17 3.51 -225 151 2.245 3.51 -243 196 2.65 3.51 -246 251 0 3.51 -3 82 2.425 3.515 -5 4 2.975 3.515 -13 209 2.77 3.515 -96 145 0 3.515 -110 113 0 3.515 -125 102 1.505 3.515 -125 98 2.365 3.515 -165 254 2.985 3.515 -195 1 0 3.515 -246 25 2.655 3.515 -6 29 2.24 3.52 -24 166 2.25 3.52 -35 54 2.885 3.52 -45 32 0 3.52 -50 120 2.36 3.52 -62 248 2.98 3.52 -64 12 2.9 3.52 -75 189 0 3.52 -86 134 0.585 3.52 -165 247 2.85 3.52 -202 200 3.015 3.52 -215 211 0 3.52 -250 208 0 3.52 -35 103 2.53 3.525 -36 177 2.77 3.525 -59 15 0.425 3.525 -65 82 2.415 3.525 -75 207 2.505 3.525 -86 109 1.79 3.525 -121 165 2.465 3.525 -128 124 2.995 3.525 -152 195 1.78 3.525 -157 224 2.93 3.525 -212 61 1.41 3.525 -244 52 0 3.525 -245 195 0.76 3.525 -252 59 0 3.525 -22 16 2.255 3.53 -48 53 1.71 3.53 -71 181 0 3.53 -114 131 2.585 3.53 -191 255 0 3.53 -196 93 2.1 3.53 -205 243 2.885 3.53 -205 1 0.75 3.53 -215 2 2.01 3.53 -6 59 1.975 3.535 -7 134 1.015 3.535 -43 84 2.33 3.535 -59 52 1.905 3.535 -143 136 1.105 3.535 -143 210 2.475 3.535 -154 233 0 3.535 -166 163 2.995 3.535 -175 37 1.52 3.535 -187 141 2.57 3.535 -211 81 2.92 3.535 -249 194 2.32 3.535 -12 93 2.98 3.54 -90 83 2.58 3.54 -112 116 2.295 3.54 -185 91 2.975 3.54 -5 60 0 3.545 -6 208 1.2 3.545 -18 34 0 3.545 -46 94 2.945 3.545 -72 103 2.165 3.545 -75 67 1.635 3.545 -95 79 2.755 3.545 -95 147 2.855 3.545 -205 251 0 3.545 -215 21 0 3.545 -226 62 2.745 3.545 -60 16 2.965 3.55 -92 213 2.87 3.55 -109 156 2.52 3.55 -145 152 0 3.55 -157 221 0 3.55 -161 189 2.795 3.55 -203 251 0 3.55 -214 26 1.47 3.55 -242 36 2.92 3.55 -3 21 0 3.555 -49 256 0 3.555 -59 124 2.985 3.555 -133 132 2.93 3.555 -146 166 0 3.555 -161 61 2.865 3.555 -191 49 1.395 3.555 -197 210 1.245 3.555 -12 122 0 3.56 -35 177 2.885 3.56 -60 12 0 3.56 -156 172 2.07 3.56 -156 219 2.705 3.56 -170 207 2.985 3.56 -6 251 2.905 3.565 -6 21 0 3.565 -19 82 0 3.565 -49 242 2.41 3.565 -79 131 1.36 3.565 -129 243 1.81 3.565 -183 236 2.535 3.565 -202 25 0 3.565 -219 21 2.94 3.565 -48 59 0 3.57 -62 56 1.9 3.57 -91 169 3.025 3.57 -151 172 2.995 3.57 -200 29 2.42 3.57 -205 208 0 3.57 -256 196 2.67 3.57 -9 32 2.54 3.575 -10 44 2.04 3.575 -20 34 1.41 3.575 -60 76 0.545 3.575 -188 236 2.815 3.575 -201 12 1.85 3.575 -210 220 3.07 3.575 -215 41 0 3.575 -233 188 2.47 3.575 -239 27 2.82 3.575 -246 23 1.905 3.575 -9 251 2.875 3.58 -14 224 3.075 3.58 -55 73 0 3.58 -94 96 0 3.58 -118 108 2.565 3.58 -192 13 1.52 3.58 -238 256 0 3.58 -80 67 1.55 3.585 -104 121 2.375 3.585 -163 49 2.685 3.585 -242 1 0 3.585 -85 103 0 3.59 -109 39 1.68 3.59 -133 207 3.045 3.59 -139 236 1.75 3.59 -184 193 0 3.59 -222 30 0 3.59 -223 1 1.54 3.59 -248 117 1.065 3.59 -9 80 2.475 3.595 -38 42 2.235 3.595 -59 63 0 3.595 -85 34 2.3 3.595 -85 38 1.66 3.595 -90 82 2.61 3.595 -99 158 0.785 3.595 -157 143 3.02 3.595 -157 132 2.995 3.595 -198 23 1.735 3.595 -199 71 0.825 3.595 -201 13 2.57 3.595 -201 251 0.615 3.595 -213 246 2.44 3.595 -213 21 2.12 3.595 -223 32 1.82 3.595 -4 52 0 3.6 -11 4 2.01 3.6 -43 102 2.275 3.6 -62 242 2.43 3.6 -98 166 0 3.6 -148 152 0 3.6 -184 5 0.955 3.6 -219 27 2.87 3.6 -240 31 2.48 3.6 -46 32 1.825 3.605 -62 51 0 3.605 -113 69 1.145 3.605 -133 72 0 3.605 -159 152 2.735 3.605 -174 189 0 3.605 -204 23 0 3.605 -96 218 2.665 3.61 -127 161 0 3.61 -140 252 3.025 3.61 -158 152 2.705 3.61 -204 12 0 3.61 -1 66 1.575 3.615 -37 54 2.03 3.615 -88 164 2.915 3.615 -152 228 2.035 3.615 -200 204 0 3.615 -200 41 1.335 3.615 -203 224 3.1 3.615 -1 19 0.755 3.62 -55 108 0 3.62 -88 98 0 3.62 -98 103 1.35 3.62 -133 193 1.285 3.62 -208 12 0 3.62 -232 51 1.525 3.62 -240 125 2.82 3.62 -255 17 1.405 3.62 -13 208 0 3.625 -19 31 2.865 3.625 -22 89 2.935 3.625 -32 106 3.115 3.625 -32 97 0 3.625 -48 110 0 3.625 -62 15 0 3.625 -91 206 3.055 3.625 -109 102 1.66 3.625 -119 179 3.025 3.625 -121 71 2.985 3.625 -177 164 0 3.625 -192 253 0 3.625 -229 236 0 3.625 -7 185 2.49 3.63 -142 90 2.92 3.63 -198 155 0 3.63 -215 229 2.755 3.63 -223 65 2.625 3.63 -241 49 2.65 3.63 -24 106 2.535 3.635 -80 83 1.51 3.635 -108 150 0 3.635 -219 41 1.95 3.635 -238 253 0 3.635 -243 5 0 3.635 -35 51 0 3.64 -43 97 1.025 3.64 -66 83 0 3.64 -116 180 0 3.64 -149 105 2.6 3.64 -156 216 2.775 3.64 -173 95 1.16 3.64 -175 237 0 3.64 -188 230 2.47 3.64 -211 93 2.075 3.64 -232 236 0 3.64 -11 90 3.05 3.645 -55 181 0.985 3.645 -97 161 1.975 3.645 -107 185 0 3.645 -112 124 0 3.645 -190 162 0 3.645 -195 227 2.82 3.645 -20 63 2.8 3.65 -22 8 3.05 3.65 -46 19 2.66 3.65 -58 208 0 3.65 -81 83 0 3.65 -87 83 2.91 3.65 -124 192 0.5 3.65 -185 178 2.24 3.65 -203 25 1.77 3.65 -13 204 2.51 3.655 -31 110 3.1 3.655 -71 182 3.025 3.655 -107 123 0 3.655 -118 137 0 3.655 -122 80 0 3.655 -123 234 0.195 3.655 -128 36 1.165 3.655 -184 197 0 3.655 -190 179 1.6 3.655 -237 26 0 3.655 -245 37 2.075 3.655 -31 47 0 3.66 -90 99 2.475 3.66 -90 158 0 3.66 -160 93 3.08 3.66 -196 5 2.45 3.66 -202 216 2.705 3.66 -228 245 2.395 3.66 -24 89 2.975 3.665 -86 43 2.805 3.665 -96 173 0 3.665 -204 11 0.26 3.665 -217 206 3.14 3.665 -222 93 2.655 3.665 -12 78 0.945 3.67 -33 34 0 3.67 -37 40 0 3.67 -116 207 2.81 3.67 -123 176 0 3.67 -153 96 0 3.67 -156 220 0 3.67 -167 236 0.99 3.67 -179 143 2.72 3.67 -217 220 0 3.67 -240 33 0 3.67 -21 10 2.535 3.675 -28 71 1.555 3.675 -43 74 1.79 3.675 -62 245 3.135 3.675 -108 137 2.885 3.675 -130 213 2.665 3.675 -149 156 2.42 3.675 -183 187 2.21 3.675 -184 6 0.81 3.675 -245 36 2.98 3.675 -12 32 2.52 3.68 -14 12 2.82 3.68 -106 123 2.855 3.68 -129 141 0 3.68 -162 179 0 3.68 -174 99 2.355 3.68 -199 121 1.735 3.68 -15 114 0 3.685 -27 74 0 3.685 -138 95 0 3.685 -188 194 3.005 3.685 -192 132 0 3.685 -22 43 2.995 3.69 -39 110 2.655 3.69 -59 126 0 3.69 -137 184 0 3.69 -153 144 2.845 3.69 -206 13 0 3.69 -219 30 0 3.69 -225 241 2.755 3.69 -240 42 0 3.69 -3 118 2.905 3.695 -12 80 2.91 3.695 -62 34 0 3.695 -75 176 1.945 3.695 -109 161 1.915 3.695 -135 196 3.195 3.695 -167 245 0 3.695 -180 165 2.965 3.695 -205 132 1.78 3.695 -205 195 2.935 3.695 -34 1 2.89 3.7 -126 12 1.645 3.7 -154 202 2.75 3.7 -192 206 0 3.7 -233 253 2.985 3.7 -237 189 2.59 3.7 -238 224 2.935 3.7 -249 44 2.625 3.7 -9 221 2.585 3.705 -24 72 1.035 3.705 -38 115 2.465 3.705 -45 212 2.445 3.705 -90 141 2.995 3.705 -116 143 3.04 3.705 -118 124 0 3.705 -199 70 0.205 3.705 -215 6 0 3.705 -240 49 0 3.705 -34 162 2.805 3.71 -59 185 2.375 3.71 -113 133 2.945 3.71 -159 205 1.765 3.71 -192 254 0 3.71 -210 242 1.615 3.71 -237 238 0 3.71 -249 57 0 3.71 -252 5 3.14 3.71 -4 95 0 3.715 -46 31 1.41 3.715 -55 107 0.69 3.715 -96 154 0 3.715 -108 124 2.595 3.715 -128 77 0 3.715 -148 226 2.9 3.715 -183 252 2.595 3.715 -183 194 2.15 3.715 -252 204 0 3.715 -22 18 0 3.72 -24 98 3.2 3.72 -48 44 0 3.72 -78 10 0 3.72 -120 60 0.995 3.72 -180 179 0 3.72 -192 256 0 3.72 -227 19 0.485 3.72 -4 114 0.575 3.725 -34 88 3.195 3.725 -87 91 0 3.725 -105 166 0 3.725 -119 91 1.87 3.725 -136 156 2.37 3.725 -143 244 3.215 3.725 -148 212 0 3.725 -154 186 3.035 3.725 -34 127 2.935 3.73 -58 12 2.615 3.73 -71 92 1 3.73 -81 158 0 3.73 -93 47 0 3.73 -159 242 3.17 3.73 -203 215 2.985 3.73 -212 227 0 3.73 -212 240 0 3.73 -214 229 0 3.73 -237 219 0 3.73 -20 98 2.175 3.735 -21 71 1.62 3.735 -65 130 0 3.735 -76 186 3.105 3.735 -115 207 3.18 3.735 -119 183 3.205 3.735 -157 100 2.515 3.735 -192 242 2.645 3.735 -5 227 2.91 3.74 -68 88 2.025 3.74 -70 69 0 3.74 -74 95 0 3.74 -153 182 0.915 3.74 -167 234 3.2 3.74 -201 208 0 3.74 -242 2 3.16 3.74 -5 204 2.635 3.745 -38 102 0 3.745 -72 152 2.625 3.745 -143 13 1.025 3.745 -146 169 1.47 3.745 -185 165 1.325 3.745 -213 229 2.57 3.745 -217 219 0 3.745 -51 127 2.92 3.75 -91 151 0 3.75 -186 201 2.375 3.75 -199 3 0 3.75 -17 69 2.585 3.755 -37 82 0 3.755 -171 236 2.835 3.755 -198 208 0.41 3.755 -208 22 2.675 3.755 -222 219 0 3.755 -1 115 2.805 3.76 -6 2 0 3.76 -28 72 3.115 3.76 -45 256 3.18 3.76 -101 164 2.255 3.76 -122 91 1.975 3.76 -166 150 0 3.76 -170 116 2.345 3.76 -182 136 0 3.76 -214 200 1.81 3.76 -224 212 2.665 3.76 -230 42 0 3.76 -45 93 2.5 3.765 -48 97 0 3.765 -51 178 2.04 3.765 -147 214 3.155 3.765 -149 169 1.32 3.765 -165 171 1.9 3.765 -177 179 2.75 3.765 -185 249 2.01 3.765 -197 57 3.065 3.765 -217 201 0 3.765 -221 32 3.195 3.765 -57 73 0 3.77 -80 69 1.62 3.77 -105 165 2.555 3.77 -137 77 3.265 3.77 -144 194 2.44 3.77 -108 133 2.925 3.775 -111 170 0 3.775 -111 171 0 3.775 -116 178 0 3.775 -137 187 2.805 3.775 -179 255 2.485 3.775 -189 179 2.94 3.775 -224 93 2.51 3.775 -245 54 3.12 3.775 -247 194 2.39 3.775 -4 126 0.175 3.78 -6 28 1.57 3.78 -118 133 0 3.78 -133 139 3.15 3.78 -135 242 0 3.78 -143 131 0 3.78 -159 131 3.075 3.78 -192 196 1.11 3.78 -249 187 0 3.78 -252 197 0 3.78 -5 215 1.42 3.785 -43 89 1.8 3.785 -68 178 3.25 3.785 -69 95 2.79 3.785 -97 115 1.755 3.785 -109 59 0 3.785 -109 155 3.245 3.785 -157 206 2.705 3.785 -161 147 2.025 3.785 -176 201 2.99 3.785 -193 19 3.06 3.785 -213 209 2.43 3.785 -237 187 3.13 3.785 -31 95 3.12 3.79 -76 90 0 3.79 -108 73 2.7 3.79 -136 148 0.2 3.79 -137 144 2.875 3.79 -167 241 1.35 3.79 -195 228 3.06 3.79 -250 223 3.27 3.79 -53 98 3.26 3.795 -106 57 0 3.795 -126 113 0 3.795 -128 190 0 3.795 -154 150 0 3.795 -190 176 0 3.795 -210 148 0 3.795 -210 226 3.065 3.795 -232 18 2.475 3.795 -236 201 1.835 3.795 -87 169 2.9 3.8 -145 170 3.095 3.8 -187 252 2.665 3.8 -58 5 3.3 3.805 -106 118 0 3.805 -117 182 0 3.805 -144 252 0.555 3.805 -175 61 1.13 3.805 -247 56 1.51 3.805 -255 223 3.115 3.805 -75 80 0 3.81 -81 99 0 3.81 -99 148 3.035 3.81 -103 171 3.11 3.81 -139 215 0.485 3.81 -198 216 0 3.81 -214 227 1.55 3.81 -215 28 0 3.81 -236 38 0 3.81 -13 16 3.005 3.815 -30 82 1.81 3.815 -48 36 0 3.815 -54 133 1.515 3.815 -68 136 2.24 3.815 -167 171 0 3.815 -192 255 1.545 3.815 -249 179 1.23 3.815 -249 250 0 3.815 -7 21 0 3.82 -23 3 1.155 3.82 -38 27 1.39 3.82 -62 52 0 3.82 -93 10 0 3.82 -99 161 0 3.82 -104 167 3.215 3.82 -114 80 1.715 3.82 -128 114 1.08 3.82 -157 237 0 3.82 -170 189 0 3.82 -225 214 1.7 3.82 -9 57 3.27 3.825 -43 107 2.765 3.825 -69 83 0 3.825 -121 171 2.34 3.825 -134 182 0 3.825 -135 147 3.035 3.825 -141 205 0 3.825 -179 254 0 3.825 -231 42 1.455 3.825 -245 53 3.13 3.825 -252 194 2.44 3.825 -67 135 0.665 3.83 -69 147 3 3.83 -70 73 2.895 3.83 -81 21 3.045 3.83 -88 162 2.545 3.83 -124 139 0 3.83 -134 198 3.165 3.83 -137 91 0 3.83 -191 256 2.785 3.83 -226 227 2.61 3.83 -251 118 3.235 3.83 -10 110 2.715 3.835 -58 44 3.325 3.835 -106 166 1.88 3.835 -115 179 0 3.835 -128 116 0 3.835 -165 179 0 3.835 -183 242 2.855 3.835 -220 42 2.91 3.835 -256 125 2.05 3.835 -4 80 0.515 3.84 -51 133 1.975 3.84 -92 163 2.215 3.84 -134 73 3.135 3.84 -144 246 0.475 3.84 -152 162 3.05 3.84 -153 138 0 3.84 -186 205 0 3.84 -210 221 2.5 3.84 -241 184 0 3.84 -243 247 0 3.84 -256 223 3.015 3.84 -15 12 2.58 3.845 -33 82 0 3.845 -39 43 0 3.845 -48 106 0 3.845 -60 52 3.275 3.845 -85 92 0 3.845 -113 56 0 3.845 -119 138 3.32 3.845 -127 181 3.23 3.845 -171 230 0 3.845 -181 207 3.155 3.845 -213 163 2.8 3.845 -218 216 3.275 3.845 -50 252 0.145 3.85 -68 132 0 3.85 -135 216 0.955 3.85 -184 144 1.285 3.85 -217 200 0.825 3.85 -33 97 0 3.855 -97 116 2.22 3.855 -117 188 1.59 3.855 -134 140 2.51 3.855 -160 228 3.315 3.855 -173 235 0.075 3.855 -20 110 2.92 3.86 -23 72 3.345 3.86 -70 154 3.265 3.86 -150 218 3.205 3.86 -153 198 0 3.86 -168 242 2.875 3.86 -195 221 2.62 3.86 -207 179 1.755 3.86 -213 2 2.23 3.86 -224 61 1.165 3.86 -226 211 2.615 3.86 -33 101 0 3.865 -54 23 3.355 3.865 -60 77 0 3.865 -68 146 3.095 3.865 -146 92 2.05 3.865 -243 114 3.295 3.865 -68 141 0 3.87 -68 131 1.97 3.87 -68 147 0 3.87 -96 82 3.105 3.87 -142 155 0.45 3.87 -149 135 0 3.87 -151 140 0 3.87 -173 150 2.99 3.87 -193 244 0 3.87 -232 35 2.59 3.87 -233 191 2.835 3.87 -11 80 0 3.875 -69 143 3.03 3.875 -193 214 3.165 3.875 -216 29 2.27 3.875 -234 42 3.21 3.875 -246 11 2.745 3.875 -252 203 0 3.875 -8 133 1.52 3.88 -26 248 2.72 3.88 -78 122 0.55 3.88 -115 180 0 3.88 -133 87 0.37 3.88 -161 206 3.1 3.88 -163 227 2.745 3.88 -193 215 2.745 3.88 -247 6 3.205 3.88 -65 95 0 3.885 -72 92 0.875 3.885 -76 149 3.175 3.885 -83 210 3.005 3.885 -172 179 3.165 3.885 -181 167 3.165 3.885 -183 254 2.1 3.885 -186 161 3.37 3.885 -188 201 0 3.885 -211 232 3.275 3.885 -233 222 1.225 3.885 -21 76 2.97 3.89 -70 119 0.725 3.89 -86 71 1.2 3.89 -133 73 0.425 3.89 -151 198 0 3.89 -151 155 0 3.89 -156 150 0 3.89 -173 170 0 3.89 -193 140 3.31 3.89 -203 6 0 3.89 -213 169 3.18 3.89 -251 57 0 3.89 -55 106 0 3.895 -64 114 2.535 3.895 -76 140 0 3.895 -120 11 3.245 3.895 -238 209 2.07 3.895 -247 50 0 3.895 -23 71 0.385 3.9 -34 146 2.495 3.9 -39 146 3.385 3.9 -45 33 0 3.9 -65 96 2.08 3.9 -134 179 0.9 3.9 -179 67 0.485 3.9 -190 132 0 3.9 -217 197 0 3.9 -222 49 2.415 3.9 -243 44 3.38 3.9 -20 113 3.285 3.905 -33 113 2.845 3.905 -36 44 3.345 3.905 -77 140 3.03 3.905 -115 116 0 3.905 -123 172 2.64 3.905 -156 174 3.045 3.905 -181 249 2.15 3.905 -203 197 2.485 3.905 -32 110 1.69 3.91 -68 99 1.45 3.91 -70 92 0.755 3.91 -106 40 0.14 3.91 -108 140 2.755 3.91 -190 205 0 3.91 -233 183 0 3.91 -249 248 0 3.91 -26 232 2.44 3.915 -46 256 3.115 3.915 -51 40 0 3.915 -64 121 0 3.915 -186 250 0 3.915 -246 200 0.385 3.915 -48 93 2.99 3.92 -51 190 2.97 3.92 -70 151 3.33 3.92 -95 141 0 3.92 -136 196 0.925 3.92 -179 247 0 3.92 -185 77 3.01 3.92 -14 80 2.825 3.925 -22 7 2.985 3.925 -22 27 0 3.925 -164 49 2.455 3.925 -167 188 3.095 3.925 -175 162 3.265 3.925 -190 133 2.595 3.925 -7 16 1.51 3.93 -20 157 3.405 3.93 -118 23 1.745 3.93 -121 77 0 3.93 -122 187 1.21 3.93 -127 115 2.69 3.93 -132 160 2.33 3.93 -135 5 2.61 3.93 -181 67 0 3.93 -214 197 2.665 3.93 -236 248 0 3.93 -248 41 2.84 3.93 -11 91 1.7 3.935 -69 179 2.995 3.935 -73 166 3.36 3.935 -81 114 2.15 3.935 -115 68 2.94 3.935 -116 141 2.225 3.935 -120 131 3.325 3.935 -156 103 3.34 3.935 -164 168 0 3.935 -198 218 0 3.935 -213 25 3.09 3.935 -229 36 2.855 3.935 -251 52 2.53 3.935 -35 145 3.305 3.94 -47 1 3.44 3.94 -90 161 2.21 3.94 -115 67 0 3.94 -134 129 0.85 3.94 -138 155 0 3.94 -159 136 1.035 3.94 -196 221 0 3.94 -238 211 2.77 3.94 -51 97 0 3.945 -108 119 0 3.945 -129 5 3.04 3.945 -131 140 1.105 3.945 -156 224 2.045 3.945 -173 191 0 3.945 -228 93 2.78 3.945 -230 248 2.06 3.945 -236 199 1.515 3.945 -242 200 3.36 3.945 -47 177 3.12 3.95 -68 79 0 3.95 -155 204 1.155 3.95 -192 141 0 3.95 -11 23 2.725 3.955 -62 1 0 3.955 -87 131 1.725 3.955 -87 214 3.27 3.955 -92 110 3.405 3.955 -96 161 0.815 3.955 -119 77 1.37 3.955 -140 197 3.225 3.955 -149 216 0.63 3.955 -157 110 2.27 3.955 -182 247 2.4 3.955 -247 201 0 3.955 -63 78 3.46 3.96 -78 74 0 3.96 -115 129 1.935 3.96 -137 194 1.615 3.96 -159 238 2.975 3.96 -166 241 1.255 3.96 -207 243 1.26 3.96 -61 245 3.12 3.965 -75 91 0 3.965 -90 174 0.34 3.965 -94 112 1.99 3.965 -137 139 0 3.965 -154 237 0 3.965 -172 187 0 3.965 -183 140 1.115 3.965 -186 203 0.305 3.965 -247 118 3.21 3.965 -1 56 0 3.97 -121 187 3.045 3.97 -128 111 3.45 3.97 -147 226 2.42 3.97 -153 155 0 3.97 -163 169 1.52 3.97 -233 165 3.245 3.97 -22 86 0 3.975 -22 31 2.145 3.975 -86 106 0 3.975 -94 127 0.115 3.975 -94 100 0.9 3.975 -98 115 0 3.975 -116 192 0 3.975 -120 177 2.83 3.975 -130 145 3.41 3.975 -140 218 3.275 3.975 -151 202 2.39 3.975 -198 220 1.82 3.975 -201 205 0 3.975 -207 244 0 3.975 -249 245 0 3.975 -34 103 2.425 3.98 -76 105 1.49 3.98 -83 238 3.29 3.98 -198 25 0 3.98 -204 239 2.86 3.98 -210 215 0 3.98 -248 24 1.62 3.98 -78 75 3.255 3.985 -90 110 1.78 3.985 -129 200 3.4 3.985 -134 67 0 3.985 -160 238 2.9 3.985 -177 116 0 3.985 -208 240 2.74 3.985 -209 239 0 3.985 -219 240 2.72 3.985 -224 25 0 3.985 -25 86 0 3.99 -37 27 3.355 3.99 -87 152 1.515 3.99 -92 165 2.415 3.99 -94 101 3.425 3.99 -128 73 2.07 3.99 -156 167 0 3.99 -174 121 3.48 3.99 -209 229 1.025 3.99 -18 38 1.32 3.995 -46 243 0 3.995 -48 60 3.37 3.995 -63 116 0 3.995 -66 28 1.49 3.995 -135 195 0.71 3.995 -247 245 0 3.995 -148 228 1.53 4 -154 95 0 4 -240 230 2.7 4 -254 56 3.1 4 -7 77 1.43 4.005 -12 91 0 4.005 -20 101 2.11 4.005 -27 40 2.43 4.005 -78 91 0.4 4.005 -109 99 2.77 4.005 -139 206 2.91 4.005 -165 216 3.215 4.005 -4 68 0 4.01 -16 43 2.25 4.01 -16 76 0.615 4.01 -112 187 0 4.01 -114 79 2.7 4.01 -137 129 2.315 4.01 -156 152 0 4.01 -156 237 0 4.01 -188 247 2.38 4.01 -226 175 0 4.01 -36 39 3.43 4.015 -60 119 0 4.015 -61 244 2.205 4.015 -73 140 2.945 4.015 -108 84 3.475 4.015 -164 241 0 4.015 -183 235 2.16 4.015 -214 165 0 4.015 -240 29 2.82 4.015 -2 25 2.85 4.02 -16 96 3.075 4.02 -94 161 0.9 4.02 -133 142 2.365 4.02 -145 189 3.005 4.02 -145 241 2.845 4.02 -151 132 2.245 4.02 -151 193 1.645 4.02 -216 224 3.43 4.02 -238 239 0 4.02 -37 66 3.515 4.025 -72 99 0.94 4.025 -73 78 1.265 4.025 -73 112 0.6 4.025 -107 165 2.48 4.025 -133 67 0 4.025 -140 214 3.29 4.025 -146 87 3.05 4.025 -207 193 0 4.025 -223 228 3.325 4.025 -2 71 2.56 4.03 -7 133 1.35 4.03 -62 42 0.175 4.03 -78 96 0 4.03 -84 237 2.77 4.03 -208 33 3.51 4.03 -239 49 0 4.03 -16 95 2.195 4.035 -22 231 0 4.035 -25 41 0 4.035 -44 40 0 4.035 -55 113 3.41 4.035 -61 42 3.425 4.035 -66 101 0.86 4.035 -198 203 0 4.035 -229 44 2.955 4.035 -15 138 2.875 4.04 -26 234 2.59 4.04 -28 92 0 4.04 -75 142 0 4.04 -92 161 3.51 4.04 -94 113 2.64 4.04 -109 157 2.2 4.04 -168 236 0.715 4.04 -185 234 0 4.04 -222 226 2.92 4.04 -240 26 2.48 4.04 -248 36 1.54 4.04 -256 204 3.45 4.04 -16 30 2.105 4.045 -33 109 3.5 4.045 -34 133 3.44 4.045 -94 155 3.495 4.045 -144 218 1.27 4.045 -156 206 3.06 4.045 -183 231 2.91 4.045 -197 224 3.335 4.045 -37 22 3.485 4.05 -74 155 2.435 4.05 -85 40 1.66 4.05 -174 123 0 4.05 -183 247 0 4.05 -190 80 1.315 4.05 -235 42 0 4.05 -2 41 2.615 4.055 -4 8 0 4.055 -16 89 1.445 4.055 -45 25 2.52 4.055 -83 104 3.015 4.055 -124 155 1.29 4.055 -143 256 2.29 4.055 -177 117 1.575 4.055 -199 119 1.785 4.055 -208 196 0 4.055 -209 37 3.38 4.055 -12 72 3.435 4.06 -41 36 3.235 4.06 -78 138 0.575 4.06 -92 40 2.985 4.06 -117 3 2.78 4.06 -122 116 1.095 4.06 -124 87 3.145 4.06 -147 195 0.38 4.06 -160 147 2.205 4.06 -175 49 1.33 4.06 -228 2 3.495 4.06 -229 24 1.65 4.06 -254 50 1.865 4.06 -25 43 2.055 4.065 -77 155 1.815 4.065 -108 127 3.485 4.065 -171 183 1.37 4.065 -199 34 2.605 4.065 -19 72 3.49 4.07 -77 89 1.31 4.07 -79 178 0 4.07 -124 151 3.405 4.07 -226 216 2.54 4.07 -226 247 1.17 4.07 -233 163 1.675 4.07 -239 42 2.12 4.07 -8 117 2.395 4.075 -80 130 3.465 4.075 -140 155 0 4.075 -147 162 3.185 4.075 -166 187 3.41 4.075 -214 161 3.5 4.075 -234 44 3.445 4.075 -238 212 1.45 4.075 -238 243 3.485 4.075 -22 41 0 4.08 -23 16 1.545 4.08 -34 44 1.995 4.08 -57 102 0.725 4.08 -69 117 2.02 4.08 -71 89 0 4.08 -74 157 0 4.08 -108 191 3.51 4.08 -109 174 0 4.08 -126 97 3.16 4.08 -145 226 1.985 4.08 -65 75 3.575 4.085 -73 116 3.45 4.085 -146 130 0 4.085 -209 22 3.585 4.085 -227 236 3.465 4.085 -250 57 3.065 4.085 -60 123 3.05 4.09 -84 52 3.115 4.09 -104 164 0 4.09 -181 184 0 4.09 -202 220 0 4.09 -207 50 0.655 4.09 -248 120 1.53 4.09 -253 27 3.39 4.09 -48 32 0 4.095 -138 74 0 4.095 -168 44 3.025 4.095 -20 83 1.2 4.1 -21 72 0.96 4.1 -47 52 0.955 4.1 -55 53 3.455 4.1 -90 138 2.62 4.1 -132 216 2.855 4.1 -142 192 0 4.1 -143 255 0.55 4.1 -152 226 0 4.1 -206 220 3.34 4.1 -234 203 2.705 4.1 -256 126 3.565 4.1 -19 37 1.4 4.105 -24 146 2.22 4.105 -25 21 0 4.105 -35 72 2.11 4.105 -58 77 2.62 4.105 -72 101 1.05 4.105 -83 160 2.725 4.105 -154 161 0.13 4.105 -171 45 3.445 4.105 -20 72 2.045 4.11 -30 110 2.75 4.11 -192 178 1.62 4.11 -202 222 1.09 4.11 -83 162 2.67 4.115 -85 104 2.955 4.115 -89 72 2.99 4.115 -127 142 3.09 4.115 -147 212 2.14 4.115 -149 175 3.585 4.115 -156 161 2.95 4.115 -186 139 0 4.115 -191 45 2.76 4.115 -32 82 2.16 4.12 -79 148 3.34 4.12 -124 187 0 4.12 -128 108 2.805 4.12 -160 191 2.525 4.12 -171 247 3.22 4.12 -174 187 0 4.12 -200 25 1.195 4.12 -29 39 1.73 4.125 -33 66 3.575 4.125 -89 217 3.475 4.125 -122 76 3.385 4.125 -135 197 0 4.125 -163 231 2.7 4.125 -169 183 1.48 4.125 -170 177 3.125 4.125 -185 184 0 4.125 -185 144 3.005 4.125 -186 214 3.345 4.125 -209 227 2.415 4.125 -245 38 2.66 4.125 -251 126 3.12 4.125 -252 54 3.55 4.125 -253 203 3.325 4.125 -255 14 0.66 4.125 -256 243 1.74 4.125 -9 74 0 4.13 -14 17 0 4.13 -20 24 1.395 4.13 -47 145 3.32 4.13 -74 96 0 4.13 -136 195 0 4.13 -202 194 2.645 4.13 -203 11 0 4.13 -237 236 2.925 4.13 -6 121 3.59 4.135 -51 142 3.385 4.135 -60 106 0 4.135 -81 126 2.16 4.135 -115 182 1.51 4.135 -122 188 3.225 4.135 -134 146 2.91 4.135 -138 158 1.91 4.135 -149 67 3.535 4.135 -238 221 2.81 4.135 -22 10 1.5 4.14 -32 99 2.3 4.14 -34 121 3.165 4.14 -35 53 2.8 4.14 -55 88 3.35 4.14 -70 68 2.2 4.14 -96 147 2.955 4.14 -157 174 0.395 4.14 -168 243 0 4.14 -230 27 2.96 4.14 -27 57 2.25 4.145 -31 42 2.38 4.145 -56 71 0.3 4.145 -79 130 0 4.145 -81 109 3.57 4.145 -86 146 0.715 4.145 -168 50 2.8 4.145 -225 195 1.725 4.145 -9 126 2.095 4.15 -14 126 0.15 4.15 -15 80 0.655 4.15 -23 120 1.865 4.15 -30 80 3.475 4.15 -33 53 1.69 4.15 -47 64 1.29 4.15 -58 128 2.645 4.15 -89 214 3.63 4.15 -116 127 0 4.15 -116 124 2.925 4.15 -126 142 0.305 4.15 -173 172 1.305 4.15 -245 231 0 4.15 -248 53 0 4.15 -57 121 0 4.155 -126 68 0 4.155 -147 223 3.445 4.155 -233 197 3.615 4.155 -250 194 2.97 4.155 -253 128 3.62 4.155 -19 228 2.675 4.16 -89 111 1.835 4.16 -95 130 0 4.16 -168 38 2.995 4.16 -195 22 3.085 4.16 -1 142 2.95 4.165 -33 31 2.91 4.165 -116 123 2.36 4.165 -119 217 2.915 4.165 -124 144 0.515 4.165 -126 114 0 4.165 -140 194 0.985 4.165 -211 17 0 4.165 -248 34 0 4.165 -249 231 0 4.165 -19 80 3.335 4.17 -23 31 3.625 4.17 -28 42 3.245 4.17 -46 235 2.71 4.17 -74 140 3.44 4.17 -78 95 0 4.17 -136 215 2.105 4.17 -138 156 3.5 4.17 -146 136 2.855 4.17 -180 46 3.655 4.17 -202 161 3.13 4.17 -202 197 2.14 4.17 -225 223 3.56 4.17 -231 18 0 4.17 -249 232 0.83 4.17 -1 190 3.275 4.175 -9 77 0.34 4.175 -18 101 0 4.175 -84 170 2.795 4.175 -87 217 2.36 4.175 -130 150 3.255 4.175 -212 17 3.495 4.175 -218 172 0 4.175 -16 28 2.165 4.18 -22 229 0 4.18 -96 95 0 4.18 -124 182 0 4.18 -180 255 0 4.18 -197 21 0 4.18 -213 230 3.295 4.18 -221 43 3.62 4.18 -233 231 3.01 4.18 -234 251 0 4.18 -34 178 3.02 4.185 -52 178 3.345 4.185 -79 196 1.19 4.185 -84 177 1.425 4.185 -109 63 3.45 4.185 -170 250 2.65 4.185 -215 26 0 4.185 -232 53 0 4.185 -236 39 3.56 4.185 -4 5 3.66 4.19 -22 21 0 4.19 -148 162 2.765 4.19 -150 175 3.675 4.19 -182 144 0.6 4.19 -199 244 0.97 4.19 -215 25 0 4.19 -221 61 3.59 4.19 -55 103 0 4.195 -73 87 2.45 4.195 -93 35 3.56 4.195 -149 162 2.99 4.195 -167 224 3.515 4.195 -172 247 0 4.195 -185 171 0 4.195 -221 62 3.66 4.195 -245 5 1.055 4.195 -32 35 2.275 4.2 -77 95 1.67 4.2 -79 155 0.845 4.2 -81 91 3.565 4.2 -115 134 2.17 4.2 -117 178 0 4.2 -124 198 1.415 4.2 -157 99 2.535 4.2 -217 150 0 4.2 -235 27 2.89 4.2 -69 149 2.31 4.205 -95 161 1.145 4.205 -99 52 3.28 4.205 -163 249 3.005 4.205 -168 26 2.66 4.205 -242 5 0 4.205 -13 56 2.345 4.21 -84 222 3.44 4.21 -93 77 3.25 4.21 -129 213 2.795 4.21 -158 161 0 4.21 -160 48 3.71 4.21 -174 148 2.125 4.21 -242 199 3.315 4.21 -243 35 2.855 4.21 -245 49 2.485 4.21 -28 106 2.99 4.215 -63 112 0 4.215 -64 113 0 4.215 -76 77 0 4.215 -85 130 3.35 4.215 -93 17 3.555 4.215 -108 176 0.99 4.215 -186 159 1.84 4.215 -205 204 3.275 4.215 -210 37 3.465 4.215 -241 243 0 4.215 -251 113 3.67 4.215 -4 3 0 4.22 -36 56 1.775 4.22 -48 27 1.815 4.22 -114 131 3.695 4.22 -129 56 3.395 4.22 -130 225 3.295 4.22 -186 148 3.325 4.22 -210 197 3.58 4.22 -220 109 3.71 4.22 -235 250 0.05 4.22 -240 228 0 4.22 -242 19 3.355 4.22 -245 255 2.385 4.22 -253 201 2.35 4.22 -68 190 3.215 4.225 -115 241 3.285 4.225 -122 166 3.245 4.225 -144 197 0.895 4.225 -173 240 0.22 4.225 -177 145 2.36 4.225 -181 179 0 4.225 -202 237 2.44 4.225 -212 216 3.695 4.225 -219 48 3.59 4.225 -248 118 0.8 4.225 -13 113 3.65 4.23 -50 8 2.29 4.23 -69 87 0 4.23 -70 71 0 4.23 -83 222 3.465 4.23 -130 217 3.72 4.23 -135 152 0.555 4.23 -173 222 0 4.23 -198 210 2.79 4.23 -223 17 0 4.23 -1 68 2.78 4.235 -98 226 3.41 4.235 -136 163 1.51 4.235 -71 88 2.05 4.24 -115 131 0.73 4.24 -122 7 2.49 4.24 -195 216 0.445 4.24 -214 155 1.04 4.24 -12 77 0 4.245 -71 217 2.975 4.245 -78 142 0 4.245 -96 206 2.78 4.245 -167 26 1.63 4.245 -204 16 0.275 4.245 -213 195 0 4.245 -229 18 1.705 4.245 -248 44 0.515 4.245 -13 126 2.535 4.25 -32 106 3.73 4.25 -129 147 2.86 4.25 -130 175 3.37 4.25 -137 152 3.565 4.25 -138 68 1 4.25 -147 221 2.135 4.25 -208 81 3.195 4.25 -210 230 3.43 4.25 -232 44 2.495 4.25 -15 75 3.315 4.255 -33 43 1.155 4.255 -56 114 0 4.255 -65 126 0 4.255 -82 136 3.64 4.255 -85 71 0 4.255 -125 60 3.295 4.255 -125 154 3.545 4.255 -160 235 3.415 4.255 -219 203 0 4.255 -3 131 2.99 4.26 -4 20 0 4.26 -45 106 1.08 4.26 -61 232 2.79 4.26 -85 151 3.575 4.26 -90 125 3.27 4.26 -91 95 0 4.26 -153 140 0 4.26 -157 175 2.585 4.26 -182 250 3.47 4.26 -184 194 0 4.26 -200 6 0 4.26 -218 191 2.735 4.26 -218 239 0 4.26 -225 231 0.125 4.26 -227 25 0.98 4.26 -64 123 3 4.265 -72 146 0 4.265 -119 87 0.915 4.265 -153 77 1.305 4.265 -208 109 3.595 4.265 -230 38 0 4.265 -233 236 2.86 4.265 -61 53 3.625 4.27 -90 30 1.8 4.27 -95 158 0 4.27 -171 182 3.1 4.27 -171 250 3.095 4.27 -196 211 0 4.27 -240 255 0 4.27 -242 65 3.685 4.27 -248 6 2.765 4.27 -4 200 3.61 4.275 -9 28 2.475 4.275 -10 125 2.455 4.275 -71 74 2.975 4.275 -73 80 2.9 4.275 -216 247 3.745 4.275 -236 109 3.61 4.275 -245 205 3.145 4.275 -251 112 3.355 4.275 -4 56 0.625 4.28 -35 63 1.005 4.28 -41 106 0 4.28 -60 13 3.365 4.28 -73 138 0 4.28 -93 13 1.4 4.28 -111 158 0 4.28 -234 183 0 4.28 -253 29 3.48 4.28 -12 71 0 4.285 -47 127 2.59 4.285 -86 76 0 4.285 -88 130 0 4.285 -89 169 1.805 4.285 -166 171 0 4.285 -170 207 3.595 4.285 -202 223 3.565 4.285 -209 66 3.6 4.285 -210 220 3.645 4.285 -212 229 1.93 4.285 -215 161 3.75 4.285 -40 114 3.635 4.29 -112 52 2.465 4.29 -123 100 3.16 4.29 -145 46 3.72 4.29 -146 158 0 4.29 -157 222 0.9 4.29 -179 232 2.235 4.29 -193 199 3.165 4.29 -208 209 1.44 4.29 -225 22 3.415 4.29 -242 194 0 4.29 -243 47 2.83 4.29 -23 76 0 4.295 -37 30 3.675 4.295 -91 214 3.675 4.295 -199 2 1.925 4.295 -202 169 3.065 4.295 -26 125 3.33 4.3 -34 118 2.405 4.3 -34 69 3.755 4.3 -62 113 0 4.3 -95 147 3.71 4.3 -111 82 2.93 4.3 -157 146 3.4 4.3 -199 200 0 4.3 -240 250 0 4.3 -21 29 2.405 4.305 -34 3 3.055 4.305 -53 126 1.945 4.305 -80 67 3.68 4.305 -85 76 3.54 4.305 -89 102 3.47 4.305 -93 68 3.355 4.305 -141 161 2.19 4.305 -202 219 0 4.305 -28 76 1.28 4.31 -141 175 2.95 4.31 -150 226 1.79 4.31 -150 230 0 4.31 -192 129 0 4.31 -225 2 3.53 4.31 -242 223 2.56 4.31 -242 209 3.05 4.31 -243 1 0 4.31 -252 59 3.565 4.31 -36 40 0 4.315 -65 138 1.595 4.315 -69 166 3.645 4.315 -105 110 1.925 4.315 -128 102 2.835 4.315 -141 209 2.07 4.315 -145 221 3.72 4.315 -154 102 1.5 4.315 -162 232 3.285 4.315 -219 223 3.35 4.315 -222 162 3.455 4.315 -239 90 3.655 4.315 -1 17 0 4.32 -4 175 3.765 4.32 -13 114 3.385 4.32 -81 111 3.695 4.32 -146 151 0 4.32 -199 195 2.23 4.32 -212 78 3.445 4.32 -213 227 0 4.32 -216 18 3.52 4.32 -226 249 3.23 4.32 -252 118 0.27 4.32 -64 110 0.335 4.325 -64 138 2.92 4.325 -104 52 3.625 4.325 -148 212 3.815 4.325 -154 108 3.62 4.325 -156 96 0 4.325 -159 228 2.985 4.325 -160 46 2.73 4.325 -224 247 3.82 4.325 -232 34 0 4.325 -54 113 1.215 4.33 -73 75 0 4.33 -78 18 3.83 4.33 -89 106 2.75 4.33 -90 95 0 4.33 -90 107 3.425 4.33 -93 66 1.175 4.33 -150 213 0 4.33 -156 79 3.62 4.33 -234 57 3.115 4.33 -242 17 1.535 4.33 -243 113 2.84 4.33 -20 63 3.725 4.335 -64 127 2.93 4.335 -69 76 3.225 4.335 -96 111 0 4.335 -202 233 1.33 4.335 -203 16 0 4.335 -249 236 0 4.335 -251 110 3.385 4.335 -34 52 2.805 4.34 -144 219 1.105 4.34 -154 110 1.715 4.34 -165 188 2.345 4.34 -200 244 3.35 4.34 -220 236 0 4.34 -237 247 3.73 4.34 -12 156 3.775 4.345 -61 58 3.52 4.345 -64 65 2.91 4.345 -69 192 3.71 4.345 -69 193 3.445 4.345 -93 65 1.12 4.345 -103 162 0 4.345 -105 214 3.77 4.345 -116 95 2.805 4.345 -130 164 3.345 4.345 -154 214 1.205 4.345 -199 23 0.14 4.345 -88 217 3.485 4.35 -94 63 1.21 4.35 -149 40 3.845 4.35 -155 144 0 4.35 -155 175 3.55 4.35 -167 162 3.02 4.35 -182 204 3.62 4.35 -219 235 2.825 4.35 -27 110 2.04 4.355 -43 110 0 4.355 -57 42 0 4.355 -85 153 3.735 4.355 -111 99 0 4.355 -111 202 3.66 4.355 -141 196 0.915 4.355 -151 165 3.37 4.355 -170 191 0 4.355 -208 46 2.51 4.355 -221 211 2.12 4.355 -239 16 2.305 4.355 -253 125 3.005 4.355 -4 66 0 4.36 -38 26 0.195 4.36 -63 60 3.255 4.36 -75 177 1.37 4.36 -150 166 3.81 4.36 -155 233 1.76 4.36 -176 58 3.01 4.36 -185 74 3.7 4.36 -220 253 3.425 4.36 -223 16 0 4.36 -24 53 3.37 4.365 -42 154 3.64 4.365 -50 6 0.625 4.365 -51 2 3.83 4.365 -76 131 3.645 4.365 -91 158 0 4.365 -104 226 3.33 4.365 -109 128 0.49 4.365 -109 97 0 4.365 -137 193 1.7 4.365 -149 104 3.15 4.365 -153 131 1.795 4.365 -186 215 3.265 4.365 -215 31 3.63 4.365 -218 230 0.145 4.365 -232 244 0.76 4.365 -248 7 2.63 4.365 -252 43 3.605 4.365 -36 82 3.385 4.37 -64 116 0.11 4.37 -68 67 0 4.37 -78 20 0 4.37 -93 95 3.255 4.37 -105 165 3.785 4.37 -124 188 0 4.37 -134 193 1.4 4.37 -140 160 3.84 4.37 -222 180 3.385 4.37 -229 38 0 4.37 -234 60 3.5 4.37 -250 255 0 4.37 -252 122 3.655 4.37 -10 30 0 4.375 -177 163 3.875 4.375 -227 89 3.795 4.375 -63 126 0 4.38 -97 170 2.255 4.38 -98 222 3.755 4.38 -116 71 3.865 4.38 -191 239 0 4.38 -253 57 3.1 4.38 -254 53 2.87 4.38 -56 70 3.72 4.385 -142 207 2.455 4.385 -160 219 0 4.385 -174 214 3.475 4.39 -191 255 3.55 4.39 -199 22 3.635 4.39 -229 243 1.91 4.39 -10 42 2.425 4.395 -12 92 3.345 4.395 -23 85 0 4.395 -93 211 3.71 4.395 -94 128 1.97 4.395 -94 36 3.27 4.395 -107 214 3.25 4.395 -144 196 3.53 4.395 -160 220 3.42 4.395 -182 217 1.405 4.395 -187 135 3.86 4.395 -216 41 0 4.395 -252 55 3.595 4.395 -254 231 3.07 4.395 -2 76 3.205 4.4 -19 8 0 4.4 -26 106 0 4.4 -48 94 1.065 4.4 -98 170 3 4.4 -110 126 3.75 4.4 -133 217 2.955 4.4 -160 209 1.94 4.4 -162 229 3.165 4.4 -176 45 3.41 4.4 -216 235 2.94 4.4 -227 85 1.02 4.4 -239 228 0 4.4 -19 3 0 4.405 -45 125 0 4.405 -71 68 1.71 4.405 -86 151 0.74 4.405 -164 216 3.02 4.405 -248 17 2.955 4.405 -19 23 3.315 4.41 -52 100 3.335 4.41 -57 64 2.47 4.41 -107 188 1.61 4.41 -115 185 1.305 4.41 -140 215 0 4.41 -147 196 0 4.41 -149 99 3.53 4.41 -159 218 2.605 4.41 -160 14 3.395 4.41 -170 240 3.86 4.41 -197 206 3.275 4.41 -205 53 3.785 4.41 -218 219 0 4.41 -245 199 0 4.41 -252 42 0 4.41 -73 185 0.52 4.415 -80 79 0 4.415 -81 30 1.14 4.415 -107 100 2.68 4.415 -134 214 2.4 4.415 -145 141 3.16 4.415 -162 228 3.265 4.415 -202 158 3.6 4.415 -237 61 0.26 4.415 -6 70 0 4.42 -42 108 3.83 4.42 -101 151 3.595 4.42 -134 105 3.875 4.42 -135 215 0.205 4.42 -156 185 3.725 4.42 -163 180 1.845 4.42 -186 135 3.38 4.42 -231 36 2.66 4.42 -239 81 3.125 4.42 -45 60 3.52 4.425 -110 188 3.84 4.425 -129 144 3.92 4.425 -137 88 3.895 4.425 -176 255 1.95 4.425 -202 148 3.51 4.425 -5 227 3.86 4.43 -45 62 3.335 4.43 -75 114 2.695 4.43 -76 217 2.35 4.43 -84 101 1.275 4.43 -167 247 0.985 4.43 -186 173 3.21 4.43 -196 175 3.11 4.43 -198 5 1.77 4.43 -23 87 0 4.435 -35 149 3.79 4.435 -50 23 2.21 4.435 -62 94 3.385 4.435 -82 113 3.38 4.435 -142 129 0 4.435 -1 3 0 4.44 -27 128 3.455 4.44 -48 128 0.655 4.44 -113 192 3.88 4.44 -174 166 3.385 4.44 -213 167 0 4.44 -215 14 3.66 4.44 -221 228 2.195 4.44 -12 137 3.335 4.445 -34 65 3.59 4.445 -67 202 3.935 4.445 -142 131 1.985 4.445 -191 256 3.92 4.445 -195 175 2.875 4.445 -201 64 3.765 4.445 -18 41 0.045 4.45 -23 73 1.76 4.45 -52 68 3.75 4.45 -58 208 3.845 4.45 -76 88 3.025 4.45 -122 185 0.475 4.45 -126 190 0 4.45 -128 107 0.345 4.45 -152 249 3.605 4.45 -164 209 1.4 4.45 -208 78 0.97 4.45 -244 8 2.09 4.45 -23 56 1 4.455 -56 119 3.93 4.455 -58 219 3.46 4.455 -123 217 3.575 4.455 -131 217 2.345 4.455 -134 210 1.455 4.455 -160 203 2.875 4.455 -170 190 0 4.455 -233 204 3.23 4.455 -237 46 0 4.455 -245 229 0 4.455 -256 125 3.895 4.455 -67 209 3.445 4.46 -76 92 0 4.46 -97 161 3.765 4.46 -115 142 2.67 4.46 -170 161 1.335 4.46 -189 250 0.33 4.46 -231 56 3.715 4.46 -13 17 0.585 4.465 -17 21 0 4.465 -84 191 1.445 4.465 -133 132 3.78 4.465 -214 160 3.435 4.465 -50 19 3.84 4.47 -51 40 3.935 4.47 -105 172 2.7 4.47 -107 233 2.05 4.47 -196 212 0 4.47 -85 41 0.695 4.475 -111 141 3.115 4.475 -116 130 2.485 4.475 -121 182 0 4.475 -144 158 3.615 4.475 -146 229 3.895 4.475 -148 209 0 4.475 -155 191 3.835 4.475 -158 203 3.79 4.475 -160 212 2.525 4.475 -200 8 0 4.475 -240 220 2.735 4.475 -12 119 1.355 4.48 -23 74 2.465 4.48 -27 101 3.385 4.48 -126 79 0 4.48 -160 45 3.435 4.48 -169 220 2.605 4.48 -190 191 3.935 4.48 -190 144 3.71 4.48 -50 22 3.83 4.485 -63 98 0 4.485 -84 180 2.74 4.485 -127 161 3.785 4.485 -164 167 0.765 4.485 -120 2 1.975 4.49 -132 164 3.305 4.49 -161 162 2.32 4.49 -198 199 3.395 4.49 -202 159 1.65 4.49 -205 9 3.205 4.49 -241 203 3.985 4.49 -247 28 3.875 4.49 -11 12 0 4.495 -16 20 2.055 4.495 -41 87 3.635 4.495 -125 100 3.49 4.495 -159 239 0.29 4.495 -167 228 3.925 4.495 -189 244 2.185 4.495 -213 233 0.67 4.495 -223 46 3.77 4.495 -233 221 3.97 4.495 -235 57 3.11 4.495 -240 247 3.7 4.495 -8 114 0.84 4.5 -28 153 3.45 4.5 -58 206 3.74 4.5 -59 251 0 4.5 -73 28 3.995 4.5 -108 214 3.875 4.5 -142 178 2.185 4.5 -148 163 0 4.5 -167 231 0 4.5 -250 251 0 4.5 -251 75 3.97 4.5 -32 125 0.065 4.505 -48 49 0.63 4.505 -83 163 2.22 4.505 -122 124 0 4.505 -159 204 3.345 4.505 -161 234 3.99 4.505 -176 236 2.88 4.505 -186 111 3.25 4.505 -204 199 3.815 4.505 -206 25 3.755 4.505 -222 62 3.37 4.505 -233 160 0 4.505 -4 64 3.84 4.51 -16 29 0 4.51 -67 210 3.15 4.51 -82 97 0 4.51 -83 175 3 4.51 -98 163 2.77 4.51 -105 174 0.45 4.51 -116 75 0.195 4.51 -121 183 3.155 4.51 -160 93 3.79 4.51 -222 33 2.415 4.51 -16 154 2.62 4.515 -23 6 0 4.515 -32 33 2.165 4.515 -32 154 0.18 4.515 -116 113 0 4.515 -135 184 0 4.515 -157 149 3.615 4.515 -166 179 2.8 4.515 -211 66 1.26 4.515 -238 48 0.92 4.515 -34 127 3.785 4.52 -64 77 0 4.52 -134 132 0.995 4.52 -166 234 3.955 4.52 -248 195 3.765 4.52 -48 36 3.885 4.525 -49 20 1.4 4.525 -58 4 3.825 4.525 -61 250 0 4.525 -89 31 2.89 4.525 -120 142 3.71 4.525 -134 150 1.925 4.525 -147 167 3.595 4.525 -192 61 2.3 4.525 -238 255 0 4.525 -43 154 2.415 4.53 -48 255 0.66 4.53 -71 83 3.95 4.53 -176 62 2.94 4.53 -177 238 3.86 4.53 -208 20 3.71 4.53 -218 216 3.95 4.53 -227 39 1.915 4.53 -238 129 4.015 4.53 -134 147 0 4.535 -139 205 3.28 4.535 -166 131 3.96 4.535 -170 52 2.985 4.535 -18 36 0 4.54 -157 154 0 4.54 -242 246 0 4.54 -1 51 0 4.545 -109 92 1.355 4.545 -114 119 3.855 4.545 -168 242 3.94 4.545 -170 180 2.21 4.545 -195 21 0 4.545 -202 221 0 4.545 -222 209 0 4.545 -248 5 0 4.545 -250 78 3.97 4.545 -4 208 1.22 4.55 -76 136 3.735 4.55 -111 97 0 4.55 -114 68 0 4.55 -116 79 0 4.55 -129 194 0 4.55 -134 217 2.41 4.55 -155 240 3.85 4.55 -159 14 2.39 4.55 -159 195 1.77 4.55 -161 180 0.17 4.55 -177 226 3.43 4.55 -6 119 3.345 4.555 -31 125 2.46 4.555 -71 132 3.995 4.555 -83 151 2.97 4.555 -86 134 3.7 4.555 -108 150 3.91 4.555 -121 135 3.96 4.555 -143 208 3.23 4.555 -155 98 3.985 4.555 -189 232 3.19 4.555 -238 178 3.98 4.555 -54 12 3.995 4.56 -69 137 1.265 4.56 -81 21 3.95 4.56 -116 67 0 4.56 -152 218 3.53 4.56 -158 221 0 4.56 -161 48 3.875 4.56 -196 93 3.615 4.56 -220 221 3.625 4.56 -225 19 1.19 4.56 -238 207 0.105 4.56 -248 244 0 4.56 -6 124 3.91 4.565 -46 36 0 4.565 -53 75 3.855 4.565 -74 217 3.415 4.565 -91 106 3.855 4.565 -106 170 1.925 4.565 -114 133 0 4.565 -135 144 0.06 4.565 -141 215 3.61 4.565 -154 84 2.16 4.565 -176 143 3.01 4.565 -207 159 3.335 4.565 -21 95 4.04 4.57 -69 147 3.995 4.57 -75 113 1.215 4.57 -92 106 3.265 4.57 -108 181 0 4.57 -113 100 0 4.57 -118 40 0 4.57 -134 68 1.485 4.57 -177 142 2.635 4.57 -32 47 0 4.575 -68 130 0 4.575 -111 98 2.935 4.575 -182 187 0 4.575 -194 227 3.8 4.575 -198 50 1.095 4.575 -15 219 3.995 4.58 -46 232 1.565 4.58 -64 244 3.63 4.58 -70 39 3.13 4.58 -106 171 4 4.58 -116 141 4.035 4.58 -193 17 0.785 4.58 -208 175 2.72 4.58 -238 205 3.63 4.58 -2 72 1.31 4.585 -7 137 0.935 4.585 -8 68 2.86 4.585 -32 43 0 4.585 -46 35 0 4.585 -59 185 3.945 4.585 -70 27 3.22 4.585 -79 204 3.96 4.585 -105 151 1.795 4.585 -110 123 1.625 4.585 -137 87 0 4.585 -137 214 3.25 4.585 -248 58 4.03 4.585 -34 63 0 4.59 -102 115 3.38 4.59 -164 212 2.575 4.59 -192 203 0 4.59 -197 227 2.865 4.59 -219 221 0 4.59 -233 161 2.66 4.59 -17 68 2.86 4.595 -87 147 4.035 4.595 -155 221 0 4.595 -187 9 4.095 4.595 -189 48 3.515 4.595 -232 36 1.635 4.595 -242 179 0 4.595 -243 63 2.435 4.595 -68 147 3.96 4.6 -73 71 0 4.6 -143 195 0.91 4.6 -143 93 3.8 4.6 -169 234 3.59 4.6 -186 154 3.88 4.6 -192 250 0 4.6 -198 184 0 4.6 -198 58 2.46 4.6 -213 218 3.32 4.6 -220 247 2.055 4.6 -245 244 0.61 4.6 -248 51 0.82 4.6 -16 68 3.52 4.605 -18 72 1.36 4.605 -19 95 3.21 4.605 -31 91 4.005 4.605 -118 185 0 4.605 -131 226 4.035 4.605 -157 3 3.91 4.605 -183 230 0 4.605 -232 51 3.77 4.605 -247 29 3.78 4.605 -9 60 0 4.61 -110 191 3.34 4.61 -141 130 1.645 4.61 -159 208 1.87 4.61 -189 251 3.72 4.61 -203 195 3.49 4.61 -247 48 3.835 4.61 -140 213 0 4.615 -26 25 0 4.62 -32 84 2.23 4.62 -51 116 0 4.62 -106 103 0 4.62 -113 241 4.075 4.62 -142 159 0 4.62 -146 168 3.97 4.62 -180 61 2.28 4.62 -195 212 1.94 4.62 -200 37 3.58 4.62 -225 230 1.43 4.62 -238 242 3.685 4.62 -21 36 4.12 4.625 -116 17 3.19 4.625 -123 171 0 4.625 -123 234 4.045 4.625 -134 152 0 4.625 -155 143 0 4.625 -174 167 3.965 4.625 -199 15 4.1 4.625 -234 198 3.675 4.625 -80 3 1.63 4.63 -80 82 2.455 4.63 -127 191 0 4.63 -146 175 3.26 4.63 -162 242 4.1 4.63 -169 216 3.115 4.63 -169 229 4.095 4.63 -235 60 3.805 4.63 -107 151 3.32 4.635 -108 187 0 4.635 -152 194 3.585 4.635 -174 233 0.45 4.635 -175 37 3.565 4.635 -200 212 3.475 4.635 -232 242 1.9 4.635 -78 126 0 4.64 -86 117 3.995 4.64 -119 131 0.77 4.64 -165 230 0 4.64 -53 138 4.13 4.645 -92 174 3.245 4.645 -131 246 3.935 4.645 -136 211 3.375 4.645 -142 132 0 4.645 -177 191 3.795 4.645 -223 20 3.8 4.645 -241 255 0 4.645 -252 204 3.96 4.645 -8 69 0 4.65 -30 128 3.145 4.65 -111 160 0 4.65 -112 185 0 4.65 -169 230 0 4.65 -187 204 3.47 4.65 -220 184 4.095 4.65 -228 242 4.09 4.65 -249 187 3.855 4.65 -19 35 3.485 4.655 -141 208 2.1 4.655 -143 204 3.385 4.655 -225 49 2.08 4.655 -243 120 3.92 4.655 -14 64 0 4.66 -22 230 0 4.66 -71 149 0 4.66 -91 89 0 4.66 -98 178 0 4.66 -169 240 3.59 4.66 -242 57 4.075 4.66 -6 77 2.125 4.665 -26 70 3.73 4.665 -108 133 3.98 4.665 -111 237 0.07 4.665 -118 133 3.965 4.665 -145 149 0 4.665 -145 225 1.66 4.665 -169 184 3.67 4.665 -183 242 4 4.665 -189 203 3.38 4.665 -246 38 1.975 4.665 -8 142 4.055 4.67 -25 78 2.2 4.67 -86 36 3.61 4.67 -86 104 2.99 4.67 -152 230 0 4.67 -155 147 3.91 4.67 -219 224 0 4.67 -224 230 1.8 4.67 -37 2 3.335 4.675 -58 78 3.11 4.675 -84 113 2.75 4.675 -107 171 0 4.675 -142 136 3.32 4.675 -145 163 0 4.675 -14 77 2.805 4.68 -67 203 3.725 4.68 -106 121 0 4.68 -145 175 1.585 4.68 -163 245 1.71 4.68 -164 211 3.33 4.68 -188 79 3.6 4.68 -214 224 1.715 4.68 -238 245 2.44 4.68 -251 11 2.315 4.68 -7 124 1.425 4.685 -16 65 0 4.685 -22 224 1.8 4.685 -51 76 3.91 4.685 -103 171 4.01 4.685 -121 171 4.06 4.685 -145 240 3.555 4.685 -153 185 2.54 4.685 -168 178 3.98 4.685 -6 10 3.76 4.69 -9 64 0 4.69 -73 156 3.58 4.69 -79 241 3.825 4.69 -103 218 3.58 4.69 -106 39 0 4.69 -108 183 0 4.69 -109 174 4.115 4.69 -169 160 3.575 4.69 -176 184 3.37 4.69 -204 223 2.86 4.69 -8 151 4.165 4.695 -23 27 3.77 4.695 -56 76 3.895 4.695 -59 7 1.51 4.695 -83 143 4.06 4.695 -90 92 3.08 4.695 -91 107 3.855 4.695 -91 174 3.965 4.695 -110 237 2.815 4.695 -127 241 3.265 4.695 -153 218 0 4.695 -206 78 3.93 4.695 -212 66 1.76 4.695 -83 210 3.93 4.7 -106 169 3.55 4.7 -109 77 3.27 4.7 -112 237 4.145 4.7 -142 143 0 4.7 -153 198 4.19 4.7 -222 208 1.81 4.7 -236 13 4.165 4.7 -22 26 0 4.705 -114 162 3.79 4.705 -120 185 0 4.705 -139 131 4.2 4.705 -57 5 1.615 4.71 -66 76 3.09 4.71 -69 162 3.87 4.71 -86 59 3.58 4.71 -150 216 0.93 4.71 -163 46 3.79 4.71 -209 20 3.73 4.71 -6 90 3.975 4.715 -81 47 3.895 4.715 -153 186 0.35 4.715 -173 233 0.125 4.715 -33 81 0.795 4.72 -44 75 4.205 4.72 -82 225 4.15 4.72 -109 91 2.455 4.72 -114 117 0 4.72 -145 218 3.935 4.72 -158 175 0 4.72 -174 160 0 4.72 -197 14 3.325 4.72 -207 255 0 4.72 -17 18 2.545 4.725 -108 119 4.15 4.725 -108 139 1.61 4.725 -111 100 0 4.725 -115 162 0 4.725 -115 165 0 4.725 -133 226 3.925 4.725 -151 163 1.655 4.725 -208 19 1.075 4.725 -211 230 3.4 4.725 -238 172 4.075 4.725 -7 126 4.225 4.73 -8 18 3.14 4.73 -9 118 3.345 4.73 -83 225 3.02 4.73 -100 79 3.675 4.73 -110 176 4.16 4.73 -145 160 2.55 4.73 -158 193 3.895 4.73 -171 79 3.785 4.73 -205 206 0 4.73 -226 247 4.16 4.73 -256 43 3.74 4.73 -86 38 1.81 4.735 -109 95 0 4.735 -111 83 1.25 4.735 -139 197 0.12 4.735 -155 215 0 4.735 -158 225 2.705 4.735 -193 175 3.58 4.735 -254 47 3.6 4.735 -18 28 3.375 4.74 -27 92 3.38 4.74 -66 80 1.875 4.74 -83 98 0.61 4.74 -84 162 1.36 4.74 -101 183 4.13 4.74 -105 117 3.84 4.74 -106 100 3.54 4.74 -139 57 3.04 4.74 -155 206 0 4.74 -250 223 3.985 4.74 -73 186 3.085 4.745 -79 198 3.975 4.745 -85 134 3.565 4.745 -100 188 3.52 4.745 -110 169 2.305 4.745 -118 39 2.43 4.745 -156 233 0 4.745 -212 95 4.09 4.745 -228 30 0 4.745 -233 253 3.77 4.745 -241 132 3.91 4.745 -1 80 1.91 4.75 -43 97 3.685 4.75 -58 204 1.545 4.75 -67 206 3.43 4.75 -84 104 3.01 4.75 -121 127 4.24 4.75 -125 52 0 4.75 -158 196 3.225 4.75 -162 133 3.86 4.75 -205 78 3.94 4.75 -236 118 3.525 4.75 -141 250 4.08 4.755 -166 162 0 4.755 -229 247 0 4.755 -232 62 2.28 4.755 -107 218 2.68 4.76 -139 50 0.945 4.76 -158 206 2.63 4.76 -181 226 3.305 4.76 -254 63 3.345 4.76 -24 87 3.825 4.765 -54 102 2.82 4.765 -65 77 0 4.765 -82 151 3.61 4.765 -108 165 0 4.765 -192 241 3.315 4.765 -196 15 3.85 4.765 -45 41 2.05 4.77 -59 6 3.58 4.77 -144 22 4.11 4.77 -81 35 0 4.775 -102 126 4.19 4.775 -182 213 1.36 4.775 -229 41 0 4.775 -7 10 1.59 4.78 -26 89 3.715 4.78 -39 119 4.145 4.78 -76 149 3.9 4.78 -170 135 4.19 4.78 -199 119 4.175 4.78 -59 73 0 4.785 -71 124 0 4.785 -94 98 0.505 4.785 -147 228 2.21 4.785 -152 227 0 4.785 -158 209 0 4.785 -181 188 0 4.785 -1 123 3.675 4.79 -40 185 3.945 4.79 -46 19 3.965 4.79 -53 120 0.475 4.79 -137 188 0 4.79 -174 235 2.11 4.79 -199 76 2.21 4.79 -205 14 1.565 4.79 -9 5 3.25 4.795 -12 124 0.555 4.795 -36 52 0 4.795 -143 175 3.255 4.795 -148 206 1.785 4.795 -150 210 2.42 4.795 -170 144 3.045 4.795 -200 215 0 4.795 -207 250 2.355 4.795 -48 44 3.97 4.8 -106 127 3.83 4.8 -130 209 3.73 4.8 -139 213 4.165 4.8 -167 22 3.54 4.8 -244 52 3.615 4.8 -47 111 0 4.805 -67 160 4.195 4.805 -70 24 0 4.805 -112 188 0.22 4.805 -116 20 3.955 4.805 -127 178 1 4.805 -132 179 1.84 4.805 -169 100 4.265 4.805 -171 233 0 4.805 -191 242 4.125 4.805 -210 227 0 4.805 -234 233 0 4.805 -245 254 0.785 4.805 -57 11 2.19 4.81 -127 187 0.95 4.81 -129 141 3.95 4.81 -156 22 4.13 4.81 -180 245 0.585 4.81 -210 21 2.905 4.81 -211 24 2.95 4.81 -18 24 0 4.815 -18 99 0.67 4.815 -49 41 3.44 4.815 -72 76 3.045 4.815 -111 95 0 4.815 -111 148 1.91 4.815 -139 22 4.16 4.815 -173 100 2.735 4.815 -181 129 1.175 4.815 -192 141 3.985 4.815 -194 215 0 4.815 -249 246 0 4.815 -251 84 4.16 4.815 -55 103 4.26 4.82 -58 14 1.535 4.82 -60 102 3.23 4.82 -62 34 3.955 4.82 -80 160 4.26 4.82 -159 203 2.52 4.82 -168 49 2.85 4.82 -189 62 2.25 4.82 -21 10 3.73 4.825 -51 119 2.84 4.825 -150 233 0 4.825 -173 110 1.14 4.825 -181 168 0 4.825 -61 15 4.16 4.83 -106 102 0 4.83 -120 40 0.21 4.83 -134 213 0 4.83 -157 206 3.845 4.83 -174 224 2.955 4.83 -204 93 1.91 4.83 -218 22 3.44 4.83 -226 62 4.295 4.83 -245 195 3.615 4.83 -82 162 3.195 4.835 -88 108 3.99 4.835 -126 137 4.225 4.835 -127 181 3.905 4.835 -138 80 0 4.835 -169 165 0 4.835 -206 175 2.7 4.835 -219 93 1.01 4.835 -249 100 3.975 4.835 -7 28 1.4 4.84 -16 19 3.725 4.84 -88 172 3.16 4.84 -112 119 0.265 4.84 -166 169 0 4.84 -168 185 4.325 4.84 -233 239 2.875 4.84 -234 201 1.49 4.84 -238 248 4.145 4.84 -239 47 0 4.84 -29 70 3.145 4.845 -97 162 1.965 4.845 -101 107 3.825 4.845 -109 110 0 4.845 -155 217 0 4.845 -170 100 2.515 4.845 -171 207 3.77 4.845 -171 61 3.415 4.845 -178 213 4.315 4.845 -194 28 4.055 4.845 -222 235 0 4.845 -222 253 2.27 4.845 -223 81 1.79 4.845 -23 230 3.865 4.85 -60 39 3.4 4.85 -75 96 1.96 4.85 -146 172 2.87 4.85 -165 184 2.735 4.85 -211 41 2.6 4.85 -219 32 3.605 4.85 -254 30 3.8 4.85 -11 138 0.505 4.855 -25 91 3.995 4.855 -29 86 2.045 4.855 -73 91 0 4.855 -101 172 3.855 4.855 -238 62 0 4.855 -45 10 1.975 4.86 -69 183 3.925 4.86 -100 61 2.87 4.86 -108 117 0 4.86 -118 153 4.355 4.86 -126 80 0 4.86 -136 194 0 4.86 -151 194 4.31 4.86 -167 218 0 4.86 -168 133 4.03 4.86 -171 184 3.25 4.86 -171 230 4.22 4.86 -182 243 4.34 4.86 -201 118 3.5 4.86 -226 246 3.845 4.86 -31 154 3.25 4.865 -54 39 0.135 4.865 -88 104 0 4.865 -145 237 2.845 4.865 -183 246 0 4.865 -188 186 3.51 4.865 -215 197 0 4.865 -24 107 4.29 4.87 -36 84 3.67 4.87 -55 104 0 4.87 -57 39 0 4.87 -59 120 3.175 4.87 -147 200 3.11 4.87 -214 235 2.87 4.87 -218 235 0 4.87 -240 184 3.625 4.87 -241 143 3.885 4.87 -249 185 4.3 4.87 -8 21 0 4.875 -126 202 4.26 4.875 -132 194 0 4.875 -170 79 2.44 4.875 -176 13 3.04 4.875 -207 206 3.58 4.875 -209 17 0 4.875 -235 30 4.37 4.875 -23 45 4.205 4.88 -25 126 3.905 4.88 -30 44 4.215 4.88 -50 223 4.29 4.88 -77 192 4.285 4.88 -159 93 2.555 4.88 -173 224 0.2 4.88 -211 231 3.175 4.88 -230 21 3.405 4.88 -244 34 3.625 4.88 -17 85 2.995 4.885 -33 34 4.04 4.885 -34 162 3.765 4.885 -60 75 3.335 4.885 -82 98 0 4.885 -88 34 4.29 4.885 -94 99 0 4.885 -109 44 3.955 4.885 -136 179 0.585 4.885 -147 229 2.395 4.885 -168 243 4.37 4.885 -254 13 0 4.885 -4 212 1.175 4.89 -7 153 2.405 4.89 -48 228 2.195 4.89 -58 59 0 4.89 -74 86 2.53 4.89 -101 177 2.325 4.89 -140 217 0 4.89 -146 189 4.1 4.89 -167 171 4.38 4.89 -174 222 0.285 4.89 -191 62 3.695 4.89 -221 61 4.325 4.89 -222 93 4.12 4.89 -57 122 3.01 4.895 -94 97 0 4.895 -165 249 1.915 4.895 -207 13 0 4.895 -227 235 3.395 4.895 -5 76 3.39 4.9 -51 8 2.39 4.9 -92 155 3.15 4.9 -110 162 4.275 4.9 -167 227 1.835 4.9 -188 201 4.115 4.9 -206 196 0 4.9 -244 116 3.72 4.9 -140 206 2.975 4.905 -143 222 4.35 4.905 -222 206 2.605 4.905 -228 47 0 4.905 -229 235 3.88 4.905 -237 184 3.535 4.905 -246 5 0.57 4.905 -13 50 3.81 4.91 -13 56 4.33 4.91 -18 101 4.3 4.91 -21 27 2.605 4.91 -45 93 4.01 4.91 -63 84 2.84 4.91 -69 135 3.205 4.91 -129 13 4.155 4.91 -130 143 1.385 4.91 -130 179 3.88 4.91 -151 179 4.29 4.91 -156 140 0 4.91 -161 175 0 4.91 -194 208 4.365 4.91 -203 93 1.885 4.91 -204 23 3.775 4.91 -236 1 4.17 4.91 -239 42 4.235 4.91 -242 62 3.81 4.91 -46 47 0 4.915 -59 115 3.875 4.915 -98 238 3.16 4.915 -106 99 3.98 4.915 -112 249 4.105 4.915 -116 72 3.665 4.915 -132 151 4.15 4.915 -140 135 0 4.915 -171 205 3.58 4.915 -188 135 0 4.915 -208 16 0 4.915 -215 222 3.91 4.915 -25 153 3.815 4.92 -50 2 0 4.92 -57 201 0.2 4.92 -68 125 4.42 4.92 -140 201 0 4.92 -188 144 0 4.92 -206 45 4.405 4.92 -226 255 1.235 4.92 -227 248 4.38 4.92 -234 251 4.25 4.92 -6 121 4.4 4.925 -119 188 0 4.925 -144 159 2.29 4.925 -146 241 1.65 4.925 -192 67 1.645 4.925 -214 194 3.37 4.925 -217 194 1.425 4.925 -239 61 0 4.925 -239 27 3.74 4.925 -51 118 0 4.93 -69 241 3.635 4.93 -70 76 0 4.93 -88 99 0 4.93 -91 140 0 4.93 -94 161 4.405 4.93 -128 100 1.505 4.93 -194 220 3.73 4.93 -222 45 0 4.93 -253 60 3.27 4.93 -9 23 0 4.935 -14 6 2.565 4.935 -14 11 0 4.935 -43 60 3.405 4.935 -58 54 4.09 4.935 -130 148 1.54 4.935 -164 221 2.92 4.935 -170 127 0 4.935 -187 67 3.735 4.935 -206 212 3.485 4.935 -219 230 2 4.935 -15 93 0 4.94 -22 45 2.505 4.94 -30 99 2.495 4.94 -39 115 3.89 4.94 -67 148 3.19 4.94 -101 166 0 4.94 -103 104 0 4.94 -210 212 0 4.94 -215 23 0 4.94 -219 21 4.39 4.94 -223 2 0 4.94 -225 223 4.27 4.94 -235 29 0 4.94 -29 154 3.385 4.945 -54 166 1.9 4.945 -63 75 2.865 4.945 -69 245 3.995 4.945 -89 124 1.73 4.945 -132 2 4.37 4.945 -152 209 0 4.945 -162 67 4.245 4.945 -173 39 4.375 4.945 -201 14 2.23 4.945 -210 179 3.625 4.945 -232 255 1.52 4.945 -239 235 0 4.945 -29 107 4.33 4.95 -55 107 4.105 4.95 -59 123 0.755 4.95 -60 34 4.445 4.95 -113 162 0 4.95 -143 148 1.645 4.95 -150 249 3.065 4.95 -159 4 3.37 4.95 -211 219 4.385 4.95 -110 177 4.31 4.955 -119 186 4.445 4.955 -121 52 4.37 4.955 -126 91 2.36 4.955 -128 180 4.445 4.955 -163 248 4.365 4.955 -208 28 4.01 4.955 -219 154 4.44 4.955 -8 92 4.285 4.96 -46 125 2.485 4.96 -56 34 0 4.96 -67 144 3.715 4.96 -68 99 3.95 4.96 -98 241 2.59 4.96 -107 117 4.02 4.96 -115 137 2.06 4.96 -171 48 4.19 4.96 -208 90 3.91 4.96 -239 125 2.56 4.96 -243 246 0 4.96 -24 255 4.2 4.965 -40 112 3.32 4.965 -82 104 3 4.965 -96 187 3.665 4.965 -108 184 3.36 4.965 -128 170 0 4.965 -149 132 0.915 4.965 -164 241 4.225 4.965 -199 59 0.76 4.965 -217 200 4.075 4.965 -40 249 4.04 4.97 -140 204 0 4.97 -164 240 3.57 4.97 -171 252 2.74 4.97 -215 171 4.43 4.97 -232 35 4.04 4.97 -234 247 0 4.97 -237 26 4.425 4.97 -254 256 0 4.97 -25 70 0 4.975 -56 209 4.355 4.975 -83 132 1.02 4.975 -129 255 1.71 4.975 -132 152 0 4.975 -132 216 4.25 4.975 -140 179 3.14 4.975 -174 180 2.195 4.975 -205 1 3.865 4.975 -216 33 4.425 4.975 -226 205 3.99 4.975 -244 120 3.64 4.975 -62 1 4.08 4.98 -128 96 4.35 4.98 -143 147 2.82 4.98 -187 184 2.48 4.98 -199 25 2.225 4.98 -21 55 3.735 4.985 -59 119 0.655 4.985 -71 151 1.04 4.985 -123 135 3.86 4.985 -147 211 0 4.985 -163 227 4.325 4.985 -204 45 4.395 4.985 -209 22 4.435 4.985 -212 81 1.115 4.985 -213 195 4.455 4.985 -215 221 3.62 4.985 -7 121 1.435 4.99 -10 124 3.72 4.99 -31 27 0 4.99 -78 96 4.14 4.99 -87 146 4.045 4.99 -101 115 3.9 4.99 -174 176 0 4.99 -183 139 0 4.99 -192 252 4.145 4.99 -194 70 3.91 4.99 -209 194 3.675 4.99 -209 70 4.435 4.99 -210 220 4.37 4.99 -239 253 0 4.99 -23 208 4.21 4.995 -30 255 3.88 4.995 -31 28 2.215 4.995 -42 39 2.19 4.995 -65 134 4.395 4.995 -104 238 3.9 4.995 -138 188 3.86 4.995 -174 188 0.71 4.995 -203 16 4.45 4.995 -65 70 4.49 5 -80 161 4.445 5 -75 117 4.385 5 -190 162 3.75 5 -202 224 0 5 -164 180 0 5 -234 58 2.415 5 -196 51 4.145 5 -9 221 3.92 5 -221 45 0 5 +9 77 0 5 +31 91 0 5 +31 111 0 5 +66 94 0 5 +91 111 0 5 +126 142 0 5 +198 54 0 5 +1 81 0 6 +4 116 0 6 +7 67 0 6 +14 66 0 6 +59 119 0 6 +64 4 0 6 +84 112 0 6 +95 175 0 6 +97 117 0 6 +127 179 0 6 +128 76 0 6 +141 201 0 6 +144 148 0 6 +144 224 0 6 +220 32 0 6 +226 254 0 6 +244 4 0 6 +248 40 0 6 +6 26 0 7 +33 61 0 7 +35 103 0 7 +41 109 0 7 +55 71 0 7 +64 80 0 7 +99 127 0 7 +104 152 0 7 +122 182 0 7 +122 138 0 7 +135 147 0 7 +136 156 0 7 +150 170 0 7 +162 230 0 7 +178 226 0 7 +185 141 0 7 +192 252 0 7 +198 10 0 7 +204 8 0 7 +218 238 0 7 +218 22 0 7 +234 38 0 7 +236 28 0 7 +237 61 0 7 +245 193 0 7 +7 87 0 8 +13 65 0 8 +16 76 0 8 +30 82 0 8 +39 119 0 8 +49 117 0 8 +53 113 0 8 +53 69 0 8 +54 2 0 8 +66 142 0 8 +67 87 0 8 +78 138 0 8 +105 173 0 8 +107 119 0 8 +113 129 0 8 +122 70 0 8 +124 192 0 8 +135 247 0 8 +139 207 0 8 +158 210 0 8 +163 191 0 8 +165 233 0 8 +170 218 0 8 +173 233 0 8 +180 144 0 8 +183 251 0 8 +190 242 0 8 +205 209 0 8 +235 39 0 8 +247 203 0 8 +253 45 0 8 +254 194 0 8 +4 80 0 9 +31 43 0 9 +35 83 0 9 +38 58 0 9 +39 59 0 9 +40 120 0 9 +49 97 0 9 +51 99 0 9 +54 10 0 9 +58 118 0 9 +60 16 0 9 +60 128 0 9 +60 76 0 9 +62 10 0 9 +64 116 0 9 +67 179 0 9 +82 110 0 9 +100 120 0 9 +103 115 0 9 +111 159 0 9 +124 172 0 9 +125 141 0 9 +126 66 0 9 +135 195 0 9 +142 194 0 9 +144 196 0 9 +145 225 0 9 +146 222 0 9 +147 195 0 9 +159 163 0 9 +165 213 0 9 +171 239 0 9 +172 184 0 9 +175 223 0 9 +188 204 0 9 +195 215 0 9 +199 219 0 9 +203 215 0 9 +214 26 0 9 +221 233 0 9 +229 21 0 9 +231 35 0 9 +237 33 0 9 +240 32 0 9 +243 63 0 9 +244 200 0 9 +250 198 0 9 +1 113 0 10 +2 114 0 10 +3 23 0 10 +6 118 0 10 +7 19 0 10 +9 69 0 10 +11 23 0 10 +15 27 0 10 +15 75 0 10 +29 77 0 10 +33 109 0 10 +43 111 0 10 +56 72 0 10 +83 159 0 10 +85 153 0 10 +86 134 0 10 +87 147 0 10 +88 108 0 10 +104 172 0 10 +136 216 0 10 +139 219 0 10 +149 169 0 10 +159 239 0 10 +160 240 0 10 +167 187 0 10 +169 217 0 10 +178 246 0 10 +180 196 0 10 +187 255 0 10 +189 241 0 10 +192 140 0 10 +212 32 0 10 +220 12 0 10 +221 25 0 10 +237 241 0 10 +241 61 0 10 +246 50 0 10 +249 197 0 10 +1 69 0 11 +12 72 0 11 +13 17 0 11 +13 125 0 11 +14 126 0 11 +25 37 0 11 +27 107 0 11 +34 102 0 11 +36 112 0 11 +48 52 0 11 +52 68 0 11 +55 3 0 11 +70 182 0 11 +85 133 0 11 +88 100 0 11 +108 120 0 11 +108 168 0 11 +110 158 0 11 +152 164 0 11 +158 238 0 11 +164 232 0 11 +171 219 0 11 +177 193 0 11 +178 194 0 11 +185 201 0 11 +189 137 0 11 +190 250 0 11 +200 24 0 11 +211 231 0 11 +235 47 0 11 +252 208 0 11 +5 25 0 12 +6 86 0 12 +21 81 0 12 +29 89 0 12 +34 82 0 12 +46 106 0 12 +50 118 0 12 +79 131 0 12 +82 158 0 12 +89 157 0 12 +94 146 0 12 +102 162 0 12 +118 186 0 12 +125 65 0 12 +135 215 0 12 +137 249 0 12 +140 252 0 12 +148 196 0 12 +151 219 0 12 +168 236 0 12 +172 252 0 12 +174 186 0 12 +175 187 0 12 +179 143 0 12 +184 140 0 12 +187 247 0 12 +201 221 0 12 +204 16 0 12 +216 236 0 12 +234 58 0 12 +241 205 0 12 +247 59 0 12 +11 31 0 13 +12 92 0 13 +23 35 0 13 +29 41 0 13 +30 90 0 13 +56 12 0 13 +77 89 0 13 +93 173 0 13 +101 121 0 13 +106 154 0 13 +127 143 0 13 +130 158 0 13 +131 207 0 13 +136 204 0 13 +142 146 0 13 +150 162 0 13 +153 213 0 13 +154 222 0 13 +161 181 0 13 +163 211 0 13 +163 239 0 13 +166 178 0 13 +166 186 0 13 +171 183 0 13 +173 253 0 13 +177 245 0 13 +180 256 0 13 +191 243 0 13 +192 208 0 13 +196 224 0 13 +200 212 0 13 +210 238 0 13 +219 11 0 13 +228 20 0 13 +233 253 0 13 +245 49 0 13 +245 5 0 13 +248 8 0 13 +253 201 0 13 +14 18 0 14 +14 74 0 14 +30 78 0 14 +55 115 0 14 +63 111 0 14 +78 90 0 14 +120 168 0 14 +126 74 0 14 +132 200 0 14 +155 175 0 14 +170 230 0 14 +173 185 0 14 +177 133 0 14 +195 19 0 14 +199 23 0 14 +202 26 0 14 +204 60 0 14 +216 28 0 14 +217 229 0 14 +220 240 0 14 +223 235 0 14 +249 9 0 14 +10 122 0 15 +14 94 0 15 +21 101 0 15 +39 107 0 15 +50 98 0 15 +60 8 0 15 +73 141 0 15 +73 153 0 15 +74 142 0 15 +87 135 0 15 +89 109 0 15 +91 159 0 15 +93 153 0 15 +119 167 0 15 +121 137 0 15 +132 212 0 15 +148 224 0 15 +157 169 0 15 +190 138 0 15 +208 220 0 15 +219 239 0 15 +235 27 0 15 +1 77 0 16 +34 114 0 16 +36 84 0 16 +42 62 0 16 +68 144 0 16 +96 108 0 16 +96 176 0 16 +113 69 0 16 +121 181 0 16 +124 140 0 16 +145 221 0 16 +155 223 0 16 +162 242 0 16 +163 243 0 16 +193 13 0 16 +198 22 0 16 +233 45 0 16 +237 41 0 16 +246 38 0 16 +10 22 0 17 +17 65 0 17 +19 67 0 17 +73 185 0 17 +75 143 0 17 +99 179 0 17 +101 114 13 17 +106 174 0 17 +112 160 0 17 +136 196 0 17 +156 216 0 17 +193 17 0 17 +203 59 0 17 +213 233 0 17 +10 70 0 18 +18 94 0 18 +41 89 0 18 +42 90 0 18 +44 119 0 18 +72 92 0 18 +88 229 15 18 +100 170 12 18 +103 229 15 18 +111 123 0 18 +132 208 0 18 +136 148 0 18 +147 215 0 18 +188 256 0 18 +189 249 0 18 +200 4 0 18 +212 24 0 18 +220 24 0 18 +247 195 0 18 +251 11 0 18 +31 83 0 19 +57 117 0 19 +68 148 0 19 +93 145 0 19 +95 107 0 19 +99 229 8 19 +105 117 0 19 +122 76 0 19 +125 73 0 19 +151 199 0 19 +151 21 13 19 +172 192 0 19 +174 165 11 19 +175 192 13 19 +181 137 0 19 +188 190 14 19 +201 57 0 19 +205 29 0 19 +214 234 0 19 +220 57 16 19 +224 231 11 19 +224 94 14 19 +233 37 0 19 +250 62 0 19 +9 121 0 20 +14 45 18 20 +34 19 12 20 +45 57 0 20 +61 77 0 20 +81 157 0 20 +82 102 0 20 +111 238 15 20 +126 111 15 20 +165 175 11 20 +228 48 0 20 +235 28 0 20 +240 252 0 20 +248 213 18 20 +251 199 0 20 +16 141 15 21 +18 66 0 21 +35 114 15 21 +44 92 0 21 +44 104 0 21 +46 94 0 21 +61 109 0 21 +89 169 0 21 +105 45 0 21 +143 136 11 21 +174 254 0 21 +191 206 14 21 +191 207 0 21 +196 20 0 21 +209 31 17 21 +224 20 0 21 +225 45 0 21 +236 40 0 21 +253 57 0 21 +8 84 20 22 +9 59 0 22 +35 88 0 22 +38 7 13 22 +56 4 0 22 +56 116 0 22 +68 193 18 22 +85 165 0 22 +102 150 0 22 +111 128 12 22 +124 80 0 22 +129 209 0 22 +131 1 18 22 +133 153 0 22 +151 171 0 22 +159 171 0 22 +170 164 11 22 +192 201 0 22 +195 51 0 22 +206 210 0 22 +217 22 0 22 +218 230 0 22 +256 60 0 22 +12 80 0 23 +15 74 0 23 +29 2 14 23 +37 117 0 23 +49 13 0 23 +50 66 0 23 +53 9 0 23 +54 70 0 23 +63 115 0 23 +95 148 0 23 +99 119 0 23 +110 114 0 23 +133 213 0 23 +188 191 9 23 +202 27 10 23 +211 239 0 23 +226 35 8 23 +227 51 0 23 +246 194 0 23 +256 204 0 23 +6 66 0 24 +18 84 11 24 +21 27 12 24 +29 109 0 24 +49 125 0 24 +50 126 0 24 +51 66 12 24 +68 180 0 24 +79 139 0 24 +80 67 14 24 +81 109 0 24 +89 149 0 24 +95 155 0 24 +105 76 17 24 +126 4 0 24 +138 250 0 24 +140 142 9 24 +144 209 0 24 +160 164 0 24 +226 36 11 24 +232 244 0 24 +235 22 0 24 +239 43 0 24 +247 51 0 24 +249 214 14 24 +5 57 0 25 +17 84 9 25 +26 38 0 25 +52 120 0 25 +52 118 12 25 +56 71 0 25 +96 148 0 25 +99 92 9 25 +111 165 7 25 +140 159 12 25 +141 153 0 25 +145 165 0 25 +146 174 0 25 +158 170 0 25 +158 162 0 25 +170 139 11 25 +176 188 0 25 +208 4 0 25 +222 226 0 25 +228 40 0 25 +243 3 0 25 +248 211 19 25 +7 119 0 26 +8 39 16 26 +13 4 0 26 +46 18 0 26 +63 79 0 26 +69 145 20 26 +91 79 0 26 +104 133 22 26 +123 173 0 26 +147 221 13 26 +157 209 0 26 +174 222 0 26 +180 194 0 26 +183 199 0 26 +188 236 0 26 +189 237 0 26 +193 49 0 26 +203 27 0 26 +204 54 0 26 +208 45 17 26 +211 85 15 26 +220 251 16 26 +231 43 0 26 +234 26 0 26 +242 230 0 26 +15 80 0 27 +24 72 0 27 +42 22 0 27 +49 65 0 27 +50 21 21 27 +59 7 0 27 +59 15 0 27 +69 135 12 27 +85 40 16 27 +88 148 0 27 +89 101 0 27 +101 149 0 27 +102 114 0 27 +116 119 11 27 +151 6 9 27 +168 34 19 27 +170 177 13 27 +171 231 0 27 +180 207 0 27 +182 230 0 27 +183 134 10 27 +206 197 15 27 +212 4 0 27 +222 213 9 27 +241 52 14 27 +242 6 24 27 +248 204 0 27 +248 51 0 27 +249 181 0 27 +255 47 0 27 +9 122 0 28 +32 158 11 28 +32 84 0 28 +43 97 20 28 +44 56 0 28 +44 124 0 28 +55 120 0 28 +60 120 0 28 +67 82 9 28 +67 84 7 28 +67 135 0 28 +68 71 13 28 +75 155 0 28 +80 84 0 28 +82 92 15 28 +85 65 0 28 +94 98 0 28 +106 173 0 28 +106 186 0 28 +107 175 0 28 +110 190 0 28 +130 210 0 28 +138 206 0 28 +138 204 8 28 +181 136 13 28 +184 53 11 28 +188 199 0 28 +197 53 0 28 +203 1 20 28 +239 31 0 28 +242 213 12 28 +8 76 0 29 +9 61 0 29 +24 36 0 29 +25 45 0 29 +36 82 0 29 +45 96 22 29 +46 37 9 29 +49 196 15 29 +59 189 14 29 +83 111 0 29 +99 175 0 29 +105 99 13 29 +110 162 0 29 +112 164 0 29 +115 66 7 29 +117 123 14 29 +124 141 0 29 +131 152 21 29 +142 218 20 29 +169 229 0 29 +172 42 15 29 +180 142 0 29 +202 214 0 29 +206 250 0 29 +227 244 8 29 +22 90 0 30 +28 153 16 30 +31 35 0 30 +34 97 0 30 +44 117 0 30 +78 91 0 30 +110 170 0 30 +115 72 11 30 +133 138 11 30 +138 203 10 30 +142 153 9 30 +146 159 0 30 +154 214 0 30 +158 164 0 30 +170 238 0 30 +183 186 0 30 +183 136 10 30 +193 210 17 30 +213 226 11 30 +224 16 0 30 +225 221 0 30 +236 121 16 30 +63 78 9 31 +96 106 0 31 +115 71 0 31 +116 184 0 31 +122 71 0 31 +186 201 0 31 +226 233 9 31 +243 35 0 31 +7 76 0 32 +8 28 0 32 +11 25 0 32 +36 104 0 32 +37 104 12 32 +38 118 0 32 +39 70 21 32 +74 105 20 32 +94 106 0 32 +105 70 13 32 +111 116 7 32 +111 190 8 32 +111 225 11 32 +118 183 9 32 +127 175 0 32 +129 157 0 32 +139 191 0 32 +167 41 13 32 +180 136 0 32 +195 7 0 32 +200 202 8 32 +203 25 0 32 +212 215 27 32 +219 74 13 32 +231 251 0 32 +236 203 14 32 +245 187 12 32 +14 26 0 33 +16 25 0 33 +16 28 0 33 +31 79 0 33 +41 90 0 33 +69 82 12 33 +78 178 29 33 +96 100 0 33 +108 176 0 33 +113 164 18 33 +114 162 0 33 +114 180 9 33 +151 148 22 33 +164 222 0 33 +169 181 0 33 +197 210 10 33 +203 196 19 33 +205 1 0 33 +209 226 9 33 +217 29 0 33 +249 53 0 33 +249 44 16 33 +251 43 0 33 +255 51 0 33 +1 61 0 34 +3 98 21 34 +9 55 0 34 +9 28 23 34 +10 45 10 34 +32 36 0 34 +70 136 20 34 +88 154 17 34 +111 101 17 34 +113 84 27 34 +125 173 0 34 +125 185 0 34 +128 115 8 34 +137 203 16 34 +145 144 0 34 +148 167 10 34 +158 156 9 34 +162 182 0 34 +172 41 15 34 +174 228 19 34 +177 119 11 34 +203 15 0 34 +204 11 0 34 +208 93 10 34 +209 29 0 34 +211 35 0 34 +223 93 10 34 +249 243 15 34 +250 10 0 34 +1 81 30 35 +27 39 0 35 +28 169 15 35 +44 118 0 35 +51 7 0 35 +52 128 0 35 +53 121 0 35 +76 141 0 35 +84 164 0 35 +98 69 24 35 +100 148 0 35 +128 178 7 35 +128 176 0 35 +134 154 0 35 +143 222 13 35 +154 202 0 35 +157 148 0 35 +159 225 0 35 +217 159 8 35 +217 199 0 35 +224 93 12 35 +250 64 10 35 +251 201 0 35 +251 38 0 35 +251 55 0 35 +4 32 0 36 +9 56 0 36 +44 64 0 36 +54 122 0 36 +67 242 30 36 +87 130 0 36 +90 97 19 36 +118 135 11 36 +145 213 0 36 +149 215 20 36 +154 235 17 36 +185 133 0 36 +187 201 0 36 +197 214 26 36 +199 13 22 36 +207 243 0 36 +218 203 24 36 +234 231 0 36 +240 227 15 36 +3 71 0 37 +16 47 12 37 +17 95 11 37 +23 40 12 37 +48 96 0 37 +54 61 12 37 +69 136 8 37 +79 254 31 37 +81 129 0 37 +117 168 24 37 +119 187 0 37 +119 134 11 37 +120 132 29 37 +141 221 0 37 +178 83 28 37 +200 220 0 37 +236 199 13 37 +241 230 29 37 +242 252 10 37 +249 226 16 37 +253 64 10 37 +1 10 32 38 +5 85 0 38 +26 96 17 38 +46 1 11 38 +47 107 0 38 +62 31 22 38 +74 134 0 38 +105 82 11 38 +106 75 11 38 +125 191 27 38 +126 178 0 38 +143 14 14 38 +158 112 0 38 +158 225 0 38 +167 225 9 38 +170 75 13 38 +172 240 0 38 +205 218 15 38 +209 224 0 38 +242 211 15 38 +243 55 0 38 +246 195 0 38 +248 3 0 38 +11 31 34 39 +13 25 0 39 +26 107 24 39 +46 226 0 39 +63 123 0 39 +68 99 14 39 +78 132 21 39 +101 169 0 39 +104 106 31 39 +115 130 12 39 +128 67 10 39 +136 138 20 39 +143 1 12 39 +144 237 36 39 +148 179 14 39 +178 149 30 39 +187 247 23 39 +189 250 0 39 +207 17 0 39 +230 55 10 39 +235 38 0 39 +240 203 12 39 +244 51 0 39 +248 21 11 39 +12 24 0 40 +28 40 0 40 +47 106 0 40 +50 211 11 40 +54 124 8 40 +93 65 0 40 +93 76 0 40 +109 128 24 40 +112 175 0 40 +113 191 26 40 +131 199 0 40 +134 204 14 40 +144 13 33 40 +149 200 15 40 +150 231 13 40 +162 228 17 40 +176 244 24 40 +179 210 30 40 +228 247 11 40 +234 45 0 40 +19 40 9 41 +33 39 9 41 +38 104 13 41 +47 59 0 41 +48 100 0 41 +61 55 9 41 +76 152 24 41 +77 81 0 41 +83 148 0 41 +84 177 28 41 +104 69 10 41 +109 160 22 41 +118 166 0 41 +128 180 0 41 +164 143 35 41 +172 232 0 41 +188 247 0 41 +190 206 0 41 +213 19 14 41 +215 235 0 41 +220 39 0 41 +220 43 0 41 +223 27 0 41 +228 195 20 41 +242 52 24 41 +251 244 15 41 +4 97 9 42 +5 204 0 42 +7 120 0 42 +23 71 0 42 +39 56 26 42 +46 98 0 42 +56 124 0 42 +59 36 19 42 +68 136 0 42 +73 28 11 42 +95 99 0 42 +95 146 0 42 +113 120 0 42 +130 150 0 42 +161 179 0 42 +166 135 18 42 +180 206 0 42 +192 157 33 42 +203 244 15 42 +205 217 0 42 +242 56 18 42 +246 6 0 42 +20 48 0 43 +50 69 0 43 +66 99 28 43 +75 205 28 43 +79 205 26 43 +88 140 24 43 +91 217 13 43 +92 158 20 43 +93 25 0 43 +114 124 10 43 +114 81 30 43 +116 72 0 43 +133 245 0 43 +145 206 0 43 +152 245 29 43 +154 185 33 43 +160 238 0 43 +169 124 18 43 +178 145 9 43 +183 231 0 43 +201 218 13 43 +241 212 19 43 +3 129 30 44 +16 20 0 44 +24 92 0 44 +33 243 0 44 +42 102 0 44 +46 15 14 44 +57 124 28 44 +63 3 0 44 +68 70 14 44 +72 193 39 44 +95 147 0 44 +110 123 0 44 +116 132 0 44 +135 192 34 44 +160 172 0 44 +174 226 0 44 +175 179 0 44 +190 120 35 44 +238 143 33 44 +247 22 14 44 +256 201 0 44 +2 68 16 45 +5 17 0 45 +9 8 0 45 +29 81 0 45 +49 48 0 45 +61 47 0 45 +64 112 0 45 +66 136 8 45 +91 139 0 45 +99 87 0 45 +100 128 0 45 +110 173 0 45 +113 129 30 45 +121 109 0 45 +134 157 23 45 +134 167 29 45 +153 204 21 45 +155 172 10 45 +160 225 0 45 +161 241 0 45 +165 184 27 45 +167 235 0 45 +175 168 9 45 +216 247 14 45 +238 63 31 45 +238 36 16 45 +246 204 0 45 +7 122 0 46 +50 55 0 46 +65 132 9 46 +66 147 29 46 +72 188 39 46 +73 93 0 46 +77 143 34 46 +78 157 0 46 +96 175 0 46 +119 245 8 46 +127 75 0 46 +130 206 0 46 +132 151 25 46 +139 142 0 46 +141 250 0 46 +167 247 0 46 +186 134 0 46 +188 230 0 46 +203 223 0 46 +214 171 0 46 +234 254 0 46 +240 207 11 46 +241 33 0 46 +256 50 10 46 +256 195 10 46 +3 178 12 47 +3 82 43 47 +13 7 15 47 +13 73 0 47 +20 96 0 47 +23 38 28 47 +46 58 0 47 +48 128 0 47 +50 6 0 47 +65 181 37 47 +67 147 0 47 +72 194 23 47 +74 26 0 47 +111 147 22 47 +125 79 0 47 +144 256 0 47 +146 156 31 47 +153 201 0 47 +158 153 8 47 +183 201 0 47 +188 136 0 47 +189 139 0 47 +208 195 16 47 +211 29 17 47 +213 41 38 47 +214 247 18 47 +216 40 0 47 +231 228 30 47 +237 202 13 47 +248 55 0 47 +255 110 12 47 +7 27 0 48 +44 123 0 48 +46 127 29 48 +65 131 35 48 +68 97 16 48 +68 161 17 48 +74 85 14 48 +75 143 28 48 +80 202 38 48 +86 154 0 48 +88 133 30 48 +103 123 0 48 +116 133 0 48 +126 109 11 48 +131 211 0 48 +145 222 0 48 +150 215 11 48 +165 120 36 48 +165 170 36 48 +186 203 9 48 +193 256 0 48 +238 250 0 48 +9 118 0 49 +16 26 0 49 +28 94 8 49 +42 54 0 49 +43 123 0 49 +53 18 28 49 +64 124 0 49 +74 86 0 49 +76 146 32 49 +77 67 7 49 +100 119 37 49 +116 179 0 49 +126 98 0 49 +138 201 0 49 +154 220 19 49 +163 156 28 49 +165 178 37 49 +210 220 10 49 +216 245 24 49 +216 236 30 49 +228 56 34 49 +234 164 14 49 +240 64 0 49 +242 201 8 49 +37 57 0 50 +79 133 40 50 +80 205 15 50 +93 48 28 50 +113 161 0 50 +125 98 39 50 +131 201 10 50 +134 215 17 50 +137 150 13 50 +153 221 0 50 +164 49 38 50 +185 236 39 50 +189 65 35 50 +196 10 21 50 +215 221 44 50 +216 101 39 50 +240 43 0 50 +246 5 0 50 +22 87 9 51 +34 5 29 51 +36 111 0 51 +48 123 0 51 +50 206 25 51 +58 15 0 51 +65 180 12 51 +66 131 26 51 +69 131 17 51 +71 150 16 51 +74 154 0 51 +80 173 27 51 +96 237 28 51 +98 65 26 51 +108 173 0 51 +120 246 25 51 +127 67 0 51 +147 226 11 51 +153 237 20 51 +165 182 15 51 +168 216 0 51 +177 165 0 51 +190 234 45 51 +197 152 11 51 +216 233 0 51 +226 18 0 51 +237 209 0 51 +239 244 6 51 +249 199 0 51 +1 29 0 52 +3 77 10 52 +4 116 33 52 +5 215 0 52 +9 70 0 52 +17 101 35 52 +28 154 17 52 +50 113 0 52 +62 10 30 52 +65 133 0 52 +72 181 14 52 +78 72 37 52 +88 100 47 52 +146 194 0 52 +152 175 37 52 +184 132 0 52 +198 167 8 52 +207 211 0 52 +213 232 16 52 +227 255 0 52 +242 198 0 52 +2 82 0 53 +9 220 30 53 +11 29 0 53 +47 112 0 53 +50 65 0 53 +65 118 27 53 +70 81 19 53 +87 136 0 53 +100 65 29 53 +115 241 31 53 +140 194 31 53 +144 253 14 53 +156 183 42 53 +158 218 0 53 +168 34 45 53 +174 179 0 53 +196 33 39 53 +198 229 41 53 +199 202 0 53 +208 32 0 53 +216 28 31 53 +241 247 12 53 +256 196 0 53 +6 13 31 54 +17 85 0 54 +22 70 0 54 +67 82 41 54 +80 107 38 54 +109 177 32 54 +113 94 11 54 +136 204 31 54 +138 107 37 54 +140 167 18 54 +142 222 0 54 +148 191 40 54 +181 130 13 54 +188 248 0 54 +211 3 0 54 +214 38 0 54 +225 213 0 54 +229 175 19 54 +242 54 0 54 +247 49 31 54 +16 90 0 55 +41 240 0 55 +50 63 0 55 +89 82 8 55 +96 170 0 55 +128 139 0 55 +131 151 0 55 +148 232 34 55 +153 173 0 55 +174 129 29 55 +181 135 0 55 +233 22 0 55 +234 139 45 55 +247 121 35 55 +2 70 0 56 +3 130 31 56 +58 254 0 56 +73 133 0 56 +91 173 0 56 +114 180 45 56 +117 129 46 56 +117 184 18 56 +122 119 0 56 +145 175 0 56 +178 135 0 56 +179 130 40 56 +181 248 25 56 +215 224 39 56 +215 27 0 56 +235 63 43 56 +237 208 15 56 +239 256 24 56 +252 10 0 56 +2 25 34 57 +20 51 41 57 +23 44 24 57 +33 99 42 57 +36 94 0 57 +38 43 0 57 +39 169 54 57 +40 88 0 57 +70 90 0 57 +99 109 39 57 +102 109 18 57 +168 188 0 57 +186 174 22 57 +189 162 15 57 +190 139 0 57 +193 198 15 57 +207 219 0 57 +210 243 55 57 +233 252 20 57 +30 37 37 58 +37 99 19 58 +60 126 23 58 +69 181 0 58 +73 114 28 58 +111 191 0 58 +125 124 0 58 +146 169 57 58 +164 34 34 58 +170 182 0 58 +187 230 0 58 +201 220 25 58 +222 18 0 58 +246 136 0 58 +30 81 0 59 +33 2 11 59 +36 64 0 59 +46 20 0 59 +66 132 12 59 +71 88 10 59 +76 103 13 59 +85 97 0 59 +89 101 38 59 +100 120 32 59 +119 135 0 59 +134 200 8 59 +138 221 0 59 +139 136 23 59 +139 159 0 59 +162 184 0 59 +177 184 0 59 +184 230 0 59 +191 235 57 59 +196 78 38 59 +231 54 30 59 +241 210 32 59 +242 34 0 59 +245 56 42 59 +3 95 26 60 +4 7 42 60 +21 101 38 60 +25 38 28 60 +46 254 0 60 +46 50 0 60 +48 60 0 60 +53 102 0 60 +55 69 0 60 +71 198 17 60 +79 72 25 60 +84 209 30 60 +90 155 20 60 +98 168 39 60 +104 180 28 60 +109 123 0 60 +114 83 35 60 +115 242 57 60 +121 126 10 60 +135 247 30 60 +142 194 33 60 +145 150 17 60 +150 220 11 60 +179 188 34 60 +188 198 0 60 +198 144 44 60 +214 201 22 60 +248 52 0 60 +253 63 17 60 +4 70 15 61 +11 95 43 61 +18 99 19 61 +42 64 0 61 +43 170 30 61 +49 47 0 61 +57 105 0 61 +67 84 40 61 +67 179 41 61 +79 84 44 61 +80 109 50 61 +100 179 0 61 +165 245 0 61 +179 34 11 61 +193 222 9 61 +246 200 0 61 +27 157 42 62 +37 56 7 62 +50 117 0 62 +58 125 0 62 +58 126 0 62 +64 123 0 62 +71 246 16 62 +80 84 37 62 +87 133 0 62 +126 174 0 62 +130 148 0 62 +132 208 40 62 +140 200 0 62 +150 170 41 62 +160 170 0 62 +173 172 0 62 +178 238 48 62 +195 212 49 62 +208 212 0 62 +210 245 23 62 +233 38 0 62 +236 60 0 62 +14 74 39 63 +22 88 62 63 +30 16 0 63 +52 100 0 63 +53 101 0 63 +80 139 0 63 +120 136 0 63 +144 201 0 63 +146 92 9 63 +187 202 30 63 +208 220 17 63 +44 110 24 64 +49 125 51 64 +61 9 35 64 +67 242 52 64 +72 198 10 64 +84 150 25 64 +107 155 0 64 +110 64 0 64 +116 95 31 64 +127 104 53 64 +145 162 43 64 +178 244 40 64 +182 201 0 64 +183 134 59 64 +205 219 0 64 +206 200 56 64 +219 240 47 64 +238 232 41 64 +240 44 0 64 +242 247 0 64 +245 5 42 64 +252 121 17 64 +252 64 0 64 +253 202 26 64 +254 64 49 64 +4 72 0 65 +26 94 0 65 +41 121 0 65 +67 193 11 65 +73 66 11 65 +75 135 0 65 +78 82 0 65 +81 98 47 65 +84 86 23 65 +97 163 33 65 +118 134 0 65 +127 117 43 65 +136 244 60 65 +140 6 26 65 +142 202 0 65 +142 221 0 65 +152 232 0 65 +164 254 0 65 +176 42 37 65 +181 190 25 65 +190 244 30 65 +214 212 14 65 +231 40 0 65 +233 61 33 65 +233 57 0 65 +240 58 0 65 +247 9 0 65 +251 9 0 65 +251 64 0 65 +20 161 29 66 +40 165 9 66 +42 60 0 66 +50 4 0 66 +58 14 0 66 +90 160 31 66 +94 112 0 66 +110 161 0 66 +111 115 0 66 +112 161 0 66 +113 181 0 66 +127 181 37 66 +128 68 0 66 +130 198 0 66 +139 207 34 66 +140 199 0 66 +147 195 44 66 +172 240 48 66 +181 197 0 66 +225 244 9 66 +226 236 43 66 +228 17 37 66 +230 54 0 66 +231 57 0 66 +239 62 11 66 +34 230 0 67 +46 57 48 67 +72 84 0 67 +79 159 0 67 +106 126 0 67 +117 66 7 67 +125 186 0 67 +138 133 57 67 +153 220 13 67 +159 244 56 67 +164 244 0 67 +180 182 7 67 +187 61 32 67 +195 216 55 67 +212 232 0 67 +248 196 0 67 +253 57 29 67 +255 48 0 67 +2 201 51 68 +18 88 62 68 +28 76 0 68 +48 100 63 68 +55 115 47 68 +63 189 55 68 +69 82 44 68 +77 192 17 68 +81 86 35 68 +92 104 0 68 +98 163 37 68 +121 74 27 68 +122 188 41 68 +129 182 48 68 +132 207 0 68 +138 218 0 68 +147 217 61 68 +174 181 28 68 +186 172 0 68 +211 25 40 68 +214 209 15 68 +226 249 53 68 +232 24 0 68 +233 44 7 68 +235 228 46 68 +239 232 22 68 +9 59 48 69 +15 127 0 69 +63 35 0 69 +80 132 0 69 +89 124 27 69 +89 83 17 69 +91 171 0 69 +106 111 0 69 +122 137 0 69 +143 250 0 69 +144 219 0 69 +159 195 30 69 +160 220 0 69 +171 192 61 69 +181 191 25 69 +189 178 23 69 +212 24 51 69 +215 7 0 69 +223 19 0 69 +238 50 33 69 +240 47 0 69 +255 33 0 69 +3 83 0 70 +5 73 0 70 +8 88 0 70 +29 96 59 70 +30 19 0 70 +37 105 0 70 +89 154 0 70 +120 83 15 70 +148 34 51 70 +153 215 22 70 +154 166 0 70 +157 175 0 70 +164 129 18 70 +178 136 0 70 +186 176 0 70 +216 8 0 70 +225 230 30 70 +226 54 44 70 +234 41 0 70 +247 5 0 70 +249 197 65 70 +4 145 14 71 +27 154 47 71 +49 117 36 71 +53 200 50 71 +58 106 0 71 +60 108 0 71 +67 143 0 71 +68 193 41 71 +79 193 23 71 +89 66 12 71 +93 110 39 71 +119 70 48 71 +120 197 22 71 +146 153 23 71 +151 209 13 71 +152 21 50 71 +162 242 53 71 +165 217 68 71 +173 253 48 71 +178 141 9 71 +178 132 0 71 +187 135 0 71 +190 206 55 71 +194 222 0 71 +217 194 54 71 +217 211 55 71 +222 216 51 71 +226 197 55 71 +231 55 0 71 +6 66 57 72 +19 39 0 72 +20 113 12 72 +31 24 59 72 +46 44 46 72 +47 51 0 72 +104 116 0 72 +116 66 0 72 +123 74 32 72 +133 200 10 72 +133 201 0 72 +142 155 0 72 +142 161 9 72 +158 162 51 72 +182 198 0 72 +183 241 14 72 +203 7 0 72 +214 18 0 72 +216 228 0 72 +232 244 42 72 +233 25 0 72 +239 20 0 72 +243 3 70 72 +245 49 26 72 +246 192 33 72 +246 202 0 72 +254 221 26 72 +39 165 18 73 +41 32 0 73 +42 121 0 73 +47 101 18 73 +53 236 0 73 +63 60 46 73 +64 27 46 73 +68 159 0 73 +69 88 48 73 +101 161 0 73 +107 161 47 73 +111 98 0 73 +116 143 0 73 +118 188 16 73 +140 220 0 73 +164 192 0 73 +181 129 0 73 +199 10 0 73 +214 194 0 73 +235 32 0 73 +250 62 46 73 +31 8 7 74 +36 104 43 74 +53 230 0 74 +61 121 0 74 +71 197 19 74 +76 184 65 74 +86 167 38 74 +120 242 22 74 +122 78 0 74 +122 185 0 74 +125 51 28 74 +127 129 0 74 +131 159 0 74 +133 152 41 74 +149 211 50 74 +157 161 0 74 +173 187 0 74 +209 215 24 74 +209 31 54 74 +211 34 56 74 +245 244 0 74 +247 7 0 74 +255 59 0 74 +13 65 58 75 +58 48 0 75 +108 120 55 75 +125 60 0 75 +138 149 70 75 +148 214 18 75 +148 241 14 75 +151 211 0 75 +199 196 66 75 +223 26 0 75 +227 19 0 75 +236 46 51 75 +239 63 0 75 +240 57 0 75 +243 33 50 75 +29 95 23 76 +32 59 27 76 +33 38 10 76 +37 85 0 76 +45 93 0 76 +83 153 35 76 +101 163 14 76 +129 197 0 76 +168 131 63 76 +168 228 0 76 +176 61 34 76 +178 192 9 76 +178 134 0 76 +228 38 21 76 +251 54 0 76 +253 129 57 76 +15 19 0 77 +26 110 20 77 +28 96 0 77 +41 252 29 77 +56 72 65 77 +60 123 0 77 +63 121 12 77 +66 134 0 77 +68 157 0 77 +89 107 0 77 +104 184 0 77 +108 71 63 77 +111 163 0 77 +113 101 0 77 +119 186 0 77 +137 201 0 77 +140 159 74 77 +149 215 73 77 +174 178 0 77 +183 201 68 77 +186 234 0 77 +189 143 0 77 +198 196 61 77 +198 209 13 77 +205 64 59 77 +224 110 51 77 +228 195 60 77 +239 26 0 77 +248 2 0 77 +248 3 54 77 +18 28 48 78 +23 92 0 78 +32 112 0 78 +48 102 21 78 +62 4 0 78 +70 80 66 78 +76 198 10 78 +93 87 38 78 +103 123 58 78 +120 149 15 78 +125 65 20 78 +132 200 43 78 +137 249 57 78 +149 193 25 78 +178 143 0 78 +180 248 0 78 +183 180 7 78 +187 241 68 78 +193 13 71 78 +205 157 0 78 +243 194 62 78 +250 59 33 78 +6 56 0 79 +64 31 32 79 +69 145 49 79 +80 188 63 79 +96 112 0 79 +110 189 0 79 +113 111 0 79 +124 91 34 79 +130 82 0 79 +132 134 40 79 +141 67 7 79 +169 220 42 79 +175 33 26 79 +182 149 34 79 +185 253 0 79 +190 179 0 79 +234 46 0 79 +236 106 35 79 +240 34 22 79 +243 200 16 79 +14 27 0 80 +14 95 27 80 +35 111 0 80 +35 127 43 80 +40 100 0 80 +53 44 0 80 +55 5 0 80 +56 4 34 80 +60 128 25 80 +61 47 62 80 +93 145 46 80 +119 72 8 80 +143 14 50 80 +174 241 0 80 +176 46 34 80 +193 248 0 80 +223 200 41 80 +3 98 72 81 +5 67 62 81 +21 34 63 81 +21 31 56 81 +73 188 22 81 +87 217 52 81 +127 141 0 81 +146 115 51 81 +155 9 54 81 +158 193 48 81 +163 191 54 81 +178 66 0 81 +193 160 64 81 +211 221 69 81 +234 57 0 81 +246 229 63 81 +14 224 0 82 +14 63 64 82 +39 150 58 82 +43 97 54 82 +67 124 69 82 +72 197 12 82 +79 120 26 82 +84 159 0 82 +86 66 0 82 +100 171 74 82 +145 144 56 82 +150 198 0 82 +151 201 0 82 +153 172 9 82 +199 25 0 82 +205 135 19 82 +205 160 28 82 +227 39 0 82 +228 248 0 82 +233 45 51 82 +9 26 68 83 +15 80 43 83 +20 104 73 83 +22 55 11 83 +32 127 75 83 +33 99 68 83 +35 165 44 83 +40 108 0 83 +45 35 9 83 +47 99 0 83 +74 144 52 83 +82 163 17 83 +98 164 43 83 +120 135 0 83 +156 185 11 83 +177 133 76 83 +184 149 36 83 +184 244 0 83 +186 177 31 83 +198 7 55 83 +205 10 0 83 +208 60 76 83 +215 39 0 83 +238 42 0 83 +15 69 20 84 +16 116 51 84 +20 39 10 84 +24 55 36 84 +40 162 35 84 +62 56 8 84 +62 5 10 84 +68 97 59 84 +79 83 0 84 +83 131 0 84 +136 199 0 84 +177 143 0 84 +185 251 37 84 +207 31 0 84 +235 38 76 84 +238 33 0 84 +246 53 0 84 +2 16 9 85 +5 117 0 85 +8 117 42 85 +10 80 60 85 +18 25 17 85 +21 39 0 85 +28 150 59 85 +38 5 64 85 +62 2 0 85 +69 129 0 85 +81 101 0 85 +116 181 0 85 +136 2 49 85 +158 206 0 85 +159 136 50 85 +163 180 27 85 +183 251 51 85 +185 192 0 85 +222 18 73 85 +2 114 21 86 +6 3 0 86 +6 118 32 86 +37 97 0 86 +47 37 12 86 +47 127 0 86 +49 37 0 86 +80 87 30 86 +82 105 57 86 +87 104 78 86 +92 104 72 86 +114 142 79 86 +115 184 0 86 +117 70 37 86 +120 188 0 86 +137 170 69 86 +138 198 0 86 +148 168 0 86 +158 164 77 86 +176 236 0 86 +178 197 0 86 +181 225 34 86 +231 86 85 86 +245 133 62 86 +251 60 0 86 +253 242 41 86 +18 38 0 87 +40 181 40 87 +48 128 51 87 +51 181 21 87 +56 116 35 87 +64 4 42 87 +66 158 59 87 +78 190 0 87 +81 173 70 87 +86 146 0 87 +97 112 0 87 +125 115 65 87 +136 212 55 87 +137 197 0 87 +143 136 59 87 +143 241 0 87 +177 142 76 87 +202 237 70 87 +217 172 19 87 +15 67 0 88 +19 95 0 88 +20 40 0 88 +32 35 82 88 +51 8 59 88 +75 72 59 88 +110 96 0 88 +117 72 9 88 +118 85 31 88 +126 56 57 88 +137 205 0 88 +154 224 86 88 +157 206 0 88 +207 65 64 88 +213 25 0 88 +226 240 72 88 +249 54 0 88 +6 11 0 89 +21 9 0 89 +42 228 71 89 +66 76 10 89 +69 131 60 89 +74 154 54 89 +101 168 68 89 +115 163 0 89 +120 168 24 89 +146 181 50 89 +180 240 64 89 +194 4 63 89 +256 10 0 89 +15 95 0 90 +19 146 40 90 +49 38 23 90 +53 197 46 90 +97 165 0 90 +103 115 32 90 +103 230 73 90 +110 177 0 90 +126 100 0 90 +133 248 9 90 +141 253 0 90 +142 133 67 90 +143 256 0 90 +150 119 71 90 +166 164 53 90 +167 246 57 90 +180 50 32 90 +186 95 78 90 +190 255 48 90 +203 59 45 90 +216 39 0 90 +222 31 9 90 +234 26 68 90 +242 225 38 90 +256 126 17 90 +5 12 0 91 +11 141 48 91 +15 8 12 91 +44 103 0 91 +46 17 44 91 +78 69 15 91 +91 171 76 91 +110 81 51 91 +122 141 0 91 +136 248 0 91 +140 9 22 91 +144 173 55 91 +155 230 77 91 +160 238 78 91 +161 240 80 91 +178 193 0 91 +190 242 33 91 +207 29 0 91 +227 220 56 91 +11 138 39 92 +36 3 50 92 +43 169 15 92 +52 118 67 92 +78 130 0 92 +81 161 0 92 +82 115 57 92 +83 162 59 92 +86 119 70 92 +99 169 86 92 +128 95 25 92 +129 157 80 92 +139 254 0 92 +148 33 19 92 +166 187 0 92 +196 47 86 92 +212 32 80 92 +233 246 14 92 +239 53 86 92 +245 180 0 92 +248 6 0 92 +253 225 0 92 +50 211 67 93 +62 114 0 93 +89 77 22 93 +93 105 0 93 +123 177 48 93 +125 177 0 93 +130 84 0 93 +156 168 0 93 +163 215 88 93 +171 239 59 93 +174 225 0 93 +208 1 0 93 +239 31 32 93 +247 22 63 93 +31 35 46 94 +35 55 0 94 +41 29 74 94 +46 50 81 94 +63 100 0 94 +71 139 0 94 +88 181 65 94 +93 107 0 94 +96 100 76 94 +128 143 0 94 +133 213 32 94 +143 195 0 94 +147 206 0 94 +147 239 76 94 +153 213 24 94 +174 192 0 94 +178 142 0 94 +180 225 13 94 +194 201 9 94 +200 231 67 94 +205 242 78 94 +207 243 77 94 +216 236 76 94 +222 42 53 94 +223 21 37 94 +226 36 68 94 +239 232 86 94 +244 65 89 94 +250 198 48 94 +254 223 25 94 +10 75 77 95 +24 150 66 95 +35 146 49 95 +41 61 0 95 +53 229 0 95 +64 80 44 95 +66 97 71 95 +77 94 57 95 +111 147 64 95 +133 195 31 95 +170 238 35 95 +174 180 0 95 +175 180 8 95 +177 170 29 95 +239 37 11 95 +253 143 0 95 +14 219 0 96 +26 222 0 96 +77 144 8 96 +79 69 25 96 +85 90 59 96 +117 168 80 96 +154 202 62 96 +155 234 83 96 +157 175 93 96 +162 147 11 96 +174 98 0 96 +181 232 90 96 +217 41 0 96 +245 195 0 96 +245 201 0 96 +250 54 0 96 +4 114 0 97 +13 4 44 97 +14 200 50 97 +16 141 61 97 +17 36 15 97 +32 36 75 97 +43 154 32 97 +62 79 84 97 +63 3 53 97 +88 90 16 97 +115 183 0 97 +149 197 0 97 +154 189 64 97 +160 147 11 97 +196 19 0 97 +202 209 80 97 +202 14 0 97 +212 215 64 97 +244 126 83 97 +244 4 67 97 +245 139 67 97 +246 38 52 97 +15 56 12 98 +16 142 69 98 +24 146 9 98 +27 138 44 98 +40 166 58 98 +43 74 63 98 +43 87 35 98 +53 225 37 98 +84 157 0 98 +89 157 22 98 +96 146 87 98 +99 127 32 98 +103 112 13 98 +107 100 59 98 +126 95 40 98 +136 21 44 98 +136 6 86 98 +144 209 70 98 +152 181 72 98 +153 215 79 98 +192 208 25 98 +193 133 0 98 +199 51 87 98 +222 46 0 98 +226 46 78 98 +240 244 0 98 +248 194 0 98 +3 178 73 99 +10 4 88 99 +18 110 69 99 +22 88 85 99 +24 165 35 99 +35 52 8 99 +38 104 78 99 +42 22 90 99 +45 113 26 99 +70 150 0 99 +70 151 67 99 +71 151 0 99 +81 147 7 99 +118 74 0 99 +125 15 0 99 +129 149 0 99 +131 198 0 99 +136 229 63 99 +172 240 86 99 +176 226 92 99 +179 53 8 99 +203 29 0 99 +207 211 73 99 +208 4 70 99 +217 210 40 99 +221 32 77 99 +230 224 82 99 +240 207 59 99 +254 14 0 99 +16 68 0 100 +17 23 30 100 +17 37 0 100 +36 94 90 100 +51 79 84 100 +52 54 11 100 +58 75 74 100 +111 132 73 100 +134 165 71 100 +162 210 0 100 +165 231 88 100 +170 236 61 100 +174 163 0 100 +179 34 80 100 +179 255 0 100 +181 150 65 100 +199 19 86 100 +202 193 60 100 +219 74 89 100 +3 77 83 101 +13 128 92 101 +19 39 93 101 +31 83 80 101 +40 3 56 101 +55 182 95 101 +78 8 13 101 +78 109 91 101 +82 166 70 101 +93 66 87 101 +96 161 0 101 +111 162 0 101 +134 200 81 101 +147 226 83 101 +156 231 0 101 +162 173 9 101 +192 242 45 101 +206 4 66 101 +210 150 0 101 +213 230 32 101 +219 47 77 101 +226 246 0 101 +254 202 0 101 +11 137 32 102 +13 65 92 102 +16 3 11 102 +21 101 99 102 +31 142 91 102 +31 82 0 102 +62 116 62 102 +64 3 28 102 +65 133 96 102 +79 94 47 102 +95 144 0 102 +96 132 67 102 +116 80 0 102 +118 89 29 102 +120 75 82 102 +138 218 81 102 +143 255 0 102 +153 165 0 102 +162 150 41 102 +169 236 68 102 +175 251 50 102 +177 130 69 102 +178 238 90 102 +190 188 53 102 +192 240 0 102 +220 57 68 102 +227 247 0 102 +241 52 52 102 +250 197 46 102 +3 130 82 103 +12 124 0 103 +13 7 88 103 +17 228 83 103 +18 39 0 103 +20 86 24 103 +22 102 0 103 +34 55 0 103 +62 78 0 103 +65 98 69 103 +67 143 78 103 +68 111 52 103 +106 75 66 103 +128 188 0 103 +146 134 0 103 +147 164 51 103 +148 18 44 103 +154 235 62 103 +155 175 89 103 +191 243 39 103 +251 228 62 103 +254 209 44 103 +1 79 84 104 +29 81 84 104 +50 65 86 104 +50 14 0 104 +53 104 98 104 +58 74 0 104 +69 134 0 104 +78 82 78 104 +82 147 9 104 +99 173 39 104 +108 137 58 104 +126 186 0 104 +140 200 76 104 +143 242 0 104 +167 227 0 104 +179 252 70 104 +180 49 55 104 +213 37 0 104 +214 234 65 104 +220 48 73 104 +225 230 94 104 +253 224 86 104 +7 27 65 105 +31 43 54 105 +38 7 58 105 +41 90 68 105 +52 8 0 105 +54 122 84 105 +64 31 95 105 +69 149 0 105 +70 90 78 105 +93 26 0 105 +108 75 13 105 +119 245 73 105 +121 70 50 105 +126 178 50 105 +140 252 68 105 +153 204 89 105 +154 144 0 105 +156 236 0 105 +158 82 37 105 +178 243 40 105 +180 228 0 105 +180 197 0 105 +193 222 85 105 +206 64 90 105 +223 213 38 105 +224 44 23 105 +228 207 58 105 +256 1 0 105 +3 95 91 106 +12 121 18 106 +44 11 90 106 +59 123 0 106 +67 76 56 106 +72 138 43 106 +84 160 0 106 +105 165 0 106 +106 104 55 106 +125 60 102 106 +136 165 67 106 +141 160 11 106 +144 196 95 106 +154 151 0 106 +156 213 0 106 +158 99 0 106 +179 231 94 106 +189 240 72 106 +190 95 62 106 +192 251 0 106 +217 21 0 106 +254 208 0 106 +5 216 94 107 +14 33 87 107 +23 81 35 107 +30 78 77 107 +30 81 81 107 +31 84 0 107 +35 162 37 107 +49 199 82 107 +61 241 61 107 +66 146 0 107 +77 129 0 107 +92 185 20 107 +135 5 84 107 +138 221 90 107 +163 34 83 107 +181 229 0 107 +195 215 83 107 +203 54 0 107 +214 183 64 107 +216 47 96 107 +237 209 60 107 +240 205 62 107 +244 208 0 107 +246 195 67 107 +252 195 70 107 +11 65 76 108 +12 138 85 108 +20 146 13 108 +26 110 101 108 +32 158 78 108 +34 242 85 108 +99 174 0 108 +100 152 99 108 +109 157 0 108 +129 255 103 108 +170 246 47 108 +180 136 101 108 +180 196 93 108 +181 248 81 108 +187 236 0 108 +188 58 102 108 +198 231 37 108 +207 5 41 108 +219 44 64 108 +223 78 68 108 +227 51 101 108 +230 240 89 108 +249 191 56 108 +249 192 0 108 +6 54 0 109 +12 78 88 109 +17 110 49 109 +19 67 39 109 +53 102 92 109 +63 16 17 109 +96 144 0 109 +109 169 0 109 +115 182 0 109 +120 85 90 109 +129 207 98 109 +131 255 82 109 +131 206 0 109 +132 175 53 109 +136 196 32 109 +150 215 93 109 +168 131 87 109 +176 228 0 109 +203 14 0 109 +224 41 0 109 +228 256 0 109 +238 229 66 109 +247 56 0 109 +11 112 74 110 +18 86 0 110 +34 255 0 110 +45 90 0 110 +59 124 0 110 +97 107 14 110 +111 164 0 110 +117 183 7 110 +137 189 59 110 +193 221 0 110 +200 203 98 110 +205 49 93 110 +216 4 57 110 +223 1 0 110 +241 206 85 110 +242 206 0 110 +244 51 62 110 +249 201 0 110 +255 14 42 110 +256 14 0 110 +3 115 0 111 +21 47 94 111 +30 25 101 111 +31 91 91 111 +64 93 40 111 +70 182 23 111 +74 85 73 111 +78 97 72 111 +91 149 92 111 +92 165 0 111 +108 186 0 111 +125 79 75 111 +128 144 0 111 +136 163 36 111 +145 134 19 111 +145 175 81 111 +146 214 0 111 +166 246 0 111 +167 225 54 111 +181 243 17 111 +193 212 46 111 +219 93 9 111 +255 208 69 111 +256 196 92 111 +15 68 0 112 +33 84 76 112 +76 130 12 112 +82 152 43 112 +86 55 26 112 +99 151 82 112 +105 123 0 112 +111 155 92 112 +124 72 0 112 +137 128 0 112 +151 172 66 112 +158 218 83 112 +164 212 0 112 +194 207 0 112 +194 14 0 112 +198 229 95 112 +202 196 84 112 +218 148 66 112 +220 39 51 112 +223 216 42 112 +225 36 25 112 +244 63 0 112 +245 235 109 112 +248 118 99 112 +1 16 0 113 +5 209 97 113 +15 12 100 113 +20 100 0 113 +28 59 53 113 +41 53 0 113 +76 103 89 113 +76 154 0 113 +86 151 95 113 +88 214 19 113 +103 171 0 113 +105 127 96 113 +107 124 94 113 +119 246 9 113 +132 207 84 113 +144 222 0 113 +155 148 97 113 +164 222 46 113 +167 155 0 113 +168 236 38 113 +170 175 0 113 +174 240 58 113 +181 161 28 113 +233 175 47 113 +237 230 60 113 +238 131 93 113 +241 36 13 113 +244 56 0 113 +4 96 99 114 +22 87 81 114 +24 149 88 114 +28 109 0 114 +29 95 106 114 +39 169 98 114 +42 37 97 114 +44 46 91 114 +53 60 0 114 +55 123 0 114 +63 190 98 114 +77 81 74 114 +87 102 13 114 +111 222 87 114 +126 98 68 114 +176 256 0 114 +180 206 56 114 +186 116 18 114 +194 6 0 114 +233 232 0 114 +249 135 0 114 +6 37 78 115 +11 123 0 115 +39 60 91 115 +55 98 0 115 +71 183 0 115 +124 169 98 115 +145 160 0 115 +174 162 0 115 +178 124 73 115 +188 198 107 115 +189 241 90 115 +209 1 0 115 +210 238 31 115 +214 225 18 115 +247 240 85 115 +251 125 100 115 +17 34 17 116 +19 25 23 116 +31 79 43 116 +35 109 69 116 +38 98 0 116 +48 96 112 116 +55 114 0 116 +62 242 0 116 +68 88 0 116 +85 152 104 116 +86 38 0 116 +86 117 91 116 +92 152 0 116 +106 46 100 116 +112 100 0 116 +138 246 106 116 +148 240 48 116 +158 210 67 116 +180 144 88 116 +184 250 41 116 +198 2 0 116 +215 89 87 116 +217 236 47 116 +221 27 98 116 +229 241 0 116 +8 68 0 117 +11 186 14 117 +19 41 100 117 +45 34 26 117 +48 108 0 117 +66 47 77 117 +71 131 0 117 +100 238 66 117 +141 253 100 117 +146 87 0 117 +165 156 0 117 +167 161 89 117 +171 236 0 117 +173 223 79 117 +208 193 0 117 +208 78 76 117 +210 230 0 117 +224 28 0 117 +224 110 104 117 +254 46 82 117 +1 31 0 118 +3 116 0 118 +5 215 81 118 +7 137 92 118 +9 75 83 118 +31 68 0 118 +77 192 87 118 +78 27 0 118 +78 90 88 118 +126 66 75 118 +154 172 0 118 +165 213 66 118 +172 252 50 118 +179 227 0 118 +180 207 58 118 +185 253 110 118 +187 241 110 118 +204 235 63 118 +215 2 0 118 +231 53 0 118 +235 28 74 118 +238 168 18 118 +245 234 59 118 +1 67 104 119 +4 32 60 119 +15 81 0 119 +17 22 12 119 +34 230 93 119 +45 28 0 119 +51 79 105 119 +57 12 41 119 +73 25 0 119 +74 105 89 119 +78 84 0 119 +95 100 100 119 +104 124 0 119 +136 156 92 119 +137 77 0 119 +148 228 0 119 +158 194 110 119 +162 148 0 119 +169 182 100 119 +173 212 65 119 +202 16 113 119 +12 96 104 120 +17 95 104 120 +47 83 88 120 +49 2 53 120 +54 70 86 120 +76 217 10 120 +84 103 98 120 +101 167 55 120 +110 114 101 120 +116 130 0 120 +125 75 0 120 +136 204 102 120 +144 218 0 120 +145 213 67 120 +177 242 0 120 +179 195 0 120 +187 230 71 120 +200 20 115 120 +207 50 0 120 +214 247 56 120 +4 142 94 121 +9 93 76 121 +45 106 0 121 +50 15 0 121 +103 214 71 121 +113 69 113 121 +120 129 0 121 +163 183 0 121 +164 129 100 121 +180 195 0 121 +181 249 83 121 +193 256 56 121 +245 169 87 121 +252 53 0 121 +6 69 0 122 +13 75 81 122 +15 66 0 122 +15 29 0 122 +52 190 104 122 +69 121 0 122 +82 162 0 122 +97 158 0 122 +97 162 0 122 +99 105 106 122 +134 204 95 122 +138 203 106 122 +154 100 101 122 +160 212 0 122 +166 151 64 122 +177 255 78 122 +183 231 96 122 +191 251 0 122 +215 19 0 122 +244 223 46 122 +245 220 68 122 +15 5 9 123 +22 105 0 123 +38 105 0 123 +48 126 0 123 +78 29 0 123 +78 32 0 123 +97 90 83 123 +119 167 32 123 +134 167 90 123 +141 131 33 123 +145 151 14 123 +146 212 103 123 +147 223 0 123 +150 185 67 123 +156 229 0 123 +181 130 116 123 +184 230 78 123 +195 66 106 123 +206 1 0 123 +207 78 12 123 +224 228 0 123 +240 43 108 123 +24 84 0 124 +26 55 82 124 +43 127 51 124 +47 99 106 124 +47 100 0 124 +74 111 118 124 +88 156 0 124 +89 149 92 124 +100 225 62 124 +127 186 0 124 +134 215 75 124 +141 250 74 124 +158 163 0 124 +160 238 104 124 +168 246 0 124 +171 219 111 124 +174 146 55 124 +177 184 99 124 +200 220 120 124 +203 215 100 124 +205 16 115 124 +253 206 8 124 +31 66 0 125 +44 56 99 125 +50 21 99 125 +70 92 0 125 +72 103 100 125 +115 131 0 125 +154 143 99 125 +177 225 0 125 +193 15 81 125 +210 34 0 125 +233 45 100 125 +234 246 0 125 +244 64 0 125 +246 253 34 125 +248 41 110 125 +2 83 108 126 +18 83 81 126 +20 65 113 126 +23 103 0 126 +34 44 122 126 +38 61 109 126 +46 122 40 126 +47 24 34 126 +51 15 0 126 +68 192 104 126 +81 100 42 126 +91 88 9 126 +95 99 110 126 +99 108 108 126 +103 183 0 126 +106 11 6 126 +109 176 92 126 +113 3 0 126 +122 65 38 126 +124 246 55 126 +140 152 0 126 +142 222 105 126 +158 149 45 126 +158 100 0 126 +166 184 0 126 +185 178 78 126 +194 229 101 126 +194 18 0 126 +199 40 75 126 +205 10 100 126 +228 48 74 126 +238 232 113 126 +241 196 90 126 +252 56 0 126 +7 87 83 127 +25 87 9 127 +43 169 114 127 +52 120 63 127 +85 151 40 127 +95 149 99 127 +99 119 40 127 +123 246 56 127 +125 11 0 127 +126 53 99 127 +181 230 0 127 +189 138 111 127 +193 253 0 127 +196 216 0 127 +201 16 110 127 +204 89 34 127 +214 37 0 127 +220 222 88 127 +228 113 57 127 +231 101 111 127 +254 251 0 127 +1 19 0 128 +16 128 0 128 +27 75 0 128 +29 96 87 128 +38 121 0 128 +68 82 0 128 +101 149 84 128 +128 67 100 128 +133 132 0 128 +135 195 52 128 +135 9 27 128 +140 233 105 128 +152 175 85 128 +179 49 17 128 +184 232 0 128 +223 240 112 128 +224 16 120 128 +227 248 123 128 +249 179 10 128 +4 35 62 129 +5 18 79 129 +19 34 110 129 +19 149 78 129 +20 22 10 129 +26 125 85 129 +29 97 94 129 +31 3 0 129 +32 108 120 129 +50 37 93 129 +51 7 60 129 +51 128 116 129 +74 140 114 129 +84 107 106 129 +115 129 0 129 +132 161 18 129 +139 200 89 129 +167 164 60 129 +193 62 0 129 +209 4 66 129 +209 20 108 129 +211 66 90 129 +245 41 22 129 +249 255 119 129 +254 184 108 129 +7 22 109 130 +45 64 116 130 +46 127 65 130 +78 47 56 130 +95 72 109 130 +137 192 0 130 +144 223 0 130 +147 175 0 130 +150 220 96 130 +177 253 0 130 +192 157 96 130 +193 5 0 130 +196 78 72 130 +216 239 48 130 +4 33 12 131 +30 216 34 131 +30 61 68 131 +31 65 0 131 +32 81 0 131 +40 108 100 131 +42 54 103 131 +57 125 0 131 +62 206 0 131 +81 132 10 131 +143 195 113 131 +159 14 7 131 +172 232 54 131 +187 129 103 131 +194 163 90 131 +198 8 83 131 +210 37 0 131 +215 232 12 131 +222 14 0 131 +233 222 53 131 +256 48 0 131 +4 29 0 132 +13 27 0 132 +14 32 0 132 +23 20 24 132 +40 5 56 132 +41 117 111 132 +42 121 102 132 +70 119 106 132 +74 158 110 132 +82 161 0 132 +84 176 84 132 +96 140 107 132 +98 164 106 132 +99 178 58 132 +104 226 107 132 +106 111 94 132 +125 102 8 132 +135 50 73 132 +161 227 90 132 +177 141 0 132 +185 127 103 132 +194 222 84 132 +194 225 101 132 +200 56 0 132 +221 240 48 132 +238 242 0 132 +245 135 0 132 +250 204 0 132 +48 121 0 133 +57 102 0 133 +66 129 0 133 +79 83 117 133 +93 87 109 133 +134 201 0 133 +143 173 80 133 +148 238 0 133 +161 212 9 133 +171 251 0 133 +189 169 0 133 +217 222 105 133 +227 45 19 133 +246 217 112 133 +6 86 41 134 +7 67 64 134 +21 1 0 134 +27 157 68 134 +32 80 0 134 +32 84 62 134 +43 64 123 134 +50 198 93 134 +54 12 0 134 +72 84 116 134 +74 154 91 134 +80 84 122 134 +101 92 0 134 +103 151 0 134 +105 94 126 134 +122 105 95 134 +151 168 61 134 +160 30 49 134 +175 221 0 134 +185 138 116 134 +189 255 98 134 +196 8 0 134 +198 12 100 134 +242 209 71 134 +249 54 109 134 +4 23 21 135 +6 218 109 135 +25 48 83 135 +28 55 38 135 +61 109 68 135 +84 132 0 135 +85 136 102 135 +92 94 108 135 +93 153 104 135 +95 174 91 135 +114 182 0 135 +118 98 0 135 +126 129 0 135 +133 145 0 135 +138 205 0 135 +175 223 25 135 +177 193 114 135 +199 211 0 135 +201 220 112 135 +209 197 0 135 +223 227 0 135 +225 255 0 135 +256 122 38 135 +9 29 0 136 +24 72 84 136 +27 153 100 136 +32 112 108 136 +33 22 8 136 +39 87 0 136 +49 37 113 136 +52 66 0 136 +56 121 0 136 +57 117 89 136 +72 91 34 136 +73 85 0 136 +103 163 0 136 +106 54 58 136 +115 146 122 136 +150 170 74 136 +154 140 0 136 +160 26 124 136 +171 239 114 136 +193 17 83 136 +198 10 86 136 +202 222 0 136 +211 31 0 136 +212 48 132 136 +219 89 56 136 +226 131 50 136 +232 244 117 136 +240 64 113 136 +24 117 99 137 +33 81 0 137 +60 25 117 137 +83 76 11 137 +124 190 108 137 +127 141 103 137 +135 247 95 137 +140 220 104 137 +147 168 14 137 +148 17 31 137 +148 216 0 137 +160 29 70 137 +182 230 110 137 +194 223 0 137 +211 47 70 137 +216 20 0 137 +217 9 0 137 +232 252 0 137 +233 250 13 137 +243 57 103 137 +21 14 70 138 +54 11 0 138 +67 141 82 138 +77 189 0 138 +89 82 79 138 +94 146 55 138 +97 145 0 138 +139 207 98 138 +141 130 13 138 +150 96 102 138 +186 129 9 138 +196 197 0 138 +219 239 36 138 +224 251 10 138 +226 240 124 138 +236 34 124 138 +247 39 0 138 +2 47 75 139 +37 104 78 139 +38 36 11 139 +45 106 128 139 +50 55 67 139 +55 12 105 139 +62 208 0 139 +71 188 0 139 +91 173 113 139 +105 157 84 139 +116 187 115 139 +123 254 119 139 +142 72 67 139 +159 211 0 139 +176 162 9 139 +196 47 123 139 +204 8 102 139 +208 60 107 139 +221 16 93 139 +245 250 16 139 +246 232 0 139 +247 5 127 139 +24 36 34 140 +26 86 0 140 +49 196 72 140 +54 121 0 140 +76 88 0 140 +81 147 114 140 +87 166 54 140 +92 125 128 140 +148 168 100 140 +157 129 118 140 +159 203 23 140 +160 45 100 140 +162 225 0 140 +165 151 0 140 +206 2 0 140 +243 252 10 140 +251 239 0 140 +4 24 0 141 +7 133 100 141 +7 75 0 141 +8 27 126 141 +27 95 0 141 +43 174 117 141 +46 58 101 141 +50 117 90 141 +77 127 0 141 +80 173 82 141 +81 129 73 141 +88 136 0 141 +95 92 109 141 +125 190 0 141 +185 192 106 141 +185 144 128 141 +193 248 122 141 +193 14 0 141 +198 23 79 141 +199 25 120 141 +202 12 128 141 +215 224 116 141 +234 252 0 141 +10 48 123 142 +13 27 140 142 +26 222 109 142 +30 34 0 142 +35 165 127 142 +78 130 106 142 +91 144 0 142 +102 183 26 142 +113 78 121 142 +116 254 107 142 +173 210 71 142 +195 69 111 142 +217 200 0 142 +6 221 108 143 +9 31 100 143 +39 125 87 143 +72 99 104 143 +72 132 0 143 +76 139 0 143 +82 117 104 143 +84 125 133 143 +87 108 110 143 +89 101 81 143 +91 103 0 143 +134 188 0 143 +142 149 34 143 +159 207 0 143 +162 243 84 143 +203 25 87 143 +208 47 131 143 +224 14 102 143 +232 117 127 143 +2 33 69 144 +6 16 112 144 +28 48 0 144 +28 108 0 144 +48 96 134 144 +52 11 99 144 +63 189 92 144 +90 102 0 144 +101 121 51 144 +102 133 132 144 +109 115 112 144 +111 169 86 144 +138 187 88 144 +160 172 125 144 +165 120 129 144 +167 160 120 144 +174 235 117 144 +175 192 135 144 +209 229 0 144 +235 255 0 144 +240 36 0 144 +3 79 0 145 +6 29 112 145 +20 37 0 145 +25 91 66 145 +26 89 0 145 +27 111 100 145 +32 174 95 145 +35 83 57 145 +84 164 49 145 +91 217 115 145 +97 173 0 145 +104 152 78 145 +133 193 128 145 +134 246 0 145 +151 160 127 145 +161 240 126 145 +180 183 132 145 +192 61 135 145 +200 60 84 145 +207 10 0 145 +209 21 0 145 +216 245 106 145 +231 33 26 145 +247 34 0 145 +250 64 106 145 +10 86 130 146 +22 5 112 146 +37 99 112 146 +55 166 54 146 +72 152 0 146 +73 153 86 146 +80 132 73 146 +87 198 144 146 +91 171 108 146 +105 111 74 146 +125 115 109 146 +151 22 127 146 +153 204 135 146 +176 226 113 146 +184 132 112 146 +184 5 117 146 +196 21 0 146 +200 14 120 146 +206 211 0 146 +207 59 110 146 +232 55 0 146 +240 244 127 146 +244 211 63 146 +253 64 99 146 +43 122 17 147 +45 256 86 147 +109 122 16 147 +109 116 97 147 +111 155 137 147 +132 163 41 147 +134 144 9 147 +140 6 125 147 +148 30 18 147 +157 139 0 147 +163 172 69 147 +174 218 121 147 +178 137 108 147 +178 226 37 147 +204 235 130 147 +231 243 0 147 +11 79 0 148 +16 141 134 148 +19 87 0 148 +30 238 0 148 +37 56 74 148 +49 13 56 148 +75 139 0 148 +76 188 0 148 +76 144 0 148 +86 96 107 148 +97 116 52 148 +107 237 15 148 +113 67 0 148 +120 183 0 148 +126 124 131 148 +129 149 113 148 +131 196 0 148 +133 85 29 148 +150 160 95 148 +158 202 145 148 +159 29 11 148 +180 136 137 148 +182 130 0 148 +187 207 101 148 +196 213 0 148 +198 229 117 148 +214 245 10 148 +230 252 0 148 +234 57 119 148 +249 232 0 148 +249 45 124 148 +8 68 139 149 +13 4 114 149 +21 34 142 149 +26 12 0 149 +27 73 0 149 +34 55 117 149 +36 128 144 149 +50 4 139 149 +62 56 140 149 +79 66 0 149 +80 156 100 149 +82 113 135 149 +83 194 123 149 +85 153 30 149 +89 19 36 149 +89 169 131 149 +118 166 75 149 +121 183 80 149 +149 209 0 149 +150 155 0 149 +155 235 0 149 +160 204 70 149 +174 240 132 149 +184 147 120 149 +192 131 48 149 +198 167 132 149 +212 4 51 149 +4 47 10 150 +6 26 50 150 +38 7 132 150 +45 57 122 150 +51 103 139 150 +74 29 0 150 +76 156 0 150 +82 102 57 150 +87 165 0 150 +96 143 73 150 +122 187 123 150 +125 124 78 150 +133 75 102 150 +138 190 86 150 +150 135 130 150 +151 219 124 150 +157 222 0 150 +159 194 0 150 +164 184 0 150 +181 170 91 150 +196 52 0 150 +239 32 0 150 +244 17 126 150 +255 110 134 150 +43 111 26 151 +101 118 104 151 +101 169 44 151 +130 198 126 151 +142 221 141 151 +147 17 148 151 +163 18 144 151 +166 234 0 151 +176 186 144 151 +178 132 118 151 +213 17 0 151 +213 23 37 151 +223 235 105 151 +235 32 133 151 +236 32 124 151 +242 252 81 151 +249 191 141 151 +249 238 126 151 +254 130 65 151 +7 133 145 152 +39 185 147 152 +57 5 118 152 +58 75 141 152 +65 141 0 152 +65 180 104 152 +68 194 108 152 +92 234 141 152 +95 161 0 152 +108 127 10 152 +110 122 0 152 +134 215 142 152 +135 156 117 152 +142 194 78 152 +164 183 24 152 +165 233 78 152 +174 115 0 152 +179 225 0 152 +183 140 139 152 +187 202 110 152 +188 197 0 152 +219 48 68 152 +227 47 0 152 +254 159 9 152 +6 18 0 153 +42 122 0 153 +49 14 48 153 +58 52 131 153 +79 91 124 153 +104 183 0 153 +127 234 98 153 +159 204 108 153 +165 173 135 153 +179 49 149 153 +188 190 111 153 +200 56 144 153 +219 93 132 153 +242 3 115 153 +245 251 44 153 +254 226 89 153 +1 211 0 154 +1 66 0 154 +6 41 58 154 +14 47 66 154 +14 79 81 154 +23 32 143 154 +55 5 120 154 +70 136 146 154 +77 27 0 154 +96 161 131 154 +97 174 0 154 +100 120 122 154 +118 112 121 154 +134 169 139 154 +149 161 0 154 +154 235 119 154 +158 225 147 154 +199 21 0 154 +212 94 133 154 +220 32 134 154 +233 245 0 154 +233 253 16 154 +236 24 123 154 +240 207 120 154 +14 18 66 155 +19 145 35 155 +20 145 18 155 +46 43 0 155 +50 62 0 155 +50 65 147 155 +52 67 0 155 +61 9 111 155 +61 32 120 155 +68 85 0 155 +82 115 105 155 +90 170 0 155 +94 161 0 155 +104 67 106 155 +122 188 127 155 +131 209 0 155 +172 226 47 155 +194 212 0 155 +197 53 115 155 +202 29 0 155 +205 64 84 155 +220 39 130 155 +252 200 0 155 +5 25 139 156 +20 68 0 156 +30 4 0 156 +49 5 0 156 +51 165 131 156 +70 75 0 156 +93 48 111 156 +107 119 69 156 +127 65 0 156 +127 192 0 156 +145 85 0 156 +150 198 127 156 +151 6 115 156 +178 142 125 156 +184 226 0 156 +192 240 124 156 +195 18 98 156 +198 231 115 156 +221 14 0 156 +237 33 150 156 +249 41 0 156 +254 15 19 156 +6 231 43 157 +36 84 110 157 +46 94 117 157 +47 19 0 157 +91 103 148 157 +105 165 137 157 +119 169 0 157 +130 137 112 157 +132 2 139 157 +142 66 29 157 +172 248 79 157 +188 143 146 157 +196 5 0 157 +5 73 79 158 +16 47 82 158 +16 138 129 158 +47 95 0 158 +51 67 0 158 +91 85 20 158 +97 53 129 158 +99 181 0 158 +100 149 143 158 +110 101 153 158 +116 176 86 158 +130 195 20 158 +143 222 62 158 +151 163 0 158 +156 213 149 158 +171 238 0 158 +190 250 137 158 +195 62 0 158 +229 24 127 158 +240 110 13 158 +8 73 0 159 +34 102 123 159 +55 77 143 159 +72 91 142 159 +78 83 0 159 +79 96 14 159 +84 162 0 159 +89 156 145 159 +94 113 119 159 +108 120 79 159 +118 65 143 159 +118 134 149 159 +125 176 132 159 +126 67 0 159 +131 200 0 159 +145 225 155 159 +177 146 106 159 +194 146 82 159 +194 206 0 159 +196 225 137 159 +198 12 145 159 +201 22 113 159 +207 9 34 159 +216 34 0 159 +217 172 147 159 +228 230 145 159 +232 97 149 159 +234 190 139 159 +239 63 101 159 +249 199 143 159 +252 207 122 159 +1 7 49 160 +6 220 0 160 +9 62 85 160 +20 88 0 160 +23 90 0 160 +59 52 103 160 +60 23 84 160 +70 68 60 160 +78 111 68 160 +110 53 86 160 +147 215 66 160 +151 231 0 160 +152 245 89 160 +154 167 0 160 +170 205 151 160 +196 18 0 160 +198 10 145 160 +212 110 128 160 +220 23 0 160 +223 4 0 160 +237 163 115 160 +241 197 0 160 +250 59 98 160 +9 14 40 161 +19 12 136 161 +23 29 139 161 +54 8 0 161 +85 130 0 161 +96 125 132 161 +97 117 124 161 +105 167 46 161 +107 122 26 161 +108 186 147 161 +118 108 0 161 +124 157 150 161 +140 158 131 161 +143 217 131 161 +180 141 0 161 +214 6 0 161 +214 201 116 161 +217 158 138 161 +232 56 0 161 +233 204 42 161 +244 209 53 161 +248 203 57 161 +254 209 131 161 +32 39 108 162 +39 112 93 162 +40 7 61 162 +61 122 0 162 +62 114 142 162 +71 68 82 162 +85 165 38 162 +94 36 106 162 +98 119 0 162 +102 168 68 162 +123 169 0 162 +125 100 0 162 +137 143 151 162 +144 158 0 162 +151 246 128 162 +151 211 110 162 +194 214 94 162 +197 3 110 162 +200 4 35 162 +232 98 136 162 +256 204 147 162 +8 114 0 163 +41 34 9 163 +54 71 90 163 +100 128 53 163 +105 119 0 163 +105 153 0 163 +143 13 132 163 +153 143 141 163 +161 228 100 163 +165 183 0 163 +174 180 151 163 +193 256 138 163 +201 8 67 163 +201 21 20 163 +223 18 0 163 +12 41 148 164 +28 99 156 164 +29 96 149 164 +37 103 113 164 +63 57 17 164 +75 134 0 164 +76 136 0 164 +79 81 0 164 +80 160 0 164 +84 115 61 164 +97 165 115 164 +97 146 0 164 +106 189 0 164 +108 176 61 164 +129 207 148 164 +134 167 136 164 +144 156 0 164 +148 229 0 164 +151 230 45 164 +156 204 0 164 +165 119 0 164 +189 240 128 164 +195 215 141 164 +198 50 150 164 +206 15 19 164 +222 208 0 164 +225 47 125 164 +227 53 0 164 +242 201 110 164 +242 211 80 164 +18 51 158 165 +20 101 0 165 +35 56 9 165 +39 89 0 165 +60 8 49 165 +84 175 0 165 +129 238 156 165 +157 192 134 165 +170 238 127 165 +176 256 137 165 +185 176 0 165 +194 17 0 165 +195 201 29 165 +201 216 143 165 +207 77 111 165 +223 195 0 165 +249 44 82 165 +1 197 0 166 +19 98 115 166 +22 34 0 166 +32 86 99 166 +42 33 150 166 +62 4 148 166 +80 144 0 166 +89 151 157 166 +97 177 0 166 +101 120 119 166 +113 180 126 166 +115 71 151 166 +131 243 0 166 +135 247 145 166 +136 202 144 166 +183 220 165 166 +193 49 63 166 +200 69 102 166 +233 25 154 166 +241 240 0 166 +246 205 12 166 +253 202 155 166 +2 35 156 167 +3 12 145 167 +50 36 0 167 +61 55 82 167 +73 134 0 167 +107 187 0 167 +119 168 0 167 +139 242 135 167 +139 57 127 167 +142 146 21 167 +155 169 0 167 +180 49 149 167 +198 248 0 167 +200 54 0 167 +213 199 0 167 +213 230 128 167 +213 8 91 167 +223 94 133 167 +255 126 141 167 +21 88 131 168 +32 174 156 168 +34 99 121 168 +40 181 109 168 +57 125 160 168 +64 4 154 168 +89 83 92 168 +90 81 156 168 +132 200 136 168 +150 218 0 168 +163 33 134 168 +174 238 0 168 +198 242 79 168 +232 1 127 168 +8 37 155 169 +19 28 74 169 +23 103 134 169 +31 111 54 169 +40 86 0 169 +61 106 0 169 +65 70 125 169 +70 114 0 169 +70 151 162 169 +72 194 89 169 +74 134 106 169 +86 98 0 169 +93 110 157 169 +94 35 0 169 +99 168 0 169 +127 178 0 169 +132 197 0 169 +132 225 108 169 +138 136 159 169 +154 224 149 169 +166 123 0 169 +194 148 0 169 +196 219 144 169 +198 5 0 169 +234 161 134 169 +22 42 142 170 +32 59 97 170 +33 38 136 170 +42 90 135 170 +55 69 70 170 +72 140 0 170 +74 186 0 170 +76 150 0 170 +82 87 0 170 +83 210 143 170 +86 96 155 170 +87 99 60 170 +92 102 0 170 +109 160 158 170 +126 93 73 170 +158 224 134 170 +171 251 141 170 +187 137 0 170 +189 124 0 170 +207 202 0 170 +208 77 113 170 +211 239 33 170 +231 251 94 170 +237 255 0 170 +241 33 146 170 +241 256 0 170 +251 54 102 170 +256 44 91 170 +37 88 122 171 +45 90 145 171 +61 11 0 171 +63 60 158 171 +81 147 160 171 +94 89 167 171 +101 53 81 171 +129 144 0 171 +144 160 0 171 +144 219 153 171 +147 198 0 171 +155 220 0 171 +174 253 0 171 +192 244 0 171 +227 36 0 171 +241 227 0 171 +246 253 155 171 +17 24 0 172 +38 242 137 172 +47 107 149 172 +48 111 0 172 +60 125 163 172 +65 71 126 172 +65 133 112 172 +67 76 171 172 +82 51 111 172 +100 225 148 172 +124 250 154 172 +127 180 0 172 +136 201 0 172 +163 243 48 172 +164 46 153 172 +174 249 149 172 +192 196 143 172 +212 49 159 172 +229 35 150 172 +232 101 125 172 +236 27 162 172 +240 63 0 172 +9 206 51 173 +9 221 42 173 +19 86 0 173 +39 53 0 173 +51 181 101 173 +84 113 95 173 +97 161 0 173 +104 133 110 173 +129 209 57 173 +147 173 29 173 +149 168 110 173 +171 236 151 173 +175 179 110 173 +184 202 145 173 +198 195 0 173 +216 26 125 173 +236 105 167 173 +239 110 9 173 +247 197 0 173 +256 122 156 173 +6 24 0 174 +19 7 33 174 +33 52 138 174 +33 62 129 174 +42 31 156 174 +55 75 85 174 +59 113 9 174 +67 151 160 174 +122 89 164 174 +124 67 163 174 +139 245 148 174 +152 172 0 174 +160 225 64 174 +186 254 0 174 +196 4 0 174 +196 29 0 174 +212 36 0 174 +213 148 0 174 +234 139 158 174 +6 27 0 175 +9 15 84 175 +28 76 140 175 +36 104 100 175 +40 166 141 175 +42 37 143 175 +60 15 123 175 +65 83 0 175 +91 186 13 175 +94 100 0 175 +99 102 0 175 +112 182 93 175 +112 141 118 175 +115 68 104 175 +152 22 126 175 +154 140 144 175 +170 141 146 175 +183 198 156 175 +183 253 141 175 +189 249 43 175 +191 131 0 175 +198 210 0 175 +203 59 120 175 +206 195 0 175 +208 45 137 175 +239 35 0 175 +10 105 161 176 +24 150 162 176 +32 63 110 176 +36 177 135 176 +84 177 78 176 +97 90 156 176 +99 173 112 176 +112 249 158 176 +116 141 0 176 +127 187 0 176 +130 137 172 176 +132 173 56 176 +139 13 27 176 +142 83 0 176 +147 206 144 176 +167 234 0 176 +167 247 49 176 +179 228 0 176 +198 211 0 176 +201 23 76 176 +203 7 133 176 +231 33 159 176 +235 59 0 176 +238 250 104 176 +18 84 151 177 +19 37 0 177 +20 48 120 177 +26 24 86 177 +45 94 0 177 +46 15 67 177 +69 182 0 177 +77 186 0 177 +88 117 125 177 +101 56 107 177 +115 182 154 177 +129 148 114 177 +132 149 0 177 +134 202 0 177 +135 199 0 177 +150 140 0 177 +156 240 167 177 +161 209 0 177 +167 236 0 177 +169 187 0 177 +170 139 155 177 +205 204 0 177 +206 212 0 177 +222 18 120 177 +250 207 0 177 +20 90 145 178 +26 55 160 178 +33 255 131 178 +40 69 62 178 +52 16 0 178 +63 55 147 178 +72 184 0 178 +77 189 164 178 +78 190 98 178 +101 114 134 178 +126 56 113 178 +127 121 78 178 +128 188 114 178 +130 197 0 178 +138 150 0 178 +140 252 127 178 +218 10 0 178 +221 239 0 178 +12 24 123 179 +12 66 132 179 +18 110 115 179 +27 37 146 179 +31 48 76 179 +41 47 164 179 +41 107 166 179 +48 102 176 179 +58 14 138 179 +61 243 162 179 +83 132 0 179 +95 160 0 179 +111 165 165 179 +121 141 143 179 +134 155 0 179 +155 233 0 179 +169 176 0 179 +192 207 0 179 +205 9 0 179 +212 22 22 179 +213 25 121 179 +216 85 155 179 +223 15 0 179 +227 49 0 179 +230 44 10 179 +243 197 0 179 +246 215 137 179 +253 57 91 179 +20 83 0 180 +30 25 167 180 +36 101 0 180 +38 18 143 180 +48 174 90 180 +71 151 157 180 +77 157 0 180 +104 180 121 180 +149 215 140 180 +169 231 157 180 +185 247 83 180 +196 10 120 180 +200 66 101 180 +212 231 24 180 +216 228 81 180 +235 238 0 180 +235 37 154 180 +245 1 141 180 +256 44 172 180 +24 87 0 181 +26 109 0 181 +43 40 108 181 +55 53 0 181 +57 62 115 181 +61 113 0 181 +73 141 128 181 +80 129 0 181 +118 75 0 181 +131 248 0 181 +183 203 144 181 +185 245 0 181 +186 217 142 181 +224 251 143 181 +241 62 0 181 +8 35 157 182 +40 1 98 182 +46 126 0 182 +48 94 0 182 +49 38 150 182 +55 181 119 182 +61 34 173 182 +64 93 147 182 +81 148 129 182 +82 109 116 182 +99 164 0 182 +108 128 0 182 +134 157 67 182 +142 173 7 182 +171 253 0 182 +172 253 0 182 +193 148 44 182 +197 54 0 182 +211 226 154 182 +224 41 133 182 +230 54 106 182 +241 54 153 182 +253 59 99 182 +256 73 174 182 +6 71 158 183 +6 66 143 183 +17 35 0 183 +60 75 0 183 +65 93 50 183 +82 150 0 183 +87 101 0 183 +89 31 132 183 +105 117 91 183 +108 162 145 183 +119 139 175 183 +166 124 0 183 +168 216 63 183 +169 183 0 183 +174 116 0 183 +178 137 176 183 +193 248 168 183 +207 221 0 183 +214 37 138 183 +221 240 151 183 +226 35 146 183 +228 98 153 183 +230 210 136 183 +235 256 34 183 +239 244 154 183 +240 41 157 183 +248 200 0 183 +249 179 176 183 +6 13 106 184 +6 74 0 184 +34 104 136 184 +37 106 139 184 +60 120 79 184 +66 76 113 184 +119 170 0 184 +122 91 156 184 +123 181 88 184 +129 206 0 184 +130 184 0 184 +137 194 172 184 +159 207 159 184 +167 188 123 184 +188 202 0 184 +199 215 0 184 +229 239 43 184 +244 199 53 184 +251 207 0 184 +36 54 114 185 +46 207 9 185 +47 84 0 185 +64 127 0 185 +73 63 161 185 +74 121 129 185 +82 130 177 185 +95 173 0 185 +97 158 182 185 +118 23 150 185 +118 66 0 185 +123 205 110 185 +126 141 0 185 +127 104 148 185 +146 227 155 185 +164 227 0 185 +199 1 30 185 +199 21 162 185 +208 7 169 185 +213 18 0 185 +215 2 129 185 +226 18 134 185 +13 57 0 186 +20 111 0 186 +31 84 152 186 +39 150 119 186 +41 103 119 186 +71 86 158 186 +73 78 147 186 +77 94 158 186 +101 121 169 186 +123 183 0 186 +127 114 0 186 +142 131 0 186 +156 249 10 186 +160 172 155 186 +187 180 50 186 +12 69 0 187 +38 250 156 187 +42 49 158 187 +55 166 163 187 +71 139 180 187 +73 5 181 187 +82 111 0 187 +87 167 0 187 +124 131 173 187 +133 193 152 187 +137 250 0 187 +155 214 0 187 +178 66 143 187 +180 182 169 187 +196 62 0 187 +200 1 0 187 +204 231 14 187 +204 224 0 187 +216 35 0 187 +223 240 162 187 +230 225 162 187 +234 231 167 187 +19 67 154 188 +27 103 113 188 +56 181 108 188 +66 150 162 188 +76 139 171 188 +123 253 58 188 +145 100 79 188 +180 228 111 188 +186 151 146 188 +199 208 182 188 +208 22 174 188 +213 50 153 188 +220 57 137 188 +224 48 0 188 +12 75 0 189 +13 7 140 189 +13 80 162 189 +19 101 0 189 +32 82 181 189 +39 56 85 189 +51 162 24 189 +59 127 0 189 +84 104 0 189 +85 68 179 189 +112 116 0 189 +113 122 15 189 +124 183 0 189 +135 252 0 189 +136 167 187 189 +155 204 0 189 +249 205 0 189 +19 88 0 190 +33 53 0 190 +39 48 54 190 +50 21 179 190 +52 122 52 190 +64 7 145 190 +72 181 137 190 +92 173 0 190 +93 141 0 190 +99 117 0 190 +109 177 125 190 +126 121 115 190 +132 224 169 190 +137 246 0 190 +137 201 123 190 +147 198 181 190 +149 233 159 190 +161 181 184 190 +175 235 0 190 +180 248 163 190 +196 5 172 190 +203 57 0 190 +208 89 171 190 +219 44 169 190 +226 54 137 190 +228 63 0 190 +256 126 118 190 +7 16 178 191 +11 123 179 191 +17 65 166 191 +29 61 144 191 +35 84 0 191 +50 211 125 191 +56 12 166 191 +60 69 0 191 +63 75 159 191 +77 113 0 191 +80 109 165 191 +82 68 152 191 +104 182 0 191 +116 80 129 191 +118 89 147 191 +127 79 0 191 +135 203 0 191 +137 86 175 191 +141 193 0 191 +145 194 0 191 +148 227 0 191 +165 180 130 191 +173 172 174 191 +178 185 145 191 +181 248 167 191 +210 37 133 191 +239 256 151 191 +240 57 80 191 +256 52 0 191 +3 23 56 192 +10 47 81 192 +23 35 28 192 +28 55 162 192 +36 56 0 192 +46 58 166 192 +55 128 175 192 +56 104 0 192 +56 124 172 192 +60 89 35 192 +90 170 162 192 +123 135 161 192 +133 147 0 192 +136 217 0 192 +137 183 0 192 +138 149 162 192 +144 193 0 192 +161 245 176 192 +175 61 127 192 +185 246 0 192 +192 241 0 192 +192 202 0 192 +194 1 0 192 +194 21 0 192 +204 31 125 192 +215 7 146 192 +222 152 140 192 +229 181 180 192 +245 252 0 192 +249 54 185 192 +21 27 135 193 +28 66 144 193 +42 27 77 193 +42 109 0 193 +70 81 105 193 +87 107 0 193 +88 214 154 193 +92 94 158 193 +95 72 183 193 +123 155 177 193 +124 69 0 193 +139 143 0 193 +151 141 180 193 +190 155 185 193 +192 238 0 193 +206 30 0 193 +215 37 0 193 +230 219 77 193 +240 59 0 193 +251 49 175 193 +3 178 169 194 +6 18 184 194 +27 48 27 194 +28 108 151 194 +40 108 162 194 +65 131 143 194 +89 69 0 194 +92 170 0 194 +125 173 132 194 +170 161 144 194 +199 64 182 194 +215 8 0 194 +219 47 123 194 +220 223 156 194 +230 240 146 194 +255 59 88 194 +16 81 0 195 +19 145 171 195 +22 40 0 195 +31 110 49 195 +32 157 161 195 +38 106 0 195 +88 107 157 195 +110 114 134 195 +112 237 177 195 +121 138 135 195 +130 209 0 195 +135 155 0 195 +138 188 0 195 +139 253 0 195 +152 164 47 195 +184 38 178 195 +185 138 167 195 +213 5 0 195 +215 5 123 195 +215 18 0 195 +235 47 154 195 +251 63 0 195 +253 64 175 195 +4 158 167 196 +17 95 167 196 +24 117 182 196 +36 117 0 196 +71 184 0 196 +98 120 0 196 +112 113 0 196 +122 188 175 196 +132 203 188 196 +161 228 174 196 +182 248 10 196 +199 13 134 196 +214 226 0 196 +217 10 0 196 +229 179 0 196 +236 256 0 196 +245 236 0 196 +10 86 183 197 +10 92 186 197 +22 9 169 197 +24 100 186 197 +78 130 148 197 +87 146 123 197 +92 141 178 197 +100 120 169 197 +103 229 191 197 +111 191 191 197 +119 138 163 197 +122 187 167 197 +177 170 128 197 +186 252 139 197 +197 220 190 197 +205 15 85 197 +226 53 0 197 +239 62 95 197 +251 47 177 197 +3 83 77 198 +30 81 125 198 +67 84 176 198 +67 182 0 198 +73 93 50 198 +76 149 0 198 +125 171 126 198 +135 248 0 198 +135 204 0 198 +139 58 33 198 +146 216 158 198 +158 129 42 198 +163 180 126 198 +187 236 150 198 +199 202 117 198 +200 28 186 198 +230 237 128 198 +230 215 20 198 +234 254 88 198 +236 253 0 198 +245 227 0 198 +6 28 0 199 +22 5 167 199 +33 63 0 199 +35 44 172 199 +41 32 106 199 +43 101 82 199 +45 256 157 199 +46 31 154 199 +61 33 125 199 +88 153 0 199 +91 84 181 199 +99 167 0 199 +134 156 0 199 +185 165 0 199 +192 255 0 199 +200 219 196 199 +200 70 100 199 +203 25 170 199 +248 58 42 199 +249 181 146 199 +6 85 0 200 +15 81 174 200 +69 136 191 200 +75 158 190 200 +112 161 176 200 +122 190 0 200 +143 148 68 200 +144 160 185 200 +144 58 156 200 +200 85 136 200 +207 36 181 200 +223 235 153 200 +234 255 0 200 +247 253 85 200 +2 30 0 201 +7 27 180 201 +11 119 179 201 +12 43 172 201 +30 16 80 201 +32 174 186 201 +33 109 65 201 +74 123 135 201 +107 167 0 201 +124 184 0 201 +151 231 168 201 +172 248 195 201 +219 240 80 201 +232 21 135 201 +232 44 0 201 +239 110 192 201 +240 44 87 201 +255 51 194 201 +9 21 163 202 +19 70 0 202 +41 102 0 202 +46 59 0 202 +56 126 190 202 +65 122 182 202 +73 15 143 202 +89 75 0 202 +89 124 141 202 +90 173 0 202 +117 131 178 202 +122 116 24 202 +130 196 191 202 +149 197 149 202 +157 214 178 202 +160 208 0 202 +160 212 185 202 +181 163 0 202 +188 198 152 202 +197 208 180 202 +197 25 162 202 +199 256 174 202 +213 246 127 202 +9 27 0 203 +12 41 174 203 +13 25 92 203 +20 34 0 203 +30 35 0 203 +43 37 90 203 +66 147 177 203 +69 181 96 203 +74 128 0 203 +79 193 132 203 +89 66 88 203 +125 79 147 203 +127 237 191 203 +135 141 157 203 +139 221 0 203 +146 169 177 203 +147 160 195 203 +148 206 0 203 +158 100 154 203 +160 29 176 203 +171 253 186 203 +172 192 174 203 +207 63 0 203 +210 197 96 203 +210 220 192 203 +211 81 177 203 +214 6 195 203 +220 240 44 203 +234 205 36 203 +242 54 81 203 +252 5 0 203 +6 89 0 204 +17 45 0 204 +17 93 0 204 +23 83 0 204 +23 88 0 204 +52 100 180 204 +66 131 157 204 +69 113 171 204 +93 145 107 204 +133 68 0 204 +143 160 16 204 +161 166 161 204 +202 58 0 204 +219 21 176 204 +227 238 0 204 +254 239 154 204 +4 70 111 205 +20 85 0 205 +28 150 124 205 +39 166 58 205 +60 10 0 205 +68 155 191 205 +79 131 19 205 +91 159 186 205 +102 188 185 205 +111 128 198 205 +120 149 192 205 +121 187 120 205 +128 114 77 205 +134 217 0 205 +143 208 0 205 +176 162 164 205 +199 119 185 205 +207 126 12 205 +217 6 0 205 +229 217 25 205 +234 182 193 205 +247 118 181 205 +248 1 0 205 +31 91 120 206 +41 48 0 206 +43 108 0 206 +46 109 0 206 +61 77 200 206 +67 184 0 206 +69 76 0 206 +83 167 155 206 +91 171 169 206 +92 112 0 206 +99 166 0 206 +107 237 168 206 +118 123 0 206 +136 246 86 206 +143 194 0 206 +151 201 110 206 +172 240 144 206 +173 162 185 206 +181 194 180 206 +195 7 35 206 +197 8 81 206 +210 224 185 206 +211 35 108 206 +229 249 0 206 +230 242 195 206 +252 16 199 206 +3 82 133 207 +17 66 0 207 +43 103 0 207 +64 10 0 207 +71 179 189 207 +90 102 178 207 +93 153 186 207 +104 107 192 207 +105 157 173 207 +113 165 193 207 +130 163 176 207 +139 208 0 207 +153 220 152 207 +170 175 122 207 +176 228 118 207 +181 246 0 207 +196 15 0 207 +197 219 184 207 +242 228 0 207 +247 53 0 207 +255 47 179 207 +256 10 197 207 +6 10 0 208 +16 90 82 208 +18 110 191 208 +31 82 148 208 +50 69 78 208 +67 193 119 208 +75 159 192 208 +83 131 131 208 +98 56 0 208 +112 191 0 208 +129 245 193 208 +139 205 0 208 +144 151 140 208 +156 148 179 208 +168 238 169 208 +203 14 121 208 +206 58 202 208 +225 21 175 208 +233 42 0 208 +248 250 13 208 +3 85 0 209 +9 89 0 209 +30 82 133 209 +31 109 0 209 +32 92 0 209 +37 103 198 209 +42 37 184 209 +43 102 0 209 +75 206 192 209 +94 173 0 209 +95 143 0 209 +102 125 147 209 +151 204 0 209 +167 161 164 209 +169 229 44 209 +181 241 0 209 +188 191 66 209 +194 209 0 209 +198 21 0 209 +208 220 98 209 +211 85 156 209 +2 204 195 210 +6 58 0 210 +7 10 0 210 +7 28 186 210 +37 118 197 210 +38 58 50 210 +69 79 192 210 +77 27 203 210 +107 187 191 210 +118 64 137 210 +133 83 0 210 +147 197 0 210 +149 166 136 210 +198 12 194 210 +209 216 0 210 +213 219 179 210 +217 41 197 210 +255 126 174 210 +256 204 179 210 +8 25 0 211 +12 92 174 211 +13 73 56 211 +17 81 0 211 +50 114 0 211 +67 146 165 211 +73 10 0 211 +76 135 0 211 +103 163 169 211 +112 177 0 211 +118 77 196 211 +118 74 127 211 +118 108 189 211 +128 76 179 211 +129 244 12 211 +137 202 0 211 +158 210 198 211 +173 253 183 211 +176 255 0 211 +187 239 175 211 +195 52 0 211 +201 16 202 211 +222 227 0 211 +231 43 96 211 +242 34 170 211 +244 206 0 211 +256 77 126 211 +2 70 95 212 +9 8 72 212 +19 84 0 212 +24 54 186 212 +36 128 159 212 +45 63 0 212 +50 37 201 212 +59 117 195 212 +86 157 158 212 +94 148 160 212 +101 107 165 212 +104 230 197 212 +113 180 188 212 +120 83 196 212 +123 142 165 212 +132 212 33 212 +151 22 191 212 +159 30 11 212 +168 220 137 212 +175 179 193 212 +210 164 0 212 +218 10 203 212 +236 106 101 212 +245 255 188 212 +3 71 72 213 +18 88 129 213 +28 83 186 213 +29 110 52 213 +75 139 162 213 +100 176 0 213 +112 249 209 213 +135 250 0 213 +137 156 157 213 +149 140 0 213 +152 197 152 213 +156 206 140 213 +175 255 0 213 +183 220 197 213 +195 54 0 213 +201 54 0 213 +224 61 23 213 +230 139 197 213 +230 250 0 213 +235 46 0 213 +239 97 108 213 +3 70 0 214 +8 99 192 214 +17 97 0 214 +35 57 199 214 +43 92 0 214 +45 49 0 214 +59 7 144 214 +67 194 127 214 +69 137 0 214 +71 136 0 214 +72 138 139 214 +77 89 129 214 +100 229 199 214 +115 79 0 214 +126 180 200 214 +130 158 27 214 +133 246 0 214 +189 162 133 214 +192 159 15 214 +195 62 203 214 +208 60 179 214 +213 212 0 214 +225 19 205 214 +228 1 60 214 +230 187 169 214 +6 208 56 215 +6 219 0 215 +22 33 201 215 +39 92 0 215 +40 5 194 215 +55 76 165 215 +113 101 125 215 +149 104 180 215 +188 205 0 215 +190 244 136 215 +223 15 210 215 +233 38 130 215 +239 34 0 215 +251 41 0 215 +254 142 0 215 +13 209 202 216 +31 90 0 216 +32 158 167 216 +54 58 0 216 +58 76 201 216 +71 123 0 216 +74 141 0 216 +94 174 0 216 +98 120 214 216 +106 117 73 216 +138 86 158 216 +154 175 0 216 +211 97 173 216 +222 47 27 216 +242 247 100 216 +13 65 188 217 +14 79 211 217 +17 82 0 217 +22 19 0 217 +22 7 174 217 +23 92 163 217 +53 60 141 217 +55 77 183 217 +74 86 82 217 +93 86 180 217 +124 72 126 217 +138 169 200 217 +140 208 0 217 +148 30 172 217 +159 203 173 217 +169 220 86 217 +179 238 0 217 +184 151 121 217 +200 202 168 217 +200 225 204 217 +211 239 174 217 +219 42 21 217 +224 228 169 217 +5 85 75 218 +23 37 0 218 +24 43 86 218 +53 116 167 218 +56 19 196 218 +70 114 191 218 +80 156 188 218 +86 96 185 218 +93 110 204 218 +104 106 114 218 +105 165 198 218 +105 172 62 218 +105 171 45 218 +109 100 0 218 +111 155 205 218 +149 217 0 218 +158 143 12 218 +162 238 0 218 +176 205 130 218 +181 129 164 218 +183 54 139 218 +200 56 189 218 +200 12 0 218 +217 231 0 218 +220 10 0 218 +228 62 0 218 +234 144 192 218 +238 248 188 218 +2 33 178 219 +8 76 51 219 +17 47 0 219 +20 83 206 219 +35 56 192 219 +58 7 0 219 +61 106 193 219 +67 137 106 219 +72 182 0 219 +84 177 214 219 +106 181 218 219 +138 150 190 219 +153 197 171 219 +157 224 196 219 +174 100 0 219 +177 193 202 219 +190 255 125 219 +192 240 183 219 +196 30 0 219 +196 20 96 219 +201 223 216 219 +207 65 160 219 +218 148 164 219 +227 239 0 219 +228 110 48 219 +251 55 98 219 +252 206 194 219 +1 67 218 220 +7 122 139 220 +16 89 0 220 +23 43 0 220 +35 165 194 220 +45 255 0 220 +53 98 0 220 +92 111 41 220 +112 156 215 220 +125 73 155 220 +137 150 166 220 +147 227 0 220 +168 227 0 220 +175 49 133 220 +184 9 204 220 +186 246 0 220 +186 251 159 220 +201 25 0 220 +204 73 179 220 +211 66 182 220 +223 12 197 220 +225 35 138 220 +10 41 125 221 +19 68 0 221 +28 104 193 221 +50 196 0 221 +58 78 207 221 +59 76 206 221 +79 205 164 221 +81 127 192 221 +88 229 188 221 +105 170 0 221 +106 171 128 221 +115 189 21 221 +117 72 159 221 +137 194 188 221 +176 186 199 221 +178 189 125 221 +214 21 0 221 +223 78 207 221 +226 247 0 221 +7 25 0 222 +12 41 209 222 +14 82 174 222 +25 76 200 222 +50 40 0 222 +55 123 139 222 +99 173 189 222 +127 160 195 222 +145 155 155 222 +153 159 128 222 +175 190 140 222 +192 249 118 222 +200 25 0 222 +210 20 178 222 +212 22 214 222 +246 118 218 222 +17 94 0 223 +26 93 207 223 +26 31 0 223 +32 127 152 223 +50 52 0 223 +58 10 0 223 +61 113 209 223 +86 109 203 223 +93 87 158 223 +101 119 0 223 +106 126 211 223 +127 234 214 223 +130 143 0 223 +136 6 204 223 +159 208 0 223 +190 250 195 223 +192 251 120 223 +201 10 0 223 +233 187 0 223 +235 48 0 223 +249 203 0 223 +252 122 206 223 +1 116 158 224 +13 29 0 224 +43 64 216 224 +45 97 0 224 +53 115 88 224 +67 242 152 224 +79 66 205 224 +106 77 196 224 +130 210 96 224 +145 213 203 224 +150 220 182 224 +159 219 0 224 +162 243 187 224 +165 178 96 224 +175 245 148 224 +195 4 0 224 +209 46 219 224 +213 209 0 224 +216 33 0 224 +219 231 0 224 +223 33 0 224 +225 36 203 224 +233 251 0 224 +235 253 0 224 +243 197 207 224 +16 138 195 225 +23 93 185 225 +27 138 190 225 +42 110 0 225 +106 172 142 225 +115 68 197 225 +118 58 36 225 +136 215 0 225 +165 245 79 225 +175 227 0 225 +186 256 201 225 +187 42 182 225 +222 26 187 225 +229 235 148 225 +230 182 156 225 +231 23 0 225 +240 244 200 225 +248 251 90 225 +252 255 157 225 +6 19 0 226 +24 102 0 226 +30 227 0 226 +37 102 0 226 +51 57 182 226 +61 126 0 226 +71 86 212 226 +88 213 208 226 +92 102 181 226 +98 126 174 226 +115 191 0 226 +125 192 220 226 +137 213 161 226 +140 159 92 226 +152 212 0 226 +191 207 55 226 +196 3 0 226 +198 199 0 226 +200 231 139 226 +220 240 211 226 +237 228 0 226 +17 32 0 227 +22 35 0 227 +63 124 224 227 +80 144 186 227 +90 127 124 227 +113 77 209 227 +119 184 0 227 +132 160 0 227 +137 250 215 227 +142 180 58 227 +151 219 168 227 +164 205 204 227 +203 224 225 227 +222 31 107 227 +234 161 216 227 +234 219 159 227 +237 47 193 227 +242 147 139 227 +4 7 203 228 +9 200 0 228 +23 90 172 228 +32 99 199 228 +36 100 0 228 +50 51 0 228 +50 118 74 228 +53 126 163 228 +85 98 126 228 +88 168 0 228 +95 155 133 228 +108 192 213 228 +111 83 63 228 +130 184 186 228 +136 140 0 228 +145 154 108 228 +159 217 100 228 +173 30 207 228 +178 161 87 228 +195 15 0 228 +209 45 150 228 +209 228 181 228 +214 197 146 228 +246 202 89 228 +253 36 194 228 +4 120 163 229 +5 67 204 229 +11 25 99 229 +13 221 0 229 +24 51 169 229 +40 7 180 229 +45 31 0 229 +46 64 0 229 +47 107 226 229 +48 90 0 229 +65 131 215 229 +83 213 170 229 +90 84 138 229 +97 145 209 229 +114 179 129 229 +118 65 222 229 +133 75 201 229 +136 153 0 229 +137 179 177 229 +150 215 216 229 +164 49 129 229 +193 3 205 229 +198 160 198 229 +201 253 164 229 +204 58 0 229 +226 255 0 229 +239 31 104 229 +243 205 218 229 +13 122 0 230 +46 113 0 230 +52 118 211 230 +64 3 215 230 +70 67 0 230 +85 153 218 230 +92 172 0 230 +128 144 203 230 +130 179 77 230 +132 163 216 230 +138 190 228 230 +140 150 197 230 +149 169 131 230 +157 143 0 230 +158 234 220 230 +159 171 68 230 +161 179 70 230 +189 205 0 230 +198 252 0 230 +199 44 154 230 +8 73 212 231 +38 18 210 231 +52 122 211 231 +56 121 167 231 +61 122 197 231 +106 75 214 231 +108 235 209 231 +111 147 211 231 +114 134 204 231 +116 161 123 231 +124 135 0 231 +137 136 0 231 +144 132 0 231 +144 247 209 231 +148 224 27 231 +151 221 136 231 +152 22 190 231 +159 156 91 231 +216 19 0 231 +225 45 43 231 +241 196 208 231 +14 67 207 232 +19 23 0 232 +39 169 198 232 +47 64 196 232 +51 7 204 232 +55 48 28 232 +56 12 198 232 +59 185 187 232 +81 165 197 232 +85 169 206 232 +88 153 211 232 +115 163 167 232 +119 168 195 232 +119 135 146 232 +124 190 216 232 +130 242 0 232 +140 205 0 232 +157 132 0 232 +157 209 214 232 +202 216 177 232 +202 11 158 232 +210 30 0 232 +220 251 42 232 +222 33 0 232 +236 48 0 232 +256 63 0 232 +1 113 64 233 +8 68 180 233 +11 89 0 233 +14 32 143 233 +45 94 215 233 +50 60 77 233 +62 116 131 233 +87 141 177 233 +93 92 0 233 +98 163 217 233 +116 242 213 233 +148 162 218 233 +168 235 210 233 +184 144 188 233 +188 42 203 233 +199 21 230 233 +232 51 0 233 +239 255 0 233 +247 40 0 233 +3 20 84 234 +11 27 0 234 +23 37 226 234 +34 99 225 234 +55 64 95 234 +73 128 0 234 +93 105 105 234 +96 127 157 234 +113 123 218 234 +118 77 231 234 +128 254 223 234 +132 253 231 234 +151 230 208 234 +155 148 122 234 +164 183 184 234 +173 212 199 234 +173 46 223 234 +186 197 207 234 +188 57 212 234 +199 203 0 234 +207 11 0 234 +207 64 0 234 +216 5 150 234 +218 42 0 234 +222 20 169 234 +3 113 170 235 +7 121 0 235 +43 154 103 235 +87 105 0 235 +87 139 189 235 +92 158 84 235 +108 128 188 235 +125 190 230 235 +137 197 93 235 +160 147 228 235 +199 251 124 235 +223 74 218 235 +243 207 135 235 +245 201 217 235 +246 55 219 235 +250 207 198 235 +2 52 0 236 +42 54 190 236 +52 100 210 236 +62 4 193 236 +73 79 223 236 +83 167 224 236 +112 137 227 236 +125 161 205 236 +147 206 233 236 +162 254 177 236 +174 166 218 236 +181 186 146 236 +188 248 74 236 +191 249 201 236 +191 49 130 236 +206 195 206 236 +228 82 207 236 +229 183 0 236 +240 243 216 236 +241 62 211 236 +255 11 229 236 +65 180 199 237 +80 67 219 237 +92 106 0 237 +125 116 0 237 +128 142 0 237 +171 26 195 237 +173 253 234 237 +177 245 179 237 +186 249 0 237 +247 61 28 237 +249 239 207 237 +256 36 165 237 +8 88 115 238 +14 80 137 238 +26 12 221 238 +29 97 166 238 +35 103 37 238 +40 73 215 238 +53 19 210 238 +65 132 227 238 +75 96 38 238 +76 142 186 238 +81 86 211 238 +112 233 187 238 +120 149 228 238 +156 249 212 238 +160 163 213 238 +173 45 205 238 +195 69 225 238 +203 29 214 238 +213 148 213 238 +234 46 164 238 +241 36 205 238 +13 93 0 239 +31 97 0 239 +48 77 182 239 +49 69 232 239 +61 110 0 239 +61 60 0 239 +70 93 190 239 +94 113 209 239 +170 141 216 239 +173 210 191 239 +173 223 223 239 +176 221 222 239 +201 5 0 239 +209 33 0 239 +210 168 0 239 +217 29 120 239 +218 251 48 239 +223 47 0 239 +236 106 236 239 +5 12 105 240 +15 190 233 240 +16 96 0 240 +30 14 0 240 +32 59 237 240 +44 63 18 240 +44 73 151 240 +63 3 188 240 +67 85 0 240 +78 158 0 240 +114 131 53 240 +136 229 198 240 +153 219 163 240 +171 219 156 240 +177 187 37 240 +185 135 0 240 +185 141 154 240 +190 206 149 240 +203 25 214 240 +206 1 225 240 +225 49 0 240 +233 22 130 240 +236 61 0 240 +237 164 0 240 +241 132 228 240 +247 203 41 240 +21 71 233 241 +39 119 40 241 +45 110 0 241 +63 192 215 241 +64 190 228 241 +84 176 218 241 +90 102 215 241 +98 126 230 241 +104 172 34 241 +112 181 204 241 +127 165 191 241 +155 132 126 241 +185 247 233 241 +194 214 207 241 +217 234 196 241 +227 26 224 241 +13 204 0 242 +31 43 124 242 +36 3 206 242 +44 119 71 242 +55 71 76 242 +61 9 201 242 +64 189 224 242 +75 95 0 242 +88 115 144 242 +89 149 144 242 +93 28 0 242 +101 149 167 242 +102 188 225 242 +130 190 0 242 +134 242 186 242 +164 46 193 242 +165 183 175 242 +169 188 11 242 +182 155 214 242 +197 54 204 242 +201 7 8 242 +204 211 216 242 +216 8 76 242 +220 57 213 242 +226 38 0 242 +230 34 232 242 +2 114 187 243 +12 32 0 243 +12 86 0 243 +19 72 0 243 +24 98 0 243 +35 127 222 243 +62 74 213 243 +84 113 209 243 +84 162 222 243 +104 116 94 243 +105 48 0 243 +105 119 211 243 +123 177 114 243 +160 220 84 243 +212 34 0 243 +214 221 109 243 +232 36 0 243 +248 201 0 243 +8 20 0 244 +14 29 0 244 +40 59 153 244 +85 152 223 244 +87 96 30 244 +93 75 0 244 +98 103 0 244 +98 190 240 244 +101 90 214 244 +109 176 201 244 +159 218 0 244 +160 45 156 244 +167 188 192 244 +202 23 197 244 +213 230 225 244 +216 38 0 244 +230 24 240 244 +238 50 169 244 +22 224 224 245 +26 37 72 245 +35 84 231 245 +80 66 224 245 +81 161 195 245 +92 174 81 245 +105 122 217 245 +121 192 168 245 +160 26 173 245 +162 225 161 245 +198 211 231 245 +237 188 207 245 +16 94 0 246 +17 219 223 246 +17 78 0 246 +31 96 0 246 +83 89 181 246 +101 84 0 246 +152 172 180 246 +153 152 0 246 +159 224 0 246 +160 30 151 246 +166 123 202 246 +169 181 56 246 +179 195 146 246 +182 252 225 246 +197 60 199 246 +202 235 238 246 +7 124 0 247 +22 43 0 247 +27 111 234 247 +28 76 227 247 +43 111 226 247 +78 90 158 247 +84 210 214 247 +86 100 224 247 +101 167 157 247 +109 123 210 247 +133 66 0 247 +140 219 0 247 +197 12 160 247 +206 10 0 247 +206 29 0 247 +207 65 238 247 +215 27 95 247 +221 234 201 247 +223 27 137 247 +231 246 216 247 +232 40 0 247 +17 53 228 248 +43 86 0 248 +44 64 89 248 +56 9 168 248 +61 57 0 248 +65 192 227 248 +87 77 211 248 +92 109 0 248 +107 153 0 248 +109 156 208 248 +112 79 89 248 +116 254 197 248 +119 77 224 248 +137 170 221 248 +143 140 75 248 +151 171 174 248 +170 143 229 248 +182 141 153 248 +193 148 229 248 +194 204 202 248 +227 248 195 248 +250 59 230 248 +13 60 0 249 +15 81 234 249 +27 95 198 249 +38 49 201 249 +43 91 0 249 +52 178 160 249 +90 121 222 249 +120 184 0 249 +129 195 14 249 +133 213 162 249 +136 163 184 249 +164 187 155 249 +187 247 82 249 +189 182 237 249 +191 228 0 249 +198 195 227 249 +202 17 225 249 +206 14 0 249 +223 215 188 249 +228 50 0 249 +229 46 228 249 +244 114 229 249 +246 58 0 249 +1 11 207 250 +20 24 0 250 +28 150 225 250 +39 166 224 250 +49 117 220 250 +50 14 238 250 +56 21 202 250 +72 152 199 250 +88 136 172 250 +93 107 108 250 +99 173 237 250 +109 170 0 250 +125 177 123 250 +127 65 234 250 +156 176 0 250 +177 173 0 250 +183 38 126 250 +222 229 147 250 +239 232 114 250 +240 13 231 250 +250 62 87 250 +14 94 55 251 +25 37 16 251 +42 246 198 251 +45 10 55 251 +52 104 221 251 +53 4 186 251 +53 67 210 251 +84 136 228 251 +97 115 0 251 +102 125 223 251 +106 166 0 251 +164 255 0 251 +167 225 158 251 +178 66 217 251 +194 21 212 251 +203 17 217 251 +213 219 228 251 +222 191 169 251 +228 41 243 251 +236 40 98 251 +247 240 130 251 +247 256 62 251 +34 110 0 252 +42 203 240 252 +87 152 0 252 +88 156 234 252 +93 25 66 252 +106 75 244 252 +178 145 223 252 +185 76 129 252 +188 236 148 252 +196 16 0 252 +204 227 237 252 +206 9 187 252 +208 60 221 252 +212 238 0 252 +214 225 167 252 +216 28 75 252 +222 164 126 252 +225 230 204 252 +229 238 188 252 +240 59 230 252 +243 236 228 252 +245 6 209 252 +248 36 233 252 +1 77 179 253 +8 28 103 253 +28 169 198 253 +36 177 243 253 +38 45 246 253 +49 97 136 253 +52 190 223 253 +61 44 0 253 +70 133 0 253 +80 190 0 253 +100 116 0 253 +103 115 129 253 +122 141 104 253 +126 178 152 253 +132 211 0 253 +142 202 224 253 +161 168 0 253 +168 38 133 253 +173 187 149 253 +183 231 138 253 +187 241 226 253 +188 245 0 253 +193 49 181 253 +207 20 212 253 +217 158 201 253 +249 59 235 253 +254 250 0 253 +7 133 192 254 +41 90 121 254 +44 118 60 254 +54 9 0 254 +108 73 205 254 +108 75 239 254 +133 138 85 254 +138 135 0 254 +143 17 227 254 +150 198 159 254 +167 227 139 254 +181 123 193 254 +191 46 159 254 +198 210 227 254 +211 232 143 254 +232 18 0 254 +246 256 44 254 +13 12 0 255 +16 25 79 255 +29 96 197 255 +46 59 242 255 +61 11 178 255 +67 81 0 255 +101 121 203 255 +115 161 0 255 +118 130 236 255 +137 201 218 255 +157 150 27 255 +166 112 32 255 +166 234 199 255 +175 168 102 255 +178 149 240 255 +191 225 0 255 +206 16 33 255 +210 230 210 255 +238 47 174 255 +242 6 148 255 +246 56 198 255 +5 18 162 256 +8 89 0 256 +11 79 210 256 +22 232 0 256 +55 9 98 256 +78 27 184 256 +118 182 0 256 +128 253 227 256 +133 123 164 256 +135 211 239 256 +142 140 155 256 +143 209 0 256 +150 181 234 256 +158 224 194 256 +166 156 0 256 +169 125 220 256 +170 247 198 256 +205 2 221 256 +237 202 228 256 +243 197 239 256 +248 250 234 256 +249 199 172 256 +42 25 27 257 +49 2 210 257 +87 131 197 257 +103 153 0 257 +116 136 246 257 +132 244 0 257 +163 237 189 257 +164 193 122 257 +164 244 95 257 +199 58 0 257 +203 57 223 257 +212 232 103 257 +225 24 248 257 +231 42 0 257 +255 17 214 257 +15 95 154 258 +46 232 128 258 +53 98 238 258 +54 8 207 258 +55 166 210 258 +58 74 128 258 +85 165 187 258 +86 121 234 258 +105 171 250 258 +114 100 0 258 +116 193 230 258 +132 223 0 258 +132 200 203 258 +135 204 229 258 +158 210 236 258 +173 226 194 258 +180 141 208 258 +202 209 201 258 +210 33 0 258 +217 223 137 258 +3 77 250 259 +17 15 0 259 +23 105 0 259 +27 169 221 259 +42 112 242 259 +44 108 0 259 +55 114 196 259 +71 83 0 259 +78 29 206 259 +83 103 0 259 +88 181 208 259 +91 85 198 259 +99 167 235 259 +143 202 0 259 +153 167 0 259 +155 209 129 259 +174 113 0 259 +174 177 0 259 +181 230 144 259 +188 235 128 259 +196 200 0 259 +203 74 216 259 +218 231 0 259 +240 36 170 259 +241 256 207 259 +3 20 239 260 +13 42 216 260 +16 79 0 260 +61 16 212 260 +76 192 213 260 +78 84 140 260 +106 171 238 260 +107 124 235 260 +109 100 236 260 +121 126 234 260 +125 185 106 260 +130 92 244 260 +143 147 0 260 +144 159 0 260 +158 223 225 260 +159 202 0 260 +163 243 231 260 +187 235 0 260 +197 57 214 260 +213 225 68 260 +237 43 229 260 +238 250 202 260 +242 17 224 260 +44 122 0 261 +66 136 132 261 +70 149 0 261 +80 111 39 261 +99 117 222 261 +105 35 254 261 +108 133 224 261 +126 191 254 261 +145 165 50 261 +164 184 169 261 +172 248 226 261 +191 144 82 261 +225 47 169 261 +236 199 143 261 +238 42 114 261 +250 11 198 261 +256 31 229 261 +21 89 0 262 +42 36 160 262 +67 87 150 262 +68 134 160 262 +86 152 178 262 +91 103 209 262 +97 52 184 262 +128 173 246 262 +134 146 138 262 +136 246 258 262 +137 187 215 262 +198 152 0 262 +218 209 144 262 +222 228 0 262 +254 159 222 262 +255 31 224 262 +48 127 0 263 +81 148 186 263 +91 150 0 263 +109 113 0 263 +131 159 241 263 +139 141 0 263 +173 147 191 263 +187 13 226 263 +191 141 0 263 +200 53 194 263 +209 29 66 263 +210 24 233 263 +216 219 130 263 +219 209 153 263 +226 190 249 263 +234 182 232 263 +247 6 176 263 +254 2 244 263 +256 223 197 263 +18 28 96 264 +28 72 200 264 +48 107 0 264 +62 31 212 264 +81 149 0 264 +88 117 254 264 +103 230 174 264 +106 189 192 264 +116 179 123 264 +125 124 190 264 +152 172 254 264 +158 225 228 264 +181 226 0 264 +191 250 0 264 +207 219 245 264 +218 175 0 264 +239 42 0 264 +240 205 120 264 +251 38 47 264 +254 251 153 264 +255 2 204 264 +11 123 243 265 +13 36 229 265 +21 83 198 265 +22 10 88 265 +22 105 135 265 +28 102 0 265 +30 211 0 265 +32 157 253 265 +56 104 222 265 +59 36 165 265 +106 127 0 265 +115 68 247 265 +141 256 206 265 +187 58 224 265 +198 233 129 265 +205 49 126 265 +217 26 0 265 +222 211 0 265 +225 245 0 265 +253 201 239 265 +28 35 94 266 +44 112 0 266 +44 117 75 266 +52 79 0 266 +79 140 210 266 +82 89 203 266 +85 90 205 266 +92 166 0 266 +118 66 220 266 +125 77 0 266 +129 77 257 266 +132 221 0 266 +137 79 219 266 +145 173 0 266 +169 189 222 266 +183 243 0 266 +210 37 220 266 +239 255 257 266 +33 54 251 267 +41 59 0 267 +49 16 249 267 +62 56 246 267 +70 83 0 267 +85 84 0 267 +109 189 0 267 +119 168 257 267 +128 178 130 267 +144 58 213 267 +169 123 222 267 +171 148 49 267 +192 255 246 267 +193 53 185 267 +205 209 83 267 +211 7 263 267 +217 208 0 267 +238 52 256 267 +8 134 193 268 +15 12 260 268 +45 63 225 268 +48 57 0 268 +56 98 235 268 +78 83 233 268 +82 165 0 268 +88 161 0 268 +111 234 193 268 +123 113 263 268 +147 212 0 268 +201 223 243 268 +207 58 0 268 +215 10 0 268 +237 212 0 268 +241 205 61 268 +242 2 0 268 +247 59 27 268 +254 46 154 268 +60 137 235 269 +64 127 217 269 +75 191 237 269 +82 149 0 269 +100 117 0 269 +108 186 181 269 +118 104 0 269 +138 201 245 269 +139 57 239 269 +143 61 256 269 +174 148 0 269 +184 53 227 269 +191 188 214 269 +192 159 234 269 +193 256 187 269 +213 165 201 269 +214 226 202 269 +214 249 55 269 +223 26 112 269 +228 230 217 269 +244 6 203 269 +2 16 208 270 +22 235 134 270 +47 37 239 270 +63 16 190 270 +64 31 235 270 +65 118 253 270 +67 147 126 270 +68 148 120 270 +79 153 245 270 +82 105 220 270 +146 92 244 270 +182 230 244 270 +188 240 155 270 +203 29 252 270 +208 23 174 270 +209 14 0 270 +217 222 194 270 +223 45 0 270 +237 42 0 270 +241 230 198 270 +32 98 248 271 +35 56 234 271 +49 199 213 271 +50 250 248 271 +50 38 0 271 +67 164 249 271 +67 192 267 271 +100 128 221 271 +104 133 218 271 +108 160 264 271 +118 178 0 271 +119 130 257 271 +141 201 181 271 +175 232 151 271 +176 30 252 271 +186 246 256 271 +200 14 187 271 +208 209 0 271 +223 25 111 271 +226 172 237 271 +243 230 0 271 +7 24 241 272 +11 52 249 272 +16 20 125 272 +17 228 263 272 +27 157 159 272 +34 44 253 272 +34 102 240 272 +36 65 44 272 +48 121 147 272 +66 147 206 272 +68 180 88 272 +81 37 267 272 +81 147 196 272 +101 87 261 272 +110 126 0 272 +114 127 227 272 +114 131 256 272 +114 180 82 272 +125 116 251 272 +139 248 50 272 +152 17 262 272 +182 247 108 272 +183 199 122 272 +188 143 235 272 +188 202 250 272 +190 255 243 272 +197 53 205 272 +211 35 266 272 +212 94 203 272 +213 25 247 272 +213 23 233 272 +252 255 237 272 +6 227 246 273 +13 59 0 273 +49 126 0 273 +57 64 0 273 +64 138 246 273 +70 157 240 273 +81 86 261 273 +113 77 254 273 +131 200 201 273 +133 246 236 273 +151 229 0 273 +198 141 165 273 +204 24 213 273 +207 10 204 273 +220 43 60 273 +228 98 189 273 +236 34 204 273 +247 197 181 273 +248 9 0 273 +12 90 0 274 +37 199 196 274 +50 204 192 274 +52 127 0 274 +52 129 267 274 +65 117 0 274 +126 145 250 274 +138 250 259 274 +191 186 0 274 +197 219 271 274 +202 23 254 274 +223 78 264 274 +225 31 269 274 +3 82 267 275 +9 122 61 275 +31 8 258 275 +68 196 240 275 +70 150 114 275 +114 102 87 275 +115 241 252 275 +122 182 141 275 +142 205 0 275 +156 219 0 275 +170 175 245 275 +172 252 225 275 +174 249 203 275 +177 119 260 275 +177 184 257 275 +217 203 0 275 +234 46 258 275 +240 44 266 275 +33 113 0 276 +45 28 234 276 +60 75 212 276 +66 126 245 276 +81 104 259 276 +83 92 189 276 +110 148 256 276 +115 191 243 276 +128 188 248 276 +136 244 245 276 +141 250 140 276 +173 225 0 276 +184 230 163 276 +187 196 257 276 +188 206 246 276 +218 201 249 276 +226 184 165 276 +239 36 0 276 +7 74 0 277 +23 91 0 277 +26 20 235 277 +32 82 264 277 +43 89 0 277 +63 67 271 277 +75 87 0 277 +85 151 211 277 +112 182 182 277 +133 172 215 277 +140 221 0 277 +162 230 170 277 +178 72 0 277 +180 232 252 277 +186 249 249 277 +224 28 257 277 +240 252 150 277 +240 47 112 277 +249 43 254 277 +3 83 238 278 +76 154 261 278 +106 124 0 278 +129 83 0 278 +149 200 227 278 +151 201 224 278 +223 15 260 278 +231 55 223 278 +232 35 0 278 +242 205 186 278 +248 33 265 278 +6 24 241 279 +17 229 250 279 +23 29 173 279 +49 65 42 279 +78 8 255 279 +87 198 170 279 +93 43 0 279 +93 141 272 279 +101 169 162 279 +101 108 0 279 +105 37 98 279 +107 234 17 279 +147 239 272 279 +153 201 224 279 +177 245 252 279 +185 246 235 279 +204 73 249 279 +207 78 156 279 +209 21 254 279 +226 53 268 279 +237 187 0 279 +244 36 0 279 +253 42 0 279 +253 1 174 279 +21 97 146 280 +49 195 0 280 +51 119 0 280 +57 122 0 280 +63 192 261 280 +86 167 100 280 +102 177 263 280 +111 123 237 280 +125 51 263 280 +132 17 127 280 +151 165 147 280 +188 141 0 280 +202 207 213 280 +251 11 160 280 +43 111 266 281 +58 14 223 281 +64 10 238 281 +85 27 65 281 +99 166 221 281 +108 237 263 281 +108 162 194 281 +129 72 0 281 +129 187 246 281 +140 218 0 281 +147 223 274 281 +164 192 79 281 +168 235 270 281 +193 243 0 281 +196 1 0 281 +207 21 272 281 +212 8 259 281 +224 238 0 281 +232 252 263 281 +243 114 255 281 +4 129 164 282 +10 73 257 282 +11 87 274 282 +78 94 0 282 +97 39 265 282 +108 127 278 282 +115 134 256 282 +115 168 0 282 +126 91 258 282 +142 144 0 282 +144 255 102 282 +196 256 117 282 +197 203 89 282 +204 89 155 282 +205 15 204 282 +206 255 31 282 +207 8 258 282 +227 247 266 282 +246 34 213 282 +247 24 269 282 +248 120 276 282 +254 248 266 282 +255 42 0 282 +10 126 280 283 +12 75 225 283 +22 101 0 283 +36 84 281 283 +64 192 223 283 +66 129 166 283 +67 194 250 283 +68 131 0 283 +69 177 244 283 +75 95 263 283 +80 140 0 283 +89 108 252 283 +93 75 257 283 +95 98 270 283 +159 212 0 283 +166 247 264 283 +190 206 248 283 +211 81 240 283 +217 229 265 283 +219 44 259 283 +221 225 246 283 +223 1 223 283 +235 28 247 283 +246 202 254 283 +6 72 255 284 +13 114 271 284 +22 89 0 284 +33 53 252 284 +56 102 0 284 +62 116 237 284 +72 131 0 284 +92 198 211 284 +110 191 255 284 +114 104 0 284 +153 233 0 284 +153 171 0 284 +169 249 0 284 +176 186 268 284 +182 192 167 284 +199 121 260 284 +202 12 162 284 +205 31 214 284 +231 82 250 284 +253 196 178 284 +254 14 233 284 +3 117 0 285 +5 117 117 285 +33 39 259 285 +50 23 256 285 +55 53 200 285 +60 23 199 285 +71 131 139 285 +85 98 264 285 +86 98 279 285 +106 94 270 285 +123 173 256 285 +125 15 149 285 +164 143 203 285 +175 187 26 285 +190 179 123 285 +200 225 240 285 +210 161 0 285 +214 234 199 285 +214 204 0 285 +222 31 257 285 +3 95 162 286 +5 252 260 286 +25 91 151 286 +35 114 184 286 +56 68 272 286 +76 79 191 286 +100 189 0 286 +152 161 0 286 +171 191 0 286 +173 238 0 286 +176 225 0 286 +177 130 262 286 +177 226 0 286 +177 193 246 286 +185 176 205 286 +190 196 199 286 +192 238 246 286 +193 221 264 286 +201 10 253 286 +214 219 0 286 +224 249 206 286 +243 15 270 286 +247 244 253 286 +254 5 241 286 +29 91 188 287 +46 244 0 287 +51 127 0 287 +60 74 0 287 +78 129 0 287 +78 192 277 287 +82 150 222 287 +90 155 268 287 +93 154 0 287 +100 238 275 287 +107 237 257 287 +115 130 241 287 +148 150 270 287 +152 228 277 287 +164 131 31 287 +171 45 200 287 +184 149 261 287 +205 219 243 287 +213 5 230 287 +221 201 93 287 +222 208 265 287 +225 45 255 287 +234 30 262 287 +243 40 0 287 +247 5 253 287 +16 95 0 288 +24 57 277 288 +32 84 148 288 +36 117 215 288 +49 14 196 288 +59 52 246 288 +63 79 69 288 +93 130 274 288 +100 210 265 288 +116 117 0 288 +117 134 268 288 +129 206 218 288 +137 197 280 288 +157 233 69 288 +172 240 231 288 +176 143 210 288 +180 183 174 288 +184 132 227 288 +185 138 221 288 +200 209 0 288 +214 26 64 288 +234 44 272 288 +13 63 0 289 +49 5 184 289 +81 132 284 289 +86 166 0 289 +93 110 225 289 +96 100 269 289 +99 173 280 289 +123 177 287 289 +156 234 0 289 +176 46 158 289 +193 14 179 289 +198 23 199 289 +200 212 36 289 +218 249 52 289 +17 29 0 290 +36 56 226 290 +52 77 0 290 +90 84 250 290 +94 160 264 290 +116 164 0 290 +130 148 89 290 +134 188 267 290 +149 215 261 290 +169 158 208 290 +175 245 265 290 +210 232 0 290 +213 2 0 290 +222 46 127 290 +4 84 0 291 +50 9 145 291 +74 124 0 291 +82 51 200 291 +96 146 262 291 +104 119 0 291 +106 62 273 291 +106 170 0 291 +109 160 202 291 +119 162 0 291 +119 139 211 291 +147 200 0 291 +167 41 283 291 +177 166 190 291 +177 168 0 291 +180 135 188 291 +184 153 277 291 +190 144 0 291 +193 238 104 291 +214 227 0 291 +219 11 258 291 +232 39 0 291 +252 202 0 291 +4 33 284 292 +15 8 212 292 +32 42 0 292 +38 104 242 292 +47 154 282 292 +50 118 253 292 +61 20 286 292 +88 108 93 292 +94 164 287 292 +106 123 0 292 +113 161 135 292 +125 173 247 292 +129 95 0 292 +131 188 271 292 +134 242 272 292 +154 151 213 292 +157 214 272 292 +159 205 0 292 +178 68 0 292 +212 216 0 292 +213 246 244 292 +223 33 270 292 +11 123 277 293 +12 31 89 293 +43 128 287 293 +49 207 0 293 +50 21 256 293 +59 78 284 293 +78 190 277 293 +80 206 242 293 +103 119 0 293 +105 185 0 293 +109 98 94 293 +148 216 257 293 +153 197 260 293 +166 180 253 293 +203 74 272 293 +205 195 177 293 +207 52 0 293 +33 109 239 294 +47 122 271 294 +61 53 228 294 +70 80 248 294 +78 145 0 294 +80 92 0 294 +106 169 0 294 +115 182 242 294 +120 132 273 294 +129 149 183 294 +130 190 262 294 +133 245 168 294 +145 206 261 294 +151 200 0 294 +176 255 239 294 +177 68 201 294 +180 195 150 294 +212 231 200 294 +228 82 250 294 +237 225 0 294 +241 239 0 294 +247 256 286 294 +1 7 267 295 +6 220 252 295 +11 91 0 295 +16 3 180 295 +33 125 247 295 +54 105 249 295 +75 71 0 295 +83 161 0 295 +97 161 189 295 +107 167 202 295 +111 162 278 295 +112 191 232 295 +113 192 228 295 +120 68 0 295 +126 115 0 295 +134 186 54 295 +137 192 133 295 +141 147 252 295 +149 209 252 295 +166 131 258 295 +177 238 0 295 +185 233 0 295 +185 144 177 295 +218 170 52 295 +242 49 0 295 +243 57 177 295 +254 144 0 295 +9 22 242 296 +11 23 118 296 +13 74 0 296 +27 80 0 296 +37 104 179 296 +49 56 0 296 +76 142 252 296 +99 152 0 296 +103 174 210 296 +137 183 212 296 +146 173 52 296 +154 189 119 296 +185 192 150 296 +193 148 267 296 +194 53 194 296 +213 21 0 296 +215 236 48 296 +243 3 150 296 +249 9 274 296 +11 31 93 297 +20 85 282 297 +36 58 205 297 +38 121 230 297 +64 68 236 297 +75 182 0 297 +75 253 279 297 +100 225 228 297 +128 164 206 297 +140 214 0 297 +185 128 0 297 +224 230 255 297 +226 220 284 297 +232 235 254 297 +241 205 283 297 +52 8 266 298 +79 96 175 298 +80 84 150 298 +97 158 255 298 +103 233 79 298 +109 122 200 298 +120 180 0 298 +122 177 288 298 +137 141 0 298 +143 250 114 298 +156 170 0 298 +160 170 87 298 +177 132 248 298 +180 141 285 298 +205 16 194 298 +207 197 287 298 +208 27 0 298 +224 44 238 298 +241 46 0 298 +248 36 255 298 +253 228 0 298 +256 202 0 298 +1 66 254 299 +13 77 0 299 +15 81 288 299 +18 110 265 299 +23 73 0 299 +31 77 0 299 +41 228 272 299 +49 115 297 299 +63 100 201 299 +69 76 270 299 +77 95 0 299 +107 233 49 299 +123 71 284 299 +125 98 166 299 +133 198 0 299 +137 187 290 299 +156 230 0 299 +163 212 0 299 +171 175 0 299 +174 218 157 299 +180 182 258 299 +185 134 265 299 +193 245 151 299 +210 228 0 299 +6 28 260 300 +24 54 254 300 +30 58 272 300 +34 118 192 300 +52 16 194 300 +79 144 0 300 +93 84 0 300 +100 209 272 300 +103 109 255 300 +103 170 0 300 +104 121 0 300 +112 116 266 300 +120 136 112 300 +133 186 100 300 +138 221 134 300 +147 226 258 300 +148 228 274 300 +155 171 0 300 +185 245 278 300 +201 22 244 300 +206 148 223 300 +214 226 277 300 +231 101 237 300 +231 40 76 300 +243 56 0 300 +247 9 108 300 +255 16 194 300 +5 9 0 301 +17 22 262 301 +21 89 295 301 +33 83 291 301 +64 124 126 301 +69 73 0 301 +85 145 181 301 +85 150 0 301 +90 110 0 301 +98 163 269 301 +101 113 291 301 +103 112 115 301 +130 180 0 301 +153 188 260 301 +159 218 274 301 +159 195 220 301 +166 242 268 301 +168 170 198 301 +178 226 196 301 +180 196 193 301 +190 175 234 301 +191 245 157 301 +194 21 258 301 +196 255 54 301 +205 132 0 301 +205 14 0 301 +218 209 279 301 +222 29 0 301 +229 34 0 301 +46 98 79 302 +57 5 168 302 +59 76 273 302 +64 76 153 302 +65 7 222 302 +78 67 0 302 +78 141 0 302 +79 253 254 302 +84 141 279 302 +133 168 182 302 +148 17 204 302 +161 229 0 302 +185 230 0 302 +187 180 200 302 +198 152 268 302 +208 26 0 302 +217 230 34 302 +245 1 238 302 +6 69 128 303 +12 29 0 303 +25 45 78 303 +47 51 201 303 +52 79 276 303 +54 9 285 303 +80 109 237 303 +111 163 168 303 +113 164 207 303 +128 141 0 303 +131 246 0 303 +149 198 0 303 +154 110 170 303 +162 172 83 303 +179 238 258 303 +186 256 245 303 +199 21 265 303 +200 229 173 303 +204 5 125 303 +204 21 0 303 +204 76 205 303 +207 4 0 303 +211 226 275 303 +214 200 0 303 +220 39 173 303 +229 18 0 303 +231 54 99 303 +27 87 0 304 +52 68 32 304 +90 150 0 304 +96 237 266 304 +102 71 115 304 +108 230 133 304 +113 68 218 304 +113 191 231 304 +133 197 0 304 +134 138 0 304 +134 155 267 304 +149 197 253 304 +153 136 260 304 +172 186 119 304 +207 212 222 304 +213 17 242 304 +215 24 0 304 +225 61 250 304 +244 114 270 304 +254 136 216 304 +26 58 263 305 +32 44 0 305 +34 5 193 305 +46 53 18 305 +47 127 139 305 +65 82 298 305 +85 40 232 305 +91 79 173 305 +94 88 259 305 +101 106 48 305 +104 120 0 305 +118 178 285 305 +124 157 259 305 +174 124 226 305 +174 235 192 305 +200 202 259 305 +216 235 205 305 +223 25 289 305 +253 242 207 305 +255 2 284 305 +7 130 227 306 +8 9 299 306 +19 23 290 306 +25 230 275 306 +37 115 298 306 +41 249 175 306 +43 122 258 306 +56 98 305 306 +65 85 288 306 +99 102 201 306 +110 148 296 306 +116 145 203 306 +134 139 0 306 +156 216 214 306 +173 163 25 306 +176 241 0 306 +187 235 272 306 +194 22 275 306 +227 36 282 306 +241 231 280 306 +253 193 139 306 +17 197 287 307 +27 108 295 307 +28 42 0 307 +30 44 244 307 +52 117 0 307 +59 71 276 307 +92 172 287 307 +93 158 0 307 +104 172 284 307 +116 95 181 307 +116 136 282 307 +123 153 282 307 +131 200 289 307 +134 91 0 307 +138 139 0 307 +139 136 63 307 +155 224 0 307 +166 247 290 307 +167 215 0 307 +168 234 243 307 +171 239 180 307 +190 238 0 307 +205 221 0 307 +212 229 0 307 +227 40 0 307 +254 53 177 307 +6 76 261 308 +20 101 272 308 +34 104 212 308 +42 109 224 308 +44 47 148 308 +51 128 239 308 +52 199 278 308 +64 4 252 308 +66 147 294 308 +67 95 0 308 +87 80 99 308 +92 135 222 308 +96 127 258 308 +104 214 297 308 +113 133 285 308 +163 176 57 308 +168 254 295 308 +181 245 0 308 +184 186 132 308 +225 245 280 308 +237 164 267 308 +252 77 298 308 +254 232 300 308 +16 81 290 309 +37 117 67 309 +64 51 273 309 +71 186 0 309 +84 239 300 309 +99 159 266 309 +114 132 278 309 +126 95 123 309 +130 141 279 309 +137 157 0 309 +150 215 264 309 +154 148 78 309 +193 2 0 309 +224 225 0 309 +241 53 0 309 +244 8 237 309 +11 93 0 310 +12 21 0 310 +18 40 0 310 +49 245 122 310 +54 103 264 310 +88 132 301 310 +93 79 0 310 +120 135 136 310 +128 68 82 310 +132 151 253 310 +135 250 247 310 +140 246 0 310 +147 197 279 310 +152 172 285 310 +157 198 160 310 +183 235 134 310 +185 250 0 310 +212 24 108 310 +214 211 0 310 +242 201 302 310 +248 250 304 310 +12 27 0 311 +17 65 301 311 +46 1 79 311 +80 160 191 311 +91 171 277 311 +134 156 248 311 +137 80 0 311 +141 148 247 311 +159 211 221 311 +163 245 0 311 +177 117 0 311 +227 86 280 311 +239 229 215 311 +33 53 297 312 +48 53 303 312 +74 141 266 312 +83 110 254 312 +85 95 281 312 +88 210 293 312 +106 110 0 312 +107 234 304 312 +126 143 210 312 +128 253 267 312 +152 200 0 312 +159 164 295 312 +187 238 0 312 +204 27 0 312 +227 49 293 312 +235 58 254 312 +253 141 152 312 +11 137 229 313 +32 63 226 313 +55 90 285 313 +56 14 197 313 +73 72 0 313 +73 134 210 313 +84 196 295 313 +84 237 284 313 +88 164 292 313 +88 229 297 313 +104 161 0 313 +119 172 0 313 +127 143 240 313 +143 238 209 313 +150 231 296 313 +158 224 280 313 +175 251 240 313 +176 209 284 313 +180 232 300 313 +183 186 65 313 +204 8 145 313 +215 230 210 313 +215 29 123 313 +238 50 269 313 +239 243 0 313 +253 129 228 313 +256 57 0 313 +10 95 197 314 +14 95 95 314 +30 35 215 314 +32 82 291 314 +38 115 289 314 +64 79 0 314 +80 154 0 314 +86 108 0 314 +118 134 216 314 +125 77 305 314 +128 143 152 314 +134 197 0 314 +155 169 222 314 +183 42 298 314 +187 255 21 314 +195 212 98 314 +229 238 270 314 +239 10 292 314 +241 1 0 314 +19 35 0 315 +30 95 312 315 +31 82 294 315 +44 112 294 315 +46 51 0 315 +52 190 269 315 +87 186 184 315 +109 169 190 315 +115 128 72 315 +118 23 214 315 +124 250 255 315 +138 135 263 315 +145 131 0 315 +156 224 0 315 +207 16 0 315 +214 232 0 315 +227 31 303 315 +232 42 305 315 +14 116 255 316 +31 3 189 316 +31 68 276 316 +36 127 0 316 +42 112 272 316 +44 108 296 316 +64 114 230 316 +64 74 0 316 +65 145 0 316 +88 156 276 316 +96 112 258 316 +106 119 0 316 +111 190 255 316 +124 190 295 316 +131 159 293 316 +154 235 287 316 +157 233 300 316 +177 148 303 316 +177 242 178 316 +194 255 264 316 +199 119 231 316 +223 235 300 316 +229 24 217 316 +230 45 251 316 +236 256 303 316 +239 32 196 316 +243 48 262 316 +17 10 80 317 +19 80 305 317 +26 109 244 317 +32 36 170 317 +41 34 185 317 +48 51 225 317 +51 126 0 317 +64 53 302 317 +67 184 241 317 +80 140 298 317 +84 210 278 317 +92 218 27 317 +107 161 270 317 +138 205 256 317 +155 233 216 317 +174 148 284 317 +177 253 186 317 +183 6 300 317 +183 38 305 317 +194 248 131 317 +215 224 155 317 +217 224 0 317 +227 243 0 317 +227 5 304 317 +241 195 0 317 +247 59 285 317 +1 54 59 318 +29 97 291 318 +30 110 0 318 +31 65 202 318 +38 43 76 318 +39 60 145 318 +97 115 277 318 +124 79 128 318 +127 115 0 318 +128 67 216 318 +134 214 0 318 +136 50 205 318 +139 200 187 318 +165 171 314 318 +170 144 193 318 +173 223 300 318 +181 170 194 318 +187 58 286 318 +189 140 299 318 +222 234 0 318 +228 82 302 318 +229 33 0 318 +236 240 0 318 +241 61 155 318 +5 72 148 319 +29 33 0 319 +29 96 279 319 +31 80 0 319 +38 59 0 319 +42 117 300 319 +48 35 232 319 +55 71 262 319 +57 12 247 319 +63 115 71 319 +66 84 0 319 +69 12 265 319 +78 94 304 319 +97 127 0 319 +98 67 289 319 +118 72 0 319 +118 87 205 319 +138 202 0 319 +139 248 286 319 +155 208 0 319 +177 143 185 319 +179 229 201 319 +180 240 300 319 +180 50 170 319 +183 231 279 319 +188 256 75 319 +193 5 173 319 +195 31 207 319 +196 173 307 319 +213 144 301 319 +241 34 0 319 +243 35 128 319 +248 200 311 319 +7 67 194 320 +28 109 215 320 +48 98 218 320 +49 18 288 320 +54 12 300 320 +54 185 306 320 +60 102 0 320 +78 157 106 320 +89 43 297 320 +114 78 0 320 +116 138 311 320 +125 190 298 320 +138 188 240 320 +155 237 0 320 +160 234 0 320 +174 175 0 320 +179 248 0 320 +183 57 129 320 +212 66 270 320 +212 27 309 320 +3 82 294 321 +11 70 0 321 +16 75 0 321 +26 125 258 321 +29 81 289 321 +37 52 301 321 +38 86 246 321 +39 109 295 321 +45 60 306 321 +54 11 291 321 +63 189 145 321 +65 72 0 321 +107 160 0 321 +116 191 0 321 +126 132 260 321 +153 192 274 321 +163 179 0 321 +214 41 0 321 +223 32 0 321 +225 248 298 321 +253 206 149 321 +17 30 0 322 +17 33 0 322 +18 69 297 322 +26 46 0 322 +38 103 264 322 +43 96 0 322 +43 121 0 322 +46 27 292 322 +46 110 0 322 +56 130 223 322 +62 77 0 322 +94 148 245 322 +96 148 122 322 +96 176 299 322 +104 127 206 322 +142 109 263 322 +147 167 0 322 +164 129 135 322 +175 235 238 322 +177 175 0 322 +177 226 303 322 +183 244 308 322 +191 131 263 322 +191 193 0 322 +205 132 319 322 +206 173 298 322 +208 2 286 322 +212 35 0 322 +226 50 0 322 +245 42 303 322 +5 18 295 323 +15 56 196 323 +22 105 314 323 +26 61 14 323 +31 21 299 323 +32 99 293 323 +36 111 257 323 +36 104 235 323 +56 178 76 323 +57 64 301 323 +74 137 0 323 +168 171 294 323 +170 140 292 323 +188 203 0 323 +194 21 317 323 +210 164 294 323 +213 201 0 323 +237 167 307 323 +241 189 124 323 +251 27 314 323 +255 33 299 323 +8 41 307 324 +27 112 289 324 +32 110 0 324 +34 120 249 324 +43 111 287 324 +46 81 290 324 +49 40 0 324 +79 191 0 324 +86 165 0 324 +89 169 189 324 +93 157 0 324 +95 160 224 324 +113 189 0 324 +114 14 192 324 +127 165 271 324 +128 162 295 324 +152 162 0 324 +154 141 238 324 +156 176 300 324 +158 218 117 324 +163 180 250 324 +192 198 309 324 +195 15 247 324 +203 59 309 324 +207 200 188 324 +225 2 258 324 +228 21 305 324 +234 175 0 324 +4 33 316 325 +15 67 197 325 +46 109 254 325 +93 76 43 325 +107 157 0 325 +125 75 149 325 +132 195 0 325 +154 159 0 325 +159 202 303 325 +162 189 296 325 +190 77 0 325 +193 1 0 325 +197 12 312 325 +211 228 165 325 +215 208 99 325 +215 235 65 325 +225 35 240 325 +237 230 241 325 +245 60 312 325 +246 12 287 325 +255 51 279 325 +8 101 311 326 +9 93 305 326 +10 94 79 326 +19 99 0 326 +38 98 278 326 +85 137 312 326 +111 113 121 326 +115 164 0 326 +124 234 303 326 +125 189 0 326 +136 17 220 326 +138 189 256 326 +153 158 102 326 +163 240 279 326 +170 230 34 326 +227 248 321 326 +234 218 0 326 +247 39 169 326 +253 1 299 326 +253 244 0 326 +7 122 308 327 +10 81 241 327 +23 88 317 327 +27 111 286 327 +31 66 229 327 +31 95 0 327 +37 53 0 327 +39 125 294 327 +46 113 297 327 +49 50 0 327 +56 137 299 327 +74 71 0 327 +85 146 0 327 +87 96 290 327 +91 150 271 327 +94 159 267 327 +116 141 211 327 +122 71 116 327 +130 101 317 327 +152 232 78 327 +157 209 309 327 +161 235 305 327 +204 41 26 327 +210 5 309 327 +217 235 0 327 +225 41 287 327 +233 42 307 327 +234 182 313 327 +242 6 297 327 +247 106 287 327 +1 199 241 328 +5 12 256 328 +53 67 281 328 +54 104 202 328 +156 235 0 328 +177 163 0 328 +185 75 0 328 +201 118 306 328 +211 25 307 328 +234 220 0 328 +241 143 169 328 +248 201 283 328 +1 31 200 329 +7 74 306 329 +55 98 306 329 +57 122 301 329 +63 77 0 329 +65 110 325 329 +84 150 299 329 +85 151 322 329 +98 161 0 329 +103 168 0 329 +109 98 323 329 +118 67 0 329 +119 75 0 329 +126 76 220 329 +154 234 0 329 +158 223 282 329 +163 127 188 329 +166 232 239 329 +176 218 0 329 +191 179 0 329 +211 41 230 329 +6 58 299 330 +9 71 154 330 +14 32 272 330 +18 39 131 330 +46 32 0 330 +59 16 197 330 +61 29 289 330 +74 141 325 330 +81 36 258 330 +123 249 42 330 +135 150 201 330 +136 200 0 330 +176 221 288 330 +176 226 163 330 +186 129 318 330 +194 1 231 330 +220 42 0 330 +229 21 34 330 +248 42 193 330 +252 122 298 330 +2 33 276 331 +31 225 312 331 +32 18 210 331 +33 109 322 331 +35 95 308 331 +58 112 273 331 +62 110 0 331 +80 156 242 331 +82 110 53 331 +84 209 224 331 +92 140 0 331 +100 159 264 331 +118 64 308 331 +122 140 298 331 +151 233 0 331 +153 221 124 331 +154 121 315 331 +173 202 303 331 +174 164 0 331 +175 34 310 331 +177 168 295 331 +178 245 0 331 +183 199 277 331 +195 225 318 331 +214 225 291 331 +241 240 178 331 +245 200 312 331 +13 5 246 332 +36 59 317 332 +53 117 0 332 +55 64 277 332 +61 11 309 332 +66 146 132 332 +100 229 222 332 +101 145 303 332 +109 113 314 332 +109 176 302 332 +123 166 279 332 +138 159 0 332 +148 167 325 332 +151 144 270 332 +152 197 272 332 +217 171 0 332 +227 39 184 332 +228 1 236 332 +228 40 72 332 +22 35 330 333 +32 33 0 333 +37 86 0 333 +52 67 164 333 +72 91 195 333 +81 100 139 333 +87 147 309 333 +101 181 0 333 +131 188 328 333 +153 88 293 333 +165 231 272 333 +171 250 308 333 +194 159 236 333 +197 220 264 333 +200 14 296 333 +207 31 92 333 +207 3 0 333 +223 9 307 333 +228 54 128 333 +233 232 234 333 +234 26 112 333 +238 43 329 333 +241 253 0 333 +254 184 199 333 +15 10 0 334 +22 247 322 334 +26 59 10 334 +40 133 310 334 +49 38 291 334 +49 54 29 334 +52 122 235 334 +57 119 170 334 +59 75 0 334 +60 112 224 334 +77 192 166 334 +106 96 240 334 +137 187 328 334 +141 218 254 334 +145 213 284 334 +148 241 295 334 +153 173 316 334 +165 188 324 334 +168 254 326 334 +217 173 300 334 +224 41 207 334 +247 45 219 334 +4 99 174 335 +27 20 194 335 +70 124 0 335 +100 222 251 335 +102 168 186 335 +123 191 0 335 +154 221 0 335 +162 238 266 335 +179 232 0 335 +191 143 0 335 +200 225 313 335 +229 248 66 335 +233 187 329 335 +235 238 329 335 +236 105 185 335 +242 228 228 335 +21 99 302 336 +24 87 291 336 +33 39 325 336 +33 95 313 336 +42 73 276 336 +63 78 130 336 +70 67 313 336 +75 137 0 336 +82 89 328 336 +118 108 295 336 +122 137 108 336 +130 150 148 336 +148 176 0 336 +149 100 202 336 +156 172 0 336 +163 243 279 336 +233 250 324 336 +238 20 333 336 +247 6 282 336 +256 243 304 336 +1 200 288 337 +1 11 317 337 +18 86 251 337 +26 240 0 337 +34 117 0 337 +40 110 248 337 +41 32 326 337 +43 11 314 337 +74 122 0 337 +74 158 310 337 +78 90 307 337 +79 127 224 337 +80 94 0 337 +84 160 145 337 +96 169 0 337 +107 189 0 337 +117 69 0 337 +120 166 0 337 +128 138 0 337 +137 144 0 337 +155 197 265 337 +156 219 304 337 +172 42 314 337 +174 166 285 337 +175 20 327 337 +194 53 320 337 +197 219 320 337 +235 256 263 337 +15 79 0 338 +23 44 314 338 +45 10 289 338 +45 41 0 338 +49 110 0 338 +50 51 299 338 +53 71 320 338 +142 209 0 338 +150 218 186 338 +156 159 304 338 +160 172 315 338 +162 232 193 338 +167 22 326 338 +175 17 336 338 +186 221 328 338 +188 197 188 338 +191 244 0 338 +199 115 330 338 +203 25 249 338 +210 167 0 338 +210 226 0 338 +240 243 271 338 +246 11 289 338 +247 58 0 338 +250 59 318 338 +254 52 328 338 +256 36 325 338 +12 72 130 339 +31 2 0 339 +37 55 0 339 +45 57 220 339 +45 109 0 339 +57 101 329 339 +62 116 302 339 +66 116 194 339 +68 146 0 339 +74 30 294 339 +74 79 0 339 +116 77 0 339 +141 173 290 339 +142 161 242 339 +166 247 316 339 +168 244 316 339 +173 209 61 339 +175 31 328 339 +211 239 235 339 +215 12 0 339 +222 208 316 339 +225 49 267 339 +234 255 327 339 +235 47 335 339 +251 11 288 339 +254 50 0 339 +255 63 0 339 +10 4 213 340 +25 76 262 340 +49 5 323 340 +82 92 323 340 +83 92 319 340 +89 134 0 340 +109 161 0 340 +137 197 327 340 +157 148 81 340 +157 223 301 340 +171 236 213 340 +178 191 0 340 +183 248 0 340 +188 155 249 340 +196 237 302 340 +199 119 322 340 +216 228 217 340 +227 44 301 340 +1 116 253 341 +3 18 99 341 +7 115 315 341 +15 66 192 341 +26 48 0 341 +31 15 0 341 +34 104 336 341 +39 146 329 341 +49 65 319 341 +71 179 334 341 +78 113 260 341 +89 150 0 341 +93 138 0 341 +93 145 219 341 +105 149 335 341 +107 233 321 341 +114 179 321 341 +120 129 140 341 +136 244 322 341 +138 132 313 341 +148 162 258 341 +183 144 161 341 +185 176 330 341 +193 13 203 341 +196 219 225 341 +199 69 36 341 +214 197 253 341 +252 56 309 341 +253 201 322 341 +10 80 111 342 +22 33 318 342 +23 101 0 342 +39 83 327 342 +46 248 337 342 +50 250 304 342 +84 149 0 342 +104 229 299 342 +106 73 119 342 +133 68 338 342 +152 218 299 342 +160 208 330 342 +174 192 143 342 +181 123 289 342 +224 225 327 342 +233 41 0 342 +236 40 304 342 +237 43 309 342 +250 11 267 342 +254 14 323 342 +14 8 31 343 +17 16 0 343 +26 47 0 343 +27 94 0 343 +30 44 318 343 +30 59 330 343 +31 97 247 343 +40 92 335 343 +47 105 280 343 +53 126 311 343 +93 27 0 343 +94 88 335 343 +111 240 327 343 +121 179 330 343 +121 189 0 343 +128 173 341 343 +136 209 0 343 +153 152 318 343 +172 26 314 343 +175 255 242 343 +185 245 311 343 +211 31 172 343 +213 165 327 343 +217 203 326 343 +222 226 132 343 +231 82 324 343 +231 101 325 343 +238 47 331 343 +238 58 222 343 +241 49 0 343 +256 63 303 343 +8 88 310 344 +18 98 0 344 +20 90 264 344 +49 14 327 344 +51 7 290 344 +53 66 316 344 +64 177 328 344 +77 140 290 344 +83 163 0 344 +125 177 300 344 +126 130 257 344 +134 198 0 344 +141 209 226 344 +148 224 269 344 +235 246 338 344 +242 49 317 344 +254 194 27 344 +256 78 332 344 +21 39 133 345 +22 19 330 345 +23 39 0 345 +27 48 229 345 +41 92 330 345 +44 92 327 345 +57 125 292 345 +68 192 149 345 +127 205 308 345 +148 127 181 345 +174 75 240 345 +196 224 112 345 +198 152 324 345 +202 235 260 345 +202 23 322 345 +208 30 0 345 +213 209 244 345 +234 46 325 345 +242 200 0 345 +242 199 0 345 +245 250 277 345 +17 219 270 346 +17 224 0 346 +24 92 303 346 +30 90 286 346 +33 83 317 346 +49 126 321 346 +54 11 334 346 +62 114 170 346 +63 121 88 346 +71 91 0 346 +93 99 254 346 +97 128 322 346 +105 151 337 346 +109 99 124 346 +123 183 225 346 +125 173 343 346 +129 182 297 346 +133 198 329 346 +167 38 329 346 +168 131 177 346 +169 249 290 346 +170 235 23 346 +177 176 0 346 +178 168 0 346 +181 170 328 346 +184 232 184 346 +185 189 0 346 +190 161 146 346 +5 34 323 347 +9 126 313 347 +22 101 303 347 +57 105 159 347 +59 12 256 347 +68 193 111 347 +71 77 176 347 +112 77 61 347 +139 192 0 347 +149 198 332 347 +184 207 324 347 +184 53 325 347 +191 129 0 347 +210 165 0 347 +232 52 343 347 +237 249 0 347 +246 55 306 347 +252 12 0 347 +1 69 48 348 +4 145 94 348 +4 132 269 348 +10 47 197 348 +11 71 0 348 +13 126 0 348 +14 69 176 348 +15 69 179 348 +27 76 0 348 +40 52 0 348 +55 92 325 348 +66 33 282 348 +74 19 256 348 +102 178 107 348 +134 180 332 348 +138 158 0 348 +141 208 313 348 +142 134 329 348 +146 102 324 348 +153 103 317 348 +178 194 129 348 +185 230 322 348 +252 73 140 348 +6 53 171 349 +16 27 0 349 +17 81 250 349 +23 37 300 349 +26 239 105 349 +27 96 0 349 +28 83 330 349 +51 119 304 349 +51 71 318 349 +59 110 0 349 +74 47 304 349 +81 86 321 349 +89 149 265 349 +113 79 0 349 +114 110 231 349 +118 178 339 349 +127 226 259 349 +153 206 169 349 +155 196 143 349 +167 227 320 349 +185 233 323 349 +189 249 199 349 +204 78 346 349 +225 30 0 349 +227 101 203 349 +233 253 323 349 +245 56 312 349 +13 10 0 350 +26 90 0 350 +66 94 42 350 +72 213 302 350 +74 155 326 350 +83 151 0 350 +84 152 0 350 +87 146 301 350 +89 101 187 350 +96 127 328 350 +97 52 284 350 +97 158 323 350 +100 102 122 350 +108 73 282 350 +115 73 320 350 +137 77 185 350 +137 183 320 350 +144 16 316 350 +196 203 123 350 +196 202 136 350 +210 198 326 350 +211 53 327 350 +212 235 306 350 +238 13 222 350 +256 17 342 350 +5 15 199 351 +6 3 100 351 +18 88 248 351 +21 88 312 351 +34 110 279 351 +56 12 274 351 +82 105 328 351 +94 104 280 351 +106 11 251 351 +111 175 0 351 +112 113 209 351 +112 116 326 351 +114 14 340 351 +137 157 332 351 +144 196 141 351 +195 7 221 351 +212 10 248 351 +224 33 0 351 +227 247 314 351 +229 243 0 351 +234 48 330 351 +237 25 341 351 +248 6 140 351 +16 28 329 352 +25 45 323 352 +28 154 343 352 +49 98 0 352 +53 98 270 352 +66 132 233 352 +80 90 0 352 +81 104 332 352 +89 44 216 352 +93 69 335 352 +121 169 0 352 +126 69 169 352 +133 213 264 352 +135 6 59 352 +144 156 276 352 +146 92 285 352 +161 162 0 352 +214 204 306 352 +225 243 0 352 +234 239 0 352 +245 6 289 352 +12 120 290 353 +66 133 329 353 +78 128 0 353 +93 126 225 353 +100 225 336 353 +101 181 342 353 +102 179 203 353 +111 189 0 353 +124 172 45 353 +127 239 329 353 +136 50 332 353 +164 230 313 353 +164 255 314 353 +166 131 329 353 +195 52 327 353 +198 157 329 353 +213 231 0 353 +215 29 325 353 +236 30 266 353 +28 107 0 354 +32 173 340 354 +41 88 347 354 +49 245 330 354 +76 154 310 354 +83 103 273 354 +125 73 294 354 +127 129 238 354 +159 224 284 354 +163 212 344 354 +175 216 324 354 +188 203 341 354 +191 209 343 354 +228 41 342 354 +234 238 0 354 +244 6 304 354 +255 33 336 354 +1 63 0 355 +39 72 310 355 +48 107 288 355 +49 114 0 355 +60 78 338 355 +60 124 0 355 +67 151 300 355 +71 138 0 355 +77 155 308 355 +82 150 309 355 +84 132 169 355 +89 21 318 355 +93 130 321 355 +115 137 320 355 +117 170 337 355 +145 160 136 355 +162 238 337 355 +183 186 327 355 +185 71 0 355 +196 160 183 355 +201 218 344 355 +205 249 290 355 +220 251 302 355 +223 240 345 355 +247 59 338 355 +2 28 327 356 +38 251 330 356 +39 165 322 356 +53 7 0 356 +62 77 333 356 +100 147 228 356 +107 158 0 356 +111 148 0 356 +112 177 280 356 +118 3 0 356 +138 154 0 356 +140 203 0 356 +159 164 334 356 +162 229 0 356 +169 216 278 356 +174 177 282 356 +183 251 108 356 +191 232 345 356 +202 26 191 356 +210 231 0 356 +215 199 302 356 +219 209 298 356 +219 20 229 356 +224 16 314 356 +235 10 303 356 +240 47 349 356 +242 211 328 356 +253 30 331 356 +16 90 313 357 +34 55 203 357 +37 99 189 357 +39 87 312 357 +46 64 279 357 +53 118 0 357 +53 116 285 357 +75 206 251 357 +92 165 201 357 +99 102 322 357 +100 173 0 357 +119 198 341 357 +142 136 226 357 +180 194 51 357 +185 249 0 357 +198 220 0 357 +200 69 290 357 +215 206 188 357 +219 236 47 357 +219 43 0 357 +224 253 326 357 +246 59 315 357 +6 120 330 358 +28 55 207 358 +28 102 299 358 +30 58 325 358 +41 33 334 358 +50 21 340 358 +64 4 331 358 +81 132 324 358 +90 84 323 358 +93 84 331 358 +94 177 300 358 +101 110 256 358 +111 177 0 358 +113 129 223 358 +157 196 251 358 +158 223 340 358 +160 175 0 358 +181 150 333 358 +181 169 287 358 +191 235 351 358 +198 221 101 358 +204 70 172 358 +208 64 0 358 +213 23 355 358 +216 226 0 358 +2 130 311 359 +51 126 346 359 +63 123 161 359 +66 142 218 359 +84 107 336 359 +90 150 323 359 +92 218 354 359 +116 136 351 359 +117 169 344 359 +117 172 350 359 +124 166 193 359 +136 17 348 359 +143 14 335 359 +155 223 71 359 +162 243 292 359 +167 170 0 359 +173 253 260 359 +185 241 323 359 +190 181 354 359 +191 224 340 359 +202 29 162 359 +206 10 304 359 +216 38 287 359 +219 78 334 359 +224 238 314 359 +254 195 0 359 +10 19 211 360 +24 106 325 360 +32 138 321 360 +34 120 331 360 +46 125 0 360 +55 169 346 360 +62 30 269 360 +62 128 77 360 +64 12 0 360 +83 165 0 360 +121 172 94 360 +125 171 348 360 +131 243 303 360 +149 229 0 360 +158 206 103 360 +167 139 348 360 +185 150 333 360 +207 52 313 360 +28 35 295 361 +34 99 285 361 +54 9 339 361 +58 128 264 361 +73 170 336 361 +81 134 345 361 +101 152 346 361 +104 148 287 361 +109 121 205 361 +119 187 338 361 +128 171 340 361 +133 139 7 361 +163 22 334 361 +178 68 327 361 +180 136 166 361 +188 247 80 361 +200 71 324 361 +201 12 13 361 +202 256 344 361 +16 20 307 362 +55 90 331 362 +56 9 297 362 +64 3 244 362 +66 80 308 362 +68 136 61 362 +82 87 311 362 +109 156 286 362 +115 129 140 362 +121 171 290 362 +139 151 0 362 +160 209 0 362 +187 135 355 362 +188 197 352 362 +204 8 344 362 +241 139 329 362 +13 65 226 363 +24 102 317 363 +25 38 228 363 +25 106 306 363 +28 40 80 363 +51 15 163 363 +66 137 358 363 +69 151 326 363 +81 146 0 363 +89 80 0 363 +91 171 345 363 +104 147 286 363 +110 178 305 363 +123 143 126 363 +147 223 334 363 +160 148 0 363 +188 235 339 363 +209 45 345 363 +233 247 0 363 +241 135 339 363 +247 250 0 363 +16 96 338 364 +27 87 328 364 +42 15 344 364 +50 52 307 364 +51 67 188 364 +67 241 337 364 +81 149 334 364 +109 170 285 364 +117 67 0 364 +119 170 192 364 +141 147 319 364 +161 241 61 364 +200 12 270 364 +204 77 343 364 +204 89 311 364 +207 221 217 364 +225 38 288 364 +236 240 327 364 +244 114 339 364 +245 54 0 364 +4 134 328 365 +5 65 0 365 +10 20 162 365 +32 86 337 365 +36 109 0 365 +40 146 349 365 +49 205 330 365 +50 118 311 365 +52 178 343 365 +55 174 353 365 +70 16 271 365 +125 15 307 365 +144 223 144 365 +189 62 362 365 +199 2 0 365 +228 230 297 365 +231 23 243 365 +2 120 329 366 +4 96 144 366 +30 35 349 366 +35 102 0 366 +41 102 332 366 +50 204 321 366 +55 154 342 366 +68 88 325 366 +73 135 361 366 +85 33 276 366 +134 217 209 366 +191 168 281 366 +200 82 334 366 +216 235 350 366 +249 240 0 366 +3 178 329 367 +14 21 185 367 +32 76 307 367 +37 245 0 367 +39 181 293 367 +45 255 242 367 +79 144 339 367 +85 90 353 367 +108 128 266 367 +116 241 343 367 +143 160 326 367 +222 17 0 367 +231 251 349 367 +240 205 272 367 +244 54 142 367 +46 93 348 368 +56 85 284 368 +56 181 213 368 +67 194 294 368 +81 98 128 368 +84 112 343 368 +88 132 323 368 +97 39 359 368 +116 193 276 368 +119 72 139 368 +126 76 355 368 +137 150 347 368 +161 165 0 368 +216 236 107 368 +246 8 357 368 +251 199 343 368 +252 208 68 368 +2 7 0 369 +12 157 357 369 +34 3 201 369 +37 27 350 369 +43 60 262 369 +70 138 0 369 +73 128 248 369 +85 44 323 369 +91 68 251 369 +98 133 357 369 +100 176 227 369 +121 183 324 369 +130 194 0 369 +160 31 331 369 +183 194 167 369 +213 21 347 369 +246 44 291 369 +41 90 300 370 +51 128 344 370 +61 244 0 370 +81 110 146 370 +93 21 324 370 +96 99 178 370 +141 223 227 370 +170 249 0 370 +179 201 356 370 +189 45 344 370 +200 231 241 370 +200 53 291 370 +208 20 200 370 +235 106 313 370 +4 71 346 371 +35 146 275 371 +43 102 352 371 +49 125 258 371 +50 9 321 371 +68 143 0 371 +69 86 305 371 +103 121 0 371 +110 162 256 371 +114 7 0 371 +124 128 0 371 +124 250 352 371 +125 96 200 371 +138 206 146 371 +149 140 241 371 +155 197 350 371 +165 216 232 371 +172 226 359 371 +184 226 344 371 +186 256 345 371 +188 256 344 371 +204 74 151 371 +211 6 0 371 +228 63 346 371 +256 43 281 371 +4 79 0 372 +12 105 341 372 +32 158 311 372 +33 40 0 372 +43 128 327 372 +50 23 319 372 +90 151 319 372 +106 128 0 372 +122 192 156 372 +124 234 346 372 +134 95 360 372 +142 221 161 372 +161 212 326 372 +183 197 0 372 +196 21 362 372 +203 77 348 372 +211 231 22 372 +223 21 366 372 +231 85 303 372 +252 15 345 372 +6 54 139 373 +19 29 211 373 +30 34 305 373 +31 240 331 373 +46 58 207 373 +69 76 337 373 +73 134 331 373 +78 76 162 373 +120 135 356 373 +124 189 192 373 +139 206 0 373 +141 193 205 373 +145 141 0 373 +172 45 315 373 +172 201 340 373 +174 167 358 373 +183 252 0 373 +209 238 282 373 +211 56 349 373 +227 97 111 373 +228 244 0 373 +229 238 351 373 +230 199 346 373 +238 52 295 373 +240 58 85 373 +246 118 260 373 +5 14 33 374 +22 12 0 374 +51 110 0 374 +74 75 0 374 +87 186 352 374 +94 112 270 374 +110 104 223 374 +120 130 0 374 +181 164 0 374 +208 60 336 374 +214 236 0 374 +215 231 0 374 +241 225 0 374 +251 106 288 374 +23 105 278 375 +32 174 331 375 +46 52 0 375 +57 115 315 375 +75 96 330 375 +78 89 323 375 +83 110 354 375 +124 131 329 375 +134 150 0 375 +141 203 158 375 +143 250 361 375 +145 129 0 375 +215 225 354 375 +230 243 294 375 +236 28 53 375 +237 206 271 375 +242 232 0 375 +244 51 167 375 +3 83 295 376 +7 86 296 376 +13 48 195 376 +47 174 268 376 +50 7 0 376 +55 133 357 376 +60 126 329 376 +72 135 0 376 +91 174 350 376 +96 132 315 376 +106 91 359 376 +112 192 0 376 +147 161 0 376 +156 206 236 376 +162 230 321 376 +218 23 325 376 +219 19 287 376 +241 231 371 376 +246 256 257 376 +6 85 255 377 +17 20 0 377 +39 150 249 377 +56 178 328 377 +73 141 373 377 +85 33 367 377 +85 146 365 377 +94 146 186 377 +96 171 0 377 +103 173 374 377 +132 223 309 377 +134 146 286 377 +138 135 350 377 +151 197 0 377 +154 234 365 377 +173 164 0 377 +180 184 0 377 +187 246 0 377 +189 203 338 377 +194 148 346 377 +213 50 222 377 +215 2 371 377 +234 254 309 377 +235 38 94 377 +249 54 346 377 +3 70 297 378 +3 18 351 378 +40 53 0 378 +49 42 330 378 +92 135 358 378 +123 253 193 378 +142 193 0 378 +153 105 305 378 +172 241 331 378 +181 69 245 378 +186 253 0 378 +233 41 353 378 +242 139 180 378 +246 38 110 378 +252 13 0 378 +254 203 0 378 +22 7 223 379 +24 89 0 379 +51 133 296 379 +60 70 0 379 +109 171 12 379 +113 181 232 379 +123 254 349 379 +124 183 225 379 +129 182 358 379 +143 194 240 379 +144 151 366 379 +167 179 0 379 +170 256 348 379 +183 187 0 379 +183 201 128 379 +190 68 0 379 +190 130 321 379 +199 115 351 379 +219 212 272 379 +228 52 0 379 +245 38 0 379 +247 24 327 379 +247 118 255 379 +19 224 281 380 +32 157 307 380 +34 44 282 380 +70 130 0 380 +86 165 348 380 +94 91 0 380 +144 254 324 380 +149 196 354 380 +153 80 0 380 +180 182 312 380 +185 230 365 380 +187 204 345 380 +219 89 332 380 +222 19 363 380 +225 20 163 380 +237 209 108 380 +238 247 358 380 +247 40 261 380 +251 27 377 380 +5 52 0 381 +23 18 0 381 +61 207 0 381 +69 88 310 381 +80 145 0 381 +82 103 0 381 +90 171 20 381 +94 101 277 381 +107 119 368 381 +110 115 0 381 +112 191 333 381 +131 139 161 381 +138 198 125 381 +162 169 340 381 +172 253 301 381 +191 250 338 381 +194 21 344 381 +219 41 0 381 +233 188 85 381 +238 30 168 381 +249 253 0 381 +252 125 339 381 +4 97 56 382 +6 220 343 382 +25 105 0 382 +33 84 349 382 +37 54 22 382 +39 169 288 382 +54 116 366 382 +56 73 0 382 +68 129 0 382 +82 51 358 382 +99 127 123 382 +114 75 360 382 +125 33 353 382 +137 129 351 382 +154 217 0 382 +173 45 348 382 +179 230 0 382 +189 206 350 382 +197 218 315 382 +202 23 364 382 +204 26 0 382 +242 159 373 382 +243 57 325 382 +249 61 0 382 +254 186 317 382 +254 251 268 382 +3 85 233 383 +3 130 225 383 +11 117 304 383 +12 120 361 383 +24 115 363 383 +39 120 379 383 +47 107 252 383 +55 124 0 383 +57 53 0 383 +78 157 347 383 +85 137 351 383 +91 107 0 383 +95 101 308 383 +123 157 343 383 +130 242 362 383 +149 129 335 383 +166 184 138 383 +194 243 141 383 +200 10 343 383 +210 50 334 383 +220 38 0 383 +223 227 348 383 +230 50 322 383 +238 248 271 383 +32 80 144 384 +36 58 307 384 +47 122 349 384 +50 211 209 384 +56 72 134 384 +60 10 346 384 +67 182 249 384 +69 147 326 384 +75 76 0 384 +81 149 372 384 +82 71 338 384 +86 167 368 384 +100 152 127 384 +105 167 362 384 +135 204 304 384 +170 141 356 384 +172 189 0 384 +179 232 345 384 +183 194 379 384 +184 230 304 384 +185 131 262 384 +187 61 100 384 +203 7 326 384 +216 232 0 384 +218 27 350 384 +239 227 243 384 +242 198 319 384 +252 43 267 384 +255 208 197 384 +1 200 367 385 +16 90 372 385 +24 106 379 385 +39 199 368 385 +51 178 13 385 +62 60 156 385 +66 133 377 385 +66 145 0 385 +75 130 338 385 +111 164 168 385 +126 178 322 385 +148 168 306 385 +159 212 315 385 +166 249 0 385 +190 133 328 385 +196 163 312 385 +200 9 252 385 +213 201 339 385 +230 248 0 385 +247 35 344 385 +249 59 346 385 +251 125 343 385 +253 206 356 385 +255 5 217 385 +255 2 351 385 +9 28 369 386 +12 85 0 386 +26 109 372 386 +27 91 0 386 +29 33 376 386 +35 110 0 386 +37 30 348 386 +51 181 190 386 +81 90 379 386 +87 157 21 386 +110 146 241 386 +117 134 340 386 +131 246 374 386 +148 238 279 386 +153 142 160 386 +158 171 0 386 +175 224 0 386 +185 168 0 386 +185 176 367 386 +188 141 371 386 +220 10 311 386 +5 28 364 387 +8 130 200 387 +33 109 370 387 +41 43 0 387 +66 35 276 387 +89 149 378 387 +94 128 302 387 +117 76 348 387 +137 242 357 387 +139 189 312 387 +147 167 380 387 +148 37 370 387 +182 50 232 387 +191 45 324 387 +194 209 227 387 +210 222 0 387 +220 247 11 387 +223 33 370 387 +241 195 359 387 +243 54 0 387 +249 243 342 387 +252 121 375 387 +1 209 370 388 +7 92 380 388 +20 125 255 388 +32 92 320 388 +47 112 251 388 +50 215 289 388 +55 123 345 388 +74 86 316 388 +81 88 0 388 +87 77 255 388 +107 167 348 388 +108 179 226 388 +114 137 355 388 +115 134 317 388 +121 153 350 388 +145 110 333 388 +160 108 351 388 +162 188 348 388 +166 152 0 388 +190 193 0 388 +198 141 289 388 +209 22 377 388 +226 249 362 388 +226 38 278 388 +247 39 353 388 +249 55 377 388 +250 207 336 388 +27 47 0 389 +30 96 383 389 +31 96 375 389 +74 87 0 389 +81 109 41 389 +108 189 0 389 +136 209 357 389 +141 250 345 389 +161 61 306 389 +162 175 0 389 +176 218 355 389 +206 58 378 389 +222 238 0 389 +241 249 343 389 +2 31 369 390 +11 89 336 390 +21 97 297 390 +66 33 362 390 +91 103 270 390 +107 181 364 390 +118 69 0 390 +124 108 0 390 +138 151 0 390 +144 207 0 390 +148 18 357 390 +153 88 371 390 +158 225 340 390 +161 254 300 390 +169 188 299 390 +183 198 231 390 +232 40 313 390 +241 230 293 390 +244 216 388 390 +244 8 323 390 +249 41 356 390 +254 46 317 390 +9 89 309 391 +20 101 323 391 +41 103 295 391 +46 63 0 391 +52 54 142 391 +56 67 0 391 +56 134 292 391 +62 208 191 391 +63 99 271 391 +114 130 0 391 +116 71 339 391 +124 136 379 391 +133 213 372 391 +142 146 213 391 +143 1 331 391 +170 254 339 391 +176 221 351 391 +186 204 355 391 +27 96 378 392 +31 68 373 392 +31 95 373 392 +33 95 364 392 +33 110 0 392 +47 96 0 392 +65 192 362 392 +90 160 117 392 +94 113 283 392 +106 96 353 392 +125 84 332 392 +140 206 103 392 +147 165 0 392 +161 235 351 392 +163 22 373 392 +166 139 282 392 +193 1 339 392 +209 66 383 392 +243 197 330 392 +246 202 356 392 +17 216 0 393 +32 84 314 393 +50 60 301 393 +59 120 359 393 +78 30 388 393 +80 90 367 393 +101 113 342 393 +108 245 376 393 +118 138 389 393 +119 67 0 393 +130 86 270 393 +137 88 332 393 +151 186 247 393 +160 172 352 393 +168 22 383 393 +170 180 357 393 +173 189 0 393 +213 246 364 393 +236 40 367 393 +12 157 384 394 +24 57 315 394 +25 43 0 394 +37 57 72 394 +39 112 363 394 +44 122 383 394 +66 94 361 394 +67 151 365 394 +72 105 302 394 +74 106 354 394 +76 141 62 394 +86 152 318 394 +118 87 381 394 +130 213 0 394 +132 146 0 394 +134 184 0 394 +138 217 0 394 +156 224 368 394 +158 156 90 394 +161 45 331 394 +172 240 305 394 +185 167 0 394 +196 213 298 394 +217 246 377 394 +228 97 117 394 +245 250 376 394 +6 218 338 395 +7 74 335 395 +8 149 371 395 +12 86 273 395 +29 96 367 395 +69 145 183 395 +72 104 311 395 +76 217 322 395 +80 145 386 395 +83 152 0 395 +87 138 0 395 +90 155 322 395 +111 146 0 395 +124 202 348 395 +133 147 367 395 +135 244 376 395 +161 224 276 395 +165 188 370 395 +220 24 125 395 +226 244 0 395 +4 79 386 396 +19 216 387 396 +71 88 320 396 +74 79 388 396 +76 80 0 396 +100 167 152 396 +110 164 246 396 +119 139 305 396 +129 184 0 396 +130 163 388 396 +171 229 381 396 +218 240 0 396 +220 249 7 396 +249 38 0 396 +253 53 378 396 +10 106 338 397 +37 2 369 397 +66 41 354 397 +74 156 312 397 +81 79 383 397 +93 33 270 397 +107 150 0 397 +111 98 115 397 +114 100 359 397 +114 129 0 397 +142 99 267 397 +167 188 275 397 +188 247 378 397 +200 202 324 397 +207 3 369 397 +211 93 336 397 +223 3 370 397 +5 85 278 398 +25 236 49 398 +29 107 377 398 +33 83 369 398 +45 36 0 398 +47 58 249 398 +50 8 0 398 +60 126 395 398 +102 124 0 398 +104 152 173 398 +112 181 374 398 +131 197 0 398 +146 209 0 398 +154 185 342 398 +155 237 335 398 +159 152 226 398 +159 163 195 398 +173 220 394 398 +193 215 348 398 +201 10 326 398 +205 219 365 398 +205 16 361 398 +213 146 0 398 +220 45 0 398 +232 39 369 398 +236 24 176 398 +244 209 368 398 +23 92 370 399 +32 63 346 399 +35 120 371 399 +42 105 0 399 +54 178 332 399 +55 114 387 399 +63 189 392 399 +75 191 375 399 +84 189 391 399 +112 169 0 399 +128 141 381 399 +135 50 154 399 +142 156 182 399 +166 229 0 399 +181 167 0 399 +184 216 370 399 +193 243 307 399 +203 48 330 399 +205 157 369 399 +213 6 0 399 +21 99 386 400 +75 207 368 400 +116 242 349 400 +122 189 0 400 +127 121 385 400 +137 132 359 400 +137 147 347 400 +139 60 376 400 +140 203 361 400 +197 53 326 400 +213 148 313 400 +214 221 294 400 +227 27 385 400 +235 106 372 400 +252 15 389 400 +255 223 364 400 +7 138 361 401 +9 8 326 401 +26 105 0 401 +31 109 348 401 +36 84 328 401 +37 66 336 401 +39 185 320 401 +43 122 329 401 +62 206 354 401 +103 168 359 401 +117 122 291 401 +130 137 189 401 +153 187 339 401 +174 100 233 401 +178 226 382 401 +181 136 335 401 +197 227 371 401 +203 199 311 401 +210 239 0 401 +211 31 366 401 +218 30 0 401 +241 135 371 401 +252 122 367 401 +253 244 347 401 +4 94 0 402 +22 232 280 402 +28 35 399 402 +30 106 271 402 +57 122 380 402 +66 97 161 402 +70 138 374 402 +87 155 0 402 +100 102 390 402 +102 167 39 402 +129 135 180 402 +168 188 88 402 +183 243 284 402 +183 250 0 402 +207 200 388 402 +224 14 379 402 +250 16 390 402 +10 87 348 403 +11 70 343 403 +17 8 0 403 +31 89 344 403 +68 111 365 403 +88 108 378 403 +97 72 341 403 +113 189 387 403 +118 107 354 403 +129 50 375 403 +134 140 0 403 +138 189 368 403 +151 202 0 403 +182 247 381 403 +184 187 296 403 +195 248 0 403 +207 15 0 403 +231 106 387 403 +239 227 394 403 +30 44 371 404 +31 33 0 404 +39 60 368 404 +53 8 180 404 +85 150 315 404 +137 152 335 404 +143 211 367 404 +174 75 381 404 +194 202 349 404 +202 216 267 404 +205 193 0 404 +224 47 0 404 +226 18 374 404 +231 199 365 404 +242 253 359 404 +13 219 0 405 +28 109 351 405 +30 63 277 405 +63 180 390 405 +72 152 311 405 +74 153 0 405 +77 92 358 405 +116 241 379 405 +125 190 378 405 +128 254 354 405 +146 228 395 405 +184 202 342 405 +219 209 399 405 +227 236 185 405 +229 249 282 405 +21 38 298 406 +27 88 398 406 +32 142 305 406 +32 158 384 406 +44 64 374 406 +64 107 323 406 +67 196 362 406 +78 82 376 406 +79 149 360 406 +87 182 182 406 +104 168 0 406 +106 169 336 406 +132 157 282 406 +154 84 58 406 +161 251 392 406 +163 239 54 406 +181 73 202 406 +183 235 383 406 +192 244 364 406 +195 229 395 406 +202 22 178 406 +202 10 0 406 +214 25 0 406 +252 5 390 406 +2 83 296 407 +6 216 0 407 +31 77 345 407 +32 42 355 407 +65 132 241 407 +67 158 389 407 +67 189 390 407 +72 153 0 407 +84 115 361 407 +87 217 117 407 +97 130 368 407 +106 104 390 407 +108 235 363 407 +117 180 403 407 +123 135 395 407 +125 116 396 407 +136 215 271 407 +217 171 388 407 +233 161 353 407 +4 85 0 408 +5 18 344 408 +22 38 0 408 +28 91 0 408 +37 81 292 408 +41 51 371 408 +54 177 363 408 +57 43 0 408 +74 47 379 408 +75 159 355 408 +88 115 366 408 +100 176 385 408 +100 168 0 408 +104 107 364 408 +116 179 326 408 +121 187 305 408 +131 50 14 408 +160 25 394 408 +211 1 312 408 +233 227 395 408 +253 1 336 408 +254 141 0 408 +3 16 374 409 +10 138 390 409 +23 119 398 409 +38 88 391 409 +48 34 260 409 +65 71 338 409 +67 241 384 409 +73 170 392 409 +75 254 332 409 +100 179 76 409 +101 177 330 409 +129 210 338 409 +188 230 83 409 +194 247 380 409 +222 163 0 409 +224 20 157 409 +228 41 370 409 +240 29 92 409 +256 202 366 409 +256 57 376 409 +6 89 324 410 +11 23 359 410 +21 68 372 410 +32 83 396 410 +59 174 264 410 +97 68 325 410 +134 124 0 410 +135 202 0 410 +142 154 0 410 +158 163 172 410 +162 108 337 410 +164 37 388 410 +171 221 0 410 +184 151 241 410 +197 220 365 410 +217 230 403 410 +234 57 361 410 +239 37 355 410 +247 251 0 410 +255 248 271 410 +7 153 357 411 +32 80 402 411 +35 162 370 411 +46 94 221 411 +59 170 376 411 +64 127 391 411 +88 213 289 411 +92 104 276 411 +93 138 391 411 +107 183 395 411 +116 191 383 411 +119 72 396 411 +126 180 365 411 +164 242 0 411 +164 239 0 411 +165 220 360 411 +168 49 400 411 +177 242 339 411 +191 168 400 411 +204 216 0 411 +215 8 296 411 +234 231 387 411 +240 43 146 411 +250 199 0 411 +9 126 384 412 +13 211 355 412 +15 56 362 412 +18 98 393 412 +19 97 0 412 +28 40 385 412 +50 114 393 412 +56 68 403 412 +57 64 375 412 +116 187 397 412 +121 140 297 412 +136 220 384 412 +137 86 304 412 +149 217 231 412 +153 105 399 412 +161 225 0 412 +194 25 393 412 +201 14 385 412 +207 49 314 412 +218 236 0 412 +231 251 396 412 +234 198 352 412 +236 28 389 412 +7 185 384 413 +21 88 384 413 +25 229 339 413 +25 235 0 413 +32 18 382 413 +42 107 309 413 +72 135 395 413 +87 90 0 413 +94 18 62 413 +98 191 400 413 +105 117 228 413 +112 172 0 413 +118 77 281 413 +136 244 370 413 +137 77 390 413 +138 67 396 413 +173 253 398 413 +177 226 400 413 +178 194 370 413 +187 198 280 413 +198 221 378 413 +222 146 92 413 +226 239 0 413 +226 253 201 413 +17 197 372 414 +20 110 0 414 +51 44 314 414 +62 122 0 414 +63 170 375 414 +65 141 376 414 +66 149 0 414 +75 76 389 414 +75 253 396 414 +92 140 344 414 +98 150 336 414 +104 172 360 414 +141 193 392 414 +143 239 389 414 +163 46 375 414 +163 240 393 414 +166 230 0 414 +179 232 391 414 +185 138 363 414 +217 229 304 414 +241 194 103 414 +248 8 339 414 +249 204 390 414 +252 73 373 414 +5 204 354 415 +5 227 343 415 +8 10 356 415 +18 68 307 415 +26 48 391 415 +52 248 265 415 +63 80 389 415 +69 129 160 415 +112 116 396 415 +114 180 277 415 +119 136 329 415 +126 170 348 415 +133 194 0 415 +145 173 275 415 +153 90 0 415 +159 240 405 415 +164 253 0 415 +193 214 400 415 +203 197 302 415 +224 93 300 415 +228 51 0 415 +241 132 390 415 +246 2 412 415 +28 43 0 416 +31 18 0 416 +49 58 219 416 +59 124 121 416 +70 156 383 416 +75 157 0 416 +79 148 386 416 +101 107 381 416 +116 254 346 416 +119 151 305 416 +120 135 394 416 +133 149 0 416 +141 13 327 416 +141 223 387 416 +145 143 0 416 +148 17 303 416 +152 198 381 416 +159 146 78 416 +159 211 331 416 +192 241 347 416 +217 31 410 416 +230 250 242 416 +233 25 280 416 +246 53 144 416 +4 30 376 417 +37 61 393 417 +38 42 0 417 +39 115 280 417 +44 112 377 417 +75 153 0 417 +83 103 373 417 +86 98 384 417 +102 133 181 417 +125 185 357 417 +147 227 343 417 +180 244 0 417 +188 235 401 417 +191 245 407 417 +207 148 405 417 +217 26 379 417 +234 26 376 417 +7 122 359 418 +25 199 404 418 +32 82 382 418 +54 162 371 418 +87 140 0 418 +118 64 344 418 +121 183 388 418 +123 116 33 418 +126 189 0 418 +137 144 377 418 +175 34 362 418 +176 230 365 418 +233 41 387 418 +245 255 218 418 +17 239 0 419 +32 33 359 419 +37 97 109 419 +45 93 384 419 +46 97 0 419 +48 90 415 419 +72 150 0 419 +91 109 0 419 +115 121 266 419 +138 170 354 419 +168 175 261 419 +177 183 392 419 +195 6 0 419 +197 202 111 419 +208 23 361 419 +226 211 408 419 +227 46 0 419 +228 82 345 419 +237 48 412 419 +14 69 382 420 +17 227 0 420 +32 68 298 420 +35 102 375 420 +65 129 0 420 +72 103 285 420 +123 250 57 420 +134 148 394 420 +136 229 380 420 +148 227 314 420 +190 69 359 420 +209 45 386 420 +209 81 373 420 +213 25 349 420 +228 48 192 420 +242 49 392 420 +5 25 362 421 +19 94 0 421 +28 106 0 421 +64 190 274 421 +68 157 184 421 +85 97 110 421 +87 132 397 421 +88 148 211 421 +99 152 319 421 +139 230 309 421 +160 45 343 421 +167 160 339 421 +171 26 376 421 +171 45 322 421 +175 19 394 421 +201 118 395 421 +205 242 330 421 +238 248 397 421 +241 253 340 421 +252 16 232 421 +4 130 150 422 +15 10 358 422 +16 75 411 422 +35 44 300 422 +42 6 410 422 +68 111 418 422 +75 144 0 422 +76 149 313 422 +84 152 418 422 +93 111 0 422 +101 169 299 422 +130 94 389 422 +146 216 241 422 +166 214 0 422 +166 226 0 422 +177 69 361 422 +191 207 292 422 +191 242 0 422 +193 246 380 422 +211 231 404 422 +212 94 278 422 +218 10 290 422 +224 209 55 422 +224 212 0 422 +231 25 0 422 +234 245 351 422 +238 247 396 422 +247 35 395 422 +21 10 381 423 +25 14 398 423 +31 15 359 423 +38 97 353 423 +78 94 361 423 +102 188 268 423 +123 205 268 423 +138 92 0 423 +189 141 0 423 +203 10 0 423 +206 224 0 423 +212 48 280 423 +217 237 0 423 +241 53 352 423 +2 15 0 424 +2 248 383 424 +5 196 352 424 +5 72 416 424 +21 27 343 424 +23 74 0 424 +35 57 312 424 +39 42 0 424 +52 79 392 424 +54 9 414 424 +54 103 391 424 +60 185 385 424 +72 132 250 424 +78 141 384 424 +143 256 126 424 +147 200 373 424 +154 172 125 424 +169 216 368 424 +181 249 413 424 +194 218 397 424 +198 206 154 424 +208 77 187 424 +210 37 330 424 +212 29 0 424 +217 222 393 424 +227 81 258 424 +15 69 363 425 +19 74 359 425 +20 98 0 425 +30 37 391 425 +43 174 347 425 +93 91 0 425 +96 169 354 425 +102 73 124 425 +122 137 412 425 +132 225 366 425 +144 157 0 425 +146 228 413 425 +151 157 51 425 +159 13 366 425 +160 176 0 425 +175 227 300 425 +181 226 411 425 +192 242 330 425 +213 5 355 425 +213 246 406 425 +225 243 418 425 +9 70 80 426 +57 48 362 426 +57 11 0 426 +63 123 373 426 +70 77 209 426 +74 83 407 426 +78 113 391 426 +90 171 405 426 +93 89 0 426 +95 98 314 426 +99 191 405 426 +106 92 299 426 +118 104 412 426 +123 79 0 426 +125 118 353 426 +126 187 375 426 +129 17 353 426 +130 192 381 426 +138 182 0 426 +151 229 333 426 +160 26 343 426 +164 179 0 426 +181 170 392 426 +192 131 340 426 +196 227 343 426 +201 15 384 426 +228 253 316 426 +230 28 415 426 +239 211 351 426 +1 77 407 427 +12 75 389 427 +42 54 260 427 +50 33 409 427 +61 29 367 427 +66 99 127 427 +70 16 391 427 +73 87 0 427 +78 128 402 427 +93 69 357 427 +95 132 0 427 +99 102 390 427 +108 161 385 427 +132 151 370 427 +142 206 0 427 +147 229 0 427 +154 127 78 427 +166 184 402 427 +195 199 0 427 +211 46 379 427 +215 206 386 427 +224 48 204 427 +238 1 142 427 +247 33 409 427 +44 117 278 428 +49 114 369 428 +51 102 0 428 +57 125 367 428 +71 140 0 428 +99 117 402 428 +105 214 383 428 +134 214 397 428 +159 17 58 428 +199 11 0 428 +212 97 117 428 +223 45 351 428 +226 53 338 428 +230 27 397 428 +254 251 416 428 +26 221 0 429 +42 102 370 429 +52 112 403 429 +67 254 364 429 +109 157 150 429 +131 244 0 429 +147 17 191 429 +185 76 356 429 +209 4 362 429 +230 25 396 429 +236 6 422 429 +5 9 349 430 +17 69 385 430 +18 95 256 430 +27 57 303 430 +50 36 394 430 +66 86 120 430 +85 98 384 430 +106 101 309 430 +113 129 389 430 +158 109 0 430 +166 234 279 430 +191 256 0 430 +195 53 0 430 +202 17 409 430 +218 231 292 430 +225 34 0 430 +239 18 0 430 +246 195 121 430 +5 65 402 431 +76 136 377 431 +102 182 0 431 +104 191 408 431 +126 129 145 431 +131 50 423 431 +156 216 342 431 +157 224 423 431 +163 22 414 431 +170 144 333 431 +237 250 398 431 +3 82 335 432 +3 178 425 432 +39 125 338 432 +62 16 0 432 +79 145 0 432 +87 217 408 432 +101 151 408 432 +102 172 31 432 +125 154 111 432 +132 222 0 432 +148 19 352 432 +154 167 234 432 +162 102 59 432 +175 251 386 432 +178 185 238 432 +178 184 0 432 +200 82 422 432 +245 53 0 432 +247 198 381 432 +11 113 411 433 +13 31 0 433 +39 118 75 433 +40 183 397 433 +86 214 359 433 +90 108 0 433 +122 141 407 433 +123 189 0 433 +123 141 0 433 +134 158 427 433 +135 150 427 433 +135 246 0 433 +160 230 385 433 +190 242 151 433 +192 193 0 433 +221 10 0 433 +255 4 419 433 +5 22 218 434 +12 123 374 434 +31 28 389 434 +58 7 324 434 +60 70 410 434 +88 156 345 434 +91 79 318 434 +91 214 315 434 +93 97 0 434 +100 183 358 434 +123 253 397 434 +145 162 424 434 +148 30 420 434 +148 229 170 434 +158 202 423 434 +170 230 429 434 +175 18 324 434 +177 166 324 434 +201 13 0 434 +203 77 409 434 +210 146 0 434 +213 6 418 434 +226 179 0 434 +241 240 379 434 +43 96 366 435 +51 71 419 435 +59 75 397 435 +66 88 0 435 +78 130 223 435 +80 147 431 435 +105 233 424 435 +108 214 233 435 +108 156 0 435 +111 240 415 435 +145 167 418 435 +147 214 0 435 +154 166 297 435 +166 180 314 435 +168 188 415 435 +221 235 0 435 +249 203 240 435 +255 208 410 435 +22 101 412 436 +36 120 379 436 +42 118 272 436 +43 154 364 436 +48 107 371 436 +50 62 383 436 +84 150 367 436 +96 110 152 436 +108 128 404 436 +112 182 358 436 +116 141 343 436 +133 165 411 436 +133 188 0 436 +137 214 338 436 +138 206 411 436 +140 206 403 436 +145 98 346 436 +154 176 0 436 +163 18 417 436 +165 50 417 436 +172 50 422 436 +200 37 347 436 +207 202 406 436 +243 47 420 436 +247 118 413 436 +14 18 169 437 +23 39 404 437 +53 177 429 437 +68 129 397 437 +86 108 359 437 +110 234 426 437 +120 102 0 437 +122 182 417 437 +155 169 353 437 +175 45 42 437 +180 50 404 437 +182 197 0 437 +194 227 340 437 +196 30 418 437 +209 21 305 437 +218 240 416 437 +223 10 0 437 +238 250 381 437 +3 134 316 438 +8 101 418 438 +14 29 373 438 +18 97 0 438 +55 86 220 438 +61 232 409 438 +67 151 420 438 +68 84 0 438 +68 94 0 438 +75 234 423 438 +98 126 425 438 +112 189 0 438 +127 146 194 438 +133 245 389 438 +134 242 330 438 +152 231 0 438 +158 171 410 438 +171 189 0 438 +171 250 355 438 +185 75 388 438 +200 26 342 438 +201 206 106 438 +206 30 421 438 +207 250 400 438 +217 167 0 438 +232 62 408 438 +237 212 274 438 +237 43 405 438 +243 35 359 438 +243 57 418 438 +5 70 0 439 +17 30 427 439 +47 83 388 439 +57 119 406 439 +68 136 409 439 +91 192 412 439 +91 202 388 439 +106 171 426 439 +108 186 420 439 +123 144 77 439 +136 197 0 439 +138 129 397 439 +148 150 295 439 +152 232 416 439 +162 184 67 439 +166 174 344 439 +190 234 425 439 +191 232 401 439 +194 56 432 439 +219 74 219 439 +242 147 351 439 +243 54 411 439 +245 49 417 439 +254 250 316 439 +10 138 437 440 +14 239 369 440 +22 82 0 440 +23 27 0 440 +38 114 385 440 +41 90 403 440 +63 3 412 440 +64 12 371 440 +79 242 340 440 +103 115 262 440 +117 76 406 440 +146 172 421 440 +148 165 0 440 +152 172 407 440 +162 172 335 440 +166 233 0 440 +169 229 287 440 +192 238 350 440 +228 50 370 440 +252 125 400 440 +5 71 114 441 +33 54 428 441 +35 114 301 441 +52 16 362 441 +111 128 214 441 +124 184 264 441 +178 136 98 441 +187 207 312 441 +200 209 349 441 +204 73 422 441 +210 217 270 441 +215 70 403 441 +223 218 0 441 +237 223 0 441 +243 199 0 441 +249 6 368 441 +2 24 0 442 +15 138 392 442 +25 24 0 442 +28 32 0 442 +45 90 413 442 +49 3 0 442 +59 108 0 442 +63 111 219 442 +91 135 388 442 +121 71 0 442 +123 184 429 442 +134 143 425 442 +143 244 0 442 +149 156 0 442 +150 241 413 442 +160 30 417 442 +179 244 0 442 +208 81 429 442 +218 30 414 442 +240 31 390 442 +247 51 320 442 +249 9 333 442 +252 38 0 442 +30 74 351 443 +40 178 261 443 +56 72 398 443 +62 116 415 443 +99 147 0 443 +108 124 423 443 +126 141 193 443 +136 156 359 443 +194 144 373 443 +212 243 416 443 +241 34 364 443 +242 211 433 443 +245 228 0 443 +246 256 438 443 +256 78 438 443 +10 107 428 444 +13 66 440 444 +20 111 259 444 +26 90 423 444 +27 174 434 444 +32 44 325 444 +51 4 432 444 +55 48 355 444 +59 185 257 444 +69 95 178 444 +114 100 402 444 +125 33 431 444 +149 194 0 444 +173 209 424 444 +187 202 241 444 +204 32 414 444 +220 249 417 444 +236 34 363 444 +5 216 346 445 +14 212 0 445 +15 121 420 445 +32 107 0 445 +42 52 422 445 +43 55 0 445 +56 70 0 445 +76 217 410 445 +84 240 405 445 +88 162 0 445 +103 170 409 445 +132 223 415 445 +143 14 374 445 +146 229 0 445 +148 195 352 445 +148 216 306 445 +177 69 426 445 +179 151 424 445 +187 206 186 445 +192 217 435 445 +237 228 422 445 +242 143 169 445 +247 6 376 445 +255 196 335 445 +3 98 431 446 +10 106 426 446 +12 80 55 446 +17 197 437 446 +29 125 270 446 +43 102 414 446 +46 125 428 446 +56 21 263 446 +79 83 304 446 +85 102 409 446 +86 156 101 446 +93 109 0 446 +103 174 336 446 +105 185 343 446 +132 244 372 446 +156 230 412 446 +160 235 0 446 +178 245 357 446 +190 77 404 446 +199 115 419 446 +38 113 389 447 +93 126 366 447 +93 142 0 447 +145 143 426 447 +159 144 433 447 +165 231 357 447 +178 119 0 447 +183 231 345 447 +186 129 389 447 +192 157 229 447 +200 24 99 447 +226 18 410 447 +236 118 411 447 +236 9 412 447 +2 71 320 448 +3 117 432 448 +8 73 321 448 +13 11 0 448 +16 68 147 448 +22 235 291 448 +26 85 335 448 +49 58 434 448 +59 16 370 448 +61 20 369 448 +62 78 112 448 +65 82 439 448 +69 149 181 448 +72 147 0 448 +88 97 0 448 +90 112 0 448 +93 83 245 448 +95 149 223 448 +96 97 0 448 +96 132 426 448 +96 147 426 448 +118 108 405 448 +137 86 419 448 +174 185 104 448 +176 129 431 448 +179 217 432 448 +192 160 442 448 +207 144 434 448 +233 231 0 448 +235 201 439 448 +251 29 296 448 +2 15 435 449 +4 120 434 449 +8 130 395 449 +26 86 428 449 +45 55 424 449 +84 226 400 449 +100 150 156 449 +101 27 325 449 +106 89 222 449 +145 193 0 449 +157 196 424 449 +158 206 415 449 +163 243 380 449 +166 245 0 449 +240 225 0 449 +249 5 431 449 +254 34 419 449 +5 38 421 450 +13 48 430 450 +32 42 437 450 +40 60 0 450 +49 247 363 450 +51 119 407 450 +52 190 362 450 +60 102 366 450 +64 3 377 450 +81 43 408 450 +85 151 371 450 +102 115 0 450 +119 184 242 450 +123 135 426 450 +128 188 404 450 +132 213 0 450 +159 237 0 450 +164 212 442 450 +174 121 120 450 +206 218 0 450 +8 116 422 451 +20 125 427 451 +69 135 430 451 +70 67 435 451 +81 24 0 451 +108 127 311 451 +134 194 0 451 +138 89 0 451 +142 173 194 451 +151 160 171 451 +177 238 414 451 +181 139 160 451 +197 66 436 451 +248 115 321 451 +252 16 442 451 +8 117 419 452 +11 93 369 452 +17 82 434 452 +30 25 202 452 +38 60 0 452 +44 90 0 452 +65 71 445 452 +70 154 407 452 +75 144 444 452 +91 159 401 452 +120 124 0 452 +126 91 418 452 +126 69 356 452 +140 219 442 452 +154 112 0 452 +154 172 445 452 +158 239 219 452 +168 44 408 452 +170 205 291 452 +176 228 435 452 +177 179 0 452 +193 255 0 452 +196 31 0 452 +197 220 443 452 +237 42 390 452 +251 125 410 452 +256 43 440 452 +13 209 350 453 +26 23 0 453 +39 51 0 453 +48 9 412 453 +55 9 386 453 +59 105 0 453 +74 86 416 453 +84 165 0 453 +85 10 346 453 +92 174 270 453 +103 152 0 453 +104 172 430 453 +116 179 427 453 +133 121 113 453 +134 95 398 453 +134 148 433 453 +184 202 439 453 +186 132 437 453 +187 13 272 453 +195 227 249 453 +203 215 146 453 +241 231 414 453 +248 113 330 453 +249 256 0 453 +4 83 0 454 +31 235 320 454 +48 60 163 454 +60 124 365 454 +67 182 434 454 +88 154 387 454 +93 72 421 454 +94 113 421 454 +106 154 30 454 +128 129 0 454 +132 157 418 454 +177 131 0 454 +181 124 0 454 +184 236 410 454 +188 141 418 454 +195 22 262 454 +239 225 0 454 +241 225 421 454 +245 38 450 454 +251 47 350 454 +16 138 300 455 +26 89 215 455 +27 40 332 455 +33 113 299 455 +53 97 422 455 +79 95 0 455 +116 71 420 455 +119 67 400 455 +121 138 309 455 +125 98 436 455 +127 188 335 455 +130 222 392 455 +146 127 441 455 +158 240 291 455 +187 201 175 455 +212 231 433 455 +218 41 0 455 +220 221 0 455 +237 31 314 455 +2 78 0 456 +7 91 365 456 +17 114 433 456 +26 21 338 456 +32 106 0 456 +33 52 219 456 +73 155 450 456 +79 157 0 456 +82 71 432 456 +116 117 404 456 +124 179 279 456 +127 205 437 456 +162 119 319 456 +166 137 435 456 +170 250 0 456 +177 120 0 456 +184 186 345 456 +191 212 431 456 +194 220 366 456 +196 239 246 456 +211 72 433 456 +215 221 94 456 +217 143 443 456 +217 206 109 456 +247 58 448 456 +249 60 267 456 +250 16 446 456 +252 255 447 456 +17 68 431 457 +25 44 12 457 +26 32 0 457 +49 125 433 457 +63 190 202 457 +104 119 398 457 +134 99 385 457 +162 161 426 457 +163 247 391 457 +171 236 349 457 +183 201 434 457 +200 4 359 457 +217 205 414 457 +224 93 454 457 +239 19 248 457 +35 55 202 458 +38 115 354 458 +41 33 376 458 +70 90 185 458 +112 234 25 458 +116 72 418 458 +139 42 405 458 +162 243 424 458 +172 253 394 458 +183 236 0 458 +187 129 368 458 +188 202 423 458 +205 198 262 458 +210 150 156 458 +211 41 342 458 +217 203 381 458 +221 25 61 458 +229 218 310 458 +232 18 321 458 +249 194 432 458 +253 201 356 458 +27 169 437 459 +45 25 379 459 +45 94 376 459 +63 178 441 459 +65 83 201 459 +81 87 445 459 +93 77 0 459 +106 97 442 459 +124 202 431 459 +126 192 168 459 +8 119 322 460 +15 66 388 460 +20 96 128 460 +29 20 0 460 +35 44 437 460 +40 107 332 460 +74 156 420 460 +78 69 116 460 +95 101 423 460 +95 147 69 460 +103 112 348 460 +107 117 301 460 +154 159 429 460 +158 176 0 460 +188 143 443 460 +217 250 427 460 +223 43 436 460 +248 6 358 460 +23 82 0 461 +31 15 442 461 +32 77 314 461 +33 40 418 461 +40 133 344 461 +46 53 358 461 +47 101 431 461 +53 66 438 461 +63 121 377 461 +80 155 0 461 +92 135 387 461 +160 29 417 461 +183 243 410 461 +188 190 412 461 +237 202 261 461 +237 29 0 461 +249 44 172 461 +255 42 413 461 +14 30 359 462 +14 68 103 462 +25 91 436 462 +66 116 410 462 +83 152 436 462 +95 222 292 462 +105 104 0 462 +112 192 385 462 +126 115 399 462 +163 231 0 462 +168 224 443 462 +178 71 0 462 +193 148 310 462 +196 18 358 462 +207 15 447 462 +209 227 0 462 +215 230 412 462 +231 36 452 462 +231 53 439 462 +252 62 150 462 +35 117 0 463 +48 121 374 463 +73 96 448 463 +74 186 445 463 +74 155 429 463 +96 110 452 463 +98 133 411 463 +106 126 449 463 +110 178 446 463 +114 119 0 463 +117 122 438 463 +123 179 431 463 +130 111 397 463 +157 206 98 463 +162 167 0 463 +168 41 376 463 +224 32 0 463 +225 41 359 463 +228 38 117 463 +231 51 370 463 +234 57 455 463 +235 59 412 463 +238 245 139 463 +4 142 124 464 +36 3 320 464 +49 98 362 464 +51 8 416 464 +58 7 449 464 +63 80 456 464 +71 132 458 464 +76 157 0 464 +77 192 384 464 +81 101 150 464 +96 169 441 464 +110 189 154 464 +127 255 434 464 +132 211 380 464 +145 131 382 464 +161 253 263 464 +165 50 450 464 +186 135 0 464 +186 201 136 464 +187 141 0 464 +216 232 395 464 +220 232 0 464 +241 37 409 464 +247 194 439 464 +250 199 447 464 +7 123 460 465 +17 23 453 465 +40 199 141 465 +40 59 328 465 +51 7 408 465 +60 71 0 465 +76 135 321 465 +77 68 0 465 +87 132 456 465 +92 104 421 465 +100 129 417 465 +111 175 416 465 +143 156 453 465 +146 105 453 465 +171 220 0 465 +203 48 414 465 +215 229 0 465 +223 224 0 465 +231 56 450 465 +234 203 307 465 +243 48 441 465 +245 34 0 465 +255 47 458 465 +256 16 0 465 +8 137 305 466 +15 19 170 466 +25 39 0 466 +35 115 0 466 +45 93 443 466 +56 181 457 466 +67 145 0 466 +75 159 430 466 +81 97 0 466 +91 218 457 466 +99 115 0 466 +100 117 365 466 +108 156 451 466 +112 161 263 466 +128 161 197 466 +133 180 0 466 +146 115 359 466 +146 117 440 466 +168 38 288 466 +170 251 34 466 +173 175 0 466 +173 219 435 466 +187 254 0 466 +213 169 289 466 +221 32 381 466 +224 28 382 466 +254 5 430 466 +256 47 412 466 +3 82 464 467 +4 67 0 467 +21 38 446 467 +27 76 418 467 +39 72 401 467 +49 231 425 467 +57 9 0 467 +78 79 0 467 +112 138 347 467 +154 170 0 467 +161 187 408 467 +170 222 431 467 +187 252 0 467 +212 45 0 467 +217 6 268 467 +229 28 409 467 +248 201 396 467 +8 88 406 468 +12 123 447 468 +15 68 132 468 +18 68 454 468 +34 3 382 468 +44 89 367 468 +47 59 144 468 +53 69 84 468 +70 150 449 468 +85 44 388 468 +92 160 0 468 +103 164 399 468 +140 252 434 468 +173 230 392 468 +181 140 281 468 +227 72 428 468 +234 255 405 468 +237 30 0 468 +244 120 461 468 +247 244 299 468 +255 144 406 468 +35 166 444 469 +64 16 0 469 +82 41 197 469 +90 160 461 469 +113 129 458 469 +127 80 454 469 +152 18 423 469 +158 171 465 469 +170 100 460 469 +207 19 180 469 +212 232 347 469 +232 41 0 469 +3 133 313 470 +10 20 396 470 +16 122 0 470 +22 236 0 470 +27 96 414 470 +35 56 374 470 +38 115 466 470 +40 53 417 470 +42 199 190 470 +45 20 0 470 +92 165 449 470 +118 3 421 470 +123 172 0 470 +133 123 422 470 +165 129 441 470 +165 243 380 470 +188 189 0 470 +190 206 453 470 +201 42 280 470 +208 20 388 470 +211 28 408 470 +212 43 284 470 +223 15 337 470 +240 47 375 470 +249 199 278 470 +12 93 0 471 +12 32 317 471 +26 30 0 471 +29 94 0 471 +36 65 312 471 +36 126 0 471 +41 88 432 471 +45 228 0 471 +84 163 0 471 +110 222 438 471 +129 253 366 471 +143 222 316 471 +159 173 0 471 +161 234 236 471 +164 243 0 471 +193 225 353 471 +194 225 355 471 +200 56 278 471 +223 29 0 471 +238 248 440 471 +6 119 453 472 +22 38 424 472 +36 116 0 472 +48 34 424 472 +61 34 247 472 +98 102 0 472 +128 189 0 472 +160 29 468 472 +167 41 396 472 +213 160 351 472 +231 199 412 472 +232 44 260 472 +234 46 424 472 +236 24 421 472 +238 47 405 472 +242 147 453 472 +2 52 271 473 +29 47 0 473 +30 235 0 473 +53 116 363 473 +68 143 420 473 +95 146 63 473 +135 218 437 473 +152 169 0 473 +163 212 384 473 +168 171 367 473 +208 220 456 473 +248 2 451 473 +248 194 438 473 +15 81 365 474 +41 54 15 474 +42 9 200 474 +45 255 422 474 +48 126 138 474 +68 190 404 474 +78 67 356 474 +78 72 421 474 +81 79 465 474 +101 89 365 474 +104 116 465 474 +108 122 0 474 +130 207 416 474 +164 129 403 474 +180 49 437 474 +223 82 450 474 +226 253 449 474 +231 101 363 474 +233 161 410 474 +241 49 350 474 +242 140 428 474 +1 69 360 475 +13 194 458 475 +14 77 0 475 +20 109 0 475 +25 32 0 475 +26 105 426 475 +26 109 425 475 +36 115 0 475 +62 9 203 475 +96 107 0 475 +119 155 450 475 +128 191 0 475 +137 138 0 475 +140 157 0 475 +169 220 275 475 +185 242 452 475 +194 53 468 475 +195 18 187 475 +203 42 272 475 +217 221 0 475 +4 85 448 476 +9 121 360 476 +13 202 0 476 +26 59 431 476 +49 42 410 476 +55 6 406 476 +88 108 445 476 +89 94 391 476 +90 112 466 476 +91 103 462 476 +91 107 455 476 +114 137 451 476 +120 123 434 476 +125 108 0 476 +126 178 396 476 +127 241 244 476 +142 221 462 476 +145 210 0 476 +156 208 454 476 +158 127 165 476 +177 120 466 476 +187 255 355 476 +219 74 469 476 +228 253 436 476 +232 35 291 476 +237 180 470 476 +239 230 424 476 +239 25 438 476 +49 38 369 477 +54 162 454 477 +71 150 471 477 +78 141 467 477 +80 131 432 477 +95 147 466 477 +118 182 283 477 +126 127 0 477 +135 5 461 477 +138 111 422 477 +142 206 452 477 +149 168 457 477 +158 237 0 477 +172 250 0 477 +183 252 442 477 +184 155 366 477 +210 13 444 477 +213 230 458 477 +219 32 0 477 +234 58 265 477 +235 256 352 477 +236 34 469 477 +240 43 436 477 +242 201 430 477 +245 250 450 477 +14 80 275 478 +21 101 119 478 +26 248 463 478 +32 91 0 478 +37 56 455 478 +52 79 452 478 +105 121 0 478 +107 222 457 478 +115 254 459 478 +125 77 467 478 +126 110 287 478 +127 104 450 478 +145 196 198 478 +182 215 471 478 +183 193 456 478 +186 132 464 478 +190 13 452 478 +191 129 364 478 +214 29 453 478 +217 169 35 478 +235 58 321 478 +245 53 445 478 +34 1 89 479 +46 29 55 479 +62 122 427 479 +91 94 397 479 +93 27 410 479 +127 115 437 479 +133 194 471 479 +142 154 423 479 +142 222 206 479 +159 156 417 479 +163 227 0 479 +177 132 474 479 +203 197 451 479 +214 231 0 479 +226 216 394 479 +236 121 452 479 +237 192 474 479 +237 42 468 479 +241 248 0 479 +13 16 0 480 +24 89 429 480 +26 232 316 480 +30 34 458 480 +36 104 383 480 +43 58 217 480 +63 107 205 480 +74 20 232 480 +76 131 473 480 +77 157 222 480 +83 40 470 480 +96 174 0 480 +126 51 414 480 +128 124 430 480 +134 194 466 480 +143 210 309 480 +156 161 436 480 +161 228 321 480 +164 179 466 480 +168 34 346 480 +191 256 457 480 +195 248 458 480 +250 57 0 480 +26 240 468 481 +28 40 463 481 +32 89 0 481 +64 114 330 481 +104 191 464 481 +104 190 469 481 +114 132 453 481 +138 205 363 481 +144 223 432 481 +149 229 386 481 +163 211 45 481 +185 153 373 481 +192 193 442 481 +202 196 393 481 +226 53 463 481 +234 238 418 481 +237 209 388 481 +238 34 0 481 +24 97 0 482 +35 52 174 482 +43 62 251 482 +48 122 0 482 +69 151 456 482 +96 222 237 482 +133 184 0 482 +158 107 446 482 +165 238 350 482 +169 160 0 482 +169 161 449 482 +169 222 408 482 +174 156 97 482 +180 193 0 482 +187 61 416 482 +230 34 465 482 +6 78 466 483 +6 121 409 483 +8 83 0 483 +13 204 284 483 +14 60 455 483 +21 89 371 483 +62 116 460 483 +64 51 449 483 +71 105 478 483 +75 115 474 483 +76 88 386 483 +84 175 175 483 +94 177 425 483 +95 132 457 483 +105 170 416 483 +115 164 340 483 +116 134 305 483 +120 21 474 483 +135 2 470 483 +160 171 0 483 +160 198 246 483 +160 240 71 483 +164 255 453 483 +191 232 461 483 +202 209 403 483 +218 41 462 483 +222 226 442 483 +226 34 0 483 +234 42 0 483 +236 102 462 483 +8 24 0 484 +38 88 440 484 +46 34 0 484 +48 1 193 484 +52 178 414 484 +64 4 405 484 +67 95 327 484 +87 99 382 484 +92 40 468 484 +98 161 472 484 +133 80 456 484 +157 175 422 484 +186 157 9 484 +202 93 448 484 +207 221 412 484 +226 227 0 484 +230 27 464 484 +247 24 414 484 +14 12 351 485 +25 85 0 485 +52 66 407 485 +81 141 464 485 +91 150 457 485 +114 130 438 485 +124 90 455 485 +125 171 469 485 +135 244 474 485 +138 217 405 485 +180 132 0 485 +188 252 0 485 +207 200 437 485 +215 225 459 485 +216 66 443 485 +242 199 426 485 +2 24 473 486 +23 27 478 486 +61 37 484 486 +61 232 473 486 +82 38 249 486 +112 177 415 486 +120 162 0 486 +138 130 411 486 +142 94 0 486 +148 176 406 486 +149 226 430 486 +153 194 369 486 +156 239 433 486 +172 240 436 486 +189 144 80 486 +191 243 128 486 +196 21 480 486 +207 208 0 486 +246 34 387 486 +247 53 245 486 +253 1 441 486 +18 40 464 487 +22 66 304 487 +41 35 77 487 +70 154 460 487 +70 151 223 487 +78 29 462 487 +99 150 0 487 +110 237 450 487 +111 159 70 487 +123 71 435 487 +124 142 452 487 +132 157 462 487 +153 184 361 487 +169 224 404 487 +171 239 323 487 +230 50 444 487 +251 9 108 487 +253 243 200 487 +17 216 420 488 +25 77 423 488 +35 177 291 488 +47 112 460 488 +56 21 470 488 +58 4 470 488 +63 190 468 488 +73 140 233 488 +90 171 461 488 +91 109 437 488 +106 119 411 488 +112 113 373 488 +144 31 463 488 +160 220 292 488 +172 246 0 488 +179 153 406 488 +191 251 150 488 +216 6 479 488 +223 219 0 488 +244 34 0 488 +249 42 0 488 +2 25 469 489 +17 225 0 489 +58 121 0 489 +83 131 437 489 +95 107 465 489 +98 190 283 489 +109 123 472 489 +114 129 442 489 +116 130 156 489 +119 75 452 489 +127 148 423 489 +133 190 393 489 +175 165 95 489 +181 123 364 489 +207 209 0 489 +213 224 449 489 +218 201 448 489 +222 196 0 489 +244 23 441 489 +7 68 473 490 +17 30 470 490 +19 99 474 490 +22 199 463 490 +34 5 411 490 +38 99 381 490 +60 70 468 490 +71 154 472 490 +79 181 463 490 +86 108 455 490 +87 145 388 490 +88 162 468 490 +120 179 0 490 +125 73 364 490 +154 167 481 490 +175 241 0 490 +180 183 305 490 +191 205 0 490 +210 221 449 490 +218 16 470 490 +222 206 0 490 +235 27 245 490 +246 42 262 490 +252 205 0 490 +12 121 339 491 +13 221 308 491 +21 83 269 491 +30 62 435 491 +31 6 452 491 +31 89 423 491 +49 43 273 491 +51 146 483 491 +55 5 476 491 +58 78 251 491 +70 124 354 491 +74 68 225 491 +81 111 0 491 +102 73 452 491 +115 72 475 491 +120 116 0 491 +120 182 0 491 +142 99 430 491 +169 249 456 491 +174 122 112 491 +191 165 272 491 +195 93 450 491 +197 53 462 491 +207 4 416 491 +234 239 424 491 +249 240 471 491 +254 206 0 491 +63 174 142 492 +64 107 474 492 +78 75 0 492 +79 136 272 492 +110 162 467 492 +131 200 465 492 +134 146 389 492 +163 37 319 492 +172 252 313 492 +181 132 468 492 +188 251 0 492 +190 193 440 492 +192 251 445 492 +210 8 469 492 +215 8 450 492 +230 24 419 492 +238 50 368 492 +240 13 487 492 +244 21 420 492 +251 13 0 492 +254 135 465 492 +254 1 0 492 +17 31 0 493 +35 103 274 493 +48 11 191 493 +48 113 0 493 +67 254 450 493 +75 68 149 493 +82 28 69 493 +92 213 215 493 +95 88 251 493 +96 92 0 493 +99 166 346 493 +110 164 424 493 +114 75 425 493 +117 122 479 493 +130 225 459 493 +168 252 402 493 +172 179 43 493 +188 205 245 493 +200 212 424 493 +204 7 0 493 +224 229 408 493 +233 221 25 493 +240 243 371 493 +248 7 0 493 +14 6 450 494 +18 95 446 494 +23 24 0 494 +47 174 485 494 +49 205 463 494 +52 120 142 494 +59 62 0 494 +64 177 421 494 +65 190 0 494 +65 132 466 494 +66 33 457 494 +73 182 0 494 +112 173 0 494 +114 104 386 494 +158 109 448 494 +158 97 362 494 +165 228 375 494 +175 196 312 494 +203 12 0 494 +215 7 310 494 +226 212 0 494 +229 50 435 494 +235 43 0 494 +238 250 463 494 +14 10 0 495 +15 75 132 495 +34 199 179 495 +58 12 0 495 +58 25 473 495 +69 179 432 495 +79 69 289 495 +82 40 0 495 +147 207 344 495 +169 176 203 495 +184 2 451 495 +187 238 379 495 +189 1 473 495 +204 216 466 495 +207 184 434 495 +207 211 166 495 +226 231 0 495 +236 50 375 495 +239 27 446 495 +252 125 473 495 +4 113 409 496 +5 115 483 496 +13 126 463 496 +22 9 460 496 +30 99 473 496 +49 56 371 496 +60 123 404 496 +62 5 464 496 +79 242 466 496 +83 92 456 496 +85 76 0 496 +88 154 472 496 +114 190 0 496 +126 121 296 496 +134 163 462 496 +148 180 456 496 +157 209 417 496 +171 45 456 496 +183 186 475 496 +194 25 488 496 +237 250 457 496 +244 66 403 496 +255 34 131 496 +7 92 486 497 +15 12 328 497 +37 255 464 497 +44 101 0 497 +49 113 0 497 +52 5 425 497 +52 54 430 497 +58 77 0 497 +59 12 364 497 +72 84 371 497 +82 110 481 497 +85 27 322 497 +94 113 491 497 +125 60 202 497 +127 226 435 497 +139 153 0 497 +166 177 483 497 +171 186 478 497 +231 50 376 497 +239 19 486 497 +248 52 420 497 +10 47 480 498 +10 73 349 498 +17 18 0 498 +72 163 494 498 +77 192 489 498 +79 147 304 498 +115 132 454 498 +126 97 451 498 +127 175 90 498 +142 90 244 498 +142 111 28 498 +147 194 0 498 +216 8 453 498 +229 35 454 498 +250 1 458 498 +5 117 476 499 +37 50 400 499 +40 107 475 499 +46 19 266 499 +58 128 451 499 +61 59 0 499 +63 170 459 499 +67 182 490 499 +69 129 460 499 +88 148 475 499 +133 242 0 499 +151 165 480 499 +171 251 205 499 +199 21 447 499 +204 223 69 499 +208 22 453 499 +220 38 478 499 +225 24 274 499 +227 36 483 499 +17 16 354 500 +20 88 483 500 +32 63 442 500 +49 15 0 500 +81 134 386 500 +87 213 182 500 +87 147 353 500 +99 147 497 500 +115 80 441 500 +125 116 457 500 +130 213 473 500 +139 230 432 500 +140 245 375 500 +147 17 439 500 +152 2 449 500 +154 172 485 500 +168 57 349 500 +170 140 331 500 +193 246 477 500 +202 23 486 500 +203 59 379 500 +234 256 0 500 +254 246 484 500 +5 12 470 501 +31 209 105 501 +40 150 330 501 +45 57 382 501 +49 97 269 501 +58 55 0 501 +71 83 318 501 +77 188 440 501 +80 134 388 501 +81 145 0 501 +93 21 456 501 +95 159 0 501 +101 108 461 501 +102 119 0 501 +103 90 0 501 +104 119 474 501 +136 2 483 501 +156 204 470 501 +162 174 488 501 +165 242 383 501 +180 131 0 501 +189 193 443 501 +201 22 447 501 +222 251 469 501 +251 41 490 501 +254 132 0 501 +56 116 107 502 +75 132 275 502 +81 10 426 502 +81 138 449 502 +112 190 0 502 +114 131 297 502 +116 176 484 502 +124 143 441 502 +125 123 0 502 +136 197 488 502 +146 214 121 502 +155 201 0 502 +170 235 401 502 +205 4 480 502 +207 135 439 502 +207 5 161 502 +207 3 439 502 +237 189 57 502 +8 88 495 503 +15 112 466 503 +22 235 477 503 +32 142 430 503 +49 64 0 503 +70 27 0 503 +87 163 453 503 +139 200 496 503 +156 235 472 503 +166 164 108 503 +170 139 204 503 +184 23 449 503 +217 23 484 503 +9 89 484 504 +73 96 484 504 +130 100 492 504 +156 221 0 504 +212 3 480 504 +217 208 373 504 +224 247 461 504 +231 51 483 504 +249 60 494 504 +251 29 482 504 +32 85 489 505 +65 177 0 505 +73 69 479 505 +114 162 70 505 +119 187 452 505 +133 140 0 505 +157 147 419 505 +162 79 431 505 +170 233 0 505 +193 214 499 505 +195 22 476 505 +207 2 0 505 +213 229 0 505 +220 24 404 505 +220 27 0 505 +241 139 477 505 +251 30 239 505 +256 3 479 505 +13 211 422 506 +36 84 436 506 +56 181 492 506 +62 206 479 506 +80 129 190 506 +86 163 497 506 +100 166 110 506 +121 172 500 506 +128 186 0 506 +134 145 143 506 +138 90 0 506 +142 88 481 506 +147 206 403 506 +175 62 503 506 +177 80 416 506 +210 3 465 506 +227 8 178 506 +250 59 416 506 +16 105 496 507 +26 105 498 507 +45 36 483 507 +69 89 480 507 +70 91 0 507 +79 179 422 507 +108 247 505 507 +128 176 80 507 +137 210 492 507 +150 235 491 507 +152 212 424 507 +161 190 383 507 +168 139 210 507 +187 256 0 507 +189 132 406 507 +211 1 420 507 +231 105 499 507 +248 6 493 507 +19 83 0 508 +28 101 0 508 +50 34 0 508 +58 112 377 508 +84 104 219 508 +113 68 436 508 +133 79 363 508 +134 159 407 508 +145 151 375 508 +152 37 396 508 +167 37 390 508 +170 119 376 508 +171 139 374 508 +171 192 480 508 +185 77 477 508 +243 35 479 508 +4 142 491 509 +12 69 481 509 +41 248 189 509 +46 229 459 509 +74 75 405 509 +77 190 493 509 +82 90 487 509 +90 141 440 509 +99 180 404 509 +108 179 455 509 +145 167 492 509 +146 254 500 509 +146 209 498 509 +171 182 505 509 +184 210 329 509 +188 155 352 509 +202 223 0 509 +221 29 0 509 +226 62 496 509 +228 19 338 509 +233 251 244 509 +250 48 318 509 +254 182 485 509 +11 10 0 510 +27 47 424 510 +27 91 418 510 +28 69 460 510 +44 117 435 510 +45 250 239 510 +45 59 0 510 +53 118 490 510 +79 254 125 510 +98 102 499 510 +98 180 295 510 +101 181 460 510 +124 160 445 510 +134 79 317 510 +137 242 426 510 +153 188 361 510 +184 60 477 510 +229 57 434 510 +246 53 445 510 +249 224 420 510 +251 49 251 510 +12 138 124 511 +35 54 129 511 +35 110 446 511 +68 159 156 511 +80 159 0 511 +93 96 0 511 +115 79 427 511 +116 181 101 511 +127 205 461 511 +128 192 0 511 +130 164 479 511 +157 239 397 511 +158 156 411 511 +168 227 315 511 +189 232 468 511 +207 232 467 511 +213 163 0 511 +228 53 0 511 +234 26 441 511 +251 238 0 511 +27 95 485 512 +28 38 0 512 +38 112 499 512 +84 159 154 512 +134 196 487 512 +156 144 357 512 +175 253 0 512 +188 217 415 512 +194 22 328 512 +206 2 435 512 +207 136 252 512 +232 5 424 512 +235 41 0 512 +236 24 502 512 +12 95 506 513 +31 19 0 513 +34 102 484 513 +39 72 485 513 +73 188 286 513 +91 214 480 513 +99 165 0 513 +158 110 230 513 +162 128 379 513 +189 245 502 513 +206 3 462 513 +216 85 432 513 +36 15 27 514 +71 156 505 514 +124 157 329 514 +153 103 472 514 +153 215 135 514 +168 49 476 514 +175 36 483 514 +189 1 504 514 +192 160 474 514 +197 16 506 514 +207 53 143 514 +214 157 316 514 +214 108 443 514 +217 141 166 514 +217 25 0 514 +233 253 497 514 +243 2 457 514 +254 225 504 514 +13 194 490 515 +21 68 446 515 +37 28 0 515 +39 99 0 515 +43 35 494 515 +63 56 450 515 +81 77 361 515 +81 88 424 515 +102 234 507 515 +114 119 471 515 +127 237 254 515 +138 89 462 515 +142 209 455 515 +152 223 482 515 +156 198 0 515 +181 164 388 515 +189 17 490 515 +191 45 480 515 +197 11 508 515 +205 243 431 515 +217 157 0 515 +225 30 406 515 +2 198 454 516 +26 125 498 516 +49 24 380 516 +71 140 453 516 +103 112 471 516 +104 179 0 516 +121 234 492 516 +126 170 492 516 +139 206 509 516 +139 57 356 516 +168 26 364 516 +194 21 399 516 +210 23 439 516 +212 94 505 516 +212 24 353 516 +219 236 500 516 +231 102 465 516 +238 53 149 516 +246 203 0 516 +250 57 502 516 +10 107 497 517 +18 83 176 517 +18 88 449 517 +25 105 417 517 +56 121 505 517 +56 68 438 517 +70 74 0 517 +71 179 386 517 +71 217 491 517 +86 107 0 517 +124 234 509 517 +127 254 270 517 +144 60 444 517 +162 232 448 517 +165 247 372 517 +180 13 492 517 +213 155 232 517 +231 25 502 517 +246 55 405 517 +247 6 498 517 +26 55 231 518 +40 183 482 518 +62 4 328 518 +77 157 513 518 +84 113 322 518 +123 71 506 518 +126 186 219 518 +160 46 482 518 +189 179 472 518 +207 210 241 518 +212 78 482 518 +212 34 284 518 +244 211 295 518 +252 121 400 518 +7 85 0 519 +10 169 507 519 +36 110 0 519 +42 36 485 519 +43 128 476 519 +48 15 160 519 +74 186 495 519 +84 175 491 519 +99 163 0 519 +114 118 0 519 +125 121 0 519 +139 242 407 519 +144 16 427 519 +151 200 459 519 +152 21 429 519 +165 184 401 519 +168 237 514 519 +226 190 461 519 +247 41 0 519 +253 206 406 519 +42 105 468 520 +50 210 473 520 +82 39 0 520 +118 70 0 520 +125 105 0 520 +148 176 506 520 +152 198 430 520 +157 176 492 520 +177 179 467 520 +209 49 478 520 +220 10 475 520 +227 224 439 520 +234 190 490 520 +236 125 454 520 +255 5 474 520 +31 81 0 521 +36 100 265 521 +48 112 0 521 +53 57 418 521 +54 112 503 521 +68 86 511 521 +76 188 502 521 +83 151 374 521 +84 149 367 521 +116 189 0 521 +129 147 0 521 +149 196 426 521 +179 151 486 521 +180 244 506 521 +206 78 483 521 +235 46 228 521 +239 236 446 521 +240 58 490 521 +247 55 0 521 +249 45 170 521 +5 115 503 522 +11 23 503 522 +40 112 483 522 +62 65 0 522 +64 123 142 522 +73 186 0 522 +78 79 512 522 +82 104 0 522 +94 44 496 522 +112 186 0 522 +128 67 353 522 +129 213 488 522 +135 218 486 522 +138 130 505 522 +138 156 0 522 +154 202 498 522 +161 149 462 522 +164 183 327 522 +167 209 501 522 +178 80 406 522 +181 76 511 522 +192 58 502 522 +193 225 476 522 +205 195 454 522 +209 37 327 522 +241 244 0 522 +99 148 0 523 +103 121 388 523 +108 245 459 523 +114 130 504 523 +145 176 512 523 +156 219 363 523 +161 225 476 523 +167 219 475 523 +190 240 444 523 +232 194 473 523 +243 197 466 523 +4 96 488 524 +32 105 0 524 +53 117 495 524 +60 71 508 524 +65 134 312 524 +84 176 277 524 +86 98 488 524 +90 97 411 524 +99 86 0 524 +99 191 457 524 +109 122 325 524 +112 173 507 524 +114 134 287 524 +114 79 0 524 +140 206 506 524 +150 237 500 524 +173 221 0 524 +175 45 450 524 +193 205 470 524 +194 3 444 524 +197 211 0 524 +218 200 344 524 +244 213 515 524 +255 194 513 524 +256 208 0 524 +26 23 509 525 +38 105 208 525 +43 36 198 525 +45 238 0 525 +45 49 251 525 +47 145 495 525 +56 72 516 525 +63 84 328 525 +93 68 0 525 +106 171 455 525 +125 60 511 525 +125 126 0 525 +127 207 497 525 +153 139 510 525 +155 250 158 525 +161 226 0 525 +223 194 510 525 +241 189 342 525 +247 45 462 525 +252 48 180 525 +254 33 509 525 +17 9 478 526 +31 33 455 526 +32 36 459 526 +40 241 503 526 +64 80 140 526 +92 172 446 526 +122 174 509 526 +125 15 380 526 +129 17 455 526 +133 149 477 526 +178 191 371 526 +190 13 484 526 +201 42 512 526 +215 230 480 526 +233 29 293 526 +251 55 507 526 +251 199 505 526 +14 66 58 527 +35 53 0 527 +42 15 405 527 +44 107 0 527 +49 98 472 527 +60 128 521 527 +84 88 0 527 +94 89 493 527 +118 69 413 527 +123 141 506 527 +139 199 0 527 +140 253 500 527 +142 161 344 527 +145 240 514 527 +160 45 505 527 +162 172 502 527 +165 254 393 527 +165 232 224 527 +166 234 488 527 +192 201 511 527 +212 85 449 527 +219 235 0 527 +223 228 408 527 +234 245 436 527 +19 80 502 528 +21 34 497 528 +44 90 486 528 +44 103 116 528 +56 73 500 528 +56 67 400 528 +63 115 328 528 +65 75 162 528 +67 147 297 528 +69 76 413 528 +74 123 487 528 +81 24 525 528 +84 171 472 528 +87 147 518 528 +95 79 501 528 +96 105 0 528 +104 172 476 528 +105 170 492 528 +114 7 374 528 +140 143 437 528 +143 204 490 528 +152 232 499 528 +164 216 519 528 +193 215 458 528 +249 220 460 528 +13 2 209 529 +34 100 486 529 +43 55 465 529 +63 65 0 529 +63 100 320 529 +63 75 194 529 +69 86 438 529 +124 80 41 529 +125 75 368 529 +126 124 202 529 +127 129 377 529 +160 205 407 529 +166 249 488 529 +175 241 509 529 +180 232 409 529 +183 129 433 529 +204 73 524 529 +219 231 489 529 +226 240 198 529 +227 219 462 529 +227 57 453 529 +233 239 331 529 +237 29 497 529 +238 248 503 529 +252 56 495 529 +1 16 165 530 +2 53 149 530 +15 113 0 530 +20 63 274 530 +29 94 480 530 +30 34 524 530 +73 70 0 530 +107 235 524 530 +110 145 450 530 +123 80 42 530 +127 222 274 530 +127 240 263 530 +153 141 78 530 +154 103 0 530 +155 224 474 530 +217 147 527 530 +239 94 516 530 +246 73 510 530 +34 52 0 531 +40 169 459 531 +69 88 419 531 +69 151 502 531 +74 71 489 531 +130 161 429 531 +135 150 501 531 +138 129 512 531 +146 214 508 531 +154 222 49 531 +159 131 360 531 +166 167 0 531 +166 179 0 531 +168 248 0 531 +194 8 453 531 +231 85 382 531 +2 198 529 532 +12 96 346 532 +24 150 525 532 +42 73 515 532 +63 109 0 532 +64 109 311 532 +84 180 356 532 +92 171 0 532 +96 109 0 532 +103 173 444 532 +103 171 124 532 +116 207 500 532 +120 98 268 532 +127 253 247 532 +127 238 256 532 +165 235 494 532 +173 239 45 532 +220 23 171 532 +226 244 488 532 +228 21 482 532 +254 253 0 532 +1 115 524 533 +1 68 363 533 +14 80 502 533 +67 151 504 533 +92 157 0 533 +94 64 472 533 +114 70 454 533 +137 88 495 533 +154 108 0 533 +177 226 475 533 +178 68 406 533 +184 200 0 533 +197 73 503 533 +209 21 484 533 +233 247 463 533 +236 61 287 533 +42 52 492 534 +83 86 0 534 +85 36 524 534 +108 163 459 534 +123 253 499 534 +138 132 415 534 +139 9 21 534 +140 79 509 534 +146 172 471 534 +155 208 347 534 +157 224 459 534 +159 164 512 534 +165 225 0 534 +168 246 155 534 +218 234 528 534 +220 18 493 534 +229 34 362 534 +231 86 470 534 +251 6 507 534 +254 17 219 534 +14 114 502 535 +18 98 466 535 +31 23 516 535 +40 100 125 535 +46 34 525 535 +49 113 523 535 +50 114 483 535 +51 100 0 535 +54 101 124 535 +57 115 513 535 +74 158 372 535 +83 152 497 535 +83 191 509 535 +103 214 134 535 +108 162 427 535 +119 241 487 535 +130 86 488 535 +149 226 529 535 +168 50 205 535 +175 243 116 535 +182 235 514 535 +184 251 521 535 +184 253 521 535 +189 228 422 535 +210 198 375 535 +214 235 0 535 +231 10 500 535 +242 200 363 535 +29 48 15 536 +39 51 470 536 +43 107 0 536 +61 43 0 536 +64 65 0 536 +71 77 457 536 +72 135 502 536 +74 142 50 536 +103 147 529 536 +123 190 0 536 +127 173 0 536 +127 186 394 536 +147 200 452 536 +153 213 129 536 +161 46 320 536 +162 182 75 536 +168 242 0 536 +196 216 331 536 +204 239 472 536 +205 221 315 536 +243 113 520 536 +12 85 435 537 +14 60 527 537 +49 52 0 537 +62 35 407 537 +64 170 460 537 +70 67 499 537 +71 182 0 537 +87 83 0 537 +96 140 514 537 +100 168 527 537 +114 19 492 537 +115 68 440 537 +128 192 530 537 +130 99 156 537 +136 223 492 537 +143 253 129 537 +146 136 0 537 +184 58 494 537 +186 215 535 537 +187 202 524 537 +233 225 515 537 +237 48 473 537 +238 30 417 537 +11 96 489 538 +16 96 398 538 +36 177 269 538 +45 58 209 538 +93 80 0 538 +101 169 452 538 +113 79 374 538 +120 68 407 538 +156 222 69 538 +161 163 0 538 +173 219 502 538 +173 230 483 538 +174 224 513 538 +176 144 527 538 +177 165 95 538 +244 200 34 538 +246 2 453 538 +250 42 0 538 +251 118 517 538 +4 21 0 539 +11 124 0 539 +31 95 450 539 +32 158 455 539 +46 94 514 539 +58 112 528 539 +60 78 517 539 +74 141 356 539 +83 104 164 539 +105 155 524 539 +107 117 530 539 +110 180 308 539 +112 76 506 539 +119 217 498 539 +127 188 466 539 +139 6 99 539 +148 180 502 539 +188 251 531 539 +190 253 0 539 +211 8 0 539 +214 29 496 539 +231 43 486 539 +242 198 389 539 +250 62 275 539 +255 34 528 539 +16 41 480 540 +51 119 515 540 +59 127 532 540 +66 32 448 540 +84 170 452 540 +119 75 529 540 +123 96 490 540 +137 150 509 540 +143 147 289 540 +167 234 199 540 +168 37 260 540 +176 239 0 540 +185 245 355 540 +199 21 527 540 +233 226 526 540 +233 22 278 540 +243 52 0 540 +247 58 476 540 +254 1 520 540 +255 3 192 540 +5 65 443 541 +13 5 411 541 +24 83 0 541 +55 98 380 541 +76 135 480 541 +77 192 523 541 +87 146 391 541 +100 149 381 541 +101 117 0 541 +110 234 515 541 +135 147 102 541 +136 220 506 541 +146 108 438 541 +159 152 430 541 +186 184 501 541 +238 13 363 541 +247 59 441 541 +248 1 230 541 +12 72 502 542 +15 19 503 542 +42 107 477 542 +56 98 386 542 +58 125 86 542 +79 13 524 542 +87 169 0 542 +87 155 511 542 +153 160 0 542 +164 221 524 542 +249 242 418 542 +28 102 458 543 +35 100 0 543 +52 68 356 543 +86 104 0 543 +91 144 523 543 +92 135 510 543 +95 156 515 543 +96 144 534 543 +104 149 281 543 +104 167 0 543 +146 117 514 543 +148 216 530 543 +153 144 0 543 +161 234 532 543 +162 242 110 543 +167 37 529 543 +171 45 527 543 +175 174 415 543 +200 37 525 543 +248 98 333 543 +254 246 518 543 +31 231 517 544 +35 125 486 544 +54 102 0 544 +91 169 0 544 +98 133 524 544 +103 164 475 544 +106 123 400 544 +110 190 232 544 +137 144 513 544 +141 156 176 544 +152 196 314 544 +176 45 113 544 +185 134 512 544 +201 16 239 544 +202 184 516 544 +221 48 518 544 +243 197 541 544 +252 55 0 544 +12 43 519 545 +60 52 509 545 +61 52 0 545 +71 91 362 545 +88 164 346 545 +111 141 400 545 +125 11 233 545 +134 91 532 545 +140 141 0 545 +157 164 526 545 +177 187 426 545 +183 242 0 545 +203 52 384 545 +204 74 426 545 +247 253 499 545 +2 24 520 546 +23 24 511 546 +23 27 520 546 +35 145 450 546 +75 253 421 546 +83 103 428 546 +90 169 0 546 +91 214 527 546 +102 119 524 546 +103 152 500 546 +105 95 478 546 +119 67 489 546 +160 196 391 546 +172 246 514 546 +233 45 148 546 +241 246 163 546 +247 42 0 546 +248 113 464 546 +256 6 514 546 +4 72 102 547 +10 48 500 547 +24 109 541 547 +28 106 540 547 +39 98 0 547 +47 177 461 547 +55 56 0 547 +60 16 42 547 +68 129 455 547 +85 104 178 547 +115 72 506 547 +126 123 0 547 +140 160 0 547 +145 221 528 547 +209 240 264 547 +210 21 0 547 +213 29 528 547 +223 213 532 547 +223 21 447 547 +235 245 440 547 +235 38 539 547 +254 132 520 547 +4 85 487 548 +21 69 0 548 +27 37 525 548 +27 169 476 548 +58 44 0 548 +81 8 0 548 +88 100 74 548 +108 156 502 548 +119 139 526 548 +139 60 438 548 +158 88 470 548 +158 174 0 548 +161 189 0 548 +163 247 545 548 +175 168 457 548 +185 138 541 548 +192 251 545 548 +195 53 440 548 +197 120 453 548 +200 24 526 548 +200 86 533 548 +207 240 500 548 +210 244 327 548 +220 37 0 548 +225 21 247 548 +249 186 465 548 +253 60 537 548 +254 182 527 548 +8 89 291 549 +25 2 511 549 +28 101 530 549 +58 106 87 549 +75 140 0 549 +79 254 526 549 +79 203 530 549 +100 165 0 549 +118 9 71 549 +121 71 468 549 +121 153 520 549 +165 133 521 549 +165 180 259 549 +171 251 530 549 +186 135 492 549 +193 148 489 549 +204 78 415 549 +210 164 512 549 +216 24 0 549 +220 228 491 549 +220 28 0 549 +243 40 522 549 +19 83 531 550 +22 35 543 550 +24 10 518 550 +41 166 532 550 +62 14 0 550 +62 126 0 550 +64 75 0 550 +75 76 500 550 +79 250 523 550 +89 214 538 550 +100 103 95 550 +119 179 0 550 +121 234 539 550 +124 249 539 550 +125 177 420 550 +140 205 246 550 +178 119 483 550 +215 10 283 550 +225 2 361 550 +227 40 453 550 +244 34 531 550 +245 198 309 550 +253 246 525 550 +13 114 500 551 +24 89 510 551 +26 30 484 551 +77 140 450 551 +80 192 0 551 +81 21 21 551 +126 121 507 551 +128 180 68 551 +172 45 433 551 +175 149 424 551 +175 176 0 551 +175 255 366 551 +188 236 531 551 +192 202 297 551 +215 206 545 551 +227 10 501 551 +231 59 496 551 +248 195 505 551 +251 9 490 551 +252 5 420 551 +252 73 469 551 +2 12 524 552 +8 82 0 552 +51 162 195 552 +59 75 468 552 +74 84 525 552 +80 129 524 552 +105 104 511 552 +119 187 515 552 +131 147 0 552 +190 245 541 552 +197 3 392 552 +222 48 488 552 +226 236 544 552 +228 50 526 552 +252 54 0 552 +254 53 308 552 +256 122 508 552 +18 68 548 553 +38 53 0 553 +40 97 0 553 +60 74 457 553 +63 75 548 553 +67 87 308 553 +70 83 284 553 +81 138 548 553 +88 168 520 553 +112 234 476 553 +113 80 360 553 +121 139 542 553 +130 217 539 553 +132 244 491 553 +139 256 0 553 +144 251 139 553 +162 131 85 553 +165 147 513 553 +170 119 518 553 +175 167 506 553 +177 161 0 553 +186 253 391 553 +187 251 0 553 +218 29 0 553 +233 231 458 553 +241 139 518 553 +16 47 540 554 +35 28 540 554 +73 16 0 554 +81 70 491 554 +91 84 515 554 +92 104 486 554 +104 119 518 554 +146 229 483 554 +162 229 517 554 +169 217 540 554 +172 251 0 554 +181 194 509 554 +188 194 520 554 +200 26 511 554 +222 234 429 554 +223 216 467 554 +226 209 248 554 +233 236 0 554 +31 236 500 555 +69 136 249 555 +81 67 348 555 +88 233 523 555 +100 181 0 555 +130 214 535 555 +145 228 519 555 +146 175 0 555 +158 191 326 555 +183 198 426 555 +185 77 521 555 +185 176 549 555 +211 81 293 555 +224 229 528 555 +231 28 0 555 +231 199 533 555 +232 40 527 555 +243 114 487 555 +244 197 0 555 +245 201 283 555 +8 67 0 556 +19 24 0 556 +46 53 546 556 +48 90 494 556 +56 119 0 556 +62 3 0 556 +62 98 427 556 +64 78 0 556 +103 241 505 556 +145 168 519 556 +149 229 499 556 +165 145 286 556 +166 233 546 556 +169 187 544 556 +169 224 546 556 +207 53 523 556 +225 20 399 556 +252 106 275 556 +252 7 0 556 +5 114 0 557 +49 125 478 557 +55 188 537 557 +73 80 0 557 +85 29 535 557 +92 145 549 557 +105 167 542 557 +108 133 545 557 +116 132 205 557 +120 123 529 557 +124 214 535 557 +127 234 243 557 +127 129 535 557 +145 167 518 557 +148 226 0 557 +170 77 469 557 +171 236 529 557 +179 201 541 557 +193 206 0 557 +232 235 489 557 +244 184 94 557 +8 86 0 558 +24 87 435 558 +37 56 530 558 +39 156 524 558 +84 141 461 558 +91 161 534 558 +103 167 0 558 +103 233 323 558 +106 11 399 558 +110 187 413 558 +137 241 482 558 +143 1 546 558 +154 83 535 558 +156 174 499 558 +169 229 544 558 +181 242 0 558 +196 225 242 558 +199 9 0 558 +208 26 514 558 +249 199 514 558 +253 15 449 558 +7 123 506 559 +82 41 534 559 +103 172 0 559 +106 54 254 559 +107 222 539 559 +112 183 541 559 +119 186 85 559 +126 112 0 559 +126 127 497 559 +128 187 0 559 +160 215 206 559 +182 155 268 559 +189 206 419 559 +200 231 513 559 +211 3 66 559 +211 24 0 559 +221 43 531 559 +250 194 554 559 +5 4 0 560 +22 89 298 560 +23 153 534 560 +59 9 85 560 +60 126 424 560 +83 222 552 560 +126 141 536 560 +127 121 520 560 +170 205 540 560 +173 234 0 560 +174 121 545 560 +177 138 518 560 +191 209 416 560 +213 199 519 560 +226 220 522 560 +232 252 464 560 +237 236 0 560 +239 18 545 560 +249 243 540 560 +250 215 526 560 +84 149 544 561 +85 153 557 561 +85 84 539 561 +162 228 525 561 +167 162 496 561 +185 186 0 561 +238 179 538 561 +242 3 453 561 +248 114 259 561 +6 87 544 562 +22 43 516 562 +27 87 540 562 +31 251 526 562 +31 106 514 562 +72 105 533 562 +82 96 489 562 +114 78 337 562 +134 194 500 562 +144 60 543 562 +157 169 19 562 +185 75 492 562 +187 240 0 562 +197 54 410 562 +231 251 470 562 +247 51 543 562 +254 195 373 562 +8 137 526 563 +31 230 534 563 +39 185 544 563 +64 127 458 563 +77 187 466 563 +88 167 0 563 +97 176 547 563 +108 241 465 563 +121 186 0 563 +137 77 428 563 +160 203 473 563 +192 240 450 563 +254 240 0 563 +6 126 517 564 +30 84 518 564 +41 72 531 564 +42 52 554 564 +55 183 527 564 +65 178 0 564 +72 76 0 564 +78 69 517 564 +82 100 0 564 +97 178 447 564 +114 129 545 564 +130 84 115 564 +138 205 496 564 +159 219 527 564 +162 175 422 564 +170 240 57 564 +227 101 408 564 +1 16 542 565 +3 87 546 565 +8 68 246 565 +22 66 507 565 +50 37 524 565 +53 2 542 565 +74 173 543 565 +78 84 518 565 +97 164 404 565 +103 112 544 565 +113 181 391 565 +124 179 526 565 +130 101 476 565 +133 132 241 565 +134 145 539 565 +160 14 477 565 +178 238 524 565 +187 61 518 565 +192 252 550 565 +197 118 414 565 +200 12 487 565 +219 27 0 565 +230 27 537 565 +236 34 548 565 +242 14 543 565 +249 197 320 565 +9 43 560 566 +10 156 521 566 +12 137 229 566 +13 16 539 566 +14 211 0 566 +27 88 534 566 +61 1 147 566 +85 151 507 566 +103 151 157 566 +113 117 0 566 +113 133 334 566 +116 162 0 566 +116 131 0 566 +128 178 297 566 +190 61 549 566 +192 235 551 566 +226 212 525 566 +237 187 423 566 +245 197 0 566 +6 121 514 567 +50 36 531 567 +55 101 0 567 +62 50 459 567 +78 158 467 567 +100 116 324 567 +141 210 536 567 +177 238 490 567 +182 202 530 567 +199 66 532 567 +237 251 0 567 +253 57 551 567 +254 37 534 567 +10 96 99 568 +49 1 0 568 +56 6 160 568 +68 146 541 568 +119 183 0 568 +126 177 0 568 +132 222 563 568 +138 129 544 568 +138 202 336 568 +139 251 0 568 +141 193 529 568 +149 168 515 568 +150 173 438 568 +157 209 536 568 +183 250 535 568 +192 140 75 568 +202 200 484 568 +207 194 144 568 +207 15 509 568 +217 250 567 568 +227 224 541 568 +229 34 543 568 +230 250 556 568 +238 129 377 568 +244 66 542 568 +247 244 507 568 +22 7 401 569 +22 8 0 569 +25 8 281 569 +62 248 378 569 +67 196 454 569 +70 27 527 569 +79 160 485 569 +81 145 564 569 +89 217 517 569 +89 233 544 569 +92 171 540 569 +93 48 502 569 +97 191 431 569 +102 176 549 569 +103 156 0 569 +117 169 564 569 +126 186 553 569 +146 113 519 569 +146 191 346 569 +147 46 559 569 +148 93 536 569 +160 176 557 569 +182 197 453 569 +206 30 550 569 +208 1 212 569 +227 82 120 569 +13 2 543 570 +29 94 553 570 +47 100 429 570 +58 219 547 570 +61 203 0 570 +114 199 195 570 +128 176 541 570 +140 203 408 570 +142 196 163 570 +191 212 527 570 +207 1 0 570 +239 4 545 570 +248 35 192 570 +249 189 553 570 +252 13 551 570 +12 92 337 571 +14 10 568 571 +17 71 551 571 +28 32 526 571 +48 37 557 571 +53 199 0 571 +63 37 561 571 +65 128 0 571 +70 20 507 571 +100 115 0 571 +103 168 500 571 +118 69 546 571 +124 184 507 571 +136 202 557 571 +140 252 542 571 +142 84 0 571 +159 131 560 571 +206 211 373 571 +220 232 486 571 +224 32 540 571 +236 243 547 571 +240 205 426 571 +244 69 549 571 +6 71 217 572 +7 72 0 572 +33 248 299 572 +42 36 557 572 +72 84 546 572 +80 159 548 572 +89 150 438 572 +92 168 535 572 +93 225 557 572 +107 160 566 572 +107 235 546 572 +145 141 382 572 +175 62 561 572 +177 176 408 572 +182 252 529 572 +210 220 228 572 +215 199 369 572 +239 36 550 572 +242 197 0 572 +3 20 476 573 +5 69 0 573 +14 2 0 573 +33 41 559 573 +50 215 566 573 +69 88 564 573 +73 40 552 573 +85 27 520 573 +99 164 232 573 +102 168 531 573 +110 116 0 573 +123 217 526 573 +130 153 542 573 +135 196 454 573 +148 196 27 573 +150 218 393 573 +159 46 569 573 +180 183 571 573 +180 240 374 573 +181 124 503 573 +219 32 512 573 +247 34 171 573 +256 4 428 573 +2 35 523 574 +9 30 560 574 +9 91 555 574 +23 69 0 574 +32 106 537 574 +33 2 547 574 +34 86 487 574 +65 133 281 574 +79 242 529 574 +94 170 446 574 +124 234 544 574 +133 149 543 574 +138 139 545 574 +138 188 355 574 +145 210 515 574 +152 197 563 574 +166 163 0 574 +180 228 411 574 +195 66 291 574 +218 176 547 574 +227 103 557 574 +231 103 568 574 +239 225 533 574 +254 225 551 574 +5 53 0 575 +9 89 562 575 +21 34 543 575 +25 30 560 575 +28 134 570 575 +39 146 431 575 +52 178 543 575 +57 122 528 575 +66 41 525 575 +84 88 545 575 +120 28 553 575 +124 183 504 575 +130 196 327 575 +137 210 562 575 +138 159 359 575 +151 173 441 575 +175 253 559 575 +206 1 337 575 +231 106 451 575 +235 58 486 575 +235 64 555 575 +245 54 554 575 +246 51 559 575 +250 57 538 575 +23 72 0 576 +38 98 352 576 +70 151 492 576 +104 169 0 576 +107 187 435 576 +114 72 0 576 +118 103 554 576 +120 153 515 576 +125 154 538 576 +125 121 546 576 +127 238 550 576 +128 80 0 576 +138 207 567 576 +142 209 548 576 +170 117 567 576 +190 196 510 576 +191 241 0 576 +207 14 0 576 +211 82 132 576 +256 128 496 576 +7 40 530 577 +12 105 442 577 +18 39 405 577 +22 19 510 577 +27 166 501 577 +33 216 451 577 +41 90 476 577 +49 64 553 577 +61 15 0 577 +68 159 547 577 +83 110 565 577 +87 77 518 577 +91 86 0 577 +94 102 487 577 +109 127 0 577 +136 197 538 577 +140 152 540 577 +171 26 533 577 +182 151 163 577 +191 225 260 577 +202 16 181 577 +242 209 548 577 +245 36 547 577 +19 69 0 578 +22 38 488 578 +37 98 0 578 +48 122 556 578 +84 163 568 578 +85 145 479 578 +91 94 504 578 +123 198 539 578 +132 163 564 578 +138 160 0 578 +152 218 377 578 +183 176 545 578 +184 136 0 578 +199 69 415 578 +235 201 510 578 +236 43 0 578 +239 81 552 578 +255 194 560 578 +12 109 556 579 +38 105 535 579 +45 49 533 579 +104 254 557 579 +124 136 533 579 +131 50 553 579 +140 219 481 579 +144 15 443 579 +156 161 523 579 +164 243 555 579 +184 215 277 579 +201 16 557 579 +211 49 527 579 +217 160 0 579 +226 129 436 579 +228 247 248 579 +235 205 543 579 +242 206 468 579 +18 103 561 580 +24 165 527 580 +74 68 566 580 +112 100 568 580 +159 242 528 580 +165 235 565 580 +175 36 541 580 +188 205 520 580 +190 253 569 580 +208 20 475 580 +217 224 364 580 +226 236 562 580 +235 246 410 580 +239 211 521 580 +24 118 560 581 +26 125 559 581 +43 64 257 581 +48 11 564 581 +70 39 255 581 +82 36 43 581 +92 155 0 581 +101 105 0 581 +154 158 0 581 +165 220 548 581 +173 165 520 581 +180 187 367 581 +184 204 331 581 +202 167 550 581 +205 11 565 581 +217 25 544 581 +239 62 556 581 +244 246 171 581 +256 17 374 581 +10 153 520 582 +40 60 551 582 +40 183 546 582 +70 29 468 582 +70 101 211 582 +74 30 545 582 +85 130 166 582 +88 214 204 582 +117 179 164 582 +122 177 416 582 +125 100 443 582 +145 136 0 582 +148 208 514 582 +151 200 577 582 +162 185 80 582 +182 186 0 582 +188 189 526 582 +201 200 0 582 +202 152 547 582 +222 163 543 582 +229 44 411 582 +255 37 527 582 +24 115 560 583 +29 38 484 583 +41 101 0 583 +45 57 536 583 +51 99 17 583 +70 35 513 583 +70 105 203 583 +76 182 0 583 +80 132 194 583 +104 116 569 583 +107 183 480 583 +124 250 542 583 +131 196 201 583 +135 155 220 583 +147 191 491 583 +175 48 479 583 +201 8 563 583 +211 30 403 583 +215 203 461 583 +11 28 563 584 +40 8 547 584 +40 169 557 584 +53 122 544 584 +59 76 491 584 +85 69 0 584 +106 165 567 584 +123 184 518 584 +133 151 0 584 +139 189 524 584 +149 233 516 584 +154 112 569 584 +189 58 503 584 +217 173 349 584 +218 26 0 584 +227 36 516 584 +238 205 41 584 +241 194 433 584 +244 113 546 584 +1 71 567 585 +2 114 266 585 +4 72 576 585 +21 105 541 585 +28 153 510 585 +34 8 575 585 +42 111 561 585 +48 34 568 585 +54 2 549 585 +55 11 0 585 +61 37 563 585 +70 103 284 585 +80 143 0 585 +86 111 570 585 +87 135 120 585 +99 149 0 585 +111 176 0 585 +128 115 367 585 +146 115 493 585 +161 225 580 585 +172 232 221 585 +176 239 571 585 +180 232 561 585 +180 243 0 585 +189 175 0 585 +197 57 345 585 +248 115 482 585 +255 223 558 585 +11 75 0 586 +11 89 577 586 +15 32 545 586 +21 44 545 586 +21 92 544 586 +24 150 574 586 +27 97 580 586 +33 51 0 586 +42 11 202 586 +79 193 233 586 +91 68 556 586 +115 183 342 586 +120 182 518 586 +123 165 542 586 +127 173 549 586 +127 237 558 586 +137 152 514 586 +157 132 502 586 +169 123 542 586 +192 238 445 586 +229 29 538 586 +238 244 0 586 +241 228 0 586 +242 2 398 586 +251 112 554 586 +12 154 438 587 +39 90 0 587 +39 111 553 587 +41 92 480 587 +42 73 560 587 +43 55 574 587 +56 133 112 587 +58 74 563 587 +70 83 571 587 +71 182 550 587 +77 141 0 587 +78 28 556 587 +116 187 463 587 +149 162 543 587 +158 237 573 587 +180 131 529 587 +190 193 509 587 +208 17 0 587 +222 211 555 587 +224 10 0 587 +227 248 438 587 +4 83 573 588 +11 10 562 588 +12 27 318 588 +25 221 560 588 +49 205 551 588 +51 103 522 588 +54 98 152 588 +72 89 0 588 +81 97 574 588 +85 95 551 588 +90 102 300 588 +107 234 412 588 +108 127 511 588 +117 140 575 588 +120 124 503 588 +125 95 488 588 +130 195 560 588 +147 168 514 588 +172 250 519 588 +177 191 0 588 +180 46 485 588 +185 168 415 588 +215 16 395 588 +249 38 573 588 +255 206 342 588 +12 41 460 589 +19 95 103 589 +52 81 502 589 +65 85 500 589 +80 84 514 589 +95 100 247 589 +174 122 533 589 +175 47 557 589 +217 195 549 589 +218 25 0 589 +223 56 551 589 +236 64 470 589 +29 105 138 590 +35 95 409 590 +45 90 519 590 +81 10 542 590 +117 122 555 590 +122 188 240 590 +171 182 566 590 +207 17 80 590 +221 81 550 590 +227 34 0 590 +254 175 107 590 +254 194 398 590 +27 92 0 591 +28 72 265 591 +30 37 443 591 +47 95 232 591 +47 83 471 591 +66 92 574 591 +70 153 0 591 +71 135 0 591 +78 29 554 591 +87 214 127 591 +94 158 0 591 +101 181 558 591 +121 71 569 591 +152 18 585 591 +169 191 580 591 +178 71 486 591 +179 197 0 591 +196 9 574 591 +199 28 550 591 +205 198 523 591 +207 223 0 591 +210 244 572 591 +213 17 514 591 +213 6 483 591 +224 44 357 591 +228 248 98 591 +234 207 550 591 +244 48 571 591 +12 43 554 592 +27 169 570 592 +35 68 515 592 +54 23 531 592 +78 79 584 592 +81 91 549 592 +88 158 562 592 +104 226 397 592 +104 168 427 592 +106 127 515 592 +109 166 474 592 +124 92 361 592 +128 192 560 592 +146 105 522 592 +155 220 584 592 +165 234 471 592 +190 238 376 592 +195 22 518 592 +215 12 399 592 +218 45 0 592 +248 3 263 592 +30 95 366 593 +41 34 321 593 +42 90 487 593 +47 177 553 593 +48 112 540 593 +51 162 568 593 +54 69 0 593 +56 60 0 593 +58 4 536 593 +66 33 547 593 +102 156 506 593 +123 135 520 593 +137 241 576 593 +157 143 284 593 +170 165 545 593 +172 216 521 593 +196 8 577 593 +197 118 573 593 +256 204 267 593 +6 126 592 594 +12 153 289 594 +28 91 450 594 +51 101 0 594 +54 6 387 594 +85 150 481 594 +112 165 545 594 +120 59 493 594 +123 141 565 594 +149 89 515 594 +163 191 139 594 +170 183 0 594 +170 182 59 594 +176 45 569 594 +178 163 586 594 +193 13 343 594 +205 48 566 594 +214 160 103 594 +215 18 574 594 +217 5 582 594 +244 34 565 594 +248 23 578 594 +251 122 553 594 +4 43 590 595 +17 20 397 595 +20 21 0 595 +28 119 550 595 +46 53 573 595 +68 148 512 595 +73 102 557 595 +75 139 520 595 +102 122 0 595 +110 180 581 595 +116 143 177 595 +123 249 486 595 +124 131 516 595 +142 193 444 595 +153 88 437 595 +153 141 584 595 +169 181 539 595 +210 50 561 595 +220 16 578 595 +224 231 378 595 +255 51 530 595 +16 125 567 596 +38 8 581 596 +42 122 197 596 +43 157 591 596 +55 170 477 596 +63 115 550 596 +67 95 575 596 +71 83 564 596 +78 154 512 596 +101 127 562 596 +132 13 394 596 +138 89 523 596 +142 210 536 596 +160 93 519 596 +181 164 535 596 +200 175 586 596 +204 78 565 596 +206 16 301 596 +213 144 357 596 +227 20 0 596 +247 42 583 596 +251 49 536 596 +2 12 562 597 +6 122 521 597 +25 15 517 597 +49 13 189 597 +49 113 564 597 +50 34 521 597 +66 158 581 597 +72 153 480 597 +169 185 0 597 +194 7 580 597 +196 3 464 597 +200 4 583 597 +204 199 0 597 +226 209 596 597 +249 60 540 597 +7 69 0 598 +19 47 174 598 +25 206 536 598 +44 73 559 598 +50 37 586 598 +51 128 420 598 +52 68 557 598 +65 91 563 598 +76 186 0 598 +80 89 593 598 +87 90 570 598 +93 35 478 598 +104 69 561 598 +105 84 594 598 +121 187 446 598 +157 97 574 598 +158 163 549 598 +160 235 580 598 +161 163 564 598 +161 209 227 598 +175 45 552 598 +181 207 589 598 +189 144 501 598 +195 198 329 598 +208 81 493 598 +239 81 591 598 +6 89 415 599 +21 103 547 599 +58 23 566 599 +62 14 583 599 +67 83 0 599 +71 140 579 599 +87 140 501 599 +104 131 550 599 +119 138 232 599 +129 17 567 599 +130 163 437 599 +133 123 520 599 +137 214 478 599 +138 154 413 599 +144 249 134 599 +159 17 443 599 +169 234 0 599 +172 179 500 599 +213 25 454 599 +251 73 561 599 +1 54 561 600 +3 93 248 600 +6 119 529 600 +9 81 539 600 +17 197 485 600 +20 88 557 600 +43 82 588 600 +44 110 546 600 +49 54 591 600 +79 254 558 600 +100 225 581 600 +114 180 583 600 +117 134 492 600 +121 183 470 600 +126 67 170 600 +137 186 0 600 +144 25 443 600 +160 220 522 600 +186 13 571 600 +192 244 582 600 +210 23 583 600 +226 249 464 600 +237 251 598 600 +8 134 283 601 +9 65 471 601 +21 33 0 601 +28 103 0 601 +61 245 562 601 +62 245 537 601 +73 170 449 601 +92 90 0 601 +100 46 584 601 +101 115 0 601 +110 191 293 601 +124 157 585 601 +124 218 573 601 +128 180 569 601 +138 143 0 601 +176 230 558 601 +186 256 586 601 +209 30 0 601 +9 89 579 602 +13 3 198 602 +32 106 582 602 +37 56 581 602 +74 65 235 602 +171 250 522 602 +177 138 584 602 +196 175 580 602 +224 252 570 602 +237 180 580 602 +249 256 577 602 +254 195 578 602 +19 94 598 603 +31 175 554 603 +40 178 486 603 +52 67 345 603 +66 67 0 603 +83 174 541 603 +107 191 491 603 +114 181 0 603 +125 34 587 603 +143 175 591 603 +160 31 383 603 +211 35 474 603 +247 197 324 603 +249 42 581 603 +12 86 408 604 +14 3 0 604 +16 42 576 604 +66 115 597 604 +70 149 267 604 +85 134 0 604 +105 170 564 604 +111 191 226 604 +123 183 393 604 +135 250 587 604 +137 155 0 604 +155 239 596 604 +159 219 588 604 +162 147 531 604 +169 176 530 604 +189 235 523 604 +193 255 456 604 +209 20 158 604 +210 206 425 604 +222 220 568 604 +223 3 449 604 +226 172 395 604 +244 200 547 604 +246 2 556 604 +249 198 307 604 +6 120 385 605 +29 90 0 605 +40 114 0 605 +47 90 0 605 +70 101 595 605 +75 250 518 605 +78 83 351 605 +89 95 483 605 +106 185 0 605 +110 116 600 605 +117 76 456 605 +160 196 596 605 +182 250 0 605 +189 252 540 605 +197 11 566 605 +206 17 0 605 +237 31 491 605 +242 200 547 605 +252 38 465 605 +6 78 514 606 +37 53 339 606 +37 51 0 606 +82 147 594 606 +123 250 508 606 +131 196 595 606 +162 225 539 606 +167 41 581 606 +182 197 592 606 +187 251 592 606 +189 232 595 606 +190 226 582 606 +199 133 500 606 +204 74 564 606 +206 19 342 606 +212 24 597 606 +224 41 356 606 +248 197 0 606 +16 19 167 607 +72 163 585 607 +75 129 192 607 +77 157 542 607 +86 153 0 607 +124 151 270 607 +176 46 319 607 +180 175 108 607 +192 158 588 607 +213 196 453 607 +216 236 579 607 +228 34 0 607 +235 57 0 607 +252 27 599 607 +254 56 569 607 +26 16 485 608 +44 107 567 608 +55 169 486 608 +58 78 528 608 +63 56 541 608 +105 157 391 608 +110 176 289 608 +117 124 0 608 +119 151 499 608 +127 241 573 608 +132 17 301 608 +167 188 583 608 +168 171 488 608 +174 177 428 608 +193 247 578 608 +193 23 596 608 +201 73 486 608 +203 17 273 608 +205 204 265 608 +219 236 592 608 +240 44 586 608 +243 40 590 608 +247 198 484 608 +247 6 567 608 +3 95 597 609 +4 30 463 609 +8 18 0 609 +16 86 585 609 +40 53 479 609 +64 51 600 609 +74 4 208 609 +89 157 114 609 +96 187 564 609 +98 117 0 609 +113 174 561 609 +130 225 530 609 +139 230 538 609 +144 214 562 609 +159 173 568 609 +173 239 572 609 +174 61 607 609 +180 240 596 609 +181 242 576 609 +193 214 532 609 +198 199 302 609 +218 31 315 609 +234 45 44 609 +247 118 491 609 +5 12 504 610 +24 51 315 610 +37 103 545 610 +44 64 469 610 +45 64 285 610 +52 9 468 610 +66 119 587 610 +81 138 569 610 +84 147 0 610 +98 116 0 610 +111 141 594 610 +112 113 556 610 +112 190 590 610 +113 138 601 610 +116 133 183 610 +117 183 330 610 +119 130 595 610 +127 254 563 610 +137 132 471 610 +139 248 594 610 +151 197 605 610 +189 203 426 610 +190 164 0 610 +205 64 526 610 +212 232 562 610 +223 33 437 610 +234 224 0 610 +235 256 521 610 +238 242 137 610 +53 98 378 611 +86 90 0 611 +96 89 0 611 +118 9 588 611 +139 205 257 611 +140 214 304 611 +145 209 0 611 +170 113 583 611 +191 252 603 611 +200 3 0 611 +202 143 330 611 +202 205 0 611 +223 200 466 611 +3 18 449 612 +27 154 93 612 +31 44 497 612 +42 33 611 612 +46 99 596 612 +62 50 578 612 +62 37 452 612 +66 133 457 612 +78 89 464 612 +82 36 590 612 +90 218 594 612 +106 54 566 612 +145 254 602 612 +147 200 562 612 +156 165 522 612 +159 237 570 612 +166 170 0 612 +166 131 599 612 +169 84 588 612 +180 232 599 612 +192 202 587 612 +206 4 384 612 +232 47 583 612 +243 15 595 612 +254 240 605 612 +255 52 0 612 +4 94 587 613 +11 93 590 613 +13 60 601 613 +15 56 553 613 +17 221 0 613 +59 170 456 613 +98 181 0 613 +99 149 596 613 +108 184 499 613 +110 190 578 613 +110 177 123 613 +119 72 498 613 +126 76 485 613 +149 211 609 613 +166 168 0 613 +167 29 576 613 +179 248 565 613 +196 200 354 613 +255 47 578 613 +1 177 589 614 +16 41 543 614 +45 256 212 614 +48 113 533 614 +55 133 501 614 +62 252 567 614 +78 157 524 614 +79 115 556 614 +84 190 596 614 +86 156 491 614 +86 165 499 614 +102 183 229 614 +125 170 0 614 +147 100 489 614 +152 197 587 614 +153 233 403 614 +155 250 539 614 +167 237 337 614 +186 196 582 614 +193 140 528 614 +199 9 574 614 +206 31 19 614 +224 251 227 614 +228 255 0 614 +243 24 604 614 +248 59 522 614 +2 69 0 615 +13 48 555 615 +15 3 0 615 +27 103 244 615 +32 42 502 615 +67 210 560 615 +70 130 476 615 +78 99 591 615 +96 221 602 615 +101 147 537 615 +109 170 376 615 +119 136 582 615 +142 71 544 615 +142 145 0 615 +143 17 269 615 +145 210 596 615 +152 198 547 615 +153 194 596 615 +163 156 609 615 +164 183 559 615 +176 224 0 615 +201 118 433 615 +208 74 77 615 +248 195 595 615 +4 70 588 616 +6 206 610 616 +17 32 606 616 +37 99 488 616 +46 256 0 616 +58 7 515 616 +62 203 0 616 +67 119 582 616 +75 191 460 616 +92 147 527 616 +116 129 0 616 +126 66 540 616 +136 140 248 616 +139 155 0 616 +151 230 609 616 +152 194 0 616 +170 177 435 616 +180 253 0 616 +208 28 593 616 +213 242 105 616 +226 240 609 616 +234 135 598 616 +244 206 366 616 +256 17 600 616 +5 18 560 617 +19 99 525 617 +33 98 0 617 +39 165 494 617 +49 51 0 617 +60 52 604 617 +67 117 407 617 +90 97 538 617 +126 19 582 617 +145 132 0 617 +148 180 579 617 +148 189 606 617 +161 253 564 617 +176 164 0 617 +186 208 579 617 +186 221 595 617 +211 232 522 617 +236 24 538 617 +239 4 580 617 +243 3 325 617 +36 15 599 618 +55 165 500 618 +94 85 592 618 +104 67 550 618 +105 167 609 618 +106 73 409 618 +123 155 285 618 +129 186 545 618 +155 205 0 618 +158 223 580 618 +169 121 471 618 +181 134 169 618 +198 60 459 618 +231 106 596 618 +234 13 610 618 +236 125 611 618 +242 8 570 618 +254 253 547 618 +45 110 597 619 +51 66 593 619 +77 68 558 619 +104 185 0 619 +105 218 546 619 +130 217 580 619 +148 61 590 619 +158 196 205 619 +164 207 541 619 +164 255 507 619 +180 196 606 619 +185 241 437 619 +189 186 0 619 +227 236 427 619 +230 251 0 619 +233 229 0 619 +246 73 547 619 +18 39 607 620 +18 88 538 620 +24 98 265 620 +44 112 445 620 +47 114 617 620 +49 56 513 620 +54 185 345 620 +65 20 485 620 +65 134 607 620 +76 96 0 620 +96 72 604 620 +102 233 508 620 +117 241 467 620 +127 186 585 620 +130 92 522 620 +153 160 616 620 +171 61 588 620 +181 226 453 620 +181 187 614 620 +189 175 592 620 +205 4 613 620 +206 195 378 620 +211 231 512 620 +256 47 558 620 +13 50 392 621 +19 24 610 621 +32 85 603 621 +35 162 587 621 +51 70 596 621 +63 177 135 621 +74 81 273 621 +78 76 483 621 +103 185 0 621 +105 214 518 621 +106 90 0 621 +130 150 349 621 +135 6 605 621 +147 214 466 621 +154 141 418 621 +180 243 605 621 +186 204 505 621 +191 241 604 621 +208 11 0 621 +216 224 397 621 +224 16 468 621 +241 193 0 621 +247 250 370 621 +14 52 0 622 +40 112 546 622 +53 117 613 622 +77 28 546 622 +84 176 547 622 +93 99 552 622 +101 100 0 622 +104 182 551 622 +108 168 30 622 +128 176 611 622 +153 157 0 622 +157 209 612 622 +174 121 607 622 +179 210 416 622 +181 247 606 622 +227 82 608 622 +228 82 606 622 +235 184 499 622 +251 110 614 622 +252 205 521 622 +10 95 423 623 +13 36 594 623 +27 47 583 623 +27 121 589 623 +40 185 290 623 +42 15 620 623 +48 99 517 623 +51 2 570 623 +58 196 613 623 +73 52 517 623 +76 155 0 623 +78 109 555 623 +90 169 573 623 +93 125 603 623 +119 89 484 623 +120 130 616 623 +139 9 604 623 +144 196 581 623 +179 140 267 623 +181 193 419 623 +222 170 621 623 +222 254 607 623 +15 51 587 624 +34 88 497 624 +40 56 0 624 +49 24 582 624 +85 98 450 624 +112 181 607 624 +146 113 593 624 +146 254 594 624 +151 219 587 624 +162 129 135 624 +162 182 585 624 +193 243 424 624 +217 6 608 624 +220 232 608 624 +222 180 490 624 +248 201 531 624 +1 32 608 625 +9 196 608 625 +22 236 495 625 +27 90 0 625 +67 241 475 625 +78 111 562 625 +87 124 139 625 +88 158 598 625 +153 152 354 625 +157 171 0 625 +163 209 0 625 +184 58 602 625 +256 4 605 625 +12 123 605 626 +29 24 481 626 +50 3 0 626 +55 110 512 626 +55 128 580 626 +67 182 520 626 +72 98 599 626 +83 97 0 626 +108 230 322 626 +109 121 372 626 +130 101 587 626 +139 199 602 626 +140 246 348 626 +141 250 567 626 +148 49 611 626 +158 100 229 626 +161 226 590 626 +192 159 286 626 +194 219 611 626 +210 17 0 626 +212 99 554 626 +229 235 320 626 +250 59 614 626 +53 104 586 627 +58 244 612 627 +61 252 0 627 +93 68 566 627 +112 79 615 627 +149 209 425 627 +153 150 0 627 +154 108 561 627 +160 171 516 627 +167 175 603 627 +174 190 0 627 +174 253 235 627 +180 182 614 627 +202 31 187 627 +221 32 500 627 +237 29 592 627 +238 20 613 627 +254 175 591 627 +20 42 597 628 +20 113 581 628 +44 103 537 628 +45 252 226 628 +48 15 547 628 +70 137 0 628 +75 155 127 628 +114 162 560 628 +119 138 612 628 +125 121 592 628 +132 19 610 628 +170 240 606 628 +214 194 334 628 +215 31 392 628 +217 246 612 628 +249 135 451 628 +23 18 403 629 +27 111 411 629 +50 1 0 629 +52 104 622 629 +82 92 603 629 +90 160 588 629 +107 176 0 629 +130 209 428 629 +132 244 575 629 +132 212 612 629 +143 14 454 629 +151 194 0 629 +153 88 612 629 +164 240 0 629 +177 182 609 629 +194 21 596 629 +205 9 242 629 +218 216 188 629 +240 58 606 629 +241 135 447 629 +243 8 550 629 +5 1 0 630 +5 53 601 630 +81 88 592 630 +94 36 194 630 +120 67 0 630 +129 149 598 630 +139 60 570 630 +140 218 310 630 +145 113 587 630 +148 150 600 630 +155 132 613 630 +159 213 611 630 +175 232 274 630 +183 243 607 630 +186 132 559 630 +187 246 598 630 +207 203 0 630 +210 37 624 630 +222 229 623 630 +231 251 596 630 +9 59 569 631 +15 74 40 631 +19 23 445 631 +64 80 598 631 +67 162 99 631 +76 80 517 631 +96 84 0 631 +129 217 615 631 +139 251 571 631 +169 168 0 631 +174 238 471 631 +192 58 615 631 +201 59 385 631 +208 23 623 631 +213 175 615 631 +222 31 309 631 +233 157 376 631 +243 194 437 631 +250 197 139 631 +251 118 563 631 +48 109 0 632 +58 125 604 632 +59 138 586 632 +70 133 278 632 +117 179 617 632 +120 68 584 632 +139 256 565 632 +143 208 301 632 +149 175 597 632 +162 229 600 632 +202 235 625 632 +34 128 606 633 +41 92 607 633 +43 95 380 633 +47 59 605 633 +51 67 422 633 +59 127 612 633 +65 70 501 633 +66 92 610 633 +74 41 541 633 +98 226 616 633 +138 176 620 633 +146 175 579 633 +148 216 615 633 +164 178 0 633 +174 162 545 633 +204 21 597 633 +209 37 627 633 +213 6 603 633 +234 255 594 633 +243 114 578 633 +254 182 585 633 +256 6 594 633 +34 84 610 634 +38 60 475 634 +41 103 409 634 +59 116 604 634 +77 93 586 634 +98 222 630 634 +123 80 592 634 +136 184 603 634 +168 252 571 634 +203 126 438 634 +204 45 627 634 +205 50 618 634 +205 17 197 634 +206 255 608 634 +207 136 605 634 +239 62 617 634 +250 42 619 634 +9 122 287 635 +15 113 541 635 +16 111 583 635 +27 64 632 635 +36 120 609 635 +57 112 480 635 +93 95 0 635 +105 233 509 635 +125 90 53 635 +146 178 488 635 +172 252 510 635 +184 60 532 635 +190 191 0 635 +211 49 594 635 +22 168 618 636 +22 87 629 636 +25 109 589 636 +28 90 0 636 +36 17 630 636 +41 31 461 636 +42 52 599 636 +98 150 565 636 +108 241 583 636 +115 241 318 636 +118 104 498 636 +128 171 597 636 +141 13 557 636 +153 149 0 636 +169 157 566 636 +173 176 0 636 +187 194 612 636 +187 204 562 636 +193 255 611 636 +200 212 521 636 +208 26 620 636 +212 216 412 636 +235 58 616 636 +238 242 621 636 +244 203 417 636 +2 24 593 637 +11 114 613 637 +32 83 449 637 +35 145 550 637 +64 4 537 637 +76 109 581 637 +82 34 68 637 +87 102 609 637 +91 187 568 637 +95 97 0 637 +100 49 625 637 +108 235 445 637 +112 140 609 637 +125 11 625 637 +128 192 607 637 +130 179 524 637 +139 168 541 637 +164 211 565 637 +183 201 601 637 +206 147 601 637 +214 211 509 637 +226 178 459 637 +238 47 572 637 +240 252 536 637 +246 17 632 637 +2 20 0 638 +6 31 516 638 +11 53 530 638 +44 107 634 638 +68 84 469 638 +78 43 508 638 +81 84 0 638 +130 160 603 638 +146 229 577 638 +160 215 623 638 +160 235 622 638 +163 211 498 638 +167 211 507 638 +170 235 512 638 +174 192 468 638 +195 53 595 638 +218 22 118 638 +226 249 605 638 +250 11 440 638 +29 78 632 639 +33 40 623 639 +37 236 0 639 +38 121 406 639 +58 44 580 639 +58 53 543 639 +67 254 555 639 +146 210 599 639 +148 229 600 639 +154 167 611 639 +169 170 0 639 +172 240 523 639 +177 119 616 639 +184 204 609 639 +194 17 202 639 +207 62 0 639 +214 25 553 639 +229 2 626 639 +232 39 615 639 +236 54 0 639 +26 109 497 640 +29 46 616 640 +30 64 634 640 +38 106 225 640 +49 205 617 640 +56 21 622 640 +60 70 588 640 +61 20 616 640 +65 133 586 640 +75 234 484 640 +87 109 568 640 +89 155 479 640 +93 82 255 640 +94 101 540 640 +113 79 539 640 +171 220 518 640 +214 208 595 640 +228 22 563 640 +230 246 0 640 +242 199 499 640 +35 52 619 641 +37 2 600 641 +39 150 430 641 +74 151 638 641 +83 143 636 641 +103 115 520 641 +104 179 530 641 +112 77 382 641 +113 112 633 641 +120 131 0 641 +132 13 614 641 +142 160 0 641 +143 244 478 641 +156 235 597 641 +160 14 627 641 +192 252 601 641 +207 253 0 641 +212 36 198 641 +214 240 635 641 +222 162 621 641 +249 140 388 641 +249 58 0 641 +25 87 593 642 +28 38 611 642 +52 99 622 642 +63 60 627 642 +65 177 590 642 +72 157 604 642 +72 148 586 642 +122 74 412 642 +126 67 613 642 +129 206 352 642 +140 197 0 642 +146 97 200 642 +148 211 0 642 +155 67 636 642 +157 107 403 642 +166 249 613 642 +172 253 469 642 +176 206 631 642 +181 140 509 642 +202 45 629 642 +202 6 0 642 +211 56 631 642 +216 19 408 642 +228 66 621 642 +229 19 615 642 +235 31 463 642 +13 6 598 643 +34 190 616 643 +45 62 56 643 +53 8 445 643 +54 103 441 643 +61 58 0 643 +62 11 0 643 +62 59 592 643 +73 116 572 643 +75 178 349 643 +83 100 81 643 +90 107 0 643 +95 143 633 643 +123 76 98 643 +131 254 0 643 +149 98 619 643 +158 193 547 643 +167 37 564 643 +179 205 604 643 +193 254 0 643 +207 144 465 643 +207 195 0 643 +227 238 611 643 +243 120 587 643 +248 33 607 643 +251 112 610 643 +27 63 615 644 +41 109 434 644 +65 128 628 644 +74 107 625 644 +93 2 266 644 +100 178 0 644 +178 255 590 644 +187 135 572 644 +190 255 376 644 +212 82 129 644 +217 22 29 644 +34 17 640 645 +53 69 480 645 +111 108 224 645 +122 96 477 645 +132 217 584 645 +163 178 619 645 +175 168 604 645 +178 168 506 645 +210 238 609 645 +213 218 229 645 +233 165 165 645 +234 231 630 645 +243 57 452 645 +7 91 463 646 +18 40 636 646 +22 38 600 646 +45 238 575 646 +57 166 471 646 +62 20 596 646 +75 153 638 646 +81 116 423 646 +114 96 614 646 +153 188 631 646 +158 173 0 646 +173 221 573 646 +187 58 574 646 +197 17 621 646 +202 14 371 646 +205 53 569 646 +206 256 0 646 +215 235 597 646 +222 171 0 646 +5 71 470 647 +10 20 607 647 +14 53 182 647 +26 125 591 647 +28 40 629 647 +34 69 626 647 +43 174 626 647 +46 227 610 647 +48 52 139 647 +51 128 625 647 +74 169 627 647 +78 124 611 647 +100 175 0 647 +100 255 600 647 +112 176 0 647 +114 77 582 647 +122 76 123 647 +127 171 50 647 +127 143 644 647 +136 242 0 647 +141 136 596 647 +146 127 547 647 +147 223 401 647 +157 149 621 647 +157 191 478 647 +178 50 631 647 +182 242 0 647 +248 115 600 647 +251 36 557 647 +15 32 601 648 +23 119 521 648 +24 150 625 648 +48 10 627 648 +54 69 630 648 +73 96 630 648 +79 242 630 648 +106 52 608 648 +120 104 369 648 +175 2 620 648 +177 143 633 648 +181 171 626 648 +183 193 570 648 +196 8 630 648 +204 199 619 648 +207 159 210 648 +210 222 620 648 +214 45 625 648 +217 5 605 648 +225 223 0 648 +227 247 412 648 +233 170 542 648 +241 37 635 648 +253 60 614 648 +7 86 414 649 +16 19 624 649 +55 125 75 649 +56 69 0 649 +81 101 514 649 +100 163 0 649 +141 210 588 649 +148 223 0 649 +181 123 503 649 +191 30 596 649 +207 186 511 649 +220 37 591 649 +222 180 633 649 +229 61 619 649 +8 41 637 650 +9 76 148 650 +16 122 613 650 +44 64 624 650 +77 68 639 650 +97 123 645 650 +113 67 185 650 +122 142 598 650 +123 249 638 650 +142 136 414 650 +163 184 638 650 +172 224 378 650 +172 245 0 650 +187 155 230 650 +187 202 555 650 +187 236 620 650 +194 60 557 650 +212 17 0 650 +228 230 470 650 +231 199 582 650 +234 186 91 650 +237 250 638 650 +252 12 631 650 +4 70 634 651 +39 169 413 651 +45 20 548 651 +48 35 419 651 +53 199 595 651 +75 205 272 651 +78 94 437 651 +92 108 0 651 +94 68 535 651 +106 11 614 651 +107 127 0 651 +118 70 571 651 +160 45 625 651 +163 37 588 651 +173 219 553 651 +194 211 0 651 +194 216 0 651 +217 147 587 651 +235 41 582 651 +6 122 627 652 +15 19 546 652 +17 82 536 652 +89 110 627 652 +96 187 625 652 +99 149 623 652 +109 103 335 652 +111 102 462 652 +128 79 0 652 +144 25 627 652 +175 20 480 652 +179 217 480 652 +197 41 620 652 +222 163 599 652 +248 113 620 652 +256 59 0 652 +6 78 624 653 +7 72 627 653 +55 109 283 653 +61 125 0 653 +65 91 643 653 +72 145 0 653 +75 144 509 653 +78 82 423 653 +81 130 0 653 +83 165 630 653 +92 171 640 653 +94 89 530 653 +111 127 0 653 +123 96 556 653 +139 131 549 653 +152 22 267 653 +170 143 638 653 +204 60 58 653 +224 10 630 653 +225 215 566 653 +1 54 619 654 +56 119 605 654 +62 17 340 654 +73 182 648 654 +76 138 0 654 +101 127 624 654 +103 156 632 654 +106 127 605 654 +122 114 527 654 +122 153 609 654 +152 241 610 654 +156 171 0 654 +170 205 614 654 +176 186 411 654 +187 217 566 654 +223 5 505 654 +225 2 600 654 +226 50 340 654 +232 40 590 654 +233 100 639 654 +244 184 623 654 +256 33 644 654 +28 102 620 655 +29 90 619 655 +37 57 403 655 +46 53 649 655 +50 60 436 655 +58 52 210 655 +65 122 291 655 +101 115 626 655 +106 169 431 655 +133 162 105 655 +135 247 569 655 +138 130 626 655 +146 161 0 655 +157 146 615 655 +188 246 0 655 +191 33 604 655 +202 167 612 655 +203 212 642 655 +224 42 0 655 +225 22 279 655 +233 221 624 655 +241 216 640 655 +26 30 566 656 +31 99 633 656 +35 162 628 656 +37 28 590 656 +61 42 0 656 +73 154 633 656 +74 140 646 656 +80 143 631 656 +81 43 525 656 +83 92 586 656 +95 132 610 656 +111 128 486 656 +145 150 282 656 +146 102 428 656 +148 61 646 656 +149 159 223 656 +167 224 390 656 +168 36 641 656 +172 176 0 656 +172 226 640 656 +179 234 642 656 +181 139 522 656 +203 29 630 656 +207 206 0 656 +223 46 335 656 +226 184 493 656 +229 235 636 656 +44 166 446 657 +47 112 631 657 +48 58 94 657 +57 119 517 657 +63 109 617 657 +65 157 643 657 +65 141 634 657 +71 82 521 657 +103 145 393 657 +130 145 0 657 +146 100 0 657 +158 205 646 657 +166 73 463 657 +172 231 0 657 +175 48 607 657 +178 205 604 657 +184 195 0 657 +188 245 267 657 +189 168 640 657 +193 205 600 657 +206 15 359 657 +213 230 629 657 +216 25 0 657 +221 25 647 657 +252 13 594 657 +13 2 649 658 +24 149 641 658 +27 112 418 658 +31 18 656 658 +36 127 622 658 +57 23 624 658 +72 105 646 658 +81 70 574 658 +81 157 535 658 +166 137 555 658 +168 255 640 658 +178 188 647 658 +207 49 471 658 +245 44 622 658 +18 28 300 659 +22 235 580 659 +37 27 595 659 +47 104 607 659 +51 166 425 659 +71 140 653 659 +78 30 434 659 +109 171 400 659 +113 142 629 659 +117 162 0 659 +126 3 0 659 +167 184 647 659 +178 194 640 659 +189 163 629 659 +196 53 555 659 +204 7 506 659 +223 228 561 659 +231 50 524 659 +239 4 641 659 +248 197 646 659 +249 201 164 659 +252 55 566 659 +253 203 0 659 +10 24 579 660 +36 64 71 660 +44 109 0 660 +50 3 650 660 +56 70 468 660 +60 71 603 660 +78 69 579 660 +81 69 0 660 +85 44 620 660 +89 40 637 660 +99 103 0 660 +159 237 632 660 +183 198 617 660 +191 212 612 660 +192 155 107 660 +216 28 346 660 +223 219 603 660 +223 30 0 660 +249 191 637 660 +250 242 646 660 +6 126 633 661 +39 60 651 661 +51 98 0 661 +51 142 641 661 +52 67 614 661 +103 147 649 661 +107 97 421 661 +107 117 646 661 +115 79 653 661 +161 239 59 661 +169 160 603 661 +176 242 644 661 +200 37 575 661 +204 10 0 661 +216 23 0 661 +225 41 628 661 +38 60 643 662 +62 50 644 662 +83 222 610 662 +88 145 0 662 +104 100 0 662 +107 75 489 662 +113 122 204 662 +126 69 514 662 +141 131 628 662 +149 193 239 662 +157 107 650 662 +180 131 598 662 +182 250 632 662 +206 212 315 662 +216 18 0 662 +235 30 577 662 +248 195 649 662 +249 50 280 662 +6 10 269 663 +13 212 632 663 +14 20 0 663 +19 80 636 663 +21 44 598 663 +32 89 516 663 +35 44 626 663 +55 133 651 663 +62 58 0 663 +62 114 364 663 +89 217 627 663 +119 186 649 663 +134 103 642 663 +161 253 661 663 +176 140 603 663 +247 250 642 663 +248 3 612 663 +253 59 595 663 +6 119 631 664 +19 41 655 664 +37 56 656 664 +58 219 652 664 +58 93 655 664 +62 196 552 664 +62 126 562 664 +68 111 622 664 +68 145 0 664 +104 119 568 664 +120 124 640 664 +126 17 515 664 +136 211 0 664 +154 171 0 664 +158 218 562 664 +185 192 628 664 +185 250 652 664 +188 186 0 664 +191 236 641 664 +193 204 644 664 +193 175 645 664 +220 253 660 664 +221 61 632 664 +244 126 557 664 +256 47 621 664 +256 126 431 664 +34 119 627 665 +42 107 564 665 +57 15 648 665 +101 152 646 665 +104 152 661 665 +135 252 626 665 +139 245 189 665 +143 254 0 665 +145 165 588 665 +154 140 595 665 +160 100 560 665 +172 26 349 665 +212 16 502 665 +214 160 608 665 +214 231 609 665 +221 78 644 665 +226 41 651 665 +230 37 0 665 +238 18 591 665 +241 231 611 665 +254 184 400 665 +4 82 0 666 +13 51 648 666 +19 47 654 666 +34 190 648 666 +46 81 623 666 +50 36 574 666 +55 11 603 666 +66 33 619 666 +95 174 344 666 +119 187 649 666 +126 51 578 666 +131 245 0 666 +133 180 607 666 +148 239 0 666 +151 165 560 666 +160 215 647 666 +167 219 552 666 +167 41 648 666 +176 49 645 666 +179 252 640 666 +180 49 476 666 +200 26 612 666 +218 100 633 666 +233 208 619 666 +236 50 511 666 +240 27 584 666 +241 230 433 666 +255 37 656 666 +256 11 0 666 +6 55 640 667 +17 142 643 667 +17 76 661 667 +42 97 492 667 +56 60 603 667 +58 63 0 667 +65 127 629 667 +66 99 450 667 +81 8 619 667 +95 159 574 667 +112 190 617 667 +119 165 655 667 +127 164 0 667 +150 241 495 667 +170 186 0 667 +179 244 469 667 +182 5 665 667 +196 78 639 667 +223 126 587 667 +236 245 204 667 +249 224 560 667 +2 82 107 668 +49 50 363 668 +57 12 592 668 +69 141 590 668 +91 214 653 668 +128 177 0 668 +174 164 445 668 +198 152 655 668 +227 8 629 668 +229 35 567 668 +245 252 204 668 +2 87 541 669 +31 91 650 669 +47 51 349 669 +63 11 0 669 +80 130 285 669 +93 2 661 669 +111 233 422 669 +144 221 0 669 +153 204 656 669 +164 245 0 669 +170 249 390 669 +178 184 567 669 +192 201 598 669 +195 3 0 669 +206 67 620 669 +249 251 0 669 +1 8 0 670 +6 71 635 670 +19 229 657 670 +24 92 494 670 +27 32 0 670 +42 11 602 670 +59 77 0 670 +60 74 578 670 +138 207 624 670 +139 251 648 670 +141 13 660 670 +179 195 349 670 +222 162 649 670 +227 35 0 670 +238 235 663 670 +4 69 0 671 +19 35 415 671 +29 24 653 671 +43 57 665 671 +48 243 559 671 +50 53 0 671 +59 12 531 671 +66 37 616 671 +69 82 175 671 +84 222 181 671 +112 98 640 671 +117 124 628 671 +144 15 631 671 +148 208 654 671 +170 140 568 671 +190 186 0 671 +203 12 566 671 +217 203 645 671 +219 231 661 671 +252 7 641 671 +17 80 611 672 +35 166 638 672 +49 51 641 672 +50 118 470 672 +55 64 344 672 +55 123 404 672 +58 255 0 672 +59 97 571 672 +61 64 0 672 +105 171 268 672 +111 222 144 672 +120 130 667 672 +122 140 591 672 +149 172 650 672 +162 216 660 672 +177 254 0 672 +210 17 655 672 +219 212 635 672 +219 42 668 672 +221 20 398 672 +225 193 530 672 +230 245 0 672 +14 30 467 673 +49 54 644 673 +58 223 642 673 +84 160 503 673 +86 169 0 673 +100 46 663 673 +103 241 586 673 +130 207 606 673 +138 69 576 673 +146 168 0 673 +147 227 664 673 +149 154 647 673 +162 49 653 673 +229 27 649 673 +241 62 667 673 +245 51 659 673 +246 73 648 673 +4 90 535 674 +14 52 638 674 +37 51 641 674 +42 47 0 674 +46 42 0 674 +55 128 637 674 +73 90 615 674 +75 140 574 674 +80 72 414 674 +86 166 360 674 +89 102 409 674 +94 105 389 674 +114 180 606 674 +126 7 667 674 +142 111 652 674 +144 223 640 674 +145 176 670 674 +167 200 507 674 +172 236 0 674 +191 251 581 674 +200 175 622 674 +228 255 640 674 +228 24 179 674 +229 85 604 674 +240 93 549 674 +1 2 0 675 +4 72 615 675 +32 138 639 675 +55 185 86 675 +68 143 632 675 +91 198 658 675 +106 171 575 675 +116 129 646 675 +122 190 211 675 +122 192 385 675 +146 183 382 675 +165 234 671 675 +175 30 23 675 +201 64 498 675 +206 58 472 675 +228 81 624 675 +239 78 600 675 +11 185 630 676 +17 113 624 676 +35 115 595 676 +48 37 661 676 +66 24 0 676 +73 28 507 676 +75 69 591 676 +81 37 659 676 +86 83 656 676 +94 91 604 676 +106 117 231 676 +116 131 647 676 +125 105 542 676 +158 207 638 676 +161 225 649 676 +163 247 601 676 +168 41 619 676 +189 235 657 676 +190 254 0 676 +194 17 674 676 +212 78 579 676 +226 18 610 676 +238 36 58 676 +255 52 662 676 +256 52 256 676 +15 31 631 677 +34 69 667 677 +48 250 592 677 +54 181 243 677 +153 187 580 677 +178 254 0 677 +180 143 0 677 +180 168 0 677 +202 29 401 677 +203 31 189 677 +206 132 0 677 +209 20 621 677 +214 171 60 677 +218 46 662 677 +236 194 627 677 +253 27 628 677 +4 31 0 678 +38 106 664 678 +49 41 657 678 +69 180 618 678 +81 109 675 678 +100 235 655 678 +105 214 647 678 +114 158 656 678 +132 5 605 678 +151 197 668 678 +195 70 586 678 +195 85 647 678 +199 40 485 678 +200 231 632 678 +202 230 671 678 +234 44 655 678 +240 47 557 678 +244 194 0 678 +244 246 643 678 +244 64 555 678 +247 36 672 678 +255 51 637 678 +4 21 631 679 +4 77 0 679 +10 102 487 679 +11 65 310 679 +22 66 623 679 +34 133 583 679 +49 113 660 679 +60 8 323 679 +72 178 667 679 +73 10 653 679 +114 207 639 679 +126 95 483 679 +136 5 607 679 +137 154 624 679 +142 206 509 679 +156 230 588 679 +159 46 590 679 +160 205 646 679 +167 22 373 679 +188 192 0 679 +197 56 318 679 +199 114 675 679 +218 145 641 679 +223 20 0 679 +248 35 597 679 +4 142 595 680 +14 74 107 680 +15 32 675 680 +31 39 647 680 +48 99 645 680 +54 101 615 680 +65 83 475 680 +96 140 571 680 +122 100 660 680 +130 179 650 680 +131 195 0 680 +137 152 627 680 +138 156 659 680 +162 129 647 680 +163 220 307 680 +170 253 0 680 +179 5 520 680 +190 191 641 680 +196 15 529 680 +225 61 644 680 +226 209 619 680 +226 240 651 680 +227 66 269 680 +228 2 599 680 +244 34 621 680 +254 196 0 680 +256 36 407 680 +1 120 563 681 +3 73 652 681 +4 85 577 681 +11 96 665 681 +15 74 641 681 +22 24 0 681 +22 44 0 681 +33 41 628 681 +34 165 614 681 +45 47 0 681 +51 78 656 681 +52 56 0 681 +57 8 514 681 +68 101 512 681 +70 16 639 681 +100 256 667 681 +134 169 635 681 +137 67 267 681 +164 232 33 681 +172 229 0 681 +181 164 655 681 +182 186 633 681 +193 21 647 681 +200 86 674 681 +218 238 653 681 +244 113 614 681 +246 215 275 681 +22 74 640 682 +38 105 657 682 +75 141 0 682 +92 166 274 682 +100 250 647 682 +103 164 619 682 +125 107 0 682 +126 93 457 682 +144 253 75 682 +153 79 629 682 +155 203 0 682 +180 183 585 682 +182 197 629 682 +189 251 230 682 +197 211 549 682 +243 184 0 682 +22 39 0 683 +38 166 412 683 +45 16 503 683 +49 97 670 683 +90 160 646 683 +112 234 667 683 +112 237 652 683 +114 119 652 683 +194 203 626 683 +218 203 588 683 +224 27 0 683 +228 85 580 683 +237 208 519 683 +15 7 645 684 +44 64 667 684 +76 109 663 684 +94 170 674 684 +126 32 503 684 +130 214 680 684 +133 198 658 684 +135 245 150 684 +149 175 670 684 +153 157 632 684 +195 215 289 684 +196 1 315 684 +197 70 428 684 +202 239 389 684 +218 29 574 684 +228 41 604 684 +238 243 0 684 +2 20 644 685 +9 89 672 685 +19 72 402 685 +39 125 547 685 +49 251 640 685 +76 136 652 685 +87 109 656 685 +105 121 572 685 +107 122 173 685 +122 171 645 685 +122 186 0 685 +137 155 668 685 +138 206 618 685 +139 5 592 685 +151 230 644 685 +158 192 648 685 +167 228 415 685 +195 6 660 685 +197 60 325 685 +200 85 270 685 +204 45 643 685 +255 33 394 685 +22 76 650 686 +23 77 656 686 +38 103 373 686 +43 99 510 686 +50 223 671 686 +62 250 557 686 +66 41 613 686 +75 188 0 686 +75 143 120 686 +78 79 657 686 +92 215 681 686 +95 67 610 686 +98 147 680 686 +106 75 632 686 +106 169 670 686 +107 163 684 686 +119 136 664 686 +125 154 673 686 +154 160 0 686 +172 220 0 686 +173 230 651 686 +184 60 670 686 +202 143 659 686 +203 60 0 686 +204 28 0 686 +209 66 627 686 +241 172 399 686 +246 12 570 686 +247 5 333 686 +10 95 675 687 +11 112 249 687 +16 27 434 687 +22 37 0 687 +36 199 677 687 +42 40 659 687 +44 120 683 687 +45 39 568 687 +45 63 277 687 +50 209 673 687 +61 37 629 687 +65 178 664 687 +81 111 561 687 +112 192 612 687 +117 134 682 687 +118 181 0 687 +123 190 562 687 +151 194 643 687 +151 200 597 687 +170 169 675 687 +171 144 669 687 +193 8 631 687 +213 184 112 687 +247 242 231 687 +248 8 472 687 +22 239 643 688 +23 31 624 688 +33 21 619 688 +49 244 0 688 +54 177 588 688 +60 23 338 688 +78 124 676 688 +85 27 642 688 +95 186 599 688 +95 160 511 688 +100 253 588 688 +142 149 357 688 +142 160 653 688 +144 6 285 688 +155 208 538 688 +199 115 487 688 +200 230 622 688 +208 28 676 688 +212 99 659 688 +217 160 653 688 +219 46 661 688 +223 56 660 688 +236 118 476 688 +237 180 681 688 +256 128 643 688 +22 85 0 689 +52 68 658 689 +60 25 427 689 +92 135 672 689 +107 230 673 689 +113 166 647 689 +130 182 660 689 +183 198 683 689 +184 56 562 689 +186 208 655 689 +199 66 650 689 +211 30 663 689 +214 29 577 689 +217 141 676 689 +225 215 674 689 +234 198 536 689 +240 63 590 689 +246 195 453 689 +246 203 531 689 +253 33 682 689 +37 97 661 690 +42 199 669 690 +45 59 525 690 +113 207 665 690 +120 104 680 690 +124 142 608 690 +134 82 309 690 +173 220 411 690 +174 122 644 690 +176 140 684 690 +179 213 359 690 +209 5 585 690 +214 211 682 690 +217 167 450 690 +221 29 581 690 +224 9 620 690 +238 30 566 690 +241 188 476 690 +247 39 670 690 +1 69 484 691 +9 81 663 691 +38 121 662 691 +55 251 556 691 +57 40 0 691 +93 74 0 691 +98 116 638 691 +104 188 665 691 +134 154 600 691 +136 50 672 691 +149 67 0 691 +155 175 650 691 +170 113 674 691 +190 242 456 691 +191 205 539 691 +194 8 541 691 +203 239 585 691 +205 209 603 691 +222 234 685 691 +224 33 680 691 +239 28 667 691 +241 247 251 691 +242 54 679 691 +245 17 677 691 +250 196 585 691 +253 49 0 691 +254 247 444 691 +12 134 675 692 +24 87 570 692 +29 94 620 692 +36 120 678 692 +49 247 516 692 +65 79 0 692 +85 76 640 692 +90 145 658 692 +93 82 677 692 +112 169 423 692 +133 149 668 692 +137 215 634 692 +144 13 105 692 +153 139 568 692 +153 215 576 692 +162 61 656 692 +188 131 686 692 +193 227 639 692 +205 221 583 692 +212 43 496 692 +214 45 685 692 +236 6 623 692 +236 39 0 692 +252 54 680 692 +3 181 657 693 +8 41 684 693 +12 121 508 693 +31 105 633 693 +32 142 604 693 +45 94 490 693 +54 101 688 693 +65 67 0 693 +83 143 676 693 +94 74 0 693 +95 149 582 693 +110 180 671 693 +116 187 629 693 +136 227 662 693 +153 206 620 693 +164 237 555 693 +222 204 671 693 +227 33 0 693 +233 176 0 693 +248 40 75 693 +249 42 640 693 +3 149 665 694 +14 60 596 694 +41 54 651 694 +43 64 622 694 +60 138 660 694 +125 174 0 694 +130 153 667 694 +131 184 0 694 +133 68 397 694 +136 197 597 694 +174 253 686 694 +175 227 544 694 +179 198 311 694 +180 240 677 694 +191 250 581 694 +192 140 582 694 +212 82 676 694 +217 224 653 694 +222 31 665 694 +225 180 663 694 +246 17 652 694 +255 64 0 694 +52 17 359 695 +70 103 682 695 +77 92 683 695 +83 103 560 695 +109 108 0 695 +112 176 657 695 +119 130 657 695 +134 105 654 695 +147 167 478 695 +154 172 587 695 +163 179 623 695 +175 180 679 695 +211 70 488 695 +213 144 629 695 +226 36 539 695 +230 28 678 695 +231 85 566 695 +242 184 0 695 +17 93 272 696 +28 101 662 696 +41 72 681 696 +50 19 675 696 +54 104 362 696 +102 124 674 696 +106 172 668 696 +108 168 680 696 +108 179 682 696 +114 72 639 696 +130 92 661 696 +134 91 646 696 +141 250 655 696 +150 171 0 696 +170 235 654 696 +179 243 0 696 +182 202 677 696 +189 48 519 696 +214 168 0 696 +217 184 277 696 +221 16 315 696 +223 66 391 696 +226 212 569 696 +246 59 421 696 +246 120 471 696 +248 39 188 696 +17 117 661 697 +41 87 508 697 +44 125 0 697 +57 23 680 697 +75 178 670 697 +81 47 0 697 +128 78 666 697 +130 76 654 697 +139 213 135 697 +139 193 580 697 +147 191 685 697 +150 220 273 697 +152 196 690 697 +231 56 684 697 +246 8 462 697 +253 59 692 697 +13 245 676 698 +13 221 501 698 +15 17 268 698 +32 158 656 698 +65 158 507 698 +85 134 658 698 +104 207 664 698 +109 169 332 698 +122 153 683 698 +125 170 638 698 +127 69 598 698 +144 157 694 698 +169 234 674 698 +191 62 579 698 +195 197 0 698 +211 8 589 698 +219 48 657 698 +231 40 329 698 +241 228 618 698 +244 120 599 698 +244 93 684 698 +11 89 667 699 +40 188 676 699 +49 56 641 699 +70 83 691 699 +75 144 660 699 +103 177 569 699 +107 234 661 699 +124 206 657 699 +136 167 409 699 +146 107 677 699 +146 229 672 699 +151 220 0 699 +153 109 670 699 +155 219 0 699 +164 240 644 699 +174 98 552 699 +178 100 679 699 +204 216 577 699 +211 4 0 699 +212 125 676 699 +225 21 557 699 +231 59 674 699 +236 54 651 699 +241 249 412 699 +246 22 693 699 +9 90 536 700 +14 10 619 700 +24 118 663 700 +38 104 370 700 +60 124 608 700 +63 37 652 700 +65 90 564 700 +112 161 646 700 +113 142 686 700 +149 233 694 700 +164 61 518 700 +182 186 688 700 +189 181 686 700 +193 243 662 700 +206 58 687 700 +226 33 0 700 +240 205 692 700 +243 52 573 700 +11 93 655 701 +12 138 532 701 +19 15 671 701 +43 55 617 701 +60 110 697 701 +65 75 605 701 +71 179 689 701 +82 105 695 701 +91 105 0 701 +100 226 88 701 +109 103 668 701 +117 131 332 701 +129 184 430 701 +150 215 626 701 +172 176 678 701 +181 254 416 701 +218 26 610 701 +225 220 286 701 +227 8 673 701 +251 73 694 701 +1 93 319 702 +3 158 665 702 +13 50 661 702 +14 29 607 702 +24 42 662 702 +41 109 678 702 +61 53 340 702 +84 158 0 702 +88 166 0 702 +94 27 380 702 +100 254 352 702 +104 108 0 702 +122 79 0 702 +129 13 366 702 +145 240 660 702 +153 141 601 702 +159 13 434 702 +168 129 665 702 +175 232 684 702 +177 163 626 702 +225 151 449 702 +243 196 530 702 +246 251 0 702 +3 82 485 703 +5 4 595 703 +11 31 653 703 +13 209 554 703 +64 102 668 703 +66 119 683 703 +71 140 671 703 +92 216 648 703 +96 145 0 703 +100 79 643 703 +110 113 0 703 +125 102 301 703 +125 98 473 703 +138 154 613 703 +145 254 653 703 +148 180 656 703 +157 98 605 703 +157 238 656 703 +165 254 597 703 +195 1 0 703 +201 16 624 703 +212 232 667 703 +212 254 673 703 +239 106 684 703 +246 25 531 703 +6 29 448 704 +16 111 646 704 +20 158 683 704 +24 166 450 704 +30 85 669 704 +35 54 577 704 +36 127 676 704 +38 60 677 704 +41 103 666 704 +45 32 0 704 +50 120 472 704 +62 248 596 704 +64 12 580 704 +75 189 0 704 +86 134 117 704 +116 100 648 704 +133 194 646 704 +149 172 695 704 +165 247 570 704 +172 236 700 704 +202 200 603 704 +212 36 650 704 +215 211 0 704 +246 2 629 704 +250 208 0 704 +35 103 506 705 +36 177 554 705 +59 15 85 705 +65 82 483 705 +75 207 501 705 +76 135 678 705 +77 111 645 705 +86 109 358 705 +103 115 680 705 +107 235 671 705 +121 165 493 705 +128 124 599 705 +152 195 356 705 +157 224 586 705 +168 139 646 705 +203 19 676 705 +212 61 282 705 +244 52 0 705 +245 195 152 705 +252 59 0 705 +21 74 700 706 +22 16 451 706 +48 53 342 706 +48 52 670 706 +50 4 662 706 +53 101 703 706 +71 181 0 706 +76 131 655 706 +107 187 644 706 +114 131 517 706 +145 228 679 706 +149 154 685 706 +149 107 687 706 +167 179 677 706 +168 207 691 706 +172 216 619 706 +174 238 639 706 +191 255 0 706 +193 23 633 706 +196 93 420 706 +205 243 577 706 +205 1 150 706 +209 30 660 706 +215 2 402 706 +218 197 676 706 +222 220 665 706 +6 59 395 707 +7 134 203 707 +43 84 466 707 +59 52 381 707 +104 100 675 707 +133 151 649 707 +143 136 221 707 +143 210 495 707 +146 214 643 707 +153 111 636 707 +154 233 0 707 +159 244 687 707 +166 163 599 707 +175 37 304 707 +187 141 514 707 +189 144 670 707 +211 81 584 707 +243 117 686 707 +249 194 464 707 +12 93 596 708 +20 88 663 708 +50 36 696 708 +76 182 685 708 +85 98 676 708 +87 163 693 708 +90 83 516 708 +98 179 702 708 +109 96 643 708 +112 116 459 708 +121 153 632 708 +182 151 655 708 +185 91 595 708 +208 11 663 708 +242 51 649 708 +248 59 653 708 +5 60 0 709 +6 208 240 709 +18 34 0 709 +22 199 685 709 +35 117 634 709 +46 94 589 709 +47 112 697 709 +60 78 632 709 +72 103 433 709 +75 67 327 709 +84 190 623 709 +90 148 659 709 +95 79 551 709 +95 147 571 709 +95 164 670 709 +146 132 668 709 +146 216 636 709 +205 251 0 709 +210 49 699 709 +215 21 0 709 +226 62 549 709 +54 122 695 710 +60 16 593 710 +84 238 655 710 +87 155 701 710 +92 213 574 710 +107 183 657 710 +109 156 504 710 +130 217 659 710 +137 132 622 710 +145 152 0 710 +152 238 631 710 +157 221 0 710 +161 189 559 710 +177 182 671 710 +193 6 653 710 +203 251 0 710 +214 26 294 710 +223 30 671 710 +237 252 704 710 +242 36 584 710 +243 120 658 710 +3 21 0 711 +9 122 677 711 +13 80 698 711 +27 54 690 711 +39 72 692 711 +49 256 0 711 +51 68 654 711 +53 104 692 711 +59 124 597 711 +63 100 704 711 +105 167 677 711 +133 132 586 711 +134 163 704 711 +135 6 699 711 +146 166 0 711 +161 61 573 711 +191 49 279 711 +197 210 249 711 +212 65 697 711 +12 122 0 712 +35 127 624 712 +35 177 577 712 +39 149 693 712 +53 69 658 712 +60 12 0 712 +66 158 674 712 +87 202 702 712 +156 172 414 712 +156 219 541 712 +170 207 597 712 +224 209 658 712 +249 140 687 712 +6 251 581 713 +6 21 0 713 +19 16 674 713 +19 82 0 713 +45 57 650 713 +49 242 482 713 +64 124 661 713 +73 182 665 713 +79 131 272 713 +89 40 696 713 +90 79 624 713 +109 145 708 713 +120 74 710 713 +121 139 704 713 +129 243 362 713 +146 89 683 713 +146 210 664 713 +148 211 691 713 +183 236 507 713 +202 25 0 713 +206 233 675 713 +207 182 683 713 +219 21 588 713 +227 89 703 713 +232 47 654 713 +234 194 615 713 +14 251 703 714 +14 30 685 714 +48 59 0 714 +62 56 380 714 +77 141 634 714 +83 131 624 714 +91 169 605 714 +92 104 698 714 +120 68 656 714 +136 202 653 714 +142 179 710 714 +151 172 599 714 +193 255 678 714 +200 29 484 714 +205 208 0 714 +213 6 642 714 +217 167 698 714 +237 247 700 714 +241 193 668 714 +241 196 676 714 +256 196 534 714 +9 32 508 715 +9 76 667 715 +10 44 408 715 +11 28 671 715 +17 142 700 715 +20 34 282 715 +40 167 690 715 +60 76 109 715 +69 241 680 715 +72 74 689 715 +87 107 665 715 +101 180 696 715 +105 214 686 715 +106 74 684 715 +188 236 563 715 +201 12 370 715 +210 220 614 715 +215 41 0 715 +233 188 494 715 +239 27 564 715 +246 23 381 715 +9 251 575 716 +14 224 615 716 +55 73 0 716 +72 217 701 716 +74 169 680 716 +94 96 0 716 +101 107 682 716 +118 108 513 716 +120 182 688 716 +173 206 642 716 +184 60 710 716 +192 13 304 716 +221 81 640 716 +238 256 0 716 +65 70 677 717 +65 20 639 717 +80 67 310 717 +92 215 709 717 +101 152 700 717 +104 121 475 717 +122 74 681 717 +163 49 537 717 +166 71 690 717 +206 25 670 717 +238 192 696 717 +242 1 0 717 +5 65 700 718 +23 77 697 718 +64 7 656 718 +70 146 675 718 +85 103 0 718 +109 39 336 718 +133 207 609 718 +139 236 350 718 +154 141 628 718 +158 163 691 718 +184 193 0 718 +192 179 700 718 +222 30 0 718 +223 1 308 718 +238 45 694 718 +248 117 213 718 +9 80 495 719 +11 153 667 719 +23 153 704 719 +26 89 711 719 +28 77 655 719 +38 42 447 719 +39 169 669 719 +59 63 0 719 +85 34 460 719 +85 38 332 719 +90 82 522 719 +99 158 157 719 +149 40 699 719 +153 80 622 719 +157 143 604 719 +157 132 599 719 +192 159 656 719 +197 60 704 719 +198 160 698 719 +198 23 347 719 +199 71 165 719 +201 13 514 719 +201 251 123 719 +213 246 488 719 +213 21 424 719 +218 175 630 719 +222 163 702 719 +223 32 364 719 +229 29 705 719 +242 14 704 719 +4 52 0 720 +11 4 402 720 +14 60 699 720 +34 105 696 720 +35 52 664 720 +43 102 455 720 +50 53 692 720 +55 185 688 720 +62 242 486 720 +98 166 0 720 +102 73 656 720 +104 107 663 720 +119 139 716 720 +119 151 674 720 +148 152 0 720 +168 194 666 720 +168 41 701 720 +172 229 690 720 +177 143 706 720 +184 5 191 720 +193 248 649 720 +206 237 661 720 +219 27 574 720 +240 31 496 720 +247 24 668 720 +46 32 365 721 +50 58 701 721 +53 199 675 721 +54 2 701 721 +62 51 0 721 +70 150 688 721 +90 218 699 721 +113 69 229 721 +117 179 664 721 +123 183 636 721 +123 249 679 721 +128 177 698 721 +130 99 703 721 +133 72 0 721 +159 152 547 721 +174 189 0 721 +183 193 674 721 +185 69 679 721 +204 23 0 721 +222 211 694 721 +3 95 627 722 +5 71 687 722 +42 199 702 722 +49 19 700 722 +51 2 630 722 +58 23 638 722 +62 114 688 722 +82 152 698 722 +87 173 669 722 +96 218 533 722 +104 152 690 722 +119 72 656 722 +119 89 666 722 +127 161 0 722 +138 205 710 722 +140 252 605 722 +158 152 541 722 +180 183 698 722 +201 64 688 722 +204 12 0 722 +216 247 653 722 +225 191 655 722 +233 41 709 722 +1 66 315 723 +8 142 712 723 +14 116 708 723 +21 44 683 723 +23 27 647 723 +23 105 708 723 +36 117 645 723 +37 54 406 723 +44 51 708 723 +65 18 660 723 +69 196 712 723 +78 30 695 723 +87 147 643 723 +88 164 583 723 +123 250 636 723 +134 216 697 723 +152 228 407 723 +176 241 684 723 +180 168 699 723 +183 207 655 723 +200 204 0 723 +200 41 267 723 +203 224 620 723 +219 11 695 723 +220 12 715 723 +225 245 682 723 +1 19 151 724 +6 10 700 724 +26 23 705 724 +32 83 652 724 +33 84 714 724 +37 53 634 724 +37 88 679 724 +55 108 0 724 +61 15 701 724 +73 154 705 724 +87 77 685 724 +88 98 0 724 +98 103 270 724 +104 169 662 724 +109 100 697 724 +115 72 648 724 +118 17 644 724 +133 193 257 724 +134 169 690 724 +134 215 705 724 +166 69 700 724 +166 134 718 724 +185 194 634 724 +208 12 0 724 +228 230 698 724 +232 51 305 724 +240 125 564 724 +243 52 713 724 +255 17 281 724 +13 208 0 725 +19 31 573 725 +22 89 587 725 +32 106 623 725 +32 97 0 725 +48 110 0 725 +62 15 0 725 +66 115 666 725 +87 213 673 725 +91 206 611 725 +109 102 332 725 +119 179 605 725 +120 123 713 725 +121 71 597 725 +132 244 702 725 +132 19 685 725 +177 164 0 725 +182 132 653 725 +187 246 703 725 +192 253 0 725 +218 29 706 725 +229 236 0 725 +247 240 695 725 +7 86 698 726 +7 185 498 726 +37 113 649 726 +72 105 662 726 +101 172 692 726 +119 186 695 726 +136 169 647 726 +142 90 584 726 +198 155 0 726 +208 195 698 726 +215 229 551 726 +223 65 525 726 +235 41 696 726 +241 49 530 726 +247 43 703 726 +7 69 708 727 +11 10 656 727 +20 96 690 727 +24 106 507 727 +29 247 695 727 +39 181 710 727 +41 31 678 727 +57 112 707 727 +59 174 702 727 +65 85 669 727 +80 83 302 727 +108 150 0 727 +129 248 700 727 +167 240 710 727 +168 171 657 727 +207 136 716 727 +219 212 717 727 +219 41 390 727 +238 253 0 727 +243 5 0 727 +246 42 643 727 +35 51 0 728 +40 178 686 728 +43 97 205 728 +47 100 699 728 +58 121 716 728 +66 83 0 728 +98 117 668 728 +116 180 0 728 +132 163 689 728 +149 105 520 728 +156 216 555 728 +160 225 632 728 +166 234 690 728 +173 95 232 728 +175 237 0 728 +177 191 710 728 +182 67 655 728 +188 230 494 728 +211 93 415 728 +217 147 700 728 +232 236 0 728 +238 36 718 728 +11 90 610 729 +47 75 702 729 +55 181 197 729 +97 161 395 729 +107 185 0 729 +112 124 0 729 +125 126 681 729 +190 162 0 729 +195 227 564 729 +227 10 690 729 +231 50 696 729 +238 210 665 729 +241 143 678 729 +20 63 560 730 +22 8 610 730 +46 19 532 730 +58 208 0 730 +81 83 0 730 +85 27 711 730 +87 83 582 730 +92 186 660 730 +124 192 100 730 +130 101 675 730 +146 105 641 730 +168 178 698 730 +169 229 690 730 +185 178 448 730 +203 25 354 730 +204 4 717 730 +206 214 666 730 +245 44 681 730 +8 149 717 731 +13 204 502 731 +23 88 711 731 +30 37 646 731 +31 110 620 731 +71 182 605 731 +82 161 705 731 +99 165 706 731 +104 179 645 731 +105 104 638 731 +107 123 0 731 +118 137 0 731 +122 80 0 731 +123 234 39 731 +123 184 683 731 +128 36 233 731 +132 217 670 731 +138 206 696 731 +144 13 723 731 +144 255 728 731 +184 197 0 731 +190 179 320 731 +213 196 633 731 +237 26 0 731 +245 37 415 731 +29 221 729 732 +31 47 0 732 +37 99 637 732 +53 8 705 732 +72 163 707 732 +90 99 495 732 +90 158 0 732 +91 214 693 732 +111 164 685 732 +122 172 722 732 +157 98 725 732 +160 93 616 732 +190 196 678 732 +196 5 490 732 +202 216 541 732 +216 19 721 732 +228 245 479 732 +249 201 682 732 +23 119 667 733 +24 89 595 733 +31 157 725 733 +45 57 717 733 +53 117 652 733 +58 4 708 733 +86 43 561 733 +89 110 701 733 +96 173 0 733 +99 163 707 733 +100 155 714 733 +103 185 685 733 +131 209 721 733 +144 214 691 733 +184 204 663 733 +204 11 52 733 +212 16 702 733 +217 206 628 733 +222 93 531 733 +229 235 673 733 +233 25 718 733 +243 3 688 733 +12 78 189 734 +12 43 694 734 +17 87 723 734 +33 34 0 734 +37 40 0 734 +50 44 700 734 +53 75 660 734 +59 170 636 734 +87 140 681 734 +98 150 696 734 +110 188 729 734 +111 127 686 734 +112 249 732 734 +116 207 562 734 +117 134 729 734 +123 176 0 734 +127 143 715 734 +128 187 723 734 +133 122 715 734 +134 202 684 734 +150 241 719 734 +153 96 0 734 +156 220 0 734 +167 236 198 734 +179 143 544 734 +217 220 0 734 +240 33 0 734 +21 10 507 735 +22 19 722 735 +28 71 311 735 +34 82 646 735 +43 74 358 735 +62 245 627 735 +67 255 683 735 +82 165 700 735 +108 97 715 735 +108 137 577 735 +112 133 720 735 +119 187 715 735 +130 213 533 735 +136 242 712 735 +136 50 731 735 +139 248 727 735 +144 221 688 735 +149 156 484 735 +171 256 677 735 +183 187 442 735 +184 6 162 735 +188 217 714 735 +198 224 687 735 +223 46 686 735 +233 43 720 735 +245 36 596 735 +12 32 504 736 +14 12 564 736 +17 6 661 736 +21 68 726 736 +42 15 691 736 +43 57 714 736 +106 123 571 736 +129 141 0 736 +142 180 711 736 +162 179 0 736 +174 99 471 736 +199 121 347 736 +235 248 725 736 +247 5 730 736 +4 77 704 737 +15 114 0 737 +24 115 690 737 +26 246 724 737 +27 74 0 737 +59 133 708 737 +74 202 697 737 +103 133 707 737 +138 95 0 737 +138 207 715 737 +146 127 731 737 +178 254 698 737 +188 194 601 737 +192 132 0 737 +206 147 729 737 +7 134 713 738 +22 43 599 738 +39 110 531 738 +59 126 0 738 +86 42 727 738 +107 97 717 738 +110 187 724 738 +126 7 731 738 +126 76 698 738 +137 184 0 738 +153 144 569 738 +166 226 705 738 +206 13 0 738 +219 30 0 738 +222 220 714 738 +225 241 551 738 +240 42 0 738 +3 118 581 739 +12 80 582 739 +50 58 727 739 +55 3 727 739 +62 34 0 739 +63 4 704 739 +69 182 655 739 +75 176 389 739 +84 238 732 739 +97 191 711 739 +105 117 695 739 +108 138 694 739 +109 161 383 739 +135 196 639 739 +166 163 714 739 +167 245 0 739 +180 165 593 739 +205 132 356 739 +205 195 587 739 +227 33 708 739 +234 220 699 739 +7 85 719 740 +7 72 666 740 +34 1 578 740 +53 40 666 740 +83 165 684 740 +99 191 704 740 +113 241 689 740 +126 12 329 740 +143 136 723 740 +147 165 683 740 +151 186 662 740 +154 202 550 740 +155 164 732 740 +182 242 668 740 +183 201 692 740 +192 206 0 740 +233 253 597 740 +237 189 518 740 +238 224 587 740 +244 194 705 740 +248 42 662 740 +249 44 525 740 +9 221 517 741 +20 130 701 741 +24 72 207 741 +38 115 493 741 +45 212 489 741 +51 121 672 741 +59 172 702 741 +64 80 646 741 +90 141 599 741 +107 191 716 741 +116 143 608 741 +118 124 0 741 +127 3 729 741 +131 195 695 741 +134 216 729 741 +144 15 720 741 +160 100 719 741 +170 235 725 741 +199 70 41 741 +215 6 0 741 +218 100 709 741 +231 43 705 741 +240 49 0 741 +9 224 695 742 +25 87 728 742 +34 162 561 742 +44 6 716 742 +49 54 734 742 +59 185 475 742 +81 70 688 742 +83 229 740 742 +104 168 658 742 +113 133 589 742 +120 124 690 742 +124 131 725 742 +127 164 731 742 +159 205 353 742 +167 45 702 742 +178 255 706 742 +192 254 0 742 +210 242 323 742 +224 228 673 742 +237 238 0 742 +249 57 0 742 +252 5 628 742 +4 95 0 743 +11 8 669 743 +25 30 711 743 +46 31 282 743 +49 125 672 743 +55 107 138 743 +57 15 686 743 +93 125 677 743 +96 154 0 743 +108 124 519 743 +110 218 713 743 +111 222 682 743 +122 100 706 743 +128 77 0 743 +136 140 650 743 +148 226 580 743 +183 252 519 743 +183 194 430 743 +204 196 734 743 +222 234 720 743 +234 248 711 743 +241 135 730 743 +252 204 0 743 +4 64 651 744 +22 18 0 744 +24 98 640 744 +42 54 657 744 +48 44 0 744 +78 10 0 744 +110 156 690 744 +117 124 711 744 +120 60 199 744 +122 137 686 744 +152 197 740 744 +180 179 0 744 +185 201 731 744 +192 256 0 744 +210 17 719 744 +227 19 97 744 +4 114 115 745 +24 97 740 745 +30 157 717 745 +34 88 639 745 +71 158 731 745 +87 91 0 745 +101 115 681 745 +103 226 708 745 +105 166 0 745 +119 91 374 745 +122 174 710 745 +126 32 720 745 +136 156 474 745 +143 244 643 745 +148 212 0 745 +154 186 607 745 +186 223 727 745 +189 168 721 745 +206 195 718 745 +18 88 656 746 +34 127 587 746 +58 12 523 746 +63 190 706 746 +66 24 729 746 +70 130 660 746 +71 92 200 746 +81 158 0 746 +93 47 0 746 +129 198 741 746 +134 194 689 746 +138 139 694 746 +142 196 683 746 +159 242 634 746 +160 196 650 746 +173 165 741 746 +203 215 597 746 +212 227 0 746 +212 240 0 746 +214 229 0 746 +231 85 708 746 +237 219 0 746 +20 98 435 747 +21 71 324 747 +27 117 703 747 +40 185 668 747 +60 105 730 747 +65 130 0 747 +76 186 621 747 +85 69 708 747 +115 207 636 747 +119 183 641 747 +146 102 706 747 +157 100 503 747 +192 242 529 747 +5 227 582 748 +10 95 722 748 +27 54 712 748 +34 27 704 748 +41 92 721 748 +55 6 722 748 +55 11 720 748 +68 88 405 748 +70 69 0 748 +74 95 0 748 +107 75 713 748 +153 182 183 748 +157 107 736 748 +157 191 660 748 +167 234 640 748 +182 202 722 748 +201 208 0 748 +236 6 738 748 +242 2 632 748 +5 204 527 749 +5 11 684 749 +34 8 730 749 +38 102 0 749 +51 166 691 749 +72 152 525 749 +84 190 724 749 +138 188 708 749 +143 13 205 749 +146 169 294 749 +185 165 265 749 +213 229 514 749 +217 160 742 749 +217 219 0 749 +18 39 710 750 +39 51 710 750 +42 108 744 750 +44 11 727 750 +48 10 681 750 +48 35 685 750 +51 127 584 750 +55 133 696 750 +63 177 675 750 +91 151 0 750 +93 74 729 750 +123 202 731 750 +155 191 687 750 +186 201 475 750 +189 181 719 750 +199 3 0 750 +231 105 724 750 +233 208 715 750 +17 12 730 751 +17 69 517 751 +22 235 697 751 +37 82 0 751 +51 101 709 751 +59 51 723 751 +64 190 731 751 +124 204 727 751 +148 196 669 751 +171 236 567 751 +180 250 745 751 +198 233 693 751 +198 208 82 751 +208 22 535 751 +222 219 0 751 +1 115 561 752 +6 2 0 752 +9 32 728 752 +28 72 623 752 +31 91 708 752 +45 256 636 752 +71 132 717 752 +101 164 451 752 +102 73 724 752 +104 238 726 752 +122 91 395 752 +123 155 749 752 +166 150 0 752 +170 116 469 752 +178 205 704 752 +181 238 727 752 +182 136 0 752 +184 256 694 752 +214 200 362 752 +224 212 533 752 +230 42 0 752 +248 27 729 752 +27 122 718 753 +45 93 500 753 +48 97 0 753 +49 230 701 753 +51 178 408 753 +56 119 742 753 +70 137 657 753 +83 228 730 753 +87 213 733 753 +147 214 631 753 +149 169 264 753 +165 171 380 753 +166 124 682 753 +177 179 550 753 +185 249 402 753 +197 57 613 753 +211 36 707 753 +212 24 745 753 +217 201 0 753 +221 32 639 753 +253 118 734 753 +5 219 696 754 +10 155 722 754 +51 98 686 754 +53 75 738 754 +57 73 0 754 +60 170 748 754 +69 82 708 754 +80 69 324 754 +105 165 511 754 +137 77 653 754 +138 217 723 754 +144 194 488 754 +173 152 720 754 +177 71 736 754 +199 122 744 754 +211 38 700 754 +2 89 669 755 +20 146 671 755 +41 82 753 755 +96 178 727 755 +106 117 696 755 +108 133 585 755 +111 170 0 755 +111 171 0 755 +116 178 0 755 +137 187 561 755 +174 165 740 755 +179 255 497 755 +180 143 693 755 +189 179 588 755 +202 152 695 755 +224 93 502 755 +231 40 731 755 +236 46 713 755 +245 54 624 755 +247 194 478 755 +248 58 674 755 +4 126 35 756 +6 28 314 756 +8 88 685 756 +10 157 724 756 +16 123 742 756 +48 53 728 756 +60 78 744 756 +84 160 739 756 +94 52 683 756 +118 133 0 756 +124 213 731 756 +133 139 630 756 +135 242 0 756 +143 131 0 756 +159 131 615 756 +167 238 746 756 +180 234 744 756 +192 196 222 756 +210 238 734 756 +214 45 741 756 +225 196 694 756 +249 187 0 756 +252 13 665 756 +252 197 0 756 +5 215 284 757 +8 131 751 757 +20 86 663 757 +43 89 360 757 +47 60 751 757 +53 190 659 757 +68 101 723 757 +68 178 650 757 +69 153 730 757 +69 95 558 757 +69 151 690 757 +69 217 732 757 +97 115 351 757 +109 59 0 757 +109 155 649 757 +110 155 681 757 +125 121 742 757 +149 209 739 757 +157 206 541 757 +161 147 405 757 +161 45 745 757 +162 61 751 757 +164 181 700 757 +165 235 735 757 +176 201 598 757 +193 19 612 757 +211 215 714 757 +213 209 486 757 +234 46 735 757 +237 187 626 757 +250 196 728 757 +252 125 740 757 +1 96 734 758 +9 122 743 758 +20 145 659 758 +31 95 624 758 +32 142 750 758 +73 187 696 758 +76 90 0 758 +87 173 731 758 +108 73 540 758 +136 148 40 758 +137 144 575 758 +167 241 270 758 +195 228 612 758 +247 256 741 758 +250 223 654 758 +252 63 739 758 +253 6 733 758 +13 122 742 759 +53 98 652 759 +73 188 687 759 +76 138 668 759 +81 69 694 759 +83 209 711 759 +106 57 0 759 +126 113 0 759 +127 205 720 759 +128 190 0 759 +130 155 739 759 +134 163 745 759 +137 138 673 759 +146 183 733 759 +154 150 0 759 +176 242 740 759 +190 176 0 759 +210 148 0 759 +210 226 613 759 +217 147 736 759 +231 101 726 759 +232 18 495 759 +235 58 746 759 +236 201 367 759 +16 122 681 760 +48 243 734 760 +79 223 709 760 +83 226 701 760 +87 147 738 760 +87 169 580 760 +111 103 735 760 +129 246 692 760 +145 170 619 760 +145 181 710 760 +149 129 731 760 +175 232 731 760 +187 252 533 760 +246 23 728 760 +252 38 732 760 +11 185 722 761 +14 30 746 761 +16 153 679 761 +26 154 755 761 +44 125 723 761 +48 13 712 761 +58 5 660 761 +87 135 663 761 +106 118 0 761 +117 182 0 761 +136 50 750 761 +144 252 111 761 +145 192 733 761 +175 61 226 761 +179 244 712 761 +195 208 742 761 +247 56 302 761 +255 223 623 761 +8 82 747 762 +10 103 745 762 +11 117 716 762 +27 118 706 762 +62 60 739 762 +75 80 0 762 +78 123 740 762 +81 99 0 762 +91 187 742 762 +99 148 607 762 +103 171 622 762 +119 172 715 762 +125 126 737 762 +136 229 727 762 +139 215 97 762 +158 193 706 762 +165 237 742 762 +168 199 737 762 +198 216 0 762 +211 168 699 762 +214 227 310 762 +215 28 0 762 +236 38 0 762 +236 112 747 762 +237 180 732 762 +13 16 601 763 +30 82 362 763 +44 56 665 763 +48 36 0 763 +54 133 303 763 +68 136 448 763 +138 111 754 763 +160 171 737 763 +167 171 0 763 +170 240 673 763 +172 241 694 763 +192 255 309 763 +211 254 694 763 +230 245 682 763 +236 11 734 763 +249 179 246 763 +249 250 0 763 +256 57 675 763 +7 21 0 764 +23 3 231 764 +38 27 278 764 +52 187 733 764 +58 54 680 764 +62 52 0 764 +73 79 731 764 +91 206 741 764 +93 10 0 764 +99 161 0 764 +102 133 673 764 +103 110 690 764 +104 167 643 764 +110 172 668 764 +114 80 343 764 +120 102 665 764 +128 114 216 764 +157 237 0 764 +170 189 0 764 +179 243 720 764 +188 230 735 764 +225 214 340 764 +249 191 705 764 +9 57 654 765 +14 224 722 765 +32 72 738 765 +43 107 553 765 +69 83 0 765 +100 46 750 765 +121 171 468 765 +123 80 719 765 +128 192 738 765 +134 182 0 765 +135 147 607 765 +141 205 0 765 +150 215 747 765 +174 184 741 765 +179 254 0 765 +202 239 759 765 +231 42 291 765 +245 53 626 765 +248 39 719 765 +252 194 488 765 +253 1 737 765 +67 135 133 766 +69 147 600 766 +70 73 579 766 +81 21 609 766 +88 162 509 766 +111 191 675 766 +117 131 726 766 +119 170 730 766 +124 139 0 766 +134 198 633 766 +137 91 0 766 +143 218 758 766 +144 253 730 766 +171 256 736 766 +191 256 557 766 +212 36 715 766 +216 25 682 766 +226 227 522 766 +234 255 723 766 +251 118 647 766 +6 78 725 767 +10 110 543 767 +58 44 665 767 +62 51 754 767 +106 166 376 767 +115 179 0 767 +128 105 726 767 +128 116 0 767 +146 229 728 767 +165 179 0 767 +183 242 571 767 +220 42 582 767 +231 118 748 767 +256 125 410 767 +4 80 103 768 +15 123 741 768 +29 107 761 768 +51 133 395 768 +60 97 727 768 +72 145 737 768 +92 163 443 768 +129 141 754 768 +134 73 627 768 +144 246 95 768 +152 162 610 768 +153 138 0 768 +186 205 0 768 +210 221 500 768 +218 197 754 768 +227 248 726 768 +241 184 0 768 +243 247 0 768 +246 256 712 768 +253 59 727 768 +256 223 603 768 +8 130 682 769 +15 12 516 769 +32 155 700 769 +33 82 0 769 +36 57 764 769 +39 43 0 769 +48 106 0 769 +60 52 655 769 +75 176 762 769 +85 92 0 769 +113 56 0 769 +114 100 749 769 +116 155 738 769 +119 138 664 769 +121 165 726 769 +127 181 646 769 +146 132 745 769 +164 61 725 769 +171 230 0 769 +181 207 631 769 +213 163 560 769 +218 216 655 769 +243 41 746 769 +246 59 733 769 +14 10 729 770 +15 90 745 770 +26 12 751 770 +29 111 764 770 +47 51 695 770 +50 252 29 770 +55 107 754 770 +66 41 727 770 +68 132 0 770 +78 124 759 770 +83 143 741 770 +87 107 739 770 +103 217 749 770 +111 214 748 770 +125 108 753 770 +135 216 191 770 +154 172 755 770 +165 247 727 770 +166 75 763 770 +184 144 257 770 +217 200 165 770 +4 239 724 771 +33 97 0 771 +50 118 696 771 +64 170 684 771 +68 155 720 771 +75 144 752 771 +79 204 703 771 +97 116 444 771 +107 75 763 771 +117 188 318 771 +120 104 743 771 +124 192 740 771 +127 96 740 771 +132 222 746 771 +134 140 502 771 +139 143 704 771 +146 210 742 771 +160 228 663 771 +173 235 15 771 +182 197 723 771 +194 54 726 771 +209 49 682 771 +236 54 735 771 +237 208 766 771 +20 110 584 772 +23 72 669 772 +31 105 711 772 +46 53 751 772 +67 155 755 772 +70 154 653 772 +81 130 693 772 +83 100 711 772 +90 148 761 772 +113 39 714 772 +142 90 762 772 +150 218 641 772 +153 198 0 772 +156 158 759 772 +168 242 575 772 +169 45 750 772 +171 46 747 772 +195 221 524 772 +207 179 351 772 +213 2 446 772 +219 236 769 772 +224 61 233 772 +226 211 523 772 +253 11 728 772 +32 138 746 773 +33 101 0 773 +42 15 759 773 +54 23 671 773 +60 77 0 773 +68 146 619 773 +78 157 720 773 +91 143 738 773 +105 121 706 773 +146 92 410 773 +151 102 768 773 +152 197 762 773 +153 215 708 773 +243 114 659 773 +15 7 712 774 +62 110 755 774 +65 97 731 774 +68 141 0 774 +68 131 394 774 +68 147 0 774 +83 221 724 774 +96 82 621 774 +107 117 693 774 +141 164 682 774 +142 155 90 774 +145 176 756 774 +148 239 710 774 +149 135 0 774 +151 140 0 774 +159 200 713 774 +166 76 760 774 +173 150 598 774 +193 244 0 774 +208 228 704 774 +219 74 759 774 +232 35 518 774 +232 21 727 774 +233 191 567 774 +243 120 760 774 +11 80 0 775 +27 121 708 775 +33 41 734 775 +47 114 695 775 +69 143 606 775 +114 207 762 775 +151 237 762 775 +183 252 754 775 +185 250 745 775 +192 158 708 775 +193 214 633 775 +195 53 745 775 +211 26 699 775 +216 29 454 775 +221 49 681 775 +233 188 742 775 +234 42 642 775 +246 11 549 775 +252 203 0 775 +8 133 304 776 +23 153 757 776 +26 248 544 776 +39 128 757 776 +62 34 754 776 +78 122 110 776 +89 155 683 776 +90 158 757 776 +97 123 761 776 +115 180 0 776 +125 170 719 776 +130 76 753 776 +133 87 74 776 +161 206 620 776 +163 227 549 776 +190 124 753 776 +193 215 549 776 +227 57 756 776 +240 42 749 776 +247 6 641 776 +1 110 762 777 +52 73 741 777 +57 40 737 777 +65 95 0 777 +72 92 175 777 +76 149 635 777 +83 210 601 777 +83 191 698 777 +119 75 715 777 +130 163 680 777 +138 95 749 777 +172 179 633 777 +174 167 685 777 +181 167 633 777 +183 254 420 777 +186 161 674 777 +188 201 0 777 +189 63 753 777 +211 232 655 777 +222 229 734 777 +223 65 748 777 +233 222 245 777 +244 55 766 777 +21 76 594 778 +42 1 750 778 +67 195 688 778 +70 119 145 778 +86 71 240 778 +106 172 704 778 +120 122 685 778 +132 150 744 778 +133 73 85 778 +144 213 736 778 +151 198 0 778 +151 155 0 778 +153 111 726 778 +156 150 0 778 +167 211 706 778 +167 228 765 778 +173 170 0 778 +193 140 662 778 +203 6 0 778 +213 169 636 778 +213 206 751 778 +251 57 0 778 +253 33 767 778 +253 47 750 778 +40 241 709 779 +47 90 761 779 +55 106 0 779 +64 114 507 779 +76 140 0 779 +85 55 755 779 +120 11 649 779 +125 1 687 779 +132 228 743 779 +161 172 758 779 +162 46 739 779 +182 199 737 779 +212 95 702 779 +223 66 762 779 +238 209 414 779 +247 50 0 779 +254 24 746 779 +18 80 752 780 +23 71 77 780 +28 107 741 780 +34 146 499 780 +39 146 677 780 +45 33 0 780 +48 13 775 780 +65 127 727 780 +65 96 416 780 +77 141 770 780 +128 154 736 780 +134 179 180 780 +164 37 764 780 +179 67 97 780 +190 132 0 780 +198 152 684 780 +217 197 0 780 +222 49 483 780 +243 44 676 780 +15 74 723 781 +20 113 657 781 +33 113 569 781 +36 44 669 781 +73 170 688 781 +77 140 606 781 +90 141 754 781 +107 97 769 781 +109 35 725 781 +115 116 0 781 +123 172 528 781 +128 57 749 781 +131 214 769 781 +149 159 718 781 +156 174 609 781 +181 249 430 781 +185 91 725 781 +193 204 770 781 +203 197 497 781 +219 212 767 781 +227 31 758 781 +238 231 747 781 +16 157 712 782 +19 82 718 782 +32 110 338 782 +37 57 765 782 +47 75 737 782 +59 154 745 782 +68 99 290 782 +70 92 151 782 +90 218 766 782 +106 40 28 782 +108 97 755 782 +108 140 551 782 +132 163 731 782 +149 193 700 782 +155 208 764 782 +166 131 686 782 +171 144 728 782 +190 205 0 782 +219 11 765 782 +222 30 734 782 +227 43 711 782 +233 183 0 782 +249 248 0 782 +26 232 488 783 +35 28 743 783 +46 256 623 783 +49 101 728 783 +51 40 0 783 +64 121 0 783 +83 131 776 783 +93 85 767 783 +186 250 0 783 +246 200 77 783 +251 75 691 783 +48 93 598 784 +49 247 777 784 +51 190 594 784 +60 110 710 784 +70 151 666 784 +81 71 702 784 +95 141 0 784 +136 196 185 784 +179 247 0 784 +185 77 602 784 +189 53 751 784 +190 157 767 784 +213 186 740 784 +236 10 745 784 +244 115 768 784 +12 217 778 785 +14 80 565 785 +22 7 597 785 +22 27 0 785 +78 190 719 785 +106 156 767 785 +164 49 491 785 +167 188 619 785 +175 162 653 785 +182 136 762 785 +189 229 740 785 +190 133 519 785 +226 33 760 785 +229 2 729 785 +229 35 757 785 +7 16 302 786 +20 157 681 786 +23 105 751 786 +47 112 754 786 +118 23 349 786 +121 77 0 786 +122 187 242 786 +127 115 538 786 +132 160 466 786 +135 5 522 786 +170 235 775 786 +181 67 0 786 +188 205 744 786 +196 51 775 786 +196 53 766 786 +214 197 533 786 +214 206 743 786 +236 248 0 786 +236 105 732 786 +248 41 568 786 +256 52 763 786 +1 177 715 787 +5 204 771 787 +10 44 735 787 +11 91 340 787 +69 179 599 787 +73 166 672 787 +81 114 430 787 +100 235 720 787 +115 68 588 787 +116 141 445 787 +120 131 665 787 +139 193 739 787 +152 37 760 787 +156 103 668 787 +158 218 757 787 +164 168 0 787 +182 235 764 787 +185 192 741 787 +195 3 749 787 +198 218 0 787 +212 109 723 787 +213 9 748 787 +213 25 618 787 +229 36 571 787 +238 216 740 787 +240 31 756 787 +251 52 506 787 +30 154 701 788 +35 145 661 788 +45 16 774 788 +47 1 688 788 +47 13 727 788 +49 85 754 788 +71 82 707 788 +90 161 442 788 +115 67 0 788 +134 129 170 788 +138 155 0 788 +159 136 207 788 +163 209 695 788 +173 150 782 788 +180 232 774 788 +196 221 0 788 +238 211 554 788 +252 41 768 788 +252 7 738 788 +16 106 778 789 +29 59 731 789 +51 97 0 789 +62 32 744 789 +81 52 763 789 +108 119 0 789 +114 129 779 789 +122 100 757 789 +122 192 747 789 +129 5 608 789 +131 140 221 789 +141 237 718 789 +156 224 409 789 +159 33 776 789 +173 83 783 789 +173 191 0 789 +216 44 753 789 +219 30 747 789 +228 93 556 789 +230 246 691 789 +230 248 412 789 +232 13 780 789 +235 205 753 789 +236 199 303 789 +242 200 672 789 +255 113 767 789 +8 142 732 790 +17 80 779 790 +44 101 737 790 +47 177 624 790 +51 81 764 790 +63 24 760 790 +68 79 0 790 +74 214 757 790 +81 138 725 790 +140 205 741 790 +155 204 231 790 +192 141 0 790 +203 243 783 790 +227 105 736 790 +4 31 703 791 +11 23 545 791 +25 105 713 791 +61 196 774 791 +62 1 0 791 +75 67 781 791 +87 131 345 791 +87 214 654 791 +90 83 762 791 +92 110 681 791 +96 161 163 791 +119 77 274 791 +140 197 645 791 +149 216 126 791 +151 249 761 791 +157 110 454 791 +182 247 480 791 +188 201 780 791 +203 31 782 791 +219 15 711 791 +231 50 746 791 +247 201 0 791 +16 27 768 792 +19 86 778 792 +50 65 770 792 +61 1 760 792 +63 78 692 792 +72 217 761 792 +78 74 0 792 +106 88 699 792 +111 146 786 792 +115 129 387 792 +124 218 732 792 +137 194 323 792 +159 238 595 792 +164 232 711 792 +166 241 251 792 +185 249 785 792 +207 243 252 792 +229 28 766 792 +2 24 758 793 +46 205 740 793 +61 245 624 793 +75 91 0 793 +89 40 783 793 +90 174 68 793 +94 112 398 793 +137 139 0 793 +154 237 0 793 +157 98 754 793 +170 205 694 793 +172 187 0 793 +176 162 754 793 +183 140 223 793 +186 203 61 793 +197 45 769 793 +204 45 753 793 +247 118 642 793 +256 206 724 793 +1 56 0 794 +13 75 789 794 +32 142 772 794 +32 3 792 794 +57 119 703 794 +73 96 699 794 +75 207 769 794 +96 218 748 794 +99 103 779 794 +109 155 774 794 +121 187 609 794 +122 190 726 794 +128 111 690 794 +145 228 765 794 +147 226 484 794 +153 155 0 794 +157 132 721 794 +163 169 304 794 +207 195 697 794 +216 49 744 794 +229 55 780 794 +233 165 649 794 +22 86 0 795 +22 31 429 795 +42 111 741 795 +86 106 0 795 +94 127 23 795 +94 100 180 795 +98 115 0 795 +111 127 777 795 +116 192 0 795 +120 177 566 795 +130 145 682 795 +140 218 655 795 +141 214 740 795 +151 202 478 795 +190 91 730 795 +198 14 780 795 +198 220 364 795 +201 205 0 795 +207 244 0 795 +247 21 782 795 +248 59 717 795 +249 245 0 795 +33 216 771 796 +33 240 745 796 +34 103 485 796 +76 105 298 796 +83 238 658 796 +93 3 776 796 +94 146 714 796 +94 148 733 796 +137 210 762 796 +190 171 787 796 +197 76 788 796 +198 208 771 796 +198 25 0 796 +204 239 572 796 +209 70 784 796 +210 215 0 796 +214 240 787 796 +221 16 779 796 +221 81 787 796 +233 44 779 796 +242 63 761 796 +248 24 324 796 +9 81 786 797 +28 59 741 797 +50 53 744 797 +78 75 651 797 +90 110 356 797 +92 112 720 797 +96 154 778 797 +125 102 739 797 +129 200 680 797 +134 67 0 797 +160 238 580 797 +177 116 0 797 +183 187 775 797 +208 240 548 797 +209 239 0 797 +219 240 544 797 +220 16 768 797 +224 25 0 797 +228 22 789 797 +237 238 775 797 +20 251 762 798 +25 86 0 798 +37 27 671 798 +47 146 789 798 +66 99 770 798 +72 152 752 798 +87 152 303 798 +92 165 483 798 +94 101 685 798 +126 119 711 798 +128 73 414 798 +156 167 0 798 +174 121 696 798 +191 251 782 798 +209 229 205 798 +234 43 779 798 +242 1 764 798 +243 64 769 798 +18 38 264 799 +36 95 788 799 +39 99 744 799 +46 243 0 799 +48 60 674 799 +55 99 757 799 +63 116 0 799 +65 97 784 799 +66 28 298 799 +66 24 758 799 +134 167 793 799 +135 195 142 799 +148 239 787 799 +164 239 795 799 +231 242 773 799 +244 68 780 799 +247 245 0 799 +249 44 747 799 +6 78 781 800 +11 93 796 800 +48 106 780 800 +112 98 760 800 +119 89 738 800 +141 212 796 800 +143 9 768 800 +148 208 703 800 +148 228 306 800 +154 95 0 800 +209 8 794 800 +240 230 540 800 +252 128 740 800 +254 56 620 800 +1 177 798 801 +7 77 286 801 +12 91 0 801 +20 101 422 801 +21 36 722 801 +27 40 486 801 +40 249 787 801 +50 120 766 801 +78 91 80 801 +109 99 554 801 +139 206 582 801 +165 216 643 801 +168 41 738 801 +185 213 753 801 +201 220 783 801 +212 43 714 801 +4 68 0 802 +5 85 785 802 +13 77 788 802 +16 43 450 802 +16 76 123 802 +44 56 790 802 +49 44 748 802 +84 158 775 802 +94 104 747 802 +104 192 782 802 +112 187 0 802 +114 79 540 802 +124 214 715 802 +137 129 463 802 +156 152 0 802 +156 237 0 802 +188 247 476 802 +197 230 778 802 +208 13 795 802 +213 224 738 802 +226 175 0 802 +230 24 781 802 +248 4 790 802 +8 10 774 803 +22 8 755 803 +22 18 764 803 +27 174 786 803 +30 113 727 803 +36 39 686 803 +59 174 788 803 +60 119 0 803 +61 244 441 803 +73 140 589 803 +108 84 695 803 +111 108 706 803 +122 174 748 803 +127 188 765 803 +132 22 789 803 +164 241 0 803 +183 235 432 803 +198 141 735 803 +198 23 723 803 +200 86 785 803 +210 4 781 803 +214 165 0 803 +223 200 722 803 +229 57 780 803 +237 180 787 803 +240 29 564 803 +243 251 739 803 +249 227 726 803 +2 25 570 804 +7 72 765 804 +16 96 615 804 +28 101 723 804 +58 63 705 804 +94 161 180 804 +103 226 782 804 +109 156 785 804 +133 142 473 804 +145 189 601 804 +145 241 569 804 +151 132 449 804 +151 193 329 804 +216 224 686 804 +229 246 786 804 +238 239 0 804 +13 97 740 805 +19 87 775 805 +30 53 751 805 +37 66 703 805 +50 211 776 805 +57 8 794 805 +69 80 770 805 +72 99 188 805 +73 78 253 805 +73 112 120 805 +73 217 715 805 +100 205 720 805 +107 165 496 805 +132 5 774 805 +133 67 0 805 +139 213 722 805 +140 214 658 805 +141 219 725 805 +146 87 610 805 +199 121 761 805 +207 193 0 805 +215 148 778 805 +223 228 665 805 +234 64 779 805 +237 219 756 805 +242 15 779 805 +252 27 722 805 +2 71 512 806 +7 133 270 806 +15 17 770 806 +18 88 770 806 +48 97 794 806 +59 172 790 806 +62 42 35 806 +66 153 786 806 +78 96 0 806 +84 237 554 806 +114 241 739 806 +120 19 784 806 +122 74 728 806 +163 227 785 806 +168 45 761 806 +186 182 716 806 +206 45 789 806 +208 33 702 806 +214 45 780 806 +216 70 777 806 +227 224 741 806 +231 234 772 806 +239 49 0 806 +3 82 751 807 +5 71 747 807 +16 95 439 807 +22 231 0 807 +25 41 0 807 +41 82 792 807 +44 40 0 807 +46 236 789 807 +55 113 682 807 +61 42 685 807 +66 101 172 807 +114 192 718 807 +126 93 793 807 +161 45 788 807 +185 246 770 807 +191 188 743 807 +198 203 0 807 +200 204 760 807 +216 45 746 807 +229 44 591 807 +238 253 755 807 +239 106 776 807 +247 61 803 807 +248 117 746 807 +11 10 770 808 +15 138 575 808 +26 234 518 808 +27 87 763 808 +28 92 0 808 +46 32 785 808 +75 142 0 808 +76 140 795 808 +84 218 779 808 +92 161 702 808 +94 113 528 808 +109 157 440 808 +160 29 796 808 +168 236 143 808 +180 143 780 808 +185 234 0 808 +200 85 781 808 +204 11 770 808 +214 171 800 808 +222 226 584 808 +240 26 496 808 +248 36 308 808 +256 204 690 808 +256 65 737 808 +16 30 421 809 +33 109 700 809 +34 133 688 809 +55 114 772 809 +61 60 761 809 +94 155 699 809 +97 138 771 809 +143 15 779 809 +144 218 254 809 +156 206 612 809 +169 45 778 809 +183 231 582 809 +197 211 747 809 +197 224 667 809 +1 69 774 810 +20 3 793 810 +37 22 697 810 +58 93 789 810 +74 155 487 810 +80 149 786 810 +85 40 332 810 +102 237 804 810 +112 237 723 810 +147 165 749 810 +174 123 0 810 +183 247 0 810 +190 80 263 810 +230 43 717 810 +235 42 0 810 +256 6 718 810 +2 41 523 811 +4 8 0 811 +6 117 774 811 +16 89 289 811 +45 25 504 811 +61 128 773 811 +83 104 603 811 +119 156 768 811 +124 155 258 811 +129 246 774 811 +136 233 786 811 +143 256 458 811 +169 191 731 811 +171 238 759 811 +177 117 315 811 +179 244 807 811 +199 119 357 811 +203 17 777 811 +207 209 795 811 +208 196 0 811 +209 37 676 811 +228 245 764 811 +244 93 747 811 +12 72 687 812 +22 247 787 812 +34 8 784 812 +38 13 758 812 +41 36 647 812 +78 138 115 812 +92 40 597 812 +117 3 556 812 +122 116 219 812 +124 87 629 812 +125 105 719 812 +139 207 802 812 +147 195 76 812 +160 147 441 812 +175 49 266 812 +208 77 791 812 +228 2 699 812 +229 24 330 812 +254 50 373 812 +7 123 735 813 +17 69 770 813 +25 43 411 813 +51 190 799 813 +58 255 720 813 +77 155 363 813 +105 218 789 813 +108 127 697 813 +124 111 749 813 +139 61 811 813 +161 147 775 813 +169 247 761 813 +171 183 274 813 +179 209 788 813 +199 34 521 813 +232 196 781 813 +248 8 781 813 +1 124 806 814 +19 72 698 814 +20 86 774 814 +62 109 720 814 +77 89 262 814 +77 173 795 814 +79 178 0 814 +80 99 801 814 +81 99 793 814 +84 192 724 814 +98 240 798 814 +124 151 681 814 +124 173 732 814 +202 14 734 814 +226 216 508 814 +226 247 234 814 +233 163 335 814 +239 42 424 814 +8 117 479 815 +51 121 793 815 +80 130 693 815 +91 105 781 815 +140 155 0 815 +142 144 803 815 +145 192 776 815 +147 162 637 815 +153 167 780 815 +156 148 729 815 +166 237 802 815 +166 187 682 815 +214 161 700 815 +234 44 689 815 +238 212 290 815 +238 243 697 815 +248 200 792 815 +22 41 0 816 +23 16 309 816 +34 44 399 816 +57 102 145 816 +69 117 404 816 +70 20 765 816 +71 89 0 816 +74 116 729 816 +74 157 0 816 +98 176 747 816 +108 191 702 816 +109 174 0 816 +112 161 752 816 +126 97 632 816 +145 226 397 816 +170 189 773 816 +203 243 804 816 +213 246 738 816 +221 253 784 816 +227 87 794 816 +12 151 736 817 +25 87 753 817 +34 190 803 817 +40 69 811 817 +45 32 764 817 +62 31 768 817 +65 75 715 817 +73 116 690 817 +97 192 722 817 +128 116 772 817 +146 130 0 817 +159 219 767 817 +209 22 717 817 +227 236 693 817 +237 26 762 817 +250 57 613 817 +18 3 764 818 +21 44 728 818 +48 250 769 818 +60 123 610 818 +61 15 765 818 +84 52 623 818 +91 159 792 818 +104 164 0 818 +120 52 800 818 +124 157 740 818 +135 248 805 818 +141 14 736 818 +155 223 812 818 +181 184 0 818 +200 41 785 818 +202 220 0 818 +207 50 131 818 +225 220 787 818 +240 188 745 818 +245 4 791 818 +248 120 306 818 +253 27 678 818 +32 97 804 819 +33 101 806 819 +36 110 786 819 +40 241 811 819 +48 32 0 819 +77 20 800 819 +84 238 777 819 +119 165 815 819 +138 74 0 819 +143 78 806 819 +163 184 788 819 +168 44 605 819 +239 35 784 819 +243 8 803 819 +249 191 800 819 +254 196 758 819 +16 111 726 820 +20 83 240 820 +21 72 192 820 +24 165 810 820 +47 52 191 820 +53 8 800 820 +55 53 691 820 +55 181 741 820 +88 106 819 820 +90 138 524 820 +132 216 571 820 +132 2 773 820 +142 192 0 820 +143 255 110 820 +152 226 0 820 +155 235 815 820 +158 150 807 820 +167 45 772 820 +173 95 759 820 +175 62 766 820 +181 167 812 820 +206 220 668 820 +207 14 781 820 +234 203 541 820 +242 14 773 820 +256 196 720 820 +256 126 713 820 +19 37 280 821 +24 146 444 821 +25 21 0 821 +35 72 422 821 +47 68 803 821 +49 86 780 821 +58 77 524 821 +72 101 210 821 +72 133 750 821 +83 160 545 821 +96 173 749 821 +154 161 26 821 +171 45 689 821 +200 26 791 821 +242 54 736 821 +9 109 796 822 +20 72 409 822 +30 110 550 822 +50 203 809 822 +73 115 799 822 +125 173 750 822 +147 46 759 822 +174 99 810 822 +192 178 324 822 +202 222 218 822 +224 109 811 822 +245 209 811 822 +30 85 791 823 +33 82 790 823 +45 64 814 823 +52 162 808 823 +57 115 803 823 +83 162 534 823 +85 104 591 823 +89 72 598 823 +110 104 775 823 +113 170 807 823 +113 71 819 823 +127 142 618 823 +134 101 769 823 +147 212 428 823 +149 175 717 823 +151 40 775 823 +156 161 590 823 +173 235 808 823 +186 139 0 823 +191 45 552 823 +223 33 746 823 +239 63 776 823 +1 90 800 824 +24 181 800 824 +32 82 432 824 +37 99 757 824 +39 151 800 824 +51 68 749 824 +66 94 777 824 +73 134 795 824 +79 148 668 824 +100 253 799 824 +124 187 0 824 +128 108 561 824 +128 192 780 824 +159 240 802 824 +160 191 505 824 +171 247 644 824 +174 187 0 824 +189 144 742 824 +189 132 801 824 +189 4 779 824 +200 25 239 824 +213 2 785 824 +226 62 772 824 +242 2 802 824 +251 52 804 824 +29 39 346 825 +31 18 806 825 +33 66 715 825 +85 103 736 825 +89 217 695 825 +100 235 801 825 +111 222 763 825 +122 76 677 825 +128 65 790 825 +128 190 774 825 +135 197 0 825 +163 231 540 825 +169 183 296 825 +170 177 625 825 +176 64 784 825 +185 184 0 825 +185 144 601 825 +186 214 669 825 +209 227 483 825 +242 78 787 825 +245 38 532 825 +251 126 624 825 +252 54 710 825 +253 203 665 825 +255 14 132 825 +256 243 348 825 +9 74 0 826 +14 17 0 826 +20 24 279 826 +26 154 809 826 +47 145 664 826 +49 101 800 826 +70 119 796 826 +74 96 0 826 +100 224 807 826 +113 142 795 826 +136 195 0 826 +158 212 798 826 +202 194 529 826 +203 11 0 826 +203 65 790 826 +211 8 759 826 +233 206 815 826 +237 139 795 826 +237 236 585 826 +239 28 808 826 +244 57 803 826 +6 121 718 827 +7 15 821 827 +17 20 749 827 +51 142 677 827 +60 106 0 827 +62 229 744 827 +81 126 432 827 +105 121 793 827 +115 182 302 827 +122 188 645 827 +134 146 582 827 +138 158 382 827 +144 148 775 827 +149 67 707 827 +173 191 792 827 +179 250 813 827 +199 70 778 827 +234 204 807 827 +238 221 562 827 +22 10 300 828 +26 12 790 828 +32 99 460 828 +34 121 633 828 +35 53 560 828 +37 63 818 828 +41 112 825 828 +55 88 670 828 +66 115 808 828 +69 185 798 828 +70 68 440 828 +96 147 591 828 +133 50 791 828 +156 106 820 828 +157 174 79 828 +168 243 0 828 +189 50 757 828 +230 27 592 828 +27 57 450 829 +31 42 476 829 +53 117 762 829 +56 71 60 829 +78 94 792 829 +79 130 0 829 +81 109 714 829 +82 161 821 829 +86 146 143 829 +103 136 783 829 +107 97 791 829 +138 3 767 829 +140 205 817 829 +168 50 560 829 +197 26 758 829 +225 195 345 829 +233 200 791 829 +245 143 797 829 +1 112 817 830 +9 126 419 830 +14 126 30 830 +15 12 820 830 +15 80 131 830 +23 120 373 830 +30 80 695 830 +33 53 338 830 +47 64 258 830 +58 128 529 830 +67 155 786 830 +77 3 822 830 +79 223 802 830 +89 214 726 830 +116 127 0 830 +116 124 585 830 +126 142 61 830 +134 95 791 830 +171 48 755 830 +173 172 261 830 +204 4 809 830 +236 28 735 830 +236 31 745 830 +245 231 0 830 +246 195 769 830 +248 197 797 830 +248 53 0 830 +1 93 744 831 +7 134 742 831 +19 94 779 831 +53 190 781 831 +57 121 0 831 +92 135 802 831 +115 135 788 831 +126 68 0 831 +147 223 689 831 +160 31 755 831 +171 144 822 831 +227 8 787 831 +228 41 742 831 +233 197 723 831 +244 115 796 831 +250 194 594 831 +253 128 724 831 +7 16 801 832 +19 228 535 832 +38 65 767 832 +74 106 749 832 +84 149 778 832 +89 55 827 832 +89 111 367 832 +95 130 0 832 +155 204 800 832 +155 46 808 832 +168 38 599 832 +195 22 617 832 +195 227 794 832 +215 28 796 832 +223 66 825 832 +256 16 818 832 +1 142 590 833 +4 211 740 833 +27 32 765 833 +33 31 582 833 +52 72 826 833 +63 104 772 833 +67 175 761 833 +116 123 472 833 +119 217 583 833 +124 144 103 833 +126 114 0 833 +132 212 747 833 +140 194 197 833 +158 213 821 833 +206 46 794 833 +211 17 0 833 +213 175 811 833 +218 48 798 833 +239 78 796 833 +248 34 0 833 +249 231 0 833 +19 80 667 834 +23 31 725 834 +24 149 806 834 +28 42 649 834 +42 54 809 834 +46 235 542 834 +74 140 688 834 +78 95 0 834 +136 215 421 834 +138 156 700 834 +146 136 571 834 +156 206 815 834 +171 256 811 834 +180 46 731 834 +180 228 815 834 +202 161 626 834 +202 197 428 834 +210 215 800 834 +225 223 712 834 +226 196 810 834 +231 18 0 834 +249 232 166 834 +1 190 655 835 +5 65 756 835 +9 77 68 835 +18 101 0 835 +67 160 783 835 +84 170 559 835 +87 217 472 835 +91 67 774 835 +130 150 651 835 +143 50 790 835 +163 37 740 835 +163 49 741 835 +207 204 814 835 +212 17 699 835 +215 249 747 835 +218 172 0 835 +218 100 776 835 +232 252 798 835 +13 77 810 836 +16 28 433 836 +22 229 0 836 +32 126 779 836 +96 95 0 836 +124 182 0 836 +148 239 830 836 +155 208 812 836 +169 100 757 836 +180 255 0 836 +191 250 738 836 +194 8 745 836 +197 21 0 836 +213 230 659 836 +218 234 809 836 +221 43 724 836 +228 63 821 836 +232 205 791 836 +233 231 602 836 +233 28 784 836 +234 251 0 836 +1 66 792 837 +9 224 778 837 +33 240 817 837 +34 13 781 837 +34 178 604 837 +52 178 669 837 +55 106 814 837 +79 196 238 837 +84 177 285 837 +109 63 690 837 +120 68 749 837 +170 250 530 837 +210 233 738 837 +215 26 0 837 +232 53 0 837 +236 94 823 837 +236 39 712 837 +3 95 741 838 +4 5 732 838 +22 21 0 838 +22 31 816 838 +24 97 809 838 +58 12 795 838 +89 43 818 838 +113 126 780 838 +133 194 806 838 +148 162 553 838 +150 175 735 838 +182 144 120 838 +199 244 194 838 +205 209 827 838 +213 229 806 838 +215 25 0 838 +221 61 718 838 +241 193 743 838 +252 197 805 838 +256 36 788 838 +14 80 813 839 +22 235 797 839 +39 43 788 839 +47 80 801 839 +55 103 0 839 +72 141 820 839 +73 87 490 839 +75 207 816 839 +82 177 817 839 +93 35 712 839 +135 147 819 839 +137 210 814 839 +149 162 598 839 +167 224 703 839 +172 247 0 839 +176 247 791 839 +185 171 0 839 +208 94 803 839 +221 235 787 839 +221 62 732 839 +221 254 780 839 +245 5 211 839 +17 142 755 840 +32 35 455 840 +32 72 818 840 +50 223 823 840 +57 197 807 840 +58 22 827 840 +76 105 824 840 +77 95 334 840 +79 155 169 840 +81 91 713 840 +115 134 434 840 +117 178 0 840 +124 198 283 840 +128 171 839 840 +157 99 507 840 +164 61 828 840 +168 171 799 840 +172 216 782 840 +174 184 831 840 +201 54 746 840 +212 16 749 840 +217 150 0 840 +235 27 578 840 +3 136 834 841 +12 126 817 841 +14 73 831 841 +46 256 794 841 +59 188 805 841 +69 149 462 841 +70 137 796 841 +95 161 229 841 +99 52 656 841 +123 207 815 841 +140 58 829 841 +163 249 601 841 +168 237 759 841 +168 26 532 841 +189 63 834 841 +211 26 792 841 +237 187 769 841 +242 5 0 841 +13 56 469 842 +13 3 757 842 +36 64 771 842 +49 97 788 842 +52 181 790 842 +60 16 807 842 +60 25 803 842 +84 222 688 842 +93 77 650 842 +116 2 827 842 +126 100 837 842 +129 213 559 842 +142 137 806 842 +158 161 0 842 +160 197 836 842 +160 48 742 842 +166 75 800 842 +174 148 425 842 +177 150 823 842 +203 212 780 842 +204 239 814 842 +208 26 808 842 +220 89 815 842 +242 199 663 842 +243 35 571 842 +245 49 497 842 +252 194 781 842 +7 126 757 843 +28 106 598 843 +34 7 771 843 +63 112 0 843 +64 113 0 843 +72 190 813 843 +72 145 820 843 +76 77 0 843 +85 130 670 843 +93 17 711 843 +108 176 198 843 +110 146 834 843 +120 131 810 843 +126 156 815 843 +149 98 792 843 +178 188 815 843 +183 193 767 843 +186 159 368 843 +205 204 655 843 +210 37 693 843 +222 192 834 843 +241 243 0 843 +251 113 734 843 +4 3 0 844 +8 185 830 844 +12 185 820 844 +36 56 355 844 +45 55 830 844 +46 31 755 844 +48 27 363 844 +74 135 822 844 +74 214 808 844 +114 131 739 844 +121 74 827 844 +129 56 679 844 +130 225 659 844 +162 61 828 844 +166 198 813 844 +178 232 786 844 +181 67 823 844 +186 148 665 844 +201 16 760 844 +210 197 716 844 +211 81 766 844 +220 109 742 844 +223 30 760 844 +235 250 10 844 +240 228 0 844 +242 19 671 844 +245 255 477 844 +253 201 470 844 +254 35 790 844 +42 123 815 845 +68 190 643 845 +115 241 657 845 +118 16 807 845 +120 85 819 845 +122 166 649 845 +144 197 179 845 +145 228 821 845 +173 240 44 845 +177 145 472 845 +181 179 0 845 +187 14 819 845 +202 237 488 845 +209 13 826 845 +212 216 739 845 +219 48 718 845 +248 118 160 845 +256 204 825 845 +13 113 730 846 +32 83 759 846 +50 8 458 846 +69 87 0 846 +70 71 0 846 +78 138 839 846 +83 222 693 846 +94 127 833 846 +114 76 835 846 +130 217 744 846 +132 244 800 846 +134 103 761 846 +135 152 111 846 +140 9 840 846 +143 212 766 846 +143 244 784 846 +157 87 843 846 +173 222 0 846 +198 210 558 846 +200 230 769 846 +203 175 816 846 +222 234 822 846 +223 17 0 846 +224 254 830 846 +234 179 763 846 +1 25 830 847 +1 68 556 847 +37 89 836 847 +38 102 825 847 +57 73 770 847 +98 226 682 847 +119 136 799 847 +136 163 302 847 +145 152 826 847 +151 229 827 847 +189 165 812 847 +31 251 773 848 +61 244 824 848 +71 88 410 848 +101 169 827 848 +103 217 810 848 +105 167 787 848 +115 131 146 848 +122 7 498 848 +142 241 832 848 +143 164 821 848 +174 123 828 848 +193 227 817 848 +195 216 89 848 +208 235 819 848 +209 56 764 848 +214 155 208 848 +224 20 832 848 +226 190 820 848 +11 10 840 849 +12 77 0 849 +19 1 763 849 +39 149 833 849 +49 230 767 849 +52 241 842 849 +71 217 595 849 +78 142 0 849 +94 112 824 849 +96 206 556 849 +99 148 804 849 +127 238 786 849 +167 26 326 849 +183 198 766 849 +204 16 55 849 +211 30 797 849 +213 195 0 849 +229 18 341 849 +237 180 820 849 +248 44 103 849 +7 114 797 850 +13 126 507 850 +19 51 764 850 +31 84 838 850 +32 106 746 850 +33 216 817 850 +91 83 754 850 +92 160 815 850 +99 161 792 850 +117 188 799 850 +121 165 804 850 +129 147 572 850 +130 175 674 850 +137 152 713 850 +138 68 200 850 +147 221 427 850 +157 134 830 850 +160 29 824 850 +167 45 828 850 +208 81 639 850 +210 230 686 850 +225 233 775 850 +232 44 499 850 +249 133 823 850 +2 95 832 851 +5 60 806 851 +7 185 786 851 +13 32 840 851 +15 75 663 851 +32 2 832 851 +33 43 231 851 +54 101 816 851 +54 185 817 851 +56 114 0 851 +64 124 843 851 +65 126 0 851 +70 151 795 851 +72 164 826 851 +82 136 728 851 +85 71 0 851 +93 244 819 851 +120 11 839 851 +125 60 659 851 +125 154 709 851 +151 172 754 851 +152 162 792 851 +160 235 683 851 +213 160 839 851 +219 203 0 851 +226 188 828 851 +237 189 833 851 +3 131 598 852 +4 20 0 852 +27 84 847 852 +34 1 756 852 +45 106 216 852 +54 124 844 852 +61 232 558 852 +79 223 841 852 +85 151 715 852 +90 125 654 852 +91 95 0 852 +109 59 826 852 +120 116 826 852 +137 132 765 852 +153 140 0 852 +157 175 517 852 +167 171 769 852 +182 250 694 852 +184 194 0 852 +190 196 812 852 +200 6 0 852 +217 147 812 852 +218 191 547 852 +218 239 0 852 +219 11 829 852 +225 231 25 852 +227 25 196 852 +235 30 822 852 +5 220 834 853 +11 185 815 853 +31 47 775 853 +64 123 600 853 +67 155 846 853 +72 146 0 853 +111 146 826 853 +116 8 816 853 +119 87 183 853 +153 77 261 853 +208 109 719 853 +230 38 0 853 +233 236 572 853 +240 29 815 853 +11 32 838 854 +34 17 769 854 +50 120 836 854 +59 56 844 854 +61 53 725 854 +78 2 777 854 +90 30 360 854 +95 158 0 854 +110 177 768 854 +157 221 800 854 +164 33 765 854 +166 241 819 854 +171 182 620 854 +171 250 619 854 +189 229 793 854 +196 211 0 854 +240 255 0 854 +242 65 737 854 +248 6 553 854 +4 200 722 855 +9 28 495 855 +10 125 491 855 +51 72 789 855 +64 25 831 855 +69 179 826 855 +71 74 595 855 +73 80 580 855 +83 131 791 855 +87 158 840 855 +103 147 832 855 +105 121 843 855 +105 166 772 855 +115 172 789 855 +149 169 830 855 +161 254 823 855 +177 132 844 855 +186 92 766 855 +189 33 824 855 +206 29 806 855 +216 247 749 855 +225 172 814 855 +236 109 722 855 +236 112 770 855 +238 192 771 855 +245 205 629 855 +251 112 671 855 +4 56 125 856 +34 71 766 856 +35 63 201 856 +41 106 0 856 +45 20 823 856 +60 13 673 856 +63 115 845 856 +69 242 837 856 +73 138 0 856 +84 237 821 856 +93 13 280 856 +109 39 789 856 +111 158 0 856 +139 240 793 856 +142 180 845 856 +190 242 823 856 +231 255 834 856 +234 183 0 856 +253 29 696 856 +12 71 0 857 +32 17 839 857 +47 127 518 857 +69 226 829 857 +86 76 0 857 +88 130 0 857 +89 169 361 857 +93 125 815 857 +97 171 844 857 +100 140 846 857 +125 80 840 857 +137 147 808 857 +145 189 810 857 +161 163 816 857 +166 171 0 857 +170 207 719 857 +190 183 829 857 +193 204 844 857 +202 223 713 857 +209 66 720 857 +210 220 729 857 +212 229 386 857 +215 161 750 857 +221 16 834 857 +238 190 810 857 +247 39 770 857 +254 20 833 857 +40 114 727 858 +46 94 800 858 +69 165 847 858 +89 44 817 858 +97 126 827 858 +112 52 493 858 +123 100 632 858 +135 197 833 858 +142 145 845 858 +145 46 744 858 +146 158 0 858 +148 228 820 858 +150 228 809 858 +157 222 180 858 +179 232 447 858 +190 245 822 858 +193 199 633 858 +196 18 832 858 +208 209 288 858 +225 22 683 858 +242 194 0 858 +243 47 566 858 +244 16 829 858 +23 76 0 859 +37 30 735 859 +45 94 809 859 +49 256 793 859 +91 214 735 859 +109 102 846 859 +129 232 775 859 +133 194 854 859 +142 144 845 859 +143 136 822 859 +153 83 857 859 +161 239 823 859 +178 205 842 859 +198 248 788 859 +198 203 837 859 +199 2 385 859 +202 169 613 859 +209 239 812 859 +213 169 813 859 +215 203 831 859 +221 78 833 859 +226 211 854 859 +14 175 795 860 +15 42 832 860 +26 125 666 860 +34 118 481 860 +34 69 751 860 +40 226 794 860 +52 207 787 860 +54 104 791 860 +62 113 0 860 +95 147 742 860 +111 82 586 860 +131 195 768 860 +134 179 833 860 +142 111 801 860 +152 226 841 860 +157 146 680 860 +160 250 844 860 +169 22 821 860 +192 256 812 860 +199 200 0 860 +235 41 821 860 +240 250 0 860 +240 26 818 860 +21 29 481 861 +34 3 611 861 +53 126 389 861 +80 67 736 861 +85 76 708 861 +89 102 694 861 +93 68 671 861 +102 182 785 861 +132 205 800 861 +138 158 843 861 +141 161 438 861 +167 234 803 861 +186 68 814 861 +202 219 0 861 +209 78 783 861 +221 81 849 861 +233 252 829 861 +236 54 856 861 +13 122 813 862 +28 76 256 862 +37 27 830 862 +100 163 841 862 +128 180 849 862 +140 67 795 862 +141 164 781 862 +141 175 590 862 +146 210 829 862 +150 226 358 862 +150 230 0 862 +192 129 0 862 +225 2 706 862 +242 223 512 862 +242 209 610 862 +243 1 0 862 +247 61 851 862 +252 59 713 862 +12 72 841 863 +17 52 769 863 +36 40 0 863 +65 138 319 863 +69 166 729 863 +101 108 822 863 +105 110 385 863 +112 124 812 863 +118 186 860 863 +119 72 767 863 +128 102 567 863 +141 209 414 863 +145 221 744 863 +154 102 300 863 +162 232 657 863 +190 171 815 863 +206 16 765 863 +207 209 826 863 +219 223 670 863 +222 162 691 863 +231 101 827 863 +239 90 731 863 +245 200 854 863 +246 26 840 863 +1 17 0 864 +4 175 753 864 +5 11 816 864 +13 114 677 864 +39 183 863 864 +44 110 842 864 +52 178 845 864 +56 11 838 864 +81 111 739 864 +120 104 833 864 +146 151 0 864 +190 205 799 864 +199 195 446 864 +199 115 854 864 +200 204 845 864 +212 78 689 864 +213 227 0 864 +216 18 704 864 +226 249 646 864 +252 118 54 864 +64 110 67 865 +64 138 584 865 +69 189 846 865 +104 52 725 865 +116 18 832 865 +126 188 836 865 +128 111 829 865 +140 180 843 865 +148 212 763 865 +154 108 724 865 +156 96 0 865 +159 228 597 865 +160 46 546 865 +220 70 783 865 +224 247 764 865 +232 34 0 865 +54 113 243 866 +58 63 840 866 +73 75 0 866 +78 18 766 866 +89 106 550 866 +90 95 0 866 +90 107 685 866 +93 66 235 866 +121 234 850 866 +133 246 784 866 +150 213 0 866 +156 79 724 866 +172 246 773 866 +191 251 849 866 +196 221 812 866 +199 244 840 866 +234 57 623 866 +242 17 307 866 +243 113 568 866 +20 63 745 867 +27 108 844 867 +31 18 855 867 +64 127 586 867 +69 76 645 867 +96 111 0 867 +122 53 838 867 +136 215 852 867 +166 163 836 867 +166 226 786 867 +202 233 266 867 +203 16 0 867 +215 223 798 867 +248 24 834 867 +249 236 0 867 +251 110 677 867 +23 35 838 868 +34 52 561 868 +45 25 830 868 +109 218 865 868 +117 124 822 868 +144 219 221 868 +154 110 343 868 +165 188 469 868 +170 77 840 868 +200 244 670 868 +220 236 0 868 +231 118 835 868 +237 247 746 868 +237 252 790 868 +11 31 834 869 +12 91 817 869 +12 156 755 869 +25 111 842 869 +42 117 780 869 +61 58 704 869 +63 138 855 869 +64 65 582 869 +69 192 742 869 +69 193 689 869 +69 196 817 869 +93 65 224 869 +103 162 0 869 +105 214 754 869 +116 95 561 869 +130 164 669 869 +153 147 812 869 +154 214 241 869 +160 9 783 869 +187 217 864 869 +191 45 840 869 +199 23 28 869 +210 46 828 869 +228 2 841 869 +243 114 791 869 +249 191 833 869 +52 130 853 870 +77 158 842 870 +88 217 697 870 +94 63 242 870 +138 241 840 870 +146 228 797 870 +149 40 769 870 +155 144 0 870 +155 175 710 870 +161 188 864 870 +167 162 604 870 +180 253 853 870 +182 204 724 870 +199 219 820 870 +219 235 565 870 +11 186 836 871 +14 18 840 871 +20 24 851 871 +24 97 854 871 +27 110 408 871 +40 174 858 871 +43 110 0 871 +49 86 856 871 +57 42 0 871 +85 153 747 871 +111 99 0 871 +111 202 732 871 +127 140 853 871 +141 196 183 871 +151 165 674 871 +168 211 850 871 +170 191 0 871 +187 241 828 871 +208 46 502 871 +211 62 802 871 +214 165 828 871 +215 250 848 871 +221 211 424 871 +239 16 461 871 +253 125 601 871 +4 66 0 872 +38 26 39 872 +63 60 651 872 +75 177 274 872 +77 144 853 872 +109 88 862 872 +119 186 849 872 +128 95 853 872 +144 132 792 872 +144 148 842 872 +150 166 762 872 +155 233 352 872 +167 37 855 872 +176 58 602 872 +177 172 828 872 +185 74 740 872 +185 77 816 872 +185 204 852 872 +213 9 842 872 +220 253 685 872 +223 16 0 872 +250 196 779 872 +18 125 862 873 +24 53 674 873 +31 95 783 873 +42 154 728 873 +50 6 125 873 +51 2 766 873 +76 131 729 873 +91 158 0 873 +104 226 666 873 +109 128 98 873 +109 97 0 873 +131 22 840 873 +137 193 340 873 +149 104 630 873 +153 131 359 873 +164 223 776 873 +186 215 653 873 +188 131 862 873 +205 50 799 873 +215 159 776 873 +215 31 726 873 +218 230 29 873 +232 244 152 873 +248 7 526 873 +252 43 721 873 +2 6 796 874 +8 35 839 874 +36 82 677 874 +48 60 847 874 +64 116 22 874 +68 67 0 874 +77 67 825 874 +78 20 0 874 +93 95 651 874 +105 165 757 874 +124 188 0 874 +134 193 280 874 +140 160 768 874 +152 232 857 874 +164 151 781 874 +182 136 830 874 +185 91 829 874 +190 133 853 874 +215 25 845 874 +222 180 677 874 +229 38 0 874 +234 60 700 874 +243 117 793 874 +243 3 813 874 +250 255 0 874 +250 63 863 874 +252 122 731 874 +2 73 873 875 +10 30 0 875 +27 153 836 875 +71 147 803 875 +99 163 819 875 +121 139 860 875 +177 163 775 875 +215 143 837 875 +227 89 759 875 +63 126 0 876 +97 170 451 876 +98 222 751 876 +113 39 847 876 +116 71 773 876 +134 198 859 876 +137 245 824 876 +139 215 848 876 +142 133 860 876 +143 78 866 876 +179 215 854 876 +185 151 845 876 +191 239 0 876 +231 242 856 876 +253 57 620 876 +253 199 872 876 +254 53 574 876 +1 69 865 877 +18 3 835 877 +24 165 841 877 +56 70 744 877 +59 124 820 877 +66 115 839 877 +66 157 821 877 +111 171 866 877 +121 187 850 877 +139 60 777 877 +142 207 491 877 +144 13 843 877 +145 224 811 877 +153 101 862 877 +160 219 0 877 +185 130 867 877 +185 136 808 877 +198 220 864 877 +217 9 855 877 +231 58 859 877 +236 126 867 877 +6 28 790 878 +36 41 817 878 +52 162 852 878 +75 161 851 878 +93 62 831 878 +93 10 784 878 +105 218 841 878 +112 140 840 878 +138 162 868 878 +139 143 864 878 +160 22 807 878 +174 214 695 878 +176 64 862 878 +191 255 710 878 +197 60 797 878 +198 23 820 878 +199 22 727 878 +210 221 836 878 +211 81 857 878 +226 193 872 878 +229 243 382 878 +2 41 835 879 +4 11 861 879 +5 204 832 879 +10 42 485 879 +12 92 669 879 +23 85 0 879 +24 146 853 879 +27 40 838 879 +32 3 834 879 +39 174 849 879 +45 64 863 879 +74 218 851 879 +93 211 742 879 +94 128 394 879 +94 36 654 879 +107 214 650 879 +110 187 866 879 +144 196 706 879 +160 220 684 879 +182 217 281 879 +187 135 772 879 +216 41 0 879 +222 251 848 879 +227 43 856 879 +229 246 842 879 +241 13 865 879 +252 55 719 879 +254 231 614 879 +1 124 853 880 +2 76 641 880 +19 8 0 880 +26 106 0 880 +42 173 871 880 +48 94 213 880 +51 39 852 880 +75 234 874 880 +98 170 600 880 +110 126 750 880 +112 234 846 880 +133 217 591 880 +160 209 388 880 +162 229 633 880 +169 183 859 880 +174 138 863 880 +176 45 682 880 +190 202 870 880 +190 203 826 880 +212 125 839 880 +216 235 588 880 +224 62 825 880 +227 85 204 880 +236 255 852 880 +239 228 0 880 +248 36 824 880 +255 52 863 880 +5 85 838 881 +19 3 0 881 +36 39 821 881 +45 125 0 881 +52 71 800 881 +55 64 856 881 +61 128 866 881 +63 95 854 881 +71 68 342 881 +71 193 838 881 +77 173 826 881 +86 151 148 881 +124 192 862 881 +164 216 604 881 +228 41 837 881 +248 17 591 881 +19 23 663 882 +45 212 857 882 +52 100 667 882 +57 64 494 882 +96 178 859 882 +107 188 322 882 +114 241 827 882 +115 185 261 882 +121 79 844 882 +131 201 843 882 +138 139 871 882 +140 215 0 882 +147 196 0 882 +149 99 706 882 +159 218 521 882 +160 14 679 882 +170 96 796 882 +170 240 772 882 +181 238 802 882 +197 206 655 882 +198 160 824 882 +205 195 798 882 +205 53 757 882 +218 219 0 882 +239 254 785 882 +245 199 0 882 +252 42 0 882 +253 128 871 882 +6 29 806 883 +9 77 880 883 +24 150 847 883 +27 87 859 883 +45 256 797 883 +58 22 855 883 +73 185 104 883 +80 79 0 883 +81 30 228 883 +84 237 871 883 +90 218 862 883 +98 240 858 883 +107 165 831 883 +107 100 536 883 +134 214 480 883 +145 141 632 883 +158 151 818 883 +162 228 653 883 +163 242 868 883 +167 200 842 883 +187 236 853 883 +189 144 845 883 +202 158 720 883 +217 197 801 883 +232 235 852 883 +237 61 52 883 +245 247 871 883 +2 10 862 884 +6 70 0 884 +42 108 766 884 +79 217 845 884 +87 107 874 884 +88 218 857 884 +101 151 719 884 +103 230 825 884 +119 165 843 884 +134 105 775 884 +135 215 41 884 +153 111 868 884 +156 185 745 884 +163 180 369 884 +186 135 676 884 +206 220 878 884 +207 193 859 884 +219 48 864 884 +221 62 846 884 +231 36 532 884 +231 51 829 884 +239 81 625 884 +240 207 851 884 +245 230 870 884 +246 64 854 884 +45 60 704 885 +66 94 858 885 +68 141 804 885 +86 165 858 885 +93 85 817 885 +109 157 859 885 +109 145 861 885 +110 188 768 885 +120 102 869 885 +129 144 784 885 +137 88 779 885 +176 255 390 885 +190 133 877 885 +202 148 702 885 +211 47 825 885 +234 64 863 885 +5 227 772 886 +13 38 860 886 +22 14 862 886 +45 62 667 886 +65 127 792 886 +73 87 848 886 +75 114 539 886 +76 217 470 886 +84 101 255 886 +110 249 836 886 +122 186 844 886 +129 61 861 886 +167 247 197 886 +186 173 642 886 +196 175 622 886 +198 5 354 886 +222 211 820 886 +250 219 815 886 +23 87 0 887 +35 149 758 887 +41 99 862 887 +50 23 442 887 +62 94 677 887 +69 77 859 887 +82 113 676 887 +87 40 873 887 +121 249 826 887 +142 129 0 887 +143 212 873 887 +1 3 0 888 +11 117 799 888 +19 228 839 888 +27 128 691 888 +48 128 131 888 +52 72 851 888 +71 116 882 888 +80 218 848 888 +103 184 849 888 +110 234 852 888 +113 192 776 888 +167 23 874 888 +173 240 860 888 +174 166 677 888 +213 167 0 888 +215 14 732 888 +221 228 439 888 +229 242 846 888 +12 3 829 889 +12 137 667 889 +29 20 813 889 +34 65 718 889 +34 84 853 889 +40 152 865 889 +67 202 787 889 +85 125 882 889 +91 105 820 889 +101 147 841 889 +109 153 855 889 +110 240 857 889 +114 157 862 889 +142 131 397 889 +164 224 807 889 +168 131 868 889 +191 256 784 889 +195 175 575 889 +201 64 753 889 +252 54 867 889 +18 41 9 890 +23 73 352 890 +32 35 862 890 +52 68 750 890 +58 208 769 890 +58 12 859 890 +61 4 862 890 +69 159 870 890 +71 96 840 890 +76 88 605 890 +96 129 802 890 +113 96 859 890 +122 185 95 890 +126 190 0 890 +128 107 69 890 +136 50 799 890 +152 249 721 890 +161 253 799 890 +164 209 280 890 +179 209 838 890 +190 140 791 890 +207 243 878 890 +207 244 845 890 +208 78 194 890 +226 244 859 890 +244 8 418 890 +7 72 844 891 +23 56 200 891 +38 102 868 891 +56 119 786 891 +57 197 871 891 +58 219 692 891 +68 164 853 891 +71 179 840 891 +72 133 838 891 +73 109 865 891 +90 141 859 891 +115 172 868 891 +123 217 715 891 +130 50 867 891 +131 217 469 891 +134 210 291 891 +139 207 852 891 +160 203 575 891 +169 45 857 891 +170 190 0 891 +174 123 873 891 +182 56 862 891 +233 204 646 891 +236 75 874 891 +237 46 0 891 +245 229 0 891 +253 201 856 891 +256 125 779 891 +16 111 826 892 +34 183 867 892 +67 209 689 892 +76 92 0 892 +97 161 753 892 +115 142 534 892 +140 9 888 892 +170 161 267 892 +180 144 836 892 +189 250 66 892 +194 73 883 892 +212 227 848 892 +228 63 885 892 +231 56 743 892 +233 222 809 892 +13 17 117 893 +17 21 0 893 +23 31 840 893 +28 92 840 893 +31 42 847 893 +35 51 879 893 +49 125 804 893 +55 43 818 893 +58 56 838 893 +73 29 882 893 +84 191 289 893 +123 100 871 893 +133 132 756 893 +133 50 847 893 +161 61 798 893 +163 178 797 893 +176 15 835 893 +205 36 867 893 +214 160 687 893 +25 43 830 894 +50 19 768 894 +51 40 787 894 +53 66 815 894 +58 5 803 894 +61 1 881 894 +105 172 540 894 +107 233 410 894 +118 3 891 894 +177 72 859 894 +196 212 0 894 +196 211 871 894 +242 33 871 894 +252 194 887 894 +256 36 861 894 +6 89 801 895 +21 68 874 895 +27 117 796 895 +38 3 873 895 +41 92 858 895 +85 41 139 895 +111 141 623 895 +116 130 497 895 +121 182 0 895 +128 65 854 895 +144 158 723 895 +146 229 779 895 +148 209 0 895 +155 191 767 895 +156 106 870 895 +158 203 758 895 +160 212 505 895 +195 20 855 895 +200 8 0 895 +207 202 846 895 +240 220 547 895 +12 119 271 896 +23 74 493 896 +27 101 677 896 +62 78 887 896 +68 88 873 896 +80 202 825 896 +85 148 884 896 +106 218 852 896 +126 79 0 896 +127 142 849 896 +160 45 687 896 +166 192 866 896 +169 220 521 896 +171 46 866 896 +171 256 836 896 +182 229 851 896 +189 63 874 896 +190 191 787 896 +190 144 742 896 +204 216 849 896 +250 1 824 896 +22 31 860 897 +50 22 766 897 +60 105 887 897 +63 98 0 897 +84 180 548 897 +127 161 757 897 +164 167 153 897 +166 198 876 897 +173 170 874 897 +236 201 818 897 +256 30 799 897 +14 10 846 898 +35 63 869 898 +42 170 809 898 +46 21 835 898 +69 186 870 898 +70 92 802 898 +85 157 816 898 +85 104 861 898 +90 138 874 898 +91 145 802 898 +92 161 877 898 +108 138 864 898 +118 90 886 898 +120 2 395 898 +123 180 881 898 +125 34 850 898 +132 164 661 898 +134 67 799 898 +150 217 880 898 +161 162 464 898 +166 124 803 898 +198 199 679 898 +202 159 330 898 +205 9 641 898 +219 231 891 898 +236 54 875 898 +240 93 889 898 +241 203 797 898 +247 28 775 898 +11 12 0 899 +16 20 411 899 +34 178 876 899 +37 27 874 899 +37 95 867 899 +41 87 727 899 +59 174 841 899 +64 116 878 899 +90 202 853 899 +92 168 895 899 +122 76 887 899 +125 100 698 899 +132 212 868 899 +143 9 819 899 +150 173 876 899 +155 82 844 899 +159 239 58 899 +167 228 785 899 +171 247 877 899 +189 244 437 899 +213 233 134 899 +222 19 869 899 +223 46 754 899 +233 221 794 899 +235 57 622 899 +240 247 740 899 +243 78 839 899 +8 114 168 900 +28 153 690 900 +31 126 891 900 +43 39 868 900 +44 40 818 900 +58 206 748 900 +59 251 0 900 +66 101 869 900 +73 28 799 900 +103 229 826 900 +106 237 823 900 +108 214 775 900 +137 152 880 900 +139 141 874 900 +139 206 826 900 +142 178 437 900 +146 115 868 900 +148 163 0 900 +151 220 865 900 +167 231 0 900 +171 250 878 900 +194 8 870 900 +229 24 880 900 +248 24 887 900 +250 251 0 900 +251 75 794 900 +16 157 853 901 +32 125 13 901 +34 133 879 901 +35 115 875 901 +48 49 126 901 +83 163 444 901 +90 137 882 901 +109 124 870 901 +115 180 884 901 +122 124 0 901 +149 193 849 901 +154 161 876 901 +159 204 669 901 +161 234 798 901 +176 236 576 901 +179 23 830 901 +186 111 650 901 +190 245 897 901 +194 54 866 901 +204 199 763 901 +206 25 751 901 +216 224 885 901 +222 62 674 901 +233 160 0 901 +4 64 768 902 +16 29 0 902 +33 82 885 902 +38 119 854 902 +67 210 630 902 +82 97 0 902 +83 175 600 902 +91 215 831 902 +98 163 554 902 +98 67 899 902 +105 174 90 902 +106 192 860 902 +116 75 39 902 +119 72 886 902 +121 183 631 902 +138 234 862 902 +160 93 758 902 +161 45 864 902 +164 168 865 902 +175 232 856 902 +186 148 875 902 +197 211 870 902 +222 33 483 902 +246 15 861 902 +254 203 870 902 +16 154 524 903 +23 6 0 903 +31 47 874 903 +32 33 433 903 +32 126 899 903 +32 154 36 903 +35 150 847 903 +78 73 894 903 +94 74 875 903 +113 133 874 903 +116 113 0 903 +116 177 855 903 +123 176 876 903 +135 184 0 903 +146 178 857 903 +157 149 723 903 +166 179 560 903 +167 26 866 903 +187 4 858 903 +197 120 872 903 +211 66 252 903 +222 30 806 903 +238 48 184 903 +20 24 885 904 +22 10 859 904 +34 127 757 904 +55 6 882 904 +64 77 0 904 +67 4 846 904 +108 215 903 904 +134 132 199 904 +158 150 885 904 +166 234 791 904 +175 227 844 904 +191 178 878 904 +207 15 854 904 +248 195 753 904 +14 224 826 905 +32 106 866 905 +48 36 777 905 +49 20 280 905 +58 4 765 905 +61 250 0 905 +73 138 893 905 +86 83 861 905 +87 99 829 905 +89 31 578 905 +110 79 855 905 +118 138 882 905 +120 142 742 905 +134 150 385 905 +140 218 888 905 +144 93 901 905 +147 167 719 905 +154 214 885 905 +187 247 867 905 +192 61 460 905 +199 74 881 905 +237 206 877 905 +238 255 0 905 +251 78 868 905 +14 126 880 906 +21 99 833 906 +24 53 891 906 +43 154 483 906 +48 58 902 906 +48 255 132 906 +71 83 790 906 +81 120 820 906 +89 169 883 906 +101 169 889 906 +103 185 889 906 +129 200 827 906 +156 150 856 906 +161 189 808 906 +163 49 892 906 +176 58 893 906 +176 62 588 906 +177 238 772 906 +189 4 849 906 +191 183 889 906 +197 126 887 906 +204 4 850 906 +208 20 742 906 +217 23 884 906 +218 216 790 906 +227 39 383 906 +238 129 803 906 +255 55 893 906 +10 134 894 907 +33 55 896 907 +37 242 856 907 +48 13 845 907 +59 1 879 907 +71 213 823 907 +72 101 839 907 +104 226 882 907 +134 147 0 907 +139 205 656 907 +145 112 874 907 +166 131 792 907 +170 52 597 907 +172 140 861 907 +172 135 849 907 +182 144 885 907 +192 184 864 907 +247 15 884 907 +10 126 883 908 +18 36 0 908 +24 97 900 908 +29 39 872 908 +31 84 882 908 +35 72 833 908 +50 65 820 908 +70 95 855 908 +112 52 883 908 +113 183 853 908 +157 154 0 908 +182 58 839 908 +192 202 848 908 +217 161 901 908 +226 56 859 908 +231 70 882 908 +242 246 0 908 +1 51 0 909 +1 142 848 909 +100 48 886 909 +109 92 271 909 +109 39 874 909 +114 119 771 909 +122 84 875 909 +139 15 824 909 +155 146 823 909 +168 242 788 909 +170 180 442 909 +188 256 901 909 +194 21 870 909 +195 21 0 909 +202 221 0 909 +212 36 846 909 +222 209 0 909 +248 5 0 909 +250 78 794 909 +4 208 244 910 +59 76 861 910 +64 138 884 910 +69 76 873 910 +76 136 747 910 +111 97 0 910 +114 68 0 910 +116 79 0 910 +122 78 846 910 +126 154 874 910 +129 194 0 910 +134 217 482 910 +144 253 882 910 +155 240 770 910 +159 14 478 910 +159 195 354 910 +161 180 34 910 +174 215 882 910 +177 226 686 910 +198 248 882 910 +201 54 855 910 +228 205 880 910 +236 39 892 910 +248 7 895 910 +249 48 850 910 +6 119 669 911 +12 126 853 911 +26 240 873 911 +31 125 492 911 +41 199 906 911 +46 256 852 911 +71 132 799 911 +73 52 895 911 +83 151 594 911 +86 134 740 911 +94 72 906 911 +98 183 847 911 +99 190 902 911 +108 150 782 911 +121 153 899 911 +121 135 792 911 +123 172 867 911 +143 208 646 911 +151 229 864 911 +155 98 797 911 +167 234 885 911 +189 232 638 911 +223 65 823 911 +235 42 885 911 +238 178 796 911 +8 126 890 912 +54 12 799 912 +69 137 253 912 +81 21 790 912 +94 112 882 912 +116 67 0 912 +137 218 874 912 +143 15 853 912 +146 229 905 912 +152 218 706 912 +158 221 0 912 +161 48 775 912 +163 200 904 912 +167 224 884 912 +196 93 723 912 +213 144 881 912 +220 221 725 912 +225 19 238 912 +235 250 869 912 +238 207 21 912 +242 251 885 912 +248 244 0 912 +6 124 782 913 +8 136 890 913 +32 72 852 913 +46 36 0 913 +53 75 771 913 +63 115 868 913 +74 217 683 913 +82 97 909 913 +91 106 771 913 +96 111 892 913 +106 170 385 913 +108 224 911 913 +114 133 0 913 +116 85 814 913 +135 144 12 913 +141 215 722 913 +144 194 907 913 +147 206 905 913 +154 84 432 913 +155 112 881 913 +176 143 602 913 +188 202 852 913 +197 45 902 913 +197 21 853 913 +207 159 667 913 +245 228 878 913 +13 122 890 914 +21 95 808 914 +22 7 876 914 +69 147 799 914 +72 145 890 914 +75 113 243 914 +90 218 895 914 +92 106 653 914 +108 181 0 914 +113 100 0 914 +118 40 0 914 +134 68 297 914 +146 158 893 914 +162 131 863 914 +177 142 527 914 +180 203 844 914 +184 48 879 914 +188 58 888 914 +251 112 886 914 +32 47 0 915 +63 138 902 915 +68 130 0 915 +73 80 891 915 +84 160 895 915 +93 65 878 915 +98 69 844 915 +111 98 587 915 +131 243 883 915 +182 187 0 915 +194 227 760 915 +198 50 219 915 +15 219 799 916 +46 232 313 916 +49 246 900 916 +64 244 726 916 +70 39 626 916 +102 182 877 916 +106 171 800 916 +116 123 854 916 +116 141 807 916 +193 17 157 916 +208 175 544 916 +223 16 899 916 +238 205 726 916 +251 99 902 916 +2 72 262 917 +7 137 187 917 +8 68 572 917 +9 126 863 917 +26 38 885 917 +32 43 0 917 +46 35 0 917 +59 185 789 917 +70 27 644 917 +79 204 792 917 +105 34 870 917 +105 151 359 917 +110 123 325 917 +137 87 0 917 +137 214 650 917 +144 6 901 917 +222 180 883 917 +237 216 876 917 +248 58 806 917 +7 90 878 918 +20 72 863 918 +32 155 865 918 +32 83 859 918 +34 63 0 918 +74 218 891 918 +78 138 888 918 +97 181 871 918 +102 115 676 918 +108 230 819 918 +111 171 895 918 +146 159 911 918 +147 212 871 918 +157 136 890 918 +164 212 515 918 +192 203 0 918 +197 227 573 918 +208 46 881 918 +219 221 0 918 +226 196 843 918 +233 161 532 918 +3 135 902 919 +8 83 837 919 +17 68 572 919 +18 89 882 919 +39 120 910 919 +59 133 887 919 +87 147 807 919 +98 79 900 919 +105 76 903 919 +112 167 905 919 +144 197 900 919 +149 159 855 919 +153 140 883 919 +155 221 0 919 +160 171 867 919 +162 79 895 919 +173 222 909 919 +187 9 819 919 +189 48 703 919 +232 36 327 919 +242 179 0 919 +243 63 487 919 +14 63 903 920 +18 80 891 920 +28 101 847 920 +42 36 872 920 +44 103 885 920 +68 147 792 920 +73 71 0 920 +73 75 887 920 +78 127 899 920 +104 191 871 920 +109 156 829 920 +116 18 907 920 +143 195 182 920 +143 93 760 920 +169 234 718 920 +186 154 776 920 +192 250 0 920 +198 184 0 920 +198 58 492 920 +213 218 664 920 +214 197 880 920 +220 247 411 920 +232 86 908 920 +245 244 122 920 +248 51 164 920 +249 133 914 920 +16 68 704 921 +18 72 272 921 +19 47 847 921 +19 95 642 921 +31 91 801 921 +42 53 895 921 +88 112 900 921 +94 146 914 921 +95 128 903 921 +95 158 906 921 +118 185 0 921 +131 226 807 921 +146 136 890 921 +157 3 782 921 +171 182 883 921 +183 230 0 921 +231 50 907 921 +232 34 893 921 +232 51 754 921 +247 29 756 921 +6 78 848 922 +9 60 0 922 +29 20 903 922 +54 66 897 922 +64 116 910 922 +78 190 901 922 +90 123 851 922 +92 146 914 922 +110 191 668 922 +141 130 329 922 +151 237 881 922 +159 208 374 922 +169 220 902 922 +170 235 862 922 +189 251 744 922 +199 256 856 922 +203 195 698 922 +238 243 835 922 +245 255 876 922 +247 48 767 922 +5 10 838 923 +49 115 850 923 +85 34 856 923 +121 74 892 923 +140 213 0 923 +161 206 891 923 +179 219 913 923 +26 25 0 924 +32 84 446 924 +49 86 897 924 +51 116 0 924 +59 104 910 924 +65 20 883 924 +66 105 905 924 +78 94 912 924 +79 196 893 924 +92 112 835 924 +106 103 0 924 +113 241 815 924 +142 159 0 924 +146 168 794 924 +167 211 826 924 +180 61 456 924 +182 231 891 924 +195 212 388 924 +199 121 875 924 +200 37 716 924 +214 201 897 924 +225 230 286 924 +238 242 737 924 +21 36 824 925 +66 94 903 925 +72 146 890 925 +104 168 839 925 +108 163 889 925 +116 17 638 925 +123 171 0 925 +123 234 809 925 +134 152 0 925 +153 131 916 925 +155 143 0 925 +164 61 890 925 +170 252 879 925 +174 167 793 925 +177 176 895 925 +182 242 834 925 +199 219 906 925 +199 15 820 925 +209 85 903 925 +231 253 880 925 +234 198 735 925 +234 179 888 925 +240 29 911 925 +253 122 894 925 +11 53 898 926 +13 42 889 926 +35 149 901 926 +36 64 863 926 +46 242 859 926 +54 133 898 926 +80 3 326 926 +80 82 491 926 +117 162 871 926 +127 191 0 926 +131 217 913 926 +145 128 909 926 +146 175 652 926 +150 191 900 926 +154 237 877 926 +162 242 820 926 +169 216 623 926 +169 229 819 926 +182 235 840 926 +182 56 916 926 +186 135 901 926 +191 129 863 926 +192 235 860 926 +207 193 904 926 +214 209 913 926 +231 51 918 926 +235 60 761 926 +256 204 876 926 +13 6 906 927 +53 181 865 927 +73 87 911 927 +92 165 840 927 +107 151 664 927 +108 187 0 927 +126 133 903 927 +131 5 920 927 +152 194 717 927 +162 248 918 927 +174 233 90 927 +175 37 713 927 +200 212 695 927 +207 183 901 927 +209 32 905 927 +214 26 877 927 +232 242 380 927 +252 55 905 927 +254 51 876 927 +12 18 874 928 +47 64 887 928 +53 117 871 928 +78 126 0 928 +86 117 799 928 +91 237 875 928 +102 71 922 928 +110 114 888 928 +119 131 154 928 +126 156 878 928 +142 160 879 928 +144 224 905 928 +165 230 0 928 +183 193 906 928 +186 203 902 928 +234 248 895 928 +250 7 926 928 +49 247 901 929 +53 138 826 929 +92 174 649 929 +102 192 870 929 +104 167 882 929 +131 246 787 929 +136 211 675 929 +142 132 0 929 +162 205 902 929 +169 22 909 929 +177 191 759 929 +187 236 919 929 +191 229 899 929 +209 227 849 929 +223 20 760 929 +241 255 0 929 +244 16 886 929 +252 204 792 929 +8 69 0 930 +8 156 883 930 +30 128 629 930 +44 1 917 930 +111 160 0 930 +112 185 0 930 +126 153 868 930 +169 230 0 930 +173 172 872 930 +176 67 842 930 +187 204 694 930 +199 126 855 930 +220 184 819 930 +228 242 818 930 +234 15 862 930 +240 228 875 930 +249 187 771 930 +253 29 914 930 +4 114 924 931 +6 32 909 931 +16 114 893 931 +19 35 697 931 +33 28 885 931 +137 141 921 931 +141 208 420 931 +143 204 677 931 +170 198 877 931 +188 226 909 931 +214 179 877 931 +225 49 416 931 +234 13 917 931 +239 230 907 931 +243 117 910 931 +243 120 784 931 +249 140 836 931 +8 90 893 932 +14 64 0 932 +22 230 0 932 +71 149 0 932 +91 89 0 932 +98 178 0 932 +120 151 930 932 +129 256 915 932 +131 214 909 932 +136 238 926 932 +159 216 917 932 +160 225 924 932 +169 240 718 932 +186 250 898 932 +202 194 911 932 +212 229 894 932 +212 70 902 932 +233 238 928 932 +238 230 903 932 +242 57 815 932 +245 205 876 932 +249 231 864 932 +253 11 863 932 +254 53 891 932 +6 77 425 933 +26 70 746 933 +108 133 796 933 +110 164 882 933 +111 237 14 933 +118 133 793 933 +123 217 893 933 +125 11 899 933 +145 149 0 933 +145 225 332 933 +155 144 916 933 +164 171 899 933 +169 184 734 933 +181 167 898 933 +183 242 800 933 +184 64 926 933 +189 203 676 933 +206 16 900 933 +232 179 895 933 +246 38 395 933 +4 52 917 934 +8 142 811 934 +16 75 873 934 +25 78 440 934 +52 72 913 934 +54 177 918 934 +54 126 858 934 +56 81 881 934 +69 149 856 934 +86 36 722 934 +86 104 598 934 +92 216 874 934 +120 135 879 934 +152 230 0 934 +155 147 782 934 +162 182 907 934 +166 171 881 934 +168 211 892 934 +177 72 903 934 +180 141 897 934 +195 116 840 934 +209 65 881 934 +212 29 917 934 +215 93 848 934 +219 224 0 934 +224 230 360 934 +228 86 921 934 +21 34 850 935 +35 53 933 935 +37 2 667 935 +44 166 922 935 +55 99 868 935 +58 78 622 935 +84 113 550 935 +107 171 0 935 +142 136 664 935 +145 163 0 935 +150 175 901 935 +163 215 910 935 +200 33 860 935 +207 15 927 935 +211 26 849 935 +253 1 888 935 +254 196 874 935 +14 77 561 936 +34 44 893 936 +59 154 927 936 +67 203 745 936 +72 143 924 936 +92 22 922 936 +106 121 0 936 +145 175 317 936 +163 245 342 936 +164 211 666 936 +179 209 896 936 +188 79 720 936 +214 224 343 936 +233 182 904 936 +238 245 488 936 +247 117 924 936 +251 11 463 936 +7 124 285 937 +16 65 0 937 +22 224 360 937 +51 76 782 937 +103 171 802 937 +121 171 812 937 +145 240 711 937 +153 77 857 937 +153 185 508 937 +168 178 796 937 +217 229 933 937 +6 10 752 938 +9 64 0 938 +14 68 912 938 +14 52 903 938 +33 66 873 938 +37 27 924 938 +38 177 930 938 +42 170 929 938 +44 111 916 938 +73 156 716 938 +79 241 765 938 +95 127 921 938 +103 218 716 938 +106 39 0 938 +108 183 0 938 +109 174 823 938 +128 79 918 938 +161 215 865 938 +162 167 911 938 +169 160 715 938 +176 184 674 938 +179 9 843 938 +179 216 855 938 +189 168 912 938 +204 223 572 938 +216 41 936 938 +222 234 933 938 +239 68 927 938 +243 118 917 938 +252 197 868 938 +4 63 843 939 +8 151 833 939 +23 27 754 939 +56 76 779 939 +59 7 302 939 +66 74 895 939 +77 67 900 939 +83 143 812 939 +84 101 897 939 +90 92 616 939 +91 107 771 939 +91 174 793 939 +110 237 563 939 +127 241 653 939 +149 216 851 939 +153 218 0 939 +180 131 886 939 +184 55 911 939 +192 129 908 939 +204 16 891 939 +206 78 786 939 +212 66 352 939 +217 235 934 939 +237 22 881 939 +241 46 871 939 +245 49 860 939 +254 35 903 939 +16 121 907 940 +17 130 917 940 +31 89 920 940 +75 114 900 940 +83 210 786 940 +106 169 710 940 +109 77 654 940 +112 237 829 940 +113 166 917 940 +120 104 885 940 +139 232 914 940 +142 143 0 940 +145 189 902 940 +153 198 838 940 +187 241 919 940 +193 220 937 940 +193 18 932 940 +219 231 936 940 +222 208 362 940 +236 13 833 940 +243 78 933 940 +1 31 912 941 +19 3 918 941 +22 26 0 941 +38 71 927 941 +53 16 850 941 +103 162 904 941 +113 119 923 941 +114 162 758 941 +116 75 928 941 +120 185 0 941 +139 131 840 941 +174 162 928 941 +252 118 907 941 +256 223 897 941 +256 196 914 941 +12 3 913 942 +14 80 870 942 +22 239 902 942 +45 232 917 942 +57 5 323 942 +66 76 618 942 +69 162 774 942 +86 59 716 942 +93 240 911 942 +150 216 186 942 +163 46 758 942 +208 73 925 942 +209 20 746 942 +210 215 913 942 +6 90 795 943 +14 73 874 943 +14 10 915 943 +26 248 900 943 +69 192 925 943 +81 47 779 943 +82 161 914 943 +82 238 913 943 +106 60 911 943 +135 184 932 943 +153 186 70 943 +159 228 913 943 +173 233 25 943 +222 33 924 943 +230 38 892 943 +33 81 159 944 +39 183 935 944 +44 75 841 944 +51 60 873 944 +82 225 830 944 +87 107 911 944 +96 129 906 944 +109 91 491 944 +114 117 0 944 +145 218 787 944 +158 175 0 944 +160 100 883 944 +167 248 893 944 +174 160 0 944 +197 14 665 944 +198 5 940 944 +207 255 0 944 +213 246 852 944 +214 238 920 944 +222 211 903 944 +252 1 916 944 +10 231 935 945 +11 170 930 945 +17 18 509 945 +23 24 877 945 +44 126 917 945 +58 121 916 945 +72 133 909 945 +75 137 908 945 +81 134 884 945 +87 99 922 945 +108 119 830 945 +108 139 322 945 +111 100 0 945 +115 162 0 945 +115 165 0 945 +119 165 914 945 +128 177 878 945 +133 226 785 945 +151 163 331 945 +152 23 852 945 +170 202 861 945 +208 19 215 945 +211 230 680 945 +222 30 933 945 +238 172 815 945 +247 194 924 945 +1 186 853 946 +2 142 935 946 +7 126 845 946 +8 18 628 946 +9 118 669 946 +57 197 913 946 +83 225 604 946 +100 79 735 946 +110 148 916 946 +110 176 832 946 +138 137 907 946 +145 160 510 946 +158 193 779 946 +165 185 882 946 +171 79 757 946 +177 238 945 946 +189 175 883 946 +197 203 924 946 +205 206 0 946 +226 247 832 946 +235 248 898 946 +247 197 920 946 +247 73 934 946 +256 43 748 946 +11 186 929 947 +35 117 872 947 +86 38 362 947 +109 95 0 947 +111 83 250 947 +139 197 24 947 +155 215 0 947 +158 225 541 947 +168 50 884 947 +193 175 716 947 +217 197 902 947 +239 84 940 947 +254 47 720 947 +14 53 937 948 +18 28 675 948 +27 92 676 948 +31 105 850 948 +35 54 928 948 +66 80 375 948 +71 162 862 948 +77 144 919 948 +81 21 926 948 +83 98 122 948 +84 162 272 948 +88 166 899 948 +100 175 894 948 +101 183 826 948 +105 117 768 948 +106 100 708 948 +129 206 903 948 +137 22 944 948 +139 57 608 948 +148 163 927 948 +155 206 0 948 +195 216 922 948 +243 60 872 948 +244 8 925 948 +247 50 892 948 +250 223 797 948 +251 35 943 948 +2 229 894 949 +15 114 929 949 +49 230 872 949 +49 101 939 949 +73 186 617 949 +79 198 795 949 +85 134 713 949 +100 188 704 949 +110 169 461 949 +118 39 486 949 +139 193 917 949 +156 233 0 949 +174 99 932 949 +204 5 930 949 +204 28 934 949 +212 95 818 949 +228 30 0 949 +233 253 754 949 +233 252 896 949 +241 132 782 949 +1 80 382 950 +40 238 915 950 +43 97 737 950 +56 113 923 950 +58 204 309 950 +58 56 938 950 +67 206 686 950 +77 218 919 950 +84 104 602 950 +102 237 894 950 +119 139 916 950 +121 127 848 950 +125 52 0 950 +137 172 925 950 +137 144 900 950 +150 177 930 950 +158 196 645 950 +162 133 772 950 +163 37 863 950 +174 146 921 950 +199 16 888 950 +205 78 788 950 +207 252 925 950 +230 243 909 950 +236 118 705 950 +238 227 878 950 +239 12 933 950 +4 211 945 951 +34 180 938 951 +39 113 900 951 +63 16 886 951 +69 186 926 951 +92 210 924 951 +131 243 944 951 +135 144 928 951 +141 250 816 951 +147 46 886 951 +166 162 0 951 +171 185 878 951 +180 158 921 951 +180 130 906 951 +191 30 930 951 +193 70 921 951 +204 12 911 951 +211 30 926 951 +217 250 895 951 +225 196 941 951 +229 247 0 951 +232 62 456 951 +252 122 895 951 +53 71 868 952 +89 102 945 952 +98 183 925 952 +107 218 536 952 +113 183 922 952 +139 50 189 952 +140 160 930 952 +144 158 913 952 +153 167 931 952 +156 161 867 952 +158 206 526 952 +181 226 661 952 +187 254 922 952 +254 63 669 952 +1 25 869 953 +24 87 765 953 +37 88 921 953 +46 109 947 953 +54 102 564 953 +65 77 0 953 +78 20 906 953 +82 151 722 953 +88 117 879 953 +108 165 0 953 +115 180 915 953 +123 179 926 953 +130 50 937 953 +182 130 934 953 +187 14 944 953 +189 131 885 953 +192 241 663 953 +196 15 770 953 +216 86 943 953 +217 23 925 953 +221 235 868 953 +246 73 917 953 +255 52 903 953 +36 78 883 954 +38 3 927 954 +42 52 874 954 +45 41 410 954 +57 64 927 954 +59 6 716 954 +118 1 865 954 +123 183 927 954 +127 161 948 954 +137 201 933 954 +144 22 822 954 +155 112 919 954 +198 58 933 954 +207 240 903 954 +230 24 882 954 +256 125 898 954 +12 107 918 955 +44 110 907 955 +54 101 912 955 +55 73 939 955 +81 35 0 955 +83 160 861 955 +98 69 919 955 +102 126 838 955 +108 127 909 955 +137 204 947 955 +156 206 945 955 +168 171 878 955 +182 213 272 955 +189 48 927 955 +229 41 0 955 +7 10 318 956 +26 89 743 956 +39 119 829 956 +60 166 913 956 +75 139 942 956 +76 149 780 956 +119 138 924 956 +133 201 940 956 +140 151 894 956 +170 135 838 956 +171 236 924 956 +174 164 888 956 +177 164 924 956 +191 229 944 956 +199 119 835 956 +225 19 950 956 +239 44 882 956 +244 142 926 956 +1 121 874 957 +59 73 0 957 +59 76 915 957 +71 170 920 957 +71 124 0 957 +81 86 921 957 +94 98 101 957 +94 146 941 957 +128 102 875 957 +139 151 938 957 +140 58 943 957 +147 228 442 957 +149 107 913 957 +152 227 0 957 +158 209 0 957 +181 188 0 957 +182 151 944 957 +196 23 944 957 +198 160 918 957 +213 227 914 957 +215 109 948 957 +218 100 910 957 +229 18 898 957 +233 44 946 957 +237 61 939 957 +245 143 896 957 +1 123 735 958 +17 74 881 958 +40 185 789 958 +46 19 793 958 +53 120 95 958 +73 52 943 958 +99 148 918 958 +100 48 933 958 +136 50 930 958 +137 188 0 958 +174 235 422 958 +199 76 442 958 +205 14 313 958 +211 47 917 958 +215 25 948 958 +229 243 923 958 +234 64 899 958 +250 242 939 958 +9 5 650 959 +12 124 111 959 +36 52 0 959 +94 112 924 959 +98 222 881 959 +120 126 875 959 +131 4 936 959 +143 175 651 959 +148 206 357 959 +150 210 484 959 +170 144 609 959 +198 199 919 959 +200 215 0 959 +201 216 911 959 +207 250 471 959 +228 41 914 959 +238 207 952 959 +2 51 906 960 +48 44 794 960 +71 180 917 960 +106 127 766 960 +130 209 746 960 +139 213 833 960 +151 220 951 960 +167 22 708 960 +185 194 924 960 +197 21 934 960 +199 219 929 960 +220 89 945 960 +231 36 927 960 +238 253 955 960 +243 118 945 960 +244 52 723 960 +247 63 952 960 +34 69 922 961 +47 111 0 961 +67 160 839 961 +70 24 0 961 +112 188 44 961 +116 20 791 961 +127 178 200 961 +132 179 368 961 +169 100 853 961 +171 233 0 961 +183 193 943 961 +191 242 825 961 +210 227 0 961 +234 233 0 961 +245 254 157 961 +12 92 920 962 +45 25 882 962 +46 35 946 962 +57 11 438 962 +74 149 892 962 +127 187 190 962 +129 141 790 962 +131 2 950 962 +156 22 826 962 +159 18 928 962 +180 245 117 962 +197 153 958 962 +210 21 581 962 +211 24 590 962 +244 32 897 962 +249 227 884 962 +256 16 879 962 +18 24 0 963 +18 99 134 963 +23 35 896 963 +25 86 944 963 +49 41 688 963 +72 76 609 963 +111 95 0 963 +111 148 382 963 +128 73 937 963 +134 183 938 963 +139 22 832 963 +149 102 952 963 +159 48 932 963 +171 254 949 963 +173 100 547 963 +176 62 925 963 +181 129 235 963 +192 141 797 963 +194 215 0 963 +214 165 932 963 +231 101 926 963 +249 246 0 963 +251 18 951 963 +251 84 832 963 +13 209 936 964 +13 93 955 964 +23 232 896 964 +36 39 910 964 +55 43 910 964 +55 103 852 964 +58 14 307 964 +60 102 646 964 +62 34 791 964 +80 160 852 964 +122 124 930 964 +129 144 912 964 +142 111 887 964 +143 136 877 964 +149 173 918 964 +159 203 504 964 +160 19 950 964 +168 49 570 964 +171 256 931 964 +189 62 450 964 +197 86 944 964 +231 51 959 964 +249 248 885 964 +9 28 921 965 +13 38 907 965 +21 10 746 965 +24 120 955 965 +36 41 947 965 +51 119 568 965 +78 115 919 965 +85 153 920 965 +99 161 931 965 +126 142 955 965 +142 145 884 965 +150 233 0 965 +170 77 885 965 +173 110 228 965 +181 168 0 965 +183 243 903 965 +211 81 927 965 +25 106 962 966 +36 17 931 966 +43 154 943 966 +50 53 957 966 +54 104 900 966 +61 15 832 966 +106 102 0 966 +108 224 948 966 +120 40 42 966 +123 151 911 966 +134 213 0 966 +152 232 927 966 +157 206 769 966 +166 124 942 966 +170 165 917 966 +174 224 591 966 +199 200 922 966 +204 93 382 966 +218 22 688 966 +226 62 859 966 +240 247 945 966 +245 195 723 966 +245 209 920 966 +6 70 956 967 +23 33 876 967 +42 117 940 967 +64 77 951 967 +82 162 639 967 +88 108 798 967 +92 165 946 967 +97 181 943 967 +126 137 845 967 +127 181 781 967 +131 56 943 967 +133 202 904 967 +133 246 894 967 +134 217 955 967 +138 80 0 967 +145 108 949 967 +165 233 895 967 +169 165 0 967 +171 238 951 967 +178 210 936 967 +193 204 964 967 +206 175 540 967 +211 62 910 967 +219 93 202 967 +228 205 948 967 +249 100 795 967 +7 28 280 968 +14 45 940 968 +16 19 745 968 +42 15 893 968 +55 88 884 968 +68 164 938 968 +88 172 632 968 +91 206 922 968 +96 178 898 968 +112 119 53 968 +131 201 937 968 +145 177 910 968 +150 241 907 968 +151 229 965 968 +166 169 0 968 +168 185 865 968 +176 255 949 968 +181 189 931 968 +200 6 947 968 +206 48 943 968 +219 11 946 968 +233 239 575 968 +234 201 298 968 +238 243 935 968 +238 248 829 968 +239 47 0 968 +29 70 629 969 +29 21 880 969 +63 138 943 969 +69 153 949 969 +78 85 949 969 +97 162 393 969 +101 107 765 969 +109 110 0 969 +149 229 959 969 +155 217 0 969 +170 100 503 969 +171 207 754 969 +171 61 683 969 +178 213 863 969 +194 28 811 969 +222 235 0 969 +222 253 454 969 +223 81 358 969 +234 179 947 969 +237 159 947 969 +252 63 913 969 +4 175 933 970 +13 17 940 970 +23 230 773 970 +36 40 905 970 +60 39 680 970 +71 179 941 970 +75 96 392 970 +104 3 939 970 +113 192 938 970 +114 192 911 970 +135 209 938 970 +146 172 574 970 +150 108 962 970 +151 186 902 970 +157 221 941 970 +159 2 900 970 +165 184 547 970 +195 116 965 970 +197 154 962 970 +198 203 884 970 +200 86 929 970 +211 41 520 970 +218 48 942 970 +219 32 721 970 +226 21 946 970 +237 251 955 970 +254 30 760 970 +9 45 911 971 +11 138 101 971 +25 91 799 971 +29 86 409 971 +37 113 946 971 +45 106 929 971 +65 181 955 971 +68 161 911 971 +73 91 0 971 +89 169 913 971 +101 172 771 971 +126 141 952 971 +140 218 909 971 +151 201 934 971 +165 188 875 971 +165 248 883 971 +193 220 961 971 +200 204 913 971 +233 248 905 971 +238 62 0 971 +239 28 882 971 +10 169 961 972 +18 83 947 972 +19 109 916 972 +45 10 395 972 +50 6 935 972 +52 76 960 972 +65 83 899 972 +69 183 785 972 +79 130 887 972 +80 79 923 972 +84 180 957 972 +86 134 925 972 +100 61 574 972 +105 117 957 972 +106 127 966 972 +108 117 0 972 +118 153 871 972 +126 80 0 972 +136 223 924 972 +136 194 0 972 +147 191 877 972 +151 194 862 972 +167 218 0 972 +168 133 806 972 +171 184 650 972 +171 230 844 972 +182 243 868 972 +187 247 952 972 +191 33 914 972 +193 70 953 972 +199 121 943 972 +201 118 700 972 +207 243 959 972 +208 27 896 972 +215 236 964 972 +226 246 769 972 +239 16 922 972 +242 2 945 972 +6 10 961 973 +18 125 947 973 +21 44 891 973 +21 34 949 973 +31 154 650 973 +51 134 898 973 +54 39 27 973 +73 32 913 973 +78 190 950 973 +88 104 0 973 +105 34 958 973 +108 214 932 973 +132 212 959 973 +145 237 569 973 +153 83 935 973 +177 226 958 973 +178 151 923 973 +183 246 0 973 +188 186 702 973 +215 197 0 973 +215 28 898 973 +217 229 955 973 +5 10 934 974 +5 153 946 974 +16 89 955 974 +24 107 858 974 +36 84 734 974 +53 77 938 974 +55 104 0 974 +57 39 0 974 +59 120 635 974 +108 230 968 974 +135 250 969 974 +147 200 622 974 +157 224 936 974 +163 220 894 974 +174 138 909 974 +176 49 966 974 +195 142 948 974 +199 196 940 974 +214 235 574 974 +218 235 0 974 +240 184 725 974 +241 143 777 974 +249 185 860 974 +8 21 0 975 +29 247 953 975 +53 138 941 975 +56 114 876 975 +57 195 905 975 +90 19 919 975 +126 202 852 975 +132 194 0 975 +170 79 488 975 +170 179 934 975 +176 226 937 975 +176 13 608 975 +193 6 950 975 +207 206 716 975 +209 17 0 975 +210 4 934 975 +235 30 874 975 +18 36 948 976 +23 45 841 976 +25 126 781 976 +27 169 923 976 +30 44 843 976 +49 199 910 976 +50 223 858 976 +77 192 857 976 +92 229 963 976 +159 93 511 976 +166 3 961 976 +173 224 40 976 +185 248 890 976 +191 239 958 976 +198 220 909 976 +211 231 635 976 +221 251 927 976 +230 21 681 976 +244 34 725 976 +246 38 959 976 +17 85 599 977 +33 34 808 977 +34 162 753 977 +60 75 667 977 +67 209 920 977 +82 98 0 977 +88 34 858 977 +94 99 0 977 +106 36 966 977 +109 44 791 977 +113 96 916 977 +136 179 117 977 +147 229 479 977 +168 243 874 977 +239 111 913 977 +254 13 0 977 +4 212 235 978 +7 153 481 978 +19 87 976 978 +48 228 439 978 +58 59 0 978 +60 123 945 978 +74 86 506 978 +85 125 954 978 +101 177 465 978 +128 186 921 978 +136 222 976 978 +140 217 0 978 +146 189 820 978 +167 171 876 978 +174 222 57 978 +191 62 739 978 +207 159 952 978 +209 229 890 978 +221 61 865 978 +221 254 943 978 +222 93 824 978 +253 1 963 978 +8 136 977 979 +27 117 928 979 +34 134 969 979 +57 122 602 979 +80 202 915 979 +94 97 0 979 +112 52 938 979 +159 240 894 979 +164 176 887 979 +165 249 383 979 +207 13 0 979 +219 229 962 979 +227 235 679 979 +238 205 938 979 +239 230 934 979 +242 206 925 979 +5 76 678 980 +17 153 889 980 +51 8 478 980 +92 155 630 980 +110 162 855 980 +128 108 905 980 +164 168 954 980 +167 227 367 980 +188 201 823 980 +191 256 924 980 +206 196 0 980 +208 235 894 980 +222 235 979 980 +241 255 958 980 +244 116 744 980 +8 133 967 981 +24 121 946 981 +66 94 949 981 +68 88 929 981 +131 217 944 981 +140 206 595 981 +143 222 870 981 +196 93 935 981 +222 206 521 981 +228 47 0 981 +229 235 776 981 +237 184 707 981 +246 5 114 981 +13 50 762 982 +13 56 866 982 +13 127 971 982 +18 101 860 982 +21 27 521 982 +45 93 802 982 +63 84 568 982 +65 130 906 982 +69 135 641 982 +129 13 831 982 +130 143 277 982 +130 179 776 982 +151 179 858 982 +156 140 0 982 +161 175 0 982 +193 219 957 982 +194 208 873 982 +199 34 905 982 +203 93 377 982 +204 23 755 982 +215 14 952 982 +236 1 834 982 +239 42 847 982 +242 62 762 982 +248 250 959 982 +46 47 0 983 +54 12 965 983 +59 115 775 983 +75 76 925 983 +84 237 960 983 +98 238 632 983 +103 147 941 983 +106 99 796 983 +112 249 821 983 +116 72 733 983 +132 151 830 983 +137 147 968 983 +140 135 0 983 +146 102 964 983 +171 79 971 983 +171 205 716 983 +180 61 956 983 +188 135 0 983 +200 212 953 983 +208 16 0 983 +215 222 782 983 +227 5 914 983 +9 224 921 984 +10 93 899 984 +20 98 958 984 +25 153 763 984 +27 40 974 984 +36 145 947 984 +50 2 0 984 +57 201 40 984 +68 125 884 984 +71 132 977 984 +103 229 942 984 +104 167 978 984 +128 107 948 984 +136 229 893 984 +140 201 0 984 +187 14 969 984 +188 144 0 984 +195 38 910 984 +206 45 881 984 +219 86 900 984 +226 255 247 984 +227 248 876 984 +234 251 850 984 +6 121 880 985 +6 77 971 985 +7 34 955 985 +36 181 903 985 +41 121 942 985 +73 71 952 985 +119 188 0 985 +122 40 979 985 +139 60 961 985 +144 159 458 985 +146 241 330 985 +177 143 952 985 +192 67 329 985 +214 194 674 985 +217 194 285 985 +227 208 912 985 +233 21 923 985 +239 61 0 985 +239 27 748 985 +242 17 944 985 +3 151 964 986 +51 118 0 986 +65 158 923 986 +69 241 727 986 +70 76 0 986 +71 123 908 986 +71 172 914 986 +88 99 0 986 +91 140 0 986 +94 161 881 986 +116 113 938 986 +120 25 924 986 +128 100 301 986 +164 224 900 986 +177 132 984 986 +194 220 746 986 +206 16 968 986 +218 14 969 986 +222 45 0 986 +238 233 969 986 +249 191 980 986 +253 60 654 986 +256 43 978 986 +9 23 0 987 +14 6 513 987 +14 11 0 987 +41 87 903 987 +43 60 681 987 +44 34 944 987 +58 54 818 987 +84 218 947 987 +121 127 962 987 +123 183 977 987 +129 49 964 987 +130 148 308 987 +157 136 957 987 +164 221 584 987 +170 127 0 987 +187 67 747 987 +189 144 986 987 +196 53 932 987 +206 212 697 987 +219 230 400 987 +10 155 916 988 +15 93 0 988 +22 45 501 988 +30 99 499 988 +39 115 778 988 +43 97 961 988 +51 190 980 988 +67 148 638 988 +82 159 985 988 +82 167 906 988 +101 166 0 988 +103 104 0 988 +145 189 960 988 +157 146 965 988 +158 95 940 988 +172 246 930 988 +192 256 949 988 +197 87 976 988 +208 230 937 988 +210 212 0 988 +215 23 0 988 +219 21 878 988 +223 2 0 988 +225 223 854 988 +235 29 0 988 +242 1 941 988 +16 68 966 989 +17 18 967 989 +20 63 937 989 +24 166 906 989 +29 154 677 989 +43 174 961 989 +54 166 380 989 +63 75 573 989 +64 116 976 989 +69 245 799 989 +89 124 346 989 +94 96 890 989 +95 162 902 989 +98 67 957 989 +132 2 874 989 +152 209 0 989 +158 161 890 989 +162 67 849 989 +173 39 875 989 +176 236 909 989 +201 14 446 989 +210 179 725 989 +218 9 964 989 +232 255 304 989 +233 41 980 989 +239 235 0 989 +245 151 940 989 +248 44 943 989 +254 21 968 989 +29 107 866 990 +55 107 821 990 +56 70 892 990 +59 123 151 990 +60 34 889 990 +83 131 972 990 +113 162 0 990 +129 19 970 990 +131 148 973 990 +143 148 329 990 +150 249 613 990 +159 4 674 990 +174 167 931 990 +211 219 877 990 +213 175 961 990 +233 57 973 990 +242 179 964 990 +8 142 969 991 +20 42 956 991 +52 207 953 991 +69 148 956 991 +72 213 933 991 +83 210 967 991 +83 160 962 991 +84 169 944 991 +110 177 862 991 +119 186 889 991 +121 52 874 991 +126 91 472 991 +128 140 969 991 +128 180 889 991 +149 216 955 991 +163 248 873 991 +191 251 914 991 +194 11 970 991 +206 220 970 991 +208 28 802 991 +215 188 989 991 +219 154 888 991 +222 180 962 991 +240 26 935 991 +4 208 990 992 +8 92 857 992 +13 113 896 992 +28 33 979 992 +46 125 497 992 +56 34 0 992 +62 101 982 992 +67 144 743 992 +68 99 790 992 +83 238 974 992 +98 241 518 992 +107 117 804 992 +115 137 412 992 +168 211 974 992 +171 48 838 992 +193 17 925 992 +208 90 782 992 +217 250 970 992 +239 125 512 992 +243 246 0 992 +10 84 931 993 +24 255 840 993 +40 112 664 993 +71 149 934 993 +78 69 908 993 +82 104 600 993 +84 222 915 993 +96 187 733 993 +98 234 980 993 +108 184 672 993 +118 39 956 993 +128 170 0 993 +149 132 183 993 +164 241 845 993 +176 67 946 993 +182 229 973 993 +193 175 954 993 +199 59 152 993 +213 163 921 993 +217 200 815 993 +1 98 956 994 +16 156 973 994 +23 6 943 994 +40 249 808 994 +61 20 930 994 +140 204 0 994 +163 49 947 994 +164 240 714 994 +171 252 548 994 +200 233 938 994 +215 171 886 994 +232 35 808 994 +234 162 980 994 +234 247 0 994 +237 26 885 994 +254 256 0 994 +12 156 989 995 +12 82 986 995 +25 70 0 995 +56 209 871 995 +83 132 204 995 +129 255 342 995 +132 152 0 995 +132 216 850 995 +140 179 628 995 +158 151 975 995 +174 180 439 995 +198 50 926 995 +205 1 773 995 +210 198 912 995 +216 33 885 995 +226 205 798 995 +244 120 728 995 +255 127 955 995 +23 74 912 996 +34 133 910 996 +41 118 961 996 +62 1 816 996 +77 69 901 996 +78 2 903 996 +99 190 951 996 +109 44 993 996 +128 96 870 996 +134 245 943 996 +143 147 564 996 +154 84 929 996 +187 184 496 996 +199 25 445 996 +232 28 898 996 +254 63 991 996 +5 86 917 997 +8 151 958 997 +16 29 928 997 +21 55 747 997 +51 101 968 997 +59 119 131 997 +66 158 940 997 +71 151 208 997 +100 226 971 997 +115 165 959 997 +123 135 772 997 +138 205 977 997 +147 211 0 997 +163 227 865 997 +174 138 979 997 +195 175 976 997 +204 45 879 997 +209 22 887 997 +212 81 223 997 +213 195 891 997 +215 221 724 997 +219 11 974 997 +7 121 287 998 +9 19 917 998 +10 124 744 998 +31 27 0 998 +78 96 828 998 +87 146 809 998 +101 115 780 998 +103 136 952 998 +132 164 922 998 +148 209 968 998 +150 100 974 998 +174 176 0 998 +180 46 967 998 +183 139 0 998 +189 235 987 998 +192 252 829 998 +194 70 782 998 +209 194 735 998 +209 70 887 998 +210 220 874 998 +239 253 0 998 +6 117 941 999 +11 8 940 999 +23 208 842 999 +30 255 776 999 +31 28 443 999 +34 180 996 999 +42 39 438 999 +44 15 984 999 +63 60 917 999 +65 134 879 999 +104 238 780 999 +116 76 981 999 +138 188 772 999 +143 239 992 999 +160 93 908 999 +163 178 981 999 +174 188 142 999 +203 16 890 999 +243 78 979 999 +250 7 961 999 +106 74 972 1000 +42 108 906 1000 +65 70 898 1000 +80 218 901 1000 +80 161 889 1000 +105 151 974 1000 +154 136 978 1000 +75 117 877 1000 +177 176 932 1000 +190 162 750 1000 +202 224 0 1000 +164 180 0 1000 +169 216 989 1000 +237 206 941 1000 +226 247 973 1000 +234 58 483 1000 +196 51 829 1000 +9 221 784 1000 +221 45 0 1000 +231 10 990 1000 +236 46 913 1000 +56 23 921 1000 +243 60 979 1000 +203 25 923 1000 diff --git a/examples/tracker/in.track b/examples/tracker/in.track index 01da9933be..36b221f072 100644 --- a/examples/tracker/in.track +++ b/examples/tracker/in.track @@ -11,7 +11,7 @@ mass 1 1.0 mass 2 1.0 velocity all create 2.0 87287 loop geom -pair_style hybrid/overlay lj/cut 2.5 tracker +pair_style hybrid/overlay lj/cut 2.5 tracker trackfix 1000 id1 id2 time/created time/broken time/total time/min 0.5 pair_coeff * * lj/cut 1.0 1.0 2.5 pair_coeff * * tracker 2.5 @@ -19,10 +19,9 @@ neighbor 0.3 bin neigh_modify every 20 delay 0 check no fix 1 all nve -fix 2 all pair/tracker 1000 id1 id2 time/created time/broken time/total time/min 0.5 -fix 3 all ave/histo 1000 1 1000 0 6 30 f_2[5] mode vector kind local file lifetime_hist.dat +fix 2 all ave/histo 1000 1 1000 0 6 30 f_trackfix[5] mode vector kind local file lifetime_hist.dat -dump 1 all local 1000 contact_history.dat f_2[1] f_2[2] f_2[3] f_2[4] +dump 1 all local 1000 contact_history.dat f_trackfix[1] f_trackfix[2] f_trackfix[3] f_trackfix[4] dump_modify 1 header no # compute 1 all property/local patom1 patom2 diff --git a/examples/tracker/lifetime_hist.dat b/examples/tracker/lifetime_hist.dat index 002e269896..224aed6fe1 100644 --- a/examples/tracker/lifetime_hist.dat +++ b/examples/tracker/lifetime_hist.dat @@ -1,4 +1,4 @@ -# Histogrammed data for fix 3 +# Histogrammed data for fix 2 # TimeStep Number-of-bins Total-counts Missing-counts Min-value Max-value # Bin Coord Count Count/Total 0 30 0 0 1e+20 -1e+20 @@ -32,34 +32,34 @@ 28 5.5 0 0 29 5.7 0 0 30 5.9 0 0 -1000 30 8122 0 0.5 5 +1000 30 528 20285 1 1000 1 0.1 0 0 2 0.3 0 0 -3 0.5 910 0.112041 -4 0.7 1253 0.154272 -5 0.9 953 0.117336 -6 1.1 747 0.0919724 -7 1.3 559 0.0688254 -8 1.5 501 0.0616843 -9 1.7 421 0.0518345 -10 1.9 356 0.0438316 -11 2.1 300 0.0369367 -12 2.3 281 0.0345974 -13 2.5 242 0.0297956 -14 2.7 226 0.0278257 -15 2.9 175 0.0215464 -16 3.1 168 0.0206846 -17 3.3 162 0.0199458 -18 3.5 129 0.0158828 -19 3.7 151 0.0185915 -20 3.9 137 0.0168678 -21 4.1 98 0.012066 -22 4.3 104 0.0128047 -23 4.5 83 0.0102192 -24 4.7 77 0.00948042 -25 4.9 86 0.0105885 -26 5.1 3 0.000369367 +3 0.5 0 0 +4 0.7 0 0 +5 0.9 0 0 +6 1.1 17 0.032197 +7 1.3 0 0 +8 1.5 0 0 +9 1.7 0 0 +10 1.9 0 0 +11 2.1 51 0.0965909 +12 2.3 0 0 +13 2.5 0 0 +14 2.7 0 0 +15 2.9 0 0 +16 3.1 80 0.151515 +17 3.3 0 0 +18 3.5 0 0 +19 3.7 0 0 +20 3.9 0 0 +21 4.1 91 0.172348 +22 4.3 0 0 +23 4.5 0 0 +24 4.7 0 0 +25 4.9 0 0 +26 5.1 117 0.221591 27 5.3 0 0 28 5.5 0 0 29 5.7 0 0 -30 5.9 0 0 +30 5.9 172 0.325758 diff --git a/examples/tracker/log.29Aug24.tracker.g++.1 b/examples/tracker/log.29Aug24.tracker.g++.1 new file mode 100644 index 0000000000..80feeb462f --- /dev/null +++ b/examples/tracker/log.29Aug24.tracker.g++.1 @@ -0,0 +1,108 @@ +LAMMPS (29 Aug 2024 - Development - patch_29Aug2024-731-g5ce635757f) +# 3d Lennard-Jones melt with tracking + +units lj +atom_style atomic + +lattice fcc 0.8442 +Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 +region box block 0 4 0 4 0 4 +create_box 2 box +Created orthogonal box = (0 0 0) to (6.7183848 6.7183848 6.7183848) + 1 by 1 by 1 MPI processor grid +create_atoms 2 box +Created 256 atoms + using lattice units in orthogonal box = (0 0 0) to (6.7183848 6.7183848 6.7183848) + create_atoms CPU = 0.000 seconds +mass 1 1.0 +mass 2 1.0 +velocity all create 2.0 87287 loop geom + +pair_style hybrid/overlay lj/cut 2.5 tracker trackfix 1000 id1 id2 time/created time/broken time/total time/min 0.5 +pair_coeff * * lj/cut 1.0 1.0 2.5 +pair_coeff * * tracker 2.5 + +neighbor 0.3 bin +neigh_modify every 20 delay 0 check no + +fix 1 all nve +fix 2 all ave/histo 1000 1 1000 0 6 30 f_trackfix[5] mode vector kind local file lifetime_hist.dat + +dump 1 all local 1000 contact_history.dat f_trackfix[1] f_trackfix[2] f_trackfix[3] f_trackfix[4] +dump_modify 1 header no + +# compute 1 all property/local patom1 patom2 +# dump 2 all local 1 pairs.dat c_1[1] c_1[2] + +# dump 3 all atom 1 atoms.dat + +thermo 50 +run 1000 #0 +Generated 0 of 1 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 20 steps, delay = 0 steps, check = no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 2.8 + ghost atom cutoff = 2.8 + binsize = 1.4, bins = 5 5 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d + bin: standard + (2) pair tracker, perpetual, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 8.679 | 8.679 | 8.679 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 2 -6.7733681 0 -3.7850868 -4.5535126 + 50 1.0540428 -5.3670859 0 -3.7921977 2.3386375 + 100 1.0402713 -5.3493439 0 -3.7950323 2.4553748 + 150 1.0570745 -5.3738961 0 -3.7944781 2.3767396 + 200 1.0431846 -5.3518647 0 -3.7932002 2.5010135 + 250 1.070121 -5.3902744 0 -3.791363 2.4908658 + 300 1.0667723 -5.3866302 0 -3.7927224 2.3589344 + 350 1.000601 -5.2859643 0 -3.7909257 2.9065274 + 400 0.99256113 -5.2738812 0 -3.7908553 2.8595867 + 450 1.0482542 -5.357452 0 -3.7912128 2.4707397 + 500 1.0196176 -5.3123538 0 -3.7889017 2.7230338 + 550 0.98274535 -5.2586303 0 -3.7902706 2.9156947 + 600 1.0683914 -5.3863229 0 -3.789996 2.3002719 + 650 1.0130779 -5.303917 0 -3.7902362 2.8726423 + 700 1.0583333 -5.3737358 0 -3.792437 2.5770307 + 750 0.98274506 -5.2612464 0 -3.792887 2.9447027 + 800 1.0294191 -5.332001 0 -3.7939042 2.5293193 + 850 0.99240027 -5.2735754 0 -3.7907899 2.7672711 + 900 1.0293488 -5.3306241 0 -3.7926323 2.6054041 + 950 0.97137182 -5.2424403 0 -3.7910742 3.129989 + 1000 1.0009431 -5.2864286 0 -3.7908788 2.7536598 +Loop time of 0.286151 on 1 procs for 1000 steps with 256 atoms + +Performance: 1509690.552 tau/day, 3494.654 timesteps/s, 894.631 katom-step/s +99.4% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.21578 | 0.21578 | 0.21578 | 0.0 | 75.41 +Neigh | 0.020262 | 0.020262 | 0.020262 | 0.0 | 7.08 +Comm | 0.0051679 | 0.0051679 | 0.0051679 | 0.0 | 1.81 +Output | 0.021204 | 0.021204 | 0.021204 | 0.0 | 7.41 +Modify | 0.02307 | 0.02307 | 0.02307 | 0.0 | 8.06 +Other | | 0.0006654 | | | 0.23 + +Nlocal: 256 ave 256 max 256 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1327 ave 1327 max 1327 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 9612 ave 9612 max 9612 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 9612 +Ave neighs/atom = 37.546875 +Neighbor list builds = 50 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/tracker/log.8Apr21.tracker.g++.1 b/examples/tracker/log.8Apr21.tracker.g++.1 deleted file mode 100644 index e654558061..0000000000 --- a/examples/tracker/log.8Apr21.tracker.g++.1 +++ /dev/null @@ -1,107 +0,0 @@ -LAMMPS (8 Apr 2021) -# 3d Lennard-Jones melt with tracking - -units lj -atom_style atomic - -lattice fcc 0.8442 -Lattice spacing in x,y,z = 1.6795962 1.6795962 1.6795962 -region box block 0 4 0 4 0 4 -create_box 2 box -Created orthogonal box = (0.0000000 0.0000000 0.0000000) to (6.7183848 6.7183848 6.7183848) - 1 by 1 by 1 MPI processor grid -create_atoms 2 box -Created 256 atoms - create_atoms CPU = 0.001 seconds -mass 1 1.0 -mass 2 1.0 -velocity all create 2.0 87287 loop geom - -pair_style hybrid/overlay lj/cut 2.5 tracker -pair_coeff * * lj/cut 1.0 1.0 2.5 -pair_coeff * * tracker 2.5 - -neighbor 0.3 bin -neigh_modify every 20 delay 0 check no - -fix 1 all nve -fix 2 all pair/tracker 1000 id1 id2 time/created time/broken time/total time/min 0.5 -fix 3 all ave/histo 1000 1 1000 0 6 30 f_2[5] mode vector kind local file lifetime_hist.dat - -dump 1 all local 1000 contact_history.dat f_2[1] f_2[2] f_2[3] f_2[4] -dump_modify 1 header no - -# compute 1 all property/local patom1 patom2 -# dump 2 all local 1 pairs.dat c_1[1] c_1[2] - -# dump 3 all atom 1 atoms.dat - -thermo 50 -run 1000 #0 -Neighbor list info ... - update every 20 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 2.8 - ghost atom cutoff = 2.8 - binsize = 1.4, bins = 5 5 5 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair lj/cut, perpetual - attributes: half, newton on - pair build: half/bin/atomonly/newton - stencil: half/bin/3d - bin: standard - (2) pair tracker, perpetual - attributes: half, newton on, history - pair build: half/bin/atomonly/newton - stencil: half/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 10.46 | 10.46 | 10.46 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 2 -6.7733681 0 -3.7850868 -4.5535126 - 50 1.0540428 -5.3670859 0 -3.7921977 2.3386375 - 100 1.0402713 -5.3493439 0 -3.7950323 2.4553748 - 150 1.0570745 -5.3738961 0 -3.7944781 2.3767396 - 200 1.0431846 -5.3518647 0 -3.7932002 2.5010135 - 250 1.070121 -5.3902744 0 -3.791363 2.4908658 - 300 1.0667723 -5.3866302 0 -3.7927224 2.3589344 - 350 1.000601 -5.2859643 0 -3.7909257 2.9065274 - 400 0.99256113 -5.2738812 0 -3.7908553 2.8595867 - 450 1.0482542 -5.357452 0 -3.7912128 2.4707397 - 500 1.0196176 -5.3123538 0 -3.7889017 2.7230338 - 550 0.98274535 -5.2586303 0 -3.7902706 2.9156947 - 600 1.0683914 -5.3863229 0 -3.789996 2.3002719 - 650 1.0130779 -5.303917 0 -3.7902362 2.8726423 - 700 1.0583333 -5.3737358 0 -3.792437 2.5770307 - 750 0.98274506 -5.2612464 0 -3.792887 2.9447027 - 800 1.0294191 -5.332001 0 -3.7939042 2.5293193 - 850 0.99240027 -5.2735754 0 -3.7907899 2.7672711 - 900 1.0293488 -5.3306241 0 -3.7926323 2.6054041 - 950 0.97137182 -5.2424403 0 -3.7910742 3.129989 - 1000 1.0009431 -5.2864286 0 -3.7908788 2.7536598 -Loop time of 0.310363 on 1 procs for 1000 steps with 256 atoms - -Performance: 1391918.252 tau/day, 3222.033 timesteps/s -100.7% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.22132 | 0.22132 | 0.22132 | 0.0 | 71.31 -Neigh | 0.03458 | 0.03458 | 0.03458 | 0.0 | 11.14 -Comm | 0.0087938 | 0.0087938 | 0.0087938 | 0.0 | 2.83 -Output | 0.014075 | 0.014075 | 0.014075 | 0.0 | 4.54 -Modify | 0.02818 | 0.02818 | 0.02818 | 0.0 | 9.08 -Other | | 0.003411 | | | 1.10 - -Nlocal: 256.000 ave 256 max 256 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 1327.00 ave 1327 max 1327 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 9612.00 ave 9612 max 9612 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 9612 -Ave neighs/atom = 37.546875 -Neighbor list builds = 50 -Dangerous builds not checked -Total wall time: 0:00:00 diff --git a/examples/wall/in.wall.block b/examples/wall/in.wall.block new file mode 100644 index 0000000000..7e18d9ab4c --- /dev/null +++ b/examples/wall/in.wall.block @@ -0,0 +1,40 @@ + +units real + +molecule water tip3p.mol +atom_style full + +variable radius equal 100.0 +region box block $(-v_radius) $(v_radius) $(-v_radius) $(v_radius) $(-v_radius) $(v_radius) +create_box 2 box bond/types 1 angle/types 1 & + extra/bond/per/atom 2 extra/angle/per/atom 1 extra/special/per/atom 2 + +mass 1 15.9994 +mass 2 1.008 + +bond_style zero +bond_coeff 1 0.9574 +angle_style zero +angle_coeff 1 104.52 + +region block1 block -80 80 -80 80 -80 80 +region block2 block -70 70 -70 70 -70 70 +create_atoms 0 random 5000 12345 block2 mol water 12345 overlap 2 + +thermo 1 +thermo_style custom step time spcpu temp press etotal pe + +fix wall all wall/region block1 harmonic 1000.0 0.0 2.5 +fix_modify wall energy yes + +pair_style lj/cut/coul/cut 8.0 +pair_coeff 1 1 0.1521 3.1507 +pair_coeff 2 2 0.0 1.0 +velocity all create 300.0 12345 +fix 1 all nvt temp 300 300 100.0 +fix 2 all shake 0.001 10 10000 b 1 a 1 + +dump 2 all movie 10 wall.block.mpg type type size 1500 1500 fsaa yes +dump_modify 2 pad 4 acolor * white/red/green/blue/aqua/magenta + +run 100 diff --git a/examples/wall/in.wall.sphere b/examples/wall/in.wall.sphere new file mode 100644 index 0000000000..995a1b0f75 --- /dev/null +++ b/examples/wall/in.wall.sphere @@ -0,0 +1,40 @@ + +units real + +molecule water tip3p.mol +atom_style full + +variable radius equal 100.0 +region box block $(-v_radius) $(v_radius) $(-v_radius) $(v_radius) $(-v_radius) $(v_radius) +create_box 2 box bond/types 1 angle/types 1 & + extra/bond/per/atom 2 extra/angle/per/atom 1 extra/special/per/atom 2 + +mass 1 15.9994 +mass 2 1.008 + +bond_style zero +bond_coeff 1 0.9574 +angle_style zero +angle_coeff 1 104.52 + +region sphere1 sphere 0 0 0 $(v_radius-10) side in +region sphere2 sphere 0 0 0 $(v_radius-20) side in +create_atoms 0 random 5000 12345 sphere2 mol water 12345 overlap 2 + +thermo 1 +thermo_style custom step time spcpu temp press etotal pe + +fix wall all wall/region sphere1 harmonic 1000.0 0.0 2.5 +fix_modify wall energy yes + +pair_style lj/cut/coul/cut 8.0 +pair_coeff 1 1 0.1521 3.1507 +pair_coeff 2 2 0.0 1.0 +velocity all create 300.0 12345 +fix 1 all nvt temp 300 300 100.0 +fix 2 all shake 0.001 10 10000 b 1 a 1 + +dump 2 all movie 10 wall.sphere.mpg type type size 1500 1500 fsaa yes +dump_modify 2 pad 4 acolor * white/red/green/blue/aqua/magenta + +run 100 diff --git a/examples/wall/tip3p.mol b/examples/wall/tip3p.mol new file mode 100644 index 0000000000..fe8410632e --- /dev/null +++ b/examples/wall/tip3p.mol @@ -0,0 +1,62 @@ +# Water molecule. TIP3P geometry + +3 atoms +2 bonds +1 angles + +Coords + +1 0.00000 -0.06556 0.00000 +2 0.75695 0.52032 0.00000 +3 -0.75695 0.52032 0.00000 + +Types + +1 1 +2 2 +3 2 + +Charges + +1 -0.834 +2 0.417 +3 0.417 + +Bonds + +1 1 1 2 +2 1 1 3 + +Angles + +1 1 2 1 3 + +Shake Flags + +1 1 +2 1 +3 1 + +Shake Atoms + +1 1 2 3 +2 1 2 3 +3 1 2 3 + +Shake Bond Types + +1 1 1 1 +2 1 1 1 +3 1 1 1 + +Special Bond Counts + +1 2 0 0 +2 1 1 0 +3 1 1 0 + +Special Bonds + +1 2 3 +2 1 3 +3 1 2 diff --git a/lib/gpu/lal_neighbor.cpp b/lib/gpu/lal_neighbor.cpp index 288415e0e7..aca9b1d141 100644 --- a/lib/gpu/lal_neighbor.cpp +++ b/lib/gpu/lal_neighbor.cpp @@ -365,7 +365,9 @@ void Neighbor::get_host(const int inum, int *ilist, int *numj, int i=ilist[ii]; three_ilist[i] = ii; } - three_ilist.update_device(inum,true); + // needs to transfer _max_atoms because three_ilist indexes all the atoms (local and ghost) + // not just inum (number of neighbor list items) + three_ilist.update_device(_max_atoms,true); } time_nbor.stop(); diff --git a/lib/linalg/dbdsdc.cpp b/lib/linalg/dbdsdc.cpp new file mode 100644 index 0000000000..7f362f3be9 --- /dev/null +++ b/lib/linalg/dbdsdc.cpp @@ -0,0 +1,282 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__9 = 9; +static integer c__0 = 0; +static doublereal c_b15 = 1.; +static integer c__1 = 1; +static doublereal c_b29 = 0.; +int dbdsdc_(char *uplo, char *compq, integer *n, doublereal *d__, doublereal *e, doublereal *u, + integer *ldu, doublereal *vt, integer *ldvt, doublereal *q, integer *iq, + doublereal *work, integer *iwork, integer *info, ftnlen uplo_len, ftnlen compq_len) +{ + integer u_dim1, u_offset, vt_dim1, vt_offset, i__1, i__2; + doublereal d__1; + double d_lmp_sign(doublereal *, doublereal *), log(doublereal); + integer i__, j, k; + doublereal p, r__; + integer z__, ic, ii, kk; + doublereal cs; + integer is, iu; + doublereal sn; + integer nm1; + doublereal eps; + integer ivt, difl, difr, ierr, perm, mlvl, sqre; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int dlasr_(char *, char *, char *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), + dswap_(integer *, doublereal *, integer *, doublereal *, integer *); + integer poles, iuplo, nsize, start; + extern int dlasd0_(integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, integer *, integer *, integer *, doublereal *, integer *); + extern doublereal dlamch_(char *, ftnlen); + extern int dlasda_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *, integer *, integer *, integer *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen), + dlasdq_(char *, integer *, integer *, integer *, integer *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), + dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + integer givcol; + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, ftnlen); + integer icompq; + doublereal orgnrm; + integer givnum, givptr, qstart, smlsiz, wstart, smlszp; + --d__; + --e; + u_dim1 = *ldu; + u_offset = 1 + u_dim1; + u -= u_offset; + vt_dim1 = *ldvt; + vt_offset = 1 + vt_dim1; + vt -= vt_offset; + --q; + --iq; + --work; + --iwork; + *info = 0; + iuplo = 0; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + iuplo = 1; + } + if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + iuplo = 2; + } + if (lsame_(compq, (char *)"N", (ftnlen)1, (ftnlen)1)) { + icompq = 0; + } else if (lsame_(compq, (char *)"P", (ftnlen)1, (ftnlen)1)) { + icompq = 1; + } else if (lsame_(compq, (char *)"I", (ftnlen)1, (ftnlen)1)) { + icompq = 2; + } else { + icompq = -1; + } + if (iuplo == 0) { + *info = -1; + } else if (icompq < 0) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*ldu < 1 || icompq == 2 && *ldu < *n) { + *info = -7; + } else if (*ldvt < 1 || icompq == 2 && *ldvt < *n) { + *info = -9; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DBDSDC", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + smlsiz = ilaenv_(&c__9, (char *)"DBDSDC", (char *)" ", &c__0, &c__0, &c__0, &c__0, (ftnlen)6, (ftnlen)1); + if (*n == 1) { + if (icompq == 1) { + q[1] = d_lmp_sign(&c_b15, &d__[1]); + q[smlsiz * *n + 1] = 1.; + } else if (icompq == 2) { + u[u_dim1 + 1] = d_lmp_sign(&c_b15, &d__[1]); + vt[vt_dim1 + 1] = 1.; + } + d__[1] = abs(d__[1]); + return 0; + } + nm1 = *n - 1; + wstart = 1; + qstart = 3; + if (icompq == 1) { + dcopy_(n, &d__[1], &c__1, &q[1], &c__1); + i__1 = *n - 1; + dcopy_(&i__1, &e[1], &c__1, &q[*n + 1], &c__1); + } + if (iuplo == 2) { + qstart = 5; + if (icompq == 2) { + wstart = (*n << 1) - 1; + } + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); + d__[i__] = r__; + e[i__] = sn * d__[i__ + 1]; + d__[i__ + 1] = cs * d__[i__ + 1]; + if (icompq == 1) { + q[i__ + (*n << 1)] = cs; + q[i__ + *n * 3] = sn; + } else if (icompq == 2) { + work[i__] = cs; + work[nm1 + i__] = -sn; + } + } + } + if (icompq == 0) { + dlasdq_((char *)"U", &c__0, n, &c__0, &c__0, &c__0, &d__[1], &e[1], &vt[vt_offset], ldvt, + &u[u_offset], ldu, &u[u_offset], ldu, &work[1], info, (ftnlen)1); + goto L40; + } + if (*n <= smlsiz) { + if (icompq == 2) { + dlaset_((char *)"A", n, n, &c_b29, &c_b15, &u[u_offset], ldu, (ftnlen)1); + dlaset_((char *)"A", n, n, &c_b29, &c_b15, &vt[vt_offset], ldvt, (ftnlen)1); + dlasdq_((char *)"U", &c__0, n, n, n, &c__0, &d__[1], &e[1], &vt[vt_offset], ldvt, &u[u_offset], + ldu, &u[u_offset], ldu, &work[wstart], info, (ftnlen)1); + } else if (icompq == 1) { + iu = 1; + ivt = iu + *n; + dlaset_((char *)"A", n, n, &c_b29, &c_b15, &q[iu + (qstart - 1) * *n], n, (ftnlen)1); + dlaset_((char *)"A", n, n, &c_b29, &c_b15, &q[ivt + (qstart - 1) * *n], n, (ftnlen)1); + dlasdq_((char *)"U", &c__0, n, n, n, &c__0, &d__[1], &e[1], &q[ivt + (qstart - 1) * *n], n, + &q[iu + (qstart - 1) * *n], n, &q[iu + (qstart - 1) * *n], n, &work[wstart], + info, (ftnlen)1); + } + goto L40; + } + if (icompq == 2) { + dlaset_((char *)"A", n, n, &c_b29, &c_b15, &u[u_offset], ldu, (ftnlen)1); + dlaset_((char *)"A", n, n, &c_b29, &c_b15, &vt[vt_offset], ldvt, (ftnlen)1); + } + orgnrm = dlanst_((char *)"M", n, &d__[1], &e[1], (ftnlen)1); + if (orgnrm == 0.) { + return 0; + } + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b15, n, &c__1, &d__[1], n, &ierr, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b15, &nm1, &c__1, &e[1], &nm1, &ierr, (ftnlen)1); + eps = dlamch_((char *)"Epsilon", (ftnlen)7) * .9; + mlvl = (integer)(log((doublereal)(*n) / (doublereal)(smlsiz + 1)) / log(2.)) + 1; + smlszp = smlsiz + 1; + if (icompq == 1) { + iu = 1; + ivt = smlsiz + 1; + difl = ivt + smlszp; + difr = difl + mlvl; + z__ = difr + (mlvl << 1); + ic = z__ + mlvl; + is = ic + 1; + poles = is + 1; + givnum = poles + (mlvl << 1); + k = 1; + givptr = 2; + perm = 3; + givcol = perm + mlvl; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + if ((d__1 = d__[i__], abs(d__1)) < eps) { + d__[i__] = d_lmp_sign(&eps, &d__[i__]); + } + } + start = 1; + sqre = 0; + i__1 = nm1; + for (i__ = 1; i__ <= i__1; ++i__) { + if ((d__1 = e[i__], abs(d__1)) < eps || i__ == nm1) { + if (i__ < nm1) { + nsize = i__ - start + 1; + } else if ((d__1 = e[i__], abs(d__1)) >= eps) { + nsize = *n - start + 1; + } else { + nsize = i__ - start + 1; + if (icompq == 2) { + u[*n + *n * u_dim1] = d_lmp_sign(&c_b15, &d__[*n]); + vt[*n + *n * vt_dim1] = 1.; + } else if (icompq == 1) { + q[*n + (qstart - 1) * *n] = d_lmp_sign(&c_b15, &d__[*n]); + q[*n + (smlsiz + qstart - 1) * *n] = 1.; + } + d__[*n] = (d__1 = d__[*n], abs(d__1)); + } + if (icompq == 2) { + dlasd0_(&nsize, &sqre, &d__[start], &e[start], &u[start + start * u_dim1], ldu, + &vt[start + start * vt_dim1], ldvt, &smlsiz, &iwork[1], &work[wstart], + info); + } else { + dlasda_(&icompq, &smlsiz, &nsize, &sqre, &d__[start], &e[start], + &q[start + (iu + qstart - 2) * *n], n, &q[start + (ivt + qstart - 2) * *n], + &iq[start + k * *n], &q[start + (difl + qstart - 2) * *n], + &q[start + (difr + qstart - 2) * *n], &q[start + (z__ + qstart - 2) * *n], + &q[start + (poles + qstart - 2) * *n], &iq[start + givptr * *n], + &iq[start + givcol * *n], n, &iq[start + perm * *n], + &q[start + (givnum + qstart - 2) * *n], &q[start + (ic + qstart - 2) * *n], + &q[start + (is + qstart - 2) * *n], &work[wstart], &iwork[1], info); + } + if (*info != 0) { + return 0; + } + start = i__ + 1; + } + } + dlascl_((char *)"G", &c__0, &c__0, &c_b15, &orgnrm, n, &c__1, &d__[1], n, &ierr, (ftnlen)1); +L40: + i__1 = *n; + for (ii = 2; ii <= i__1; ++ii) { + i__ = ii - 1; + kk = i__; + p = d__[i__]; + i__2 = *n; + for (j = ii; j <= i__2; ++j) { + if (d__[j] > p) { + kk = j; + p = d__[j]; + } + } + if (kk != i__) { + d__[kk] = d__[i__]; + d__[i__] = p; + if (icompq == 1) { + iq[i__] = kk; + } else if (icompq == 2) { + dswap_(n, &u[i__ * u_dim1 + 1], &c__1, &u[kk * u_dim1 + 1], &c__1); + dswap_(n, &vt[i__ + vt_dim1], ldvt, &vt[kk + vt_dim1], ldvt); + } + } else if (icompq == 1) { + iq[i__] = i__; + } + } + if (icompq == 1) { + if (iuplo == 1) { + iq[*n] = 1; + } else { + iq[*n] = 0; + } + } + if (iuplo == 2 && icompq == 2) { + dlasr_((char *)"L", (char *)"V", (char *)"B", n, n, &work[1], &work[*n], &u[u_offset], ldu, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dcombssq.cpp b/lib/linalg/dcombssq.cpp new file mode 100644 index 0000000000..179be8ad9e --- /dev/null +++ b/lib/linalg/dcombssq.cpp @@ -0,0 +1,26 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int dcombssq_(doublereal *v1, doublereal *v2) +{ + doublereal d__1; + --v2; + --v1; + if (v1[1] >= v2[1]) { + if (v1[1] != 0.) { + d__1 = v2[1] / v1[1]; + v1[2] += d__1 * d__1 * v2[2]; + } else { + v1[2] += v2[2]; + } + } else { + d__1 = v1[1] / v2[1]; + v1[2] = v2[2] + d__1 * d__1 * v1[2]; + v1[1] = v2[1]; + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dgebak.cpp b/lib/linalg/dgebak.cpp new file mode 100644 index 0000000000..ba0db07641 --- /dev/null +++ b/lib/linalg/dgebak.cpp @@ -0,0 +1,117 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int dgebak_(char *job, char *side, integer *n, integer *ilo, integer *ihi, doublereal *scale, + integer *m, doublereal *v, integer *ldv, integer *info, ftnlen job_len, ftnlen side_len) +{ + integer v_dim1, v_offset, i__1; + integer i__, k; + doublereal s; + integer ii; + extern int dscal_(integer *, doublereal *, doublereal *, integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int dswap_(integer *, doublereal *, integer *, doublereal *, integer *); + logical leftv; + extern int xerbla_(char *, integer *, ftnlen); + logical rightv; + --scale; + v_dim1 = *ldv; + v_offset = 1 + v_dim1; + v -= v_offset; + rightv = lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1); + leftv = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + *info = 0; + if (!lsame_(job, (char *)"N", (ftnlen)1, (ftnlen)1) && !lsame_(job, (char *)"P", (ftnlen)1, (ftnlen)1) && + !lsame_(job, (char *)"S", (ftnlen)1, (ftnlen)1) && !lsame_(job, (char *)"B", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (!rightv && !leftv) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*ilo < 1 || *ilo > max(1, *n)) { + *info = -4; + } else if (*ihi < min(*ilo, *n) || *ihi > *n) { + *info = -5; + } else if (*m < 0) { + *info = -7; + } else if (*ldv < max(1, *n)) { + *info = -9; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGEBAK", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + if (*m == 0) { + return 0; + } + if (lsame_(job, (char *)"N", (ftnlen)1, (ftnlen)1)) { + return 0; + } + if (*ilo == *ihi) { + goto L30; + } + if (lsame_(job, (char *)"S", (ftnlen)1, (ftnlen)1) || lsame_(job, (char *)"B", (ftnlen)1, (ftnlen)1)) { + if (rightv) { + i__1 = *ihi; + for (i__ = *ilo; i__ <= i__1; ++i__) { + s = scale[i__]; + dscal_(m, &s, &v[i__ + v_dim1], ldv); + } + } + if (leftv) { + i__1 = *ihi; + for (i__ = *ilo; i__ <= i__1; ++i__) { + s = 1. / scale[i__]; + dscal_(m, &s, &v[i__ + v_dim1], ldv); + } + } + } +L30: + if (lsame_(job, (char *)"P", (ftnlen)1, (ftnlen)1) || lsame_(job, (char *)"B", (ftnlen)1, (ftnlen)1)) { + if (rightv) { + i__1 = *n; + for (ii = 1; ii <= i__1; ++ii) { + i__ = ii; + if (i__ >= *ilo && i__ <= *ihi) { + goto L40; + } + if (i__ < *ilo) { + i__ = *ilo - ii; + } + k = (integer)scale[i__]; + if (k == i__) { + goto L40; + } + dswap_(m, &v[i__ + v_dim1], ldv, &v[k + v_dim1], ldv); + L40:; + } + } + if (leftv) { + i__1 = *n; + for (ii = 1; ii <= i__1; ++ii) { + i__ = ii; + if (i__ >= *ilo && i__ <= *ihi) { + goto L50; + } + if (i__ < *ilo) { + i__ = *ilo - ii; + } + k = (integer)scale[i__]; + if (k == i__) { + goto L50; + } + dswap_(m, &v[i__ + v_dim1], ldv, &v[k + v_dim1], ldv); + L50:; + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dgebal.cpp b/lib/linalg/dgebal.cpp new file mode 100644 index 0000000000..c5301edcdd --- /dev/null +++ b/lib/linalg/dgebal.cpp @@ -0,0 +1,513 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c__0 = 0; +static integer c_n1 = -1; +int dgebal_(char *job, integer *n, doublereal *a, integer *lda, integer *ilo, integer *ihi, + doublereal *scale, integer *info, ftnlen job_len) +{ + integer a_dim1, a_offset, i__1, i__2; + doublereal d__1, d__2; + doublereal c__, f, g; + integer i__, j, k, l, m; + doublereal r__, s, ca, ra; + integer ica, ira, iexc; + extern doublereal dnrm2_(integer *, doublereal *, integer *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int dswap_(integer *, doublereal *, integer *, doublereal *, integer *); + doublereal sfmin1, sfmin2, sfmax1, sfmax2; + extern doublereal dlamch_(char *, ftnlen); + extern integer idamax_(integer *, doublereal *, integer *); + extern logical disnan_(doublereal *); + extern int xerbla_(char *, integer *, ftnlen); + logical noconv; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --scale; + *info = 0; + if (!lsame_(job, (char *)"N", (ftnlen)1, (ftnlen)1) && !lsame_(job, (char *)"P", (ftnlen)1, (ftnlen)1) && + !lsame_(job, (char *)"S", (ftnlen)1, (ftnlen)1) && !lsame_(job, (char *)"B", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGEBAL", &i__1, (ftnlen)6); + return 0; + } + k = 1; + l = *n; + if (*n == 0) { + goto L210; + } + if (lsame_(job, (char *)"N", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + scale[i__] = 1.; + } + goto L210; + } + if (lsame_(job, (char *)"S", (ftnlen)1, (ftnlen)1)) { + goto L120; + } + goto L50; +L20: + scale[m] = (doublereal)j; + if (j == m) { + goto L30; + } + dswap_(&l, &a[j * a_dim1 + 1], &c__1, &a[m * a_dim1 + 1], &c__1); + i__1 = *n - k + 1; + dswap_(&i__1, &a[j + k * a_dim1], lda, &a[m + k * a_dim1], lda); +L30: + switch (iexc) { + case 1: + goto L40; + case 2: + goto L80; + } +L40: + if (l == 1) { + goto L210; + } + --l; +L50: + for (j = l; j >= 1; --j) { + i__1 = l; + for (i__ = 1; i__ <= i__1; ++i__) { + if (i__ == j) { + goto L60; + } + if (a[j + i__ * a_dim1] != 0.) { + goto L70; + } + L60:; + } + m = l; + iexc = 1; + goto L20; + L70:; + } + goto L90; +L80: + ++k; +L90: + i__1 = l; + for (j = k; j <= i__1; ++j) { + i__2 = l; + for (i__ = k; i__ <= i__2; ++i__) { + if (i__ == j) { + goto L100; + } + if (a[i__ + j * a_dim1] != 0.) { + goto L110; + } + L100:; + } + m = k; + iexc = 2; + goto L20; + L110:; + } +L120: + i__1 = l; + for (i__ = k; i__ <= i__1; ++i__) { + scale[i__] = 1.; + } + if (lsame_(job, (char *)"P", (ftnlen)1, (ftnlen)1)) { + goto L210; + } + sfmin1 = dlamch_((char *)"S", (ftnlen)1) / dlamch_((char *)"P", (ftnlen)1); + sfmax1 = 1. / sfmin1; + sfmin2 = sfmin1 * 2.; + sfmax2 = 1. / sfmin2; +L140: + noconv = FALSE_; + i__1 = l; + for (i__ = k; i__ <= i__1; ++i__) { + i__2 = l - k + 1; + c__ = dnrm2_(&i__2, &a[k + i__ * a_dim1], &c__1); + i__2 = l - k + 1; + r__ = dnrm2_(&i__2, &a[i__ + k * a_dim1], lda); + ica = idamax_(&l, &a[i__ * a_dim1 + 1], &c__1); + ca = (d__1 = a[ica + i__ * a_dim1], abs(d__1)); + i__2 = *n - k + 1; + ira = idamax_(&i__2, &a[i__ + k * a_dim1], lda); + ra = (d__1 = a[i__ + (ira + k - 1) * a_dim1], abs(d__1)); + if (c__ == 0. || r__ == 0.) { + goto L200; + } + g = r__ / 2.; + f = 1.; + s = c__ + r__; + L160: + d__1 = max(f, c__); + d__2 = min(r__, g); + if (c__ >= g || max(d__1, ca) >= sfmax2 || min(d__2, ra) <= sfmin2) { + goto L170; + } + d__1 = c__ + f + ca + r__ + g + ra; + if (disnan_(&d__1)) { + *info = -3; + i__2 = -(*info); + xerbla_((char *)"DGEBAL", &i__2, (ftnlen)6); + return 0; + } + f *= 2.; + c__ *= 2.; + ca *= 2.; + r__ /= 2.; + g /= 2.; + ra /= 2.; + goto L160; + L170: + g = c__ / 2.; + L180: + d__1 = min(f, c__), d__1 = min(d__1, g); + if (g < r__ || max(r__, ra) >= sfmax2 || min(d__1, ca) <= sfmin2) { + goto L190; + } + f /= 2.; + c__ /= 2.; + g /= 2.; + ca /= 2.; + r__ *= 2.; + ra *= 2.; + goto L180; + L190: + if (c__ + r__ >= s * .95) { + goto L200; + } + if (f < 1. && scale[i__] < 1.) { + if (f * scale[i__] <= sfmin1) { + goto L200; + } + } + if (f > 1. && scale[i__] > 1.) { + if (scale[i__] >= sfmax1 / f) { + goto L200; + } + } + g = 1. / f; + scale[i__] *= f; + noconv = TRUE_; + i__2 = *n - k + 1; + dscal_(&i__2, &g, &a[i__ + k * a_dim1], lda); + dscal_(&l, &f, &a[i__ * a_dim1 + 1], &c__1); + L200:; + } + if (noconv) { + goto L140; + } +L210: + *ilo = k; + *ihi = l; + return 0; +} +int dgeev_(char *jobvl, char *jobvr, integer *n, doublereal *a, integer *lda, doublereal *wr, + doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, + doublereal *work, integer *lwork, integer *info, ftnlen jobvl_len, ftnlen jobvr_len) +{ + integer a_dim1, a_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, i__1, i__2, i__3; + doublereal d__1, d__2; + double sqrt(doublereal); + integer i__, k; + doublereal r__, cs, sn; + integer ihi; + doublereal scl; + integer ilo; + doublereal dum[1], eps; + integer lwork_trevc__, ibal; + char side[1]; + doublereal anrm; + integer ierr, itau; + extern int drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *); + integer iwrk, nout; + extern doublereal dnrm2_(integer *, doublereal *, integer *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern doublereal dlapy2_(doublereal *, doublereal *); + extern int dlabad_(doublereal *, doublereal *), + dgebak_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, integer *, integer *, ftnlen, ftnlen), + dgebal_(char *, integer *, doublereal *, integer *, integer *, integer *, doublereal *, + integer *, ftnlen); + logical scalea; + extern doublereal dlamch_(char *, ftnlen); + doublereal cscale; + extern doublereal dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + ftnlen); + extern int dgehrd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen); + extern integer idamax_(integer *, doublereal *, integer *); + extern int dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen), + dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), + xerbla_(char *, integer *, ftnlen); + logical select[1]; + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + doublereal bignum; + extern int dorghr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *), + dhseqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, + integer *, ftnlen, ftnlen); + integer minwrk, maxwrk; + logical wantvl; + doublereal smlnum; + integer hswork; + logical lquery, wantvr; + extern int dtrevc3_(char *, char *, logical *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --wr; + --wi; + vl_dim1 = *ldvl; + vl_offset = 1 + vl_dim1; + vl -= vl_offset; + vr_dim1 = *ldvr; + vr_offset = 1 + vr_dim1; + vr -= vr_offset; + --work; + *info = 0; + lquery = *lwork == -1; + wantvl = lsame_(jobvl, (char *)"V", (ftnlen)1, (ftnlen)1); + wantvr = lsame_(jobvr, (char *)"V", (ftnlen)1, (ftnlen)1); + if (!wantvl && !lsame_(jobvl, (char *)"N", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (!wantvr && !lsame_(jobvr, (char *)"N", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1, *n)) { + *info = -5; + } else if (*ldvl < 1 || wantvl && *ldvl < *n) { + *info = -9; + } else if (*ldvr < 1 || wantvr && *ldvr < *n) { + *info = -11; + } + if (*info == 0) { + if (*n == 0) { + minwrk = 1; + maxwrk = 1; + } else { + maxwrk = (*n << 1) + + *n * ilaenv_(&c__1, (char *)"DGEHRD", (char *)" ", n, &c__1, n, &c__0, (ftnlen)6, (ftnlen)1); + if (wantvl) { + minwrk = *n << 2; + i__1 = maxwrk, + i__2 = (*n << 1) + (*n - 1) * ilaenv_(&c__1, (char *)"DORGHR", (char *)" ", n, &c__1, n, &c_n1, + (ftnlen)6, (ftnlen)1); + maxwrk = max(i__1, i__2); + dhseqr_((char *)"S", (char *)"V", n, &c__1, n, &a[a_offset], lda, &wr[1], &wi[1], &vl[vl_offset], + ldvl, &work[1], &c_n1, info, (ftnlen)1, (ftnlen)1); + hswork = (integer)work[1]; + i__1 = maxwrk, i__2 = *n + 1, i__1 = max(i__1, i__2), i__2 = *n + hswork; + maxwrk = max(i__1, i__2); + dtrevc3_((char *)"L", (char *)"B", select, n, &a[a_offset], lda, &vl[vl_offset], ldvl, + &vr[vr_offset], ldvr, n, &nout, &work[1], &c_n1, &ierr, (ftnlen)1, + (ftnlen)1); + lwork_trevc__ = (integer)work[1]; + i__1 = maxwrk, i__2 = *n + lwork_trevc__; + maxwrk = max(i__1, i__2); + i__1 = maxwrk, i__2 = *n << 2; + maxwrk = max(i__1, i__2); + } else if (wantvr) { + minwrk = *n << 2; + i__1 = maxwrk, + i__2 = (*n << 1) + (*n - 1) * ilaenv_(&c__1, (char *)"DORGHR", (char *)" ", n, &c__1, n, &c_n1, + (ftnlen)6, (ftnlen)1); + maxwrk = max(i__1, i__2); + dhseqr_((char *)"S", (char *)"V", n, &c__1, n, &a[a_offset], lda, &wr[1], &wi[1], &vr[vr_offset], + ldvr, &work[1], &c_n1, info, (ftnlen)1, (ftnlen)1); + hswork = (integer)work[1]; + i__1 = maxwrk, i__2 = *n + 1, i__1 = max(i__1, i__2), i__2 = *n + hswork; + maxwrk = max(i__1, i__2); + dtrevc3_((char *)"R", (char *)"B", select, n, &a[a_offset], lda, &vl[vl_offset], ldvl, + &vr[vr_offset], ldvr, n, &nout, &work[1], &c_n1, &ierr, (ftnlen)1, + (ftnlen)1); + lwork_trevc__ = (integer)work[1]; + i__1 = maxwrk, i__2 = *n + lwork_trevc__; + maxwrk = max(i__1, i__2); + i__1 = maxwrk, i__2 = *n << 2; + maxwrk = max(i__1, i__2); + } else { + minwrk = *n * 3; + dhseqr_((char *)"E", (char *)"N", n, &c__1, n, &a[a_offset], lda, &wr[1], &wi[1], &vr[vr_offset], + ldvr, &work[1], &c_n1, info, (ftnlen)1, (ftnlen)1); + hswork = (integer)work[1]; + i__1 = maxwrk, i__2 = *n + 1, i__1 = max(i__1, i__2), i__2 = *n + hswork; + maxwrk = max(i__1, i__2); + } + maxwrk = max(maxwrk, minwrk); + } + work[1] = (doublereal)maxwrk; + if (*lwork < minwrk && !lquery) { + *info = -13; + } + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGEEV ", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + if (*n == 0) { + return 0; + } + eps = dlamch_((char *)"P", (ftnlen)1); + smlnum = dlamch_((char *)"S", (ftnlen)1); + bignum = 1. / smlnum; + dlabad_(&smlnum, &bignum); + smlnum = sqrt(smlnum) / eps; + bignum = 1. / smlnum; + anrm = dlange_((char *)"M", n, n, &a[a_offset], lda, dum, (ftnlen)1); + scalea = FALSE_; + if (anrm > 0. && anrm < smlnum) { + scalea = TRUE_; + cscale = smlnum; + } else if (anrm > bignum) { + scalea = TRUE_; + cscale = bignum; + } + if (scalea) { + dlascl_((char *)"G", &c__0, &c__0, &anrm, &cscale, n, n, &a[a_offset], lda, &ierr, (ftnlen)1); + } + ibal = 1; + dgebal_((char *)"B", n, &a[a_offset], lda, &ilo, &ihi, &work[ibal], &ierr, (ftnlen)1); + itau = ibal + *n; + iwrk = itau + *n; + i__1 = *lwork - iwrk + 1; + dgehrd_(n, &ilo, &ihi, &a[a_offset], lda, &work[itau], &work[iwrk], &i__1, &ierr); + if (wantvl) { + *(unsigned char *)side = 'L'; + dlacpy_((char *)"L", n, n, &a[a_offset], lda, &vl[vl_offset], ldvl, (ftnlen)1); + i__1 = *lwork - iwrk + 1; + dorghr_(n, &ilo, &ihi, &vl[vl_offset], ldvl, &work[itau], &work[iwrk], &i__1, &ierr); + iwrk = itau; + i__1 = *lwork - iwrk + 1; + dhseqr_((char *)"S", (char *)"V", n, &ilo, &ihi, &a[a_offset], lda, &wr[1], &wi[1], &vl[vl_offset], ldvl, + &work[iwrk], &i__1, info, (ftnlen)1, (ftnlen)1); + if (wantvr) { + *(unsigned char *)side = 'B'; + dlacpy_((char *)"F", n, n, &vl[vl_offset], ldvl, &vr[vr_offset], ldvr, (ftnlen)1); + } + } else if (wantvr) { + *(unsigned char *)side = 'R'; + dlacpy_((char *)"L", n, n, &a[a_offset], lda, &vr[vr_offset], ldvr, (ftnlen)1); + i__1 = *lwork - iwrk + 1; + dorghr_(n, &ilo, &ihi, &vr[vr_offset], ldvr, &work[itau], &work[iwrk], &i__1, &ierr); + iwrk = itau; + i__1 = *lwork - iwrk + 1; + dhseqr_((char *)"S", (char *)"V", n, &ilo, &ihi, &a[a_offset], lda, &wr[1], &wi[1], &vr[vr_offset], ldvr, + &work[iwrk], &i__1, info, (ftnlen)1, (ftnlen)1); + } else { + iwrk = itau; + i__1 = *lwork - iwrk + 1; + dhseqr_((char *)"E", (char *)"N", n, &ilo, &ihi, &a[a_offset], lda, &wr[1], &wi[1], &vr[vr_offset], ldvr, + &work[iwrk], &i__1, info, (ftnlen)1, (ftnlen)1); + } + if (*info != 0) { + goto L50; + } + if (wantvl || wantvr) { + i__1 = *lwork - iwrk + 1; + dtrevc3_(side, (char *)"B", select, n, &a[a_offset], lda, &vl[vl_offset], ldvl, &vr[vr_offset], + ldvr, n, &nout, &work[iwrk], &i__1, &ierr, (ftnlen)1, (ftnlen)1); + } + if (wantvl) { + dgebak_((char *)"B", (char *)"L", n, &ilo, &ihi, &work[ibal], n, &vl[vl_offset], ldvl, &ierr, (ftnlen)1, + (ftnlen)1); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + if (wi[i__] == 0.) { + scl = 1. / dnrm2_(n, &vl[i__ * vl_dim1 + 1], &c__1); + dscal_(n, &scl, &vl[i__ * vl_dim1 + 1], &c__1); + } else if (wi[i__] > 0.) { + d__1 = dnrm2_(n, &vl[i__ * vl_dim1 + 1], &c__1); + d__2 = dnrm2_(n, &vl[(i__ + 1) * vl_dim1 + 1], &c__1); + scl = 1. / dlapy2_(&d__1, &d__2); + dscal_(n, &scl, &vl[i__ * vl_dim1 + 1], &c__1); + dscal_(n, &scl, &vl[(i__ + 1) * vl_dim1 + 1], &c__1); + i__2 = *n; + for (k = 1; k <= i__2; ++k) { + d__1 = vl[k + i__ * vl_dim1]; + d__2 = vl[k + (i__ + 1) * vl_dim1]; + work[iwrk + k - 1] = d__1 * d__1 + d__2 * d__2; + } + k = idamax_(n, &work[iwrk], &c__1); + dlartg_(&vl[k + i__ * vl_dim1], &vl[k + (i__ + 1) * vl_dim1], &cs, &sn, &r__); + drot_(n, &vl[i__ * vl_dim1 + 1], &c__1, &vl[(i__ + 1) * vl_dim1 + 1], &c__1, &cs, + &sn); + vl[k + (i__ + 1) * vl_dim1] = 0.; + } + } + } + if (wantvr) { + dgebak_((char *)"B", (char *)"R", n, &ilo, &ihi, &work[ibal], n, &vr[vr_offset], ldvr, &ierr, (ftnlen)1, + (ftnlen)1); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + if (wi[i__] == 0.) { + scl = 1. / dnrm2_(n, &vr[i__ * vr_dim1 + 1], &c__1); + dscal_(n, &scl, &vr[i__ * vr_dim1 + 1], &c__1); + } else if (wi[i__] > 0.) { + d__1 = dnrm2_(n, &vr[i__ * vr_dim1 + 1], &c__1); + d__2 = dnrm2_(n, &vr[(i__ + 1) * vr_dim1 + 1], &c__1); + scl = 1. / dlapy2_(&d__1, &d__2); + dscal_(n, &scl, &vr[i__ * vr_dim1 + 1], &c__1); + dscal_(n, &scl, &vr[(i__ + 1) * vr_dim1 + 1], &c__1); + i__2 = *n; + for (k = 1; k <= i__2; ++k) { + d__1 = vr[k + i__ * vr_dim1]; + d__2 = vr[k + (i__ + 1) * vr_dim1]; + work[iwrk + k - 1] = d__1 * d__1 + d__2 * d__2; + } + k = idamax_(n, &work[iwrk], &c__1); + dlartg_(&vr[k + i__ * vr_dim1], &vr[k + (i__ + 1) * vr_dim1], &cs, &sn, &r__); + drot_(n, &vr[i__ * vr_dim1 + 1], &c__1, &vr[(i__ + 1) * vr_dim1 + 1], &c__1, &cs, + &sn); + vr[k + (i__ + 1) * vr_dim1] = 0.; + } + } + } +L50: + if (scalea) { + i__1 = *n - *info; + i__3 = *n - *info; + i__2 = max(i__3, 1); + dlascl_((char *)"G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wr[*info + 1], &i__2, &ierr, + (ftnlen)1); + i__1 = *n - *info; + i__3 = *n - *info; + i__2 = max(i__3, 1); + dlascl_((char *)"G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wi[*info + 1], &i__2, &ierr, + (ftnlen)1); + if (*info > 0) { + i__1 = ilo - 1; + dlascl_((char *)"G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wr[1], n, &ierr, (ftnlen)1); + i__1 = ilo - 1; + dlascl_((char *)"G", &c__0, &c__0, &cscale, &anrm, &i__1, &c__1, &wi[1], n, &ierr, (ftnlen)1); + } + } + work[1] = (doublereal)maxwrk; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dgehd2.cpp b/lib/linalg/dgehd2.cpp new file mode 100644 index 0000000000..9eaa873bd3 --- /dev/null +++ b/lib/linalg/dgehd2.cpp @@ -0,0 +1,57 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +int dgehd2_(integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal *tau, + doublereal *work, integer *info) +{ + integer a_dim1, a_offset, i__1, i__2, i__3; + integer i__; + doublereal aii; + extern int dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, ftnlen), + dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), + xerbla_(char *, integer *, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + *info = 0; + if (*n < 0) { + *info = -1; + } else if (*ilo < 1 || *ilo > max(1, *n)) { + *info = -2; + } else if (*ihi < min(*ilo, *n) || *ihi > *n) { + *info = -3; + } else if (*lda < max(1, *n)) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGEHD2", &i__1, (ftnlen)6); + return 0; + } + i__1 = *ihi - 1; + for (i__ = *ilo; i__ <= i__1; ++i__) { + i__2 = *ihi - i__; + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3, *n) + i__ * a_dim1], &c__1, + &tau[i__]); + aii = a[i__ + 1 + i__ * a_dim1]; + a[i__ + 1 + i__ * a_dim1] = 1.; + i__2 = *ihi - i__; + dlarf_((char *)"Right", ihi, &i__2, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[i__], + &a[(i__ + 1) * a_dim1 + 1], lda, &work[1], (ftnlen)5); + i__2 = *ihi - i__; + i__3 = *n - i__; + dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[i__], + &a[i__ + 1 + (i__ + 1) * a_dim1], lda, &work[1], (ftnlen)4); + a[i__ + 1 + i__ * a_dim1] = aii; + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dgehrd.cpp b/lib/linalg/dgehrd.cpp new file mode 100644 index 0000000000..eb152b90ed --- /dev/null +++ b/lib/linalg/dgehrd.cpp @@ -0,0 +1,144 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__3 = 3; +static integer c__2 = 2; +static integer c__65 = 65; +static doublereal c_b25 = -1.; +static doublereal c_b26 = 1.; +int dgehrd_(integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal *tau, + doublereal *work, integer *lwork, integer *info) +{ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + integer i__, j, ib; + doublereal ei; + integer nb, nh, nx, iwt; + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); + integer nbmin, iinfo; + extern int dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), + dgehd2_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *), + dlahr2_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *), + dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + integer ldwork, lwkopt; + logical lquery; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + *info = 0; + lquery = *lwork == -1; + if (*n < 0) { + *info = -1; + } else if (*ilo < 1 || *ilo > max(1, *n)) { + *info = -2; + } else if (*ihi < min(*ilo, *n) || *ihi > *n) { + *info = -3; + } else if (*lda < max(1, *n)) { + *info = -5; + } else if (*lwork < max(1, *n) && !lquery) { + *info = -8; + } + if (*info == 0) { + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DGEHRD", (char *)" ", n, ilo, ihi, &c_n1, (ftnlen)6, (ftnlen)1); + nb = min(i__1, i__2); + lwkopt = *n * nb + 4160; + work[1] = (doublereal)lwkopt; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGEHRD", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + i__1 = *ilo - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + tau[i__] = 0.; + } + i__1 = *n - 1; + for (i__ = max(1, *ihi); i__ <= i__1; ++i__) { + tau[i__] = 0.; + } + nh = *ihi - *ilo + 1; + if (nh <= 1) { + work[1] = 1.; + return 0; + } + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DGEHRD", (char *)" ", n, ilo, ihi, &c_n1, (ftnlen)6, (ftnlen)1); + nb = min(i__1, i__2); + nbmin = 2; + if (nb > 1 && nb < nh) { + i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"DGEHRD", (char *)" ", n, ilo, ihi, &c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1, i__2); + if (nx < nh) { + if (*lwork < *n * nb + 4160) { + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"DGEHRD", (char *)" ", n, ilo, ihi, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); + if (*lwork >= *n * nbmin + 4160) { + nb = (*lwork - 4160) / *n; + } else { + nb = 1; + } + } + } + } + ldwork = *n; + if (nb < nbmin || nb >= nh) { + i__ = *ilo; + } else { + iwt = *n * nb + 1; + i__1 = *ihi - 1 - nx; + i__2 = nb; + for (i__ = *ilo; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__3 = nb, i__4 = *ihi - i__; + ib = min(i__3, i__4); + dlahr2_(ihi, &i__, &ib, &a[i__ * a_dim1 + 1], lda, &tau[i__], &work[iwt], &c__65, + &work[1], &ldwork); + ei = a[i__ + ib + (i__ + ib - 1) * a_dim1]; + a[i__ + ib + (i__ + ib - 1) * a_dim1] = 1.; + i__3 = *ihi - i__ - ib + 1; + dgemm_((char *)"No transpose", (char *)"Transpose", ihi, &i__3, &ib, &c_b25, &work[1], &ldwork, + &a[i__ + ib + i__ * a_dim1], lda, &c_b26, &a[(i__ + ib) * a_dim1 + 1], lda, + (ftnlen)12, (ftnlen)9); + a[i__ + ib + (i__ + ib - 1) * a_dim1] = ei; + i__3 = ib - 1; + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", &i__, &i__3, &c_b26, + &a[i__ + 1 + i__ * a_dim1], lda, &work[1], &ldwork, (ftnlen)5, (ftnlen)5, + (ftnlen)9, (ftnlen)4); + i__3 = ib - 2; + for (j = 0; j <= i__3; ++j) { + daxpy_(&i__, &c_b25, &work[ldwork * j + 1], &c__1, &a[(i__ + j + 1) * a_dim1 + 1], + &c__1); + } + i__3 = *ihi - i__; + i__4 = *n - i__ - ib + 1; + dlarfb_((char *)"Left", (char *)"Transpose", (char *)"Forward", (char *)"Columnwise", &i__3, &i__4, &ib, + &a[i__ + 1 + i__ * a_dim1], lda, &work[iwt], &c__65, + &a[i__ + 1 + (i__ + ib) * a_dim1], lda, &work[1], &ldwork, (ftnlen)4, (ftnlen)9, + (ftnlen)7, (ftnlen)10); + } + } + dgehd2_(n, &i__, ihi, &a[a_offset], lda, &tau[1], &work[1], &iinfo); + work[1] = (doublereal)lwkopt; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dgesdd.cpp b/lib/linalg/dgesdd.cpp new file mode 100644 index 0000000000..59dbee7210 --- /dev/null +++ b/lib/linalg/dgesdd.cpp @@ -0,0 +1,788 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c_n1 = -1; +static integer c__0 = 0; +static doublereal c_b63 = 0.; +static integer c__1 = 1; +static doublereal c_b84 = 1.; +int dgesdd_(char *jobz, integer *m, integer *n, doublereal *a, integer *lda, doublereal *s, + doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, doublereal *work, + integer *lwork, integer *iwork, integer *info, ftnlen jobz_len) +{ + integer a_dim1, a_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, i__2, i__3; + double sqrt(doublereal); + integer lwork_dorglq_mn__, lwork_dorglq_nn__, lwork_dorgqr_mm__, lwork_dorgqr_mn__, i__, ie, + lwork_dorgbr_p_mm__, il, lwork_dorgbr_q_nn__, ir, iu, blk; + doublereal dum[1], eps; + integer ivt, iscl; + doublereal anrm; + integer idum[1], ierr, itau, lwork_dormbr_qln_mm__, lwork_dormbr_qln_mn__, + lwork_dormbr_qln_nn__, lwork_dormbr_prt_mm__, lwork_dormbr_prt_mn__, lwork_dormbr_prt_nn__; + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer chunk, minmn, wrkbl, itaup, itauq, mnthr; + logical wntqa; + integer nwork; + logical wntqn, wntqo, wntqs; + extern int dbdsdc_(char *, char *, integer *, doublereal *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, integer *, ftnlen, ftnlen), + dgebrd_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, integer *); + extern doublereal dlamch_(char *, ftnlen), + dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *, ftnlen); + integer bdspac; + extern int dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen), + dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, integer *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen), + dorgbr_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *, ftnlen); + doublereal bignum; + extern int dormbr_(char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, + integer *, ftnlen, ftnlen, ftnlen), + dorglq_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *), + dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *); + integer ldwrkl, ldwrkr, minwrk, ldwrku, maxwrk, ldwkvt; + doublereal smlnum; + logical wntqas, lquery; + integer lwork_dgebrd_mm__, lwork_dgebrd_mn__, lwork_dgebrd_nn__, lwork_dgelqf_mn__, + lwork_dgeqrf_mn__; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --s; + u_dim1 = *ldu; + u_offset = 1 + u_dim1; + u -= u_offset; + vt_dim1 = *ldvt; + vt_offset = 1 + vt_dim1; + vt -= vt_offset; + --work; + --iwork; + *info = 0; + minmn = min(*m, *n); + wntqa = lsame_(jobz, (char *)"A", (ftnlen)1, (ftnlen)1); + wntqs = lsame_(jobz, (char *)"S", (ftnlen)1, (ftnlen)1); + wntqas = wntqa || wntqs; + wntqo = lsame_(jobz, (char *)"O", (ftnlen)1, (ftnlen)1); + wntqn = lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + if (!(wntqa || wntqs || wntqo || wntqn)) { + *info = -1; + } else if (*m < 0) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1, *m)) { + *info = -5; + } else if (*ldu < 1 || wntqas && *ldu < *m || wntqo && *m < *n && *ldu < *m) { + *info = -8; + } else if (*ldvt < 1 || wntqa && *ldvt < *n || wntqs && *ldvt < minmn || + wntqo && *m >= *n && *ldvt < *n) { + *info = -10; + } + if (*info == 0) { + minwrk = 1; + maxwrk = 1; + bdspac = 0; + mnthr = (integer)(minmn * 11. / 6.); + if (*m >= *n && minmn > 0) { + if (wntqn) { + bdspac = *n * 7; + } else { + bdspac = *n * 3 * *n + (*n << 2); + } + dgebrd_(m, n, dum, m, dum, dum, dum, dum, dum, &c_n1, &ierr); + lwork_dgebrd_mn__ = (integer)dum[0]; + dgebrd_(n, n, dum, n, dum, dum, dum, dum, dum, &c_n1, &ierr); + lwork_dgebrd_nn__ = (integer)dum[0]; + dgeqrf_(m, n, dum, m, dum, dum, &c_n1, &ierr); + lwork_dgeqrf_mn__ = (integer)dum[0]; + dorgbr_((char *)"Q", n, n, n, dum, n, dum, dum, &c_n1, &ierr, (ftnlen)1); + lwork_dorgbr_q_nn__ = (integer)dum[0]; + dorgqr_(m, m, n, dum, m, dum, dum, &c_n1, &ierr); + lwork_dorgqr_mm__ = (integer)dum[0]; + dorgqr_(m, n, n, dum, m, dum, dum, &c_n1, &ierr); + lwork_dorgqr_mn__ = (integer)dum[0]; + dormbr_((char *)"P", (char *)"R", (char *)"T", n, n, n, dum, n, dum, dum, n, dum, &c_n1, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); + lwork_dormbr_prt_nn__ = (integer)dum[0]; + dormbr_((char *)"Q", (char *)"L", (char *)"N", n, n, n, dum, n, dum, dum, n, dum, &c_n1, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); + lwork_dormbr_qln_nn__ = (integer)dum[0]; + dormbr_((char *)"Q", (char *)"L", (char *)"N", m, n, n, dum, m, dum, dum, m, dum, &c_n1, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); + lwork_dormbr_qln_mn__ = (integer)dum[0]; + dormbr_((char *)"Q", (char *)"L", (char *)"N", m, m, n, dum, m, dum, dum, m, dum, &c_n1, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); + lwork_dormbr_qln_mm__ = (integer)dum[0]; + if (*m >= mnthr) { + if (wntqn) { + wrkbl = *n + lwork_dgeqrf_mn__; + i__1 = wrkbl, i__2 = *n * 3 + lwork_dgebrd_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = bdspac + *n; + maxwrk = max(i__1, i__2); + minwrk = bdspac + *n; + } else if (wntqo) { + wrkbl = *n + lwork_dgeqrf_mn__; + i__1 = wrkbl, i__2 = *n + lwork_dorgqr_mn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + lwork_dgebrd_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + lwork_dormbr_qln_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + lwork_dormbr_prt_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + bdspac; + wrkbl = max(i__1, i__2); + maxwrk = wrkbl + (*n << 1) * *n; + minwrk = bdspac + (*n << 1) * *n + *n * 3; + } else if (wntqs) { + wrkbl = *n + lwork_dgeqrf_mn__; + i__1 = wrkbl, i__2 = *n + lwork_dorgqr_mn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + lwork_dgebrd_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + lwork_dormbr_qln_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + lwork_dormbr_prt_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + bdspac; + wrkbl = max(i__1, i__2); + maxwrk = wrkbl + *n * *n; + minwrk = bdspac + *n * *n + *n * 3; + } else if (wntqa) { + wrkbl = *n + lwork_dgeqrf_mn__; + i__1 = wrkbl, i__2 = *n + lwork_dorgqr_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + lwork_dgebrd_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + lwork_dormbr_qln_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + lwork_dormbr_prt_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + bdspac; + wrkbl = max(i__1, i__2); + maxwrk = wrkbl + *n * *n; + i__1 = *n * 3 + bdspac, i__2 = *n + *m; + minwrk = *n * *n + max(i__1, i__2); + } + } else { + wrkbl = *n * 3 + lwork_dgebrd_mn__; + if (wntqn) { + i__1 = wrkbl, i__2 = *n * 3 + bdspac; + maxwrk = max(i__1, i__2); + minwrk = *n * 3 + max(*m, bdspac); + } else if (wntqo) { + i__1 = wrkbl, i__2 = *n * 3 + lwork_dormbr_prt_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + lwork_dormbr_qln_mn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + bdspac; + wrkbl = max(i__1, i__2); + maxwrk = wrkbl + *m * *n; + i__1 = *m, i__2 = *n * *n + bdspac; + minwrk = *n * 3 + max(i__1, i__2); + } else if (wntqs) { + i__1 = wrkbl, i__2 = *n * 3 + lwork_dormbr_qln_mn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + lwork_dormbr_prt_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + bdspac; + maxwrk = max(i__1, i__2); + minwrk = *n * 3 + max(*m, bdspac); + } else if (wntqa) { + i__1 = wrkbl, i__2 = *n * 3 + lwork_dormbr_qln_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + lwork_dormbr_prt_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *n * 3 + bdspac; + maxwrk = max(i__1, i__2); + minwrk = *n * 3 + max(*m, bdspac); + } + } + } else if (minmn > 0) { + if (wntqn) { + bdspac = *m * 7; + } else { + bdspac = *m * 3 * *m + (*m << 2); + } + dgebrd_(m, n, dum, m, dum, dum, dum, dum, dum, &c_n1, &ierr); + lwork_dgebrd_mn__ = (integer)dum[0]; + dgebrd_(m, m, &a[a_offset], m, &s[1], dum, dum, dum, dum, &c_n1, &ierr); + lwork_dgebrd_mm__ = (integer)dum[0]; + dgelqf_(m, n, &a[a_offset], m, dum, dum, &c_n1, &ierr); + lwork_dgelqf_mn__ = (integer)dum[0]; + dorglq_(n, n, m, dum, n, dum, dum, &c_n1, &ierr); + lwork_dorglq_nn__ = (integer)dum[0]; + dorglq_(m, n, m, &a[a_offset], m, dum, dum, &c_n1, &ierr); + lwork_dorglq_mn__ = (integer)dum[0]; + dorgbr_((char *)"P", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, (ftnlen)1); + lwork_dorgbr_p_mm__ = (integer)dum[0]; + dormbr_((char *)"P", (char *)"R", (char *)"T", m, m, m, dum, m, dum, dum, m, dum, &c_n1, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); + lwork_dormbr_prt_mm__ = (integer)dum[0]; + dormbr_((char *)"P", (char *)"R", (char *)"T", m, n, m, dum, m, dum, dum, m, dum, &c_n1, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); + lwork_dormbr_prt_mn__ = (integer)dum[0]; + dormbr_((char *)"P", (char *)"R", (char *)"T", n, n, m, dum, n, dum, dum, n, dum, &c_n1, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); + lwork_dormbr_prt_nn__ = (integer)dum[0]; + dormbr_((char *)"Q", (char *)"L", (char *)"N", m, m, m, dum, m, dum, dum, m, dum, &c_n1, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); + lwork_dormbr_qln_mm__ = (integer)dum[0]; + if (*n >= mnthr) { + if (wntqn) { + wrkbl = *m + lwork_dgelqf_mn__; + i__1 = wrkbl, i__2 = *m * 3 + lwork_dgebrd_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = bdspac + *m; + maxwrk = max(i__1, i__2); + minwrk = bdspac + *m; + } else if (wntqo) { + wrkbl = *m + lwork_dgelqf_mn__; + i__1 = wrkbl, i__2 = *m + lwork_dorglq_mn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + lwork_dgebrd_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + lwork_dormbr_qln_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + lwork_dormbr_prt_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + bdspac; + wrkbl = max(i__1, i__2); + maxwrk = wrkbl + (*m << 1) * *m; + minwrk = bdspac + (*m << 1) * *m + *m * 3; + } else if (wntqs) { + wrkbl = *m + lwork_dgelqf_mn__; + i__1 = wrkbl, i__2 = *m + lwork_dorglq_mn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + lwork_dgebrd_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + lwork_dormbr_qln_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + lwork_dormbr_prt_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + bdspac; + wrkbl = max(i__1, i__2); + maxwrk = wrkbl + *m * *m; + minwrk = bdspac + *m * *m + *m * 3; + } else if (wntqa) { + wrkbl = *m + lwork_dgelqf_mn__; + i__1 = wrkbl, i__2 = *m + lwork_dorglq_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + lwork_dgebrd_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + lwork_dormbr_qln_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + lwork_dormbr_prt_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + bdspac; + wrkbl = max(i__1, i__2); + maxwrk = wrkbl + *m * *m; + i__1 = *m * 3 + bdspac, i__2 = *m + *n; + minwrk = *m * *m + max(i__1, i__2); + } + } else { + wrkbl = *m * 3 + lwork_dgebrd_mn__; + if (wntqn) { + i__1 = wrkbl, i__2 = *m * 3 + bdspac; + maxwrk = max(i__1, i__2); + minwrk = *m * 3 + max(*n, bdspac); + } else if (wntqo) { + i__1 = wrkbl, i__2 = *m * 3 + lwork_dormbr_qln_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + lwork_dormbr_prt_mn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + bdspac; + wrkbl = max(i__1, i__2); + maxwrk = wrkbl + *m * *n; + i__1 = *n, i__2 = *m * *m + bdspac; + minwrk = *m * 3 + max(i__1, i__2); + } else if (wntqs) { + i__1 = wrkbl, i__2 = *m * 3 + lwork_dormbr_qln_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + lwork_dormbr_prt_mn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + bdspac; + maxwrk = max(i__1, i__2); + minwrk = *m * 3 + max(*n, bdspac); + } else if (wntqa) { + i__1 = wrkbl, i__2 = *m * 3 + lwork_dormbr_qln_mm__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + lwork_dormbr_prt_nn__; + wrkbl = max(i__1, i__2); + i__1 = wrkbl, i__2 = *m * 3 + bdspac; + maxwrk = max(i__1, i__2); + minwrk = *m * 3 + max(*n, bdspac); + } + } + } + maxwrk = max(maxwrk, minwrk); + work[1] = (doublereal)maxwrk; + if (*lwork < minwrk && !lquery) { + *info = -12; + } + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGESDD", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + if (*m == 0 || *n == 0) { + return 0; + } + eps = dlamch_((char *)"P", (ftnlen)1); + smlnum = sqrt(dlamch_((char *)"S", (ftnlen)1)) / eps; + bignum = 1. / smlnum; + anrm = dlange_((char *)"M", m, n, &a[a_offset], lda, dum, (ftnlen)1); + iscl = 0; + if (anrm > 0. && anrm < smlnum) { + iscl = 1; + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, &ierr, (ftnlen)1); + } else if (anrm > bignum) { + iscl = 1; + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, &ierr, (ftnlen)1); + } + if (*m >= *n) { + if (*m >= mnthr) { + if (wntqn) { + itau = 1; + nwork = itau + *n; + i__1 = *lwork - nwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, &ierr); + i__1 = *n - 1; + i__2 = *n - 1; + dlaset_((char *)"L", &i__1, &i__2, &c_b63, &c_b63, &a[a_dim1 + 2], lda, (ftnlen)1); + ie = 1; + itauq = ie + *n; + itaup = itauq + *n; + nwork = itaup + *n; + i__1 = *lwork - nwork + 1; + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__1, &ierr); + nwork = ie + *n; + dbdsdc_((char *)"U", (char *)"N", n, &s[1], &work[ie], dum, &c__1, dum, &c__1, dum, idum, + &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + } else if (wntqo) { + ir = 1; + if (*lwork >= *lda * *n + *n * *n + *n * 3 + bdspac) { + ldwrkr = *lda; + } else { + ldwrkr = (*lwork - *n * *n - *n * 3 - bdspac) / *n; + } + itau = ir + ldwrkr * *n; + nwork = itau + *n; + i__1 = *lwork - nwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, &ierr); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr, (ftnlen)1); + i__1 = *n - 1; + i__2 = *n - 1; + dlaset_((char *)"L", &i__1, &i__2, &c_b63, &c_b63, &work[ir + 1], &ldwrkr, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + nwork = itaup + *n; + i__1 = *lwork - nwork + 1; + dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__1, &ierr); + iu = nwork; + nwork = iu + *n * *n; + dbdsdc_((char *)"U", (char *)"I", n, &s[1], &work[ie], &work[iu], n, &vt[vt_offset], ldvt, dum, + idum, &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"N", n, n, n, &work[ir], &ldwrkr, &work[itauq], &work[iu], n, + &work[nwork], &i__1, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"R", (char *)"T", n, n, n, &work[ir], &ldwrkr, &work[itaup], &vt[vt_offset], + ldvt, &work[nwork], &i__1, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__1 = *m; + i__2 = ldwrkr; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__3 = *m - i__ + 1; + chunk = min(i__3, ldwrkr); + dgemm_((char *)"N", (char *)"N", &chunk, n, n, &c_b84, &a[i__ + a_dim1], lda, &work[iu], n, + &c_b63, &work[ir], &ldwrkr, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", &chunk, n, &work[ir], &ldwrkr, &a[i__ + a_dim1], lda, (ftnlen)1); + } + } else if (wntqs) { + ir = 1; + ldwrkr = *n; + itau = ir + ldwrkr * *n; + nwork = itau + *n; + i__2 = *lwork - nwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__2, &ierr); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr, (ftnlen)1); + i__2 = *n - 1; + i__1 = *n - 1; + dlaset_((char *)"L", &i__2, &i__1, &c_b63, &c_b63, &work[ir + 1], &ldwrkr, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + nwork = itaup + *n; + i__2 = *lwork - nwork + 1; + dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__2, &ierr); + dbdsdc_((char *)"U", (char *)"I", n, &s[1], &work[ie], &u[u_offset], ldu, &vt[vt_offset], ldvt, dum, + idum, &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"N", n, n, n, &work[ir], &ldwrkr, &work[itauq], &u[u_offset], ldu, + &work[nwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"R", (char *)"T", n, n, n, &work[ir], &ldwrkr, &work[itaup], &vt[vt_offset], + ldvt, &work[nwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", n, n, &u[u_offset], ldu, &work[ir], &ldwrkr, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b84, &a[a_offset], lda, &work[ir], &ldwrkr, &c_b63, + &u[u_offset], ldu, (ftnlen)1, (ftnlen)1); + } else if (wntqa) { + iu = 1; + ldwrku = *n; + itau = iu + ldwrku * *n; + nwork = itau + *n; + i__2 = *lwork - nwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &work[nwork], &i__2, &ierr); + i__2 = *n - 1; + i__1 = *n - 1; + dlaset_((char *)"L", &i__2, &i__1, &c_b63, &c_b63, &a[a_dim1 + 2], lda, (ftnlen)1); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + nwork = itaup + *n; + i__2 = *lwork - nwork + 1; + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__2, &ierr); + dbdsdc_((char *)"U", (char *)"I", n, &s[1], &work[ie], &work[iu], n, &vt[vt_offset], ldvt, dum, + idum, &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"N", n, n, n, &a[a_offset], lda, &work[itauq], &work[iu], &ldwrku, + &work[nwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"R", (char *)"T", n, n, n, &a[a_offset], lda, &work[itaup], &vt[vt_offset], + ldvt, &work[nwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b84, &u[u_offset], ldu, &work[iu], &ldwrku, &c_b63, + &a[a_offset], lda, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); + } + } else { + ie = 1; + itauq = ie + *n; + itaup = itauq + *n; + nwork = itaup + *n; + i__2 = *lwork - nwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__2, &ierr); + if (wntqn) { + dbdsdc_((char *)"U", (char *)"N", n, &s[1], &work[ie], dum, &c__1, dum, &c__1, dum, idum, + &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + } else if (wntqo) { + iu = nwork; + if (*lwork >= *m * *n + *n * 3 + bdspac) { + ldwrku = *m; + nwork = iu + ldwrku * *n; + dlaset_((char *)"F", m, n, &c_b63, &c_b63, &work[iu], &ldwrku, (ftnlen)1); + ir = -1; + } else { + ldwrku = *n; + nwork = iu + ldwrku * *n; + ir = nwork; + ldwrkr = (*lwork - *n * *n - *n * 3) / *n; + } + nwork = iu + ldwrku * *n; + dbdsdc_((char *)"U", (char *)"I", n, &s[1], &work[ie], &work[iu], &ldwrku, &vt[vt_offset], ldvt, + dum, idum, &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"R", (char *)"T", n, n, n, &a[a_offset], lda, &work[itaup], &vt[vt_offset], + ldvt, &work[nwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + if (*lwork >= *m * *n + *n * 3 + bdspac) { + i__2 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"N", m, n, n, &a[a_offset], lda, &work[itauq], &work[iu], + &ldwrku, &work[nwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, n, &work[iu], &ldwrku, &a[a_offset], lda, (ftnlen)1); + } else { + i__2 = *lwork - nwork + 1; + dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, &work[itauq], &work[nwork], &i__2, + &ierr, (ftnlen)1); + i__2 = *m; + i__1 = ldwrkr; + for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { + i__3 = *m - i__ + 1; + chunk = min(i__3, ldwrkr); + dgemm_((char *)"N", (char *)"N", &chunk, n, n, &c_b84, &a[i__ + a_dim1], lda, &work[iu], + &ldwrku, &c_b63, &work[ir], &ldwrkr, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", &chunk, n, &work[ir], &ldwrkr, &a[i__ + a_dim1], lda, + (ftnlen)1); + } + } + } else if (wntqs) { + dlaset_((char *)"F", m, n, &c_b63, &c_b63, &u[u_offset], ldu, (ftnlen)1); + dbdsdc_((char *)"U", (char *)"I", n, &s[1], &work[ie], &u[u_offset], ldu, &vt[vt_offset], ldvt, dum, + idum, &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"N", m, n, n, &a[a_offset], lda, &work[itauq], &u[u_offset], ldu, + &work[nwork], &i__1, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"R", (char *)"T", n, n, n, &a[a_offset], lda, &work[itaup], &vt[vt_offset], + ldvt, &work[nwork], &i__1, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } else if (wntqa) { + dlaset_((char *)"F", m, m, &c_b63, &c_b63, &u[u_offset], ldu, (ftnlen)1); + dbdsdc_((char *)"U", (char *)"I", n, &s[1], &work[ie], &u[u_offset], ldu, &vt[vt_offset], ldvt, dum, + idum, &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + if (*m > *n) { + i__1 = *m - *n; + i__2 = *m - *n; + dlaset_((char *)"F", &i__1, &i__2, &c_b63, &c_b84, &u[*n + 1 + (*n + 1) * u_dim1], ldu, + (ftnlen)1); + } + i__1 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"N", m, m, n, &a[a_offset], lda, &work[itauq], &u[u_offset], ldu, + &work[nwork], &i__1, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"R", (char *)"T", n, n, m, &a[a_offset], lda, &work[itaup], &vt[vt_offset], + ldvt, &work[nwork], &i__1, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + } + } else { + if (*n >= mnthr) { + if (wntqn) { + itau = 1; + nwork = itau + *m; + i__1 = *lwork - nwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, &ierr); + i__1 = *m - 1; + i__2 = *m - 1; + dlaset_((char *)"U", &i__1, &i__2, &c_b63, &c_b63, &a[(a_dim1 << 1) + 1], lda, (ftnlen)1); + ie = 1; + itauq = ie + *m; + itaup = itauq + *m; + nwork = itaup + *m; + i__1 = *lwork - nwork + 1; + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__1, &ierr); + nwork = ie + *m; + dbdsdc_((char *)"U", (char *)"N", m, &s[1], &work[ie], dum, &c__1, dum, &c__1, dum, idum, + &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + } else if (wntqo) { + ivt = 1; + il = ivt + *m * *m; + if (*lwork >= *m * *n + *m * *m + *m * 3 + bdspac) { + ldwrkl = *m; + chunk = *n; + } else { + ldwrkl = *m; + chunk = (*lwork - *m * *m) / *m; + } + itau = il + ldwrkl * *m; + nwork = itau + *m; + i__1 = *lwork - nwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, &ierr); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[il], &ldwrkl, (ftnlen)1); + i__1 = *m - 1; + i__2 = *m - 1; + dlaset_((char *)"U", &i__1, &i__2, &c_b63, &c_b63, &work[il + ldwrkl], &ldwrkl, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + nwork = itaup + *m; + i__1 = *lwork - nwork + 1; + dgebrd_(m, m, &work[il], &ldwrkl, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__1, &ierr); + dbdsdc_((char *)"U", (char *)"I", m, &s[1], &work[ie], &u[u_offset], ldu, &work[ivt], m, dum, idum, + &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"N", m, m, m, &work[il], &ldwrkl, &work[itauq], &u[u_offset], ldu, + &work[nwork], &i__1, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"R", (char *)"T", m, m, m, &work[il], &ldwrkl, &work[itaup], &work[ivt], m, + &work[nwork], &i__1, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__1 = *n; + i__2 = chunk; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__3 = *n - i__ + 1; + blk = min(i__3, chunk); + dgemm_((char *)"N", (char *)"N", m, &blk, m, &c_b84, &work[ivt], m, &a[i__ * a_dim1 + 1], lda, + &c_b63, &work[il], &ldwrkl, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, &blk, &work[il], &ldwrkl, &a[i__ * a_dim1 + 1], lda, (ftnlen)1); + } + } else if (wntqs) { + il = 1; + ldwrkl = *m; + itau = il + ldwrkl * *m; + nwork = itau + *m; + i__2 = *lwork - nwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__2, &ierr); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[il], &ldwrkl, (ftnlen)1); + i__2 = *m - 1; + i__1 = *m - 1; + dlaset_((char *)"U", &i__2, &i__1, &c_b63, &c_b63, &work[il + ldwrkl], &ldwrkl, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[nwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + nwork = itaup + *m; + i__2 = *lwork - nwork + 1; + dgebrd_(m, m, &work[il], &ldwrkl, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__2, &ierr); + dbdsdc_((char *)"U", (char *)"I", m, &s[1], &work[ie], &u[u_offset], ldu, &vt[vt_offset], ldvt, dum, + idum, &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"N", m, m, m, &work[il], &ldwrkl, &work[itauq], &u[u_offset], ldu, + &work[nwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"R", (char *)"T", m, m, m, &work[il], &ldwrkl, &work[itaup], &vt[vt_offset], + ldvt, &work[nwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, m, &vt[vt_offset], ldvt, &work[il], &ldwrkl, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b84, &work[il], &ldwrkl, &a[a_offset], lda, &c_b63, + &vt[vt_offset], ldvt, (ftnlen)1, (ftnlen)1); + } else if (wntqa) { + ivt = 1; + ldwkvt = *m; + itau = ivt + ldwkvt * *m; + nwork = itau + *m; + i__2 = *lwork - nwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &work[nwork], &i__2, &ierr); + i__2 = *m - 1; + i__1 = *m - 1; + dlaset_((char *)"U", &i__2, &i__1, &c_b63, &c_b63, &a[(a_dim1 << 1) + 1], lda, (ftnlen)1); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + nwork = itaup + *m; + i__2 = *lwork - nwork + 1; + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__2, &ierr); + dbdsdc_((char *)"U", (char *)"I", m, &s[1], &work[ie], &u[u_offset], ldu, &work[ivt], &ldwkvt, dum, + idum, &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"N", m, m, m, &a[a_offset], lda, &work[itauq], &u[u_offset], ldu, + &work[nwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"R", (char *)"T", m, m, m, &a[a_offset], lda, &work[itaup], &work[ivt], + &ldwkvt, &work[nwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b84, &work[ivt], &ldwkvt, &vt[vt_offset], ldvt, &c_b63, + &a[a_offset], lda, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); + } + } else { + ie = 1; + itauq = ie + *m; + itaup = itauq + *m; + nwork = itaup + *m; + i__2 = *lwork - nwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__2, &ierr); + if (wntqn) { + dbdsdc_((char *)"L", (char *)"N", m, &s[1], &work[ie], dum, &c__1, dum, &c__1, dum, idum, + &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + } else if (wntqo) { + ldwkvt = *m; + ivt = nwork; + if (*lwork >= *m * *n + *m * 3 + bdspac) { + dlaset_((char *)"F", m, n, &c_b63, &c_b63, &work[ivt], &ldwkvt, (ftnlen)1); + nwork = ivt + ldwkvt * *n; + il = -1; + } else { + nwork = ivt + ldwkvt * *m; + il = nwork; + chunk = (*lwork - *m * *m - *m * 3) / *m; + } + dbdsdc_((char *)"L", (char *)"I", m, &s[1], &work[ie], &u[u_offset], ldu, &work[ivt], &ldwkvt, dum, + idum, &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"N", m, m, n, &a[a_offset], lda, &work[itauq], &u[u_offset], ldu, + &work[nwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + if (*lwork >= *m * *n + *m * 3 + bdspac) { + i__2 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"R", (char *)"T", m, n, m, &a[a_offset], lda, &work[itaup], &work[ivt], + &ldwkvt, &work[nwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, n, &work[ivt], &ldwkvt, &a[a_offset], lda, (ftnlen)1); + } else { + i__2 = *lwork - nwork + 1; + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], &work[nwork], &i__2, + &ierr, (ftnlen)1); + i__2 = *n; + i__1 = chunk; + for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { + i__3 = *n - i__ + 1; + blk = min(i__3, chunk); + dgemm_((char *)"N", (char *)"N", m, &blk, m, &c_b84, &work[ivt], &ldwkvt, + &a[i__ * a_dim1 + 1], lda, &c_b63, &work[il], m, (ftnlen)1, + (ftnlen)1); + dlacpy_((char *)"F", m, &blk, &work[il], m, &a[i__ * a_dim1 + 1], lda, (ftnlen)1); + } + } + } else if (wntqs) { + dlaset_((char *)"F", m, n, &c_b63, &c_b63, &vt[vt_offset], ldvt, (ftnlen)1); + dbdsdc_((char *)"L", (char *)"I", m, &s[1], &work[ie], &u[u_offset], ldu, &vt[vt_offset], ldvt, dum, + idum, &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"N", m, m, n, &a[a_offset], lda, &work[itauq], &u[u_offset], ldu, + &work[nwork], &i__1, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"R", (char *)"T", m, n, m, &a[a_offset], lda, &work[itaup], &vt[vt_offset], + ldvt, &work[nwork], &i__1, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } else if (wntqa) { + dlaset_((char *)"F", n, n, &c_b63, &c_b63, &vt[vt_offset], ldvt, (ftnlen)1); + dbdsdc_((char *)"L", (char *)"I", m, &s[1], &work[ie], &u[u_offset], ldu, &vt[vt_offset], ldvt, dum, + idum, &work[nwork], &iwork[1], info, (ftnlen)1, (ftnlen)1); + if (*n > *m) { + i__1 = *n - *m; + i__2 = *n - *m; + dlaset_((char *)"F", &i__1, &i__2, &c_b63, &c_b84, &vt[*m + 1 + (*m + 1) * vt_dim1], + ldvt, (ftnlen)1); + } + i__1 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"N", m, m, n, &a[a_offset], lda, &work[itauq], &u[u_offset], ldu, + &work[nwork], &i__1, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"R", (char *)"T", n, n, m, &a[a_offset], lda, &work[itaup], &vt[vt_offset], + ldvt, &work[nwork], &i__1, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + } + } + if (iscl == 1) { + if (anrm > bignum) { + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], &minmn, &ierr, + (ftnlen)1); + } + if (anrm < smlnum) { + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], &minmn, &ierr, + (ftnlen)1); + } + } + work[1] = (doublereal)maxwrk; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dhseqr.cpp b/lib/linalg/dhseqr.cpp new file mode 100644 index 0000000000..2ac0219858 --- /dev/null +++ b/lib/linalg/dhseqr.cpp @@ -0,0 +1,145 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublereal c_b11 = 0.; +static doublereal c_b12 = 1.; +static integer c__12 = 12; +static integer c__2 = 2; +static integer c__49 = 49; +int dhseqr_(char *job, char *compz, integer *n, integer *ilo, integer *ihi, doublereal *h__, + integer *ldh, doublereal *wr, doublereal *wi, doublereal *z__, integer *ldz, + doublereal *work, integer *lwork, integer *info, ftnlen job_len, ftnlen compz_len) +{ + address a__1[2]; + integer h_dim1, h_offset, z_dim1, z_offset, i__1, i__2[2], i__3; + doublereal d__1; + char ch__1[2]; + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); + integer i__; + doublereal hl[2401]; + integer kbot, nmin; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + logical initz; + doublereal workl[49]; + logical wantt, wantz; + extern int dlaqr0_(logical *, logical *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, doublereal *, integer *, integer *), + dlahqr_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, + integer *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + logical lquery; + h_dim1 = *ldh; + h_offset = 1 + h_dim1; + h__ -= h_offset; + --wr; + --wi; + z_dim1 = *ldz; + z_offset = 1 + z_dim1; + z__ -= z_offset; + --work; + wantt = lsame_(job, (char *)"S", (ftnlen)1, (ftnlen)1); + initz = lsame_(compz, (char *)"I", (ftnlen)1, (ftnlen)1); + wantz = initz || lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1); + work[1] = (doublereal)max(1, *n); + lquery = *lwork == -1; + *info = 0; + if (!lsame_(job, (char *)"E", (ftnlen)1, (ftnlen)1) && !wantt) { + *info = -1; + } else if (!lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1) && !wantz) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*ilo < 1 || *ilo > max(1, *n)) { + *info = -4; + } else if (*ihi < min(*ilo, *n) || *ihi > *n) { + *info = -5; + } else if (*ldh < max(1, *n)) { + *info = -7; + } else if (*ldz < 1 || wantz && *ldz < max(1, *n)) { + *info = -11; + } else if (*lwork < max(1, *n) && !lquery) { + *info = -13; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DHSEQR", &i__1, (ftnlen)6); + return 0; + } else if (*n == 0) { + return 0; + } else if (lquery) { + dlaqr0_(&wantt, &wantz, n, ilo, ihi, &h__[h_offset], ldh, &wr[1], &wi[1], ilo, ihi, + &z__[z_offset], ldz, &work[1], lwork, info); + d__1 = (doublereal)max(1, *n); + work[1] = max(d__1, work[1]); + return 0; + } else { + i__1 = *ilo - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + wr[i__] = h__[i__ + i__ * h_dim1]; + wi[i__] = 0.; + } + i__1 = *n; + for (i__ = *ihi + 1; i__ <= i__1; ++i__) { + wr[i__] = h__[i__ + i__ * h_dim1]; + wi[i__] = 0.; + } + if (initz) { + dlaset_((char *)"A", n, n, &c_b11, &c_b12, &z__[z_offset], ldz, (ftnlen)1); + } + if (*ilo == *ihi) { + wr[*ilo] = h__[*ilo + *ilo * h_dim1]; + wi[*ilo] = 0.; + return 0; + } + i__2[0] = 1, a__1[0] = job; + i__2[1] = 1, a__1[1] = compz; + s_lmp_cat(ch__1, a__1, i__2, &c__2, (ftnlen)2); + nmin = ilaenv_(&c__12, (char *)"DHSEQR", ch__1, n, ilo, ihi, lwork, (ftnlen)6, (ftnlen)2); + nmin = max(11, nmin); + if (*n > nmin) { + dlaqr0_(&wantt, &wantz, n, ilo, ihi, &h__[h_offset], ldh, &wr[1], &wi[1], ilo, ihi, + &z__[z_offset], ldz, &work[1], lwork, info); + } else { + dlahqr_(&wantt, &wantz, n, ilo, ihi, &h__[h_offset], ldh, &wr[1], &wi[1], ilo, ihi, + &z__[z_offset], ldz, info); + if (*info > 0) { + kbot = *info; + if (*n >= 49) { + dlaqr0_(&wantt, &wantz, n, ilo, &kbot, &h__[h_offset], ldh, &wr[1], &wi[1], ilo, + ihi, &z__[z_offset], ldz, &work[1], lwork, info); + } else { + dlacpy_((char *)"A", n, n, &h__[h_offset], ldh, hl, &c__49, (ftnlen)1); + hl[*n + 1 + *n * 49 - 50] = 0.; + i__1 = 49 - *n; + dlaset_((char *)"A", &c__49, &i__1, &c_b11, &c_b11, &hl[(*n + 1) * 49 - 49], &c__49, + (ftnlen)1); + dlaqr0_(&wantt, &wantz, &c__49, ilo, &kbot, hl, &c__49, &wr[1], &wi[1], ilo, + ihi, &z__[z_offset], ldz, workl, &c__49, info); + if (wantt || *info != 0) { + dlacpy_((char *)"A", n, n, hl, &c__49, &h__[h_offset], ldh, (ftnlen)1); + } + } + } + } + if ((wantt || *info != 0) && *n > 2) { + i__1 = *n - 2; + i__3 = *n - 2; + dlaset_((char *)"L", &i__1, &i__3, &c_b11, &c_b11, &h__[h_dim1 + 3], ldh, (ftnlen)1); + } + d__1 = (doublereal)max(1, *n); + work[1] = max(d__1, work[1]); + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlaexc.cpp b/lib/linalg/dlaexc.cpp new file mode 100644 index 0000000000..9d528080cf --- /dev/null +++ b/lib/linalg/dlaexc.cpp @@ -0,0 +1,214 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c__4 = 4; +static logical c_false = FALSE_; +static integer c_n1 = -1; +static integer c__2 = 2; +static integer c__3 = 3; +int dlaexc_(logical *wantq, integer *n, doublereal *t, integer *ldt, doublereal *q, integer *ldq, + integer *j1, integer *n1, integer *n2, doublereal *work, integer *info) +{ + integer q_dim1, q_offset, t_dim1, t_offset, i__1; + doublereal d__1, d__2, d__3; + doublereal d__[16]; + integer k; + doublereal u[3], x[4]; + integer j2, j3, j4; + doublereal u1[3], u2[3]; + integer nd; + doublereal cs, t11, t22, t33, sn, wi1, wi2, wr1, wr2, eps, tau, tau1, tau2; + integer ierr; + doublereal temp; + extern int drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *); + doublereal scale, dnorm, xnorm; + extern int dlanv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), + dlasy2_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *); + extern doublereal dlamch_(char *, ftnlen), + dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *, ftnlen); + extern int dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), + dlarfx_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen); + doublereal thresh, smlnum; + t_dim1 = *ldt; + t_offset = 1 + t_dim1; + t -= t_offset; + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + --work; + *info = 0; + if (*n == 0 || *n1 == 0 || *n2 == 0) { + return 0; + } + if (*j1 + *n1 > *n) { + return 0; + } + j2 = *j1 + 1; + j3 = *j1 + 2; + j4 = *j1 + 3; + if (*n1 == 1 && *n2 == 1) { + t11 = t[*j1 + *j1 * t_dim1]; + t22 = t[j2 + j2 * t_dim1]; + d__1 = t22 - t11; + dlartg_(&t[*j1 + j2 * t_dim1], &d__1, &cs, &sn, &temp); + if (j3 <= *n) { + i__1 = *n - *j1 - 1; + drot_(&i__1, &t[*j1 + j3 * t_dim1], ldt, &t[j2 + j3 * t_dim1], ldt, &cs, &sn); + } + i__1 = *j1 - 1; + drot_(&i__1, &t[*j1 * t_dim1 + 1], &c__1, &t[j2 * t_dim1 + 1], &c__1, &cs, &sn); + t[*j1 + *j1 * t_dim1] = t22; + t[j2 + j2 * t_dim1] = t11; + if (*wantq) { + drot_(n, &q[*j1 * q_dim1 + 1], &c__1, &q[j2 * q_dim1 + 1], &c__1, &cs, &sn); + } + } else { + nd = *n1 + *n2; + dlacpy_((char *)"Full", &nd, &nd, &t[*j1 + *j1 * t_dim1], ldt, d__, &c__4, (ftnlen)4); + dnorm = dlange_((char *)"Max", &nd, &nd, d__, &c__4, &work[1], (ftnlen)3); + eps = dlamch_((char *)"P", (ftnlen)1); + smlnum = dlamch_((char *)"S", (ftnlen)1) / eps; + d__1 = eps * 10. * dnorm; + thresh = max(d__1, smlnum); + dlasy2_(&c_false, &c_false, &c_n1, n1, n2, d__, &c__4, &d__[*n1 + 1 + (*n1 + 1 << 2) - 5], + &c__4, &d__[(*n1 + 1 << 2) - 4], &c__4, &scale, x, &c__2, &xnorm, &ierr); + k = *n1 + *n1 + *n2 - 3; + switch (k) { + case 1: + goto L10; + case 2: + goto L20; + case 3: + goto L30; + } + L10: + u[0] = scale; + u[1] = x[0]; + u[2] = x[2]; + dlarfg_(&c__3, &u[2], u, &c__1, &tau); + u[2] = 1.; + t11 = t[*j1 + *j1 * t_dim1]; + dlarfx_((char *)"L", &c__3, &c__3, u, &tau, d__, &c__4, &work[1], (ftnlen)1); + dlarfx_((char *)"R", &c__3, &c__3, u, &tau, d__, &c__4, &work[1], (ftnlen)1); + d__2 = abs(d__[2]), d__3 = abs(d__[6]), d__2 = max(d__2, d__3), + d__3 = (d__1 = d__[10] - t11, abs(d__1)); + if (max(d__2, d__3) > thresh) { + goto L50; + } + i__1 = *n - *j1 + 1; + dlarfx_((char *)"L", &c__3, &i__1, u, &tau, &t[*j1 + *j1 * t_dim1], ldt, &work[1], (ftnlen)1); + dlarfx_((char *)"R", &j2, &c__3, u, &tau, &t[*j1 * t_dim1 + 1], ldt, &work[1], (ftnlen)1); + t[j3 + *j1 * t_dim1] = 0.; + t[j3 + j2 * t_dim1] = 0.; + t[j3 + j3 * t_dim1] = t11; + if (*wantq) { + dlarfx_((char *)"R", n, &c__3, u, &tau, &q[*j1 * q_dim1 + 1], ldq, &work[1], (ftnlen)1); + } + goto L40; + L20: + u[0] = -x[0]; + u[1] = -x[1]; + u[2] = scale; + dlarfg_(&c__3, u, &u[1], &c__1, &tau); + u[0] = 1.; + t33 = t[j3 + j3 * t_dim1]; + dlarfx_((char *)"L", &c__3, &c__3, u, &tau, d__, &c__4, &work[1], (ftnlen)1); + dlarfx_((char *)"R", &c__3, &c__3, u, &tau, d__, &c__4, &work[1], (ftnlen)1); + d__2 = abs(d__[1]), d__3 = abs(d__[2]), d__2 = max(d__2, d__3), + d__3 = (d__1 = d__[0] - t33, abs(d__1)); + if (max(d__2, d__3) > thresh) { + goto L50; + } + dlarfx_((char *)"R", &j3, &c__3, u, &tau, &t[*j1 * t_dim1 + 1], ldt, &work[1], (ftnlen)1); + i__1 = *n - *j1; + dlarfx_((char *)"L", &c__3, &i__1, u, &tau, &t[*j1 + j2 * t_dim1], ldt, &work[1], (ftnlen)1); + t[*j1 + *j1 * t_dim1] = t33; + t[j2 + *j1 * t_dim1] = 0.; + t[j3 + *j1 * t_dim1] = 0.; + if (*wantq) { + dlarfx_((char *)"R", n, &c__3, u, &tau, &q[*j1 * q_dim1 + 1], ldq, &work[1], (ftnlen)1); + } + goto L40; + L30: + u1[0] = -x[0]; + u1[1] = -x[1]; + u1[2] = scale; + dlarfg_(&c__3, u1, &u1[1], &c__1, &tau1); + u1[0] = 1.; + temp = -tau1 * (x[2] + u1[1] * x[3]); + u2[0] = -temp * u1[1] - x[3]; + u2[1] = -temp * u1[2]; + u2[2] = scale; + dlarfg_(&c__3, u2, &u2[1], &c__1, &tau2); + u2[0] = 1.; + dlarfx_((char *)"L", &c__3, &c__4, u1, &tau1, d__, &c__4, &work[1], (ftnlen)1); + dlarfx_((char *)"R", &c__4, &c__3, u1, &tau1, d__, &c__4, &work[1], (ftnlen)1); + dlarfx_((char *)"L", &c__3, &c__4, u2, &tau2, &d__[1], &c__4, &work[1], (ftnlen)1); + dlarfx_((char *)"R", &c__4, &c__3, u2, &tau2, &d__[4], &c__4, &work[1], (ftnlen)1); + d__1 = abs(d__[2]), d__2 = abs(d__[6]), d__1 = max(d__1, d__2), d__2 = abs(d__[3]), + d__1 = max(d__1, d__2), d__2 = abs(d__[7]); + if (max(d__1, d__2) > thresh) { + goto L50; + } + i__1 = *n - *j1 + 1; + dlarfx_((char *)"L", &c__3, &i__1, u1, &tau1, &t[*j1 + *j1 * t_dim1], ldt, &work[1], (ftnlen)1); + dlarfx_((char *)"R", &j4, &c__3, u1, &tau1, &t[*j1 * t_dim1 + 1], ldt, &work[1], (ftnlen)1); + i__1 = *n - *j1 + 1; + dlarfx_((char *)"L", &c__3, &i__1, u2, &tau2, &t[j2 + *j1 * t_dim1], ldt, &work[1], (ftnlen)1); + dlarfx_((char *)"R", &j4, &c__3, u2, &tau2, &t[j2 * t_dim1 + 1], ldt, &work[1], (ftnlen)1); + t[j3 + *j1 * t_dim1] = 0.; + t[j3 + j2 * t_dim1] = 0.; + t[j4 + *j1 * t_dim1] = 0.; + t[j4 + j2 * t_dim1] = 0.; + if (*wantq) { + dlarfx_((char *)"R", n, &c__3, u1, &tau1, &q[*j1 * q_dim1 + 1], ldq, &work[1], (ftnlen)1); + dlarfx_((char *)"R", n, &c__3, u2, &tau2, &q[j2 * q_dim1 + 1], ldq, &work[1], (ftnlen)1); + } + L40: + if (*n2 == 2) { + dlanv2_(&t[*j1 + *j1 * t_dim1], &t[*j1 + j2 * t_dim1], &t[j2 + *j1 * t_dim1], + &t[j2 + j2 * t_dim1], &wr1, &wi1, &wr2, &wi2, &cs, &sn); + i__1 = *n - *j1 - 1; + drot_(&i__1, &t[*j1 + (*j1 + 2) * t_dim1], ldt, &t[j2 + (*j1 + 2) * t_dim1], ldt, &cs, + &sn); + i__1 = *j1 - 1; + drot_(&i__1, &t[*j1 * t_dim1 + 1], &c__1, &t[j2 * t_dim1 + 1], &c__1, &cs, &sn); + if (*wantq) { + drot_(n, &q[*j1 * q_dim1 + 1], &c__1, &q[j2 * q_dim1 + 1], &c__1, &cs, &sn); + } + } + if (*n1 == 2) { + j3 = *j1 + *n2; + j4 = j3 + 1; + dlanv2_(&t[j3 + j3 * t_dim1], &t[j3 + j4 * t_dim1], &t[j4 + j3 * t_dim1], + &t[j4 + j4 * t_dim1], &wr1, &wi1, &wr2, &wi2, &cs, &sn); + if (j3 + 2 <= *n) { + i__1 = *n - j3 - 1; + drot_(&i__1, &t[j3 + (j3 + 2) * t_dim1], ldt, &t[j4 + (j3 + 2) * t_dim1], ldt, &cs, + &sn); + } + i__1 = j3 - 1; + drot_(&i__1, &t[j3 * t_dim1 + 1], &c__1, &t[j4 * t_dim1 + 1], &c__1, &cs, &sn); + if (*wantq) { + drot_(n, &q[j3 * q_dim1 + 1], &c__1, &q[j4 * q_dim1 + 1], &c__1, &cs, &sn); + } + } + } + return 0; +L50: + *info = 1; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlahqr.cpp b/lib/linalg/dlahqr.cpp new file mode 100644 index 0000000000..c2f2775b9b --- /dev/null +++ b/lib/linalg/dlahqr.cpp @@ -0,0 +1,311 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +int dlahqr_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublereal *h__, + integer *ldh, doublereal *wr, doublereal *wi, integer *iloz, integer *ihiz, + doublereal *z__, integer *ldz, integer *info) +{ + integer h_dim1, h_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4; + doublereal d__1, d__2, d__3, d__4; + double sqrt(doublereal); + integer i__, j, k, l, m; + doublereal s, v[3]; + integer i1, i2; + doublereal t1, t2, t3, v2, v3, aa, ab, ba, bb, h11, h12, h21, h22, cs; + integer nh; + doublereal sn; + integer nr; + doublereal tr; + integer nz; + doublereal det, h21s; + integer its; + doublereal ulp, sum, tst, rt1i, rt2i, rt1r, rt2r; + extern int drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); + integer itmax; + extern int dlanv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), + dlabad_(doublereal *, doublereal *); + extern doublereal dlamch_(char *, ftnlen); + extern int dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *); + doublereal safmin, safmax, rtdisc, smlnum; + h_dim1 = *ldh; + h_offset = 1 + h_dim1; + h__ -= h_offset; + --wr; + --wi; + z_dim1 = *ldz; + z_offset = 1 + z_dim1; + z__ -= z_offset; + *info = 0; + if (*n == 0) { + return 0; + } + if (*ilo == *ihi) { + wr[*ilo] = h__[*ilo + *ilo * h_dim1]; + wi[*ilo] = 0.; + return 0; + } + i__1 = *ihi - 3; + for (j = *ilo; j <= i__1; ++j) { + h__[j + 2 + j * h_dim1] = 0.; + h__[j + 3 + j * h_dim1] = 0.; + } + if (*ilo <= *ihi - 2) { + h__[*ihi + (*ihi - 2) * h_dim1] = 0.; + } + nh = *ihi - *ilo + 1; + nz = *ihiz - *iloz + 1; + safmin = dlamch_((char *)"SAFE MINIMUM", (ftnlen)12); + safmax = 1. / safmin; + dlabad_(&safmin, &safmax); + ulp = dlamch_((char *)"PRECISION", (ftnlen)9); + smlnum = safmin * ((doublereal)nh / ulp); + if (*wantt) { + i1 = 1; + i2 = *n; + } + itmax = max(10, nh) * 30; + i__ = *ihi; +L20: + l = *ilo; + if (i__ < *ilo) { + goto L160; + } + i__1 = itmax; + for (its = 0; its <= i__1; ++its) { + i__2 = l + 1; + for (k = i__; k >= i__2; --k) { + if ((d__1 = h__[k + (k - 1) * h_dim1], abs(d__1)) <= smlnum) { + goto L40; + } + tst = (d__1 = h__[k - 1 + (k - 1) * h_dim1], abs(d__1)) + + (d__2 = h__[k + k * h_dim1], abs(d__2)); + if (tst == 0.) { + if (k - 2 >= *ilo) { + tst += (d__1 = h__[k - 1 + (k - 2) * h_dim1], abs(d__1)); + } + if (k + 1 <= *ihi) { + tst += (d__1 = h__[k + 1 + k * h_dim1], abs(d__1)); + } + } + if ((d__1 = h__[k + (k - 1) * h_dim1], abs(d__1)) <= ulp * tst) { + d__3 = (d__1 = h__[k + (k - 1) * h_dim1], abs(d__1)), + d__4 = (d__2 = h__[k - 1 + k * h_dim1], abs(d__2)); + ab = max(d__3, d__4); + d__3 = (d__1 = h__[k + (k - 1) * h_dim1], abs(d__1)), + d__4 = (d__2 = h__[k - 1 + k * h_dim1], abs(d__2)); + ba = min(d__3, d__4); + d__3 = (d__1 = h__[k + k * h_dim1], abs(d__1)), + d__4 = (d__2 = h__[k - 1 + (k - 1) * h_dim1] - h__[k + k * h_dim1], abs(d__2)); + aa = max(d__3, d__4); + d__3 = (d__1 = h__[k + k * h_dim1], abs(d__1)), + d__4 = (d__2 = h__[k - 1 + (k - 1) * h_dim1] - h__[k + k * h_dim1], abs(d__2)); + bb = min(d__3, d__4); + s = aa + ab; + d__1 = smlnum, d__2 = ulp * (bb * (aa / s)); + if (ba * (ab / s) <= max(d__1, d__2)) { + goto L40; + } + } + } + L40: + l = k; + if (l > *ilo) { + h__[l + (l - 1) * h_dim1] = 0.; + } + if (l >= i__ - 1) { + goto L150; + } + if (!(*wantt)) { + i1 = l; + i2 = i__; + } + if (its == 10) { + s = (d__1 = h__[l + 1 + l * h_dim1], abs(d__1)) + + (d__2 = h__[l + 2 + (l + 1) * h_dim1], abs(d__2)); + h11 = s * .75 + h__[l + l * h_dim1]; + h12 = s * -.4375; + h21 = s; + h22 = h11; + } else if (its == 20) { + s = (d__1 = h__[i__ + (i__ - 1) * h_dim1], abs(d__1)) + + (d__2 = h__[i__ - 1 + (i__ - 2) * h_dim1], abs(d__2)); + h11 = s * .75 + h__[i__ + i__ * h_dim1]; + h12 = s * -.4375; + h21 = s; + h22 = h11; + } else { + h11 = h__[i__ - 1 + (i__ - 1) * h_dim1]; + h21 = h__[i__ + (i__ - 1) * h_dim1]; + h12 = h__[i__ - 1 + i__ * h_dim1]; + h22 = h__[i__ + i__ * h_dim1]; + } + s = abs(h11) + abs(h12) + abs(h21) + abs(h22); + if (s == 0.) { + rt1r = 0.; + rt1i = 0.; + rt2r = 0.; + rt2i = 0.; + } else { + h11 /= s; + h21 /= s; + h12 /= s; + h22 /= s; + tr = (h11 + h22) / 2.; + det = (h11 - tr) * (h22 - tr) - h12 * h21; + rtdisc = sqrt((abs(det))); + if (det >= 0.) { + rt1r = tr * s; + rt2r = rt1r; + rt1i = rtdisc * s; + rt2i = -rt1i; + } else { + rt1r = tr + rtdisc; + rt2r = tr - rtdisc; + if ((d__1 = rt1r - h22, abs(d__1)) <= (d__2 = rt2r - h22, abs(d__2))) { + rt1r *= s; + rt2r = rt1r; + } else { + rt2r *= s; + rt1r = rt2r; + } + rt1i = 0.; + rt2i = 0.; + } + } + i__2 = l; + for (m = i__ - 2; m >= i__2; --m) { + h21s = h__[m + 1 + m * h_dim1]; + s = (d__1 = h__[m + m * h_dim1] - rt2r, abs(d__1)) + abs(rt2i) + abs(h21s); + h21s = h__[m + 1 + m * h_dim1] / s; + v[0] = h21s * h__[m + (m + 1) * h_dim1] + + (h__[m + m * h_dim1] - rt1r) * ((h__[m + m * h_dim1] - rt2r) / s) - + rt1i * (rt2i / s); + v[1] = h21s * (h__[m + m * h_dim1] + h__[m + 1 + (m + 1) * h_dim1] - rt1r - rt2r); + v[2] = h21s * h__[m + 2 + (m + 1) * h_dim1]; + s = abs(v[0]) + abs(v[1]) + abs(v[2]); + v[0] /= s; + v[1] /= s; + v[2] /= s; + if (m == l) { + goto L60; + } + if ((d__1 = h__[m + (m - 1) * h_dim1], abs(d__1)) * (abs(v[1]) + abs(v[2])) <= + ulp * abs(v[0]) * + ((d__2 = h__[m - 1 + (m - 1) * h_dim1], abs(d__2)) + + (d__3 = h__[m + m * h_dim1], abs(d__3)) + + (d__4 = h__[m + 1 + (m + 1) * h_dim1], abs(d__4)))) { + goto L60; + } + } + L60: + i__2 = i__ - 1; + for (k = m; k <= i__2; ++k) { + i__3 = 3, i__4 = i__ - k + 1; + nr = min(i__3, i__4); + if (k > m) { + dcopy_(&nr, &h__[k + (k - 1) * h_dim1], &c__1, v, &c__1); + } + dlarfg_(&nr, v, &v[1], &c__1, &t1); + if (k > m) { + h__[k + (k - 1) * h_dim1] = v[0]; + h__[k + 1 + (k - 1) * h_dim1] = 0.; + if (k < i__ - 1) { + h__[k + 2 + (k - 1) * h_dim1] = 0.; + } + } else if (m > l) { + h__[k + (k - 1) * h_dim1] *= 1. - t1; + } + v2 = v[1]; + t2 = t1 * v2; + if (nr == 3) { + v3 = v[2]; + t3 = t1 * v3; + i__3 = i2; + for (j = k; j <= i__3; ++j) { + sum = h__[k + j * h_dim1] + v2 * h__[k + 1 + j * h_dim1] + + v3 * h__[k + 2 + j * h_dim1]; + h__[k + j * h_dim1] -= sum * t1; + h__[k + 1 + j * h_dim1] -= sum * t2; + h__[k + 2 + j * h_dim1] -= sum * t3; + } + i__4 = k + 3; + i__3 = min(i__4, i__); + for (j = i1; j <= i__3; ++j) { + sum = h__[j + k * h_dim1] + v2 * h__[j + (k + 1) * h_dim1] + + v3 * h__[j + (k + 2) * h_dim1]; + h__[j + k * h_dim1] -= sum * t1; + h__[j + (k + 1) * h_dim1] -= sum * t2; + h__[j + (k + 2) * h_dim1] -= sum * t3; + } + if (*wantz) { + i__3 = *ihiz; + for (j = *iloz; j <= i__3; ++j) { + sum = z__[j + k * z_dim1] + v2 * z__[j + (k + 1) * z_dim1] + + v3 * z__[j + (k + 2) * z_dim1]; + z__[j + k * z_dim1] -= sum * t1; + z__[j + (k + 1) * z_dim1] -= sum * t2; + z__[j + (k + 2) * z_dim1] -= sum * t3; + } + } + } else if (nr == 2) { + i__3 = i2; + for (j = k; j <= i__3; ++j) { + sum = h__[k + j * h_dim1] + v2 * h__[k + 1 + j * h_dim1]; + h__[k + j * h_dim1] -= sum * t1; + h__[k + 1 + j * h_dim1] -= sum * t2; + } + i__3 = i__; + for (j = i1; j <= i__3; ++j) { + sum = h__[j + k * h_dim1] + v2 * h__[j + (k + 1) * h_dim1]; + h__[j + k * h_dim1] -= sum * t1; + h__[j + (k + 1) * h_dim1] -= sum * t2; + } + if (*wantz) { + i__3 = *ihiz; + for (j = *iloz; j <= i__3; ++j) { + sum = z__[j + k * z_dim1] + v2 * z__[j + (k + 1) * z_dim1]; + z__[j + k * z_dim1] -= sum * t1; + z__[j + (k + 1) * z_dim1] -= sum * t2; + } + } + } + } + } + *info = i__; + return 0; +L150: + if (l == i__) { + wr[i__] = h__[i__ + i__ * h_dim1]; + wi[i__] = 0.; + } else if (l == i__ - 1) { + dlanv2_(&h__[i__ - 1 + (i__ - 1) * h_dim1], &h__[i__ - 1 + i__ * h_dim1], + &h__[i__ + (i__ - 1) * h_dim1], &h__[i__ + i__ * h_dim1], &wr[i__ - 1], + &wi[i__ - 1], &wr[i__], &wi[i__], &cs, &sn); + if (*wantt) { + if (i2 > i__) { + i__1 = i2 - i__; + drot_(&i__1, &h__[i__ - 1 + (i__ + 1) * h_dim1], ldh, + &h__[i__ + (i__ + 1) * h_dim1], ldh, &cs, &sn); + } + i__1 = i__ - i1 - 1; + drot_(&i__1, &h__[i1 + (i__ - 1) * h_dim1], &c__1, &h__[i1 + i__ * h_dim1], &c__1, &cs, + &sn); + } + if (*wantz) { + drot_(&nz, &z__[*iloz + (i__ - 1) * z_dim1], &c__1, &z__[*iloz + i__ * z_dim1], &c__1, + &cs, &sn); + } + } + i__ = l - 1; + goto L20; +L160: + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlahr2.cpp b/lib/linalg/dlahr2.cpp new file mode 100644 index 0000000000..36264e950f --- /dev/null +++ b/lib/linalg/dlahr2.cpp @@ -0,0 +1,121 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublereal c_b4 = -1.; +static doublereal c_b5 = 1.; +static integer c__1 = 1; +static doublereal c_b38 = 0.; +int dlahr2_(integer *n, integer *k, integer *nb, doublereal *a, integer *lda, doublereal *tau, + doublereal *t, integer *ldt, doublereal *y, integer *ldy) +{ + integer a_dim1, a_offset, t_dim1, t_offset, y_dim1, y_offset, i__1, i__2, i__3; + doublereal d__1; + integer i__; + doublereal ei; + extern int dscal_(integer *, doublereal *, doublereal *, integer *), + dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen), + dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), + dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), + daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), + dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen, ftnlen, ftnlen), + dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen); + --tau; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + t_dim1 = *ldt; + t_offset = 1 + t_dim1; + t -= t_offset; + y_dim1 = *ldy; + y_offset = 1 + y_dim1; + y -= y_offset; + if (*n <= 1) { + return 0; + } + i__1 = *nb; + for (i__ = 1; i__ <= i__1; ++i__) { + if (i__ > 1) { + i__2 = *n - *k; + i__3 = i__ - 1; + dgemv_((char *)"NO TRANSPOSE", &i__2, &i__3, &c_b4, &y[*k + 1 + y_dim1], ldy, + &a[*k + i__ - 1 + a_dim1], lda, &c_b5, &a[*k + 1 + i__ * a_dim1], &c__1, + (ftnlen)12); + i__2 = i__ - 1; + dcopy_(&i__2, &a[*k + 1 + i__ * a_dim1], &c__1, &t[*nb * t_dim1 + 1], &c__1); + i__2 = i__ - 1; + dtrmv_((char *)"Lower", (char *)"Transpose", (char *)"UNIT", &i__2, &a[*k + 1 + a_dim1], lda, + &t[*nb * t_dim1 + 1], &c__1, (ftnlen)5, (ftnlen)9, (ftnlen)4); + i__2 = *n - *k - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[*k + i__ + a_dim1], lda, + &a[*k + i__ + i__ * a_dim1], &c__1, &c_b5, &t[*nb * t_dim1 + 1], &c__1, + (ftnlen)9); + i__2 = i__ - 1; + dtrmv_((char *)"Upper", (char *)"Transpose", (char *)"NON-UNIT", &i__2, &t[t_offset], ldt, &t[*nb * t_dim1 + 1], + &c__1, (ftnlen)5, (ftnlen)9, (ftnlen)8); + i__2 = *n - *k - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"NO TRANSPOSE", &i__2, &i__3, &c_b4, &a[*k + i__ + a_dim1], lda, + &t[*nb * t_dim1 + 1], &c__1, &c_b5, &a[*k + i__ + i__ * a_dim1], &c__1, + (ftnlen)12); + i__2 = i__ - 1; + dtrmv_((char *)"Lower", (char *)"NO TRANSPOSE", (char *)"UNIT", &i__2, &a[*k + 1 + a_dim1], lda, + &t[*nb * t_dim1 + 1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)4); + i__2 = i__ - 1; + daxpy_(&i__2, &c_b4, &t[*nb * t_dim1 + 1], &c__1, &a[*k + 1 + i__ * a_dim1], &c__1); + a[*k + i__ - 1 + (i__ - 1) * a_dim1] = ei; + } + i__2 = *n - *k - i__ + 1; + i__3 = *k + i__ + 1; + dlarfg_(&i__2, &a[*k + i__ + i__ * a_dim1], &a[min(i__3, *n) + i__ * a_dim1], &c__1, + &tau[i__]); + ei = a[*k + i__ + i__ * a_dim1]; + a[*k + i__ + i__ * a_dim1] = 1.; + i__2 = *n - *k; + i__3 = *n - *k - i__ + 1; + dgemv_((char *)"NO TRANSPOSE", &i__2, &i__3, &c_b5, &a[*k + 1 + (i__ + 1) * a_dim1], lda, + &a[*k + i__ + i__ * a_dim1], &c__1, &c_b38, &y[*k + 1 + i__ * y_dim1], &c__1, + (ftnlen)12); + i__2 = *n - *k - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[*k + i__ + a_dim1], lda, + &a[*k + i__ + i__ * a_dim1], &c__1, &c_b38, &t[i__ * t_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *n - *k; + i__3 = i__ - 1; + dgemv_((char *)"NO TRANSPOSE", &i__2, &i__3, &c_b4, &y[*k + 1 + y_dim1], ldy, &t[i__ * t_dim1 + 1], + &c__1, &c_b5, &y[*k + 1 + i__ * y_dim1], &c__1, (ftnlen)12); + i__2 = *n - *k; + dscal_(&i__2, &tau[i__], &y[*k + 1 + i__ * y_dim1], &c__1); + i__2 = i__ - 1; + d__1 = -tau[i__]; + dscal_(&i__2, &d__1, &t[i__ * t_dim1 + 1], &c__1); + i__2 = i__ - 1; + dtrmv_((char *)"Upper", (char *)"No Transpose", (char *)"NON-UNIT", &i__2, &t[t_offset], ldt, &t[i__ * t_dim1 + 1], + &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)8); + t[i__ + i__ * t_dim1] = tau[i__]; + } + a[*k + *nb + *nb * a_dim1] = ei; + dlacpy_((char *)"ALL", k, nb, &a[(a_dim1 << 1) + 1], lda, &y[y_offset], ldy, (ftnlen)3); + dtrmm_((char *)"RIGHT", (char *)"Lower", (char *)"NO TRANSPOSE", (char *)"UNIT", k, nb, &c_b5, &a[*k + 1 + a_dim1], lda, + &y[y_offset], ldy, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*n > *k + *nb) { + i__1 = *n - *k - *nb; + dgemm_((char *)"NO TRANSPOSE", (char *)"NO TRANSPOSE", k, nb, &i__1, &c_b5, &a[(*nb + 2) * a_dim1 + 1], lda, + &a[*k + 1 + *nb + a_dim1], lda, &c_b5, &y[y_offset], ldy, (ftnlen)12, (ftnlen)12); + } + dtrmm_((char *)"RIGHT", (char *)"Upper", (char *)"NO TRANSPOSE", (char *)"NON-UNIT", k, nb, &c_b5, &t[t_offset], ldt, + &y[y_offset], ldy, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)8); + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlaln2.cpp b/lib/linalg/dlaln2.cpp new file mode 100644 index 0000000000..220eaae63a --- /dev/null +++ b/lib/linalg/dlaln2.cpp @@ -0,0 +1,298 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int dlaln2_(logical *ltrans, integer *na, integer *nw, doublereal *smin, doublereal *ca, + doublereal *a, integer *lda, doublereal *d1, doublereal *d2, doublereal *b, + integer *ldb, doublereal *wr, doublereal *wi, doublereal *x, integer *ldx, + doublereal *scale, doublereal *xnorm, integer *info) +{ + static logical zswap[4] = {FALSE_, FALSE_, TRUE_, TRUE_}; + static logical rswap[4] = {FALSE_, TRUE_, FALSE_, TRUE_}; + static integer ipivot[16] = {1, 2, 3, 4, 2, 1, 4, 3, 3, 4, 1, 2, 4, 3, 2, 1}; + integer a_dim1, a_offset, b_dim1, b_offset, x_dim1, x_offset; + doublereal d__1, d__2, d__3, d__4, d__5, d__6; + static doublereal equiv_0[4], equiv_1[4]; + integer j; +#define ci (equiv_0) +#define cr (equiv_1) + doublereal bi1, bi2, br1, br2, xi1, xi2, xr1, xr2, ci21, ci22, cr21, cr22, li21, csi, ui11, + lr21, ui12, ui22; +#define civ (equiv_0) + doublereal csr, ur11, ur12, ur22; +#define crv (equiv_1) + doublereal bbnd, cmax, ui11r, ui12s, temp, ur11r, ur12s, u22abs; + integer icmax; + doublereal bnorm, cnorm, smini; + extern doublereal dlamch_(char *, ftnlen); + extern int dladiv_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *); + doublereal bignum, smlnum; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + x_dim1 = *ldx; + x_offset = 1 + x_dim1; + x -= x_offset; + smlnum = 2. * dlamch_((char *)"Safe minimum", (ftnlen)12); + bignum = 1. / smlnum; + smini = max(*smin, smlnum); + *info = 0; + *scale = 1.; + if (*na == 1) { + if (*nw == 1) { + csr = *ca * a[a_dim1 + 1] - *wr * *d1; + cnorm = abs(csr); + if (cnorm < smini) { + csr = smini; + cnorm = smini; + *info = 1; + } + bnorm = (d__1 = b[b_dim1 + 1], abs(d__1)); + if (cnorm < 1. && bnorm > 1.) { + if (bnorm > bignum * cnorm) { + *scale = 1. / bnorm; + } + } + x[x_dim1 + 1] = b[b_dim1 + 1] * *scale / csr; + *xnorm = (d__1 = x[x_dim1 + 1], abs(d__1)); + } else { + csr = *ca * a[a_dim1 + 1] - *wr * *d1; + csi = -(*wi) * *d1; + cnorm = abs(csr) + abs(csi); + if (cnorm < smini) { + csr = smini; + csi = 0.; + cnorm = smini; + *info = 1; + } + bnorm = (d__1 = b[b_dim1 + 1], abs(d__1)) + (d__2 = b[(b_dim1 << 1) + 1], abs(d__2)); + if (cnorm < 1. && bnorm > 1.) { + if (bnorm > bignum * cnorm) { + *scale = 1. / bnorm; + } + } + d__1 = *scale * b[b_dim1 + 1]; + d__2 = *scale * b[(b_dim1 << 1) + 1]; + dladiv_(&d__1, &d__2, &csr, &csi, &x[x_dim1 + 1], &x[(x_dim1 << 1) + 1]); + *xnorm = (d__1 = x[x_dim1 + 1], abs(d__1)) + (d__2 = x[(x_dim1 << 1) + 1], abs(d__2)); + } + } else { + cr[0] = *ca * a[a_dim1 + 1] - *wr * *d1; + cr[3] = *ca * a[(a_dim1 << 1) + 2] - *wr * *d2; + if (*ltrans) { + cr[2] = *ca * a[a_dim1 + 2]; + cr[1] = *ca * a[(a_dim1 << 1) + 1]; + } else { + cr[1] = *ca * a[a_dim1 + 2]; + cr[2] = *ca * a[(a_dim1 << 1) + 1]; + } + if (*nw == 1) { + cmax = 0.; + icmax = 0; + for (j = 1; j <= 4; ++j) { + if ((d__1 = crv[j - 1], abs(d__1)) > cmax) { + cmax = (d__1 = crv[j - 1], abs(d__1)); + icmax = j; + } + } + if (cmax < smini) { + d__3 = (d__1 = b[b_dim1 + 1], abs(d__1)), d__4 = (d__2 = b[b_dim1 + 2], abs(d__2)); + bnorm = max(d__3, d__4); + if (smini < 1. && bnorm > 1.) { + if (bnorm > bignum * smini) { + *scale = 1. / bnorm; + } + } + temp = *scale / smini; + x[x_dim1 + 1] = temp * b[b_dim1 + 1]; + x[x_dim1 + 2] = temp * b[b_dim1 + 2]; + *xnorm = temp * bnorm; + *info = 1; + return 0; + } + ur11 = crv[icmax - 1]; + cr21 = crv[ipivot[(icmax << 2) - 3] - 1]; + ur12 = crv[ipivot[(icmax << 2) - 2] - 1]; + cr22 = crv[ipivot[(icmax << 2) - 1] - 1]; + ur11r = 1. / ur11; + lr21 = ur11r * cr21; + ur22 = cr22 - ur12 * lr21; + if (abs(ur22) < smini) { + ur22 = smini; + *info = 1; + } + if (rswap[icmax - 1]) { + br1 = b[b_dim1 + 2]; + br2 = b[b_dim1 + 1]; + } else { + br1 = b[b_dim1 + 1]; + br2 = b[b_dim1 + 2]; + } + br2 -= lr21 * br1; + d__2 = (d__1 = br1 * (ur22 * ur11r), abs(d__1)), d__3 = abs(br2); + bbnd = max(d__2, d__3); + if (bbnd > 1. && abs(ur22) < 1.) { + if (bbnd >= bignum * abs(ur22)) { + *scale = 1. / bbnd; + } + } + xr2 = br2 * *scale / ur22; + xr1 = *scale * br1 * ur11r - xr2 * (ur11r * ur12); + if (zswap[icmax - 1]) { + x[x_dim1 + 1] = xr2; + x[x_dim1 + 2] = xr1; + } else { + x[x_dim1 + 1] = xr1; + x[x_dim1 + 2] = xr2; + } + d__1 = abs(xr1), d__2 = abs(xr2); + *xnorm = max(d__1, d__2); + if (*xnorm > 1. && cmax > 1.) { + if (*xnorm > bignum / cmax) { + temp = cmax / bignum; + x[x_dim1 + 1] = temp * x[x_dim1 + 1]; + x[x_dim1 + 2] = temp * x[x_dim1 + 2]; + *xnorm = temp * *xnorm; + *scale = temp * *scale; + } + } + } else { + ci[0] = -(*wi) * *d1; + ci[1] = 0.; + ci[2] = 0.; + ci[3] = -(*wi) * *d2; + cmax = 0.; + icmax = 0; + for (j = 1; j <= 4; ++j) { + if ((d__1 = crv[j - 1], abs(d__1)) + (d__2 = civ[j - 1], abs(d__2)) > cmax) { + cmax = (d__1 = crv[j - 1], abs(d__1)) + (d__2 = civ[j - 1], abs(d__2)); + icmax = j; + } + } + if (cmax < smini) { + d__5 = (d__1 = b[b_dim1 + 1], abs(d__1)) + (d__2 = b[(b_dim1 << 1) + 1], abs(d__2)), + d__6 = (d__3 = b[b_dim1 + 2], abs(d__3)) + (d__4 = b[(b_dim1 << 1) + 2], abs(d__4)); + bnorm = max(d__5, d__6); + if (smini < 1. && bnorm > 1.) { + if (bnorm > bignum * smini) { + *scale = 1. / bnorm; + } + } + temp = *scale / smini; + x[x_dim1 + 1] = temp * b[b_dim1 + 1]; + x[x_dim1 + 2] = temp * b[b_dim1 + 2]; + x[(x_dim1 << 1) + 1] = temp * b[(b_dim1 << 1) + 1]; + x[(x_dim1 << 1) + 2] = temp * b[(b_dim1 << 1) + 2]; + *xnorm = temp * bnorm; + *info = 1; + return 0; + } + ur11 = crv[icmax - 1]; + ui11 = civ[icmax - 1]; + cr21 = crv[ipivot[(icmax << 2) - 3] - 1]; + ci21 = civ[ipivot[(icmax << 2) - 3] - 1]; + ur12 = crv[ipivot[(icmax << 2) - 2] - 1]; + ui12 = civ[ipivot[(icmax << 2) - 2] - 1]; + cr22 = crv[ipivot[(icmax << 2) - 1] - 1]; + ci22 = civ[ipivot[(icmax << 2) - 1] - 1]; + if (icmax == 1 || icmax == 4) { + if (abs(ur11) > abs(ui11)) { + temp = ui11 / ur11; + d__1 = temp; + ur11r = 1. / (ur11 * (d__1 * d__1 + 1.)); + ui11r = -temp * ur11r; + } else { + temp = ur11 / ui11; + d__1 = temp; + ui11r = -1. / (ui11 * (d__1 * d__1 + 1.)); + ur11r = -temp * ui11r; + } + lr21 = cr21 * ur11r; + li21 = cr21 * ui11r; + ur12s = ur12 * ur11r; + ui12s = ur12 * ui11r; + ur22 = cr22 - ur12 * lr21; + ui22 = ci22 - ur12 * li21; + } else { + ur11r = 1. / ur11; + ui11r = 0.; + lr21 = cr21 * ur11r; + li21 = ci21 * ur11r; + ur12s = ur12 * ur11r; + ui12s = ui12 * ur11r; + ur22 = cr22 - ur12 * lr21 + ui12 * li21; + ui22 = -ur12 * li21 - ui12 * lr21; + } + u22abs = abs(ur22) + abs(ui22); + if (u22abs < smini) { + ur22 = smini; + ui22 = 0.; + *info = 1; + } + if (rswap[icmax - 1]) { + br2 = b[b_dim1 + 1]; + br1 = b[b_dim1 + 2]; + bi2 = b[(b_dim1 << 1) + 1]; + bi1 = b[(b_dim1 << 1) + 2]; + } else { + br1 = b[b_dim1 + 1]; + br2 = b[b_dim1 + 2]; + bi1 = b[(b_dim1 << 1) + 1]; + bi2 = b[(b_dim1 << 1) + 2]; + } + br2 = br2 - lr21 * br1 + li21 * bi1; + bi2 = bi2 - li21 * br1 - lr21 * bi1; + d__1 = (abs(br1) + abs(bi1)) * (u22abs * (abs(ur11r) + abs(ui11r))), + d__2 = abs(br2) + abs(bi2); + bbnd = max(d__1, d__2); + if (bbnd > 1. && u22abs < 1.) { + if (bbnd >= bignum * u22abs) { + *scale = 1. / bbnd; + br1 = *scale * br1; + bi1 = *scale * bi1; + br2 = *scale * br2; + bi2 = *scale * bi2; + } + } + dladiv_(&br2, &bi2, &ur22, &ui22, &xr2, &xi2); + xr1 = ur11r * br1 - ui11r * bi1 - ur12s * xr2 + ui12s * xi2; + xi1 = ui11r * br1 + ur11r * bi1 - ui12s * xr2 - ur12s * xi2; + if (zswap[icmax - 1]) { + x[x_dim1 + 1] = xr2; + x[x_dim1 + 2] = xr1; + x[(x_dim1 << 1) + 1] = xi2; + x[(x_dim1 << 1) + 2] = xi1; + } else { + x[x_dim1 + 1] = xr1; + x[x_dim1 + 2] = xr2; + x[(x_dim1 << 1) + 1] = xi1; + x[(x_dim1 << 1) + 2] = xi2; + } + d__1 = abs(xr1) + abs(xi1), d__2 = abs(xr2) + abs(xi2); + *xnorm = max(d__1, d__2); + if (*xnorm > 1. && cmax > 1.) { + if (*xnorm > bignum / cmax) { + temp = cmax / bignum; + x[x_dim1 + 1] = temp * x[x_dim1 + 1]; + x[x_dim1 + 2] = temp * x[x_dim1 + 2]; + x[(x_dim1 << 1) + 1] = temp * x[(x_dim1 << 1) + 1]; + x[(x_dim1 << 1) + 2] = temp * x[(x_dim1 << 1) + 2]; + *xnorm = temp * *xnorm; + *scale = temp * *scale; + } + } + } + } + return 0; +} +#undef crv +#undef civ +#undef cr +#undef ci +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlanv2.cpp b/lib/linalg/dlanv2.cpp new file mode 100644 index 0000000000..29a511bf31 --- /dev/null +++ b/lib/linalg/dlanv2.cpp @@ -0,0 +1,106 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublereal c_b3 = 1.; +int dlanv2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, doublereal *rt1r, + doublereal *rt1i, doublereal *rt2r, doublereal *rt2i, doublereal *cs, doublereal *sn) +{ + doublereal d__1, d__2; + double d_lmp_sign(doublereal *, doublereal *), sqrt(doublereal); + doublereal p, z__, aa, bb, cc, dd, cs1, sn1, sab, sac, eps, tau, temp, scale, bcmax, bcmis, + sigma; + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, ftnlen); + eps = dlamch_((char *)"P", (ftnlen)1); + if (*c__ == 0.) { + *cs = 1.; + *sn = 0.; + } else if (*b == 0.) { + *cs = 0.; + *sn = 1.; + temp = *d__; + *d__ = *a; + *a = temp; + *b = -(*c__); + *c__ = 0.; + } else if (*a - *d__ == 0. && d_lmp_sign(&c_b3, b) != d_lmp_sign(&c_b3, c__)) { + *cs = 1.; + *sn = 0.; + } else { + temp = *a - *d__; + p = temp * .5; + d__1 = abs(*b), d__2 = abs(*c__); + bcmax = max(d__1, d__2); + d__1 = abs(*b), d__2 = abs(*c__); + bcmis = min(d__1, d__2) * d_lmp_sign(&c_b3, b) * d_lmp_sign(&c_b3, c__); + d__1 = abs(p); + scale = max(d__1, bcmax); + z__ = p / scale * p + bcmax / scale * bcmis; + if (z__ >= eps * 4.) { + d__1 = sqrt(scale) * sqrt(z__); + z__ = p + d_lmp_sign(&d__1, &p); + *a = *d__ + z__; + *d__ -= bcmax / z__ * bcmis; + tau = dlapy2_(c__, &z__); + *cs = z__ / tau; + *sn = *c__ / tau; + *b -= *c__; + *c__ = 0.; + } else { + sigma = *b + *c__; + tau = dlapy2_(&sigma, &temp); + *cs = sqrt((abs(sigma) / tau + 1.) * .5); + *sn = -(p / (tau * *cs)) * d_lmp_sign(&c_b3, &sigma); + aa = *a * *cs + *b * *sn; + bb = -(*a) * *sn + *b * *cs; + cc = *c__ * *cs + *d__ * *sn; + dd = -(*c__) * *sn + *d__ * *cs; + *a = aa * *cs + cc * *sn; + *b = bb * *cs + dd * *sn; + *c__ = -aa * *sn + cc * *cs; + *d__ = -bb * *sn + dd * *cs; + temp = (*a + *d__) * .5; + *a = temp; + *d__ = temp; + if (*c__ != 0.) { + if (*b != 0.) { + if (d_lmp_sign(&c_b3, b) == d_lmp_sign(&c_b3, c__)) { + sab = sqrt((abs(*b))); + sac = sqrt((abs(*c__))); + d__1 = sab * sac; + p = d_lmp_sign(&d__1, c__); + tau = 1. / sqrt((d__1 = *b + *c__, abs(d__1))); + *a = temp + p; + *d__ = temp - p; + *b -= *c__; + *c__ = 0.; + cs1 = sab * tau; + sn1 = sac * tau; + temp = *cs * cs1 - *sn * sn1; + *sn = *cs * sn1 + *sn * cs1; + *cs = temp; + } + } else { + *b = -(*c__); + *c__ = 0.; + temp = *cs; + *cs = -(*sn); + *sn = temp; + } + } + } + } + *rt1r = *a; + *rt2r = *d__; + if (*c__ == 0.) { + *rt1i = 0.; + *rt2i = 0.; + } else { + *rt1i = sqrt((abs(*b))) * sqrt((abs(*c__))); + *rt2i = -(*rt1i); + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlaqr0.cpp b/lib/linalg/dlaqr0.cpp new file mode 100644 index 0000000000..31a265c3e9 --- /dev/null +++ b/lib/linalg/dlaqr0.cpp @@ -0,0 +1,306 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__13 = 13; +static integer c__15 = 15; +static integer c_n1 = -1; +static integer c__12 = 12; +static integer c__14 = 14; +static integer c__16 = 16; +static logical c_false = FALSE_; +static integer c__1 = 1; +static integer c__3 = 3; +int dlaqr0_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublereal *h__, + integer *ldh, doublereal *wr, doublereal *wi, integer *iloz, integer *ihiz, + doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info) +{ + integer h_dim1, h_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5; + doublereal d__1, d__2, d__3, d__4; + integer i__, k; + doublereal aa, bb, cc, dd; + integer ld; + doublereal cs; + integer nh, it, ks, kt; + doublereal sn; + integer ku, kv, ls, ns; + doublereal ss; + integer nw, inf, kdu, nho, nve, kwh, nsr, nwr, kwv, ndec, ndfl, kbot, nmin; + doublereal swap; + integer ktop; + doublereal zdum[1]; + integer kacc22, itmax, nsmax, nwmax, kwtop; + extern int dlanv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), + dlaqr3_(logical *, logical *, integer *, integer *, integer *, integer *, doublereal *, + integer *, integer *, integer *, doublereal *, integer *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, doublereal *, integer *, doublereal *, integer *), + dlaqr4_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, + doublereal *, integer *, integer *), + dlaqr5_(logical *, logical *, integer *, integer *, integer *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, doublereal *, integer *); + integer nibble; + extern int dlahqr_(logical *, logical *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + char jbcmpz[2]; + integer nwupbd; + logical sorted; + integer lwkopt; + h_dim1 = *ldh; + h_offset = 1 + h_dim1; + h__ -= h_offset; + --wr; + --wi; + z_dim1 = *ldz; + z_offset = 1 + z_dim1; + z__ -= z_offset; + --work; + *info = 0; + if (*n == 0) { + work[1] = 1.; + return 0; + } + if (*n <= 11) { + lwkopt = 1; + if (*lwork != -1) { + dlahqr_(wantt, wantz, n, ilo, ihi, &h__[h_offset], ldh, &wr[1], &wi[1], iloz, ihiz, + &z__[z_offset], ldz, info); + } + } else { + *info = 0; + if (*wantt) { + *(unsigned char *)jbcmpz = 'S'; + } else { + *(unsigned char *)jbcmpz = 'E'; + } + if (*wantz) { + *(unsigned char *)&jbcmpz[1] = 'V'; + } else { + *(unsigned char *)&jbcmpz[1] = 'N'; + } + nwr = ilaenv_(&c__13, (char *)"DLAQR0", jbcmpz, n, ilo, ihi, lwork, (ftnlen)6, (ftnlen)2); + nwr = max(2, nwr); + i__1 = *ihi - *ilo + 1, i__2 = (*n - 1) / 3, i__1 = min(i__1, i__2); + nwr = min(i__1, nwr); + nsr = ilaenv_(&c__15, (char *)"DLAQR0", jbcmpz, n, ilo, ihi, lwork, (ftnlen)6, (ftnlen)2); + i__1 = nsr, i__2 = (*n + 6) / 9, i__1 = min(i__1, i__2), i__2 = *ihi - *ilo; + nsr = min(i__1, i__2); + i__1 = 2, i__2 = nsr - nsr % 2; + nsr = max(i__1, i__2); + i__1 = nwr + 1; + dlaqr3_(wantt, wantz, n, ilo, ihi, &i__1, &h__[h_offset], ldh, iloz, ihiz, &z__[z_offset], + ldz, &ls, &ld, &wr[1], &wi[1], &h__[h_offset], ldh, n, &h__[h_offset], ldh, n, + &h__[h_offset], ldh, &work[1], &c_n1); + i__1 = nsr * 3 / 2, i__2 = (integer)work[1]; + lwkopt = max(i__1, i__2); + if (*lwork == -1) { + work[1] = (doublereal)lwkopt; + return 0; + } + nmin = ilaenv_(&c__12, (char *)"DLAQR0", jbcmpz, n, ilo, ihi, lwork, (ftnlen)6, (ftnlen)2); + nmin = max(11, nmin); + nibble = ilaenv_(&c__14, (char *)"DLAQR0", jbcmpz, n, ilo, ihi, lwork, (ftnlen)6, (ftnlen)2); + nibble = max(0, nibble); + kacc22 = ilaenv_(&c__16, (char *)"DLAQR0", jbcmpz, n, ilo, ihi, lwork, (ftnlen)6, (ftnlen)2); + kacc22 = max(0, kacc22); + kacc22 = min(2, kacc22); + i__1 = (*n - 1) / 3, i__2 = *lwork / 2; + nwmax = min(i__1, i__2); + nw = nwmax; + i__1 = (*n + 6) / 9, i__2 = (*lwork << 1) / 3; + nsmax = min(i__1, i__2); + nsmax -= nsmax % 2; + ndfl = 1; + i__1 = 10, i__2 = *ihi - *ilo + 1; + itmax = max(i__1, i__2) * 30; + kbot = *ihi; + i__1 = itmax; + for (it = 1; it <= i__1; ++it) { + if (kbot < *ilo) { + goto L90; + } + i__2 = *ilo + 1; + for (k = kbot; k >= i__2; --k) { + if (h__[k + (k - 1) * h_dim1] == 0.) { + goto L20; + } + } + k = *ilo; + L20: + ktop = k; + nh = kbot - ktop + 1; + nwupbd = min(nh, nwmax); + if (ndfl < 5) { + nw = min(nwupbd, nwr); + } else { + i__2 = nwupbd, i__3 = nw << 1; + nw = min(i__2, i__3); + } + if (nw < nwmax) { + if (nw >= nh - 1) { + nw = nh; + } else { + kwtop = kbot - nw + 1; + if ((d__1 = h__[kwtop + (kwtop - 1) * h_dim1], abs(d__1)) > + (d__2 = h__[kwtop - 1 + (kwtop - 2) * h_dim1], abs(d__2))) { + ++nw; + } + } + } + if (ndfl < 5) { + ndec = -1; + } else if (ndec >= 0 || nw >= nwupbd) { + ++ndec; + if (nw - ndec < 2) { + ndec = 0; + } + nw -= ndec; + } + kv = *n - nw + 1; + kt = nw + 1; + nho = *n - nw - 1 - kt + 1; + kwv = nw + 2; + nve = *n - nw - kwv + 1; + dlaqr3_(wantt, wantz, n, &ktop, &kbot, &nw, &h__[h_offset], ldh, iloz, ihiz, + &z__[z_offset], ldz, &ls, &ld, &wr[1], &wi[1], &h__[kv + h_dim1], ldh, &nho, + &h__[kv + kt * h_dim1], ldh, &nve, &h__[kwv + h_dim1], ldh, &work[1], lwork); + kbot -= ld; + ks = kbot - ls + 1; + if (ld == 0 || ld * 100 <= nw * nibble && kbot - ktop + 1 > min(nmin, nwmax)) { + i__4 = 2, i__5 = kbot - ktop; + i__2 = min(nsmax, nsr), i__3 = max(i__4, i__5); + ns = min(i__2, i__3); + ns -= ns % 2; + if (ndfl % 6 == 0) { + ks = kbot - ns + 1; + i__3 = ks + 1, i__4 = ktop + 2; + i__2 = max(i__3, i__4); + for (i__ = kbot; i__ >= i__2; i__ += -2) { + ss = (d__1 = h__[i__ + (i__ - 1) * h_dim1], abs(d__1)) + + (d__2 = h__[i__ - 1 + (i__ - 2) * h_dim1], abs(d__2)); + aa = ss * .75 + h__[i__ + i__ * h_dim1]; + bb = ss; + cc = ss * -.4375; + dd = aa; + dlanv2_(&aa, &bb, &cc, &dd, &wr[i__ - 1], &wi[i__ - 1], &wr[i__], &wi[i__], + &cs, &sn); + } + if (ks == ktop) { + wr[ks + 1] = h__[ks + 1 + (ks + 1) * h_dim1]; + wi[ks + 1] = 0.; + wr[ks] = wr[ks + 1]; + wi[ks] = wi[ks + 1]; + } + } else { + if (kbot - ks + 1 <= ns / 2) { + ks = kbot - ns + 1; + kt = *n - ns + 1; + dlacpy_((char *)"A", &ns, &ns, &h__[ks + ks * h_dim1], ldh, &h__[kt + h_dim1], ldh, + (ftnlen)1); + if (ns > nmin) { + dlaqr4_(&c_false, &c_false, &ns, &c__1, &ns, &h__[kt + h_dim1], ldh, + &wr[ks], &wi[ks], &c__1, &c__1, zdum, &c__1, &work[1], lwork, + &inf); + } else { + dlahqr_(&c_false, &c_false, &ns, &c__1, &ns, &h__[kt + h_dim1], ldh, + &wr[ks], &wi[ks], &c__1, &c__1, zdum, &c__1, &inf); + } + ks += inf; + if (ks >= kbot) { + aa = h__[kbot - 1 + (kbot - 1) * h_dim1]; + cc = h__[kbot + (kbot - 1) * h_dim1]; + bb = h__[kbot - 1 + kbot * h_dim1]; + dd = h__[kbot + kbot * h_dim1]; + dlanv2_(&aa, &bb, &cc, &dd, &wr[kbot - 1], &wi[kbot - 1], &wr[kbot], + &wi[kbot], &cs, &sn); + ks = kbot - 1; + } + } + if (kbot - ks + 1 > ns) { + sorted = FALSE_; + i__2 = ks + 1; + for (k = kbot; k >= i__2; --k) { + if (sorted) { + goto L60; + } + sorted = TRUE_; + i__3 = k - 1; + for (i__ = ks; i__ <= i__3; ++i__) { + if ((d__1 = wr[i__], abs(d__1)) + (d__2 = wi[i__], abs(d__2)) < + (d__3 = wr[i__ + 1], abs(d__3)) + + (d__4 = wi[i__ + 1], abs(d__4))) { + sorted = FALSE_; + swap = wr[i__]; + wr[i__] = wr[i__ + 1]; + wr[i__ + 1] = swap; + swap = wi[i__]; + wi[i__] = wi[i__ + 1]; + wi[i__ + 1] = swap; + } + } + } + L60:; + } + i__2 = ks + 2; + for (i__ = kbot; i__ >= i__2; i__ += -2) { + if (wi[i__] != -wi[i__ - 1]) { + swap = wr[i__]; + wr[i__] = wr[i__ - 1]; + wr[i__ - 1] = wr[i__ - 2]; + wr[i__ - 2] = swap; + swap = wi[i__]; + wi[i__] = wi[i__ - 1]; + wi[i__ - 1] = wi[i__ - 2]; + wi[i__ - 2] = swap; + } + } + } + if (kbot - ks + 1 == 2) { + if (wi[kbot] == 0.) { + if ((d__1 = wr[kbot] - h__[kbot + kbot * h_dim1], abs(d__1)) < + (d__2 = wr[kbot - 1] - h__[kbot + kbot * h_dim1], abs(d__2))) { + wr[kbot - 1] = wr[kbot]; + } else { + wr[kbot] = wr[kbot - 1]; + } + } + } + i__2 = ns, i__3 = kbot - ks + 1; + ns = min(i__2, i__3); + ns -= ns % 2; + ks = kbot - ns + 1; + kdu = ns * 3 - 3; + ku = *n - kdu + 1; + kwh = kdu + 1; + nho = *n - kdu - 3 - (kdu + 1) + 1; + kwv = kdu + 4; + nve = *n - kdu - kwv + 1; + dlaqr5_(wantt, wantz, &kacc22, n, &ktop, &kbot, &ns, &wr[ks], &wi[ks], + &h__[h_offset], ldh, iloz, ihiz, &z__[z_offset], ldz, &work[1], &c__3, + &h__[ku + h_dim1], ldh, &nve, &h__[kwv + h_dim1], ldh, &nho, + &h__[ku + kwh * h_dim1], ldh); + } + if (ld > 0) { + ndfl = 1; + } else { + ++ndfl; + } + } + *info = kbot; + L90:; + } + work[1] = (doublereal)lwkopt; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlaqr1.cpp b/lib/linalg/dlaqr1.cpp new file mode 100644 index 0000000000..292dce0f45 --- /dev/null +++ b/lib/linalg/dlaqr1.cpp @@ -0,0 +1,52 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int dlaqr1_(integer *n, doublereal *h__, integer *ldh, doublereal *sr1, doublereal *si1, + doublereal *sr2, doublereal *si2, doublereal *v) +{ + integer h_dim1, h_offset; + doublereal d__1, d__2, d__3; + doublereal s, h21s, h31s; + h_dim1 = *ldh; + h_offset = 1 + h_dim1; + h__ -= h_offset; + --v; + if (*n != 2 && *n != 3) { + return 0; + } + if (*n == 2) { + s = (d__1 = h__[h_dim1 + 1] - *sr2, abs(d__1)) + abs(*si2) + + (d__2 = h__[h_dim1 + 2], abs(d__2)); + if (s == 0.) { + v[1] = 0.; + v[2] = 0.; + } else { + h21s = h__[h_dim1 + 2] / s; + v[1] = h21s * h__[(h_dim1 << 1) + 1] + + (h__[h_dim1 + 1] - *sr1) * ((h__[h_dim1 + 1] - *sr2) / s) - *si1 * (*si2 / s); + v[2] = h21s * (h__[h_dim1 + 1] + h__[(h_dim1 << 1) + 2] - *sr1 - *sr2); + } + } else { + s = (d__1 = h__[h_dim1 + 1] - *sr2, abs(d__1)) + abs(*si2) + + (d__2 = h__[h_dim1 + 2], abs(d__2)) + (d__3 = h__[h_dim1 + 3], abs(d__3)); + if (s == 0.) { + v[1] = 0.; + v[2] = 0.; + v[3] = 0.; + } else { + h21s = h__[h_dim1 + 2] / s; + h31s = h__[h_dim1 + 3] / s; + v[1] = (h__[h_dim1 + 1] - *sr1) * ((h__[h_dim1 + 1] - *sr2) / s) - *si1 * (*si2 / s) + + h__[(h_dim1 << 1) + 1] * h21s + h__[h_dim1 * 3 + 1] * h31s; + v[2] = h21s * (h__[h_dim1 + 1] + h__[(h_dim1 << 1) + 2] - *sr1 - *sr2) + + h__[h_dim1 * 3 + 2] * h31s; + v[3] = h31s * (h__[h_dim1 + 1] + h__[h_dim1 * 3 + 3] - *sr1 - *sr2) + + h21s * h__[(h_dim1 << 1) + 3]; + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlaqr2.cpp b/lib/linalg/dlaqr2.cpp new file mode 100644 index 0000000000..102433a90d --- /dev/null +++ b/lib/linalg/dlaqr2.cpp @@ -0,0 +1,359 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c_n1 = -1; +static doublereal c_b12 = 0.; +static doublereal c_b13 = 1.; +static logical c_true = TRUE_; +int dlaqr2_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, + doublereal *h__, integer *ldh, integer *iloz, integer *ihiz, doublereal *z__, + integer *ldz, integer *ns, integer *nd, doublereal *sr, doublereal *si, doublereal *v, + integer *ldv, integer *nh, doublereal *t, integer *ldt, integer *nv, doublereal *wv, + integer *ldwv, doublereal *work, integer *lwork) +{ + integer h_dim1, h_offset, t_dim1, t_offset, v_dim1, v_offset, wv_dim1, wv_offset, z_dim1, + z_offset, i__1, i__2, i__3, i__4; + doublereal d__1, d__2, d__3, d__4, d__5, d__6; + double sqrt(doublereal); + integer i__, j, k; + doublereal s, aa, bb, cc, dd, cs, sn; + integer jw; + doublereal evi, evk, foo; + integer kln; + doublereal tau, ulp; + integer lwk1, lwk2; + doublereal beta; + integer kend, kcol, info, ifst, ilst, ltop, krow; + extern int dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, ftnlen), + dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen); + logical bulge; + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); + integer infqr, kwtop; + extern int dlanv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), + dlabad_(doublereal *, doublereal *); + extern doublereal dlamch_(char *, ftnlen); + extern int dgehrd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *), + dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), + dlahqr_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, + integer *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen); + doublereal safmin; + extern int dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, + integer *, ftnlen); + doublereal safmax; + extern int dtrexc_(char *, integer *, doublereal *, integer *, doublereal *, integer *, + integer *, integer *, doublereal *, integer *, ftnlen), + dormhr_(char *, char *, integer *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, ftnlen, + ftnlen); + logical sorted; + doublereal smlnum; + integer lwkopt; + h_dim1 = *ldh; + h_offset = 1 + h_dim1; + h__ -= h_offset; + z_dim1 = *ldz; + z_offset = 1 + z_dim1; + z__ -= z_offset; + --sr; + --si; + v_dim1 = *ldv; + v_offset = 1 + v_dim1; + v -= v_offset; + t_dim1 = *ldt; + t_offset = 1 + t_dim1; + t -= t_offset; + wv_dim1 = *ldwv; + wv_offset = 1 + wv_dim1; + wv -= wv_offset; + --work; + i__1 = *nw, i__2 = *kbot - *ktop + 1; + jw = min(i__1, i__2); + if (jw <= 2) { + lwkopt = 1; + } else { + i__1 = jw - 1; + dgehrd_(&jw, &c__1, &i__1, &t[t_offset], ldt, &work[1], &work[1], &c_n1, &info); + lwk1 = (integer)work[1]; + i__1 = jw - 1; + dormhr_((char *)"R", (char *)"N", &jw, &jw, &c__1, &i__1, &t[t_offset], ldt, &work[1], &v[v_offset], ldv, + &work[1], &c_n1, &info, (ftnlen)1, (ftnlen)1); + lwk2 = (integer)work[1]; + lwkopt = jw + max(lwk1, lwk2); + } + if (*lwork == -1) { + work[1] = (doublereal)lwkopt; + return 0; + } + *ns = 0; + *nd = 0; + work[1] = 1.; + if (*ktop > *kbot) { + return 0; + } + if (*nw < 1) { + return 0; + } + safmin = dlamch_((char *)"SAFE MINIMUM", (ftnlen)12); + safmax = 1. / safmin; + dlabad_(&safmin, &safmax); + ulp = dlamch_((char *)"PRECISION", (ftnlen)9); + smlnum = safmin * ((doublereal)(*n) / ulp); + i__1 = *nw, i__2 = *kbot - *ktop + 1; + jw = min(i__1, i__2); + kwtop = *kbot - jw + 1; + if (kwtop == *ktop) { + s = 0.; + } else { + s = h__[kwtop + (kwtop - 1) * h_dim1]; + } + if (*kbot == kwtop) { + sr[kwtop] = h__[kwtop + kwtop * h_dim1]; + si[kwtop] = 0.; + *ns = 1; + *nd = 0; + d__2 = smlnum, d__3 = ulp * (d__1 = h__[kwtop + kwtop * h_dim1], abs(d__1)); + if (abs(s) <= max(d__2, d__3)) { + *ns = 0; + *nd = 1; + if (kwtop > *ktop) { + h__[kwtop + (kwtop - 1) * h_dim1] = 0.; + } + } + work[1] = 1.; + return 0; + } + dlacpy_((char *)"U", &jw, &jw, &h__[kwtop + kwtop * h_dim1], ldh, &t[t_offset], ldt, (ftnlen)1); + i__1 = jw - 1; + i__2 = *ldh + 1; + i__3 = *ldt + 1; + dcopy_(&i__1, &h__[kwtop + 1 + kwtop * h_dim1], &i__2, &t[t_dim1 + 2], &i__3); + dlaset_((char *)"A", &jw, &jw, &c_b12, &c_b13, &v[v_offset], ldv, (ftnlen)1); + dlahqr_(&c_true, &c_true, &jw, &c__1, &jw, &t[t_offset], ldt, &sr[kwtop], &si[kwtop], &c__1, + &jw, &v[v_offset], ldv, &infqr); + i__1 = jw - 3; + for (j = 1; j <= i__1; ++j) { + t[j + 2 + j * t_dim1] = 0.; + t[j + 3 + j * t_dim1] = 0.; + } + if (jw > 2) { + t[jw + (jw - 2) * t_dim1] = 0.; + } + *ns = jw; + ilst = infqr + 1; +L20: + if (ilst <= *ns) { + if (*ns == 1) { + bulge = FALSE_; + } else { + bulge = t[*ns + (*ns - 1) * t_dim1] != 0.; + } + if (!bulge) { + foo = (d__1 = t[*ns + *ns * t_dim1], abs(d__1)); + if (foo == 0.) { + foo = abs(s); + } + d__2 = smlnum, d__3 = ulp * foo; + if ((d__1 = s * v[*ns * v_dim1 + 1], abs(d__1)) <= max(d__2, d__3)) { + --(*ns); + } else { + ifst = *ns; + dtrexc_((char *)"V", &jw, &t[t_offset], ldt, &v[v_offset], ldv, &ifst, &ilst, &work[1], + &info, (ftnlen)1); + ++ilst; + } + } else { + foo = (d__3 = t[*ns + *ns * t_dim1], abs(d__3)) + + sqrt((d__1 = t[*ns + (*ns - 1) * t_dim1], abs(d__1))) * + sqrt((d__2 = t[*ns - 1 + *ns * t_dim1], abs(d__2))); + if (foo == 0.) { + foo = abs(s); + } + d__3 = (d__1 = s * v[*ns * v_dim1 + 1], abs(d__1)), + d__4 = (d__2 = s * v[(*ns - 1) * v_dim1 + 1], abs(d__2)); + d__5 = smlnum, d__6 = ulp * foo; + if (max(d__3, d__4) <= max(d__5, d__6)) { + *ns += -2; + } else { + ifst = *ns; + dtrexc_((char *)"V", &jw, &t[t_offset], ldt, &v[v_offset], ldv, &ifst, &ilst, &work[1], + &info, (ftnlen)1); + ilst += 2; + } + } + goto L20; + } + if (*ns == 0) { + s = 0.; + } + if (*ns < jw) { + sorted = FALSE_; + i__ = *ns + 1; + L30: + if (sorted) { + goto L50; + } + sorted = TRUE_; + kend = i__ - 1; + i__ = infqr + 1; + if (i__ == *ns) { + k = i__ + 1; + } else if (t[i__ + 1 + i__ * t_dim1] == 0.) { + k = i__ + 1; + } else { + k = i__ + 2; + } + L40: + if (k <= kend) { + if (k == i__ + 1) { + evi = (d__1 = t[i__ + i__ * t_dim1], abs(d__1)); + } else { + evi = (d__3 = t[i__ + i__ * t_dim1], abs(d__3)) + + sqrt((d__1 = t[i__ + 1 + i__ * t_dim1], abs(d__1))) * + sqrt((d__2 = t[i__ + (i__ + 1) * t_dim1], abs(d__2))); + } + if (k == kend) { + evk = (d__1 = t[k + k * t_dim1], abs(d__1)); + } else if (t[k + 1 + k * t_dim1] == 0.) { + evk = (d__1 = t[k + k * t_dim1], abs(d__1)); + } else { + evk = (d__3 = t[k + k * t_dim1], abs(d__3)) + + sqrt((d__1 = t[k + 1 + k * t_dim1], abs(d__1))) * + sqrt((d__2 = t[k + (k + 1) * t_dim1], abs(d__2))); + } + if (evi >= evk) { + i__ = k; + } else { + sorted = FALSE_; + ifst = i__; + ilst = k; + dtrexc_((char *)"V", &jw, &t[t_offset], ldt, &v[v_offset], ldv, &ifst, &ilst, &work[1], + &info, (ftnlen)1); + if (info == 0) { + i__ = ilst; + } else { + i__ = k; + } + } + if (i__ == kend) { + k = i__ + 1; + } else if (t[i__ + 1 + i__ * t_dim1] == 0.) { + k = i__ + 1; + } else { + k = i__ + 2; + } + goto L40; + } + goto L30; + L50:; + } + i__ = jw; +L60: + if (i__ >= infqr + 1) { + if (i__ == infqr + 1) { + sr[kwtop + i__ - 1] = t[i__ + i__ * t_dim1]; + si[kwtop + i__ - 1] = 0.; + --i__; + } else if (t[i__ + (i__ - 1) * t_dim1] == 0.) { + sr[kwtop + i__ - 1] = t[i__ + i__ * t_dim1]; + si[kwtop + i__ - 1] = 0.; + --i__; + } else { + aa = t[i__ - 1 + (i__ - 1) * t_dim1]; + cc = t[i__ + (i__ - 1) * t_dim1]; + bb = t[i__ - 1 + i__ * t_dim1]; + dd = t[i__ + i__ * t_dim1]; + dlanv2_(&aa, &bb, &cc, &dd, &sr[kwtop + i__ - 2], &si[kwtop + i__ - 2], + &sr[kwtop + i__ - 1], &si[kwtop + i__ - 1], &cs, &sn); + i__ += -2; + } + goto L60; + } + if (*ns < jw || s == 0.) { + if (*ns > 1 && s != 0.) { + dcopy_(ns, &v[v_offset], ldv, &work[1], &c__1); + beta = work[1]; + dlarfg_(ns, &beta, &work[2], &c__1, &tau); + work[1] = 1.; + i__1 = jw - 2; + i__2 = jw - 2; + dlaset_((char *)"L", &i__1, &i__2, &c_b12, &c_b12, &t[t_dim1 + 3], ldt, (ftnlen)1); + dlarf_((char *)"L", ns, &jw, &work[1], &c__1, &tau, &t[t_offset], ldt, &work[jw + 1], + (ftnlen)1); + dlarf_((char *)"R", ns, ns, &work[1], &c__1, &tau, &t[t_offset], ldt, &work[jw + 1], (ftnlen)1); + dlarf_((char *)"R", &jw, ns, &work[1], &c__1, &tau, &v[v_offset], ldv, &work[jw + 1], + (ftnlen)1); + i__1 = *lwork - jw; + dgehrd_(&jw, &c__1, ns, &t[t_offset], ldt, &work[1], &work[jw + 1], &i__1, &info); + } + if (kwtop > 1) { + h__[kwtop + (kwtop - 1) * h_dim1] = s * v[v_dim1 + 1]; + } + dlacpy_((char *)"U", &jw, &jw, &t[t_offset], ldt, &h__[kwtop + kwtop * h_dim1], ldh, (ftnlen)1); + i__1 = jw - 1; + i__2 = *ldt + 1; + i__3 = *ldh + 1; + dcopy_(&i__1, &t[t_dim1 + 2], &i__2, &h__[kwtop + 1 + kwtop * h_dim1], &i__3); + if (*ns > 1 && s != 0.) { + i__1 = *lwork - jw; + dormhr_((char *)"R", (char *)"N", &jw, ns, &c__1, ns, &t[t_offset], ldt, &work[1], &v[v_offset], ldv, + &work[jw + 1], &i__1, &info, (ftnlen)1, (ftnlen)1); + } + if (*wantt) { + ltop = 1; + } else { + ltop = *ktop; + } + i__1 = kwtop - 1; + i__2 = *nv; + for (krow = ltop; i__2 < 0 ? krow >= i__1 : krow <= i__1; krow += i__2) { + i__3 = *nv, i__4 = kwtop - krow; + kln = min(i__3, i__4); + dgemm_((char *)"N", (char *)"N", &kln, &jw, &jw, &c_b13, &h__[krow + kwtop * h_dim1], ldh, &v[v_offset], + ldv, &c_b12, &wv[wv_offset], ldwv, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"A", &kln, &jw, &wv[wv_offset], ldwv, &h__[krow + kwtop * h_dim1], ldh, + (ftnlen)1); + } + if (*wantt) { + i__2 = *n; + i__1 = *nh; + for (kcol = *kbot + 1; i__1 < 0 ? kcol >= i__2 : kcol <= i__2; kcol += i__1) { + i__3 = *nh, i__4 = *n - kcol + 1; + kln = min(i__3, i__4); + dgemm_((char *)"C", (char *)"N", &jw, &kln, &jw, &c_b13, &v[v_offset], ldv, + &h__[kwtop + kcol * h_dim1], ldh, &c_b12, &t[t_offset], ldt, (ftnlen)1, + (ftnlen)1); + dlacpy_((char *)"A", &jw, &kln, &t[t_offset], ldt, &h__[kwtop + kcol * h_dim1], ldh, + (ftnlen)1); + } + } + if (*wantz) { + i__1 = *ihiz; + i__2 = *nv; + for (krow = *iloz; i__2 < 0 ? krow >= i__1 : krow <= i__1; krow += i__2) { + i__3 = *nv, i__4 = *ihiz - krow + 1; + kln = min(i__3, i__4); + dgemm_((char *)"N", (char *)"N", &kln, &jw, &jw, &c_b13, &z__[krow + kwtop * z_dim1], ldz, + &v[v_offset], ldv, &c_b12, &wv[wv_offset], ldwv, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"A", &kln, &jw, &wv[wv_offset], ldwv, &z__[krow + kwtop * z_dim1], ldz, + (ftnlen)1); + } + } + } + *nd = jw - *ns; + *ns -= infqr; + work[1] = (doublereal)lwkopt; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlaqr3.cpp b/lib/linalg/dlaqr3.cpp new file mode 100644 index 0000000000..5711a3e349 --- /dev/null +++ b/lib/linalg/dlaqr3.cpp @@ -0,0 +1,375 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c_n1 = -1; +static logical c_true = TRUE_; +static doublereal c_b17 = 0.; +static doublereal c_b18 = 1.; +static integer c__12 = 12; +int dlaqr3_(logical *wantt, logical *wantz, integer *n, integer *ktop, integer *kbot, integer *nw, + doublereal *h__, integer *ldh, integer *iloz, integer *ihiz, doublereal *z__, + integer *ldz, integer *ns, integer *nd, doublereal *sr, doublereal *si, doublereal *v, + integer *ldv, integer *nh, doublereal *t, integer *ldt, integer *nv, doublereal *wv, + integer *ldwv, doublereal *work, integer *lwork) +{ + integer h_dim1, h_offset, t_dim1, t_offset, v_dim1, v_offset, wv_dim1, wv_offset, z_dim1, + z_offset, i__1, i__2, i__3, i__4; + doublereal d__1, d__2, d__3, d__4, d__5, d__6; + double sqrt(doublereal); + integer i__, j, k; + doublereal s, aa, bb, cc, dd, cs, sn; + integer jw; + doublereal evi, evk, foo; + integer kln; + doublereal tau, ulp; + integer lwk1, lwk2, lwk3; + doublereal beta; + integer kend, kcol, info, nmin, ifst, ilst, ltop, krow; + extern int dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, ftnlen), + dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen); + logical bulge; + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); + integer infqr, kwtop; + extern int dlanv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), + dlaqr4_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, + doublereal *, integer *, integer *), + dlabad_(doublereal *, doublereal *); + extern doublereal dlamch_(char *, ftnlen); + extern int dgehrd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *), + dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), + dlahqr_(logical *, logical *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, + integer *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen); + doublereal safmin; + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + doublereal safmax; + extern int dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, + integer *, ftnlen), + dtrexc_(char *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, + integer *, doublereal *, integer *, ftnlen), + dormhr_(char *, char *, integer *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, ftnlen, + ftnlen); + logical sorted; + doublereal smlnum; + integer lwkopt; + h_dim1 = *ldh; + h_offset = 1 + h_dim1; + h__ -= h_offset; + z_dim1 = *ldz; + z_offset = 1 + z_dim1; + z__ -= z_offset; + --sr; + --si; + v_dim1 = *ldv; + v_offset = 1 + v_dim1; + v -= v_offset; + t_dim1 = *ldt; + t_offset = 1 + t_dim1; + t -= t_offset; + wv_dim1 = *ldwv; + wv_offset = 1 + wv_dim1; + wv -= wv_offset; + --work; + i__1 = *nw, i__2 = *kbot - *ktop + 1; + jw = min(i__1, i__2); + if (jw <= 2) { + lwkopt = 1; + } else { + i__1 = jw - 1; + dgehrd_(&jw, &c__1, &i__1, &t[t_offset], ldt, &work[1], &work[1], &c_n1, &info); + lwk1 = (integer)work[1]; + i__1 = jw - 1; + dormhr_((char *)"R", (char *)"N", &jw, &jw, &c__1, &i__1, &t[t_offset], ldt, &work[1], &v[v_offset], ldv, + &work[1], &c_n1, &info, (ftnlen)1, (ftnlen)1); + lwk2 = (integer)work[1]; + dlaqr4_(&c_true, &c_true, &jw, &c__1, &jw, &t[t_offset], ldt, &sr[1], &si[1], &c__1, &jw, + &v[v_offset], ldv, &work[1], &c_n1, &infqr); + lwk3 = (integer)work[1]; + i__1 = jw + max(lwk1, lwk2); + lwkopt = max(i__1, lwk3); + } + if (*lwork == -1) { + work[1] = (doublereal)lwkopt; + return 0; + } + *ns = 0; + *nd = 0; + work[1] = 1.; + if (*ktop > *kbot) { + return 0; + } + if (*nw < 1) { + return 0; + } + safmin = dlamch_((char *)"SAFE MINIMUM", (ftnlen)12); + safmax = 1. / safmin; + dlabad_(&safmin, &safmax); + ulp = dlamch_((char *)"PRECISION", (ftnlen)9); + smlnum = safmin * ((doublereal)(*n) / ulp); + i__1 = *nw, i__2 = *kbot - *ktop + 1; + jw = min(i__1, i__2); + kwtop = *kbot - jw + 1; + if (kwtop == *ktop) { + s = 0.; + } else { + s = h__[kwtop + (kwtop - 1) * h_dim1]; + } + if (*kbot == kwtop) { + sr[kwtop] = h__[kwtop + kwtop * h_dim1]; + si[kwtop] = 0.; + *ns = 1; + *nd = 0; + d__2 = smlnum, d__3 = ulp * (d__1 = h__[kwtop + kwtop * h_dim1], abs(d__1)); + if (abs(s) <= max(d__2, d__3)) { + *ns = 0; + *nd = 1; + if (kwtop > *ktop) { + h__[kwtop + (kwtop - 1) * h_dim1] = 0.; + } + } + work[1] = 1.; + return 0; + } + dlacpy_((char *)"U", &jw, &jw, &h__[kwtop + kwtop * h_dim1], ldh, &t[t_offset], ldt, (ftnlen)1); + i__1 = jw - 1; + i__2 = *ldh + 1; + i__3 = *ldt + 1; + dcopy_(&i__1, &h__[kwtop + 1 + kwtop * h_dim1], &i__2, &t[t_dim1 + 2], &i__3); + dlaset_((char *)"A", &jw, &jw, &c_b17, &c_b18, &v[v_offset], ldv, (ftnlen)1); + nmin = ilaenv_(&c__12, (char *)"DLAQR3", (char *)"SV", &jw, &c__1, &jw, lwork, (ftnlen)6, (ftnlen)2); + if (jw > nmin) { + dlaqr4_(&c_true, &c_true, &jw, &c__1, &jw, &t[t_offset], ldt, &sr[kwtop], &si[kwtop], &c__1, + &jw, &v[v_offset], ldv, &work[1], lwork, &infqr); + } else { + dlahqr_(&c_true, &c_true, &jw, &c__1, &jw, &t[t_offset], ldt, &sr[kwtop], &si[kwtop], &c__1, + &jw, &v[v_offset], ldv, &infqr); + } + i__1 = jw - 3; + for (j = 1; j <= i__1; ++j) { + t[j + 2 + j * t_dim1] = 0.; + t[j + 3 + j * t_dim1] = 0.; + } + if (jw > 2) { + t[jw + (jw - 2) * t_dim1] = 0.; + } + *ns = jw; + ilst = infqr + 1; +L20: + if (ilst <= *ns) { + if (*ns == 1) { + bulge = FALSE_; + } else { + bulge = t[*ns + (*ns - 1) * t_dim1] != 0.; + } + if (!bulge) { + foo = (d__1 = t[*ns + *ns * t_dim1], abs(d__1)); + if (foo == 0.) { + foo = abs(s); + } + d__2 = smlnum, d__3 = ulp * foo; + if ((d__1 = s * v[*ns * v_dim1 + 1], abs(d__1)) <= max(d__2, d__3)) { + --(*ns); + } else { + ifst = *ns; + dtrexc_((char *)"V", &jw, &t[t_offset], ldt, &v[v_offset], ldv, &ifst, &ilst, &work[1], + &info, (ftnlen)1); + ++ilst; + } + } else { + foo = (d__3 = t[*ns + *ns * t_dim1], abs(d__3)) + + sqrt((d__1 = t[*ns + (*ns - 1) * t_dim1], abs(d__1))) * + sqrt((d__2 = t[*ns - 1 + *ns * t_dim1], abs(d__2))); + if (foo == 0.) { + foo = abs(s); + } + d__3 = (d__1 = s * v[*ns * v_dim1 + 1], abs(d__1)), + d__4 = (d__2 = s * v[(*ns - 1) * v_dim1 + 1], abs(d__2)); + d__5 = smlnum, d__6 = ulp * foo; + if (max(d__3, d__4) <= max(d__5, d__6)) { + *ns += -2; + } else { + ifst = *ns; + dtrexc_((char *)"V", &jw, &t[t_offset], ldt, &v[v_offset], ldv, &ifst, &ilst, &work[1], + &info, (ftnlen)1); + ilst += 2; + } + } + goto L20; + } + if (*ns == 0) { + s = 0.; + } + if (*ns < jw) { + sorted = FALSE_; + i__ = *ns + 1; + L30: + if (sorted) { + goto L50; + } + sorted = TRUE_; + kend = i__ - 1; + i__ = infqr + 1; + if (i__ == *ns) { + k = i__ + 1; + } else if (t[i__ + 1 + i__ * t_dim1] == 0.) { + k = i__ + 1; + } else { + k = i__ + 2; + } + L40: + if (k <= kend) { + if (k == i__ + 1) { + evi = (d__1 = t[i__ + i__ * t_dim1], abs(d__1)); + } else { + evi = (d__3 = t[i__ + i__ * t_dim1], abs(d__3)) + + sqrt((d__1 = t[i__ + 1 + i__ * t_dim1], abs(d__1))) * + sqrt((d__2 = t[i__ + (i__ + 1) * t_dim1], abs(d__2))); + } + if (k == kend) { + evk = (d__1 = t[k + k * t_dim1], abs(d__1)); + } else if (t[k + 1 + k * t_dim1] == 0.) { + evk = (d__1 = t[k + k * t_dim1], abs(d__1)); + } else { + evk = (d__3 = t[k + k * t_dim1], abs(d__3)) + + sqrt((d__1 = t[k + 1 + k * t_dim1], abs(d__1))) * + sqrt((d__2 = t[k + (k + 1) * t_dim1], abs(d__2))); + } + if (evi >= evk) { + i__ = k; + } else { + sorted = FALSE_; + ifst = i__; + ilst = k; + dtrexc_((char *)"V", &jw, &t[t_offset], ldt, &v[v_offset], ldv, &ifst, &ilst, &work[1], + &info, (ftnlen)1); + if (info == 0) { + i__ = ilst; + } else { + i__ = k; + } + } + if (i__ == kend) { + k = i__ + 1; + } else if (t[i__ + 1 + i__ * t_dim1] == 0.) { + k = i__ + 1; + } else { + k = i__ + 2; + } + goto L40; + } + goto L30; + L50:; + } + i__ = jw; +L60: + if (i__ >= infqr + 1) { + if (i__ == infqr + 1) { + sr[kwtop + i__ - 1] = t[i__ + i__ * t_dim1]; + si[kwtop + i__ - 1] = 0.; + --i__; + } else if (t[i__ + (i__ - 1) * t_dim1] == 0.) { + sr[kwtop + i__ - 1] = t[i__ + i__ * t_dim1]; + si[kwtop + i__ - 1] = 0.; + --i__; + } else { + aa = t[i__ - 1 + (i__ - 1) * t_dim1]; + cc = t[i__ + (i__ - 1) * t_dim1]; + bb = t[i__ - 1 + i__ * t_dim1]; + dd = t[i__ + i__ * t_dim1]; + dlanv2_(&aa, &bb, &cc, &dd, &sr[kwtop + i__ - 2], &si[kwtop + i__ - 2], + &sr[kwtop + i__ - 1], &si[kwtop + i__ - 1], &cs, &sn); + i__ += -2; + } + goto L60; + } + if (*ns < jw || s == 0.) { + if (*ns > 1 && s != 0.) { + dcopy_(ns, &v[v_offset], ldv, &work[1], &c__1); + beta = work[1]; + dlarfg_(ns, &beta, &work[2], &c__1, &tau); + work[1] = 1.; + i__1 = jw - 2; + i__2 = jw - 2; + dlaset_((char *)"L", &i__1, &i__2, &c_b17, &c_b17, &t[t_dim1 + 3], ldt, (ftnlen)1); + dlarf_((char *)"L", ns, &jw, &work[1], &c__1, &tau, &t[t_offset], ldt, &work[jw + 1], + (ftnlen)1); + dlarf_((char *)"R", ns, ns, &work[1], &c__1, &tau, &t[t_offset], ldt, &work[jw + 1], (ftnlen)1); + dlarf_((char *)"R", &jw, ns, &work[1], &c__1, &tau, &v[v_offset], ldv, &work[jw + 1], + (ftnlen)1); + i__1 = *lwork - jw; + dgehrd_(&jw, &c__1, ns, &t[t_offset], ldt, &work[1], &work[jw + 1], &i__1, &info); + } + if (kwtop > 1) { + h__[kwtop + (kwtop - 1) * h_dim1] = s * v[v_dim1 + 1]; + } + dlacpy_((char *)"U", &jw, &jw, &t[t_offset], ldt, &h__[kwtop + kwtop * h_dim1], ldh, (ftnlen)1); + i__1 = jw - 1; + i__2 = *ldt + 1; + i__3 = *ldh + 1; + dcopy_(&i__1, &t[t_dim1 + 2], &i__2, &h__[kwtop + 1 + kwtop * h_dim1], &i__3); + if (*ns > 1 && s != 0.) { + i__1 = *lwork - jw; + dormhr_((char *)"R", (char *)"N", &jw, ns, &c__1, ns, &t[t_offset], ldt, &work[1], &v[v_offset], ldv, + &work[jw + 1], &i__1, &info, (ftnlen)1, (ftnlen)1); + } + if (*wantt) { + ltop = 1; + } else { + ltop = *ktop; + } + i__1 = kwtop - 1; + i__2 = *nv; + for (krow = ltop; i__2 < 0 ? krow >= i__1 : krow <= i__1; krow += i__2) { + i__3 = *nv, i__4 = kwtop - krow; + kln = min(i__3, i__4); + dgemm_((char *)"N", (char *)"N", &kln, &jw, &jw, &c_b18, &h__[krow + kwtop * h_dim1], ldh, &v[v_offset], + ldv, &c_b17, &wv[wv_offset], ldwv, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"A", &kln, &jw, &wv[wv_offset], ldwv, &h__[krow + kwtop * h_dim1], ldh, + (ftnlen)1); + } + if (*wantt) { + i__2 = *n; + i__1 = *nh; + for (kcol = *kbot + 1; i__1 < 0 ? kcol >= i__2 : kcol <= i__2; kcol += i__1) { + i__3 = *nh, i__4 = *n - kcol + 1; + kln = min(i__3, i__4); + dgemm_((char *)"C", (char *)"N", &jw, &kln, &jw, &c_b18, &v[v_offset], ldv, + &h__[kwtop + kcol * h_dim1], ldh, &c_b17, &t[t_offset], ldt, (ftnlen)1, + (ftnlen)1); + dlacpy_((char *)"A", &jw, &kln, &t[t_offset], ldt, &h__[kwtop + kcol * h_dim1], ldh, + (ftnlen)1); + } + } + if (*wantz) { + i__1 = *ihiz; + i__2 = *nv; + for (krow = *iloz; i__2 < 0 ? krow >= i__1 : krow <= i__1; krow += i__2) { + i__3 = *nv, i__4 = *ihiz - krow + 1; + kln = min(i__3, i__4); + dgemm_((char *)"N", (char *)"N", &kln, &jw, &jw, &c_b18, &z__[krow + kwtop * z_dim1], ldz, + &v[v_offset], ldv, &c_b17, &wv[wv_offset], ldwv, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"A", &kln, &jw, &wv[wv_offset], ldwv, &z__[krow + kwtop * z_dim1], ldz, + (ftnlen)1); + } + } + } + *nd = jw - *ns; + *ns -= infqr; + work[1] = (doublereal)lwkopt; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlaqr4.cpp b/lib/linalg/dlaqr4.cpp new file mode 100644 index 0000000000..e32193ee2d --- /dev/null +++ b/lib/linalg/dlaqr4.cpp @@ -0,0 +1,298 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__13 = 13; +static integer c__15 = 15; +static integer c_n1 = -1; +static integer c__12 = 12; +static integer c__14 = 14; +static integer c__16 = 16; +static logical c_false = FALSE_; +static integer c__1 = 1; +static integer c__3 = 3; +int dlaqr4_(logical *wantt, logical *wantz, integer *n, integer *ilo, integer *ihi, doublereal *h__, + integer *ldh, doublereal *wr, doublereal *wi, integer *iloz, integer *ihiz, + doublereal *z__, integer *ldz, doublereal *work, integer *lwork, integer *info) +{ + integer h_dim1, h_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5; + doublereal d__1, d__2, d__3, d__4; + integer i__, k; + doublereal aa, bb, cc, dd; + integer ld; + doublereal cs; + integer nh, it, ks, kt; + doublereal sn; + integer ku, kv, ls, ns; + doublereal ss; + integer nw, inf, kdu, nho, nve, kwh, nsr, nwr, kwv, ndec, ndfl, kbot, nmin; + doublereal swap; + integer ktop; + doublereal zdum[1]; + integer kacc22, itmax, nsmax, nwmax, kwtop; + extern int dlaqr2_(logical *, logical *, integer *, integer *, integer *, integer *, + doublereal *, integer *, integer *, integer *, doublereal *, integer *, + integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, doublereal *, integer *, + doublereal *, integer *), + dlanv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *), + dlaqr5_(logical *, logical *, integer *, integer *, integer *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, doublereal *, integer *); + integer nibble; + extern int dlahqr_(logical *, logical *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + char jbcmpz[2]; + integer nwupbd; + logical sorted; + integer lwkopt; + h_dim1 = *ldh; + h_offset = 1 + h_dim1; + h__ -= h_offset; + --wr; + --wi; + z_dim1 = *ldz; + z_offset = 1 + z_dim1; + z__ -= z_offset; + --work; + *info = 0; + if (*n == 0) { + work[1] = 1.; + return 0; + } + if (*n <= 11) { + lwkopt = 1; + if (*lwork != -1) { + dlahqr_(wantt, wantz, n, ilo, ihi, &h__[h_offset], ldh, &wr[1], &wi[1], iloz, ihiz, + &z__[z_offset], ldz, info); + } + } else { + *info = 0; + if (*wantt) { + *(unsigned char *)jbcmpz = 'S'; + } else { + *(unsigned char *)jbcmpz = 'E'; + } + if (*wantz) { + *(unsigned char *)&jbcmpz[1] = 'V'; + } else { + *(unsigned char *)&jbcmpz[1] = 'N'; + } + nwr = ilaenv_(&c__13, (char *)"DLAQR4", jbcmpz, n, ilo, ihi, lwork, (ftnlen)6, (ftnlen)2); + nwr = max(2, nwr); + i__1 = *ihi - *ilo + 1, i__2 = (*n - 1) / 3, i__1 = min(i__1, i__2); + nwr = min(i__1, nwr); + nsr = ilaenv_(&c__15, (char *)"DLAQR4", jbcmpz, n, ilo, ihi, lwork, (ftnlen)6, (ftnlen)2); + i__1 = nsr, i__2 = (*n + 6) / 9, i__1 = min(i__1, i__2), i__2 = *ihi - *ilo; + nsr = min(i__1, i__2); + i__1 = 2, i__2 = nsr - nsr % 2; + nsr = max(i__1, i__2); + i__1 = nwr + 1; + dlaqr2_(wantt, wantz, n, ilo, ihi, &i__1, &h__[h_offset], ldh, iloz, ihiz, &z__[z_offset], + ldz, &ls, &ld, &wr[1], &wi[1], &h__[h_offset], ldh, n, &h__[h_offset], ldh, n, + &h__[h_offset], ldh, &work[1], &c_n1); + i__1 = nsr * 3 / 2, i__2 = (integer)work[1]; + lwkopt = max(i__1, i__2); + if (*lwork == -1) { + work[1] = (doublereal)lwkopt; + return 0; + } + nmin = ilaenv_(&c__12, (char *)"DLAQR4", jbcmpz, n, ilo, ihi, lwork, (ftnlen)6, (ftnlen)2); + nmin = max(11, nmin); + nibble = ilaenv_(&c__14, (char *)"DLAQR4", jbcmpz, n, ilo, ihi, lwork, (ftnlen)6, (ftnlen)2); + nibble = max(0, nibble); + kacc22 = ilaenv_(&c__16, (char *)"DLAQR4", jbcmpz, n, ilo, ihi, lwork, (ftnlen)6, (ftnlen)2); + kacc22 = max(0, kacc22); + kacc22 = min(2, kacc22); + i__1 = (*n - 1) / 3, i__2 = *lwork / 2; + nwmax = min(i__1, i__2); + nw = nwmax; + i__1 = (*n + 6) / 9, i__2 = (*lwork << 1) / 3; + nsmax = min(i__1, i__2); + nsmax -= nsmax % 2; + ndfl = 1; + i__1 = 10, i__2 = *ihi - *ilo + 1; + itmax = max(i__1, i__2) * 30; + kbot = *ihi; + i__1 = itmax; + for (it = 1; it <= i__1; ++it) { + if (kbot < *ilo) { + goto L90; + } + i__2 = *ilo + 1; + for (k = kbot; k >= i__2; --k) { + if (h__[k + (k - 1) * h_dim1] == 0.) { + goto L20; + } + } + k = *ilo; + L20: + ktop = k; + nh = kbot - ktop + 1; + nwupbd = min(nh, nwmax); + if (ndfl < 5) { + nw = min(nwupbd, nwr); + } else { + i__2 = nwupbd, i__3 = nw << 1; + nw = min(i__2, i__3); + } + if (nw < nwmax) { + if (nw >= nh - 1) { + nw = nh; + } else { + kwtop = kbot - nw + 1; + if ((d__1 = h__[kwtop + (kwtop - 1) * h_dim1], abs(d__1)) > + (d__2 = h__[kwtop - 1 + (kwtop - 2) * h_dim1], abs(d__2))) { + ++nw; + } + } + } + if (ndfl < 5) { + ndec = -1; + } else if (ndec >= 0 || nw >= nwupbd) { + ++ndec; + if (nw - ndec < 2) { + ndec = 0; + } + nw -= ndec; + } + kv = *n - nw + 1; + kt = nw + 1; + nho = *n - nw - 1 - kt + 1; + kwv = nw + 2; + nve = *n - nw - kwv + 1; + dlaqr2_(wantt, wantz, n, &ktop, &kbot, &nw, &h__[h_offset], ldh, iloz, ihiz, + &z__[z_offset], ldz, &ls, &ld, &wr[1], &wi[1], &h__[kv + h_dim1], ldh, &nho, + &h__[kv + kt * h_dim1], ldh, &nve, &h__[kwv + h_dim1], ldh, &work[1], lwork); + kbot -= ld; + ks = kbot - ls + 1; + if (ld == 0 || ld * 100 <= nw * nibble && kbot - ktop + 1 > min(nmin, nwmax)) { + i__4 = 2, i__5 = kbot - ktop; + i__2 = min(nsmax, nsr), i__3 = max(i__4, i__5); + ns = min(i__2, i__3); + ns -= ns % 2; + if (ndfl % 6 == 0) { + ks = kbot - ns + 1; + i__3 = ks + 1, i__4 = ktop + 2; + i__2 = max(i__3, i__4); + for (i__ = kbot; i__ >= i__2; i__ += -2) { + ss = (d__1 = h__[i__ + (i__ - 1) * h_dim1], abs(d__1)) + + (d__2 = h__[i__ - 1 + (i__ - 2) * h_dim1], abs(d__2)); + aa = ss * .75 + h__[i__ + i__ * h_dim1]; + bb = ss; + cc = ss * -.4375; + dd = aa; + dlanv2_(&aa, &bb, &cc, &dd, &wr[i__ - 1], &wi[i__ - 1], &wr[i__], &wi[i__], + &cs, &sn); + } + if (ks == ktop) { + wr[ks + 1] = h__[ks + 1 + (ks + 1) * h_dim1]; + wi[ks + 1] = 0.; + wr[ks] = wr[ks + 1]; + wi[ks] = wi[ks + 1]; + } + } else { + if (kbot - ks + 1 <= ns / 2) { + ks = kbot - ns + 1; + kt = *n - ns + 1; + dlacpy_((char *)"A", &ns, &ns, &h__[ks + ks * h_dim1], ldh, &h__[kt + h_dim1], ldh, + (ftnlen)1); + dlahqr_(&c_false, &c_false, &ns, &c__1, &ns, &h__[kt + h_dim1], ldh, + &wr[ks], &wi[ks], &c__1, &c__1, zdum, &c__1, &inf); + ks += inf; + if (ks >= kbot) { + aa = h__[kbot - 1 + (kbot - 1) * h_dim1]; + cc = h__[kbot + (kbot - 1) * h_dim1]; + bb = h__[kbot - 1 + kbot * h_dim1]; + dd = h__[kbot + kbot * h_dim1]; + dlanv2_(&aa, &bb, &cc, &dd, &wr[kbot - 1], &wi[kbot - 1], &wr[kbot], + &wi[kbot], &cs, &sn); + ks = kbot - 1; + } + } + if (kbot - ks + 1 > ns) { + sorted = FALSE_; + i__2 = ks + 1; + for (k = kbot; k >= i__2; --k) { + if (sorted) { + goto L60; + } + sorted = TRUE_; + i__3 = k - 1; + for (i__ = ks; i__ <= i__3; ++i__) { + if ((d__1 = wr[i__], abs(d__1)) + (d__2 = wi[i__], abs(d__2)) < + (d__3 = wr[i__ + 1], abs(d__3)) + + (d__4 = wi[i__ + 1], abs(d__4))) { + sorted = FALSE_; + swap = wr[i__]; + wr[i__] = wr[i__ + 1]; + wr[i__ + 1] = swap; + swap = wi[i__]; + wi[i__] = wi[i__ + 1]; + wi[i__ + 1] = swap; + } + } + } + L60:; + } + i__2 = ks + 2; + for (i__ = kbot; i__ >= i__2; i__ += -2) { + if (wi[i__] != -wi[i__ - 1]) { + swap = wr[i__]; + wr[i__] = wr[i__ - 1]; + wr[i__ - 1] = wr[i__ - 2]; + wr[i__ - 2] = swap; + swap = wi[i__]; + wi[i__] = wi[i__ - 1]; + wi[i__ - 1] = wi[i__ - 2]; + wi[i__ - 2] = swap; + } + } + } + if (kbot - ks + 1 == 2) { + if (wi[kbot] == 0.) { + if ((d__1 = wr[kbot] - h__[kbot + kbot * h_dim1], abs(d__1)) < + (d__2 = wr[kbot - 1] - h__[kbot + kbot * h_dim1], abs(d__2))) { + wr[kbot - 1] = wr[kbot]; + } else { + wr[kbot] = wr[kbot - 1]; + } + } + } + i__2 = ns, i__3 = kbot - ks + 1; + ns = min(i__2, i__3); + ns -= ns % 2; + ks = kbot - ns + 1; + kdu = ns * 3 - 3; + ku = *n - kdu + 1; + kwh = kdu + 1; + nho = *n - kdu - 3 - (kdu + 1) + 1; + kwv = kdu + 4; + nve = *n - kdu - kwv + 1; + dlaqr5_(wantt, wantz, &kacc22, n, &ktop, &kbot, &ns, &wr[ks], &wi[ks], + &h__[h_offset], ldh, iloz, ihiz, &z__[z_offset], ldz, &work[1], &c__3, + &h__[ku + h_dim1], ldh, &nve, &h__[kwv + h_dim1], ldh, &nho, + &h__[ku + kwh * h_dim1], ldh); + } + if (ld > 0) { + ndfl = 1; + } else { + ++ndfl; + } + } + *info = kbot; + L90:; + } + work[1] = (doublereal)lwkopt; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlaqr5.cpp b/lib/linalg/dlaqr5.cpp new file mode 100644 index 0000000000..1cd0ac9d88 --- /dev/null +++ b/lib/linalg/dlaqr5.cpp @@ -0,0 +1,521 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublereal c_b7 = 0.; +static doublereal c_b8 = 1.; +static integer c__3 = 3; +static integer c__1 = 1; +static integer c__2 = 2; +int dlaqr5_(logical *wantt, logical *wantz, integer *kacc22, integer *n, integer *ktop, + integer *kbot, integer *nshfts, doublereal *sr, doublereal *si, doublereal *h__, + integer *ldh, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, + doublereal *v, integer *ldv, doublereal *u, integer *ldu, integer *nv, doublereal *wv, + integer *ldwv, integer *nh, doublereal *wh, integer *ldwh) +{ + integer h_dim1, h_offset, u_dim1, u_offset, v_dim1, v_offset, wh_dim1, wh_offset, wv_dim1, + wv_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5, i__6, i__7; + doublereal d__1, d__2, d__3, d__4, d__5; + integer i__, j, k, m, i2, j2, i4, j4, k1; + doublereal h11, h12, h21, h22; + integer m22, ns, nu; + doublereal vt[3], scl; + integer kdu, kms; + doublereal ulp; + integer knz, kzs; + doublereal tst1, tst2, beta; + logical blk22, bmp22; + integer mend, jcol, jlen, jbot, mbot; + doublereal swap; + integer jtop, jrow, mtop; + doublereal alpha; + logical accum; + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); + integer ndcol, incol, krcol, nbmps; + extern int dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + dlaqr1_(integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *), + dlabad_(doublereal *, doublereal *); + extern doublereal dlamch_(char *, ftnlen); + extern int dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen); + doublereal safmin; + extern int dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, + integer *, ftnlen); + doublereal safmax, refsum; + integer mstart; + doublereal smlnum; + --sr; + --si; + h_dim1 = *ldh; + h_offset = 1 + h_dim1; + h__ -= h_offset; + z_dim1 = *ldz; + z_offset = 1 + z_dim1; + z__ -= z_offset; + v_dim1 = *ldv; + v_offset = 1 + v_dim1; + v -= v_offset; + u_dim1 = *ldu; + u_offset = 1 + u_dim1; + u -= u_offset; + wv_dim1 = *ldwv; + wv_offset = 1 + wv_dim1; + wv -= wv_offset; + wh_dim1 = *ldwh; + wh_offset = 1 + wh_dim1; + wh -= wh_offset; + if (*nshfts < 2) { + return 0; + } + if (*ktop >= *kbot) { + return 0; + } + i__1 = *nshfts - 2; + for (i__ = 1; i__ <= i__1; i__ += 2) { + if (si[i__] != -si[i__ + 1]) { + swap = sr[i__]; + sr[i__] = sr[i__ + 1]; + sr[i__ + 1] = sr[i__ + 2]; + sr[i__ + 2] = swap; + swap = si[i__]; + si[i__] = si[i__ + 1]; + si[i__ + 1] = si[i__ + 2]; + si[i__ + 2] = swap; + } + } + ns = *nshfts - *nshfts % 2; + safmin = dlamch_((char *)"SAFE MINIMUM", (ftnlen)12); + safmax = 1. / safmin; + dlabad_(&safmin, &safmax); + ulp = dlamch_((char *)"PRECISION", (ftnlen)9); + smlnum = safmin * ((doublereal)(*n) / ulp); + accum = *kacc22 == 1 || *kacc22 == 2; + blk22 = ns > 2 && *kacc22 == 2; + if (*ktop + 2 <= *kbot) { + h__[*ktop + 2 + *ktop * h_dim1] = 0.; + } + nbmps = ns / 2; + kdu = nbmps * 6 - 3; + i__1 = *kbot - 2; + i__2 = nbmps * 3 - 2; + for (incol = (1 - nbmps) * 3 + *ktop - 1; i__2 < 0 ? incol >= i__1 : incol <= i__1; + incol += i__2) { + ndcol = incol + kdu; + if (accum) { + dlaset_((char *)"ALL", &kdu, &kdu, &c_b7, &c_b8, &u[u_offset], ldu, (ftnlen)3); + } + i__4 = incol + nbmps * 3 - 3, i__5 = *kbot - 2; + i__3 = min(i__4, i__5); + for (krcol = incol; krcol <= i__3; ++krcol) { + i__4 = 1, i__5 = (*ktop - 1 - krcol + 2) / 3 + 1; + mtop = max(i__4, i__5); + i__4 = nbmps, i__5 = (*kbot - krcol) / 3; + mbot = min(i__4, i__5); + m22 = mbot + 1; + bmp22 = mbot < nbmps && krcol + (m22 - 1) * 3 == *kbot - 2; + i__4 = mbot; + for (m = mtop; m <= i__4; ++m) { + k = krcol + (m - 1) * 3; + if (k == *ktop - 1) { + dlaqr1_(&c__3, &h__[*ktop + *ktop * h_dim1], ldh, &sr[(m << 1) - 1], + &si[(m << 1) - 1], &sr[m * 2], &si[m * 2], &v[m * v_dim1 + 1]); + alpha = v[m * v_dim1 + 1]; + dlarfg_(&c__3, &alpha, &v[m * v_dim1 + 2], &c__1, &v[m * v_dim1 + 1]); + } else { + beta = h__[k + 1 + k * h_dim1]; + v[m * v_dim1 + 2] = h__[k + 2 + k * h_dim1]; + v[m * v_dim1 + 3] = h__[k + 3 + k * h_dim1]; + dlarfg_(&c__3, &beta, &v[m * v_dim1 + 2], &c__1, &v[m * v_dim1 + 1]); + if (h__[k + 3 + k * h_dim1] != 0. || h__[k + 3 + (k + 1) * h_dim1] != 0. || + h__[k + 3 + (k + 2) * h_dim1] == 0.) { + h__[k + 1 + k * h_dim1] = beta; + h__[k + 2 + k * h_dim1] = 0.; + h__[k + 3 + k * h_dim1] = 0.; + } else { + dlaqr1_(&c__3, &h__[k + 1 + (k + 1) * h_dim1], ldh, &sr[(m << 1) - 1], + &si[(m << 1) - 1], &sr[m * 2], &si[m * 2], vt); + alpha = vt[0]; + dlarfg_(&c__3, &alpha, &vt[1], &c__1, vt); + refsum = + vt[0] * (h__[k + 1 + k * h_dim1] + vt[1] * h__[k + 2 + k * h_dim1]); + if ((d__1 = h__[k + 2 + k * h_dim1] - refsum * vt[1], abs(d__1)) + + (d__2 = refsum * vt[2], abs(d__2)) > + ulp * ((d__3 = h__[k + k * h_dim1], abs(d__3)) + + (d__4 = h__[k + 1 + (k + 1) * h_dim1], abs(d__4)) + + (d__5 = h__[k + 2 + (k + 2) * h_dim1], abs(d__5)))) { + h__[k + 1 + k * h_dim1] = beta; + h__[k + 2 + k * h_dim1] = 0.; + h__[k + 3 + k * h_dim1] = 0.; + } else { + h__[k + 1 + k * h_dim1] -= refsum; + h__[k + 2 + k * h_dim1] = 0.; + h__[k + 3 + k * h_dim1] = 0.; + v[m * v_dim1 + 1] = vt[0]; + v[m * v_dim1 + 2] = vt[1]; + v[m * v_dim1 + 3] = vt[2]; + } + } + } + } + k = krcol + (m22 - 1) * 3; + if (bmp22) { + if (k == *ktop - 1) { + dlaqr1_(&c__2, &h__[k + 1 + (k + 1) * h_dim1], ldh, &sr[(m22 << 1) - 1], + &si[(m22 << 1) - 1], &sr[m22 * 2], &si[m22 * 2], &v[m22 * v_dim1 + 1]); + beta = v[m22 * v_dim1 + 1]; + dlarfg_(&c__2, &beta, &v[m22 * v_dim1 + 2], &c__1, &v[m22 * v_dim1 + 1]); + } else { + beta = h__[k + 1 + k * h_dim1]; + v[m22 * v_dim1 + 2] = h__[k + 2 + k * h_dim1]; + dlarfg_(&c__2, &beta, &v[m22 * v_dim1 + 2], &c__1, &v[m22 * v_dim1 + 1]); + h__[k + 1 + k * h_dim1] = beta; + h__[k + 2 + k * h_dim1] = 0.; + } + } + if (accum) { + jbot = min(ndcol, *kbot); + } else if (*wantt) { + jbot = *n; + } else { + jbot = *kbot; + } + i__4 = jbot; + for (j = max(*ktop, krcol); j <= i__4; ++j) { + i__5 = mbot, i__6 = (j - krcol + 2) / 3; + mend = min(i__5, i__6); + i__5 = mend; + for (m = mtop; m <= i__5; ++m) { + k = krcol + (m - 1) * 3; + refsum = v[m * v_dim1 + 1] * (h__[k + 1 + j * h_dim1] + + v[m * v_dim1 + 2] * h__[k + 2 + j * h_dim1] + + v[m * v_dim1 + 3] * h__[k + 3 + j * h_dim1]); + h__[k + 1 + j * h_dim1] -= refsum; + h__[k + 2 + j * h_dim1] -= refsum * v[m * v_dim1 + 2]; + h__[k + 3 + j * h_dim1] -= refsum * v[m * v_dim1 + 3]; + } + } + if (bmp22) { + k = krcol + (m22 - 1) * 3; + i__4 = k + 1; + i__5 = jbot; + for (j = max(i__4, *ktop); j <= i__5; ++j) { + refsum = v[m22 * v_dim1 + 1] * (h__[k + 1 + j * h_dim1] + + v[m22 * v_dim1 + 2] * h__[k + 2 + j * h_dim1]); + h__[k + 1 + j * h_dim1] -= refsum; + h__[k + 2 + j * h_dim1] -= refsum * v[m22 * v_dim1 + 2]; + } + } + if (accum) { + jtop = max(*ktop, incol); + } else if (*wantt) { + jtop = 1; + } else { + jtop = *ktop; + } + i__5 = mbot; + for (m = mtop; m <= i__5; ++m) { + if (v[m * v_dim1 + 1] != 0.) { + k = krcol + (m - 1) * 3; + i__6 = *kbot, i__7 = k + 3; + i__4 = min(i__6, i__7); + for (j = jtop; j <= i__4; ++j) { + refsum = + v[m * v_dim1 + 1] * (h__[j + (k + 1) * h_dim1] + + v[m * v_dim1 + 2] * h__[j + (k + 2) * h_dim1] + + v[m * v_dim1 + 3] * h__[j + (k + 3) * h_dim1]); + h__[j + (k + 1) * h_dim1] -= refsum; + h__[j + (k + 2) * h_dim1] -= refsum * v[m * v_dim1 + 2]; + h__[j + (k + 3) * h_dim1] -= refsum * v[m * v_dim1 + 3]; + } + if (accum) { + kms = k - incol; + i__4 = 1, i__6 = *ktop - incol; + i__7 = kdu; + for (j = max(i__4, i__6); j <= i__7; ++j) { + refsum = + v[m * v_dim1 + 1] * (u[j + (kms + 1) * u_dim1] + + v[m * v_dim1 + 2] * u[j + (kms + 2) * u_dim1] + + v[m * v_dim1 + 3] * u[j + (kms + 3) * u_dim1]); + u[j + (kms + 1) * u_dim1] -= refsum; + u[j + (kms + 2) * u_dim1] -= refsum * v[m * v_dim1 + 2]; + u[j + (kms + 3) * u_dim1] -= refsum * v[m * v_dim1 + 3]; + } + } else if (*wantz) { + i__7 = *ihiz; + for (j = *iloz; j <= i__7; ++j) { + refsum = + v[m * v_dim1 + 1] * (z__[j + (k + 1) * z_dim1] + + v[m * v_dim1 + 2] * z__[j + (k + 2) * z_dim1] + + v[m * v_dim1 + 3] * z__[j + (k + 3) * z_dim1]); + z__[j + (k + 1) * z_dim1] -= refsum; + z__[j + (k + 2) * z_dim1] -= refsum * v[m * v_dim1 + 2]; + z__[j + (k + 3) * z_dim1] -= refsum * v[m * v_dim1 + 3]; + } + } + } + } + k = krcol + (m22 - 1) * 3; + if (bmp22) { + if (v[m22 * v_dim1 + 1] != 0.) { + i__7 = *kbot, i__4 = k + 3; + i__5 = min(i__7, i__4); + for (j = jtop; j <= i__5; ++j) { + refsum = + v[m22 * v_dim1 + 1] * (h__[j + (k + 1) * h_dim1] + + v[m22 * v_dim1 + 2] * h__[j + (k + 2) * h_dim1]); + h__[j + (k + 1) * h_dim1] -= refsum; + h__[j + (k + 2) * h_dim1] -= refsum * v[m22 * v_dim1 + 2]; + } + if (accum) { + kms = k - incol; + i__5 = 1, i__7 = *ktop - incol; + i__4 = kdu; + for (j = max(i__5, i__7); j <= i__4; ++j) { + refsum = v[m22 * v_dim1 + 1] * + (u[j + (kms + 1) * u_dim1] + + v[m22 * v_dim1 + 2] * u[j + (kms + 2) * u_dim1]); + u[j + (kms + 1) * u_dim1] -= refsum; + u[j + (kms + 2) * u_dim1] -= refsum * v[m22 * v_dim1 + 2]; + } + } else if (*wantz) { + i__4 = *ihiz; + for (j = *iloz; j <= i__4; ++j) { + refsum = v[m22 * v_dim1 + 1] * + (z__[j + (k + 1) * z_dim1] + + v[m22 * v_dim1 + 2] * z__[j + (k + 2) * z_dim1]); + z__[j + (k + 1) * z_dim1] -= refsum; + z__[j + (k + 2) * z_dim1] -= refsum * v[m22 * v_dim1 + 2]; + } + } + } + } + mstart = mtop; + if (krcol + (mstart - 1) * 3 < *ktop) { + ++mstart; + } + mend = mbot; + if (bmp22) { + ++mend; + } + if (krcol == *kbot - 2) { + ++mend; + } + i__4 = mend; + for (m = mstart; m <= i__4; ++m) { + i__5 = *kbot - 1, i__7 = krcol + (m - 1) * 3; + k = min(i__5, i__7); + if (h__[k + 1 + k * h_dim1] != 0.) { + tst1 = (d__1 = h__[k + k * h_dim1], abs(d__1)) + + (d__2 = h__[k + 1 + (k + 1) * h_dim1], abs(d__2)); + if (tst1 == 0.) { + if (k >= *ktop + 1) { + tst1 += (d__1 = h__[k + (k - 1) * h_dim1], abs(d__1)); + } + if (k >= *ktop + 2) { + tst1 += (d__1 = h__[k + (k - 2) * h_dim1], abs(d__1)); + } + if (k >= *ktop + 3) { + tst1 += (d__1 = h__[k + (k - 3) * h_dim1], abs(d__1)); + } + if (k <= *kbot - 2) { + tst1 += (d__1 = h__[k + 2 + (k + 1) * h_dim1], abs(d__1)); + } + if (k <= *kbot - 3) { + tst1 += (d__1 = h__[k + 3 + (k + 1) * h_dim1], abs(d__1)); + } + if (k <= *kbot - 4) { + tst1 += (d__1 = h__[k + 4 + (k + 1) * h_dim1], abs(d__1)); + } + } + d__2 = smlnum, d__3 = ulp * tst1; + if ((d__1 = h__[k + 1 + k * h_dim1], abs(d__1)) <= max(d__2, d__3)) { + d__3 = (d__1 = h__[k + 1 + k * h_dim1], abs(d__1)), + d__4 = (d__2 = h__[k + (k + 1) * h_dim1], abs(d__2)); + h12 = max(d__3, d__4); + d__3 = (d__1 = h__[k + 1 + k * h_dim1], abs(d__1)), + d__4 = (d__2 = h__[k + (k + 1) * h_dim1], abs(d__2)); + h21 = min(d__3, d__4); + d__3 = (d__1 = h__[k + 1 + (k + 1) * h_dim1], abs(d__1)), + d__4 = + (d__2 = h__[k + k * h_dim1] - h__[k + 1 + (k + 1) * h_dim1], abs(d__2)); + h11 = max(d__3, d__4); + d__3 = (d__1 = h__[k + 1 + (k + 1) * h_dim1], abs(d__1)), + d__4 = + (d__2 = h__[k + k * h_dim1] - h__[k + 1 + (k + 1) * h_dim1], abs(d__2)); + h22 = min(d__3, d__4); + scl = h11 + h12; + tst2 = h22 * (h11 / scl); + d__1 = smlnum, d__2 = ulp * tst2; + if (tst2 == 0. || h21 * (h12 / scl) <= max(d__1, d__2)) { + h__[k + 1 + k * h_dim1] = 0.; + } + } + } + } + i__4 = nbmps, i__5 = (*kbot - krcol - 1) / 3; + mend = min(i__4, i__5); + i__4 = mend; + for (m = mtop; m <= i__4; ++m) { + k = krcol + (m - 1) * 3; + refsum = v[m * v_dim1 + 1] * v[m * v_dim1 + 3] * h__[k + 4 + (k + 3) * h_dim1]; + h__[k + 4 + (k + 1) * h_dim1] = -refsum; + h__[k + 4 + (k + 2) * h_dim1] = -refsum * v[m * v_dim1 + 2]; + h__[k + 4 + (k + 3) * h_dim1] -= refsum * v[m * v_dim1 + 3]; + } + } + if (accum) { + if (*wantt) { + jtop = 1; + jbot = *n; + } else { + jtop = *ktop; + jbot = *kbot; + } + if (!blk22 || incol < *ktop || ndcol > *kbot || ns <= 2) { + i__3 = 1, i__4 = *ktop - incol; + k1 = max(i__3, i__4); + i__3 = 0, i__4 = ndcol - *kbot; + nu = kdu - max(i__3, i__4) - k1 + 1; + i__3 = jbot; + i__4 = *nh; + for (jcol = min(ndcol, *kbot) + 1; i__4 < 0 ? jcol >= i__3 : jcol <= i__3; + jcol += i__4) { + i__5 = *nh, i__7 = jbot - jcol + 1; + jlen = min(i__5, i__7); + dgemm_((char *)"C", (char *)"N", &nu, &jlen, &nu, &c_b8, &u[k1 + k1 * u_dim1], ldu, + &h__[incol + k1 + jcol * h_dim1], ldh, &c_b7, &wh[wh_offset], ldwh, + (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"ALL", &nu, &jlen, &wh[wh_offset], ldwh, + &h__[incol + k1 + jcol * h_dim1], ldh, (ftnlen)3); + } + i__4 = max(*ktop, incol) - 1; + i__3 = *nv; + for (jrow = jtop; i__3 < 0 ? jrow >= i__4 : jrow <= i__4; jrow += i__3) { + i__5 = *nv, i__7 = max(*ktop, incol) - jrow; + jlen = min(i__5, i__7); + dgemm_((char *)"N", (char *)"N", &jlen, &nu, &nu, &c_b8, &h__[jrow + (incol + k1) * h_dim1], + ldh, &u[k1 + k1 * u_dim1], ldu, &c_b7, &wv[wv_offset], ldwv, (ftnlen)1, + (ftnlen)1); + dlacpy_((char *)"ALL", &jlen, &nu, &wv[wv_offset], ldwv, + &h__[jrow + (incol + k1) * h_dim1], ldh, (ftnlen)3); + } + if (*wantz) { + i__3 = *ihiz; + i__4 = *nv; + for (jrow = *iloz; i__4 < 0 ? jrow >= i__3 : jrow <= i__3; jrow += i__4) { + i__5 = *nv, i__7 = *ihiz - jrow + 1; + jlen = min(i__5, i__7); + dgemm_((char *)"N", (char *)"N", &jlen, &nu, &nu, &c_b8, &z__[jrow + (incol + k1) * z_dim1], + ldz, &u[k1 + k1 * u_dim1], ldu, &c_b7, &wv[wv_offset], ldwv, + (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"ALL", &jlen, &nu, &wv[wv_offset], ldwv, + &z__[jrow + (incol + k1) * z_dim1], ldz, (ftnlen)3); + } + } + } else { + i2 = (kdu + 1) / 2; + i4 = kdu; + j2 = i4 - i2; + j4 = kdu; + kzs = j4 - j2 - (ns + 1); + knz = ns + 1; + i__4 = jbot; + i__3 = *nh; + for (jcol = min(ndcol, *kbot) + 1; i__3 < 0 ? jcol >= i__4 : jcol <= i__4; + jcol += i__3) { + i__5 = *nh, i__7 = jbot - jcol + 1; + jlen = min(i__5, i__7); + dlacpy_((char *)"ALL", &knz, &jlen, &h__[incol + 1 + j2 + jcol * h_dim1], ldh, + &wh[kzs + 1 + wh_dim1], ldwh, (ftnlen)3); + dlaset_((char *)"ALL", &kzs, &jlen, &c_b7, &c_b7, &wh[wh_offset], ldwh, (ftnlen)3); + dtrmm_((char *)"L", (char *)"U", (char *)"C", (char *)"N", &knz, &jlen, &c_b8, &u[j2 + 1 + (kzs + 1) * u_dim1], + ldu, &wh[kzs + 1 + wh_dim1], ldwh, (ftnlen)1, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + dgemm_((char *)"C", (char *)"N", &i2, &jlen, &j2, &c_b8, &u[u_offset], ldu, + &h__[incol + 1 + jcol * h_dim1], ldh, &c_b8, &wh[wh_offset], ldwh, + (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"ALL", &j2, &jlen, &h__[incol + 1 + jcol * h_dim1], ldh, + &wh[i2 + 1 + wh_dim1], ldwh, (ftnlen)3); + dtrmm_((char *)"L", (char *)"L", (char *)"C", (char *)"N", &j2, &jlen, &c_b8, &u[(i2 + 1) * u_dim1 + 1], ldu, + &wh[i2 + 1 + wh_dim1], ldwh, (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__5 = i4 - i2; + i__7 = j4 - j2; + dgemm_((char *)"C", (char *)"N", &i__5, &jlen, &i__7, &c_b8, &u[j2 + 1 + (i2 + 1) * u_dim1], + ldu, &h__[incol + 1 + j2 + jcol * h_dim1], ldh, &c_b8, + &wh[i2 + 1 + wh_dim1], ldwh, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"ALL", &kdu, &jlen, &wh[wh_offset], ldwh, + &h__[incol + 1 + jcol * h_dim1], ldh, (ftnlen)3); + } + i__3 = max(incol, *ktop) - 1; + i__4 = *nv; + for (jrow = jtop; i__4 < 0 ? jrow >= i__3 : jrow <= i__3; jrow += i__4) { + i__5 = *nv, i__7 = max(incol, *ktop) - jrow; + jlen = min(i__5, i__7); + dlacpy_((char *)"ALL", &jlen, &knz, &h__[jrow + (incol + 1 + j2) * h_dim1], ldh, + &wv[(kzs + 1) * wv_dim1 + 1], ldwv, (ftnlen)3); + dlaset_((char *)"ALL", &jlen, &kzs, &c_b7, &c_b7, &wv[wv_offset], ldwv, (ftnlen)3); + dtrmm_((char *)"R", (char *)"U", (char *)"N", (char *)"N", &jlen, &knz, &c_b8, &u[j2 + 1 + (kzs + 1) * u_dim1], + ldu, &wv[(kzs + 1) * wv_dim1 + 1], ldwv, (ftnlen)1, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + dgemm_((char *)"N", (char *)"N", &jlen, &i2, &j2, &c_b8, &h__[jrow + (incol + 1) * h_dim1], ldh, + &u[u_offset], ldu, &c_b8, &wv[wv_offset], ldwv, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"ALL", &jlen, &j2, &h__[jrow + (incol + 1) * h_dim1], ldh, + &wv[(i2 + 1) * wv_dim1 + 1], ldwv, (ftnlen)3); + i__5 = i4 - i2; + dtrmm_((char *)"R", (char *)"L", (char *)"N", (char *)"N", &jlen, &i__5, &c_b8, &u[(i2 + 1) * u_dim1 + 1], ldu, + &wv[(i2 + 1) * wv_dim1 + 1], ldwv, (ftnlen)1, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + i__5 = i4 - i2; + i__7 = j4 - j2; + dgemm_((char *)"N", (char *)"N", &jlen, &i__5, &i__7, &c_b8, + &h__[jrow + (incol + 1 + j2) * h_dim1], ldh, + &u[j2 + 1 + (i2 + 1) * u_dim1], ldu, &c_b8, &wv[(i2 + 1) * wv_dim1 + 1], + ldwv, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"ALL", &jlen, &kdu, &wv[wv_offset], ldwv, + &h__[jrow + (incol + 1) * h_dim1], ldh, (ftnlen)3); + } + if (*wantz) { + i__4 = *ihiz; + i__3 = *nv; + for (jrow = *iloz; i__3 < 0 ? jrow >= i__4 : jrow <= i__4; jrow += i__3) { + i__5 = *nv, i__7 = *ihiz - jrow + 1; + jlen = min(i__5, i__7); + dlacpy_((char *)"ALL", &jlen, &knz, &z__[jrow + (incol + 1 + j2) * z_dim1], ldz, + &wv[(kzs + 1) * wv_dim1 + 1], ldwv, (ftnlen)3); + dlaset_((char *)"ALL", &jlen, &kzs, &c_b7, &c_b7, &wv[wv_offset], ldwv, (ftnlen)3); + dtrmm_((char *)"R", (char *)"U", (char *)"N", (char *)"N", &jlen, &knz, &c_b8, + &u[j2 + 1 + (kzs + 1) * u_dim1], ldu, &wv[(kzs + 1) * wv_dim1 + 1], + ldwv, (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", &jlen, &i2, &j2, &c_b8, &z__[jrow + (incol + 1) * z_dim1], + ldz, &u[u_offset], ldu, &c_b8, &wv[wv_offset], ldwv, (ftnlen)1, + (ftnlen)1); + dlacpy_((char *)"ALL", &jlen, &j2, &z__[jrow + (incol + 1) * z_dim1], ldz, + &wv[(i2 + 1) * wv_dim1 + 1], ldwv, (ftnlen)3); + i__5 = i4 - i2; + dtrmm_((char *)"R", (char *)"L", (char *)"N", (char *)"N", &jlen, &i__5, &c_b8, &u[(i2 + 1) * u_dim1 + 1], + ldu, &wv[(i2 + 1) * wv_dim1 + 1], ldwv, (ftnlen)1, (ftnlen)1, + (ftnlen)1, (ftnlen)1); + i__5 = i4 - i2; + i__7 = j4 - j2; + dgemm_((char *)"N", (char *)"N", &jlen, &i__5, &i__7, &c_b8, + &z__[jrow + (incol + 1 + j2) * z_dim1], ldz, + &u[j2 + 1 + (i2 + 1) * u_dim1], ldu, &c_b8, + &wv[(i2 + 1) * wv_dim1 + 1], ldwv, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"ALL", &jlen, &kdu, &wv[wv_offset], ldwv, + &z__[jrow + (incol + 1) * z_dim1], ldz, (ftnlen)3); + } + } + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlarfx.cpp b/lib/linalg/dlarfx.cpp new file mode 100644 index 0000000000..44d73f27a9 --- /dev/null +++ b/lib/linalg/dlarfx.cpp @@ -0,0 +1,552 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +int dlarfx_(char *side, integer *m, integer *n, doublereal *v, doublereal *tau, doublereal *c__, + integer *ldc, doublereal *work, ftnlen side_len) +{ + integer c_dim1, c_offset, i__1; + integer j; + doublereal t1, t2, t3, t4, t5, t6, t7, t8, t9, v1, v2, v3, v4, v5, v6, v7, v8, v9, t10, v10, + sum; + extern int dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + --v; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + if (*tau == 0.) { + return 0; + } + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + switch (*m) { + case 1: + goto L10; + case 2: + goto L30; + case 3: + goto L50; + case 4: + goto L70; + case 5: + goto L90; + case 6: + goto L110; + case 7: + goto L130; + case 8: + goto L150; + case 9: + goto L170; + case 10: + goto L190; + } + dlarf_(side, m, n, &v[1], &c__1, tau, &c__[c_offset], ldc, &work[1], (ftnlen)1); + goto L410; + L10: + t1 = 1. - *tau * v[1] * v[1]; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + c__[j * c_dim1 + 1] = t1 * c__[j * c_dim1 + 1]; + } + goto L410; + L30: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2]; + c__[j * c_dim1 + 1] -= sum * t1; + c__[j * c_dim1 + 2] -= sum * t2; + } + goto L410; + L50: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3]; + c__[j * c_dim1 + 1] -= sum * t1; + c__[j * c_dim1 + 2] -= sum * t2; + c__[j * c_dim1 + 3] -= sum * t3; + } + goto L410; + L70: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + + v4 * c__[j * c_dim1 + 4]; + c__[j * c_dim1 + 1] -= sum * t1; + c__[j * c_dim1 + 2] -= sum * t2; + c__[j * c_dim1 + 3] -= sum * t3; + c__[j * c_dim1 + 4] -= sum * t4; + } + goto L410; + L90: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + v5 = v[5]; + t5 = *tau * v5; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + + v4 * c__[j * c_dim1 + 4] + v5 * c__[j * c_dim1 + 5]; + c__[j * c_dim1 + 1] -= sum * t1; + c__[j * c_dim1 + 2] -= sum * t2; + c__[j * c_dim1 + 3] -= sum * t3; + c__[j * c_dim1 + 4] -= sum * t4; + c__[j * c_dim1 + 5] -= sum * t5; + } + goto L410; + L110: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + v5 = v[5]; + t5 = *tau * v5; + v6 = v[6]; + t6 = *tau * v6; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + + v4 * c__[j * c_dim1 + 4] + v5 * c__[j * c_dim1 + 5] + v6 * c__[j * c_dim1 + 6]; + c__[j * c_dim1 + 1] -= sum * t1; + c__[j * c_dim1 + 2] -= sum * t2; + c__[j * c_dim1 + 3] -= sum * t3; + c__[j * c_dim1 + 4] -= sum * t4; + c__[j * c_dim1 + 5] -= sum * t5; + c__[j * c_dim1 + 6] -= sum * t6; + } + goto L410; + L130: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + v5 = v[5]; + t5 = *tau * v5; + v6 = v[6]; + t6 = *tau * v6; + v7 = v[7]; + t7 = *tau * v7; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + + v4 * c__[j * c_dim1 + 4] + v5 * c__[j * c_dim1 + 5] + v6 * c__[j * c_dim1 + 6] + + v7 * c__[j * c_dim1 + 7]; + c__[j * c_dim1 + 1] -= sum * t1; + c__[j * c_dim1 + 2] -= sum * t2; + c__[j * c_dim1 + 3] -= sum * t3; + c__[j * c_dim1 + 4] -= sum * t4; + c__[j * c_dim1 + 5] -= sum * t5; + c__[j * c_dim1 + 6] -= sum * t6; + c__[j * c_dim1 + 7] -= sum * t7; + } + goto L410; + L150: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + v5 = v[5]; + t5 = *tau * v5; + v6 = v[6]; + t6 = *tau * v6; + v7 = v[7]; + t7 = *tau * v7; + v8 = v[8]; + t8 = *tau * v8; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + + v4 * c__[j * c_dim1 + 4] + v5 * c__[j * c_dim1 + 5] + v6 * c__[j * c_dim1 + 6] + + v7 * c__[j * c_dim1 + 7] + v8 * c__[j * c_dim1 + 8]; + c__[j * c_dim1 + 1] -= sum * t1; + c__[j * c_dim1 + 2] -= sum * t2; + c__[j * c_dim1 + 3] -= sum * t3; + c__[j * c_dim1 + 4] -= sum * t4; + c__[j * c_dim1 + 5] -= sum * t5; + c__[j * c_dim1 + 6] -= sum * t6; + c__[j * c_dim1 + 7] -= sum * t7; + c__[j * c_dim1 + 8] -= sum * t8; + } + goto L410; + L170: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + v5 = v[5]; + t5 = *tau * v5; + v6 = v[6]; + t6 = *tau * v6; + v7 = v[7]; + t7 = *tau * v7; + v8 = v[8]; + t8 = *tau * v8; + v9 = v[9]; + t9 = *tau * v9; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + + v4 * c__[j * c_dim1 + 4] + v5 * c__[j * c_dim1 + 5] + v6 * c__[j * c_dim1 + 6] + + v7 * c__[j * c_dim1 + 7] + v8 * c__[j * c_dim1 + 8] + v9 * c__[j * c_dim1 + 9]; + c__[j * c_dim1 + 1] -= sum * t1; + c__[j * c_dim1 + 2] -= sum * t2; + c__[j * c_dim1 + 3] -= sum * t3; + c__[j * c_dim1 + 4] -= sum * t4; + c__[j * c_dim1 + 5] -= sum * t5; + c__[j * c_dim1 + 6] -= sum * t6; + c__[j * c_dim1 + 7] -= sum * t7; + c__[j * c_dim1 + 8] -= sum * t8; + c__[j * c_dim1 + 9] -= sum * t9; + } + goto L410; + L190: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + v5 = v[5]; + t5 = *tau * v5; + v6 = v[6]; + t6 = *tau * v6; + v7 = v[7]; + t7 = *tau * v7; + v8 = v[8]; + t8 = *tau * v8; + v9 = v[9]; + t9 = *tau * v9; + v10 = v[10]; + t10 = *tau * v10; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j * c_dim1 + 1] + v2 * c__[j * c_dim1 + 2] + v3 * c__[j * c_dim1 + 3] + + v4 * c__[j * c_dim1 + 4] + v5 * c__[j * c_dim1 + 5] + v6 * c__[j * c_dim1 + 6] + + v7 * c__[j * c_dim1 + 7] + v8 * c__[j * c_dim1 + 8] + v9 * c__[j * c_dim1 + 9] + + v10 * c__[j * c_dim1 + 10]; + c__[j * c_dim1 + 1] -= sum * t1; + c__[j * c_dim1 + 2] -= sum * t2; + c__[j * c_dim1 + 3] -= sum * t3; + c__[j * c_dim1 + 4] -= sum * t4; + c__[j * c_dim1 + 5] -= sum * t5; + c__[j * c_dim1 + 6] -= sum * t6; + c__[j * c_dim1 + 7] -= sum * t7; + c__[j * c_dim1 + 8] -= sum * t8; + c__[j * c_dim1 + 9] -= sum * t9; + c__[j * c_dim1 + 10] -= sum * t10; + } + goto L410; + } else { + switch (*n) { + case 1: + goto L210; + case 2: + goto L230; + case 3: + goto L250; + case 4: + goto L270; + case 5: + goto L290; + case 6: + goto L310; + case 7: + goto L330; + case 8: + goto L350; + case 9: + goto L370; + case 10: + goto L390; + } + dlarf_(side, m, n, &v[1], &c__1, tau, &c__[c_offset], ldc, &work[1], (ftnlen)1); + goto L410; + L210: + t1 = 1. - *tau * v[1] * v[1]; + i__1 = *m; + for (j = 1; j <= i__1; ++j) { + c__[j + c_dim1] = t1 * c__[j + c_dim1]; + } + goto L410; + L230: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + i__1 = *m; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)]; + c__[j + c_dim1] -= sum * t1; + c__[j + (c_dim1 << 1)] -= sum * t2; + } + goto L410; + L250: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + i__1 = *m; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3]; + c__[j + c_dim1] -= sum * t1; + c__[j + (c_dim1 << 1)] -= sum * t2; + c__[j + c_dim1 * 3] -= sum * t3; + } + goto L410; + L270: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + i__1 = *m; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + + v4 * c__[j + (c_dim1 << 2)]; + c__[j + c_dim1] -= sum * t1; + c__[j + (c_dim1 << 1)] -= sum * t2; + c__[j + c_dim1 * 3] -= sum * t3; + c__[j + (c_dim1 << 2)] -= sum * t4; + } + goto L410; + L290: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + v5 = v[5]; + t5 = *tau * v5; + i__1 = *m; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + + v4 * c__[j + (c_dim1 << 2)] + v5 * c__[j + c_dim1 * 5]; + c__[j + c_dim1] -= sum * t1; + c__[j + (c_dim1 << 1)] -= sum * t2; + c__[j + c_dim1 * 3] -= sum * t3; + c__[j + (c_dim1 << 2)] -= sum * t4; + c__[j + c_dim1 * 5] -= sum * t5; + } + goto L410; + L310: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + v5 = v[5]; + t5 = *tau * v5; + v6 = v[6]; + t6 = *tau * v6; + i__1 = *m; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + + v4 * c__[j + (c_dim1 << 2)] + v5 * c__[j + c_dim1 * 5] + v6 * c__[j + c_dim1 * 6]; + c__[j + c_dim1] -= sum * t1; + c__[j + (c_dim1 << 1)] -= sum * t2; + c__[j + c_dim1 * 3] -= sum * t3; + c__[j + (c_dim1 << 2)] -= sum * t4; + c__[j + c_dim1 * 5] -= sum * t5; + c__[j + c_dim1 * 6] -= sum * t6; + } + goto L410; + L330: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + v5 = v[5]; + t5 = *tau * v5; + v6 = v[6]; + t6 = *tau * v6; + v7 = v[7]; + t7 = *tau * v7; + i__1 = *m; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + + v4 * c__[j + (c_dim1 << 2)] + v5 * c__[j + c_dim1 * 5] + + v6 * c__[j + c_dim1 * 6] + v7 * c__[j + c_dim1 * 7]; + c__[j + c_dim1] -= sum * t1; + c__[j + (c_dim1 << 1)] -= sum * t2; + c__[j + c_dim1 * 3] -= sum * t3; + c__[j + (c_dim1 << 2)] -= sum * t4; + c__[j + c_dim1 * 5] -= sum * t5; + c__[j + c_dim1 * 6] -= sum * t6; + c__[j + c_dim1 * 7] -= sum * t7; + } + goto L410; + L350: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + v5 = v[5]; + t5 = *tau * v5; + v6 = v[6]; + t6 = *tau * v6; + v7 = v[7]; + t7 = *tau * v7; + v8 = v[8]; + t8 = *tau * v8; + i__1 = *m; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + + v4 * c__[j + (c_dim1 << 2)] + v5 * c__[j + c_dim1 * 5] + + v6 * c__[j + c_dim1 * 6] + v7 * c__[j + c_dim1 * 7] + v8 * c__[j + (c_dim1 << 3)]; + c__[j + c_dim1] -= sum * t1; + c__[j + (c_dim1 << 1)] -= sum * t2; + c__[j + c_dim1 * 3] -= sum * t3; + c__[j + (c_dim1 << 2)] -= sum * t4; + c__[j + c_dim1 * 5] -= sum * t5; + c__[j + c_dim1 * 6] -= sum * t6; + c__[j + c_dim1 * 7] -= sum * t7; + c__[j + (c_dim1 << 3)] -= sum * t8; + } + goto L410; + L370: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + v5 = v[5]; + t5 = *tau * v5; + v6 = v[6]; + t6 = *tau * v6; + v7 = v[7]; + t7 = *tau * v7; + v8 = v[8]; + t8 = *tau * v8; + v9 = v[9]; + t9 = *tau * v9; + i__1 = *m; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + + v4 * c__[j + (c_dim1 << 2)] + v5 * c__[j + c_dim1 * 5] + + v6 * c__[j + c_dim1 * 6] + v7 * c__[j + c_dim1 * 7] + + v8 * c__[j + (c_dim1 << 3)] + v9 * c__[j + c_dim1 * 9]; + c__[j + c_dim1] -= sum * t1; + c__[j + (c_dim1 << 1)] -= sum * t2; + c__[j + c_dim1 * 3] -= sum * t3; + c__[j + (c_dim1 << 2)] -= sum * t4; + c__[j + c_dim1 * 5] -= sum * t5; + c__[j + c_dim1 * 6] -= sum * t6; + c__[j + c_dim1 * 7] -= sum * t7; + c__[j + (c_dim1 << 3)] -= sum * t8; + c__[j + c_dim1 * 9] -= sum * t9; + } + goto L410; + L390: + v1 = v[1]; + t1 = *tau * v1; + v2 = v[2]; + t2 = *tau * v2; + v3 = v[3]; + t3 = *tau * v3; + v4 = v[4]; + t4 = *tau * v4; + v5 = v[5]; + t5 = *tau * v5; + v6 = v[6]; + t6 = *tau * v6; + v7 = v[7]; + t7 = *tau * v7; + v8 = v[8]; + t8 = *tau * v8; + v9 = v[9]; + t9 = *tau * v9; + v10 = v[10]; + t10 = *tau * v10; + i__1 = *m; + for (j = 1; j <= i__1; ++j) { + sum = v1 * c__[j + c_dim1] + v2 * c__[j + (c_dim1 << 1)] + v3 * c__[j + c_dim1 * 3] + + v4 * c__[j + (c_dim1 << 2)] + v5 * c__[j + c_dim1 * 5] + + v6 * c__[j + c_dim1 * 6] + v7 * c__[j + c_dim1 * 7] + + v8 * c__[j + (c_dim1 << 3)] + v9 * c__[j + c_dim1 * 9] + + v10 * c__[j + c_dim1 * 10]; + c__[j + c_dim1] -= sum * t1; + c__[j + (c_dim1 << 1)] -= sum * t2; + c__[j + c_dim1 * 3] -= sum * t3; + c__[j + (c_dim1 << 2)] -= sum * t4; + c__[j + c_dim1 * 5] -= sum * t5; + c__[j + c_dim1 * 6] -= sum * t6; + c__[j + c_dim1 * 7] -= sum * t7; + c__[j + (c_dim1 << 3)] -= sum * t8; + c__[j + c_dim1 * 9] -= sum * t9; + c__[j + c_dim1 * 10] -= sum * t10; + } + goto L410; + } +L410: + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlasd0.cpp b/lib/linalg/dlasd0.cpp new file mode 100644 index 0000000000..006c379fa9 --- /dev/null +++ b/lib/linalg/dlasd0.cpp @@ -0,0 +1,143 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__0 = 0; +static integer c__2 = 2; +int dlasd0_(integer *n, integer *sqre, doublereal *d__, doublereal *e, doublereal *u, integer *ldu, + doublereal *vt, integer *ldvt, integer *smlsiz, integer *iwork, doublereal *work, + integer *info) +{ + integer u_dim1, u_offset, vt_dim1, vt_offset, i__1, i__2; + integer pow_lmp_ii(integer *, integer *); + integer i__, j, m, i1, ic, lf, nd, ll, nl, nr, im1, ncc, nlf, nrf, iwk, lvl, ndb1, nlp1, nrp1; + doublereal beta; + integer idxq, nlvl; + doublereal alpha; + integer inode, ndiml, idxqc, ndimr, itemp, sqrei; + extern int dlasd1_(integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, integer *, integer *, integer *, + doublereal *, integer *), + dlasdq_(char *, integer *, integer *, integer *, integer *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen), + dlasdt_(integer *, integer *, integer *, integer *, integer *, integer *, integer *), + xerbla_(char *, integer *, ftnlen); + --d__; + --e; + u_dim1 = *ldu; + u_offset = 1 + u_dim1; + u -= u_offset; + vt_dim1 = *ldvt; + vt_offset = 1 + vt_dim1; + vt -= vt_offset; + --iwork; + --work; + *info = 0; + if (*n < 0) { + *info = -1; + } else if (*sqre < 0 || *sqre > 1) { + *info = -2; + } + m = *n + *sqre; + if (*ldu < *n) { + *info = -6; + } else if (*ldvt < m) { + *info = -8; + } else if (*smlsiz < 3) { + *info = -9; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLASD0", &i__1, (ftnlen)6); + return 0; + } + if (*n <= *smlsiz) { + dlasdq_((char *)"U", sqre, n, &m, n, &c__0, &d__[1], &e[1], &vt[vt_offset], ldvt, &u[u_offset], ldu, + &u[u_offset], ldu, &work[1], info, (ftnlen)1); + return 0; + } + inode = 1; + ndiml = inode + *n; + ndimr = ndiml + *n; + idxq = ndimr + *n; + iwk = idxq + *n; + dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], smlsiz); + ndb1 = (nd + 1) / 2; + ncc = 0; + i__1 = nd; + for (i__ = ndb1; i__ <= i__1; ++i__) { + i1 = i__ - 1; + ic = iwork[inode + i1]; + nl = iwork[ndiml + i1]; + nlp1 = nl + 1; + nr = iwork[ndimr + i1]; + nrp1 = nr + 1; + nlf = ic - nl; + nrf = ic + 1; + sqrei = 1; + dlasdq_((char *)"U", &sqrei, &nl, &nlp1, &nl, &ncc, &d__[nlf], &e[nlf], &vt[nlf + nlf * vt_dim1], + ldvt, &u[nlf + nlf * u_dim1], ldu, &u[nlf + nlf * u_dim1], ldu, &work[1], info, + (ftnlen)1); + if (*info != 0) { + return 0; + } + itemp = idxq + nlf - 2; + i__2 = nl; + for (j = 1; j <= i__2; ++j) { + iwork[itemp + j] = j; + } + if (i__ == nd) { + sqrei = *sqre; + } else { + sqrei = 1; + } + nrp1 = nr + sqrei; + dlasdq_((char *)"U", &sqrei, &nr, &nrp1, &nr, &ncc, &d__[nrf], &e[nrf], &vt[nrf + nrf * vt_dim1], + ldvt, &u[nrf + nrf * u_dim1], ldu, &u[nrf + nrf * u_dim1], ldu, &work[1], info, + (ftnlen)1); + if (*info != 0) { + return 0; + } + itemp = idxq + ic; + i__2 = nr; + for (j = 1; j <= i__2; ++j) { + iwork[itemp + j - 1] = j; + } + } + for (lvl = nlvl; lvl >= 1; --lvl) { + if (lvl == 1) { + lf = 1; + ll = 1; + } else { + i__1 = lvl - 1; + lf = pow_lmp_ii(&c__2, &i__1); + ll = (lf << 1) - 1; + } + i__1 = ll; + for (i__ = lf; i__ <= i__1; ++i__) { + im1 = i__ - 1; + ic = iwork[inode + im1]; + nl = iwork[ndiml + im1]; + nr = iwork[ndimr + im1]; + nlf = ic - nl; + if (*sqre == 0 && i__ == ll) { + sqrei = *sqre; + } else { + sqrei = 1; + } + idxqc = idxq + nlf - 1; + alpha = d__[ic]; + beta = e[ic]; + dlasd1_(&nl, &nr, &sqrei, &d__[nlf], &alpha, &beta, &u[nlf + nlf * u_dim1], ldu, + &vt[nlf + nlf * vt_dim1], ldvt, &iwork[idxqc], &iwork[iwk], &work[1], info); + if (*info != 0) { + return 0; + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlasd1.cpp b/lib/linalg/dlasd1.cpp new file mode 100644 index 0000000000..e7b7fba747 --- /dev/null +++ b/lib/linalg/dlasd1.cpp @@ -0,0 +1,96 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__0 = 0; +static doublereal c_b7 = 1.; +static integer c__1 = 1; +static integer c_n1 = -1; +int dlasd1_(integer *nl, integer *nr, integer *sqre, doublereal *d__, doublereal *alpha, + doublereal *beta, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, + integer *idxq, integer *iwork, doublereal *work, integer *info) +{ + integer u_dim1, u_offset, vt_dim1, vt_offset, i__1; + doublereal d__1, d__2; + integer i__, k, m, n, n1, n2, iq, iz, iu2, ldq, idx, ldu2, ivt2, idxc, idxp, ldvt2; + extern int dlasd2_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, + integer *, integer *, integer *, integer *, integer *), + dlasd3_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, integer *, integer *, doublereal *, integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen), + dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *); + integer isigma; + extern int xerbla_(char *, integer *, ftnlen); + doublereal orgnrm; + integer coltyp; + --d__; + u_dim1 = *ldu; + u_offset = 1 + u_dim1; + u -= u_offset; + vt_dim1 = *ldvt; + vt_offset = 1 + vt_dim1; + vt -= vt_offset; + --idxq; + --iwork; + --work; + *info = 0; + if (*nl < 1) { + *info = -1; + } else if (*nr < 1) { + *info = -2; + } else if (*sqre < 0 || *sqre > 1) { + *info = -3; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLASD1", &i__1, (ftnlen)6); + return 0; + } + n = *nl + *nr + 1; + m = n + *sqre; + ldu2 = n; + ldvt2 = m; + iz = 1; + isigma = iz + m; + iu2 = isigma + n; + ivt2 = iu2 + ldu2 * n; + iq = ivt2 + ldvt2 * m; + idx = 1; + idxc = idx + n; + coltyp = idxc + n; + idxp = coltyp + n; + d__1 = abs(*alpha), d__2 = abs(*beta); + orgnrm = max(d__1, d__2); + d__[*nl + 1] = 0.; + i__1 = n; + for (i__ = 1; i__ <= i__1; ++i__) { + if ((d__1 = d__[i__], abs(d__1)) > orgnrm) { + orgnrm = (d__1 = d__[i__], abs(d__1)); + } + } + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b7, &n, &c__1, &d__[1], &n, info, (ftnlen)1); + *alpha /= orgnrm; + *beta /= orgnrm; + dlasd2_(nl, nr, sqre, &k, &d__[1], &work[iz], alpha, beta, &u[u_offset], ldu, &vt[vt_offset], + ldvt, &work[isigma], &work[iu2], &ldu2, &work[ivt2], &ldvt2, &iwork[idxp], &iwork[idx], + &iwork[idxc], &idxq[1], &iwork[coltyp], info); + ldq = k; + dlasd3_(nl, nr, sqre, &k, &d__[1], &work[iq], &ldq, &work[isigma], &u[u_offset], ldu, + &work[iu2], &ldu2, &vt[vt_offset], ldvt, &work[ivt2], &ldvt2, &iwork[idxc], + &iwork[coltyp], &work[iz], info); + if (*info != 0) { + return 0; + } + dlascl_((char *)"G", &c__0, &c__0, &c_b7, &orgnrm, &n, &c__1, &d__[1], &n, info, (ftnlen)1); + n1 = k; + n2 = n - k; + dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &idxq[1]); + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlasd2.cpp b/lib/linalg/dlasd2.cpp new file mode 100644 index 0000000000..36562850e0 --- /dev/null +++ b/lib/linalg/dlasd2.cpp @@ -0,0 +1,282 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static doublereal c_b30 = 0.; +int dlasd2_(integer *nl, integer *nr, integer *sqre, integer *k, doublereal *d__, doublereal *z__, + doublereal *alpha, doublereal *beta, doublereal *u, integer *ldu, doublereal *vt, + integer *ldvt, doublereal *dsigma, doublereal *u2, integer *ldu2, doublereal *vt2, + integer *ldvt2, integer *idxp, integer *idx, integer *idxc, integer *idxq, + integer *coltyp, integer *info) +{ + integer u_dim1, u_offset, u2_dim1, u2_offset, vt_dim1, vt_offset, vt2_dim1, vt2_offset, i__1; + doublereal d__1, d__2; + doublereal c__; + integer i__, j, m, n; + doublereal s; + integer k2; + doublereal z1; + integer ct, jp; + doublereal eps, tau, tol; + integer psm[4], nlp1, nlp2, idxi, idxj; + extern int drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *); + integer ctot[4], idxjp; + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); + integer jprev; + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, ftnlen); + extern int dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen); + doublereal hlftol; + --d__; + --z__; + u_dim1 = *ldu; + u_offset = 1 + u_dim1; + u -= u_offset; + vt_dim1 = *ldvt; + vt_offset = 1 + vt_dim1; + vt -= vt_offset; + --dsigma; + u2_dim1 = *ldu2; + u2_offset = 1 + u2_dim1; + u2 -= u2_offset; + vt2_dim1 = *ldvt2; + vt2_offset = 1 + vt2_dim1; + vt2 -= vt2_offset; + --idxp; + --idx; + --idxc; + --idxq; + --coltyp; + *info = 0; + if (*nl < 1) { + *info = -1; + } else if (*nr < 1) { + *info = -2; + } else if (*sqre != 1 && *sqre != 0) { + *info = -3; + } + n = *nl + *nr + 1; + m = n + *sqre; + if (*ldu < n) { + *info = -10; + } else if (*ldvt < m) { + *info = -12; + } else if (*ldu2 < n) { + *info = -15; + } else if (*ldvt2 < m) { + *info = -17; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLASD2", &i__1, (ftnlen)6); + return 0; + } + nlp1 = *nl + 1; + nlp2 = *nl + 2; + z1 = *alpha * vt[nlp1 + nlp1 * vt_dim1]; + z__[1] = z1; + for (i__ = *nl; i__ >= 1; --i__) { + z__[i__ + 1] = *alpha * vt[i__ + nlp1 * vt_dim1]; + d__[i__ + 1] = d__[i__]; + idxq[i__ + 1] = idxq[i__] + 1; + } + i__1 = m; + for (i__ = nlp2; i__ <= i__1; ++i__) { + z__[i__] = *beta * vt[i__ + nlp2 * vt_dim1]; + } + i__1 = nlp1; + for (i__ = 2; i__ <= i__1; ++i__) { + coltyp[i__] = 1; + } + i__1 = n; + for (i__ = nlp2; i__ <= i__1; ++i__) { + coltyp[i__] = 2; + } + i__1 = n; + for (i__ = nlp2; i__ <= i__1; ++i__) { + idxq[i__] += nlp1; + } + i__1 = n; + for (i__ = 2; i__ <= i__1; ++i__) { + dsigma[i__] = d__[idxq[i__]]; + u2[i__ + u2_dim1] = z__[idxq[i__]]; + idxc[i__] = coltyp[idxq[i__]]; + } + dlamrg_(nl, nr, &dsigma[2], &c__1, &c__1, &idx[2]); + i__1 = n; + for (i__ = 2; i__ <= i__1; ++i__) { + idxi = idx[i__] + 1; + d__[i__] = dsigma[idxi]; + z__[i__] = u2[idxi + u2_dim1]; + coltyp[i__] = idxc[idxi]; + } + eps = dlamch_((char *)"Epsilon", (ftnlen)7); + d__1 = abs(*alpha), d__2 = abs(*beta); + tol = max(d__1, d__2); + d__2 = (d__1 = d__[n], abs(d__1)); + tol = eps * 8. * max(d__2, tol); + *k = 1; + k2 = n + 1; + i__1 = n; + for (j = 2; j <= i__1; ++j) { + if ((d__1 = z__[j], abs(d__1)) <= tol) { + --k2; + idxp[k2] = j; + coltyp[j] = 4; + if (j == n) { + goto L120; + } + } else { + jprev = j; + goto L90; + } + } +L90: + j = jprev; +L100: + ++j; + if (j > n) { + goto L110; + } + if ((d__1 = z__[j], abs(d__1)) <= tol) { + --k2; + idxp[k2] = j; + coltyp[j] = 4; + } else { + if ((d__1 = d__[j] - d__[jprev], abs(d__1)) <= tol) { + s = z__[jprev]; + c__ = z__[j]; + tau = dlapy2_(&c__, &s); + c__ /= tau; + s = -s / tau; + z__[j] = tau; + z__[jprev] = 0.; + idxjp = idxq[idx[jprev] + 1]; + idxj = idxq[idx[j] + 1]; + if (idxjp <= nlp1) { + --idxjp; + } + if (idxj <= nlp1) { + --idxj; + } + drot_(&n, &u[idxjp * u_dim1 + 1], &c__1, &u[idxj * u_dim1 + 1], &c__1, &c__, &s); + drot_(&m, &vt[idxjp + vt_dim1], ldvt, &vt[idxj + vt_dim1], ldvt, &c__, &s); + if (coltyp[j] != coltyp[jprev]) { + coltyp[j] = 3; + } + coltyp[jprev] = 4; + --k2; + idxp[k2] = jprev; + jprev = j; + } else { + ++(*k); + u2[*k + u2_dim1] = z__[jprev]; + dsigma[*k] = d__[jprev]; + idxp[*k] = jprev; + jprev = j; + } + } + goto L100; +L110: + ++(*k); + u2[*k + u2_dim1] = z__[jprev]; + dsigma[*k] = d__[jprev]; + idxp[*k] = jprev; +L120: + for (j = 1; j <= 4; ++j) { + ctot[j - 1] = 0; + } + i__1 = n; + for (j = 2; j <= i__1; ++j) { + ct = coltyp[j]; + ++ctot[ct - 1]; + } + psm[0] = 2; + psm[1] = ctot[0] + 2; + psm[2] = psm[1] + ctot[1]; + psm[3] = psm[2] + ctot[2]; + i__1 = n; + for (j = 2; j <= i__1; ++j) { + jp = idxp[j]; + ct = coltyp[jp]; + idxc[psm[ct - 1]] = j; + ++psm[ct - 1]; + } + i__1 = n; + for (j = 2; j <= i__1; ++j) { + jp = idxp[j]; + dsigma[j] = d__[jp]; + idxj = idxq[idx[idxp[idxc[j]]] + 1]; + if (idxj <= nlp1) { + --idxj; + } + dcopy_(&n, &u[idxj * u_dim1 + 1], &c__1, &u2[j * u2_dim1 + 1], &c__1); + dcopy_(&m, &vt[idxj + vt_dim1], ldvt, &vt2[j + vt2_dim1], ldvt2); + } + dsigma[1] = 0.; + hlftol = tol / 2.; + if (abs(dsigma[2]) <= hlftol) { + dsigma[2] = hlftol; + } + if (m > n) { + z__[1] = dlapy2_(&z1, &z__[m]); + if (z__[1] <= tol) { + c__ = 1.; + s = 0.; + z__[1] = tol; + } else { + c__ = z1 / z__[1]; + s = z__[m] / z__[1]; + } + } else { + if (abs(z1) <= tol) { + z__[1] = tol; + } else { + z__[1] = z1; + } + } + i__1 = *k - 1; + dcopy_(&i__1, &u2[u2_dim1 + 2], &c__1, &z__[2], &c__1); + dlaset_((char *)"A", &n, &c__1, &c_b30, &c_b30, &u2[u2_offset], ldu2, (ftnlen)1); + u2[nlp1 + u2_dim1] = 1.; + if (m > n) { + i__1 = nlp1; + for (i__ = 1; i__ <= i__1; ++i__) { + vt[m + i__ * vt_dim1] = -s * vt[nlp1 + i__ * vt_dim1]; + vt2[i__ * vt2_dim1 + 1] = c__ * vt[nlp1 + i__ * vt_dim1]; + } + i__1 = m; + for (i__ = nlp2; i__ <= i__1; ++i__) { + vt2[i__ * vt2_dim1 + 1] = s * vt[m + i__ * vt_dim1]; + vt[m + i__ * vt_dim1] = c__ * vt[m + i__ * vt_dim1]; + } + } else { + dcopy_(&m, &vt[nlp1 + vt_dim1], ldvt, &vt2[vt2_dim1 + 1], ldvt2); + } + if (m > n) { + dcopy_(&m, &vt[m + vt_dim1], ldvt, &vt2[m + vt2_dim1], ldvt2); + } + if (n > *k) { + i__1 = n - *k; + dcopy_(&i__1, &dsigma[*k + 1], &c__1, &d__[*k + 1], &c__1); + i__1 = n - *k; + dlacpy_((char *)"A", &n, &i__1, &u2[(*k + 1) * u2_dim1 + 1], ldu2, &u[(*k + 1) * u_dim1 + 1], ldu, + (ftnlen)1); + i__1 = n - *k; + dlacpy_((char *)"A", &i__1, &m, &vt2[*k + 1 + vt2_dim1], ldvt2, &vt[*k + 1 + vt_dim1], ldvt, + (ftnlen)1); + } + for (j = 1; j <= 4; ++j) { + coltyp[j] = ctot[j - 1]; + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlasd3.cpp b/lib/linalg/dlasd3.cpp new file mode 100644 index 0000000000..745c613e08 --- /dev/null +++ b/lib/linalg/dlasd3.cpp @@ -0,0 +1,218 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c__0 = 0; +static doublereal c_b13 = 1.; +static doublereal c_b26 = 0.; +int dlasd3_(integer *nl, integer *nr, integer *sqre, integer *k, doublereal *d__, doublereal *q, + integer *ldq, doublereal *dsigma, doublereal *u, integer *ldu, doublereal *u2, + integer *ldu2, doublereal *vt, integer *ldvt, doublereal *vt2, integer *ldvt2, + integer *idxc, integer *ctot, doublereal *z__, integer *info) +{ + integer q_dim1, q_offset, u_dim1, u_offset, u2_dim1, u2_offset, vt_dim1, vt_offset, vt2_dim1, + vt2_offset, i__1, i__2; + doublereal d__1, d__2; + double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); + integer i__, j, m, n, jc; + doublereal rho; + integer nlp1, nlp2, nrp1; + doublereal temp; + extern doublereal dnrm2_(integer *, doublereal *, integer *); + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); + integer ctemp; + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); + integer ktemp; + extern doublereal dlamc3_(doublereal *, doublereal *); + extern int dlasd4_(integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen); + --d__; + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + --dsigma; + u_dim1 = *ldu; + u_offset = 1 + u_dim1; + u -= u_offset; + u2_dim1 = *ldu2; + u2_offset = 1 + u2_dim1; + u2 -= u2_offset; + vt_dim1 = *ldvt; + vt_offset = 1 + vt_dim1; + vt -= vt_offset; + vt2_dim1 = *ldvt2; + vt2_offset = 1 + vt2_dim1; + vt2 -= vt2_offset; + --idxc; + --ctot; + --z__; + *info = 0; + if (*nl < 1) { + *info = -1; + } else if (*nr < 1) { + *info = -2; + } else if (*sqre != 1 && *sqre != 0) { + *info = -3; + } + n = *nl + *nr + 1; + m = n + *sqre; + nlp1 = *nl + 1; + nlp2 = *nl + 2; + if (*k < 1 || *k > n) { + *info = -4; + } else if (*ldq < *k) { + *info = -7; + } else if (*ldu < n) { + *info = -10; + } else if (*ldu2 < n) { + *info = -12; + } else if (*ldvt < m) { + *info = -14; + } else if (*ldvt2 < m) { + *info = -16; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLASD3", &i__1, (ftnlen)6); + return 0; + } + if (*k == 1) { + d__[1] = abs(z__[1]); + dcopy_(&m, &vt2[vt2_dim1 + 1], ldvt2, &vt[vt_dim1 + 1], ldvt); + if (z__[1] > 0.) { + dcopy_(&n, &u2[u2_dim1 + 1], &c__1, &u[u_dim1 + 1], &c__1); + } else { + i__1 = n; + for (i__ = 1; i__ <= i__1; ++i__) { + u[i__ + u_dim1] = -u2[i__ + u2_dim1]; + } + } + return 0; + } + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + dsigma[i__] = dlamc3_(&dsigma[i__], &dsigma[i__]) - dsigma[i__]; + } + dcopy_(k, &z__[1], &c__1, &q[q_offset], &c__1); + rho = dnrm2_(k, &z__[1], &c__1); + dlascl_((char *)"G", &c__0, &c__0, &rho, &c_b13, k, &c__1, &z__[1], k, info, (ftnlen)1); + rho *= rho; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dlasd4_(k, &j, &dsigma[1], &z__[1], &u[j * u_dim1 + 1], &rho, &d__[j], &vt[j * vt_dim1 + 1], + info); + if (*info != 0) { + return 0; + } + } + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + z__[i__] = u[i__ + *k * u_dim1] * vt[i__ + *k * vt_dim1]; + i__2 = i__ - 1; + for (j = 1; j <= i__2; ++j) { + z__[i__] *= u[i__ + j * u_dim1] * vt[i__ + j * vt_dim1] / (dsigma[i__] - dsigma[j]) / + (dsigma[i__] + dsigma[j]); + } + i__2 = *k - 1; + for (j = i__; j <= i__2; ++j) { + z__[i__] *= u[i__ + j * u_dim1] * vt[i__ + j * vt_dim1] / + (dsigma[i__] - dsigma[j + 1]) / (dsigma[i__] + dsigma[j + 1]); + } + d__2 = sqrt((d__1 = z__[i__], abs(d__1))); + z__[i__] = d_lmp_sign(&d__2, &q[i__ + q_dim1]); + } + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + vt[i__ * vt_dim1 + 1] = z__[1] / u[i__ * u_dim1 + 1] / vt[i__ * vt_dim1 + 1]; + u[i__ * u_dim1 + 1] = -1.; + i__2 = *k; + for (j = 2; j <= i__2; ++j) { + vt[j + i__ * vt_dim1] = z__[j] / u[j + i__ * u_dim1] / vt[j + i__ * vt_dim1]; + u[j + i__ * u_dim1] = dsigma[j] * vt[j + i__ * vt_dim1]; + } + temp = dnrm2_(k, &u[i__ * u_dim1 + 1], &c__1); + q[i__ * q_dim1 + 1] = u[i__ * u_dim1 + 1] / temp; + i__2 = *k; + for (j = 2; j <= i__2; ++j) { + jc = idxc[j]; + q[j + i__ * q_dim1] = u[jc + i__ * u_dim1] / temp; + } + } + if (*k == 2) { + dgemm_((char *)"N", (char *)"N", &n, k, k, &c_b13, &u2[u2_offset], ldu2, &q[q_offset], ldq, &c_b26, + &u[u_offset], ldu, (ftnlen)1, (ftnlen)1); + goto L100; + } + if (ctot[1] > 0) { + dgemm_((char *)"N", (char *)"N", nl, k, &ctot[1], &c_b13, &u2[(u2_dim1 << 1) + 1], ldu2, &q[q_dim1 + 2], + ldq, &c_b26, &u[u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1); + if (ctot[3] > 0) { + ktemp = ctot[1] + 2 + ctot[2]; + dgemm_((char *)"N", (char *)"N", nl, k, &ctot[3], &c_b13, &u2[ktemp * u2_dim1 + 1], ldu2, + &q[ktemp + q_dim1], ldq, &c_b13, &u[u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1); + } + } else if (ctot[3] > 0) { + ktemp = ctot[1] + 2 + ctot[2]; + dgemm_((char *)"N", (char *)"N", nl, k, &ctot[3], &c_b13, &u2[ktemp * u2_dim1 + 1], ldu2, + &q[ktemp + q_dim1], ldq, &c_b26, &u[u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1); + } else { + dlacpy_((char *)"F", nl, k, &u2[u2_offset], ldu2, &u[u_offset], ldu, (ftnlen)1); + } + dcopy_(k, &q[q_dim1 + 1], ldq, &u[nlp1 + u_dim1], ldu); + ktemp = ctot[1] + 2; + ctemp = ctot[2] + ctot[3]; + dgemm_((char *)"N", (char *)"N", nr, k, &ctemp, &c_b13, &u2[nlp2 + ktemp * u2_dim1], ldu2, &q[ktemp + q_dim1], + ldq, &c_b26, &u[nlp2 + u_dim1], ldu, (ftnlen)1, (ftnlen)1); +L100: + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = dnrm2_(k, &vt[i__ * vt_dim1 + 1], &c__1); + q[i__ + q_dim1] = vt[i__ * vt_dim1 + 1] / temp; + i__2 = *k; + for (j = 2; j <= i__2; ++j) { + jc = idxc[j]; + q[i__ + j * q_dim1] = vt[jc + i__ * vt_dim1] / temp; + } + } + if (*k == 2) { + dgemm_((char *)"N", (char *)"N", k, &m, k, &c_b13, &q[q_offset], ldq, &vt2[vt2_offset], ldvt2, &c_b26, + &vt[vt_offset], ldvt, (ftnlen)1, (ftnlen)1); + return 0; + } + ktemp = ctot[1] + 1; + dgemm_((char *)"N", (char *)"N", k, &nlp1, &ktemp, &c_b13, &q[q_dim1 + 1], ldq, &vt2[vt2_dim1 + 1], ldvt2, + &c_b26, &vt[vt_dim1 + 1], ldvt, (ftnlen)1, (ftnlen)1); + ktemp = ctot[1] + 2 + ctot[2]; + if (ktemp <= *ldvt2) { + dgemm_((char *)"N", (char *)"N", k, &nlp1, &ctot[3], &c_b13, &q[ktemp * q_dim1 + 1], ldq, + &vt2[ktemp + vt2_dim1], ldvt2, &c_b13, &vt[vt_dim1 + 1], ldvt, (ftnlen)1, (ftnlen)1); + } + ktemp = ctot[1] + 1; + nrp1 = *nr + *sqre; + if (ktemp > 1) { + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + q[i__ + ktemp * q_dim1] = q[i__ + q_dim1]; + } + i__1 = m; + for (i__ = nlp2; i__ <= i__1; ++i__) { + vt2[ktemp + i__ * vt2_dim1] = vt2[i__ * vt2_dim1 + 1]; + } + } + ctemp = ctot[2] + 1 + ctot[3]; + dgemm_((char *)"N", (char *)"N", k, &nrp1, &ctemp, &c_b13, &q[ktemp * q_dim1 + 1], ldq, + &vt2[ktemp + nlp2 * vt2_dim1], ldvt2, &c_b26, &vt[nlp2 * vt_dim1 + 1], ldvt, (ftnlen)1, + (ftnlen)1); + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlasy2.cpp b/lib/linalg/dlasy2.cpp new file mode 100644 index 0000000000..94e9ed0e7c --- /dev/null +++ b/lib/linalg/dlasy2.cpp @@ -0,0 +1,284 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__4 = 4; +static integer c__1 = 1; +static integer c__16 = 16; +static integer c__0 = 0; +int dlasy2_(logical *ltranl, logical *ltranr, integer *isgn, integer *n1, integer *n2, + doublereal *tl, integer *ldtl, doublereal *tr, integer *ldtr, doublereal *b, + integer *ldb, doublereal *scale, doublereal *x, integer *ldx, doublereal *xnorm, + integer *info) +{ + static integer locu12[4] = {3, 4, 1, 2}; + static integer locl21[4] = {2, 1, 4, 3}; + static integer locu22[4] = {4, 3, 2, 1}; + static logical xswpiv[4] = {FALSE_, FALSE_, TRUE_, TRUE_}; + static logical bswpiv[4] = {FALSE_, TRUE_, FALSE_, TRUE_}; + integer b_dim1, b_offset, tl_dim1, tl_offset, tr_dim1, tr_offset, x_dim1, x_offset; + doublereal d__1, d__2, d__3, d__4, d__5, d__6, d__7, d__8; + integer i__, j, k; + doublereal x2[2], l21, u11, u12; + integer ip, jp; + doublereal u22, t16[16], gam, bet, eps, sgn, tmp[4], tau1, btmp[4], smin; + integer ipiv; + doublereal temp; + integer jpiv[4]; + doublereal xmax; + integer ipsv, jpsv; + logical bswap; + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), + dswap_(integer *, doublereal *, integer *, doublereal *, integer *); + logical xswap; + extern doublereal dlamch_(char *, ftnlen); + extern integer idamax_(integer *, doublereal *, integer *); + doublereal smlnum; + tl_dim1 = *ldtl; + tl_offset = 1 + tl_dim1; + tl -= tl_offset; + tr_dim1 = *ldtr; + tr_offset = 1 + tr_dim1; + tr -= tr_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + x_dim1 = *ldx; + x_offset = 1 + x_dim1; + x -= x_offset; + *info = 0; + if (*n1 == 0 || *n2 == 0) { + return 0; + } + eps = dlamch_((char *)"P", (ftnlen)1); + smlnum = dlamch_((char *)"S", (ftnlen)1) / eps; + sgn = (doublereal)(*isgn); + k = *n1 + *n1 + *n2 - 2; + switch (k) { + case 1: + goto L10; + case 2: + goto L20; + case 3: + goto L30; + case 4: + goto L50; + } +L10: + tau1 = tl[tl_dim1 + 1] + sgn * tr[tr_dim1 + 1]; + bet = abs(tau1); + if (bet <= smlnum) { + tau1 = smlnum; + bet = smlnum; + *info = 1; + } + *scale = 1.; + gam = (d__1 = b[b_dim1 + 1], abs(d__1)); + if (smlnum * gam > bet) { + *scale = 1. / gam; + } + x[x_dim1 + 1] = b[b_dim1 + 1] * *scale / tau1; + *xnorm = (d__1 = x[x_dim1 + 1], abs(d__1)); + return 0; +L20: + d__7 = (d__1 = tl[tl_dim1 + 1], abs(d__1)), d__8 = (d__2 = tr[tr_dim1 + 1], abs(d__2)), + d__7 = max(d__7, d__8), d__8 = (d__3 = tr[(tr_dim1 << 1) + 1], abs(d__3)), + d__7 = max(d__7, d__8), d__8 = (d__4 = tr[tr_dim1 + 2], abs(d__4)), d__7 = max(d__7, d__8), + d__8 = (d__5 = tr[(tr_dim1 << 1) + 2], abs(d__5)); + d__6 = eps * max(d__7, d__8); + smin = max(d__6, smlnum); + tmp[0] = tl[tl_dim1 + 1] + sgn * tr[tr_dim1 + 1]; + tmp[3] = tl[tl_dim1 + 1] + sgn * tr[(tr_dim1 << 1) + 2]; + if (*ltranr) { + tmp[1] = sgn * tr[tr_dim1 + 2]; + tmp[2] = sgn * tr[(tr_dim1 << 1) + 1]; + } else { + tmp[1] = sgn * tr[(tr_dim1 << 1) + 1]; + tmp[2] = sgn * tr[tr_dim1 + 2]; + } + btmp[0] = b[b_dim1 + 1]; + btmp[1] = b[(b_dim1 << 1) + 1]; + goto L40; +L30: + d__7 = (d__1 = tr[tr_dim1 + 1], abs(d__1)), d__8 = (d__2 = tl[tl_dim1 + 1], abs(d__2)), + d__7 = max(d__7, d__8), d__8 = (d__3 = tl[(tl_dim1 << 1) + 1], abs(d__3)), + d__7 = max(d__7, d__8), d__8 = (d__4 = tl[tl_dim1 + 2], abs(d__4)), d__7 = max(d__7, d__8), + d__8 = (d__5 = tl[(tl_dim1 << 1) + 2], abs(d__5)); + d__6 = eps * max(d__7, d__8); + smin = max(d__6, smlnum); + tmp[0] = tl[tl_dim1 + 1] + sgn * tr[tr_dim1 + 1]; + tmp[3] = tl[(tl_dim1 << 1) + 2] + sgn * tr[tr_dim1 + 1]; + if (*ltranl) { + tmp[1] = tl[(tl_dim1 << 1) + 1]; + tmp[2] = tl[tl_dim1 + 2]; + } else { + tmp[1] = tl[tl_dim1 + 2]; + tmp[2] = tl[(tl_dim1 << 1) + 1]; + } + btmp[0] = b[b_dim1 + 1]; + btmp[1] = b[b_dim1 + 2]; +L40: + ipiv = idamax_(&c__4, tmp, &c__1); + u11 = tmp[ipiv - 1]; + if (abs(u11) <= smin) { + *info = 1; + u11 = smin; + } + u12 = tmp[locu12[ipiv - 1] - 1]; + l21 = tmp[locl21[ipiv - 1] - 1] / u11; + u22 = tmp[locu22[ipiv - 1] - 1] - u12 * l21; + xswap = xswpiv[ipiv - 1]; + bswap = bswpiv[ipiv - 1]; + if (abs(u22) <= smin) { + *info = 1; + u22 = smin; + } + if (bswap) { + temp = btmp[1]; + btmp[1] = btmp[0] - l21 * temp; + btmp[0] = temp; + } else { + btmp[1] -= l21 * btmp[0]; + } + *scale = 1.; + if (smlnum * 2. * abs(btmp[1]) > abs(u22) || smlnum * 2. * abs(btmp[0]) > abs(u11)) { + d__1 = abs(btmp[0]), d__2 = abs(btmp[1]); + *scale = .5 / max(d__1, d__2); + btmp[0] *= *scale; + btmp[1] *= *scale; + } + x2[1] = btmp[1] / u22; + x2[0] = btmp[0] / u11 - u12 / u11 * x2[1]; + if (xswap) { + temp = x2[1]; + x2[1] = x2[0]; + x2[0] = temp; + } + x[x_dim1 + 1] = x2[0]; + if (*n1 == 1) { + x[(x_dim1 << 1) + 1] = x2[1]; + *xnorm = (d__1 = x[x_dim1 + 1], abs(d__1)) + (d__2 = x[(x_dim1 << 1) + 1], abs(d__2)); + } else { + x[x_dim1 + 2] = x2[1]; + d__3 = (d__1 = x[x_dim1 + 1], abs(d__1)), d__4 = (d__2 = x[x_dim1 + 2], abs(d__2)); + *xnorm = max(d__3, d__4); + } + return 0; +L50: + d__5 = (d__1 = tr[tr_dim1 + 1], abs(d__1)), d__6 = (d__2 = tr[(tr_dim1 << 1) + 1], abs(d__2)), + d__5 = max(d__5, d__6), d__6 = (d__3 = tr[tr_dim1 + 2], abs(d__3)), d__5 = max(d__5, d__6), + d__6 = (d__4 = tr[(tr_dim1 << 1) + 2], abs(d__4)); + smin = max(d__5, d__6); + d__5 = smin, d__6 = (d__1 = tl[tl_dim1 + 1], abs(d__1)), d__5 = max(d__5, d__6), + d__6 = (d__2 = tl[(tl_dim1 << 1) + 1], abs(d__2)), d__5 = max(d__5, d__6), + d__6 = (d__3 = tl[tl_dim1 + 2], abs(d__3)), d__5 = max(d__5, d__6), + d__6 = (d__4 = tl[(tl_dim1 << 1) + 2], abs(d__4)); + smin = max(d__5, d__6); + d__1 = eps * smin; + smin = max(d__1, smlnum); + btmp[0] = 0.; + dcopy_(&c__16, btmp, &c__0, t16, &c__1); + t16[0] = tl[tl_dim1 + 1] + sgn * tr[tr_dim1 + 1]; + t16[5] = tl[(tl_dim1 << 1) + 2] + sgn * tr[tr_dim1 + 1]; + t16[10] = tl[tl_dim1 + 1] + sgn * tr[(tr_dim1 << 1) + 2]; + t16[15] = tl[(tl_dim1 << 1) + 2] + sgn * tr[(tr_dim1 << 1) + 2]; + if (*ltranl) { + t16[4] = tl[tl_dim1 + 2]; + t16[1] = tl[(tl_dim1 << 1) + 1]; + t16[14] = tl[tl_dim1 + 2]; + t16[11] = tl[(tl_dim1 << 1) + 1]; + } else { + t16[4] = tl[(tl_dim1 << 1) + 1]; + t16[1] = tl[tl_dim1 + 2]; + t16[14] = tl[(tl_dim1 << 1) + 1]; + t16[11] = tl[tl_dim1 + 2]; + } + if (*ltranr) { + t16[8] = sgn * tr[(tr_dim1 << 1) + 1]; + t16[13] = sgn * tr[(tr_dim1 << 1) + 1]; + t16[2] = sgn * tr[tr_dim1 + 2]; + t16[7] = sgn * tr[tr_dim1 + 2]; + } else { + t16[8] = sgn * tr[tr_dim1 + 2]; + t16[13] = sgn * tr[tr_dim1 + 2]; + t16[2] = sgn * tr[(tr_dim1 << 1) + 1]; + t16[7] = sgn * tr[(tr_dim1 << 1) + 1]; + } + btmp[0] = b[b_dim1 + 1]; + btmp[1] = b[b_dim1 + 2]; + btmp[2] = b[(b_dim1 << 1) + 1]; + btmp[3] = b[(b_dim1 << 1) + 2]; + for (i__ = 1; i__ <= 3; ++i__) { + xmax = 0.; + for (ip = i__; ip <= 4; ++ip) { + for (jp = i__; jp <= 4; ++jp) { + if ((d__1 = t16[ip + (jp << 2) - 5], abs(d__1)) >= xmax) { + xmax = (d__1 = t16[ip + (jp << 2) - 5], abs(d__1)); + ipsv = ip; + jpsv = jp; + } + } + } + if (ipsv != i__) { + dswap_(&c__4, &t16[ipsv - 1], &c__4, &t16[i__ - 1], &c__4); + temp = btmp[i__ - 1]; + btmp[i__ - 1] = btmp[ipsv - 1]; + btmp[ipsv - 1] = temp; + } + if (jpsv != i__) { + dswap_(&c__4, &t16[(jpsv << 2) - 4], &c__1, &t16[(i__ << 2) - 4], &c__1); + } + jpiv[i__ - 1] = jpsv; + if ((d__1 = t16[i__ + (i__ << 2) - 5], abs(d__1)) < smin) { + *info = 1; + t16[i__ + (i__ << 2) - 5] = smin; + } + for (j = i__ + 1; j <= 4; ++j) { + t16[j + (i__ << 2) - 5] /= t16[i__ + (i__ << 2) - 5]; + btmp[j - 1] -= t16[j + (i__ << 2) - 5] * btmp[i__ - 1]; + for (k = i__ + 1; k <= 4; ++k) { + t16[j + (k << 2) - 5] -= t16[j + (i__ << 2) - 5] * t16[i__ + (k << 2) - 5]; + } + } + } + if (abs(t16[15]) < smin) { + *info = 1; + t16[15] = smin; + } + *scale = 1.; + if (smlnum * 8. * abs(btmp[0]) > abs(t16[0]) || smlnum * 8. * abs(btmp[1]) > abs(t16[5]) || + smlnum * 8. * abs(btmp[2]) > abs(t16[10]) || smlnum * 8. * abs(btmp[3]) > abs(t16[15])) { + d__1 = abs(btmp[0]), d__2 = abs(btmp[1]), d__1 = max(d__1, d__2), d__2 = abs(btmp[2]), + d__1 = max(d__1, d__2), d__2 = abs(btmp[3]); + *scale = .125 / max(d__1, d__2); + btmp[0] *= *scale; + btmp[1] *= *scale; + btmp[2] *= *scale; + btmp[3] *= *scale; + } + for (i__ = 1; i__ <= 4; ++i__) { + k = 5 - i__; + temp = 1. / t16[k + (k << 2) - 5]; + tmp[k - 1] = btmp[k - 1] * temp; + for (j = k + 1; j <= 4; ++j) { + tmp[k - 1] -= temp * t16[k + (j << 2) - 5] * tmp[j - 1]; + } + } + for (i__ = 1; i__ <= 3; ++i__) { + if (jpiv[4 - i__ - 1] != 4 - i__) { + temp = tmp[4 - i__ - 1]; + tmp[4 - i__ - 1] = tmp[jpiv[4 - i__ - 1] - 1]; + tmp[jpiv[4 - i__ - 1] - 1] = temp; + } + } + x[x_dim1 + 1] = tmp[0]; + x[x_dim1 + 2] = tmp[1]; + x[(x_dim1 << 1) + 1] = tmp[2]; + x[(x_dim1 << 1) + 2] = tmp[3]; + d__1 = abs(tmp[0]) + abs(tmp[2]), d__2 = abs(tmp[1]) + abs(tmp[3]); + *xnorm = max(d__1, d__2); + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dlasyf.cpp b/lib/linalg/dlasyf.cpp new file mode 100644 index 0000000000..aaafd1a88f --- /dev/null +++ b/lib/linalg/dlasyf.cpp @@ -0,0 +1,337 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static doublereal c_b8 = -1.; +static doublereal c_b9 = 1.; +int dlasyf_(char *uplo, integer *n, integer *nb, integer *kb, doublereal *a, integer *lda, + integer *ipiv, doublereal *w, integer *ldw, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3, i__4, i__5; + doublereal d__1, d__2, d__3; + double sqrt(doublereal); + integer j, k; + doublereal t, r1, d11, d21, d22; + integer jb, jj, kk, jp, kp, kw, kkw, imax, jmax; + doublereal alpha; + extern int dscal_(integer *, doublereal *, doublereal *, integer *), + dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), + dswap_(integer *, doublereal *, integer *, doublereal *, integer *); + integer kstep; + doublereal absakk; + extern integer idamax_(integer *, doublereal *, integer *); + doublereal colmax, rowmax; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + w_dim1 = *ldw; + w_offset = 1 + w_dim1; + w -= w_offset; + *info = 0; + alpha = (sqrt(17.) + 1.) / 8.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + k = *n; + L10: + kw = *nb + k - *n; + if (k <= *n - *nb + 1 && *nb < *n || k < 1) { + goto L30; + } + dcopy_(&k, &a[k * a_dim1 + 1], &c__1, &w[kw * w_dim1 + 1], &c__1); + if (k < *n) { + i__1 = *n - k; + dgemv_((char *)"No transpose", &k, &i__1, &c_b8, &a[(k + 1) * a_dim1 + 1], lda, + &w[k + (kw + 1) * w_dim1], ldw, &c_b9, &w[kw * w_dim1 + 1], &c__1, (ftnlen)12); + } + kstep = 1; + absakk = (d__1 = w[k + kw * w_dim1], abs(d__1)); + if (k > 1) { + i__1 = k - 1; + imax = idamax_(&i__1, &w[kw * w_dim1 + 1], &c__1); + colmax = (d__1 = w[imax + kw * w_dim1], abs(d__1)); + } else { + colmax = 0.; + } + if (max(absakk, colmax) == 0.) { + if (*info == 0) { + *info = k; + } + kp = k; + } else { + if (absakk >= alpha * colmax) { + kp = k; + } else { + dcopy_(&imax, &a[imax * a_dim1 + 1], &c__1, &w[(kw - 1) * w_dim1 + 1], &c__1); + i__1 = k - imax; + dcopy_(&i__1, &a[imax + (imax + 1) * a_dim1], lda, &w[imax + 1 + (kw - 1) * w_dim1], + &c__1); + if (k < *n) { + i__1 = *n - k; + dgemv_((char *)"No transpose", &k, &i__1, &c_b8, &a[(k + 1) * a_dim1 + 1], lda, + &w[imax + (kw + 1) * w_dim1], ldw, &c_b9, &w[(kw - 1) * w_dim1 + 1], + &c__1, (ftnlen)12); + } + i__1 = k - imax; + jmax = imax + idamax_(&i__1, &w[imax + 1 + (kw - 1) * w_dim1], &c__1); + rowmax = (d__1 = w[jmax + (kw - 1) * w_dim1], abs(d__1)); + if (imax > 1) { + i__1 = imax - 1; + jmax = idamax_(&i__1, &w[(kw - 1) * w_dim1 + 1], &c__1); + d__2 = rowmax, d__3 = (d__1 = w[jmax + (kw - 1) * w_dim1], abs(d__1)); + rowmax = max(d__2, d__3); + } + if (absakk >= alpha * colmax * (colmax / rowmax)) { + kp = k; + } else if ((d__1 = w[imax + (kw - 1) * w_dim1], abs(d__1)) >= alpha * rowmax) { + kp = imax; + dcopy_(&k, &w[(kw - 1) * w_dim1 + 1], &c__1, &w[kw * w_dim1 + 1], &c__1); + } else { + kp = imax; + kstep = 2; + } + } + kk = k - kstep + 1; + kkw = *nb + kk - *n; + if (kp != kk) { + a[kp + kp * a_dim1] = a[kk + kk * a_dim1]; + i__1 = kk - 1 - kp; + dcopy_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + (kp + 1) * a_dim1], lda); + if (kp > 1) { + i__1 = kp - 1; + dcopy_(&i__1, &a[kk * a_dim1 + 1], &c__1, &a[kp * a_dim1 + 1], &c__1); + } + if (k < *n) { + i__1 = *n - k; + dswap_(&i__1, &a[kk + (k + 1) * a_dim1], lda, &a[kp + (k + 1) * a_dim1], lda); + } + i__1 = *n - kk + 1; + dswap_(&i__1, &w[kk + kkw * w_dim1], ldw, &w[kp + kkw * w_dim1], ldw); + } + if (kstep == 1) { + dcopy_(&k, &w[kw * w_dim1 + 1], &c__1, &a[k * a_dim1 + 1], &c__1); + r1 = 1. / a[k + k * a_dim1]; + i__1 = k - 1; + dscal_(&i__1, &r1, &a[k * a_dim1 + 1], &c__1); + } else { + if (k > 2) { + d21 = w[k - 1 + kw * w_dim1]; + d11 = w[k + kw * w_dim1] / d21; + d22 = w[k - 1 + (kw - 1) * w_dim1] / d21; + t = 1. / (d11 * d22 - 1.); + d21 = t / d21; + i__1 = k - 2; + for (j = 1; j <= i__1; ++j) { + a[j + (k - 1) * a_dim1] = + d21 * (d11 * w[j + (kw - 1) * w_dim1] - w[j + kw * w_dim1]); + a[j + k * a_dim1] = + d21 * (d22 * w[j + kw * w_dim1] - w[j + (kw - 1) * w_dim1]); + } + } + a[k - 1 + (k - 1) * a_dim1] = w[k - 1 + (kw - 1) * w_dim1]; + a[k - 1 + k * a_dim1] = w[k - 1 + kw * w_dim1]; + a[k + k * a_dim1] = w[k + kw * w_dim1]; + } + } + if (kstep == 1) { + ipiv[k] = kp; + } else { + ipiv[k] = -kp; + ipiv[k - 1] = -kp; + } + k -= kstep; + goto L10; + L30: + i__1 = -(*nb); + for (j = (k - 1) / *nb * *nb + 1; i__1 < 0 ? j >= 1 : j <= 1; j += i__1) { + i__2 = *nb, i__3 = k - j + 1; + jb = min(i__2, i__3); + i__2 = j + jb - 1; + for (jj = j; jj <= i__2; ++jj) { + i__3 = jj - j + 1; + i__4 = *n - k; + dgemv_((char *)"No transpose", &i__3, &i__4, &c_b8, &a[j + (k + 1) * a_dim1], lda, + &w[jj + (kw + 1) * w_dim1], ldw, &c_b9, &a[j + jj * a_dim1], &c__1, + (ftnlen)12); + } + i__2 = j - 1; + i__3 = *n - k; + dgemm_((char *)"No transpose", (char *)"Transpose", &i__2, &jb, &i__3, &c_b8, &a[(k + 1) * a_dim1 + 1], + lda, &w[j + (kw + 1) * w_dim1], ldw, &c_b9, &a[j * a_dim1 + 1], lda, (ftnlen)12, + (ftnlen)9); + } + j = k + 1; + L60: + jj = j; + jp = ipiv[j]; + if (jp < 0) { + jp = -jp; + ++j; + } + ++j; + if (jp != jj && j <= *n) { + i__1 = *n - j + 1; + dswap_(&i__1, &a[jp + j * a_dim1], lda, &a[jj + j * a_dim1], lda); + } + if (j < *n) { + goto L60; + } + *kb = *n - k; + } else { + k = 1; + L70: + if (k >= *nb && *nb < *n || k > *n) { + goto L90; + } + i__1 = *n - k + 1; + dcopy_(&i__1, &a[k + k * a_dim1], &c__1, &w[k + k * w_dim1], &c__1); + i__1 = *n - k + 1; + i__2 = k - 1; + dgemv_((char *)"No transpose", &i__1, &i__2, &c_b8, &a[k + a_dim1], lda, &w[k + w_dim1], ldw, &c_b9, + &w[k + k * w_dim1], &c__1, (ftnlen)12); + kstep = 1; + absakk = (d__1 = w[k + k * w_dim1], abs(d__1)); + if (k < *n) { + i__1 = *n - k; + imax = k + idamax_(&i__1, &w[k + 1 + k * w_dim1], &c__1); + colmax = (d__1 = w[imax + k * w_dim1], abs(d__1)); + } else { + colmax = 0.; + } + if (max(absakk, colmax) == 0.) { + if (*info == 0) { + *info = k; + } + kp = k; + } else { + if (absakk >= alpha * colmax) { + kp = k; + } else { + i__1 = imax - k; + dcopy_(&i__1, &a[imax + k * a_dim1], lda, &w[k + (k + 1) * w_dim1], &c__1); + i__1 = *n - imax + 1; + dcopy_(&i__1, &a[imax + imax * a_dim1], &c__1, &w[imax + (k + 1) * w_dim1], &c__1); + i__1 = *n - k + 1; + i__2 = k - 1; + dgemv_((char *)"No transpose", &i__1, &i__2, &c_b8, &a[k + a_dim1], lda, &w[imax + w_dim1], + ldw, &c_b9, &w[k + (k + 1) * w_dim1], &c__1, (ftnlen)12); + i__1 = imax - k; + jmax = k - 1 + idamax_(&i__1, &w[k + (k + 1) * w_dim1], &c__1); + rowmax = (d__1 = w[jmax + (k + 1) * w_dim1], abs(d__1)); + if (imax < *n) { + i__1 = *n - imax; + jmax = imax + idamax_(&i__1, &w[imax + 1 + (k + 1) * w_dim1], &c__1); + d__2 = rowmax, d__3 = (d__1 = w[jmax + (k + 1) * w_dim1], abs(d__1)); + rowmax = max(d__2, d__3); + } + if (absakk >= alpha * colmax * (colmax / rowmax)) { + kp = k; + } else if ((d__1 = w[imax + (k + 1) * w_dim1], abs(d__1)) >= alpha * rowmax) { + kp = imax; + i__1 = *n - k + 1; + dcopy_(&i__1, &w[k + (k + 1) * w_dim1], &c__1, &w[k + k * w_dim1], &c__1); + } else { + kp = imax; + kstep = 2; + } + } + kk = k + kstep - 1; + if (kp != kk) { + a[kp + kp * a_dim1] = a[kk + kk * a_dim1]; + i__1 = kp - kk - 1; + dcopy_(&i__1, &a[kk + 1 + kk * a_dim1], &c__1, &a[kp + (kk + 1) * a_dim1], lda); + if (kp < *n) { + i__1 = *n - kp; + dcopy_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + 1 + kp * a_dim1], &c__1); + } + if (k > 1) { + i__1 = k - 1; + dswap_(&i__1, &a[kk + a_dim1], lda, &a[kp + a_dim1], lda); + } + dswap_(&kk, &w[kk + w_dim1], ldw, &w[kp + w_dim1], ldw); + } + if (kstep == 1) { + i__1 = *n - k + 1; + dcopy_(&i__1, &w[k + k * w_dim1], &c__1, &a[k + k * a_dim1], &c__1); + if (k < *n) { + r1 = 1. / a[k + k * a_dim1]; + i__1 = *n - k; + dscal_(&i__1, &r1, &a[k + 1 + k * a_dim1], &c__1); + } + } else { + if (k < *n - 1) { + d21 = w[k + 1 + k * w_dim1]; + d11 = w[k + 1 + (k + 1) * w_dim1] / d21; + d22 = w[k + k * w_dim1] / d21; + t = 1. / (d11 * d22 - 1.); + d21 = t / d21; + i__1 = *n; + for (j = k + 2; j <= i__1; ++j) { + a[j + k * a_dim1] = + d21 * (d11 * w[j + k * w_dim1] - w[j + (k + 1) * w_dim1]); + a[j + (k + 1) * a_dim1] = + d21 * (d22 * w[j + (k + 1) * w_dim1] - w[j + k * w_dim1]); + } + } + a[k + k * a_dim1] = w[k + k * w_dim1]; + a[k + 1 + k * a_dim1] = w[k + 1 + k * w_dim1]; + a[k + 1 + (k + 1) * a_dim1] = w[k + 1 + (k + 1) * w_dim1]; + } + } + if (kstep == 1) { + ipiv[k] = kp; + } else { + ipiv[k] = -kp; + ipiv[k + 1] = -kp; + } + k += kstep; + goto L70; + L90: + i__1 = *n; + i__2 = *nb; + for (j = k; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + i__3 = *nb, i__4 = *n - j + 1; + jb = min(i__3, i__4); + i__3 = j + jb - 1; + for (jj = j; jj <= i__3; ++jj) { + i__4 = j + jb - jj; + i__5 = k - 1; + dgemv_((char *)"No transpose", &i__4, &i__5, &c_b8, &a[jj + a_dim1], lda, &w[jj + w_dim1], + ldw, &c_b9, &a[jj + jj * a_dim1], &c__1, (ftnlen)12); + } + if (j + jb <= *n) { + i__3 = *n - j - jb + 1; + i__4 = k - 1; + dgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &jb, &i__4, &c_b8, &a[j + jb + a_dim1], + lda, &w[j + w_dim1], ldw, &c_b9, &a[j + jb + j * a_dim1], lda, (ftnlen)12, + (ftnlen)9); + } + } + j = k - 1; + L120: + jj = j; + jp = ipiv[j]; + if (jp < 0) { + jp = -jp; + --j; + } + --j; + if (jp != jj && j >= 1) { + dswap_(&j, &a[jp + a_dim1], lda, &a[jj + a_dim1], lda); + } + if (j > 1) { + goto L120; + } + *kb = k - 1; + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dorghr.cpp b/lib/linalg/dorghr.cpp new file mode 100644 index 0000000000..80ffa7dbc5 --- /dev/null +++ b/lib/linalg/dorghr.cpp @@ -0,0 +1,94 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c_n1 = -1; +int dorghr_(integer *n, integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal *tau, + doublereal *work, integer *lwork, integer *info) +{ + integer a_dim1, a_offset, i__1, i__2; + integer i__, j, nb, nh, iinfo; + extern int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *); + integer lwkopt; + logical lquery; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + *info = 0; + nh = *ihi - *ilo; + lquery = *lwork == -1; + if (*n < 0) { + *info = -1; + } else if (*ilo < 1 || *ilo > max(1, *n)) { + *info = -2; + } else if (*ihi < min(*ilo, *n) || *ihi > *n) { + *info = -3; + } else if (*lda < max(1, *n)) { + *info = -5; + } else if (*lwork < max(1, nh) && !lquery) { + *info = -8; + } + if (*info == 0) { + nb = ilaenv_(&c__1, (char *)"DORGQR", (char *)" ", &nh, &nh, &nh, &c_n1, (ftnlen)6, (ftnlen)1); + lwkopt = max(1, nh) * nb; + work[1] = (doublereal)lwkopt; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORGHR", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + if (*n == 0) { + work[1] = 1.; + return 0; + } + i__1 = *ilo + 1; + for (j = *ihi; j >= i__1; --j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = 0.; + } + i__2 = *ihi; + for (i__ = j + 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = a[i__ + (j - 1) * a_dim1]; + } + i__2 = *n; + for (i__ = *ihi + 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = 0.; + } + } + i__1 = *ilo; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = 0.; + } + a[j + j * a_dim1] = 1.; + } + i__1 = *n; + for (j = *ihi + 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = 0.; + } + a[j + j * a_dim1] = 1.; + } + if (nh > 0) { + dorgqr_(&nh, &nh, &nh, &a[*ilo + 1 + (*ilo + 1) * a_dim1], lda, &tau[*ilo], &work[1], lwork, + &iinfo); + } + work[1] = (doublereal)lwkopt; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dormhr.cpp b/lib/linalg/dormhr.cpp new file mode 100644 index 0000000000..9cb0cd6690 --- /dev/null +++ b/lib/linalg/dormhr.cpp @@ -0,0 +1,111 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +int dormhr_(char *side, char *trans, integer *m, integer *n, integer *ilo, integer *ihi, + doublereal *a, integer *lda, doublereal *tau, doublereal *c__, integer *ldc, + doublereal *work, integer *lwork, integer *info, ftnlen side_len, ftnlen trans_len) +{ + address a__1[2]; + integer a_dim1, a_offset, c_dim1, c_offset, i__1[2], i__2; + char ch__1[2]; + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); + integer i1, i2, nb, mi, nh, ni, nq, nw; + logical left; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo; + extern int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen); + integer lwkopt; + logical lquery; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + *info = 0; + nh = *ihi - *ilo; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + if (left) { + nq = *m; + nw = *n; + } else { + nq = *n; + nw = *m; + } + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*m < 0) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*ilo < 1 || *ilo > max(1, nq)) { + *info = -5; + } else if (*ihi < min(*ilo, nq) || *ihi > nq) { + *info = -6; + } else if (*lda < max(1, nq)) { + *info = -8; + } else if (*ldc < max(1, *m)) { + *info = -11; + } else if (*lwork < max(1, nw) && !lquery) { + *info = -13; + } + if (*info == 0) { + if (left) { + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &nh, n, &nh, &c_n1, (ftnlen)6, (ftnlen)2); + } else { + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &nh, &nh, &c_n1, (ftnlen)6, (ftnlen)2); + } + lwkopt = max(1, nw) * nb; + work[1] = (doublereal)lwkopt; + } + if (*info != 0) { + i__2 = -(*info); + xerbla_((char *)"DORMHR", &i__2, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + if (*m == 0 || *n == 0 || nh == 0) { + work[1] = 1.; + return 0; + } + if (left) { + mi = nh; + ni = *n; + i1 = *ilo + 1; + i2 = 1; + } else { + mi = *m; + ni = nh; + i1 = 1; + i2 = *ilo + 1; + } + dormqr_(side, trans, &mi, &ni, &nh, &a[*ilo + 1 + *ilo * a_dim1], lda, &tau[*ilo], + &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, (ftnlen)1, (ftnlen)1); + work[1] = (doublereal)lwkopt; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dsyconv.cpp b/lib/linalg/dsyconv.cpp new file mode 100644 index 0000000000..9d4a2908ae --- /dev/null +++ b/lib/linalg/dsyconv.cpp @@ -0,0 +1,199 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int dsyconv_(char *uplo, char *way, integer *n, doublereal *a, integer *lda, integer *ipiv, + doublereal *e, integer *info, ftnlen uplo_len, ftnlen way_len) +{ + integer a_dim1, a_offset, i__1; + integer i__, j, ip; + doublereal temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + logical upper; + extern int xerbla_(char *, integer *, ftnlen); + logical convert; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + --e; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + convert = lsame_(way, (char *)"C", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (!convert && !lsame_(way, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1, *n)) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYCONV", &i__1, (ftnlen)7); + return 0; + } + if (*n == 0) { + return 0; + } + if (upper) { + if (convert) { + i__ = *n; + e[1] = 0.; + while (i__ > 1) { + if (ipiv[i__] < 0) { + e[i__] = a[i__ - 1 + i__ * a_dim1]; + e[i__ - 1] = 0.; + a[i__ - 1 + i__ * a_dim1] = 0.; + --i__; + } else { + e[i__] = 0.; + } + --i__; + } + i__ = *n; + while (i__ >= 1) { + if (ipiv[i__] > 0) { + ip = ipiv[i__]; + if (i__ < *n) { + i__1 = *n; + for (j = i__ + 1; j <= i__1; ++j) { + temp = a[ip + j * a_dim1]; + a[ip + j * a_dim1] = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = temp; + } + } + } else { + ip = -ipiv[i__]; + if (i__ < *n) { + i__1 = *n; + for (j = i__ + 1; j <= i__1; ++j) { + temp = a[ip + j * a_dim1]; + a[ip + j * a_dim1] = a[i__ - 1 + j * a_dim1]; + a[i__ - 1 + j * a_dim1] = temp; + } + } + --i__; + } + --i__; + } + } else { + i__ = 1; + while (i__ <= *n) { + if (ipiv[i__] > 0) { + ip = ipiv[i__]; + if (i__ < *n) { + i__1 = *n; + for (j = i__ + 1; j <= i__1; ++j) { + temp = a[ip + j * a_dim1]; + a[ip + j * a_dim1] = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = temp; + } + } + } else { + ip = -ipiv[i__]; + ++i__; + if (i__ < *n) { + i__1 = *n; + for (j = i__ + 1; j <= i__1; ++j) { + temp = a[ip + j * a_dim1]; + a[ip + j * a_dim1] = a[i__ - 1 + j * a_dim1]; + a[i__ - 1 + j * a_dim1] = temp; + } + } + } + ++i__; + } + i__ = *n; + while (i__ > 1) { + if (ipiv[i__] < 0) { + a[i__ - 1 + i__ * a_dim1] = e[i__]; + --i__; + } + --i__; + } + } + } else { + if (convert) { + i__ = 1; + e[*n] = 0.; + while (i__ <= *n) { + if (i__ < *n && ipiv[i__] < 0) { + e[i__] = a[i__ + 1 + i__ * a_dim1]; + e[i__ + 1] = 0.; + a[i__ + 1 + i__ * a_dim1] = 0.; + ++i__; + } else { + e[i__] = 0.; + } + ++i__; + } + i__ = 1; + while (i__ <= *n) { + if (ipiv[i__] > 0) { + ip = ipiv[i__]; + if (i__ > 1) { + i__1 = i__ - 1; + for (j = 1; j <= i__1; ++j) { + temp = a[ip + j * a_dim1]; + a[ip + j * a_dim1] = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = temp; + } + } + } else { + ip = -ipiv[i__]; + if (i__ > 1) { + i__1 = i__ - 1; + for (j = 1; j <= i__1; ++j) { + temp = a[ip + j * a_dim1]; + a[ip + j * a_dim1] = a[i__ + 1 + j * a_dim1]; + a[i__ + 1 + j * a_dim1] = temp; + } + } + ++i__; + } + ++i__; + } + } else { + i__ = *n; + while (i__ >= 1) { + if (ipiv[i__] > 0) { + ip = ipiv[i__]; + if (i__ > 1) { + i__1 = i__ - 1; + for (j = 1; j <= i__1; ++j) { + temp = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = a[ip + j * a_dim1]; + a[ip + j * a_dim1] = temp; + } + } + } else { + ip = -ipiv[i__]; + --i__; + if (i__ > 1) { + i__1 = i__ - 1; + for (j = 1; j <= i__1; ++j) { + temp = a[i__ + 1 + j * a_dim1]; + a[i__ + 1 + j * a_dim1] = a[ip + j * a_dim1]; + a[ip + j * a_dim1] = temp; + } + } + } + --i__; + } + i__ = 1; + while (i__ <= *n - 1) { + if (ipiv[i__] < 0) { + a[i__ + 1 + i__ * a_dim1] = e[i__]; + ++i__; + } + ++i__; + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dsyr.cpp b/lib/linalg/dsyr.cpp new file mode 100644 index 0000000000..6806baea29 --- /dev/null +++ b/lib/linalg/dsyr.cpp @@ -0,0 +1,167 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c_n1 = -1; +int dsyr_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *a, + integer *lda, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2; + integer i__, j, ix, jx, kx, info; + doublereal temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + --x; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + info = 0; + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (*n < 0) { + info = 2; + } else if (*incx == 0) { + info = 5; + } else if (*lda < max(1, *n)) { + info = 7; + } + if (info != 0) { + xerbla_((char *)"DSYR ", &info, (ftnlen)6); + return 0; + } + if (*n == 0 || *alpha == 0.) { + return 0; + } + if (*incx <= 0) { + kx = 1 - (*n - 1) * *incx; + } else if (*incx != 1) { + kx = 1; + } + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[j] != 0.) { + temp = *alpha * x[j]; + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] += x[i__] * temp; + } + } + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0.) { + temp = *alpha * x[jx]; + ix = kx; + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] += x[ix] * temp; + ix += *incx; + } + } + jx += *incx; + } + } + } else { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[j] != 0.) { + temp = *alpha * x[j]; + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] += x[i__] * temp; + } + } + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0.) { + temp = *alpha * x[jx]; + ix = jx; + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] += x[ix] * temp; + ix += *incx; + } + } + jx += *incx; + } + } + } + return 0; +} +int dsysv_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, + doublereal *b, integer *ldb, doublereal *work, integer *lwork, integer *info, + ftnlen uplo_len) +{ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen), + dsytrf_(char *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, + integer *, ftnlen); + integer lwkopt; + logical lquery; + extern int dsytrs_(char *, integer *, integer *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen), + dsytrs2_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + --work; + *info = 0; + lquery = *lwork == -1; + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1, *n)) { + *info = -5; + } else if (*ldb < max(1, *n)) { + *info = -8; + } else if (*lwork < 1 && !lquery) { + *info = -10; + } + if (*info == 0) { + if (*n == 0) { + lwkopt = 1; + } else { + dsytrf_(uplo, n, &a[a_offset], lda, &ipiv[1], &work[1], &c_n1, info, (ftnlen)1); + lwkopt = (integer)work[1]; + } + work[1] = (doublereal)lwkopt; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYSV ", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + dsytrf_(uplo, n, &a[a_offset], lda, &ipiv[1], &work[1], lwork, info, (ftnlen)1); + if (*info == 0) { + if (*lwork < *n) { + dsytrs_(uplo, n, nrhs, &a[a_offset], lda, &ipiv[1], &b[b_offset], ldb, info, (ftnlen)1); + } else { + dsytrs2_(uplo, n, nrhs, &a[a_offset], lda, &ipiv[1], &b[b_offset], ldb, &work[1], info, + (ftnlen)1); + } + } + work[1] = (doublereal)lwkopt; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dsytf2.cpp b/lib/linalg/dsytf2.cpp new file mode 100644 index 0000000000..8b48de1da4 --- /dev/null +++ b/lib/linalg/dsytf2.cpp @@ -0,0 +1,246 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +int dsytf2_(char *uplo, integer *n, doublereal *a, integer *lda, integer *ipiv, integer *info, + ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2; + doublereal d__1, d__2, d__3; + double sqrt(doublereal); + integer i__, j, k; + doublereal t, r1, d11, d12, d21, d22; + integer kk, kp; + doublereal wk, wkm1, wkp1; + integer imax, jmax; + extern int dsyr_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, ftnlen); + doublereal alpha; + extern int dscal_(integer *, doublereal *, doublereal *, integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int dswap_(integer *, doublereal *, integer *, doublereal *, integer *); + integer kstep; + logical upper; + doublereal absakk; + extern integer idamax_(integer *, doublereal *, integer *); + extern logical disnan_(doublereal *); + extern int xerbla_(char *, integer *, ftnlen); + doublereal colmax, rowmax; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYTF2", &i__1, (ftnlen)6); + return 0; + } + alpha = (sqrt(17.) + 1.) / 8.; + if (upper) { + k = *n; + L10: + if (k < 1) { + goto L70; + } + kstep = 1; + absakk = (d__1 = a[k + k * a_dim1], abs(d__1)); + if (k > 1) { + i__1 = k - 1; + imax = idamax_(&i__1, &a[k * a_dim1 + 1], &c__1); + colmax = (d__1 = a[imax + k * a_dim1], abs(d__1)); + } else { + colmax = 0.; + } + if (max(absakk, colmax) == 0. || disnan_(&absakk)) { + if (*info == 0) { + *info = k; + } + kp = k; + } else { + if (absakk >= alpha * colmax) { + kp = k; + } else { + i__1 = k - imax; + jmax = imax + idamax_(&i__1, &a[imax + (imax + 1) * a_dim1], lda); + rowmax = (d__1 = a[imax + jmax * a_dim1], abs(d__1)); + if (imax > 1) { + i__1 = imax - 1; + jmax = idamax_(&i__1, &a[imax * a_dim1 + 1], &c__1); + d__2 = rowmax, d__3 = (d__1 = a[jmax + imax * a_dim1], abs(d__1)); + rowmax = max(d__2, d__3); + } + if (absakk >= alpha * colmax * (colmax / rowmax)) { + kp = k; + } else if ((d__1 = a[imax + imax * a_dim1], abs(d__1)) >= alpha * rowmax) { + kp = imax; + } else { + kp = imax; + kstep = 2; + } + } + kk = k - kstep + 1; + if (kp != kk) { + i__1 = kp - 1; + dswap_(&i__1, &a[kk * a_dim1 + 1], &c__1, &a[kp * a_dim1 + 1], &c__1); + i__1 = kk - kp - 1; + dswap_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + (kp + 1) * a_dim1], lda); + t = a[kk + kk * a_dim1]; + a[kk + kk * a_dim1] = a[kp + kp * a_dim1]; + a[kp + kp * a_dim1] = t; + if (kstep == 2) { + t = a[k - 1 + k * a_dim1]; + a[k - 1 + k * a_dim1] = a[kp + k * a_dim1]; + a[kp + k * a_dim1] = t; + } + } + if (kstep == 1) { + r1 = 1. / a[k + k * a_dim1]; + i__1 = k - 1; + d__1 = -r1; + dsyr_(uplo, &i__1, &d__1, &a[k * a_dim1 + 1], &c__1, &a[a_offset], lda, (ftnlen)1); + i__1 = k - 1; + dscal_(&i__1, &r1, &a[k * a_dim1 + 1], &c__1); + } else { + if (k > 2) { + d12 = a[k - 1 + k * a_dim1]; + d22 = a[k - 1 + (k - 1) * a_dim1] / d12; + d11 = a[k + k * a_dim1] / d12; + t = 1. / (d11 * d22 - 1.); + d12 = t / d12; + for (j = k - 2; j >= 1; --j) { + wkm1 = d12 * (d11 * a[j + (k - 1) * a_dim1] - a[j + k * a_dim1]); + wk = d12 * (d22 * a[j + k * a_dim1] - a[j + (k - 1) * a_dim1]); + for (i__ = j; i__ >= 1; --i__) { + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] - a[i__ + k * a_dim1] * wk - + a[i__ + (k - 1) * a_dim1] * wkm1; + } + a[j + k * a_dim1] = wk; + a[j + (k - 1) * a_dim1] = wkm1; + } + } + } + } + if (kstep == 1) { + ipiv[k] = kp; + } else { + ipiv[k] = -kp; + ipiv[k - 1] = -kp; + } + k -= kstep; + goto L10; + } else { + k = 1; + L40: + if (k > *n) { + goto L70; + } + kstep = 1; + absakk = (d__1 = a[k + k * a_dim1], abs(d__1)); + if (k < *n) { + i__1 = *n - k; + imax = k + idamax_(&i__1, &a[k + 1 + k * a_dim1], &c__1); + colmax = (d__1 = a[imax + k * a_dim1], abs(d__1)); + } else { + colmax = 0.; + } + if (max(absakk, colmax) == 0. || disnan_(&absakk)) { + if (*info == 0) { + *info = k; + } + kp = k; + } else { + if (absakk >= alpha * colmax) { + kp = k; + } else { + i__1 = imax - k; + jmax = k - 1 + idamax_(&i__1, &a[imax + k * a_dim1], lda); + rowmax = (d__1 = a[imax + jmax * a_dim1], abs(d__1)); + if (imax < *n) { + i__1 = *n - imax; + jmax = imax + idamax_(&i__1, &a[imax + 1 + imax * a_dim1], &c__1); + d__2 = rowmax, d__3 = (d__1 = a[jmax + imax * a_dim1], abs(d__1)); + rowmax = max(d__2, d__3); + } + if (absakk >= alpha * colmax * (colmax / rowmax)) { + kp = k; + } else if ((d__1 = a[imax + imax * a_dim1], abs(d__1)) >= alpha * rowmax) { + kp = imax; + } else { + kp = imax; + kstep = 2; + } + } + kk = k + kstep - 1; + if (kp != kk) { + if (kp < *n) { + i__1 = *n - kp; + dswap_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + 1 + kp * a_dim1], &c__1); + } + i__1 = kp - kk - 1; + dswap_(&i__1, &a[kk + 1 + kk * a_dim1], &c__1, &a[kp + (kk + 1) * a_dim1], lda); + t = a[kk + kk * a_dim1]; + a[kk + kk * a_dim1] = a[kp + kp * a_dim1]; + a[kp + kp * a_dim1] = t; + if (kstep == 2) { + t = a[k + 1 + k * a_dim1]; + a[k + 1 + k * a_dim1] = a[kp + k * a_dim1]; + a[kp + k * a_dim1] = t; + } + } + if (kstep == 1) { + if (k < *n) { + d11 = 1. / a[k + k * a_dim1]; + i__1 = *n - k; + d__1 = -d11; + dsyr_(uplo, &i__1, &d__1, &a[k + 1 + k * a_dim1], &c__1, + &a[k + 1 + (k + 1) * a_dim1], lda, (ftnlen)1); + i__1 = *n - k; + dscal_(&i__1, &d11, &a[k + 1 + k * a_dim1], &c__1); + } + } else { + if (k < *n - 1) { + d21 = a[k + 1 + k * a_dim1]; + d11 = a[k + 1 + (k + 1) * a_dim1] / d21; + d22 = a[k + k * a_dim1] / d21; + t = 1. / (d11 * d22 - 1.); + d21 = t / d21; + i__1 = *n; + for (j = k + 2; j <= i__1; ++j) { + wk = d21 * (d11 * a[j + k * a_dim1] - a[j + (k + 1) * a_dim1]); + wkp1 = d21 * (d22 * a[j + (k + 1) * a_dim1] - a[j + k * a_dim1]); + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] - a[i__ + k * a_dim1] * wk - + a[i__ + (k + 1) * a_dim1] * wkp1; + } + a[j + k * a_dim1] = wk; + a[j + (k + 1) * a_dim1] = wkp1; + } + } + } + } + if (kstep == 1) { + ipiv[k] = kp; + } else { + ipiv[k] = -kp; + ipiv[k + 1] = -kp; + } + k += kstep; + goto L40; + } +L70: + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dsytrf.cpp b/lib/linalg/dsytrf.cpp new file mode 100644 index 0000000000..6bfc84ab87 --- /dev/null +++ b/lib/linalg/dsytrf.cpp @@ -0,0 +1,123 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +int dsytrf_(char *uplo, integer *n, doublereal *a, integer *lda, integer *ipiv, doublereal *work, + integer *lwork, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2; + integer j, k, kb, nb, iws; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nbmin, iinfo; + logical upper; + extern int dsytf2_(char *, integer *, doublereal *, integer *, integer *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dlasyf_(char *, integer *, integer *, integer *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen); + integer ldwork, lwkopt; + logical lquery; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + --work; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } else if (*lwork < 1 && !lquery) { + *info = -7; + } + if (*info == 0) { + nb = ilaenv_(&c__1, (char *)"DSYTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + lwkopt = *n * nb; + work[1] = (doublereal)lwkopt; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYTRF", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + nbmin = 2; + ldwork = *n; + if (nb > 1 && nb < *n) { + iws = ldwork * nb; + if (*lwork < iws) { + i__1 = *lwork / ldwork; + nb = max(i__1, 1); + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"DSYTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); + } + } else { + iws = 1; + } + if (nb < nbmin) { + nb = *n; + } + if (upper) { + k = *n; + L10: + if (k < 1) { + goto L40; + } + if (k > nb) { + dlasyf_(uplo, &k, &nb, &kb, &a[a_offset], lda, &ipiv[1], &work[1], &ldwork, &iinfo, + (ftnlen)1); + } else { + dsytf2_(uplo, &k, &a[a_offset], lda, &ipiv[1], &iinfo, (ftnlen)1); + kb = k; + } + if (*info == 0 && iinfo > 0) { + *info = iinfo; + } + k -= kb; + goto L10; + } else { + k = 1; + L20: + if (k > *n) { + goto L40; + } + if (k <= *n - nb) { + i__1 = *n - k + 1; + dlasyf_(uplo, &i__1, &nb, &kb, &a[k + k * a_dim1], lda, &ipiv[k], &work[1], &ldwork, + &iinfo, (ftnlen)1); + } else { + i__1 = *n - k + 1; + dsytf2_(uplo, &i__1, &a[k + k * a_dim1], lda, &ipiv[k], &iinfo, (ftnlen)1); + kb = *n - k + 1; + } + if (*info == 0 && iinfo > 0) { + *info = iinfo + k - 1; + } + i__1 = k + kb - 1; + for (j = k; j <= i__1; ++j) { + if (ipiv[j] > 0) { + ipiv[j] = ipiv[j] + k - 1; + } else { + ipiv[j] = ipiv[j] - k + 1; + } + } + k += kb; + goto L20; + } +L40: + work[1] = (doublereal)lwkopt; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dsytrs.cpp b/lib/linalg/dsytrs.cpp new file mode 100644 index 0000000000..c9f849879b --- /dev/null +++ b/lib/linalg/dsytrs.cpp @@ -0,0 +1,214 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublereal c_b7 = -1.; +static integer c__1 = 1; +static doublereal c_b19 = 1.; +int dsytrs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, + doublereal *b, integer *ldb, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + doublereal d__1; + integer j, k; + doublereal ak, bk; + integer kp; + doublereal akm1, bkm1; + extern int dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *); + doublereal akm1k; + extern int dscal_(integer *, doublereal *, doublereal *, integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + doublereal denom; + extern int dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen), + dswap_(integer *, doublereal *, integer *, doublereal *, integer *); + logical upper; + extern int xerbla_(char *, integer *, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1, *n)) { + *info = -5; + } else if (*ldb < max(1, *n)) { + *info = -8; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYTRS", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0 || *nrhs == 0) { + return 0; + } + if (upper) { + k = *n; + L10: + if (k < 1) { + goto L30; + } + if (ipiv[k] > 0) { + kp = ipiv[k]; + if (kp != k) { + dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + i__1 = k - 1; + dger_(&i__1, nrhs, &c_b7, &a[k * a_dim1 + 1], &c__1, &b[k + b_dim1], ldb, + &b[b_dim1 + 1], ldb); + d__1 = 1. / a[k + k * a_dim1]; + dscal_(nrhs, &d__1, &b[k + b_dim1], ldb); + --k; + } else { + kp = -ipiv[k]; + if (kp != k - 1) { + dswap_(nrhs, &b[k - 1 + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + i__1 = k - 2; + dger_(&i__1, nrhs, &c_b7, &a[k * a_dim1 + 1], &c__1, &b[k + b_dim1], ldb, + &b[b_dim1 + 1], ldb); + i__1 = k - 2; + dger_(&i__1, nrhs, &c_b7, &a[(k - 1) * a_dim1 + 1], &c__1, &b[k - 1 + b_dim1], ldb, + &b[b_dim1 + 1], ldb); + akm1k = a[k - 1 + k * a_dim1]; + akm1 = a[k - 1 + (k - 1) * a_dim1] / akm1k; + ak = a[k + k * a_dim1] / akm1k; + denom = akm1 * ak - 1.; + i__1 = *nrhs; + for (j = 1; j <= i__1; ++j) { + bkm1 = b[k - 1 + j * b_dim1] / akm1k; + bk = b[k + j * b_dim1] / akm1k; + b[k - 1 + j * b_dim1] = (ak * bkm1 - bk) / denom; + b[k + j * b_dim1] = (akm1 * bk - bkm1) / denom; + } + k += -2; + } + goto L10; + L30: + k = 1; + L40: + if (k > *n) { + goto L50; + } + if (ipiv[k] > 0) { + i__1 = k - 1; + dgemv_((char *)"Transpose", &i__1, nrhs, &c_b7, &b[b_offset], ldb, &a[k * a_dim1 + 1], &c__1, + &c_b19, &b[k + b_dim1], ldb, (ftnlen)9); + kp = ipiv[k]; + if (kp != k) { + dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + ++k; + } else { + i__1 = k - 1; + dgemv_((char *)"Transpose", &i__1, nrhs, &c_b7, &b[b_offset], ldb, &a[k * a_dim1 + 1], &c__1, + &c_b19, &b[k + b_dim1], ldb, (ftnlen)9); + i__1 = k - 1; + dgemv_((char *)"Transpose", &i__1, nrhs, &c_b7, &b[b_offset], ldb, &a[(k + 1) * a_dim1 + 1], + &c__1, &c_b19, &b[k + 1 + b_dim1], ldb, (ftnlen)9); + kp = -ipiv[k]; + if (kp != k) { + dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + k += 2; + } + goto L40; + L50:; + } else { + k = 1; + L60: + if (k > *n) { + goto L80; + } + if (ipiv[k] > 0) { + kp = ipiv[k]; + if (kp != k) { + dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + if (k < *n) { + i__1 = *n - k; + dger_(&i__1, nrhs, &c_b7, &a[k + 1 + k * a_dim1], &c__1, &b[k + b_dim1], ldb, + &b[k + 1 + b_dim1], ldb); + } + d__1 = 1. / a[k + k * a_dim1]; + dscal_(nrhs, &d__1, &b[k + b_dim1], ldb); + ++k; + } else { + kp = -ipiv[k]; + if (kp != k + 1) { + dswap_(nrhs, &b[k + 1 + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + if (k < *n - 1) { + i__1 = *n - k - 1; + dger_(&i__1, nrhs, &c_b7, &a[k + 2 + k * a_dim1], &c__1, &b[k + b_dim1], ldb, + &b[k + 2 + b_dim1], ldb); + i__1 = *n - k - 1; + dger_(&i__1, nrhs, &c_b7, &a[k + 2 + (k + 1) * a_dim1], &c__1, &b[k + 1 + b_dim1], + ldb, &b[k + 2 + b_dim1], ldb); + } + akm1k = a[k + 1 + k * a_dim1]; + akm1 = a[k + k * a_dim1] / akm1k; + ak = a[k + 1 + (k + 1) * a_dim1] / akm1k; + denom = akm1 * ak - 1.; + i__1 = *nrhs; + for (j = 1; j <= i__1; ++j) { + bkm1 = b[k + j * b_dim1] / akm1k; + bk = b[k + 1 + j * b_dim1] / akm1k; + b[k + j * b_dim1] = (ak * bkm1 - bk) / denom; + b[k + 1 + j * b_dim1] = (akm1 * bk - bkm1) / denom; + } + k += 2; + } + goto L60; + L80: + k = *n; + L90: + if (k < 1) { + goto L100; + } + if (ipiv[k] > 0) { + if (k < *n) { + i__1 = *n - k; + dgemv_((char *)"Transpose", &i__1, nrhs, &c_b7, &b[k + 1 + b_dim1], ldb, + &a[k + 1 + k * a_dim1], &c__1, &c_b19, &b[k + b_dim1], ldb, (ftnlen)9); + } + kp = ipiv[k]; + if (kp != k) { + dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + --k; + } else { + if (k < *n) { + i__1 = *n - k; + dgemv_((char *)"Transpose", &i__1, nrhs, &c_b7, &b[k + 1 + b_dim1], ldb, + &a[k + 1 + k * a_dim1], &c__1, &c_b19, &b[k + b_dim1], ldb, (ftnlen)9); + i__1 = *n - k; + dgemv_((char *)"Transpose", &i__1, nrhs, &c_b7, &b[k + 1 + b_dim1], ldb, + &a[k + 1 + (k - 1) * a_dim1], &c__1, &c_b19, &b[k - 1 + b_dim1], ldb, + (ftnlen)9); + } + kp = -ipiv[k]; + if (kp != k) { + dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + k += -2; + } + goto L90; + L100:; + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dsytrs2.cpp b/lib/linalg/dsytrs2.cpp new file mode 100644 index 0000000000..2d2bc90525 --- /dev/null +++ b/lib/linalg/dsytrs2.cpp @@ -0,0 +1,180 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublereal c_b10 = 1.; +int dsytrs2_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, + doublereal *b, integer *ldb, doublereal *work, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + doublereal d__1; + integer i__, j, k; + doublereal ak, bk; + integer kp; + doublereal akm1, bkm1, akm1k; + extern int dscal_(integer *, doublereal *, doublereal *, integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + doublereal denom; + integer iinfo; + extern int dswap_(integer *, doublereal *, integer *, doublereal *, integer *), + dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + logical upper; + extern int xerbla_(char *, integer *, ftnlen), + dsyconv_(char *, char *, integer *, doublereal *, integer *, integer *, doublereal *, + integer *, ftnlen, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + --work; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1, *n)) { + *info = -5; + } else if (*ldb < max(1, *n)) { + *info = -8; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYTRS2", &i__1, (ftnlen)7); + return 0; + } + if (*n == 0 || *nrhs == 0) { + return 0; + } + dsyconv_(uplo, (char *)"C", n, &a[a_offset], lda, &ipiv[1], &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + if (upper) { + k = *n; + while (k >= 1) { + if (ipiv[k] > 0) { + kp = ipiv[k]; + if (kp != k) { + dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + --k; + } else { + kp = -ipiv[k]; + if (kp == -ipiv[k - 1]) { + dswap_(nrhs, &b[k - 1 + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + k += -2; + } + } + dtrsm_((char *)"L", (char *)"U", (char *)"N", (char *)"U", n, nrhs, &c_b10, &a[a_offset], lda, &b[b_offset], ldb, (ftnlen)1, + (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__ = *n; + while (i__ >= 1) { + if (ipiv[i__] > 0) { + d__1 = 1. / a[i__ + i__ * a_dim1]; + dscal_(nrhs, &d__1, &b[i__ + b_dim1], ldb); + } else if (i__ > 1) { + if (ipiv[i__ - 1] == ipiv[i__]) { + akm1k = work[i__]; + akm1 = a[i__ - 1 + (i__ - 1) * a_dim1] / akm1k; + ak = a[i__ + i__ * a_dim1] / akm1k; + denom = akm1 * ak - 1.; + i__1 = *nrhs; + for (j = 1; j <= i__1; ++j) { + bkm1 = b[i__ - 1 + j * b_dim1] / akm1k; + bk = b[i__ + j * b_dim1] / akm1k; + b[i__ - 1 + j * b_dim1] = (ak * bkm1 - bk) / denom; + b[i__ + j * b_dim1] = (akm1 * bk - bkm1) / denom; + } + --i__; + } + } + --i__; + } + dtrsm_((char *)"L", (char *)"U", (char *)"T", (char *)"U", n, nrhs, &c_b10, &a[a_offset], lda, &b[b_offset], ldb, (ftnlen)1, + (ftnlen)1, (ftnlen)1, (ftnlen)1); + k = 1; + while (k <= *n) { + if (ipiv[k] > 0) { + kp = ipiv[k]; + if (kp != k) { + dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + ++k; + } else { + kp = -ipiv[k]; + if (k < *n && kp == -ipiv[k + 1]) { + dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + k += 2; + } + } + } else { + k = 1; + while (k <= *n) { + if (ipiv[k] > 0) { + kp = ipiv[k]; + if (kp != k) { + dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + ++k; + } else { + kp = -ipiv[k + 1]; + if (kp == -ipiv[k]) { + dswap_(nrhs, &b[k + 1 + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + k += 2; + } + } + dtrsm_((char *)"L", (char *)"L", (char *)"N", (char *)"U", n, nrhs, &c_b10, &a[a_offset], lda, &b[b_offset], ldb, (ftnlen)1, + (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__ = 1; + while (i__ <= *n) { + if (ipiv[i__] > 0) { + d__1 = 1. / a[i__ + i__ * a_dim1]; + dscal_(nrhs, &d__1, &b[i__ + b_dim1], ldb); + } else { + akm1k = work[i__]; + akm1 = a[i__ + i__ * a_dim1] / akm1k; + ak = a[i__ + 1 + (i__ + 1) * a_dim1] / akm1k; + denom = akm1 * ak - 1.; + i__1 = *nrhs; + for (j = 1; j <= i__1; ++j) { + bkm1 = b[i__ + j * b_dim1] / akm1k; + bk = b[i__ + 1 + j * b_dim1] / akm1k; + b[i__ + j * b_dim1] = (ak * bkm1 - bk) / denom; + b[i__ + 1 + j * b_dim1] = (akm1 * bk - bkm1) / denom; + } + ++i__; + } + ++i__; + } + dtrsm_((char *)"L", (char *)"L", (char *)"T", (char *)"U", n, nrhs, &c_b10, &a[a_offset], lda, &b[b_offset], ldb, (ftnlen)1, + (ftnlen)1, (ftnlen)1, (ftnlen)1); + k = *n; + while (k >= 1) { + if (ipiv[k] > 0) { + kp = ipiv[k]; + if (kp != k) { + dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + --k; + } else { + kp = -ipiv[k]; + if (k > 1 && kp == -ipiv[k - 1]) { + dswap_(nrhs, &b[k + b_dim1], ldb, &b[kp + b_dim1], ldb); + } + k += -2; + } + } + } + dsyconv_(uplo, (char *)"R", n, &a[a_offset], lda, &ipiv[1], &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dtrevc3.cpp b/lib/linalg/dtrevc3.cpp new file mode 100644 index 0000000000..bd1a0a379e --- /dev/null +++ b/lib/linalg/dtrevc3.cpp @@ -0,0 +1,858 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +static doublereal c_b17 = 0.; +static logical c_false = FALSE_; +static doublereal c_b29 = 1.; +static logical c_true = TRUE_; +int dtrevc3_(char *side, char *howmny, logical *select, integer *n, doublereal *t, integer *ldt, + doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer *mm, integer *m, + doublereal *work, integer *lwork, integer *info, ftnlen side_len, ftnlen howmny_len) +{ + address a__1[2]; + integer t_dim1, t_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, i__1[2], i__2, i__3, i__4; + doublereal d__1, d__2, d__3, d__4; + char ch__1[2]; + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); + double sqrt(doublereal); + integer i__, j, k; + doublereal x[4]; + integer j1, j2, iscomplex[128], nb, ii, ki, ip, is, iv; + doublereal wi, wr; + integer ki2; + doublereal rec, ulp, beta, emax; + logical pair; + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, integer *); + logical allv; + integer ierr; + doublereal unfl, ovfl, smin; + logical over; + doublereal vmax; + integer jnxt; + extern int dscal_(integer *, doublereal *, doublereal *, integer *); + doublereal scale; + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen); + doublereal remax; + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); + logical leftv, bothv; + extern int daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); + doublereal vcrit; + logical somev; + doublereal xnorm; + extern int dlaln2_(logical *, integer *, integer *, doublereal *, doublereal *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, doublereal *, + integer *), + dlabad_(doublereal *, doublereal *); + extern doublereal dlamch_(char *, ftnlen); + extern integer idamax_(integer *, doublereal *, integer *); + extern int dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, + integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen); + doublereal bignum; + logical rightv; + integer maxwrk; + doublereal smlnum; + logical lquery; + --select; + t_dim1 = *ldt; + t_offset = 1 + t_dim1; + t -= t_offset; + vl_dim1 = *ldvl; + vl_offset = 1 + vl_dim1; + vl -= vl_offset; + vr_dim1 = *ldvr; + vr_offset = 1 + vr_dim1; + vr -= vr_offset; + --work; + bothv = lsame_(side, (char *)"B", (ftnlen)1, (ftnlen)1); + rightv = lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1) || bothv; + leftv = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) || bothv; + allv = lsame_(howmny, (char *)"A", (ftnlen)1, (ftnlen)1); + over = lsame_(howmny, (char *)"B", (ftnlen)1, (ftnlen)1); + somev = lsame_(howmny, (char *)"S", (ftnlen)1, (ftnlen)1); + *info = 0; + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = howmny; + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DTREVC", ch__1, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)2); + maxwrk = *n + (*n << 1) * nb; + work[1] = (doublereal)maxwrk; + lquery = *lwork == -1; + if (!rightv && !leftv) { + *info = -1; + } else if (!allv && !over && !somev) { + *info = -2; + } else if (*n < 0) { + *info = -4; + } else if (*ldt < max(1, *n)) { + *info = -6; + } else if (*ldvl < 1 || leftv && *ldvl < *n) { + *info = -8; + } else if (*ldvr < 1 || rightv && *ldvr < *n) { + *info = -10; + } else { + i__2 = 1, i__3 = *n * 3; + if (*lwork < max(i__2, i__3) && !lquery) { + *info = -14; + } else { + if (somev) { + *m = 0; + pair = FALSE_; + i__2 = *n; + for (j = 1; j <= i__2; ++j) { + if (pair) { + pair = FALSE_; + select[j] = FALSE_; + } else { + if (j < *n) { + if (t[j + 1 + j * t_dim1] == 0.) { + if (select[j]) { + ++(*m); + } + } else { + pair = TRUE_; + if (select[j] || select[j + 1]) { + select[j] = TRUE_; + *m += 2; + } + } + } else { + if (select[*n]) { + ++(*m); + } + } + } + } + } else { + *m = *n; + } + if (*mm < *m) { + *info = -11; + } + } + } + if (*info != 0) { + i__2 = -(*info); + xerbla_((char *)"DTREVC3", &i__2, (ftnlen)7); + return 0; + } else if (lquery) { + return 0; + } + if (*n == 0) { + return 0; + } + if (over && *lwork >= *n + (*n << 4)) { + nb = (*lwork - *n) / (*n << 1); + nb = min(nb, 128); + i__2 = (nb << 1) + 1; + dlaset_((char *)"F", n, &i__2, &c_b17, &c_b17, &work[1], n, (ftnlen)1); + } else { + nb = 1; + } + unfl = dlamch_((char *)"Safe minimum", (ftnlen)12); + ovfl = 1. / unfl; + dlabad_(&unfl, &ovfl); + ulp = dlamch_((char *)"Precision", (ftnlen)9); + smlnum = unfl * (*n / ulp); + bignum = (1. - ulp) / smlnum; + work[1] = 0.; + i__2 = *n; + for (j = 2; j <= i__2; ++j) { + work[j] = 0.; + i__3 = j - 1; + for (i__ = 1; i__ <= i__3; ++i__) { + work[j] += (d__1 = t[i__ + j * t_dim1], abs(d__1)); + } + } + if (rightv) { + iv = 2; + if (nb > 2) { + iv = nb; + } + ip = 0; + is = *m; + for (ki = *n; ki >= 1; --ki) { + if (ip == -1) { + ip = 1; + goto L140; + } else if (ki == 1) { + ip = 0; + } else if (t[ki + (ki - 1) * t_dim1] == 0.) { + ip = 0; + } else { + ip = -1; + } + if (somev) { + if (ip == 0) { + if (!select[ki]) { + goto L140; + } + } else { + if (!select[ki - 1]) { + goto L140; + } + } + } + wr = t[ki + ki * t_dim1]; + wi = 0.; + if (ip != 0) { + wi = sqrt((d__1 = t[ki + (ki - 1) * t_dim1], abs(d__1))) * + sqrt((d__2 = t[ki - 1 + ki * t_dim1], abs(d__2))); + } + d__1 = ulp * (abs(wr) + abs(wi)); + smin = max(d__1, smlnum); + if (ip == 0) { + work[ki + iv * *n] = 1.; + i__2 = ki - 1; + for (k = 1; k <= i__2; ++k) { + work[k + iv * *n] = -t[k + ki * t_dim1]; + } + jnxt = ki - 1; + for (j = ki - 1; j >= 1; --j) { + if (j > jnxt) { + goto L60; + } + j1 = j; + j2 = j; + jnxt = j - 1; + if (j > 1) { + if (t[j + (j - 1) * t_dim1] != 0.) { + j1 = j - 1; + jnxt = j - 2; + } + } + if (j1 == j2) { + dlaln2_(&c_false, &c__1, &c__1, &smin, &c_b29, &t[j + j * t_dim1], ldt, + &c_b29, &c_b29, &work[j + iv * *n], n, &wr, &c_b17, x, &c__2, + &scale, &xnorm, &ierr); + if (xnorm > 1.) { + if (work[j] > bignum / xnorm) { + x[0] /= xnorm; + scale /= xnorm; + } + } + if (scale != 1.) { + dscal_(&ki, &scale, &work[iv * *n + 1], &c__1); + } + work[j + iv * *n] = x[0]; + i__2 = j - 1; + d__1 = -x[0]; + daxpy_(&i__2, &d__1, &t[j * t_dim1 + 1], &c__1, &work[iv * *n + 1], &c__1); + } else { + dlaln2_(&c_false, &c__2, &c__1, &smin, &c_b29, &t[j - 1 + (j - 1) * t_dim1], + ldt, &c_b29, &c_b29, &work[j - 1 + iv * *n], n, &wr, &c_b17, x, + &c__2, &scale, &xnorm, &ierr); + if (xnorm > 1.) { + d__1 = work[j - 1], d__2 = work[j]; + beta = max(d__1, d__2); + if (beta > bignum / xnorm) { + x[0] /= xnorm; + x[1] /= xnorm; + scale /= xnorm; + } + } + if (scale != 1.) { + dscal_(&ki, &scale, &work[iv * *n + 1], &c__1); + } + work[j - 1 + iv * *n] = x[0]; + work[j + iv * *n] = x[1]; + i__2 = j - 2; + d__1 = -x[0]; + daxpy_(&i__2, &d__1, &t[(j - 1) * t_dim1 + 1], &c__1, &work[iv * *n + 1], + &c__1); + i__2 = j - 2; + d__1 = -x[1]; + daxpy_(&i__2, &d__1, &t[j * t_dim1 + 1], &c__1, &work[iv * *n + 1], &c__1); + } + L60:; + } + if (!over) { + dcopy_(&ki, &work[iv * *n + 1], &c__1, &vr[is * vr_dim1 + 1], &c__1); + ii = idamax_(&ki, &vr[is * vr_dim1 + 1], &c__1); + remax = 1. / (d__1 = vr[ii + is * vr_dim1], abs(d__1)); + dscal_(&ki, &remax, &vr[is * vr_dim1 + 1], &c__1); + i__2 = *n; + for (k = ki + 1; k <= i__2; ++k) { + vr[k + is * vr_dim1] = 0.; + } + } else if (nb == 1) { + if (ki > 1) { + i__2 = ki - 1; + dgemv_((char *)"N", n, &i__2, &c_b29, &vr[vr_offset], ldvr, &work[iv * *n + 1], + &c__1, &work[ki + iv * *n], &vr[ki * vr_dim1 + 1], &c__1, (ftnlen)1); + } + ii = idamax_(n, &vr[ki * vr_dim1 + 1], &c__1); + remax = 1. / (d__1 = vr[ii + ki * vr_dim1], abs(d__1)); + dscal_(n, &remax, &vr[ki * vr_dim1 + 1], &c__1); + } else { + i__2 = *n; + for (k = ki + 1; k <= i__2; ++k) { + work[k + iv * *n] = 0.; + } + iscomplex[iv - 1] = ip; + } + } else { + if ((d__1 = t[ki - 1 + ki * t_dim1], abs(d__1)) >= + (d__2 = t[ki + (ki - 1) * t_dim1], abs(d__2))) { + work[ki - 1 + (iv - 1) * *n] = 1.; + work[ki + iv * *n] = wi / t[ki - 1 + ki * t_dim1]; + } else { + work[ki - 1 + (iv - 1) * *n] = -wi / t[ki + (ki - 1) * t_dim1]; + work[ki + iv * *n] = 1.; + } + work[ki + (iv - 1) * *n] = 0.; + work[ki - 1 + iv * *n] = 0.; + i__2 = ki - 2; + for (k = 1; k <= i__2; ++k) { + work[k + (iv - 1) * *n] = + -work[ki - 1 + (iv - 1) * *n] * t[k + (ki - 1) * t_dim1]; + work[k + iv * *n] = -work[ki + iv * *n] * t[k + ki * t_dim1]; + } + jnxt = ki - 2; + for (j = ki - 2; j >= 1; --j) { + if (j > jnxt) { + goto L90; + } + j1 = j; + j2 = j; + jnxt = j - 1; + if (j > 1) { + if (t[j + (j - 1) * t_dim1] != 0.) { + j1 = j - 1; + jnxt = j - 2; + } + } + if (j1 == j2) { + dlaln2_(&c_false, &c__1, &c__2, &smin, &c_b29, &t[j + j * t_dim1], ldt, + &c_b29, &c_b29, &work[j + (iv - 1) * *n], n, &wr, &wi, x, &c__2, + &scale, &xnorm, &ierr); + if (xnorm > 1.) { + if (work[j] > bignum / xnorm) { + x[0] /= xnorm; + x[2] /= xnorm; + scale /= xnorm; + } + } + if (scale != 1.) { + dscal_(&ki, &scale, &work[(iv - 1) * *n + 1], &c__1); + dscal_(&ki, &scale, &work[iv * *n + 1], &c__1); + } + work[j + (iv - 1) * *n] = x[0]; + work[j + iv * *n] = x[2]; + i__2 = j - 1; + d__1 = -x[0]; + daxpy_(&i__2, &d__1, &t[j * t_dim1 + 1], &c__1, &work[(iv - 1) * *n + 1], + &c__1); + i__2 = j - 1; + d__1 = -x[2]; + daxpy_(&i__2, &d__1, &t[j * t_dim1 + 1], &c__1, &work[iv * *n + 1], &c__1); + } else { + dlaln2_(&c_false, &c__2, &c__2, &smin, &c_b29, &t[j - 1 + (j - 1) * t_dim1], + ldt, &c_b29, &c_b29, &work[j - 1 + (iv - 1) * *n], n, &wr, &wi, x, + &c__2, &scale, &xnorm, &ierr); + if (xnorm > 1.) { + d__1 = work[j - 1], d__2 = work[j]; + beta = max(d__1, d__2); + if (beta > bignum / xnorm) { + rec = 1. / xnorm; + x[0] *= rec; + x[2] *= rec; + x[1] *= rec; + x[3] *= rec; + scale *= rec; + } + } + if (scale != 1.) { + dscal_(&ki, &scale, &work[(iv - 1) * *n + 1], &c__1); + dscal_(&ki, &scale, &work[iv * *n + 1], &c__1); + } + work[j - 1 + (iv - 1) * *n] = x[0]; + work[j + (iv - 1) * *n] = x[1]; + work[j - 1 + iv * *n] = x[2]; + work[j + iv * *n] = x[3]; + i__2 = j - 2; + d__1 = -x[0]; + daxpy_(&i__2, &d__1, &t[(j - 1) * t_dim1 + 1], &c__1, + &work[(iv - 1) * *n + 1], &c__1); + i__2 = j - 2; + d__1 = -x[1]; + daxpy_(&i__2, &d__1, &t[j * t_dim1 + 1], &c__1, &work[(iv - 1) * *n + 1], + &c__1); + i__2 = j - 2; + d__1 = -x[2]; + daxpy_(&i__2, &d__1, &t[(j - 1) * t_dim1 + 1], &c__1, &work[iv * *n + 1], + &c__1); + i__2 = j - 2; + d__1 = -x[3]; + daxpy_(&i__2, &d__1, &t[j * t_dim1 + 1], &c__1, &work[iv * *n + 1], &c__1); + } + L90:; + } + if (!over) { + dcopy_(&ki, &work[(iv - 1) * *n + 1], &c__1, &vr[(is - 1) * vr_dim1 + 1], + &c__1); + dcopy_(&ki, &work[iv * *n + 1], &c__1, &vr[is * vr_dim1 + 1], &c__1); + emax = 0.; + i__2 = ki; + for (k = 1; k <= i__2; ++k) { + d__3 = emax, d__4 = (d__1 = vr[k + (is - 1) * vr_dim1], abs(d__1)) + + (d__2 = vr[k + is * vr_dim1], abs(d__2)); + emax = max(d__3, d__4); + } + remax = 1. / emax; + dscal_(&ki, &remax, &vr[(is - 1) * vr_dim1 + 1], &c__1); + dscal_(&ki, &remax, &vr[is * vr_dim1 + 1], &c__1); + i__2 = *n; + for (k = ki + 1; k <= i__2; ++k) { + vr[k + (is - 1) * vr_dim1] = 0.; + vr[k + is * vr_dim1] = 0.; + } + } else if (nb == 1) { + if (ki > 2) { + i__2 = ki - 2; + dgemv_((char *)"N", n, &i__2, &c_b29, &vr[vr_offset], ldvr, + &work[(iv - 1) * *n + 1], &c__1, &work[ki - 1 + (iv - 1) * *n], + &vr[(ki - 1) * vr_dim1 + 1], &c__1, (ftnlen)1); + i__2 = ki - 2; + dgemv_((char *)"N", n, &i__2, &c_b29, &vr[vr_offset], ldvr, &work[iv * *n + 1], + &c__1, &work[ki + iv * *n], &vr[ki * vr_dim1 + 1], &c__1, (ftnlen)1); + } else { + dscal_(n, &work[ki - 1 + (iv - 1) * *n], &vr[(ki - 1) * vr_dim1 + 1], + &c__1); + dscal_(n, &work[ki + iv * *n], &vr[ki * vr_dim1 + 1], &c__1); + } + emax = 0.; + i__2 = *n; + for (k = 1; k <= i__2; ++k) { + d__3 = emax, d__4 = (d__1 = vr[k + (ki - 1) * vr_dim1], abs(d__1)) + + (d__2 = vr[k + ki * vr_dim1], abs(d__2)); + emax = max(d__3, d__4); + } + remax = 1. / emax; + dscal_(n, &remax, &vr[(ki - 1) * vr_dim1 + 1], &c__1); + dscal_(n, &remax, &vr[ki * vr_dim1 + 1], &c__1); + } else { + i__2 = *n; + for (k = ki + 1; k <= i__2; ++k) { + work[k + (iv - 1) * *n] = 0.; + work[k + iv * *n] = 0.; + } + iscomplex[iv - 2] = -ip; + iscomplex[iv - 1] = ip; + --iv; + } + } + if (nb > 1) { + if (ip == 0) { + ki2 = ki; + } else { + ki2 = ki - 1; + } + if (iv <= 2 || ki2 == 1) { + i__2 = nb - iv + 1; + i__3 = ki2 + nb - iv; + dgemm_((char *)"N", (char *)"N", n, &i__2, &i__3, &c_b29, &vr[vr_offset], ldvr, + &work[iv * *n + 1], n, &c_b17, &work[(nb + iv) * *n + 1], n, (ftnlen)1, + (ftnlen)1); + i__2 = nb; + for (k = iv; k <= i__2; ++k) { + if (iscomplex[k - 1] == 0) { + ii = idamax_(n, &work[(nb + k) * *n + 1], &c__1); + remax = 1. / (d__1 = work[ii + (nb + k) * *n], abs(d__1)); + } else if (iscomplex[k - 1] == 1) { + emax = 0.; + i__3 = *n; + for (ii = 1; ii <= i__3; ++ii) { + d__3 = emax, + d__4 = (d__1 = work[ii + (nb + k) * *n], abs(d__1)) + + (d__2 = work[ii + (nb + k + 1) * *n], abs(d__2)); + emax = max(d__3, d__4); + } + remax = 1. / emax; + } + dscal_(n, &remax, &work[(nb + k) * *n + 1], &c__1); + } + i__2 = nb - iv + 1; + dlacpy_((char *)"F", n, &i__2, &work[(nb + iv) * *n + 1], n, &vr[ki2 * vr_dim1 + 1], + ldvr, (ftnlen)1); + iv = nb; + } else { + --iv; + } + } + --is; + if (ip != 0) { + --is; + } + L140:; + } + } + if (leftv) { + iv = 1; + ip = 0; + is = 1; + i__2 = *n; + for (ki = 1; ki <= i__2; ++ki) { + if (ip == 1) { + ip = -1; + goto L260; + } else if (ki == *n) { + ip = 0; + } else if (t[ki + 1 + ki * t_dim1] == 0.) { + ip = 0; + } else { + ip = 1; + } + if (somev) { + if (!select[ki]) { + goto L260; + } + } + wr = t[ki + ki * t_dim1]; + wi = 0.; + if (ip != 0) { + wi = sqrt((d__1 = t[ki + (ki + 1) * t_dim1], abs(d__1))) * + sqrt((d__2 = t[ki + 1 + ki * t_dim1], abs(d__2))); + } + d__1 = ulp * (abs(wr) + abs(wi)); + smin = max(d__1, smlnum); + if (ip == 0) { + work[ki + iv * *n] = 1.; + i__3 = *n; + for (k = ki + 1; k <= i__3; ++k) { + work[k + iv * *n] = -t[ki + k * t_dim1]; + } + vmax = 1.; + vcrit = bignum; + jnxt = ki + 1; + i__3 = *n; + for (j = ki + 1; j <= i__3; ++j) { + if (j < jnxt) { + goto L170; + } + j1 = j; + j2 = j; + jnxt = j + 1; + if (j < *n) { + if (t[j + 1 + j * t_dim1] != 0.) { + j2 = j + 1; + jnxt = j + 2; + } + } + if (j1 == j2) { + if (work[j] > vcrit) { + rec = 1. / vmax; + i__4 = *n - ki + 1; + dscal_(&i__4, &rec, &work[ki + iv * *n], &c__1); + vmax = 1.; + vcrit = bignum; + } + i__4 = j - ki - 1; + work[j + iv * *n] -= ddot_(&i__4, &t[ki + 1 + j * t_dim1], &c__1, + &work[ki + 1 + iv * *n], &c__1); + dlaln2_(&c_false, &c__1, &c__1, &smin, &c_b29, &t[j + j * t_dim1], ldt, + &c_b29, &c_b29, &work[j + iv * *n], n, &wr, &c_b17, x, &c__2, + &scale, &xnorm, &ierr); + if (scale != 1.) { + i__4 = *n - ki + 1; + dscal_(&i__4, &scale, &work[ki + iv * *n], &c__1); + } + work[j + iv * *n] = x[0]; + d__2 = (d__1 = work[j + iv * *n], abs(d__1)); + vmax = max(d__2, vmax); + vcrit = bignum / vmax; + } else { + d__1 = work[j], d__2 = work[j + 1]; + beta = max(d__1, d__2); + if (beta > vcrit) { + rec = 1. / vmax; + i__4 = *n - ki + 1; + dscal_(&i__4, &rec, &work[ki + iv * *n], &c__1); + vmax = 1.; + vcrit = bignum; + } + i__4 = j - ki - 1; + work[j + iv * *n] -= ddot_(&i__4, &t[ki + 1 + j * t_dim1], &c__1, + &work[ki + 1 + iv * *n], &c__1); + i__4 = j - ki - 1; + work[j + 1 + iv * *n] -= ddot_(&i__4, &t[ki + 1 + (j + 1) * t_dim1], &c__1, + &work[ki + 1 + iv * *n], &c__1); + dlaln2_(&c_true, &c__2, &c__1, &smin, &c_b29, &t[j + j * t_dim1], ldt, + &c_b29, &c_b29, &work[j + iv * *n], n, &wr, &c_b17, x, &c__2, + &scale, &xnorm, &ierr); + if (scale != 1.) { + i__4 = *n - ki + 1; + dscal_(&i__4, &scale, &work[ki + iv * *n], &c__1); + } + work[j + iv * *n] = x[0]; + work[j + 1 + iv * *n] = x[1]; + d__3 = (d__1 = work[j + iv * *n], abs(d__1)), + d__4 = (d__2 = work[j + 1 + iv * *n], abs(d__2)), d__3 = max(d__3, d__4); + vmax = max(d__3, vmax); + vcrit = bignum / vmax; + } + L170:; + } + if (!over) { + i__3 = *n - ki + 1; + dcopy_(&i__3, &work[ki + iv * *n], &c__1, &vl[ki + is * vl_dim1], &c__1); + i__3 = *n - ki + 1; + ii = idamax_(&i__3, &vl[ki + is * vl_dim1], &c__1) + ki - 1; + remax = 1. / (d__1 = vl[ii + is * vl_dim1], abs(d__1)); + i__3 = *n - ki + 1; + dscal_(&i__3, &remax, &vl[ki + is * vl_dim1], &c__1); + i__3 = ki - 1; + for (k = 1; k <= i__3; ++k) { + vl[k + is * vl_dim1] = 0.; + } + } else if (nb == 1) { + if (ki < *n) { + i__3 = *n - ki; + dgemv_((char *)"N", n, &i__3, &c_b29, &vl[(ki + 1) * vl_dim1 + 1], ldvl, + &work[ki + 1 + iv * *n], &c__1, &work[ki + iv * *n], + &vl[ki * vl_dim1 + 1], &c__1, (ftnlen)1); + } + ii = idamax_(n, &vl[ki * vl_dim1 + 1], &c__1); + remax = 1. / (d__1 = vl[ii + ki * vl_dim1], abs(d__1)); + dscal_(n, &remax, &vl[ki * vl_dim1 + 1], &c__1); + } else { + i__3 = ki - 1; + for (k = 1; k <= i__3; ++k) { + work[k + iv * *n] = 0.; + } + iscomplex[iv - 1] = ip; + } + } else { + if ((d__1 = t[ki + (ki + 1) * t_dim1], abs(d__1)) >= + (d__2 = t[ki + 1 + ki * t_dim1], abs(d__2))) { + work[ki + iv * *n] = wi / t[ki + (ki + 1) * t_dim1]; + work[ki + 1 + (iv + 1) * *n] = 1.; + } else { + work[ki + iv * *n] = 1.; + work[ki + 1 + (iv + 1) * *n] = -wi / t[ki + 1 + ki * t_dim1]; + } + work[ki + 1 + iv * *n] = 0.; + work[ki + (iv + 1) * *n] = 0.; + i__3 = *n; + for (k = ki + 2; k <= i__3; ++k) { + work[k + iv * *n] = -work[ki + iv * *n] * t[ki + k * t_dim1]; + work[k + (iv + 1) * *n] = + -work[ki + 1 + (iv + 1) * *n] * t[ki + 1 + k * t_dim1]; + } + vmax = 1.; + vcrit = bignum; + jnxt = ki + 2; + i__3 = *n; + for (j = ki + 2; j <= i__3; ++j) { + if (j < jnxt) { + goto L200; + } + j1 = j; + j2 = j; + jnxt = j + 1; + if (j < *n) { + if (t[j + 1 + j * t_dim1] != 0.) { + j2 = j + 1; + jnxt = j + 2; + } + } + if (j1 == j2) { + if (work[j] > vcrit) { + rec = 1. / vmax; + i__4 = *n - ki + 1; + dscal_(&i__4, &rec, &work[ki + iv * *n], &c__1); + i__4 = *n - ki + 1; + dscal_(&i__4, &rec, &work[ki + (iv + 1) * *n], &c__1); + vmax = 1.; + vcrit = bignum; + } + i__4 = j - ki - 2; + work[j + iv * *n] -= ddot_(&i__4, &t[ki + 2 + j * t_dim1], &c__1, + &work[ki + 2 + iv * *n], &c__1); + i__4 = j - ki - 2; + work[j + (iv + 1) * *n] -= ddot_(&i__4, &t[ki + 2 + j * t_dim1], &c__1, + &work[ki + 2 + (iv + 1) * *n], &c__1); + d__1 = -wi; + dlaln2_(&c_false, &c__1, &c__2, &smin, &c_b29, &t[j + j * t_dim1], ldt, + &c_b29, &c_b29, &work[j + iv * *n], n, &wr, &d__1, x, &c__2, &scale, + &xnorm, &ierr); + if (scale != 1.) { + i__4 = *n - ki + 1; + dscal_(&i__4, &scale, &work[ki + iv * *n], &c__1); + i__4 = *n - ki + 1; + dscal_(&i__4, &scale, &work[ki + (iv + 1) * *n], &c__1); + } + work[j + iv * *n] = x[0]; + work[j + (iv + 1) * *n] = x[2]; + d__3 = (d__1 = work[j + iv * *n], abs(d__1)), + d__4 = (d__2 = work[j + (iv + 1) * *n], abs(d__2)), d__3 = max(d__3, d__4); + vmax = max(d__3, vmax); + vcrit = bignum / vmax; + } else { + d__1 = work[j], d__2 = work[j + 1]; + beta = max(d__1, d__2); + if (beta > vcrit) { + rec = 1. / vmax; + i__4 = *n - ki + 1; + dscal_(&i__4, &rec, &work[ki + iv * *n], &c__1); + i__4 = *n - ki + 1; + dscal_(&i__4, &rec, &work[ki + (iv + 1) * *n], &c__1); + vmax = 1.; + vcrit = bignum; + } + i__4 = j - ki - 2; + work[j + iv * *n] -= ddot_(&i__4, &t[ki + 2 + j * t_dim1], &c__1, + &work[ki + 2 + iv * *n], &c__1); + i__4 = j - ki - 2; + work[j + (iv + 1) * *n] -= ddot_(&i__4, &t[ki + 2 + j * t_dim1], &c__1, + &work[ki + 2 + (iv + 1) * *n], &c__1); + i__4 = j - ki - 2; + work[j + 1 + iv * *n] -= ddot_(&i__4, &t[ki + 2 + (j + 1) * t_dim1], &c__1, + &work[ki + 2 + iv * *n], &c__1); + i__4 = j - ki - 2; + work[j + 1 + (iv + 1) * *n] -= + ddot_(&i__4, &t[ki + 2 + (j + 1) * t_dim1], &c__1, + &work[ki + 2 + (iv + 1) * *n], &c__1); + d__1 = -wi; + dlaln2_(&c_true, &c__2, &c__2, &smin, &c_b29, &t[j + j * t_dim1], ldt, + &c_b29, &c_b29, &work[j + iv * *n], n, &wr, &d__1, x, &c__2, &scale, + &xnorm, &ierr); + if (scale != 1.) { + i__4 = *n - ki + 1; + dscal_(&i__4, &scale, &work[ki + iv * *n], &c__1); + i__4 = *n - ki + 1; + dscal_(&i__4, &scale, &work[ki + (iv + 1) * *n], &c__1); + } + work[j + iv * *n] = x[0]; + work[j + (iv + 1) * *n] = x[2]; + work[j + 1 + iv * *n] = x[1]; + work[j + 1 + (iv + 1) * *n] = x[3]; + d__1 = abs(x[0]), d__2 = abs(x[2]), d__1 = max(d__1, d__2), + d__2 = abs(x[1]), d__1 = max(d__1, d__2), d__2 = abs(x[3]), + d__1 = max(d__1, d__2); + vmax = max(d__1, vmax); + vcrit = bignum / vmax; + } + L200:; + } + if (!over) { + i__3 = *n - ki + 1; + dcopy_(&i__3, &work[ki + iv * *n], &c__1, &vl[ki + is * vl_dim1], &c__1); + i__3 = *n - ki + 1; + dcopy_(&i__3, &work[ki + (iv + 1) * *n], &c__1, &vl[ki + (is + 1) * vl_dim1], + &c__1); + emax = 0.; + i__3 = *n; + for (k = ki; k <= i__3; ++k) { + d__3 = emax, d__4 = (d__1 = vl[k + is * vl_dim1], abs(d__1)) + + (d__2 = vl[k + (is + 1) * vl_dim1], abs(d__2)); + emax = max(d__3, d__4); + } + remax = 1. / emax; + i__3 = *n - ki + 1; + dscal_(&i__3, &remax, &vl[ki + is * vl_dim1], &c__1); + i__3 = *n - ki + 1; + dscal_(&i__3, &remax, &vl[ki + (is + 1) * vl_dim1], &c__1); + i__3 = ki - 1; + for (k = 1; k <= i__3; ++k) { + vl[k + is * vl_dim1] = 0.; + vl[k + (is + 1) * vl_dim1] = 0.; + } + } else if (nb == 1) { + if (ki < *n - 1) { + i__3 = *n - ki - 1; + dgemv_((char *)"N", n, &i__3, &c_b29, &vl[(ki + 2) * vl_dim1 + 1], ldvl, + &work[ki + 2 + iv * *n], &c__1, &work[ki + iv * *n], + &vl[ki * vl_dim1 + 1], &c__1, (ftnlen)1); + i__3 = *n - ki - 1; + dgemv_((char *)"N", n, &i__3, &c_b29, &vl[(ki + 2) * vl_dim1 + 1], ldvl, + &work[ki + 2 + (iv + 1) * *n], &c__1, &work[ki + 1 + (iv + 1) * *n], + &vl[(ki + 1) * vl_dim1 + 1], &c__1, (ftnlen)1); + } else { + dscal_(n, &work[ki + iv * *n], &vl[ki * vl_dim1 + 1], &c__1); + dscal_(n, &work[ki + 1 + (iv + 1) * *n], &vl[(ki + 1) * vl_dim1 + 1], + &c__1); + } + emax = 0.; + i__3 = *n; + for (k = 1; k <= i__3; ++k) { + d__3 = emax, d__4 = (d__1 = vl[k + ki * vl_dim1], abs(d__1)) + + (d__2 = vl[k + (ki + 1) * vl_dim1], abs(d__2)); + emax = max(d__3, d__4); + } + remax = 1. / emax; + dscal_(n, &remax, &vl[ki * vl_dim1 + 1], &c__1); + dscal_(n, &remax, &vl[(ki + 1) * vl_dim1 + 1], &c__1); + } else { + i__3 = ki - 1; + for (k = 1; k <= i__3; ++k) { + work[k + iv * *n] = 0.; + work[k + (iv + 1) * *n] = 0.; + } + iscomplex[iv - 1] = ip; + iscomplex[iv] = -ip; + ++iv; + } + } + if (nb > 1) { + if (ip == 0) { + ki2 = ki; + } else { + ki2 = ki + 1; + } + if (iv >= nb - 1 || ki2 == *n) { + i__3 = *n - ki2 + iv; + dgemm_((char *)"N", (char *)"N", n, &iv, &i__3, &c_b29, &vl[(ki2 - iv + 1) * vl_dim1 + 1], ldvl, + &work[ki2 - iv + 1 + *n], n, &c_b17, &work[(nb + 1) * *n + 1], n, + (ftnlen)1, (ftnlen)1); + i__3 = iv; + for (k = 1; k <= i__3; ++k) { + if (iscomplex[k - 1] == 0) { + ii = idamax_(n, &work[(nb + k) * *n + 1], &c__1); + remax = 1. / (d__1 = work[ii + (nb + k) * *n], abs(d__1)); + } else if (iscomplex[k - 1] == 1) { + emax = 0.; + i__4 = *n; + for (ii = 1; ii <= i__4; ++ii) { + d__3 = emax, + d__4 = (d__1 = work[ii + (nb + k) * *n], abs(d__1)) + + (d__2 = work[ii + (nb + k + 1) * *n], abs(d__2)); + emax = max(d__3, d__4); + } + remax = 1. / emax; + } + dscal_(n, &remax, &work[(nb + k) * *n + 1], &c__1); + } + dlacpy_((char *)"F", n, &iv, &work[(nb + 1) * *n + 1], n, + &vl[(ki2 - iv + 1) * vl_dim1 + 1], ldvl, (ftnlen)1); + iv = 1; + } else { + ++iv; + } + } + ++is; + if (ip != 0) { + ++is; + } + L260:; + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dtrexc.cpp b/lib/linalg/dtrexc.cpp new file mode 100644 index 0000000000..07568d6ed2 --- /dev/null +++ b/lib/linalg/dtrexc.cpp @@ -0,0 +1,217 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c__2 = 2; +int dtrexc_(char *compq, integer *n, doublereal *t, integer *ldt, doublereal *q, integer *ldq, + integer *ifst, integer *ilst, doublereal *work, integer *info, ftnlen compq_len) +{ + integer q_dim1, q_offset, t_dim1, t_offset, i__1; + integer nbf, nbl, here; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + logical wantq; + extern int dlaexc_(logical *, integer *, doublereal *, integer *, doublereal *, integer *, + integer *, integer *, integer *, doublereal *, integer *), + xerbla_(char *, integer *, ftnlen); + integer nbnext; + t_dim1 = *ldt; + t_offset = 1 + t_dim1; + t -= t_offset; + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + --work; + *info = 0; + wantq = lsame_(compq, (char *)"V", (ftnlen)1, (ftnlen)1); + if (!wantq && !lsame_(compq, (char *)"N", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*ldt < max(1, *n)) { + *info = -4; + } else if (*ldq < 1 || wantq && *ldq < max(1, *n)) { + *info = -6; + } else if ((*ifst < 1 || *ifst > *n) && *n > 0) { + *info = -7; + } else if ((*ilst < 1 || *ilst > *n) && *n > 0) { + *info = -8; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DTREXC", &i__1, (ftnlen)6); + return 0; + } + if (*n <= 1) { + return 0; + } + if (*ifst > 1) { + if (t[*ifst + (*ifst - 1) * t_dim1] != 0.) { + --(*ifst); + } + } + nbf = 1; + if (*ifst < *n) { + if (t[*ifst + 1 + *ifst * t_dim1] != 0.) { + nbf = 2; + } + } + if (*ilst > 1) { + if (t[*ilst + (*ilst - 1) * t_dim1] != 0.) { + --(*ilst); + } + } + nbl = 1; + if (*ilst < *n) { + if (t[*ilst + 1 + *ilst * t_dim1] != 0.) { + nbl = 2; + } + } + if (*ifst == *ilst) { + return 0; + } + if (*ifst < *ilst) { + if (nbf == 2 && nbl == 1) { + --(*ilst); + } + if (nbf == 1 && nbl == 2) { + ++(*ilst); + } + here = *ifst; + L10: + if (nbf == 1 || nbf == 2) { + nbnext = 1; + if (here + nbf + 1 <= *n) { + if (t[here + nbf + 1 + (here + nbf) * t_dim1] != 0.) { + nbnext = 2; + } + } + dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &here, &nbf, &nbnext, &work[1], + info); + if (*info != 0) { + *ilst = here; + return 0; + } + here += nbnext; + if (nbf == 2) { + if (t[here + 1 + here * t_dim1] == 0.) { + nbf = 3; + } + } + } else { + nbnext = 1; + if (here + 3 <= *n) { + if (t[here + 3 + (here + 2) * t_dim1] != 0.) { + nbnext = 2; + } + } + i__1 = here + 1; + dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &i__1, &c__1, &nbnext, + &work[1], info); + if (*info != 0) { + *ilst = here; + return 0; + } + if (nbnext == 1) { + dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &here, &c__1, &nbnext, + &work[1], info); + ++here; + } else { + if (t[here + 2 + (here + 1) * t_dim1] == 0.) { + nbnext = 1; + } + if (nbnext == 2) { + dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &here, &c__1, &nbnext, + &work[1], info); + if (*info != 0) { + *ilst = here; + return 0; + } + here += 2; + } else { + dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &here, &c__1, &c__1, + &work[1], info); + i__1 = here + 1; + dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &i__1, &c__1, &c__1, + &work[1], info); + here += 2; + } + } + } + if (here < *ilst) { + goto L10; + } + } else { + here = *ifst; + L20: + if (nbf == 1 || nbf == 2) { + nbnext = 1; + if (here >= 3) { + if (t[here - 1 + (here - 2) * t_dim1] != 0.) { + nbnext = 2; + } + } + i__1 = here - nbnext; + dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &i__1, &nbnext, &nbf, &work[1], + info); + if (*info != 0) { + *ilst = here; + return 0; + } + here -= nbnext; + if (nbf == 2) { + if (t[here + 1 + here * t_dim1] == 0.) { + nbf = 3; + } + } + } else { + nbnext = 1; + if (here >= 3) { + if (t[here - 1 + (here - 2) * t_dim1] != 0.) { + nbnext = 2; + } + } + i__1 = here - nbnext; + dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &i__1, &nbnext, &c__1, + &work[1], info); + if (*info != 0) { + *ilst = here; + return 0; + } + if (nbnext == 1) { + dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &here, &nbnext, &c__1, + &work[1], info); + --here; + } else { + if (t[here + (here - 1) * t_dim1] == 0.) { + nbnext = 1; + } + if (nbnext == 2) { + i__1 = here - 1; + dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &i__1, &c__2, &c__1, + &work[1], info); + if (*info != 0) { + *ilst = here; + return 0; + } + here += -2; + } else { + dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &here, &c__1, &c__1, + &work[1], info); + i__1 = here - 1; + dlaexc_(&wantq, n, &t[t_offset], ldt, &q[q_offset], ldq, &i__1, &c__1, &c__1, + &work[1], info); + here += -2; + } + } + } + if (here > *ilst) { + goto L20; + } + } + *ilst = here; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/dtrtrs.cpp b/lib/linalg/dtrtrs.cpp new file mode 100644 index 0000000000..3ef3eac882 --- /dev/null +++ b/lib/linalg/dtrtrs.cpp @@ -0,0 +1,65 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublereal c_b12 = 1.; +int dtrtrs_(char *uplo, char *trans, char *diag, integer *n, integer *nrhs, doublereal *a, + integer *lda, doublereal *b, integer *ldb, integer *info, ftnlen uplo_len, + ftnlen trans_len, ftnlen diag_len) +{ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + xerbla_(char *, integer *, ftnlen); + logical nounit; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + *info = 0; + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (!nounit && !lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*nrhs < 0) { + *info = -5; + } else if (*lda < max(1, *n)) { + *info = -7; + } else if (*ldb < max(1, *n)) { + *info = -9; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DTRTRS", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + if (nounit) { + i__1 = *n; + for (*info = 1; *info <= i__1; ++(*info)) { + if (a[*info + *info * a_dim1] == 0.) { + return 0; + } + } + } + *info = 0; + dtrsm_((char *)"Left", uplo, trans, diag, n, nrhs, &c_b12, &a[a_offset], lda, &b[b_offset], ldb, + (ftnlen)4, (ftnlen)1, (ftnlen)1, (ftnlen)1); + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/izamax.cpp b/lib/linalg/izamax.cpp new file mode 100644 index 0000000000..1aebf6ac52 --- /dev/null +++ b/lib/linalg/izamax.cpp @@ -0,0 +1,46 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +integer izamax_(integer *n, doublecomplex *zx, integer *incx) +{ + integer ret_val, i__1; + integer i__, ix; + doublereal dmax__; + extern doublereal dcabs1_(doublecomplex *); + --zx; + ret_val = 0; + if (*n < 1 || *incx <= 0) { + return ret_val; + } + ret_val = 1; + if (*n == 1) { + return ret_val; + } + if (*incx == 1) { + dmax__ = dcabs1_(&zx[1]); + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + if (dcabs1_(&zx[i__]) > dmax__) { + ret_val = i__; + dmax__ = dcabs1_(&zx[i__]); + } + } + } else { + ix = 1; + dmax__ = dcabs1_(&zx[1]); + ix += *incx; + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + if (dcabs1_(&zx[ix]) > dmax__) { + ret_val = i__; + dmax__ = dcabs1_(&zx[ix]); + } + ix += *incx; + } + } + return ret_val; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zcop.cpp b/lib/linalg/zcop.cpp new file mode 100644 index 0000000000..4ec6ae0b78 --- /dev/null +++ b/lib/linalg/zcop.cpp @@ -0,0 +1,43 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int zcopy_(integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy) +{ + integer i__1, i__2, i__3; + integer i__, ix, iy; + --zy; + --zx; + if (*n <= 0) { + return 0; + } + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + zy[i__2].r = zx[i__3].r, zy[i__2].i = zx[i__3].i; + } + } else { + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + i__3 = ix; + zy[i__2].r = zx[i__3].r, zy[i__2].i = zx[i__3].i; + ix += *incx; + iy += *incy; + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zdotu.cpp b/lib/linalg/zdotu.cpp new file mode 100644 index 0000000000..1b284d12c6 --- /dev/null +++ b/lib/linalg/zdotu.cpp @@ -0,0 +1,55 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +VOID zdotu_(doublecomplex *ret_val, integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, + integer *incy) +{ + integer i__1, i__2, i__3; + doublecomplex z__1, z__2; + integer i__, ix, iy; + doublecomplex ztemp; + --zy; + --zx; + ztemp.r = 0., ztemp.i = 0.; + ret_val->r = 0., ret_val->i = 0.; + if (*n <= 0) { + return; + } + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + z__2.r = zx[i__2].r * zy[i__3].r - zx[i__2].i * zy[i__3].i, + z__2.i = zx[i__2].r * zy[i__3].i + zx[i__2].i * zy[i__3].r; + z__1.r = ztemp.r + z__2.r, z__1.i = ztemp.i + z__2.i; + ztemp.r = z__1.r, ztemp.i = z__1.i; + } + } else { + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ix; + i__3 = iy; + z__2.r = zx[i__2].r * zy[i__3].r - zx[i__2].i * zy[i__3].i, + z__2.i = zx[i__2].r * zy[i__3].i + zx[i__2].i * zy[i__3].r; + z__1.r = ztemp.r + z__2.r, z__1.i = ztemp.i + z__2.i; + ztemp.r = z__1.r, ztemp.i = z__1.i; + ix += *incx; + iy += *incy; + } + } + ret_val->r = ztemp.r, ret_val->i = ztemp.i; + return; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zgetrf.cpp b/lib/linalg/zgetrf.cpp new file mode 100644 index 0000000000..5fb9182b87 --- /dev/null +++ b/lib/linalg/zgetrf.cpp @@ -0,0 +1,90 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static integer c__1 = 1; +static integer c_n1 = -1; +int zgetrf_(integer *m, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info) +{ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1; + integer i__, j, jb, nb, iinfo; + extern int zgemm_(char *, char *, integer *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, ftnlen, ftnlen), + ztrsm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int zlaswp_(integer *, doublecomplex *, integer *, integer *, integer *, integer *, + integer *), + zgetrf2_(integer *, integer *, doublecomplex *, integer *, integer *, integer *); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *m)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZGETRF", &i__1, (ftnlen)6); + return 0; + } + if (*m == 0 || *n == 0) { + return 0; + } + nb = ilaenv_(&c__1, (char *)"ZGETRF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + if (nb <= 1 || nb >= min(*m, *n)) { + zgetrf2_(m, n, &a[a_offset], lda, &ipiv[1], info); + } else { + i__1 = min(*m, *n); + i__2 = nb; + for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + i__3 = min(*m, *n) - j + 1; + jb = min(i__3, nb); + i__3 = *m - j + 1; + zgetrf2_(&i__3, &jb, &a[j + j * a_dim1], lda, &ipiv[j], &iinfo); + if (*info == 0 && iinfo > 0) { + *info = iinfo + j - 1; + } + i__4 = *m, i__5 = j + jb - 1; + i__3 = min(i__4, i__5); + for (i__ = j; i__ <= i__3; ++i__) { + ipiv[i__] = j - 1 + ipiv[i__]; + } + i__3 = j - 1; + i__4 = j + jb - 1; + zlaswp_(&i__3, &a[a_offset], lda, &j, &i__4, &ipiv[1], &c__1); + if (j + jb <= *n) { + i__3 = *n - j - jb + 1; + i__4 = j + jb - 1; + zlaswp_(&i__3, &a[(j + jb) * a_dim1 + 1], lda, &j, &i__4, &ipiv[1], &c__1); + i__3 = *n - j - jb + 1; + ztrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Unit", &jb, &i__3, &c_b1, + &a[j + j * a_dim1], lda, &a[j + (j + jb) * a_dim1], lda, (ftnlen)4, + (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (j + jb <= *m) { + i__3 = *m - j - jb + 1; + i__4 = *n - j - jb + 1; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"No transpose", &i__3, &i__4, &jb, &z__1, + &a[j + jb + j * a_dim1], lda, &a[j + (j + jb) * a_dim1], lda, &c_b1, + &a[j + jb + (j + jb) * a_dim1], lda, (ftnlen)12, (ftnlen)12); + } + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zgetrf2.cpp b/lib/linalg/zgetrf2.cpp new file mode 100644 index 0000000000..805b5810bc --- /dev/null +++ b/lib/linalg/zgetrf2.cpp @@ -0,0 +1,117 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static integer c__1 = 1; +int zgetrf2_(integer *m, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info) +{ + integer a_dim1, a_offset, i__1, i__2; + doublecomplex z__1; + double z_lmp_abs(doublecomplex *); + void z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *); + integer i__, n1, n2; + doublecomplex temp; + integer iinfo; + doublereal sfmin; + extern int zscal_(integer *, doublecomplex *, doublecomplex *, integer *), + zgemm_(char *, char *, integer *, integer *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, integer *, doublecomplex *, doublecomplex *, integer *, + ftnlen, ftnlen), + ztrsm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen); + extern doublereal dlamch_(char *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + extern integer izamax_(integer *, doublecomplex *, integer *); + extern int zlaswp_(integer *, doublecomplex *, integer *, integer *, integer *, integer *, + integer *); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *m)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZGETRF2", &i__1, (ftnlen)7); + return 0; + } + if (*m == 0 || *n == 0) { + return 0; + } + if (*m == 1) { + ipiv[1] = 1; + i__1 = a_dim1 + 1; + if (a[i__1].r == 0. && a[i__1].i == 0.) { + *info = 1; + } + } else if (*n == 1) { + sfmin = dlamch_((char *)"S", (ftnlen)1); + i__ = izamax_(m, &a[a_dim1 + 1], &c__1); + ipiv[1] = i__; + i__1 = i__ + a_dim1; + if (a[i__1].r != 0. || a[i__1].i != 0.) { + if (i__ != 1) { + i__1 = a_dim1 + 1; + temp.r = a[i__1].r, temp.i = a[i__1].i; + i__1 = a_dim1 + 1; + i__2 = i__ + a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = i__ + a_dim1; + a[i__1].r = temp.r, a[i__1].i = temp.i; + } + if (z_lmp_abs(&a[a_dim1 + 1]) >= sfmin) { + i__1 = *m - 1; + z_lmp_div(&z__1, &c_b1, &a[a_dim1 + 1]); + zscal_(&i__1, &z__1, &a[a_dim1 + 2], &c__1); + } else { + i__1 = *m - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + 1 + a_dim1; + z_lmp_div(&z__1, &a[i__ + 1 + a_dim1], &a[a_dim1 + 1]); + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + } + } + } else { + *info = 1; + } + } else { + n1 = min(*m, *n) / 2; + n2 = *n - n1; + zgetrf2_(m, &n1, &a[a_offset], lda, &ipiv[1], &iinfo); + if (*info == 0 && iinfo > 0) { + *info = iinfo; + } + zlaswp_(&n2, &a[(n1 + 1) * a_dim1 + 1], lda, &c__1, &n1, &ipiv[1], &c__1); + ztrsm_((char *)"L", (char *)"L", (char *)"N", (char *)"U", &n1, &n2, &c_b1, &a[a_offset], lda, &a[(n1 + 1) * a_dim1 + 1], + lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__1 = *m - n1; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"N", (char *)"N", &i__1, &n2, &n1, &z__1, &a[n1 + 1 + a_dim1], lda, + &a[(n1 + 1) * a_dim1 + 1], lda, &c_b1, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, + (ftnlen)1, (ftnlen)1); + i__1 = *m - n1; + zgetrf2_(&i__1, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &ipiv[n1 + 1], &iinfo); + if (*info == 0 && iinfo > 0) { + *info = iinfo + n1; + } + i__1 = min(*m, *n); + for (i__ = n1 + 1; i__ <= i__1; ++i__) { + ipiv[i__] += n1; + } + i__1 = n1 + 1; + i__2 = min(*m, *n); + zlaswp_(&n1, &a[a_dim1 + 1], lda, &i__1, &i__2, &ipiv[1], &c__1); + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zgetri.cpp b/lib/linalg/zgetri.cpp new file mode 100644 index 0000000000..a61e931cb4 --- /dev/null +++ b/lib/linalg/zgetri.cpp @@ -0,0 +1,132 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b2 = {1., 0.}; +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +int zgetri_(integer *n, doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *work, + integer *lwork, integer *info) +{ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1; + integer i__, j, jb, nb, jj, jp, nn, iws, nbmin; + extern int zgemm_(char *, char *, integer *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, ftnlen, ftnlen), + zgemv_(char *, integer *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, integer *, ftnlen), + zswap_(integer *, doublecomplex *, integer *, doublecomplex *, integer *), + ztrsm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + integer ldwork, lwkopt; + logical lquery; + extern int ztrtri_(char *, char *, integer *, doublecomplex *, integer *, integer *, ftnlen, + ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + --work; + *info = 0; + nb = ilaenv_(&c__1, (char *)"ZGETRI", (char *)" ", n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + lwkopt = *n * nb; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; + lquery = *lwork == -1; + if (*n < 0) { + *info = -1; + } else if (*lda < max(1, *n)) { + *info = -3; + } else if (*lwork < max(1, *n) && !lquery) { + *info = -6; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZGETRI", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + if (*n == 0) { + return 0; + } + ztrtri_((char *)"Upper", (char *)"Non-unit", n, &a[a_offset], lda, info, (ftnlen)5, (ftnlen)8); + if (*info > 0) { + return 0; + } + nbmin = 2; + ldwork = *n; + if (nb > 1 && nb < *n) { + i__1 = ldwork * nb; + iws = max(i__1, 1); + if (*lwork < iws) { + nb = *lwork / ldwork; + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"ZGETRI", (char *)" ", n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); + } + } else { + iws = *n; + } + if (nb < nbmin || nb >= *n) { + for (j = *n; j >= 1; --j) { + i__1 = *n; + for (i__ = j + 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__ + j * a_dim1; + work[i__2].r = a[i__3].r, work[i__2].i = a[i__3].i; + i__2 = i__ + j * a_dim1; + a[i__2].r = 0., a[i__2].i = 0.; + } + if (j < *n) { + i__1 = *n - j; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", n, &i__1, &z__1, &a[(j + 1) * a_dim1 + 1], lda, &work[j + 1], + &c__1, &c_b2, &a[j * a_dim1 + 1], &c__1, (ftnlen)12); + } + } + } else { + nn = (*n - 1) / nb * nb + 1; + i__1 = -nb; + for (j = nn; i__1 < 0 ? j >= 1 : j <= 1; j += i__1) { + i__2 = nb, i__3 = *n - j + 1; + jb = min(i__2, i__3); + i__2 = j + jb - 1; + for (jj = j; jj <= i__2; ++jj) { + i__3 = *n; + for (i__ = jj + 1; i__ <= i__3; ++i__) { + i__4 = i__ + (jj - j) * ldwork; + i__5 = i__ + jj * a_dim1; + work[i__4].r = a[i__5].r, work[i__4].i = a[i__5].i; + i__4 = i__ + jj * a_dim1; + a[i__4].r = 0., a[i__4].i = 0.; + } + } + if (j + jb <= *n) { + i__2 = *n - j - jb + 1; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"No transpose", n, &jb, &i__2, &z__1, + &a[(j + jb) * a_dim1 + 1], lda, &work[j + jb], &ldwork, &c_b2, + &a[j * a_dim1 + 1], lda, (ftnlen)12, (ftnlen)12); + } + ztrsm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, &jb, &c_b2, &work[j], &ldwork, + &a[j * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + } + } + for (j = *n - 1; j >= 1; --j) { + jp = ipiv[j]; + if (jp != j) { + zswap_(n, &a[j * a_dim1 + 1], &c__1, &a[jp * a_dim1 + 1], &c__1); + } + } + work[1].r = (doublereal)iws, work[1].i = 0.; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zhegs2.cpp b/lib/linalg/zhegs2.cpp new file mode 100644 index 0000000000..685f548c61 --- /dev/null +++ b/lib/linalg/zhegs2.cpp @@ -0,0 +1,197 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static integer c__1 = 1; +int zhegs2_(integer *itype, char *uplo, integer *n, doublecomplex *a, integer *lda, + doublecomplex *b, integer *ldb, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; + doublereal d__1, d__2; + doublecomplex z__1; + integer k; + doublecomplex ct; + doublereal akk, bkk; + extern int zher2_(char *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + logical upper; + extern int zaxpy_(integer *, doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *), + ztrmv_(char *, char *, char *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, ftnlen, ftnlen, ftnlen), + ztrsv_(char *, char *, char *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, ftnlen, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen), + zdscal_(integer *, doublereal *, doublecomplex *, integer *), + zlacgv_(integer *, doublecomplex *, integer *); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (*itype < 1 || *itype > 3) { + *info = -1; + } else if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1, *n)) { + *info = -5; + } else if (*ldb < max(1, *n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZHEGS2", &i__1, (ftnlen)6); + return 0; + } + if (*itype == 1) { + if (upper) { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + i__2 = k + k * a_dim1; + akk = a[i__2].r; + i__2 = k + k * b_dim1; + bkk = b[i__2].r; + d__1 = bkk; + akk /= d__1 * d__1; + i__2 = k + k * a_dim1; + a[i__2].r = akk, a[i__2].i = 0.; + if (k < *n) { + i__2 = *n - k; + d__1 = 1. / bkk; + zdscal_(&i__2, &d__1, &a[k + (k + 1) * a_dim1], lda); + d__1 = akk * -.5; + ct.r = d__1, ct.i = 0.; + i__2 = *n - k; + zlacgv_(&i__2, &a[k + (k + 1) * a_dim1], lda); + i__2 = *n - k; + zlacgv_(&i__2, &b[k + (k + 1) * b_dim1], ldb); + i__2 = *n - k; + zaxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + (k + 1) * a_dim1], + lda); + i__2 = *n - k; + z__1.r = -1., z__1.i = -0.; + zher2_(uplo, &i__2, &z__1, &a[k + (k + 1) * a_dim1], lda, + &b[k + (k + 1) * b_dim1], ldb, &a[k + 1 + (k + 1) * a_dim1], lda, + (ftnlen)1); + i__2 = *n - k; + zaxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + (k + 1) * a_dim1], + lda); + i__2 = *n - k; + zlacgv_(&i__2, &b[k + (k + 1) * b_dim1], ldb); + i__2 = *n - k; + ztrsv_(uplo, (char *)"Conjugate transpose", (char *)"Non-unit", &i__2, + &b[k + 1 + (k + 1) * b_dim1], ldb, &a[k + (k + 1) * a_dim1], lda, + (ftnlen)1, (ftnlen)19, (ftnlen)8); + i__2 = *n - k; + zlacgv_(&i__2, &a[k + (k + 1) * a_dim1], lda); + } + } + } else { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + i__2 = k + k * a_dim1; + akk = a[i__2].r; + i__2 = k + k * b_dim1; + bkk = b[i__2].r; + d__1 = bkk; + akk /= d__1 * d__1; + i__2 = k + k * a_dim1; + a[i__2].r = akk, a[i__2].i = 0.; + if (k < *n) { + i__2 = *n - k; + d__1 = 1. / bkk; + zdscal_(&i__2, &d__1, &a[k + 1 + k * a_dim1], &c__1); + d__1 = akk * -.5; + ct.r = d__1, ct.i = 0.; + i__2 = *n - k; + zaxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + k * a_dim1], + &c__1); + i__2 = *n - k; + z__1.r = -1., z__1.i = -0.; + zher2_(uplo, &i__2, &z__1, &a[k + 1 + k * a_dim1], &c__1, + &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + (k + 1) * a_dim1], lda, + (ftnlen)1); + i__2 = *n - k; + zaxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + k * a_dim1], + &c__1); + i__2 = *n - k; + ztrsv_(uplo, (char *)"No transpose", (char *)"Non-unit", &i__2, &b[k + 1 + (k + 1) * b_dim1], + ldb, &a[k + 1 + k * a_dim1], &c__1, (ftnlen)1, (ftnlen)12, (ftnlen)8); + } + } + } + } else { + if (upper) { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + i__2 = k + k * a_dim1; + akk = a[i__2].r; + i__2 = k + k * b_dim1; + bkk = b[i__2].r; + i__2 = k - 1; + ztrmv_(uplo, (char *)"No transpose", (char *)"Non-unit", &i__2, &b[b_offset], ldb, + &a[k * a_dim1 + 1], &c__1, (ftnlen)1, (ftnlen)12, (ftnlen)8); + d__1 = akk * .5; + ct.r = d__1, ct.i = 0.; + i__2 = k - 1; + zaxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + 1], &c__1); + i__2 = k - 1; + zher2_(uplo, &i__2, &c_b1, &a[k * a_dim1 + 1], &c__1, &b[k * b_dim1 + 1], &c__1, + &a[a_offset], lda, (ftnlen)1); + i__2 = k - 1; + zaxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + 1], &c__1); + i__2 = k - 1; + zdscal_(&i__2, &bkk, &a[k * a_dim1 + 1], &c__1); + i__2 = k + k * a_dim1; + d__2 = bkk; + d__1 = akk * (d__2 * d__2); + a[i__2].r = d__1, a[i__2].i = 0.; + } + } else { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + i__2 = k + k * a_dim1; + akk = a[i__2].r; + i__2 = k + k * b_dim1; + bkk = b[i__2].r; + i__2 = k - 1; + zlacgv_(&i__2, &a[k + a_dim1], lda); + i__2 = k - 1; + ztrmv_(uplo, (char *)"Conjugate transpose", (char *)"Non-unit", &i__2, &b[b_offset], ldb, + &a[k + a_dim1], lda, (ftnlen)1, (ftnlen)19, (ftnlen)8); + d__1 = akk * .5; + ct.r = d__1, ct.i = 0.; + i__2 = k - 1; + zlacgv_(&i__2, &b[k + b_dim1], ldb); + i__2 = k - 1; + zaxpy_(&i__2, &ct, &b[k + b_dim1], ldb, &a[k + a_dim1], lda); + i__2 = k - 1; + zher2_(uplo, &i__2, &c_b1, &a[k + a_dim1], lda, &b[k + b_dim1], ldb, &a[a_offset], + lda, (ftnlen)1); + i__2 = k - 1; + zaxpy_(&i__2, &ct, &b[k + b_dim1], ldb, &a[k + a_dim1], lda); + i__2 = k - 1; + zlacgv_(&i__2, &b[k + b_dim1], ldb); + i__2 = k - 1; + zdscal_(&i__2, &bkk, &a[k + a_dim1], lda); + i__2 = k - 1; + zlacgv_(&i__2, &a[k + a_dim1], lda); + i__2 = k + k * a_dim1; + d__2 = bkk; + d__1 = akk * (d__2 * d__2); + a[i__2].r = d__1, a[i__2].i = 0.; + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zhegst.cpp b/lib/linalg/zhegst.cpp new file mode 100644 index 0000000000..8c9d9434cb --- /dev/null +++ b/lib/linalg/zhegst.cpp @@ -0,0 +1,195 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static doublecomplex c_b2 = {.5, 0.}; +static integer c__1 = 1; +static integer c_n1 = -1; +static doublereal c_b18 = 1.; +int zhegst_(integer *itype, char *uplo, integer *n, doublecomplex *a, integer *lda, + doublecomplex *b, integer *ldb, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; + doublecomplex z__1; + integer k, kb, nb; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int zhemm_(char *, char *, integer *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen); + logical upper; + extern int ztrmm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, + ftnlen, ftnlen), + ztrsm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + zhegs2_(integer *, char *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, integer *, ftnlen), + zher2k_(char *, char *, integer *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublereal *, doublecomplex *, integer *, ftnlen, + ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (*itype < 1 || *itype > 3) { + *info = -1; + } else if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1, *n)) { + *info = -5; + } else if (*ldb < max(1, *n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZHEGST", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + nb = ilaenv_(&c__1, (char *)"ZHEGST", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + if (nb <= 1 || nb >= *n) { + zhegs2_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, (ftnlen)1); + } else { + if (*itype == 1) { + if (upper) { + i__1 = *n; + i__2 = nb; + for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { + i__3 = *n - k + 1; + kb = min(i__3, nb); + zhegs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + k * b_dim1], ldb, + info, (ftnlen)1); + if (k + kb <= *n) { + i__3 = *n - k - kb + 1; + ztrsm_((char *)"L", uplo, (char *)"C", (char *)"N", &kb, &i__3, &c_b1, &b[k + k * b_dim1], ldb, + &a[k + (k + kb) * a_dim1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + i__3 = *n - k - kb + 1; + z__1.r = -.5, z__1.i = -0.; + zhemm_((char *)"L", uplo, &kb, &i__3, &z__1, &a[k + k * a_dim1], lda, + &b[k + (k + kb) * b_dim1], ldb, &c_b1, &a[k + (k + kb) * a_dim1], + lda, (ftnlen)1, (ftnlen)1); + i__3 = *n - k - kb + 1; + z__1.r = -1., z__1.i = -0.; + zher2k_(uplo, (char *)"C", &i__3, &kb, &z__1, &a[k + (k + kb) * a_dim1], lda, + &b[k + (k + kb) * b_dim1], ldb, &c_b18, + &a[k + kb + (k + kb) * a_dim1], lda, (ftnlen)1, (ftnlen)1); + i__3 = *n - k - kb + 1; + z__1.r = -.5, z__1.i = -0.; + zhemm_((char *)"L", uplo, &kb, &i__3, &z__1, &a[k + k * a_dim1], lda, + &b[k + (k + kb) * b_dim1], ldb, &c_b1, &a[k + (k + kb) * a_dim1], + lda, (ftnlen)1, (ftnlen)1); + i__3 = *n - k - kb + 1; + ztrsm_((char *)"R", uplo, (char *)"N", (char *)"N", &kb, &i__3, &c_b1, + &b[k + kb + (k + kb) * b_dim1], ldb, &a[k + (k + kb) * a_dim1], lda, + (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + } + } else { + i__2 = *n; + i__1 = nb; + for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { + i__3 = *n - k + 1; + kb = min(i__3, nb); + zhegs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + k * b_dim1], ldb, + info, (ftnlen)1); + if (k + kb <= *n) { + i__3 = *n - k - kb + 1; + ztrsm_((char *)"R", uplo, (char *)"C", (char *)"N", &i__3, &kb, &c_b1, &b[k + k * b_dim1], ldb, + &a[k + kb + k * a_dim1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + i__3 = *n - k - kb + 1; + z__1.r = -.5, z__1.i = -0.; + zhemm_((char *)"R", uplo, &i__3, &kb, &z__1, &a[k + k * a_dim1], lda, + &b[k + kb + k * b_dim1], ldb, &c_b1, &a[k + kb + k * a_dim1], lda, + (ftnlen)1, (ftnlen)1); + i__3 = *n - k - kb + 1; + z__1.r = -1., z__1.i = -0.; + zher2k_(uplo, (char *)"N", &i__3, &kb, &z__1, &a[k + kb + k * a_dim1], lda, + &b[k + kb + k * b_dim1], ldb, &c_b18, + &a[k + kb + (k + kb) * a_dim1], lda, (ftnlen)1, (ftnlen)1); + i__3 = *n - k - kb + 1; + z__1.r = -.5, z__1.i = -0.; + zhemm_((char *)"R", uplo, &i__3, &kb, &z__1, &a[k + k * a_dim1], lda, + &b[k + kb + k * b_dim1], ldb, &c_b1, &a[k + kb + k * a_dim1], lda, + (ftnlen)1, (ftnlen)1); + i__3 = *n - k - kb + 1; + ztrsm_((char *)"L", uplo, (char *)"N", (char *)"N", &i__3, &kb, &c_b1, + &b[k + kb + (k + kb) * b_dim1], ldb, &a[k + kb + k * a_dim1], lda, + (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + } + } + } else { + if (upper) { + i__1 = *n; + i__2 = nb; + for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { + i__3 = *n - k + 1; + kb = min(i__3, nb); + i__3 = k - 1; + ztrmm_((char *)"L", uplo, (char *)"N", (char *)"N", &i__3, &kb, &c_b1, &b[b_offset], ldb, + &a[k * a_dim1 + 1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__3 = k - 1; + zhemm_((char *)"R", uplo, &i__3, &kb, &c_b2, &a[k + k * a_dim1], lda, + &b[k * b_dim1 + 1], ldb, &c_b1, &a[k * a_dim1 + 1], lda, (ftnlen)1, + (ftnlen)1); + i__3 = k - 1; + zher2k_(uplo, (char *)"N", &i__3, &kb, &c_b1, &a[k * a_dim1 + 1], lda, + &b[k * b_dim1 + 1], ldb, &c_b18, &a[a_offset], lda, (ftnlen)1, + (ftnlen)1); + i__3 = k - 1; + zhemm_((char *)"R", uplo, &i__3, &kb, &c_b2, &a[k + k * a_dim1], lda, + &b[k * b_dim1 + 1], ldb, &c_b1, &a[k * a_dim1 + 1], lda, (ftnlen)1, + (ftnlen)1); + i__3 = k - 1; + ztrmm_((char *)"R", uplo, (char *)"C", (char *)"N", &i__3, &kb, &c_b1, &b[k + k * b_dim1], ldb, + &a[k * a_dim1 + 1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + zhegs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + k * b_dim1], ldb, + info, (ftnlen)1); + } + } else { + i__2 = *n; + i__1 = nb; + for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { + i__3 = *n - k + 1; + kb = min(i__3, nb); + i__3 = k - 1; + ztrmm_((char *)"R", uplo, (char *)"N", (char *)"N", &kb, &i__3, &c_b1, &b[b_offset], ldb, + &a[k + a_dim1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__3 = k - 1; + zhemm_((char *)"L", uplo, &kb, &i__3, &c_b2, &a[k + k * a_dim1], lda, &b[k + b_dim1], + ldb, &c_b1, &a[k + a_dim1], lda, (ftnlen)1, (ftnlen)1); + i__3 = k - 1; + zher2k_(uplo, (char *)"C", &i__3, &kb, &c_b1, &a[k + a_dim1], lda, &b[k + b_dim1], ldb, + &c_b18, &a[a_offset], lda, (ftnlen)1, (ftnlen)1); + i__3 = k - 1; + zhemm_((char *)"L", uplo, &kb, &i__3, &c_b2, &a[k + k * a_dim1], lda, &b[k + b_dim1], + ldb, &c_b1, &a[k + a_dim1], lda, (ftnlen)1, (ftnlen)1); + i__3 = k - 1; + ztrmm_((char *)"L", uplo, (char *)"C", (char *)"N", &kb, &i__3, &c_b1, &b[k + k * b_dim1], ldb, + &a[k + a_dim1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + zhegs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + k * b_dim1], ldb, + info, (ftnlen)1); + } + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zhegv.cpp b/lib/linalg/zhegv.cpp new file mode 100644 index 0000000000..9d85be5132 --- /dev/null +++ b/lib/linalg/zhegv.cpp @@ -0,0 +1,115 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static integer c__1 = 1; +static integer c_n1 = -1; +int zhegv_(integer *itype, char *jobz, char *uplo, integer *n, doublecomplex *a, integer *lda, + doublecomplex *b, integer *ldb, doublereal *w, doublecomplex *work, integer *lwork, + doublereal *rwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) +{ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; + integer nb, neig; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int zheev_(char *, char *, integer *, doublecomplex *, integer *, doublereal *, + doublecomplex *, integer *, doublereal *, integer *, ftnlen, ftnlen); + char trans[1]; + logical upper, wantz; + extern int ztrmm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, + ftnlen, ftnlen), + ztrsm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int zhegst_(integer *, char *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, integer *, ftnlen); + integer lwkopt; + logical lquery; + extern int zpotrf_(char *, integer *, doublecomplex *, integer *, integer *, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + --w; + --work; + --rwork; + wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + *info = 0; + if (*itype < 1 || *itype > 3) { + *info = -1; + } else if (!(wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + *info = -2; + } else if (!(upper || lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1))) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*lda < max(1, *n)) { + *info = -6; + } else if (*ldb < max(1, *n)) { + *info = -8; + } + if (*info == 0) { + nb = ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + i__1 = 1, i__2 = (nb + 1) * *n; + lwkopt = max(i__1, i__2); + work[1].r = (doublereal)lwkopt, work[1].i = 0.; + i__1 = 1, i__2 = (*n << 1) - 1; + if (*lwork < max(i__1, i__2) && !lquery) { + *info = -11; + } + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZHEGV ", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + if (*n == 0) { + return 0; + } + zpotrf_(uplo, n, &b[b_offset], ldb, info, (ftnlen)1); + if (*info != 0) { + *info = *n + *info; + return 0; + } + zhegst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, (ftnlen)1); + zheev_(jobz, uplo, n, &a[a_offset], lda, &w[1], &work[1], lwork, &rwork[1], info, (ftnlen)1, + (ftnlen)1); + if (wantz) { + neig = *n; + if (*info > 0) { + neig = *info - 1; + } + if (*itype == 1 || *itype == 2) { + if (upper) { + *(unsigned char *)trans = 'N'; + } else { + *(unsigned char *)trans = 'C'; + } + ztrsm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, &neig, &c_b1, &b[b_offset], ldb, + &a[a_offset], lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, (ftnlen)8); + } else if (*itype == 3) { + if (upper) { + *(unsigned char *)trans = 'C'; + } else { + *(unsigned char *)trans = 'N'; + } + ztrmm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, &neig, &c_b1, &b[b_offset], ldb, + &a[a_offset], lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, (ftnlen)8); + } + } + work[1].r = (doublereal)lwkopt, work[1].i = 0.; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zhemm.cpp b/lib/linalg/zhemm.cpp new file mode 100644 index 0000000000..3237e16c2c --- /dev/null +++ b/lib/linalg/zhemm.cpp @@ -0,0 +1,271 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int zhemm_(char *side, char *uplo, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, + integer *lda, doublecomplex *b, integer *ldb, doublecomplex *beta, doublecomplex *c__, + integer *ldc, ftnlen side_len, ftnlen uplo_len) +{ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3, i__4, i__5, + i__6; + doublereal d__1; + doublecomplex z__1, z__2, z__3, z__4, z__5; + void d_lmp_cnjg(doublecomplex *, doublecomplex *); + integer i__, j, k, info; + doublecomplex temp1, temp2; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nrowa; + logical upper; + extern int xerbla_(char *, integer *, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + nrowa = *m; + } else { + nrowa = *n; + } + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + info = 0; + if (!lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 2; + } else if (*m < 0) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*lda < max(1, nrowa)) { + info = 7; + } else if (*ldb < max(1, *m)) { + info = 9; + } else if (*ldc < max(1, *m)) { + info = 12; + } + if (info != 0) { + xerbla_((char *)"ZHEMM ", &info, (ftnlen)6); + return 0; + } + if (*m == 0 || *n == 0 || + alpha->r == 0. && alpha->i == 0. && (beta->r == 1. && beta->i == 0.)) { + return 0; + } + if (alpha->r == 0. && alpha->i == 0.) { + if (beta->r == 0. && beta->i == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; + } + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__1.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } + } + return 0; + } + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, + z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + i__4 = k + j * c_dim1; + i__5 = k + j * c_dim1; + i__6 = k + i__ * a_dim1; + z__2.r = temp1.r * a[i__6].r - temp1.i * a[i__6].i, + z__2.i = temp1.r * a[i__6].i + temp1.i * a[i__6].r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + z__2.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; + i__4 = k + j * b_dim1; + d_lmp_cnjg(&z__3, &a[k + i__ * a_dim1]); + z__2.r = b[i__4].r * z__3.r - b[i__4].i * z__3.i, + z__2.i = b[i__4].r * z__3.i + b[i__4].i * z__3.r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + i__ * a_dim1; + d__1 = a[i__4].r; + z__2.r = d__1 * temp1.r, z__2.i = d__1 * temp1.i; + z__3.r = alpha->r * temp2.r - alpha->i * temp2.i, + z__3.i = alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__3.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; + i__5 = i__ + i__ * a_dim1; + d__1 = a[i__5].r; + z__4.r = d__1 * temp1.r, z__4.i = d__1 * temp1.i; + z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + z__4.i; + z__5.r = alpha->r * temp2.r - alpha->i * temp2.i, + z__5.i = alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = z__2.r + z__5.r, z__1.i = z__2.i + z__5.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + i__2 = i__ + j * b_dim1; + z__1.r = alpha->r * b[i__2].r - alpha->i * b[i__2].i, + z__1.i = alpha->r * b[i__2].i + alpha->i * b[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + i__3 = k + j * c_dim1; + i__4 = k + j * c_dim1; + i__5 = k + i__ * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5].r; + z__1.r = c__[i__4].r + z__2.r, z__1.i = c__[i__4].i + z__2.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + i__3 = k + j * b_dim1; + d_lmp_cnjg(&z__3, &a[k + i__ * a_dim1]); + z__2.r = b[i__3].r * z__3.r - b[i__3].i * z__3.i, + z__2.i = b[i__3].r * z__3.i + b[i__3].i * z__3.r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; + } + if (beta->r == 0. && beta->i == 0.) { + i__2 = i__ + j * c_dim1; + i__3 = i__ + i__ * a_dim1; + d__1 = a[i__3].r; + z__2.r = d__1 * temp1.r, z__2.i = d__1 * temp1.i; + z__3.r = alpha->r * temp2.r - alpha->i * temp2.i, + z__3.i = alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__2].r = z__1.r, c__[i__2].i = z__1.i; + } else { + i__2 = i__ + j * c_dim1; + i__3 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__3].r - beta->i * c__[i__3].i, + z__3.i = beta->r * c__[i__3].i + beta->i * c__[i__3].r; + i__4 = i__ + i__ * a_dim1; + d__1 = a[i__4].r; + z__4.r = d__1 * temp1.r, z__4.i = d__1 * temp1.i; + z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + z__4.i; + z__5.r = alpha->r * temp2.r - alpha->i * temp2.i, + z__5.i = alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = z__2.r + z__5.r, z__1.i = z__2.i + z__5.i; + c__[i__2].r = z__1.r, c__[i__2].i = z__1.i; + } + } + } + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j + j * a_dim1; + d__1 = a[i__2].r; + z__1.r = d__1 * alpha->r, z__1.i = d__1 * alpha->i; + temp1.r = z__1.r, temp1.i = z__1.i; + if (beta->r == 0. && beta->i == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * b_dim1; + z__1.r = temp1.r * b[i__4].r - temp1.i * b[i__4].i, + z__1.i = temp1.r * b[i__4].i + temp1.i * b[i__4].r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } else { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__2.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__2.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; + i__5 = i__ + j * b_dim1; + z__3.r = temp1.r * b[i__5].r - temp1.i * b[i__5].i, + z__3.i = temp1.r * b[i__5].i + temp1.i * b[i__5].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } + i__2 = j - 1; + for (k = 1; k <= i__2; ++k) { + if (upper) { + i__3 = k + j * a_dim1; + z__1.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, + z__1.i = alpha->r * a[i__3].i + alpha->i * a[i__3].r; + temp1.r = z__1.r, temp1.i = z__1.i; + } else { + d_lmp_cnjg(&z__2, &a[j + k * a_dim1]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + k * b_dim1; + z__2.r = temp1.r * b[i__6].r - temp1.i * b[i__6].i, + z__2.i = temp1.r * b[i__6].i + temp1.i * b[i__6].r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + z__2.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; + } + } + i__2 = *n; + for (k = j + 1; k <= i__2; ++k) { + if (upper) { + d_lmp_cnjg(&z__2, &a[j + k * a_dim1]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + } else { + i__3 = k + j * a_dim1; + z__1.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, + z__1.i = alpha->r * a[i__3].i + alpha->i * a[i__3].r; + temp1.r = z__1.r, temp1.i = z__1.i; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + k * b_dim1; + z__2.r = temp1.r * b[i__6].r - temp1.i * b[i__6].i, + z__2.i = temp1.r * b[i__6].i + temp1.i * b[i__6].r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + z__2.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; + } + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zher.cpp b/lib/linalg/zher.cpp new file mode 100644 index 0000000000..6514a72f65 --- /dev/null +++ b/lib/linalg/zher.cpp @@ -0,0 +1,187 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int zher_(char *uplo, integer *n, doublereal *alpha, doublecomplex *x, integer *incx, + doublecomplex *a, integer *lda, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + doublereal d__1; + doublecomplex z__1, z__2; + void d_lmp_cnjg(doublecomplex *, doublecomplex *); + integer i__, j, ix, jx, kx, info; + doublecomplex temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + --x; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + info = 0; + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (*n < 0) { + info = 2; + } else if (*incx == 0) { + info = 5; + } else if (*lda < max(1, *n)) { + info = 7; + } + if (info != 0) { + xerbla_((char *)"ZHER ", &info, (ftnlen)6); + return 0; + } + if (*n == 0 || *alpha == 0.) { + return 0; + } + if (*incx <= 0) { + kx = 1 - (*n - 1) * *incx; + } else if (*incx != 1) { + kx = 1; + } + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + d_lmp_cnjg(&z__2, &x[j]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = i__; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + } + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + i__4 = j; + z__1.r = x[i__4].r * temp.r - x[i__4].i * temp.i, + z__1.i = x[i__4].r * temp.i + x[i__4].i * temp.r; + d__1 = a[i__3].r + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + } else { + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + d_lmp_cnjg(&z__2, &x[jx]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix = kx; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = ix; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + ix += *incx; + } + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + i__4 = jx; + z__1.r = x[i__4].r * temp.r - x[i__4].i * temp.i, + z__1.i = x[i__4].r * temp.i + x[i__4].i * temp.r; + d__1 = a[i__3].r + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + } else { + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } + jx += *incx; + } + } + } else { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + d_lmp_cnjg(&z__2, &x[j]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + i__4 = j; + z__1.r = temp.r * x[i__4].r - temp.i * x[i__4].i, + z__1.i = temp.r * x[i__4].i + temp.i * x[i__4].r; + d__1 = a[i__3].r + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = i__; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + } + } else { + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + d_lmp_cnjg(&z__2, &x[jx]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + i__4 = jx; + z__1.r = temp.r * x[i__4].r - temp.i * x[i__4].i, + z__1.i = temp.r * x[i__4].i + temp.i * x[i__4].r; + d__1 = a[i__3].r + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + ix = jx; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = ix; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + } + } else { + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } + jx += *incx; + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zherk.cpp b/lib/linalg/zherk.cpp new file mode 100644 index 0000000000..efae201bfa --- /dev/null +++ b/lib/linalg/zherk.cpp @@ -0,0 +1,325 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int zherk_(char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublecomplex *a, + integer *lda, doublereal *beta, doublecomplex *c__, integer *ldc, ftnlen uplo_len, + ftnlen trans_len) +{ + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3, i__4, i__5, i__6; + doublereal d__1; + doublecomplex z__1, z__2, z__3; + void d_lmp_cnjg(doublecomplex *, doublecomplex *); + integer i__, j, l, info; + doublecomplex temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nrowa; + doublereal rtemp; + logical upper; + extern int xerbla_(char *, integer *, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + nrowa = *n; + } else { + nrowa = *k; + } + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + info = 0; + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + info = 2; + } else if (*n < 0) { + info = 3; + } else if (*k < 0) { + info = 4; + } else if (*lda < max(1, nrowa)) { + info = 7; + } else if (*ldc < max(1, *n)) { + info = 10; + } + if (info != 0) { + xerbla_((char *)"ZHERK ", &info, (ftnlen)6); + return 0; + } + if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { + return 0; + } + if (*alpha == 0.) { + if (upper) { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; + } + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[i__4].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } + } + } else { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; + } + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[i__4].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } + } + } + return 0; + } + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; + } + } else if (*beta != 1.) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[i__4].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } else { + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + i__3 = j + l * a_dim1; + if (a[i__3].r != 0. || a[i__3].i != 0.) { + d_lmp_cnjg(&z__2, &a[j + l * a_dim1]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + i__3 = j - 1; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + l * a_dim1; + z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, + z__2.i = temp.r * a[i__6].i + temp.i * a[i__6].r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + z__2.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; + } + i__3 = j + j * c_dim1; + i__4 = j + j * c_dim1; + i__5 = i__ + l * a_dim1; + z__1.r = temp.r * a[i__5].r - temp.i * a[i__5].i, + z__1.i = temp.r * a[i__5].i + temp.i * a[i__5].r; + d__1 = c__[i__4].r + z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } + } + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; + } + } else if (*beta != 1.) { + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[i__4].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } else { + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + i__3 = j + l * a_dim1; + if (a[i__3].r != 0. || a[i__3].i != 0.) { + d_lmp_cnjg(&z__2, &a[j + l * a_dim1]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + i__3 = j + j * c_dim1; + i__4 = j + j * c_dim1; + i__5 = j + l * a_dim1; + z__1.r = temp.r * a[i__5].r - temp.i * a[i__5].i, + z__1.i = temp.r * a[i__5].i + temp.i * a[i__5].r; + d__1 = c__[i__4].r + z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + i__3 = *n; + for (i__ = j + 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + l * a_dim1; + z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, + z__2.i = temp.r * a[i__6].i + temp.i * a[i__6].r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + z__2.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; + } + } + } + } + } + } else { + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + d_lmp_cnjg(&z__3, &a[l + i__ * a_dim1]); + i__4 = l + j * a_dim1; + z__2.r = z__3.r * a[i__4].r - z__3.i * a[i__4].i, + z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + } + if (*beta == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = *alpha * temp.r, z__1.i = *alpha * temp.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = *alpha * temp.r, z__2.i = *alpha * temp.i; + i__4 = i__ + j * c_dim1; + z__3.r = *beta * c__[i__4].r, z__3.i = *beta * c__[i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } + rtemp = 0.; + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + d_lmp_cnjg(&z__3, &a[l + j * a_dim1]); + i__3 = l + j * a_dim1; + z__2.r = z__3.r * a[i__3].r - z__3.i * a[i__3].i, + z__2.i = z__3.r * a[i__3].i + z__3.i * a[i__3].r; + z__1.r = rtemp + z__2.r, z__1.i = z__2.i; + rtemp = z__1.r; + } + if (*beta == 0.) { + i__2 = j + j * c_dim1; + d__1 = *alpha * rtemp; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } else { + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *alpha * rtemp + *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + rtemp = 0.; + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + d_lmp_cnjg(&z__3, &a[l + j * a_dim1]); + i__3 = l + j * a_dim1; + z__2.r = z__3.r * a[i__3].r - z__3.i * a[i__3].i, + z__2.i = z__3.r * a[i__3].i + z__3.i * a[i__3].r; + z__1.r = rtemp + z__2.r, z__1.i = z__2.i; + rtemp = z__1.r; + } + if (*beta == 0.) { + i__2 = j + j * c_dim1; + d__1 = *alpha * rtemp; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } else { + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *alpha * rtemp + *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + d_lmp_cnjg(&z__3, &a[l + i__ * a_dim1]); + i__4 = l + j * a_dim1; + z__2.r = z__3.r * a[i__4].r - z__3.i * a[i__4].i, + z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + } + if (*beta == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = *alpha * temp.r, z__1.i = *alpha * temp.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = *alpha * temp.r, z__2.i = *alpha * temp.i; + i__4 = i__ + j * c_dim1; + z__3.r = *beta * c__[i__4].r, z__3.i = *beta * c__[i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zhetf2.cpp b/lib/linalg/zhetf2.cpp new file mode 100644 index 0000000000..c960a63bc1 --- /dev/null +++ b/lib/linalg/zhetf2.cpp @@ -0,0 +1,439 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +int zhetf2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info, + ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5, i__6; + doublereal d__1, d__2, d__3, d__4; + doublecomplex z__1, z__2, z__3, z__4, z__5, z__6; + double sqrt(doublereal), d_lmp_imag(doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); + doublereal d__; + integer i__, j, k; + doublecomplex t; + doublereal r1, d11; + doublecomplex d12; + doublereal d22; + doublecomplex d21; + integer kk, kp; + doublecomplex wk; + doublereal tt; + doublecomplex wkm1, wkp1; + integer imax, jmax; + extern int zher_(char *, integer *, doublereal *, doublecomplex *, integer *, doublecomplex *, + integer *, ftnlen); + doublereal alpha; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer kstep; + logical upper; + extern int zswap_(integer *, doublecomplex *, integer *, doublecomplex *, integer *); + extern doublereal dlapy2_(doublereal *, doublereal *); + doublereal absakk; + extern logical disnan_(doublereal *); + extern int xerbla_(char *, integer *, ftnlen), + zdscal_(integer *, doublereal *, doublecomplex *, integer *); + doublereal colmax; + extern integer izamax_(integer *, doublecomplex *, integer *); + doublereal rowmax; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZHETF2", &i__1, (ftnlen)6); + return 0; + } + alpha = (sqrt(17.) + 1.) / 8.; + if (upper) { + k = *n; + L10: + if (k < 1) { + goto L90; + } + kstep = 1; + i__1 = k + k * a_dim1; + absakk = (d__1 = a[i__1].r, abs(d__1)); + if (k > 1) { + i__1 = k - 1; + imax = izamax_(&i__1, &a[k * a_dim1 + 1], &c__1); + i__1 = imax + k * a_dim1; + colmax = + (d__1 = a[i__1].r, abs(d__1)) + (d__2 = d_lmp_imag(&a[imax + k * a_dim1]), abs(d__2)); + } else { + colmax = 0.; + } + if (max(absakk, colmax) == 0. || disnan_(&absakk)) { + if (*info == 0) { + *info = k; + } + kp = k; + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + } else { + if (absakk >= alpha * colmax) { + kp = k; + } else { + i__1 = k - imax; + jmax = imax + izamax_(&i__1, &a[imax + (imax + 1) * a_dim1], lda); + i__1 = imax + jmax * a_dim1; + rowmax = (d__1 = a[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&a[imax + jmax * a_dim1]), abs(d__2)); + if (imax > 1) { + i__1 = imax - 1; + jmax = izamax_(&i__1, &a[imax * a_dim1 + 1], &c__1); + i__1 = jmax + imax * a_dim1; + d__3 = rowmax, d__4 = (d__1 = a[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&a[jmax + imax * a_dim1]), abs(d__2)); + rowmax = max(d__3, d__4); + } + if (absakk >= alpha * colmax * (colmax / rowmax)) { + kp = k; + } else { + i__1 = imax + imax * a_dim1; + if ((d__1 = a[i__1].r, abs(d__1)) >= alpha * rowmax) { + kp = imax; + } else { + kp = imax; + kstep = 2; + } + } + } + kk = k - kstep + 1; + if (kp != kk) { + i__1 = kp - 1; + zswap_(&i__1, &a[kk * a_dim1 + 1], &c__1, &a[kp * a_dim1 + 1], &c__1); + i__1 = kk - 1; + for (j = kp + 1; j <= i__1; ++j) { + d_lmp_cnjg(&z__1, &a[j + kk * a_dim1]); + t.r = z__1.r, t.i = z__1.i; + i__2 = j + kk * a_dim1; + d_lmp_cnjg(&z__1, &a[kp + j * a_dim1]); + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = kp + j * a_dim1; + a[i__2].r = t.r, a[i__2].i = t.i; + } + i__1 = kp + kk * a_dim1; + d_lmp_cnjg(&z__1, &a[kp + kk * a_dim1]); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = kk + kk * a_dim1; + r1 = a[i__1].r; + i__1 = kk + kk * a_dim1; + i__2 = kp + kp * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + i__1 = kp + kp * a_dim1; + a[i__1].r = r1, a[i__1].i = 0.; + if (kstep == 2) { + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + i__1 = k - 1 + k * a_dim1; + t.r = a[i__1].r, t.i = a[i__1].i; + i__1 = k - 1 + k * a_dim1; + i__2 = kp + k * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + k * a_dim1; + a[i__1].r = t.r, a[i__1].i = t.i; + } + } else { + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + if (kstep == 2) { + i__1 = k - 1 + (k - 1) * a_dim1; + i__2 = k - 1 + (k - 1) * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + } + } + if (kstep == 1) { + i__1 = k + k * a_dim1; + r1 = 1. / a[i__1].r; + i__1 = k - 1; + d__1 = -r1; + zher_(uplo, &i__1, &d__1, &a[k * a_dim1 + 1], &c__1, &a[a_offset], lda, (ftnlen)1); + i__1 = k - 1; + zdscal_(&i__1, &r1, &a[k * a_dim1 + 1], &c__1); + } else { + if (k > 2) { + i__1 = k - 1 + k * a_dim1; + d__1 = a[i__1].r; + d__2 = d_lmp_imag(&a[k - 1 + k * a_dim1]); + d__ = dlapy2_(&d__1, &d__2); + i__1 = k - 1 + (k - 1) * a_dim1; + d22 = a[i__1].r / d__; + i__1 = k + k * a_dim1; + d11 = a[i__1].r / d__; + tt = 1. / (d11 * d22 - 1.); + i__1 = k - 1 + k * a_dim1; + z__1.r = a[i__1].r / d__, z__1.i = a[i__1].i / d__; + d12.r = z__1.r, d12.i = z__1.i; + d__ = tt / d__; + for (j = k - 2; j >= 1; --j) { + i__1 = j + (k - 1) * a_dim1; + z__3.r = d11 * a[i__1].r, z__3.i = d11 * a[i__1].i; + d_lmp_cnjg(&z__5, &d12); + i__2 = j + k * a_dim1; + z__4.r = z__5.r * a[i__2].r - z__5.i * a[i__2].i, + z__4.i = z__5.r * a[i__2].i + z__5.i * a[i__2].r; + z__2.r = z__3.r - z__4.r, z__2.i = z__3.i - z__4.i; + z__1.r = d__ * z__2.r, z__1.i = d__ * z__2.i; + wkm1.r = z__1.r, wkm1.i = z__1.i; + i__1 = j + k * a_dim1; + z__3.r = d22 * a[i__1].r, z__3.i = d22 * a[i__1].i; + i__2 = j + (k - 1) * a_dim1; + z__4.r = d12.r * a[i__2].r - d12.i * a[i__2].i, + z__4.i = d12.r * a[i__2].i + d12.i * a[i__2].r; + z__2.r = z__3.r - z__4.r, z__2.i = z__3.i - z__4.i; + z__1.r = d__ * z__2.r, z__1.i = d__ * z__2.i; + wk.r = z__1.r, wk.i = z__1.i; + for (i__ = j; i__ >= 1; --i__) { + i__1 = i__ + j * a_dim1; + i__2 = i__ + j * a_dim1; + i__3 = i__ + k * a_dim1; + d_lmp_cnjg(&z__4, &wk); + z__3.r = a[i__3].r * z__4.r - a[i__3].i * z__4.i, + z__3.i = a[i__3].r * z__4.i + a[i__3].i * z__4.r; + z__2.r = a[i__2].r - z__3.r, z__2.i = a[i__2].i - z__3.i; + i__4 = i__ + (k - 1) * a_dim1; + d_lmp_cnjg(&z__6, &wkm1); + z__5.r = a[i__4].r * z__6.r - a[i__4].i * z__6.i, + z__5.i = a[i__4].r * z__6.i + a[i__4].i * z__6.r; + z__1.r = z__2.r - z__5.r, z__1.i = z__2.i - z__5.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + } + i__1 = j + k * a_dim1; + a[i__1].r = wk.r, a[i__1].i = wk.i; + i__1 = j + (k - 1) * a_dim1; + a[i__1].r = wkm1.r, a[i__1].i = wkm1.i; + i__1 = j + j * a_dim1; + i__2 = j + j * a_dim1; + d__1 = a[i__2].r; + z__1.r = d__1, z__1.i = 0.; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + } + } + } + } + if (kstep == 1) { + ipiv[k] = kp; + } else { + ipiv[k] = -kp; + ipiv[k - 1] = -kp; + } + k -= kstep; + goto L10; + } else { + k = 1; + L50: + if (k > *n) { + goto L90; + } + kstep = 1; + i__1 = k + k * a_dim1; + absakk = (d__1 = a[i__1].r, abs(d__1)); + if (k < *n) { + i__1 = *n - k; + imax = k + izamax_(&i__1, &a[k + 1 + k * a_dim1], &c__1); + i__1 = imax + k * a_dim1; + colmax = + (d__1 = a[i__1].r, abs(d__1)) + (d__2 = d_lmp_imag(&a[imax + k * a_dim1]), abs(d__2)); + } else { + colmax = 0.; + } + if (max(absakk, colmax) == 0. || disnan_(&absakk)) { + if (*info == 0) { + *info = k; + } + kp = k; + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + } else { + if (absakk >= alpha * colmax) { + kp = k; + } else { + i__1 = imax - k; + jmax = k - 1 + izamax_(&i__1, &a[imax + k * a_dim1], lda); + i__1 = imax + jmax * a_dim1; + rowmax = (d__1 = a[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&a[imax + jmax * a_dim1]), abs(d__2)); + if (imax < *n) { + i__1 = *n - imax; + jmax = imax + izamax_(&i__1, &a[imax + 1 + imax * a_dim1], &c__1); + i__1 = jmax + imax * a_dim1; + d__3 = rowmax, d__4 = (d__1 = a[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&a[jmax + imax * a_dim1]), abs(d__2)); + rowmax = max(d__3, d__4); + } + if (absakk >= alpha * colmax * (colmax / rowmax)) { + kp = k; + } else { + i__1 = imax + imax * a_dim1; + if ((d__1 = a[i__1].r, abs(d__1)) >= alpha * rowmax) { + kp = imax; + } else { + kp = imax; + kstep = 2; + } + } + } + kk = k + kstep - 1; + if (kp != kk) { + if (kp < *n) { + i__1 = *n - kp; + zswap_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + 1 + kp * a_dim1], &c__1); + } + i__1 = kp - 1; + for (j = kk + 1; j <= i__1; ++j) { + d_lmp_cnjg(&z__1, &a[j + kk * a_dim1]); + t.r = z__1.r, t.i = z__1.i; + i__2 = j + kk * a_dim1; + d_lmp_cnjg(&z__1, &a[kp + j * a_dim1]); + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = kp + j * a_dim1; + a[i__2].r = t.r, a[i__2].i = t.i; + } + i__1 = kp + kk * a_dim1; + d_lmp_cnjg(&z__1, &a[kp + kk * a_dim1]); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = kk + kk * a_dim1; + r1 = a[i__1].r; + i__1 = kk + kk * a_dim1; + i__2 = kp + kp * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + i__1 = kp + kp * a_dim1; + a[i__1].r = r1, a[i__1].i = 0.; + if (kstep == 2) { + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + i__1 = k + 1 + k * a_dim1; + t.r = a[i__1].r, t.i = a[i__1].i; + i__1 = k + 1 + k * a_dim1; + i__2 = kp + k * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + k * a_dim1; + a[i__1].r = t.r, a[i__1].i = t.i; + } + } else { + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + if (kstep == 2) { + i__1 = k + 1 + (k + 1) * a_dim1; + i__2 = k + 1 + (k + 1) * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + } + } + if (kstep == 1) { + if (k < *n) { + i__1 = k + k * a_dim1; + r1 = 1. / a[i__1].r; + i__1 = *n - k; + d__1 = -r1; + zher_(uplo, &i__1, &d__1, &a[k + 1 + k * a_dim1], &c__1, + &a[k + 1 + (k + 1) * a_dim1], lda, (ftnlen)1); + i__1 = *n - k; + zdscal_(&i__1, &r1, &a[k + 1 + k * a_dim1], &c__1); + } + } else { + if (k < *n - 1) { + i__1 = k + 1 + k * a_dim1; + d__1 = a[i__1].r; + d__2 = d_lmp_imag(&a[k + 1 + k * a_dim1]); + d__ = dlapy2_(&d__1, &d__2); + i__1 = k + 1 + (k + 1) * a_dim1; + d11 = a[i__1].r / d__; + i__1 = k + k * a_dim1; + d22 = a[i__1].r / d__; + tt = 1. / (d11 * d22 - 1.); + i__1 = k + 1 + k * a_dim1; + z__1.r = a[i__1].r / d__, z__1.i = a[i__1].i / d__; + d21.r = z__1.r, d21.i = z__1.i; + d__ = tt / d__; + i__1 = *n; + for (j = k + 2; j <= i__1; ++j) { + i__2 = j + k * a_dim1; + z__3.r = d11 * a[i__2].r, z__3.i = d11 * a[i__2].i; + i__3 = j + (k + 1) * a_dim1; + z__4.r = d21.r * a[i__3].r - d21.i * a[i__3].i, + z__4.i = d21.r * a[i__3].i + d21.i * a[i__3].r; + z__2.r = z__3.r - z__4.r, z__2.i = z__3.i - z__4.i; + z__1.r = d__ * z__2.r, z__1.i = d__ * z__2.i; + wk.r = z__1.r, wk.i = z__1.i; + i__2 = j + (k + 1) * a_dim1; + z__3.r = d22 * a[i__2].r, z__3.i = d22 * a[i__2].i; + d_lmp_cnjg(&z__5, &d21); + i__3 = j + k * a_dim1; + z__4.r = z__5.r * a[i__3].r - z__5.i * a[i__3].i, + z__4.i = z__5.r * a[i__3].i + z__5.i * a[i__3].r; + z__2.r = z__3.r - z__4.r, z__2.i = z__3.i - z__4.i; + z__1.r = d__ * z__2.r, z__1.i = d__ * z__2.i; + wkp1.r = z__1.r, wkp1.i = z__1.i; + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = i__ + k * a_dim1; + d_lmp_cnjg(&z__4, &wk); + z__3.r = a[i__5].r * z__4.r - a[i__5].i * z__4.i, + z__3.i = a[i__5].r * z__4.i + a[i__5].i * z__4.r; + z__2.r = a[i__4].r - z__3.r, z__2.i = a[i__4].i - z__3.i; + i__6 = i__ + (k + 1) * a_dim1; + d_lmp_cnjg(&z__6, &wkp1); + z__5.r = a[i__6].r * z__6.r - a[i__6].i * z__6.i, + z__5.i = a[i__6].r * z__6.i + a[i__6].i * z__6.r; + z__1.r = z__2.r - z__5.r, z__1.i = z__2.i - z__5.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + } + i__2 = j + k * a_dim1; + a[i__2].r = wk.r, a[i__2].i = wk.i; + i__2 = j + (k + 1) * a_dim1; + a[i__2].r = wkp1.r, a[i__2].i = wkp1.i; + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + z__1.r = d__1, z__1.i = 0.; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + } + } + } + } + if (kstep == 1) { + ipiv[k] = kp; + } else { + ipiv[k] = -kp; + ipiv[k + 1] = -kp; + } + k += kstep; + goto L50; + } +L90: + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zhetrf.cpp b/lib/linalg/zhetrf.cpp new file mode 100644 index 0000000000..cb60ff4b7b --- /dev/null +++ b/lib/linalg/zhetrf.cpp @@ -0,0 +1,123 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +int zhetrf_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, + doublecomplex *work, integer *lwork, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2; + integer j, k, kb, nb, iws; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nbmin, iinfo; + logical upper; + extern int zhetf2_(char *, integer *, doublecomplex *, integer *, integer *, integer *, ftnlen), + zlahef_(char *, integer *, integer *, integer *, doublecomplex *, integer *, integer *, + doublecomplex *, integer *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + integer ldwork, lwkopt; + logical lquery; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + --work; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } else if (*lwork < 1 && !lquery) { + *info = -7; + } + if (*info == 0) { + nb = ilaenv_(&c__1, (char *)"ZHETRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + lwkopt = *n * nb; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZHETRF", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + nbmin = 2; + ldwork = *n; + if (nb > 1 && nb < *n) { + iws = ldwork * nb; + if (*lwork < iws) { + i__1 = *lwork / ldwork; + nb = max(i__1, 1); + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"ZHETRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); + } + } else { + iws = 1; + } + if (nb < nbmin) { + nb = *n; + } + if (upper) { + k = *n; + L10: + if (k < 1) { + goto L40; + } + if (k > nb) { + zlahef_(uplo, &k, &nb, &kb, &a[a_offset], lda, &ipiv[1], &work[1], n, &iinfo, + (ftnlen)1); + } else { + zhetf2_(uplo, &k, &a[a_offset], lda, &ipiv[1], &iinfo, (ftnlen)1); + kb = k; + } + if (*info == 0 && iinfo > 0) { + *info = iinfo; + } + k -= kb; + goto L10; + } else { + k = 1; + L20: + if (k > *n) { + goto L40; + } + if (k <= *n - nb) { + i__1 = *n - k + 1; + zlahef_(uplo, &i__1, &nb, &kb, &a[k + k * a_dim1], lda, &ipiv[k], &work[1], n, &iinfo, + (ftnlen)1); + } else { + i__1 = *n - k + 1; + zhetf2_(uplo, &i__1, &a[k + k * a_dim1], lda, &ipiv[k], &iinfo, (ftnlen)1); + kb = *n - k + 1; + } + if (*info == 0 && iinfo > 0) { + *info = iinfo + k - 1; + } + i__1 = k + kb - 1; + for (j = k; j <= i__1; ++j) { + if (ipiv[j] > 0) { + ipiv[j] = ipiv[j] + k - 1; + } else { + ipiv[j] = ipiv[j] - k + 1; + } + } + k += kb; + goto L20; + } +L40: + work[1].r = (doublereal)lwkopt, work[1].i = 0.; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zhetri.cpp b/lib/linalg/zhetri.cpp new file mode 100644 index 0000000000..020b4ce52b --- /dev/null +++ b/lib/linalg/zhetri.cpp @@ -0,0 +1,319 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b2 = {0., 0.}; +static integer c__1 = 1; +int zhetri_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, + doublecomplex *work, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2, i__3; + doublereal d__1; + doublecomplex z__1, z__2; + double z_lmp_abs(doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); + doublereal d__; + integer j, k; + doublereal t, ak; + integer kp; + doublereal akp1; + doublecomplex temp, akkp1; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern VOID zdotc_(doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *); + integer kstep; + extern int zhemv_(char *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, integer *, + ftnlen); + logical upper; + extern int zcopy_(integer *, doublecomplex *, integer *, doublecomplex *, integer *), + zswap_(integer *, doublecomplex *, integer *, doublecomplex *, integer *), + xerbla_(char *, integer *, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + --work; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZHETRI", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + if (upper) { + for (*info = *n; *info >= 1; --(*info)) { + i__1 = *info + *info * a_dim1; + if (ipiv[*info] > 0 && (a[i__1].r == 0. && a[i__1].i == 0.)) { + return 0; + } + } + } else { + i__1 = *n; + for (*info = 1; *info <= i__1; ++(*info)) { + i__2 = *info + *info * a_dim1; + if (ipiv[*info] > 0 && (a[i__2].r == 0. && a[i__2].i == 0.)) { + return 0; + } + } + } + *info = 0; + if (upper) { + k = 1; + L30: + if (k > *n) { + goto L50; + } + if (ipiv[k] > 0) { + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + d__1 = 1. / a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + if (k > 1) { + i__1 = k - 1; + zcopy_(&i__1, &a[k * a_dim1 + 1], &c__1, &work[1], &c__1); + i__1 = k - 1; + z__1.r = -1., z__1.i = -0.; + zhemv_(uplo, &i__1, &z__1, &a[a_offset], lda, &work[1], &c__1, &c_b2, + &a[k * a_dim1 + 1], &c__1, (ftnlen)1); + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + i__3 = k - 1; + zdotc_(&z__2, &i__3, &work[1], &c__1, &a[k * a_dim1 + 1], &c__1); + d__1 = z__2.r; + z__1.r = a[i__2].r - d__1, z__1.i = a[i__2].i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + } + kstep = 1; + } else { + t = z_lmp_abs(&a[k + (k + 1) * a_dim1]); + i__1 = k + k * a_dim1; + ak = a[i__1].r / t; + i__1 = k + 1 + (k + 1) * a_dim1; + akp1 = a[i__1].r / t; + i__1 = k + (k + 1) * a_dim1; + z__1.r = a[i__1].r / t, z__1.i = a[i__1].i / t; + akkp1.r = z__1.r, akkp1.i = z__1.i; + d__ = t * (ak * akp1 - 1.); + i__1 = k + k * a_dim1; + d__1 = akp1 / d__; + a[i__1].r = d__1, a[i__1].i = 0.; + i__1 = k + 1 + (k + 1) * a_dim1; + d__1 = ak / d__; + a[i__1].r = d__1, a[i__1].i = 0.; + i__1 = k + (k + 1) * a_dim1; + z__2.r = -akkp1.r, z__2.i = -akkp1.i; + z__1.r = z__2.r / d__, z__1.i = z__2.i / d__; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + if (k > 1) { + i__1 = k - 1; + zcopy_(&i__1, &a[k * a_dim1 + 1], &c__1, &work[1], &c__1); + i__1 = k - 1; + z__1.r = -1., z__1.i = -0.; + zhemv_(uplo, &i__1, &z__1, &a[a_offset], lda, &work[1], &c__1, &c_b2, + &a[k * a_dim1 + 1], &c__1, (ftnlen)1); + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + i__3 = k - 1; + zdotc_(&z__2, &i__3, &work[1], &c__1, &a[k * a_dim1 + 1], &c__1); + d__1 = z__2.r; + z__1.r = a[i__2].r - d__1, z__1.i = a[i__2].i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = k + (k + 1) * a_dim1; + i__2 = k + (k + 1) * a_dim1; + i__3 = k - 1; + zdotc_(&z__2, &i__3, &a[k * a_dim1 + 1], &c__1, &a[(k + 1) * a_dim1 + 1], &c__1); + z__1.r = a[i__2].r - z__2.r, z__1.i = a[i__2].i - z__2.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = k - 1; + zcopy_(&i__1, &a[(k + 1) * a_dim1 + 1], &c__1, &work[1], &c__1); + i__1 = k - 1; + z__1.r = -1., z__1.i = -0.; + zhemv_(uplo, &i__1, &z__1, &a[a_offset], lda, &work[1], &c__1, &c_b2, + &a[(k + 1) * a_dim1 + 1], &c__1, (ftnlen)1); + i__1 = k + 1 + (k + 1) * a_dim1; + i__2 = k + 1 + (k + 1) * a_dim1; + i__3 = k - 1; + zdotc_(&z__2, &i__3, &work[1], &c__1, &a[(k + 1) * a_dim1 + 1], &c__1); + d__1 = z__2.r; + z__1.r = a[i__2].r - d__1, z__1.i = a[i__2].i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + } + kstep = 2; + } + kp = (i__1 = ipiv[k], abs(i__1)); + if (kp != k) { + i__1 = kp - 1; + zswap_(&i__1, &a[k * a_dim1 + 1], &c__1, &a[kp * a_dim1 + 1], &c__1); + i__1 = k - 1; + for (j = kp + 1; j <= i__1; ++j) { + d_lmp_cnjg(&z__1, &a[j + k * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + i__2 = j + k * a_dim1; + d_lmp_cnjg(&z__1, &a[kp + j * a_dim1]); + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = kp + j * a_dim1; + a[i__2].r = temp.r, a[i__2].i = temp.i; + } + i__1 = kp + k * a_dim1; + d_lmp_cnjg(&z__1, &a[kp + k * a_dim1]); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = k + k * a_dim1; + temp.r = a[i__1].r, temp.i = a[i__1].i; + i__1 = k + k * a_dim1; + i__2 = kp + kp * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + kp * a_dim1; + a[i__1].r = temp.r, a[i__1].i = temp.i; + if (kstep == 2) { + i__1 = k + (k + 1) * a_dim1; + temp.r = a[i__1].r, temp.i = a[i__1].i; + i__1 = k + (k + 1) * a_dim1; + i__2 = kp + (k + 1) * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + (k + 1) * a_dim1; + a[i__1].r = temp.r, a[i__1].i = temp.i; + } + } + k += kstep; + goto L30; + L50:; + } else { + k = *n; + L60: + if (k < 1) { + goto L80; + } + if (ipiv[k] > 0) { + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + d__1 = 1. / a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + if (k < *n) { + i__1 = *n - k; + zcopy_(&i__1, &a[k + 1 + k * a_dim1], &c__1, &work[1], &c__1); + i__1 = *n - k; + z__1.r = -1., z__1.i = -0.; + zhemv_(uplo, &i__1, &z__1, &a[k + 1 + (k + 1) * a_dim1], lda, &work[1], &c__1, + &c_b2, &a[k + 1 + k * a_dim1], &c__1, (ftnlen)1); + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + i__3 = *n - k; + zdotc_(&z__2, &i__3, &work[1], &c__1, &a[k + 1 + k * a_dim1], &c__1); + d__1 = z__2.r; + z__1.r = a[i__2].r - d__1, z__1.i = a[i__2].i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + } + kstep = 1; + } else { + t = z_lmp_abs(&a[k + (k - 1) * a_dim1]); + i__1 = k - 1 + (k - 1) * a_dim1; + ak = a[i__1].r / t; + i__1 = k + k * a_dim1; + akp1 = a[i__1].r / t; + i__1 = k + (k - 1) * a_dim1; + z__1.r = a[i__1].r / t, z__1.i = a[i__1].i / t; + akkp1.r = z__1.r, akkp1.i = z__1.i; + d__ = t * (ak * akp1 - 1.); + i__1 = k - 1 + (k - 1) * a_dim1; + d__1 = akp1 / d__; + a[i__1].r = d__1, a[i__1].i = 0.; + i__1 = k + k * a_dim1; + d__1 = ak / d__; + a[i__1].r = d__1, a[i__1].i = 0.; + i__1 = k + (k - 1) * a_dim1; + z__2.r = -akkp1.r, z__2.i = -akkp1.i; + z__1.r = z__2.r / d__, z__1.i = z__2.i / d__; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + if (k < *n) { + i__1 = *n - k; + zcopy_(&i__1, &a[k + 1 + k * a_dim1], &c__1, &work[1], &c__1); + i__1 = *n - k; + z__1.r = -1., z__1.i = -0.; + zhemv_(uplo, &i__1, &z__1, &a[k + 1 + (k + 1) * a_dim1], lda, &work[1], &c__1, + &c_b2, &a[k + 1 + k * a_dim1], &c__1, (ftnlen)1); + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + i__3 = *n - k; + zdotc_(&z__2, &i__3, &work[1], &c__1, &a[k + 1 + k * a_dim1], &c__1); + d__1 = z__2.r; + z__1.r = a[i__2].r - d__1, z__1.i = a[i__2].i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = k + (k - 1) * a_dim1; + i__2 = k + (k - 1) * a_dim1; + i__3 = *n - k; + zdotc_(&z__2, &i__3, &a[k + 1 + k * a_dim1], &c__1, &a[k + 1 + (k - 1) * a_dim1], + &c__1); + z__1.r = a[i__2].r - z__2.r, z__1.i = a[i__2].i - z__2.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = *n - k; + zcopy_(&i__1, &a[k + 1 + (k - 1) * a_dim1], &c__1, &work[1], &c__1); + i__1 = *n - k; + z__1.r = -1., z__1.i = -0.; + zhemv_(uplo, &i__1, &z__1, &a[k + 1 + (k + 1) * a_dim1], lda, &work[1], &c__1, + &c_b2, &a[k + 1 + (k - 1) * a_dim1], &c__1, (ftnlen)1); + i__1 = k - 1 + (k - 1) * a_dim1; + i__2 = k - 1 + (k - 1) * a_dim1; + i__3 = *n - k; + zdotc_(&z__2, &i__3, &work[1], &c__1, &a[k + 1 + (k - 1) * a_dim1], &c__1); + d__1 = z__2.r; + z__1.r = a[i__2].r - d__1, z__1.i = a[i__2].i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + } + kstep = 2; + } + kp = (i__1 = ipiv[k], abs(i__1)); + if (kp != k) { + if (kp < *n) { + i__1 = *n - kp; + zswap_(&i__1, &a[kp + 1 + k * a_dim1], &c__1, &a[kp + 1 + kp * a_dim1], &c__1); + } + i__1 = kp - 1; + for (j = k + 1; j <= i__1; ++j) { + d_lmp_cnjg(&z__1, &a[j + k * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + i__2 = j + k * a_dim1; + d_lmp_cnjg(&z__1, &a[kp + j * a_dim1]); + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = kp + j * a_dim1; + a[i__2].r = temp.r, a[i__2].i = temp.i; + } + i__1 = kp + k * a_dim1; + d_lmp_cnjg(&z__1, &a[kp + k * a_dim1]); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = k + k * a_dim1; + temp.r = a[i__1].r, temp.i = a[i__1].i; + i__1 = k + k * a_dim1; + i__2 = kp + kp * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + kp * a_dim1; + a[i__1].r = temp.r, a[i__1].i = temp.i; + if (kstep == 2) { + i__1 = k + (k - 1) * a_dim1; + temp.r = a[i__1].r, temp.i = a[i__1].i; + i__1 = k + (k - 1) * a_dim1; + i__2 = kp + (k - 1) * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + (k - 1) * a_dim1; + a[i__1].r = temp.r, a[i__1].i = temp.i; + } + } + k -= kstep; + goto L60; + L80:; + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zlahef.cpp b/lib/linalg/zlahef.cpp new file mode 100644 index 0000000000..9a18a455ea --- /dev/null +++ b/lib/linalg/zlahef.cpp @@ -0,0 +1,520 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static integer c__1 = 1; +int zlahef_(char *uplo, integer *n, integer *nb, integer *kb, doublecomplex *a, integer *lda, + integer *ipiv, doublecomplex *w, integer *ldw, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3, i__4, i__5; + doublereal d__1, d__2, d__3, d__4; + doublecomplex z__1, z__2, z__3, z__4; + double sqrt(doublereal), d_lmp_imag(doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *), + z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *); + integer j, k; + doublereal t, r1; + doublecomplex d11, d21, d22; + integer jb, jj, kk, jp, kp, kw, kkw, imax, jmax; + doublereal alpha; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int zgemm_(char *, char *, integer *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, ftnlen, ftnlen); + integer kstep; + extern int zgemv_(char *, integer *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, integer *, + ftnlen), + zcopy_(integer *, doublecomplex *, integer *, doublecomplex *, integer *), + zswap_(integer *, doublecomplex *, integer *, doublecomplex *, integer *); + doublereal absakk; + extern int zdscal_(integer *, doublereal *, doublecomplex *, integer *); + doublereal colmax; + extern int zlacgv_(integer *, doublecomplex *, integer *); + extern integer izamax_(integer *, doublecomplex *, integer *); + doublereal rowmax; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + w_dim1 = *ldw; + w_offset = 1 + w_dim1; + w -= w_offset; + *info = 0; + alpha = (sqrt(17.) + 1.) / 8.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + k = *n; + L10: + kw = *nb + k - *n; + if (k <= *n - *nb + 1 && *nb < *n || k < 1) { + goto L30; + } + kstep = 1; + i__1 = k - 1; + zcopy_(&i__1, &a[k * a_dim1 + 1], &c__1, &w[kw * w_dim1 + 1], &c__1); + i__1 = k + kw * w_dim1; + i__2 = k + k * a_dim1; + d__1 = a[i__2].r; + w[i__1].r = d__1, w[i__1].i = 0.; + if (k < *n) { + i__1 = *n - k; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &k, &i__1, &z__1, &a[(k + 1) * a_dim1 + 1], lda, + &w[k + (kw + 1) * w_dim1], ldw, &c_b1, &w[kw * w_dim1 + 1], &c__1, (ftnlen)12); + i__1 = k + kw * w_dim1; + i__2 = k + kw * w_dim1; + d__1 = w[i__2].r; + w[i__1].r = d__1, w[i__1].i = 0.; + } + i__1 = k + kw * w_dim1; + absakk = (d__1 = w[i__1].r, abs(d__1)); + if (k > 1) { + i__1 = k - 1; + imax = izamax_(&i__1, &w[kw * w_dim1 + 1], &c__1); + i__1 = imax + kw * w_dim1; + colmax = + (d__1 = w[i__1].r, abs(d__1)) + (d__2 = d_lmp_imag(&w[imax + kw * w_dim1]), abs(d__2)); + } else { + colmax = 0.; + } + if (max(absakk, colmax) == 0.) { + if (*info == 0) { + *info = k; + } + kp = k; + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + } else { + if (absakk >= alpha * colmax) { + kp = k; + } else { + i__1 = imax - 1; + zcopy_(&i__1, &a[imax * a_dim1 + 1], &c__1, &w[(kw - 1) * w_dim1 + 1], &c__1); + i__1 = imax + (kw - 1) * w_dim1; + i__2 = imax + imax * a_dim1; + d__1 = a[i__2].r; + w[i__1].r = d__1, w[i__1].i = 0.; + i__1 = k - imax; + zcopy_(&i__1, &a[imax + (imax + 1) * a_dim1], lda, &w[imax + 1 + (kw - 1) * w_dim1], + &c__1); + i__1 = k - imax; + zlacgv_(&i__1, &w[imax + 1 + (kw - 1) * w_dim1], &c__1); + if (k < *n) { + i__1 = *n - k; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &k, &i__1, &z__1, &a[(k + 1) * a_dim1 + 1], lda, + &w[imax + (kw + 1) * w_dim1], ldw, &c_b1, &w[(kw - 1) * w_dim1 + 1], + &c__1, (ftnlen)12); + i__1 = imax + (kw - 1) * w_dim1; + i__2 = imax + (kw - 1) * w_dim1; + d__1 = w[i__2].r; + w[i__1].r = d__1, w[i__1].i = 0.; + } + i__1 = k - imax; + jmax = imax + izamax_(&i__1, &w[imax + 1 + (kw - 1) * w_dim1], &c__1); + i__1 = jmax + (kw - 1) * w_dim1; + rowmax = (d__1 = w[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&w[jmax + (kw - 1) * w_dim1]), abs(d__2)); + if (imax > 1) { + i__1 = imax - 1; + jmax = izamax_(&i__1, &w[(kw - 1) * w_dim1 + 1], &c__1); + i__1 = jmax + (kw - 1) * w_dim1; + d__3 = rowmax, d__4 = (d__1 = w[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&w[jmax + (kw - 1) * w_dim1]), abs(d__2)); + rowmax = max(d__3, d__4); + } + if (absakk >= alpha * colmax * (colmax / rowmax)) { + kp = k; + } else { + i__1 = imax + (kw - 1) * w_dim1; + if ((d__1 = w[i__1].r, abs(d__1)) >= alpha * rowmax) { + kp = imax; + zcopy_(&k, &w[(kw - 1) * w_dim1 + 1], &c__1, &w[kw * w_dim1 + 1], &c__1); + } else { + kp = imax; + kstep = 2; + } + } + } + kk = k - kstep + 1; + kkw = *nb + kk - *n; + if (kp != kk) { + i__1 = kp + kp * a_dim1; + i__2 = kk + kk * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + i__1 = kk - 1 - kp; + zcopy_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + (kp + 1) * a_dim1], lda); + i__1 = kk - 1 - kp; + zlacgv_(&i__1, &a[kp + (kp + 1) * a_dim1], lda); + if (kp > 1) { + i__1 = kp - 1; + zcopy_(&i__1, &a[kk * a_dim1 + 1], &c__1, &a[kp * a_dim1 + 1], &c__1); + } + if (k < *n) { + i__1 = *n - k; + zswap_(&i__1, &a[kk + (k + 1) * a_dim1], lda, &a[kp + (k + 1) * a_dim1], lda); + } + i__1 = *n - kk + 1; + zswap_(&i__1, &w[kk + kkw * w_dim1], ldw, &w[kp + kkw * w_dim1], ldw); + } + if (kstep == 1) { + zcopy_(&k, &w[kw * w_dim1 + 1], &c__1, &a[k * a_dim1 + 1], &c__1); + if (k > 1) { + i__1 = k + k * a_dim1; + r1 = 1. / a[i__1].r; + i__1 = k - 1; + zdscal_(&i__1, &r1, &a[k * a_dim1 + 1], &c__1); + i__1 = k - 1; + zlacgv_(&i__1, &w[kw * w_dim1 + 1], &c__1); + } + } else { + if (k > 2) { + i__1 = k - 1 + kw * w_dim1; + d21.r = w[i__1].r, d21.i = w[i__1].i; + d_lmp_cnjg(&z__2, &d21); + z_lmp_div(&z__1, &w[k + kw * w_dim1], &z__2); + d11.r = z__1.r, d11.i = z__1.i; + z_lmp_div(&z__1, &w[k - 1 + (kw - 1) * w_dim1], &d21); + d22.r = z__1.r, d22.i = z__1.i; + z__1.r = d11.r * d22.r - d11.i * d22.i, z__1.i = d11.r * d22.i + d11.i * d22.r; + t = 1. / (z__1.r - 1.); + z__2.r = t, z__2.i = 0.; + z_lmp_div(&z__1, &z__2, &d21); + d21.r = z__1.r, d21.i = z__1.i; + i__1 = k - 2; + for (j = 1; j <= i__1; ++j) { + i__2 = j + (k - 1) * a_dim1; + i__3 = j + (kw - 1) * w_dim1; + z__3.r = d11.r * w[i__3].r - d11.i * w[i__3].i, + z__3.i = d11.r * w[i__3].i + d11.i * w[i__3].r; + i__4 = j + kw * w_dim1; + z__2.r = z__3.r - w[i__4].r, z__2.i = z__3.i - w[i__4].i; + z__1.r = d21.r * z__2.r - d21.i * z__2.i, + z__1.i = d21.r * z__2.i + d21.i * z__2.r; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = j + k * a_dim1; + d_lmp_cnjg(&z__2, &d21); + i__3 = j + kw * w_dim1; + z__4.r = d22.r * w[i__3].r - d22.i * w[i__3].i, + z__4.i = d22.r * w[i__3].i + d22.i * w[i__3].r; + i__4 = j + (kw - 1) * w_dim1; + z__3.r = z__4.r - w[i__4].r, z__3.i = z__4.i - w[i__4].i; + z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, + z__1.i = z__2.r * z__3.i + z__2.i * z__3.r; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + } + } + i__1 = k - 1 + (k - 1) * a_dim1; + i__2 = k - 1 + (kw - 1) * w_dim1; + a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i; + i__1 = k - 1 + k * a_dim1; + i__2 = k - 1 + kw * w_dim1; + a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i; + i__1 = k + k * a_dim1; + i__2 = k + kw * w_dim1; + a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i; + i__1 = k - 1; + zlacgv_(&i__1, &w[kw * w_dim1 + 1], &c__1); + i__1 = k - 2; + zlacgv_(&i__1, &w[(kw - 1) * w_dim1 + 1], &c__1); + } + } + if (kstep == 1) { + ipiv[k] = kp; + } else { + ipiv[k] = -kp; + ipiv[k - 1] = -kp; + } + k -= kstep; + goto L10; + L30: + i__1 = -(*nb); + for (j = (k - 1) / *nb * *nb + 1; i__1 < 0 ? j >= 1 : j <= 1; j += i__1) { + i__2 = *nb, i__3 = k - j + 1; + jb = min(i__2, i__3); + i__2 = j + jb - 1; + for (jj = j; jj <= i__2; ++jj) { + i__3 = jj + jj * a_dim1; + i__4 = jj + jj * a_dim1; + d__1 = a[i__4].r; + a[i__3].r = d__1, a[i__3].i = 0.; + i__3 = jj - j + 1; + i__4 = *n - k; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__3, &i__4, &z__1, &a[j + (k + 1) * a_dim1], lda, + &w[jj + (kw + 1) * w_dim1], ldw, &c_b1, &a[j + jj * a_dim1], &c__1, + (ftnlen)12); + i__3 = jj + jj * a_dim1; + i__4 = jj + jj * a_dim1; + d__1 = a[i__4].r; + a[i__3].r = d__1, a[i__3].i = 0.; + } + i__2 = j - 1; + i__3 = *n - k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Transpose", &i__2, &jb, &i__3, &z__1, &a[(k + 1) * a_dim1 + 1], + lda, &w[j + (kw + 1) * w_dim1], ldw, &c_b1, &a[j * a_dim1 + 1], lda, (ftnlen)12, + (ftnlen)9); + } + j = k + 1; + L60: + jj = j; + jp = ipiv[j]; + if (jp < 0) { + jp = -jp; + ++j; + } + ++j; + if (jp != jj && j <= *n) { + i__1 = *n - j + 1; + zswap_(&i__1, &a[jp + j * a_dim1], lda, &a[jj + j * a_dim1], lda); + } + if (j < *n) { + goto L60; + } + *kb = *n - k; + } else { + k = 1; + L70: + if (k >= *nb && *nb < *n || k > *n) { + goto L90; + } + kstep = 1; + i__1 = k + k * w_dim1; + i__2 = k + k * a_dim1; + d__1 = a[i__2].r; + w[i__1].r = d__1, w[i__1].i = 0.; + if (k < *n) { + i__1 = *n - k; + zcopy_(&i__1, &a[k + 1 + k * a_dim1], &c__1, &w[k + 1 + k * w_dim1], &c__1); + } + i__1 = *n - k + 1; + i__2 = k - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__1, &i__2, &z__1, &a[k + a_dim1], lda, &w[k + w_dim1], ldw, &c_b1, + &w[k + k * w_dim1], &c__1, (ftnlen)12); + i__1 = k + k * w_dim1; + i__2 = k + k * w_dim1; + d__1 = w[i__2].r; + w[i__1].r = d__1, w[i__1].i = 0.; + i__1 = k + k * w_dim1; + absakk = (d__1 = w[i__1].r, abs(d__1)); + if (k < *n) { + i__1 = *n - k; + imax = k + izamax_(&i__1, &w[k + 1 + k * w_dim1], &c__1); + i__1 = imax + k * w_dim1; + colmax = + (d__1 = w[i__1].r, abs(d__1)) + (d__2 = d_lmp_imag(&w[imax + k * w_dim1]), abs(d__2)); + } else { + colmax = 0.; + } + if (max(absakk, colmax) == 0.) { + if (*info == 0) { + *info = k; + } + kp = k; + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + } else { + if (absakk >= alpha * colmax) { + kp = k; + } else { + i__1 = imax - k; + zcopy_(&i__1, &a[imax + k * a_dim1], lda, &w[k + (k + 1) * w_dim1], &c__1); + i__1 = imax - k; + zlacgv_(&i__1, &w[k + (k + 1) * w_dim1], &c__1); + i__1 = imax + (k + 1) * w_dim1; + i__2 = imax + imax * a_dim1; + d__1 = a[i__2].r; + w[i__1].r = d__1, w[i__1].i = 0.; + if (imax < *n) { + i__1 = *n - imax; + zcopy_(&i__1, &a[imax + 1 + imax * a_dim1], &c__1, + &w[imax + 1 + (k + 1) * w_dim1], &c__1); + } + i__1 = *n - k + 1; + i__2 = k - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__1, &i__2, &z__1, &a[k + a_dim1], lda, &w[imax + w_dim1], + ldw, &c_b1, &w[k + (k + 1) * w_dim1], &c__1, (ftnlen)12); + i__1 = imax + (k + 1) * w_dim1; + i__2 = imax + (k + 1) * w_dim1; + d__1 = w[i__2].r; + w[i__1].r = d__1, w[i__1].i = 0.; + i__1 = imax - k; + jmax = k - 1 + izamax_(&i__1, &w[k + (k + 1) * w_dim1], &c__1); + i__1 = jmax + (k + 1) * w_dim1; + rowmax = (d__1 = w[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&w[jmax + (k + 1) * w_dim1]), abs(d__2)); + if (imax < *n) { + i__1 = *n - imax; + jmax = imax + izamax_(&i__1, &w[imax + 1 + (k + 1) * w_dim1], &c__1); + i__1 = jmax + (k + 1) * w_dim1; + d__3 = rowmax, d__4 = (d__1 = w[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&w[jmax + (k + 1) * w_dim1]), abs(d__2)); + rowmax = max(d__3, d__4); + } + if (absakk >= alpha * colmax * (colmax / rowmax)) { + kp = k; + } else { + i__1 = imax + (k + 1) * w_dim1; + if ((d__1 = w[i__1].r, abs(d__1)) >= alpha * rowmax) { + kp = imax; + i__1 = *n - k + 1; + zcopy_(&i__1, &w[k + (k + 1) * w_dim1], &c__1, &w[k + k * w_dim1], &c__1); + } else { + kp = imax; + kstep = 2; + } + } + } + kk = k + kstep - 1; + if (kp != kk) { + i__1 = kp + kp * a_dim1; + i__2 = kk + kk * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + i__1 = kp - kk - 1; + zcopy_(&i__1, &a[kk + 1 + kk * a_dim1], &c__1, &a[kp + (kk + 1) * a_dim1], lda); + i__1 = kp - kk - 1; + zlacgv_(&i__1, &a[kp + (kk + 1) * a_dim1], lda); + if (kp < *n) { + i__1 = *n - kp; + zcopy_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + 1 + kp * a_dim1], &c__1); + } + if (k > 1) { + i__1 = k - 1; + zswap_(&i__1, &a[kk + a_dim1], lda, &a[kp + a_dim1], lda); + } + zswap_(&kk, &w[kk + w_dim1], ldw, &w[kp + w_dim1], ldw); + } + if (kstep == 1) { + i__1 = *n - k + 1; + zcopy_(&i__1, &w[k + k * w_dim1], &c__1, &a[k + k * a_dim1], &c__1); + if (k < *n) { + i__1 = k + k * a_dim1; + r1 = 1. / a[i__1].r; + i__1 = *n - k; + zdscal_(&i__1, &r1, &a[k + 1 + k * a_dim1], &c__1); + i__1 = *n - k; + zlacgv_(&i__1, &w[k + 1 + k * w_dim1], &c__1); + } + } else { + if (k < *n - 1) { + i__1 = k + 1 + k * w_dim1; + d21.r = w[i__1].r, d21.i = w[i__1].i; + z_lmp_div(&z__1, &w[k + 1 + (k + 1) * w_dim1], &d21); + d11.r = z__1.r, d11.i = z__1.i; + d_lmp_cnjg(&z__2, &d21); + z_lmp_div(&z__1, &w[k + k * w_dim1], &z__2); + d22.r = z__1.r, d22.i = z__1.i; + z__1.r = d11.r * d22.r - d11.i * d22.i, z__1.i = d11.r * d22.i + d11.i * d22.r; + t = 1. / (z__1.r - 1.); + z__2.r = t, z__2.i = 0.; + z_lmp_div(&z__1, &z__2, &d21); + d21.r = z__1.r, d21.i = z__1.i; + i__1 = *n; + for (j = k + 2; j <= i__1; ++j) { + i__2 = j + k * a_dim1; + d_lmp_cnjg(&z__2, &d21); + i__3 = j + k * w_dim1; + z__4.r = d11.r * w[i__3].r - d11.i * w[i__3].i, + z__4.i = d11.r * w[i__3].i + d11.i * w[i__3].r; + i__4 = j + (k + 1) * w_dim1; + z__3.r = z__4.r - w[i__4].r, z__3.i = z__4.i - w[i__4].i; + z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, + z__1.i = z__2.r * z__3.i + z__2.i * z__3.r; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = j + (k + 1) * a_dim1; + i__3 = j + (k + 1) * w_dim1; + z__3.r = d22.r * w[i__3].r - d22.i * w[i__3].i, + z__3.i = d22.r * w[i__3].i + d22.i * w[i__3].r; + i__4 = j + k * w_dim1; + z__2.r = z__3.r - w[i__4].r, z__2.i = z__3.i - w[i__4].i; + z__1.r = d21.r * z__2.r - d21.i * z__2.i, + z__1.i = d21.r * z__2.i + d21.i * z__2.r; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + } + } + i__1 = k + k * a_dim1; + i__2 = k + k * w_dim1; + a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i; + i__1 = k + 1 + k * a_dim1; + i__2 = k + 1 + k * w_dim1; + a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i; + i__1 = k + 1 + (k + 1) * a_dim1; + i__2 = k + 1 + (k + 1) * w_dim1; + a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i; + i__1 = *n - k; + zlacgv_(&i__1, &w[k + 1 + k * w_dim1], &c__1); + i__1 = *n - k - 1; + zlacgv_(&i__1, &w[k + 2 + (k + 1) * w_dim1], &c__1); + } + } + if (kstep == 1) { + ipiv[k] = kp; + } else { + ipiv[k] = -kp; + ipiv[k + 1] = -kp; + } + k += kstep; + goto L70; + L90: + i__1 = *n; + i__2 = *nb; + for (j = k; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + i__3 = *nb, i__4 = *n - j + 1; + jb = min(i__3, i__4); + i__3 = j + jb - 1; + for (jj = j; jj <= i__3; ++jj) { + i__4 = jj + jj * a_dim1; + i__5 = jj + jj * a_dim1; + d__1 = a[i__5].r; + a[i__4].r = d__1, a[i__4].i = 0.; + i__4 = j + jb - jj; + i__5 = k - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__4, &i__5, &z__1, &a[jj + a_dim1], lda, &w[jj + w_dim1], + ldw, &c_b1, &a[jj + jj * a_dim1], &c__1, (ftnlen)12); + i__4 = jj + jj * a_dim1; + i__5 = jj + jj * a_dim1; + d__1 = a[i__5].r; + a[i__4].r = d__1, a[i__4].i = 0.; + } + if (j + jb <= *n) { + i__3 = *n - j - jb + 1; + i__4 = k - 1; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &jb, &i__4, &z__1, &a[j + jb + a_dim1], + lda, &w[j + w_dim1], ldw, &c_b1, &a[j + jb + j * a_dim1], lda, (ftnlen)12, + (ftnlen)9); + } + } + j = k - 1; + L120: + jj = j; + jp = ipiv[j]; + if (jp < 0) { + jp = -jp; + --j; + } + --j; + if (jp != jj && j >= 1) { + zswap_(&j, &a[jp + a_dim1], lda, &a[jj + a_dim1], lda); + } + if (j > 1) { + goto L120; + } + *kb = k - 1; + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zlaswp.cpp b/lib/linalg/zlaswp.cpp new file mode 100644 index 0000000000..40e941ffa5 --- /dev/null +++ b/lib/linalg/zlaswp.cpp @@ -0,0 +1,79 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int zlaswp_(integer *n, doublecomplex *a, integer *lda, integer *k1, integer *k2, integer *ipiv, + integer *incx) +{ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5, i__6; + integer i__, j, k, i1, i2, n32, ip, ix, ix0, inc; + doublecomplex temp; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + if (*incx > 0) { + ix0 = *k1; + i1 = *k1; + i2 = *k2; + inc = 1; + } else if (*incx < 0) { + ix0 = *k1 + (*k1 - *k2) * *incx; + i1 = *k2; + i2 = *k1; + inc = -1; + } else { + return 0; + } + n32 = *n / 32 << 5; + if (n32 != 0) { + i__1 = n32; + for (j = 1; j <= i__1; j += 32) { + ix = ix0; + i__2 = i2; + i__3 = inc; + for (i__ = i1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) { + ip = ipiv[ix]; + if (ip != i__) { + i__4 = j + 31; + for (k = j; k <= i__4; ++k) { + i__5 = i__ + k * a_dim1; + temp.r = a[i__5].r, temp.i = a[i__5].i; + i__5 = i__ + k * a_dim1; + i__6 = ip + k * a_dim1; + a[i__5].r = a[i__6].r, a[i__5].i = a[i__6].i; + i__5 = ip + k * a_dim1; + a[i__5].r = temp.r, a[i__5].i = temp.i; + } + } + ix += *incx; + } + } + } + if (n32 != *n) { + ++n32; + ix = ix0; + i__1 = i2; + i__3 = inc; + for (i__ = i1; i__3 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__3) { + ip = ipiv[ix]; + if (ip != i__) { + i__2 = *n; + for (k = n32; k <= i__2; ++k) { + i__4 = i__ + k * a_dim1; + temp.r = a[i__4].r, temp.i = a[i__4].i; + i__4 = i__ + k * a_dim1; + i__5 = ip + k * a_dim1; + a[i__4].r = a[i__5].r, a[i__4].i = a[i__5].i; + i__4 = ip + k * a_dim1; + a[i__4].r = temp.r, a[i__4].i = temp.i; + } + } + ix += *incx; + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zlasyf.cpp b/lib/linalg/zlasyf.cpp new file mode 100644 index 0000000000..2823d173de --- /dev/null +++ b/lib/linalg/zlasyf.cpp @@ -0,0 +1,431 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static integer c__1 = 1; +int zlasyf_(char *uplo, integer *n, integer *nb, integer *kb, doublecomplex *a, integer *lda, + integer *ipiv, doublecomplex *w, integer *ldw, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3, i__4, i__5; + doublereal d__1, d__2, d__3, d__4; + doublecomplex z__1, z__2, z__3; + double sqrt(doublereal), d_lmp_imag(doublecomplex *); + void z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *); + integer j, k; + doublecomplex t, r1, d11, d21, d22; + integer jb, jj, kk, jp, kp, kw, kkw, imax, jmax; + doublereal alpha; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int zscal_(integer *, doublecomplex *, doublecomplex *, integer *), + zgemm_(char *, char *, integer *, integer *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, integer *, doublecomplex *, doublecomplex *, integer *, + ftnlen, ftnlen); + integer kstep; + extern int zgemv_(char *, integer *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, integer *, + ftnlen), + zcopy_(integer *, doublecomplex *, integer *, doublecomplex *, integer *), + zswap_(integer *, doublecomplex *, integer *, doublecomplex *, integer *); + doublereal absakk, colmax; + extern integer izamax_(integer *, doublecomplex *, integer *); + doublereal rowmax; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + w_dim1 = *ldw; + w_offset = 1 + w_dim1; + w -= w_offset; + *info = 0; + alpha = (sqrt(17.) + 1.) / 8.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + k = *n; + L10: + kw = *nb + k - *n; + if (k <= *n - *nb + 1 && *nb < *n || k < 1) { + goto L30; + } + zcopy_(&k, &a[k * a_dim1 + 1], &c__1, &w[kw * w_dim1 + 1], &c__1); + if (k < *n) { + i__1 = *n - k; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &k, &i__1, &z__1, &a[(k + 1) * a_dim1 + 1], lda, + &w[k + (kw + 1) * w_dim1], ldw, &c_b1, &w[kw * w_dim1 + 1], &c__1, (ftnlen)12); + } + kstep = 1; + i__1 = k + kw * w_dim1; + absakk = (d__1 = w[i__1].r, abs(d__1)) + (d__2 = d_lmp_imag(&w[k + kw * w_dim1]), abs(d__2)); + if (k > 1) { + i__1 = k - 1; + imax = izamax_(&i__1, &w[kw * w_dim1 + 1], &c__1); + i__1 = imax + kw * w_dim1; + colmax = + (d__1 = w[i__1].r, abs(d__1)) + (d__2 = d_lmp_imag(&w[imax + kw * w_dim1]), abs(d__2)); + } else { + colmax = 0.; + } + if (max(absakk, colmax) == 0.) { + if (*info == 0) { + *info = k; + } + kp = k; + } else { + if (absakk >= alpha * colmax) { + kp = k; + } else { + zcopy_(&imax, &a[imax * a_dim1 + 1], &c__1, &w[(kw - 1) * w_dim1 + 1], &c__1); + i__1 = k - imax; + zcopy_(&i__1, &a[imax + (imax + 1) * a_dim1], lda, &w[imax + 1 + (kw - 1) * w_dim1], + &c__1); + if (k < *n) { + i__1 = *n - k; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &k, &i__1, &z__1, &a[(k + 1) * a_dim1 + 1], lda, + &w[imax + (kw + 1) * w_dim1], ldw, &c_b1, &w[(kw - 1) * w_dim1 + 1], + &c__1, (ftnlen)12); + } + i__1 = k - imax; + jmax = imax + izamax_(&i__1, &w[imax + 1 + (kw - 1) * w_dim1], &c__1); + i__1 = jmax + (kw - 1) * w_dim1; + rowmax = (d__1 = w[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&w[jmax + (kw - 1) * w_dim1]), abs(d__2)); + if (imax > 1) { + i__1 = imax - 1; + jmax = izamax_(&i__1, &w[(kw - 1) * w_dim1 + 1], &c__1); + i__1 = jmax + (kw - 1) * w_dim1; + d__3 = rowmax, d__4 = (d__1 = w[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&w[jmax + (kw - 1) * w_dim1]), abs(d__2)); + rowmax = max(d__3, d__4); + } + if (absakk >= alpha * colmax * (colmax / rowmax)) { + kp = k; + } else { + i__1 = imax + (kw - 1) * w_dim1; + if ((d__1 = w[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&w[imax + (kw - 1) * w_dim1]), abs(d__2)) >= + alpha * rowmax) { + kp = imax; + zcopy_(&k, &w[(kw - 1) * w_dim1 + 1], &c__1, &w[kw * w_dim1 + 1], &c__1); + } else { + kp = imax; + kstep = 2; + } + } + } + kk = k - kstep + 1; + kkw = *nb + kk - *n; + if (kp != kk) { + i__1 = kp + kp * a_dim1; + i__2 = kk + kk * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kk - 1 - kp; + zcopy_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + (kp + 1) * a_dim1], lda); + if (kp > 1) { + i__1 = kp - 1; + zcopy_(&i__1, &a[kk * a_dim1 + 1], &c__1, &a[kp * a_dim1 + 1], &c__1); + } + if (k < *n) { + i__1 = *n - k; + zswap_(&i__1, &a[kk + (k + 1) * a_dim1], lda, &a[kp + (k + 1) * a_dim1], lda); + } + i__1 = *n - kk + 1; + zswap_(&i__1, &w[kk + kkw * w_dim1], ldw, &w[kp + kkw * w_dim1], ldw); + } + if (kstep == 1) { + zcopy_(&k, &w[kw * w_dim1 + 1], &c__1, &a[k * a_dim1 + 1], &c__1); + z_lmp_div(&z__1, &c_b1, &a[k + k * a_dim1]); + r1.r = z__1.r, r1.i = z__1.i; + i__1 = k - 1; + zscal_(&i__1, &r1, &a[k * a_dim1 + 1], &c__1); + } else { + if (k > 2) { + i__1 = k - 1 + kw * w_dim1; + d21.r = w[i__1].r, d21.i = w[i__1].i; + z_lmp_div(&z__1, &w[k + kw * w_dim1], &d21); + d11.r = z__1.r, d11.i = z__1.i; + z_lmp_div(&z__1, &w[k - 1 + (kw - 1) * w_dim1], &d21); + d22.r = z__1.r, d22.i = z__1.i; + z__3.r = d11.r * d22.r - d11.i * d22.i, z__3.i = d11.r * d22.i + d11.i * d22.r; + z__2.r = z__3.r - 1., z__2.i = z__3.i - 0.; + z_lmp_div(&z__1, &c_b1, &z__2); + t.r = z__1.r, t.i = z__1.i; + z_lmp_div(&z__1, &t, &d21); + d21.r = z__1.r, d21.i = z__1.i; + i__1 = k - 2; + for (j = 1; j <= i__1; ++j) { + i__2 = j + (k - 1) * a_dim1; + i__3 = j + (kw - 1) * w_dim1; + z__3.r = d11.r * w[i__3].r - d11.i * w[i__3].i, + z__3.i = d11.r * w[i__3].i + d11.i * w[i__3].r; + i__4 = j + kw * w_dim1; + z__2.r = z__3.r - w[i__4].r, z__2.i = z__3.i - w[i__4].i; + z__1.r = d21.r * z__2.r - d21.i * z__2.i, + z__1.i = d21.r * z__2.i + d21.i * z__2.r; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = j + k * a_dim1; + i__3 = j + kw * w_dim1; + z__3.r = d22.r * w[i__3].r - d22.i * w[i__3].i, + z__3.i = d22.r * w[i__3].i + d22.i * w[i__3].r; + i__4 = j + (kw - 1) * w_dim1; + z__2.r = z__3.r - w[i__4].r, z__2.i = z__3.i - w[i__4].i; + z__1.r = d21.r * z__2.r - d21.i * z__2.i, + z__1.i = d21.r * z__2.i + d21.i * z__2.r; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + } + } + i__1 = k - 1 + (k - 1) * a_dim1; + i__2 = k - 1 + (kw - 1) * w_dim1; + a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i; + i__1 = k - 1 + k * a_dim1; + i__2 = k - 1 + kw * w_dim1; + a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i; + i__1 = k + k * a_dim1; + i__2 = k + kw * w_dim1; + a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i; + } + } + if (kstep == 1) { + ipiv[k] = kp; + } else { + ipiv[k] = -kp; + ipiv[k - 1] = -kp; + } + k -= kstep; + goto L10; + L30: + i__1 = -(*nb); + for (j = (k - 1) / *nb * *nb + 1; i__1 < 0 ? j >= 1 : j <= 1; j += i__1) { + i__2 = *nb, i__3 = k - j + 1; + jb = min(i__2, i__3); + i__2 = j + jb - 1; + for (jj = j; jj <= i__2; ++jj) { + i__3 = jj - j + 1; + i__4 = *n - k; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__3, &i__4, &z__1, &a[j + (k + 1) * a_dim1], lda, + &w[jj + (kw + 1) * w_dim1], ldw, &c_b1, &a[j + jj * a_dim1], &c__1, + (ftnlen)12); + } + i__2 = j - 1; + i__3 = *n - k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Transpose", &i__2, &jb, &i__3, &z__1, &a[(k + 1) * a_dim1 + 1], + lda, &w[j + (kw + 1) * w_dim1], ldw, &c_b1, &a[j * a_dim1 + 1], lda, (ftnlen)12, + (ftnlen)9); + } + j = k + 1; + L60: + jj = j; + jp = ipiv[j]; + if (jp < 0) { + jp = -jp; + ++j; + } + ++j; + if (jp != jj && j <= *n) { + i__1 = *n - j + 1; + zswap_(&i__1, &a[jp + j * a_dim1], lda, &a[jj + j * a_dim1], lda); + } + if (j < *n) { + goto L60; + } + *kb = *n - k; + } else { + k = 1; + L70: + if (k >= *nb && *nb < *n || k > *n) { + goto L90; + } + i__1 = *n - k + 1; + zcopy_(&i__1, &a[k + k * a_dim1], &c__1, &w[k + k * w_dim1], &c__1); + i__1 = *n - k + 1; + i__2 = k - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__1, &i__2, &z__1, &a[k + a_dim1], lda, &w[k + w_dim1], ldw, &c_b1, + &w[k + k * w_dim1], &c__1, (ftnlen)12); + kstep = 1; + i__1 = k + k * w_dim1; + absakk = (d__1 = w[i__1].r, abs(d__1)) + (d__2 = d_lmp_imag(&w[k + k * w_dim1]), abs(d__2)); + if (k < *n) { + i__1 = *n - k; + imax = k + izamax_(&i__1, &w[k + 1 + k * w_dim1], &c__1); + i__1 = imax + k * w_dim1; + colmax = + (d__1 = w[i__1].r, abs(d__1)) + (d__2 = d_lmp_imag(&w[imax + k * w_dim1]), abs(d__2)); + } else { + colmax = 0.; + } + if (max(absakk, colmax) == 0.) { + if (*info == 0) { + *info = k; + } + kp = k; + } else { + if (absakk >= alpha * colmax) { + kp = k; + } else { + i__1 = imax - k; + zcopy_(&i__1, &a[imax + k * a_dim1], lda, &w[k + (k + 1) * w_dim1], &c__1); + i__1 = *n - imax + 1; + zcopy_(&i__1, &a[imax + imax * a_dim1], &c__1, &w[imax + (k + 1) * w_dim1], &c__1); + i__1 = *n - k + 1; + i__2 = k - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__1, &i__2, &z__1, &a[k + a_dim1], lda, &w[imax + w_dim1], + ldw, &c_b1, &w[k + (k + 1) * w_dim1], &c__1, (ftnlen)12); + i__1 = imax - k; + jmax = k - 1 + izamax_(&i__1, &w[k + (k + 1) * w_dim1], &c__1); + i__1 = jmax + (k + 1) * w_dim1; + rowmax = (d__1 = w[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&w[jmax + (k + 1) * w_dim1]), abs(d__2)); + if (imax < *n) { + i__1 = *n - imax; + jmax = imax + izamax_(&i__1, &w[imax + 1 + (k + 1) * w_dim1], &c__1); + i__1 = jmax + (k + 1) * w_dim1; + d__3 = rowmax, d__4 = (d__1 = w[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&w[jmax + (k + 1) * w_dim1]), abs(d__2)); + rowmax = max(d__3, d__4); + } + if (absakk >= alpha * colmax * (colmax / rowmax)) { + kp = k; + } else { + i__1 = imax + (k + 1) * w_dim1; + if ((d__1 = w[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&w[imax + (k + 1) * w_dim1]), abs(d__2)) >= + alpha * rowmax) { + kp = imax; + i__1 = *n - k + 1; + zcopy_(&i__1, &w[k + (k + 1) * w_dim1], &c__1, &w[k + k * w_dim1], &c__1); + } else { + kp = imax; + kstep = 2; + } + } + } + kk = k + kstep - 1; + if (kp != kk) { + i__1 = kp + kp * a_dim1; + i__2 = kk + kk * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp - kk - 1; + zcopy_(&i__1, &a[kk + 1 + kk * a_dim1], &c__1, &a[kp + (kk + 1) * a_dim1], lda); + if (kp < *n) { + i__1 = *n - kp; + zcopy_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + 1 + kp * a_dim1], &c__1); + } + if (k > 1) { + i__1 = k - 1; + zswap_(&i__1, &a[kk + a_dim1], lda, &a[kp + a_dim1], lda); + } + zswap_(&kk, &w[kk + w_dim1], ldw, &w[kp + w_dim1], ldw); + } + if (kstep == 1) { + i__1 = *n - k + 1; + zcopy_(&i__1, &w[k + k * w_dim1], &c__1, &a[k + k * a_dim1], &c__1); + if (k < *n) { + z_lmp_div(&z__1, &c_b1, &a[k + k * a_dim1]); + r1.r = z__1.r, r1.i = z__1.i; + i__1 = *n - k; + zscal_(&i__1, &r1, &a[k + 1 + k * a_dim1], &c__1); + } + } else { + if (k < *n - 1) { + i__1 = k + 1 + k * w_dim1; + d21.r = w[i__1].r, d21.i = w[i__1].i; + z_lmp_div(&z__1, &w[k + 1 + (k + 1) * w_dim1], &d21); + d11.r = z__1.r, d11.i = z__1.i; + z_lmp_div(&z__1, &w[k + k * w_dim1], &d21); + d22.r = z__1.r, d22.i = z__1.i; + z__3.r = d11.r * d22.r - d11.i * d22.i, z__3.i = d11.r * d22.i + d11.i * d22.r; + z__2.r = z__3.r - 1., z__2.i = z__3.i - 0.; + z_lmp_div(&z__1, &c_b1, &z__2); + t.r = z__1.r, t.i = z__1.i; + z_lmp_div(&z__1, &t, &d21); + d21.r = z__1.r, d21.i = z__1.i; + i__1 = *n; + for (j = k + 2; j <= i__1; ++j) { + i__2 = j + k * a_dim1; + i__3 = j + k * w_dim1; + z__3.r = d11.r * w[i__3].r - d11.i * w[i__3].i, + z__3.i = d11.r * w[i__3].i + d11.i * w[i__3].r; + i__4 = j + (k + 1) * w_dim1; + z__2.r = z__3.r - w[i__4].r, z__2.i = z__3.i - w[i__4].i; + z__1.r = d21.r * z__2.r - d21.i * z__2.i, + z__1.i = d21.r * z__2.i + d21.i * z__2.r; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = j + (k + 1) * a_dim1; + i__3 = j + (k + 1) * w_dim1; + z__3.r = d22.r * w[i__3].r - d22.i * w[i__3].i, + z__3.i = d22.r * w[i__3].i + d22.i * w[i__3].r; + i__4 = j + k * w_dim1; + z__2.r = z__3.r - w[i__4].r, z__2.i = z__3.i - w[i__4].i; + z__1.r = d21.r * z__2.r - d21.i * z__2.i, + z__1.i = d21.r * z__2.i + d21.i * z__2.r; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + } + } + i__1 = k + k * a_dim1; + i__2 = k + k * w_dim1; + a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i; + i__1 = k + 1 + k * a_dim1; + i__2 = k + 1 + k * w_dim1; + a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i; + i__1 = k + 1 + (k + 1) * a_dim1; + i__2 = k + 1 + (k + 1) * w_dim1; + a[i__1].r = w[i__2].r, a[i__1].i = w[i__2].i; + } + } + if (kstep == 1) { + ipiv[k] = kp; + } else { + ipiv[k] = -kp; + ipiv[k + 1] = -kp; + } + k += kstep; + goto L70; + L90: + i__1 = *n; + i__2 = *nb; + for (j = k; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + i__3 = *nb, i__4 = *n - j + 1; + jb = min(i__3, i__4); + i__3 = j + jb - 1; + for (jj = j; jj <= i__3; ++jj) { + i__4 = j + jb - jj; + i__5 = k - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__4, &i__5, &z__1, &a[jj + a_dim1], lda, &w[jj + w_dim1], + ldw, &c_b1, &a[jj + jj * a_dim1], &c__1, (ftnlen)12); + } + if (j + jb <= *n) { + i__3 = *n - j - jb + 1; + i__4 = k - 1; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &jb, &i__4, &z__1, &a[j + jb + a_dim1], + lda, &w[j + w_dim1], ldw, &c_b1, &a[j + jb + j * a_dim1], lda, (ftnlen)12, + (ftnlen)9); + } + } + j = k - 1; + L120: + jj = j; + jp = ipiv[j]; + if (jp < 0) { + jp = -jp; + --j; + } + --j; + if (jp != jj && j >= 1) { + zswap_(&j, &a[jp + a_dim1], lda, &a[jj + a_dim1], lda); + } + if (j > 1) { + goto L120; + } + *kb = k - 1; + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zlauu2.cpp b/lib/linalg/zlauu2.cpp new file mode 100644 index 0000000000..2e92542d49 --- /dev/null +++ b/lib/linalg/zlauu2.cpp @@ -0,0 +1,100 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static integer c__1 = 1; +int zlauu2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2, i__3; + doublereal d__1; + doublecomplex z__1; + integer i__; + doublereal aii; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern VOID zdotc_(doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *); + extern int zgemv_(char *, integer *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, integer *, + ftnlen); + logical upper; + extern int xerbla_(char *, integer *, ftnlen), + zdscal_(integer *, doublereal *, doublecomplex *, integer *), + zlacgv_(integer *, doublecomplex *, integer *); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZLAUU2", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + if (upper) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + i__ * a_dim1; + aii = a[i__2].r; + if (i__ < *n) { + i__2 = i__ + i__ * a_dim1; + i__3 = *n - i__; + zdotc_(&z__1, &i__3, &a[i__ + (i__ + 1) * a_dim1], lda, + &a[i__ + (i__ + 1) * a_dim1], lda); + d__1 = aii * aii + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + i__2 = *n - i__; + zlacgv_(&i__2, &a[i__ + (i__ + 1) * a_dim1], lda); + i__2 = i__ - 1; + i__3 = *n - i__; + z__1.r = aii, z__1.i = 0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &c_b1, &a[(i__ + 1) * a_dim1 + 1], lda, + &a[i__ + (i__ + 1) * a_dim1], lda, &z__1, &a[i__ * a_dim1 + 1], &c__1, + (ftnlen)12); + i__2 = *n - i__; + zlacgv_(&i__2, &a[i__ + (i__ + 1) * a_dim1], lda); + } else { + zdscal_(&i__, &aii, &a[i__ * a_dim1 + 1], &c__1); + } + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + i__ * a_dim1; + aii = a[i__2].r; + if (i__ < *n) { + i__2 = i__ + i__ * a_dim1; + i__3 = *n - i__; + zdotc_(&z__1, &i__3, &a[i__ + 1 + i__ * a_dim1], &c__1, &a[i__ + 1 + i__ * a_dim1], + &c__1); + d__1 = aii * aii + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + i__2 = i__ - 1; + zlacgv_(&i__2, &a[i__ + a_dim1], lda); + i__2 = *n - i__; + i__3 = i__ - 1; + z__1.r = aii, z__1.i = 0.; + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b1, &a[i__ + 1 + a_dim1], lda, + &a[i__ + 1 + i__ * a_dim1], &c__1, &z__1, &a[i__ + a_dim1], lda, (ftnlen)19); + i__2 = i__ - 1; + zlacgv_(&i__2, &a[i__ + a_dim1], lda); + } else { + zdscal_(&i__, &aii, &a[i__ + a_dim1], lda); + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zlauum.cpp b/lib/linalg/zlauum.cpp new file mode 100644 index 0000000000..e61268ec3d --- /dev/null +++ b/lib/linalg/zlauum.cpp @@ -0,0 +1,103 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static integer c__1 = 1; +static integer c_n1 = -1; +static doublereal c_b21 = 1.; +int zlauum_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + integer i__, ib, nb; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int zgemm_(char *, char *, integer *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, ftnlen, ftnlen), + zherk_(char *, char *, integer *, integer *, doublereal *, doublecomplex *, integer *, + doublereal *, doublecomplex *, integer *, ftnlen, ftnlen); + logical upper; + extern int ztrmm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, + ftnlen, ftnlen), + zlauu2_(char *, integer *, doublecomplex *, integer *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZLAUUM", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + nb = ilaenv_(&c__1, (char *)"ZLAUUM", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + if (nb <= 1 || nb >= *n) { + zlauu2_(uplo, n, &a[a_offset], lda, info, (ftnlen)1); + } else { + if (upper) { + i__1 = *n; + i__2 = nb; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__3 = nb, i__4 = *n - i__ + 1; + ib = min(i__3, i__4); + i__3 = i__ - 1; + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Non-unit", &i__3, &ib, &c_b1, + &a[i__ + i__ * a_dim1], lda, &a[i__ * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)5, + (ftnlen)19, (ftnlen)8); + zlauu2_((char *)"Upper", &ib, &a[i__ + i__ * a_dim1], lda, info, (ftnlen)5); + if (i__ + ib <= *n) { + i__3 = i__ - 1; + i__4 = *n - i__ - ib + 1; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", &i__3, &ib, &i__4, &c_b1, + &a[(i__ + ib) * a_dim1 + 1], lda, &a[i__ + (i__ + ib) * a_dim1], lda, + &c_b1, &a[i__ * a_dim1 + 1], lda, (ftnlen)12, (ftnlen)19); + i__3 = *n - i__ - ib + 1; + zherk_((char *)"Upper", (char *)"No transpose", &ib, &i__3, &c_b21, + &a[i__ + (i__ + ib) * a_dim1], lda, &c_b21, &a[i__ + i__ * a_dim1], lda, + (ftnlen)5, (ftnlen)12); + } + } + } else { + i__2 = *n; + i__1 = nb; + for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { + i__3 = nb, i__4 = *n - i__ + 1; + ib = min(i__3, i__4); + i__3 = i__ - 1; + ztrmm_((char *)"Left", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Non-unit", &ib, &i__3, &c_b1, + &a[i__ + i__ * a_dim1], lda, &a[i__ + a_dim1], lda, (ftnlen)4, (ftnlen)5, + (ftnlen)19, (ftnlen)8); + zlauu2_((char *)"Lower", &ib, &a[i__ + i__ * a_dim1], lda, info, (ftnlen)5); + if (i__ + ib <= *n) { + i__3 = i__ - 1; + i__4 = *n - i__ - ib + 1; + zgemm_((char *)"Conjugate transpose", (char *)"No transpose", &ib, &i__3, &i__4, &c_b1, + &a[i__ + ib + i__ * a_dim1], lda, &a[i__ + ib + a_dim1], lda, &c_b1, + &a[i__ + a_dim1], lda, (ftnlen)19, (ftnlen)12); + i__3 = *n - i__ - ib + 1; + zherk_((char *)"Lower", (char *)"Conjugate transpose", &ib, &i__3, &c_b21, + &a[i__ + ib + i__ * a_dim1], lda, &c_b21, &a[i__ + i__ * a_dim1], lda, + (ftnlen)5, (ftnlen)19); + } + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zpotrf.cpp b/lib/linalg/zpotrf.cpp new file mode 100644 index 0000000000..5679af9ca9 --- /dev/null +++ b/lib/linalg/zpotrf.cpp @@ -0,0 +1,115 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static integer c__1 = 1; +static integer c_n1 = -1; +static doublereal c_b14 = -1.; +static doublereal c_b15 = 1.; +int zpotrf_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + doublecomplex z__1; + integer j, jb, nb; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int zgemm_(char *, char *, integer *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, ftnlen, ftnlen), + zherk_(char *, char *, integer *, integer *, doublereal *, doublecomplex *, integer *, + doublereal *, doublecomplex *, integer *, ftnlen, ftnlen); + logical upper; + extern int ztrsm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, + ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int zpotrf2_(char *, integer *, doublecomplex *, integer *, integer *, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZPOTRF", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + nb = ilaenv_(&c__1, (char *)"ZPOTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + if (nb <= 1 || nb >= *n) { + zpotrf2_(uplo, n, &a[a_offset], lda, info, (ftnlen)1); + } else { + if (upper) { + i__1 = *n; + i__2 = nb; + for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + i__3 = nb, i__4 = *n - j + 1; + jb = min(i__3, i__4); + i__3 = j - 1; + zherk_((char *)"Upper", (char *)"Conjugate transpose", &jb, &i__3, &c_b14, &a[j * a_dim1 + 1], lda, + &c_b15, &a[j + j * a_dim1], lda, (ftnlen)5, (ftnlen)19); + zpotrf2_((char *)"Upper", &jb, &a[j + j * a_dim1], lda, info, (ftnlen)5); + if (*info != 0) { + goto L30; + } + if (j + jb <= *n) { + i__3 = *n - j - jb + 1; + i__4 = j - 1; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"Conjugate transpose", (char *)"No transpose", &jb, &i__3, &i__4, &z__1, + &a[j * a_dim1 + 1], lda, &a[(j + jb) * a_dim1 + 1], lda, &c_b1, + &a[j + (j + jb) * a_dim1], lda, (ftnlen)19, (ftnlen)12); + i__3 = *n - j - jb + 1; + ztrsm_((char *)"Left", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Non-unit", &jb, &i__3, &c_b1, + &a[j + j * a_dim1], lda, &a[j + (j + jb) * a_dim1], lda, (ftnlen)4, + (ftnlen)5, (ftnlen)19, (ftnlen)8); + } + } + } else { + i__2 = *n; + i__1 = nb; + for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { + i__3 = nb, i__4 = *n - j + 1; + jb = min(i__3, i__4); + i__3 = j - 1; + zherk_((char *)"Lower", (char *)"No transpose", &jb, &i__3, &c_b14, &a[j + a_dim1], lda, &c_b15, + &a[j + j * a_dim1], lda, (ftnlen)5, (ftnlen)12); + zpotrf2_((char *)"Lower", &jb, &a[j + j * a_dim1], lda, info, (ftnlen)5); + if (*info != 0) { + goto L30; + } + if (j + jb <= *n) { + i__3 = *n - j - jb + 1; + i__4 = j - 1; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", &i__3, &jb, &i__4, &z__1, + &a[j + jb + a_dim1], lda, &a[j + a_dim1], lda, &c_b1, + &a[j + jb + j * a_dim1], lda, (ftnlen)12, (ftnlen)19); + i__3 = *n - j - jb + 1; + ztrsm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Non-unit", &i__3, &jb, &c_b1, + &a[j + j * a_dim1], lda, &a[j + jb + j * a_dim1], lda, (ftnlen)5, + (ftnlen)5, (ftnlen)19, (ftnlen)8); + } + } + } + } + goto L40; +L30: + *info = *info + j - 1; +L40: + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zpotrf2.cpp b/lib/linalg/zpotrf2.cpp new file mode 100644 index 0000000000..262ea15497 --- /dev/null +++ b/lib/linalg/zpotrf2.cpp @@ -0,0 +1,89 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static doublereal c_b11 = -1.; +static doublereal c_b12 = 1.; +int zpotrf2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1; + doublereal d__1; + double sqrt(doublereal); + integer n1, n2; + doublereal ajj; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo; + extern int zherk_(char *, char *, integer *, integer *, doublereal *, doublecomplex *, + integer *, doublereal *, doublecomplex *, integer *, ftnlen, ftnlen); + logical upper; + extern int ztrsm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, + ftnlen, ftnlen); + extern logical disnan_(doublereal *); + extern int xerbla_(char *, integer *, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZPOTRF2", &i__1, (ftnlen)7); + return 0; + } + if (*n == 0) { + return 0; + } + if (*n == 1) { + i__1 = a_dim1 + 1; + ajj = a[i__1].r; + if (ajj <= 0. || disnan_(&ajj)) { + *info = 1; + return 0; + } + i__1 = a_dim1 + 1; + d__1 = sqrt(ajj); + a[i__1].r = d__1, a[i__1].i = 0.; + } else { + n1 = *n / 2; + n2 = *n - n1; + zpotrf2_(uplo, &n1, &a[a_dim1 + 1], lda, &iinfo, (ftnlen)1); + if (iinfo != 0) { + *info = iinfo; + return 0; + } + if (upper) { + ztrsm_((char *)"L", (char *)"U", (char *)"C", (char *)"N", &n1, &n2, &c_b1, &a[a_dim1 + 1], lda, + &a[(n1 + 1) * a_dim1 + 1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + zherk_(uplo, (char *)"C", &n2, &n1, &c_b11, &a[(n1 + 1) * a_dim1 + 1], lda, &c_b12, + &a[n1 + 1 + (n1 + 1) * a_dim1], lda, (ftnlen)1, (ftnlen)1); + zpotrf2_(uplo, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &iinfo, (ftnlen)1); + if (iinfo != 0) { + *info = iinfo + n1; + return 0; + } + } else { + ztrsm_((char *)"R", (char *)"L", (char *)"C", (char *)"N", &n2, &n1, &c_b1, &a[a_dim1 + 1], lda, &a[n1 + 1 + a_dim1], + lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + zherk_(uplo, (char *)"N", &n2, &n1, &c_b11, &a[n1 + 1 + a_dim1], lda, &c_b12, + &a[n1 + 1 + (n1 + 1) * a_dim1], lda, (ftnlen)1, (ftnlen)1); + zpotrf2_(uplo, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &iinfo, (ftnlen)1); + if (iinfo != 0) { + *info = iinfo + n1; + return 0; + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zpotri.cpp b/lib/linalg/zpotri.cpp new file mode 100644 index 0000000000..a13f6fde5c --- /dev/null +++ b/lib/linalg/zpotri.cpp @@ -0,0 +1,40 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int zpotri_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen), + zlauum_(char *, integer *, doublecomplex *, integer *, integer *, ftnlen), + ztrtri_(char *, char *, integer *, doublecomplex *, integer *, integer *, ftnlen, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + *info = 0; + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZPOTRI", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + ztrtri_(uplo, (char *)"Non-unit", n, &a[a_offset], lda, info, (ftnlen)1, (ftnlen)8); + if (*info > 0) { + return 0; + } + zlauum_(uplo, n, &a[a_offset], lda, info, (ftnlen)1); + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zsymv.cpp b/lib/linalg/zsymv.cpp new file mode 100644 index 0000000000..73e956493b --- /dev/null +++ b/lib/linalg/zsymv.cpp @@ -0,0 +1,263 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int zsymv_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, + doublecomplex *x, integer *incx, doublecomplex *beta, doublecomplex *y, integer *incy, + ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1, z__2, z__3, z__4; + integer i__, j, ix, iy, jx, jy, kx, ky, info; + doublecomplex temp1, temp2; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + --y; + info = 0; + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (*n < 0) { + info = 2; + } else if (*lda < max(1, *n)) { + info = 5; + } else if (*incx == 0) { + info = 7; + } else if (*incy == 0) { + info = 10; + } + if (info != 0) { + xerbla_((char *)"ZSYMV ", &info, (ftnlen)6); + return 0; + } + if (*n == 0 || alpha->r == 0. && alpha->i == 0. && (beta->r == 1. && beta->i == 0.)) { + return 0; + } + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (*n - 1) * *incx; + } + if (*incy > 0) { + ky = 1; + } else { + ky = 1 - (*n - 1) * *incy; + } + if (beta->r != 1. || beta->i != 0.) { + if (*incy == 1) { + if (beta->r == 0. && beta->i == 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + y[i__2].r = 0., y[i__2].i = 0.; + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3].r; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + } + } + } else { + iy = ky; + if (beta->r == 0. && beta->i == 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + y[i__2].r = 0., y[i__2].i = 0.; + iy += *incy; + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + i__3 = iy; + z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3].r; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + iy += *incy; + } + } + } + } + if (alpha->r == 0. && alpha->i == 0.) { + return 0; + } + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = i__ + j * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5].r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + i__3 = i__ + j * a_dim1; + i__4 = i__; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4].i, + z__2.i = a[i__3].r * x[i__4].i + a[i__3].i * x[i__4].r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; + } + i__2 = j; + i__3 = j; + i__4 = j + j * a_dim1; + z__3.r = temp1.r * a[i__4].r - temp1.i * a[i__4].i, + z__3.i = temp1.r * a[i__4].i + temp1.i * a[i__4].r; + z__2.r = y[i__3].r + z__3.r, z__2.i = y[i__3].i + z__3.i; + z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, + z__4.i = alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + } + } else { + jx = kx; + jy = ky; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + ix = kx; + iy = ky; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = iy; + i__4 = iy; + i__5 = i__ + j * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5].r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + i__3 = i__ + j * a_dim1; + i__4 = ix; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4].i, + z__2.i = a[i__3].r * x[i__4].i + a[i__3].i * x[i__4].r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; + ix += *incx; + iy += *incy; + } + i__2 = jy; + i__3 = jy; + i__4 = j + j * a_dim1; + z__3.r = temp1.r * a[i__4].r - temp1.i * a[i__4].i, + z__3.i = temp1.r * a[i__4].i + temp1.i * a[i__4].r; + z__2.r = y[i__3].r + z__3.r, z__2.i = y[i__3].i + z__3.i; + z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, + z__4.i = alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + jx += *incx; + jy += *incy; + } + } + } else { + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + i__2 = j; + i__3 = j; + i__4 = j + j * a_dim1; + z__2.r = temp1.r * a[i__4].r - temp1.i * a[i__4].i, + z__2.i = temp1.r * a[i__4].i + temp1.i * a[i__4].r; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = i__ + j * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5].r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + i__3 = i__ + j * a_dim1; + i__4 = i__; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4].i, + z__2.i = a[i__3].r * x[i__4].i + a[i__3].i * x[i__4].r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; + } + i__2 = j; + i__3 = j; + z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, + z__2.i = alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + } + } else { + jx = kx; + jy = ky; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + i__2 = jy; + i__3 = jy; + i__4 = j + j * a_dim1; + z__2.r = temp1.r * a[i__4].r - temp1.i * a[i__4].i, + z__2.i = temp1.r * a[i__4].i + temp1.i * a[i__4].r; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + ix = jx; + iy = jy; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + iy += *incy; + i__3 = iy; + i__4 = iy; + i__5 = i__ + j * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5].r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + i__3 = i__ + j * a_dim1; + i__4 = ix; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4].i, + z__2.i = a[i__3].r * x[i__4].i + a[i__3].i * x[i__4].r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; + } + i__2 = jy; + i__3 = jy; + z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, + z__2.i = alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + jx += *incx; + jy += *incy; + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zsyr.cpp b/lib/linalg/zsyr.cpp new file mode 100644 index 0000000000..5e79f28d94 --- /dev/null +++ b/lib/linalg/zsyr.cpp @@ -0,0 +1,141 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int zsyr_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, + doublecomplex *a, integer *lda, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1, z__2; + integer i__, j, ix, jx, kx, info; + doublecomplex temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + --x; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + info = 0; + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (*n < 0) { + info = 2; + } else if (*incx == 0) { + info = 5; + } else if (*lda < max(1, *n)) { + info = 7; + } + if (info != 0) { + xerbla_((char *)"ZSYR ", &info, (ftnlen)6); + return 0; + } + if (*n == 0 || alpha->r == 0. && alpha->i == 0.) { + return 0; + } + if (*incx <= 0) { + kx = 1 - (*n - 1) * *incx; + } else if (*incx != 1) { + kx = 1; + } + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + i__2 = j; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = i__; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + } + } + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + i__2 = jx; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + ix = kx; + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = ix; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + ix += *incx; + } + } + jx += *incx; + } + } + } else { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + i__2 = j; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = i__; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + } + } + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + i__2 = jx; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + ix = jx; + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = ix; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + ix += *incx; + } + } + jx += *incx; + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zsytf2.cpp b/lib/linalg/zsytf2.cpp new file mode 100644 index 0000000000..bce7b51f1d --- /dev/null +++ b/lib/linalg/zsytf2.cpp @@ -0,0 +1,356 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static integer c__1 = 1; +int zsytf2_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, integer *info, + ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5, i__6; + doublereal d__1, d__2, d__3, d__4; + doublecomplex z__1, z__2, z__3, z__4; + double sqrt(doublereal), d_lmp_imag(doublecomplex *); + void z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *); + integer i__, j, k; + doublecomplex t, r1, d11, d12, d21, d22; + integer kk, kp; + doublecomplex wk, wkm1, wkp1; + integer imax, jmax; + extern int zsyr_(char *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen); + doublereal alpha; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int zscal_(integer *, doublecomplex *, doublecomplex *, integer *); + integer kstep; + logical upper; + extern int zswap_(integer *, doublecomplex *, integer *, doublecomplex *, integer *); + doublereal absakk; + extern logical disnan_(doublereal *); + extern int xerbla_(char *, integer *, ftnlen); + doublereal colmax; + extern integer izamax_(integer *, doublecomplex *, integer *); + doublereal rowmax; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZSYTF2", &i__1, (ftnlen)6); + return 0; + } + alpha = (sqrt(17.) + 1.) / 8.; + if (upper) { + k = *n; + L10: + if (k < 1) { + goto L70; + } + kstep = 1; + i__1 = k + k * a_dim1; + absakk = (d__1 = a[i__1].r, abs(d__1)) + (d__2 = d_lmp_imag(&a[k + k * a_dim1]), abs(d__2)); + if (k > 1) { + i__1 = k - 1; + imax = izamax_(&i__1, &a[k * a_dim1 + 1], &c__1); + i__1 = imax + k * a_dim1; + colmax = + (d__1 = a[i__1].r, abs(d__1)) + (d__2 = d_lmp_imag(&a[imax + k * a_dim1]), abs(d__2)); + } else { + colmax = 0.; + } + if (max(absakk, colmax) == 0. || disnan_(&absakk)) { + if (*info == 0) { + *info = k; + } + kp = k; + } else { + if (absakk >= alpha * colmax) { + kp = k; + } else { + i__1 = k - imax; + jmax = imax + izamax_(&i__1, &a[imax + (imax + 1) * a_dim1], lda); + i__1 = imax + jmax * a_dim1; + rowmax = (d__1 = a[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&a[imax + jmax * a_dim1]), abs(d__2)); + if (imax > 1) { + i__1 = imax - 1; + jmax = izamax_(&i__1, &a[imax * a_dim1 + 1], &c__1); + i__1 = jmax + imax * a_dim1; + d__3 = rowmax, d__4 = (d__1 = a[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&a[jmax + imax * a_dim1]), abs(d__2)); + rowmax = max(d__3, d__4); + } + if (absakk >= alpha * colmax * (colmax / rowmax)) { + kp = k; + } else { + i__1 = imax + imax * a_dim1; + if ((d__1 = a[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&a[imax + imax * a_dim1]), abs(d__2)) >= + alpha * rowmax) { + kp = imax; + } else { + kp = imax; + kstep = 2; + } + } + } + kk = k - kstep + 1; + if (kp != kk) { + i__1 = kp - 1; + zswap_(&i__1, &a[kk * a_dim1 + 1], &c__1, &a[kp * a_dim1 + 1], &c__1); + i__1 = kk - kp - 1; + zswap_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + (kp + 1) * a_dim1], lda); + i__1 = kk + kk * a_dim1; + t.r = a[i__1].r, t.i = a[i__1].i; + i__1 = kk + kk * a_dim1; + i__2 = kp + kp * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + kp * a_dim1; + a[i__1].r = t.r, a[i__1].i = t.i; + if (kstep == 2) { + i__1 = k - 1 + k * a_dim1; + t.r = a[i__1].r, t.i = a[i__1].i; + i__1 = k - 1 + k * a_dim1; + i__2 = kp + k * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + k * a_dim1; + a[i__1].r = t.r, a[i__1].i = t.i; + } + } + if (kstep == 1) { + z_lmp_div(&z__1, &c_b1, &a[k + k * a_dim1]); + r1.r = z__1.r, r1.i = z__1.i; + i__1 = k - 1; + z__1.r = -r1.r, z__1.i = -r1.i; + zsyr_(uplo, &i__1, &z__1, &a[k * a_dim1 + 1], &c__1, &a[a_offset], lda, (ftnlen)1); + i__1 = k - 1; + zscal_(&i__1, &r1, &a[k * a_dim1 + 1], &c__1); + } else { + if (k > 2) { + i__1 = k - 1 + k * a_dim1; + d12.r = a[i__1].r, d12.i = a[i__1].i; + z_lmp_div(&z__1, &a[k - 1 + (k - 1) * a_dim1], &d12); + d22.r = z__1.r, d22.i = z__1.i; + z_lmp_div(&z__1, &a[k + k * a_dim1], &d12); + d11.r = z__1.r, d11.i = z__1.i; + z__3.r = d11.r * d22.r - d11.i * d22.i, z__3.i = d11.r * d22.i + d11.i * d22.r; + z__2.r = z__3.r - 1., z__2.i = z__3.i - 0.; + z_lmp_div(&z__1, &c_b1, &z__2); + t.r = z__1.r, t.i = z__1.i; + z_lmp_div(&z__1, &t, &d12); + d12.r = z__1.r, d12.i = z__1.i; + for (j = k - 2; j >= 1; --j) { + i__1 = j + (k - 1) * a_dim1; + z__3.r = d11.r * a[i__1].r - d11.i * a[i__1].i, + z__3.i = d11.r * a[i__1].i + d11.i * a[i__1].r; + i__2 = j + k * a_dim1; + z__2.r = z__3.r - a[i__2].r, z__2.i = z__3.i - a[i__2].i; + z__1.r = d12.r * z__2.r - d12.i * z__2.i, + z__1.i = d12.r * z__2.i + d12.i * z__2.r; + wkm1.r = z__1.r, wkm1.i = z__1.i; + i__1 = j + k * a_dim1; + z__3.r = d22.r * a[i__1].r - d22.i * a[i__1].i, + z__3.i = d22.r * a[i__1].i + d22.i * a[i__1].r; + i__2 = j + (k - 1) * a_dim1; + z__2.r = z__3.r - a[i__2].r, z__2.i = z__3.i - a[i__2].i; + z__1.r = d12.r * z__2.r - d12.i * z__2.i, + z__1.i = d12.r * z__2.i + d12.i * z__2.r; + wk.r = z__1.r, wk.i = z__1.i; + for (i__ = j; i__ >= 1; --i__) { + i__1 = i__ + j * a_dim1; + i__2 = i__ + j * a_dim1; + i__3 = i__ + k * a_dim1; + z__3.r = a[i__3].r * wk.r - a[i__3].i * wk.i, + z__3.i = a[i__3].r * wk.i + a[i__3].i * wk.r; + z__2.r = a[i__2].r - z__3.r, z__2.i = a[i__2].i - z__3.i; + i__4 = i__ + (k - 1) * a_dim1; + z__4.r = a[i__4].r * wkm1.r - a[i__4].i * wkm1.i, + z__4.i = a[i__4].r * wkm1.i + a[i__4].i * wkm1.r; + z__1.r = z__2.r - z__4.r, z__1.i = z__2.i - z__4.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + } + i__1 = j + k * a_dim1; + a[i__1].r = wk.r, a[i__1].i = wk.i; + i__1 = j + (k - 1) * a_dim1; + a[i__1].r = wkm1.r, a[i__1].i = wkm1.i; + } + } + } + } + if (kstep == 1) { + ipiv[k] = kp; + } else { + ipiv[k] = -kp; + ipiv[k - 1] = -kp; + } + k -= kstep; + goto L10; + } else { + k = 1; + L40: + if (k > *n) { + goto L70; + } + kstep = 1; + i__1 = k + k * a_dim1; + absakk = (d__1 = a[i__1].r, abs(d__1)) + (d__2 = d_lmp_imag(&a[k + k * a_dim1]), abs(d__2)); + if (k < *n) { + i__1 = *n - k; + imax = k + izamax_(&i__1, &a[k + 1 + k * a_dim1], &c__1); + i__1 = imax + k * a_dim1; + colmax = + (d__1 = a[i__1].r, abs(d__1)) + (d__2 = d_lmp_imag(&a[imax + k * a_dim1]), abs(d__2)); + } else { + colmax = 0.; + } + if (max(absakk, colmax) == 0. || disnan_(&absakk)) { + if (*info == 0) { + *info = k; + } + kp = k; + } else { + if (absakk >= alpha * colmax) { + kp = k; + } else { + i__1 = imax - k; + jmax = k - 1 + izamax_(&i__1, &a[imax + k * a_dim1], lda); + i__1 = imax + jmax * a_dim1; + rowmax = (d__1 = a[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&a[imax + jmax * a_dim1]), abs(d__2)); + if (imax < *n) { + i__1 = *n - imax; + jmax = imax + izamax_(&i__1, &a[imax + 1 + imax * a_dim1], &c__1); + i__1 = jmax + imax * a_dim1; + d__3 = rowmax, d__4 = (d__1 = a[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&a[jmax + imax * a_dim1]), abs(d__2)); + rowmax = max(d__3, d__4); + } + if (absakk >= alpha * colmax * (colmax / rowmax)) { + kp = k; + } else { + i__1 = imax + imax * a_dim1; + if ((d__1 = a[i__1].r, abs(d__1)) + + (d__2 = d_lmp_imag(&a[imax + imax * a_dim1]), abs(d__2)) >= + alpha * rowmax) { + kp = imax; + } else { + kp = imax; + kstep = 2; + } + } + } + kk = k + kstep - 1; + if (kp != kk) { + if (kp < *n) { + i__1 = *n - kp; + zswap_(&i__1, &a[kp + 1 + kk * a_dim1], &c__1, &a[kp + 1 + kp * a_dim1], &c__1); + } + i__1 = kp - kk - 1; + zswap_(&i__1, &a[kk + 1 + kk * a_dim1], &c__1, &a[kp + (kk + 1) * a_dim1], lda); + i__1 = kk + kk * a_dim1; + t.r = a[i__1].r, t.i = a[i__1].i; + i__1 = kk + kk * a_dim1; + i__2 = kp + kp * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + kp * a_dim1; + a[i__1].r = t.r, a[i__1].i = t.i; + if (kstep == 2) { + i__1 = k + 1 + k * a_dim1; + t.r = a[i__1].r, t.i = a[i__1].i; + i__1 = k + 1 + k * a_dim1; + i__2 = kp + k * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + k * a_dim1; + a[i__1].r = t.r, a[i__1].i = t.i; + } + } + if (kstep == 1) { + if (k < *n) { + z_lmp_div(&z__1, &c_b1, &a[k + k * a_dim1]); + r1.r = z__1.r, r1.i = z__1.i; + i__1 = *n - k; + z__1.r = -r1.r, z__1.i = -r1.i; + zsyr_(uplo, &i__1, &z__1, &a[k + 1 + k * a_dim1], &c__1, + &a[k + 1 + (k + 1) * a_dim1], lda, (ftnlen)1); + i__1 = *n - k; + zscal_(&i__1, &r1, &a[k + 1 + k * a_dim1], &c__1); + } + } else { + if (k < *n - 1) { + i__1 = k + 1 + k * a_dim1; + d21.r = a[i__1].r, d21.i = a[i__1].i; + z_lmp_div(&z__1, &a[k + 1 + (k + 1) * a_dim1], &d21); + d11.r = z__1.r, d11.i = z__1.i; + z_lmp_div(&z__1, &a[k + k * a_dim1], &d21); + d22.r = z__1.r, d22.i = z__1.i; + z__3.r = d11.r * d22.r - d11.i * d22.i, z__3.i = d11.r * d22.i + d11.i * d22.r; + z__2.r = z__3.r - 1., z__2.i = z__3.i - 0.; + z_lmp_div(&z__1, &c_b1, &z__2); + t.r = z__1.r, t.i = z__1.i; + z_lmp_div(&z__1, &t, &d21); + d21.r = z__1.r, d21.i = z__1.i; + i__1 = *n; + for (j = k + 2; j <= i__1; ++j) { + i__2 = j + k * a_dim1; + z__3.r = d11.r * a[i__2].r - d11.i * a[i__2].i, + z__3.i = d11.r * a[i__2].i + d11.i * a[i__2].r; + i__3 = j + (k + 1) * a_dim1; + z__2.r = z__3.r - a[i__3].r, z__2.i = z__3.i - a[i__3].i; + z__1.r = d21.r * z__2.r - d21.i * z__2.i, + z__1.i = d21.r * z__2.i + d21.i * z__2.r; + wk.r = z__1.r, wk.i = z__1.i; + i__2 = j + (k + 1) * a_dim1; + z__3.r = d22.r * a[i__2].r - d22.i * a[i__2].i, + z__3.i = d22.r * a[i__2].i + d22.i * a[i__2].r; + i__3 = j + k * a_dim1; + z__2.r = z__3.r - a[i__3].r, z__2.i = z__3.i - a[i__3].i; + z__1.r = d21.r * z__2.r - d21.i * z__2.i, + z__1.i = d21.r * z__2.i + d21.i * z__2.r; + wkp1.r = z__1.r, wkp1.i = z__1.i; + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = i__ + k * a_dim1; + z__3.r = a[i__5].r * wk.r - a[i__5].i * wk.i, + z__3.i = a[i__5].r * wk.i + a[i__5].i * wk.r; + z__2.r = a[i__4].r - z__3.r, z__2.i = a[i__4].i - z__3.i; + i__6 = i__ + (k + 1) * a_dim1; + z__4.r = a[i__6].r * wkp1.r - a[i__6].i * wkp1.i, + z__4.i = a[i__6].r * wkp1.i + a[i__6].i * wkp1.r; + z__1.r = z__2.r - z__4.r, z__1.i = z__2.i - z__4.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + } + i__2 = j + k * a_dim1; + a[i__2].r = wk.r, a[i__2].i = wk.i; + i__2 = j + (k + 1) * a_dim1; + a[i__2].r = wkp1.r, a[i__2].i = wkp1.i; + } + } + } + } + if (kstep == 1) { + ipiv[k] = kp; + } else { + ipiv[k] = -kp; + ipiv[k + 1] = -kp; + } + k += kstep; + goto L40; + } +L70: + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zsytrf.cpp b/lib/linalg/zsytrf.cpp new file mode 100644 index 0000000000..178193fbaa --- /dev/null +++ b/lib/linalg/zsytrf.cpp @@ -0,0 +1,124 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +int zsytrf_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, + doublecomplex *work, integer *lwork, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2; + integer j, k, kb, nb, iws; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nbmin, iinfo; + logical upper; + extern int zsytf2_(char *, integer *, doublecomplex *, integer *, integer *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + integer ldwork; + extern int zlasyf_(char *, integer *, integer *, integer *, doublecomplex *, integer *, + integer *, doublecomplex *, integer *, integer *, ftnlen); + integer lwkopt; + logical lquery; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + --work; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } else if (*lwork < 1 && !lquery) { + *info = -7; + } + if (*info == 0) { + nb = ilaenv_(&c__1, (char *)"ZSYTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + lwkopt = *n * nb; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZSYTRF", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + nbmin = 2; + ldwork = *n; + if (nb > 1 && nb < *n) { + iws = ldwork * nb; + if (*lwork < iws) { + i__1 = *lwork / ldwork; + nb = max(i__1, 1); + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"ZSYTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); + } + } else { + iws = 1; + } + if (nb < nbmin) { + nb = *n; + } + if (upper) { + k = *n; + L10: + if (k < 1) { + goto L40; + } + if (k > nb) { + zlasyf_(uplo, &k, &nb, &kb, &a[a_offset], lda, &ipiv[1], &work[1], n, &iinfo, + (ftnlen)1); + } else { + zsytf2_(uplo, &k, &a[a_offset], lda, &ipiv[1], &iinfo, (ftnlen)1); + kb = k; + } + if (*info == 0 && iinfo > 0) { + *info = iinfo; + } + k -= kb; + goto L10; + } else { + k = 1; + L20: + if (k > *n) { + goto L40; + } + if (k <= *n - nb) { + i__1 = *n - k + 1; + zlasyf_(uplo, &i__1, &nb, &kb, &a[k + k * a_dim1], lda, &ipiv[k], &work[1], n, &iinfo, + (ftnlen)1); + } else { + i__1 = *n - k + 1; + zsytf2_(uplo, &i__1, &a[k + k * a_dim1], lda, &ipiv[k], &iinfo, (ftnlen)1); + kb = *n - k + 1; + } + if (*info == 0 && iinfo > 0) { + *info = iinfo + k - 1; + } + i__1 = k + kb - 1; + for (j = k; j <= i__1; ++j) { + if (ipiv[j] > 0) { + ipiv[j] = ipiv[j] + k - 1; + } else { + ipiv[j] = ipiv[j] - k + 1; + } + } + k += kb; + goto L20; + } +L40: + work[1].r = (doublereal)lwkopt, work[1].i = 0.; + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/zsytri.cpp b/lib/linalg/zsytri.cpp new file mode 100644 index 0000000000..3f7d4dea0f --- /dev/null +++ b/lib/linalg/zsytri.cpp @@ -0,0 +1,292 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static doublecomplex c_b2 = {0., 0.}; +static integer c__1 = 1; +int zsytri_(char *uplo, integer *n, doublecomplex *a, integer *lda, integer *ipiv, + doublecomplex *work, integer *info, ftnlen uplo_len) +{ + integer a_dim1, a_offset, i__1, i__2, i__3; + doublecomplex z__1, z__2, z__3; + void z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *); + doublecomplex d__; + integer k; + doublecomplex t, ak; + integer kp; + doublecomplex akp1, temp, akkp1; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer kstep; + logical upper; + extern int zcopy_(integer *, doublecomplex *, integer *, doublecomplex *, integer *); + extern VOID zdotu_(doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *); + extern int zswap_(integer *, doublecomplex *, integer *, doublecomplex *, integer *), + zsymv_(char *, integer *, doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *, doublecomplex *, doublecomplex *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + --work; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1, *n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZSYTRI", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + if (upper) { + for (*info = *n; *info >= 1; --(*info)) { + i__1 = *info + *info * a_dim1; + if (ipiv[*info] > 0 && (a[i__1].r == 0. && a[i__1].i == 0.)) { + return 0; + } + } + } else { + i__1 = *n; + for (*info = 1; *info <= i__1; ++(*info)) { + i__2 = *info + *info * a_dim1; + if (ipiv[*info] > 0 && (a[i__2].r == 0. && a[i__2].i == 0.)) { + return 0; + } + } + } + *info = 0; + if (upper) { + k = 1; + L30: + if (k > *n) { + goto L40; + } + if (ipiv[k] > 0) { + i__1 = k + k * a_dim1; + z_lmp_div(&z__1, &c_b1, &a[k + k * a_dim1]); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + if (k > 1) { + i__1 = k - 1; + zcopy_(&i__1, &a[k * a_dim1 + 1], &c__1, &work[1], &c__1); + i__1 = k - 1; + z__1.r = -1., z__1.i = -0.; + zsymv_(uplo, &i__1, &z__1, &a[a_offset], lda, &work[1], &c__1, &c_b2, + &a[k * a_dim1 + 1], &c__1, (ftnlen)1); + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + i__3 = k - 1; + zdotu_(&z__2, &i__3, &work[1], &c__1, &a[k * a_dim1 + 1], &c__1); + z__1.r = a[i__2].r - z__2.r, z__1.i = a[i__2].i - z__2.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + } + kstep = 1; + } else { + i__1 = k + (k + 1) * a_dim1; + t.r = a[i__1].r, t.i = a[i__1].i; + z_lmp_div(&z__1, &a[k + k * a_dim1], &t); + ak.r = z__1.r, ak.i = z__1.i; + z_lmp_div(&z__1, &a[k + 1 + (k + 1) * a_dim1], &t); + akp1.r = z__1.r, akp1.i = z__1.i; + z_lmp_div(&z__1, &a[k + (k + 1) * a_dim1], &t); + akkp1.r = z__1.r, akkp1.i = z__1.i; + z__3.r = ak.r * akp1.r - ak.i * akp1.i, z__3.i = ak.r * akp1.i + ak.i * akp1.r; + z__2.r = z__3.r - 1., z__2.i = z__3.i - 0.; + z__1.r = t.r * z__2.r - t.i * z__2.i, z__1.i = t.r * z__2.i + t.i * z__2.r; + d__.r = z__1.r, d__.i = z__1.i; + i__1 = k + k * a_dim1; + z_lmp_div(&z__1, &akp1, &d__); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = k + 1 + (k + 1) * a_dim1; + z_lmp_div(&z__1, &ak, &d__); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = k + (k + 1) * a_dim1; + z__2.r = -akkp1.r, z__2.i = -akkp1.i; + z_lmp_div(&z__1, &z__2, &d__); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + if (k > 1) { + i__1 = k - 1; + zcopy_(&i__1, &a[k * a_dim1 + 1], &c__1, &work[1], &c__1); + i__1 = k - 1; + z__1.r = -1., z__1.i = -0.; + zsymv_(uplo, &i__1, &z__1, &a[a_offset], lda, &work[1], &c__1, &c_b2, + &a[k * a_dim1 + 1], &c__1, (ftnlen)1); + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + i__3 = k - 1; + zdotu_(&z__2, &i__3, &work[1], &c__1, &a[k * a_dim1 + 1], &c__1); + z__1.r = a[i__2].r - z__2.r, z__1.i = a[i__2].i - z__2.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = k + (k + 1) * a_dim1; + i__2 = k + (k + 1) * a_dim1; + i__3 = k - 1; + zdotu_(&z__2, &i__3, &a[k * a_dim1 + 1], &c__1, &a[(k + 1) * a_dim1 + 1], &c__1); + z__1.r = a[i__2].r - z__2.r, z__1.i = a[i__2].i - z__2.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = k - 1; + zcopy_(&i__1, &a[(k + 1) * a_dim1 + 1], &c__1, &work[1], &c__1); + i__1 = k - 1; + z__1.r = -1., z__1.i = -0.; + zsymv_(uplo, &i__1, &z__1, &a[a_offset], lda, &work[1], &c__1, &c_b2, + &a[(k + 1) * a_dim1 + 1], &c__1, (ftnlen)1); + i__1 = k + 1 + (k + 1) * a_dim1; + i__2 = k + 1 + (k + 1) * a_dim1; + i__3 = k - 1; + zdotu_(&z__2, &i__3, &work[1], &c__1, &a[(k + 1) * a_dim1 + 1], &c__1); + z__1.r = a[i__2].r - z__2.r, z__1.i = a[i__2].i - z__2.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + } + kstep = 2; + } + kp = (i__1 = ipiv[k], abs(i__1)); + if (kp != k) { + i__1 = kp - 1; + zswap_(&i__1, &a[k * a_dim1 + 1], &c__1, &a[kp * a_dim1 + 1], &c__1); + i__1 = k - kp - 1; + zswap_(&i__1, &a[kp + 1 + k * a_dim1], &c__1, &a[kp + (kp + 1) * a_dim1], lda); + i__1 = k + k * a_dim1; + temp.r = a[i__1].r, temp.i = a[i__1].i; + i__1 = k + k * a_dim1; + i__2 = kp + kp * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + kp * a_dim1; + a[i__1].r = temp.r, a[i__1].i = temp.i; + if (kstep == 2) { + i__1 = k + (k + 1) * a_dim1; + temp.r = a[i__1].r, temp.i = a[i__1].i; + i__1 = k + (k + 1) * a_dim1; + i__2 = kp + (k + 1) * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + (k + 1) * a_dim1; + a[i__1].r = temp.r, a[i__1].i = temp.i; + } + } + k += kstep; + goto L30; + L40:; + } else { + k = *n; + L50: + if (k < 1) { + goto L60; + } + if (ipiv[k] > 0) { + i__1 = k + k * a_dim1; + z_lmp_div(&z__1, &c_b1, &a[k + k * a_dim1]); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + if (k < *n) { + i__1 = *n - k; + zcopy_(&i__1, &a[k + 1 + k * a_dim1], &c__1, &work[1], &c__1); + i__1 = *n - k; + z__1.r = -1., z__1.i = -0.; + zsymv_(uplo, &i__1, &z__1, &a[k + 1 + (k + 1) * a_dim1], lda, &work[1], &c__1, + &c_b2, &a[k + 1 + k * a_dim1], &c__1, (ftnlen)1); + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + i__3 = *n - k; + zdotu_(&z__2, &i__3, &work[1], &c__1, &a[k + 1 + k * a_dim1], &c__1); + z__1.r = a[i__2].r - z__2.r, z__1.i = a[i__2].i - z__2.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + } + kstep = 1; + } else { + i__1 = k + (k - 1) * a_dim1; + t.r = a[i__1].r, t.i = a[i__1].i; + z_lmp_div(&z__1, &a[k - 1 + (k - 1) * a_dim1], &t); + ak.r = z__1.r, ak.i = z__1.i; + z_lmp_div(&z__1, &a[k + k * a_dim1], &t); + akp1.r = z__1.r, akp1.i = z__1.i; + z_lmp_div(&z__1, &a[k + (k - 1) * a_dim1], &t); + akkp1.r = z__1.r, akkp1.i = z__1.i; + z__3.r = ak.r * akp1.r - ak.i * akp1.i, z__3.i = ak.r * akp1.i + ak.i * akp1.r; + z__2.r = z__3.r - 1., z__2.i = z__3.i - 0.; + z__1.r = t.r * z__2.r - t.i * z__2.i, z__1.i = t.r * z__2.i + t.i * z__2.r; + d__.r = z__1.r, d__.i = z__1.i; + i__1 = k - 1 + (k - 1) * a_dim1; + z_lmp_div(&z__1, &akp1, &d__); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = k + k * a_dim1; + z_lmp_div(&z__1, &ak, &d__); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = k + (k - 1) * a_dim1; + z__2.r = -akkp1.r, z__2.i = -akkp1.i; + z_lmp_div(&z__1, &z__2, &d__); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + if (k < *n) { + i__1 = *n - k; + zcopy_(&i__1, &a[k + 1 + k * a_dim1], &c__1, &work[1], &c__1); + i__1 = *n - k; + z__1.r = -1., z__1.i = -0.; + zsymv_(uplo, &i__1, &z__1, &a[k + 1 + (k + 1) * a_dim1], lda, &work[1], &c__1, + &c_b2, &a[k + 1 + k * a_dim1], &c__1, (ftnlen)1); + i__1 = k + k * a_dim1; + i__2 = k + k * a_dim1; + i__3 = *n - k; + zdotu_(&z__2, &i__3, &work[1], &c__1, &a[k + 1 + k * a_dim1], &c__1); + z__1.r = a[i__2].r - z__2.r, z__1.i = a[i__2].i - z__2.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = k + (k - 1) * a_dim1; + i__2 = k + (k - 1) * a_dim1; + i__3 = *n - k; + zdotu_(&z__2, &i__3, &a[k + 1 + k * a_dim1], &c__1, &a[k + 1 + (k - 1) * a_dim1], + &c__1); + z__1.r = a[i__2].r - z__2.r, z__1.i = a[i__2].i - z__2.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = *n - k; + zcopy_(&i__1, &a[k + 1 + (k - 1) * a_dim1], &c__1, &work[1], &c__1); + i__1 = *n - k; + z__1.r = -1., z__1.i = -0.; + zsymv_(uplo, &i__1, &z__1, &a[k + 1 + (k + 1) * a_dim1], lda, &work[1], &c__1, + &c_b2, &a[k + 1 + (k - 1) * a_dim1], &c__1, (ftnlen)1); + i__1 = k - 1 + (k - 1) * a_dim1; + i__2 = k - 1 + (k - 1) * a_dim1; + i__3 = *n - k; + zdotu_(&z__2, &i__3, &work[1], &c__1, &a[k + 1 + (k - 1) * a_dim1], &c__1); + z__1.r = a[i__2].r - z__2.r, z__1.i = a[i__2].i - z__2.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + } + kstep = 2; + } + kp = (i__1 = ipiv[k], abs(i__1)); + if (kp != k) { + if (kp < *n) { + i__1 = *n - kp; + zswap_(&i__1, &a[kp + 1 + k * a_dim1], &c__1, &a[kp + 1 + kp * a_dim1], &c__1); + } + i__1 = kp - k - 1; + zswap_(&i__1, &a[k + 1 + k * a_dim1], &c__1, &a[kp + (k + 1) * a_dim1], lda); + i__1 = k + k * a_dim1; + temp.r = a[i__1].r, temp.i = a[i__1].i; + i__1 = k + k * a_dim1; + i__2 = kp + kp * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + kp * a_dim1; + a[i__1].r = temp.r, a[i__1].i = temp.i; + if (kstep == 2) { + i__1 = k + (k - 1) * a_dim1; + temp.r = a[i__1].r, temp.i = a[i__1].i; + i__1 = k + (k - 1) * a_dim1; + i__2 = kp + (k - 1) * a_dim1; + a[i__1].r = a[i__2].r, a[i__1].i = a[i__2].i; + i__1 = kp + (k - 1) * a_dim1; + a[i__1].r = temp.r, a[i__1].i = temp.i; + } + } + k -= kstep; + goto L50; + L60:; + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/ztrsm.cpp b/lib/linalg/ztrsm.cpp new file mode 100644 index 0000000000..160b65974a --- /dev/null +++ b/lib/linalg/ztrsm.cpp @@ -0,0 +1,443 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +int ztrsm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, + doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + ftnlen side_len, ftnlen uplo_len, ftnlen transa_len, ftnlen diag_len) +{ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4, i__5, i__6, i__7; + doublecomplex z__1, z__2, z__3; + void z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *), + d_lmp_cnjg(doublecomplex *, doublecomplex *); + integer i__, j, k, info; + doublecomplex temp; + logical lside; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nrowa; + logical upper; + extern int xerbla_(char *, integer *, ftnlen); + logical noconj, nounit; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + lside = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + if (lside) { + nrowa = *m; + } else { + nrowa = *n; + } + noconj = lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1); + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + info = 0; + if (!lside && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 2; + } else if (!lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(transa, (char *)"C", (ftnlen)1, (ftnlen)1)) { + info = 3; + } else if (!lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && + !lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 4; + } else if (*m < 0) { + info = 5; + } else if (*n < 0) { + info = 6; + } else if (*lda < max(1, nrowa)) { + info = 9; + } else if (*ldb < max(1, *m)) { + info = 11; + } + if (info != 0) { + xerbla_((char *)"ZTRSM ", &info, (ftnlen)6); + return 0; + } + if (*m == 0 || *n == 0) { + return 0; + } + if (alpha->r == 0. && alpha->i == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + b[i__3].r = 0., b[i__3].i = 0.; + } + } + return 0; + } + if (lside) { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (alpha->r != 1. || alpha->i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + z__1.r = alpha->r * b[i__4].r - alpha->i * b[i__4].i, + z__1.i = alpha->r * b[i__4].i + alpha->i * b[i__4].r; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } + for (k = *m; k >= 1; --k) { + i__2 = k + j * b_dim1; + if (b[i__2].r != 0. || b[i__2].i != 0.) { + if (nounit) { + i__2 = k + j * b_dim1; + z_lmp_div(&z__1, &b[k + j * b_dim1], &a[k + k * a_dim1]); + b[i__2].r = z__1.r, b[i__2].i = z__1.i; + } + i__2 = k - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + i__5 = k + j * b_dim1; + i__6 = i__ + k * a_dim1; + z__2.r = b[i__5].r * a[i__6].r - b[i__5].i * a[i__6].i, + z__2.i = b[i__5].r * a[i__6].i + b[i__5].i * a[i__6].r; + z__1.r = b[i__4].r - z__2.r, z__1.i = b[i__4].i - z__2.i; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } + } + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (alpha->r != 1. || alpha->i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + z__1.r = alpha->r * b[i__4].r - alpha->i * b[i__4].i, + z__1.i = alpha->r * b[i__4].i + alpha->i * b[i__4].r; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } + i__2 = *m; + for (k = 1; k <= i__2; ++k) { + i__3 = k + j * b_dim1; + if (b[i__3].r != 0. || b[i__3].i != 0.) { + if (nounit) { + i__3 = k + j * b_dim1; + z_lmp_div(&z__1, &b[k + j * b_dim1], &a[k + k * a_dim1]); + b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + i__3 = *m; + for (i__ = k + 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * b_dim1; + i__5 = i__ + j * b_dim1; + i__6 = k + j * b_dim1; + i__7 = i__ + k * a_dim1; + z__2.r = b[i__6].r * a[i__7].r - b[i__6].i * a[i__7].i, + z__2.i = b[i__6].r * a[i__7].i + b[i__6].i * a[i__7].r; + z__1.r = b[i__5].r - z__2.r, z__1.i = b[i__5].i - z__2.i; + b[i__4].r = z__1.r, b[i__4].i = z__1.i; + } + } + } + } + } + } else { + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, + z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3].r; + temp.r = z__1.r, temp.i = z__1.i; + if (noconj) { + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + i__4 = k + i__ * a_dim1; + i__5 = k + j * b_dim1; + z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * b[i__5].i, + z__2.i = a[i__4].r * b[i__5].i + a[i__4].i * b[i__5].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + } + if (nounit) { + z_lmp_div(&z__1, &temp, &a[i__ + i__ * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + d_lmp_cnjg(&z__3, &a[k + i__ * a_dim1]); + i__4 = k + j * b_dim1; + z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + } + if (nounit) { + d_lmp_cnjg(&z__2, &a[i__ + i__ * a_dim1]); + z_lmp_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__3 = i__ + j * b_dim1; + b[i__3].r = temp.r, b[i__3].i = temp.i; + } + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + i__2 = i__ + j * b_dim1; + z__1.r = alpha->r * b[i__2].r - alpha->i * b[i__2].i, + z__1.i = alpha->r * b[i__2].i + alpha->i * b[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + if (noconj) { + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + i__3 = k + i__ * a_dim1; + i__4 = k + j * b_dim1; + z__2.r = a[i__3].r * b[i__4].r - a[i__3].i * b[i__4].i, + z__2.i = a[i__3].r * b[i__4].i + a[i__3].i * b[i__4].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + } + if (nounit) { + z_lmp_div(&z__1, &temp, &a[i__ + i__ * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + d_lmp_cnjg(&z__3, &a[k + i__ * a_dim1]); + i__3 = k + j * b_dim1; + z__2.r = z__3.r * b[i__3].r - z__3.i * b[i__3].i, + z__2.i = z__3.r * b[i__3].i + z__3.i * b[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + } + if (nounit) { + d_lmp_cnjg(&z__2, &a[i__ + i__ * a_dim1]); + z_lmp_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__2 = i__ + j * b_dim1; + b[i__2].r = temp.r, b[i__2].i = temp.i; + } + } + } + } + } else { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (alpha->r != 1. || alpha->i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + z__1.r = alpha->r * b[i__4].r - alpha->i * b[i__4].i, + z__1.i = alpha->r * b[i__4].i + alpha->i * b[i__4].r; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } + i__2 = j - 1; + for (k = 1; k <= i__2; ++k) { + i__3 = k + j * a_dim1; + if (a[i__3].r != 0. || a[i__3].i != 0.) { + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * b_dim1; + i__5 = i__ + j * b_dim1; + i__6 = k + j * a_dim1; + i__7 = i__ + k * b_dim1; + z__2.r = a[i__6].r * b[i__7].r - a[i__6].i * b[i__7].i, + z__2.i = a[i__6].r * b[i__7].i + a[i__6].i * b[i__7].r; + z__1.r = b[i__5].r - z__2.r, z__1.i = b[i__5].i - z__2.i; + b[i__4].r = z__1.r, b[i__4].i = z__1.i; + } + } + } + if (nounit) { + z_lmp_div(&z__1, &c_b1, &a[j + j * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + z__1.r = temp.r * b[i__4].r - temp.i * b[i__4].i, + z__1.i = temp.r * b[i__4].i + temp.i * b[i__4].r; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } + } + } else { + for (j = *n; j >= 1; --j) { + if (alpha->r != 1. || alpha->i != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + j * b_dim1; + i__3 = i__ + j * b_dim1; + z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, + z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3].r; + b[i__2].r = z__1.r, b[i__2].i = z__1.i; + } + } + i__1 = *n; + for (k = j + 1; k <= i__1; ++k) { + i__2 = k + j * a_dim1; + if (a[i__2].r != 0. || a[i__2].i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + i__5 = k + j * a_dim1; + i__6 = i__ + k * b_dim1; + z__2.r = a[i__5].r * b[i__6].r - a[i__5].i * b[i__6].i, + z__2.i = a[i__5].r * b[i__6].i + a[i__5].i * b[i__6].r; + z__1.r = b[i__4].r - z__2.r, z__1.i = b[i__4].i - z__2.i; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } + } + if (nounit) { + z_lmp_div(&z__1, &c_b1, &a[j + j * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + j * b_dim1; + i__3 = i__ + j * b_dim1; + z__1.r = temp.r * b[i__3].r - temp.i * b[i__3].i, + z__1.i = temp.r * b[i__3].i + temp.i * b[i__3].r; + b[i__2].r = z__1.r, b[i__2].i = z__1.i; + } + } + } + } + } else { + if (upper) { + for (k = *n; k >= 1; --k) { + if (nounit) { + if (noconj) { + z_lmp_div(&z__1, &c_b1, &a[k + k * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + } else { + d_lmp_cnjg(&z__2, &a[k + k * a_dim1]); + z_lmp_div(&z__1, &c_b1, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + k * b_dim1; + i__3 = i__ + k * b_dim1; + z__1.r = temp.r * b[i__3].r - temp.i * b[i__3].i, + z__1.i = temp.r * b[i__3].i + temp.i * b[i__3].r; + b[i__2].r = z__1.r, b[i__2].i = z__1.i; + } + } + i__1 = k - 1; + for (j = 1; j <= i__1; ++j) { + i__2 = j + k * a_dim1; + if (a[i__2].r != 0. || a[i__2].i != 0.) { + if (noconj) { + i__2 = j + k * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + } else { + d_lmp_cnjg(&z__1, &a[j + k * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + i__5 = i__ + k * b_dim1; + z__2.r = temp.r * b[i__5].r - temp.i * b[i__5].i, + z__2.i = temp.r * b[i__5].i + temp.i * b[i__5].r; + z__1.r = b[i__4].r - z__2.r, z__1.i = b[i__4].i - z__2.i; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } + } + if (alpha->r != 1. || alpha->i != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + k * b_dim1; + i__3 = i__ + k * b_dim1; + z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, + z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3].r; + b[i__2].r = z__1.r, b[i__2].i = z__1.i; + } + } + } + } else { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + if (nounit) { + if (noconj) { + z_lmp_div(&z__1, &c_b1, &a[k + k * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + } else { + d_lmp_cnjg(&z__2, &a[k + k * a_dim1]); + z_lmp_div(&z__1, &c_b1, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + k * b_dim1; + i__4 = i__ + k * b_dim1; + z__1.r = temp.r * b[i__4].r - temp.i * b[i__4].i, + z__1.i = temp.r * b[i__4].i + temp.i * b[i__4].r; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } + i__2 = *n; + for (j = k + 1; j <= i__2; ++j) { + i__3 = j + k * a_dim1; + if (a[i__3].r != 0. || a[i__3].i != 0.) { + if (noconj) { + i__3 = j + k * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + } else { + d_lmp_cnjg(&z__1, &a[j + k * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * b_dim1; + i__5 = i__ + j * b_dim1; + i__6 = i__ + k * b_dim1; + z__2.r = temp.r * b[i__6].r - temp.i * b[i__6].i, + z__2.i = temp.r * b[i__6].i + temp.i * b[i__6].r; + z__1.r = b[i__5].r - z__2.r, z__1.i = b[i__5].i - z__2.i; + b[i__4].r = z__1.r, b[i__4].i = z__1.i; + } + } + } + if (alpha->r != 1. || alpha->i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + k * b_dim1; + i__4 = i__ + k * b_dim1; + z__1.r = alpha->r * b[i__4].r - alpha->i * b[i__4].i, + z__1.i = alpha->r * b[i__4].i + alpha->i * b[i__4].r; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } + } + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/ztrsv.cpp b/lib/linalg/ztrsv.cpp new file mode 100644 index 0000000000..324416d9e3 --- /dev/null +++ b/lib/linalg/ztrsv.cpp @@ -0,0 +1,330 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +int ztrsv_(char *uplo, char *trans, char *diag, integer *n, doublecomplex *a, integer *lda, + doublecomplex *x, integer *incx, ftnlen uplo_len, ftnlen trans_len, ftnlen diag_len) +{ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1, z__2, z__3; + void z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *), + d_lmp_cnjg(doublecomplex *, doublecomplex *); + integer i__, j, ix, jx, kx, info; + doublecomplex temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + logical noconj, nounit; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + info = 0; + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + info = 2; + } else if (!lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && + !lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*lda < max(1, *n)) { + info = 6; + } else if (*incx == 0) { + info = 8; + } + if (info != 0) { + xerbla_((char *)"ZTRSV ", &info, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + if (*incx <= 0) { + kx = 1 - (*n - 1) * *incx; + } else if (*incx != 1) { + kx = 1; + } + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + if (nounit) { + i__1 = j; + z_lmp_div(&z__1, &x[j], &a[j + j * a_dim1]); + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + for (i__ = j - 1; i__ >= 1; --i__) { + i__1 = i__; + i__2 = i__; + i__3 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__3].r - temp.i * a[i__3].i, + z__2.i = temp.r * a[i__3].i + temp.i * a[i__3].r; + z__1.r = x[i__2].r - z__2.r, z__1.i = x[i__2].i - z__2.i; + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + } + } + } else { + jx = kx + (*n - 1) * *incx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + if (nounit) { + i__1 = jx; + z_lmp_div(&z__1, &x[jx], &a[j + j * a_dim1]); + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = jx; + for (i__ = j - 1; i__ >= 1; --i__) { + ix -= *incx; + i__1 = ix; + i__2 = ix; + i__3 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__3].r - temp.i * a[i__3].i, + z__2.i = temp.r * a[i__3].i + temp.i * a[i__3].r; + z__1.r = x[i__2].r - z__2.r, z__1.i = x[i__2].i - z__2.i; + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + } + jx -= *incx; + } + } + } else { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + if (nounit) { + i__2 = j; + z_lmp_div(&z__1, &x[j], &a[j + j * a_dim1]); + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, + z__2.i = temp.r * a[i__5].i + temp.i * a[i__5].r; + z__1.r = x[i__4].r - z__2.r, z__1.i = x[i__4].i - z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; + } + } + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + if (nounit) { + i__2 = jx; + z_lmp_div(&z__1, &x[jx], &a[j + j * a_dim1]); + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = jx; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + i__3 = ix; + i__4 = ix; + i__5 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, + z__2.i = temp.r * a[i__5].i + temp.i * a[i__5].r; + z__1.r = x[i__4].r - z__2.r, z__1.i = x[i__4].i - z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; + } + } + jx += *incx; + } + } + } + } else { + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + if (noconj) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4].i, + z__2.i = a[i__3].r * x[i__4].i + a[i__3].i * x[i__4].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + } + if (nounit) { + z_lmp_div(&z__1, &temp, &a[j + j * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + } + if (nounit) { + d_lmp_cnjg(&z__2, &a[j + j * a_dim1]); + z_lmp_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__2 = j; + x[i__2].r = temp.r, x[i__2].i = temp.i; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + ix = kx; + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + if (noconj) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = ix; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4].i, + z__2.i = a[i__3].r * x[i__4].i + a[i__3].i * x[i__4].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix += *incx; + } + if (nounit) { + z_lmp_div(&z__1, &temp, &a[j + j * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix += *incx; + } + if (nounit) { + d_lmp_cnjg(&z__2, &a[j + j * a_dim1]); + z_lmp_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__2 = jx; + x[i__2].r = temp.r, x[i__2].i = temp.i; + jx += *incx; + } + } + } else { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + if (noconj) { + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + i__2 = i__ + j * a_dim1; + i__3 = i__; + z__2.r = a[i__2].r * x[i__3].r - a[i__2].i * x[i__3].i, + z__2.i = a[i__2].r * x[i__3].i + a[i__2].i * x[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + } + if (nounit) { + z_lmp_div(&z__1, &temp, &a[j + j * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__2 = i__; + z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, + z__2.i = z__3.r * x[i__2].i + z__3.i * x[i__2].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + } + if (nounit) { + d_lmp_cnjg(&z__2, &a[j + j * a_dim1]); + z_lmp_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__1 = j; + x[i__1].r = temp.r, x[i__1].i = temp.i; + } + } else { + kx += (*n - 1) * *incx; + jx = kx; + for (j = *n; j >= 1; --j) { + ix = kx; + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + if (noconj) { + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + i__2 = i__ + j * a_dim1; + i__3 = ix; + z__2.r = a[i__2].r * x[i__3].r - a[i__2].i * x[i__3].i, + z__2.i = a[i__2].r * x[i__3].i + a[i__2].i * x[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix -= *incx; + } + if (nounit) { + z_lmp_div(&z__1, &temp, &a[j + j * a_dim1]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__2 = ix; + z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, + z__2.i = z__3.r * x[i__2].i + z__3.i * x[i__2].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix -= *incx; + } + if (nounit) { + d_lmp_cnjg(&z__2, &a[j + j * a_dim1]); + z_lmp_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__1 = jx; + x[i__1].r = temp.r, x[i__1].i = temp.i; + jx -= *incx; + } + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/ztrti2.cpp b/lib/linalg/ztrti2.cpp new file mode 100644 index 0000000000..00cb4154b3 --- /dev/null +++ b/lib/linalg/ztrti2.cpp @@ -0,0 +1,88 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static integer c__1 = 1; +int ztrti2_(char *uplo, char *diag, integer *n, doublecomplex *a, integer *lda, integer *info, + ftnlen uplo_len, ftnlen diag_len) +{ + integer a_dim1, a_offset, i__1, i__2; + doublecomplex z__1; + void z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *); + integer j; + doublecomplex ajj; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern int zscal_(integer *, doublecomplex *, doublecomplex *, integer *); + logical upper; + extern int ztrmv_(char *, char *, char *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + logical nounit; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (!nounit && !lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1, *n)) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZTRTI2", &i__1, (ftnlen)6); + return 0; + } + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (nounit) { + i__2 = j + j * a_dim1; + z_lmp_div(&z__1, &c_b1, &a[j + j * a_dim1]); + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = j + j * a_dim1; + z__1.r = -a[i__2].r, z__1.i = -a[i__2].i; + ajj.r = z__1.r, ajj.i = z__1.i; + } else { + z__1.r = -1., z__1.i = -0.; + ajj.r = z__1.r, ajj.i = z__1.i; + } + i__2 = j - 1; + ztrmv_((char *)"Upper", (char *)"No transpose", diag, &i__2, &a[a_offset], lda, &a[j * a_dim1 + 1], + &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)1); + i__2 = j - 1; + zscal_(&i__2, &ajj, &a[j * a_dim1 + 1], &c__1); + } + } else { + for (j = *n; j >= 1; --j) { + if (nounit) { + i__1 = j + j * a_dim1; + z_lmp_div(&z__1, &c_b1, &a[j + j * a_dim1]); + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + i__1 = j + j * a_dim1; + z__1.r = -a[i__1].r, z__1.i = -a[i__1].i; + ajj.r = z__1.r, ajj.i = z__1.i; + } else { + z__1.r = -1., z__1.i = -0.; + ajj.r = z__1.r, ajj.i = z__1.i; + } + if (j < *n) { + i__1 = *n - j; + ztrmv_((char *)"Lower", (char *)"No transpose", diag, &i__1, &a[j + 1 + (j + 1) * a_dim1], lda, + &a[j + 1 + j * a_dim1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)1); + i__1 = *n - j; + zscal_(&i__1, &ajj, &a[j + 1 + j * a_dim1], &c__1); + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/lib/linalg/ztrtri.cpp b/lib/linalg/ztrtri.cpp new file mode 100644 index 0000000000..771d54adb7 --- /dev/null +++ b/lib/linalg/ztrtri.cpp @@ -0,0 +1,112 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" +static doublecomplex c_b1 = {1., 0.}; +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +int ztrtri_(char *uplo, char *diag, integer *n, doublecomplex *a, integer *lda, integer *info, + ftnlen uplo_len, ftnlen diag_len) +{ + address a__1[2]; + integer a_dim1, a_offset, i__1, i__2, i__3[2], i__4, i__5; + doublecomplex z__1; + char ch__1[2]; + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); + integer j, jb, nb, nn; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + logical upper; + extern int ztrmm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, + ftnlen, ftnlen), + ztrsm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + ztrti2_(char *, char *, integer *, doublecomplex *, integer *, integer *, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + logical nounit; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (!nounit && !lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1, *n)) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZTRTRI", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + if (nounit) { + i__1 = *n; + for (*info = 1; *info <= i__1; ++(*info)) { + i__2 = *info + *info * a_dim1; + if (a[i__2].r == 0. && a[i__2].i == 0.) { + return 0; + } + } + *info = 0; + } + i__3[0] = 1, a__1[0] = uplo; + i__3[1] = 1, a__1[1] = diag; + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"ZTRTRI", ch__1, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)2); + if (nb <= 1 || nb >= *n) { + ztrti2_(uplo, diag, n, &a[a_offset], lda, info, (ftnlen)1, (ftnlen)1); + } else { + if (upper) { + i__1 = *n; + i__2 = nb; + for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + i__4 = nb, i__5 = *n - j + 1; + jb = min(i__4, i__5); + i__4 = j - 1; + ztrmm_((char *)"Left", (char *)"Upper", (char *)"No transpose", diag, &i__4, &jb, &c_b1, &a[a_offset], lda, + &a[j * a_dim1 + 1], lda, (ftnlen)4, (ftnlen)5, (ftnlen)12, (ftnlen)1); + i__4 = j - 1; + z__1.r = -1., z__1.i = -0.; + ztrsm_((char *)"Right", (char *)"Upper", (char *)"No transpose", diag, &i__4, &jb, &z__1, + &a[j + j * a_dim1], lda, &a[j * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)5, + (ftnlen)12, (ftnlen)1); + ztrti2_((char *)"Upper", diag, &jb, &a[j + j * a_dim1], lda, info, (ftnlen)5, (ftnlen)1); + } + } else { + nn = (*n - 1) / nb * nb + 1; + i__2 = -nb; + for (j = nn; i__2 < 0 ? j >= 1 : j <= 1; j += i__2) { + i__1 = nb, i__4 = *n - j + 1; + jb = min(i__1, i__4); + if (j + jb <= *n) { + i__1 = *n - j - jb + 1; + ztrmm_((char *)"Left", (char *)"Lower", (char *)"No transpose", diag, &i__1, &jb, &c_b1, + &a[j + jb + (j + jb) * a_dim1], lda, &a[j + jb + j * a_dim1], lda, + (ftnlen)4, (ftnlen)5, (ftnlen)12, (ftnlen)1); + i__1 = *n - j - jb + 1; + z__1.r = -1., z__1.i = -0.; + ztrsm_((char *)"Right", (char *)"Lower", (char *)"No transpose", diag, &i__1, &jb, &z__1, + &a[j + j * a_dim1], lda, &a[j + jb + j * a_dim1], lda, (ftnlen)5, + (ftnlen)5, (ftnlen)12, (ftnlen)1); + } + ztrti2_((char *)"Lower", diag, &jb, &a[j + j * a_dim1], lda, info, (ftnlen)5, (ftnlen)1); + } + } + } + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/src/.gitignore b/src/.gitignore index b0c27849b2..f0554e3bfe 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -988,6 +988,8 @@ /fix_qeq_reaxff.h /fix_qmmm.cpp /fix_qmmm.h +/fix_qtpie_reaxff.cpp +/fix_qtpie_reaxff.h /fix_reaxff.cpp /fix_reaxff.h /fix_reaxff_bonds.cpp diff --git a/src/AMOEBA/angle_amoeba.cpp b/src/AMOEBA/angle_amoeba.cpp index 54fc3e9f9a..3b937568ff 100644 --- a/src/AMOEBA/angle_amoeba.cpp +++ b/src/AMOEBA/angle_amoeba.cpp @@ -868,3 +868,19 @@ double AngleAmoeba::single(int type, int i1, int i2, int i3) return energy; } + +/* ---------------------------------------------------------------------- + return ptr to internal members upon request +------------------------------------------------------------------------ */ + +void *AngleAmoeba::extract(const char *str, int &dim) +{ + dim = 1; + if (strcmp(str, "k2") == 0) return (void *) k2; + if (strcmp(str, "k3") == 0) return (void *) k3; + if (strcmp(str, "k4") == 0) return (void *) k4; + if (strcmp(str, "k5") == 0) return (void *) k5; + if (strcmp(str, "k6") == 0) return (void *) k6; + if (strcmp(str, "theta0") == 0) return (void *) theta0; + return nullptr; +} diff --git a/src/AMOEBA/angle_amoeba.h b/src/AMOEBA/angle_amoeba.h index 24cf12c50e..0110a1f1a4 100644 --- a/src/AMOEBA/angle_amoeba.h +++ b/src/AMOEBA/angle_amoeba.h @@ -36,6 +36,7 @@ class AngleAmoeba : public Angle { void read_restart(FILE *) override; void write_data(FILE *) override; double single(int, int, int, int) override; + void *extract(const char *, int &) override; protected: int *pflag, *ubflag; diff --git a/src/BPM/bond_bpm.cpp b/src/BPM/bond_bpm.cpp index 130080b349..24f8be8fd9 100644 --- a/src/BPM/bond_bpm.cpp +++ b/src/BPM/bond_bpm.cpp @@ -33,31 +33,32 @@ using namespace LAMMPS_NS; static const char cite_bpm[] = - "BPM bond style: doi:10.1039/D3SM01373A\n\n" - "@Article{Clemmer2024,\n" - " author = {Clemmer, Joel T. and Monti, Joseph M. and Lechman, Jeremy B.},\n" - " title = {A soft departure from jamming: the compaction of deformable\n" - " granular matter under high pressures},\n" - " journal = {Soft Matter},\n" - " year = 2024,\n" - " volume = 20,\n" - " number = 8,\n" - " pages = {1702--1718}\n" - "}\n\n"; + "BPM bond style: doi:10.1039/D3SM01373A\n\n" + "@Article{Clemmer2024,\n" + " author = {Clemmer, Joel T. and Monti, Joseph M. and Lechman, Jeremy B.},\n" + " title = {A soft departure from jamming: the compaction of deformable\n" + " granular matter under high pressures},\n" + " journal = {Soft Matter},\n" + " year = 2024,\n" + " volume = 20,\n" + " number = 8,\n" + " pages = {1702--1718}\n" + "}\n\n"; /* ---------------------------------------------------------------------- */ BondBPM::BondBPM(LAMMPS *_lmp) : - Bond(_lmp), id_fix_dummy(nullptr), id_fix_dummy2(nullptr), id_fix_update(nullptr), - id_fix_bond_history(nullptr), id_fix_store_local(nullptr), id_fix_prop_atom(nullptr), - fix_store_local(nullptr), fix_bond_history(nullptr), fix_update_special_bonds(nullptr), - pack_choice(nullptr), output_data(nullptr) + Bond(_lmp), id_fix_dummy_special(nullptr), id_fix_dummy_history(nullptr), + id_fix_update_special_bonds(nullptr), id_fix_bond_history(nullptr), id_fix_store_local(nullptr), + id_fix_property_atom(nullptr), fix_store_local(nullptr), fix_bond_history(nullptr), + fix_update_special_bonds(nullptr), pack_choice(nullptr), output_data(nullptr) { overlay_flag = 0; ignore_special_flag = 0; - prop_atom_flag = 0; + property_atom_flag = 0; break_flag = 1; nvalues = 0; + writedata = 0; nhistory = 0; update_flag = 0; @@ -69,11 +70,11 @@ BondBPM::BondBPM(LAMMPS *_lmp) : // this is so final order of Modify:fix will conform to input script // BondHistory technically only needs this if updateflag = 1 - id_fix_dummy = utils::strdup(fmt::format("BPM_DUMMY_{}", instance_total)); - modify->add_fix(fmt::format("{} all DUMMY ", id_fix_dummy)); + id_fix_dummy_special = utils::strdup(fmt::format("BPM_DUMMY_SPECIAL_{}", instance_total)); + modify->add_fix(fmt::format("{} all DUMMY ", id_fix_dummy_special)); - id_fix_dummy2 = utils::strdup(fmt::format("BPM_DUMMY2_{}", instance_total)); - modify->add_fix(fmt::format("{} all DUMMY ", id_fix_dummy2)); + id_fix_dummy_history = utils::strdup(fmt::format("BPM_DUMMY_HISTORY_{}", instance_total)); + modify->add_fix(fmt::format("{} all DUMMY ", id_fix_dummy_history)); if (lmp->citeme) lmp->citeme->add(cite_bpm); } @@ -84,19 +85,17 @@ BondBPM::~BondBPM() { delete[] pack_choice; - if (id_fix_dummy) modify->delete_fix(id_fix_dummy); - if (id_fix_dummy2) modify->delete_fix(id_fix_dummy2); - if (id_fix_update) modify->delete_fix(id_fix_update); + if (id_fix_dummy_special) modify->delete_fix(id_fix_dummy_special); + if (id_fix_dummy_history) modify->delete_fix(id_fix_dummy_history); + if (id_fix_update_special_bonds) modify->delete_fix(id_fix_update_special_bonds); if (fix_bond_history) modify->delete_fix(id_fix_bond_history); if (id_fix_store_local) modify->delete_fix(id_fix_store_local); - if (id_fix_prop_atom) modify->delete_fix(id_fix_prop_atom); + if (id_fix_property_atom) modify->delete_fix(id_fix_property_atom); - delete[] id_fix_dummy; - delete[] id_fix_dummy2; - delete[] id_fix_update; + delete[] id_fix_update_special_bonds; delete[] id_fix_bond_history; delete[] id_fix_store_local; - delete[] id_fix_prop_atom; + delete[] id_fix_property_atom; memory->destroy(output_data); } @@ -116,19 +115,22 @@ void BondBPM::init_style() if (!ignore_special_flag) { if (overlay_flag) { - if (force->special_lj[1] != 1.0 || force->special_lj[2] != 1.0 || force->special_lj[3] != 1.0 || - force->special_coul[1] != 1.0 || force->special_coul[2] != 1.0 || force->special_coul[3] != 1.0) + if (force->special_lj[1] != 1.0 || force->special_lj[2] != 1.0 || + force->special_lj[3] != 1.0 || force->special_coul[1] != 1.0 || + force->special_coul[2] != 1.0 || force->special_coul[3] != 1.0) error->all(FLERR, - "With overlay/pair yes, BPM bond styles require a value of 1.0 for all special_bonds weights"); - if (id_fix_update) { - modify->delete_fix(id_fix_update); - delete[] id_fix_update; - id_fix_update = nullptr; + "With overlay/pair yes, BPM bond styles require a value of 1.0 for all " + "special_bonds weights"); + if (id_fix_update_special_bonds) { + modify->delete_fix(id_fix_update_special_bonds); + delete[] id_fix_update_special_bonds; + id_fix_update_special_bonds = nullptr; } } else { // Require atoms know about all of their bonds and if they break if (force->newton_bond && break_flag) - error->all(FLERR, "With overlay/pair no, or break yes, BPM bond styles require Newton bond off"); + error->all(FLERR, + "With overlay/pair no, or break yes, BPM bond styles require Newton bond off"); // special lj must be 0 1 1 to censor pair forces between bonded particles if (force->special_lj[1] != 0.0 || force->special_lj[2] != 1.0 || force->special_lj[3] != 1.0) @@ -136,30 +138,42 @@ void BondBPM::init_style() "With overlay/pair no, BPM bond styles require special LJ weights = 0,1,1"); // if bonds can break, special coulomb must be 1 1 1 to ensure all pairs are included in the // neighbor list and 1-3 and 1-4 special bond lists are skipped - if (break_flag && (force->special_coul[1] != 1.0 || force->special_coul[2] != 1.0 || - force->special_coul[3] != 1.0)) + if (break_flag && + (force->special_coul[1] != 1.0 || force->special_coul[2] != 1.0 || + force->special_coul[3] != 1.0)) error->all(FLERR, - "With overlay/pair no, and break yes, BPM bond styles requires special Coulomb weights = 1,1,1"); + "With overlay/pair no, and break yes, BPM bond styles requires special Coulomb " + "weights = 1,1,1"); - if (id_fix_dummy && break_flag) { - id_fix_update = utils::strdup("BPM_UPDATE_SPECIAL_BONDS"); - fix_update_special_bonds = dynamic_cast(modify->replace_fix( - id_fix_dummy, fmt::format("{} all UPDATE_SPECIAL_BONDS", id_fix_update), 1)); - delete[] id_fix_dummy; - id_fix_dummy = nullptr; + if (id_fix_dummy_special && break_flag) { + // check if an update fix already exists, if so use it + auto fixes = modify->get_fix_by_style("UPDATE_SPECIAL_BONDS"); + if (fixes.size() > 0 ) { + fix_update_special_bonds = dynamic_cast(fixes[0]); + } else { + id_fix_update_special_bonds = utils::strdup("BPM_UPDATE_SPECIAL_BONDS"); + auto newfix = modify->replace_fix( + id_fix_dummy_special, + fmt::format("{} all UPDATE_SPECIAL_BONDS", id_fix_update_special_bonds), 1); + fix_update_special_bonds = dynamic_cast(newfix); + } + delete[] id_fix_dummy_special; + id_fix_dummy_special = nullptr; } } // special 1-3 and 1-4 weights must be 1 to prevent building 1-3 and 1-4 special bond lists - if (force->special_lj[2] != 1.0 || force->special_lj[3] != 1.0 || force->special_coul[2] != 1.0 || - force->special_coul[3] != 1.0) + if (force->special_lj[2] != 1.0 || force->special_lj[3] != 1.0 || + force->special_coul[2] != 1.0 || force->special_coul[3] != 1.0) error->all(FLERR, "Bond style bpm requires 1-3 and 1-4 special weights of 1.0"); } - if (force->angle || force->dihedral || force->improper) - error->all(FLERR, "Bond style bpm cannot be used with 3,4-body interactions"); - if (atom->molecular == 2) - error->all(FLERR, "Bond style bpm cannot be used with atom style template"); + if (break_flag) { + if (force->angle || force->dihedral || force->improper) + error->all(FLERR, "Bond style bpm cannot break with 3,4-body interactions"); + if (atom->molecular == 2) + error->all(FLERR, "Bond style bpm cannot break with atom style template"); + } // find all instances of bond history to delete/shift data // (bond hybrid may create multiple) @@ -170,6 +184,17 @@ void BondBPM::init_style() hybrid_flag = 0; for (int i = 1; i <= atom->nbondtypes; i++) if (!setflag[i]) hybrid_flag = 1; + + // Set up necessary history fix + if (!fix_bond_history) { + auto newfix = modify->replace_fix( + id_fix_dummy_history, + fmt::format("{} all BOND_HISTORY {} {}", id_fix_bond_history, update_flag, nhistory), 1); + fix_bond_history = dynamic_cast(newfix); + delete[] id_fix_dummy_history; + id_fix_dummy_history = nullptr; + } + fix_bond_history->setflag = setflag; } @@ -208,20 +233,21 @@ void BondBPM::settings(int narg, char **arg) pack_choice[nvalues++] = &BondBPM::pack_z; } else if (strcmp(arg[iarg], "x/ref") == 0) { pack_choice[nvalues++] = &BondBPM::pack_x_ref; - prop_atom_flag = 1; + property_atom_flag = 1; } else if (strcmp(arg[iarg], "y/ref") == 0) { pack_choice[nvalues++] = &BondBPM::pack_y_ref; - prop_atom_flag = 1; + property_atom_flag = 1; } else if (strcmp(arg[iarg], "z/ref") == 0) { pack_choice[nvalues++] = &BondBPM::pack_z_ref; - prop_atom_flag = 1; + property_atom_flag = 1; } else { break; } iarg++; } } else if (strcmp(arg[iarg], "overlay/pair") == 0) { - if (iarg + 1 > narg) error->all(FLERR, "Illegal bond bpm command, missing option for overlay/pair"); + if (iarg + 1 > narg) + error->all(FLERR, "Illegal bond bpm command, missing option for overlay/pair"); overlay_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp); iarg += 2; } else if (strcmp(arg[iarg], "break") == 0) { @@ -249,17 +275,17 @@ void BondBPM::settings(int narg, char **arg) // Use property/atom to save reference positions as it can transfer to ghost atoms // This won't work for instances where bonds are added (e.g. fix pour) but in those cases // a reference state isn't well defined - if (prop_atom_flag == 1) { + if (property_atom_flag == 1) { - id_fix_prop_atom = utils::strdup("BPM_property_atom"); + id_fix_property_atom = utils::strdup("BPM_property_atom"); char *x_ref_id = utils::strdup("BPM_X_REF"); char *y_ref_id = utils::strdup("BPM_Y_REF"); char *z_ref_id = utils::strdup("BPM_Z_REF"); - ifix = modify->get_fix_by_id(id_fix_prop_atom); + ifix = modify->get_fix_by_id(id_fix_property_atom); if (!ifix) ifix = modify->add_fix(fmt::format("{} all property/atom d_{} d_{} d_{} ghost yes", - id_fix_prop_atom, x_ref_id, y_ref_id, z_ref_id)); + id_fix_property_atom, x_ref_id, y_ref_id, z_ref_id)); int type_flag; int col_flag; @@ -290,10 +316,12 @@ void BondBPM::settings(int narg, char **arg) // Set up necessary history fix if (!fix_bond_history) { - fix_bond_history = dynamic_cast(modify->replace_fix( - id_fix_dummy2, fmt::format("{} all BOND_HISTORY {} {}", id_fix_bond_history, update_flag, nhistory), 1)); - delete[] id_fix_dummy2; - id_fix_dummy2 = nullptr; + auto newfix = modify->replace_fix( + id_fix_dummy_history, + fmt::format("{} all BOND_HISTORY {} {}", id_fix_bond_history, update_flag, nhistory), 1); + fix_bond_history = dynamic_cast(newfix); + delete[] id_fix_dummy_history; + id_fix_dummy_history = nullptr; } } @@ -349,8 +377,13 @@ double BondBPM::equilibrium_distance(int /*i*/) r0_max_estimate = temp; } - // Divide out heuristic prefactor added in comm class - return max_stretch * r0_max_estimate / 1.5; + double dist = r0_max_estimate; + + // Add stretch and remove heuristic prefactor (added in comm class) + if (break_flag) + dist *= max_stretch / 1.5; + + return dist; } /* ---------------------------------------------------------------------- @@ -376,8 +409,7 @@ void BondBPM::read_restart(FILE *fp) void BondBPM::process_broken(int i, int j) { - if (!break_flag) - error->one(FLERR, "BPM bond broke with break no option"); + if (!break_flag) error->one(FLERR, "BPM bond broke with break no option"); int nlocal = atom->nlocal; if (fix_store_local) { @@ -415,8 +447,8 @@ void BondBPM::process_broken(int i, int j) n = num_bond[i]; bond_type[i][m] = bond_type[i][n - 1]; bond_atom[i][m] = bond_atom[i][n - 1]; - for (auto &ihistory: histories) { - auto fix_bond_history2 = dynamic_cast (ihistory); + for (auto &ihistory : histories) { + auto fix_bond_history2 = dynamic_cast(ihistory); fix_bond_history2->shift_history(i, m, n - 1); fix_bond_history2->delete_history(i, n - 1); } @@ -432,8 +464,8 @@ void BondBPM::process_broken(int i, int j) n = num_bond[j]; bond_type[j][m] = bond_type[j][n - 1]; bond_atom[j][m] = bond_atom[j][n - 1]; - for (auto &ihistory: histories) { - auto fix_bond_history2 = dynamic_cast (ihistory); + for (auto &ihistory : histories) { + auto fix_bond_history2 = dynamic_cast(ihistory); fix_bond_history2->shift_history(j, m, n - 1); fix_bond_history2->delete_history(j, n - 1); } diff --git a/src/BPM/bond_bpm.h b/src/BPM/bond_bpm.h index 28e4e7187e..42c44d61ce 100644 --- a/src/BPM/bond_bpm.h +++ b/src/BPM/bond_bpm.h @@ -42,9 +42,9 @@ class BondBPM : public Bond { std::vector leftover_iarg; - char *id_fix_dummy, *id_fix_dummy2; - char *id_fix_update, *id_fix_bond_history; - char *id_fix_store_local, *id_fix_prop_atom; + char *id_fix_dummy_special, *id_fix_dummy_history; + char *id_fix_update_special_bonds, *id_fix_bond_history; + char *id_fix_store_local, *id_fix_property_atom; class FixStoreLocal *fix_store_local; class FixBondHistory *fix_bond_history; class FixUpdateSpecialBonds *fix_update_special_bonds; @@ -54,7 +54,7 @@ class BondBPM : public Bond { FnPtrPack *pack_choice; // ptrs to pack functions double *output_data; - int prop_atom_flag, nvalues, overlay_flag, break_flag, ignore_special_flag; + int property_atom_flag, nvalues, overlay_flag, break_flag, ignore_special_flag; int index_x_ref, index_y_ref, index_z_ref; int n_histories; diff --git a/src/BPM/bond_bpm_rotational.cpp b/src/BPM/bond_bpm_rotational.cpp index 630f6ac906..abee373c5d 100644 --- a/src/BPM/bond_bpm_rotational.cpp +++ b/src/BPM/bond_bpm_rotational.cpp @@ -51,6 +51,7 @@ BondBPMRotational::BondBPMRotational(LAMMPS *_lmp) : partial_flag = 1; smooth_flag = 1; normalize_flag = 0; + writedata = 0; nhistory = 4; id_fix_bond_history = utils::strdup("HISTORY_BPM_ROTATIONAL"); @@ -453,14 +454,12 @@ void BondBPMRotational::damping_forces(int i1, int i2, int type, double *rhat, d void BondBPMRotational::compute(int eflag, int vflag) { - if (!fix_bond_history->stored_flag) { fix_bond_history->stored_flag = true; store_data(); } - if (hybrid_flag) - fix_bond_history->compress_history(); + if (hybrid_flag) fix_bond_history->compress_history(); int i1, i2, itmp, n, type; double r[3], r0[3], rhat[3]; @@ -524,7 +523,7 @@ void BondBPMRotational::compute(int eflag, int vflag) breaking = elastic_forces(i1, i2, type, r_mag, r0_mag, r_mag_inv, rhat, r, r0, force1on2, torque1on2, torque2on1); - if (breaking >= 1.0) { + if ((breaking >= 1.0) && break_flag) { bondlist[n][2] = 0; process_broken(i1, i2); continue; @@ -543,33 +542,36 @@ void BondBPMRotational::compute(int eflag, int vflag) // Apply forces and torques to particles // ------------------------------------------------------// - if (newton_bond || i1 < nlocal) { - f[i1][0] -= force1on2[0] * smooth; - f[i1][1] -= force1on2[1] * smooth; - f[i1][2] -= force1on2[2] * smooth; + MathExtra::scale3(smooth, force1on2); - torque[i1][0] += torque2on1[0] * smooth; - torque[i1][1] += torque2on1[1] * smooth; - torque[i1][2] += torque2on1[2] * smooth; + if (newton_bond || i1 < nlocal) { + f[i1][0] -= force1on2[0]; + f[i1][1] -= force1on2[1]; + f[i1][2] -= force1on2[2]; + + MathExtra::scale3(smooth, torque2on1); + torque[i1][0] += torque2on1[0]; + torque[i1][1] += torque2on1[1]; + torque[i1][2] += torque2on1[2]; } if (newton_bond || i2 < nlocal) { - f[i2][0] += force1on2[0] * smooth; - f[i2][1] += force1on2[1] * smooth; - f[i2][2] += force1on2[2] * smooth; + f[i2][0] += force1on2[0]; + f[i2][1] += force1on2[1]; + f[i2][2] += force1on2[2]; - torque[i2][0] += torque1on2[0] * smooth; - torque[i2][1] += torque1on2[1] * smooth; - torque[i2][2] += torque1on2[2] * smooth; + MathExtra::scale3(smooth, torque1on2); + torque[i2][0] += torque1on2[0]; + torque[i2][1] += torque1on2[1]; + torque[i2][2] += torque1on2[2]; } if (evflag) - ev_tally_xyz(i1, i2, nlocal, newton_bond, 0.0, -force1on2[0] * smooth, -force1on2[1] * smooth, - -force1on2[2] * smooth, r[0], r[1], r[2]); + ev_tally_xyz(i1, i2, nlocal, newton_bond, 0.0, -force1on2[0], -force1on2[1], + -force1on2[2], r[0], r[1], r[2]); } - if (hybrid_flag) - fix_bond_history->uncompress_history(); + if (hybrid_flag) fix_bond_history->uncompress_history(); } /* ---------------------------------------------------------------------- */ @@ -682,6 +684,9 @@ void BondBPMRotational::settings(int narg, char **arg) error->all(FLERR, "Illegal bond bpm command, invalid argument {}", arg[iarg]); } } + + if (smooth_flag && !break_flag) + error->all(FLERR, "Illegal bond bpm command, must turn off smoothing with break no option"); } /* ---------------------------------------------------------------------- @@ -816,21 +821,22 @@ double BondBPMRotational::single(int type, double rsq, int i, int j, double &ffo // set single_extra quantities + MathExtra::scale3(smooth, force1on2); svector[0] = r0_mag; if (flipped) { svector[1] = -r0[0]; svector[2] = -r0[1]; svector[3] = -r0[2]; - svector[4] = force1on2[0] * smooth; - svector[5] = force1on2[1] * smooth; - svector[6] = force1on2[2] * smooth; + svector[4] = force1on2[0]; + svector[5] = force1on2[1]; + svector[6] = force1on2[2]; } else { svector[1] = r0[0]; svector[2] = r0[1]; svector[3] = r0[2]; - svector[4] = -force1on2[0] * smooth; - svector[5] = -force1on2[1] * smooth; - svector[6] = -force1on2[2] * smooth; + svector[4] = -force1on2[0]; + svector[5] = -force1on2[1]; + svector[6] = -force1on2[2]; } return 0.0; diff --git a/src/BPM/bond_bpm_spring.cpp b/src/BPM/bond_bpm_spring.cpp index 2863bbf317..0de93fea31 100644 --- a/src/BPM/bond_bpm_spring.cpp +++ b/src/BPM/bond_bpm_spring.cpp @@ -33,17 +33,25 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ BondBPMSpring::BondBPMSpring(LAMMPS *_lmp) : - BondBPM(_lmp), k(nullptr), ecrit(nullptr), gamma(nullptr) + BondBPM(_lmp), k(nullptr), av(nullptr), ecrit(nullptr), gamma(nullptr), + id_fix_property_bond(nullptr), vol_current(nullptr), dvol0(nullptr) { partial_flag = 1; smooth_flag = 1; normalize_flag = 0; + volume_flag = 0; + writedata = 0; nhistory = 1; id_fix_bond_history = utils::strdup("HISTORY_BPM_SPRING"); single_extra = 1; svector = new double[1]; + + nmax = 0; + + comm_forward = 0; + comm_reverse = 0; } /* ---------------------------------------------------------------------- */ @@ -51,13 +59,20 @@ BondBPMSpring::BondBPMSpring(LAMMPS *_lmp) : BondBPMSpring::~BondBPMSpring() { delete[] svector; + if (id_fix_property_bond && modify->nfix) { + modify->delete_fix(id_fix_property_bond); + delete[] id_fix_property_bond; + } if (allocated) { memory->destroy(setflag); memory->destroy(k); memory->destroy(ecrit); memory->destroy(gamma); + memory->destroy(av); } + + memory->destroy(dvol0); } /* ---------------------------------------------------------------------- @@ -134,18 +149,56 @@ void BondBPMSpring::store_data() void BondBPMSpring::compute(int eflag, int vflag) { + int i, bond_change_flag; + double *vol0, *vol; + + if (volume_flag) { + vol0 = atom->dvector[index_vol0]; + vol = atom->dvector[index_vol]; + + // grow + initialize dvol0 as necessary + if (nmax < atom->nmax) { + nmax = atom->nmax; + memory->create(dvol0, nmax, "bond/bpm/spring:dvol0"); + for (i = 0; i < nmax; i++) dvol0[i] = 0.0; + } + } if (!fix_bond_history->stored_flag) { fix_bond_history->stored_flag = true; store_data(); + + if (volume_flag) { + vol_current = vol0; + bond_change_flag = calculate_vol(); + + // zero dvol0, not needed since vol0 just calculated + for (i = 0; i < nmax; i++) dvol0[i] = 0.0; + } } - if (hybrid_flag) - fix_bond_history->compress_history(); + if (volume_flag) { + vol_current = vol; + bond_change_flag = calculate_vol(); + + // Update vol0 to account for any new bonds + if (bond_change_flag) { + update_vol0(); + + // forward new vol0 to ghosts before force calculation + vol_current = vol0; + comm->forward_comm(this); + + bond_change_flag = 0; + } + } + + if (hybrid_flag) fix_bond_history->compress_history(); int i1, i2, itmp, n, type; double delx, dely, delz, delvx, delvy, delvz; double e, rsq, r, r0, rinv, smooth, fbond, dot; + double vol_sum, vol0_sum, vol_temp; ev_init(eflag, vflag); @@ -157,6 +210,8 @@ void BondBPMSpring::compute(int eflag, int vflag) int nbondlist = neighbor->nbondlist; int nlocal = atom->nlocal; int newton_bond = force->newton_bond; + double dim = domain->dimension; + double invdim = 1.0 / dim; double **bondstore = fix_bond_history->bondstore; @@ -190,9 +245,18 @@ void BondBPMSpring::compute(int eflag, int vflag) r = sqrt(rsq); e = (r - r0) / r0; - if (fabs(e) > ecrit[type]) { + if ((fabs(e) > ecrit[type]) && break_flag) { bondlist[n][2] = 0; process_broken(i1, i2); + + if (volume_flag) { + bond_change_flag = 1; + vol_temp = r0 * r0; + if (dim == 3) vol_temp *= r0; + if (newton_bond || i1 < nlocal) dvol0[i1] -= vol_temp; + if (newton_bond || i2 < nlocal) dvol0[i2] -= vol_temp; + } + continue; } @@ -202,6 +266,12 @@ void BondBPMSpring::compute(int eflag, int vflag) else fbond = k[type] * (r0 - r); + if (volume_flag) { + vol_sum = vol[i1] + vol[i2]; + vol0_sum = vol0[i1] + vol0[i2]; + fbond += av[type] * (pow(vol_sum / vol0_sum, invdim) - 1.0 - e); + } + delvx = v[i1][0] - v[i2][0]; delvy = v[i1][1] - v[i2][1]; delvz = v[i1][2] - v[i2][2]; @@ -233,8 +303,77 @@ void BondBPMSpring::compute(int eflag, int vflag) if (evflag) ev_tally(i1, i2, nlocal, newton_bond, 0.0, fbond, delx, dely, delz); } - if (hybrid_flag) - fix_bond_history->uncompress_history(); + // Update vol0 to account for any broken bonds + if (volume_flag && bond_change_flag) update_vol0(); + + if (hybrid_flag) fix_bond_history->uncompress_history(); +} + +/* ---------------------------------------------------------------------- */ + +int BondBPMSpring::calculate_vol() +{ + int n, i1, i2; + double r0, delx, dely, delz, rsq, vol_temp; + + int nlocal = atom->nlocal; + int ntotal = nlocal + atom->nghost; + int newton_bond = force->newton_bond; + int dim = domain->dimension; + + double **x = atom->x; + int **bondlist = neighbor->bondlist; + int nbondlist = neighbor->nbondlist; + double **bondstore = fix_bond_history->bondstore; + + for (n = 0; n < ntotal; n++) vol_current[n] = 0.0; + + int bond_change_flag = 0; + + for (n = 0; n < nbondlist; n++) { + if (bondlist[n][2] <= 0) continue; + i1 = bondlist[n][0]; + i2 = bondlist[n][1]; + r0 = bondstore[n][0]; + + delx = x[i1][0] - x[i2][0]; + dely = x[i1][1] - x[i2][1]; + delz = x[i1][2] - x[i2][2]; + rsq = delx * delx + dely * dely + delz * delz; + + vol_temp = rsq; + if (dim == 3) vol_temp *= sqrt(rsq); + + if (newton_bond || i1 < nlocal) vol_current[i1] += vol_temp; + if (newton_bond || i2 < nlocal) vol_current[i2] += vol_temp; + + // If bond hasn't been set - increment dvol0 too to update vol0 + if (r0 < EPSILON || std::isnan(r0)) { + bond_change_flag = 1; + if (newton_bond || i1 < nlocal) dvol0[i1] += vol_temp; + if (newton_bond || i2 < nlocal) dvol0[i2] += vol_temp; + } + } + + if (newton_bond) comm->reverse_comm(this); + comm->forward_comm(this); + + return bond_change_flag; +} + +/* ---------------------------------------------------------------------- */ + +void BondBPMSpring::update_vol0() +{ + // accumulate changes in vol0 from ghosts + vol_current = dvol0; + if (force->newton_bond) comm->reverse_comm(this); + + double *vol0 = atom->dvector[index_vol0]; + for (int i = 0; i < atom->nlocal; i++) vol0[i] += dvol0[i]; + + // zero dvol0 for next change + for (int i = 0; i < nmax; i++) dvol0[i] = 0.0; } /* ---------------------------------------------------------------------- */ @@ -247,6 +386,7 @@ void BondBPMSpring::allocate() memory->create(k, np1, "bond:k"); memory->create(ecrit, np1, "bond:ecrit"); memory->create(gamma, np1, "bond:gamma"); + memory->create(av, np1, "bond:av"); memory->create(setflag, np1, "bond:setflag"); for (int i = 1; i < np1; i++) setflag[i] = 0; @@ -258,7 +398,8 @@ void BondBPMSpring::allocate() void BondBPMSpring::coeff(int narg, char **arg) { - if (narg != 4) error->all(FLERR, "Incorrect args for bond coefficients"); + if ((!volume_flag && narg != 4) || (volume_flag && narg != 5)) + error->all(FLERR, "Incorrect args for bond coefficients"); if (!allocated) allocate(); int ilo, ihi; @@ -268,11 +409,15 @@ void BondBPMSpring::coeff(int narg, char **arg) double ecrit_one = utils::numeric(FLERR, arg[2], false, lmp); double gamma_one = utils::numeric(FLERR, arg[3], false, lmp); + double av_one = 0.0; + if (volume_flag) av_one = utils::numeric(FLERR, arg[4], false, lmp); + int count = 0; for (int i = ilo; i <= ihi; i++) { k[i] = k_one; ecrit[i] = ecrit_one; gamma[i] = gamma_one; + av[i] = av_one; setflag[i] = 1; count++; @@ -292,6 +437,16 @@ void BondBPMSpring::init_style() if (comm->ghost_velocity == 0) error->all(FLERR, "Bond bpm/spring requires ghost atoms store velocity"); + + if (volume_flag && !id_fix_property_bond) { + id_fix_property_bond = utils::strdup("BOND_BPM_SPRING_FIX_PROPERTY_ATOM"); + modify->add_fix(fmt::format("{} all property/atom d_vol d_vol0 ghost yes writedata no", + id_fix_property_bond)); + + int tmp1 = 0, tmp2 = 0; + index_vol = atom->find_custom("vol", tmp1, tmp2); + index_vol0 = atom->find_custom("vol0", tmp1, tmp2); + } } /* ---------------------------------------------------------------------- */ @@ -308,13 +463,31 @@ void BondBPMSpring::settings(int narg, char **arg) smooth_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp); i += 1; } else if (strcmp(arg[iarg], "normalize") == 0) { - if (iarg + 1 > narg) error->all(FLERR, "Illegal bond bpm command, missing option for normalize"); + if (iarg + 1 > narg) + error->all(FLERR, "Illegal bond bpm command, missing option for normalize"); normalize_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp); + i += 1; + } else if (strcmp(arg[iarg], "volume/factor") == 0) { + if (iarg + 1 > narg) + error->all(FLERR, "Illegal bond bpm command, missing option for volume/factor"); + volume_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp); + + if (volume_flag) { + comm_forward = 1; + comm_reverse = 1; + } else { + comm_forward = 0; + comm_reverse = 0; + } + i += 1; } else { error->all(FLERR, "Illegal bond bpm command, invalid argument {}", arg[iarg]); } } + + if (smooth_flag && !break_flag) + error->all(FLERR, "Illegal bond bpm command, must turn off smoothing with break no option"); } /* ---------------------------------------------------------------------- @@ -329,6 +502,7 @@ void BondBPMSpring::write_restart(FILE *fp) fwrite(&k[1], sizeof(double), atom->nbondtypes, fp); fwrite(&ecrit[1], sizeof(double), atom->nbondtypes, fp); fwrite(&gamma[1], sizeof(double), atom->nbondtypes, fp); + fwrite(&av[1], sizeof(double), atom->nbondtypes, fp); } /* ---------------------------------------------------------------------- @@ -345,10 +519,12 @@ void BondBPMSpring::read_restart(FILE *fp) utils::sfread(FLERR, &k[1], sizeof(double), atom->nbondtypes, fp, nullptr, error); utils::sfread(FLERR, &ecrit[1], sizeof(double), atom->nbondtypes, fp, nullptr, error); utils::sfread(FLERR, &gamma[1], sizeof(double), atom->nbondtypes, fp, nullptr, error); + utils::sfread(FLERR, &av[1], sizeof(double), atom->nbondtypes, fp, nullptr, error); } MPI_Bcast(&k[1], atom->nbondtypes, MPI_DOUBLE, 0, world); MPI_Bcast(&ecrit[1], atom->nbondtypes, MPI_DOUBLE, 0, world); MPI_Bcast(&gamma[1], atom->nbondtypes, MPI_DOUBLE, 0, world); + MPI_Bcast(&av[1], atom->nbondtypes, MPI_DOUBLE, 0, world); for (int i = 1; i <= atom->nbondtypes; i++) setflag[i] = 1; } @@ -360,6 +536,8 @@ void BondBPMSpring::read_restart(FILE *fp) void BondBPMSpring::write_restart_settings(FILE *fp) { fwrite(&smooth_flag, sizeof(int), 1, fp); + fwrite(&normalize_flag, sizeof(int), 1, fp); + fwrite(&volume_flag, sizeof(int), 1, fp); } /* ---------------------------------------------------------------------- @@ -368,8 +546,14 @@ void BondBPMSpring::write_restart_settings(FILE *fp) void BondBPMSpring::read_restart_settings(FILE *fp) { - if (comm->me == 0) utils::sfread(FLERR, &smooth_flag, sizeof(int), 1, fp, nullptr, error); + if (comm->me == 0) { + utils::sfread(FLERR, &smooth_flag, sizeof(int), 1, fp, nullptr, error); + utils::sfread(FLERR, &normalize_flag, sizeof(int), 1, fp, nullptr, error); + utils::sfread(FLERR, &volume_flag, sizeof(int), 1, fp, nullptr, error); + } MPI_Bcast(&smooth_flag, 1, MPI_INT, 0, world); + MPI_Bcast(&normalize_flag, 1, MPI_INT, 0, world); + MPI_Bcast(&volume_flag, 1, MPI_INT, 0, world); } /* ---------------------------------------------------------------------- */ @@ -385,12 +569,22 @@ double BondBPMSpring::single(int type, double rsq, int i, int j, double &fforce) double r = sqrt(rsq); double rinv = 1.0 / r; + double e = (r - r0) / r0; if (normalize_flag) - fforce = k[type] * (r0 - r) / r0; + fforce = -k[type] * e; else fforce = k[type] * (r0 - r); + if (volume_flag) { + double invdim = 1.0 / domain->dimension; + double *vol0 = atom->dvector[index_vol0]; + double *vol = atom->dvector[index_vol]; + double vol_sum = vol[i] + vol[j]; + double vol0_sum = vol0[i] + vol0[j]; + fforce += av[type] * (pow(vol_sum / vol0_sum, invdim) - 1.0 - e); + } + double **x = atom->x; double **v = atom->v; double delx = x[i][0] - x[j][0]; @@ -418,3 +612,49 @@ double BondBPMSpring::single(int type, double rsq, int i, int j, double &fforce) return 0.0; } + +/* ---------------------------------------------------------------------- */ + +int BondBPMSpring::pack_reverse_comm(int n, int first, double *buf) +{ + int i, m, last; + m = 0; + last = first + n; + for (i = first; i < last; i++) buf[m++] = vol_current[i]; + return m; +} + +/* ---------------------------------------------------------------------- */ + +void BondBPMSpring::unpack_reverse_comm(int n, int *list, double *buf) +{ + int i, j, m; + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + vol_current[j] += buf[m++]; + } +} + +/* ---------------------------------------------------------------------- */ + +int BondBPMSpring::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/) +{ + int i, j, m; + m = 0; + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = vol_current[j]; + } + return m; +} + +/* ---------------------------------------------------------------------- */ + +void BondBPMSpring::unpack_forward_comm(int n, int first, double *buf) +{ + int i, m, last; + m = 0; + last = first + n; + for (i = first; i < last; i++) vol_current[i] = buf[m++]; +} diff --git a/src/BPM/bond_bpm_spring.h b/src/BPM/bond_bpm_spring.h index 93f4b49a26..8e5a80229d 100644 --- a/src/BPM/bond_bpm_spring.h +++ b/src/BPM/bond_bpm_spring.h @@ -37,14 +37,24 @@ class BondBPMSpring : public BondBPM { void write_restart_settings(FILE *) override; void read_restart_settings(FILE *) override; double single(int, double, int, int, double &) override; + int pack_forward_comm(int, int *, double *, int, int *) override; + void unpack_forward_comm(int, int, double *) override; + int pack_reverse_comm(int, int, double *) override; + void unpack_reverse_comm(int, int *, double *) override; protected: - double *k, *ecrit, *gamma; - int smooth_flag, normalize_flag; + double *k, *av, *ecrit, *gamma; + int smooth_flag, normalize_flag, volume_flag; + + int index_vol, index_vol0, nmax; + char *id_fix_property_bond; + double *vol_current, *dvol0; void allocate(); void store_data(); double store_bond(int, int, int); + int calculate_vol(); + void update_vol0(); }; } // namespace LAMMPS_NS diff --git a/src/BPM/pair_bpm_spring.cpp b/src/BPM/pair_bpm_spring.cpp index 3407e0274b..bf58b9e515 100644 --- a/src/BPM/pair_bpm_spring.cpp +++ b/src/BPM/pair_bpm_spring.cpp @@ -27,9 +27,10 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -PairBPMSpring::PairBPMSpring(LAMMPS *_lmp) : Pair(_lmp), k(nullptr), cut(nullptr), gamma(nullptr) +PairBPMSpring::PairBPMSpring(LAMMPS *_lmp) : Pair(_lmp), k(nullptr), ka(nullptr), cut(nullptr), gamma(nullptr) { writedata = 1; + anharmonic_flag = 0; } /* ---------------------------------------------------------------------- */ @@ -41,6 +42,7 @@ PairBPMSpring::~PairBPMSpring() memory->destroy(cutsq); memory->destroy(k); + memory->destroy(ka); memory->destroy(cut); memory->destroy(gamma); } @@ -51,7 +53,7 @@ PairBPMSpring::~PairBPMSpring() void PairBPMSpring::compute(int eflag, int vflag) { int i, j, ii, jj, inum, jnum, itype, jtype; - double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair; + double xtmp, ytmp, ztmp, delx, dely, delz, dr, evdwl, fpair; double r, rsq, rinv, factor_lj; int *ilist, *jlist, *numneigh, **firstneigh; double vxtmp, vytmp, vztmp, delvx, delvy, delvz, dot, smooth; @@ -107,7 +109,11 @@ void PairBPMSpring::compute(int eflag, int vflag) r = sqrt(rsq); rinv = 1.0 / r; - fpair = k[itype][jtype] * (cut[itype][jtype] - r); + dr = r - cut[itype][jtype]; + + fpair = -k[itype][jtype] * dr; + if (anharmonic_flag) + fpair += -ka[itype][jtype] * dr * dr * dr; smooth = rsq / cutsq[itype][jtype]; smooth *= smooth; @@ -156,6 +162,7 @@ void PairBPMSpring::allocate() memory->create(cutsq, np1, np1, "pair:cutsq"); memory->create(k, np1, np1, "pair:k"); + memory->create(ka, np1, np1, "pair:ka"); memory->create(cut, np1, np1, "pair:cut"); memory->create(gamma, np1, np1, "pair:gamma"); } @@ -164,9 +171,17 @@ void PairBPMSpring::allocate() global settings ------------------------------------------------------------------------- */ -void PairBPMSpring::settings(int narg, char ** /*arg*/) +void PairBPMSpring::settings(int narg, char ** arg) { - if (narg != 0) error->all(FLERR, "Illegal pair_style command"); + int iarg = 0; + while (iarg < narg) { + if (strcmp(arg[iarg], "anharmonic") == 0) { + if (iarg + 1 >= narg) + utils::missing_cmd_args(FLERR, "pair_coeff bpm/spring anharmonic", error); + anharmonic_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp); + iarg += 2; + } else error->all(FLERR, "Illegal pair_style command {}", arg[iarg]); + } } /* ---------------------------------------------------------------------- @@ -175,7 +190,8 @@ void PairBPMSpring::settings(int narg, char ** /*arg*/) void PairBPMSpring::coeff(int narg, char **arg) { - if (narg != 5) error->all(FLERR, "Incorrect args for pair coefficients"); + if ((!anharmonic_flag && narg != 5) || (anharmonic_flag && narg != 6)) + error->all(FLERR, "Incorrect args for pair coefficients"); if (!allocated) allocate(); int ilo, ihi, jlo, jhi; @@ -186,6 +202,10 @@ void PairBPMSpring::coeff(int narg, char **arg) double cut_one = utils::numeric(FLERR, arg[3], false, lmp); double gamma_one = utils::numeric(FLERR, arg[4], false, lmp); + double ka_one = 0.0; + if (anharmonic_flag) + ka_one = utils::numeric(FLERR, arg[5], false, lmp); + if (cut_one <= 0.0) error->all(FLERR, "Incorrect args for pair coefficients"); int count = 0; @@ -194,6 +214,7 @@ void PairBPMSpring::coeff(int narg, char **arg) k[i][j] = k_one; cut[i][j] = cut_one; gamma[i][j] = gamma_one; + ka[i][j] = ka_one; setflag[i][j] = 1; count++; @@ -230,6 +251,7 @@ double PairBPMSpring::init_one(int i, int j) cut[j][i] = cut[i][j]; k[j][i] = k[i][j]; gamma[j][i] = gamma[i][j]; + ka[j][i] = ka[i][j]; return cut[i][j]; } @@ -250,6 +272,7 @@ void PairBPMSpring::write_restart(FILE *fp) fwrite(&k[i][j], sizeof(double), 1, fp); fwrite(&cut[i][j], sizeof(double), 1, fp); fwrite(&gamma[i][j], sizeof(double), 1, fp); + fwrite(&ka[i][j], sizeof(double), 1, fp); } } } @@ -274,22 +297,50 @@ void PairBPMSpring::read_restart(FILE *fp) utils::sfread(FLERR, &k[i][j], sizeof(double), 1, fp, nullptr, error); utils::sfread(FLERR, &cut[i][j], sizeof(double), 1, fp, nullptr, error); utils::sfread(FLERR, &gamma[i][j], sizeof(double), 1, fp, nullptr, error); + utils::sfread(FLERR, &ka[i][j], sizeof(double), 1, fp, nullptr, error); } MPI_Bcast(&k[i][j], 1, MPI_DOUBLE, 0, world); MPI_Bcast(&cut[i][j], 1, MPI_DOUBLE, 0, world); MPI_Bcast(&gamma[i][j], 1, MPI_DOUBLE, 0, world); + MPI_Bcast(&ka[i][j], 1, MPI_DOUBLE, 0, world); } } } + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairBPMSpring::write_restart_settings(FILE *fp) +{ + fwrite(&anharmonic_flag, sizeof(int), 1, fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairBPMSpring::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) + utils::sfread(FLERR, &anharmonic_flag, sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&anharmonic_flag, 1, MPI_INT, 0, world); +} + /* ---------------------------------------------------------------------- proc 0 writes to data file ------------------------------------------------------------------------- */ void PairBPMSpring::write_data(FILE *fp) { - for (int i = 1; i <= atom->ntypes; i++) - fprintf(fp, "%d %g %g %g\n", i, k[i][i], cut[i][i], gamma[i][i]); + if (anharmonic_flag) { + for (int i = 1; i <= atom->ntypes; i++) + fprintf(fp, "%d %g %g %g %g\n", i, k[i][i], cut[i][i], gamma[i][i], ka[i][i]); + } else { + for (int i = 1; i <= atom->ntypes; i++) + fprintf(fp, "%d %g %g %g\n", i, k[i][i], cut[i][i], gamma[i][i]); + } } /* ---------------------------------------------------------------------- @@ -298,9 +349,15 @@ void PairBPMSpring::write_data(FILE *fp) void PairBPMSpring::write_data_all(FILE *fp) { - for (int i = 1; i <= atom->ntypes; i++) - for (int j = i; j <= atom->ntypes; j++) - fprintf(fp, "%d %d %g %g %g\n", i, j, k[i][j], cut[i][j], gamma[i][j]); + if (anharmonic_flag) { + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) + fprintf(fp, "%d %d %g %g %g %g\n", i, j, k[i][j], cut[i][j], gamma[i][j], ka[i][j]); + } else { + for (int i = 1; i <= atom->ntypes; i++) + for (int j = i; j <= atom->ntypes; j++) + fprintf(fp, "%d %d %g %g %g\n", i, j, k[i][j], cut[i][j], gamma[i][j]); + } } /* ---------------------------------------------------------------------- */ @@ -308,7 +365,7 @@ void PairBPMSpring::write_data_all(FILE *fp) double PairBPMSpring::single(int i, int j, int itype, int jtype, double rsq, double /*factor_coul*/, double factor_lj, double &fforce) { - double fpair, r, rinv; + double fpair, r, rinv, dr; double delx, dely, delz, delvx, delvy, delvz, dot, smooth; if (rsq > cutsq[itype][jtype]) return 0.0; @@ -319,7 +376,10 @@ double PairBPMSpring::single(int i, int j, int itype, int jtype, double rsq, dou r = sqrt(rsq); rinv = 1.0 / r; - fpair = k[itype][jtype] * (cut[itype][jtype] - r); + dr = r - cut[itype][jtype]; + fpair = -k[itype][jtype] * dr; + if (anharmonic_flag) + fpair += -ka[itype][jtype] * dr * dr * dr; smooth = rsq / cutsq[itype][jtype]; smooth *= smooth; diff --git a/src/BPM/pair_bpm_spring.h b/src/BPM/pair_bpm_spring.h index c10e4a3400..515317e045 100644 --- a/src/BPM/pair_bpm_spring.h +++ b/src/BPM/pair_bpm_spring.h @@ -29,18 +29,21 @@ class PairBPMSpring : public Pair { PairBPMSpring(class LAMMPS *); ~PairBPMSpring() override; void compute(int, int) override; - void settings(int, char **) override; void coeff(int, char **) override; + void settings(int, char **) override; void init_style() override; double init_one(int, int) override; void write_restart(FILE *) override; void read_restart(FILE *) override; + void write_restart_settings(FILE *) override; + void read_restart_settings(FILE *) override; void write_data(FILE *) override; void write_data_all(FILE *) override; double single(int, int, int, int, double, double, double, double &) override; protected: - double **k, **cut, **gamma; + int anharmonic_flag; + double **k, **ka, **cut, **gamma; void allocate(); }; diff --git a/src/CLASS2/bond_class2.cpp b/src/CLASS2/bond_class2.cpp index 8c5d8159bf..da1e8199e0 100644 --- a/src/CLASS2/bond_class2.cpp +++ b/src/CLASS2/bond_class2.cpp @@ -242,6 +242,9 @@ void BondClass2::born_matrix(int type, double rsq, int /*i*/, int /*j*/, double void *BondClass2::extract(const char *str, int &dim) { dim = 1; + if (strcmp(str, "k2") == 0) return (void *) k2; + if (strcmp(str, "k3") == 0) return (void *) k3; + if (strcmp(str, "k4") == 0) return (void *) k4; if (strcmp(str,"r0")==0) return (void*) r0; return nullptr; } diff --git a/src/COLVARS/colvarproxy_lammps.cpp b/src/COLVARS/colvarproxy_lammps.cpp index dc989ad6de..265dc34f43 100644 --- a/src/COLVARS/colvarproxy_lammps.cpp +++ b/src/COLVARS/colvarproxy_lammps.cpp @@ -204,7 +204,7 @@ cvm::rvector colvarproxy_lammps::position_distance(cvm::atom_pos const &pos1, double xtmp = pos2.x - pos1.x; double ytmp = pos2.y - pos1.y; double ztmp = pos2.z - pos1.z; - _lmp->domain->minimum_image(xtmp,ytmp,ztmp); + _lmp->domain->minimum_image_big(xtmp,ytmp,ztmp); return {xtmp, ytmp, ztmp}; } diff --git a/src/DIELECTRIC/pppm_disp_dielectric.cpp b/src/DIELECTRIC/pppm_disp_dielectric.cpp index 346df8bf93..aba8ccf486 100644 --- a/src/DIELECTRIC/pppm_disp_dielectric.cpp +++ b/src/DIELECTRIC/pppm_disp_dielectric.cpp @@ -715,7 +715,7 @@ void PPPMDispDielectric::fieldforce_c_ad() { int i,l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz; - FFT_SCALAR ekx,eky,ekz,u; + FFT_SCALAR ekx,eky,ekz; double s1,s2,s3; double sf = 0.0; diff --git a/src/Depend.sh b/src/Depend.sh index 85542b21c0..9ddb29450d 100755 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -68,6 +68,10 @@ if (test $1 = "COLLOID") then depend OPENMP fi +if (test $1 = "COLVARS") then + depend KOKKOS +fi + if (test $1 = "DIELECTRIC") then depend OPENMP fi diff --git a/src/EXTRA-COMPUTE/compute_stress_mop.cpp b/src/EXTRA-COMPUTE/compute_stress_mop.cpp index b8d21d2a4f..7c66c1fe50 100644 --- a/src/EXTRA-COMPUTE/compute_stress_mop.cpp +++ b/src/EXTRA-COMPUTE/compute_stress_mop.cpp @@ -39,7 +39,7 @@ using namespace LAMMPS_NS; -static constexpr double SMALL = 0.001; +static constexpr double SMALL = 0.001; enum { X, Y, Z }; enum { TOTAL, CONF, KIN, PAIR, BOND, ANGLE, DIHEDRAL }; @@ -63,7 +63,7 @@ ComputeStressMop::ComputeStressMop(LAMMPS *lmp, int narg, char **arg) : Compute( } else if (strcmp(arg[3], "z") == 0) { dir = Z; } else - error->all(FLERR, "Illegal compute stress/mop command"); + error->all(FLERR, "Illegal compute stress/mop plane direction {}", arg[3]); // Position of the plane @@ -89,7 +89,7 @@ ComputeStressMop::ComputeStressMop(LAMMPS *lmp, int narg, char **arg) : Compute( error->all(FLERR, "Plane for compute stress/mop is out of bounds"); } - if (pos < (domain->boxlo[dir] + domain->prd_half[dir])) { + if (pos < (domain->boxlo[dir] + domain->prd_half[dir])) { pos1 = pos + domain->prd[dir]; } else { pos1 = pos - domain->prd[dir]; @@ -133,27 +133,17 @@ ComputeStressMop::ComputeStressMop(LAMMPS *lmp, int narg, char **arg) : Compute( which[nvalues] = ANGLE; nvalues++; } - } else if (strcmp(arg[iarg],"dihedral") == 0) { - for (i=0; i<3; i++) { + } else if (strcmp(arg[iarg], "dihedral") == 0) { + for (i = 0; i < 3; i++) { which[nvalues] = DIHEDRAL; nvalues++; } } else - error->all(FLERR, "Illegal compute stress/mop command"); //break; + error->all(FLERR, "Unknown compute stress/mop keyword {}", arg[iarg]); iarg++; } - // Error checks: - - // orthogonal simulation box - if (domain->triclinic != 0) - error->all(FLERR, "Compute stress/mop is incompatible with triclinic simulation box"); - - // 2D and pressure calculation in the Z coordinate - if (domain->dimension == 2 && dir == Z) - error->all(FLERR, "Compute stress/mop is incompatible with Z in 2d system"); - // Initialize some variables values_local = values_global = vector = nullptr; @@ -173,8 +163,8 @@ ComputeStressMop::ComputeStressMop(LAMMPS *lmp, int narg, char **arg) : Compute( memory->create(bond_global, nvalues, "stress/mop:bond_global"); memory->create(angle_local, nvalues, "stress/mop:angle_local"); memory->create(angle_global, nvalues, "stress/mop:angle_global"); - memory->create(dihedral_local,nvalues,"stress/mop:dihedral_local"); - memory->create(dihedral_global,nvalues,"stress/mop:dihedral_global"); + memory->create(dihedral_local, nvalues, "stress/mop:dihedral_local"); + memory->create(dihedral_global, nvalues, "stress/mop:dihedral_global"); size_vector = nvalues; vector_flag = 1; @@ -202,6 +192,16 @@ ComputeStressMop::~ComputeStressMop() void ComputeStressMop::init() { + // Error checks: + + // 2D and pressure calculation in the Z coordinate + if (domain->dimension == 2 && dir == Z) + error->all(FLERR, "Compute stress/mop is incompatible with Z in 2d system"); + + // orthogonal simulation box + + if (domain->triclinic != 0) + error->all(FLERR, "Compute stress/mop is incompatible with triclinic simulation box"); // Conversion constants @@ -224,11 +224,12 @@ void ComputeStressMop::init() dt = update->dt; - // Error check + // Error checks: // Compute stress/mop requires fixed simulation box + if (domain->box_change_size || domain->box_change_shape || domain->deform_flag) - error->all(FLERR, "Compute stress/mop requires a fixed size simulation box"); + error->all(FLERR, "Compute stress/mop requires a fixed simulation box geometry"); // This compute requires a pair style with pair_single method implemented @@ -242,34 +243,46 @@ void ComputeStressMop::init() // issue an error for unimplemented intramolecular potentials or Kspace. - if (force->bond) bondflag = 1; + if (force->bond) { + bondflag = 1; + if (comm->nprocs > 1) + error->one(FLERR, "compute stress/mop with bonds does not (yet) support MPI parallel runs"); + } + if (force->angle) { if (force->angle->born_matrix_enable == 0) { if ((strcmp(force->angle_style, "zero") != 0) && (strcmp(force->angle_style, "none") != 0)) - error->all(FLERR, "compute stress/mop does not account for angle potentials"); + error->one(FLERR, "compute stress/mop does not account for angle potentials"); } else { angleflag = 1; + if (comm->nprocs > 1) + error->one(FLERR, + "compute stress/mop with angles does not (yet) support MPI parallel runs"); } } if (force->dihedral) { if (force->dihedral->born_matrix_enable == 0) { if ((strcmp(force->dihedral_style, "zero") != 0) && (strcmp(force->dihedral_style, "none") != 0)) - error->all(FLERR, "compute stress/mop does not account for dihedral potentials"); + error->one(FLERR, "compute stress/mop does not account for dihedral potentials"); } else { dihedralflag = 1; + if (comm->nprocs > 1) + error->one(FLERR, + "compute stress/mop with dihedrals does not (yet) support MPI parallel runs"); } } if (force->improper) { if ((strcmp(force->improper_style, "zero") != 0) && (strcmp(force->improper_style, "none") != 0)) - error->all(FLERR, "compute stress/mop does not account for improper potentials"); + error->one(FLERR, "compute stress/mop does not account for improper potentials"); } if (force->kspace) error->warning(FLERR, "compute stress/mop does not account for kspace contributions"); } // need an occasional half neighbor list + neighbor->add_request(this, NeighConst::REQ_OCCASIONAL); } @@ -324,11 +337,11 @@ void ComputeStressMop::compute_vector() //Compute dihedral contribution on separate procs compute_dihedrals(); } else { - for (int i=0; i pos)) || - ((xi[dir] < pos1) && (xj[dir] > pos1))) { + ((xi[dir] < pos1) && (xj[dir] > pos1))) { pair->single(i, j, itype, jtype, rsq, factor_coul, factor_lj, fpair); values_local[m] -= fpair * (xi[0] - xj[0]) / area * nktv2p; values_local[m + 1] -= fpair * (xi[1] - xj[1]) / area * nktv2p; @@ -869,9 +882,7 @@ void ComputeStressMop::compute_dihedrals() double x_atom_4[3] = {0.0, 0.0, 0.0}; // initialization - for (int i = 0; i < nvalues; i++) { - dihedral_local[i] = 0.0; - } + for (int i = 0; i < nvalues; i++) { dihedral_local[i] = 0.0; } double local_contribution[3] = {0.0, 0.0, 0.0}; for (atom2 = 0; atom2 < nlocal; atom2++) { @@ -889,9 +900,9 @@ void ComputeStressMop::compute_dihedrals() for (i = 0; i < nd; i++) { if (molecular == 1) { if (tag[atom2] != dihedral_atom2[atom2][i]) continue; - atom1 = atom->map(dihedral_atom1[atom2][i]); - atom3 = atom->map(dihedral_atom3[atom2][i]); - atom4 = atom->map(dihedral_atom4[atom2][i]); + atom1 = atom->map(dihedral_atom1[atom2][i]); + atom3 = atom->map(dihedral_atom3[atom2][i]); + atom4 = atom->map(dihedral_atom4[atom2][i]); } else { if (tag[atom2] != onemols[imol]->dihedral_atom2[atom2][i]) continue; tagprev = tag[atom2] - iatom - 1; @@ -943,9 +954,9 @@ void ComputeStressMop::compute_dihedrals() double tau_right = (x_atom_2[dir] - pos) / (x_atom_2[dir] - x_atom_1[dir]); double tau_middle = (x_atom_3[dir] - pos) / (x_atom_3[dir] - x_atom_2[dir]); double tau_left = (x_atom_4[dir] - pos) / (x_atom_4[dir] - x_atom_3[dir]); - bool right_cross = ((tau_right >=0) && (tau_right <= 1)); + bool right_cross = ((tau_right >= 0) && (tau_right <= 1)); bool middle_cross = ((tau_middle >= 0) && (tau_middle <= 1)); - bool left_cross = ((tau_left >=0) && (tau_left <= 1)); + bool left_cross = ((tau_left >= 0) && (tau_left <= 1)); // no bonds crossing the plane if (!right_cross && !middle_cross && !left_cross) continue; @@ -972,45 +983,45 @@ void ComputeStressMop::compute_dihedrals() vb3z = x_atom_4[2] - x_atom_3[2]; // c0 calculation - sb1 = 1.0 / (vb1x*vb1x + vb1y*vb1y + vb1z*vb1z); - sb2 = 1.0 / (vb2x*vb2x + vb2y*vb2y + vb2z*vb2z); - sb3 = 1.0 / (vb3x*vb3x + vb3y*vb3y + vb3z*vb3z); + sb1 = 1.0 / (vb1x * vb1x + vb1y * vb1y + vb1z * vb1z); + sb2 = 1.0 / (vb2x * vb2x + vb2y * vb2y + vb2z * vb2z); + sb3 = 1.0 / (vb3x * vb3x + vb3y * vb3y + vb3z * vb3z); rb1 = sqrt(sb1); rb3 = sqrt(sb3); - c0 = (vb1x*vb3x + vb1y*vb3y + vb1z*vb3z) * rb1*rb3; + c0 = (vb1x * vb3x + vb1y * vb3y + vb1z * vb3z) * rb1 * rb3; // 1st and 2nd angle - b1mag2 = vb1x*vb1x + vb1y*vb1y + vb1z*vb1z; + b1mag2 = vb1x * vb1x + vb1y * vb1y + vb1z * vb1z; b1mag = sqrt(b1mag2); - b2mag2 = vb2x*vb2x + vb2y*vb2y + vb2z*vb2z; + b2mag2 = vb2x * vb2x + vb2y * vb2y + vb2z * vb2z; b2mag = sqrt(b2mag2); - b3mag2 = vb3x*vb3x + vb3y*vb3y + vb3z*vb3z; + b3mag2 = vb3x * vb3x + vb3y * vb3y + vb3z * vb3z; b3mag = sqrt(b3mag2); - ctmp = vb1x*vb2x + vb1y*vb2y + vb1z*vb2z; - r12c1 = 1.0 / (b1mag*b2mag); + ctmp = vb1x * vb2x + vb1y * vb2y + vb1z * vb2z; + r12c1 = 1.0 / (b1mag * b2mag); c1mag = ctmp * r12c1; - ctmp = vb2xm*vb3x + vb2ym*vb3y + vb2zm*vb3z; - r12c2 = 1.0 / (b2mag*b3mag); + ctmp = vb2xm * vb3x + vb2ym * vb3y + vb2zm * vb3z; + r12c2 = 1.0 / (b2mag * b3mag); c2mag = ctmp * r12c2; // cos and sin of 2 angles and final c - sin2 = MAX(1.0 - c1mag*c1mag,0.0); + sin2 = MAX(1.0 - c1mag * c1mag, 0.0); sc1 = sqrt(sin2); if (sc1 < SMALL) sc1 = SMALL; - sc1 = 1.0/sc1; + sc1 = 1.0 / sc1; - sin2 = MAX(1.0 - c2mag*c2mag,0.0); + sin2 = MAX(1.0 - c2mag * c2mag, 0.0); sc2 = sqrt(sin2); if (sc2 < SMALL) sc2 = SMALL; - sc2 = 1.0/sc2; + sc2 = 1.0 / sc2; s1 = sc1 * sc1; s2 = sc2 * sc2; s12 = sc1 * sc2; - c = (c0 + c1mag*c2mag) * s12; + c = (c0 + c1mag * c2mag) * s12; // error check if (c > 1.0) c = 1.0; @@ -1020,28 +1031,28 @@ void ComputeStressMop::compute_dihedrals() double a = dudih; c = c * a; s12 = s12 * a; - a11 = c*sb1*s1; - a22 = -sb2 * (2.0*c0*s12 - c*(s1+s2)); - a33 = c*sb3*s2; - a12 = -r12c1 * (c1mag*c*s1 + c2mag*s12); - a13 = -rb1*rb3*s12; - a23 = r12c2 * (c2mag*c*s2 + c1mag*s12); + a11 = c * sb1 * s1; + a22 = -sb2 * (2.0 * c0 * s12 - c * (s1 + s2)); + a33 = c * sb3 * s2; + a12 = -r12c1 * (c1mag * c * s1 + c2mag * s12); + a13 = -rb1 * rb3 * s12; + a23 = r12c2 * (c2mag * c * s2 + c1mag * s12); - sx2 = a12*vb1x + a22*vb2x + a23*vb3x; - sy2 = a12*vb1y + a22*vb2y + a23*vb3y; - sz2 = a12*vb1z + a22*vb2z + a23*vb3z; + sx2 = a12 * vb1x + a22 * vb2x + a23 * vb3x; + sy2 = a12 * vb1y + a22 * vb2y + a23 * vb3y; + sz2 = a12 * vb1z + a22 * vb2z + a23 * vb3z; - f1[0] = a11*vb1x + a12*vb2x + a13*vb3x; - f1[1] = a11*vb1y + a12*vb2y + a13*vb3y; - f1[2] = a11*vb1z + a12*vb2z + a13*vb3z; + f1[0] = a11 * vb1x + a12 * vb2x + a13 * vb3x; + f1[1] = a11 * vb1y + a12 * vb2y + a13 * vb3y; + f1[2] = a11 * vb1z + a12 * vb2z + a13 * vb3z; f2[0] = -sx2 - f1[0]; f2[1] = -sy2 - f1[1]; f2[2] = -sz2 - f1[2]; - f4[0] = a13*vb1x + a23*vb2x + a33*vb3x; - f4[1] = a13*vb1y + a23*vb2y + a33*vb3y; - f4[2] = a13*vb1z + a23*vb2z + a33*vb3z; + f4[0] = a13 * vb1x + a23 * vb2x + a33 * vb3x; + f4[1] = a13 * vb1y + a23 * vb2y + a33 * vb3y; + f4[2] = a13 * vb1z + a23 * vb2z + a33 * vb3z; f3[0] = sx2 - f4[0]; f3[1] = sy2 - f4[1]; @@ -1106,9 +1117,9 @@ void ComputeStressMop::compute_dihedrals() df[1] = sgn * (f1[1] + f3[1]); df[2] = sgn * (f1[2] + f3[2]); } - local_contribution[0] += df[0]/area*nktv2p; - local_contribution[1] += df[1]/area*nktv2p; - local_contribution[2] += df[2]/area*nktv2p; + local_contribution[0] += df[0] / area * nktv2p; + local_contribution[1] += df[1] / area * nktv2p; + local_contribution[2] += df[2] / area * nktv2p; } } @@ -1116,11 +1127,10 @@ void ComputeStressMop::compute_dihedrals() int m = 0; while (m < nvalues) { if ((which[m] == CONF) || (which[m] == TOTAL) || (which[m] == DIHEDRAL)) { - dihedral_local[m] = local_contribution[0]; - dihedral_local[m+1] = local_contribution[1]; - dihedral_local[m+2] = local_contribution[2]; + dihedral_local[m] = local_contribution[0]; + dihedral_local[m + 1] = local_contribution[1]; + dihedral_local[m + 2] = local_contribution[2]; } m += 3; } - } diff --git a/src/EXTRA-COMPUTE/compute_stress_mop_profile.cpp b/src/EXTRA-COMPUTE/compute_stress_mop_profile.cpp index ca2d095fd9..c8087b60a9 100644 --- a/src/EXTRA-COMPUTE/compute_stress_mop_profile.cpp +++ b/src/EXTRA-COMPUTE/compute_stress_mop_profile.cpp @@ -39,7 +39,7 @@ using namespace LAMMPS_NS; -static constexpr double SMALL = 0.001; +static constexpr double SMALL = 0.001; enum { X, Y, Z }; enum { TOTAL, CONF, KIN, PAIR, BOND, ANGLE, DIHEDRAL }; @@ -64,7 +64,7 @@ ComputeStressMopProfile::ComputeStressMopProfile(LAMMPS *lmp, int narg, char **a } else if (strcmp(arg[3], "z") == 0) { dir = Z; } else - error->all(FLERR, "Illegal compute stress/mop/profile command"); + error->all(FLERR, "Illegal compute stress/mop/profile plane direction {}", arg[3]); // bin parameters @@ -118,30 +118,18 @@ ComputeStressMopProfile::ComputeStressMopProfile(LAMMPS *lmp, int narg, char **a which[nvalues] = ANGLE; nvalues++; } - } else if (strcmp(arg[iarg],"dihedral") == 0) { - for (i=0; i<3; i++) { + } else if (strcmp(arg[iarg], "dihedral") == 0) { + for (i = 0; i < 3; i++) { which[nvalues] = DIHEDRAL; nvalues++; } } else - error->all(FLERR, "Illegal compute stress/mop/profile command"); //break; + error->all(FLERR, "Unknown compute stress/mop/profile keyword {}", arg[iarg]); iarg++; } - // check domain related errors - - // 3D only - - if (domain->dimension == 2 && dir == Z) - error->all(FLERR, "Compute stress/mop/profile incompatible with Z in 2d system"); - - // orthogonal simulation box - - if (domain->triclinic != 0) - error->all(FLERR, "Compute stress/mop/profile incompatible with triclinic simulation box"); - - // initialize some variables + // Initialize some variables nbins = 0; coord = coordp = nullptr; @@ -192,12 +180,25 @@ ComputeStressMopProfile::~ComputeStressMopProfile() void ComputeStressMopProfile::init() { - // conversion constants + // check domain related errors + + // 3D only + + if (domain->dimension == 2 && dir == Z) + error->all(FLERR, "Compute stress/mop/profile is incompatible with Z in 2d system"); + + // check for orthogonal simulation box + + if (domain->triclinic != 0) + error->all(FLERR, "Compute stress/mop/profile is incompatible with triclinic simulation box"); + + // Conversion constants nktv2p = force->nktv2p; ftm2v = force->ftm2v; - // plane area + // Plane area + if (domain->dimension == 3) { area = 1; int i; @@ -208,7 +209,7 @@ void ComputeStressMopProfile::init() area = (dir == X) ? domain->prd[1] : domain->prd[0]; } - // timestep Value + // Timestep Value dt = update->dt; @@ -217,46 +218,59 @@ void ComputeStressMopProfile::init() // Compute stress/mop/profile requires fixed simulation box if (domain->box_change_size || domain->box_change_shape || domain->deform_flag) - error->all(FLERR, "Compute stress/mop/profile requires a fixed simulation box"); + error->all(FLERR, "Compute stress/mop/profile requires a fixed simulation box geometry"); // This compute requires a pair style with pair_single method implemented if (!force->pair) error->all(FLERR, "No pair style is defined for compute stress/mop/profile"); if (force->pair->single_enable == 0) - error->all(FLERR, "Pair style does not support compute stress/mop/profile"); + error->all(FLERR, "Pair style {} does not support compute stress/mop/profile", + force->pair_style); // Errors if (comm->me == 0) { - // Compute stress/mop/profile only accounts for pair interactions. - // issue an error if any intramolecular potential or Kspace is defined. + // issue an error for unimplemented intramolecular potentials or Kspace. - if (force->bond) bondflag = 1; + if (force->bond) { + bondflag = 1; + if (comm->nprocs > 1) + error->one( + FLERR, + "compute stress/mop/profile with bonds does not (yet) support MPI parallel runs"); + } if (force->angle) { if (force->angle->born_matrix_enable == 0) { if ((strcmp(force->angle_style, "zero") != 0) && (strcmp(force->angle_style, "none") != 0)) - error->all(FLERR,"compute stress/mop/profile does not account for angle potentials"); + error->one(FLERR, "compute stress/mop/profile does not account for angle potentials"); } else { angleflag = 1; + if (comm->nprocs > 1) + error->one( + FLERR, + "compute stress/mop/profile with angles does not (yet) support MPI parallel runs"); } } - if (force->dihedral) { if (force->dihedral->born_matrix_enable == 0) { if ((strcmp(force->dihedral_style, "zero") != 0) && (strcmp(force->dihedral_style, "none") != 0)) - error->all(FLERR, "compute stress/mop/profile does not account for dihedral potentials"); + error->one(FLERR, "compute stress/mop/profile does not account for dihedral potentials"); } else { dihedralflag = 1; + if (comm->nprocs > 1) + error->one( + FLERR, + "compute stress/mop/profile with dihedrals does not (yet) support MPI parallel runs"); } } - - if (force->improper) + if (force->improper) { if ((strcmp(force->improper_style, "zero") != 0) && (strcmp(force->improper_style, "none") != 0)) - error->all(FLERR, "compute stress/mop/profile does not account for improper potentials"); + error->one(FLERR, "compute stress/mop/profile does not account for improper potentials"); + } if (force->kspace) error->warning(FLERR, "compute stress/mop/profile does not account for kspace contributions"); } @@ -308,28 +322,26 @@ void ComputeStressMopProfile::compute_array() compute_angles(); } else { for (int m = 0; m < nbins; m++) { - for (int i = 0; i < nvalues; i++) { - angle_local[m][i] = 0.0; - } + for (int i = 0; i < nvalues; i++) { angle_local[m][i] = 0.0; } } } // sum angle contribution over all procs - MPI_Allreduce(&angle_local[0][0],&angle_global[0][0],nbins*nvalues,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&angle_local[0][0], &angle_global[0][0], nbins * nvalues, MPI_DOUBLE, MPI_SUM, + world); if (dihedralflag) { //Compute dihedral contribution on separate procs compute_dihedrals(); } else { for (int m = 0; m < nbins; m++) { - for (int i = 0; i < nvalues; i++) { - dihedral_local[m][i] = 0.0; - } + for (int i = 0; i < nvalues; i++) { dihedral_local[m][i] = 0.0; } } } // sum dihedral contribution over all procs - MPI_Allreduce(&dihedral_local[0][0],&dihedral_global[0][0],nbins*nvalues,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&dihedral_local[0][0], &dihedral_global[0][0], nbins * nvalues, MPI_DOUBLE, MPI_SUM, + world); for (int ibin = 0; ibin < nbins; ibin++) { array[ibin][0] = coord[ibin]; @@ -337,7 +349,8 @@ void ComputeStressMopProfile::compute_array() int mo = 1; int m = 0; while (m < nvalues) { - array[ibin][m + mo] = values_global[ibin][m] + bond_global[ibin][m] + angle_global[ibin][m] + dihedral_global[ibin][m]; + array[ibin][m + mo] = values_global[ibin][m] + bond_global[ibin][m] + angle_global[ibin][m] + + dihedral_global[ibin][m]; m++; } } @@ -726,15 +739,12 @@ void ComputeStressMopProfile::compute_angles() // initialization for (int m = 0; m < nbins; m++) { - for (int i = 0; i < nvalues; i++) { - angle_local[m][i] = 0.0; - } + for (int i = 0; i < nvalues; i++) { angle_local[m][i] = 0.0; } local_contribution[m][0] = 0.0; local_contribution[m][1] = 0.0; local_contribution[m][2] = 0.0; } - for (atom2 = 0; atom2 < nlocal; atom2++) { if (!(mask[atom2] & groupbit)) continue; @@ -765,7 +775,7 @@ void ComputeStressMopProfile::compute_angles() if (atom3 < 0 || !(mask[atom3] & groupbit)) continue; if (atype <= 0) continue; - for (int ibin = 0; ibin=0) && (tau_right <= 1)); - bool left_cross = ((tau_left >=0) && (tau_left <= 1)); + bool right_cross = ((tau_right >= 0) && (tau_right <= 1)); + bool left_cross = ((tau_left >= 0) && (tau_left <= 1)); // no bonds crossing the plane if (!right_cross && !left_cross) continue; // compute the cos(theta) of the angle - r1 = sqrt(dx_left[0]*dx_left[0] + dx_left[1]*dx_left[1] + dx_left[2]*dx_left[2]); - r2 = sqrt(dx_right[0]*dx_right[0] + dx_right[1]*dx_right[1] + dx_right[2]*dx_right[2]); - cos_theta = -(dx_right[0]*dx_left[0] + dx_right[1]*dx_left[1] + dx_right[2]*dx_left[2])/(r1*r2); + r1 = sqrt(dx_left[0] * dx_left[0] + dx_left[1] * dx_left[1] + dx_left[2] * dx_left[2]); + r2 = + sqrt(dx_right[0] * dx_right[0] + dx_right[1] * dx_right[1] + dx_right[2] * dx_right[2]); + cos_theta = + -(dx_right[0] * dx_left[0] + dx_right[1] * dx_left[1] + dx_right[2] * dx_left[2]) / + (r1 * r2); - if (cos_theta > 1.0) cos_theta = 1.0; + if (cos_theta > 1.0) cos_theta = 1.0; if (cos_theta < -1.0) cos_theta = -1.0; // The method returns derivative with regards to cos(theta) angle->born_matrix(atype, atom1, atom2, atom3, duang, du2ang); // only right bond crossing the plane - if (right_cross && !left_cross) - { + if (right_cross && !left_cross) { double sgn = copysign(1.0, x_angle_right[dir] - pos); - dcos_theta[0] = sgn*(dx_right[0]*cos_theta/r2 + dx_left[0]/r1)/r2; - dcos_theta[1] = sgn*(dx_right[1]*cos_theta/r2 + dx_left[1]/r1)/r2; - dcos_theta[2] = sgn*(dx_right[2]*cos_theta/r2 + dx_left[2]/r1)/r2; + dcos_theta[0] = sgn * (dx_right[0] * cos_theta / r2 + dx_left[0] / r1) / r2; + dcos_theta[1] = sgn * (dx_right[1] * cos_theta / r2 + dx_left[1] / r1) / r2; + dcos_theta[2] = sgn * (dx_right[2] * cos_theta / r2 + dx_left[2] / r1) / r2; } // only left bond crossing the plane - if (!right_cross && left_cross) - { + if (!right_cross && left_cross) { double sgn = copysign(1.0, x_angle_left[dir] - pos); - dcos_theta[0] = -sgn*(dx_left[0]*cos_theta/r1 + dx_right[0]/r2)/r1; - dcos_theta[1] = -sgn*(dx_left[1]*cos_theta/r1 + dx_right[1]/r2)/r1; - dcos_theta[2] = -sgn*(dx_left[2]*cos_theta/r1 + dx_right[2]/r2)/r1; + dcos_theta[0] = -sgn * (dx_left[0] * cos_theta / r1 + dx_right[0] / r2) / r1; + dcos_theta[1] = -sgn * (dx_left[1] * cos_theta / r1 + dx_right[1] / r2) / r1; + dcos_theta[2] = -sgn * (dx_left[2] * cos_theta / r1 + dx_right[2] / r2) / r1; } // both bonds crossing the plane - if (right_cross && left_cross) - { + if (right_cross && left_cross) { // due to right bond double sgn = copysign(1.0, x_angle_middle[dir] - pos); - dcos_theta[0] = -sgn*(dx_right[0]*cos_theta/r2 + dx_left[0]/r1)/r2; - dcos_theta[1] = -sgn*(dx_right[1]*cos_theta/r2 + dx_left[1]/r1)/r2; - dcos_theta[2] = -sgn*(dx_right[2]*cos_theta/r2 + dx_left[2]/r1)/r2; + dcos_theta[0] = -sgn * (dx_right[0] * cos_theta / r2 + dx_left[0] / r1) / r2; + dcos_theta[1] = -sgn * (dx_right[1] * cos_theta / r2 + dx_left[1] / r1) / r2; + dcos_theta[2] = -sgn * (dx_right[2] * cos_theta / r2 + dx_left[2] / r1) / r2; // due to left bond - dcos_theta[0] += sgn*(dx_left[0]*cos_theta/r1 + dx_right[0]/r2)/r1; - dcos_theta[1] += sgn*(dx_left[1]*cos_theta/r1 + dx_right[1]/r2)/r1; - dcos_theta[2] += sgn*(dx_left[2]*cos_theta/r1 + dx_right[2]/r2)/r1; + dcos_theta[0] += sgn * (dx_left[0] * cos_theta / r1 + dx_right[0] / r2) / r1; + dcos_theta[1] += sgn * (dx_left[1] * cos_theta / r1 + dx_right[1] / r2) / r1; + dcos_theta[2] += sgn * (dx_left[2] * cos_theta / r1 + dx_right[2] / r2) / r1; } // final contribution of the given angle term - local_contribution[ibin][0] += duang*dcos_theta[0]/area*nktv2p; - local_contribution[ibin][1] += duang*dcos_theta[1]/area*nktv2p; - local_contribution[ibin][2] += duang*dcos_theta[2]/area*nktv2p; + local_contribution[ibin][0] += duang * dcos_theta[0] / area * nktv2p; + local_contribution[ibin][1] += duang * dcos_theta[1] / area * nktv2p; + local_contribution[ibin][2] += duang * dcos_theta[2] / area * nktv2p; } } } @@ -863,8 +873,8 @@ void ComputeStressMopProfile::compute_angles() if (which[m] == CONF || which[m] == TOTAL || which[m] == ANGLE) { for (int ibin = 0; ibin < nbins; ibin++) { angle_local[ibin][m] = local_contribution[ibin][0]; - angle_local[ibin][m+1] = local_contribution[ibin][1]; - angle_local[ibin][m+2] = local_contribution[ibin][2]; + angle_local[ibin][m + 1] = local_contribution[ibin][1]; + angle_local[ibin][m + 2] = local_contribution[ibin][2]; } } m += 3; @@ -917,9 +927,7 @@ void ComputeStressMopProfile::compute_dihedrals() // initialization for (int m = 0; m < nbins; m++) { - for (int i = 0; i < nvalues; i++) { - dihedral_local[m][i] = 0.0; - } + for (int i = 0; i < nvalues; i++) { dihedral_local[m][i] = 0.0; } local_contribution[m][0] = 0.0; local_contribution[m][1] = 0.0; local_contribution[m][2] = 0.0; @@ -940,9 +948,9 @@ void ComputeStressMopProfile::compute_dihedrals() for (i = 0; i < nd; i++) { if (molecular == 1) { if (tag[atom2] != dihedral_atom2[atom2][i]) continue; - atom1 = atom->map(dihedral_atom1[atom2][i]); - atom3 = atom->map(dihedral_atom3[atom2][i]); - atom4 = atom->map(dihedral_atom4[atom2][i]); + atom1 = atom->map(dihedral_atom1[atom2][i]); + atom3 = atom->map(dihedral_atom3[atom2][i]); + atom4 = atom->map(dihedral_atom4[atom2][i]); } else { if (tag[atom2] != onemols[imol]->dihedral_atom2[atom2][i]) continue; tagprev = tag[atom2] - iatom - 1; @@ -955,7 +963,7 @@ void ComputeStressMopProfile::compute_dihedrals() if (atom3 < 0 || !(mask[atom3] & groupbit)) continue; if (atom4 < 0 || !(mask[atom4] & groupbit)) continue; - for (int ibin = 0; ibin=0) && (tau_right <= 1)); + bool right_cross = ((tau_right >= 0) && (tau_right <= 1)); bool middle_cross = ((tau_middle >= 0) && (tau_middle <= 1)); - bool left_cross = ((tau_left >=0) && (tau_left <= 1)); + bool left_cross = ((tau_left >= 0) && (tau_left <= 1)); // no bonds crossing the plane if (!right_cross && !middle_cross && !left_cross) continue; @@ -1026,45 +1034,45 @@ void ComputeStressMopProfile::compute_dihedrals() vb3z = x_atom_4[2] - x_atom_3[2]; // c0 calculation - sb1 = 1.0 / (vb1x*vb1x + vb1y*vb1y + vb1z*vb1z); - sb2 = 1.0 / (vb2x*vb2x + vb2y*vb2y + vb2z*vb2z); - sb3 = 1.0 / (vb3x*vb3x + vb3y*vb3y + vb3z*vb3z); + sb1 = 1.0 / (vb1x * vb1x + vb1y * vb1y + vb1z * vb1z); + sb2 = 1.0 / (vb2x * vb2x + vb2y * vb2y + vb2z * vb2z); + sb3 = 1.0 / (vb3x * vb3x + vb3y * vb3y + vb3z * vb3z); rb1 = sqrt(sb1); rb3 = sqrt(sb3); - c0 = (vb1x*vb3x + vb1y*vb3y + vb1z*vb3z) * rb1*rb3; + c0 = (vb1x * vb3x + vb1y * vb3y + vb1z * vb3z) * rb1 * rb3; // 1st and 2nd angle - b1mag2 = vb1x*vb1x + vb1y*vb1y + vb1z*vb1z; + b1mag2 = vb1x * vb1x + vb1y * vb1y + vb1z * vb1z; b1mag = sqrt(b1mag2); - b2mag2 = vb2x*vb2x + vb2y*vb2y + vb2z*vb2z; + b2mag2 = vb2x * vb2x + vb2y * vb2y + vb2z * vb2z; b2mag = sqrt(b2mag2); - b3mag2 = vb3x*vb3x + vb3y*vb3y + vb3z*vb3z; + b3mag2 = vb3x * vb3x + vb3y * vb3y + vb3z * vb3z; b3mag = sqrt(b3mag2); - ctmp = vb1x*vb2x + vb1y*vb2y + vb1z*vb2z; - r12c1 = 1.0 / (b1mag*b2mag); + ctmp = vb1x * vb2x + vb1y * vb2y + vb1z * vb2z; + r12c1 = 1.0 / (b1mag * b2mag); c1mag = ctmp * r12c1; - ctmp = vb2xm*vb3x + vb2ym*vb3y + vb2zm*vb3z; - r12c2 = 1.0 / (b2mag*b3mag); + ctmp = vb2xm * vb3x + vb2ym * vb3y + vb2zm * vb3z; + r12c2 = 1.0 / (b2mag * b3mag); c2mag = ctmp * r12c2; // cos and sin of 2 angles and final c - sin2 = MAX(1.0 - c1mag*c1mag,0.0); + sin2 = MAX(1.0 - c1mag * c1mag, 0.0); sc1 = sqrt(sin2); if (sc1 < SMALL) sc1 = SMALL; - sc1 = 1.0/sc1; + sc1 = 1.0 / sc1; - sin2 = MAX(1.0 - c2mag*c2mag,0.0); + sin2 = MAX(1.0 - c2mag * c2mag, 0.0); sc2 = sqrt(sin2); if (sc2 < SMALL) sc2 = SMALL; - sc2 = 1.0/sc2; + sc2 = 1.0 / sc2; s1 = sc1 * sc1; s2 = sc2 * sc2; s12 = sc1 * sc2; - c = (c0 + c1mag*c2mag) * s12; + c = (c0 + c1mag * c2mag) * s12; // error check if (c > 1.0) c = 1.0; @@ -1074,36 +1082,35 @@ void ComputeStressMopProfile::compute_dihedrals() double a = dudih; c = c * a; s12 = s12 * a; - a11 = c*sb1*s1; - a22 = -sb2 * (2.0*c0*s12 - c*(s1+s2)); - a33 = c*sb3*s2; - a12 = -r12c1 * (c1mag*c*s1 + c2mag*s12); - a13 = -rb1*rb3*s12; - a23 = r12c2 * (c2mag*c*s2 + c1mag*s12); + a11 = c * sb1 * s1; + a22 = -sb2 * (2.0 * c0 * s12 - c * (s1 + s2)); + a33 = c * sb3 * s2; + a12 = -r12c1 * (c1mag * c * s1 + c2mag * s12); + a13 = -rb1 * rb3 * s12; + a23 = r12c2 * (c2mag * c * s2 + c1mag * s12); - sx2 = a12*vb1x + a22*vb2x + a23*vb3x; - sy2 = a12*vb1y + a22*vb2y + a23*vb3y; - sz2 = a12*vb1z + a22*vb2z + a23*vb3z; + sx2 = a12 * vb1x + a22 * vb2x + a23 * vb3x; + sy2 = a12 * vb1y + a22 * vb2y + a23 * vb3y; + sz2 = a12 * vb1z + a22 * vb2z + a23 * vb3z; - f1[0] = a11*vb1x + a12*vb2x + a13*vb3x; - f1[1] = a11*vb1y + a12*vb2y + a13*vb3y; - f1[2] = a11*vb1z + a12*vb2z + a13*vb3z; + f1[0] = a11 * vb1x + a12 * vb2x + a13 * vb3x; + f1[1] = a11 * vb1y + a12 * vb2y + a13 * vb3y; + f1[2] = a11 * vb1z + a12 * vb2z + a13 * vb3z; f2[0] = -sx2 - f1[0]; f2[1] = -sy2 - f1[1]; f2[2] = -sz2 - f1[2]; - f4[0] = a13*vb1x + a23*vb2x + a33*vb3x; - f4[1] = a13*vb1y + a23*vb2y + a33*vb3y; - f4[2] = a13*vb1z + a23*vb2z + a33*vb3z; + f4[0] = a13 * vb1x + a23 * vb2x + a33 * vb3x; + f4[1] = a13 * vb1y + a23 * vb2y + a33 * vb3y; + f4[2] = a13 * vb1z + a23 * vb2z + a33 * vb3z; f3[0] = sx2 - f4[0]; f3[1] = sy2 - f4[1]; f3[2] = sz2 - f4[2]; // only right bond crossing the plane - if (right_cross && !middle_cross && !left_cross) - { + if (right_cross && !middle_cross && !left_cross) { double sgn = copysign(1.0, x_atom_1[dir] - pos); df[0] = sgn * f1[0]; df[1] = sgn * f1[1]; @@ -1111,8 +1118,7 @@ void ComputeStressMopProfile::compute_dihedrals() } // only middle bond crossing the plane - if (!right_cross && middle_cross && !left_cross) - { + if (!right_cross && middle_cross && !left_cross) { double sgn = copysign(1.0, x_atom_2[dir] - pos); df[0] = sgn * (f2[0] + f1[0]); df[1] = sgn * (f2[1] + f1[1]); @@ -1120,8 +1126,7 @@ void ComputeStressMopProfile::compute_dihedrals() } // only left bond crossing the plane - if (!right_cross && !middle_cross && left_cross) - { + if (!right_cross && !middle_cross && left_cross) { double sgn = copysign(1.0, x_atom_4[dir] - pos); df[0] = sgn * f4[0]; df[1] = sgn * f4[1]; @@ -1129,8 +1134,7 @@ void ComputeStressMopProfile::compute_dihedrals() } // only right & middle bonds crossing the plane - if (right_cross && middle_cross && !left_cross) - { + if (right_cross && middle_cross && !left_cross) { double sgn = copysign(1.0, x_atom_2[dir] - pos); df[0] = sgn * f2[0]; df[1] = sgn * f2[1]; @@ -1138,8 +1142,7 @@ void ComputeStressMopProfile::compute_dihedrals() } // only right & left bonds crossing the plane - if (right_cross && !middle_cross && left_cross) - { + if (right_cross && !middle_cross && left_cross) { double sgn = copysign(1.0, x_atom_1[dir] - pos); df[0] = sgn * (f1[0] + f4[0]); df[1] = sgn * (f1[1] + f4[1]); @@ -1147,8 +1150,7 @@ void ComputeStressMopProfile::compute_dihedrals() } // only middle & left bonds crossing the plane - if (!right_cross && middle_cross && left_cross) - { + if (!right_cross && middle_cross && left_cross) { double sgn = copysign(1.0, x_atom_3[dir] - pos); df[0] = sgn * f3[0]; df[1] = sgn * f3[1]; @@ -1156,17 +1158,16 @@ void ComputeStressMopProfile::compute_dihedrals() } // all three bonds crossing the plane - if (right_cross && middle_cross && left_cross) - { + if (right_cross && middle_cross && left_cross) { double sgn = copysign(1.0, x_atom_1[dir] - pos); df[0] = sgn * (f1[0] + f3[0]); df[1] = sgn * (f1[1] + f3[1]); df[2] = sgn * (f1[2] + f3[2]); } - local_contribution[ibin][0] += df[0]/area*nktv2p; - local_contribution[ibin][1] += df[1]/area*nktv2p; - local_contribution[ibin][2] += df[2]/area*nktv2p; + local_contribution[ibin][0] += df[0] / area * nktv2p; + local_contribution[ibin][1] += df[1] / area * nktv2p; + local_contribution[ibin][2] += df[2] / area * nktv2p; } } } @@ -1177,13 +1178,12 @@ void ComputeStressMopProfile::compute_dihedrals() if ((which[m] == CONF) || (which[m] == TOTAL) || (which[m] == DIHEDRAL)) { for (int ibin = 0; ibin < nbins; ibin++) { dihedral_local[ibin][m] = local_contribution[ibin][0]; - dihedral_local[ibin][m+1] = local_contribution[ibin][1]; - dihedral_local[ibin][m+2] = local_contribution[ibin][2]; + dihedral_local[ibin][m + 1] = local_contribution[ibin][1]; + dihedral_local[ibin][m + 2] = local_contribution[ibin][2]; } } m += 3; } - } /* ---------------------------------------------------------------------- @@ -1203,11 +1203,11 @@ void ComputeStressMopProfile::setup_bins() if ((origin > domain->boxhi[dir]) || (origin < domain->boxlo[dir])) error->all(FLERR, "Origin of bins for compute stress/mop/profile is out of bounds"); - n = static_cast ((origin - boxlo[dir]) * invdelta); - lo = origin - n*delta; + n = static_cast((origin - boxlo[dir]) * invdelta); + lo = origin - n * delta; - n = static_cast ((boxhi[dir] - origin) * invdelta); - hi = origin + n*delta; + n = static_cast((boxhi[dir] - origin) * invdelta); + hi = origin + n * delta; offset = lo; nbins = static_cast((hi - lo) * invdelta + 1.5); @@ -1221,8 +1221,8 @@ void ComputeStressMopProfile::setup_bins() memory->create(bond_global, nbins, nvalues, "stress/mop/profile:bond_global"); memory->create(angle_local, nbins, nvalues, "stress/mop/profile:angle_local"); memory->create(angle_global, nbins, nvalues, "stress/mop/profile:angle_global"); - memory->create(dihedral_local,nbins,nvalues,"stress/mop/profile:dihedral_local"); - memory->create(dihedral_global,nbins,nvalues,"stress/mop/profile:dihedral_global"); + memory->create(dihedral_local, nbins, nvalues, "stress/mop/profile:dihedral_local"); + memory->create(dihedral_global, nbins, nvalues, "stress/mop/profile:dihedral_global"); memory->create(local_contribution, nbins, 3, "stress/mop/profile:local_contribution"); // set bin coordinates diff --git a/src/EXTRA-FIX/fix_deform_pressure.cpp b/src/EXTRA-FIX/fix_deform_pressure.cpp index e93def4926..a5b7b1fcb1 100644 --- a/src/EXTRA-FIX/fix_deform_pressure.cpp +++ b/src/EXTRA-FIX/fix_deform_pressure.cpp @@ -407,6 +407,16 @@ void FixDeformPressure::init() set_box.vol_start = domain->xprd * domain->yprd * domain->zprd; + // reset cumulative counters to match resetting "start" variables in parent + + for (int i = 0; i < 7; i++) { + set_extra[i].cumulative_remap = 0.0; + set_extra[i].cumulative_shift = 0.0; + set_extra[i].cumulative_vshift[0] = 0.0; + set_extra[i].cumulative_vshift[1] = 0.0; + set_extra[i].cumulative_vshift[2] = 0.0; + } + // check optional variables for PRESSURE or PMEAN style for (int i = 0; i < 7; i++) { diff --git a/src/EXTRA-MOLECULE/angle_gaussian.cpp b/src/EXTRA-MOLECULE/angle_gaussian.cpp index 7290cb70cc..a5d469559f 100644 --- a/src/EXTRA-MOLECULE/angle_gaussian.cpp +++ b/src/EXTRA-MOLECULE/angle_gaussian.cpp @@ -352,3 +352,14 @@ double AngleGaussian::single(int type, int i1, int i2, int i3) if (sum_g_i < SMALL) sum_g_i = SMALL; return -(force->boltz * angle_temperature[type]) * log(sum_g_i); } + +/* ---------------------------------------------------------------------- */ + +void *AngleGaussian::extract(const char *str, int &dim) +{ + dim = 2; + if (strcmp(str,"alpha") == 0) return (void *) alpha; + if (strcmp(str,"width") == 0) return (void *) width; + if (strcmp(str,"theta0") == 0) return (void *) theta0; + return nullptr; +} diff --git a/src/EXTRA-MOLECULE/angle_gaussian.h b/src/EXTRA-MOLECULE/angle_gaussian.h index 305565b032..1652a1948d 100644 --- a/src/EXTRA-MOLECULE/angle_gaussian.h +++ b/src/EXTRA-MOLECULE/angle_gaussian.h @@ -35,6 +35,7 @@ class AngleGaussian : public Angle { void read_restart(FILE *) override; void write_data(FILE *) override; double single(int, int, int, int) override; + void *extract(const char *, int &) override; protected: int *nterms; diff --git a/src/EXTRA-MOLECULE/bond_gaussian.cpp b/src/EXTRA-MOLECULE/bond_gaussian.cpp index 9a8546e278..2ed9e06799 100644 --- a/src/EXTRA-MOLECULE/bond_gaussian.cpp +++ b/src/EXTRA-MOLECULE/bond_gaussian.cpp @@ -337,3 +337,14 @@ void BondGaussian::born_matrix(int type, double rsq, int /*i*/, int /*j*/, doubl du2 = - (force->boltz * bond_temperature[type]) * numerator / denominator; } + +/* ---------------------------------------------------------------------- */ + +void *BondGaussian::extract(const char *str, int &dim) +{ + dim = 2; + if (strcmp(str,"alpha") == 0) return (void *) alpha; + if (strcmp(str,"width") == 0) return (void *) width; + if (strcmp(str,"r0") == 0) return (void *) r0; + return nullptr; +} diff --git a/src/EXTRA-MOLECULE/bond_gaussian.h b/src/EXTRA-MOLECULE/bond_gaussian.h index e466df47d4..d420d81949 100644 --- a/src/EXTRA-MOLECULE/bond_gaussian.h +++ b/src/EXTRA-MOLECULE/bond_gaussian.h @@ -36,6 +36,7 @@ class BondGaussian : public Bond { void write_data(FILE *) override; double single(int, double, int, int, double &) override; void born_matrix(int, double, int, int, double &, double &) override; + void *extract(const char *, int &) override; protected: int *nterms; diff --git a/src/EXTRA-MOLECULE/bond_nonlinear.cpp b/src/EXTRA-MOLECULE/bond_nonlinear.cpp index a2955b7d2e..32de7276d2 100644 --- a/src/EXTRA-MOLECULE/bond_nonlinear.cpp +++ b/src/EXTRA-MOLECULE/bond_nonlinear.cpp @@ -228,6 +228,7 @@ void BondNonlinear::born_matrix(int type, double rsq, int /*i*/, int /*j*/, doub void *BondNonlinear::extract(const char *str, int &dim) { dim = 1; + if (strcmp(str,"lamda")==0) return (void*) lamda; if (strcmp(str,"epsilon")==0) return (void*) epsilon; if (strcmp(str,"r0")==0) return (void*) r0; return nullptr; diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index 1745f6addf..3aa888372c 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -20,8 +20,6 @@ #include -#include - using namespace LAMMPS_NS; using namespace Granular_NS; using namespace MathConst; @@ -154,11 +152,12 @@ double GranSubModDampingTsuji::calculate_forces() ------------------------------------------------------------------------- */ GranSubModDampingCoeffRestitution::GranSubModDampingCoeffRestitution(GranularModel *gm, LAMMPS *lmp) : - GranSubModDamping(gm, lmp) + GranSubModDampingTsuji(gm, lmp) { - allow_cohesion = 0; } +/* ---------------------------------------------------------------------- */ + void GranSubModDampingCoeffRestitution::init() { // Calculate prefactor, assume Hertzian as default @@ -171,15 +170,3 @@ void GranSubModDampingCoeffRestitution::init() damp /= sqrt(MY_PI * MY_PI + logcor * logcor); } } - -double GranSubModDampingCoeffRestitution::calculate_forces() -{ - // in case argument <= 0 due to precision issues - double sqrt1; - if (gm->delta > 0.0) - sqrt1 = MAX(0.0, gm->meff * gm->Fnormal / gm->delta); - else - sqrt1 = 0.0; - damp_prefactor = damp * sqrt(sqrt1); - return -damp_prefactor * gm->vnnr; -} diff --git a/src/GRANULAR/gran_sub_mod_damping.h b/src/GRANULAR/gran_sub_mod_damping.h index c931e385cc..98c31d680a 100644 --- a/src/GRANULAR/gran_sub_mod_damping.h +++ b/src/GRANULAR/gran_sub_mod_damping.h @@ -87,11 +87,10 @@ namespace Granular_NS { /* ---------------------------------------------------------------------- */ - class GranSubModDampingCoeffRestitution : public GranSubModDamping { + class GranSubModDampingCoeffRestitution : public GranSubModDampingTsuji { public: GranSubModDampingCoeffRestitution(class GranularModel *, class LAMMPS *); void init() override; - double calculate_forces() override; }; /* ---------------------------------------------------------------------- */ diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index f4294bbc35..f049d2b5e2 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -12,6 +12,7 @@ ------------------------------------------------------------------------- */ #include "gran_sub_mod_normal.h" + #include "error.h" #include "granular_model.h" #include "math_const.h" diff --git a/src/GRANULAR/gran_sub_mod_rolling.cpp b/src/GRANULAR/gran_sub_mod_rolling.cpp index 4b10bd2358..88647c3f45 100644 --- a/src/GRANULAR/gran_sub_mod_rolling.cpp +++ b/src/GRANULAR/gran_sub_mod_rolling.cpp @@ -77,10 +77,11 @@ void GranSubModRollingSDS::calculate_forces() Frcrit = mu * gm->normal_model->get_fncrit(); + hist_temp[0] = gm->history[rhist0]; + hist_temp[1] = gm->history[rhist1]; + hist_temp[2] = gm->history[rhist2]; + if (gm->history_update) { - hist_temp[0] = gm->history[rhist0]; - hist_temp[1] = gm->history[rhist1]; - hist_temp[2] = gm->history[rhist2]; rolldotn = dot3(hist_temp, gm->nx); frameupdate = (fabs(rolldotn) * k) > (EPSILON * Frcrit); diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index ee2e8e61fe..64ba0c6b03 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -131,6 +131,10 @@ action fft3d_kokkos.h fft3d.h action fftdata_kokkos.h fft3d.h action fix_acks2_reaxff_kokkos.cpp fix_acks2_reaxff.cpp action fix_acks2_reaxff_kokkos.h fix_acks2_reaxff.h +action fix_cmap_kokkos.cpp fix_cmap.cpp +action fix_cmap_kokkos.h fix_cmap.h +action fix_colvars_kokkos.cpp fix_colvars.cpp +action fix_colvars_kokkos.h fix_colvars.h action fix_deform_kokkos.cpp action fix_deform_kokkos.h action fix_dpd_energy_kokkos.cpp fix_dpd_energy.cpp @@ -163,6 +167,8 @@ action fix_npt_kokkos.cpp action fix_npt_kokkos.h action fix_nve_kokkos.cpp action fix_nve_kokkos.h +action fix_nve_limit_kokkos.cpp +action fix_nve_limit_kokkos.h action fix_nve_sphere_kokkos.cpp action fix_nve_sphere_kokkos.h action fix_nvt_kokkos.cpp @@ -179,6 +185,8 @@ action compute_reaxff_atom_kokkos.cpp compute_reaxff_atom.cpp action compute_reaxff_atom_kokkos.h compute_reaxff_atom.h action fix_reaxff_species_kokkos.cpp fix_reaxff_species.cpp action fix_reaxff_species_kokkos.h fix_reaxff_species.h +action fix_recenter_kokkos.cpp +action fix_recenter_kokkos.h action fix_rx_kokkos.cpp fix_rx.cpp action fix_rx_kokkos.h fix_rx.h action fix_setforce_kokkos.cpp @@ -205,8 +213,12 @@ action fix_wall_lj93_kokkos.cpp action fix_wall_lj93_kokkos.h action fix_wall_reflect_kokkos.cpp action fix_wall_reflect_kokkos.h +action fix_wall_region_kokkos.cpp +action fix_wall_region_kokkos.h action grid3d_kokkos.cpp fft3d.h action grid3d_kokkos.h fft3d.h +action group_kokkos.cpp +action group_kokkos.h action improper_class2_kokkos.cpp improper_class2.cpp action improper_class2_kokkos.h improper_class2.h action improper_harmonic_kokkos.cpp improper_harmonic.cpp @@ -409,6 +421,8 @@ action rand_pool_wrap_kokkos.cpp action rand_pool_wrap_kokkos.h action region_block_kokkos.cpp action region_block_kokkos.h +action region_sphere_kokkos.cpp +action region_sphere_kokkos.h action remap_kokkos.cpp remap.cpp action remap_kokkos.h remap.h action sna_kokkos_impl.h sna.cpp diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index e2ae9ffb19..7529921058 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -208,6 +208,8 @@ void AtomKokkos::sort() auto fix_iextra = modify->fix[atom->extra_grow[iextra]]; if (!fix_iextra->sort_device) { flag = 0; + if (comm->me == 0) + error->warning(FLERR,"Fix {} not compatible with Kokkos sorting on device", fix_iextra->style); break; } } diff --git a/src/KOKKOS/atom_vec_kokkos.h b/src/KOKKOS/atom_vec_kokkos.h index 7030f706b8..d4dd68ce18 100644 --- a/src/KOKKOS/atom_vec_kokkos.h +++ b/src/KOKKOS/atom_vec_kokkos.h @@ -24,17 +24,6 @@ namespace LAMMPS_NS { -union d_ubuf { - double d; - int64_t i; - KOKKOS_INLINE_FUNCTION - d_ubuf(double arg) : d(arg) {} - KOKKOS_INLINE_FUNCTION - d_ubuf(int64_t arg) : i(arg) {} - KOKKOS_INLINE_FUNCTION - d_ubuf(int arg) : i(arg) {} -}; - class AtomVecKokkos : virtual public AtomVec { public: AtomVecKokkos(class LAMMPS *); diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index 8f821c3036..5bf7464ac0 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -378,10 +378,10 @@ void CommKokkos::forward_comm(Fix *fix, int size) { if (fix->execution_space == Host || !fix->forward_comm_device || forward_fix_comm_classic) { k_sendlist.sync(); - CommBrick::forward_comm(fix,size); + CommBrick::forward_comm(fix, size); } else { k_sendlist.sync(); - forward_comm_device(fix,size); + forward_comm_device(fix, size); } } @@ -455,10 +455,10 @@ void CommKokkos::forward_comm_device(Fix *fix, int size) /* ---------------------------------------------------------------------- reverse communication invoked by a Fix size/nsize used only to set recv buffer limit - size = 0 (default) -> use comm_forward from Fix + size = 0 (default) -> use comm_reverse from Fix size > 0 -> Fix passes max size per atom the latter is only useful if Fix does several comm modes, - some are smaller than max stored in its comm_forward + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ void CommKokkos::reverse_comm(Fix *fix, int size) @@ -482,72 +482,94 @@ void CommKokkos::reverse_comm_variable(Fix *fix) /* ---------------------------------------------------------------------- forward communication invoked by a Compute - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Compute + size > 0 -> Compute passes max size per atom + the latter is only useful if Compute does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommKokkos::forward_comm(Compute *compute) +void CommKokkos::forward_comm(Compute *compute, int size) { k_sendlist.sync(); - CommBrick::forward_comm(compute); + CommBrick::forward_comm(compute, size); } /* ---------------------------------------------------------------------- forward communication invoked by a Bond - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Bond + size > 0 -> Bond passes max size per atom + the latter is only useful if Bond does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommKokkos::forward_comm(Bond *bond) +void CommKokkos::forward_comm(Bond *bond, int size) { - CommBrick::forward_comm(bond); + CommBrick::forward_comm(bond, size); } /* ---------------------------------------------------------------------- reverse communication invoked by a Bond - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Bond + size > 0 -> Bond passes max size per atom + the latter is only useful if Bond does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommKokkos::reverse_comm(Bond *bond) +void CommKokkos::reverse_comm(Bond *bond, int size) { - CommBrick::reverse_comm(bond); + CommBrick::reverse_comm(bond, size); } /* ---------------------------------------------------------------------- reverse communication invoked by a Compute - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Compute + size > 0 -> Compute passes max size per atom + the latter is only useful if Compute does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommKokkos::reverse_comm(Compute *compute) +void CommKokkos::reverse_comm(Compute *compute, int size) { k_sendlist.sync(); - CommBrick::reverse_comm(compute); + CommBrick::reverse_comm(compute, size); } /* ---------------------------------------------------------------------- forward communication invoked by a Dump - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Dump + size > 0 -> Dump passes max size per atom + the latter is only useful if Dump does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommKokkos::forward_comm(Pair *pair) +void CommKokkos::forward_comm(Pair *pair, int size) { if (pair->execution_space == Host || forward_pair_comm_classic) { k_sendlist.sync(); - CommBrick::forward_comm(pair); + CommBrick::forward_comm(pair, size); } else { k_sendlist.sync(); - forward_comm_device(pair); + forward_comm_device(pair, size); } } /* ---------------------------------------------------------------------- */ template -void CommKokkos::forward_comm_device(Pair *pair) +void CommKokkos::forward_comm_device(Pair *pair, int size) { - int iswap,n; + int iswap,n,nsize; MPI_Request request; DAT::tdual_xfloat_1d k_buf_tmp; - int nsize = pair->comm_forward; + if (size) nsize = size; + else nsize = pair->comm_forward; + KokkosBase* pairKKBase = dynamic_cast(pair); int nmax = max_buf_pair; @@ -623,29 +645,30 @@ void CommKokkos::grow_buf_fix(int n) { /* ---------------------------------------------------------------------- */ -void CommKokkos::reverse_comm(Pair *pair) +void CommKokkos::reverse_comm(Pair *pair, int size) { if (pair->execution_space == Host || !pair->reverse_comm_device || reverse_pair_comm_classic) { k_sendlist.sync(); - CommBrick::reverse_comm(pair); + CommBrick::reverse_comm(pair, size); } else { k_sendlist.sync(); - reverse_comm_device(pair); + reverse_comm_device(pair, size); } } /* ---------------------------------------------------------------------- */ template -void CommKokkos::reverse_comm_device(Pair *pair) +void CommKokkos::reverse_comm_device(Pair *pair, int size) { - int iswap,n; + int iswap,n,nsize; MPI_Request request; DAT::tdual_xfloat_1d k_buf_tmp; KokkosBase* pairKKBase = dynamic_cast(pair); - int nsize = MAX(pair->comm_reverse,pair->comm_reverse_off); + if (size) nsize = size; + else nsize = MAX(pair->comm_reverse, pair->comm_reverse_off); int nmax = max_buf_pair; for (iswap = 0; iswap < nswap; iswap++) { @@ -702,18 +725,18 @@ void CommKokkos::reverse_comm_device(Pair *pair) /* ---------------------------------------------------------------------- */ -void CommKokkos::forward_comm(Dump *dump) +void CommKokkos::forward_comm(Dump *dump, int size) { k_sendlist.sync(); - CommBrick::forward_comm(dump); + CommBrick::forward_comm(dump, size); } /* ---------------------------------------------------------------------- */ -void CommKokkos::reverse_comm(Dump *dump) +void CommKokkos::reverse_comm(Dump *dump, int size) { k_sendlist.sync(); - CommBrick::reverse_comm(dump); + CommBrick::reverse_comm(dump, size); } /* ---------------------------------------------------------------------- @@ -739,6 +762,8 @@ void CommKokkos::exchange() auto fix_iextra = modify->fix[atom->extra_grow[iextra]]; if (!fix_iextra->exchange_comm_device) { flag = 0; + if (comm->me == 0) + error->warning(FLERR,"Fix {} not compatible with sending data in Kokkos communication", fix_iextra->style); break; } } diff --git a/src/KOKKOS/comm_kokkos.h b/src/KOKKOS/comm_kokkos.h index 4fb4dfbe29..42941ff517 100644 --- a/src/KOKKOS/comm_kokkos.h +++ b/src/KOKKOS/comm_kokkos.h @@ -45,24 +45,24 @@ class CommKokkos : public CommBrick { void exchange() override; // move atoms to new procs void borders() override; // setup list of atoms to comm - void forward_comm(class Pair *) override; // forward comm from a Pair - void reverse_comm(class Pair *) override; // reverse comm from a Pair - void forward_comm(class Bond *) override; // forward comm from a Bond - void reverse_comm(class Bond *) override; // reverse comm from a Bond - void forward_comm(class Fix *, int size = 0) override; // forward comm from a Fix - void reverse_comm(class Fix *, int size = 0) override; // reverse comm from a Fix - void reverse_comm_variable(class Fix *) override; // variable size reverse comm from a Fix - void forward_comm(class Compute *) override; // forward from a Compute - void reverse_comm(class Compute *) override; // reverse from a Compute - void forward_comm(class Dump *) override; // forward comm from a Dump - void reverse_comm(class Dump *) override; // reverse comm from a Dump + void forward_comm(class Pair *, int size = 0) override; // forward comm from a Pair + void reverse_comm(class Pair *, int size = 0) override; // reverse comm from a Pair + void forward_comm(class Bond *, int size = 0) override; // forward comm from a Bond + void reverse_comm(class Bond *, int size = 0) override; // reverse comm from a Bond + void forward_comm(class Fix *, int size = 0) override; // forward comm from a Fix + void reverse_comm(class Fix *, int size = 0) override; // reverse comm from a Fix + void reverse_comm_variable(class Fix *) override; // variable size reverse comm from a Fix + void forward_comm(class Compute *, int size = 0) override; // forward from a Compute + void reverse_comm(class Compute *, int size = 0) override; // reverse from a Compute + void forward_comm(class Dump *, int size = 0) override; // forward comm from a Dump + void reverse_comm(class Dump *, int size = 0) override; // reverse comm from a Dump void forward_comm_array(int, double **) override; // forward comm of array template void forward_comm_device(); template void reverse_comm_device(); - template void forward_comm_device(Pair *pair); - template void reverse_comm_device(Pair *pair); + template void forward_comm_device(Pair *pair, int size=0); + template void reverse_comm_device(Pair *pair, int size=0); template void forward_comm_device(Fix *fix, int size=0); template void exchange_device(); template void borders_device(); diff --git a/src/KOKKOS/comm_tiled_kokkos.cpp b/src/KOKKOS/comm_tiled_kokkos.cpp index 2e4ca30bed..afddc079f4 100644 --- a/src/KOKKOS/comm_tiled_kokkos.cpp +++ b/src/KOKKOS/comm_tiled_kokkos.cpp @@ -417,42 +417,58 @@ void CommTiledKokkos::borders() /* ---------------------------------------------------------------------- forward communication invoked by a Pair - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Fix + size > 0 -> Fix passes max size per atom + the latter is only useful if Fix does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommTiledKokkos::forward_comm(Pair *pair) +void CommTiledKokkos::forward_comm(Pair *pair, int size) { - CommTiled::forward_comm(pair); + CommTiled::forward_comm(pair, size); } /* ---------------------------------------------------------------------- reverse communication invoked by a Pair - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Pair + size > 0 -> Pair passes max size per atom + the latter is only useful if Pair does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommTiledKokkos::reverse_comm(Pair *pair) +void CommTiledKokkos::reverse_comm(Pair *pair, int size) { - CommTiled::reverse_comm(pair); + CommTiled::reverse_comm(pair, size); } /* ---------------------------------------------------------------------- forward communication invoked by a Bond - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Bond + size > 0 -> Bond passes max size per atom + the latter is only useful if Bond does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommTiledKokkos::forward_comm(Bond *bond) +void CommTiledKokkos::forward_comm(Bond *bond, int size) { - CommTiled::forward_comm(bond); + CommTiled::forward_comm(bond, size); } /* ---------------------------------------------------------------------- reverse communication invoked by a Bond - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Bond + size > 0 -> Bond passes max size per atom + the latter is only useful if Bond does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommTiledKokkos::reverse_comm(Bond *bond) +void CommTiledKokkos::reverse_comm(Bond *bond, int size) { - CommTiled::reverse_comm(bond); + CommTiled::reverse_comm(bond, size); } /* ---------------------------------------------------------------------- @@ -466,21 +482,21 @@ void CommTiledKokkos::reverse_comm(Bond *bond) void CommTiledKokkos::forward_comm(Fix *fix, int size) { - CommTiled::forward_comm(fix,size); + CommTiled::forward_comm(fix, size); } /* ---------------------------------------------------------------------- reverse communication invoked by a Fix size/nsize used only to set recv buffer limit - size = 0 (default) -> use comm_forward from Fix + size = 0 (default) -> use comm_reverse from Fix size > 0 -> Fix passes max size per atom the latter is only useful if Fix does several comm modes, - some are smaller than max stored in its comm_forward + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ void CommTiledKokkos::reverse_comm(Fix *fix, int size) { - CommTiled::reverse_comm(fix,size); + CommTiled::reverse_comm(fix, size); } /* ---------------------------------------------------------------------- @@ -497,42 +513,58 @@ void CommTiledKokkos::reverse_comm_variable(Fix *fix) /* ---------------------------------------------------------------------- forward communication invoked by a Compute - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Compute + size > 0 -> Compute passes max size per atom + the latter is only useful if Compute does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommTiledKokkos::forward_comm(Compute *compute) +void CommTiledKokkos::forward_comm(Compute *compute, int size) { - CommTiled::forward_comm(compute); + CommTiled::forward_comm(compute, size); } /* ---------------------------------------------------------------------- reverse communication invoked by a Compute - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Compute + size > 0 -> Compute passes max size per atom + the latter is only useful if Compute does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommTiledKokkos::reverse_comm(Compute *compute) +void CommTiledKokkos::reverse_comm(Compute *compute, int size) { - CommTiled::reverse_comm(compute); + CommTiled::reverse_comm(compute, size); } /* ---------------------------------------------------------------------- forward communication invoked by a Dump - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Dump + size > 0 -> Dump passes max size per atom + the latter is only useful if Dump does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommTiledKokkos::forward_comm(Dump *dump) +void CommTiledKokkos::forward_comm(Dump *dump, int size) { - CommTiled::forward_comm(dump); + CommTiled::forward_comm(dump, size); } /* ---------------------------------------------------------------------- reverse communication invoked by a Dump - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Dump + size > 0 -> Dump passes max size per atom + the latter is only useful if Dump does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommTiledKokkos::reverse_comm(Dump *dump) +void CommTiledKokkos::reverse_comm(Dump *dump, int size) { - CommTiled::reverse_comm(dump); + CommTiled::reverse_comm(dump, size); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/comm_tiled_kokkos.h b/src/KOKKOS/comm_tiled_kokkos.h index 9033714796..ef226489c8 100644 --- a/src/KOKKOS/comm_tiled_kokkos.h +++ b/src/KOKKOS/comm_tiled_kokkos.h @@ -46,17 +46,17 @@ class CommTiledKokkos : public CommTiled { void exchange() override; // move atoms to new procs void borders() override; // setup list of atoms to comm - void forward_comm(class Pair *) override; // forward comm from a Pair - void reverse_comm(class Pair *) override; // reverse comm from a Pair - void forward_comm(class Bond *) override; // forward comm from a Bond - void reverse_comm(class Bond *) override; // reverse comm from a Bond - void forward_comm(class Fix *, int size = 0) override; // forward comm from a Fix - void reverse_comm(class Fix *, int size = 0) override; // reverse comm from a Fix - void reverse_comm_variable(class Fix *) override; // variable size reverse comm from a Fix - void forward_comm(class Compute *) override; // forward from a Compute - void reverse_comm(class Compute *) override; // reverse from a Compute - void forward_comm(class Dump *) override; // forward comm from a Dump - void reverse_comm(class Dump *) override; // reverse comm from a Dump + void forward_comm(class Pair *, int size = 0) override; // forward comm from a Pair + void reverse_comm(class Pair *, int size = 0) override; // reverse comm from a Pair + void forward_comm(class Bond *, int size = 0) override; // forward comm from a Bond + void reverse_comm(class Bond *, int size = 0) override; // reverse comm from a Bond + void forward_comm(class Fix *, int size = 0) override; // forward comm from a Fix + void reverse_comm(class Fix *, int size = 0) override; // reverse comm from a Fix + void reverse_comm_variable(class Fix *) override; // variable size reverse comm from a Fix + void forward_comm(class Compute *, int size = 0) override; // forward from a Compute + void reverse_comm(class Compute *, int size = 0) override; // reverse from a Compute + void forward_comm(class Dump *, int size = 0) override; // forward comm from a Dump + void reverse_comm(class Dump *, int size = 0) override; // reverse comm from a Dump void forward_comm_array(int, double **) override; // forward comm of array diff --git a/src/KOKKOS/fix_cmap_kokkos.cpp b/src/KOKKOS/fix_cmap_kokkos.cpp new file mode 100644 index 0000000000..dd92afe9cc --- /dev/null +++ b/src/KOKKOS/fix_cmap_kokkos.cpp @@ -0,0 +1,962 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Mitch Murphy (alphataubio at gmail) +------------------------------------------------------------------------- */ + +#include "fix_cmap_kokkos.h" + +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "comm.h" +#include "domain.h" +#include "error.h" +#include "input.h" +#include "math_const.h" +#include "memory_kokkos.h" +#include "modify.h" +#include "update.h" +#include "variable.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +static constexpr int CMAPMAX = 6; // max # of CMAP terms stored by one atom +static constexpr int CMAPDIM = 24; // grid map dimension is 24 x 24 +static constexpr double CMAPXMIN2 = -180.0; +static constexpr double CMAPDX = 15.0; // 360/CMAPDIM + + +/* ---------------------------------------------------------------------- */ + +template +FixCMAPKokkos::FixCMAPKokkos(LAMMPS *lmp, int narg, char **arg) : + FixCMAP(lmp, narg, arg) +{ + kokkosable = 1; + exchange_comm_device = sort_device = 1; + atomKK = (AtomKokkos *)atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; + + // allocate memory for CMAP data + + memoryKK->create_kokkos(k_g_axis,g_axis,CMAPDIM,"cmap:g_axis"); + memoryKK->create_kokkos(k_cmapgrid,cmapgrid,CMAPMAX,CMAPDIM,CMAPDIM,"cmap:grid"); + memoryKK->create_kokkos(k_d1cmapgrid,d1cmapgrid,CMAPMAX,CMAPDIM,CMAPDIM,"cmap:d1grid"); + memoryKK->create_kokkos(k_d2cmapgrid,d2cmapgrid,CMAPMAX,CMAPDIM,CMAPDIM,"cmap:d2grid"); + memoryKK->create_kokkos(k_d12cmapgrid,d12cmapgrid,CMAPMAX,CMAPDIM,CMAPDIM,"cmap:d12grid"); + + d_g_axis = k_g_axis.template view(); + d_cmapgrid = k_cmapgrid.template view(); + d_d1cmapgrid = k_d1cmapgrid.template view(); + d_d2cmapgrid = k_d2cmapgrid.template view(); + d_d12cmapgrid = k_d12cmapgrid.template view(); + + // read and setup CMAP data + + read_grid_map(arg[3]); + + int i = 0; + double angle = -180.0; + + while (angle < 180.0) { + g_axis[i] = angle; + angle += CMAPDX; + i++; + } + + FixCMAPKokkos::grow_arrays(atom->nmax); + + for( int i=0 ; i(); + k_cmapgrid.template sync(); + k_d1cmapgrid.template sync(); + k_d2cmapgrid.template sync(); + k_d12cmapgrid.template sync(); + + d_count = typename AT::t_int_scalar("fix_cmap:count"); + h_count = Kokkos::create_mirror_view(d_count); + +} + +/* ---------------------------------------------------------------------- */ + +template +FixCMAPKokkos::~FixCMAPKokkos() +{ + if (copymode) return; + + memoryKK->destroy_kokkos(k_g_axis,g_axis); + memoryKK->destroy_kokkos(k_cmapgrid,cmapgrid); + memoryKK->destroy_kokkos(k_d1cmapgrid,d1cmapgrid); + memoryKK->destroy_kokkos(k_d2cmapgrid,d2cmapgrid); + memoryKK->destroy_kokkos(k_d12cmapgrid,d12cmapgrid); + + memoryKK->destroy_kokkos(k_num_crossterm,num_crossterm); + memoryKK->destroy_kokkos(k_crossterm_type,crossterm_type); + memoryKK->destroy_kokkos(k_crossterm_atom1,crossterm_atom1); + memoryKK->destroy_kokkos(k_crossterm_atom2,crossterm_atom2); + memoryKK->destroy_kokkos(k_crossterm_atom3,crossterm_atom3); + memoryKK->destroy_kokkos(k_crossterm_atom4,crossterm_atom4); + memoryKK->destroy_kokkos(k_crossterm_atom5,crossterm_atom5); + + memoryKK->destroy_kokkos(d_crosstermlist); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixCMAPKokkos::init() +{ + if (utils::strmatch(update->integrate_style,"^respa")) + error->all(FLERR,"Cannot yet use respa with Kokkos"); + + // on KOKKOS, allocate enough for all crossterms on each GPU to avoid grow operation in device code + + maxcrossterm = ncmap; + memoryKK->create_kokkos(d_crosstermlist,maxcrossterm,CMAPMAX,"cmap:crosstermlist"); +} + +/* ---------------------------------------------------------------------- + store local neighbor list as if newton_bond = OFF, even if actually ON +------------------------------------------------------------------------- */ + +template +void FixCMAPKokkos::pre_neighbor() +{ + atomKK->sync(execution_space,X_MASK); + d_x = atomKK->k_x.view(); + int nlocal = atomKK->nlocal; + + map_style = atom->map_style; + if (map_style == Atom::MAP_ARRAY) { + k_map_array = atomKK->k_map_array; + k_map_array.template sync(); + } else if (map_style == Atom::MAP_HASH) { + k_map_hash = atomKK->k_map_hash; + k_map_hash.template sync(); + } + + atomKK->k_sametag.sync(); + d_sametag = atomKK->k_sametag.view(); + + copymode = 1; + Kokkos::parallel_scan(Kokkos::RangePolicy(0,nlocal),*this,ncrosstermlist); + copymode = 0; +} + +template +KOKKOS_INLINE_FUNCTION +void FixCMAPKokkos::operator()(TagFixCmapPreNeighbor, const int i, int &l_ncrosstermlist, const bool is_final ) const +{ + for( int m = 0; m < d_num_crossterm(i); m++) { + + int atom1 = AtomKokkos::map_kokkos(d_crossterm_atom1(i,m),map_style,k_map_array,k_map_hash); + int atom2 = AtomKokkos::map_kokkos(d_crossterm_atom2(i,m),map_style,k_map_array,k_map_hash); + int atom3 = AtomKokkos::map_kokkos(d_crossterm_atom3(i,m),map_style,k_map_array,k_map_hash); + int atom4 = AtomKokkos::map_kokkos(d_crossterm_atom4(i,m),map_style,k_map_array,k_map_hash); + int atom5 = AtomKokkos::map_kokkos(d_crossterm_atom5(i,m),map_style,k_map_array,k_map_hash); + + if( atom1 == -1 || atom2 == -1 || atom3 == -1 || atom4 == -1 || atom5 == -1) + Kokkos::abort("CMAP atoms missing on proc"); + + atom1 = closest_image(i,atom1); + atom2 = closest_image(i,atom2); + atom3 = closest_image(i,atom3); + atom4 = closest_image(i,atom4); + atom5 = closest_image(i,atom5); + + if( i <= atom1 && i <= atom2 && i <= atom3 && i <= atom4 && i <= atom5) { + if (l_ncrosstermlist > maxcrossterm) Kokkos::abort("l_ncrosstermlist > maxcrossterm"); + if(is_final) { + d_crosstermlist(l_ncrosstermlist,0) = atom1; + d_crosstermlist(l_ncrosstermlist,1) = atom2; + d_crosstermlist(l_ncrosstermlist,2) = atom3; + d_crosstermlist(l_ncrosstermlist,3) = atom4; + d_crosstermlist(l_ncrosstermlist,4) = atom5; + d_crosstermlist(l_ncrosstermlist,5) = d_crossterm_type(i,m); + } + l_ncrosstermlist++; + } + } +} + +/* ---------------------------------------------------------------------- + compute CMAP terms as if newton_bond = OFF, even if actually ON +------------------------------------------------------------------------- */ + +template +void FixCMAPKokkos::post_force(int vflag) +{ + d_x = atomKK->k_x.template view(); + d_f = atomKK->k_f.template view(); + atomKK->sync(execution_space,X_MASK|F_MASK); + + int eflag = eflag_caller; + ev_init(eflag,vflag); + + copymode = 1; + nlocal = atomKK->nlocal; + Kokkos::parallel_reduce(Kokkos::RangePolicy(0,ncrosstermlist),*this,ecmap); + copymode = 0; + atomKK->modified(execution_space,F_MASK); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixCMAPKokkos::operator()(TagFixCmapPostForce, const int n, double &ecmapKK) const +{ + // Definition of cross-term dihedrals + + // phi dihedral + // |--------------------| + // a1-----a2-----a3-----a4-----a5 cross-term atoms + // C N CA C N cross-term atom types + // |--------------------| + // psi dihedral + + int i1 = d_crosstermlist(n,0); + int i2 = d_crosstermlist(n,1); + int i3 = d_crosstermlist(n,2); + int i4 = d_crosstermlist(n,3); + int i5 = d_crosstermlist(n,4); + int type = d_crosstermlist(n,5); + if (type == 0) return; + + // calculate bond vectors for both dihedrals + + // phi + // vb21 = r2 - r1 + + double vb21x = d_x(i2,0) - d_x(i1,0); + double vb21y = d_x(i2,1) - d_x(i1,1); + double vb21z = d_x(i2,2) - d_x(i1,2); + double vb12x = -1.0*vb21x; + double vb12y = -1.0*vb21y; + double vb12z = -1.0*vb21z; + double vb32x = d_x(i3,0) - d_x(i2,0); + double vb32y = d_x(i3,1) - d_x(i2,1); + double vb32z = d_x(i3,2) - d_x(i2,2); + double vb23x = -1.0*vb32x; + double vb23y = -1.0*vb32y; + double vb23z = -1.0*vb32z; + + double vb34x = d_x(i3,0) - d_x(i4,0); + double vb34y = d_x(i3,1) - d_x(i4,1); + double vb34z = d_x(i3,2) - d_x(i4,2); + + // psi + // bond vectors same as for phi: vb32 + + double vb43x = -1.0*vb34x; + double vb43y = -1.0*vb34y; + double vb43z = -1.0*vb34z; + + double vb45x = d_x(i4,0) - d_x(i5,0); + double vb45y = d_x(i4,1) - d_x(i5,1); + double vb45z = d_x(i4,2) - d_x(i5,2); + + // calculate normal vectors for planes that define the dihedral angles + + double a1x = vb12y*vb23z - vb12z*vb23y; + double a1y = vb12z*vb23x - vb12x*vb23z; + double a1z = vb12x*vb23y - vb12y*vb23x; + + double b1x = vb43y*vb23z - vb43z*vb23y; + double b1y = vb43z*vb23x - vb43x*vb23z; + double b1z = vb43x*vb23y - vb43y*vb23x; + + double a2x = vb23y*vb34z - vb23z*vb34y; + double a2y = vb23z*vb34x - vb23x*vb34z; + double a2z = vb23x*vb34y - vb23y*vb34x; + + double b2x = vb45y*vb43z - vb45z*vb43y; + double b2y = vb45z*vb43x - vb45x*vb43z; + double b2z = vb45x*vb43y - vb45y*vb43x; + + // calculate terms used later in calculations + + double r32 = sqrt(vb32x*vb32x + vb32y*vb32y + vb32z*vb32z); + double a1sq = a1x*a1x + a1y*a1y + a1z*a1z; + double b1sq = b1x*b1x + b1y*b1y + b1z*b1z; + + double r43 = sqrt(vb43x*vb43x + vb43y*vb43y + vb43z*vb43z); + double a2sq = a2x*a2x + a2y*a2y + a2z*a2z; + double b2sq = b2x*b2x + b2y*b2y + b2z*b2z; + if (a1sq<0.0001 || b1sq<0.0001 || a2sq<0.0001 || b2sq<0.0001) return; + + // vectors needed to calculate the cross-term dihedral angles + + double dpr21r32 = vb21x*vb32x + vb21y*vb32y + vb21z*vb32z; + double dpr34r32 = vb34x*vb32x + vb34y*vb32y + vb34z*vb32z; + double dpr32r43 = vb32x*vb43x + vb32y*vb43y + vb32z*vb43z; + double dpr45r43 = vb45x*vb43x + vb45y*vb43y + vb45z*vb43z; + + // cross-term dihedral angles + // calculate the backbone dihedral angles as VMD and GROMACS + + double phi = dihedral_angle_atan2(vb21x,vb21y,vb21z,a1x,a1y,a1z,b1x,b1y,b1z,r32); + double psi = dihedral_angle_atan2(vb32x,vb32y,vb32z,a2x,a2y,a2z,b2x,b2y,b2z,r43); + + if (phi == 180.0) phi= -180.0; + if (psi == 180.0) psi= -180.0; + + double phi1 = phi; + if (phi1 < 0.0) phi1 += 360.0; + double psi1 = psi; + if (psi1 < 0.0) psi1 += 360.0; + + // find the neighbor grid point index + + int li1 = int(((phi1+CMAPXMIN2)/CMAPDX)+((CMAPDIM*1.0)/2.0)); + int li2 = int(((psi1+CMAPXMIN2)/CMAPDX)+((CMAPDIM*1.0)/2.0)); + int li3 = int((phi-CMAPXMIN2)/CMAPDX); + int li4 = int((psi-CMAPXMIN2)/CMAPDX); + int mli3 = li3 % CMAPDIM; + int mli4 = li4 % CMAPDIM; + int mli31 = (li3+1) % CMAPDIM; + int mli41 = (li4+1) %CMAPDIM; + int mli1 = li1 % CMAPDIM; + int mli2 = li2 % CMAPDIM; + int mli11 = (li1+1) % CMAPDIM; + int mli21 = (li2+1) %CMAPDIM; + int t1 = type-1; + if (t1 < 0 || t1 > 5) Kokkos::abort("Invalid CMAP crossterm_type"); + + // determine the values and derivatives for the grid square points + + double gs[4],d1gs[4],d2gs[4],d12gs[4]; + + gs[0] = d_cmapgrid(t1,mli3,mli4); + gs[1] = d_cmapgrid(t1,mli31,mli4); + gs[2] = d_cmapgrid(t1,mli31,mli41); + gs[3] = d_cmapgrid(t1,mli3,mli41); + d1gs[0] = d_d1cmapgrid(t1,mli1,mli2); + d1gs[1] = d_d1cmapgrid(t1,mli11,mli2); + d1gs[2] = d_d1cmapgrid(t1,mli11,mli21); + d1gs[3] = d_d1cmapgrid(t1,mli1,mli21); + d2gs[0] = d_d2cmapgrid(t1,mli1,mli2); + d2gs[1] = d_d2cmapgrid(t1,mli11,mli2); + d2gs[2] = d_d2cmapgrid(t1,mli11,mli21); + d2gs[3] = d_d2cmapgrid(t1,mli1,mli21); + d12gs[0] = d_d12cmapgrid(t1,mli1,mli2); + d12gs[1] = d_d12cmapgrid(t1,mli11,mli2); + d12gs[2] = d_d12cmapgrid(t1,mli11,mli21); + d12gs[3] = d_d12cmapgrid(t1,mli1,mli21); + + // calculate the cmap energy and the gradient (dE/dphi,dE/dpsi) + + double E, dEdPhi, dEdPsi; + bc_interpol(phi,psi,li3,li4,gs,d1gs,d2gs,d12gs,E,dEdPhi,dEdPsi); + + // sum up cmap energy contributions + // needed for compute_scalar() + + double engfraction = 0.2 * E; + if (i1 < nlocal) ecmapKK += engfraction; + if (i2 < nlocal) ecmapKK += engfraction; + if (i3 < nlocal) ecmapKK += engfraction; + if (i4 < nlocal) ecmapKK += engfraction; + if (i5 < nlocal) ecmapKK += engfraction; + + // calculate the derivatives dphi/dr_i + + double dphidr1x = 1.0*r32/a1sq*a1x; + double dphidr1y = 1.0*r32/a1sq*a1y; + double dphidr1z = 1.0*r32/a1sq*a1z; + + double dphidr2x = -1.0*r32/a1sq*a1x - dpr21r32/a1sq/r32*a1x + dpr34r32/b1sq/r32*b1x; + double dphidr2y = -1.0*r32/a1sq*a1y - dpr21r32/a1sq/r32*a1y + dpr34r32/b1sq/r32*b1y; + double dphidr2z = -1.0*r32/a1sq*a1z - dpr21r32/a1sq/r32*a1z + dpr34r32/b1sq/r32*b1z; + + double dphidr3x = dpr34r32/b1sq/r32*b1x - dpr21r32/a1sq/r32*a1x - r32/b1sq*b1x; + double dphidr3y = dpr34r32/b1sq/r32*b1y - dpr21r32/a1sq/r32*a1y - r32/b1sq*b1y; + double dphidr3z = dpr34r32/b1sq/r32*b1z - dpr21r32/a1sq/r32*a1z - r32/b1sq*b1z; + + double dphidr4x = r32/b1sq*b1x; + double dphidr4y = r32/b1sq*b1y; + double dphidr4z = r32/b1sq*b1z; + + // calculate the derivatives dpsi/dr_i + + double dpsidr1x = 1.0*r43/a2sq*a2x; + double dpsidr1y = 1.0*r43/a2sq*a2y; + double dpsidr1z = 1.0*r43/a2sq*a2z; + + double dpsidr2x = r43/a2sq*a2x + dpr32r43/a2sq/r43*a2x - dpr45r43/b2sq/r43*b2x; + double dpsidr2y = r43/a2sq*a2y + dpr32r43/a2sq/r43*a2y - dpr45r43/b2sq/r43*b2y; + double dpsidr2z = r43/a2sq*a2z + dpr32r43/a2sq/r43*a2z - dpr45r43/b2sq/r43*b2z; + + double dpsidr3x = dpr45r43/b2sq/r43*b2x - dpr32r43/a2sq/r43*a2x - r43/b2sq*b2x; + double dpsidr3y = dpr45r43/b2sq/r43*b2y - dpr32r43/a2sq/r43*a2y - r43/b2sq*b2y; + double dpsidr3z = dpr45r43/b2sq/r43*b2z - dpr32r43/a2sq/r43*a2z - r43/b2sq*b2z; + + double dpsidr4x = r43/b2sq*b2x; + double dpsidr4y = r43/b2sq*b2y; + double dpsidr4z = r43/b2sq*b2z; + + // calculate forces on cross-term atoms: F = -(dE/dPhi)*(dPhi/dr) + // apply force to each of the 5 atoms + + if (i1 < nlocal) { + Kokkos::atomic_add(&d_f(i1,0), dEdPhi*dphidr1x); + Kokkos::atomic_add(&d_f(i1,1), dEdPhi*dphidr1y); + Kokkos::atomic_add(&d_f(i1,2), dEdPhi*dphidr1z); + } + if (i2 < nlocal) { + Kokkos::atomic_add(&d_f(i2,0), dEdPhi*dphidr2x + dEdPsi*dpsidr1x); + Kokkos::atomic_add(&d_f(i2,1), dEdPhi*dphidr2y + dEdPsi*dpsidr1y); + Kokkos::atomic_add(&d_f(i2,2), dEdPhi*dphidr2z + dEdPsi*dpsidr1z); + } + if (i3 < nlocal) { + Kokkos::atomic_add(&d_f(i3,0), -dEdPhi*dphidr3x - dEdPsi*dpsidr2x); + Kokkos::atomic_add(&d_f(i3,1), -dEdPhi*dphidr3y - dEdPsi*dpsidr2y); + Kokkos::atomic_add(&d_f(i3,2), -dEdPhi*dphidr3z - dEdPsi*dpsidr2z); + } + if (i4 < nlocal) { + Kokkos::atomic_add(&d_f(i4,0), -dEdPhi*dphidr4x - dEdPsi*dpsidr3x); + Kokkos::atomic_add(&d_f(i4,1), -dEdPhi*dphidr4y - dEdPsi*dpsidr3y); + Kokkos::atomic_add(&d_f(i4,2), -dEdPhi*dphidr4z - dEdPsi*dpsidr3z); + } + if (i5 < nlocal) { + Kokkos::atomic_add(&d_f(i5,0), -dEdPsi*dpsidr4x); + Kokkos::atomic_add(&d_f(i5,1), -dEdPsi*dpsidr4y); + Kokkos::atomic_add(&d_f(i5,2), -dEdPsi*dpsidr4z); + } +} + +/* ---------------------------------------------------------------------- + allocate atom-based array +------------------------------------------------------------------------- */ + +template +void FixCMAPKokkos::grow_arrays(int nmax) +{ + k_num_crossterm.template sync(); + k_crossterm_type.template sync(); + k_crossterm_atom1.template sync(); + k_crossterm_atom2.template sync(); + k_crossterm_atom3.template sync(); + k_crossterm_atom4.template sync(); + k_crossterm_atom5.template sync(); + + // force reallocation on host + + k_num_crossterm.template modify(); + k_crossterm_type.template modify(); + k_crossterm_atom1.template modify(); + k_crossterm_atom2.template modify(); + k_crossterm_atom3.template modify(); + k_crossterm_atom4.template modify(); + k_crossterm_atom5.template modify(); + + memoryKK->grow_kokkos(k_num_crossterm,num_crossterm,nmax,"cmap:num_crossterm"); + memoryKK->grow_kokkos(k_crossterm_type,crossterm_type,nmax,CMAPMAX,"cmap:crossterm_type"); + memoryKK->grow_kokkos(k_crossterm_atom1,crossterm_atom1,nmax,CMAPMAX,"cmap:crossterm_atom1"); + memoryKK->grow_kokkos(k_crossterm_atom2,crossterm_atom2,nmax,CMAPMAX,"cmap:crossterm_atom2"); + memoryKK->grow_kokkos(k_crossterm_atom3,crossterm_atom3,nmax,CMAPMAX,"cmap:crossterm_atom3"); + memoryKK->grow_kokkos(k_crossterm_atom4,crossterm_atom4,nmax,CMAPMAX,"cmap:crossterm_atom4"); + memoryKK->grow_kokkos(k_crossterm_atom5,crossterm_atom5,nmax,CMAPMAX,"cmap:crossterm_atom5"); + + d_num_crossterm = k_num_crossterm.template view(); + d_crossterm_type = k_crossterm_type.template view(); + d_crossterm_atom1 = k_crossterm_atom1.template view(); + d_crossterm_atom2 = k_crossterm_atom2.template view(); + d_crossterm_atom3 = k_crossterm_atom3.template view(); + d_crossterm_atom4 = k_crossterm_atom4.template view(); + d_crossterm_atom5 = k_crossterm_atom5.template view(); + + // must initialize num_crossterm to 0 for added atoms + // may never be set for some atoms when data file is read + + for (int i = nmax_previous; i < nmax; i++) k_num_crossterm.h_view(i) = 0; + nmax_previous = nmax; + + k_num_crossterm.template modify(); + k_crossterm_type.template modify(); + k_crossterm_atom1.template modify(); + k_crossterm_atom2.template modify(); + k_crossterm_atom3.template modify(); + k_crossterm_atom4.template modify(); + k_crossterm_atom5.template modify(); +} + +/* ---------------------------------------------------------------------- + copy values within local atom-based array +------------------------------------------------------------------------- */ + +template +void FixCMAPKokkos::copy_arrays(int i, int j, int delflag) +{ + k_num_crossterm.template sync(); + k_crossterm_type.template sync(); + k_crossterm_atom1.template sync(); + k_crossterm_atom2.template sync(); + k_crossterm_atom3.template sync(); + k_crossterm_atom4.template sync(); + k_crossterm_atom5.template sync(); + + FixCMAP::copy_arrays(i,j,delflag); + + k_num_crossterm.template modify(); + k_crossterm_type.template modify(); + k_crossterm_atom1.template modify(); + k_crossterm_atom2.template modify(); + k_crossterm_atom3.template modify(); + k_crossterm_atom4.template modify(); + k_crossterm_atom5.template modify(); +} + +/* ---------------------------------------------------------------------- + sort local atom-based arrays +------------------------------------------------------------------------- */ + +template +void FixCMAPKokkos::sort_kokkos(Kokkos::BinSort &Sorter) +{ + // always sort on the device + + k_num_crossterm.sync_device(); + k_crossterm_type.sync_device(); + k_crossterm_atom1.sync_device(); + k_crossterm_atom2.sync_device(); + k_crossterm_atom3.sync_device(); + k_crossterm_atom4.sync_device(); + k_crossterm_atom5.sync_device(); + + Sorter.sort(LMPDeviceType(), k_num_crossterm.d_view); + Sorter.sort(LMPDeviceType(), k_crossterm_type.d_view); + Sorter.sort(LMPDeviceType(), k_crossterm_atom1.d_view); + Sorter.sort(LMPDeviceType(), k_crossterm_atom2.d_view); + Sorter.sort(LMPDeviceType(), k_crossterm_atom3.d_view); + Sorter.sort(LMPDeviceType(), k_crossterm_atom4.d_view); + Sorter.sort(LMPDeviceType(), k_crossterm_atom5.d_view); + + k_num_crossterm.modify_device(); + k_crossterm_type.modify_device(); + k_crossterm_atom1.modify_device(); + k_crossterm_atom2.modify_device(); + k_crossterm_atom3.modify_device(); + k_crossterm_atom4.modify_device(); + k_crossterm_atom5.modify_device(); +} + +/* ---------------------------------------------------------------------- + initialize one atom's array values, called when atom is created +------------------------------------------------------------------------- */ + +template +void FixCMAPKokkos::set_arrays(int i) +{ + k_num_crossterm.sync_host(); + num_crossterm[i] = 0; + k_num_crossterm.modify_host(); +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based arrays for exchange with another proc +------------------------------------------------------------------------- */ + +template +int FixCMAPKokkos::pack_exchange(int i, double *buf) +{ + k_num_crossterm.sync_host(); + k_crossterm_type.sync_host(); + k_crossterm_atom1.sync_host(); + k_crossterm_atom2.sync_host(); + k_crossterm_atom3.sync_host(); + k_crossterm_atom4.sync_host(); + k_crossterm_atom5.sync_host(); + + int m = FixCMAP::pack_exchange(i,buf); + + k_num_crossterm.modify_host(); + k_crossterm_type.modify_host(); + k_crossterm_atom1.modify_host(); + k_crossterm_atom2.modify_host(); + k_crossterm_atom3.modify_host(); + k_crossterm_atom4.modify_host(); + k_crossterm_atom5.modify_host(); + + return m; +} + +/* ---------------------------------------------------------------------- + unpack values in local atom-based arrays from exchange with another proc +------------------------------------------------------------------------- */ + +template +int FixCMAPKokkos::unpack_exchange(int nlocal, double *buf) +{ + k_num_crossterm.sync_host(); + k_crossterm_type.sync_host(); + k_crossterm_atom1.sync_host(); + k_crossterm_atom2.sync_host(); + k_crossterm_atom3.sync_host(); + k_crossterm_atom4.sync_host(); + k_crossterm_atom5.sync_host(); + + int m = FixCMAP::unpack_exchange(nlocal,buf); + + k_num_crossterm.modify_host(); + k_crossterm_type.modify_host(); + k_crossterm_atom1.modify_host(); + k_crossterm_atom2.modify_host(); + k_crossterm_atom3.modify_host(); + k_crossterm_atom4.modify_host(); + k_crossterm_atom5.modify_host(); + + return m; +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based array for exchange +------------------------------------------------------------------------- */ + +template +int FixCMAPKokkos::pack_exchange_kokkos( + const int &nsend, DAT::tdual_xfloat_2d &k_buf, + DAT::tdual_int_1d k_exchange_sendlist, DAT::tdual_int_1d k_copylist, + ExecutionSpace space) +{ + k_buf.template sync(); + k_copylist.template sync(); + k_exchange_sendlist.template sync(); + + k_num_crossterm.template sync(); + k_crossterm_type.template sync(); + k_crossterm_atom1.template sync(); + k_crossterm_atom2.template sync(); + k_crossterm_atom3.template sync(); + k_crossterm_atom4.template sync(); + k_crossterm_atom5.template sync(); + + auto d_buf = typename ArrayTypes::t_xfloat_1d_um( + k_buf.template view().data(), + k_buf.extent(0)*k_buf.extent(1)); + auto d_copylist = k_copylist.template view(); + auto d_exchange_sendlist = k_exchange_sendlist.template view(); + + Kokkos::deep_copy(d_count,0); + + auto l_num_crossterm = d_num_crossterm; + auto l_crossterm_type = d_crossterm_type; + auto l_crossterm_atom1 = d_crossterm_atom1; + auto l_crossterm_atom2 = d_crossterm_atom2; + auto l_crossterm_atom3 = d_crossterm_atom3; + auto l_crossterm_atom4 = d_crossterm_atom4; + auto l_crossterm_atom5 = d_crossterm_atom5; + auto l_count = d_count; + + copymode = 1; + + Kokkos::parallel_scan(nsend, KOKKOS_LAMBDA(const int &mysend, int &offset, const bool &final) { + + const int i = d_exchange_sendlist(mysend); + + if (!final) offset += (1+l_num_crossterm(i)*6); + else { + + int m = nsend + offset; + d_buf(mysend) = d_ubuf(m).d; + d_buf(m++) = d_ubuf(l_num_crossterm(i)).d; + + for (int k = 0; k < l_num_crossterm(i); k++) { + d_buf(m++) = d_ubuf(l_crossterm_type(i,k)).d; + d_buf(m++) = d_ubuf(l_crossterm_atom1(i,k)).d; + d_buf(m++) = d_ubuf(l_crossterm_atom2(i,k)).d; + d_buf(m++) = d_ubuf(l_crossterm_atom3(i,k)).d; + d_buf(m++) = d_ubuf(l_crossterm_atom4(i,k)).d; + d_buf(m++) = d_ubuf(l_crossterm_atom5(i,k)).d; + } + + if (mysend == nsend-1) l_count() = m; + offset = m - nsend; + + const int j = d_copylist(mysend); + if (j > -1) { + l_num_crossterm(i) = l_num_crossterm(j); + for (int k = 0; k < l_num_crossterm(i); k++) { + l_crossterm_type(i,k) = l_crossterm_type(j,k); + l_crossterm_atom1(i,k) = l_crossterm_atom1(j,k); + l_crossterm_atom2(i,k) = l_crossterm_atom2(j,k); + l_crossterm_atom3(i,k) = l_crossterm_atom3(j,k); + l_crossterm_atom4(i,k) = l_crossterm_atom4(j,k); + l_crossterm_atom5(i,k) = l_crossterm_atom5(j,k); + } + } + } + }); + + copymode = 0; + + k_buf.template modify(); + if (space == Host) k_buf.template sync(); + else k_buf.template sync(); + + k_num_crossterm.template modify(); + k_crossterm_type.template modify(); + k_crossterm_atom1.template modify(); + k_crossterm_atom2.template modify(); + k_crossterm_atom3.template modify(); + k_crossterm_atom4.template modify(); + k_crossterm_atom5.template modify(); + + Kokkos::deep_copy(h_count,d_count); + return h_count(); +} + +/* ---------------------------------------------------------------------- + unpack values in local atom-based array from exchange +------------------------------------------------------------------------- */ + +template +void FixCMAPKokkos::unpack_exchange_kokkos( + DAT::tdual_xfloat_2d &k_buf, DAT::tdual_int_1d &k_indices, int nrecv, + int nrecv1, int nextrarecv1, ExecutionSpace /*space*/) +{ + k_buf.template sync(); + k_indices.template sync(); + + k_num_crossterm.template sync(); + k_crossterm_type.template sync(); + k_crossterm_atom1.template sync(); + k_crossterm_atom2.template sync(); + k_crossterm_atom3.template sync(); + k_crossterm_atom4.template sync(); + k_crossterm_atom5.template sync(); + + auto d_buf = typename ArrayTypes::t_xfloat_1d_um( + k_buf.template view().data(), + k_buf.extent(0)*k_buf.extent(1)); + + auto d_indices = k_indices.template view(); + + auto l_num_crossterm = d_num_crossterm; + auto l_crossterm_type = d_crossterm_type; + auto l_crossterm_atom1 = d_crossterm_atom1; + auto l_crossterm_atom2 = d_crossterm_atom2; + auto l_crossterm_atom3 = d_crossterm_atom3; + auto l_crossterm_atom4 = d_crossterm_atom4; + auto l_crossterm_atom5 = d_crossterm_atom5; + + copymode = 1; + + Kokkos::parallel_for(nrecv, KOKKOS_LAMBDA(const int &i) { + int index = d_indices(i); + if (index > -1) { + int m = d_ubuf(d_buf(i)).i; + if (i >= nrecv1) m = nextrarecv1 + d_ubuf(d_buf(nextrarecv1 + i - nrecv1)).i; + l_num_crossterm(index) = static_cast (d_ubuf(d_buf(m++)).i); + for (int k = 0; k < l_num_crossterm(index); k++) { + l_crossterm_type(index,k) = static_cast (d_ubuf(d_buf(m++)).i); + l_crossterm_atom1(index,k) = static_cast (d_ubuf(d_buf(m++)).i); + l_crossterm_atom2(index,k) = static_cast (d_ubuf(d_buf(m++)).i); + l_crossterm_atom3(index,k) = static_cast (d_ubuf(d_buf(m++)).i); + l_crossterm_atom4(index,k) = static_cast (d_ubuf(d_buf(m++)).i); + l_crossterm_atom5(index,k) = static_cast (d_ubuf(d_buf(m++)).i); + } + } + }); + + copymode = 0; + + k_num_crossterm.template modify(); + k_crossterm_type.template modify(); + k_crossterm_atom1.template modify(); + k_crossterm_atom2.template modify(); + k_crossterm_atom3.template modify(); + k_crossterm_atom4.template modify(); + k_crossterm_atom5.template modify(); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double FixCMAPKokkos::dihedral_angle_atan2(double fx, double fy, double fz, + double ax, double ay, double az, + double bx, double by, double bz, + double absg) const +{ + // calculate the dihedral angle + + double angle = 0.0, arg1, arg2; + + arg1 = absg*(fx*bx+fy*by+fz*bz); + arg2 = ax*bx+ay*by+az*bz; + + if (arg1 == 0 && arg2 == 0) + Kokkos::abort("CMAP: atan2 function cannot take 2 zero arguments"); + else { + angle = Kokkos::atan2(arg1,arg2); + angle = angle*180.0/MY_PI; + } + + return angle; +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixCMAPKokkos::bc_interpol(double x1, double x2, int low1, int low2, double *gs, + double *d1gs, double *d2gs, double *d12gs, + double &E, double &dEdPhi, double &dEdPsi ) const +{ + + // FUSE bc_coeff() and bc_interpol() inline functions for + // KOKKOS version to avoid passing cij[][] array back and forth + + // calculate the bicubic interpolation coefficients c_ij + + const int wt[16][16] = + { {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, + {-3, 0, 0, 3, 0, 0, 0, 0,-2, 0, 0,-1, 0, 0, 0, 0}, + {2, 0, 0,-2, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0}, + {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, + {0, 0, 0, 0,-3, 0, 0, 3, 0, 0, 0, 0,-2, 0, 0,-1}, + {0, 0, 0, 0, 2, 0, 0,-2, 0, 0, 0, 0, 1, 0, 0, 1}, + {-3, 3, 0, 0,-2,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0,-3, 3, 0, 0,-2,-1, 0, 0}, + {9,-9, 9,-9, 6, 3,-3,-6, 6,-6,-3, 3, 4, 2, 1, 2}, + {-6, 6,-6, 6,-4,-2, 2, 4,-3, 3, 3,-3,-2,-1,-1,-2}, + {2,-2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 1, 1, 0, 0}, + {-6, 6,-6, 6,-3,-3, 3, 3,-4, 4, 2,-2,-2,-2,-1,-1}, + {4,-4, 4,-4, 2, 2,-2,-2, 2,-2,-2, 2, 1, 1, 1, 1} + }; + + int i, j, k, in; + double xx, x[16], cij[4][4]; + + for (i = 0; i < 4; i++) { + x[i] = gs[i]; + x[i+4] = d1gs[i]*CMAPDX; + x[i+8] = d2gs[i]*CMAPDX; + x[i+12] = d12gs[i]*CMAPDX*CMAPDX; + } + + in = 0; + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + xx = 0.0; + for (k = 0; k < 16; k++) xx += wt[in][k]*x[k]; + in++; + cij[i][j] = xx; + } + } + + // for a given point of interest and its corresponding grid square values, + // gradients and cross-derivatives + // calculate the interpolated value of the point of interest (POI) + + double t, u, gs1l, gs2l; + + // set the interpolation coefficients + // bc_coeff(gs,d1gs,d2gs,d12gs,&cij[0]); + + gs1l = d_g_axis(low1); + gs2l = d_g_axis(low2); + + t = (x1-gs1l)/CMAPDX; + u = (x2-gs2l)/CMAPDX; + + E = dEdPhi = dEdPsi = 0.0; + + for (i = 3; i >= 0; i--) { + E = t*E + ((cij[i][3]*u+cij[i][2])*u+cij[i][1])*u+cij[i][0]; + dEdPhi = u*dEdPhi + (3.0*cij[3][i]*t+2.0*cij[2][i])*t+cij[1][i]; + dEdPsi = t*dEdPsi + (3.0*cij[i][3]*u+2.0*cij[i][2])*u+cij[i][1]; + } + + dEdPhi *= (180.0/MY_PI/CMAPDX); + dEdPsi *= (180.0/MY_PI/CMAPDX); +} + +/* ---------------------------------------------------------------------- + return local index of atom J or any of its images that is closest to atom I + if J is not a valid index like -1, just return it + copied from domain.cpp +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +int FixCMAPKokkos::closest_image(const int i, int j) const +{ + if (j < 0) return j; + + const X_FLOAT xi0 = d_x(i,0); + const X_FLOAT xi1 = d_x(i,1); + const X_FLOAT xi2 = d_x(i,2); + + int closest = j; + X_FLOAT delx = xi0 - d_x(j,0); + X_FLOAT dely = xi1 - d_x(j,1); + X_FLOAT delz = xi2 - d_x(j,2); + X_FLOAT rsqmin = delx*delx + dely*dely + delz*delz; + X_FLOAT rsq; + + while (d_sametag[j] >= 0) { + j = d_sametag[j]; + delx = xi0 - d_x(j,0); + dely = xi1 - d_x(j,1); + delz = xi2 - d_x(j,2); + rsq = delx*delx + dely*dely + delz*delz; + if (rsq < rsqmin) { + rsqmin = rsq; + closest = j; + } + } + + return closest; +} + +namespace LAMMPS_NS { +template class FixCMAPKokkos; +#ifdef LMP_KOKKOS_GPU +template class FixCMAPKokkos; +#endif +} diff --git a/src/KOKKOS/fix_cmap_kokkos.h b/src/KOKKOS/fix_cmap_kokkos.h new file mode 100644 index 0000000000..745b2bcfe2 --- /dev/null +++ b/src/KOKKOS/fix_cmap_kokkos.h @@ -0,0 +1,123 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(cmap/kk,FixCMAPKokkos); +FixStyle(cmap/kk/device,FixCMAPKokkos); +FixStyle(cmap/kk/host,FixCMAPKokkos); +// clang-format on +#else + +// clang-format off +#ifndef LMP_FIX_CMAP_KOKKOS_H +#define LMP_FIX_CMAP_KOKKOS_H + +#include "fix_cmap.h" + +#include "kokkos_base.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +struct TagFixCmapPreNeighbor{}; +struct TagFixCmapPostForce{}; + +template +class FixCMAPKokkos : public FixCMAP, public KokkosBase { + typedef ArrayTypes AT; + + public: + FixCMAPKokkos(class LAMMPS *, int, char **); + ~FixCMAPKokkos() override; + + void init() override; + void pre_neighbor() override; + void post_force(int) override; + + KOKKOS_INLINE_FUNCTION + void operator()(TagFixCmapPreNeighbor, const int, int&, const bool) const; + + KOKKOS_INLINE_FUNCTION + void operator()(TagFixCmapPostForce, const int, double&) const; + + void grow_arrays(int) override; + void copy_arrays(int, int, int) override; + void sort_kokkos(Kokkos::BinSort &Sorter) override; + void set_arrays(int) override; + int pack_exchange(int, double *) override; + int unpack_exchange(int, double *) override; + + int pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat_2d &buf, + DAT::tdual_int_1d k_sendlist, + DAT::tdual_int_1d k_copylist, + ExecutionSpace space) override; + + void unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf, + DAT::tdual_int_1d &indices,int nrecv, + int nrecv1,int nrecv1extra, + ExecutionSpace space) override; + + protected: + + int nlocal; + + typename AT::t_x_array d_x; + typename AT::t_f_array d_f; + + DAT::tdual_int_1d k_sametag; + typename AT::t_int_1d d_sametag; + int map_style; + DAT::tdual_int_1d k_map_array; + dual_hash_type k_map_hash; + + typename AT::t_int_scalar d_count; + HAT::t_int_scalar h_count; + + DAT::tdual_int_1d k_num_crossterm; + typename AT::t_int_1d d_num_crossterm; + + DAT::tdual_int_2d k_crossterm_type; + typename AT::t_int_2d d_crosstermlist, d_crossterm_type; + + DAT::tdual_tagint_2d k_crossterm_atom1, k_crossterm_atom2, k_crossterm_atom3; + DAT::tdual_tagint_2d k_crossterm_atom4, k_crossterm_atom5; + typename AT::t_tagint_2d d_crossterm_atom1, d_crossterm_atom2, d_crossterm_atom3; + typename AT::t_tagint_2d d_crossterm_atom4, d_crossterm_atom5; + + DAT::tdual_float_1d k_g_axis; + typename AT::t_float_1d d_g_axis; + + DAT::tdual_float_3d k_cmapgrid, k_d1cmapgrid, k_d2cmapgrid, k_d12cmapgrid; + typename AT::t_float_3d d_cmapgrid, d_d1cmapgrid, d_d2cmapgrid, d_d12cmapgrid; + + // calculate dihedral angles + KOKKOS_INLINE_FUNCTION + double dihedral_angle_atan2(double, double, double, double, double, double, double, double, + double, double) const; + + // perform bicubic interpolation at point of interest + KOKKOS_INLINE_FUNCTION + void bc_interpol(double, double, int, int, double *, double *, double *, double *, + double &, double &, double &) const; + + // copied from Domain + KOKKOS_INLINE_FUNCTION + int closest_image(const int, int) const; + +}; + +} // namespace LAMMPS_NS + +#endif // LMP_FIX_CMAP_KOKKOS_H +#endif // FIX_CLASS diff --git a/src/KOKKOS/fix_colvars_kokkos.cpp b/src/KOKKOS/fix_colvars_kokkos.cpp new file mode 100644 index 0000000000..faf738f9e7 --- /dev/null +++ b/src/KOKKOS/fix_colvars_kokkos.cpp @@ -0,0 +1,51 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Mitch Murphy (alphataubio at gmail) +------------------------------------------------------------------------- */ + +#include "fix_colvars_kokkos.h" + +#include "atom_kokkos.h" +#include "atom_masks.h" + +using namespace LAMMPS_NS; + +FixColvarsKokkos::FixColvarsKokkos(LAMMPS *lmp, int narg, char **arg) : + FixColvars(lmp, narg, arg) +{ + kokkosable = 1; + atomKK = (AtomKokkos *)atom; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; +} + +/* ---------------------------------------------------------------------- */ + +void FixColvarsKokkos::post_force(int vflag) +{ + atomKK->sync(Host,X_MASK|F_MASK|TAG_MASK|IMAGE_MASK); + FixColvars::post_force(vflag); + atomKK->modified(Host,F_MASK); +} + +/* ---------------------------------------------------------------------- */ +void FixColvarsKokkos::end_of_step() +{ + if (store_forces) { + atomKK->sync(Host,F_MASK|TAG_MASK); + FixColvars::end_of_step(); + } +} diff --git a/src/KOKKOS/fix_colvars_kokkos.h b/src/KOKKOS/fix_colvars_kokkos.h new file mode 100644 index 0000000000..fe649c7350 --- /dev/null +++ b/src/KOKKOS/fix_colvars_kokkos.h @@ -0,0 +1,42 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(colvars/kk,FixColvarsKokkos); +FixStyle(colvars/kk/device,FixColvarsKokkos); +FixStyle(colvars/kk/host,FixColvarsKokkos); +// clang-format on +#else + +#ifndef LMP_FIX_COLVARS_KOKKOS_H +#define LMP_FIX_COLVARS_KOKKOS_H + +#include "fix_colvars.h" + +namespace LAMMPS_NS { + +class FixColvarsKokkos : public FixColvars { + + public: + FixColvarsKokkos(class LAMMPS *, int, char **); + + void post_force(int) override; + void end_of_step() override; + +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/KOKKOS/fix_efield_kokkos.cpp b/src/KOKKOS/fix_efield_kokkos.cpp index b08542fd17..45af29e36d 100644 --- a/src/KOKKOS/fix_efield_kokkos.cpp +++ b/src/KOKKOS/fix_efield_kokkos.cpp @@ -106,7 +106,7 @@ void FixEfieldKokkos::post_force(int vflag) // update region if necessary if (region) { - if (!utils::strmatch(region->style, "^block")) + if (!(utils::strmatch(region->style, "^block") || utils::strmatch(region->style, "^sphere"))) error->all(FLERR,"Cannot (yet) use {}-style region with fix efield/kk",region->style); region->prematch(); DAT::tdual_int_1d k_match = DAT::tdual_int_1d("efield:k_match",nlocal); diff --git a/src/KOKKOS/fix_momentum_kokkos.cpp b/src/KOKKOS/fix_momentum_kokkos.cpp index fa959cd582..b41a3530cb 100644 --- a/src/KOKKOS/fix_momentum_kokkos.cpp +++ b/src/KOKKOS/fix_momentum_kokkos.cpp @@ -24,7 +24,8 @@ using namespace LAMMPS_NS; using namespace FixConst; /* ---------------------------------------------------------------------- - Contributing author: Dan Ibanez (SNL) + Contributing authors: Dan Ibanez (SNL) + Mitch Murphy (alphataubio at gmail) ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */ @@ -35,6 +36,7 @@ FixMomentumKokkos::FixMomentumKokkos(LAMMPS *lmp, int narg, char **a { kokkosable = 1; atomKK = (AtomKokkos *) atom; + groupKK = (GroupKokkos *)group; execution_space = ExecutionSpaceFromDevice::space; datamask_read = EMPTY_MASK; datamask_modify = EMPTY_MASK; @@ -92,8 +94,7 @@ void FixMomentumKokkos::end_of_step() double ekin_old,ekin_new; ekin_old = ekin_new = 0.0; - if (dynamic) - masstotal = group->mass(igroup); // change once Group is ported to Kokkos + if (dynamic) masstotal = groupKK->mass(igroup); // do nothing if group is empty, i.e. mass is zero; @@ -107,12 +108,8 @@ void FixMomentumKokkos::end_of_step() auto groupbit2 = groupbit; if (linear) { - /* this is needed because Group is not Kokkos-aware ! */ - atomKK->sync(ExecutionSpaceFromDevice::space, - V_MASK | MASK_MASK | TYPE_MASK | RMASS_MASK); - Few tmpvcm; - group->vcm(igroup,masstotal,&tmpvcm[0]); - const Few vcm(tmpvcm); + double vcm[3]; + groupKK->vcm(igroup,masstotal,vcm); // adjust velocities by vcm to zero linear momentum // only adjust a component if flag is set @@ -133,20 +130,11 @@ void FixMomentumKokkos::end_of_step() } if (angular) { - Few tmpxcm, tmpangmom, tmpomega; - double inertia[3][3]; - /* syncs for each Kokkos-unaware Group method */ - atomKK->sync(ExecutionSpaceFromDevice::space, - X_MASK | MASK_MASK | TYPE_MASK | IMAGE_MASK | RMASS_MASK); - group->xcm(igroup,masstotal,&tmpxcm[0]); - atomKK->sync(ExecutionSpaceFromDevice::space, - X_MASK | V_MASK | MASK_MASK | TYPE_MASK | IMAGE_MASK | RMASS_MASK); - group->angmom(igroup,&tmpxcm[0],&tmpangmom[0]); - atomKK->sync(ExecutionSpaceFromDevice::space, - X_MASK | MASK_MASK | TYPE_MASK | IMAGE_MASK | RMASS_MASK); - group->inertia(igroup,&tmpxcm[0],inertia); - group->omega(&tmpangmom[0],inertia,&tmpomega[0]); - const Few xcm(tmpxcm), angmom(tmpangmom), omega(tmpomega); + double xcm[3],angmom[3],omega[3],inertia[3][3]; + groupKK->xcm(igroup,masstotal,xcm); + groupKK->angmom(igroup,xcm,angmom); + groupKK->inertia(igroup,xcm,inertia); + group->omega(angmom,inertia,omega); // adjust velocities to zero omega // vnew_i = v_i - w x r_i @@ -167,10 +155,10 @@ void FixMomentumKokkos::end_of_step() x_i[0] = x(i,0); x_i[1] = x(i,1); x_i[2] = x(i,2); - auto unwrap = DomainKokkos::unmap(prd,h,triclinic,x_i,image(i)); - auto dx = unwrap[0] - xcm[0]; - auto dy = unwrap[1] - xcm[1]; - auto dz = unwrap[2] - xcm[2]; + auto unwrapKK = DomainKokkos::unmap(prd,h,triclinic,x_i,image(i)); + auto dx = unwrapKK[0] - xcm[0]; + auto dy = unwrapKK[1] - xcm[1]; + auto dz = unwrapKK[2] - xcm[2]; v(i,0) -= omega[1]*dz - omega[2]*dy; v(i,1) -= omega[2]*dx - omega[0]*dz; v(i,2) -= omega[0]*dy - omega[1]*dx; diff --git a/src/KOKKOS/fix_momentum_kokkos.h b/src/KOKKOS/fix_momentum_kokkos.h index 3bb46035fe..0ab91c423d 100644 --- a/src/KOKKOS/fix_momentum_kokkos.h +++ b/src/KOKKOS/fix_momentum_kokkos.h @@ -24,6 +24,8 @@ FixStyle(momentum/kk/host,FixMomentumKokkos); #define LMP_FIX_MOMENTUM_KOKKOS_H #include "fix_momentum.h" + +#include "group_kokkos.h" #include "kokkos_type.h" namespace LAMMPS_NS { @@ -35,6 +37,8 @@ class FixMomentumKokkos : public FixMomentum { FixMomentumKokkos(class LAMMPS *, int, char **); void end_of_step() override; + private: + GroupKokkos *groupKK; }; } diff --git a/src/KOKKOS/fix_nve_limit_kokkos.cpp b/src/KOKKOS/fix_nve_limit_kokkos.cpp new file mode 100644 index 0000000000..de77427e49 --- /dev/null +++ b/src/KOKKOS/fix_nve_limit_kokkos.cpp @@ -0,0 +1,202 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Mitch Murphy, alphataubio at gmail +------------------------------------------------------------------------- */ + +#include "fix_nve_limit_kokkos.h" + +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "kokkos_type.h" + +#include + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +template +FixNVELimitKokkos::FixNVELimitKokkos(LAMMPS *lmp, int narg, char **arg) : + FixNVELimit(lmp, narg, arg) +{ + kokkosable = 1; + execution_space = ExecutionSpaceFromDevice::space; + atomKK = (AtomKokkos *) atom; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; +} + +/* ---------------------------------------------------------------------- + allow for both per-type and per-atom mass +------------------------------------------------------------------------- */ + +template +void FixNVELimitKokkos::initial_integrate(int /*vflag*/) +{ + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + auto d_x = atomKK->k_x.template view(); + auto d_v = atomKK->k_v.template view(); + auto d_f = atomKK->k_f.template view(); + auto d_mask = atomKK->k_mask.template view(); + auto l_groupbit = groupbit; + auto l_dtf = dtf; + auto l_dtv = dtv; + auto l_vlimitsq = vlimitsq; + + int d_ncount; + + if (atomKK->rmass) { + + auto d_rmass = atomKK->k_rmass.template view(); + auto d_type = atomKK->k_type.template view(); + atomKK->sync(execution_space, X_MASK|V_MASK|F_MASK|MASK_MASK|RMASS_MASK ); + + Kokkos::parallel_reduce(nlocal, KOKKOS_LAMBDA(const int i, int &l_ncount) { + if (d_mask[i] & l_groupbit) { + const double dtfm = l_dtf / d_rmass[i]; + d_v(i,0) += dtfm * d_f(i,0); + d_v(i,1) += dtfm * d_f(i,1); + d_v(i,2) += dtfm * d_f(i,2); + + const double vsq = d_v(i,0)*d_v(i,0) + d_v(i,1)*d_v(i,1) + d_v(i,2)*d_v(i,2); + if (vsq > l_vlimitsq) { + l_ncount++; + const double scale = sqrt(l_vlimitsq/vsq); + d_v(i,0) *= scale; + d_v(i,1) *= scale; + d_v(i,2) *= scale; + } + + d_x(i,0) += l_dtv * d_v(i,0); + d_x(i,1) += l_dtv * d_v(i,1); + d_x(i,2) += l_dtv * d_v(i,2); + } + }, d_ncount); + + } else { + + auto d_mass = atomKK->k_mass.template view(); + auto d_type = atomKK->k_type.template view(); + auto l_groupbit = groupbit; + atomKK->sync(execution_space, X_MASK|V_MASK|F_MASK|MASK_MASK|TYPE_MASK ); + + Kokkos::parallel_reduce(nlocal, KOKKOS_LAMBDA(const int i, int &l_ncount) { + if (d_mask[i] & l_groupbit) { + const double dtfm = l_dtf / d_mass[d_type[i]]; + d_v(i,0) += dtfm * d_f(i,0); + d_v(i,1) += dtfm * d_f(i,1); + d_v(i,2) += dtfm * d_f(i,2); + + const double vsq = d_v(i,0)*d_v(i,0) + d_v(i,1)*d_v(i,1) + d_v(i,2)*d_v(i,2); + if (vsq > l_vlimitsq) { + l_ncount++; + const double scale = sqrt(l_vlimitsq/vsq); + d_v(i,0) *= scale; + d_v(i,1) *= scale; + d_v(i,2) *= scale; + } + + d_x(i,0) += l_dtv * d_v(i,0); + d_x(i,1) += l_dtv * d_v(i,1); + d_x(i,2) += l_dtv * d_v(i,2); + } + }, d_ncount); + } + + ncount += d_ncount; + atomKK->modified(execution_space, X_MASK | V_MASK ); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixNVELimitKokkos::final_integrate() +{ + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + auto d_v = atomKK->k_v.template view(); + auto d_f = atomKK->k_f.template view(); + auto d_mask = atomKK->k_mask.template view(); + auto l_groupbit = groupbit; + auto l_dtf = dtf; + auto l_vlimitsq = vlimitsq; + + int d_ncount; + + if (atomKK->rmass) { + + auto d_rmass = atomKK->k_rmass.template view(); + atomKK->sync(execution_space, V_MASK|F_MASK|MASK_MASK|RMASS_MASK ); + + Kokkos::parallel_reduce(nlocal, KOKKOS_LAMBDA(const int i, int &l_ncount) { + if (d_mask[i] & l_groupbit) { + const double dtfm = l_dtf / d_rmass[i]; + d_v(i,0) += dtfm * d_f(i,0); + d_v(i,1) += dtfm * d_f(i,1); + d_v(i,2) += dtfm * d_f(i,2); + + const double vsq = d_v(i,0)*d_v(i,0) + d_v(i,1)*d_v(i,1) + d_v(i,2)*d_v(i,2); + if (vsq > l_vlimitsq) { + l_ncount++; + const double scale = sqrt(l_vlimitsq/vsq); + d_v(i,0) *= scale; + d_v(i,1) *= scale; + d_v(i,2) *= scale; + } + } + }, d_ncount); + + } else { + + auto d_mass = atomKK->k_mass.template view(); + auto d_type = atomKK->k_type.template view(); + atomKK->sync(execution_space, V_MASK|F_MASK|MASK_MASK|TYPE_MASK ); + + Kokkos::parallel_reduce(nlocal, KOKKOS_LAMBDA(const int i, int &l_ncount) { + if (d_mask[i] & l_groupbit) { + const double dtfm = l_dtf / d_mass[d_type[i]]; + d_v(i,0) += dtfm * d_f(i,0); + d_v(i,1) += dtfm * d_f(i,1); + d_v(i,2) += dtfm * d_f(i,2); + + const double vsq = d_v(i,0)*d_v(i,0) + d_v(i,1)*d_v(i,1) + d_v(i,2)*d_v(i,2); + if (vsq > l_vlimitsq) { + l_ncount++; + const double scale = sqrt(l_vlimitsq/vsq); + d_v(i,0) *= scale; + d_v(i,1) *= scale; + d_v(i,2) *= scale; + } + } + }, d_ncount); + } + + ncount += d_ncount; + atomKK->modified(execution_space, V_MASK ); +} + +/* ---------------------------------------------------------------------- */ + +namespace LAMMPS_NS { +template class FixNVELimitKokkos; +#ifdef LMP_KOKKOS_GPU +template class FixNVELimitKokkos; +#endif +} + diff --git a/src/KOKKOS/fix_nve_limit_kokkos.h b/src/KOKKOS/fix_nve_limit_kokkos.h new file mode 100644 index 0000000000..b611996b66 --- /dev/null +++ b/src/KOKKOS/fix_nve_limit_kokkos.h @@ -0,0 +1,43 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(nve/limit/kk,FixNVELimitKokkos); +FixStyle(nve/limit/kk/device,FixNVELimitKokkos); +FixStyle(nve/limit/kk/host,FixNVELimitKokkos); + +// clang-format on +#else + +#ifndef LMP_FIX_NVE_LIMIT_KOKKOS_H +#define LMP_FIX_NVE_LIMIT_KOKKOS_H + +#include "fix_nve_limit.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +template +class FixNVELimitKokkos : public FixNVELimit { + public: + FixNVELimitKokkos(class LAMMPS *, int, char **); + void initial_integrate(int) override; + void final_integrate() override; + +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/KOKKOS/fix_recenter_kokkos.cpp b/src/KOKKOS/fix_recenter_kokkos.cpp new file mode 100644 index 0000000000..607f5ce8d9 --- /dev/null +++ b/src/KOKKOS/fix_recenter_kokkos.cpp @@ -0,0 +1,128 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Mitch Murphy (alphataubio at gmail) +------------------------------------------------------------------------- */ + +#include "fix_recenter_kokkos.h" + +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "input.h" +#include "modify.h" +#include "update.h" +#include "domain.h" +#include "group_kokkos.h" + +using namespace LAMMPS_NS; + +enum{BOX,LATTICE,FRACTION}; + +/* ---------------------------------------------------------------------- */ + +template +FixRecenterKokkos::FixRecenterKokkos(LAMMPS *lmp, int narg, char **arg) : + FixRecenter(lmp, narg, arg) +{ + kokkosable = 1; + atomKK = (AtomKokkos *)atom; + groupKK = (GroupKokkos *)group; + execution_space = ExecutionSpaceFromDevice::space; + + datamask_read = X_MASK | MASK_MASK; + datamask_modify = X_MASK; +} + +/* ---------------------------------------------------------------------- */ + +template +void FixRecenterKokkos::initial_integrate(int /*vflag*/) +{ + atomKK->sync(execution_space,datamask_read); + int nlocal = atomKK->nlocal; + if (igroup == atomKK->firstgroup) nlocal = atomKK->nfirst; + + // target COM + // bounding box around domain works for both orthogonal and triclinic + + double xtarget,ytarget,ztarget; + double *bboxlo,*bboxhi; + + if (scaleflag == FRACTION) { + if (domain->triclinic == 0) { + bboxlo = domain->boxlo; + bboxhi = domain->boxhi; + } else { + bboxlo = domain->boxlo_bound; + bboxhi = domain->boxhi_bound; + } + } + + if (xinitflag) xtarget = xinit; + else if (scaleflag == FRACTION) + xtarget = bboxlo[0] + xcom*(bboxhi[0] - bboxlo[0]); + else xtarget = xcom; + + if (yinitflag) ytarget = yinit; + else if (scaleflag == FRACTION) + ytarget = bboxlo[1] + ycom*(bboxhi[1] - bboxlo[1]); + else ytarget = ycom; + + if (zinitflag) ztarget = zinit; + else if (scaleflag == FRACTION) + ztarget = bboxlo[2] + zcom*(bboxhi[2] - bboxlo[2]); + else ztarget = zcom; + + // current COM + + if (group->dynamic[igroup]) masstotal = groupKK->mass(igroup); + double xcm[3]; + groupKK->xcm(igroup,masstotal,xcm); + + // shift coords by difference between actual COM and requested COM + + shift[0] = xflag ? (xtarget - xcm[0]) : 0.0; + shift[1] = yflag ? (ytarget - xcm[1]) : 0.0; + shift[2] = zflag ? (ztarget - xcm[2]) : 0.0; + distance = sqrt(shift[0]*shift[0] + shift[1]*shift[1] + shift[2]*shift[2]); + + auto d_x = atomKK->k_x.template view(); + auto d_mask = atomKK->k_mask.template view(); + auto l_group2bit = group2bit; + double l_shiftx = shift[0]; + double l_shifty = shift[1]; + double l_shiftz = shift[2]; + + copymode = 1; + + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal), + KOKKOS_LAMBDA(const int i) { + if (d_mask[i] & l_group2bit) { + d_x(i,0) += l_shiftx; + d_x(i,1) += l_shifty; + d_x(i,2) += l_shiftz; + } + }); + + copymode = 0; + atomKK->modified(execution_space,datamask_modify); +} + +namespace LAMMPS_NS { +template class FixRecenterKokkos; +#ifdef LMP_KOKKOS_GPU +template class FixRecenterKokkos; +#endif +} diff --git a/src/KOKKOS/fix_recenter_kokkos.h b/src/KOKKOS/fix_recenter_kokkos.h new file mode 100644 index 0000000000..36e154e05c --- /dev/null +++ b/src/KOKKOS/fix_recenter_kokkos.h @@ -0,0 +1,45 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(recenter/kk,FixRecenterKokkos); +FixStyle(recenter/kk/device,FixRecenterKokkos); +FixStyle(recenter/kk/host,FixRecenterKokkos); +// clang-format on +#else + +// clang-format off +#ifndef LMP_FIX_RECENTER_KOKKOS_H +#define LMP_FIX_RECENTER_KOKKOS_H + +#include "fix_recenter.h" + +#include "group_kokkos.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +template +class FixRecenterKokkos : public FixRecenter { + public: + FixRecenterKokkos(class LAMMPS *, int, char **); + void initial_integrate(int) override; + private: + GroupKokkos *groupKK; +}; + +} // namespace LAMMPS_NS + +#endif // LMP_FIX_RECENTER_KOKKOS_H +#endif // FIX_CLASS diff --git a/src/KOKKOS/fix_setforce_kokkos.cpp b/src/KOKKOS/fix_setforce_kokkos.cpp index e8f376643f..8c69c33fcf 100644 --- a/src/KOKKOS/fix_setforce_kokkos.cpp +++ b/src/KOKKOS/fix_setforce_kokkos.cpp @@ -84,7 +84,7 @@ void FixSetForceKokkos::post_force(int /*vflag*/) // update region if necessary if (region) { - if (!utils::strmatch(region->style, "^block")) + if (!(utils::strmatch(region->style, "^block") || utils::strmatch(region->style, "^sphere"))) error->all(FLERR,"Cannot (yet) use {}-style region with fix setforce/kk",region->style); region->prematch(); DAT::tdual_int_1d k_match = DAT::tdual_int_1d("setforce:k_match",nlocal); diff --git a/src/KOKKOS/fix_spring_self_kokkos.cpp b/src/KOKKOS/fix_spring_self_kokkos.cpp index 9ba796b1ab..1b6d45ead7 100644 --- a/src/KOKKOS/fix_spring_self_kokkos.cpp +++ b/src/KOKKOS/fix_spring_self_kokkos.cpp @@ -79,6 +79,9 @@ void FixSpringSelfKokkos::init() { FixSpringSelf::init(); + if (kstyle != CONSTANT) + error->all(FLERR, "Fix spring/self/kk does not support variable spring constants (yet)"); + if (utils::strmatch(update->integrate_style,"^respa")) error->all(FLERR,"Cannot (yet) use respa with Kokkos"); } diff --git a/src/KOKKOS/fix_wall_region_kokkos.cpp b/src/KOKKOS/fix_wall_region_kokkos.cpp new file mode 100644 index 0000000000..ab6f7186a1 --- /dev/null +++ b/src/KOKKOS/fix_wall_region_kokkos.cpp @@ -0,0 +1,357 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Mitch Murphy (alphataubio at gmail) +------------------------------------------------------------------------- */ + +#include "fix_wall_region_kokkos.h" + +#include "atom_masks.h" +#include "atom_kokkos.h" +#include "error.h" +#include "kokkos_base.h" +#include "math_special_kokkos.h" +#include "memory_kokkos.h" +#include "region.h" +#include "region_block_kokkos.h" +#include "region_sphere_kokkos.h" + +using namespace LAMMPS_NS; +using namespace MathSpecialKokkos; + +enum { LJ93, LJ126, LJ1043, COLLOID, HARMONIC, MORSE }; + +/* ---------------------------------------------------------------------- */ + +template +FixWallRegionKokkos::FixWallRegionKokkos(LAMMPS *lmp, int narg, char **arg) : + FixWallRegion(lmp, narg, arg) +{ + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = X_MASK | V_MASK | MASK_MASK; + datamask_modify = F_MASK; +} + +template +FixWallRegionKokkos::~FixWallRegionKokkos() +{ + if (copymode) return; + memoryKK->destroy_kokkos(k_vatom,vatom); +} + +/* ---------------------------------------------------------------------- */ + +template +void FixWallRegionKokkos::post_force(int vflag) +{ + atomKK->sync(execution_space,datamask_read); + atomKK->modified(execution_space,datamask_modify); + + // virial setup + + v_init(vflag); + + // reallocate per-atom arrays if necessary + + if (vflag_atom) { + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,"wall_region:vatom"); + d_vatom = k_vatom.template view(); + } + + d_x = atomKK->k_x.template view(); + d_f = atomKK->k_f.template view(); + if (style == COLLOID) d_radius = atomKK->k_radius.template view(); + d_mask = atomKK->k_mask.template view(); + int nlocal = atomKK->nlocal; + + region->prematch(); + + // virial setup + + v_init(vflag); + + // region->match() ensures particle is in region or on surface, else error + // if returned contact dist r = 0, is on surface, also an error + // in COLLOID case, r <= radius is an error + // initilize ewall after region->prematch(), + // so a dynamic region can access last timestep values + + // energy intialize + // eflag is used to track whether wall energies have been communicated + + eflag = 0; + double result[10]; + copymode = 1; + + if(auto *regionKK = dynamic_cast*>(region)) { + FixWallRegionKokkosFunctor> functor(this,regionKK); + Kokkos::parallel_reduce(nlocal,functor,result); + } else if (auto *regionKK = dynamic_cast*>(region)){ + FixWallRegionKokkosFunctor> functor(this,regionKK); + Kokkos::parallel_reduce(nlocal,functor,result); + } + + copymode = 0; + for( int i=0 ; i<4 ; i++ ) ewall[i] = result[i]; + + if (vflag_global) { + virial[0] += result[4]; + virial[1] += result[5]; + virial[2] += result[6]; + virial[3] += result[7]; + virial[4] += result[8]; + virial[5] += result[9]; + } + + atomKK->modified(execution_space,F_MASK); + + if (vflag_atom) { + k_vatom.template modify(); + k_vatom.template sync(); + } +} + +/* ---------------------------------------------------------------------- + interaction of all particles in group with a wall + m = index of wall coeffs + which = xlo,xhi,ylo,yhi,zlo,zhi + error if any particle is on or behind wall +------------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void FixWallRegionKokkos::wall_particle(T regionKK, const int i, value_type result) const { + if (d_mask(i) & groupbit) { + + if (!regionKK->match_kokkos(d_x(i,0), d_x(i,1), d_x(i,2))) Kokkos::abort("Particle outside surface of region used in fix wall/region"); + + double rinv, tooclose; + + if (style == COLLOID) + tooclose = d_radius(i); + else + tooclose = 0.0; + + int n = regionKK->surface_kokkos(d_x(i,0), d_x(i,1), d_x(i,2), cutoff); + + for ( int m = 0; m < n; m++) { + + double r = regionKK->d_contact[m].r; + double delx = regionKK->d_contact[m].delx; + double dely = regionKK->d_contact[m].dely; + double delz = regionKK->d_contact[m].delz; + + if (r <= tooclose) + Kokkos::abort("Particle outside surface of region used in fix wall/region"); + else + rinv = 1.0 / r; + + double fwallKK, engKK; + + if (style == LJ93) engKK = lj93(r,fwallKK); + else if (style == LJ126) engKK = lj126(r,fwallKK); + else if (style == LJ1043) engKK = lj1043(r,fwallKK); + else if (style == MORSE) engKK = morse(r,fwallKK); + else if (style == COLLOID) engKK = colloid(r,d_radius(i),fwallKK); + else engKK = harmonic(r,fwallKK); + + double fx = fwallKK * delx * rinv; + double fy = fwallKK * dely * rinv; + double fz = fwallKK * delz * rinv; + d_f(i,0) += fx; + d_f(i,1) += fy; + d_f(i,2) += fz; + result[1] -= fx; + result[2] -= fy; + result[3] -= fz; + result[0] += engKK; + if (evflag) { + double v[6] = { + fx * delx, + fy * dely, + fz * delz, + fx * dely, + fx * delz, + fy * delz + }; + v_tally(result,i,v); + } + } + } +} + +/* ---------------------------------------------------------------------- + LJ 9/3 interaction for particle with wall + compute eng and fwall = magnitude of wall force +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double FixWallRegionKokkos::lj93(double r, double& fwallKK) const +{ + double rinv = 1.0 / r; + double r2inv = rinv * rinv; + double r4inv = r2inv * r2inv; + double r10inv = r4inv * r4inv * r2inv; + fwallKK = coeff1 * r10inv - coeff2 * r4inv; + return coeff3 * r4inv * r4inv * rinv - coeff4 * r2inv * rinv - offset; +} + +/* ---------------------------------------------------------------------- + LJ 12/6 interaction for particle with wall + compute eng and fwall = magnitude of wall force +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double FixWallRegionKokkos::lj126(double r, double& fwallKK) const +{ + double rinv = 1.0 / r; + double r2inv = rinv * rinv; + double r6inv = r2inv * r2inv * r2inv; + fwallKK = r6inv * (coeff1 * r6inv - coeff2) * rinv; + return r6inv * (coeff3 * r6inv - coeff4) - offset; +} + +/* ---------------------------------------------------------------------- + LJ 10/4/3 interaction for particle with wall + compute eng and fwall = magnitude of wall force +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double FixWallRegionKokkos::lj1043(double r, double& fwallKK) const +{ + double rinv = 1.0 / r; + double r2inv = rinv * rinv; + double r4inv = r2inv * r2inv; + double r10inv = r4inv * r4inv * r2inv; + fwallKK = coeff5 * r10inv * rinv - coeff6 * r4inv * rinv - coeff7 * powint(r + coeff4, -4); + return coeff1 * r10inv - coeff2 * r4inv - coeff3 * powint(r + coeff4, -3) - offset; +} + +/* ---------------------------------------------------------------------- + Morse interaction for particle with wall + compute eng and fwall = magnitude of wall force +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double FixWallRegionKokkos::morse(double r, double& fwallKK) const +{ + double dr = r - sigma; + double dexp = exp(-alpha * dr); + fwallKK = coeff1 * (dexp * dexp - dexp); + return epsilon * (dexp * dexp - 2.0 * dexp) - offset; +} + +/* ---------------------------------------------------------------------- + colloid interaction for finite-size particle of rad with wall + compute eng and fwall = magnitude of wall force +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double FixWallRegionKokkos::colloid(double r, double rad, double& fwallKK) const +{ + double new_coeff2 = coeff2 * rad * rad * rad; + double diam = 2.0 * rad; + + double rad2 = rad * rad; + double rad4 = rad2 * rad2; + double rad8 = rad4 * rad4; + double delta2 = rad2 - r * r; + double rinv = 1.0 / delta2; + double r2inv = rinv * rinv; + double r4inv = r2inv * r2inv; + double r8inv = r4inv * r4inv; + fwallKK = coeff1 * + (rad8 * rad + 27.0 * rad4 * rad2 * rad * r * r + 63.0 * rad4 * rad * powint(r, 4) + + 21.0 * rad2 * rad * powint(r, 6)) * + r8inv - + new_coeff2 * r2inv; + + double r2 = 0.5 * diam - r; + double rinv2 = 1.0 / r2; + double r2inv2 = rinv2 * rinv2; + double r4inv2 = r2inv2 * r2inv2; + double r3 = r + 0.5 * diam; + double rinv3 = 1.0 / r3; + double r2inv3 = rinv3 * rinv3; + double r4inv3 = r2inv3 * r2inv3; + return coeff3 * + ((-3.5 * diam + r) * r4inv2 * r2inv2 * rinv2 + + (3.5 * diam + r) * r4inv3 * r2inv3 * rinv3) - + coeff4 * ((-diam * r + r2 * r3 * (log(-r2) - log(r3))) * (-rinv2) * rinv3) - offset; +} + +/* ---------------------------------------------------------------------- + harmonic interaction for particle with wall + compute eng and fwall = magnitude of wall force +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +double FixWallRegionKokkos::harmonic(double r, double& fwallKK) const +{ + double dr = cutoff - r; + fwallKK = 2.0 * epsilon * dr; + return epsilon * dr * dr; +} + +/* ---------------------------------------------------------------------- + tally virial into global and per-atom accumulators + i = local index of atom + v = total virial for the interaction + increment global virial by v + increment per-atom virial by v + this method can be used when fix computes forces in post_force() + and the force depends on a distance to some external object + e.g. fix wall/lj93: compute virial only on owned atoms +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void FixWallRegionKokkos::v_tally(value_type result, int i, double *v) const +{ + if (vflag_global) { + result[4] += v[0]; + result[5] += v[1]; + result[6] += v[2]; + result[7] += v[3]; + result[8] += v[4]; + result[9] += v[5]; + } + + if (vflag_atom) { + Kokkos::atomic_add(&(d_vatom(i,0)),v[0]); + Kokkos::atomic_add(&(d_vatom(i,1)),v[1]); + Kokkos::atomic_add(&(d_vatom(i,2)),v[2]); + Kokkos::atomic_add(&(d_vatom(i,3)),v[3]); + Kokkos::atomic_add(&(d_vatom(i,4)),v[4]); + Kokkos::atomic_add(&(d_vatom(i,5)),v[5]); + } +} + +namespace LAMMPS_NS { +template class FixWallRegionKokkos; +#ifdef LMP_KOKKOS_GPU +template class FixWallRegionKokkos; +#endif +} diff --git a/src/KOKKOS/fix_wall_region_kokkos.h b/src/KOKKOS/fix_wall_region_kokkos.h new file mode 100644 index 0000000000..e959ffc42c --- /dev/null +++ b/src/KOKKOS/fix_wall_region_kokkos.h @@ -0,0 +1,108 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(wall/region/kk,FixWallRegionKokkos); +FixStyle(wall/region/kk/device,FixWallRegionKokkos); +FixStyle(wall/region/kk/host,FixWallRegionKokkos); +// clang-format on +#else + +// clang-format off +#ifndef LMP_FIX_WALL_REGION_KOKKOS_H +#define LMP_FIX_WALL_REGION_KOKKOS_H + +#include "fix_wall_region.h" + +#include "kokkos_type.h" +#include "region_block_kokkos.h" +#include "region_sphere_kokkos.h" + +namespace LAMMPS_NS { + +template +class FixWallRegionKokkos : public FixWallRegion { + public: + typedef DeviceType device_type; + typedef ArrayTypes AT; + typedef double value_type[]; + + FixWallRegionKokkos(class LAMMPS *, int, char **); + ~FixWallRegionKokkos() override; + void post_force(int) override; + + template + KOKKOS_INLINE_FUNCTION + void wall_particle(T, const int, value_type) const; + + private: + + typename AT::t_x_array d_x; + typename AT::t_f_array d_f; + typename AT::t_float_1d d_radius; + typename AT::t_int_1d d_mask; + + DAT::tdual_virial_array k_vatom; + typename AT::t_virial_array d_vatom; + + KOKKOS_INLINE_FUNCTION + double lj93(double, double&) const; + + KOKKOS_INLINE_FUNCTION + double lj126(double, double&) const; + + KOKKOS_INLINE_FUNCTION + double lj1043(double, double&) const; + + KOKKOS_INLINE_FUNCTION + double morse(double, double&) const; + + KOKKOS_INLINE_FUNCTION + double colloid(double, double, double&) const; + + KOKKOS_INLINE_FUNCTION + double harmonic(double, double&) const; + + KOKKOS_INLINE_FUNCTION + void v_tally(value_type, int, double*) const; + +}; + +template +struct FixWallRegionKokkosFunctor { + typedef DeviceType device_type; + typedef double value_type[]; + const int value_count; + FixWallRegionKokkos c; + T *regionKK; + + FixWallRegionKokkosFunctor(FixWallRegionKokkos* c_ptr, T *regionKK): + value_count(10), c(*c_ptr), regionKK(regionKK) {} + + KOKKOS_INLINE_FUNCTION + void init(value_type result) const { + for (int i=0 ; i<10 ; i++ ) result[i] = 0.0; + } + + KOKKOS_INLINE_FUNCTION + void operator()(const int i, value_type result) const { + c.wall_particle(regionKK,i,result); + } +}; + +} + +#endif +#endif + diff --git a/src/KOKKOS/group_kokkos.cpp b/src/KOKKOS/group_kokkos.cpp new file mode 100644 index 0000000000..b2de2e6a64 --- /dev/null +++ b/src/KOKKOS/group_kokkos.cpp @@ -0,0 +1,363 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Mitch Murphy (alphataubio at gmail) +------------------------------------------------------------------------- */ + +#include "group_kokkos.h" + +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "domain_kokkos.h" +#include "kokkos_few.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +template +GroupKokkos::GroupKokkos(LAMMPS *lmp) : Group(lmp) +{ + atomKK = (AtomKokkos *)atom; + execution_space = ExecutionSpaceFromDevice::space; +} + +// ---------------------------------------------------------------------- +// computations on a group of atoms +// ---------------------------------------------------------------------- + +/* ---------------------------------------------------------------------- + compute the total mass of group of atoms + use either per-type mass or per-atom rmass +------------------------------------------------------------------------- */ + +template +double GroupKokkos::mass(int igroup) +{ + int groupbit = bitmask[igroup]; + auto d_mask = atomKK->k_mask.template view(); + double one = 0.0; + + if (atomKK->rmass) { + + auto d_rmass = atomKK->k_rmass.template view(); + atomKK->sync(execution_space,MASK_MASK|RMASS_MASK); + + Kokkos::parallel_reduce(atom->nlocal, KOKKOS_LAMBDA(const int i, double &l_one) { + if (d_mask(i) & groupbit) l_one += d_rmass(i); + }, one); + + } else { + + auto d_mass = atomKK->k_mass.template view(); + auto d_type = atomKK->k_type.template view(); + atomKK->sync(execution_space,MASK_MASK|TYPE_MASK); + atomKK->k_mass.template sync(); + + Kokkos::parallel_reduce(atom->nlocal, KOKKOS_LAMBDA(const int i, double &l_one) { + if (d_mask(i) & groupbit) l_one += d_mass(d_type(i)); + }, one); + + } + + double all; + MPI_Allreduce(&one, &all, 1, MPI_DOUBLE, MPI_SUM, world); + return all; +} + +/* ---------------------------------------------------------------------- + compute the center-of-mass coords of group of atoms + masstotal = total mass + return center-of-mass coords in cm[] + must unwrap atoms to compute center-of-mass correctly +------------------------------------------------------------------------- */ + +template +void GroupKokkos::xcm(int igroup, double masstotal, double *xcm) +{ + int groupbit = bitmask[igroup]; + auto d_x = atomKK->k_x.template view(); + auto d_mask = atomKK->k_mask.template view(); + auto d_image = atomKK->k_image.template view(); + auto l_prd = Few(domain->prd); + auto l_h = Few(domain->h); + auto l_triclinic = domain->triclinic; + double cmone[3] = {0.0, 0.0, 0.0}; + + if (atomKK->rmass) { + + auto d_rmass = atomKK->k_rmass.template view(); + atomKK->sync(execution_space,X_MASK|MASK_MASK|IMAGE_MASK|RMASS_MASK); + + Kokkos::parallel_reduce(atom->nlocal, KOKKOS_LAMBDA(const int i, double &l_cmx, double &l_cmy, double &l_cmz) { + if (d_mask(i) & groupbit) { + double massone = d_rmass(i); + Few x_i; + x_i[0] = d_x(i,0); + x_i[1] = d_x(i,1); + x_i[2] = d_x(i,2); + auto unwrapKK = DomainKokkos::unmap(l_prd,l_h,l_triclinic,x_i,d_image(i)); + l_cmx += unwrapKK[0] * massone; + l_cmy += unwrapKK[1] * massone; + l_cmz += unwrapKK[2] * massone; + } + }, cmone[0], cmone[1], cmone[2]); + + } else { + + auto d_mass = atomKK->k_mass.template view(); + auto d_type = atomKK->k_type.template view(); + atomKK->sync(execution_space,X_MASK|MASK_MASK|IMAGE_MASK|TYPE_MASK); + atomKK->k_mass.template sync(); + + Kokkos::parallel_reduce(atom->nlocal, KOKKOS_LAMBDA(const int i, double &l_cmx, double &l_cmy, double &l_cmz) { + if (d_mask(i) & groupbit) { + double massone = d_mass(d_type(i)); + Few x_i; + x_i[0] = d_x(i,0); + x_i[1] = d_x(i,1); + x_i[2] = d_x(i,2); + auto unwrapKK = DomainKokkos::unmap(l_prd,l_h,l_triclinic,x_i,d_image(i)); + l_cmx += unwrapKK[0] * massone; + l_cmy += unwrapKK[1] * massone; + l_cmz += unwrapKK[2] * massone; + } + }, cmone[0], cmone[1], cmone[2]); + + } + + MPI_Allreduce(cmone, xcm, 3, MPI_DOUBLE, MPI_SUM, world); + if (masstotal > 0.0) { + xcm[0] /= masstotal; + xcm[1] /= masstotal; + xcm[2] /= masstotal; + } +} + +/* ---------------------------------------------------------------------- + compute the center-of-mass velocity of group of atoms + masstotal = total mass + return center-of-mass velocity in vcm[] +------------------------------------------------------------------------- */ + +template +void GroupKokkos::vcm(int igroup, double masstotal, double *vcm) +{ + int groupbit = bitmask[igroup]; + auto d_v = atomKK->k_v.template view(); + auto d_mask = atomKK->k_mask.template view(); + auto d_image = atomKK->k_image.template view(); + double p[3] = {0.0, 0.0, 0.0}; + + if (atomKK->rmass) { + + auto d_rmass = atomKK->k_rmass.template view(); + atomKK->sync(execution_space,V_MASK|MASK_MASK|IMAGE_MASK|RMASS_MASK); + + Kokkos::parallel_reduce(atom->nlocal, KOKKOS_LAMBDA(const int i, double &l_px, double &l_py, double &l_pz) { + if (d_mask(i) & groupbit) { + double massone = d_rmass(i); + l_px += d_v(i,0) * massone; + l_py += d_v(i,1) * massone; + l_pz += d_v(i,2) * massone; + } + }, p[0], p[1], p[2]); + + } else { + + auto d_mass = atomKK->k_mass.template view(); + auto d_type = atomKK->k_type.template view(); + atomKK->sync(execution_space,V_MASK|MASK_MASK|IMAGE_MASK|TYPE_MASK); + atomKK->k_mass.template sync(); + + Kokkos::parallel_reduce(atom->nlocal, KOKKOS_LAMBDA(const int i, double &l_px, double &l_py, double &l_pz) { + if (d_mask(i) & groupbit) { + double massone = d_mass(d_type(i)); + l_px += d_v(i,0) * massone; + l_py += d_v(i,1) * massone; + l_pz += d_v(i,2) * massone; + } + }, p[0], p[1], p[2]); + + } + + MPI_Allreduce(p, vcm, 3, MPI_DOUBLE, MPI_SUM, world); + if (masstotal > 0.0) { + vcm[0] /= masstotal; + vcm[1] /= masstotal; + vcm[2] /= masstotal; + } +} + +/* ---------------------------------------------------------------------- + compute the angular momentum L (lmom) of group + around center-of-mass cm + must unwrap atoms to compute L correctly +------------------------------------------------------------------------- */ + +template +void GroupKokkos::angmom(int igroup, double *xcm, double *lmom) +{ + int groupbit = bitmask[igroup]; + auto d_x = atomKK->k_x.template view(); + auto d_v = atomKK->k_v.template view(); + auto d_mask = atomKK->k_mask.template view(); + auto d_image = atomKK->k_image.template view(); + auto l_prd = Few(domain->prd); + auto l_h = Few(domain->h); + auto l_triclinic = domain->triclinic; + auto l_xcm0 = xcm[0]; + auto l_xcm1 = xcm[1]; + auto l_xcm2 = xcm[2]; + double p[3] = {0.0, 0.0, 0.0}; + + if (atomKK->rmass) { + + auto d_rmass = atomKK->k_rmass.template view(); + atomKK->sync(execution_space,X_MASK|V_MASK|MASK_MASK|IMAGE_MASK|RMASS_MASK); + + Kokkos::parallel_reduce(atom->nlocal, KOKKOS_LAMBDA(const int i, double &l_px, double &l_py, double &l_pz) { + if (d_mask(i) & groupbit) { + double massone = d_rmass(i); + Few x_i; + x_i[0] = d_x(i,0); + x_i[1] = d_x(i,1); + x_i[2] = d_x(i,2); + auto unwrapKK = DomainKokkos::unmap(l_prd,l_h,l_triclinic,x_i,d_image(i)); + double dx = unwrapKK[0] - l_xcm0; + double dy = unwrapKK[1] - l_xcm1; + double dz = unwrapKK[2] - l_xcm2; + l_px += massone * (dy * d_v(i,2) - dz * d_v(i,1)); + l_py += massone * (dz * d_v(i,0) - dx * d_v(i,2)); + l_pz += massone * (dx * d_v(i,1) - dy * d_v(i,0)); + } + }, p[0], p[1], p[2]); + + } else { + + auto d_mass = atomKK->k_mass.template view(); + auto d_type = atomKK->k_type.template view(); + atomKK->sync(execution_space,X_MASK|V_MASK|MASK_MASK|IMAGE_MASK|TYPE_MASK); + atomKK->k_mass.template sync(); + + Kokkos::parallel_reduce(atom->nlocal, KOKKOS_LAMBDA(const int i, double &l_px, double &l_py, double &l_pz) { + if (d_mask(i) & groupbit) { + double massone = d_mass(d_type(i)); + Few x_i; + x_i[0] = d_x(i,0); + x_i[1] = d_x(i,1); + x_i[2] = d_x(i,2); + auto unwrapKK = DomainKokkos::unmap(l_prd,l_h,l_triclinic,x_i,d_image(i)); + double dx = unwrapKK[0] - l_xcm0; + double dy = unwrapKK[1] - l_xcm1; + double dz = unwrapKK[2] - l_xcm2; + l_px += massone * (dy * d_v(i,2) - dz * d_v(i,1)); + l_py += massone * (dz * d_v(i,0) - dx * d_v(i,2)); + l_pz += massone * (dx * d_v(i,1) - dy * d_v(i,0)); + } + }, p[0], p[1], p[2]); + + } + MPI_Allreduce(p, lmom, 3, MPI_DOUBLE, MPI_SUM, world); +} + +/* ---------------------------------------------------------------------- + compute moment of inertia tensor around center-of-mass xcm of group + must unwrap atoms to compute itensor correctly +------------------------------------------------------------------------- */ + +template +void GroupKokkos::inertia(int igroup, double *xcm, double itensor[3][3]) +{ + int groupbit = bitmask[igroup]; + auto d_x = atomKK->k_x.template view(); + auto d_mask = atomKK->k_mask.template view(); + auto d_image = atomKK->k_image.template view(); + auto l_prd = Few(domain->prd); + auto l_h = Few(domain->h); + auto l_triclinic = domain->triclinic; + auto l_xcm0 = xcm[0]; + auto l_xcm1 = xcm[1]; + auto l_xcm2 = xcm[2]; + + double ione[3][3]; + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) ione[i][j] = 0.0; + + if (atomKK->rmass) { + + auto d_rmass = atomKK->k_rmass.template view(); + atomKK->sync(execution_space,X_MASK|MASK_MASK|IMAGE_MASK|RMASS_MASK); + + Kokkos::parallel_reduce(atom->nlocal, KOKKOS_LAMBDA(const int i, double &l_i00, double &l_i11, double &l_i22, double &l_i01, double &l_i12, double &l_i02) { + if (d_mask(i) & groupbit) { + double massone = d_rmass(i); + Few x_i; + x_i[0] = d_x(i,0); + x_i[1] = d_x(i,1); + x_i[2] = d_x(i,2); + auto unwrapKK = DomainKokkos::unmap(l_prd,l_h,l_triclinic,x_i,d_image(i)); + double dx = unwrapKK[0] - l_xcm0; + double dy = unwrapKK[1] - l_xcm1; + double dz = unwrapKK[2] - l_xcm2; + l_i00 += massone * (dy * dy + dz * dz); + l_i11 += massone * (dx * dx + dz * dz); + l_i22 += massone * (dx * dx + dy * dy); + l_i01 -= massone * dx * dy; + l_i12 -= massone * dy * dz; + l_i02 -= massone * dx * dz; + } + }, ione[0][0], ione[1][1], ione[2][2], ione[0][1], ione[1][2], ione[0][2]); + + } else { + + auto d_mass = atomKK->k_mass.template view(); + auto d_type = atomKK->k_type.template view(); + atomKK->sync(execution_space,X_MASK|MASK_MASK|IMAGE_MASK|TYPE_MASK); + atomKK->k_mass.template sync(); + + Kokkos::parallel_reduce(atom->nlocal, KOKKOS_LAMBDA(const int i, double &l_i00, double &l_i11, double &l_i22, double &l_i01, double &l_i12, double &l_i02) { + if (d_mask(i) & groupbit) { + double massone = d_mass(d_type(i)); + Few x_i; + x_i[0] = d_x(i,0); + x_i[1] = d_x(i,1); + x_i[2] = d_x(i,2); + auto unwrapKK = DomainKokkos::unmap(l_prd,l_h,l_triclinic,x_i,d_image(i)); + double dx = unwrapKK[0] - l_xcm0; + double dy = unwrapKK[1] - l_xcm1; + double dz = unwrapKK[2] - l_xcm2; + l_i00 += massone * (dy * dy + dz * dz); + l_i11 += massone * (dx * dx + dz * dz); + l_i22 += massone * (dx * dx + dy * dy); + l_i01 -= massone * dx * dy; + l_i12 -= massone * dy * dz; + l_i02 -= massone * dx * dz; + } + }, ione[0][0], ione[1][1], ione[2][2], ione[0][1], ione[1][2], ione[0][2]); + + } + + ione[1][0] = ione[0][1]; + ione[2][1] = ione[1][2]; + ione[2][0] = ione[0][2]; + MPI_Allreduce(&ione[0][0], &itensor[0][0], 9, MPI_DOUBLE, MPI_SUM, world); +} + +namespace LAMMPS_NS { +template class GroupKokkos; +#ifdef LMP_KOKKOS_GPU +template class GroupKokkos; +#endif +} diff --git a/src/KOKKOS/group_kokkos.h b/src/KOKKOS/group_kokkos.h new file mode 100644 index 0000000000..f23023b17c --- /dev/null +++ b/src/KOKKOS/group_kokkos.h @@ -0,0 +1,38 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifndef LMP_GROUP_KOKKOS_H +#define LMP_GROUP_KOKKOS_H + +#include "group.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +template +class GroupKokkos : public Group { + public: + GroupKokkos(class LAMMPS *); + double mass(int); // total mass of atoms in group + void xcm(int, double, double *); // center-of-mass coords of group + void vcm(int, double, double *); // center-of-mass velocity of group + void angmom(int, double *, double *); // angular momentum of group + void inertia(int, double *, double[3][3]); // inertia tensor + + private: + ExecutionSpace execution_space; +}; + +} // namespace LAMMPS_NS + +#endif diff --git a/src/KOKKOS/kokkos_type.h b/src/KOKKOS/kokkos_type.h index 9d3e3fca0f..fd304efd1c 100644 --- a/src/KOKKOS/kokkos_type.h +++ b/src/KOKKOS/kokkos_type.h @@ -41,6 +41,16 @@ constexpr int HALF = 4; #define MAX_TYPES_STACKPARAMS 12 static constexpr LAMMPS_NS::bigint LMP_KOKKOS_AV_DELTA = 10; +namespace LAMMPS_NS { + union d_ubuf { + double d; + int64_t i; + KOKKOS_INLINE_FUNCTION d_ubuf(double arg) : d(arg) {} + KOKKOS_INLINE_FUNCTION d_ubuf(int64_t arg) : i(arg) {} + KOKKOS_INLINE_FUNCTION d_ubuf(int arg) : i(arg) {} + }; +} + namespace Kokkos { static auto NoInit = [](std::string const& label) { return Kokkos::view_alloc(Kokkos::WithoutInitializing, label); @@ -166,7 +176,7 @@ template using KKScatterView = Kokkos::Experimental::ScatterView; -// set ExecutionSpace stuct with variable "space" +// set ExecutionSpace struct with variable "space" template struct ExecutionSpaceFromDevice; @@ -1108,6 +1118,14 @@ typedef tdual_float_2d::t_host_um t_float_2d_um; typedef tdual_float_2d::t_host_const_um t_float_2d_const_um; typedef tdual_float_2d::t_host_const_randomread t_float_2d_randomread; +//3d float array n +typedef Kokkos::DualView tdual_float_3d; +typedef tdual_float_3d::t_host t_float_3d; +typedef tdual_float_3d::t_host_const t_float_3d_const; +typedef tdual_float_3d::t_host_um t_float_3d_um; +typedef tdual_float_3d::t_host_const_um t_float_3d_const_um; +typedef tdual_float_3d::t_host_const_randomread t_float_3d_randomread; + #ifdef LMP_KOKKOS_NO_LEGACY typedef Kokkos::DualView tdual_float_1d_4; #else diff --git a/src/KOKKOS/math_special_kokkos.h b/src/KOKKOS/math_special_kokkos.h index d8af28d33a..1cc35e1969 100644 --- a/src/KOKKOS/math_special_kokkos.h +++ b/src/KOKKOS/math_special_kokkos.h @@ -248,6 +248,29 @@ namespace MathSpecialKokkos { return yy; } + + /* ---------------------------------------------------------------------- + ans = v1 - v2 + ------------------------------------------------------------------------- */ + + KOKKOS_INLINE_FUNCTION + static void sub3(const double *v1, const double *v2, double *ans) + { + ans[0] = v1[0] - v2[0]; + ans[1] = v1[1] - v2[1]; + ans[2] = v1[2] - v2[2]; + } + + /* ---------------------------------------------------------------------- + dot product of 2 vectors + ------------------------------------------------------------------------- */ + + KOKKOS_INLINE_FUNCTION + static double dot3(const double *v1, const double *v2) + { + return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]; + } + } // namespace MathSpecialKokkos } // namespace LAMMPS_NS diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 4fec623c5d..fb3149ca4b 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -151,7 +151,11 @@ void NPairKokkos::build(NeighList *list_) if (GHOST) nall += atom->nghost; - if (nall == 0) return; + if (nall == 0) { + list->inum = 0; + list->gnum = 0; + return; + } list->grow(nall); diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index c4bd603041..399142dfaf 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -923,6 +923,8 @@ int GetMaxNeighs(NeighStyle* list) maxneigh = MAX(maxneigh,num_neighs); }, Kokkos::Max(maxneigh)); + if (maxneigh < 0) maxneigh = 0; + return maxneigh; } @@ -958,6 +960,7 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t<(NEIGHFLAG&P if (!vectorsize || lastcall < fpair->lmp->neighbor->lastcall) { lastcall = fpair->lmp->update->ntimestep; vectorsize = GetMaxNeighs(list); + if (vectorsize == 0) vectorsize = 1; vectorsize = MathSpecial::powint(2,(int(log2(vectorsize) + 0.5))); // round to nearest power of 2 #if defined(KOKKOS_ENABLE_HIP) diff --git a/src/KOKKOS/pair_snap_kokkos.h b/src/KOKKOS/pair_snap_kokkos.h index ca1884bfd2..660503eed8 100644 --- a/src/KOKKOS/pair_snap_kokkos.h +++ b/src/KOKKOS/pair_snap_kokkos.h @@ -30,29 +30,34 @@ PairStyle(snap/kk/host,PairSNAPKokkosDevice); #include "pair_snap.h" #include "kokkos_type.h" #include "neigh_list_kokkos.h" -#include "sna_kokkos.h" #include "pair_kokkos.h" +namespace LAMMPS_NS { +// pre-declare so sna_kokkos.h can refer to it +template class PairSNAPKokkos; +}; + +#include "sna_kokkos.h" + namespace LAMMPS_NS { // Routines for both the CPU and GPU backend +struct TagPairSNAPPreUi{}; +struct TagPairSNAPTransformUi{}; // re-order ulisttot from SoA to AoSoA, zero ylist +template struct TagPairSNAPComputeZi{}; +template struct TagPairSNAPComputeBi{}; +struct TagPairSNAPComputeBetaLinear{}; +struct TagPairSNAPComputeBetaQuadratic{}; +template struct TagPairSNAPComputeYi{}; +template struct TagPairSNAPComputeYiWithZlist{}; template struct TagPairSNAPComputeForce{}; - // GPU backend only struct TagPairSNAPComputeNeigh{}; struct TagPairSNAPComputeCayleyKlein{}; -struct TagPairSNAPPreUi{}; struct TagPairSNAPComputeUiSmall{}; // more parallelism, more divergence struct TagPairSNAPComputeUiLarge{}; // less parallelism, no divergence -struct TagPairSNAPTransformUi{}; // re-order ulisttot from SoA to AoSoA, zero ylist -struct TagPairSNAPComputeZi{}; -struct TagPairSNAPBeta{}; -struct TagPairSNAPComputeBi{}; -struct TagPairSNAPTransformBi{}; // re-order blist from AoSoA to AoS -struct TagPairSNAPComputeYi{}; -struct TagPairSNAPComputeYiWithZlist{}; template struct TagPairSNAPComputeFusedDeidrjSmall{}; // more parallelism, more divergence template @@ -60,14 +65,7 @@ struct TagPairSNAPComputeFusedDeidrjLarge{}; // less parallelism, no divergence // CPU backend only struct TagPairSNAPComputeNeighCPU{}; -struct TagPairSNAPPreUiCPU{}; struct TagPairSNAPComputeUiCPU{}; -struct TagPairSNAPTransformUiCPU{}; -struct TagPairSNAPComputeZiCPU{}; -struct TagPairSNAPBetaCPU{}; -struct TagPairSNAPComputeBiCPU{}; -struct TagPairSNAPZeroYiCPU{}; -struct TagPairSNAPComputeYiCPU{}; struct TagPairSNAPComputeDuidrjCPU{}; struct TagPairSNAPComputeDeidrjCPU{}; @@ -80,6 +78,8 @@ class PairSNAPKokkos : public PairSNAP { typedef ArrayTypes AT; typedef EV_FLOAT value_type; + static constexpr LAMMPS_NS::ExecutionSpace execution_space = ExecutionSpaceFromDevice::space; + static constexpr int host_flag = (execution_space == LAMMPS_NS::Host); static constexpr int vector_length = vector_length_; using real_type = real_type_; using complex = SNAComplex; @@ -93,9 +93,11 @@ class PairSNAPKokkos : public PairSNAP { static constexpr int team_size_compute_ui = 2; static constexpr int tile_size_transform_ui = 2; static constexpr int tile_size_compute_zi = 2; + static constexpr int min_blocks_compute_zi = 0; // no minimum bound static constexpr int tile_size_compute_bi = 2; - static constexpr int tile_size_transform_bi = 2; + static constexpr int tile_size_compute_beta = 2; static constexpr int tile_size_compute_yi = 2; + static constexpr int min_blocks_compute_yi = 0; // no minimum bound static constexpr int team_size_compute_fused_deidrj = 2; #elif defined(KOKKOS_ENABLE_SYCL) static constexpr int team_size_compute_neigh = 4; @@ -104,9 +106,11 @@ class PairSNAPKokkos : public PairSNAP { static constexpr int team_size_compute_ui = 8; static constexpr int tile_size_transform_ui = 8; static constexpr int tile_size_compute_zi = 4; + static constexpr int min_blocks_compute_zi = 0; // no minimum bound static constexpr int tile_size_compute_bi = 4; - static constexpr int tile_size_transform_bi = 4; + static constexpr int tile_size_compute_beta = 8; static constexpr int tile_size_compute_yi = 8; + static constexpr int min_blocks_compute_yi = 0; // no minimum bound static constexpr int team_size_compute_fused_deidrj = 4; #else static constexpr int team_size_compute_neigh = 4; @@ -116,17 +120,21 @@ class PairSNAPKokkos : public PairSNAP { static constexpr int tile_size_transform_ui = 4; static constexpr int tile_size_compute_zi = 8; static constexpr int tile_size_compute_bi = 4; - static constexpr int tile_size_transform_bi = 4; + static constexpr int tile_size_compute_beta = 4; static constexpr int tile_size_compute_yi = 8; static constexpr int team_size_compute_fused_deidrj = sizeof(real_type) == 4 ? 4 : 2; + + // this empirically reduces perf fluctuations from compiler version to compiler version + static constexpr int min_blocks_compute_zi = 4; + static constexpr int min_blocks_compute_yi = 4; #endif // Custom MDRangePolicy, Rank3, to reduce verbosity of kernel launches // This hides the Kokkos::IndexType and Kokkos::Rank<3...> // and reduces the verbosity of the LaunchBound by hiding the explicit // multiplication by vector_length - template - using Snap3DRangePolicy = typename Kokkos::MDRangePolicy, Kokkos::Rank<3, Kokkos::Iterate::Left, Kokkos::Iterate::Left>, Kokkos::LaunchBounds, TagPairSNAP>; + template + using Snap3DRangePolicy = typename Kokkos::MDRangePolicy, Kokkos::Rank<3, Kokkos::Iterate::Left, Kokkos::Iterate::Left>, Kokkos::LaunchBounds, TagPairSNAP>; // Custom SnapAoSoATeamPolicy to reduce the verbosity of kernel launches // This hides the LaunchBounds abstraction by hiding the explicit @@ -134,6 +142,29 @@ class PairSNAPKokkos : public PairSNAP { template using SnapAoSoATeamPolicy = typename Kokkos::TeamPolicy, TagPairSNAP>; + // Custom MDRangePolicy, Rank2, on the host, to reduce verbosity of kernel launches. The striding of this launch is intentionally + // different from the tiled 3D range policy on the device. + template + using Snap2DHostRangePolicy = typename Kokkos::MDRangePolicy, Kokkos::IndexType, Kokkos::Rank<2, Kokkos::Iterate::Right, Kokkos::Iterate::Right>, TagPairSNAP>; + + // Custom RangePolicy, Rank2, on the host, to reduce verbosity of kernel launches + template + using Snap1DHostRangePolicy = typename Kokkos::RangePolicy, TagPairSNAP>; + + // Helper routine that returns a CPU or a GPU policy as appropriate + template + auto snap_get_policy(const int& chunk_size_div, const int& second_loop) { + if constexpr (host_flag) { + return Snap1DHostRangePolicy(0, chunk_size_div * vector_length); + + // the 2-d policy is still correct but it has atomics so it's slower on the CPU + //return Snap2DHostRangePolicy({0, 0}, {chunk_size_div * vector_length, second_loop}); + } else + return Snap3DRangePolicy({0, 0, 0}, + {vector_length, second_loop, chunk_size_div}, + {vector_length, num_tiles, 1}); + } + PairSNAPKokkos(class LAMMPS *); ~PairSNAPKokkos() override; @@ -149,6 +180,7 @@ class PairSNAPKokkos : public PairSNAP { template void check_team_size_reduce(int, int&); + // CPU and GPU backend template KOKKOS_INLINE_FUNCTION void operator() (TagPairSNAPComputeForce,const int& ii) const; @@ -157,18 +189,23 @@ class PairSNAPKokkos : public PairSNAP { KOKKOS_INLINE_FUNCTION void operator() (TagPairSNAPComputeForce,const int& ii, EV_FLOAT&) const; - KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPBetaCPU,const int& ii) const; - // GPU backend only KOKKOS_INLINE_FUNCTION void operator() (TagPairSNAPComputeNeigh,const typename Kokkos::TeamPolicy::member_type& team) const; + // GPU backend only KOKKOS_INLINE_FUNCTION void operator() (TagPairSNAPComputeCayleyKlein, const int iatom_mod, const int jnbor, const int iatom_div) const; + // CPU and GPU KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPPreUi,const int iatom_mod, const int j, const int iatom_div) const; + void operator() (TagPairSNAPPreUi, const int& iatom_mod, const int& j, const int& iatom_div) const; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPPreUi, const int& iatom, const int& j) const; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPPreUi, const int& iatom) const; KOKKOS_INLINE_FUNCTION void operator() (TagPairSNAPComputeUiSmall,const typename Kokkos::TeamPolicy::member_type& team) const; @@ -177,25 +214,67 @@ class PairSNAPKokkos : public PairSNAP { void operator() (TagPairSNAPComputeUiLarge,const typename Kokkos::TeamPolicy::member_type& team) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPTransformUi,const int iatom_mod, const int j, const int iatom_div) const; + void operator() (TagPairSNAPTransformUi, const int& iatom_mod, const int& idxu, const int& iatom_div) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPComputeZi,const int iatom_mod, const int idxz, const int iatom_div) const; + void operator() (TagPairSNAPTransformUi, const int& iatom, const int& idxu) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPBeta, const int& ii) const; + void operator() (TagPairSNAPTransformUi, const int& iatom) const; + + template KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeZi, const int& iatom_mod, const int& idxz, const int& iatom_div) const; + + template KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeZi, const int& iatom, const int& idxz) const; + + template KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeZi, const int& iatom) const; + + template KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeBi, const int& iatom_mod, const int& idxb, const int& iatom_div) const; + + template KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeBi, const int& iatom, const int& idxb) const; + + template KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeBi, const int& iatom) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPComputeBi,const int iatom_mod, const int idxb, const int iatom_div) const; + void operator() (TagPairSNAPComputeBetaLinear, const int& iatom_mod, const int& idxb, const int& iatom_div) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPTransformBi,const int iatom_mod, const int idxb, const int iatom_div) const; + void operator() (TagPairSNAPComputeBetaLinear, const int& iatom, const int& idxb) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPComputeYi,const int iatom_mod, const int idxz, const int iatom_div) const; + void operator() (TagPairSNAPComputeBetaLinear, const int& iatom) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPComputeYiWithZlist,const int iatom_mod, const int idxz, const int iatom_div) const; + void operator() (TagPairSNAPComputeBetaQuadratic, const int& iatom_mod, const int& idxb, const int& iatom_div) const; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeBetaQuadratic, const int& iatom, const int& idxb) const; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeBetaQuadratic, const int& iatom) const; + + template KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeYi, const int& iatom_mod, const int& idxz, const int& iatom_div) const; + + template KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeYi, const int& iatom, const int& idxz) const; + + template KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeYi, const int& iatom) const; + + template KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeYiWithZlist, const int& iatom_mod, const int& idxz, const int& iatom_div) const; + + template KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeYiWithZlist, const int& iatom, const int& idxz) const; + + template KOKKOS_INLINE_FUNCTION + void operator() (TagPairSNAPComputeYiWithZlist, const int& iatom) const; template KOKKOS_INLINE_FUNCTION @@ -210,28 +289,22 @@ class PairSNAPKokkos : public PairSNAP { void operator() (TagPairSNAPComputeNeighCPU,const typename Kokkos::TeamPolicy::member_type& team) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPPreUiCPU,const typename Kokkos::TeamPolicy::member_type& team) const; + void operator() (TagPairSNAPComputeUiCPU, const int& iatom, const int& jnbor) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPComputeUiCPU,const typename Kokkos::TeamPolicy::member_type& team) const; + void operator() (TagPairSNAPComputeUiCPU, const int& iatom) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPTransformUiCPU, const int j, const int iatom) const; + void operator() (TagPairSNAPComputeDuidrjCPU, const int& iatom, const int& jnbor) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPComputeZiCPU,const int& ii) const; + void operator() (TagPairSNAPComputeDuidrjCPU, const int& iatom) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPComputeBiCPU,const typename Kokkos::TeamPolicy::member_type& team) const; + void operator() (TagPairSNAPComputeDeidrjCPU, const int& iatom, const int& jnbor) const; KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPComputeYiCPU,const int& ii) const; - - KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPComputeDuidrjCPU,const typename Kokkos::TeamPolicy::member_type& team) const; - - KOKKOS_INLINE_FUNCTION - void operator() (TagPairSNAPComputeDeidrjCPU,const typename Kokkos::TeamPolicy::member_type& team) const; + void operator() (TagPairSNAPComputeDeidrjCPU, const int& iatom) const; template KOKKOS_INLINE_FUNCTION @@ -252,7 +325,7 @@ class PairSNAPKokkos : public PairSNAP { SNAKokkos snaKK; int inum,max_neighs,chunk_size,chunk_offset; - int host_flag,neighflag; + int neighflag; int eflag,vflag; @@ -260,13 +333,12 @@ class PairSNAPKokkos : public PairSNAP { Kokkos::View d_radelem; // element radii Kokkos::View d_wjelem; // elements weights - Kokkos::View d_coeffelem; // element bispectrum coefficients + typename SNAKokkos::t_sna_2d_lr d_coeffelem; // element bispectrum coefficients Kokkos::View d_sinnerelem; // element inner cutoff midpoint Kokkos::View d_dinnerelem; // element inner cutoff half-width Kokkos::View d_map; // mapping from atom types to elements Kokkos::View d_ninside; // ninside for all atoms in list - Kokkos::View d_beta; // betas for all atoms in list - Kokkos::View d_beta_pack; // betas for all atoms in list, GPU + typename SNAKokkos::t_sna_2d d_beta; // betas for all atoms in list typedef Kokkos::DualView tdual_fparams; tdual_fparams k_cutsq; @@ -301,6 +373,9 @@ class PairSNAPKokkos : public PairSNAP { template int scratch_size_helper(int values_per_team); + // Make SNAKokkos a friend + friend class SNAKokkos; + }; diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h index 97c7d17ea9..2b9b862645 100644 --- a/src/KOKKOS/pair_snap_kokkos_impl.h +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -59,11 +59,8 @@ PairSNAPKokkos::PairSNAPKokkos(LAMMPS *lmp kokkosable = 1; atomKK = (AtomKokkos *) atom; - execution_space = ExecutionSpaceFromDevice::space; datamask_read = EMPTY_MASK; datamask_modify = EMPTY_MASK; - - host_flag = (execution_space == Host); } /* ---------------------------------------------------------------------- */ @@ -85,15 +82,6 @@ PairSNAPKokkos::~PairSNAPKokkos() template void PairSNAPKokkos::init_style() { - if (host_flag) { - if (lmp->kokkos->nthreads > 1) - error->all(FLERR,"Pair style snap/kk can currently only run on a single " - "CPU thread"); - - PairSNAP::init_style(); - return; - } - if (force->newton_pair == 0) error->all(FLERR,"Pair style SNAP requires newton pair on"); @@ -134,13 +122,6 @@ struct FindMaxNumNeighs { template void PairSNAPKokkos::compute(int eflag_in, int vflag_in) { - if (host_flag) { - atomKK->sync(Host,X_MASK|F_MASK|TYPE_MASK); - PairSNAP::compute(eflag_in,vflag_in); - atomKK->modified(Host,F_MASK); - return; - } - eflag = eflag_in; vflag = vflag_in; @@ -197,21 +178,23 @@ void PairSNAPKokkos::compute(int eflag_in, Kokkos::parallel_reduce("PairSNAPKokkos::find_max_neighs",inum, FindMaxNumNeighs(k_list), Kokkos::Max(max_neighs)); int team_size_default = 1; - if (!host_flag) + if constexpr (!host_flag) team_size_default = 32;//max_neighs; if (beta_max < inum) { beta_max = inum; - MemKK::realloc_kokkos(d_beta,"PairSNAPKokkos:beta",ncoeff,inum); - if (!host_flag) - MemKK::realloc_kokkos(d_beta_pack,"PairSNAPKokkos:beta_pack",vector_length,ncoeff,(inum + vector_length - 1) / vector_length); - MemKK::realloc_kokkos(d_ninside,"PairSNAPKokkos:ninside",inum); + // padded allocation, similar to within grow_rij + const int inum_div = (inum + vector_length - 1) / vector_length; + const int inum_pad = inum_div * vector_length; + MemKK::realloc_kokkos(d_beta,"PairSNAPKokkos:beta", inum_pad, ncoeff); + snaKK.d_beta = d_beta; + MemKK::realloc_kokkos(d_ninside,"PairSNAPKokkos:ninside", inum_pad); } - chunk_size = MIN(chunksize,inum); // "chunksize" variable is set by user + chunk_size = MIN(chunksize, inum); // "chunksize" variable is set by user chunk_offset = 0; - snaKK.grow_rij(chunk_size,max_neighs); + snaKK.grow_rij(chunk_size, max_neighs); EV_FLOAT ev; @@ -222,249 +205,195 @@ void PairSNAPKokkos::compute(int eflag_in, if (chunk_size > inum - chunk_offset) chunk_size = inum - chunk_offset; - if (host_flag) + // pre-compute ceil(chunk_size / vector_length) and the padded chunk size for convenience + const int chunk_size_div = (chunk_size + vector_length - 1) / vector_length; + //const int chunk_size_pad = chunk_size_div * vector_length; + + // ComputeNeigh + if constexpr (host_flag) { + int team_size = team_size_default; + check_team_size_for(chunk_size,team_size); + typename Kokkos::TeamPolicy policy_neigh(chunk_size,team_size,vector_length); + Kokkos::parallel_for("ComputeNeighCPU",policy_neigh,*this); + } else { + // team_size_compute_neigh is defined in `pair_snap_kokkos.h` + int scratch_size = scratch_size_helper(team_size_compute_neigh * max_neighs); + + SnapAoSoATeamPolicy policy_neigh(chunk_size,team_size_compute_neigh,vector_length); + policy_neigh = policy_neigh.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); + Kokkos::parallel_for("ComputeNeigh",policy_neigh,*this); + } + + // ComputeCayleyKlein; this is only called on the GPU + if constexpr (!host_flag) { + // tile_size_compute_ck is defined in `pair_snap_kokkos.h` + Snap3DRangePolicy + policy_compute_ck({0,0,0},{vector_length,max_neighs,chunk_size_div},{vector_length,tile_size_compute_ck,1}); + Kokkos::parallel_for("ComputeCayleyKlein", policy_compute_ck, *this); + } + + // PreUi; same CPU and GPU codepath { - // Host codepath - - //ComputeNeigh - { - int team_size = team_size_default; - check_team_size_for(chunk_size,team_size); - typename Kokkos::TeamPolicy policy_neigh(chunk_size,team_size,vector_length); - Kokkos::parallel_for("ComputeNeighCPU",policy_neigh,*this); - } - - //PreUi - { - int team_size = team_size_default; - check_team_size_for(chunk_size,team_size); - typename Kokkos::TeamPolicy policy_preui_cpu((chunk_size+team_size-1)/team_size,team_size,vector_length); - Kokkos::parallel_for("PreUiCPU",policy_preui_cpu,*this); - } - - // ComputeUi - { - int team_size = team_size_default; - // Fused calculation of ulist and accumulation into ulisttot using atomics - typename Kokkos::TeamPolicy policy_ui_cpu(((chunk_size+team_size-1)/team_size)*max_neighs,team_size,vector_length); - Kokkos::parallel_for("ComputeUiCPU",policy_ui_cpu,*this); - } - - { - // Expand ulisttot -> ulisttot_full - // Zero out ylist - typename Kokkos::MDRangePolicy, Kokkos::Rank<2, Kokkos::Iterate::Left, Kokkos::Iterate::Left>, TagPairSNAPTransformUiCPU> policy_transform_ui_cpu({0,0},{twojmax+1,chunk_size}); - Kokkos::parallel_for("TransformUiCPU",policy_transform_ui_cpu,*this); - } - - //Compute bispectrum - if (quadraticflag || eflag) { - //ComputeZi - int idxz_max = snaKK.idxz_max; - typename Kokkos::RangePolicy policy_zi_cpu(0,chunk_size*idxz_max); - Kokkos::parallel_for("ComputeZiCPU",policy_zi_cpu,*this); - - //ComputeBi - int team_size = team_size_default; - check_team_size_for(chunk_size,team_size); - typename Kokkos::TeamPolicy policy_bi_cpu(chunk_size,team_size,vector_length); - Kokkos::parallel_for("ComputeBiCPU",policy_bi_cpu,*this); - } - - //ComputeYi - { - //Compute beta = dE_i/dB_i for all i in list - typename Kokkos::RangePolicy policy_beta(0,chunk_size); - Kokkos::parallel_for("ComputeBetaCPU",policy_beta,*this); - - //ComputeYi - int idxz_max = snaKK.idxz_max; - typename Kokkos::RangePolicy policy_yi_cpu(0,chunk_size*idxz_max); - Kokkos::parallel_for("ComputeYiCPU",policy_yi_cpu,*this); - } // host flag - - //ComputeDuidrj and Deidrj - { - int team_size = team_size_default; - - typename Kokkos::TeamPolicy policy_duidrj_cpu(((chunk_size+team_size-1)/team_size)*max_neighs,team_size,vector_length); - Kokkos::parallel_for("ComputeDuidrjCPU",policy_duidrj_cpu,*this); - - typename Kokkos::TeamPolicy policy_deidrj_cpu(((chunk_size+team_size-1)/team_size)*max_neighs,team_size,vector_length); - - Kokkos::parallel_for("ComputeDeidrjCPU",policy_deidrj_cpu,*this); - } - - } else { // GPU - -#ifdef LMP_KOKKOS_GPU - - // Pre-compute ceil(chunk_size / vector_length) for code cleanliness - const int chunk_size_div = (chunk_size + vector_length - 1) / vector_length; - - //ComputeNeigh - { - // team_size_compute_neigh is defined in `pair_snap_kokkos.h` - int scratch_size = scratch_size_helper(team_size_compute_neigh * max_neighs); - - SnapAoSoATeamPolicy policy_neigh(chunk_size,team_size_compute_neigh,vector_length); - policy_neigh = policy_neigh.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); - Kokkos::parallel_for("ComputeNeigh",policy_neigh,*this); - } - - //ComputeCayleyKlein - { - // tile_size_compute_ck is defined in `pair_snap_kokkos.h` - Snap3DRangePolicy - policy_compute_ck({0,0,0},{vector_length,max_neighs,chunk_size_div},{vector_length,tile_size_compute_ck,1}); - Kokkos::parallel_for("ComputeCayleyKlein",policy_compute_ck,*this); - } - - //PreUi - { - // tile_size_pre_ui is defined in `pair_snap_kokkos.h` - Snap3DRangePolicy - policy_preui({0,0,0},{vector_length,twojmax+1,chunk_size_div},{vector_length,tile_size_pre_ui,1}); - Kokkos::parallel_for("PreUi",policy_preui,*this); - } + auto policy_pre_ui = snap_get_policy(chunk_size_div, twojmax + 1); + Kokkos::parallel_for("PreUi", policy_pre_ui, *this); + } + // ComputeUi; separate CPU, GPU codepaths + if constexpr (host_flag) { + // Fused calculation of ulist and accumulation into ulisttot using atomics + auto policy_ui_cpu = snap_get_policy(chunk_size_div, max_neighs); + Kokkos::parallel_for("ComputeUiCPU", policy_ui_cpu, *this); + } else { // ComputeUi w/vector parallelism, shared memory, direct atomicAdd into ulisttot + + // team_size_compute_ui is defined in `pair_snap_kokkos.h` + // scratch size: 32 atoms * (twojmax+1) cached values, no double buffer + const int tile_size = vector_length * (twojmax + 1); + const int scratch_size = scratch_size_helper(team_size_compute_ui * tile_size); + + if (chunk_size < parallel_thresh) { - // team_size_compute_ui is defined in `pair_snap_kokkos.h` - // scratch size: 32 atoms * (twojmax+1) cached values, no double buffer - const int tile_size = vector_length * (twojmax + 1); - const int scratch_size = scratch_size_helper(team_size_compute_ui * tile_size); + // Version with parallelism over j_bend - if (chunk_size < parallel_thresh) - { - // Version with parallelism over j_bend + // total number of teams needed: (natoms / 32) * (max_neighs) * ("bend" locations) + const int n_teams = chunk_size_div * max_neighs * (twojmax + 1); + const int n_teams_div = (n_teams + team_size_compute_ui - 1) / team_size_compute_ui; - // total number of teams needed: (natoms / 32) * (max_neighs) * ("bend" locations) - const int n_teams = chunk_size_div * max_neighs * (twojmax + 1); - const int n_teams_div = (n_teams + team_size_compute_ui - 1) / team_size_compute_ui; + SnapAoSoATeamPolicy policy_ui(n_teams_div, team_size_compute_ui, vector_length); + policy_ui = policy_ui.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); + Kokkos::parallel_for("ComputeUiSmall",policy_ui,*this); + } else { + // Version w/out parallelism over j_bend - SnapAoSoATeamPolicy policy_ui(n_teams_div, team_size_compute_ui, vector_length); - policy_ui = policy_ui.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); - Kokkos::parallel_for("ComputeUiSmall",policy_ui,*this); - } else { - // Version w/out parallelism over j_bend + // total number of teams needed: (natoms / 32) * (max_neighs) + const int n_teams = chunk_size_div * max_neighs; + const int n_teams_div = (n_teams + team_size_compute_ui - 1) / team_size_compute_ui; - // total number of teams needed: (natoms / 32) * (max_neighs) - const int n_teams = chunk_size_div * max_neighs; - const int n_teams_div = (n_teams + team_size_compute_ui - 1) / team_size_compute_ui; + SnapAoSoATeamPolicy policy_ui(n_teams_div, team_size_compute_ui, vector_length); + policy_ui = policy_ui.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); + Kokkos::parallel_for("ComputeUiLarge",policy_ui,*this); + } + } - SnapAoSoATeamPolicy policy_ui(n_teams_div, team_size_compute_ui, vector_length); - policy_ui = policy_ui.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); - Kokkos::parallel_for("ComputeUiLarge",policy_ui,*this); - } + { + // Expand ulisttot_re,_im -> ulisttot + // Zero out ylist + auto policy_transform_ui = snap_get_policy(chunk_size_div, snaKK.idxu_max); + Kokkos::parallel_for("TransformUi", policy_transform_ui, *this); + } + + //Compute bispectrum + if (quadraticflag || eflag) { + // team_size_[compute_zi, compute_bi, transform_bi] are defined in `pair_snap_kokkos.h` + + //ComputeZi and Bi + if (nelements > 1) { + auto policy_compute_zi = snap_get_policy, min_blocks_compute_zi>(chunk_size_div, snaKK.idxz_max); + Kokkos::parallel_for("ComputeZiChemsnap", policy_compute_zi, *this); + + auto policy_compute_bi = snap_get_policy>(chunk_size_div, snaKK.idxb_max); + Kokkos::parallel_for("ComputeBiChemsnap", policy_compute_bi, *this); + } else { + auto policy_compute_zi = snap_get_policy, min_blocks_compute_zi>(chunk_size_div, snaKK.idxz_max); + Kokkos::parallel_for("ComputeZi", policy_compute_zi, *this); + + auto policy_compute_bi = snap_get_policy>(chunk_size_div, snaKK.idxb_max); + Kokkos::parallel_for("ComputeBi", policy_compute_bi, *this); } - //TransformUi: un-"fold" ulisttot, zero ylist - { - // team_size_transform_ui is defined in `pair_snap_kokkos.h` - Snap3DRangePolicy - policy_transform_ui({0,0,0},{vector_length,snaKK.idxu_max,chunk_size_div},{vector_length,tile_size_transform_ui,1}); - Kokkos::parallel_for("TransformUi",policy_transform_ui,*this); - } + } - //Compute bispectrum in AoSoA data layout, transform Bi - if (quadraticflag || eflag) { - // team_size_[compute_zi, compute_bi, transform_bi] are defined in `pair_snap_kokkos.h` + { + //Compute beta = dE_i/dB_i for all i in list; linear portion only + auto policy_compute_beta_linear = snap_get_policy(chunk_size_div, snaKK.idxb_max); + Kokkos::parallel_for("ComputeBetaLinear", policy_compute_beta_linear, *this); - //ComputeZi - const int idxz_max = snaKK.idxz_max; - Snap3DRangePolicy - policy_compute_zi({0,0,0},{vector_length,idxz_max,chunk_size_div},{vector_length,tile_size_compute_zi,1}); - Kokkos::parallel_for("ComputeZi",policy_compute_zi,*this); - - //ComputeBi - const int idxb_max = snaKK.idxb_max; - Snap3DRangePolicy - policy_compute_bi({0,0,0},{vector_length,idxb_max,chunk_size_div},{vector_length,tile_size_compute_bi,1}); - Kokkos::parallel_for("ComputeBi",policy_compute_bi,*this); - - //Transform data layout of blist out of AoSoA - //We need this because `blist` gets used in ComputeForce which doesn't - //take advantage of AoSoA, which at best would only be beneficial on the margins - Snap3DRangePolicy - policy_transform_bi({0,0,0},{vector_length,idxb_max,chunk_size_div},{vector_length,tile_size_transform_bi,1}); - Kokkos::parallel_for("TransformBi",policy_transform_bi,*this); + if (quadraticflag) { + // Compute the quadratic correction + auto policy_compute_beta_quadratic = snap_get_policy(chunk_size_div, snaKK.idxb_max); + Kokkos::parallel_for("ComputeBetaQuadratic", policy_compute_beta_quadratic, *this); } //Note zeroing `ylist` is fused into `TransformUi`. - { - //Compute beta = dE_i/dB_i for all i in list - typename Kokkos::RangePolicy policy_beta(0,chunk_size); - Kokkos::parallel_for("ComputeBeta",policy_beta,*this); - const int idxz_max = snaKK.idxz_max; - if (quadraticflag || eflag) { - Snap3DRangePolicy - policy_compute_yi({0,0,0},{vector_length,idxz_max,chunk_size_div},{vector_length,tile_size_compute_yi,1}); - Kokkos::parallel_for("ComputeYiWithZlist",policy_compute_yi,*this); + if (quadraticflag || eflag) { + if (nelements > 1) { + auto policy_compute_yi = snap_get_policy>(chunk_size_div, snaKK.idxz_max); + Kokkos::parallel_for("ComputeYiWithZlistChemsnap", policy_compute_yi, *this); } else { - Snap3DRangePolicy - policy_compute_yi({0,0,0},{vector_length,idxz_max,chunk_size_div},{vector_length,tile_size_compute_yi,1}); - Kokkos::parallel_for("ComputeYi",policy_compute_yi,*this); + auto policy_compute_yi = snap_get_policy>(chunk_size_div, snaKK.idxz_max); + Kokkos::parallel_for("ComputeYiWithZlist", policy_compute_yi, *this); + } + } else { + if (nelements > 1) { + auto policy_compute_yi = snap_get_policy, min_blocks_compute_yi>(chunk_size_div, snaKK.idxz_max); + Kokkos::parallel_for("ComputeYiChemsnap", policy_compute_yi, *this); + } else { + auto policy_compute_yi = snap_get_policy, min_blocks_compute_yi>(chunk_size_div, snaKK.idxz_max); + Kokkos::parallel_for("ComputeYi", policy_compute_yi, *this); } } + } + if constexpr (host_flag) { + //ComputeDuidrj and Deidrj + auto policy_duidrj_cpu = snap_get_policy(chunk_size_div, max_neighs); + Kokkos::parallel_for("ComputeDuidrjCPU", policy_duidrj_cpu, *this); + + auto policy_deidrj_cpu = snap_get_policy(chunk_size_div, max_neighs); + Kokkos::parallel_for("ComputeDeidrjCPU",policy_deidrj_cpu,*this); + } else { // GPU // Fused ComputeDuidrj, ComputeDeidrj + // team_size_compute_fused_deidrj is defined in `pair_snap_kokkos.h` + + // scratch size: 32 atoms * (twojmax+1) cached values * 2 for u, du, no double buffer + const int tile_size = vector_length * (twojmax + 1); + const int scratch_size = scratch_size_helper(2 * team_size_compute_fused_deidrj * tile_size); + + if (chunk_size < parallel_thresh) { - // team_size_compute_fused_deidrj is defined in `pair_snap_kokkos.h` + // Version with parallelism over j_bend - // scratch size: 32 atoms * (twojmax+1) cached values * 2 for u, du, no double buffer - const int tile_size = vector_length * (twojmax + 1); - const int scratch_size = scratch_size_helper(2 * team_size_compute_fused_deidrj * tile_size); + // total number of teams needed: (natoms / 32) * (max_neighs) * ("bend" locations) + const int n_teams = chunk_size_div * max_neighs * (twojmax + 1); + const int n_teams_div = (n_teams + team_size_compute_fused_deidrj - 1) / team_size_compute_fused_deidrj; - if (chunk_size < parallel_thresh) - { - // Version with parallelism over j_bend + // x direction + SnapAoSoATeamPolicy > policy_fused_deidrj_x(n_teams_div,team_size_compute_fused_deidrj,vector_length); + policy_fused_deidrj_x = policy_fused_deidrj_x.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); + Kokkos::parallel_for("ComputeFusedDeidrjSmall<0>",policy_fused_deidrj_x,*this); - // total number of teams needed: (natoms / 32) * (max_neighs) * ("bend" locations) - const int n_teams = chunk_size_div * max_neighs * (twojmax + 1); - const int n_teams_div = (n_teams + team_size_compute_fused_deidrj - 1) / team_size_compute_fused_deidrj; + // y direction + SnapAoSoATeamPolicy > policy_fused_deidrj_y(n_teams_div,team_size_compute_fused_deidrj,vector_length); + policy_fused_deidrj_y = policy_fused_deidrj_y.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); + Kokkos::parallel_for("ComputeFusedDeidrjSmall<1>",policy_fused_deidrj_y,*this); - // x direction - SnapAoSoATeamPolicy > policy_fused_deidrj_x(n_teams_div,team_size_compute_fused_deidrj,vector_length); - policy_fused_deidrj_x = policy_fused_deidrj_x.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); - Kokkos::parallel_for("ComputeFusedDeidrjSmall<0>",policy_fused_deidrj_x,*this); + // z direction + SnapAoSoATeamPolicy > policy_fused_deidrj_z(n_teams_div,team_size_compute_fused_deidrj,vector_length); + policy_fused_deidrj_z = policy_fused_deidrj_z.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); + Kokkos::parallel_for("ComputeFusedDeidrjSmall<2>",policy_fused_deidrj_z,*this); + } else { + // Version w/out parallelism over j_bend - // y direction - SnapAoSoATeamPolicy > policy_fused_deidrj_y(n_teams_div,team_size_compute_fused_deidrj,vector_length); - policy_fused_deidrj_y = policy_fused_deidrj_y.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); - Kokkos::parallel_for("ComputeFusedDeidrjSmall<1>",policy_fused_deidrj_y,*this); + // total number of teams needed: (natoms / 32) * (max_neighs) + const int n_teams = chunk_size_div * max_neighs; + const int n_teams_div = (n_teams + team_size_compute_fused_deidrj - 1) / team_size_compute_fused_deidrj; - // z direction - SnapAoSoATeamPolicy > policy_fused_deidrj_z(n_teams_div,team_size_compute_fused_deidrj,vector_length); - policy_fused_deidrj_z = policy_fused_deidrj_z.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); - Kokkos::parallel_for("ComputeFusedDeidrjSmall<2>",policy_fused_deidrj_z,*this); - } else { - // Version w/out parallelism over j_bend + // x direction + SnapAoSoATeamPolicy > policy_fused_deidrj_x(n_teams_div,team_size_compute_fused_deidrj,vector_length); + policy_fused_deidrj_x = policy_fused_deidrj_x.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); + Kokkos::parallel_for("ComputeFusedDeidrjLarge<0>",policy_fused_deidrj_x,*this); - // total number of teams needed: (natoms / 32) * (max_neighs) - const int n_teams = chunk_size_div * max_neighs; - const int n_teams_div = (n_teams + team_size_compute_fused_deidrj - 1) / team_size_compute_fused_deidrj; + // y direction + SnapAoSoATeamPolicy > policy_fused_deidrj_y(n_teams_div,team_size_compute_fused_deidrj,vector_length); + policy_fused_deidrj_y = policy_fused_deidrj_y.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); + Kokkos::parallel_for("ComputeFusedDeidrjLarge<1>",policy_fused_deidrj_y,*this); - // x direction - SnapAoSoATeamPolicy > policy_fused_deidrj_x(n_teams_div,team_size_compute_fused_deidrj,vector_length); - policy_fused_deidrj_x = policy_fused_deidrj_x.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); - Kokkos::parallel_for("ComputeFusedDeidrjLarge<0>",policy_fused_deidrj_x,*this); + // z direction + SnapAoSoATeamPolicy > policy_fused_deidrj_z(n_teams_div,team_size_compute_fused_deidrj,vector_length); + policy_fused_deidrj_z = policy_fused_deidrj_z.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); + Kokkos::parallel_for("ComputeFusedDeidrjLarge<2>",policy_fused_deidrj_z,*this); - // y direction - SnapAoSoATeamPolicy > policy_fused_deidrj_y(n_teams_div,team_size_compute_fused_deidrj,vector_length); - policy_fused_deidrj_y = policy_fused_deidrj_y.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); - Kokkos::parallel_for("ComputeFusedDeidrjLarge<1>",policy_fused_deidrj_y,*this); - - // z direction - SnapAoSoATeamPolicy > policy_fused_deidrj_z(n_teams_div,team_size_compute_fused_deidrj,vector_length); - policy_fused_deidrj_z = policy_fused_deidrj_z.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); - Kokkos::parallel_for("ComputeFusedDeidrjLarge<2>",policy_fused_deidrj_z,*this); - - } } - -#endif // LMP_KOKKOS_GPU - } //ComputeForce @@ -607,8 +536,8 @@ void PairSNAPKokkos::coeff(int narg, char Kokkos::deep_copy(d_dinnerelem,h_dinnerelem); Kokkos::deep_copy(d_map,h_map); - snaKK = SNAKokkos(rfac0,twojmax, - rmin0,switchflag,bzeroflag,chemflag,bnormflag,wselfallflag,nelements,switchinnerflag); + snaKK = SNAKokkos(*this); //rfac0,twojmax, + //rmin0,switchflag,bzeroflag,chemflag,bnormflag,wselfallflag,nelements,switchinnerflag); snaKK.grow_rij(0,0); snaKK.init(); } @@ -618,53 +547,10 @@ void PairSNAPKokkos::coeff(int narg, char of AoSoA data layouts and scratch memory for recursive polynomials ------------------------------------------------------------------------- */ -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPBeta,const int& ii) const { - - if (ii >= chunk_size) return; - - const int iatom_mod = ii % vector_length; - const int iatom_div = ii / vector_length; - - const int i = d_ilist[ii + chunk_offset]; - const int itype = type[i]; - const int ielem = d_map[itype]; - SNAKokkos my_sna = snaKK; - - auto d_coeffi = Kokkos::subview(d_coeffelem, ielem, Kokkos::ALL); - - for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - d_beta_pack(iatom_mod,icoeff,iatom_div) = d_coeffi[icoeff+1]; - } - - if (quadraticflag) { - const auto idxb_max = my_sna.idxb_max; - int k = ncoeff+1; - for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - const auto idxb = icoeff % idxb_max; - const auto idx_chem = icoeff / idxb_max; - real_type bveci = my_sna.blist(ii, idx_chem, idxb); - d_beta_pack(iatom_mod,icoeff,iatom_div) += d_coeffi[k]*bveci; - k++; - for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - const auto jdxb = jcoeff % idxb_max; - const auto jdx_chem = jcoeff / idxb_max; - real_type bvecj = my_sna.blist(ii, jdx_chem, jdxb); - d_beta_pack(iatom_mod,icoeff,iatom_div) += d_coeffi[k]*bvecj; - d_beta_pack(iatom_mod,jcoeff,iatom_div) += d_coeffi[k]*bveci; - k++; - } - } - } -} - template KOKKOS_INLINE_FUNCTION void PairSNAPKokkos::operator() (TagPairSNAPComputeNeigh,const typename Kokkos::TeamPolicy::member_type& team) const { - SNAKokkos my_sna = snaKK; - // extract atom number int ii = team.team_rank() + team.league_rank() * team.team_size(); if (ii >= chunk_size) return; @@ -731,320 +617,34 @@ void PairSNAPKokkos::operator() (TagPairSN const F_FLOAT dy = x(j,1) - ytmp; const F_FLOAT dz = x(j,2) - ztmp; const int jelem = d_map[jtype]; - my_sna.rij(ii,offset,0) = static_cast(dx); - my_sna.rij(ii,offset,1) = static_cast(dy); - my_sna.rij(ii,offset,2) = static_cast(dz); - my_sna.wj(ii,offset) = static_cast(d_wjelem[jelem]); - my_sna.rcutij(ii,offset) = static_cast((radi + d_radelem[jelem])*rcutfac); - my_sna.inside(ii,offset) = j; + snaKK.rij(ii,offset,0) = static_cast(dx); + snaKK.rij(ii,offset,1) = static_cast(dy); + snaKK.rij(ii,offset,2) = static_cast(dz); + snaKK.wj(ii,offset) = static_cast(d_wjelem[jelem]); + snaKK.rcutij(ii,offset) = static_cast((radi + d_radelem[jelem])*rcutfac); + snaKK.inside(ii,offset) = j; if (switchinnerflag) { - my_sna.sinnerij(ii,offset) = 0.5*(d_sinnerelem[ielem] + d_sinnerelem[jelem]); - my_sna.dinnerij(ii,offset) = 0.5*(d_dinnerelem[ielem] + d_dinnerelem[jelem]); + snaKK.sinnerij(ii,offset) = 0.5*(d_sinnerelem[ielem] + d_sinnerelem[jelem]); + snaKK.dinnerij(ii,offset) = 0.5*(d_dinnerelem[ielem] + d_dinnerelem[jelem]); } if (chemflag) - my_sna.element(ii,offset) = jelem; + snaKK.element(ii,offset) = jelem; else - my_sna.element(ii,offset) = 0; + snaKK.element(ii,offset) = 0; } offset++; } }); } -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeCayleyKlein,const int iatom_mod, const int jnbor, const int iatom_div) const { - SNAKokkos my_sna = snaKK; - - const int ii = iatom_mod + iatom_div * vector_length; - if (ii >= chunk_size) return; - - const int ninside = d_ninside(ii); - if (jnbor >= ninside) return; - - my_sna.compute_cayley_klein(iatom_mod,jnbor,iatom_div); -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPPreUi, const int iatom_mod, const int j, const int iatom_div) const { - SNAKokkos my_sna = snaKK; - - const int ii = iatom_mod + iatom_div * vector_length; - if (ii >= chunk_size) return; - - int itype = type(ii); - int ielem = d_map[itype]; - - my_sna.pre_ui(iatom_mod, j, ielem, iatom_div); -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeUiSmall,const typename Kokkos::TeamPolicy::member_type& team) const { - SNAKokkos my_sna = snaKK; - - // extract flattened atom_div / neighbor number / bend location - int flattened_idx = team.team_rank() + team.league_rank() * team_size_compute_ui; - - // extract neighbor index, iatom_div - int iatom_div = flattened_idx / (max_neighs * (twojmax + 1)); // removed "const" to work around GCC 7 bug - const int jj_jbend = flattened_idx - iatom_div * (max_neighs * (twojmax + 1)); - const int jbend = jj_jbend / max_neighs; - int jj = jj_jbend - jbend * max_neighs; // removed "const" to work around GCC 7 bug - - Kokkos::parallel_for(Kokkos::ThreadVectorRange(team, vector_length), - [&] (const int iatom_mod) { - const int ii = iatom_mod + vector_length * iatom_div; - if (ii >= chunk_size) return; - - const int ninside = d_ninside(ii); - if (jj >= ninside) return; - - my_sna.compute_ui_small(team, iatom_mod, jbend, jj, iatom_div); - }); - -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeUiLarge,const typename Kokkos::TeamPolicy::member_type& team) const { - SNAKokkos my_sna = snaKK; - - // extract flattened atom_div / neighbor number / bend location - int flattened_idx = team.team_rank() + team.league_rank() * team_size_compute_ui; - - // extract neighbor index, iatom_div - int iatom_div = flattened_idx / max_neighs; // removed "const" to work around GCC 7 bug - int jj = flattened_idx - iatom_div * max_neighs; - - Kokkos::parallel_for(Kokkos::ThreadVectorRange(team, vector_length), - [&] (const int iatom_mod) { - const int ii = iatom_mod + vector_length * iatom_div; - if (ii >= chunk_size) return; - - const int ninside = d_ninside(ii); - if (jj >= ninside) return; - - my_sna.compute_ui_large(team,iatom_mod, jj, iatom_div); - }); - -} - - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPTransformUi,const int iatom_mod, const int idxu, const int iatom_div) const { - SNAKokkos my_sna = snaKK; - - const int iatom = iatom_mod + iatom_div * vector_length; - if (iatom >= chunk_size) return; - - if (idxu > my_sna.idxu_max) return; - - int elem_count = chemflag ? nelements : 1; - - for (int ielem = 0; ielem < elem_count; ielem++) { - - const FullHalfMapper mapper = my_sna.idxu_full_half[idxu]; - - auto utot_re = my_sna.ulisttot_re_pack(iatom_mod, mapper.idxu_half, ielem, iatom_div); - auto utot_im = my_sna.ulisttot_im_pack(iatom_mod, mapper.idxu_half, ielem, iatom_div); - - if (mapper.flip_sign == 1) { - utot_im = -utot_im; - } else if (mapper.flip_sign == -1) { - utot_re = -utot_re; - } - - my_sna.ulisttot_pack(iatom_mod, idxu, ielem, iatom_div) = { utot_re, utot_im }; - - if (mapper.flip_sign == 0) { - my_sna.ylist_pack_re(iatom_mod, mapper.idxu_half, ielem, iatom_div) = 0.; - my_sna.ylist_pack_im(iatom_mod, mapper.idxu_half, ielem, iatom_div) = 0.; - } - } -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeYi,const int iatom_mod, const int jjz, const int iatom_div) const { - SNAKokkos my_sna = snaKK; - - const int iatom = iatom_mod + iatom_div * vector_length; - if (iatom >= chunk_size) return; - - if (jjz >= my_sna.idxz_max) return; - - my_sna.compute_yi(iatom_mod,jjz,iatom_div,d_beta_pack); -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeYiWithZlist,const int iatom_mod, const int jjz, const int iatom_div) const { - SNAKokkos my_sna = snaKK; - - const int iatom = iatom_mod + iatom_div * vector_length; - if (iatom >= chunk_size) return; - - if (jjz >= my_sna.idxz_max) return; - - my_sna.compute_yi_with_zlist(iatom_mod,jjz,iatom_div,d_beta_pack); -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeZi,const int iatom_mod, const int jjz, const int iatom_div) const { - SNAKokkos my_sna = snaKK; - - const int iatom = iatom_mod + iatom_div * vector_length; - if (iatom >= chunk_size) return; - - if (jjz >= my_sna.idxz_max) return; - - my_sna.compute_zi(iatom_mod,jjz,iatom_div); -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeBi,const int iatom_mod, const int jjb, const int iatom_div) const { - SNAKokkos my_sna = snaKK; - - const int iatom = iatom_mod + iatom_div * vector_length; - if (iatom >= chunk_size) return; - - if (jjb >= my_sna.idxb_max) return; - - my_sna.compute_bi(iatom_mod,jjb,iatom_div); -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPTransformBi,const int iatom_mod, const int idxb, const int iatom_div) const { - SNAKokkos my_sna = snaKK; - - const int iatom = iatom_mod + iatom_div * vector_length; - if (iatom >= chunk_size) return; - - if (idxb >= my_sna.idxb_max) return; - - const int ntriples = my_sna.ntriples; - - for (int itriple = 0; itriple < ntriples; itriple++) { - - const real_type blocal = my_sna.blist_pack(iatom_mod, idxb, itriple, iatom_div); - - my_sna.blist(iatom, itriple, idxb) = blocal; - } - -} - -template -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeFusedDeidrjSmall,const typename Kokkos::TeamPolicy >::member_type& team) const { - SNAKokkos my_sna = snaKK; - - // extract flattened atom_div / neighbor number / bend location - int flattened_idx = team.team_rank() + team.league_rank() * team_size_compute_fused_deidrj; - - // extract neighbor index, iatom_div - int iatom_div = flattened_idx / (max_neighs * (twojmax + 1)); // removed "const" to work around GCC 7 bug - const int jj_jbend = flattened_idx - iatom_div * (max_neighs * (twojmax + 1)); - const int jbend = jj_jbend / max_neighs; - int jj = jj_jbend - jbend * max_neighs; // removed "const" to work around GCC 7 bug - - Kokkos::parallel_for(Kokkos::ThreadVectorRange(team, vector_length), - [&] (const int iatom_mod) { - const int ii = iatom_mod + vector_length * iatom_div; - if (ii >= chunk_size) return; - - const int ninside = d_ninside(ii); - if (jj >= ninside) return; - - my_sna.template compute_fused_deidrj_small(team, iatom_mod, jbend, jj, iatom_div); - - }); - -} - -template -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeFusedDeidrjLarge,const typename Kokkos::TeamPolicy >::member_type& team) const { - SNAKokkos my_sna = snaKK; - - // extract flattened atom_div / neighbor number / bend location - int flattened_idx = team.team_rank() + team.league_rank() * team_size_compute_fused_deidrj; - - // extract neighbor index, iatom_div - int iatom_div = flattened_idx / max_neighs; // removed "const" to work around GCC 7 bug - int jj = flattened_idx - max_neighs * iatom_div; - - Kokkos::parallel_for(Kokkos::ThreadVectorRange(team, vector_length), - [&] (const int iatom_mod) { - const int ii = iatom_mod + vector_length * iatom_div; - if (ii >= chunk_size) return; - - const int ninside = d_ninside(ii); - if (jj >= ninside) return; - - my_sna.template compute_fused_deidrj_large(team, iatom_mod, jj, iatom_div); - - }); -} - -/* ---------------------------------------------------------------------- - Begin routines that are unique to the CPU codepath. These do not take - advantage of AoSoA data layouts, but that could be a good point of - future optimization and unification with the above kernels. It's unlikely - that scratch memory optimizations will ever be useful for the CPU due to - different arithmetic intensity requirements for the CPU vs GPU. -------------------------------------------------------------------------- */ - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPBetaCPU,const int& ii) const { - - const int i = d_ilist[ii + chunk_offset]; - const int itype = type[i]; - const int ielem = d_map[itype]; - SNAKokkos my_sna = snaKK; - - auto d_coeffi = Kokkos::subview(d_coeffelem, ielem, Kokkos::ALL); - - for (int icoeff = 0; icoeff < ncoeff; icoeff++) - d_beta(icoeff,ii) = d_coeffi[icoeff+1]; - - if (quadraticflag) { - const auto idxb_max = my_sna.idxb_max; - int k = ncoeff+1; - for (int icoeff = 0; icoeff < ncoeff; icoeff++) { - const auto idxb = icoeff % idxb_max; - const auto idx_chem = icoeff / idxb_max; - real_type bveci = my_sna.blist(ii,idx_chem,idxb); - d_beta(icoeff,ii) += d_coeffi[k]*bveci; - k++; - for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { - const auto jdxb = jcoeff % idxb_max; - const auto jdx_chem = jcoeff / idxb_max; - real_type bvecj = my_sna.blist(ii,jdx_chem,jdxb); - d_beta(icoeff,ii) += d_coeffi[k]*bvecj; - d_beta(jcoeff,ii) += d_coeffi[k]*bveci; - k++; - } - } - } -} - template KOKKOS_INLINE_FUNCTION void PairSNAPKokkos::operator() (TagPairSNAPComputeNeighCPU,const typename Kokkos::TeamPolicy::member_type& team) const { - int ii = team.league_rank(); + if (ii >= chunk_size) return; + const int i = d_ilist[ii + chunk_offset]; - SNAKokkos my_sna = snaKK; const double xtmp = x(i,0); const double ytmp = x(i,1); const double ztmp = x(i,2); @@ -1094,170 +694,510 @@ void PairSNAPKokkos::operator() (TagPairSN if (rsq < rnd_cutsq(itype,jtype)) { if (final) { - my_sna.rij(ii,offset,0) = static_cast(dx); - my_sna.rij(ii,offset,1) = static_cast(dy); - my_sna.rij(ii,offset,2) = static_cast(dz); - my_sna.wj(ii,offset) = static_cast(d_wjelem[jelem]); - my_sna.rcutij(ii,offset) = static_cast((radi + d_radelem[jelem])*rcutfac); - my_sna.inside(ii,offset) = j; + snaKK.rij(ii,offset,0) = static_cast(dx); + snaKK.rij(ii,offset,1) = static_cast(dy); + snaKK.rij(ii,offset,2) = static_cast(dz); + snaKK.wj(ii,offset) = static_cast(d_wjelem[jelem]); + snaKK.rcutij(ii,offset) = static_cast((radi + d_radelem[jelem])*rcutfac); + snaKK.inside(ii,offset) = j; if (switchinnerflag) { - my_sna.sinnerij(ii,offset) = 0.5*(d_sinnerelem[ielem] + d_sinnerelem[jelem]); - my_sna.dinnerij(ii,offset) = 0.5*(d_dinnerelem[ielem] + d_dinnerelem[jelem]); + snaKK.sinnerij(ii,offset) = 0.5*(d_sinnerelem[ielem] + d_sinnerelem[jelem]); + snaKK.dinnerij(ii,offset) = 0.5*(d_dinnerelem[ielem] + d_dinnerelem[jelem]); } if (chemflag) - my_sna.element(ii,offset) = jelem; + snaKK.element(ii,offset) = jelem; else - my_sna.element(ii,offset) = 0; + snaKK.element(ii,offset) = 0; } offset++; } }); } +/* ---------------------------------------------------------------------- + Pre-compute the Cayley-Klein parameters for reuse in later routines. + GPU only. +------------------------------------------------------------------------- */ template KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPPreUiCPU,const typename Kokkos::TeamPolicy::member_type& team) const { - SNAKokkos my_sna = snaKK; - - // Extract the atom number - const int ii = team.team_rank() + team.team_size() * team.league_rank(); - if (ii >= chunk_size) return; - int itype = type(ii); - int ielem = d_map[itype]; - - my_sna.pre_ui_cpu(team,ii,ielem); -} - - - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeUiCPU,const typename Kokkos::TeamPolicy::member_type& team) const { - SNAKokkos my_sna = snaKK; - - // Extract the atom number - int ii = team.team_rank() + team.team_size() * (team.league_rank() % ((chunk_size+team.team_size()-1)/team.team_size())); - if (ii >= chunk_size) return; - - // Extract the neighbor number - const int jj = team.league_rank() / ((chunk_size+team.team_size()-1)/team.team_size()); - const int ninside = d_ninside(ii); - if (jj >= ninside) return; - - my_sna.compute_ui_cpu(team,ii,jj); -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPTransformUiCPU, const int j, const int iatom) const { - SNAKokkos my_sna = snaKK; +void PairSNAPKokkos::operator() (TagPairSNAPComputeCayleyKlein,const int iatom_mod, const int jnbor, const int iatom_div) const { + const int iatom = iatom_mod + iatom_div * vector_length; if (iatom >= chunk_size) return; - if (j > twojmax) return; + const int ninside = d_ninside(iatom); + if (jnbor >= ninside) return; - int elem_count = chemflag ? nelements : 1; - - // De-symmetrize ulisttot - for (int ielem = 0; ielem < elem_count; ielem++) { - - const int jju_half = my_sna.idxu_half_block(j); - const int jju = my_sna.idxu_block(j); - - for (int mb = 0; 2*mb <= j; mb++) { - for (int ma = 0; ma <= j; ma++) { - // Extract top half - - const int idxu_shift = mb * (j + 1) + ma; - const int idxu_half = jju_half + idxu_shift; - const int idxu = jju + idxu_shift; - - // Load ulist - auto utot = my_sna.ulisttot(idxu_half, ielem, iatom); - - // Store - my_sna.ulisttot_full(idxu, ielem, iatom) = utot; - - // Zero Yi - my_sna.ylist(idxu_half, ielem, iatom) = {0., 0.}; - - // Symmetric term - const int sign_factor = (((ma+mb)%2==0)?1:-1); - const int idxu_flip = jju + (j + 1 - mb) * (j + 1) - (ma + 1); - - if (sign_factor == 1) { - utot.im = -utot.im; - } else { - utot.re = -utot.re; - } - - my_sna.ulisttot_full(idxu_flip, ielem, iatom) = utot; - } - } - } -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeYiCPU,const int& ii) const { - SNAKokkos my_sna = snaKK; - my_sna.compute_yi_cpu(ii,d_beta); -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeZiCPU,const int& ii) const { - SNAKokkos my_sna = snaKK; - my_sna.compute_zi_cpu(ii); -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeBiCPU,const typename Kokkos::TeamPolicy::member_type& team) const { - int ii = team.league_rank(); - SNAKokkos my_sna = snaKK; - my_sna.compute_bi_cpu(team,ii); -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeDuidrjCPU,const typename Kokkos::TeamPolicy::member_type& team) const { - SNAKokkos my_sna = snaKK; - - // Extract the atom number - int ii = team.team_rank() + team.team_size() * (team.league_rank() % ((chunk_size+team.team_size()-1)/team.team_size())); - if (ii >= chunk_size) return; - - // Extract the neighbor number - const int jj = team.league_rank() / ((chunk_size+team.team_size()-1)/team.team_size()); - const int ninside = d_ninside(ii); - if (jj >= ninside) return; - - my_sna.compute_duidrj_cpu(team,ii,jj); -} - -template -KOKKOS_INLINE_FUNCTION -void PairSNAPKokkos::operator() (TagPairSNAPComputeDeidrjCPU,const typename Kokkos::TeamPolicy::member_type& team) const { - SNAKokkos my_sna = snaKK; - - // Extract the atom number - int ii = team.team_rank() + team.team_size() * (team.league_rank() % ((chunk_size+team.team_size()-1)/team.team_size())); - if (ii >= chunk_size) return; - - // Extract the neighbor number - const int jj = team.league_rank() / ((chunk_size+team.team_size()-1)/team.team_size()); - const int ninside = d_ninside(ii); - if (jj >= ninside) return; - - my_sna.compute_deidrj_cpu(team,ii,jj); + snaKK.compute_cayley_klein(iatom, jnbor); } /* ---------------------------------------------------------------------- - Also used for both CPU and GPU codepaths. Could maybe benefit from a - separate GPU/CPU codepath, but this kernel takes so little time it's - likely not worth it. + Initialize the "ulisttot" structure with non-zero on-diagonal terms + and zero terms elsewhere; both CPU and GPU. +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPPreUi, const int& iatom_mod, const int& j, const int& iatom_div) const { + const int iatom = iatom_mod + iatom_div * vector_length; + if (iatom >= chunk_size) return; + + int itype = type(iatom); + int ielem = d_map[itype]; + + snaKK.pre_ui(iatom, j, ielem); +} + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPPreUi, const int& iatom, const int& j) const { + if (iatom >= chunk_size) return; + + int itype = type(iatom); + int ielem = d_map[itype]; + + snaKK.pre_ui(iatom, j, ielem); +} + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPPreUi, const int& iatom) const { + if (iatom >= chunk_size) return; + + const int itype = type(iatom); + const int ielem = d_map[itype]; + + for (int j = 0; j <= twojmax; j++) + snaKK.pre_ui(iatom, j, ielem); +} + +/* ---------------------------------------------------------------------- + Accumulate the spectral contributions from atom, neighbor pairs into + ulisttot_re and _im. These routines are GPU only and use scratch memory + staging. +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeUiSmall,const typename Kokkos::TeamPolicy::member_type& team) const { + + // extract flattened atom_div / neighbor number / bend location + int flattened_idx = team.team_rank() + team.league_rank() * team_size_compute_ui; + + // extract neighbor index, iatom_div + int iatom_div = flattened_idx / (max_neighs * (twojmax + 1)); // removed "const" to work around GCC 7 bug + const int jj_jbend = flattened_idx - iatom_div * (max_neighs * (twojmax + 1)); + const int jbend = jj_jbend / max_neighs; + int jj = jj_jbend - jbend * max_neighs; // removed "const" to work around GCC 7 bug + + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team, vector_length), + [&] (const int iatom_mod) { + const int ii = iatom_mod + vector_length * iatom_div; + if (ii >= chunk_size) return; + + const int ninside = d_ninside(ii); + if (jj >= ninside) return; + + snaKK.compute_ui_small(team, iatom_mod, jbend, jj, iatom_div); + }); + +} + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeUiLarge,const typename Kokkos::TeamPolicy::member_type& team) const { + + // extract flattened atom_div / neighbor number / bend location + int flattened_idx = team.team_rank() + team.league_rank() * team_size_compute_ui; + + // extract neighbor index, iatom_div + int iatom_div = flattened_idx / max_neighs; // removed "const" to work around GCC 7 bug + int jj = flattened_idx - iatom_div * max_neighs; + + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team, vector_length), + [&] (const int iatom_mod) { + const int ii = iatom_mod + vector_length * iatom_div; + if (ii >= chunk_size) return; + + const int ninside = d_ninside(ii); + if (jj >= ninside) return; + + snaKK.compute_ui_large(team,iatom_mod, jj, iatom_div); + }); +} + +/* ---------------------------------------------------------------------- + Accumulate the spectral contributions from atom, neighbor pairs into + ulisttot_re and _im. This routine is CPU only and does not use staging. +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeUiCPU, const int& iatom, const int& jnbor) const { + if (iatom >= chunk_size) return; + const int ninside = d_ninside(iatom); + if (jnbor >= ninside) return; + snaKK.template compute_ui_cpu(iatom, jnbor); +} + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeUiCPU, const int& iatom) const { + if (iatom >= chunk_size) return; + const int ninside = d_ninside(iatom); + for (int jnbor = 0; jnbor < ninside; jnbor++) + snaKK.template compute_ui_cpu(iatom, jnbor); +} + +/* ---------------------------------------------------------------------- + De-symmetrize ulisttot_re and _im and pack it into a unified ulisttot + structure. Zero-initialize ylist. CPU and GPU. +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPTransformUi, const int& iatom_mod, const int& idxu, const int& iatom_div) const { + const int iatom = iatom_mod + iatom_div * vector_length; + if (iatom >= chunk_size) return; + if (idxu >= snaKK.idxu_max) return; + snaKK.transform_ui(iatom, idxu); +} + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPTransformUi, const int& iatom, const int& idxu) const { + if (iatom >= chunk_size) return; + snaKK.transform_ui(iatom, idxu); +} + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPTransformUi, const int& iatom) const { + if (iatom >= chunk_size) return; + for (int idxu = 0; idxu < snaKK.idxu_max; idxu++) + snaKK.transform_ui(iatom, idxu); +} + +/* ---------------------------------------------------------------------- + Compute all elements of the Z tensor and store them into the `zlist` + View. This is only used for energy timesteps or quadratic SNAP. + CPU and GPU. +------------------------------------------------------------------------- */ + +template +template KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeZi, const int& iatom_mod, const int& jjz, const int& iatom_div) const { + const int iatom = iatom_mod + iatom_div * vector_length; + if (iatom >= chunk_size) return; + if (jjz >= snaKK.idxz_max) return; + snaKK.template compute_zi(iatom, jjz); +} + +template +template KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeZi, const int& iatom, const int& jjz) const { + if (iatom >= chunk_size) return; + snaKK.template compute_zi(iatom, jjz); +} + +template +template KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeZi, const int& iatom) const { + if (iatom >= chunk_size) return; + for (int jjz = 0; jjz < snaKK.idxz_max; jjz++) + snaKK.template compute_zi(iatom, jjz); +} + +/* ---------------------------------------------------------------------- + Compute the energy triple products and store in the "blist" View. + CPU and GPU. +------------------------------------------------------------------------- */ + +template +template KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeBi, const int& iatom_mod, const int& jjb, const int& iatom_div) const { + const int iatom = iatom_mod + iatom_div * vector_length; + if (iatom >= chunk_size) return; + if (jjb >= snaKK.idxb_max) return; + snaKK.template compute_bi(iatom, jjb); +} + +template +template KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeBi, const int& iatom, const int& jjb) const { + if (iatom >= chunk_size) return; + snaKK.template compute_bi(iatom, jjb); +} + +template +template KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeBi, const int& iatom) const { + if (iatom >= chunk_size) return; + for (int jjb = 0; jjb < snaKK.idxb_max; jjb++) + snaKK.template compute_bi(iatom, jjb); +} + +/* ---------------------------------------------------------------------- + Assemble the "beta" coefficients that enter the computation of the + adjoint matrices Y. This is just for a linear potential. A quadratic + contribution is added in a subsequent kernel. CPU and GPU. +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeBetaLinear, const int& iatom_mod, const int& idxb, const int& iatom_div) const { + const int iatom = iatom_mod + iatom_div * vector_length; + if (iatom >= chunk_size) return; + if (idxb >= snaKK.idxb_max) return; + + const int i = d_ilist[iatom + chunk_offset]; + const int itype = type[i]; + const int ielem = d_map[itype]; + + snaKK.compute_beta_linear(iatom, idxb, ielem); +} + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeBetaLinear, const int& iatom, const int& idxb) const { + if (iatom >= chunk_size) return; + + const int i = d_ilist[iatom + chunk_offset]; + const int itype = type[i]; + const int ielem = d_map[itype]; + + snaKK.compute_beta_linear(iatom, idxb, ielem); +} + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeBetaLinear, const int& iatom) const { + if (iatom >= chunk_size) return; + + const int i = d_ilist[iatom + chunk_offset]; + const int itype = type[i]; + const int ielem = d_map[itype]; + + for (int idxb = 0; idxb < snaKK.idxb_max; idxb++) + snaKK.compute_beta_linear(iatom, idxb, ielem); +} + +/* ---------------------------------------------------------------------- + Accumulate the qudratic terms which includes accumulating + energy triple products into an "effective" beta that encodes the + quadratic terms with otherwise linear compute work. + CPU and GPU. +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeBetaQuadratic, const int& iatom_mod, const int& idxb, const int& iatom_div) const { + const int iatom = iatom_mod + iatom_div * vector_length; + if (iatom >= chunk_size) return; + if (idxb >= snaKK.idxb_max) return; + + const int i = d_ilist[iatom + chunk_offset]; + const int itype = type[i]; + const int ielem = d_map[itype]; + + snaKK.template compute_beta_quadratic(iatom, idxb, ielem); +} + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeBetaQuadratic, const int& iatom, const int& idxb) const { + if (iatom >= chunk_size) return; + + const int i = d_ilist[iatom + chunk_offset]; + const int itype = type[i]; + const int ielem = d_map[itype]; + + snaKK.template compute_beta_quadratic(iatom, idxb, ielem); +} + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeBetaQuadratic, const int& iatom) const { + if (iatom >= chunk_size) return; + + const int i = d_ilist[iatom + chunk_offset]; + const int itype = type[i]; + const int ielem = d_map[itype]; + + for (int idxb = 0; idxb < snaKK.idxb_max; idxb++) + snaKK.template compute_beta_quadratic(iatom, idxb, ielem); +} + +/* ---------------------------------------------------------------------- + Compute all elements of the Z tensor and accumultate them into the + adjoint matrices Y (ylist_re, _im) on non-energy timesteps. CPU and GPU. +------------------------------------------------------------------------- */ + +template +template KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeYi, const int& iatom_mod, const int& jjz, const int& iatom_div) const { + const int iatom = iatom_mod + iatom_div * vector_length; + if (iatom >= chunk_size) return; + if (jjz >= snaKK.idxz_max) return; + snaKK.template compute_yi(iatom, jjz); +} + +template +template KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeYi, const int& iatom, const int& jjz) const { + if (iatom >= chunk_size) return; + snaKK.template compute_yi(iatom, jjz); +} + +template +template KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeYi, const int& iatom) const { + if (iatom >= chunk_size) return; + for (int jjz = 0; jjz < snaKK.idxz_max; jjz++) + snaKK.template compute_yi(iatom, jjz); +} + +/* ---------------------------------------------------------------------- + Accumulate the pre-computed elements of the Z tensor into the adjoint + matrices Y (ylist_re, _im) on non-energy timesteps. CPU and GPU. +------------------------------------------------------------------------- */ + +template +template KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeYiWithZlist, const int& iatom_mod, const int& jjz, const int& iatom_div) const { + const int iatom = iatom_mod + iatom_div * vector_length; + if (iatom >= chunk_size) return; + if (jjz >= snaKK.idxz_max) return; + snaKK.template compute_yi_with_zlist(iatom, jjz); +} + +template +template KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeYiWithZlist, const int& iatom, const int& jjz) const { + if (iatom >= chunk_size) return; + snaKK.template compute_yi_with_zlist(iatom, jjz); +} + +template +template KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeYiWithZlist, const int& iatom) const { + if (iatom >= chunk_size) return; + for (int jjz = 0; jjz < snaKK.idxz_max; jjz++) + snaKK.template compute_yi_with_zlist(iatom, jjz); +} + +/* ---------------------------------------------------------------------- + Assemble the force contributions for each atom, neighbor pair by + contracting the adjoint matrices Y with derivatives of the Wigner + matrices U. These routines are GPU only and use scratch memory + staging. +------------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeFusedDeidrjSmall,const typename Kokkos::TeamPolicy >::member_type& team) const { + + // extract flattened atom_div / neighbor number / bend location + int flattened_idx = team.team_rank() + team.league_rank() * team_size_compute_fused_deidrj; + + // extract neighbor index, iatom_div + int iatom_div = flattened_idx / (max_neighs * (twojmax + 1)); // removed "const" to work around GCC 7 bug + const int jj_jbend = flattened_idx - iatom_div * (max_neighs * (twojmax + 1)); + const int jbend = jj_jbend / max_neighs; + int jj = jj_jbend - jbend * max_neighs; // removed "const" to work around GCC 7 bug + + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team, vector_length), + [&] (const int iatom_mod) { + const int ii = iatom_mod + vector_length * iatom_div; + if (ii >= chunk_size) return; + + const int ninside = d_ninside(ii); + if (jj >= ninside) return; + + snaKK.template compute_fused_deidrj_small(team, iatom_mod, jbend, jj, iatom_div); + + }); + +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeFusedDeidrjLarge,const typename Kokkos::TeamPolicy >::member_type& team) const { + + // extract flattened atom_div / neighbor number / bend location + int flattened_idx = team.team_rank() + team.league_rank() * team_size_compute_fused_deidrj; + + // extract neighbor index, iatom_div + int iatom_div = flattened_idx / max_neighs; // removed "const" to work around GCC 7 bug + int jj = flattened_idx - max_neighs * iatom_div; + + Kokkos::parallel_for(Kokkos::ThreadVectorRange(team, vector_length), + [&] (const int iatom_mod) { + const int ii = iatom_mod + vector_length * iatom_div; + if (ii >= chunk_size) return; + + const int ninside = d_ninside(ii); + if (jj >= ninside) return; + + snaKK.template compute_fused_deidrj_large(team, iatom_mod, jj, iatom_div); + + }); +} + +/* ---------------------------------------------------------------------- + Assemble the derivatives of the Winger matrices U into the View + "dulist". CPU only. +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeDuidrjCPU, const int& iatom, const int& jnbor) const { + if (iatom >= chunk_size) return; + const int ninside = d_ninside(iatom); + if (jnbor >= ninside) return; + snaKK.compute_duidrj_cpu(iatom, jnbor); +} + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeDuidrjCPU, const int& iatom) const { + if (iatom >= chunk_size) return; + const int ninside = d_ninside(iatom); + for (int jnbor = 0; jnbor < ninside; jnbor++) + snaKK.compute_duidrj_cpu(iatom, jnbor); +} + +/* ---------------------------------------------------------------------- + Assemble the force contributions for each atom, neighbor pair by + contracting the adjoint matrices Y with the pre-computed derivatives + of the Wigner matrices U. CPU only. +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeDeidrjCPU, const int& iatom, const int& jnbor) const { + if (iatom >= chunk_size) return; + const int ninside = d_ninside(iatom); + if (jnbor >= ninside) return; + snaKK.compute_deidrj_cpu(iatom, jnbor); +} + +template +KOKKOS_INLINE_FUNCTION +void PairSNAPKokkos::operator() (TagPairSNAPComputeDeidrjCPU, const int& iatom) const { + if (iatom >= chunk_size) return; + const int ninside = d_ninside(iatom); + for (int jnbor = 0; jnbor < ninside; jnbor++) + snaKK.compute_deidrj_cpu(iatom, jnbor); +} + +/* ---------------------------------------------------------------------- + This routine formally accumulates the "chunked" force contributions + into the broader LAMMPS "f" force View. As appropriate it + also accumulates the total energy and the virial. CPU and GPU. ------------------------------------------------------------------------- */ template @@ -1271,17 +1211,15 @@ void PairSNAPKokkos::operator() (TagPairSN const int i = d_ilist[ii + chunk_offset]; - SNAKokkos my_sna = snaKK; - const int ninside = d_ninside(ii); for (int jj = 0; jj < ninside; jj++) { - int j = my_sna.inside(ii,jj); + int j = snaKK.inside(ii,jj); F_FLOAT fij[3]; - fij[0] = my_sna.dedr(ii,jj,0); - fij[1] = my_sna.dedr(ii,jj,1); - fij[2] = my_sna.dedr(ii,jj,2); + fij[0] = snaKK.dedr(ii,jj,0); + fij[1] = snaKK.dedr(ii,jj,1); + fij[2] = snaKK.dedr(ii,jj,2); a_f(i,0) += fij[0]; a_f(i,1) += fij[1]; @@ -1294,8 +1232,8 @@ void PairSNAPKokkos::operator() (TagPairSN if (vflag_either) { v_tally_xyz(ev,i,j, fij[0],fij[1],fij[2], - -my_sna.rij(ii,jj,0),-my_sna.rij(ii,jj,1), - -my_sna.rij(ii,jj,2)); + -snaKK.rij(ii,jj,0),-snaKK.rij(ii,jj,1), + -snaKK.rij(ii,jj,2)); } } @@ -1322,7 +1260,7 @@ void PairSNAPKokkos::operator() (TagPairSN for (int icoeff = 0; icoeff < ncoeff; icoeff++) { const auto idxb = icoeff % idxb_max; const auto idx_chem = icoeff / idxb_max; - evdwl += d_coeffi[icoeff+1]*my_sna.blist(ii,idx_chem,idxb); + evdwl += d_coeffi[icoeff+1]*snaKK.blist(ii,idx_chem,idxb); } // quadratic contributions @@ -1331,12 +1269,12 @@ void PairSNAPKokkos::operator() (TagPairSN for (int icoeff = 0; icoeff < ncoeff; icoeff++) { const auto idxb = icoeff % idxb_max; const auto idx_chem = icoeff / idxb_max; - real_type bveci = my_sna.blist(ii,idx_chem,idxb); + real_type bveci = snaKK.blist(ii,idx_chem,idxb); evdwl += 0.5*d_coeffi[k++]*bveci*bveci; for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { auto jdxb = jcoeff % idxb_max; auto jdx_chem = jcoeff / idxb_max; - auto bvecj = my_sna.blist(ii,jdx_chem,jdxb); + auto bvecj = snaKK.blist(ii,jdx_chem,jdxb); evdwl += d_coeffi[k++]*bveci*bvecj; } } @@ -1411,8 +1349,6 @@ double PairSNAPKokkos::memory_usage() { double bytes = Pair::memory_usage(); bytes += MemKK::memory_usage(d_beta); - if (!host_flag) - bytes += MemKK::memory_usage(d_beta_pack); bytes += MemKK::memory_usage(d_ninside); bytes += MemKK::memory_usage(d_map); bytes += MemKK::memory_usage(d_radelem); diff --git a/src/KOKKOS/region_block_kokkos.cpp b/src/KOKKOS/region_block_kokkos.cpp index 8df33c32db..05ac8eea2a 100644 --- a/src/KOKKOS/region_block_kokkos.cpp +++ b/src/KOKKOS/region_block_kokkos.cpp @@ -13,10 +13,13 @@ ------------------------------------------------------------------------- */ #include "region_block_kokkos.h" + #include "atom_kokkos.h" #include "atom_masks.h" +#include "memory_kokkos.h" using namespace LAMMPS_NS; +using namespace MathSpecialKokkos; /* ---------------------------------------------------------------------- */ @@ -25,135 +28,50 @@ RegBlockKokkos::RegBlockKokkos(LAMMPS *lmp, int narg, char **arg) : RegBlock(lmp, narg, arg) { atomKK = (AtomKokkos*) atom; + memoryKK->create_kokkos(d_contact,6,"region_block:d_contact"); } -/* ---------------------------------------------------------------------- - inside = 1 if x,y,z is inside or on surface - inside = 0 if x,y,z is outside and not on surface -------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- */ template -KOKKOS_INLINE_FUNCTION -int RegBlockKokkos::k_inside(double x, double y, double z) const +RegBlockKokkos::~RegBlockKokkos() { - if (x >= xlo && x <= xhi && y >= ylo && y <= yhi && z >= zlo && z <= zhi) - return 1; - return 0; + if (copymode) return; + memoryKK->destroy_kokkos(d_contact); } +/* ---------------------------------------------------------------------- */ + template void RegBlockKokkos::match_all_kokkos(int groupbit_in, DAT::tdual_int_1d k_match_in) { groupbit = groupbit_in; d_match = k_match_in.template view(); - auto execution_space = ExecutionSpaceFromDevice::space; atomKK->sync(execution_space, X_MASK | MASK_MASK); - - x = atomKK->k_x.view(); - mask = atomKK->k_mask.view(); + d_x = atomKK->k_x.view(); + d_mask = atomKK->k_mask.view(); int nlocal = atom->nlocal; copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); copymode = 0; - k_match_in.template modify(); } +/* ---------------------------------------------------------------------- */ + template KOKKOS_INLINE_FUNCTION void RegBlockKokkos::operator()(TagRegBlockMatchAll, const int &i) const { - if (mask[i] & groupbit) { - double x_tmp = x(i,0); - double y_tmp = x(i,1); - double z_tmp = x(i,2); - d_match[i] = match(x_tmp,y_tmp,z_tmp); + if (d_mask[i] & groupbit) { + double x_tmp = d_x(i,0); + double y_tmp = d_x(i,1); + double z_tmp = d_x(i,2); + d_match[i] = match_kokkos(x_tmp,y_tmp,z_tmp); } } -/* ---------------------------------------------------------------------- - determine if point x,y,z is a match to region volume - XOR computes 0 if 2 args are the same, 1 if different - note that k_inside() returns 1 for points on surface of region - thus point on surface of exterior region will not match - if region has variable shape, invoke shape_update() once per timestep - if region is dynamic, apply inverse transform to x,y,z - unmove first, then unrotate, so don't have to change rotation point - caller is responsible for wrapping this call with - modify->clearstep_compute() and modify->addstep_compute() if needed -------------------------------------------------------------------------- */ - -template -KOKKOS_INLINE_FUNCTION -int RegBlockKokkos::match(double x, double y, double z) const -{ - if (dynamic) inverse_transform(x,y,z); - return !(k_inside(x,y,z) ^ interior); -} - -/* ---------------------------------------------------------------------- - transform a point x,y,z in moved space back to region space - undisplace first, then unrotate (around original P) -------------------------------------------------------------------------- */ - -template -KOKKOS_INLINE_FUNCTION -void RegBlockKokkos::inverse_transform(double &x, double &y, double &z) const -{ - if (moveflag) { - x -= dx; - y -= dy; - z -= dz; - } - if (rotateflag) rotate(x,y,z,-theta); -} - -/* ---------------------------------------------------------------------- - rotate x,y,z by angle via right-hand rule around point and runit normal - sign of angle determines whether rotating forward/backward in time - return updated x,y,z - R = vector axis of rotation - P = point = point to rotate around - R0 = runit = unit vector for R - X0 = x,y,z = initial coord of atom - D = X0 - P = vector from P to X0 - C = (D dot R0) R0 = projection of D onto R, i.e. Dparallel - A = D - C = vector from R line to X0, i.e. Dperp - B = R0 cross A = vector perp to A in plane of rotation, same len as A - A,B define plane of circular rotation around R line - new x,y,z = P + C + A cos(angle) + B sin(angle) -------------------------------------------------------------------------- */ - -template -KOKKOS_INLINE_FUNCTION -void RegBlockKokkos::rotate(double &x, double &y, double &z, double angle) const -{ - double a[3],b[3],c[3],d[3],disp[3]; - - double sine = sin(angle); - double cosine = cos(angle); - d[0] = x - point[0]; - d[1] = y - point[1]; - d[2] = z - point[2]; - double x0dotr = d[0]*runit[0] + d[1]*runit[1] + d[2]*runit[2]; - c[0] = x0dotr * runit[0]; - c[1] = x0dotr * runit[1]; - c[2] = x0dotr * runit[2]; - a[0] = d[0] - c[0]; - a[1] = d[1] - c[1]; - a[2] = d[2] - c[2]; - b[0] = runit[1]*a[2] - runit[2]*a[1]; - b[1] = runit[2]*a[0] - runit[0]*a[2]; - b[2] = runit[0]*a[1] - runit[1]*a[0]; - disp[0] = a[0]*cosine + b[0]*sine; - disp[1] = a[1]*cosine + b[1]*sine; - disp[2] = a[2]*cosine + b[2]*sine; - x = point[0] + c[0] + disp[0]; - y = point[1] + c[1] + disp[1]; - z = point[2] + c[2] + disp[2]; -} - namespace LAMMPS_NS { template class RegBlockKokkos; #ifdef LMP_KOKKOS_GPU diff --git a/src/KOKKOS/region_block_kokkos.h b/src/KOKKOS/region_block_kokkos.h index 017e4e5ee4..052a6a4bcf 100644 --- a/src/KOKKOS/region_block_kokkos.h +++ b/src/KOKKOS/region_block_kokkos.h @@ -24,15 +24,19 @@ RegionStyle(block/kk/host,RegBlockKokkos); #define LMP_REGION_BLOCK_KOKKOS_H #include "region_block.h" + #include "kokkos_base.h" #include "kokkos_type.h" +#include "math_special_kokkos.h" namespace LAMMPS_NS { +using namespace MathSpecialKokkos; + struct TagRegBlockMatchAll{}; template -class RegBlockKokkos : public RegBlock, public KokkosBase { +class RegBlockKokkos : public RegBlock, public KokkosBase { friend class FixPour; public: @@ -40,27 +44,379 @@ class RegBlockKokkos : public RegBlock, public KokkosBase { typedef ArrayTypes AT; RegBlockKokkos(class LAMMPS *, int, char **); + ~RegBlockKokkos() override; void match_all_kokkos(int, DAT::tdual_int_1d) override; KOKKOS_INLINE_FUNCTION void operator()(TagRegBlockMatchAll, const int&) const; + KOKKOS_INLINE_FUNCTION + int match_kokkos(double x, double y, double z) const + { + if (dynamic) inverse_transform(x,y,z); + if (openflag) return 1; + return !(k_inside(x,y,z) ^ interior); + } + + KOKKOS_INLINE_FUNCTION + int surface_kokkos(double x, double y, double z, double cutoff) + { + int ncontact; + double xs, ys, zs; + double xnear[3], xorig[3]; + + if (dynamic) { + xorig[0] = x; xorig[1] = y; xorig[2] = z; + inverse_transform(x, y, z); + } + + xnear[0] = x; xnear[1] = y; xnear[2] = z; + + if (!openflag) { + if (interior) + ncontact = surface_interior_kokkos(xnear, cutoff); + else + ncontact = surface_exterior_kokkos(xnear, cutoff); + } else { + // one of surface_int/ext() will return 0 + // so no need to worry about offset of contact indices + ncontact = surface_exterior_kokkos(xnear, cutoff) + surface_interior_kokkos(xnear, cutoff); + } + + if (rotateflag && ncontact) { + for (int i = 0; i < ncontact; i++) { + xs = xnear[0] - d_contact[i].delx; + ys = xnear[1] - d_contact[i].dely; + zs = xnear[2] - d_contact[i].delz; + forward_transform(xs, ys, zs); + d_contact[i].delx = xorig[0] - xs; + d_contact[i].dely = xorig[1] - ys; + d_contact[i].delz = xorig[2] - zs; + } + } + + return ncontact; + } + + Kokkos::View d_contact; + private: int groupbit; typename AT::t_int_1d d_match; - - typename AT::t_x_array_randomread x; - typename AT::t_int_1d_randomread mask; + typename AT::t_x_array_randomread d_x; + typename AT::t_int_1d_randomread d_mask; KOKKOS_INLINE_FUNCTION - int k_inside(double, double, double) const; + int surface_interior_kokkos(double *x, double cutoff) + { + double delta; + + // x is exterior to block + + if (x[0] < xlo || x[0] > xhi || x[1] < ylo || x[1] > yhi || x[2] < zlo || x[2] > zhi) return 0; + + // x is interior to block or on its surface + + int n = 0; + + delta = x[0] - xlo; + if (delta < cutoff && !open_faces[0]) { + d_contact[n].r = delta; + d_contact[n].delx = delta; + d_contact[n].dely = d_contact[n].delz = 0.0; + d_contact[n].radius = 0; + d_contact[n].iwall = 0; + n++; + } + delta = xhi - x[0]; + if (delta < cutoff && !open_faces[1]) { + d_contact[n].r = delta; + d_contact[n].delx = -delta; + d_contact[n].dely = d_contact[n].delz = 0.0; + d_contact[n].radius = 0; + d_contact[n].iwall = 1; + n++; + } + + delta = x[1] - ylo; + if (delta < cutoff && !open_faces[2]) { + d_contact[n].r = delta; + d_contact[n].dely = delta; + d_contact[n].delx = d_contact[n].delz = 0.0; + d_contact[n].radius = 0; + d_contact[n].iwall = 2; + n++; + } + delta = yhi - x[1]; + if (delta < cutoff && !open_faces[3]) { + d_contact[n].r = delta; + d_contact[n].dely = -delta; + d_contact[n].delx = d_contact[n].delz = 0.0; + d_contact[n].radius = 0; + d_contact[n].iwall = 3; + n++; + } + + delta = x[2] - zlo; + if (delta < cutoff && !open_faces[4]) { + d_contact[n].r = delta; + d_contact[n].delz = delta; + d_contact[n].delx = d_contact[n].dely = 0.0; + d_contact[n].radius = 0; + d_contact[n].iwall = 4; + n++; + } + delta = zhi - x[2]; + if (delta < cutoff && !open_faces[5]) { + d_contact[n].r = delta; + d_contact[n].delz = -delta; + d_contact[n].delx = d_contact[n].dely = 0.0; + d_contact[n].radius = 0; + d_contact[n].iwall = 5; + n++; + } + + return n; + } + KOKKOS_INLINE_FUNCTION - int match(double, double, double) const; + int surface_exterior_kokkos(double *x, double cutoff) + { + double xp, yp, zp; + double xc, yc, zc, dist, mindist; + + // x is far enough from block that there is no contact + // x is interior to block + + if (x[0] <= xlo - cutoff || x[0] >= xhi + cutoff || x[1] <= ylo - cutoff || + x[1] >= yhi + cutoff || x[2] <= zlo - cutoff || x[2] >= zhi + cutoff) + return 0; + if (x[0] > xlo && x[0] < xhi && x[1] > ylo && x[1] < yhi && x[2] > zlo && x[2] < zhi) return 0; + + // x is exterior to block or on its surface + // xp,yp,zp = point on surface of block that x is closest to + // could be edge or corner pt of block + // do not add contact point if r >= cutoff + + if (!openflag) { + if (x[0] < xlo) + xp = xlo; + else if (x[0] > xhi) + xp = xhi; + else + xp = x[0]; + if (x[1] < ylo) + yp = ylo; + else if (x[1] > yhi) + yp = yhi; + else + yp = x[1]; + if (x[2] < zlo) + zp = zlo; + else if (x[2] > zhi) + zp = zhi; + else + zp = x[2]; + } else { + mindist = MAXDOUBLEINT; + for (int i = 0; i < 6; i++) { + if (open_faces[i]) continue; + dist = find_closest_point(i, x, xc, yc, zc); + if (dist < mindist) { + xp = xc; + yp = yc; + zp = zc; + mindist = dist; + } + } + } + + add_contact(0, x, xp, yp, zp); + d_contact[0].iwall = 0; + if (d_contact[0].r < cutoff) return 1; + return 0; + } + KOKKOS_INLINE_FUNCTION - void inverse_transform(double &, double &, double &) const; + void add_contact(int n, double *x, double xp, double yp, double zp) + { + double delx = x[0] - xp; + double dely = x[1] - yp; + double delz = x[2] - zp; + d_contact[n].r = sqrt(delx * delx + dely * dely + delz * delz); + d_contact[n].radius = 0; + d_contact[n].delx = delx; + d_contact[n].dely = dely; + d_contact[n].delz = delz; + } + KOKKOS_INLINE_FUNCTION - void rotate(double &, double &, double &, double) const; + int k_inside(double x, double y, double z) const + { + if (x >= xlo && x <= xhi && y >= ylo && y <= yhi && z >= zlo && z <= zhi) + return 1; + return 0; + } + + KOKKOS_INLINE_FUNCTION + void forward_transform(double &x, double &y, double &z) const + { + if (rotateflag) rotate(x, y, z, theta); + if (moveflag) { + x += dx; + y += dy; + z += dz; + } + } + + KOKKOS_INLINE_FUNCTION + void inverse_transform(double &x, double &y, double &z) const + { + if (moveflag) { + x -= dx; + y -= dy; + z -= dz; + } + if (rotateflag) rotate(x,y,z,-theta); + } + + KOKKOS_INLINE_FUNCTION + void rotate(double &x, double &y, double &z, double angle) const + { + double a[3],b[3],c[3],d[3],disp[3]; + + double sine = sin(angle); + double cosine = cos(angle); + d[0] = x - point[0]; + d[1] = y - point[1]; + d[2] = z - point[2]; + double x0dotr = d[0]*runit[0] + d[1]*runit[1] + d[2]*runit[2]; + c[0] = x0dotr * runit[0]; + c[1] = x0dotr * runit[1]; + c[2] = x0dotr * runit[2]; + a[0] = d[0] - c[0]; + a[1] = d[1] - c[1]; + a[2] = d[2] - c[2]; + b[0] = runit[1]*a[2] - runit[2]*a[1]; + b[1] = runit[2]*a[0] - runit[0]*a[2]; + b[2] = runit[0]*a[1] - runit[1]*a[0]; + disp[0] = a[0]*cosine + b[0]*sine; + disp[1] = a[1]*cosine + b[1]*sine; + disp[2] = a[2]*cosine + b[2]*sine; + x = point[0] + c[0] + disp[0]; + y = point[1] + c[1] + disp[1]; + z = point[2] + c[2] + disp[2]; + } + + KOKKOS_INLINE_FUNCTION + void point_on_line_segment(double *a, double *b, double *c, double *d) + { + double ba[3], ca[3]; + + sub3(b, a, ba); + sub3(c, a, ca); + double t = dot3(ca, ba) / dot3(ba, ba); + if (t <= 0.0) { + d[0] = a[0]; + d[1] = a[1]; + d[2] = a[2]; + } else if (t >= 1.0) { + d[0] = b[0]; + d[1] = b[1]; + d[2] = b[2]; + } else { + d[0] = a[0] + t * ba[0]; + d[1] = a[1] + t * ba[1]; + d[2] = a[2] + t * ba[2]; + } + } + + KOKKOS_INLINE_FUNCTION + double inside_face(double *xproj, int iface) + { + if (iface < 2) { + if (xproj[1] > 0 && (xproj[1] < yhi - ylo) && xproj[2] > 0 && (xproj[2] < zhi - zlo)) return 1; + } else if (iface < 4) { + if (xproj[0] > 0 && (xproj[0] < (xhi - xlo)) && xproj[2] > 0 && (xproj[2] < (zhi - zlo))) + return 1; + } else { + if (xproj[0] > 0 && xproj[0] < (xhi - xlo) && xproj[1] > 0 && xproj[1] < (yhi - ylo)) return 1; + } + + return 0; + } + + KOKKOS_INLINE_FUNCTION + double find_closest_point(int i, double *x, double &xc, double &yc, double &zc) + { + double dot, d2, d2min; + double xr[3], xproj[3], p[3]; + + xr[0] = x[0] - corners[i][0][0]; + xr[1] = x[1] - corners[i][0][1]; + xr[2] = x[2] - corners[i][0][2]; + dot = face[i][0] * xr[0] + face[i][1] * xr[1] + face[i][2] * xr[2]; + xproj[0] = xr[0] - dot * face[i][0]; + xproj[1] = xr[1] - dot * face[i][1]; + xproj[2] = xr[2] - dot * face[i][2]; + + d2min = MAXDOUBLEINT; + + // check if point projects inside of face + + if (inside_face(xproj, i)) { + d2 = d2min = dot * dot; + xc = xproj[0] + corners[i][0][0]; + yc = xproj[1] + corners[i][0][1]; + zc = xproj[2] + corners[i][0][2]; + + // check each edge + + } else { + point_on_line_segment(corners[i][0], corners[i][1], x, p); + d2 = (p[0] - x[0]) * (p[0] - x[0]) + (p[1] - x[1]) * (p[1] - x[1]) + + (p[2] - x[2]) * (p[2] - x[2]); + if (d2 < d2min) { + d2min = d2; + xc = p[0]; + yc = p[1]; + zc = p[2]; + } + + point_on_line_segment(corners[i][1], corners[i][2], x, p); + d2 = (p[0] - x[0]) * (p[0] - x[0]) + (p[1] - x[1]) * (p[1] - x[1]) + + (p[2] - x[2]) * (p[2] - x[2]); + if (d2 < d2min) { + d2min = d2; + xc = p[0]; + yc = p[1]; + zc = p[2]; + } + + point_on_line_segment(corners[i][2], corners[i][3], x, p); + d2 = (p[0] - x[0]) * (p[0] - x[0]) + (p[1] - x[1]) * (p[1] - x[1]) + + (p[2] - x[2]) * (p[2] - x[2]); + if (d2 < d2min) { + d2min = d2; + xc = p[0]; + yc = p[1]; + zc = p[2]; + } + + point_on_line_segment(corners[i][3], corners[i][0], x, p); + d2 = (p[0] - x[0]) * (p[0] - x[0]) + (p[1] - x[1]) * (p[1] - x[1]) + + (p[2] - x[2]) * (p[2] - x[2]); + if (d2 < d2min) { + d2min = d2; + xc = p[0]; + yc = p[1]; + zc = p[2]; + } + } + + return d2min; + } }; diff --git a/src/KOKKOS/region_sphere_kokkos.cpp b/src/KOKKOS/region_sphere_kokkos.cpp new file mode 100644 index 0000000000..07275ee69e --- /dev/null +++ b/src/KOKKOS/region_sphere_kokkos.cpp @@ -0,0 +1,86 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Mitch Murphy (alphataubio at gmail) +------------------------------------------------------------------------- */ + +#include "region_sphere_kokkos.h" + +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "memory_kokkos.h" + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +template +RegSphereKokkos::RegSphereKokkos(LAMMPS *lmp, int narg, char **arg) + : RegSphere(lmp, narg, arg) +{ + atomKK = (AtomKokkos*) atom; + memoryKK->create_kokkos(d_contact,1,"region_sphere:d_contact"); +} + +/* ---------------------------------------------------------------------- */ + +template +RegSphereKokkos::~RegSphereKokkos() +{ + if (copymode) return; + memoryKK->destroy_kokkos(d_contact); +} + +/* ---------------------------------------------------------------------- */ + +template +void RegSphereKokkos::match_all_kokkos(int groupbit_in, DAT::tdual_int_1d k_match_in) +{ + groupbit = groupbit_in; + d_match = k_match_in.template view(); + auto execution_space = ExecutionSpaceFromDevice::space; + atomKK->sync(execution_space, X_MASK | MASK_MASK); + d_x = atomKK->k_x.view(); + d_mask = atomKK->k_mask.view(); + int nlocal = atom->nlocal; + + copymode = 1; + Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); + copymode = 0; + k_match_in.template modify(); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void RegSphereKokkos::operator()(TagRegSphereMatchAll, const int &i) const { + if (d_mask[i] & groupbit) { + double x_tmp = d_x(i,0); + double y_tmp = d_x(i,1); + double z_tmp = d_x(i,2); + d_match[i] = match_kokkos(x_tmp,y_tmp,z_tmp); + } +} + +/* ---------------------------------------------------------------------- */ + +namespace LAMMPS_NS { +template class RegSphereKokkos; +#ifdef LMP_KOKKOS_GPU +template class RegSphereKokkos; +#endif +} + diff --git a/src/KOKKOS/region_sphere_kokkos.h b/src/KOKKOS/region_sphere_kokkos.h new file mode 100644 index 0000000000..08951138c3 --- /dev/null +++ b/src/KOKKOS/region_sphere_kokkos.h @@ -0,0 +1,233 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef REGION_CLASS +// clang-format off +RegionStyle(sphere/kk,RegSphereKokkos); +RegionStyle(sphere/kk/device,RegSphereKokkos); +RegionStyle(sphere/kk/host,RegSphereKokkos); +// clang-format on +#else + +// clang-format off +#ifndef LMP_REGION_SPHERE_KOKKOS_H +#define LMP_REGION_SPHERE_KOKKOS_H + +#include "region_sphere.h" + +#include "kokkos_base.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +struct TagRegSphereMatchAll{}; + +template +class RegSphereKokkos : public RegSphere, public KokkosBase { + friend class FixPour; + + public: + typedef DeviceType device_type; + typedef ArrayTypes AT; + + RegSphereKokkos(class LAMMPS *, int, char **); + ~RegSphereKokkos() override; + + void match_all_kokkos(int, DAT::tdual_int_1d) override; + + KOKKOS_INLINE_FUNCTION + void operator()(TagRegSphereMatchAll, const int&) const; + + KOKKOS_INLINE_FUNCTION + int match_kokkos(double x, double y, double z) const + { + if (dynamic) inverse_transform(x,y,z); + if (openflag) return 1; + return !(k_inside(x,y,z) ^ interior); + } + + KOKKOS_INLINE_FUNCTION + int surface_kokkos(double x, double y, double z, double cutoff) + { + int ncontact; + double xs, ys, zs; + double xnear[3], xorig[3]; + + if (dynamic) { + xorig[0] = x; xorig[1] = y; xorig[2] = z; + inverse_transform(x, y, z); + } + + xnear[0] = x; xnear[1] = y; xnear[2] = z; + + if (!openflag) { + if (interior) ncontact = surface_interior_kokkos(xnear, cutoff); + else + ncontact = surface_exterior_kokkos(xnear, cutoff); + } else { + // one of surface_int/ext() will return 0 + // so no need to worry about offset of contact indices + ncontact = surface_exterior_kokkos(xnear, cutoff) + surface_interior_kokkos(xnear, cutoff); + } + + if (rotateflag && ncontact) { + for (int i = 0; i < ncontact; i++) { + xs = xnear[0] - d_contact[i].delx; + ys = xnear[1] - d_contact[i].dely; + zs = xnear[2] - d_contact[i].delz; + forward_transform(xs, ys, zs); + d_contact[i].delx = xorig[0] - xs; + d_contact[i].dely = xorig[1] - ys; + d_contact[i].delz = xorig[2] - zs; + } + } + + return ncontact; + } + + Kokkos::View d_contact; + + private: + int groupbit; + typename AT::t_int_1d d_match; + typename AT::t_x_array_randomread d_x; + typename AT::t_int_1d_randomread d_mask; + + KOKKOS_INLINE_FUNCTION + int surface_interior_kokkos(double *x, double cutoff) + { + double delx = x[0] - xc; + double dely = x[1] - yc; + double delz = x[2] - zc; + double r = sqrt(delx * delx + dely * dely + delz * delz); + if (r > radius || r == 0.0) return 0; + + double delta = radius - r; + if (delta < cutoff) { + d_contact[0].r = delta; + d_contact[0].delx = delx * (1.0 - radius / r); + d_contact[0].dely = dely * (1.0 - radius / r); + d_contact[0].delz = delz * (1.0 - radius / r); + d_contact[0].radius = -radius; + d_contact[0].iwall = 0; + d_contact[0].varflag = 1; + return 1; + } + return 0; + } + + KOKKOS_INLINE_FUNCTION + int surface_exterior_kokkos(double *x, double cutoff) + { + double delx = x[0] - xc; + double dely = x[1] - yc; + double delz = x[2] - zc; + double r = sqrt(delx * delx + dely * dely + delz * delz); + if (r < radius) return 0; + + double delta = r - radius; + if (delta < cutoff) { + d_contact[0].r = delta; + d_contact[0].delx = delx * (1.0 - radius / r); + d_contact[0].dely = dely * (1.0 - radius / r); + d_contact[0].delz = delz * (1.0 - radius / r); + d_contact[0].radius = radius; + d_contact[0].iwall = 0; + d_contact[0].varflag = 1; + return 1; + } + return 0; + } + + KOKKOS_INLINE_FUNCTION + void add_contact(int n, double *x, double xp, double yp, double zp) + { + double delx = x[0] - xp; + double dely = x[1] - yp; + double delz = x[2] - zp; + d_contact[n].r = sqrt(delx * delx + dely * dely + delz * delz); + d_contact[n].radius = 0; + d_contact[n].delx = delx; + d_contact[n].dely = dely; + d_contact[n].delz = delz; + } + + KOKKOS_INLINE_FUNCTION + int k_inside(double x, double y, double z) const + { + const double delx = x - xc; + const double dely = y - yc; + const double delz = z - zc; + const double r = sqrt(delx * delx + dely * dely + delz * delz); + + if (r <= radius) return 1; + return 0; + } + + KOKKOS_INLINE_FUNCTION + void forward_transform(double &x, double &y, double &z) const + { + if (rotateflag) rotate(x, y, z, theta); + if (moveflag) { + x += dx; + y += dy; + z += dz; + } + } + + KOKKOS_INLINE_FUNCTION + void inverse_transform(double &x, double &y, double &z) const + { + if (moveflag) { + x -= dx; + y -= dy; + z -= dz; + } + if (rotateflag) rotate(x,y,z,-theta); + } + + KOKKOS_INLINE_FUNCTION + void rotate(double &x, double &y, double &z, double angle) const + { + double a[3],b[3],c[3],d[3],disp[3]; + + double sine = sin(angle); + double cosine = cos(angle); + d[0] = x - point[0]; + d[1] = y - point[1]; + d[2] = z - point[2]; + double x0dotr = d[0]*runit[0] + d[1]*runit[1] + d[2]*runit[2]; + c[0] = x0dotr * runit[0]; + c[1] = x0dotr * runit[1]; + c[2] = x0dotr * runit[2]; + a[0] = d[0] - c[0]; + a[1] = d[1] - c[1]; + a[2] = d[2] - c[2]; + b[0] = runit[1]*a[2] - runit[2]*a[1]; + b[1] = runit[2]*a[0] - runit[0]*a[2]; + b[2] = runit[0]*a[1] - runit[1]*a[0]; + disp[0] = a[0]*cosine + b[0]*sine; + disp[1] = a[1]*cosine + b[1]*sine; + disp[2] = a[2]*cosine + b[2]*sine; + x = point[0] + c[0] + disp[0]; + y = point[1] + c[1] + disp[1]; + z = point[2] + c[2] + disp[2]; + } + +}; + +} + +#endif +#endif + diff --git a/src/KOKKOS/sna_kokkos.h b/src/KOKKOS/sna_kokkos.h index 78a3dfa669..a438ccd25e 100644 --- a/src/KOKKOS/sna_kokkos.h +++ b/src/KOKKOS/sna_kokkos.h @@ -134,6 +134,8 @@ class SNAKokkos { static constexpr int vector_length = vector_length_; using KKDeviceType = typename KKDevice::value; + static constexpr LAMMPS_NS::ExecutionSpace execution_space = ExecutionSpaceFromDevice::space; + static constexpr int host_flag = (execution_space == LAMMPS_NS::Host); typedef Kokkos::View t_sna_1i; typedef Kokkos::View t_sna_1d; @@ -141,6 +143,7 @@ class SNAKokkos { typedef Kokkos::View t_sna_2i; typedef Kokkos::View t_sna_2d; typedef Kokkos::View t_sna_2d_ll; + typedef Kokkos::View t_sna_2d_lr; typedef Kokkos::View t_sna_3d; typedef Kokkos::View t_sna_3d_ll; typedef Kokkos::View t_sna_4d; @@ -156,7 +159,7 @@ class SNAKokkos { typedef Kokkos::View t_sna_3c; typedef Kokkos::View t_sna_3c_ll; typedef Kokkos::View t_sna_4c; - typedef Kokkos::View t_sna_4c3_ll; + typedef Kokkos::View t_sna_4c3; typedef Kokkos::View t_sna_4c_ll; typedef Kokkos::View t_sna_3c3; typedef Kokkos::View t_sna_5c; @@ -168,7 +171,8 @@ class SNAKokkos { SNAKokkos(const SNAKokkos& sna, const typename Kokkos::TeamPolicy::member_type& team); inline - SNAKokkos(real_type, int, real_type, int, int, int, int, int, int, int); + //SNAKokkos(real_type, int, real_type, int, int, int, int, int, int, int); + SNAKokkos(const PairSNAPKokkos&); KOKKOS_INLINE_FUNCTION ~SNAKokkos(); @@ -182,88 +186,87 @@ class SNAKokkos { double memory_usage(); int ncoeff; - int host_flag; // functions for bispectrum coefficients, GPU only KOKKOS_INLINE_FUNCTION - void compute_cayley_klein(const int&, const int&, const int&); + void compute_cayley_klein(const int&, const int&) const; KOKKOS_INLINE_FUNCTION - void pre_ui(const int&, const int&, const int&, const int&); // ForceSNAP + void pre_ui(const int&, const int&, const int&) const; // ForceSNAP // version of the code with parallelism over j_bend KOKKOS_INLINE_FUNCTION - void compute_ui_small(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int, const int); // ForceSNAP + void compute_ui_small(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int, const int) const; // ForceSNAP // version of the code without parallelism over j_bend KOKKOS_INLINE_FUNCTION - void compute_ui_large(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int); // ForceSNAP + void compute_ui_large(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int) const; // ForceSNAP + // desymmetrize ulisttot KOKKOS_INLINE_FUNCTION - void compute_zi(const int&, const int&, const int&); // ForceSNAP + void transform_ui(const int&, const int&) const; + + template KOKKOS_INLINE_FUNCTION + void compute_zi(const int&, const int&) const; // ForceSNAP + template KOKKOS_INLINE_FUNCTION + void compute_yi(const int&, const int&) const; // ForceSNAP + template KOKKOS_INLINE_FUNCTION + void compute_yi_with_zlist(const int&, const int&) const; // ForceSNAP + template KOKKOS_INLINE_FUNCTION + void compute_bi(const int&, const int&) const; // ForceSNAP KOKKOS_INLINE_FUNCTION - void compute_yi(int,int,int, - const Kokkos::View &beta_pack); // ForceSNAP - KOKKOS_INLINE_FUNCTION - void compute_yi_with_zlist(int,int,int, - const Kokkos::View &beta_pack); // ForceSNAP - KOKKOS_INLINE_FUNCTION - void compute_bi(const int&, const int&, const int&); // ForceSNAP + void compute_beta_linear(const int&, const int&, const int&) const; + template KOKKOS_INLINE_FUNCTION + void compute_beta_quadratic(const int&, const int&, const int&) const; // functions for derivatives, GPU only // version of the code with parallelism over j_bend template KOKKOS_INLINE_FUNCTION - void compute_fused_deidrj_small(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int, const int); //ForceSNAP + void compute_fused_deidrj_small(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int, const int) const; //ForceSNAP // version of the code without parallelism over j_bend template KOKKOS_INLINE_FUNCTION - void compute_fused_deidrj_large(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int); //ForceSNAP + void compute_fused_deidrj_large(const typename Kokkos::TeamPolicy::member_type& team, const int, const int, const int) const; //ForceSNAP // core "evaluation" functions that get plugged into "compute" functions // plugged into compute_ui_small, compute_ui_large KOKKOS_FORCEINLINE_FUNCTION void evaluate_ui_jbend(const WignerWrapper&, const complex&, const complex&, const real_type&, const int&, - const int&, const int&, const int&); + const int&, const int&) const; // plugged into compute_zi, compute_yi KOKKOS_FORCEINLINE_FUNCTION complex evaluate_zi(const int&, const int&, const int&, const int&, const int&, const int&, const int&, const int&, const int&, - const int&, const int&, const int&, const int&, const real_type*); - // plugged into compute_yi, compute_yi_with_zlist + const int&, const int&, const int&, const real_type*) const; + // plugged into compute_bi KOKKOS_FORCEINLINE_FUNCTION - real_type evaluate_beta_scaled(const int&, const int&, const int&, const int&, const int&, const int&, const int&, const int&, - const Kokkos::View &); + real_type evaluate_bi(const int&, const int&, const int&, const int&, + const int&, const int&, const int&) const; + // plugged into compute_yi, compute_yi_with_zlist + template KOKKOS_FORCEINLINE_FUNCTION + real_type evaluate_beta_scaled(const int&, const int&, const int&, const int&, const int&, const int&, const int&) const; // plugged into compute_fused_deidrj_small, compute_fused_deidrj_large KOKKOS_FORCEINLINE_FUNCTION real_type evaluate_duidrj_jbend(const WignerWrapper&, const complex&, const complex&, const real_type&, const WignerWrapper&, const complex&, const complex&, const real_type&, - const int&, const int&, const int&, const int&); + const int&, const int&, const int&) const; // functions for bispectrum coefficients, CPU only - KOKKOS_INLINE_FUNCTION - void pre_ui_cpu(const typename Kokkos::TeamPolicy::member_type& team,const int&,const int&); // ForceSNAP - KOKKOS_INLINE_FUNCTION - void compute_ui_cpu(const typename Kokkos::TeamPolicy::member_type& team, int, int); // ForceSNAP - KOKKOS_INLINE_FUNCTION - void compute_zi_cpu(const int&); // ForceSNAP - KOKKOS_INLINE_FUNCTION - void compute_yi_cpu(int, - const Kokkos::View &beta); // ForceSNAP - KOKKOS_INLINE_FUNCTION - void compute_bi_cpu(const typename Kokkos::TeamPolicy::member_type& team, int); // ForceSNAP + template KOKKOS_INLINE_FUNCTION + void compute_ui_cpu(const int&, const int&) const; // ForceSNAP // functions for derivatives, CPU only KOKKOS_INLINE_FUNCTION - void compute_duidrj_cpu(const typename Kokkos::TeamPolicy::member_type& team, int, int); //ForceSNAP + void compute_duidrj_cpu(const int&, const int&) const; //ForceSNAP KOKKOS_INLINE_FUNCTION - void compute_deidrj_cpu(const typename Kokkos::TeamPolicy::member_type& team, int, int); // ForceSNAP + void compute_deidrj_cpu(const int&, const int&) const; // ForceSNAP KOKKOS_INLINE_FUNCTION - real_type compute_sfac(real_type, real_type, real_type, real_type); // add_uarraytot, compute_duarray + real_type compute_sfac(real_type, real_type, real_type, real_type) const; // add_uarraytot, compute_duarray KOKKOS_INLINE_FUNCTION - real_type compute_dsfac(real_type, real_type, real_type, real_type); // compute_duarray + real_type compute_dsfac(real_type, real_type, real_type, real_type) const; // compute_duarray KOKKOS_INLINE_FUNCTION - void compute_s_dsfac(const real_type, const real_type, const real_type, const real_type, real_type&, real_type&); // compute_cayley_klein + void compute_s_dsfac(const real_type, const real_type, const real_type, const real_type, real_type&, real_type&) const; // compute_cayley_klein #ifdef TIMING_INFO double* timers; @@ -283,37 +286,41 @@ class SNAKokkos { t_sna_2d dinnerij; t_sna_2i element; t_sna_3d dedr; - int natom, nmax; + int natom, natom_pad, nmax; void grow_rij(int, int); int twojmax, diagonalstyle; + // Input beta coefficients; aliases the object in PairSnapKokkos + t_sna_2d_lr d_coeffelem; + + // Beta for all atoms in list; aliases the object in PairSnapKokkos + // for qSNAP the quadratic terms get accumulated into it + // in compute_bi + t_sna_2d d_beta; + + // Structures for both the CPU, GPU backend + t_sna_3d ulisttot_re; + t_sna_3d ulisttot_im; + t_sna_3c ulisttot; // un-folded ulisttot + + t_sna_3c zlist; t_sna_3d blist; - t_sna_3c_ll ulisttot; - t_sna_3c_ll ulisttot_full; // un-folded ulisttot, cpu only - t_sna_3c_ll zlist; - t_sna_3c_ll ulist; - t_sna_3c_ll ylist; + t_sna_3d ylist_re; + t_sna_3d ylist_im; - // derivatives of data - t_sna_4c3_ll dulist; + // Structures for the CPU backend only + t_sna_3c ulist_cpu; + t_sna_4c3 dulist_cpu; // Modified structures for GPU backend - t_sna_3c_ll a_pack; // Cayley-Klein `a` - t_sna_3c_ll b_pack; // `b` - t_sna_4c_ll da_pack; // `da` - t_sna_4c_ll db_pack; // `db` - t_sna_4d_ll sfac_pack; // sfac, dsfac_{x,y,z} - - t_sna_4d_ll ulisttot_re_pack; // split real, - t_sna_4d_ll ulisttot_im_pack; // imag, AoSoA, flattened - t_sna_4c_ll ulisttot_pack; // AoSoA layout - t_sna_4c_ll zlist_pack; // AoSoA layout - t_sna_4d_ll blist_pack; - t_sna_4d_ll ylist_pack_re; // split real, - t_sna_4d_ll ylist_pack_im; // imag AoSoA layout + t_sna_2c a_gpu; // Cayley-Klein `a` + t_sna_2c b_gpu; // `b` + t_sna_3c da_gpu; // `da` + t_sna_3c db_gpu; // `db` + t_sna_3d sfac_gpu; // sfac, dsfac_{x,y,z} int idxcg_max, idxu_max, idxu_half_max, idxu_cache_max, idxz_max, idxb_max; @@ -363,25 +370,11 @@ class SNAKokkos { inline void init_rootpqarray(); // init() - KOKKOS_INLINE_FUNCTION - void add_uarraytot(const typename Kokkos::TeamPolicy::member_type& team, int, int, const real_type&, const real_type&, const real_type&, const real_type&, const real_type&, int); // compute_ui - - KOKKOS_INLINE_FUNCTION - void compute_uarray_cpu(const typename Kokkos::TeamPolicy::member_type& team, int, int, - const real_type&, const real_type&, const real_type&, - const real_type&, const real_type&); // compute_ui_cpu - - inline double deltacg(int, int, int); // init_clebsch_gordan inline int compute_ncoeff(); // SNAKokkos() - KOKKOS_INLINE_FUNCTION - void compute_duarray_cpu(const typename Kokkos::TeamPolicy::member_type& team, int, int, - const real_type&, const real_type&, const real_type&, // compute_duidrj_cpu - const real_type&, const real_type&, const real_type&, const real_type&, const real_type&, - const real_type&, const real_type&); // Sets the style for the switching function // 0 = none @@ -401,6 +394,9 @@ class SNAKokkos { real_type wself; int wselfall_flag; + // quadratic flag + int quadratic_flag; + int bzero_flag; // 1 if bzero subtracted from barray Kokkos::View bzero; // array of B values for isolated atoms }; @@ -409,4 +405,3 @@ class SNAKokkos { #include "sna_kokkos_impl.h" #endif - diff --git a/src/KOKKOS/sna_kokkos_impl.h b/src/KOKKOS/sna_kokkos_impl.h index d5690ea60a..9a97f229b5 100644 --- a/src/KOKKOS/sna_kokkos_impl.h +++ b/src/KOKKOS/sna_kokkos_impl.h @@ -30,35 +30,24 @@ static const double MY_PI2 = 1.57079632679489661923; // pi/2 template inline -SNAKokkos::SNAKokkos(real_type rfac0_in, - int twojmax_in, real_type rmin0_in, int switch_flag_in, int bzero_flag_in, - int chem_flag_in, int bnorm_flag_in, int wselfall_flag_in, int nelements_in, int switch_inner_flag_in) +SNAKokkos::SNAKokkos(const PairSNAPKokkos& psk) + : rfac0(psk.rfac0), rmin0(psk.rmin0), switch_flag(psk.switchflag), + bzero_flag(psk.bzeroflag), chem_flag(psk.chemflag), bnorm_flag(psk.bnormflag), + wselfall_flag(psk.wselfallflag), switch_inner_flag(psk.switchinnerflag), + quadratic_flag(psk.quadraticflag), twojmax(psk.twojmax), d_coeffelem(psk.d_coeffelem) { - LAMMPS_NS::ExecutionSpace execution_space = ExecutionSpaceFromDevice::space; - host_flag = (execution_space == LAMMPS_NS::Host); - wself = static_cast(1.0); - rfac0 = rfac0_in; - rmin0 = rmin0_in; - switch_flag = switch_flag_in; - switch_inner_flag = switch_inner_flag_in; - bzero_flag = bzero_flag_in; - - chem_flag = chem_flag_in; if (chem_flag) - nelements = nelements_in; + nelements = psk.nelements; else nelements = 1; - bnorm_flag = bnorm_flag_in; - wselfall_flag = wselfall_flag_in; - - twojmax = twojmax_in; ncoeff = compute_ncoeff(); nmax = 0; natom = 0; + natom_pad = 0; build_indexlist(); @@ -301,65 +290,47 @@ void SNAKokkos::grow_rij(int newnatom, int { if (newnatom <= natom && newnmax <= nmax) return; natom = newnatom; + // Create padded structures + const int natom_div = (natom + vector_length - 1) / vector_length; + natom_pad = natom_div * vector_length; nmax = newnmax; - MemKK::realloc_kokkos(rij,"sna:rij",natom,nmax,3); - MemKK::realloc_kokkos(wj,"sna:wj",natom,nmax); - MemKK::realloc_kokkos(rcutij,"sna:rcutij",natom,nmax); - MemKK::realloc_kokkos(sinnerij,"sna:sinnerij",natom,nmax); - MemKK::realloc_kokkos(dinnerij,"sna:dinnerij",natom,nmax); - MemKK::realloc_kokkos(inside,"sna:inside",natom,nmax); - MemKK::realloc_kokkos(element,"sna:element",natom,nmax); - MemKK::realloc_kokkos(dedr,"sna:dedr",natom,nmax,3); + MemKK::realloc_kokkos(rij,"sna:rij",natom_pad,nmax,3); + MemKK::realloc_kokkos(wj,"sna:wj",natom_pad,nmax); + MemKK::realloc_kokkos(rcutij,"sna:rcutij",natom_pad,nmax); + MemKK::realloc_kokkos(sinnerij,"sna:sinnerij",natom_pad,nmax); + MemKK::realloc_kokkos(dinnerij,"sna:dinnerij",natom_pad,nmax); + MemKK::realloc_kokkos(inside,"sna:inside",natom_pad,nmax); + MemKK::realloc_kokkos(element,"sna:element",natom_pad,nmax); + MemKK::realloc_kokkos(dedr,"sna:dedr",natom_pad,nmax,3); -#ifdef LMP_KOKKOS_GPU - if (!host_flag) { - const int natom_div = (natom + vector_length - 1) / vector_length; + MemKK::realloc_kokkos(ulisttot_re,"sna:ulisttot_re", natom_pad, nelements, idxu_half_max); + MemKK::realloc_kokkos(ulisttot_im,"sna:ulisttot_im", natom_pad, nelements, idxu_half_max); + MemKK::realloc_kokkos(ulisttot,"sna:ulisttot", natom_pad, nelements, idxu_max); - MemKK::realloc_kokkos(a_pack,"sna:a_pack",vector_length,nmax,natom_div); - MemKK::realloc_kokkos(b_pack,"sna:b_pack",vector_length,nmax,natom_div); - MemKK::realloc_kokkos(da_pack,"sna:da_pack",vector_length,nmax,natom_div,3); - MemKK::realloc_kokkos(db_pack,"sna:db_pack",vector_length,nmax,natom_div,3); - MemKK::realloc_kokkos(sfac_pack,"sna:sfac_pack",vector_length,nmax,natom_div,4); - MemKK::realloc_kokkos(ulisttot,"sna:ulisttot",1,1,1); // dummy allocation - MemKK::realloc_kokkos(ulisttot_full,"sna:ulisttot",1,1,1); - MemKK::realloc_kokkos(ulisttot_re_pack,"sna:ulisttot_re_pack",vector_length,idxu_half_max,nelements,natom_div); - MemKK::realloc_kokkos(ulisttot_im_pack,"sna:ulisttot_im_pack",vector_length,idxu_half_max,nelements,natom_div); - MemKK::realloc_kokkos(ulisttot_pack,"sna:ulisttot_pack",vector_length,idxu_max,nelements,natom_div); - MemKK::realloc_kokkos(ulist,"sna:ulist",1,1,1); - MemKK::realloc_kokkos(zlist,"sna:zlist",1,1,1); - MemKK::realloc_kokkos(zlist_pack,"sna:zlist_pack",vector_length,idxz_max,ndoubles,natom_div); - MemKK::realloc_kokkos(blist,"sna:blist",natom,ntriples,idxb_max); - MemKK::realloc_kokkos(blist_pack,"sna:blist_pack",vector_length,idxb_max,ntriples,natom_div); - MemKK::realloc_kokkos(ylist,"sna:ylist",1,1,1); - MemKK::realloc_kokkos(ylist_pack_re,"sna:ylist_pack_re",vector_length,idxu_half_max,nelements,natom_div); - MemKK::realloc_kokkos(ylist_pack_im,"sna:ylist_pack_im",vector_length,idxu_half_max,nelements,natom_div); - MemKK::realloc_kokkos(dulist,"sna:dulist",1,1,1); + MemKK::realloc_kokkos(zlist,"sna:zlist", natom_pad, ndoubles, idxz_max); + MemKK::realloc_kokkos(blist,"sna:blist", natom_pad, ntriples, idxb_max); + + MemKK::realloc_kokkos(ylist_re,"sna:ylist_re", natom_pad, nelements, idxu_half_max); + MemKK::realloc_kokkos(ylist_im,"sna:ylist_im", natom_pad, nelements, idxu_half_max); + + if constexpr (!host_flag) { + MemKK::realloc_kokkos(a_gpu,"sna:a_gpu",natom_pad,nmax); + MemKK::realloc_kokkos(b_gpu,"sna:b_gpu",natom_pad,nmax); + MemKK::realloc_kokkos(da_gpu,"sna:da_gpu",natom_pad,nmax,3); + MemKK::realloc_kokkos(db_gpu,"sna:db_gpu",natom_pad,nmax,3); + MemKK::realloc_kokkos(sfac_gpu,"sna:sfac_gpu",natom_pad,nmax,4); + MemKK::realloc_kokkos(ulist_cpu,"sna:ulist_cpu",1,1,1); + MemKK::realloc_kokkos(dulist_cpu,"sna:dulist_cpu",1,1,1); } else { -#endif - MemKK::realloc_kokkos(a_pack,"sna:a_pack",1,1,1); - MemKK::realloc_kokkos(b_pack,"sna:b_pack",1,1,1); - MemKK::realloc_kokkos(da_pack,"sna:da_pack",1,1,1,1); - MemKK::realloc_kokkos(db_pack,"sna:db_pack",1,1,1,1); - MemKK::realloc_kokkos(sfac_pack,"sna:sfac_pack",1,1,1,1); - MemKK::realloc_kokkos(ulisttot,"sna:ulisttot",idxu_half_max,nelements,natom); - MemKK::realloc_kokkos(ulisttot_full,"sna:ulisttot_full",idxu_max,nelements,natom); - MemKK::realloc_kokkos(ulisttot_re_pack,"sna:ulisttot_re",1,1,1,1); - MemKK::realloc_kokkos(ulisttot_im_pack,"sna:ulisttot_im",1,1,1,1); - MemKK::realloc_kokkos(ulisttot_pack,"sna:ulisttot_pack",1,1,1,1); - MemKK::realloc_kokkos(ulist,"sna:ulist",idxu_cache_max,natom,nmax); - MemKK::realloc_kokkos(zlist,"sna:zlist",idxz_max,ndoubles,natom); - MemKK::realloc_kokkos(zlist_pack,"sna:zlist_pack",1,1,1,1); - MemKK::realloc_kokkos(blist,"sna:blist",natom,ntriples,idxb_max); - MemKK::realloc_kokkos(blist_pack,"sna:blist_pack",1,1,1,1); - MemKK::realloc_kokkos(ylist,"sna:ylist",idxu_half_max,nelements,natom); - MemKK::realloc_kokkos(ylist_pack_re,"sna:ylist_pack_re",1,1,1,1); - MemKK::realloc_kokkos(ylist_pack_im,"sna:ylist_pack_im",1,1,1,1); - MemKK::realloc_kokkos(dulist,"sna:dulist",idxu_cache_max,natom,nmax); - -#ifdef LMP_KOKKOS_GPU + MemKK::realloc_kokkos(a_gpu,"sna:a_gpu",1,1); + MemKK::realloc_kokkos(b_gpu,"sna:b_gpu",1,1); + MemKK::realloc_kokkos(da_gpu,"sna:da_gpu",1,1,1); + MemKK::realloc_kokkos(db_gpu,"sna:db_gpu",1,1,1); + MemKK::realloc_kokkos(sfac_gpu,"sna:sfac_gpu",1,1,1); + MemKK::realloc_kokkos(ulist_cpu,"sna:ulist_cpu", natom_pad, nmax, idxu_cache_max); + MemKK::realloc_kokkos(dulist_cpu,"sna:dulist_cpu", natom_pad, nmax, idxu_cache_max); } -#endif } /* ---------------------------------------------------------------------- @@ -375,9 +346,8 @@ void SNAKokkos::grow_rij(int newnatom, int template KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_cayley_klein(const int& iatom_mod, const int& jnbor, const int& iatom_div) +void SNAKokkos::compute_cayley_klein(const int& iatom, const int& jnbor) const { - const int iatom = iatom_mod + vector_length * iatom_div; const real_type x = rij(iatom,jnbor,0); const real_type y = rij(iatom,jnbor,1); const real_type z = rij(iatom,jnbor,2); @@ -431,28 +401,28 @@ void SNAKokkos::compute_cayley_klein(const const real_type dsfacuy = dsfac * uy; const real_type dsfacuz = dsfac * uz; - a_pack(iatom_mod,jnbor,iatom_div) = a; - b_pack(iatom_mod,jnbor,iatom_div) = b; + a_gpu(iatom,jnbor) = a; + b_gpu(iatom,jnbor) = b; - da_pack(iatom_mod,jnbor,iatom_div,0) = dax; - db_pack(iatom_mod,jnbor,iatom_div,0) = dbx; + da_gpu(iatom,jnbor,0) = dax; + db_gpu(iatom,jnbor,0) = dbx; - da_pack(iatom_mod,jnbor,iatom_div,1) = day; - db_pack(iatom_mod,jnbor,iatom_div,1) = dby; + da_gpu(iatom,jnbor,1) = day; + db_gpu(iatom,jnbor,1) = dby; - da_pack(iatom_mod,jnbor,iatom_div,2) = daz; - db_pack(iatom_mod,jnbor,iatom_div,2) = dbz; + da_gpu(iatom,jnbor,2) = daz; + db_gpu(iatom,jnbor,2) = dbz; - sfac_pack(iatom_mod,jnbor,iatom_div,0) = sfac; - sfac_pack(iatom_mod,jnbor,iatom_div,1) = dsfacux; - sfac_pack(iatom_mod,jnbor,iatom_div,2) = dsfacuy; - sfac_pack(iatom_mod,jnbor,iatom_div,3) = dsfacuz; + sfac_gpu(iatom,jnbor,0) = sfac; + sfac_gpu(iatom,jnbor,1) = dsfacux; + sfac_gpu(iatom,jnbor,2) = dsfacuy; + sfac_gpu(iatom,jnbor,3) = dsfacuz; // we need to explicitly zero `dedr` somewhere before hitting // ComputeFusedDeidrj --- this is just a convenient place to do it. - dedr(iatom_mod + vector_length * iatom_div, jnbor, 0) = static_cast(0.); - dedr(iatom_mod + vector_length * iatom_div, jnbor, 1) = static_cast(0.); - dedr(iatom_mod + vector_length * iatom_div, jnbor, 2) = static_cast(0.); + dedr(iatom, jnbor, 0) = static_cast(0.); + dedr(iatom, jnbor, 1) = static_cast(0.); + dedr(iatom, jnbor, 2) = static_cast(0.); } @@ -464,9 +434,8 @@ void SNAKokkos::compute_cayley_klein(const template KOKKOS_INLINE_FUNCTION -void SNAKokkos::pre_ui(const int& iatom_mod, const int& j, const int& ielem, const int& iatom_div) +void SNAKokkos::pre_ui(const int& iatom, const int& j, const int& ielem) const { - for (int jelem = 0; jelem < nelements; jelem++) { int jju_half = idxu_half_block(j); @@ -479,14 +448,13 @@ void SNAKokkos::pre_ui(const int& iatom_mo real_type re_part = static_cast(0.); if (ma == mb && (!chem_flag || ielem == jelem || wselfall_flag)) { re_part = wself; } - ulisttot_re_pack(iatom_mod, jju_half, jelem, iatom_div) = re_part; - ulisttot_im_pack(iatom_mod, jju_half, jelem, iatom_div) = static_cast(0.); + ulisttot_re(iatom, jelem, jju_half) = re_part; + ulisttot_im(iatom, jelem, jju_half) = 0; jju_half++; } } } - } /* ---------------------------------------------------------------------- @@ -498,9 +466,9 @@ void SNAKokkos::pre_ui(const int& iatom_mo template KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_ui_small(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int j_bend, const int jnbor, const int iatom_div) +void SNAKokkos::compute_ui_small(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int j_bend, const int jnbor, const int iatom_div) const { - + const int iatom = iatom_mod + vector_length * iatom_div; // get shared memory offset // scratch size: 32 atoms * (twojmax+1) cached values, no double buffer const int tile_size = vector_length * (twojmax + 1); @@ -512,25 +480,26 @@ void SNAKokkos::compute_ui_small(const typ const WignerWrapper ulist_wrapper((complex*)team.team_shmem().get_shmem(team.team_size() * tile_size * sizeof(complex), 0) + scratch_shift, iatom_mod); // load parameters - const complex a = a_pack(iatom_mod, jnbor, iatom_div); - const complex b = b_pack(iatom_mod, jnbor, iatom_div); - const real_type sfac = sfac_pack(iatom_mod, jnbor, iatom_div, 0); + const complex a = a_gpu(iatom, jnbor); + const complex b = b_gpu(iatom, jnbor); + const real_type sfac = sfac_gpu(iatom, jnbor, 0); - const int jelem = element(iatom_mod + vector_length * iatom_div, jnbor); + const int jelem = element(iatom, jnbor); // we need to "choose" when to bend // this for loop is here for context --- we expose additional // parallelism over this loop instead //for (int j_bend = 0; j_bend <= twojmax; j_bend++) { - evaluate_ui_jbend(ulist_wrapper, a, b, sfac, jelem, iatom_mod, j_bend, iatom_div); + evaluate_ui_jbend(ulist_wrapper, a, b, sfac, jelem, iatom, j_bend); } // Version of the code that loops over all `j_bend` values which reduces integer arithmetic // and some amount of load imbalance, at the expense of reducing parallelism template KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_ui_large(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int jnbor, const int iatom_div) +void SNAKokkos::compute_ui_large(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int jnbor, const int iatom_div) const { + const int iatom = iatom_mod + vector_length * iatom_div; // get shared memory offset // scratch size: 32 atoms * (twojmax+1) cached values, no double buffer const int tile_size = vector_length * (twojmax + 1); @@ -542,18 +511,18 @@ void SNAKokkos::compute_ui_large(const typ const WignerWrapper ulist_wrapper((complex*)team.team_shmem().get_shmem(team.team_size() * tile_size * sizeof(complex), 0) + scratch_shift, iatom_mod); // load parameters - const complex a = a_pack(iatom_mod, jnbor, iatom_div); - const complex b = b_pack(iatom_mod, jnbor, iatom_div); - const real_type sfac = sfac_pack(iatom_mod, jnbor, iatom_div, 0); + const complex a = a_gpu(iatom, jnbor); + const complex b = b_gpu(iatom, jnbor); + const real_type sfac = sfac_gpu(iatom, jnbor, 0); - const int jelem = element(iatom_mod + vector_length * iatom_div, jnbor); + const int jelem = element(iatom, jnbor); // we need to "choose" when to bend #ifdef LMP_KK_DEVICE_COMPILE #pragma unroll #endif for (int j_bend = 0; j_bend <= twojmax; j_bend++) { - evaluate_ui_jbend(ulist_wrapper, a, b, sfac, jelem, iatom_mod, j_bend, iatom_div); + evaluate_ui_jbend(ulist_wrapper, a, b, sfac, jelem, iatom, j_bend); } } @@ -562,9 +531,8 @@ template KOKKOS_FORCEINLINE_FUNCTION void SNAKokkos::evaluate_ui_jbend(const WignerWrapper& ulist_wrapper, const complex& a, const complex& b, const real_type& sfac, const int& jelem, - const int& iatom_mod, const int& j_bend, const int& iatom_div) + const int& iatom, const int& j_bend) const { - // utot(j,ma,mb) = 0 for all j,ma,ma // utot(j,ma,ma) = 1 for all j,ma // for j in neighbors of i: @@ -624,8 +592,8 @@ void SNAKokkos::evaluate_ui_jbend(const Wi const complex ulist_prev = ulist_wrapper.get(ma); // atomic add the previous level here - Kokkos::atomic_add(&(ulisttot_re_pack(iatom_mod, jjup + ma, jelem, iatom_div)), ulist_prev.re * sfac); - Kokkos::atomic_add(&(ulisttot_im_pack(iatom_mod, jjup + ma, jelem, iatom_div)), ulist_prev.im * sfac); + Kokkos::atomic_add(&(ulisttot_re(iatom, jelem, jjup + ma)), ulist_prev.re * sfac); + Kokkos::atomic_add(&(ulisttot_im(iatom, jelem, jjup + ma)), ulist_prev.im * sfac); // ulist_accum += rootpq * b * ulist_prev; real_type rootpq = rootpqarray(j - ma, mb); @@ -654,217 +622,209 @@ void SNAKokkos::evaluate_ui_jbend(const Wi const complex ulist_prev = ulist_wrapper.get(ma); // atomic add the previous level here - Kokkos::atomic_add(&(ulisttot_re_pack(iatom_mod, jjup + ma, jelem, iatom_div)), ulist_prev.re * sfac); - Kokkos::atomic_add(&(ulisttot_im_pack(iatom_mod, jjup + ma, jelem, iatom_div)), ulist_prev.im * sfac); + Kokkos::atomic_add(&(ulisttot_re(iatom, jelem, jjup + ma)), ulist_prev.re * sfac); + Kokkos::atomic_add(&(ulisttot_im(iatom, jelem, jjup + ma)), ulist_prev.im * sfac); } - } /* ---------------------------------------------------------------------- - compute Zi by summing over products of Ui, - AoSoA data layout to take advantage of coalescing, avoiding warp - divergence. GPU version + compute Ui by summing over bispectrum components. CPU only. + This first computes Wigner U-functions for one neighbor. + `ulisttot` uses a "cached" data layout, matching the amount of + information stored between layers via scratch memory on the GPU path. + Next, it adds Wigner U-functions for each neighbor to ulisttot which is + in a "half" data layout, which is a compressed layout + which still keeps the recursive calculation simple. ------------------------------------------------------------------------- */ template -KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_zi(const int& iatom_mod, const int& jjz, const int& iatom_div) +template KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_ui_cpu(const int& iatom, const int& jnbor) const { + // utot(j,ma,mb) = 0 for all j,ma,ma + // utot(j,ma,ma) = 1 for all j,ma + // for j in neighbors of i: + // compute r0 = (x,y,z,z0) + // utot(j,ma,mb) += u(r0;j,ma,mb) for all j,ma,mb - int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, idxcg; - idxz(jjz).get_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, idxcg); + const real_type x = rij(iatom,jnbor,0); + const real_type y = rij(iatom,jnbor,1); + const real_type z = rij(iatom,jnbor,2); + const real_type rsq = x * x + y * y + z * z; + const real_type r = sqrt(rsq); - const real_type* cgblock = cglist.data() + idxcg; + const real_type theta0 = (r - rmin0) * rfac0 * MY_PI / (rcutij(iatom,jnbor) - rmin0); + // theta0 = (r - rmin0) * rscale0; + const real_type z0 = r / tan(theta0); - int idouble = 0; + // begin what was "compute_uarray_cpu" - for (int elem1 = 0; elem1 < nelements; elem1++) { - for (int elem2 = 0; elem2 < nelements; elem2++) { + // compute Cayley-Klein parameters for unit quaternion + real_type r0inv = static_cast(1.0) / sqrt(r * r + z0 * z0); + complex a = { r0inv * z0, -r0inv * z }; + complex b = { r0inv * y, -r0inv * x }; - zlist_pack(iatom_mod,jjz,idouble,iatom_div) = evaluate_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, iatom_mod, elem1, elem2, iatom_div, cgblock); + // VMK Section 4.8.2 + ulist_cpu(iatom, jnbor, 0) = complex::one(); - idouble++; + for (int j = 1; j <= twojmax; j++) { + int jju = idxu_cache_block[j]; // removed "const" to work around GCC 7 bug + int jjup = idxu_cache_block[j-1]; // removed "const" to work around GCC 7 bug + + // fill in left side of matrix layer from previous layer + for (int mb = 0; 2*mb <= j; mb++) { + int jju_index = jju + (j + 1) * mb; + int jjup_index = jjup + j * mb; + + complex ui = complex::zero(); + + for (int ma = 0; ma < j; ma++) { + complex ui_prev = ulist_cpu(iatom, jnbor, jjup_index); + + real_type rootpq = rootpqarray(j - ma, j - mb); + ui.re += rootpq * (a.re * ui_prev.re + a.im * ui_prev.im); + ui.im += rootpq * (a.re * ui_prev.im - a.im * ui_prev.re); + + ulist_cpu(iatom, jnbor, jju_index) = ui; + + rootpq = rootpqarray(ma + 1, j - mb); + ui.re = -rootpq * (b.re * ui_prev.re + b.im * ui_prev.im); + ui.im = -rootpq * (b.re * ui_prev.im - b.im * ui_prev.re); + + jju_index++; + jjup_index++; + } + + ulist_cpu(iatom, jnbor, jju_index) = ui; + } + + // If j is odd (half-integer in the mathematical convention), we need + // to add one more row for convenience (for now). This can either be done + // via symmetry (see the commented code below), or by the equations to fill + // from the left instead of the right + if (j % 2 == 1) { + int mb = j / 2; + // begin filling in the extra row + int jju_index = jju + (mb + 1) * (j + 1); + int jjup_index = jjup + mb * j; + + complex ui = complex::zero(); + + for (int ma = 0; ma < j; ma++) { + complex ui_prev = ulist_cpu(iatom, jnbor, jjup_index); + + real_type rootpq = rootpqarray(j - ma, mb + 1); + ui.re += rootpq * (b.re * ui_prev.re - b.im * ui_prev.im); + ui.im += rootpq * (b.re * ui_prev.im + b.im * ui_prev.re); + + ulist_cpu(iatom, jnbor, jju_index) = ui; + + rootpq = rootpqarray(ma + 1, mb + 1); + ui.re = rootpq * (a.re * ui_prev.re - a.im * ui_prev.im); + ui.im = rootpq * (a.re * ui_prev.im + a.im * ui_prev.re); + + jju_index++; + jjup_index++; + } + + ulist_cpu(iatom, jnbor, jju_index) = ui; + } + } + + // begin what was add_uarraytot + + const real_type sfac = compute_sfac(r, rcutij(iatom,jnbor), sinnerij(iatom,jnbor), dinnerij(iatom,jnbor)) * wj(iatom,jnbor); + const auto jelem = element(iatom, jnbor); + + for (int j = 0; j <= twojmax; j++) { + int jju_half = idxu_half_block[j]; // index into ulisttot + int jju_cache = idxu_cache_block[j]; // index into ulist + + int count = 0; + for (int mb = 0; 2*mb <= j; mb++) { + for (int ma = 0; ma <= j; ma++) { + if constexpr (need_atomics) { + Kokkos::atomic_add(&(ulisttot_re(iatom, jelem, jju_half+count)), sfac * ulist_cpu(iatom, jnbor, jju_cache+count).re); + Kokkos::atomic_add(&(ulisttot_im(iatom, jelem, jju_half+count)), sfac * ulist_cpu(iatom, jnbor, jju_cache+count).im); + } else { + ulisttot_re(iatom, jelem, jju_half+count) += sfac * ulist_cpu(iatom, jnbor, jju_cache+count).re; + ulisttot_im(iatom, jelem, jju_half+count) += sfac * ulist_cpu(iatom, jnbor, jju_cache+count).im; + } + count++; + } } } } /* ---------------------------------------------------------------------- - compute Bi by summing conj(Ui)*Zi - AoSoA data layout to take advantage of coalescing, avoiding warp - divergence. + De-symmetrize ulisttot_re and _im and pack it into a unified ulisttot + structure, fused in with zeroing ylist ------------------------------------------------------------------------- */ template KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_bi(const int& iatom_mod, const int& jjb, const int& iatom_div) +void SNAKokkos::transform_ui(const int& iatom, const int& idxu) const { - // for j1 = 0,...,twojmax - // for j2 = 0,twojmax - // for j = |j1-j2|,Min(twojmax,j1+j2),2 - // b(j1,j2,j) = 0 - // for mb = 0,...,jmid - // for ma = 0,...,j - // b(j1,j2,j) += - // 2*Conj(u(j,ma,mb))*z(j1,j2,j,ma,mb) + int elem_count = chem_flag ? nelements : 1; - const int j1 = idxb(jjb,0); - const int j2 = idxb(jjb,1); - const int j = idxb(jjb,2); + for (int ielem = 0; ielem < elem_count; ielem++) { - const int jjz = idxz_block(j1,j2,j); - const int jju = idxu_block[j]; + const FullHalfMapper mapper = idxu_full_half[idxu]; - int itriple = 0; - int idouble = 0; - for (int elem1 = 0; elem1 < nelements; elem1++) { - for (int elem2 = 0; elem2 < nelements; elem2++) { - for (int elem3 = 0; elem3 < nelements; elem3++) { + auto utot_re = ulisttot_re(iatom, ielem, mapper.idxu_half); + auto utot_im = ulisttot_im(iatom, ielem, mapper.idxu_half); - double sumzu = 0.0; - double sumzu_temp = 0.0; + if (mapper.flip_sign == 1) { + utot_im = -utot_im; + } else if (mapper.flip_sign == -1) { + utot_re = -utot_re; + } - for (int mb = 0; 2*mb < j; mb++) { - for (int ma = 0; ma <= j; ma++) { - const int jju_index = jju+mb*(j+1)+ma; - const int jjz_index = jjz+mb*(j+1)+ma; - if (2*mb == j) return; // I think we can remove this? - const complex utot = ulisttot_pack(iatom_mod, jju_index, elem3, iatom_div); - const complex zloc = zlist_pack(iatom_mod, jjz_index, idouble, iatom_div); - sumzu_temp += utot.re * zloc.re + utot.im * zloc.im; - } - } - sumzu += sumzu_temp; + ulisttot(iatom, ielem, idxu) = { utot_re, utot_im }; - // For j even, special treatment for middle column - if (j%2 == 0) { - sumzu_temp = 0.; - - const int mb = j/2; - for (int ma = 0; ma < mb; ma++) { - const int jju_index = jju+(mb-1)*(j+1)+(j+1)+ma; - const int jjz_index = jjz+(mb-1)*(j+1)+(j+1)+ma; - - const complex utot = ulisttot_pack(iatom_mod, jju_index, elem3, iatom_div); - const complex zloc = zlist_pack(iatom_mod, jjz_index, idouble, iatom_div); - sumzu_temp += utot.re * zloc.re + utot.im * zloc.im; - - } - sumzu += sumzu_temp; - - const int ma = mb; - const int jju_index = jju+(mb-1)*(j+1)+(j+1)+ma; - const int jjz_index = jjz+(mb-1)*(j+1)+(j+1)+ma; - - const complex utot = ulisttot_pack(iatom_mod, jju_index, elem3, iatom_div); - const complex zloc = zlist_pack(iatom_mod, jjz_index, idouble, iatom_div); - sumzu += static_cast(0.5) * (utot.re * zloc.re + utot.im * zloc.im); - } // end if jeven - - sumzu *= static_cast(2.0); - if (bzero_flag) { - if (!wselfall_flag) { - if (elem1 == elem2 && elem1 == elem3) { - sumzu -= bzero[j]; - } - } else { - sumzu -= bzero[j]; - } - } - blist_pack(iatom_mod, jjb, itriple, iatom_div) = sumzu; - //} // end loop over j - //} // end loop over j1, j2 - itriple++; - } // end loop over elem3 - idouble++; - } // end loop over elem2 - } // end loop over elem1 + if (mapper.flip_sign == 0) { + ylist_re(iatom, ielem, mapper.idxu_half) = 0.; + ylist_im(iatom, ielem, mapper.idxu_half) = 0.; + } + } } - /* ---------------------------------------------------------------------- - compute Yi from Ui without storing Zi, looping over zlist indices. - AoSoA data layout to take advantage of coalescing, avoiding warp - divergence. GPU version. + compute Zi by summing over products of Ui ------------------------------------------------------------------------- */ template -KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_yi(int iatom_mod, int jjz, int iatom_div, - const Kokkos::View &beta_pack) +template KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_zi(const int& iatom, const int& jjz) const { - - int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half, idxcg; - idxz(jjz).get_yi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half, idxcg); + int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, idxcg; + idxz(jjz).get_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, idxcg); const real_type *cgblock = cglist.data() + idxcg; - //int mb = (2 * (mb1min+mb2max) - j1 - j2 + j) / 2; - //int ma = (2 * (ma1min+ma2max) - j1 - j2 + j) / 2; - for (int elem1 = 0; elem1 < nelements; elem1++) { - for (int elem2 = 0; elem2 < nelements; elem2++) { - - const complex ztmp = evaluate_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, iatom_mod, elem1, elem2, iatom_div, cgblock); - - // apply to z(j1,j2,j,ma,mb) to unique element of y(j) - // find right y_list[jju] and beta(iatom,jjb) entries - // multiply and divide by j+1 factors - // account for multiplicity of 1, 2, or 3 - - // pick out right beta value - for (int elem3 = 0; elem3 < nelements; elem3++) { - - const real_type betaj = evaluate_beta_scaled(j1, j2, j, iatom_mod, elem1, elem2, elem3, iatom_div, beta_pack); - - Kokkos::atomic_add(&(ylist_pack_re(iatom_mod, jju_half, elem3, iatom_div)), betaj * ztmp.re); - Kokkos::atomic_add(&(ylist_pack_im(iatom_mod, jju_half, elem3, iatom_div)), betaj * ztmp.im); - } // end loop over elem3 - } // end loop over elem2 - } // end loop over elem1 + if constexpr (chemsnap) { + int idouble = 0; + for (int elem1 = 0; elem1 < nelements; elem1++) { + for (int elem2 = 0; elem2 < nelements; elem2++) { + zlist(iatom, idouble, jjz) = evaluate_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, iatom, elem1, elem2, cgblock); + idouble++; + } // end loop over elem2 + } // end loop over elem1 + } else { + zlist(iatom, 0, jjz) = evaluate_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, iatom, 0, 0, cgblock); + } } /* ---------------------------------------------------------------------- - compute Yi from Ui without storing Zi, looping over zlist indices. - AoSoA data layout to take advantage of coalescing, avoiding warp - divergence. GPU version. + Core "evaluation" kernel that computes a single zlist value. + This gets used in both `compute_zi` and `compute_yi` ------------------------------------------------------------------------- */ -template -KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_yi_with_zlist(int iatom_mod, int jjz, int iatom_div, - const Kokkos::View &beta_pack) -{ - int j1, j2, j, jju_half; - idxz(jjz).get_yi_with_zlist(j1, j2, j, jju_half); - - int idouble = 0; - for (int elem1 = 0; elem1 < nelements; elem1++) { - for (int elem2 = 0; elem2 < nelements; elem2++) { - const complex ztmp = zlist_pack(iatom_mod,jjz,idouble,iatom_div); - // apply to z(j1,j2,j,ma,mb) to unique element of y(j) - // find right y_list[jju] and beta(iatom,jjb) entries - // multiply and divide by j+1 factors - // account for multiplicity of 1, 2, or 3 - // pick out right beta value - for (int elem3 = 0; elem3 < nelements; elem3++) { - - const real_type betaj = evaluate_beta_scaled(j1, j2, j, iatom_mod, elem1, elem2, elem3, iatom_div, beta_pack); - - Kokkos::atomic_add(&(ylist_pack_re(iatom_mod, jju_half, elem3, iatom_div)), betaj * ztmp.re); - Kokkos::atomic_add(&(ylist_pack_im(iatom_mod, jju_half, elem3, iatom_div)), betaj * ztmp.im); - } // end loop over elem3 - idouble++; - } // end loop over elem2 - } // end loop over elem1 -} - -// Core "evaluation" kernel that computes a single zlist value -// which gets used in both `compute_zi` and `compute_yi` template KOKKOS_FORCEINLINE_FUNCTION typename SNAKokkos::complex SNAKokkos::evaluate_zi(const int& j1, const int& j2, const int& j, const int& ma1min, const int& ma2max, const int& mb1min, const int& mb2max, const int& na, const int& nb, - const int& iatom_mod, const int& elem1, const int& elem2, const int& iatom_div, const real_type* cgblock) { - + const int& iatom, const int& elem1, const int& elem2, const real_type* cgblock) const { complex ztmp = complex::zero(); int jju1 = idxu_block[j1] + (j1+1)*mb1min; @@ -884,8 +844,8 @@ typename SNAKokkos::complex SNAKokkos::complex SNAKokkos -KOKKOS_FORCEINLINE_FUNCTION -typename SNAKokkos::real_type SNAKokkos::evaluate_beta_scaled(const int& j1, const int& j2, const int& j, - const int& iatom_mod, const int& elem1, const int& elem2, const int& elem3, const int& iatom_div, - const Kokkos::View &beta_pack) { +template KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_bi(const int& iatom, const int& jjb) const +{ + // for j1 = 0,...,twojmax + // for j2 = 0,twojmax + // for j = |j1-j2|,Min(twojmax,j1+j2),2 + // b(j1,j2,j) = 0 + // for mb = 0,...,jmid + // for ma = 0,...,j + // b(j1,j2,j) += + // 2*Conj(u(j,ma,mb))*z(j1,j2,j,ma,mb) - real_type betaj = 0; + const int j1 = idxb(jjb,0); + const int j2 = idxb(jjb,1); + const int j = idxb(jjb,2); - if (j >= j1) { - const int jjb = idxb_block(j1, j2, j); - const int itriple = ((elem1 * nelements + elem2) * nelements + elem3) * idxb_max + jjb; - if (j1 == j) { - if (j2 == j) betaj = static_cast(3) * beta_pack(iatom_mod, itriple, iatom_div); - else betaj = static_cast(2) * beta_pack(iatom_mod, itriple, iatom_div); - } else betaj = beta_pack(iatom_mod, itriple, iatom_div); - } else if (j >= j2) { - const int jjb = idxb_block(j, j2, j1); - const int itriple = ((elem3 * nelements + elem2) * nelements + elem1) * idxb_max + jjb; - if (j2 == j) betaj = static_cast(2) * beta_pack(iatom_mod, itriple, iatom_div); - else betaj = beta_pack(iatom_mod, itriple, iatom_div); + const int jjz = idxz_block(j1,j2,j); + const int jju = idxu_block[j]; + + if constexpr (chemsnap) { + int itriple = 0; + int idouble = 0; + for (int elem1 = 0; elem1 < nelements; elem1++) { + for (int elem2 = 0; elem2 < nelements; elem2++) { + for (int elem3 = 0; elem3 < nelements; elem3++) { + blist(iatom, itriple, jjb) = evaluate_bi(j, jjz, jju, iatom, elem1, elem2, elem3); + itriple++; + } // end loop over elem3 + idouble++; + } // end loop over elem2 + } // end loop over elem1 } else { - const int jjb = idxb_block(j2, j, j1); - const int itriple = ((elem2 * nelements + elem3) * nelements + elem1) * idxb_max + jjb; - betaj = beta_pack(iatom_mod, itriple, iatom_div); + blist(iatom, 0, jjb) = evaluate_bi(j, jjz, jju, iatom, 0, 0, 0); } +} + +/* ---------------------------------------------------------------------- + Core "evaluation" kernel that computes a single blist value. + This gets used in `compute_bi` +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +real_type SNAKokkos::evaluate_bi(const int& j, const int& jjz, const int& jju, const int& iatom, const int& elem1, const int& elem2, const int& elem3) const +{ + // this computes the: + // b(j1,j2,j) = 0 + // for mb = 0,...,jmid + // for ma = 0,...,j + // b(j1,j2,j) += + // 2*Conj(u(j,ma,mb))*z(j1,j2,j,ma,mb) + // portion + + const int idouble = elem1 * nelements + elem2; + real_type sumzu = 0.0; + real_type sumzu_temp = 0.0; + + for (int mb = 0; 2*mb < j; mb++) { + for (int ma = 0; ma <= j; ma++) { + const int jju_index = jju+mb*(j+1)+ma; + const int jjz_index = jjz+mb*(j+1)+ma; + if (2*mb == j) return 0; // I think we can remove this? + const complex utot = ulisttot(iatom, elem3, jju_index); + const complex zloc = zlist(iatom, idouble, jjz_index); + sumzu_temp += utot.re * zloc.re + utot.im * zloc.im; + } + } + sumzu += sumzu_temp; + + // For j even, special treatment for middle column + if (j%2 == 0) { + sumzu_temp = 0.; + + const int mb = j/2; + for (int ma = 0; ma < mb; ma++) { + const int jju_index = jju+(mb-1)*(j+1)+(j+1)+ma; + const int jjz_index = jjz+(mb-1)*(j+1)+(j+1)+ma; + + const complex utot = ulisttot(iatom, elem3, jju_index); + const complex zloc = zlist(iatom, idouble, jjz_index); + sumzu_temp += utot.re * zloc.re + utot.im * zloc.im; + + } + sumzu += sumzu_temp; + + const int ma = mb; + const int jju_index = jju+(mb-1)*(j+1)+(j+1)+ma; + const int jjz_index = jjz+(mb-1)*(j+1)+(j+1)+ma; + + const complex utot = ulisttot(iatom, elem3, jju_index); + const complex zloc = zlist(iatom, idouble, jjz_index); + sumzu += static_cast(0.5) * (utot.re * zloc.re + utot.im * zloc.im); + } // end if jeven + + sumzu *= static_cast(2.0); + if (bzero_flag) { + if (!wselfall_flag) { + if (elem1 == elem2 && elem1 == elem3) { + sumzu -= bzero[j]; + } + } else { + sumzu -= bzero[j]; + } + } + return sumzu; + //} // end loop over j + //} // end loop over j1, j2 +} + + +/* ---------------------------------------------------------------------- + compute beta by either appropriately copying it from d_coeffi + or accumulating the quadratic terms from blist +------------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_beta_linear(const int& iatom, const int& idxb, const int& ielem) const +{ + auto d_coeffi = Kokkos::subview(d_coeffelem, ielem, Kokkos::ALL); + + for (int itriple = 0; itriple < ntriples; itriple++) { + int icoeff = idxb + itriple * idxb_max; + d_beta(iatom, icoeff) = d_coeffi[icoeff+1]; + } +} + +template +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_beta_quadratic(const int& iatom, const int& idxb, const int& ielem) const +{ + auto d_coeffi = Kokkos::subview(d_coeffelem, ielem, Kokkos::ALL); + + // handle quadratic && chemflag as a special case + if (chem_flag) { + if (idxb == 0) { + // no need to use atomics, we're just serializing + int k = ncoeff+1; + for (int icoeff = 0; icoeff < ncoeff; icoeff++) { + const auto idxb = icoeff % idxb_max; + const auto idx_chem = icoeff / idxb_max; + real_type bveci = blist(iatom, idx_chem, idxb); + d_beta(iatom, icoeff) += d_coeffi[k] * bveci; + k++; + for (int jcoeff = icoeff+1; jcoeff < ncoeff; jcoeff++) { + const auto jdxb = jcoeff % idxb_max; + const auto jdx_chem = jcoeff / idxb_max; + real_type bvecj = blist(iatom, jdx_chem, jdxb); + d_beta(iatom, icoeff) += d_coeffi[k] * bvecj; + d_beta(iatom, jcoeff) += d_coeffi[k] * bveci; + k++; + } + } + } + } else { + // Compute triangular partial sum via a closed form to get the starting offset + int k = (idxb * (1 + 2 * idxb_max - idxb)) / 2 + idxb_max + 1; + real_type bveci = blist(iatom, 0, idxb); + + // Locally accumulate the contribution to d_beta(iatom, idxb) + real_type beta_idxb_accum = d_coeffi[k] * bveci; + k++; + + for (int jdxb = idxb + 1; jdxb < idxb_max; jdxb++) { + real_type bvecj = blist(iatom, 0, jdxb); + real_type coeff_k = d_coeffi[k]; + beta_idxb_accum += coeff_k * bvecj; + + // Accumulate "half" contribution into d_beta(iatom, jdxb) + if constexpr (need_atomics) + Kokkos::atomic_add(&d_beta(iatom, jdxb), coeff_k * bveci); + else + d_beta(iatom, jdxb) += coeff_k * bveci; + + k++; + } + + if constexpr (need_atomics) + Kokkos::atomic_add(&d_beta(iatom, idxb), beta_idxb_accum); + else + d_beta(iatom, idxb) += beta_idxb_accum; + } +} + + +/* ---------------------------------------------------------------------- + Compute Yi from Ui without storing Zi, looping over zlist indices. +------------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_yi(const int& iatom, const int& jjz) const +{ + int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half, idxcg; + idxz(jjz).get_yi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half, idxcg); + + const real_type *cgblock = cglist.data() + idxcg; + //int mb = (2 * (mb1min+mb2max) - j1 - j2 + j) / 2; + //int ma = (2 * (ma1min+ma2max) - j1 - j2 + j) / 2; + + if constexpr (chemsnap) { + for (int elem1 = 0; elem1 < nelements; elem1++) { + for (int elem2 = 0; elem2 < nelements; elem2++) { + + const complex ztmp = evaluate_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, iatom, elem1, elem2, cgblock); + + // apply to z(j1,j2,j,ma,mb) to unique element of y(j) + // find right y_list[jju] and beta(iatom,jjb) entries + // multiply and divide by j+1 factors + // account for multiplicity of 1, 2, or 3 + + // pick out right beta value + for (int elem3 = 0; elem3 < nelements; elem3++) { + + const real_type betaj = evaluate_beta_scaled(j1, j2, j, iatom, elem1, elem2, elem3); + + if constexpr (need_atomics) { + Kokkos::atomic_add(&(ylist_re(iatom, elem3, jju_half)), betaj * ztmp.re); + Kokkos::atomic_add(&(ylist_im(iatom, elem3, jju_half)), betaj * ztmp.im); + } else { + ylist_re(iatom, elem3, jju_half) += betaj * ztmp.re; + ylist_im(iatom, elem3, jju_half) += betaj * ztmp.im; + } + } // end loop over elem3 + } // end loop over elem2 + } // end loop over elem1 + } else { + const complex ztmp = evaluate_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, iatom, 0, 0, cgblock); + const real_type betaj = evaluate_beta_scaled(j1, j2, j, iatom, 0, 0, 0); + + if constexpr (need_atomics) { + Kokkos::atomic_add(&(ylist_re(iatom, 0, jju_half)), betaj * ztmp.re); + Kokkos::atomic_add(&(ylist_im(iatom, 0, jju_half)), betaj * ztmp.im); + } else { + ylist_re(iatom, 0, jju_half) += betaj * ztmp.re; + ylist_im(iatom, 0, jju_half) += betaj * ztmp.im; + } + } +} + +/* ---------------------------------------------------------------------- + compute Yi from Ui with the precomputed Zi. +------------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void SNAKokkos::compute_yi_with_zlist(const int& iatom, const int& jjz) const +{ + int j1, j2, j, jju_half; + idxz(jjz).get_yi_with_zlist(j1, j2, j, jju_half); + + if constexpr (chemsnap) { + int idouble = 0; + for (int elem1 = 0; elem1 < nelements; elem1++) { + for (int elem2 = 0; elem2 < nelements; elem2++) { + const complex ztmp = zlist(iatom, idouble, jjz); + // apply to z(j1,j2,j,ma,mb) to unique element of y(j) + // find right y_list[jju] and beta(iatom,jjb) entries + // multiply and divide by j+1 factors + // account for multiplicity of 1, 2, or 3 + // pick out right beta value + for (int elem3 = 0; elem3 < nelements; elem3++) { + + const real_type betaj = evaluate_beta_scaled(j1, j2, j, iatom, elem1, elem2, elem3); + + if constexpr (need_atomics) { + Kokkos::atomic_add(&(ylist_re(iatom, elem3, jju_half)), betaj * ztmp.re); + Kokkos::atomic_add(&(ylist_im(iatom, elem3, jju_half)), betaj * ztmp.im); + } else { + ylist_re(iatom, elem3, jju_half) += betaj * ztmp.re; + ylist_im(iatom, elem3, jju_half) += betaj * ztmp.im; + } + } // end loop over elem3 + idouble++; + } // end loop over elem2 + } // end loop over elem1 + } else { + const complex ztmp = zlist(iatom, 0, jjz); + const real_type betaj = evaluate_beta_scaled(j1, j2, j, iatom, 0, 0, 0); + + if constexpr (need_atomics) { + Kokkos::atomic_add(&(ylist_re(iatom, 0, jju_half)), betaj * ztmp.re); + Kokkos::atomic_add(&(ylist_im(iatom, 0, jju_half)), betaj * ztmp.im); + } else { + ylist_re(iatom, 0, jju_half) += betaj * ztmp.re; + ylist_im(iatom, 0, jju_half) += betaj * ztmp.im; + } + } +} + +/* ---------------------------------------------------------------------- + Core "evaluation" kernel that extracts and rescales the appropriate + `beta` value which gets used in both `compute_yi` and `compute_yi_from_zlist` +------------------------------------------------------------------------- */ + +template +template KOKKOS_FORCEINLINE_FUNCTION +typename SNAKokkos::real_type SNAKokkos::evaluate_beta_scaled(const int& j1, const int& j2, const int& j, + const int& iatom, const int& elem1, const int& elem2, const int& elem3) const { + + int itriple_jjb = 0; + real_type factor = 0; + + if constexpr (chemsnap) { + if (j >= j1) { + itriple_jjb = ((elem1 * nelements + elem2) * nelements + elem3) * idxb_max + idxb_block(j1, j2, j); + if (j1 == j) { + if (j2 == j) factor = 3; + else factor = 2; + } else factor = 1; + } else if (j >= j2) { + itriple_jjb = ((elem3 * nelements + elem2) * nelements + elem1) * idxb_max + idxb_block(j, j2, j1); + if (j2 == j) factor = 2; + else factor = 1; + } else { + itriple_jjb = ((elem2 * nelements + elem3) * nelements + elem1) * idxb_max + idxb_block(j2, j, j1); + factor = 1; + } + } else { + if (j >= j1) { + itriple_jjb = idxb_block(j1, j2, j); + if (j1 == j) { + if (j2 == j) factor = 3; + else factor = 2; + } else factor = 1; + } else if (j >= j2) { + itriple_jjb = idxb_block(j, j2, j1); + if (j2 == j) factor = 2; + else factor = 1; + } else { + itriple_jjb = idxb_block(j2, j, j1); + factor = 1; + } + } + + real_type betaj = factor * d_beta(iatom, itriple_jjb); if (!bnorm_flag && j1 > j) { const real_type scale = static_cast(j1 + 1) / static_cast(j + 1); @@ -955,8 +1234,9 @@ typename SNAKokkos::real_type SNAKokkos template KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_fused_deidrj_small(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int j_bend, const int jnbor, const int iatom_div) +void SNAKokkos::compute_fused_deidrj_small(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int j_bend, const int jnbor, const int iatom_div) const { + const int iatom = iatom_mod + vector_length * iatom_div; // get shared memory offset // scratch size: 32 atoms * (twojmax+1) cached values, no double buffer const int tile_size = vector_length * (twojmax + 1); @@ -969,21 +1249,21 @@ void SNAKokkos::compute_fused_deidrj_small WignerWrapper dulist_wrapper((complex*)team.team_shmem().get_shmem(team.team_size() * tile_size * sizeof(complex), 0) + scratch_shift, iatom_mod); // load parameters - const complex a = a_pack(iatom_mod, jnbor, iatom_div); - const complex b = b_pack(iatom_mod, jnbor, iatom_div); - const complex da = da_pack(iatom_mod, jnbor, iatom_div, dir); - const complex db = db_pack(iatom_mod, jnbor, iatom_div, dir); - const real_type sfac = sfac_pack(iatom_mod, jnbor, iatom_div, 0); - const real_type dsfacu = sfac_pack(iatom_mod, jnbor, iatom_div, dir + 1); // dsfac * u + const complex a = a_gpu(iatom, jnbor); + const complex b = b_gpu(iatom, jnbor); + const complex da = da_gpu(iatom, jnbor, dir); + const complex db = db_gpu(iatom, jnbor, dir); + const real_type sfac = sfac_gpu(iatom, jnbor, 0); + const real_type dsfacu = sfac_gpu(iatom, jnbor, dir + 1); // dsfac * u - const int jelem = element(iatom_mod + vector_length * iatom_div, jnbor); + const int jelem = element(iatom, jnbor); // compute the contribution to dedr_full_sum for one "bend" location const real_type dedr_full_sum = evaluate_duidrj_jbend(ulist_wrapper, a, b, sfac, dulist_wrapper, da, db, dsfacu, - jelem, iatom_mod, j_bend, iatom_div); + jelem, iatom, j_bend); // dedr gets zeroed out at the start of each iteration in compute_cayley_klein - Kokkos::atomic_add(&(dedr(iatom_mod + vector_length * iatom_div, jnbor, dir)), static_cast(2.0) * dedr_full_sum); + Kokkos::atomic_add(&(dedr(iatom, jnbor, dir)), static_cast(2.0) * dedr_full_sum); } @@ -992,8 +1272,9 @@ void SNAKokkos::compute_fused_deidrj_small template template KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_fused_deidrj_large(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int jnbor, const int iatom_div) +void SNAKokkos::compute_fused_deidrj_large(const typename Kokkos::TeamPolicy::member_type& team, const int iatom_mod, const int jnbor, const int iatom_div) const { + const int iatom = iatom_mod + vector_length * iatom_div; // get shared memory offset // scratch size: 32 atoms * (twojmax+1) cached values, no double buffer const int tile_size = vector_length * (twojmax + 1); @@ -1006,14 +1287,14 @@ void SNAKokkos::compute_fused_deidrj_large WignerWrapper dulist_wrapper((complex*)team.team_shmem().get_shmem(team.team_size() * tile_size * sizeof(complex), 0) + scratch_shift, iatom_mod); // load parameters - const complex a = a_pack(iatom_mod, jnbor, iatom_div); - const complex b = b_pack(iatom_mod, jnbor, iatom_div); - const complex da = da_pack(iatom_mod, jnbor, iatom_div, dir); - const complex db = db_pack(iatom_mod, jnbor, iatom_div, dir); - const real_type sfac = sfac_pack(iatom_mod, jnbor, iatom_div, 0); - const real_type dsfacu = sfac_pack(iatom_mod, jnbor, iatom_div, dir + 1); // dsfac * u + const complex a = a_gpu(iatom, jnbor); + const complex b = b_gpu(iatom, jnbor); + const complex da = da_gpu(iatom, jnbor, dir); + const complex db = db_gpu(iatom, jnbor, dir); + const real_type sfac = sfac_gpu(iatom, jnbor, 0); + const real_type dsfacu = sfac_gpu(iatom, jnbor, dir + 1); // dsfac * u - const int jelem = element(iatom_mod + vector_length * iatom_div, jnbor); + const int jelem = element(iatom, jnbor); // compute the contributions to dedr_full_sum for all "bend" locations real_type dedr_full_sum = static_cast(0); @@ -1022,11 +1303,11 @@ void SNAKokkos::compute_fused_deidrj_large #endif for (int j_bend = 0; j_bend <= twojmax; j_bend++) { dedr_full_sum += evaluate_duidrj_jbend(ulist_wrapper, a, b, sfac, dulist_wrapper, da, db, dsfacu, - jelem, iatom_mod, j_bend, iatom_div); + jelem, iatom,j_bend); } // there's one thread per atom, neighbor pair, so no need to make this atomic - dedr(iatom_mod + vector_length * iatom_div, jnbor, dir) = static_cast(2.0) * dedr_full_sum; + dedr(iatom, jnbor, dir) = static_cast(2.0) * dedr_full_sum; } @@ -1036,7 +1317,7 @@ template KOKKOS_FORCEINLINE_FUNCTION typename SNAKokkos::real_type SNAKokkos::evaluate_duidrj_jbend(const WignerWrapper& ulist_wrapper, const complex& a, const complex& b, const real_type& sfac, const WignerWrapper& dulist_wrapper, const complex& da, const complex& db, const real_type& dsfacu, - const int& jelem, const int& iatom_mod, const int& j_bend, const int& iatom_div) { + const int& jelem, const int& iatom, const int& j_bend) const { real_type dedr_full_sum = static_cast(0); @@ -1106,7 +1387,7 @@ typename SNAKokkos::real_type SNAKokkos::real_type SNAKokkos(0.5)*y_local; } else if (ma > (mb-1)) { y_local.re = static_cast(0.); y_local.im = static_cast(0.); } // can probably avoid this outright @@ -1171,335 +1452,6 @@ typename SNAKokkos::real_type SNAKokkos -KOKKOS_INLINE_FUNCTION -void SNAKokkos::pre_ui_cpu(const typename Kokkos::TeamPolicy::member_type& team, const int& iatom, const int& ielem) -{ - for (int jelem = 0; jelem < nelements; jelem++) { - for (int j = 0; j <= twojmax; j++) { - int jju = idxu_half_block(j); // removed "const" to work around GCC 7 bug - - // Only diagonal elements get initialized - // for (int m = 0; m < (j+1)*(j/2+1); m++) - Kokkos::parallel_for(Kokkos::ThreadVectorRange(team, (j+1)*(j/2+1)), - [&] (const int m) { - - const int jjup = jju + m; - - // if m is on the "diagonal", initialize it with the self energy. - // Otherwise zero it out - complex init(static_cast(0.),static_cast(0.)); - if (m % (j+2) == 0 && (!chem_flag || ielem == jelem || wselfall_flag)) { init.re = wself; } //need to map iatom to element - - ulisttot(jjup, jelem, iatom) = init; - }); - } - } - -} - - -/* ---------------------------------------------------------------------- - compute Ui by summing over bispectrum components. CPU only. - See comments above compute_uarray_cpu and add_uarraytot for - data layout comments. -------------------------------------------------------------------------- */ - -template -KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_ui_cpu(const typename Kokkos::TeamPolicy::member_type& team, int iatom, int jnbor) -{ - real_type rsq, r, x, y, z, z0, theta0; - - // utot(j,ma,mb) = 0 for all j,ma,ma - // utot(j,ma,ma) = 1 for all j,ma - // for j in neighbors of i: - // compute r0 = (x,y,z,z0) - // utot(j,ma,mb) += u(r0;j,ma,mb) for all j,ma,mb - - x = rij(iatom,jnbor,0); - y = rij(iatom,jnbor,1); - z = rij(iatom,jnbor,2); - rsq = x * x + y * y + z * z; - r = sqrt(rsq); - - theta0 = (r - rmin0) * rfac0 * MY_PI / (rcutij(iatom,jnbor) - rmin0); - // theta0 = (r - rmin0) * rscale0; - z0 = r / tan(theta0); - - compute_uarray_cpu(team, iatom, jnbor, x, y, z, z0, r); - add_uarraytot(team, iatom, jnbor, r, wj(iatom,jnbor), rcutij(iatom,jnbor), sinnerij(iatom,jnbor), dinnerij(iatom,jnbor), element(iatom, jnbor)); - -} -/* ---------------------------------------------------------------------- - compute Zi by summing over products of Ui, CPU version -------------------------------------------------------------------------- */ - -template -KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_zi_cpu(const int& iter) -{ - const int iatom = iter / idxz_max; - const int jjz = iter % idxz_max; - - int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, idxcg; - idxz(jjz).get_zi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, idxcg); - - const real_type *cgblock = cglist.data() + idxcg; - - int idouble = 0; - - for (int elem1 = 0; elem1 < nelements; elem1++) { - for (int elem2 = 0; elem2 < nelements; elem2++) { - zlist(jjz, idouble, iatom).re = static_cast(0.0); - zlist(jjz, idouble, iatom).im = static_cast(0.0); - - int jju1 = idxu_block[j1] + (j1+1)*mb1min; - int jju2 = idxu_block[j2] + (j2+1)*mb2max; - int icgb = mb1min*(j2+1) + mb2max; - for (int ib = 0; ib < nb; ib++) { - - real_type suma1_r = static_cast(0.0); - real_type suma1_i = static_cast(0.0); - - int ma1 = ma1min; - int ma2 = ma2max; - int icga = ma1min * (j2 + 1) + ma2max; - for (int ia = 0; ia < na; ia++) { - suma1_r += cgblock[icga] * (ulisttot_full(jju1+ma1, elem1, iatom).re * ulisttot_full(jju2+ma2, elem2, iatom).re - - ulisttot_full(jju1+ma1, elem1, iatom).im * ulisttot_full(jju2+ma2, elem2, iatom).im); - suma1_i += cgblock[icga] * (ulisttot_full(jju1+ma1, elem1, iatom).re * ulisttot_full(jju2+ma2, elem2, iatom).im + - ulisttot_full(jju1+ma1, elem1, iatom).im * ulisttot_full(jju2+ma2, elem2, iatom).re); - ma1++; - ma2--; - icga += j2; - } // end loop over ia - - zlist(jjz, idouble, iatom).re += cgblock[icgb] * suma1_r; - zlist(jjz, idouble, iatom).im += cgblock[icgb] * suma1_i; - - jju1 += j1 + 1; - jju2 -= j2 + 1; - icgb += j2; - } // end loop over ib - - if (bnorm_flag) { - const real_type scale = static_cast(1) / static_cast(j + 1); - zlist(jjz, idouble, iatom).re *= scale; - zlist(jjz, idouble, iatom).im *= scale; - } - idouble++; - } // end loop over elem2 - } // end loop over elem1 -} - - -/* ---------------------------------------------------------------------- - compute Bi by summing conj(Ui)*Zi, CPU version -------------------------------------------------------------------------- */ - -template -KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_bi_cpu(const typename Kokkos::TeamPolicy::member_type& team, int iatom) -{ - // for j1 = 0,...,twojmax - // for j2 = 0,twojmax - // for j = |j1-j2|,Min(twojmax,j1+j2),2 - // b(j1,j2,j) = 0 - // for mb = 0,...,jmid - // for ma = 0,...,j - // b(j1,j2,j) += - // 2*Conj(u(j,ma,mb))*z(j1,j2,j,ma,mb) - - int itriple = 0; - int idouble = 0; - for (int elem1 = 0; elem1 < nelements; elem1++) { - for (int elem2 = 0; elem2 < nelements; elem2++) { - int jalloy = idouble; // must be non-const to work around gcc compiler bug - for (int elem3 = 0; elem3 < nelements; elem3++) { - Kokkos::parallel_for(Kokkos::TeamThreadRange(team,idxb_max), - [&] (const int& jjb) { - const int j1 = idxb(jjb, 0); - const int j2 = idxb(jjb, 1); - int j = idxb(jjb, 2); // removed "const" to work around GCC 7 bug - - int jjz = idxz_block(j1, j2, j); - int jju = idxu_block[j]; - real_type sumzu = static_cast(0.0); - real_type sumzu_temp = static_cast(0.0); - const int bound = (j+2)/2; - Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(team,(j+1)*bound), - [&] (const int mbma, real_type& sum) { - const int ma = mbma % (j + 1); - const int mb = mbma / (j + 1); - const int jju_index = jju + mb * (j + 1) + ma; - const int jjz_index = jjz + mb * (j + 1) + ma; - if (2*mb == j) return; - sum += - ulisttot_full(jju_index, elem3, iatom).re * zlist(jjz_index, jalloy, iatom).re + - ulisttot_full(jju_index, elem3, iatom).im * zlist(jjz_index, jalloy, iatom).im; - },sumzu_temp); // end loop over ma, mb - sumzu += sumzu_temp; - - // For j even, special treatment for middle column - - if (j%2 == 0) { - int mb = j/2; // removed "const" to work around GCC 7 bug - Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(team, mb), - [&] (const int ma, real_type& sum) { - const int jju_index = jju+(mb-1)*(j+1)+(j+1)+ma; - const int jjz_index = jjz+(mb-1)*(j+1)+(j+1)+ma; - sum += - ulisttot_full(jju_index, elem3, iatom).re * zlist(jjz_index, jalloy, iatom).re + - ulisttot_full(jju_index, elem3, iatom).im * zlist(jjz_index, jalloy, iatom).im; - },sumzu_temp); // end loop over ma - sumzu += sumzu_temp; - - const int ma = mb; - const int jju_index = jju+(mb-1)*(j+1)+(j+1)+ma; - const int jjz_index = jjz+(mb-1)*(j+1)+(j+1)+ma; - sumzu += static_cast(0.5)* - (ulisttot_full(jju_index, elem3, iatom).re * zlist(jjz_index, jalloy, iatom).re + - ulisttot_full(jju_index, elem3, iatom).im * zlist(jjz_index, jalloy, iatom).im); - } // end if jeven - - Kokkos::single(Kokkos::PerThread(team), [&] () { - sumzu *= static_cast(2.0); - - // apply bzero shift - - if (bzero_flag) { - if (!wselfall_flag) { - if (elem1 == elem2 && elem1 == elem3) { - sumzu -= bzero[j]; - } - } else { - sumzu -= bzero[j]; - } - } - - blist(iatom, itriple, jjb) = sumzu; - }); - }); - //} // end loop over j - //} // end loop over j1, j2 - itriple++; - } - idouble++; - } // end loop over elem2 - } // end loop over elem1 - -} - -/* ---------------------------------------------------------------------- - compute Yi from Ui without storing Zi, looping over zlist indices, - CPU version -------------------------------------------------------------------------- */ - -template -KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_yi_cpu(int iter, - const Kokkos::View &beta) -{ - real_type betaj; - const int iatom = iter / idxz_max; - const int jjz = iter % idxz_max; - - int j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half, idxcg; - idxz(jjz).get_yi(j1, j2, j, ma1min, ma2max, mb1min, mb2max, na, nb, jju_half, idxcg); - - const real_type *cgblock = cglist.data() + idxcg; - //int mb = (2 * (mb1min+mb2max) - j1 - j2 + j) / 2; - //int ma = (2 * (ma1min+ma2max) - j1 - j2 + j) / 2; - - for (int elem1 = 0; elem1 < nelements; elem1++) { - for (int elem2 = 0; elem2 < nelements; elem2++) { - - real_type ztmp_r = 0.0; - real_type ztmp_i = 0.0; - - int jju1 = idxu_block[j1] + (j1 + 1) * mb1min; - int jju2 = idxu_block[j2] + (j2 + 1) * mb2max; - int icgb = mb1min * (j2 +1) + mb2max; - - for (int ib = 0; ib < nb; ib++) { - - real_type suma1_r = 0.0; - real_type suma1_i = 0.0; - - int ma1 = ma1min; - int ma2 = ma2max; - int icga = ma1min*(j2+1) + ma2max; - - for (int ia = 0; ia < na; ia++) { - suma1_r += cgblock[icga] * (ulisttot_full(jju1+ma1, elem1, iatom).re * ulisttot_full(jju2+ma2, elem2, iatom).re - - ulisttot_full(jju1+ma1, elem1, iatom).im * ulisttot_full(jju2+ma2, elem2, iatom).im); - suma1_i += cgblock[icga] * (ulisttot_full(jju1+ma1, elem1, iatom).re * ulisttot_full(jju2+ma2, elem2, iatom).im + - ulisttot_full(jju1+ma1, elem1, iatom).im * ulisttot_full(jju2+ma2, elem2, iatom).re); - ma1++; - ma2--; - icga += j2; - } // end loop over ia - - ztmp_r += cgblock[icgb] * suma1_r; - ztmp_i += cgblock[icgb] * suma1_i; - jju1 += j1 + 1; - jju2 -= j2 + 1; - icgb += j2; - } // end loop over ib - - if (bnorm_flag) { - const real_type scale = static_cast(1) / static_cast(j + 1); - ztmp_i *= scale; - ztmp_r *= scale; - } - - // apply to z(j1,j2,j,ma,mb) to unique element of y(j) - // find right y_list[jju] and beta(iatom,jjb) entries - // multiply and divide by j+1 factors - // account for multiplicity of 1, 2, or 3 - - // pick out right beta value - for (int elem3 = 0; elem3 < nelements; elem3++) { - - if (j >= j1) { - const int jjb = idxb_block(j1, j2, j); - const int itriple = ((elem1 * nelements + elem2) * nelements + elem3) * idxb_max + jjb; - if (j1 == j) { - if (j2 == j) betaj = 3 * beta(itriple, iatom); - else betaj = 2 * beta(itriple, iatom); - } else betaj = beta(itriple, iatom); - } else if (j >= j2) { - const int jjb = idxb_block(j, j2, j1); - const int itriple = ((elem3 * nelements + elem2) * nelements + elem1) * idxb_max + jjb; - if (j2 == j) betaj = 2 * beta(itriple, iatom); - else betaj = beta(itriple, iatom); - } else { - const int jjb = idxb_block(j2, j, j1); - const int itriple = ((elem2 * nelements + elem3) * nelements + elem1) * idxb_max + jjb; - betaj = beta(itriple, iatom); - } - - if (!bnorm_flag && j1 > j) - betaj *= static_cast(j1 + 1) / static_cast(j + 1); - - Kokkos::atomic_add(&(ylist(jju_half, elem3, iatom).re), betaj*ztmp_r); - Kokkos::atomic_add(&(ylist(jju_half, elem3, iatom).im), betaj*ztmp_i); - } // end loop over elem3 - } // end loop over elem2 - } // end loop over elem1 -} - - /* ---------------------------------------------------------------------- calculate derivative of Ui w.r.t. atom j see comments above compute_duarray_cpu for comments on the @@ -1508,27 +1460,179 @@ void SNAKokkos::compute_yi_cpu(int iter, template KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_duidrj_cpu(const typename Kokkos::TeamPolicy::member_type& team, int iatom, int jnbor) +void SNAKokkos::compute_duidrj_cpu(const int& iatom, const int& jnbor) const { - real_type rsq, r, x, y, z, z0, theta0, cs, sn; - real_type dz0dr; + complex da[3], db[3]; + real_type u[3], dz0[3], dr0inv[3]; - x = rij(iatom,jnbor,0); - y = rij(iatom,jnbor,1); - z = rij(iatom,jnbor,2); - rsq = x * x + y * y + z * z; - r = sqrt(rsq); - real_type rscale0 = rfac0 * static_cast(MY_PI) / (rcutij(iatom,jnbor) - rmin0); - theta0 = (r - rmin0) * rscale0; - sn = sin(theta0); - cs = cos(theta0); - z0 = r * cs / sn; - dz0dr = z0 / r - (r*rscale0) * (rsq + z0 * z0) / rsq; + const real_type x = rij(iatom,jnbor,0); + const real_type y = rij(iatom,jnbor,1); + const real_type z = rij(iatom,jnbor,2); + const real_type rsq = x * x + y * y + z * z; + const real_type r = sqrt(rsq); + const real_type rscale0 = rfac0 * static_cast(MY_PI) / (rcutij(iatom,jnbor) - rmin0); + const real_type theta0 = (r - rmin0) * rscale0; + const real_type sn = sin(theta0); + const real_type cs = cos(theta0); + const real_type z0 = r * cs / sn; + const real_type dz0dr = z0 / r - (r*rscale0) * (rsq + z0 * z0) / rsq; - compute_duarray_cpu(team, iatom, jnbor, x, y, z, z0, r, dz0dr, wj(iatom,jnbor), rcutij(iatom,jnbor), sinnerij(iatom,jnbor), dinnerij(iatom,jnbor)); + // begin what was compute_duarray_cpu + + real_type rinv = 1.0 / r; + u[0] = x * rinv; + u[1] = y * rinv; + u[2] = z * rinv; + + real_type r0inv = 1.0 / sqrt(r * r + z0 * z0); + complex a = { z0 * r0inv, -z * r0inv }; + complex b = { y * r0inv, -x * r0inv }; + + real_type dr0invdr = -r0inv * r0inv * r0inv * (r + z0 * dz0dr); + + dr0inv[0] = dr0invdr * u[0]; + dr0inv[1] = dr0invdr * u[1]; + dr0inv[2] = dr0invdr * u[2]; + + dz0[0] = dz0dr * u[0]; + dz0[1] = dz0dr * u[1]; + dz0[2] = dz0dr * u[2]; + + for (int k = 0; k < 3; k++) { + da[k].re = dz0[k] * r0inv + z0 * dr0inv[k]; + da[k].im = -z * dr0inv[k]; + } + + da[2].im += -r0inv; + + for (int k = 0; k < 3; k++) { + db[k].re = y * dr0inv[k]; + db[k].im = -x * dr0inv[k]; + } + + db[0].im += -r0inv; + db[1].re += r0inv; + + for (int k = 0; k < 3; k++) + dulist_cpu(iatom, jnbor, 0, k) = complex::zero(); + + for (int j = 1; j <= twojmax; j++) { + int jju = idxu_cache_block[j]; + int jjup = idxu_cache_block[j-1]; + + for (int mb = 0; 2*mb <= j; mb++) { + int jju_index = jju + mb * (j + 1); + int jjup_index = jjup + mb * j; + + complex duidrj[3] = { complex::zero(), complex::zero(), complex::zero() }; + + for (int ma = 0; ma < j; ma++) { + complex ui_prev = ulist_cpu(iatom, jnbor, jjup_index); + complex duidrj_prev[3] = { dulist_cpu(iatom, jnbor, jjup_index, 0), + dulist_cpu(iatom, jnbor, jjup_index, 1), + dulist_cpu(iatom, jnbor, jjup_index, 2) }; + + real_type rootpq = rootpqarray(j - ma,j - mb); + for (int k = 0; k < 3; k++) { + duidrj[k].re += rootpq * (da[k].re * ui_prev.re + da[k].im * ui_prev.im + + a.re * duidrj_prev[k].re + a.im * duidrj_prev[k].im); + + duidrj[k].im += rootpq * (da[k].re * ui_prev.im - da[k].im * ui_prev.re + + a.re * duidrj_prev[k].im - a.im * duidrj_prev[k].re); + + dulist_cpu(iatom, jnbor, jju_index, k) = duidrj[k]; + } + + rootpq = rootpqarray(ma + 1,j - mb); + for (int k = 0; k < 3; k++) { + duidrj[k].re = -rootpq * (db[k].re * ui_prev.re + db[k].im * ui_prev.im + + b.re * duidrj_prev[k].re + b.im * duidrj_prev[k].im); + + duidrj[k].im = -rootpq * (db[k].re * ui_prev.im - db[k].im * ui_prev.re + + b.re * duidrj_prev[k].im - b.im * duidrj_prev[k].re); + } + + jju_index++; + jjup_index++; + } + + for (int k = 0; k < 3; k++) { + dulist_cpu(iatom, jnbor, jju_index, k) = duidrj[k]; + } + } + + // Only need to add one symmetrized row for convenience + // Symmetry gets "unfolded" during the dedr accumulation + + // copy left side to right side with inversion symmetry VMK 4.4(2) + // u[ma-j][mb-j] = (-1)^(ma-mb)*Conj([u[ma][mb]) + + if (j % 2 == 1) { + int mb = j / 2; + // begin filling in the extra row + int jju_index = jju + (mb + 1) * (j + 1); + int jjup_index = jjup + mb * j; + + complex duidrj[3] = { complex::zero(), complex::zero(), complex::zero() }; + + for (int ma = 0; ma < j; ma++) { + complex ui_prev = ulist_cpu(iatom, jnbor, jjup_index); + complex duidrj_prev[3] = { dulist_cpu(iatom, jnbor, jjup_index, 0), + dulist_cpu(iatom, jnbor, jjup_index, 1), + dulist_cpu(iatom, jnbor, jjup_index, 2) }; + + real_type rootpq = rootpqarray(j - ma, mb + 1); + for (int k = 0; k < 3; k++) { + duidrj[k].re += rootpq * (db[k].re * ui_prev.re - db[k].im * ui_prev.im + + b.re * duidrj_prev[k].re - b.im * duidrj_prev[k].im); + duidrj[k].im += rootpq * (db[k].re * ui_prev.im + db[k].im * ui_prev.re + + b.re * duidrj_prev[k].im + b.im * duidrj_prev[k].re); + + dulist_cpu(iatom, jnbor, jju_index, k) = duidrj[k]; + } + + rootpq = rootpqarray(ma + 1, mb + 1); + for (int k = 0; k < 3; k++) { + duidrj[k].re = rootpq * (da[k].re * ui_prev.re - da[k].im * ui_prev.im + + a.re * duidrj_prev[k].re - a.im * duidrj_prev[k].im); + duidrj[k].im = rootpq * (da[k].re * ui_prev.im + da[k].im * ui_prev.re + + a.re * duidrj_prev[k].im + a.im * duidrj_prev[k].re); + } + + jju_index++; + jjup_index++; + } + + for (int k = 0; k < 3; k++) { + dulist_cpu(iatom, jnbor, jju_index, k) = duidrj[k]; + } + } + } + + real_type sfac, dsfac; + compute_s_dsfac(r, rcutij(iatom,jnbor), sinnerij(iatom,jnbor), dinnerij(iatom,jnbor), sfac, dsfac); + + sfac *= wj(iatom,jnbor); + dsfac *= wj(iatom,jnbor); + + // Even though we fill out a full "cached" data layout above, + // we only need the "half" data for the accumulation into dedr. + // Thus we skip updating any unnecessary data. + for (int j = 0; j <= twojmax; j++) { + int jju = idxu_cache_block[j]; + for (int mb = 0; 2*mb <= j; mb++) + for (int ma = 0; ma <= j; ma++) { + for (int k = 0; k < 3; k++) { + dulist_cpu(iatom, jnbor, jju, k).re = dsfac * ulist_cpu(iatom, jnbor, jju).re * u[k] + + sfac * dulist_cpu(iatom, jnbor, jju, k).re; + dulist_cpu(iatom, jnbor, jju, k).im = dsfac * ulist_cpu(iatom, jnbor, jju).im * u[k] + + sfac * dulist_cpu(iatom, jnbor, jju, k).im; + } + jju++; + } + } } - /* ---------------------------------------------------------------------- compute dEidRj, CPU path only. dulist takes advantage of a `cached` data layout, similar to the @@ -1537,356 +1641,44 @@ void SNAKokkos::compute_duidrj_cpu(const t dulist only uses the "half" data layout part of that structure. ------------------------------------------------------------------------- */ - template KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_deidrj_cpu(const typename Kokkos::TeamPolicy::member_type& team, int iatom, int jnbor) +void SNAKokkos::compute_deidrj_cpu(const int& iatom, const int& jnbor) const { - t_scalar3 final_sum; + real_type force_sum[3] = { 0, 0, 0 }; const int jelem = element(iatom, jnbor); - Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(team,twojmax+1), - [&] (const int& j, t_scalar3& sum_tmp) { + for (int j = 0; j <= twojmax; j++) { int jju_half = idxu_half_block[j]; int jju_cache = idxu_cache_block[j]; - for (int mb = 0; 2*mb < j; mb++) + for (int mb = 0; 2 * mb < j; mb++) { for (int ma = 0; ma <= j; ma++) { - sum_tmp.x += dulist(jju_cache,iatom,jnbor,0).re * ylist(jju_half,jelem,iatom).re + - dulist(jju_cache,iatom,jnbor,0).im * ylist(jju_half,jelem,iatom).im; - sum_tmp.y += dulist(jju_cache,iatom,jnbor,1).re * ylist(jju_half,jelem,iatom).re + - dulist(jju_cache,iatom,jnbor,1).im * ylist(jju_half,jelem,iatom).im; - sum_tmp.z += dulist(jju_cache,iatom,jnbor,2).re * ylist(jju_half,jelem,iatom).re + - dulist(jju_cache,iatom,jnbor,2).im * ylist(jju_half,jelem,iatom).im; + complex y = { ylist_re(iatom, jelem, jju_half), ylist_im(iatom, jelem, jju_half) }; + for (int k = 0; k < 3; k++) + force_sum[k] += dulist_cpu(iatom, jnbor, jju_cache, k).re * y.re + + dulist_cpu(iatom, jnbor, jju_cache, k).im * y.im; jju_half++; jju_cache++; - } //end loop over ma mb + } + } //end loop over ma mb // For j even, handle middle column - if (j%2 == 0) { - - int mb = j/2; - for (int ma = 0; ma < mb; ma++) { - sum_tmp.x += dulist(jju_cache,iatom,jnbor,0).re * ylist(jju_half,jelem,iatom).re + - dulist(jju_cache,iatom,jnbor,0).im * ylist(jju_half,jelem,iatom).im; - sum_tmp.y += dulist(jju_cache,iatom,jnbor,1).re * ylist(jju_half,jelem,iatom).re + - dulist(jju_cache,iatom,jnbor,1).im * ylist(jju_half,jelem,iatom).im; - sum_tmp.z += dulist(jju_cache,iatom,jnbor,2).re * ylist(jju_half,jelem,iatom).re + - dulist(jju_cache,iatom,jnbor,2).im * ylist(jju_half,jelem,iatom).im; + if (j % 2 == 0) { + //int mb = j / 2; + for (int ma = 0; ma <= j; ma++) { + complex y = { ylist_re(iatom, jelem, jju_half), ylist_im(iatom, jelem, jju_half) }; + for (int k = 0; k < 3; k++) + force_sum[k] += static_cast(0.5) * (dulist_cpu(iatom, jnbor, jju_cache, k).re * y.re + + dulist_cpu(iatom, jnbor, jju_cache, k).im * y.im); jju_half++; jju_cache++; } - - //int ma = mb; - sum_tmp.x += (dulist(jju_cache,iatom,jnbor,0).re * ylist(jju_half,jelem,iatom).re + - dulist(jju_cache,iatom,jnbor,0).im * ylist(jju_half,jelem,iatom).im)*0.5; - sum_tmp.y += (dulist(jju_cache,iatom,jnbor,1).re * ylist(jju_half,jelem,iatom).re + - dulist(jju_cache,iatom,jnbor,1).im * ylist(jju_half,jelem,iatom).im)*0.5; - sum_tmp.z += (dulist(jju_cache,iatom,jnbor,2).re * ylist(jju_half,jelem,iatom).re + - dulist(jju_cache,iatom,jnbor,2).im * ylist(jju_half,jelem,iatom).im)*0.5; } // end if jeven - },final_sum); // end loop over j - - Kokkos::single(Kokkos::PerThread(team), [&] () { - dedr(iatom,jnbor,0) = final_sum.x*2.0; - dedr(iatom,jnbor,1) = final_sum.y*2.0; - dedr(iatom,jnbor,2) = final_sum.z*2.0; - }); - -} - - -/* ---------------------------------------------------------------------- - add Wigner U-functions for one neighbor to the total - ulist is in a "cached" data layout, which is a compressed layout - which still keeps the recursive calculation simple. On the other hand - `ulisttot` uses a "half" data layout, which fully takes advantage - of the symmetry of the Wigner U matrices. -------------------------------------------------------------------------- */ - -template -KOKKOS_INLINE_FUNCTION -void SNAKokkos::add_uarraytot(const typename Kokkos::TeamPolicy::member_type& team, int iatom, int jnbor, - const real_type& r, const real_type& wj, const real_type& rcut, - const real_type& sinner, const real_type& dinner, int jelem) -{ - const real_type sfac = compute_sfac(r, rcut, sinner, dinner) * wj; - - Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,twojmax+1), - [&] (const int& j) { - - int jju_half = idxu_half_block[j]; // index into ulisttot - int jju_cache = idxu_cache_block[j]; // index into ulist - - int count = 0; - for (int mb = 0; 2*mb <= j; mb++) { - for (int ma = 0; ma <= j; ma++) { - Kokkos::atomic_add(&(ulisttot(jju_half+count, jelem, iatom).re), sfac * ulist(jju_cache+count, iatom, jnbor).re); - Kokkos::atomic_add(&(ulisttot(jju_half+count, jelem, iatom).im), sfac * ulist(jju_cache+count, iatom, jnbor).im); - count++; - } - } - }); -} - -/* ---------------------------------------------------------------------- - compute Wigner U-functions for one neighbor. - `ulisttot` uses a "cached" data layout, matching the amount of - information stored between layers via scratch memory on the GPU path -------------------------------------------------------------------------- */ - -template -KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_uarray_cpu(const typename Kokkos::TeamPolicy::member_type& team, int iatom, int jnbor, - const real_type& x, const real_type& y, const real_type& z, const real_type& z0, const real_type& r) -{ - real_type r0inv; - real_type a_r, b_r, a_i, b_i; - real_type rootpq; - - // compute Cayley-Klein parameters for unit quaternion - - r0inv = static_cast(1.0) / sqrt(r * r + z0 * z0); - a_r = r0inv * z0; - a_i = -r0inv * z; - b_r = r0inv * y; - b_i = -r0inv * x; - - // VMK Section 4.8.2 - - ulist(0,iatom,jnbor).re = 1.0; - ulist(0,iatom,jnbor).im = 0.0; - - for (int j = 1; j <= twojmax; j++) { - int jju = idxu_cache_block[j]; // removed "const" to work around GCC 7 bug - int jjup = idxu_cache_block[j-1]; // removed "const" to work around GCC 7 bug - - // fill in left side of matrix layer from previous layer - - Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,(j+2)/2), - [&] (const int& mb) { - //for (int mb = 0; 2*mb <= j; mb++) { - const int jju_index = jju+mb+mb*j; - ulist(jju_index,iatom,jnbor).re = 0.0; - ulist(jju_index,iatom,jnbor).im = 0.0; - - for (int ma = 0; ma < j; ma++) { - const int jju_index = jju+mb+mb*j+ma; - const int jjup_index = jjup+mb*j+ma; - rootpq = rootpqarray(j - ma,j - mb); - ulist(jju_index,iatom,jnbor).re += - rootpq * - (a_r * ulist(jjup_index,iatom,jnbor).re + - a_i * ulist(jjup_index,iatom,jnbor).im); - ulist(jju_index,iatom,jnbor).im += - rootpq * - (a_r * ulist(jjup_index,iatom,jnbor).im - - a_i * ulist(jjup_index,iatom,jnbor).re); - - rootpq = rootpqarray(ma + 1,j - mb); - ulist(jju_index+1,iatom,jnbor).re = - -rootpq * - (b_r * ulist(jjup_index,iatom,jnbor).re + - b_i * ulist(jjup_index,iatom,jnbor).im); - ulist(jju_index+1,iatom,jnbor).im = - -rootpq * - (b_r * ulist(jjup_index,iatom,jnbor).im - - b_i * ulist(jjup_index,iatom,jnbor).re); - } - - // copy left side to right side with inversion symmetry VMK 4.4(2) - // u[ma-j,mb-j] = (-1)^(ma-mb)*Conj([u[ma,mb)) - - // Only need to add one symmetrized row for convenience - // Symmetry gets "unfolded" in accumulating ulisttot - if (j%2==1 && mb==(j/2)) { - const int mbpar = (mb)%2==0?1:-1; - int mapar = mbpar; - for (int ma = 0; ma <= j; ma++) { - const int jju_index = jju + mb*(j+1) + ma; - const int jjup_index = jju + (j+1-mb)*(j+1)-(ma+1); - if (mapar == 1) { - ulist(jjup_index,iatom,jnbor).re = ulist(jju_index,iatom,jnbor).re; - ulist(jjup_index,iatom,jnbor).im = -ulist(jju_index,iatom,jnbor).im; - } else { - ulist(jjup_index,iatom,jnbor).re = -ulist(jju_index,iatom,jnbor).re; - ulist(jjup_index,iatom,jnbor).im = ulist(jju_index,iatom,jnbor).im; - } - mapar = -mapar; - } - } - }); - - } -} - -/* ---------------------------------------------------------------------- - compute derivatives of Wigner U-functions for one neighbor - see comments in compute_uarray_cpu() - Uses same cached data layout of ulist -------------------------------------------------------------------------- */ - -template -KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_duarray_cpu(const typename Kokkos::TeamPolicy::member_type& team, int iatom, int jnbor, - const real_type& x, const real_type& y, const real_type& z, - const real_type& z0, const real_type& r, const real_type& dz0dr, - const real_type& wj, const real_type& rcut, - const real_type& sinner, const real_type& dinner) -{ - real_type r0inv; - real_type a_r, a_i, b_r, b_i; - real_type da_r[3], da_i[3], db_r[3], db_i[3]; - real_type dz0[3], dr0inv[3], dr0invdr; - real_type rootpq; - - real_type rinv = 1.0 / r; - real_type ux = x * rinv; - real_type uy = y * rinv; - real_type uz = z * rinv; - - r0inv = 1.0 / sqrt(r * r + z0 * z0); - a_r = z0 * r0inv; - a_i = -z * r0inv; - b_r = y * r0inv; - b_i = -x * r0inv; - - dr0invdr = -r0inv * r0inv * r0inv * (r + z0 * dz0dr); - - dr0inv[0] = dr0invdr * ux; - dr0inv[1] = dr0invdr * uy; - dr0inv[2] = dr0invdr * uz; - - dz0[0] = dz0dr * ux; - dz0[1] = dz0dr * uy; - dz0[2] = dz0dr * uz; - - for (int k = 0; k < 3; k++) { - da_r[k] = dz0[k] * r0inv + z0 * dr0inv[k]; - da_i[k] = -z * dr0inv[k]; } - da_i[2] += -r0inv; - - for (int k = 0; k < 3; k++) { - db_r[k] = y * dr0inv[k]; - db_i[k] = -x * dr0inv[k]; - } - - db_i[0] += -r0inv; - db_r[1] += r0inv; - - dulist(0,iatom,jnbor,0).re = 0.0; - dulist(0,iatom,jnbor,1).re = 0.0; - dulist(0,iatom,jnbor,2).re = 0.0; - dulist(0,iatom,jnbor,0).im = 0.0; - dulist(0,iatom,jnbor,1).im = 0.0; - dulist(0,iatom,jnbor,2).im = 0.0; - - for (int j = 1; j <= twojmax; j++) { - int jju = idxu_cache_block[j]; - int jjup = idxu_cache_block[j-1]; - Kokkos::parallel_for(Kokkos::ThreadVectorRange(team,(j+2)/2), - [&] (const int& mb) { - //for (int mb = 0; 2*mb <= j; mb++) { - const int jju_index = jju+mb+mb*j; - dulist(jju_index,iatom,jnbor,0).re = 0.0; - dulist(jju_index,iatom,jnbor,1).re = 0.0; - dulist(jju_index,iatom,jnbor,2).re = 0.0; - dulist(jju_index,iatom,jnbor,0).im = 0.0; - dulist(jju_index,iatom,jnbor,1).im = 0.0; - dulist(jju_index,iatom,jnbor,2).im = 0.0; - - for (int ma = 0; ma < j; ma++) { - const int jju_index = jju+mb+mb*j+ma; - const int jjup_index = jjup+mb*j+ma; - rootpq = rootpqarray(j - ma,j - mb); - for (int k = 0; k < 3; k++) { - dulist(jju_index,iatom,jnbor,k).re += - rootpq * (da_r[k] * ulist(jjup_index,iatom,jnbor).re + - da_i[k] * ulist(jjup_index,iatom,jnbor).im + - a_r * dulist(jjup_index,iatom,jnbor,k).re + - a_i * dulist(jjup_index,iatom,jnbor,k).im); - dulist(jju_index,iatom,jnbor,k).im += - rootpq * (da_r[k] * ulist(jjup_index,iatom,jnbor).im - - da_i[k] * ulist(jjup_index,iatom,jnbor).re + - a_r * dulist(jjup_index,iatom,jnbor,k).im - - a_i * dulist(jjup_index,iatom,jnbor,k).re); - } - - rootpq = rootpqarray(ma + 1,j - mb); - for (int k = 0; k < 3; k++) { - dulist(jju_index+1,iatom,jnbor,k).re = - -rootpq * (db_r[k] * ulist(jjup_index,iatom,jnbor).re + - db_i[k] * ulist(jjup_index,iatom,jnbor).im + - b_r * dulist(jjup_index,iatom,jnbor,k).re + - b_i * dulist(jjup_index,iatom,jnbor,k).im); - dulist(jju_index+1,iatom,jnbor,k).im = - -rootpq * (db_r[k] * ulist(jjup_index,iatom,jnbor).im - - db_i[k] * ulist(jjup_index,iatom,jnbor).re + - b_r * dulist(jjup_index,iatom,jnbor,k).im - - b_i * dulist(jjup_index,iatom,jnbor,k).re); - } - } - - // Only need to add one symmetrized row for convenience - // Symmetry gets "unfolded" during the dedr accumulation - - // copy left side to right side with inversion symmetry VMK 4.4(2) - // u[ma-j][mb-j] = (-1)^(ma-mb)*Conj([u[ma][mb]) - - if (j%2==1 && mb==(j/2)) { - const int mbpar = (mb)%2==0?1:-1; - int mapar = mbpar; - for (int ma = 0; ma <= j; ma++) { - const int jju_index = jju+mb*(j+1)+ma; - const int jjup_index = jju+(mb+2)*(j+1)-(ma+1); - if (mapar == 1) { - for (int k = 0; k < 3; k++) { - dulist(jjup_index,iatom,jnbor,k).re = dulist(jju_index,iatom,jnbor,k).re; - dulist(jjup_index,iatom,jnbor,k).im = -dulist(jju_index,iatom,jnbor,k).im; - } - } else { - for (int k = 0; k < 3; k++) { - dulist(jjup_index,iatom,jnbor,k).re = -dulist(jju_index,iatom,jnbor,k).re; - dulist(jjup_index,iatom,jnbor,k).im = dulist(jju_index,iatom,jnbor,k).im; - } - } - mapar = -mapar; - } - } - }); - } - - real_type sfac = compute_sfac(r, rcut, sinner, dinner); - real_type dsfac = compute_dsfac(r, rcut, sinner, dinner); - - sfac *= wj; - dsfac *= wj; - - // Even though we fill out a full "cached" data layout above, - // we only need the "half" data for the accumulation into dedr. - // Thus we skip updating any unnecessary data. - for (int j = 0; j <= twojmax; j++) { - int jju = idxu_cache_block[j]; - for (int mb = 0; 2*mb <= j; mb++) - for (int ma = 0; ma <= j; ma++) { - dulist(jju,iatom,jnbor,0).re = dsfac * ulist(jju,iatom,jnbor).re * ux + - sfac * dulist(jju,iatom,jnbor,0).re; - dulist(jju,iatom,jnbor,0).im = dsfac * ulist(jju,iatom,jnbor).im * ux + - sfac * dulist(jju,iatom,jnbor,0).im; - dulist(jju,iatom,jnbor,1).re = dsfac * ulist(jju,iatom,jnbor).re * uy + - sfac * dulist(jju,iatom,jnbor,1).re; - dulist(jju,iatom,jnbor,1).im = dsfac * ulist(jju,iatom,jnbor).im * uy + - sfac * dulist(jju,iatom,jnbor,1).im; - dulist(jju,iatom,jnbor,2).re = dsfac * ulist(jju,iatom,jnbor).re * uz + - sfac * dulist(jju,iatom,jnbor,2).re; - dulist(jju,iatom,jnbor,2).im = dsfac * ulist(jju,iatom,jnbor).im * uz + - sfac * dulist(jju,iatom,jnbor,2).im; - - jju++; - } - } + for (int k = 0; k < 3; k++) + dedr(iatom, jnbor, k) = 2 * force_sum[k]; } /* ---------------------------------------------------------------------- @@ -2210,7 +2002,7 @@ int SNAKokkos::compute_ncoeff() template KOKKOS_INLINE_FUNCTION -real_type SNAKokkos::compute_sfac(real_type r, real_type rcut, real_type sinner, real_type dinner) +real_type SNAKokkos::compute_sfac(real_type r, real_type rcut, real_type sinner, real_type dinner) const { real_type sfac_outer; constexpr real_type one = static_cast(1.0); @@ -2243,7 +2035,7 @@ real_type SNAKokkos::compute_sfac(real_typ template KOKKOS_INLINE_FUNCTION -real_type SNAKokkos::compute_dsfac(real_type r, real_type rcut, real_type sinner, real_type dinner) +real_type SNAKokkos::compute_dsfac(real_type r, real_type rcut, real_type sinner, real_type dinner) const { real_type sfac_outer, dsfac_outer, sfac_inner, dsfac_inner; constexpr real_type one = static_cast(1.0); @@ -2291,7 +2083,7 @@ real_type SNAKokkos::compute_dsfac(real_ty template KOKKOS_INLINE_FUNCTION -void SNAKokkos::compute_s_dsfac(const real_type r, const real_type rcut, const real_type sinner, const real_type dinner, real_type& sfac, real_type& dsfac) { +void SNAKokkos::compute_s_dsfac(const real_type r, const real_type rcut, const real_type sinner, const real_type dinner, real_type& sfac, real_type& dsfac) const { real_type sfac_outer, dsfac_outer, sfac_inner, dsfac_inner; constexpr real_type one = static_cast(1.0); @@ -2339,41 +2131,26 @@ double SNAKokkos::memory_usage() bytes += MemKK::memory_usage(rootpqarray); bytes += MemKK::memory_usage(cglist); -#ifdef LMP_KOKKOS_GPU - if (!host_flag) { + bytes += MemKK::memory_usage(ulisttot_re); + bytes += MemKK::memory_usage(ulisttot_im); + bytes += MemKK::memory_usage(ulisttot); - bytes += MemKK::memory_usage(a_pack); - bytes += MemKK::memory_usage(b_pack); - bytes += MemKK::memory_usage(da_pack); - bytes += MemKK::memory_usage(db_pack); - bytes += MemKK::memory_usage(sfac_pack); + bytes += MemKK::memory_usage(zlist); + bytes += MemKK::memory_usage(blist); + bytes += MemKK::memory_usage(ylist_re); + bytes += MemKK::memory_usage(ylist_im); - bytes += MemKK::memory_usage(ulisttot_re_pack); - bytes += MemKK::memory_usage(ulisttot_im_pack); - bytes += MemKK::memory_usage(ulisttot_pack); - - bytes += MemKK::memory_usage(zlist_pack); - bytes += MemKK::memory_usage(blist_pack); - - bytes += MemKK::memory_usage(ylist_pack_re); - bytes += MemKK::memory_usage(ylist_pack_im); + if constexpr (!host_flag) { + bytes += MemKK::memory_usage(a_gpu); + bytes += MemKK::memory_usage(b_gpu); + bytes += MemKK::memory_usage(da_gpu); + bytes += MemKK::memory_usage(db_gpu); + bytes += MemKK::memory_usage(sfac_gpu); } else { -#endif - - bytes += MemKK::memory_usage(ulist); - bytes += MemKK::memory_usage(ulisttot); - bytes += MemKK::memory_usage(ulisttot_full); - - bytes += MemKK::memory_usage(zlist); - bytes += MemKK::memory_usage(blist); - - bytes += MemKK::memory_usage(ylist); - - bytes += MemKK::memory_usage(dulist); -#ifdef LMP_KOKKOS_GPU + bytes += MemKK::memory_usage(ulist_cpu); + bytes += MemKK::memory_usage(dulist_cpu); } -#endif bytes += MemKK::memory_usage(dedr); diff --git a/src/MAKE/MACHINES/Makefile.perlmutter_kokkos b/src/MAKE/MACHINES/Makefile.perlmutter_kokkos index 81164aa040..decb26b5f6 100644 --- a/src/MAKE/MACHINES/Makefile.perlmutter_kokkos +++ b/src/MAKE/MACHINES/Makefile.perlmutter_kokkos @@ -9,7 +9,7 @@ SHELL = /bin/sh KOKKOS_ABSOLUTE_PATH = $(shell cd $(KOKKOS_PATH); pwd) CC = $(KOKKOS_ABSOLUTE_PATH)/bin/nvcc_wrapper -CCFLAGS = -g -O3 -DNDEBUG -Xcudafe --diag_suppress=unrecognized_pragma -Xcudafe --diag_suppress=128 +CCFLAGS = -g -O3 -DNDEBUG -Xcudafe --diag_suppress=unrecognized_pragma,--diag_suppress=128 SHFLAGS = -fPIC DEPFLAGS = -M diff --git a/src/MAKE/MACHINES/Makefile.summit_kokkos b/src/MAKE/MACHINES/Makefile.summit_kokkos index 57c25702aa..ad91e7e203 100644 --- a/src/MAKE/MACHINES/Makefile.summit_kokkos +++ b/src/MAKE/MACHINES/Makefile.summit_kokkos @@ -9,7 +9,7 @@ SHELL = /bin/sh KOKKOS_ABSOLUTE_PATH = $(shell cd $(KOKKOS_PATH); pwd) CC = $(KOKKOS_ABSOLUTE_PATH)/bin/nvcc_wrapper -CCFLAGS = -g -O3 -DNDEBUG -Xcudafe --diag_suppress=unrecognized_pragma -Xcudafe --diag_suppress=128 +CCFLAGS = -g -O3 -DNDEBUG -Xcudafe --diag_suppress=unrecognized_pragma,--diag_suppress=128 SHFLAGS = -fPIC DEPFLAGS = -M diff --git a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi b/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi index fd173b5588..d4fafed2dc 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi +++ b/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi @@ -10,7 +10,7 @@ KOKKOS_ABSOLUTE_PATH = $(shell cd $(KOKKOS_PATH); pwd) export MPICH_CXX = $(KOKKOS_ABSOLUTE_PATH)/bin/nvcc_wrapper export OMPI_CXX = $(KOKKOS_ABSOLUTE_PATH)/bin/nvcc_wrapper CC = mpicxx -CCFLAGS = -g -O3 -DNDEBUG -Xcudafe --diag_suppress=unrecognized_pragma -Xcudafe --diag_suppress=128 +CCFLAGS = -g -O3 -DNDEBUG -Xcudafe --diag_suppress=unrecognized_pragma,--diag_suppress=128 SHFLAGS = -fPIC # uncomment when compiling with Intel 21.5 or older FMTFLAGS = # -std=c++11 diff --git a/src/MANYBODY/pair_sw_angle_table.cpp b/src/MANYBODY/pair_sw_angle_table.cpp index 12592f4af6..9bd0316cf5 100644 --- a/src/MANYBODY/pair_sw_angle_table.cpp +++ b/src/MANYBODY/pair_sw_angle_table.cpp @@ -402,14 +402,18 @@ void PairSWAngleTable::threebody_table(Param *paramij, Param *paramik, ParamTabl rinv12 = 1.0/(r1*r2); cs = (delr1[0]*delr2[0] + delr1[1]*delr2[1] + delr1[2]*delr2[2]) * rinv12; - - var = acos(cs); + cs = MAX(-1.0,MIN(cs,1.0)); // look up energy (f(theta), ftheta) and force (df(theta)/dtheta, fprimetheta) at // angle theta (var) in angle table belonging to parameter set paramijk + + var = acos(cs); uf_lookup(table_paramijk, var, ftheta, fprimetheta); - acosprime = 1.0 / (sqrt(1 - cs*cs ) ); + if ((cs*cs - 1.0) != 0.0) + acosprime = 1.0 / (sqrt(1 - cs*cs ) ); + else + acosprime = 0.0; facradtable = facexp*ftheta; frad1table = facradtable*gsrainvsq1; @@ -724,7 +728,7 @@ double PairSWAngleTable::splint(double *xa, double *ya, double *y2a, int n, doub void PairSWAngleTable::uf_lookup(ParamTable *pm, double x, double &u, double &f) { - if (!std::isfinite(x)) { error->one(FLERR, "Illegal angle in angle style table"); } + if (!std::isfinite(x)) error->one(FLERR, "Illegal angle in pair style sw/angle/table"); double fraction,a,b; diff --git a/src/MC/fix_atom_swap.cpp b/src/MC/fix_atom_swap.cpp index 1348f1248e..209c5cf8c4 100644 --- a/src/MC/fix_atom_swap.cpp +++ b/src/MC/fix_atom_swap.cpp @@ -35,6 +35,7 @@ #include "modify.h" #include "neighbor.h" #include "pair.h" +#include "pair_hybrid.h" #include "random_park.h" #include "region.h" #include "update.h" @@ -223,6 +224,28 @@ void FixAtomSwap::init() error->all(FLERR, "Mu not allowed when not using semi-grand in fix atom/swap command"); } + // check if constraints for hybrid pair styles are fulfilled + + if (utils::strmatch(force->pair_style, "^hybrid")) { + auto *hybrid = dynamic_cast(force->pair); + if (hybrid) { + for (int i = 0; i < nswaptypes - 1; ++i) { + int type1 = type_list[i]; + for (int j = i + 1; j < nswaptypes; ++j) { + int type2 = type_list[j]; + if (hybrid->nmap[type1][type1] != hybrid->nmap[type2][type2]) + error->all(FLERR, "Pair {} substyles for atom types {} and {} are not compatible", + force->pair_style, type1, type2); + for (int k = 0; k < hybrid->nmap[type1][type1]; ++k) { + if (hybrid->map[type1][type1][k] != hybrid->map[type2][type2][k]) + error->all(FLERR, "Pair {} substyles for atom types {} and {} are not compatible", + force->pair_style, type1, type2); + } + } + } + } + } + // set index and check validity of region if (idregion) { diff --git a/src/MC/fix_charge_regulation.cpp b/src/MC/fix_charge_regulation.cpp index ddf14f6804..f5be7a041b 100644 --- a/src/MC/fix_charge_regulation.cpp +++ b/src/MC/fix_charge_regulation.cpp @@ -174,9 +174,9 @@ FixChargeRegulation::~FixChargeRegulation() { neighbor->exclusion_group_group_delete(exclusion_group, igroupall); } - if (groupstrings) { + if (ngroups > 0) { for (int i = 0; i < ngroups; ++i) delete[] groupstrings[i]; - memory->destroy(groupstrings); + memory->sfree(groupstrings); } } diff --git a/src/MESONT/angle_mesocnt.cpp b/src/MESONT/angle_mesocnt.cpp index c6dae4b0fb..1394edc4c1 100644 --- a/src/MESONT/angle_mesocnt.cpp +++ b/src/MESONT/angle_mesocnt.cpp @@ -396,3 +396,14 @@ double AngleMesoCNT::single(int type, int i1, int i2, int i3) else return kb[type] * dtheta + thetab[type] * (kh[type] * thetab[type] - kb[type]); } + +/* ---------------------------------------------------------------------- + return ptr to internal members upon request +------------------------------------------------------------------------ */ + +void *AngleMesoCNT::extract(const char *str, int &dim) +{ + dim = 1; + if (strcmp(str, "theta0") == 0) return (void *) theta0; + return nullptr; +} diff --git a/src/MESONT/angle_mesocnt.h b/src/MESONT/angle_mesocnt.h index 50e06c68ce..289ed97a0b 100644 --- a/src/MESONT/angle_mesocnt.h +++ b/src/MESONT/angle_mesocnt.h @@ -41,6 +41,7 @@ class AngleMesoCNT : public Angle { void read_restart(FILE *) override; void write_data(FILE *) override; double single(int, int, int, int) override; + void *extract(const char *, int &) override; protected: int *buckling; diff --git a/src/MOFFF/angle_class2_p6.cpp b/src/MOFFF/angle_class2_p6.cpp index 39dec0d9d6..f2667fb17b 100644 --- a/src/MOFFF/angle_class2_p6.cpp +++ b/src/MOFFF/angle_class2_p6.cpp @@ -487,3 +487,19 @@ double AngleClass2P6::single(int type, int i1, int i2, int i3) return energy; } + +/* ---------------------------------------------------------------------- + return ptr to internal members upon request +------------------------------------------------------------------------ */ + +void *AngleClass2P6::extract(const char *str, int &dim) +{ + dim = 1; + if (strcmp(str, "k2") == 0) return (void *) k2; + if (strcmp(str, "k3") == 0) return (void *) k3; + if (strcmp(str, "k4") == 0) return (void *) k4; + if (strcmp(str, "k5") == 0) return (void *) k5; + if (strcmp(str, "k6") == 0) return (void *) k6; + if (strcmp(str, "theta0") == 0) return (void *) theta0; + return nullptr; +} diff --git a/src/MOFFF/angle_class2_p6.h b/src/MOFFF/angle_class2_p6.h index 13c164e9be..da55eb2e8e 100644 --- a/src/MOFFF/angle_class2_p6.h +++ b/src/MOFFF/angle_class2_p6.h @@ -35,6 +35,7 @@ class AngleClass2P6 : public Angle { void read_restart(FILE *) override; void write_data(FILE *) override; double single(int, int, int, int) override; + void *extract(const char *, int &) override; protected: double *theta0, *k2, *k3, *k4, *k5, *k6; diff --git a/src/MOFFF/angle_cosine_buck6d.cpp b/src/MOFFF/angle_cosine_buck6d.cpp index 0ab9cbbf1f..e1f5f54bf6 100644 --- a/src/MOFFF/angle_cosine_buck6d.cpp +++ b/src/MOFFF/angle_cosine_buck6d.cpp @@ -383,3 +383,16 @@ double AngleCosineBuck6d::single(int type, int i1, int i2, int i3) return k[type]*(1.0+cos(tk)); } + +/* ---------------------------------------------------------------------- + return ptr to internal members upon request +------------------------------------------------------------------------ */ + +void *AngleCosineBuck6d::extract(const char *str, int &dim) +{ + dim = 1; + if (strcmp(str, "k") == 0) return (void *) k; + if (strcmp(str, "multiplicity") == 0) return (void *) multiplicity; + if (strcmp(str, "th0") == 0) return (void *) th0; + return nullptr; +} diff --git a/src/MOFFF/angle_cosine_buck6d.h b/src/MOFFF/angle_cosine_buck6d.h index 4821d4c1c9..b68f5c9046 100644 --- a/src/MOFFF/angle_cosine_buck6d.h +++ b/src/MOFFF/angle_cosine_buck6d.h @@ -36,6 +36,7 @@ class AngleCosineBuck6d : public Angle { void read_restart(FILE *) override; void write_data(FILE *) override; double single(int, int, int, int) override; + void *extract(const char *, int &) override; protected: double *k, *th0; diff --git a/src/MOLECULE/bond_morse.cpp b/src/MOLECULE/bond_morse.cpp index b7020b0441..b0e19c359c 100644 --- a/src/MOLECULE/bond_morse.cpp +++ b/src/MOLECULE/bond_morse.cpp @@ -227,6 +227,8 @@ void BondMorse::born_matrix(int type, double rsq, int /*i*/, int /*j*/, double & void *BondMorse::extract(const char *str, int &dim) { dim = 1; + if (strcmp(str, "d0") == 0) return (void *) d0; + if (strcmp(str, "alpha") == 0) return (void *) alpha; if (strcmp(str, "r0") == 0) return (void *) r0; return nullptr; } diff --git a/src/MOLECULE/fix_cmap.cpp b/src/MOLECULE/fix_cmap.cpp index 631dfe7b4b..02116965b5 100644 --- a/src/MOLECULE/fix_cmap.cpp +++ b/src/MOLECULE/fix_cmap.cpp @@ -127,6 +127,9 @@ FixCMAP::FixCMAP(LAMMPS *lmp, int narg, char **arg) : FixCMAP::~FixCMAP() { + + if (copymode) return; + // unregister callbacks to this fix from Atom class atom->delete_callback(id,Atom::GROW); @@ -413,8 +416,6 @@ void FixCMAP::post_force(int vflag) r43 = sqrt(vb43x*vb43x + vb43y*vb43y + vb43z*vb43z); a2sq = a2x*a2x + a2y*a2y + a2z*a2z; b2sq = b2x*b2x + b2y*b2y + b2z*b2z; - //if (a1sq<0.0001 || b1sq<0.0001 || a2sq<0.0001 || b2sq<0.0001) - // printf("a1sq b1sq a2sq b2sq: %f %f %f %f \n",a1sq,b1sq,a2sq,b2sq); if (a1sq<0.0001 || b1sq<0.0001 || a2sq<0.0001 || b2sq<0.0001) continue; dpr21r32 = vb21x*vb32x + vb21y*vb32y + vb21z*vb32z; dpr34r32 = vb34x*vb32x + vb34y*vb32y + vb34z*vb32z; diff --git a/src/MOLECULE/fix_cmap.h b/src/MOLECULE/fix_cmap.h index 1c6aba95e0..856dc06852 100644 --- a/src/MOLECULE/fix_cmap.h +++ b/src/MOLECULE/fix_cmap.h @@ -64,7 +64,7 @@ class FixCMAP : public Fix { double memory_usage() override; - private: + protected: int eflag_caller; int ctype, ilevel_respa; int ncrosstermtypes, crossterm_per_atom, maxcrossterm; diff --git a/src/OPENMP/pair_reaxff_omp.cpp b/src/OPENMP/pair_reaxff_omp.cpp index 96e6389870..85369cc7bf 100644 --- a/src/OPENMP/pair_reaxff_omp.cpp +++ b/src/OPENMP/pair_reaxff_omp.cpp @@ -106,7 +106,9 @@ void PairReaxFFOMP::init_style() auto acks2_fixes = modify->get_fix_by_style("^acks2/reax"); int have_qeq = modify->get_fix_by_style("^qeq/reax").size() - + modify->get_fix_by_style("^qeq/shielded").size() + acks2_fixes.size(); + + modify->get_fix_by_style("^qeq/shielded").size() + acks2_fixes.size() + + modify->get_fix_by_style("^qtpie/reax").size(); + if (qeqflag && (have_qeq != 1)) error->all(FLERR,"Pair style reaxff/omp requires use of exactly one of the " diff --git a/src/PHONON/fix_phonon.cpp b/src/PHONON/fix_phonon.cpp index 786931a549..477898a305 100644 --- a/src/PHONON/fix_phonon.cpp +++ b/src/PHONON/fix_phonon.cpp @@ -400,7 +400,7 @@ void FixPhonon::end_of_step() ndim = sysdim; for (i = 1; i < nucell; ++i) { for (idim = 0; idim < sysdim; ++idim) dist2orig[idim] = Rnow[idx][ndim++] - Rnow[idx][idim]; - domain->minimum_image(dist2orig); + domain->minimum_image_big(dist2orig); for (idim = 0; idim < sysdim; ++idim) basis[i][idim] += dist2orig[idim]; } } diff --git a/src/REAXFF/fix_qeq_reaxff.cpp b/src/REAXFF/fix_qeq_reaxff.cpp index 921f6e0261..dc8fbd5afd 100644 --- a/src/REAXFF/fix_qeq_reaxff.cpp +++ b/src/REAXFF/fix_qeq_reaxff.cpp @@ -344,7 +344,7 @@ void FixQEqReaxFF::allocate_matrix() int mincap; double safezone; - if (reaxflag) { + if (reaxflag && reaxff) { mincap = reaxff->api->system->mincap; safezone = reaxff->api->system->safezone; } else { @@ -1158,7 +1158,7 @@ void FixQEqReaxFF::get_chi_field() for (int i = 0; i < nlocal; i++) { if (mask[i] & efgroupbit) { if (region && !region->match(x[i][0],x[i][1],x[i][2])) continue; - chi_field[i] = -efield->efield[i][3]; + chi_field[i] = efield->efield[i][3]; } } } diff --git a/src/REAXFF/fix_qtpie_reaxff.cpp b/src/REAXFF/fix_qtpie_reaxff.cpp new file mode 100644 index 0000000000..2f3f37d987 --- /dev/null +++ b/src/REAXFF/fix_qtpie_reaxff.cpp @@ -0,0 +1,1193 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: + Efstratios M Kritikos, California Institute of Technology + (Implemented original version in LAMMMPS Aug 2019) + Navraj S Lalli, Imperial College London + (Reimplemented QTPIE as a new fix in LAMMPS Aug 2024 and extended functionality) +------------------------------------------------------------------------- */ + +#include "fix_qtpie_reaxff.h" + +#include "atom.h" +#include "comm.h" +#include "domain.h" +#include "error.h" +#include "fix_efield.h" +#include "force.h" +#include "group.h" +#include "modify.h" +#include "neigh_list.h" +#include "neighbor.h" +#include "pair.h" +#include "region.h" +#include "respa.h" +#include "text_file_reader.h" +#include "update.h" + +#include "pair_reaxff.h" +#include "reaxff_api.h" + +#include +#include +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +static constexpr double CONV_TO_EV = 14.4; +static constexpr double QSUMSMALL = 0.00001; +static constexpr double ANGSTROM_TO_BOHRRADIUS = 1.8897261259; + +/* ---------------------------------------------------------------------- */ + +FixQtpieReaxFF::FixQtpieReaxFF(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), matvecs(0), pertype_option(nullptr), gauss_file(nullptr) +{ + // this fix returns a global scalar (the number of iterations) + scalar_flag = 1; + extscalar = 0; + + // this fix returns a per-atom vector (the effective electronegativity) + peratom_flag = 1; + size_peratom_cols = 0; + + imax = 200; + maxwarn = 1; + + if ((narg < 9) || (narg > 12)) error->all(FLERR,"Illegal fix {} command", style); + + nevery = utils::inumeric(FLERR,arg[3],false,lmp); + if (nevery <= 0) error->all(FLERR,"Illegal fix {} command", style); + + swa = utils::numeric(FLERR,arg[4],false,lmp); + swb = utils::numeric(FLERR,arg[5],false,lmp); + tolerance = utils::numeric(FLERR,arg[6],false,lmp); + pertype_option = utils::strdup(arg[7]); + gauss_file = utils::strdup(arg[8]); + + int iarg = 9; + while (iarg < narg) { + if (strcmp(arg[iarg],"nowarn") == 0) maxwarn = 0; + else if (strcmp(arg[iarg],"maxiter") == 0) { + if (iarg+1 > narg-1) + error->all(FLERR,"Illegal fix {} command", style); + imax = utils::numeric(FLERR,arg[iarg+1],false,lmp); + iarg++; + } else error->all(FLERR,"Illegal fix {} command", style); + iarg++; + } + shld = nullptr; + + nn = nt = n_cap = 0; + nmax = 0; + m_fill = m_cap = 0; + pack_flag = 0; + s = nullptr; + t = nullptr; + nprev = 4; + + Hdia_inv = nullptr; + b_s = nullptr; + chi_eff = nullptr; + b_t = nullptr; + b_prc = nullptr; + b_prm = nullptr; + + // CG + + p = nullptr; + q = nullptr; + r = nullptr; + d = nullptr; + + // H matrix + + H.firstnbr = nullptr; + H.numnbrs = nullptr; + H.jlist = nullptr; + H.val = nullptr; + + comm_forward = comm_reverse = 1; + + // perform initial allocation of atom-based arrays + // register with Atom class + + reaxff = dynamic_cast(force->pair_match("^reaxff",0)); + + s_hist = t_hist = nullptr; + atom->add_callback(Atom::GROW); +} + +/* ---------------------------------------------------------------------- */ + +FixQtpieReaxFF::~FixQtpieReaxFF() +{ + if (copymode) return; + + delete[] pertype_option; + delete[] gauss_file; + + // unregister callbacks to this fix from Atom class + + atom->delete_callback(id,Atom::GROW); + + memory->destroy(s_hist); + memory->destroy(t_hist); + + FixQtpieReaxFF::deallocate_storage(); + FixQtpieReaxFF::deallocate_matrix(); + + memory->destroy(shld); + + memory->destroy(gauss_exp); + if (!reaxflag) { + memory->destroy(chi); + memory->destroy(eta); + memory->destroy(gamma); + } +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::post_constructor() +{ + grow_arrays(atom->nmax); + for (int i = 0; i < atom->nmax; i++) + for (int j = 0; j < nprev; ++j) + s_hist[i][j] = t_hist[i][j] = 0; + + pertype_parameters(pertype_option); +} + +/* ---------------------------------------------------------------------- */ + +int FixQtpieReaxFF::setmask() +{ + int mask = 0; + mask |= PRE_FORCE; + mask |= PRE_FORCE_RESPA; + mask |= MIN_PRE_FORCE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::pertype_parameters(char *arg) +{ + const int nlocal = atom->nlocal; + const int *mask = atom->mask; + const int *type = atom->type; + const int ntypes = atom->ntypes; + + // read gaussian orbital exponents + memory->create(gauss_exp,ntypes+1,"qtpie/reaxff:gauss_exp"); + if (comm->me == 0) { + gauss_exp[0] = 0.0; + try { + FILE *fp = utils::open_potential(gauss_file, lmp, nullptr); + if (!fp) throw TokenizerException("Fix qtpie/reaxff: could not open gauss file", gauss_file); + TextFileReader reader(fp,"qtpie/reaxff gaussian exponents"); + reader.ignore_comments = true; + for (int i = 1; i <= ntypes; i++) { + const char *line = reader.next_line(); + if (!line) + throw TokenizerException("Fix qtpie/reaxff: Incorrect number of atom types in gauss file",""); + ValueTokenizer values(line); + + if (values.count() != 2) + throw TokenizerException("Fix qtpie/reaxff: Incorrect number of values per line " + "in gauss file",std::to_string(values.count())); + + int itype = values.next_int(); + if ((itype < 1) || (itype > ntypes)) + throw TokenizerException("Fix qtpie/reaxff: Invalid atom type in gauss file", + std::to_string(itype)); + + double exp = values.next_double(); + if (exp < 0) + throw TokenizerException("Fix qtpie/reaxff: Invalid orbital exponent in gauss file", + std::to_string(exp)); + gauss_exp[itype] = exp; + } + } catch (std::exception &e) { + error->one(FLERR,e.what()); + } + } + + MPI_Bcast(gauss_exp,ntypes+1,MPI_DOUBLE,0,world); + + // define a cutoff distance (in atomic units) beyond which overlap integrals are neglected + // in calc_chi_eff() + const double exp_min = find_min_exp(gauss_exp,ntypes+1); + const int olap_cut = 10; // overlap integrals are neglected if less than pow(10,-olap_cut) + dist_cutoff = sqrt(2*olap_cut/exp_min*log(10.0)); + + // read chi, eta and gamma + + if (utils::strmatch(arg,"^reaxff")) { + reaxflag = 1; + Pair *pair = force->pair_match("^reaxff",0); + if (!pair) error->all(FLERR,"No reaxff pair style for fix qtpie/reaxff"); + + int tmp, tmp_all; + chi = (double *) pair->extract("chi",tmp); + eta = (double *) pair->extract("eta",tmp); + gamma = (double *) pair->extract("gamma",tmp); + if ((chi == nullptr) || (eta == nullptr) || (gamma == nullptr)) + error->all(FLERR, "Fix qtpie/reaxff could not extract qtpie parameters from pair reaxff"); + tmp = tmp_all = 0; + for (int i = 0; i < nlocal; ++i) { + if (mask[i] & groupbit) { + if ((chi[type[i]] == 0.0) && (eta[type[i]] == 0.0) && (gamma[type[i]] == 0.0)) + tmp = type[i]; + } + } + MPI_Allreduce(&tmp, &tmp_all, 1, MPI_INT, MPI_MAX, world); + if (tmp_all) + error->all(FLERR, "No qtpie parameters for atom type {} provided by pair reaxff", tmp_all); + return; + } else if (utils::strmatch(arg,"^reax/c")) { + error->all(FLERR, "Fix qtpie/reaxff keyword 'reax/c' is obsolete; please use 'reaxff'"); + } else if (platform::file_is_readable(arg)) { + ; // arg is readable file. will read below + } else { + error->all(FLERR, "Unknown fix qtpie/reaxff keyword {}", arg); + } + + reaxflag = 0; + + memory->create(chi,ntypes+1,"qtpie/reaxff:chi"); + memory->create(eta,ntypes+1,"qtpie/reaxff:eta"); + memory->create(gamma,ntypes+1,"qtpie/reaxff:gamma"); + + if (comm->me == 0) { + chi[0] = eta[0] = gamma[0] = 0.0; + try { + TextFileReader reader(arg,"qtpie/reaxff parameter"); + reader.ignore_comments = false; + for (int i = 1; i <= ntypes; i++) { + const char *line = reader.next_line(); + if (!line) + throw TokenizerException("Fix qtpie/reaxff: Invalid param file format",""); + ValueTokenizer values(line); + + if (values.count() != 4) + throw TokenizerException("Fix qtpie/reaxff: Incorrect format of param file",""); + + int itype = values.next_int(); + if ((itype < 1) || (itype > ntypes)) + throw TokenizerException("Fix qtpie/reaxff: Invalid atom type in param file", + std::to_string(itype)); + + chi[itype] = values.next_double(); + eta[itype] = values.next_double(); + gamma[itype] = values.next_double(); + } + } catch (std::exception &e) { + error->one(FLERR,e.what()); + } + } + + MPI_Bcast(chi,ntypes+1,MPI_DOUBLE,0,world); + MPI_Bcast(eta,ntypes+1,MPI_DOUBLE,0,world); + MPI_Bcast(gamma,ntypes+1,MPI_DOUBLE,0,world); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::allocate_storage() +{ + nmax = atom->nmax; + + memory->create(s,nmax,"qtpie:s"); + memory->create(t,nmax,"qtpie:t"); + + memory->create(Hdia_inv,nmax,"qtpie:Hdia_inv"); + memory->create(b_s,nmax,"qtpie:b_s"); + memory->create(chi_eff,nmax,"qtpie:chi_eff"); + vector_atom = chi_eff; + memory->create(b_t,nmax,"qtpie:b_t"); + memory->create(b_prc,nmax,"qtpie:b_prc"); + memory->create(b_prm,nmax,"qtpie:b_prm"); + + int size = nmax; + + memory->create(p,size,"qtpie:p"); + memory->create(q,size,"qtpie:q"); + memory->create(r,size,"qtpie:r"); + memory->create(d,size,"qtpie:d"); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::deallocate_storage() +{ + memory->destroy(s); + memory->destroy(t); + + memory->destroy(Hdia_inv); + memory->destroy(b_s); + memory->destroy(b_t); + memory->destroy(b_prc); + memory->destroy(b_prm); + memory->destroy(chi_eff); + + memory->destroy(p); + memory->destroy(q); + memory->destroy(r); + memory->destroy(d); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::reallocate_storage() +{ + deallocate_storage(); + allocate_storage(); + init_storage(); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::allocate_matrix() +{ + int i,ii; + bigint m; + + int mincap; + double safezone; + + if (reaxflag && reaxff) { + mincap = reaxff->api->system->mincap; + safezone = reaxff->api->system->safezone; + } else { + mincap = REAX_MIN_CAP; + safezone = REAX_SAFE_ZONE; + } + + n_cap = MAX((int)(atom->nlocal * safezone), mincap); + + // determine the total space for the H matrix + + m = 0; + for (ii = 0; ii < nn; ii++) { + i = ilist[ii]; + m += numneigh[i]; + } + bigint m_cap_big = (bigint)MAX(m * safezone, mincap * REAX_MIN_NBRS); + if (m_cap_big > MAXSMALLINT) + error->one(FLERR,"Too many neighbors in fix {}",style); + m_cap = m_cap_big; + + H.n = n_cap; + H.m = m_cap; + memory->create(H.firstnbr,n_cap,"qtpie:H.firstnbr"); + memory->create(H.numnbrs,n_cap,"qtpie:H.numnbrs"); + memory->create(H.jlist,m_cap,"qtpie:H.jlist"); + memory->create(H.val,m_cap,"qtpie:H.val"); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::deallocate_matrix() +{ + memory->destroy(H.firstnbr); + memory->destroy(H.numnbrs); + memory->destroy(H.jlist); + memory->destroy(H.val); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::reallocate_matrix() +{ + deallocate_matrix(); + allocate_matrix(); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::init() +{ + if (!atom->q_flag) + error->all(FLERR,"Fix {} requires atom attribute q", style); + + if (group->count(igroup) == 0) + error->all(FLERR,"Fix {} group has no atoms", style); + + // compute net charge and print warning if too large + double qsum_local = 0.0, qsum = 0.0; + for (int i = 0; i < atom->nlocal; i++) { + if (atom->mask[i] & groupbit) + qsum_local += atom->q[i]; + } + MPI_Allreduce(&qsum_local,&qsum,1,MPI_DOUBLE,MPI_SUM,world); + + if ((comm->me == 0) && (fabs(qsum) > QSUMSMALL)) + error->warning(FLERR,"Fix {} group is not charge neutral, net charge = {:.8}", style, qsum); + + // get pointer to fix efield if present. there may be at most one instance of fix efield in use. + efield = nullptr; + auto fixes = modify->get_fix_by_style("^efield"); + if (fixes.size() == 1) efield = dynamic_cast(fixes.front()); + else if (fixes.size() > 1) + error->all(FLERR, "There may be only one fix efield instance used with fix {}", style); + + // ensure that fix efield is properly initialized before accessing its data and check some settings + if (efield) { + efield->init(); + if (strcmp(update->unit_style,"real") != 0) + error->all(FLERR,"Must use unit_style real with fix {} and external fields", style); + + if (efield->groupbit != 1){ // if efield is not applied to all atoms + error->all(FLERR,"Must use group id all for fix efield when using fix {}", style); + } + + if (efield->region){ // if efield is not applied to all atoms + error->all(FLERR,"Keyword region not supported for fix efield when using fix {}", style); + } + + if (efield->varflag == FixEfield::ATOM && efield->pstyle != FixEfield::ATOM) + error->all(FLERR,"Atom-style external electric field requires atom-style " + "potential variable when used with fix {}", style); + } + + // we need a half neighbor list w/ Newton off + // built whenever re-neighboring occurs + + neighbor->add_request(this, NeighConst::REQ_NEWTON_OFF); + + init_shielding(); + init_taper(); + + if (utils::strmatch(update->integrate_style,"^respa")) + nlevels_respa = (dynamic_cast(update->integrate))->nlevels; +} + +/* ---------------------------------------------------------------------- */ + +double FixQtpieReaxFF::compute_scalar() +{ + return matvecs/2.0; +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::init_list(int /*id*/, NeighList *ptr) +{ + list = ptr; +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::init_shielding() +{ + int i,j; + int ntypes; + + ntypes = atom->ntypes; + if (shld == nullptr) + memory->create(shld,ntypes+1,ntypes+1,"qtpie:shielding"); + + for (i = 1; i <= ntypes; ++i) + for (j = 1; j <= ntypes; ++j) + shld[i][j] = pow(gamma[i] * gamma[j], -1.5); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::init_taper() +{ + double d7, swa2, swa3, swb2, swb3; + + if (fabs(swa) > 0.01 && comm->me == 0) + error->warning(FLERR,"Fix qtpie/reaxff has non-zero lower Taper radius cutoff"); + if (swb < 0) + error->all(FLERR, "Fix qtpie/reaxff has negative upper Taper radius cutoff"); + else if (swb < 5 && comm->me == 0) + error->warning(FLERR,"Fix qtpie/reaxff has very low Taper radius cutoff"); + + d7 = pow(swb - swa, 7); + swa2 = SQR(swa); + swa3 = CUBE(swa); + swb2 = SQR(swb); + swb3 = CUBE(swb); + + Tap[7] = 20.0 / d7; + Tap[6] = -70.0 * (swa + swb) / d7; + Tap[5] = 84.0 * (swa2 + 3.0*swa*swb + swb2) / d7; + Tap[4] = -35.0 * (swa3 + 9.0*swa2*swb + 9.0*swa*swb2 + swb3) / d7; + Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3) / d7; + Tap[2] =-210.0 * (swa3*swb2 + swa2*swb3) / d7; + Tap[1] = 140.0 * swa3 * swb3 / d7; + Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - + 7.0*swa*swb3*swb3 + swb3*swb3*swb) / d7; +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::setup_pre_force(int vflag) +{ + if (reaxff) { + nn = reaxff->list->inum; + nt = reaxff->list->inum + reaxff->list->gnum; + ilist = reaxff->list->ilist; + numneigh = reaxff->list->numneigh; + firstneigh = reaxff->list->firstneigh; + } else { + nn = list->inum; + nt = list->inum + list->gnum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + } + + deallocate_storage(); + allocate_storage(); + + init_storage(); + + deallocate_matrix(); + allocate_matrix(); + + pre_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::setup_pre_force_respa(int vflag, int ilevel) +{ + if (ilevel < nlevels_respa-1) return; + setup_pre_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::min_setup_pre_force(int vflag) +{ + setup_pre_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::init_storage() +{ + calc_chi_eff(); + + for (int ii = 0; ii < nn; ii++) { + int i = ilist[ii]; + if (atom->mask[i] & groupbit) { + Hdia_inv[i] = 1. / eta[atom->type[i]]; + b_s[i] = -chi_eff[i]; + b_t[i] = -1.0; + b_prc[i] = 0; + b_prm[i] = 0; + s[i] = t[i] = 0; + } + } +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::pre_force(int /*vflag*/) +{ + if (update->ntimestep % nevery) return; + + int n = atom->nlocal; + + if (reaxff) { + nn = reaxff->list->inum; + nt = reaxff->list->inum + reaxff->list->gnum; + ilist = reaxff->list->ilist; + numneigh = reaxff->list->numneigh; + firstneigh = reaxff->list->firstneigh; + } else { + nn = list->inum; + nt = list->inum + list->gnum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + } + + // grow arrays if necessary + // need to be atom->nmax in length + + if (atom->nmax > nmax) reallocate_storage(); + if (n > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE) + reallocate_matrix(); + + calc_chi_eff(); + + init_matvec(); + + matvecs_s = CG(b_s, s); // CG on s - parallel + matvecs_t = CG(b_t, t); // CG on t - parallel + matvecs = matvecs_s + matvecs_t; + + calculate_Q(); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::pre_force_respa(int vflag, int ilevel, int /*iloop*/) +{ + if (ilevel == nlevels_respa-1) pre_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::min_pre_force(int vflag) +{ + pre_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::init_matvec() +{ + /* fill-in H matrix */ + compute_H(); + + int ii, i; + + for (ii = 0; ii < nn; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + + /* init pre-conditioner for H and init solution vectors */ + Hdia_inv[i] = 1. / eta[atom->type[i]]; + b_s[i] = -chi_eff[i]; + b_t[i] = -1.0; + + /* quadratic extrapolation for s & t from previous solutions */ + t[i] = t_hist[i][2] + 3 * (t_hist[i][0] - t_hist[i][1]); + + /* cubic extrapolation for s & t from previous solutions */ + s[i] = 4*(s_hist[i][0]+s_hist[i][2])-(6*s_hist[i][1]+s_hist[i][3]); + } + } + + pack_flag = 2; + comm->forward_comm(this); //Dist_vector(s); + pack_flag = 3; + comm->forward_comm(this); //Dist_vector(t); +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::compute_H() +{ + int jnum; + int i, j, ii, jj, flag; + double dx, dy, dz, r_sqr; + constexpr double EPSILON = 0.0001; + + int *type = atom->type; + tagint *tag = atom->tag; + double **x = atom->x; + int *mask = atom->mask; + + // fill in the H matrix + m_fill = 0; + r_sqr = 0; + for (ii = 0; ii < nn; ii++) { + i = ilist[ii]; + if (mask[i] & groupbit) { + jlist = firstneigh[i]; + jnum = numneigh[i]; + H.firstnbr[i] = m_fill; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + dx = x[j][0] - x[i][0]; + dy = x[j][1] - x[i][1]; + dz = x[j][2] - x[i][2]; + r_sqr = SQR(dx) + SQR(dy) + SQR(dz); + + flag = 0; + if (r_sqr <= SQR(swb)) { + if (j < atom->nlocal) flag = 1; + else if (tag[i] < tag[j]) flag = 1; + else if (tag[i] == tag[j]) { + if (dz > EPSILON) flag = 1; + else if (fabs(dz) < EPSILON) { + if (dy > EPSILON) flag = 1; + else if (fabs(dy) < EPSILON && dx > EPSILON) + flag = 1; + } + } + } + + if (flag) { + H.jlist[m_fill] = j; + H.val[m_fill] = calculate_H(sqrt(r_sqr), shld[type[i]][type[j]]); + m_fill++; + } + } + H.numnbrs[i] = m_fill - H.firstnbr[i]; + } + } + + if (m_fill >= H.m) + error->all(FLERR,"Fix qtpie/reaxff H matrix size has been exceeded: m_fill={} H.m={}\n", + m_fill, H.m); +} + +/* ---------------------------------------------------------------------- */ + +double FixQtpieReaxFF::calculate_H(double r, double gamma) +{ + double Taper, denom; + + Taper = Tap[7] * r + Tap[6]; + Taper = Taper * r + Tap[5]; + Taper = Taper * r + Tap[4]; + Taper = Taper * r + Tap[3]; + Taper = Taper * r + Tap[2]; + Taper = Taper * r + Tap[1]; + Taper = Taper * r + Tap[0]; + + denom = r * r * r + gamma; + denom = pow(denom,1.0/3.0); + + return Taper * CONV_TO_EV / denom; +} + +/* ---------------------------------------------------------------------- */ + +int FixQtpieReaxFF::CG(double *b, double *x) +{ + int i, j; + double tmp, alpha, beta, b_norm; + double sig_old, sig_new; + + int jj; + + pack_flag = 1; + sparse_matvec(&H, x, q); + comm->reverse_comm(this); //Coll_Vector(q); + + vector_sum(r , 1., b, -1., q, nn); + + for (jj = 0; jj < nn; ++jj) { + j = ilist[jj]; + if (atom->mask[j] & groupbit) + d[j] = r[j] * Hdia_inv[j]; //pre-condition + } + + b_norm = parallel_norm(b, nn); + sig_new = parallel_dot(r, d, nn); + + for (i = 1; i < imax && sqrt(sig_new) / b_norm > tolerance; ++i) { + comm->forward_comm(this); //Dist_vector(d); + sparse_matvec(&H, d, q); + comm->reverse_comm(this); //Coll_vector(q); + + tmp = parallel_dot(d, q, nn); + alpha = sig_new / tmp; + + vector_add(x, alpha, d, nn); + vector_add(r, -alpha, q, nn); + + // pre-conditioning + for (jj = 0; jj < nn; ++jj) { + j = ilist[jj]; + if (atom->mask[j] & groupbit) + p[j] = r[j] * Hdia_inv[j]; + } + + sig_old = sig_new; + sig_new = parallel_dot(r, p, nn); + + beta = sig_new / sig_old; + vector_sum(d, 1., p, beta, d, nn); + } + + if ((i >= imax) && maxwarn && (comm->me == 0)) + error->warning(FLERR, "Fix qtpie/reaxff CG convergence failed after {} iterations at step {}", + i,update->ntimestep); + return i; +} + + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::sparse_matvec(sparse_matrix *A, double *x, double *b) +{ + int i, j, itr_j; + int ii; + + for (ii = 0; ii < nn; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) + b[i] = eta[atom->type[i]] * x[i]; + } + + int nall = atom->nlocal + atom->nghost; + for (i = atom->nlocal; i < nall; ++i) + b[i] = 0; + + for (ii = 0; ii < nn; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + for (itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { + j = A->jlist[itr_j]; + b[i] += A->val[itr_j] * x[j]; + b[j] += A->val[itr_j] * x[i]; + } + } + } + +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::calculate_Q() +{ + int i, k; + double u, s_sum, t_sum; + double *q = atom->q; + + int ii; + + s_sum = parallel_vector_acc(s, nn); + t_sum = parallel_vector_acc(t, nn); + u = s_sum / t_sum; + + for (ii = 0; ii < nn; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) { + q[i] = s[i] - u * t[i]; + + /* backup s & t */ + for (k = nprev-1; k > 0; --k) { + s_hist[i][k] = s_hist[i][k-1]; + t_hist[i][k] = t_hist[i][k-1]; + } + s_hist[i][0] = s[i]; + t_hist[i][0] = t[i]; + } + } + + pack_flag = 4; + comm->forward_comm(this); //Dist_vector(atom->q); +} + +/* ---------------------------------------------------------------------- */ + +int FixQtpieReaxFF::pack_forward_comm(int n, int *list, double *buf, + int /*pbc_flag*/, int * /*pbc*/) +{ + int m; + + if (pack_flag == 1) + for (m = 0; m < n; m++) buf[m] = d[list[m]]; + else if (pack_flag == 2) + for (m = 0; m < n; m++) buf[m] = s[list[m]]; + else if (pack_flag == 3) + for (m = 0; m < n; m++) buf[m] = t[list[m]]; + else if (pack_flag == 4) + for (m = 0; m < n; m++) buf[m] = atom->q[list[m]]; + return n; +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::unpack_forward_comm(int n, int first, double *buf) +{ + int i, m; + + if (pack_flag == 1) + for (m = 0, i = first; m < n; m++, i++) d[i] = buf[m]; + else if (pack_flag == 2) + for (m = 0, i = first; m < n; m++, i++) s[i] = buf[m]; + else if (pack_flag == 3) + for (m = 0, i = first; m < n; m++, i++) t[i] = buf[m]; + else if (pack_flag == 4) + for (m = 0, i = first; m < n; m++, i++) atom->q[i] = buf[m]; +} + +/* ---------------------------------------------------------------------- */ + +int FixQtpieReaxFF::pack_reverse_comm(int n, int first, double *buf) +{ + int i, m; + for (m = 0, i = first; m < n; m++, i++) buf[m] = q[i]; + return n; +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::unpack_reverse_comm(int n, int *list, double *buf) +{ + for (int m = 0; m < n; m++) q[list[m]] += buf[m]; +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based arrays +------------------------------------------------------------------------- */ + +double FixQtpieReaxFF::memory_usage() +{ + double bytes; + + bytes = (double)atom->nmax*nprev*2 * sizeof(double); // s_hist & t_hist + bytes += (double)atom->nmax*11 * sizeof(double); // storage + bytes += (double)n_cap*2 * sizeof(int); // matrix... + bytes += (double)m_cap * sizeof(int); + bytes += (double)m_cap * sizeof(double); + + return bytes; +} + +/* ---------------------------------------------------------------------- + allocate fictitious charge arrays +------------------------------------------------------------------------- */ + +void FixQtpieReaxFF::grow_arrays(int nmax) +{ + memory->grow(s_hist,nmax,nprev,"qtpie:s_hist"); + memory->grow(t_hist,nmax,nprev,"qtpie:t_hist"); +} + +/* ---------------------------------------------------------------------- + copy values within fictitious charge arrays +------------------------------------------------------------------------- */ + +void FixQtpieReaxFF::copy_arrays(int i, int j, int /*delflag*/) +{ + for (int m = 0; m < nprev; m++) { + s_hist[j][m] = s_hist[i][m]; + t_hist[j][m] = t_hist[i][m]; + } +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based array for exchange with another proc +------------------------------------------------------------------------- */ + +int FixQtpieReaxFF::pack_exchange(int i, double *buf) +{ + for (int m = 0; m < nprev; m++) buf[m] = s_hist[i][m]; + for (int m = 0; m < nprev; m++) buf[nprev+m] = t_hist[i][m]; + return nprev*2; +} + +/* ---------------------------------------------------------------------- + unpack values in local atom-based array from exchange with another proc +------------------------------------------------------------------------- */ + +int FixQtpieReaxFF::unpack_exchange(int nlocal, double *buf) +{ + for (int m = 0; m < nprev; m++) s_hist[nlocal][m] = buf[m]; + for (int m = 0; m < nprev; m++) t_hist[nlocal][m] = buf[nprev+m]; + return nprev*2; +} + +/* ---------------------------------------------------------------------- */ + +double FixQtpieReaxFF::parallel_norm(double *v, int n) +{ + int i; + double my_sum, norm_sqr; + + int ii; + + my_sum = 0.0; + norm_sqr = 0.0; + for (ii = 0; ii < n; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) + my_sum += SQR(v[i]); + } + + MPI_Allreduce(&my_sum, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world); + + return sqrt(norm_sqr); +} + +/* ---------------------------------------------------------------------- */ + +double FixQtpieReaxFF::parallel_dot(double *v1, double *v2, int n) +{ + int i; + double my_dot, res; + + int ii; + + my_dot = 0.0; + res = 0.0; + for (ii = 0; ii < n; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) + my_dot += v1[i] * v2[i]; + } + + MPI_Allreduce(&my_dot, &res, 1, MPI_DOUBLE, MPI_SUM, world); + + return res; +} + +/* ---------------------------------------------------------------------- */ + +double FixQtpieReaxFF::parallel_vector_acc(double *v, int n) +{ + int i; + double my_acc, res; + + int ii; + + my_acc = 0.0; + res = 0.0; + for (ii = 0; ii < n; ++ii) { + i = ilist[ii]; + if (atom->mask[i] & groupbit) + my_acc += v[i]; + } + + MPI_Allreduce(&my_acc, &res, 1, MPI_DOUBLE, MPI_SUM, world); + + return res; +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::vector_sum(double* dest, double c, double* v, + double d, double* y, int k) +{ + int kk; + + for (--k; k>=0; --k) { + kk = ilist[k]; + if (atom->mask[kk] & groupbit) + dest[kk] = c * v[kk] + d * y[kk]; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::vector_add(double* dest, double c, double* v, int k) +{ + int kk; + + for (--k; k>=0; --k) { + kk = ilist[k]; + if (atom->mask[kk] & groupbit) + dest[kk] += c * v[kk]; + } +} + +/* ---------------------------------------------------------------------- */ + +void FixQtpieReaxFF::calc_chi_eff() +{ + memset(&chi_eff[0],0,atom->nmax*sizeof(double)); + + const auto x = (const double * const *)atom->x; + const int *type = atom->type; + + double dist,overlap,sum_n,sum_d,expa,expb,chia,chib,phia,phib,p,m; + int i,j; + + // check ghost atoms are stored up to the distance cutoff for overlap integrals + const double comm_cutoff = MAX(neighbor->cutneighmax,comm->cutghostuser); + if(comm_cutoff < dist_cutoff/ANGSTROM_TO_BOHRRADIUS) { + error->all(FLERR,"comm cutoff = {} Angstrom is smaller than distance cutoff = {} Angstrom " + "for overlap integrals in {}. Increase comm cutoff with comm_modify", + comm_cutoff, dist_cutoff/ANGSTROM_TO_BOHRRADIUS, style); + } + + // efield energy is in real units of kcal/mol, factor needed for conversion to eV + const double qe2f = force->qe2f; + const double factor = 1.0/qe2f; + + if (efield) { + if (efield->varflag != FixEfield::CONSTANT) + efield->update_efield_variables(); + } + + // compute chi_eff for each local atom + for (i = 0; i < nn; i++) { + expa = gauss_exp[type[i]]; + chia = chi[type[i]]; + if (efield) { + if (efield->varflag != FixEfield::ATOM) { + phia = -factor*(x[i][0]*efield->ex + x[i][1]*efield->ey + x[i][2]*efield->ez); + } else { // atom-style potential from FixEfield + phia = efield->efield[i][3]; + } + } + + sum_n = 0.0; + sum_d = 0.0; + + for (j = 0; j < nt; j++) { + dist = distance(x[i],x[j])*ANGSTROM_TO_BOHRRADIUS; // in atomic units + + if (dist < dist_cutoff) { + expb = gauss_exp[type[j]]; + chib = chi[type[j]]; + + // overlap integral of two normalised 1s Gaussian type orbitals + p = expa + expb; + m = expa * expb / p; + overlap = pow((4.0*m/p),0.75) * exp(-m*dist*dist); + + if (efield) { + if (efield->varflag != FixEfield::ATOM) { + phib = -factor*(x[j][0]*efield->ex + x[j][1]*efield->ey + x[j][2]*efield->ez); + } else { // atom-style potential from FixEfield + phib = efield->efield[j][3]; + } + sum_n += (chia - chib + phia - phib) * overlap; + } else { + sum_n += (chia - chib) * overlap; + } + sum_d += overlap; + } + } + + chi_eff[i] = sum_n / sum_d; + } +} + +/* ---------------------------------------------------------------------- */ + +double FixQtpieReaxFF::find_min_exp(const double *array, const int array_length) +{ + // index of first gaussian orbital exponent is 1 + double exp_min = array[1]; + for (int i = 2; i < array_length; i++) + { + if (array[i] < exp_min) + exp_min = array[i]; + } + return exp_min; +} + +/* ---------------------------------------------------------------------- */ + +double FixQtpieReaxFF::distance(const double *posa, const double *posb) +{ + double dx, dy, dz; + dx = posb[0] - posa[0]; + dy = posb[1] - posa[1]; + dz = posb[2] - posa[2]; + return sqrt(dx*dx + dy*dy + dz*dz); +} diff --git a/src/REAXFF/fix_qtpie_reaxff.h b/src/REAXFF/fix_qtpie_reaxff.h new file mode 100644 index 0000000000..2f86e27a7a --- /dev/null +++ b/src/REAXFF/fix_qtpie_reaxff.h @@ -0,0 +1,141 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS +// clang-format off +FixStyle(qtpie/reaxff,FixQtpieReaxFF); +// clang-format on +#else + +#ifndef LMP_FIX_QTPIE_REAXFF_H +#define LMP_FIX_QTPIE_REAXFF_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixQtpieReaxFF : public Fix { + public: + FixQtpieReaxFF(class LAMMPS *, int, char **); + ~FixQtpieReaxFF() override; + int setmask() override; + void post_constructor() override; + void init() override; + void init_list(int, class NeighList *) override; + void init_storage(); + void setup_pre_force(int) override; + void pre_force(int) override; + + void setup_pre_force_respa(int, int) override; + void pre_force_respa(int, int, int) override; + + void min_setup_pre_force(int); + void min_pre_force(int) override; + + double compute_scalar() override; + + protected: + int nevery, reaxflag; + int matvecs; + int nn, nt, m_fill; + int n_cap, nmax, m_cap; + int pack_flag; + int nlevels_respa; + class NeighList *list; + class PairReaxFF *reaxff; + class FixEfield *efield; + int *ilist, *jlist, *numneigh, **firstneigh; + + double swa, swb; // lower/upper Taper cutoff radius + double Tap[8]; // Taper function + double tolerance; // tolerance for the norm of the rel residual in CG + + double *chi, *eta, *gamma; // qeq parameters + double **shld; + + // fictitious charges + + double *s, *t; + double **s_hist, **t_hist; + int nprev; + + typedef struct { + int n, m; + int *firstnbr; + int *numnbrs; + int *jlist; + double *val; + } sparse_matrix; + + sparse_matrix H; + double *Hdia_inv; + double *b_s, *b_t; + double *b_prc, *b_prm; + double *chi_eff; // array of effective electronegativities + + //CG storage + double *p, *q, *r, *d; + int imax, maxwarn; + + char *pertype_option; // argument to determine how per-type info is obtained + char *gauss_file; // input file for gaussian orbital exponents + double *gauss_exp; // array of gaussian orbital exponents for each atom type + double dist_cutoff; // separation distance beyond which to neglect overlap integrals + + void pertype_parameters(char *); + void init_shielding(); + void init_taper(); + void allocate_storage(); + void deallocate_storage(); + void reallocate_storage(); + void allocate_matrix(); + void deallocate_matrix(); + void reallocate_matrix(); + + void init_matvec(); + void init_H(); + void compute_H(); + double calculate_H(double, double); + void calculate_Q(); + + int CG(double *, double *); + void sparse_matvec(sparse_matrix *, double *, double *); + + int pack_forward_comm(int, int *, double *, int, int *) override; + void unpack_forward_comm(int, int, double *) override; + int pack_reverse_comm(int, int, double *) override; + void unpack_reverse_comm(int, int *, double *) override; + double memory_usage() override; + void grow_arrays(int) override; + void copy_arrays(int, int, int) override; + int pack_exchange(int, double *) override; + int unpack_exchange(int, double *) override; + + double parallel_norm(double *, int); + double parallel_dot(double *, double *, int); + double parallel_vector_acc(double *, int); + + void vector_sum(double *, double, double *, double, double *, int); + void vector_add(double *, double, double *, int); + + void calc_chi_eff(); + double find_min_exp(const double*, const int); + double distance(const double*, const double*); + + int matvecs_s, matvecs_t; // Iteration count for each system +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/REAXFF/fix_reaxff_species.cpp b/src/REAXFF/fix_reaxff_species.cpp index 0183d2670b..915b2b0dd0 100644 --- a/src/REAXFF/fix_reaxff_species.cpp +++ b/src/REAXFF/fix_reaxff_species.cpp @@ -143,9 +143,10 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : x0 = nullptr; clusterID = nullptr; - int ntmp = 1; + int ntmp = atom->nmax; memory->create(x0, ntmp, "reaxff/species:x0"); memory->create(clusterID, ntmp, "reaxff/species:clusterID"); + memset(clusterID, 0, sizeof(double) * ntmp); vector_atom = clusterID; nmax = 0; @@ -193,8 +194,7 @@ FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : if (iarg + ntypes + 1 > narg) utils::missing_cmd_args(FLERR, "fix reaxff/species element", error); - for (int i = 0; i < ntypes; i++) - eletype[i] = arg[iarg + 1 + i]; + for (int i = 0; i < ntypes; i++) eletype[i] = arg[iarg + 1 + i]; GetUniqueElements(); iarg += ntypes + 1; @@ -348,8 +348,7 @@ void FixReaxFFSpecies::setup(int /*vflag*/) ntotal = static_cast(atom->natoms); if (!eleflag) { - for (int i = 0; i < ntypes; i++) - eletype[i] = reaxff->eletype[i+1]; + for (int i = 0; i < ntypes; i++) eletype[i] = reaxff->eletype[i + 1]; GetUniqueElements(); } memory->destroy(Name); @@ -441,6 +440,7 @@ void FixReaxFFSpecies::Output_ReaxFF_Bonds(bigint ntimestep, FILE * /*fp*/) memory->destroy(clusterID); memory->create(x0, nmax, "reaxff/species:x0"); memory->create(clusterID, nmax, "reaxff/species:clusterID"); + memset(clusterID, 0, sizeof(double) * nmax); vector_atom = clusterID; } diff --git a/src/REAXFF/pair_reaxff.cpp b/src/REAXFF/pair_reaxff.cpp index 08e90933b2..ca60e5248f 100644 --- a/src/REAXFF/pair_reaxff.cpp +++ b/src/REAXFF/pair_reaxff.cpp @@ -340,11 +340,13 @@ void PairReaxFF::init_style() auto acks2_fixes = modify->get_fix_by_style("^acks2/reax"); int have_qeq = modify->get_fix_by_style("^qeq/reax").size() - + modify->get_fix_by_style("^qeq/shielded").size() + acks2_fixes.size(); + + modify->get_fix_by_style("^qeq/shielded").size() + acks2_fixes.size() + + modify->get_fix_by_style("^qtpie/reax").size(); if (qeqflag && (have_qeq != 1)) error->all(FLERR,"Pair style reaxff requires use of exactly one of the " - "fix qeq/reaxff or fix qeq/shielded or fix acks2/reaxff commands"); + "fix qeq/reaxff or fix qeq/shielded or fix acks2/reaxff or " + "fix qtpie/reaxff commands"); api->system->acks2_flag = acks2_fixes.size(); if (api->system->acks2_flag) diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index 4023f2c0b3..b14748565b 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -95,7 +95,7 @@ NEB::NEB(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, int n2step NEB::~NEB() { - MPI_Comm_free(&roots); + if (roots != MPI_COMM_NULL) MPI_Comm_free(&roots); memory->destroy(all); delete[] rdist; if (fp) { diff --git a/src/RHEO/compute_rheo_grad.cpp b/src/RHEO/compute_rheo_grad.cpp index 63c77e3f3b..589f85e195 100644 --- a/src/RHEO/compute_rheo_grad.cpp +++ b/src/RHEO/compute_rheo_grad.cpp @@ -290,8 +290,7 @@ void ComputeRHEOGrad::compute_peratom() void ComputeRHEOGrad::forward_gradients() { comm_stage = COMMGRAD; - comm_forward = ncomm_grad; - comm->forward_comm(this); + comm->forward_comm(this, ncomm_grad); } /* ---------------------------------------------------------------------- */ @@ -299,8 +298,7 @@ void ComputeRHEOGrad::forward_gradients() void ComputeRHEOGrad::forward_fields() { comm_stage = COMMFIELD; - comm_forward = ncomm_field; - comm->forward_comm(this); + comm->forward_comm(this, ncomm_field); } /* ---------------------------------------------------------------------- */ diff --git a/src/RHEO/compute_rheo_interface.cpp b/src/RHEO/compute_rheo_interface.cpp index eec5659051..bbc00bd8d8 100644 --- a/src/RHEO/compute_rheo_interface.cpp +++ b/src/RHEO/compute_rheo_interface.cpp @@ -97,6 +97,9 @@ void ComputeRHEOInterface::init() auto fixes = modify->get_fix_by_style("rheo/pressure"); fix_pressure = dynamic_cast(fixes[0]); + if (!fix_pressure->invertible_pressure) + error->all(FLERR, "RHEO interface reconstruction incompatible with pressure equation of state"); + neighbor->add_request(this, NeighConst::REQ_DEFAULT); } @@ -178,7 +181,7 @@ void ComputeRHEOInterface::compute_peratom() dot = 0; for (a = 0; a < 3; a++) dot += (-fp_store[j][a] + fp_store[i][a]) * dx[a]; - rho[i] += w * (fix_pressure->calc_pressure(rho[j], jtype) - rho[j] * dot); + rho[i] += w * (fix_pressure->calc_pressure(rho[j], j) - rho[j] * dot); normwf[i] += w; } } @@ -192,7 +195,7 @@ void ComputeRHEOInterface::compute_peratom() dot = 0; for (a = 0; a < 3; a++) dot += (-fp_store[i][a] + fp_store[j][a]) * dx[a]; - rho[j] += w * (fix_pressure->calc_pressure(rho[i], itype) + rho[i] * dot); + rho[j] += w * (fix_pressure->calc_pressure(rho[i], i) + rho[i] * dot); normwf[j] += w; } } @@ -210,7 +213,7 @@ void ComputeRHEOInterface::compute_peratom() if (status[i] & PHASECHECK) { if (normwf[i] != 0.0) { // Stores rho for solid particles 1+Pw in Adami Adams 2012 - rho[i] = MAX(EPSILON, fix_pressure->calc_rho(rho[i] / normwf[i], type[i])); + rho[i] = MAX(EPSILON, fix_pressure->calc_rho(rho[i] / normwf[i], i)); } else { rho[i] = rho0[itype]; } @@ -218,8 +221,7 @@ void ComputeRHEOInterface::compute_peratom() } comm_stage = 1; - comm_forward = 2; - comm->forward_comm(this); + comm->forward_comm(this, 2); } /* ---------------------------------------------------------------------- */ @@ -369,9 +371,8 @@ void ComputeRHEOInterface::store_forces() } // Forward comm forces - comm_forward = 3; comm_stage = 0; - comm->forward_comm(this); + comm->forward_comm(this, 3); } /* ---------------------------------------------------------------------- diff --git a/src/RHEO/compute_rheo_kernel.cpp b/src/RHEO/compute_rheo_kernel.cpp index 31b1f65fc2..3a6629bfef 100644 --- a/src/RHEO/compute_rheo_kernel.cpp +++ b/src/RHEO/compute_rheo_kernel.cpp @@ -90,7 +90,6 @@ ComputeRHEOKernel::ComputeRHEOKernel(LAMMPS *lmp, int narg, char **arg) : comm_forward = ncor * Mdim; } - comm_forward_save = comm_forward; corrections_calculated = 0; lapack_error_flag = 0; } @@ -137,6 +136,9 @@ void ComputeRHEOKernel::init() } } + if (correction_order != -1) + fix_rheo->coordination_flag = 1; + nmax_store = atom->nmax; memory->create(coordination, nmax_store, "rheo:coordination"); if (kernel_style == RK0) { @@ -186,27 +188,26 @@ double ComputeRHEOKernel::calc_w_self() double ComputeRHEOKernel::calc_w(int i, int j, double delx, double dely, double delz, double r) { + if (kernel_style == WENDLANDC4) + return calc_w_wendlandc4(r); + if (kernel_style == QUINTIC) + return calc_w_quintic(r); + double w = 0.0; - int corrections_i, corrections_j, corrections; - - if (kernel_style == WENDLANDC4) return calc_w_wendlandc4(r); - - if (kernel_style != QUINTIC) { - corrections_i = check_corrections(i); - corrections_j = check_corrections(j); - corrections = corrections_i & corrections_j; - } else { - corrections = 0; - } + int corrections_i = check_corrections(i); + int corrections_j = check_corrections(j); + int corrections = corrections_i && corrections_j; if (!corrections) - w = calc_w_quintic(r); - else if (kernel_style == RK0) + return calc_w_quintic(r); + + double dx[3] = {delx, dely, delz}; + if (kernel_style == RK0) w = calc_w_rk0(i, j, r); else if (kernel_style == RK1) - w = calc_w_rk1(i, j, delx, dely, delz, r); + w = calc_w_rk1(i, j, dx, r); else if (kernel_style == RK2) - w = calc_w_rk2(i, j, delx, dely, delz, r); + w = calc_w_rk2(i, j, dx, r); return w; } @@ -215,26 +216,27 @@ double ComputeRHEOKernel::calc_w(int i, int j, double delx, double dely, double double ComputeRHEOKernel::calc_dw(int i, int j, double delx, double dely, double delz, double r) { + if (kernel_style == WENDLANDC4) + return calc_dw_wendlandc4(delx, dely, delz, r, dWij, dWji); + if (kernel_style == QUINTIC) + return calc_dw_quintic(delx, dely, delz, r, dWij, dWji); + double wp; - int corrections_i, corrections_j; + int corrections_i = check_corrections(i); + int corrections_j = check_corrections(j); - if (kernel_style == WENDLANDC4) return calc_dw_wendlandc4(delx, dely, delz, r, dWij, dWji); - - if (kernel_style != QUINTIC) { - corrections_i = check_corrections(i); - corrections_j = check_corrections(j); - } - - // Calc wp and default dW's, a bit inefficient but can redo later - wp = calc_dw_quintic(delx, dely, delz, r, dWij, dWji); + wp = calc_dw_scalar_quintic(delx, dely, delz, r); // Overwrite if there are corrections + double dxij[3] = {delx, dely, delz}; + double dxji[3] = {-delx, -dely, -delz}; + if (kernel_style == RK1) { - if (corrections_i) calc_dw_rk1(i, delx, dely, delz, r, dWij); - if (corrections_j) calc_dw_rk1(j, -delx, -dely, -delz, r, dWji); + if (corrections_i) calc_dw_rk1(i, dxij, r, dWij); + if (corrections_j) calc_dw_rk1(j, dxji, r, dWji); } else if (kernel_style == RK2) { - if (corrections_i) calc_dw_rk2(i, delx, dely, delz, r, dWij); - if (corrections_j) calc_dw_rk2(j, -delx, -dely, -delz, r, dWji); + if (corrections_i) calc_dw_rk2(i, dxij, r, dWij); + if (corrections_j) calc_dw_rk2(j, dxji, r, dWji); } return wp; @@ -275,10 +277,9 @@ double ComputeRHEOKernel::calc_w_quintic(double r) /* ---------------------------------------------------------------------- */ -double ComputeRHEOKernel::calc_dw_quintic(double delx, double dely, double delz, double r, - double *dW1, double *dW2) +double ComputeRHEOKernel::calc_dw_scalar_quintic(double delx, double dely, double delz, double r) { - double wp, tmp1, tmp2, tmp3, tmp1sq, tmp2sq, tmp3sq, s, wprinv; + double wp, tmp1, tmp2, tmp3, tmp1sq, tmp2sq, tmp3sq, s; s = r * 3.0 * cutinv; @@ -300,14 +301,23 @@ double ComputeRHEOKernel::calc_dw_quintic(double delx, double dely, double delz, } wp *= pre_wp; - wprinv = wp / r; + + return wp; +} + +/* ---------------------------------------------------------------------- */ + +double ComputeRHEOKernel::calc_dw_quintic(double delx, double dely, double delz, double r, + double *dW1, double *dW2) +{ + double wp = calc_dw_scalar_quintic(delx, dely, delz, r); + double wprinv = wp / r; + dW1[0] = delx * wprinv; dW1[1] = dely * wprinv; dW1[2] = delz * wprinv; - dW2[0] = -delx * wprinv; - dW2[1] = -dely * wprinv; - dW2[2] = -delz * wprinv; + scale3(-1.0, dW1, dW2); return wp; } @@ -361,9 +371,7 @@ double ComputeRHEOKernel::calc_dw_wendlandc4(double delx, double dely, double de dW1[1] = dely * wprinv; dW1[2] = delz * wprinv; - dW2[0] = -delx * wprinv; - dW2[1] = -dely * wprinv; - dW2[2] = -delz * wprinv; + scale3(-1.0, dW1, dW2); return wp; } @@ -384,14 +392,11 @@ double ComputeRHEOKernel::calc_w_rk0(int i, int j, double r) /* ---------------------------------------------------------------------- */ -double ComputeRHEOKernel::calc_w_rk1(int i, int j, double delx, double dely, double delz, double r) +double ComputeRHEOKernel::calc_w_rk1(int i, int j, double *dx, double r) { int b; - double w, dx[3], H[MAX_MDIM]; + double w, H[MAX_MDIM]; - dx[0] = delx; - dx[1] = dely; - dx[2] = delz; w = calc_w_quintic(r); if (dim == 2) { @@ -426,13 +431,11 @@ double ComputeRHEOKernel::calc_w_rk1(int i, int j, double delx, double dely, dou /* ---------------------------------------------------------------------- */ -double ComputeRHEOKernel::calc_w_rk2(int i, int j, double delx, double dely, double delz, double r) +double ComputeRHEOKernel::calc_w_rk2(int i, int j, double *dx, double r) { int b; - double w, dx[3], H[MAX_MDIM]; - dx[0] = delx; - dx[1] = dely; - dx[2] = delz; + double w, H[MAX_MDIM]; + w = calc_w_quintic(r); if (dim == 2) { @@ -476,14 +479,10 @@ double ComputeRHEOKernel::calc_w_rk2(int i, int j, double delx, double dely, dou /* ---------------------------------------------------------------------- */ -void ComputeRHEOKernel::calc_dw_rk1(int i, double delx, double dely, double delz, double r, - double *dW) +void ComputeRHEOKernel::calc_dw_rk1(int i, double *dx, double r, double *dW) { int a, b; - double w, dx[3], H[MAX_MDIM]; - dx[0] = delx; - dx[1] = dely; - dx[2] = delz; + double w, H[MAX_MDIM]; w = calc_w_quintic(r); @@ -501,8 +500,8 @@ void ComputeRHEOKernel::calc_dw_rk1(int i, double delx, double dely, double delz // dWij[] = dWx dWy (dWz) //compute derivative operators + zero3(dW); for (a = 0; a < dim; a++) { - dW[a] = 0.0; for (b = 0; b < Mdim; b++) { //First derivative kernels dW[a] += C[i][1 + a][b] * H[b]; // C columns: 1 x y (z) @@ -513,14 +512,10 @@ void ComputeRHEOKernel::calc_dw_rk1(int i, double delx, double dely, double delz /* ---------------------------------------------------------------------- */ -void ComputeRHEOKernel::calc_dw_rk2(int i, double delx, double dely, double delz, double r, - double *dW) +void ComputeRHEOKernel::calc_dw_rk2(int i, double *dx, double r, double *dW) { int a, b; - double w, dx[3], H[MAX_MDIM]; - dx[0] = delx; - dx[1] = dely; - dx[2] = delz; + double w, H[MAX_MDIM]; w = calc_w_quintic(r); @@ -547,8 +542,8 @@ void ComputeRHEOKernel::calc_dw_rk2(int i, double delx, double dely, double delz // dWij[] = dWx dWy (dWz) //compute derivative operators + zero3(dW); for (a = 0; a < dim; a++) { - dW[a] = 0.0; for (b = 0; b < Mdim; b++) { //First derivative kernels dW[a] += C[i][1 + a][b] * H[b]; // C columns: 1 x y (z) xx yy (zz) @@ -564,7 +559,7 @@ void ComputeRHEOKernel::compute_peratom() lapack_error_flag = 0; lapack_error_tags.clear(); - if (kernel_style == QUINTIC) return; + if (correction_order == -1) return; corrections_calculated = 1; int i, j, ii, jj, inum, jnum, a, b, lapack_error; @@ -666,6 +661,7 @@ void ComputeRHEOKernel::compute_peratom() w = calc_w_quintic(r); rhoj = rho[j]; + if (interface_flag) if (status[j] & PHASECHECK) rhoj = compute_interface->correct_rho(j); @@ -781,7 +777,6 @@ void ComputeRHEOKernel::compute_peratom() // communicate calculated quantities comm_stage = 1; - comm_forward = comm_forward_save; comm->forward_comm(this); } @@ -829,8 +824,7 @@ void ComputeRHEOKernel::compute_coordination() // communicate calculated quantities comm_stage = 0; - comm_forward = 1; - comm->forward_comm(this); + comm->forward_comm(this, 1); } /* ---------------------------------------------------------------------- */ @@ -853,7 +847,9 @@ void ComputeRHEOKernel::grow_arrays(int nmax) int ComputeRHEOKernel::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/) { + int a, b; int m = 0; + for (int i = 0; i < n; i++) { int j = list[i]; if (comm_stage == 0) { @@ -862,8 +858,8 @@ int ComputeRHEOKernel::pack_forward_comm(int n, int *list, double *buf, int /*pb if (kernel_style == RK0) { buf[m++] = C0[j]; } else { - for (int a = 0; a < ncor; a++) - for (int b = 0; b < Mdim; b++) buf[m++] = C[j][a][b]; + for (a = 0; a < ncor; a++) + for (b = 0; b < Mdim; b++) buf[m++] = C[j][a][b]; } } } @@ -874,8 +870,10 @@ int ComputeRHEOKernel::pack_forward_comm(int n, int *list, double *buf, int /*pb void ComputeRHEOKernel::unpack_forward_comm(int n, int first, double *buf) { + int a, b; int m = 0; int last = first + n; + for (int i = first; i < last; i++) { if (comm_stage == 0) { coordination[i] = buf[m++]; @@ -883,8 +881,8 @@ void ComputeRHEOKernel::unpack_forward_comm(int n, int first, double *buf) if (kernel_style == RK0) { C0[i] = buf[m++]; } else { - for (int a = 0; a < ncor; a++) - for (int b = 0; b < Mdim; b++) C[i][a][b] = buf[m++]; + for (a = 0; a < ncor; a++) + for (b = 0; b < Mdim; b++) C[i][a][b] = buf[m++]; } } } diff --git a/src/RHEO/compute_rheo_kernel.h b/src/RHEO/compute_rheo_kernel.h index 8b70509e6a..037e9e3683 100644 --- a/src/RHEO/compute_rheo_kernel.h +++ b/src/RHEO/compute_rheo_kernel.h @@ -40,6 +40,7 @@ class ComputeRHEOKernel : public Compute { double calc_w(int, int, double, double, double, double); double calc_dw(int, int, double, double, double, double); double calc_w_quintic(double); + double calc_dw_scalar_quintic(double, double, double, double); double calc_dw_quintic(double, double, double, double, double *, double *); double calc_w_wendlandc4(double); double calc_dw_wendlandc4(double, double, double, double, double *, double *); @@ -51,7 +52,7 @@ class ComputeRHEOKernel : public Compute { class FixRHEO *fix_rheo; private: - int comm_stage, comm_forward_save; + int comm_stage; int interface_flag; int lapack_error_flag; std::unordered_set lapack_error_tags; @@ -69,10 +70,10 @@ class ComputeRHEOKernel : public Compute { int check_corrections(int); double calc_w_rk0(int, int, double); - double calc_w_rk1(int, int, double, double, double, double); - double calc_w_rk2(int, int, double, double, double, double); - void calc_dw_rk1(int, double, double, double, double, double *); - void calc_dw_rk2(int, double, double, double, double, double *); + double calc_w_rk1(int, int, double*, double); + double calc_w_rk2(int, int, double*, double); + void calc_dw_rk1(int, double*, double, double*); + void calc_dw_rk2(int, double*, double, double*); }; } // namespace LAMMPS_NS #endif diff --git a/src/RHEO/compute_rheo_property_atom.cpp b/src/RHEO/compute_rheo_property_atom.cpp index fb5848ac75..4805c21903 100644 --- a/src/RHEO/compute_rheo_property_atom.cpp +++ b/src/RHEO/compute_rheo_property_atom.cpp @@ -79,7 +79,7 @@ ComputeRHEOPropertyAtom::ComputeRHEOPropertyAtom(LAMMPS *lmp, int narg, char **a size_peratom_cols = nvalues; pressure_flag = thermal_flag = interface_flag = 0; - surface_flag = shift_flag = shell_flag = 0; + surface_flag = shift_flag = shell_flag = coordination_flag = 0; // parse input values // customize a new keyword by adding to if statement @@ -109,6 +109,7 @@ ComputeRHEOPropertyAtom::ComputeRHEOPropertyAtom(LAMMPS *lmp, int narg, char **a surface_flag = 1; pack_choice[i] = &ComputeRHEOPropertyAtom::pack_surface_divr; } else if (strcmp(arg[iarg], "coordination") == 0) { + coordination_flag = 1; pack_choice[i] = &ComputeRHEOPropertyAtom::pack_coordination; } else if (strcmp(arg[iarg], "pressure") == 0) { pressure_flag = 1; @@ -223,6 +224,11 @@ void ComputeRHEOPropertyAtom::compute_peratom() { invoked_peratom = update->ntimestep; + // calculate optional values, if needed + + if (coordination_flag && !(fix_rheo->coordination_flag)) + compute_kernel->compute_coordination(); + // grow vector or array if necessary if (atom->nmax > nmax) { @@ -434,7 +440,7 @@ void ComputeRHEOPropertyAtom::pack_pressure(int n) for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) - buf[n] = fix_pressure->calc_pressure(rho[i], type[i]); + buf[n] = fix_pressure->calc_pressure(rho[i], i); else buf[n] = 0.0; n += nvalues; @@ -484,7 +490,7 @@ void ComputeRHEOPropertyAtom::pack_total_stress(int n) for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { if (index == index_transpose) - p = fix_pressure->calc_pressure(rho[i], type[i]); + p = fix_pressure->calc_pressure(rho[i], i); else p = 0.0; buf[n] = viscosity[i] * (gradv[i][index] + gradv[i][index_transpose]) + p; diff --git a/src/RHEO/compute_rheo_property_atom.h b/src/RHEO/compute_rheo_property_atom.h index 14f28075a3..745423b4ae 100644 --- a/src/RHEO/compute_rheo_property_atom.h +++ b/src/RHEO/compute_rheo_property_atom.h @@ -36,7 +36,7 @@ class ComputeRHEOPropertyAtom : public Compute { private: int nvalues, nmax; int pressure_flag, thermal_flag, interface_flag; - int surface_flag, shift_flag, shell_flag; + int surface_flag, shift_flag, shell_flag, coordination_flag; int *avec_index; int *col_index, *col_t_index; double *buf; diff --git a/src/RHEO/compute_rheo_surface.cpp b/src/RHEO/compute_rheo_surface.cpp index 8af60afeda..74193f28f5 100644 --- a/src/RHEO/compute_rheo_surface.cpp +++ b/src/RHEO/compute_rheo_surface.cpp @@ -81,6 +81,8 @@ void ComputeRHEOSurface::init() threshold_splash = fix_rheo->zmin_splash; interface_flag = fix_rheo->interface_flag; + fix_rheo->coordination_flag = 1; + cutsq = cut * cut; // need an occasional half neighbor list @@ -197,10 +199,8 @@ void ComputeRHEOSurface::compute_peratom() // reverse gradC and divr, forward divr comm_stage = 0; - comm_reverse = dim * dim + 1; - comm_forward = 1; - if (newton) comm->reverse_comm(this); - comm->forward_comm(this); + if (newton) comm->reverse_comm(this, dim * dim + 1); + comm->forward_comm(this, 1); // calculate nsurface for local atoms // Note, this isn't forwarded to ghosts @@ -297,10 +297,8 @@ void ComputeRHEOSurface::compute_peratom() // forward/reverse status and rsurface comm_stage = 1; - comm_reverse = 2; - comm_forward = 2; - if (newton) comm->reverse_comm(this); - comm->forward_comm(this); + if (newton) comm->reverse_comm(this, 2); + comm->forward_comm(this, 2); } /* ---------------------------------------------------------------------- */ diff --git a/src/RHEO/compute_rheo_vshift.cpp b/src/RHEO/compute_rheo_vshift.cpp index 8581d9ea8f..248e857fb3 100644 --- a/src/RHEO/compute_rheo_vshift.cpp +++ b/src/RHEO/compute_rheo_vshift.cpp @@ -27,6 +27,7 @@ #include "error.h" #include "fix_rheo.h" #include "force.h" +#include "math_extra.h" #include "memory.h" #include "neigh_list.h" #include "neigh_request.h" @@ -36,20 +37,22 @@ using namespace LAMMPS_NS; using namespace RHEO_NS; +using namespace MathExtra; /* ---------------------------------------------------------------------- */ ComputeRHEOVShift::ComputeRHEOVShift(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg), vshift(nullptr), fix_rheo(nullptr), rho0(nullptr), list(nullptr), - compute_interface(nullptr), compute_kernel(nullptr), compute_surface(nullptr) + Compute(lmp, narg, arg), vshift(nullptr), ct(nullptr), wsame(nullptr), cgradt(nullptr), + fix_rheo(nullptr), rho0(nullptr), list(nullptr), compute_interface(nullptr), + compute_kernel(nullptr), compute_surface(nullptr) { if (narg != 3) error->all(FLERR, "Illegal compute RHEO/VShift command"); + comm_forward = 0; comm_reverse = 3; surface_flag = 0; - nmax_store = atom->nmax; - memory->create(vshift, nmax_store, 3, "rheo:vshift"); + nmax_store = 0; } /* ---------------------------------------------------------------------- */ @@ -73,9 +76,19 @@ void ComputeRHEOVShift::init() compute_surface = fix_rheo->compute_surface; rho0 = fix_rheo->rho0; + shift_type = fix_rheo->shift_type; cut = fix_rheo->cut; cutsq = cut * cut; cutthird = cut / 3.0; + + cross_type_flag = fix_rheo->shift_cross_type_flag; + if (cross_type_flag) { + scale = fix_rheo->shift_scale; + wmin = fix_rheo->shift_wmin; + cmin = fix_rheo->shift_cmin; + comm_forward = 1; + comm_reverse = 4; + } } /* ---------------------------------------------------------------------- */ @@ -120,6 +133,13 @@ void ComputeRHEOVShift::compute_peratom() if (nmax_store < atom->nmax) { memory->grow(vshift, atom->nmax, 3, "rheo:vshift"); + + if (cross_type_flag) { + memory->grow(ct, atom->nmax, "rheo:ct"); + memory->grow(cgradt, atom->nmax, 3, "rheo:cgradt"); + memory->grow(wsame, atom->nmax, "rheo:wsame"); + } + nmax_store = atom->nmax; } @@ -224,7 +244,17 @@ void ComputeRHEOVShift::compute_peratom() } } - if (newton_pair) comm->reverse_comm(this); + comm_stage = 0; + if (newton_pair) comm->reverse_comm(this, 3); + + // Zero any excluded types + + for (i = 0; i < nlocal; i++) + if (!shift_type[type[i]]) + for (a = 0; a < dim; a++) + vshift[i][a] = 0.0; + + if (cross_type_flag) correct_type_interface(); } /* ---------------------------------------------------------------------- */ @@ -246,7 +276,6 @@ void ComputeRHEOVShift::correct_surfaces() if (status[i] & PHASECHECK) continue; - //if ((status[i] & STATUS_SURFACE) || (status[i] & STATUS_LAYER)) { if (status[i] & STATUS_SURFACE) { nx = nsurface[i][0]; ny = nsurface[i][1]; @@ -283,16 +312,278 @@ void ComputeRHEOVShift::correct_surfaces() /* ---------------------------------------------------------------------- */ -int ComputeRHEOVShift::pack_reverse_comm(int n, int first, double *buf) +void ComputeRHEOVShift::correct_type_interface() { - int m, last; + int i, j, a, ii, jj, jnum, itype, jtype; + int fluidi, fluidj; + double xtmp, ytmp, ztmp, rsq, r, rinv; + double w, wp, dr, w0, prefactor; + double imass, jmass, voli, volj, rhoi, rhoj; + double dx[3]; + int dim = domain->dimension; + + int *jlist; + int inum, *ilist, *numneigh, **firstneigh; + + int *type = atom->type; + int *status = atom->rheo_status; + int *mask = atom->mask; + double **x = atom->x; + double *rho = atom->rho; + double *mass = atom->mass; + double *rmass = atom->rmass; + + int nlocal = atom->nlocal; + int nall = nlocal + atom->nghost; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + size_t nbytes = nmax_store * sizeof(double); + memset(&ct[0], 0, nbytes); + memset(&wsame[0], 0, nbytes); + memset(&cgradt[0][0], 0, 3 * nbytes); + double ctmp, *dWij, *dWji; + + // Calculate color gradient + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + fluidi = !(status[i] & PHASECHECK); + jlist = firstneigh[i]; + jnum = numneigh[i]; + if (rmass) + imass = rmass[i]; + else + imass = mass[itype]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + dx[0] = xtmp - x[j][0]; + dx[1] = ytmp - x[j][1]; + dx[2] = ztmp - x[j][2]; + + rsq = lensq3(dx); + + if (rsq > cutsq) continue; + + fluidj = !(status[j] & PHASECHECK); + jtype = type[j]; + if (rmass) + jmass = rmass[j]; + else + jmass = mass[jtype]; + r = sqrt(rsq); + + rhoi = rho[i]; + rhoj = rho[j]; + + // Add corrections for walls + if (interface_flag) { + if (fluidi && (!fluidj)) { + rhoj = compute_interface->correct_rho(j); + } else if ((!fluidi) && fluidj) { + rhoi = compute_interface->correct_rho(i); + } else if ((!fluidi) && (!fluidj)) { + rhoi = rho0[itype]; + rhoj = rho0[jtype]; + } + } + + voli = imass / rhoi; + volj = jmass / rhoj; + + w = compute_kernel->calc_w(i, j, dx[0], dx[1], dx[2], r); + + if (itype != jtype) ctmp = 1; + else ctmp = 0; + + ct[i] += ctmp * volj * w; + if (newton_pair || j < nlocal) + ct[j] += ctmp * voli * w; + } + } + + comm_stage = 1; + if (newton_pair) comm->reverse_comm(this, 1); + + // Calculate color gradient + // Note: in future might want to generalize this so color function can be used + // by other calculations (e.g. surface tension) + // maybe can create custom "calc_grad" method that takes an arbitrary field + // in ComputeRHEOGrad? + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + fluidi = !(status[i] & PHASECHECK); + jlist = firstneigh[i]; + jnum = numneigh[i]; + imass = mass[itype]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + dx[0] = xtmp - x[j][0]; + dx[1] = ytmp - x[j][1]; + dx[2] = ztmp - x[j][2]; + rsq = lensq3(dx); + + if (rsq > cutsq) continue; + + fluidj = !(status[j] & PHASECHECK); + jtype = type[j]; + if (rmass) + jmass = rmass[j]; + else + jmass = mass[jtype]; + r = sqrt(rsq); + + rhoi = rho[i]; + rhoj = rho[j]; + + // Add corrections for walls + if (interface_flag) { + if (fluidi && (!fluidj)) { + rhoj = compute_interface->correct_rho(j); + } else if ((!fluidi) && fluidj) { + rhoi = compute_interface->correct_rho(i); + } else if ((!fluidi) && (!fluidj)) { + rhoi = rho0[itype]; + rhoj = rho0[jtype]; + } + } + + voli = imass / rhoi; + volj = jmass / rhoj; + + w = compute_kernel->calc_w(i, j, dx[0], dx[1], dx[2], r); + dWij = compute_kernel->dWij; + dWji = compute_kernel->dWji; + + if (itype != jtype) ctmp = 1; + else ctmp = 0; + + for (a = 0; a < dim; a++) { + cgradt[i][a] -= ctmp * volj * dWij[a]; + if (newton_pair || j < nlocal) + cgradt[j][a] -= ctmp * voli * dWji[a]; + } + + if (itype == jtype) { + wsame[i] += w * r; + if (newton_pair || j < nlocal) + wsame[j] += w * r; + } + } + } + + comm_stage = 2; + if (newton_pair) comm->reverse_comm(this, 4); + comm->forward_comm(this, 1); + + // Correct shifting at fluid-fluid interface + // remove normal shifting component for interfacial particles + // Based on Yang, Rakhsha, Hu, & Negrut 2022 + + double ntmp[3], minv, dot; + + for (i = 0; i < nlocal; i++) { + + // If isolated, just don't shift + if (wsame[i] < wmin) { + for (a = 0; a < dim; a++) + vshift[i][a] = 0.0; + continue; + } + + if (ct[i] < cmin) continue; + + minv = 0; + for (a = 0; a < dim; a++) + minv += cgradt[i][a] * cgradt[i][a]; + + if (minv != 0) + minv = 1 / sqrt(minv); + + for (a = 0; a < dim; a++) + ntmp[a] = cgradt[i][a] * minv; + + dot = 0.0; + for (a = 0; a < dim; a++) + dot += ntmp[a] * vshift[i][a]; + + // To allowing shifting into the same phase bulk + // if (dot > 0.0) continue; + + for (a = 0; a < dim; a++) + vshift[i][a] -= (1.0 - scale) * ntmp[a] * dot; + } +} + +/* ---------------------------------------------------------------------- */ + +int ComputeRHEOVShift::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/) +{ + int i, j, m; + m = 0; + + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = wsame[j]; + } + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void ComputeRHEOVShift::unpack_forward_comm(int n, int first, double *buf) +{ + int i, m, last; m = 0; last = first + n; - for (int i = first; i < last; i++) { - buf[m++] = vshift[i][0]; - buf[m++] = vshift[i][1]; - buf[m++] = vshift[i][2]; + for (i = first; i < last; i++) + wsame[i] = buf[m++]; +} + +/* ---------------------------------------------------------------------- */ + +int ComputeRHEOVShift::pack_reverse_comm(int n, int first, double *buf) +{ + int i, m, a, last; + + m = 0; + last = first + n; + if (comm_stage == 0) { + for (i = first; i < last; i++) { + buf[m++] = vshift[i][0]; + buf[m++] = vshift[i][1]; + buf[m++] = vshift[i][2]; + } + } else if (comm_stage == 1) { + for (i = first; i < last; i++) + buf[m++] = ct[i]; + } else { + for (i = first; i < last; i++) { + for (a = 0; a < 3; a++) + buf[m++] = cgradt[i][a]; + buf[m++] = wsame[i]; + } } return m; } @@ -301,14 +592,28 @@ int ComputeRHEOVShift::pack_reverse_comm(int n, int first, double *buf) void ComputeRHEOVShift::unpack_reverse_comm(int n, int *list, double *buf) { - int i, j, m; + int i, j, a, m; m = 0; - for (i = 0; i < n; i++) { - j = list[i]; - vshift[j][0] += buf[m++]; - vshift[j][1] += buf[m++]; - vshift[j][2] += buf[m++]; + if (comm_stage == 0) { + for (i = 0; i < n; i++) { + j = list[i]; + vshift[j][0] += buf[m++]; + vshift[j][1] += buf[m++]; + vshift[j][2] += buf[m++]; + } + } else if (comm_stage == 1) { + for (i = 0; i < n; i++) { + j = list[i]; + ct[j] += buf[m++]; + } + } else { + for (i = 0; i < n; i++) { + j = list[i]; + for (a = 0; a < 3; a++) + cgradt[j][a] += buf[m++]; + wsame[j] += buf[m++]; + } } } @@ -319,5 +624,9 @@ void ComputeRHEOVShift::unpack_reverse_comm(int n, int *list, double *buf) double ComputeRHEOVShift::memory_usage() { double bytes = 3 * nmax_store * sizeof(double); + + if (cross_type_flag) + bytes += 5 * nmax_store * sizeof(double); + return bytes; } diff --git a/src/RHEO/compute_rheo_vshift.h b/src/RHEO/compute_rheo_vshift.h index 485c6525f3..b76d48d5e3 100644 --- a/src/RHEO/compute_rheo_vshift.h +++ b/src/RHEO/compute_rheo_vshift.h @@ -31,19 +31,25 @@ class ComputeRHEOVShift : public Compute { void init() override; void init_list(int, class NeighList *) override; void compute_peratom() override; + int pack_forward_comm(int, int *, double *, int, int *) override; + void unpack_forward_comm(int, int, double *) override; int pack_reverse_comm(int, int, double *) override; void unpack_reverse_comm(int, int *, double *) override; double memory_usage() override; void correct_surfaces(); + void correct_type_interface(); double **vshift; class FixRHEO *fix_rheo; private: - int nmax_store; + int nmax_store, comm_stage; double dtv, cut, cutsq, cutthird; - int surface_flag, interface_flag; + double scale, wmin, cmin; + int surface_flag, interface_flag, cross_type_flag; double *rho0; + double *wsame, *ct, **cgradt; + int *shift_type; class NeighList *list; class ComputeRHEOInterface *compute_interface; diff --git a/src/RHEO/fix_rheo.cpp b/src/RHEO/fix_rheo.cpp index 4a25a46501..56738c7a0c 100644 --- a/src/RHEO/fix_rheo.cpp +++ b/src/RHEO/fix_rheo.cpp @@ -38,23 +38,25 @@ using namespace LAMMPS_NS; using namespace RHEO_NS; using namespace FixConst; -#if 0 -// publication was removed from documentation static const char cite_rheo[] = - "@article{PalermoInPrep,\n" - " journal = {in prep},\n" - " title = {RHEO: A Hybrid Mesh-Free Model Framework for Dynamic Multi-Phase Flows},\n" + "@article{Palermo2024,\n" + " journal = {Physics of Fluids},\n" + " title = {Reproducing hydrodynamics and elastic objects: A hybrid mesh-free model framework for dynamic multi-phase flows},\n" + " volume = {36},\n" + " number = {11},\n" + " pages = {113337},\n" " year = {2024},\n" - " author = {Eric T. Palermo and Ki T. Wolf and Joel T. Clemmer and Thomas C. O'Connor},\n" + " issn = {1070-6631},\n" + " doi = {https://doi.org/10.1063/5.0228823},\n" + " author = {Palermo, Eric T. and Wolf, Ki T. and Clemmer, Joel T. and O'Connor, Thomas C.},\n" "}\n\n"; -#endif /* ---------------------------------------------------------------------- */ FixRHEO::FixRHEO(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), rho0(nullptr), csq(nullptr), compute_grad(nullptr), - compute_kernel(nullptr), compute_interface(nullptr), compute_surface(nullptr), - compute_rhosum(nullptr), compute_vshift(nullptr) + Fix(lmp, narg, arg), rho0(nullptr), csq(nullptr), shift_type(nullptr), + compute_grad(nullptr), compute_kernel(nullptr), compute_interface(nullptr), + compute_surface(nullptr), compute_rhosum(nullptr), compute_vshift(nullptr) { time_integrate = 1; @@ -68,10 +70,12 @@ FixRHEO::FixRHEO(LAMMPS *lmp, int narg, char **arg) : shift_flag = 0; interface_flag = 0; surface_flag = 0; - oxidation_flag = 0; - self_mass_flag = 0; + coordination_flag = 0; - int i; + rhosum_self_mass_flag = 0; + shift_cross_type_flag = 0; + + int i, nlo, nhi; int n = atom->ntypes; memory->create(rho0, n + 1, "rheo:rho0"); memory->create(csq, n + 1, "rheo:csq"); @@ -111,6 +115,26 @@ FixRHEO::FixRHEO(LAMMPS *lmp, int narg, char **arg) : while (iarg < narg) { if (strcmp(arg[iarg], "shift") == 0) { shift_flag = 1; + memory->create(shift_type, n + 1, "rheo:shift_type"); + for (i = 1; i <= n; i++) shift_type[i] = 1; + while (iarg < narg) { // optional sub-arguments + if (strcmp(arg[iarg], "scale/cross/type") == 0) { + if (iarg + 3 >= narg) utils::missing_cmd_args(FLERR, "fix rheo shift scale/cross/type", error); + shift_cross_type_flag = 1; + shift_scale = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + shift_cmin = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + shift_wmin = utils::numeric(FLERR, arg[iarg + 3], false, lmp); + iarg += 3; + } else if (strcmp(arg[iarg], "exclude/type") == 0) { + if (iarg + 1 >= narg) utils::missing_cmd_args(FLERR, "fix rheo shift exclude/type", error); + utils::bounds(FLERR, arg[iarg + 1], 1, n, nlo, nhi, error); + for (i = nlo; i <= nhi; i++) shift_type[i] = 0; + iarg += 1; + } else { + break; + } + iarg += 1; + } } else if (strcmp(arg[iarg], "thermal") == 0) { thermal_flag = 1; } else if (strcmp(arg[iarg], "surface/detection") == 0) { @@ -127,14 +151,19 @@ FixRHEO::FixRHEO(LAMMPS *lmp, int narg, char **arg) : } else { error->all(FLERR, "Illegal surface/detection option in fix rheo, {}", arg[iarg + 1]); } - iarg += 3; } else if (strcmp(arg[iarg], "interface/reconstruct") == 0) { interface_flag = 1; } else if (strcmp(arg[iarg], "rho/sum") == 0) { rhosum_flag = 1; - } else if (strcmp(arg[iarg], "self/mass") == 0) { - self_mass_flag = 1; + while (iarg < narg) { // optional sub-arguments + if (strcmp(arg[iarg], "self/mass") == 0) { + rhosum_self_mass_flag = 1; + } else { + break; + } + iarg += 1; + } } else if (strcmp(arg[iarg], "density") == 0) { if (iarg + n >= narg) utils::missing_cmd_args(FLERR, "fix rheo density", error); for (i = 1; i <= n; i++) rho0[i] = utils::numeric(FLERR, arg[iarg + i], false, lmp); @@ -152,12 +181,7 @@ FixRHEO::FixRHEO(LAMMPS *lmp, int narg, char **arg) : iarg += 1; } - if (self_mass_flag && (!rhosum_flag)) - error->all(FLERR, "Cannot use self/mass setting without rho/sum"); - -#if 0 if (lmp->citeme) lmp->citeme->add(cite_rheo); -#endif } /* ---------------------------------------------------------------------- */ @@ -173,6 +197,7 @@ FixRHEO::~FixRHEO() memory->destroy(csq); memory->destroy(rho0); + memory->destroy(shift_type); } /* ---------------------------------------------------------------------- @@ -192,7 +217,7 @@ void FixRHEO::post_constructor() if (rhosum_flag) { compute_rhosum = dynamic_cast( - modify->add_compute(fmt::format("rheo_rhosum all RHEO/RHO/SUM {}", self_mass_flag))); + modify->add_compute(fmt::format("rheo_rhosum all RHEO/RHO/SUM {}", rhosum_self_mass_flag))); compute_rhosum->fix_rheo = this; } @@ -375,7 +400,6 @@ void FixRHEO::initial_integrate(int /*vflag*/) // Shifting atoms if (shift_flag) { for (i = 0; i < nlocal; i++) { - if (status[i] & STATUS_NO_SHIFT) continue; if (status[i] & PHASECHECK) continue; diff --git a/src/RHEO/fix_rheo.h b/src/RHEO/fix_rheo.h index 24e86b21d6..aa80bc938e 100644 --- a/src/RHEO/fix_rheo.h +++ b/src/RHEO/fix_rheo.h @@ -41,19 +41,25 @@ class FixRHEO : public Fix { // Model parameters double cut; double *rho0, *csq; - int self_mass_flag; int zmin_kernel, zmin_surface, zmin_splash; int kernel_style, surface_style; double divr_surface; - // Accessory fixes/computes + // Settings flags int thermal_flag; int rhosum_flag; - int shift_flag; int interface_flag; int surface_flag; - int oxidation_flag; + int shift_flag; + int coordination_flag; + // Optional sub-flags/parameters + int rhosum_self_mass_flag; + int *shift_type; + int shift_cross_type_flag; + double shift_scale, shift_wmin, shift_cmin; + + // Accessory fixes/computes int viscosity_fix_defined; int pressure_fix_defined; int thermal_fix_defined; diff --git a/src/RHEO/fix_rheo_pressure.cpp b/src/RHEO/fix_rheo_pressure.cpp index 10bf6ff2c9..d972f19ffa 100644 --- a/src/RHEO/fix_rheo_pressure.cpp +++ b/src/RHEO/fix_rheo_pressure.cpp @@ -31,7 +31,7 @@ using namespace LAMMPS_NS; using namespace FixConst; -enum { NONE, LINEAR, CUBIC, TAITWATER, TAITGENERAL }; +enum { NONE, LINEAR, CUBIC, TAITWATER, TAITGENERAL , IDEAL }; static constexpr double SEVENTH = 1.0 / 7.0; @@ -39,12 +39,15 @@ static constexpr double SEVENTH = 1.0 / 7.0; FixRHEOPressure::FixRHEOPressure(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), c_cubic(nullptr), csq(nullptr), csqinv(nullptr), rho0(nullptr), - rho0inv(nullptr), tpower(nullptr), pbackground(nullptr), pressure_style(nullptr), - fix_rheo(nullptr) + rho0inv(nullptr), tpower(nullptr), pbackground(nullptr), gamma(nullptr), + pressure_style(nullptr), fix_rheo(nullptr) { if (narg < 4) error->all(FLERR, "Illegal fix command"); comm_forward = 1; + variable_csq = 0; + invertible_pressure = 1; + background_flag = 0; // Currently can only have one instance of fix rheo/pressure if (igroup != 0) error->all(FLERR, "fix rheo/pressure command requires group all"); @@ -55,7 +58,12 @@ FixRHEOPressure::FixRHEOPressure(LAMMPS *lmp, int narg, char **arg) : memory->create(c_cubic, n + 1, "rheo:c_cubic"); memory->create(tpower, n + 1, "rheo:tpower"); memory->create(pbackground, n + 1, "rheo:pbackground"); - for (i = 1; i <= n; i++) pressure_style[i] = NONE; + memory->create(gamma, n + 1, "rheo:gamma"); + + for (i = 1; i <= n; i++) { + pressure_style[i] = NONE; + pbackground[i] = 0.0; + } int iarg = 3; while (iarg < narg) { @@ -68,16 +76,14 @@ FixRHEOPressure::FixRHEOPressure(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg + 1], "tait/water") == 0) { for (i = nlo; i <= nhi; i++) pressure_style[i] = TAITWATER; } else if (strcmp(arg[iarg + 1], "tait/general") == 0) { - if (iarg + 3 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/pressure tait", error); + if (iarg + 2 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/pressure tait/general", error); double tpower_one = utils::numeric(FLERR, arg[iarg + 2], false, lmp); - double pbackground_one = utils::numeric(FLERR, arg[iarg + 3], false, lmp); - iarg += 2; + iarg += 1; for (i = nlo; i <= nhi; i++) { pressure_style[i] = TAITGENERAL; tpower[i] = tpower_one; - pbackground[i] = pbackground_one; } } else if (strcmp(arg[iarg + 1], "cubic") == 0) { if (iarg + 2 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/pressure cubic", error); @@ -89,6 +95,31 @@ FixRHEOPressure::FixRHEOPressure(LAMMPS *lmp, int narg, char **arg) : pressure_style[i] = CUBIC; c_cubic[i] = c_cubic_one; } + + invertible_pressure = 0; + } else if (strcmp(arg[iarg + 1], "ideal/gas") == 0) { + if (iarg + 2 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/pressure ideal/gas", error); + + double c_gamma_one = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + iarg += 1; + + for (i = nlo; i <= nhi; i++) { + pressure_style[i] = IDEAL; + gamma[i] = c_gamma_one; + } + + variable_csq = 1; + if (atom->esph_flag != 1) + error->all(FLERR, "fix rheo/pressure ideal gas equation of state requires atom property esph"); + } else if (strcmp(arg[iarg + 1], "background") == 0) { + if (iarg + 2 >= narg) utils::missing_cmd_args(FLERR, "fix rheo/pressure background", error); + + double pbackground_one = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + iarg += 1; + + for (i = nlo; i <= nhi; i++) + pbackground[i] = pbackground_one; + background_flag = 1; } else { error->all(FLERR, "Illegal fix command, {}", arg[iarg]); } @@ -110,6 +141,7 @@ FixRHEOPressure::~FixRHEOPressure() memory->destroy(c_cubic); memory->destroy(tpower); memory->destroy(pbackground); + memory->destroy(gamma); } /* ---------------------------------------------------------------------- */ @@ -197,10 +229,11 @@ void FixRHEOPressure::unpack_forward_comm(int n, int first, double *buf) /* ---------------------------------------------------------------------- */ -double FixRHEOPressure::calc_pressure(double rho, int type) +double FixRHEOPressure::calc_pressure(double rho, int i) { double p = 0.0; double dr, rr3, rho_ratio; + int type = atom->type[i]; if (pressure_style[type] == LINEAR) { p = csq[type] * (rho - rho0[type]); @@ -214,16 +247,25 @@ double FixRHEOPressure::calc_pressure(double rho, int type) } else if (pressure_style[type] == TAITGENERAL) { rho_ratio = rho * rho0inv[type]; p = csq[type] * rho0[type] * (pow(rho_ratio, tpower[type]) - 1.0) / tpower[type]; - p += pbackground[type]; + } else if (pressure_style[type] == IDEAL) { + p = (gamma[type] - 1.0) * rho * atom->esph[i] / atom->mass[type]; } + + if (background_flag) + p += pbackground[type]; + return p; } /* ---------------------------------------------------------------------- */ -double FixRHEOPressure::calc_rho(double p, int type) +double FixRHEOPressure::calc_rho(double p, int i) { double rho = 0.0; + int type = atom->type[i]; + + if (background_flag) + p -= pbackground[type]; if (pressure_style[type] == LINEAR) { rho = csqinv[type] * p + rho0[type]; @@ -235,10 +277,24 @@ double FixRHEOPressure::calc_rho(double p, int type) rho *= pow(rho0[type], 6.0 * SEVENTH); rho *= pow(csq[type], -SEVENTH); } else if (pressure_style[type] == TAITGENERAL) { - p -= pbackground[type]; rho = pow(tpower[type] * p + csq[type] * rho0[type], 1.0 / tpower[type]); rho *= pow(rho0[type], 1.0 - 1.0 / tpower[type]); rho *= pow(csq[type], -1.0 / tpower[type]); + } else if (pressure_style[type] == IDEAL) { + rho = p * atom->mass[type] / ((gamma[type] - 1.0) * atom->esph[i]); } return rho; } + +/* ---------------------------------------------------------------------- */ + +double FixRHEOPressure::calc_csq(double p, int i) +{ + int type = atom->type[i]; + double csq2 = csq[type]; + + if (pressure_style[type] == IDEAL) { + csq2 = (gamma[type] - 1.0) * atom->esph[i] / atom->mass[type]; + } + return csq2; +} diff --git a/src/RHEO/fix_rheo_pressure.h b/src/RHEO/fix_rheo_pressure.h index ca165b1ed5..c15e9b4ddc 100644 --- a/src/RHEO/fix_rheo_pressure.h +++ b/src/RHEO/fix_rheo_pressure.h @@ -36,10 +36,13 @@ class FixRHEOPressure : public Fix { void unpack_forward_comm(int, int, double *) override; double calc_pressure(double, int); double calc_rho(double, int); + double calc_csq(double, int); + int variable_csq; + int invertible_pressure; private: - double *c_cubic, *csq, *csqinv, *rho0, *rho0inv, *tpower, *pbackground; - int *pressure_style; + double *c_cubic, *csq, *csqinv, *rho0, *rho0inv, *tpower, *pbackground, *gamma; + int *pressure_style, background_flag; class FixRHEO *fix_rheo; }; diff --git a/src/RHEO/pair_rheo.cpp b/src/RHEO/pair_rheo.cpp index aa0c685aaa..5e06c45a3c 100644 --- a/src/RHEO/pair_rheo.cpp +++ b/src/RHEO/pair_rheo.cpp @@ -80,8 +80,8 @@ void PairRHEO::compute(int eflag, int vflag) int pair_force_flag, pair_rho_flag, pair_avisc_flag; int fluidi, fluidj; double xtmp, ytmp, ztmp, wp, Ti, Tj, dT, csq_ave, cs_ave; - double rhoi, rhoj, rho0i, rho0j, voli, volj, Pi, Pj, etai, etaj, kappai, kappaj, eta_ave, - kappa_ave, dT_prefactor; + double rhoi, rhoj, rho0i, rho0j, voli, volj, Pi, Pj, etai, etaj, kappai, kappaj, csqi, csqj; + double eta_ave, kappa_ave, dT_prefactor; double mu, q, fp_prefactor, drho_damp, fmag, psi_ij, Fij; double *dWij, *dWji; double dx[3], du[3], dv[3], fv[3], dfp[3], fsolid[3], ft[3], vi[3], vj[3]; @@ -185,7 +185,13 @@ void PairRHEO::compute(int eflag, int vflag) kappaj = conductivity[j]; } - cs_ave = 0.5 * (cs[itype] + cs[jtype]); + if (!variable_csq) { + cs_ave = 0.5 * (cs[itype] + cs[jtype]); + } else { + csqi = fix_pressure->calc_csq(rhoi, i); + csqj = fix_pressure->calc_csq(rhoj, j); + cs_ave = 0.5 * (sqrt(csqi) + sqrt(csqj)); + } csq_ave = cs_ave * cs_ave; pair_rho_flag = 0; @@ -221,7 +227,7 @@ void PairRHEO::compute(int eflag, int vflag) if (fluidi && (!fluidj)) { compute_interface->correct_v(vj, vi, j, i); rhoj = compute_interface->correct_rho(j); - Pj = fix_pressure->calc_pressure(rhoj, jtype); + Pj = fix_pressure->calc_pressure(rhoj, j); if ((chi[j] > 0.9) && (r < (cutk * 0.5))) fmag = (chi[j] - 0.9) * (cutk * 0.5 - r) * rho0j * csq_ave * cutk * rinv; @@ -229,7 +235,7 @@ void PairRHEO::compute(int eflag, int vflag) } else if ((!fluidi) && fluidj) { compute_interface->correct_v(vi, vj, i, j); rhoi = compute_interface->correct_rho(i); - Pi = fix_pressure->calc_pressure(rhoi, itype); + Pi = fix_pressure->calc_pressure(rhoi, i); if (chi[i] > 0.9 && r < (cutk * 0.5)) fmag = (chi[i] - 0.9) * (cutk * 0.5 - r) * rho0i * csq_ave * cutk * rinv; @@ -238,6 +244,14 @@ void PairRHEO::compute(int eflag, int vflag) rhoi = rho0i; rhoj = rho0j; } + + // recalculate speed of sound, if necessary + if (variable_csq && ((!fluidi) || (!fluidj))) { + csqi = fix_pressure->calc_csq(rhoi, i); + csqj = fix_pressure->calc_csq(rhoj, j); + cs_ave = 0.5 * (sqrt(csqi) + sqrt(csqj)); + csq_ave = cs_ave * cs_ave; + } } // Repel if close to inner solid particle @@ -480,6 +494,8 @@ void PairRHEO::setup() csq = fix_rheo->csq; rho0 = fix_rheo->rho0; + variable_csq = fix_pressure->variable_csq; + if (cutk != fix_rheo->cut) error->all(FLERR, "Pair rheo cutoff {} does not agree with fix rheo cutoff {}", cutk, fix_rheo->cut); diff --git a/src/RHEO/pair_rheo.h b/src/RHEO/pair_rheo.h index 444fcc2cb4..f1fcd10bf8 100644 --- a/src/RHEO/pair_rheo.h +++ b/src/RHEO/pair_rheo.h @@ -45,6 +45,7 @@ class PairRHEO : public Pair { int rho_damp_flag; int thermal_flag; int interface_flag; + int variable_csq; int harmonic_means_flag; diff --git a/src/RIGID/fix_ehex.cpp b/src/RIGID/fix_ehex.cpp index dc5f220a87..313bd3b59a 100644 --- a/src/RIGID/fix_ehex.cpp +++ b/src/RIGID/fix_ehex.cpp @@ -434,7 +434,7 @@ bool FixEHEX::check_cluster(tagint *shake_atom, int n, Region *region) // take into account pbc - domain->minimum_image(xtemp); + domain->minimum_image_big(xtemp); for (int k = 0; k < 3; k++) xcom[k] += mi * (x[lid[0]][k] + xtemp[k]); } diff --git a/src/SPH/pair_sph_taitwater.cpp b/src/SPH/pair_sph_taitwater.cpp index d97492de63..41eef91d6e 100644 --- a/src/SPH/pair_sph_taitwater.cpp +++ b/src/SPH/pair_sph_taitwater.cpp @@ -231,13 +231,13 @@ void PairSPHTaitwater::coeff(int narg, char **arg) allocate(); int ilo, ihi, jlo, jhi; - utils::bounds(FLERR,arg[0], 1, atom->ntypes, ilo, ihi, error); - utils::bounds(FLERR,arg[1], 1, atom->ntypes, jlo, jhi, error); + utils::bounds(FLERR, arg[0], 1, atom->ntypes, ilo, ihi, error); + utils::bounds(FLERR, arg[1], 1, atom->ntypes, jlo, jhi, error); - double rho0_one = utils::numeric(FLERR,arg[2],false,lmp); - double soundspeed_one = utils::numeric(FLERR,arg[3],false,lmp); - double viscosity_one = utils::numeric(FLERR,arg[4],false,lmp); - double cut_one = utils::numeric(FLERR,arg[5],false,lmp); + double rho0_one = utils::numeric(FLERR, arg[2], false, lmp); + double soundspeed_one = utils::numeric(FLERR, arg[3], false, lmp); + double viscosity_one = utils::numeric(FLERR, arg[4], false, lmp); + double cut_one = utils::numeric(FLERR, arg[5], false, lmp); double B_one = soundspeed_one * soundspeed_one * rho0_one / 7.0; int count = 0; @@ -254,7 +254,7 @@ void PairSPHTaitwater::coeff(int narg, char **arg) } if (count == 0) - error->all(FLERR,"Incorrect args for pair coefficients"); + error->all(FLERR, "Incorrect args for pair coefficients"); } /* ---------------------------------------------------------------------- @@ -264,7 +264,7 @@ void PairSPHTaitwater::coeff(int narg, char **arg) double PairSPHTaitwater::init_one(int i, int j) { if (setflag[i][j] == 0) { - error->all(FLERR,"All pair sph/taitwater coeffs are set"); + error->all(FLERR, "All pair sph/taitwater coeffs are not set"); } cut[j][i] = cut[i][j]; diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index 6d6ec1bbfd..b1b9dc077e 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -79,7 +79,7 @@ NEBSpin::NEBSpin(LAMMPS *lmp) : Command(lmp), fp(nullptr) { NEBSpin::~NEBSpin() { - MPI_Comm_free(&roots); + if (roots != MPI_COMM_NULL) MPI_Comm_free(&roots); memory->destroy(all); delete[] rdist; if (fp) { @@ -164,8 +164,10 @@ void NEBSpin::run() // create MPI communicator for root proc from each world int color; - if (me == 0) color = 0; - else color = 1; + if (me == 0) + color = 0; + else + color = MPI_UNDEFINED; MPI_Comm_split(uworld,color,0,&roots); // search for neb_spin fix, allocate it @@ -728,19 +730,21 @@ void NEBSpin::print_status() local_norm_inf = MAX(temp_inf,local_norm_inf); } - double fmaxreplica; - MPI_Allreduce(&tnorm2,&fmaxreplica,1,MPI_DOUBLE,MPI_MAX,roots); + double fmaxreplica = 0.0; + double fmaxatom = 0.0; double fnorminf = 0.0; MPI_Allreduce(&local_norm_inf,&fnorminf,1,MPI_DOUBLE,MPI_MAX,world); - double fmaxatom; - MPI_Allreduce(&fnorminf,&fmaxatom,1,MPI_DOUBLE,MPI_MAX,roots); - if (verbose) { - freplica = new double[nreplica]; - MPI_Allgather(&tnorm2,1,MPI_DOUBLE,&freplica[0],1,MPI_DOUBLE,roots); - fmaxatomInRepl = new double[nreplica]; - MPI_Allgather(&fnorminf,1,MPI_DOUBLE,&fmaxatomInRepl[0],1,MPI_DOUBLE,roots); + if (me == 0) { + MPI_Allreduce(&tnorm2,&fmaxreplica,1,MPI_DOUBLE,MPI_MAX,roots); + MPI_Allreduce(&fnorminf,&fmaxatom,1,MPI_DOUBLE,MPI_MAX,roots); + if (verbose) { + freplica = new double[nreplica]; + MPI_Allgather(&tnorm2,1,MPI_DOUBLE,&freplica[0],1,MPI_DOUBLE,roots); + fmaxatomInRepl = new double[nreplica]; + MPI_Allgather(&fnorminf,1,MPI_DOUBLE,&fmaxatomInRepl[0],1,MPI_DOUBLE,roots); + } } double one[7]; @@ -828,5 +832,9 @@ void NEBSpin::print_status() fprintf(ulogfile,"\n"); fflush(ulogfile); } + if ((me == 0) && verbose) { + delete[] freplica; + delete[] fmaxatomInRepl; + } } } diff --git a/src/YAFF/angle_cross.cpp b/src/YAFF/angle_cross.cpp index d3e127e935..067fe986e9 100644 --- a/src/YAFF/angle_cross.cpp +++ b/src/YAFF/angle_cross.cpp @@ -342,3 +342,19 @@ double AngleCross::single(int type, int i1, int i2, int i3) double energy = kss[type]*dr1*dr2+kbs0[type]*dr1*dtheta + kbs1[type]*dr2*dtheta; return energy; } + +/* ---------------------------------------------------------------------- + return ptr to internal members upon request +------------------------------------------------------------------------ */ + +void *AngleCross::extract(const char *str, int &dim) +{ + dim = 1; + if (strcmp(str, "r00") == 0) return (void *) r00; + if (strcmp(str, "r01") == 0) return (void *) r01; + if (strcmp(str, "kss") == 0) return (void *) kss; + if (strcmp(str, "kbs0") == 0) return (void *) kbs0; + if (strcmp(str, "kbs1") == 0) return (void *) kbs1; + if (strcmp(str, "theta0") == 0) return (void *) theta0; + return nullptr; +} diff --git a/src/YAFF/angle_cross.h b/src/YAFF/angle_cross.h index fea7c0fbc4..ddf73fab0b 100644 --- a/src/YAFF/angle_cross.h +++ b/src/YAFF/angle_cross.h @@ -35,6 +35,7 @@ class AngleCross : public Angle { void read_restart(FILE *) override; void write_data(FILE *) override; double single(int, int, int, int) override; + void *extract(const char *, int &) override; protected: double *kss, *kbs0, *kbs1, *r00, *r01, *theta0; diff --git a/src/angle_zero.cpp b/src/angle_zero.cpp index aad7f36d05..39ff64d2bb 100644 --- a/src/angle_zero.cpp +++ b/src/angle_zero.cpp @@ -54,13 +54,13 @@ void AngleZero::compute(int eflag, int vflag) void AngleZero::settings(int narg, char **arg) { - if ((narg != 0) && (narg != 1)) error->all(FLERR, "Illegal angle_style command"); + if (narg > 1) error->all(FLERR, "Too many angle_style zero keywords"); if (narg == 1) { if (strcmp("nocoeff", arg[0]) == 0) coeffflag = 0; else - error->all(FLERR, "Illegal angle_style command"); + error->all(FLERR, "Unknown angle_style zero keyword {}", arg[0]); } } diff --git a/src/atom.cpp b/src/atom.cpp index e0fceffe9c..04a21b9c52 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -3276,7 +3276,7 @@ int Atom::extract_datatype(const char *name) * \verbatim embed:rst -.. versionadded:: TBD +.. versionadded:: 19Nov2024 \endverbatim * diff --git a/src/comm.cpp b/src/comm.cpp index 1b1546f893..98f1ebf28a 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -228,13 +228,13 @@ void Comm::init() } for (const auto &compute : modify->get_compute_list()) { - maxforward = MAX(maxforward,compute->comm_forward); - maxreverse = MAX(maxreverse,compute->comm_reverse); + maxforward = MAX(maxforward, compute->comm_forward); + maxreverse = MAX(maxreverse, compute->comm_reverse); } for (const auto &dump: output->get_dump_list()) { - maxforward = MAX(maxforward,dump->comm_forward); - maxreverse = MAX(maxreverse,dump->comm_reverse); + maxforward = MAX(maxforward, dump->comm_forward); + maxreverse = MAX(maxreverse, dump->comm_reverse); } if (force->newton == 0) maxreverse = 0; diff --git a/src/comm.h b/src/comm.h index 8515866dff..13e44eda57 100644 --- a/src/comm.h +++ b/src/comm.h @@ -87,17 +87,17 @@ class Comm : protected Pointers { // forward/reverse comm from a Pair, Bond, Fix, Compute, Dump - virtual void forward_comm(class Pair *) = 0; - virtual void reverse_comm(class Pair *) = 0; - virtual void forward_comm(class Bond *) = 0; - virtual void reverse_comm(class Bond *) = 0; + virtual void forward_comm(class Pair *, int size = 0) = 0; + virtual void reverse_comm(class Pair *, int size = 0) = 0; + virtual void forward_comm(class Bond *, int size = 0) = 0; + virtual void reverse_comm(class Bond *, int size = 0) = 0; virtual void forward_comm(class Fix *, int size = 0) = 0; virtual void reverse_comm(class Fix *, int size = 0) = 0; virtual void reverse_comm_variable(class Fix *) = 0; - virtual void forward_comm(class Compute *) = 0; - virtual void reverse_comm(class Compute *) = 0; - virtual void forward_comm(class Dump *) = 0; - virtual void reverse_comm(class Dump *) = 0; + virtual void forward_comm(class Compute *, int size = 0) = 0; + virtual void reverse_comm(class Compute *, int size = 0) = 0; + virtual void forward_comm(class Dump *, int size = 0) = 0; + virtual void reverse_comm(class Dump *, int size = 0) = 0; // forward comm of an array diff --git a/src/comm_brick.cpp b/src/comm_brick.cpp index c75b183584..1e9bfe6aca 100644 --- a/src/comm_brick.cpp +++ b/src/comm_brick.cpp @@ -984,16 +984,21 @@ void CommBrick::borders() /* ---------------------------------------------------------------------- forward communication invoked by a Pair - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Pair + size > 0 -> Pair passes max size per atom + the latter is only useful if Pair does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommBrick::forward_comm(Pair *pair) +void CommBrick::forward_comm(Pair *pair, int size) { - int iswap,n; + int iswap,n,nsize; double *buf; MPI_Request request; - int nsize = pair->comm_forward; + if (size) nsize = size; + else nsize = pair->comm_forward; for (iswap = 0; iswap < nswap; iswap++) { @@ -1021,16 +1026,21 @@ void CommBrick::forward_comm(Pair *pair) /* ---------------------------------------------------------------------- reverse communication invoked by a Pair - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Pair + size > 0 -> Pair passes max size per atom + the latter is only useful if Pair does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommBrick::reverse_comm(Pair *pair) +void CommBrick::reverse_comm(Pair *pair, int size) { - int iswap,n; + int iswap,n,nsize; double *buf; MPI_Request request; - int nsize = MAX(pair->comm_reverse,pair->comm_reverse_off); + if (size) nsize = size; + else nsize = MAX(pair->comm_reverse,pair->comm_reverse_off); for (iswap = nswap-1; iswap >= 0; iswap--) { @@ -1058,16 +1068,21 @@ void CommBrick::reverse_comm(Pair *pair) /* ---------------------------------------------------------------------- forward communication invoked by a Bond - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Bond + size > 0 -> Bond passes max size per atom + the latter is only useful if Bond does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommBrick::forward_comm(Bond *bond) +void CommBrick::forward_comm(Bond *bond, int size) { - int iswap,n; + int iswap,n,nsize; double *buf; MPI_Request request; - int nsize = bond->comm_forward; + if (size) nsize = size; + else nsize = bond->comm_forward; for (iswap = 0; iswap < nswap; iswap++) { @@ -1095,16 +1110,21 @@ void CommBrick::forward_comm(Bond *bond) /* ---------------------------------------------------------------------- reverse communication invoked by a Bond - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Bond + size > 0 -> Bond passes max size per atom + the latter is only useful if Bond does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommBrick::reverse_comm(Bond *bond) +void CommBrick::reverse_comm(Bond *bond, int size) { - int iswap,n; + int iswap,n,nsize; double *buf; MPI_Request request; - int nsize = MAX(bond->comm_reverse,bond->comm_reverse_off); + if (size) nsize = size; + else nsize = MAX(bond->comm_reverse,bond->comm_reverse_off); for (iswap = nswap-1; iswap >= 0; iswap--) { @@ -1175,10 +1195,10 @@ void CommBrick::forward_comm(Fix *fix, int size) /* ---------------------------------------------------------------------- reverse communication invoked by a Fix size/nsize used only to set recv buffer limit - size = 0 (default) -> use comm_forward from Fix + size = 0 (default) -> use comm_reverse from Fix size > 0 -> Fix passes max size per atom the latter is only useful if Fix does several comm modes, - some are smaller than max stored in its comm_forward + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ void CommBrick::reverse_comm(Fix *fix, int size) @@ -1259,16 +1279,21 @@ void CommBrick::reverse_comm_variable(Fix *fix) /* ---------------------------------------------------------------------- forward communication invoked by a Compute - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Compute + size > 0 -> Compute passes max size per atom + the latter is only useful if Compute does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommBrick::forward_comm(Compute *compute) +void CommBrick::forward_comm(Compute *compute, int size) { - int iswap,n; + int iswap,n,nsize; double *buf; MPI_Request request; - int nsize = compute->comm_forward; + if (size) nsize = size; + else nsize = compute->comm_forward; for (iswap = 0; iswap < nswap; iswap++) { @@ -1297,16 +1322,21 @@ void CommBrick::forward_comm(Compute *compute) /* ---------------------------------------------------------------------- reverse communication invoked by a Compute - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Compute + size > 0 -> Compute passes max size per atom + the latter is only useful if Compute does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommBrick::reverse_comm(Compute *compute) +void CommBrick::reverse_comm(Compute *compute, int size) { - int iswap,n; + int iswap,n,nsize; double *buf; MPI_Request request; - int nsize = compute->comm_reverse; + if (size) nsize = size; + else nsize = compute->comm_reverse; for (iswap = nswap-1; iswap >= 0; iswap--) { @@ -1334,16 +1364,21 @@ void CommBrick::reverse_comm(Compute *compute) /* ---------------------------------------------------------------------- forward communication invoked by a Dump - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Dump + size > 0 -> Dump passes max size per atom + the latter is only useful if Dump does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommBrick::forward_comm(Dump *dump) +void CommBrick::forward_comm(Dump *dump, int size) { - int iswap,n; + int iswap,n,nsize; double *buf; MPI_Request request; - int nsize = dump->comm_forward; + if (size) nsize = size; + else nsize = dump->comm_forward; for (iswap = 0; iswap < nswap; iswap++) { @@ -1372,16 +1407,21 @@ void CommBrick::forward_comm(Dump *dump) /* ---------------------------------------------------------------------- reverse communication invoked by a Dump - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Dump + size > 0 -> Dump passes max size per atom + the latter is only useful if Dump does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommBrick::reverse_comm(Dump *dump) +void CommBrick::reverse_comm(Dump *dump, int size) { - int iswap,n; + int iswap,n,nsize; double *buf; MPI_Request request; - int nsize = dump->comm_reverse; + if (size) nsize = size; + else nsize = dump->comm_reverse; for (iswap = nswap-1; iswap >= 0; iswap--) { diff --git a/src/comm_brick.h b/src/comm_brick.h index 809b3856e4..8878b44f4f 100644 --- a/src/comm_brick.h +++ b/src/comm_brick.h @@ -32,17 +32,17 @@ class CommBrick : public Comm { void exchange() override; // move atoms to new procs void borders() override; // setup list of atoms to comm - void forward_comm(class Pair *) override; // forward comm from a Pair - void reverse_comm(class Pair *) override; // reverse comm from a Pair - void forward_comm(class Bond *) override; // forward comm from a Bond - void reverse_comm(class Bond *) override; // reverse comm from a Bond - void forward_comm(class Fix *, int size = 0) override; // forward comm from a Fix - void reverse_comm(class Fix *, int size = 0) override; // reverse comm from a Fix - void reverse_comm_variable(class Fix *) override; // variable size reverse comm from a Fix - void forward_comm(class Compute *) override; // forward from a Compute - void reverse_comm(class Compute *) override; // reverse from a Compute - void forward_comm(class Dump *) override; // forward comm from a Dump - void reverse_comm(class Dump *) override; // reverse comm from a Dump + void forward_comm(class Pair *, int size = 0) override; // forward comm from a Pair + void reverse_comm(class Pair *, int size = 0) override; // reverse comm from a Pair + void forward_comm(class Bond *, int size = 0) override; // forward comm from a Bond + void reverse_comm(class Bond *, int size = 0) override; // reverse comm from a Bond + void forward_comm(class Fix *, int size = 0) override; // forward comm from a Fix + void reverse_comm(class Fix *, int size = 0) override; // reverse comm from a Fix + void reverse_comm_variable(class Fix *) override; // variable size reverse comm from a Fix + void forward_comm(class Compute *, int size = 0) override; // forward from a Compute + void reverse_comm(class Compute *, int size = 0) override; // reverse from a Compute + void forward_comm(class Dump *, int size = 0) override; // forward comm from a Dump + void reverse_comm(class Dump *, int size = 0) override; // reverse comm from a Dump void forward_comm_array(int, double **) override; // forward comm of array void *extract(const char *, int &) override; diff --git a/src/comm_tiled.cpp b/src/comm_tiled.cpp index f4657c4790..e8b5d19fa5 100644 --- a/src/comm_tiled.cpp +++ b/src/comm_tiled.cpp @@ -1382,14 +1382,19 @@ void CommTiled::borders() /* ---------------------------------------------------------------------- forward communication invoked by a Pair - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Pair + size > 0 -> Pair passes max size per atom + the latter is only useful if Pair does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommTiled::forward_comm(Pair *pair) +void CommTiled::forward_comm(Pair *pair, int size) { - int i,irecv,n,nsend,nrecv; + int i,irecv,n,nsize,nsend,nrecv; - int nsize = pair->comm_forward; + if (size) nsize = size; + else nsize = pair->comm_forward; for (int iswap = 0; iswap < nswap; iswap++) { nsend = nsendproc[iswap] - sendself[iswap]; @@ -1426,14 +1431,19 @@ void CommTiled::forward_comm(Pair *pair) /* ---------------------------------------------------------------------- reverse communication invoked by a Pair - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Fix + size > 0 -> Fix passes max size per atom + the latter is only useful if Fix does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommTiled::reverse_comm(Pair *pair) +void CommTiled::reverse_comm(Pair *pair, int size) { - int i,irecv,n,nsend,nrecv; + int i,irecv,n,nsize,nsend,nrecv; - int nsize = MAX(pair->comm_reverse,pair->comm_reverse_off); + if (size) nsize = MAX(pair->comm_reverse, pair->comm_reverse_off); + else nsize = pair->comm_reverse; for (int iswap = nswap-1; iswap >= 0; iswap--) { nsend = nsendproc[iswap] - sendself[iswap]; @@ -1466,14 +1476,18 @@ void CommTiled::reverse_comm(Pair *pair) /* ---------------------------------------------------------------------- forward communication invoked by a Bond - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Bond + size > 0 -> Bond passes max size per atom + the latter is only useful if Bond does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ - -void CommTiled::forward_comm(Bond *bond) +void CommTiled::forward_comm(Bond *bond, int size) { - int i,irecv,n,nsend,nrecv; + int i,irecv,n,nsize,nsend,nrecv; - int nsize = bond->comm_forward; + if (size) nsize = size; + else nsize = bond->comm_forward; for (int iswap = 0; iswap < nswap; iswap++) { nsend = nsendproc[iswap] - sendself[iswap]; @@ -1510,14 +1524,19 @@ void CommTiled::forward_comm(Bond *bond) /* ---------------------------------------------------------------------- reverse communication invoked by a Bond - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Bond + size > 0 -> Bond passes max size per atom + the latter is only useful if Bond does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommTiled::reverse_comm(Bond *bond) +void CommTiled::reverse_comm(Bond *bond, int size) { - int i,irecv,n,nsend,nrecv; + int i,irecv,n,nsize,nsend,nrecv; - int nsize = MAX(bond->comm_reverse,bond->comm_reverse_off); + if (size) nsize = size; + else nsize = MAX(bond->comm_reverse,bond->comm_reverse_off); for (int iswap = nswap-1; iswap >= 0; iswap--) { nsend = nsendproc[iswap] - sendself[iswap]; @@ -1598,10 +1617,10 @@ void CommTiled::forward_comm(Fix *fix, int size) /* ---------------------------------------------------------------------- reverse communication invoked by a Fix size/nsize used only to set recv buffer limit - size = 0 (default) -> use comm_forward from Fix + size = 0 (default) -> use comm_reverse from Fix size > 0 -> Fix passes max size per atom the latter is only useful if Fix does several comm modes, - some are smaller than max stored in its comm_forward + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ void CommTiled::reverse_comm(Fix *fix, int size) @@ -1654,14 +1673,19 @@ void CommTiled::reverse_comm_variable(Fix * /*fix*/) /* ---------------------------------------------------------------------- forward communication invoked by a Compute - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Compute + size > 0 -> Compute passes max size per atom + the latter is only useful if Compute does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommTiled::forward_comm(Compute *compute) +void CommTiled::forward_comm(Compute *compute, int size) { - int i,irecv,n,nsend,nrecv; + int i,irecv,n,nsize,nsend,nrecv; - int nsize = compute->comm_forward; + if (size) nsize = size; + else nsize = compute->comm_forward; for (int iswap = 0; iswap < nswap; iswap++) { nsend = nsendproc[iswap] - sendself[iswap]; @@ -1697,14 +1721,19 @@ void CommTiled::forward_comm(Compute *compute) /* ---------------------------------------------------------------------- reverse communication invoked by a Compute - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Compute + size > 0 -> Compute passes max size per atom + the latter is only useful if Compute does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommTiled::reverse_comm(Compute *compute) +void CommTiled::reverse_comm(Compute *compute, int size) { - int i,irecv,n,nsend,nrecv; + int i,irecv,n,nsize,nsend,nrecv; - int nsize = compute->comm_reverse; + if (size) nsize = size; + else nsize = compute->comm_reverse; for (int iswap = nswap-1; iswap >= 0; iswap--) { nsend = nsendproc[iswap] - sendself[iswap]; @@ -1738,14 +1767,19 @@ void CommTiled::reverse_comm(Compute *compute) /* ---------------------------------------------------------------------- forward communication invoked by a Dump - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_forward from Dump + size > 0 -> Dump passes max size per atom + the latter is only useful if Dump does several comm modes, + some are smaller than max stored in its comm_forward ------------------------------------------------------------------------- */ -void CommTiled::forward_comm(Dump *dump) +void CommTiled::forward_comm(Dump *dump, int size) { - int i,irecv,n,nsend,nrecv; + int i,irecv,n,nsize,nsend,nrecv; - int nsize = dump->comm_forward; + if (size) nsize = size; + else nsize = dump->comm_forward; for (int iswap = 0; iswap < nswap; iswap++) { nsend = nsendproc[iswap] - sendself[iswap]; @@ -1781,14 +1815,19 @@ void CommTiled::forward_comm(Dump *dump) /* ---------------------------------------------------------------------- reverse communication invoked by a Dump - nsize used only to set recv buffer limit + size/nsize used only to set recv buffer limit + size = 0 (default) -> use comm_reverse from Dump + size > 0 -> Dump passes max size per atom + the latter is only useful if Dump does several comm modes, + some are smaller than max stored in its comm_reverse ------------------------------------------------------------------------- */ -void CommTiled::reverse_comm(Dump *dump) +void CommTiled::reverse_comm(Dump *dump, int size) { - int i,irecv,n,nsend,nrecv; + int i,irecv,n,nsize,nsend,nrecv; - int nsize = dump->comm_reverse; + if (size) nsize = size; + else nsize = dump->comm_reverse; for (int iswap = nswap-1; iswap >= 0; iswap--) { nsend = nsendproc[iswap] - sendself[iswap]; diff --git a/src/comm_tiled.h b/src/comm_tiled.h index e150c710fc..64b80d8d18 100644 --- a/src/comm_tiled.h +++ b/src/comm_tiled.h @@ -32,17 +32,17 @@ class CommTiled : public Comm { void exchange() override; // move atoms to new procs void borders() override; // setup list of atoms to comm - void forward_comm(class Pair *) override; // forward comm from a Pair - void reverse_comm(class Pair *) override; // reverse comm from a Pair - void forward_comm(class Bond *) override; // forward comm from a Bond - void reverse_comm(class Bond *) override; // reverse comm from a Bond - void forward_comm(class Fix *, int size = 0) override; // forward comm from a Fix - void reverse_comm(class Fix *, int size = 0) override; // reverse comm from a Fix - void reverse_comm_variable(class Fix *) override; // variable size reverse comm from a Fix - void forward_comm(class Compute *) override; // forward from a Compute - void reverse_comm(class Compute *) override; // reverse from a Compute - void forward_comm(class Dump *) override; // forward comm from a Dump - void reverse_comm(class Dump *) override; // reverse comm from a Dump + void forward_comm(class Pair *, int size = 0) override; // forward comm from a Pair + void reverse_comm(class Pair *, int size = 0) override; // reverse comm from a Pair + void forward_comm(class Bond *, int size = 0) override; // forward comm from a Bond + void reverse_comm(class Bond *, int size = 0) override; // reverse comm from a Bond + void forward_comm(class Fix *, int size = 0) override; // forward comm from a Fix + void reverse_comm(class Fix *, int size = 0) override; // reverse comm from a Fix + void reverse_comm_variable(class Fix *) override; // variable size reverse comm from a Fix + void forward_comm(class Compute *, int size = 0) override; // forward from a Compute + void reverse_comm(class Compute *, int size = 0) override; // reverse from a Compute + void forward_comm(class Dump *, int size = 0) override; // forward comm from a Dump + void reverse_comm(class Dump *, int size = 0) override; // reverse comm from a Dump void forward_comm_array(int, double **) override; // forward comm of array diff --git a/src/command.h b/src/command.h index 23f315fc27..0122727463 100644 --- a/src/command.h +++ b/src/command.h @@ -20,8 +20,12 @@ namespace LAMMPS_NS { class Command : protected Pointers { public: - Command(class LAMMPS *lmp) : Pointers(lmp) {}; + Command(class LAMMPS *lmp) : Pointers(lmp), copymode(0) {}; virtual void command(int, char **) = 0; + + protected: + int copymode; // if set, do not deallocate during destruction + // required when classes are used as functors by Kokkos }; } // namespace LAMMPS_NS diff --git a/src/compute_angle_local.cpp b/src/compute_angle_local.cpp index 3e8b15fd64..b4a9334416 100644 --- a/src/compute_angle_local.cpp +++ b/src/compute_angle_local.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -13,38 +12,40 @@ ------------------------------------------------------------------------- */ #include "compute_angle_local.h" -#include -#include + +#include "angle.h" #include "atom.h" #include "atom_vec.h" -#include "molecule.h" -#include "update.h" #include "domain.h" +#include "error.h" #include "force.h" -#include "angle.h" #include "input.h" -#include "variable.h" #include "math_const.h" #include "memory.h" -#include "error.h" +#include "molecule.h" +#include "update.h" +#include "variable.h" + +#include +#include using namespace LAMMPS_NS; using namespace MathConst; static constexpr int DELTA = 10000; -enum{THETA,ENG,VARIABLE}; +enum { THETA, ENG, VARIABLE }; /* ---------------------------------------------------------------------- */ ComputeAngleLocal::ComputeAngleLocal(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg), - bstyle(nullptr), vvar(nullptr), tstr(nullptr), vstr(nullptr), vlocal(nullptr), alocal(nullptr) + Compute(lmp, narg, arg), bstyle(nullptr), vvar(nullptr), tstr(nullptr), vstr(nullptr), + vlocal(nullptr), alocal(nullptr) { - if (narg < 4) error->all(FLERR,"Illegal compute angle/local command"); + if (narg < 4) error->all(FLERR, "Illegal compute angle/local command"); if (atom->avec->angles_allow == 0) - error->all(FLERR,"Compute angle/local used when angles are not allowed"); + error->all(FLERR, "Compute angle/local used when angles are not allowed"); local_flag = 1; @@ -52,7 +53,7 @@ ComputeAngleLocal::ComputeAngleLocal(LAMMPS *lmp, int narg, char **arg) : nvalues = narg - 3; bstyle = new int[nvalues]; - vstr = new char*[nvalues]; + vstr = new char *[nvalues]; vvar = new int[nvalues]; nvalues = 0; @@ -61,16 +62,17 @@ ComputeAngleLocal::ComputeAngleLocal(LAMMPS *lmp, int narg, char **arg) : int iarg; for (iarg = 3; iarg < narg; iarg++) { - if (strcmp(arg[iarg],"theta") == 0) { + if (strcmp(arg[iarg], "theta") == 0) { bstyle[nvalues++] = THETA; tflag = 1; - } else if (strcmp(arg[iarg],"eng") == 0) { + } else if (strcmp(arg[iarg], "eng") == 0) { bstyle[nvalues++] = ENG; - } else if (strncmp(arg[iarg],"v_",2) == 0) { + } else if (strncmp(arg[iarg], "v_", 2) == 0) { bstyle[nvalues++] = VARIABLE; vstr[nvar] = utils::strdup(&arg[iarg][2]); nvar++; - } else break; + } else + break; } // optional args @@ -79,45 +81,46 @@ ComputeAngleLocal::ComputeAngleLocal(LAMMPS *lmp, int narg, char **arg) : tstr = nullptr; while (iarg < narg) { - if (strcmp(arg[iarg],"set") == 0) { + if (strcmp(arg[iarg], "set") == 0) { setflag = 1; - if (iarg+3 > narg) error->all(FLERR,"Illegal compute angle/local command"); - if (strcmp(arg[iarg+1],"theta") == 0) { - delete [] tstr; - tstr = utils::strdup(arg[iarg+2]); + if (iarg + 3 > narg) error->all(FLERR, "Illegal compute angle/local command"); + if (strcmp(arg[iarg + 1], "theta") == 0) { + delete[] tstr; + tstr = utils::strdup(arg[iarg + 2]); tflag = 1; - } else error->all(FLERR,"Illegal compute angle/local command"); + } else + error->all(FLERR, "Illegal compute angle/local command"); iarg += 3; - } else error->all(FLERR,"Illegal compute angle/local command"); + } else + error->all(FLERR, "Illegal compute angle/local command"); } // error check if (nvar) { - if (!setflag) - error->all(FLERR,"Compute angle/local variable requires a set variable"); + if (!setflag) error->all(FLERR, "Compute angle/local variable requires a set variable"); for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); - if (vvar[i] < 0) - error->all(FLERR,"Variable name for copute angle/local does not exist"); + if (vvar[i] < 0) error->all(FLERR, "Variable name for compute angle/local does not exist"); if (!input->variable->equalstyle(vvar[i])) - error->all(FLERR,"Variable for compute angle/local is invalid style"); + error->all(FLERR, "Variable for compute angle/local is invalid style"); } if (tstr) { tvar = input->variable->find(tstr); - if (tvar < 0) - error->all(FLERR,"Variable name for compute angle/local does not exist"); + if (tvar < 0) error->all(FLERR, "Variable name for compute angle/local does not exist"); if (!input->variable->internalstyle(tvar)) - error->all(FLERR,"Variable for compute angle/local is invalid style"); + error->all(FLERR, "Variable for compute angle/local is invalid style"); } } else if (setflag) - error->all(FLERR,"Compute angle/local set with no variable"); + error->all(FLERR, "Compute angle/local set with no variable"); // initialize output - if (nvalues == 1) size_local_cols = 0; - else size_local_cols = nvalues; + if (nvalues == 1) + size_local_cols = 0; + else + size_local_cols = nvalues; nmax = 0; vlocal = nullptr; @@ -128,12 +131,12 @@ ComputeAngleLocal::ComputeAngleLocal(LAMMPS *lmp, int narg, char **arg) : ComputeAngleLocal::~ComputeAngleLocal() { - delete [] bstyle; - for (int i = 0; i < nvar; i++) delete [] vstr[i]; - delete [] vstr; - delete [] vvar; + delete[] bstyle; + for (int i = 0; i < nvar; i++) delete[] vstr[i]; + delete[] vstr; + delete[] vvar; - delete [] tstr; + delete[] tstr; memory->destroy(vlocal); memory->destroy(alocal); @@ -144,19 +147,17 @@ ComputeAngleLocal::~ComputeAngleLocal() void ComputeAngleLocal::init() { if (force->angle == nullptr) - error->all(FLERR,"No angle style is defined for compute angle/local"); + error->all(FLERR, "No angle style is defined for compute angle/local"); if (nvar) { for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); - if (vvar[i] < 0) - error->all(FLERR,"Variable name for compute angle/local does not exist"); + if (vvar[i] < 0) error->all(FLERR, "Variable name for compute angle/local does not exist"); } if (tstr) { tvar = input->variable->find(tstr); - if (tvar < 0) - error->all(FLERR,"Variable name for compute angle/local does not exist"); + if (tvar < 0) error->all(FLERR, "Variable name for compute angle/local does not exist"); } } @@ -194,10 +195,10 @@ void ComputeAngleLocal::compute_local() int ComputeAngleLocal::compute_angles(int flag) { - int i,m,na,atom1,atom2,atom3,imol,iatom,atype,ivar; + int i, m, na, atom1, atom2, atom3, imol, iatom, atype, ivar; tagint tagprev; - double delx1,dely1,delz1,delx2,dely2,delz2; - double rsq1,rsq2,r1,r2,c,theta; + double delx1, dely1, delz1, delx2, dely2, delz2; + double rsq1, rsq2, r1, r2, c, theta; double *ptr; double **x = atom->x; @@ -224,7 +225,8 @@ int ComputeAngleLocal::compute_angles(int flag) for (atom2 = 0; atom2 < nlocal; atom2++) { if (!(mask[atom2] & groupbit)) continue; - if (molecular == Atom::MOLECULAR) na = num_angle[atom2]; + if (molecular == Atom::MOLECULAR) + na = num_angle[atom2]; else { if (molindex[atom2] < 0) continue; imol = molindex[atom2]; @@ -242,8 +244,8 @@ int ComputeAngleLocal::compute_angles(int flag) if (tag[atom2] != onemols[imol]->angle_atom2[atom2][i]) continue; atype = onemols[imol]->angle_type[atom2][i]; tagprev = tag[atom2] - iatom - 1; - atom1 = atom->map(onemols[imol]->angle_atom1[atom2][i]+tagprev); - atom3 = atom->map(onemols[imol]->angle_atom3[atom2][i]+tagprev); + atom1 = atom->map(onemols[imol]->angle_atom1[atom2][i] + tagprev); + atom3 = atom->map(onemols[imol]->angle_atom3[atom2][i] + tagprev); } if (atom1 < 0 || !(mask[atom1] & groupbit)) continue; @@ -261,50 +263,54 @@ int ComputeAngleLocal::compute_angles(int flag) delx1 = x[atom1][0] - x[atom2][0]; dely1 = x[atom1][1] - x[atom2][1]; delz1 = x[atom1][2] - x[atom2][2]; - domain->minimum_image(delx1,dely1,delz1); + domain->minimum_image(delx1, dely1, delz1); - rsq1 = delx1*delx1 + dely1*dely1 + delz1*delz1; + rsq1 = delx1 * delx1 + dely1 * dely1 + delz1 * delz1; r1 = sqrt(rsq1); delx2 = x[atom3][0] - x[atom2][0]; dely2 = x[atom3][1] - x[atom2][1]; delz2 = x[atom3][2] - x[atom2][2]; - domain->minimum_image(delx2,dely2,delz2); + domain->minimum_image(delx2, dely2, delz2); - rsq2 = delx2*delx2 + dely2*dely2 + delz2*delz2; + rsq2 = delx2 * delx2 + dely2 * dely2 + delz2 * delz2; r2 = sqrt(rsq2); // c = cosine of angle // theta = angle in radians - c = delx1*delx2 + dely1*dely2 + delz1*delz2; - c /= r1*r2; + c = delx1 * delx2 + dely1 * dely2 + delz1 * delz2; + c /= r1 * r2; if (c > 1.0) c = 1.0; if (c < -1.0) c = -1.0; theta = acos(c); } - if (nvalues == 1) ptr = &vlocal[m]; - else ptr = alocal[m]; + if (nvalues == 1) + ptr = &vlocal[m]; + else + ptr = alocal[m]; if (nvar) { ivar = 0; - if (tstr) input->variable->internal_set(tvar,theta); + if (tstr) input->variable->internal_set(tvar, theta); } for (int n = 0; n < nvalues; n++) { switch (bstyle[n]) { - case THETA: - ptr[n] = 180.0*theta/MY_PI; - break; - case ENG: - if (atype > 0) ptr[n] = angle->single(atype,atom1,atom2,atom3); - else ptr[n] = 0.0; - break; - case VARIABLE: - ptr[n] = input->variable->compute_equal(vvar[ivar]); - ivar++; - break; + case THETA: + ptr[n] = 180.0 * theta / MY_PI; + break; + case ENG: + if (atype > 0) + ptr[n] = angle->single(atype, atom1, atom2, atom3); + else + ptr[n] = 0.0; + break; + case VARIABLE: + ptr[n] = input->variable->compute_equal(vvar[ivar]); + ivar++; + break; } } @@ -325,11 +331,11 @@ void ComputeAngleLocal::reallocate(int n) if (nvalues == 1) { memory->destroy(vlocal); - memory->create(vlocal,nmax,"angle/local:vector_local"); + memory->create(vlocal, nmax, "angle/local:vector_local"); vector_local = vlocal; } else { memory->destroy(alocal); - memory->create(alocal,nmax,nvalues,"angle/local:array_local"); + memory->create(alocal, nmax, nvalues, "angle/local:array_local"); array_local = alocal; } } @@ -340,6 +346,6 @@ void ComputeAngleLocal::reallocate(int n) double ComputeAngleLocal::memory_usage() { - double bytes = (double)nmax*nvalues * sizeof(double); + double bytes = (double) nmax * nvalues * sizeof(double); return bytes; } diff --git a/src/compute_bond_local.cpp b/src/compute_bond_local.cpp index e3c3e26a85..e9632d254f 100644 --- a/src/compute_bond_local.cpp +++ b/src/compute_bond_local.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -35,18 +34,35 @@ using namespace LAMMPS_NS; static constexpr int DELTA = 10000; -enum{DIST,DX,DY,DZ,VELVIB,OMEGA,ENGTRANS,ENGVIB,ENGROT,ENGPOT,FORCE,FX,FY,FZ,VARIABLE,BN}; +enum { + DIST, + DX, + DY, + DZ, + VELVIB, + OMEGA, + ENGTRANS, + ENGVIB, + ENGROT, + ENGPOT, + FORCE, + FX, + FY, + FZ, + VARIABLE, + BN +}; /* ---------------------------------------------------------------------- */ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg), - bstyle(nullptr), vvar(nullptr), dstr(nullptr), vstr(nullptr), vlocal(nullptr), alocal(nullptr) + Compute(lmp, narg, arg), bstyle(nullptr), vvar(nullptr), dstr(nullptr), vstr(nullptr), + vlocal(nullptr), alocal(nullptr) { - if (narg < 4) error->all(FLERR,"Illegal compute bond/local command"); + if (narg < 4) error->all(FLERR, "Illegal compute bond/local command"); if (atom->avec->bonds_allow == 0) - error->all(FLERR,"Compute bond/local used when bonds are not allowed"); + error->all(FLERR, "Compute bond/local used when bonds are not allowed"); local_flag = 1; comm_forward = 3; @@ -56,7 +72,7 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : nvalues = narg - 3; bstyle = new int[nvalues]; bindex = new int[nvalues]; - vstr = new char*[nvalues]; + vstr = new char *[nvalues]; vvar = new int[nvalues]; nvalues = 0; @@ -64,30 +80,45 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : int iarg; for (iarg = 3; iarg < narg; iarg++) { - if (strcmp(arg[iarg],"dist") == 0) bstyle[nvalues++] = DIST; - else if (strcmp(arg[iarg],"dx") == 0) bstyle[nvalues++] = DX; - else if (strcmp(arg[iarg],"dy") == 0) bstyle[nvalues++] = DY; - else if (strcmp(arg[iarg],"dz") == 0) bstyle[nvalues++] = DZ; - else if (strcmp(arg[iarg],"engpot") == 0) bstyle[nvalues++] = ENGPOT; - else if (strcmp(arg[iarg],"force") == 0) bstyle[nvalues++] = FORCE; - else if (strcmp(arg[iarg],"fx") == 0) bstyle[nvalues++] = FX; - else if (strcmp(arg[iarg],"fy") == 0) bstyle[nvalues++] = FY; - else if (strcmp(arg[iarg],"fz") == 0) bstyle[nvalues++] = FZ; - else if (strcmp(arg[iarg],"engvib") == 0) bstyle[nvalues++] = ENGVIB; - else if (strcmp(arg[iarg],"engrot") == 0) bstyle[nvalues++] = ENGROT; - else if (strcmp(arg[iarg],"engtrans") == 0) bstyle[nvalues++] = ENGTRANS; - else if (strcmp(arg[iarg],"omega") == 0) bstyle[nvalues++] = OMEGA; - else if (strcmp(arg[iarg],"velvib") == 0) bstyle[nvalues++] = VELVIB; - else if (strncmp(arg[iarg],"v_",2) == 0) { + if (strcmp(arg[iarg], "dist") == 0) + bstyle[nvalues++] = DIST; + else if (strcmp(arg[iarg], "dx") == 0) + bstyle[nvalues++] = DX; + else if (strcmp(arg[iarg], "dy") == 0) + bstyle[nvalues++] = DY; + else if (strcmp(arg[iarg], "dz") == 0) + bstyle[nvalues++] = DZ; + else if (strcmp(arg[iarg], "engpot") == 0) + bstyle[nvalues++] = ENGPOT; + else if (strcmp(arg[iarg], "force") == 0) + bstyle[nvalues++] = FORCE; + else if (strcmp(arg[iarg], "fx") == 0) + bstyle[nvalues++] = FX; + else if (strcmp(arg[iarg], "fy") == 0) + bstyle[nvalues++] = FY; + else if (strcmp(arg[iarg], "fz") == 0) + bstyle[nvalues++] = FZ; + else if (strcmp(arg[iarg], "engvib") == 0) + bstyle[nvalues++] = ENGVIB; + else if (strcmp(arg[iarg], "engrot") == 0) + bstyle[nvalues++] = ENGROT; + else if (strcmp(arg[iarg], "engtrans") == 0) + bstyle[nvalues++] = ENGTRANS; + else if (strcmp(arg[iarg], "omega") == 0) + bstyle[nvalues++] = OMEGA; + else if (strcmp(arg[iarg], "velvib") == 0) + bstyle[nvalues++] = VELVIB; + else if (strncmp(arg[iarg], "v_", 2) == 0) { bstyle[nvalues++] = VARIABLE; vstr[nvar] = utils::strdup(&arg[iarg][2]); nvar++; - } else if (utils::strmatch(arg[iarg], "^b\\d+$")) { // b1, b2, b3, ... bN + } else if (utils::strmatch(arg[iarg], "^b\\d+$")) { // b1, b2, b3, ... bN int n = std::stoi(&arg[iarg][1]); if (n <= 0) error->all(FLERR, "Invalid keyword {} in compute bond/local command", arg[iarg]); bstyle[nvalues] = BN; bindex[nvalues++] = n - 1; - } else break; + } else + break; } // optional args @@ -96,40 +127,39 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : dstr = nullptr; while (iarg < narg) { - if (strcmp(arg[iarg],"set") == 0) { + if (strcmp(arg[iarg], "set") == 0) { setflag = 1; - if (iarg+3 > narg) utils::missing_cmd_args(FLERR,"compute bond/local set", error); - if (strcmp(arg[iarg+1],"dist") == 0) { - delete [] dstr; - dstr = utils::strdup(arg[iarg+2]); - } else error->all(FLERR,"Unknown compute bond/local set keyword: {}", arg[iarg+2]); + if (iarg + 3 > narg) utils::missing_cmd_args(FLERR, "compute bond/local set", error); + if (strcmp(arg[iarg + 1], "dist") == 0) { + delete[] dstr; + dstr = utils::strdup(arg[iarg + 2]); + } else + error->all(FLERR, "Unknown compute bond/local set keyword: {}", arg[iarg + 2]); iarg += 3; - } else error->all(FLERR,"Unknown compute bond/local keyword: {}", arg[iarg]); + } else + error->all(FLERR, "Unknown compute bond/local keyword: {}", arg[iarg]); } // error check if (nvar) { - if (!setflag) - error->all(FLERR,"Compute bond/local variable requires a set variable"); + if (!setflag) error->all(FLERR, "Compute bond/local variable requires a set variable"); for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); if (vvar[i] < 0) - error->all(FLERR,"Variable name {} for copute bond/local does not exist", vstr[i]); + error->all(FLERR, "Variable name {} for compute bond/local does not exist", vstr[i]); if (!input->variable->equalstyle(vvar[i])) - error->all(FLERR,"Variable {} for compute bond/local is invalid style", vstr[i]); + error->all(FLERR, "Variable {} for compute bond/local is invalid style", vstr[i]); } if (dstr) { dvar = input->variable->find(dstr); - if (dvar < 0) - error->all(FLERR,"Variable name for compute bond/local does not exist"); + if (dvar < 0) error->all(FLERR, "Variable name for compute bond/local does not exist"); if (!input->variable->internalstyle(dvar)) - error->all(FLERR,"Variable for compute bond/local is invalid style"); + error->all(FLERR, "Variable for compute bond/local is invalid style"); } } else if (setflag) - error->all(FLERR,"Compute bond/local set used with without a variable"); - + error->all(FLERR, "Compute bond/local set used with without a variable"); // set singleflag if need to call bond->single() // set velflag if compute any quantities based on velocities @@ -137,16 +167,20 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : singleflag = 0; velflag = 0; for (int i = 0; i < nvalues; i++) { - if (bstyle[i] == ENGPOT || bstyle[i] == FORCE || bstyle[i] == FX || - bstyle[i] == FY || bstyle[i] == FZ || bstyle[i] == BN) singleflag = 1; - if (bstyle[i] == VELVIB || bstyle[i] == OMEGA || bstyle[i] == ENGTRANS || - bstyle[i] == ENGVIB || bstyle[i] == ENGROT) velflag = 1; + if (bstyle[i] == ENGPOT || bstyle[i] == FORCE || bstyle[i] == FX || bstyle[i] == FY || + bstyle[i] == FZ || bstyle[i] == BN) + singleflag = 1; + if (bstyle[i] == VELVIB || bstyle[i] == OMEGA || bstyle[i] == ENGTRANS || bstyle[i] == ENGVIB || + bstyle[i] == ENGROT) + velflag = 1; } // initialize output - if (nvalues == 1) size_local_cols = 0; - else size_local_cols = nvalues; + if (nvalues == 1) + size_local_cols = 0; + else + size_local_cols = nvalues; nmax = 0; vlocal = nullptr; @@ -157,13 +191,13 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : ComputeBondLocal::~ComputeBondLocal() { - delete [] bstyle; - delete [] bindex; - for (int i = 0; i < nvar; i++) delete [] vstr[i]; - delete [] vstr; - delete [] vvar; + delete[] bstyle; + delete[] bindex; + for (int i = 0; i < nvar; i++) delete[] vstr[i]; + delete[] vstr; + delete[] vvar; - delete [] dstr; + delete[] dstr; memory->destroy(vlocal); memory->destroy(alocal); @@ -173,8 +207,7 @@ ComputeBondLocal::~ComputeBondLocal() void ComputeBondLocal::init() { - if (force->bond == nullptr) - error->all(FLERR,"No bond style is defined for compute bond/local"); + if (force->bond == nullptr) error->all(FLERR, "No bond style is defined for compute bond/local"); for (int i = 0; i < nvalues; i++) if (bstyle[i] == BN && bindex[i] >= force->bond->single_extra) @@ -183,21 +216,21 @@ void ComputeBondLocal::init() if (nvar) { for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); - if (vvar[i] < 0) - error->all(FLERR,"Variable name for compute bond/local does not exist"); + if (vvar[i] < 0) error->all(FLERR, "Variable name for compute bond/local does not exist"); } if (dstr) { dvar = input->variable->find(dstr); - if (dvar < 0) - error->all(FLERR,"Variable name for compute bond/local does not exist"); + if (dvar < 0) error->all(FLERR, "Variable name for compute bond/local does not exist"); } } // set ghostvelflag if need to acquire ghost atom velocities - if (velflag && !comm->ghost_velocity) ghostvelflag = 1; - else ghostvelflag = 0; + if (velflag && !comm->ghost_velocity) + ghostvelflag = 1; + else + ghostvelflag = 0; // do initial memory allocation so that memory_usage() is correct @@ -236,17 +269,17 @@ void ComputeBondLocal::compute_local() int ComputeBondLocal::compute_bonds(int flag) { - int i,m,nb,atom1,atom2,imol,iatom,btype,ivar; + int i, m, nb, atom1, atom2, imol, iatom, btype, ivar; tagint tagprev; - double dx,dy,dz,rsq; - double mass1,mass2,masstotal,invmasstotal; - double xcm[3],vcm[3]; - double delr1[3],delr2[3],delv1[3],delv2[3]; - double r12[3],vpar1,vpar2; - double vvib,vrotsq; - double inertia,omegasq; + double dx, dy, dz, rsq; + double mass1, mass2, masstotal, invmasstotal; + double xcm[3], vcm[3]; + double delr1[3], delr2[3], delv1[3], delv2[3]; + double r12[3], vpar1, vpar2; + double vvib, vrotsq; + double inertia, omegasq; double mvv2e; - double engpot,engtrans,engvib,engrot,fbond; + double engpot, engtrans, engvib, engrot, fbond; double *ptr; double **x = atom->x; @@ -280,7 +313,8 @@ int ComputeBondLocal::compute_bonds(int flag) for (atom1 = 0; atom1 < nlocal; atom1++) { if (!(mask[atom1] & groupbit)) continue; - if (molecular == Atom::MOLECULAR) nb = num_bond[atom1]; + if (molecular == Atom::MOLECULAR) + nb = num_bond[atom1]; else { if (molindex[atom1] < 0) continue; imol = molindex[atom1]; @@ -295,7 +329,7 @@ int ComputeBondLocal::compute_bonds(int flag) } else { tagprev = tag[atom1] - iatom - 1; btype = onemols[imol]->bond_type[iatom][i]; - atom2 = atom->map(onemols[imol]->bond_atom[iatom][i]+tagprev); + atom2 = atom->map(onemols[imol]->bond_atom[iatom][i] + tagprev); } if (atom2 < 0 || !(mask[atom2] & groupbit)) continue; @@ -310,55 +344,56 @@ int ComputeBondLocal::compute_bonds(int flag) dx = x[atom1][0] - x[atom2][0]; dy = x[atom1][1] - x[atom2][1]; dz = x[atom1][2] - x[atom2][2]; - domain->minimum_image(dx,dy,dz); - rsq = dx*dx + dy*dy + dz*dz; + domain->minimum_image(dx, dy, dz); + rsq = dx * dx + dy * dy + dz * dz; if (btype == 0) { fbond = 0.0; } else { - if (singleflag) engpot = bond->single(btype,rsq,atom1,atom2,fbond); - else fbond = engpot = 0.0; + if (singleflag) + engpot = bond->single(btype, rsq, atom1, atom2, fbond); + else + fbond = engpot = 0.0; engvib = engrot = engtrans = omegasq = vvib = 0.0; if (velflag) { if (rmass) { mass1 = rmass[atom1]; mass2 = rmass[atom2]; - } - else { + } else { mass1 = mass[type[atom1]]; mass2 = mass[type[atom2]]; } - masstotal = mass1+mass2; + masstotal = mass1 + mass2; invmasstotal = 1.0 / (masstotal); - xcm[0] = (mass1*x[atom1][0] + mass2*x[atom2][0]) * invmasstotal; - xcm[1] = (mass1*x[atom1][1] + mass2*x[atom2][1]) * invmasstotal; - xcm[2] = (mass1*x[atom1][2] + mass2*x[atom2][2]) * invmasstotal; - vcm[0] = (mass1*v[atom1][0] + mass2*v[atom2][0]) * invmasstotal; - vcm[1] = (mass1*v[atom1][1] + mass2*v[atom2][1]) * invmasstotal; - vcm[2] = (mass1*v[atom1][2] + mass2*v[atom2][2]) * invmasstotal; + xcm[0] = (mass1 * x[atom1][0] + mass2 * x[atom2][0]) * invmasstotal; + xcm[1] = (mass1 * x[atom1][1] + mass2 * x[atom2][1]) * invmasstotal; + xcm[2] = (mass1 * x[atom1][2] + mass2 * x[atom2][2]) * invmasstotal; + vcm[0] = (mass1 * v[atom1][0] + mass2 * v[atom2][0]) * invmasstotal; + vcm[1] = (mass1 * v[atom1][1] + mass2 * v[atom2][1]) * invmasstotal; + vcm[2] = (mass1 * v[atom1][2] + mass2 * v[atom2][2]) * invmasstotal; engtrans = 0.5 * masstotal * MathExtra::lensq3(vcm); // r12 = unit bond vector from atom1 to atom2 - MathExtra::sub3(x[atom2],x[atom1],r12); + MathExtra::sub3(x[atom2], x[atom1], r12); MathExtra::norm3(r12); // delr = vector from COM to each atom // delv = velocity of each atom relative to COM - MathExtra::sub3(x[atom1],xcm,delr1); - MathExtra::sub3(x[atom2],xcm,delr2); - MathExtra::sub3(v[atom1],vcm,delv1); - MathExtra::sub3(v[atom2],vcm,delv2); + MathExtra::sub3(x[atom1], xcm, delr1); + MathExtra::sub3(x[atom2], xcm, delr2); + MathExtra::sub3(v[atom1], vcm, delv1); + MathExtra::sub3(v[atom2], vcm, delv2); // vpar = component of delv parallel to bond vector - vpar1 = MathExtra::dot3(delv1,r12); - vpar2 = MathExtra::dot3(delv2,r12); - engvib = 0.5 * (mass1*vpar1*vpar1 + mass2*vpar2*vpar2); + vpar1 = MathExtra::dot3(delv1, r12); + vpar2 = MathExtra::dot3(delv2, r12); + engvib = 0.5 * (mass1 * vpar1 * vpar1 + mass2 * vpar2 * vpar2); // vvib = relative velocity of 2 atoms along bond direction // vvib < 0 for 2 atoms moving towards each other @@ -369,9 +404,8 @@ int ComputeBondLocal::compute_bonds(int flag) // vrotsq = tangential speed squared of atom1 only // omegasq = omega squared, and is the same for atom1 and atom2 - inertia = mass1*MathExtra::lensq3(delr1) + - mass2*MathExtra::lensq3(delr2); - vrotsq = MathExtra::lensq3(delv1) - vpar1*vpar1; + inertia = mass1 * MathExtra::lensq3(delr1) + mass2 * MathExtra::lensq3(delr2); + vrotsq = MathExtra::lensq3(delv1) - vpar1 * vpar1; omegasq = vrotsq / MathExtra::lensq3(delr1); engrot = 0.5 * inertia * omegasq; @@ -384,12 +418,14 @@ int ComputeBondLocal::compute_bonds(int flag) engrot *= mvv2e; } - if (nvalues == 1) ptr = &vlocal[m]; - else ptr = alocal[m]; + if (nvalues == 1) + ptr = &vlocal[m]; + else + ptr = alocal[m]; if (nvar) { ivar = 0; - if (dstr) input->variable->internal_set(dvar,sqrt(rsq)); + if (dstr) input->variable->internal_set(dvar, sqrt(rsq)); } // to make sure dx, dy and dz are always from the lower to the higher id @@ -397,55 +433,55 @@ int ComputeBondLocal::compute_bonds(int flag) for (int n = 0; n < nvalues; n++) { switch (bstyle[n]) { - case DIST: - ptr[n] = sqrt(rsq); - break; - case DX: - ptr[n] = dx*directionCorrection; - break; - case DY: - ptr[n] = dy*directionCorrection; - break; - case DZ: - ptr[n] = dz*directionCorrection; - break; - case ENGPOT: - ptr[n] = engpot; - break; - case FORCE: - ptr[n] = sqrt(rsq)*fbond; - break; - case FX: - ptr[n] = dx*fbond; - break; - case FY: - ptr[n] = dy*fbond; - break; - case FZ: - ptr[n] = dz*fbond; - break; - case ENGVIB: - ptr[n] = engvib; - break; - case ENGROT: - ptr[n] = engrot; - break; - case ENGTRANS: - ptr[n] = engtrans; - break; - case OMEGA: - ptr[n] = sqrt(omegasq); - break; - case VELVIB: - ptr[n] = vvib; - break; - case VARIABLE: - ptr[n] = input->variable->compute_equal(vvar[ivar]); - ivar++; - break; - case BN: - ptr[n] = bond->svector[bindex[n]]; - break; + case DIST: + ptr[n] = sqrt(rsq); + break; + case DX: + ptr[n] = dx * directionCorrection; + break; + case DY: + ptr[n] = dy * directionCorrection; + break; + case DZ: + ptr[n] = dz * directionCorrection; + break; + case ENGPOT: + ptr[n] = engpot; + break; + case FORCE: + ptr[n] = sqrt(rsq) * fbond; + break; + case FX: + ptr[n] = dx * fbond; + break; + case FY: + ptr[n] = dy * fbond; + break; + case FZ: + ptr[n] = dz * fbond; + break; + case ENGVIB: + ptr[n] = engvib; + break; + case ENGROT: + ptr[n] = engrot; + break; + case ENGTRANS: + ptr[n] = engtrans; + break; + case OMEGA: + ptr[n] = sqrt(omegasq); + break; + case VELVIB: + ptr[n] = vvib; + break; + case VARIABLE: + ptr[n] = input->variable->compute_equal(vvar[ivar]); + ivar++; + break; + case BN: + ptr[n] = bond->svector[bindex[n]]; + break; } } } @@ -459,10 +495,10 @@ int ComputeBondLocal::compute_bonds(int flag) /* ---------------------------------------------------------------------- */ -int ComputeBondLocal::pack_forward_comm(int n, int *list, double *buf, - int /*pbc_flag*/, int * /*pbc*/) +int ComputeBondLocal::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, + int * /*pbc*/) { - int i,j,m; + int i, j, m; double **v = atom->v; @@ -481,7 +517,7 @@ int ComputeBondLocal::pack_forward_comm(int n, int *list, double *buf, void ComputeBondLocal::unpack_forward_comm(int n, int first, double *buf) { - int i,m,last; + int i, m, last; double **v = atom->v; @@ -504,11 +540,11 @@ void ComputeBondLocal::reallocate(int n) if (nvalues == 1) { memory->destroy(vlocal); - memory->create(vlocal,nmax,"bond/local:vector_local"); + memory->create(vlocal, nmax, "bond/local:vector_local"); vector_local = vlocal; } else { memory->destroy(alocal); - memory->create(alocal,nmax,nvalues,"bond/local:array_local"); + memory->create(alocal, nmax, nvalues, "bond/local:array_local"); array_local = alocal; } } @@ -519,6 +555,6 @@ void ComputeBondLocal::reallocate(int n) double ComputeBondLocal::memory_usage() { - double bytes = (double)nmax*nvalues * sizeof(double); + double bytes = (double) nmax * nvalues * sizeof(double); return bytes; } diff --git a/src/compute_dihedral_local.cpp b/src/compute_dihedral_local.cpp index 894d0e33e4..bd1e389e85 100644 --- a/src/compute_dihedral_local.cpp +++ b/src/compute_dihedral_local.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -13,19 +12,21 @@ ------------------------------------------------------------------------- */ #include "compute_dihedral_local.h" -#include -#include + #include "atom.h" #include "atom_vec.h" -#include "molecule.h" -#include "update.h" #include "domain.h" +#include "error.h" #include "force.h" #include "input.h" -#include "variable.h" #include "math_const.h" #include "memory.h" -#include "error.h" +#include "molecule.h" +#include "update.h" +#include "variable.h" + +#include +#include using namespace LAMMPS_NS; using namespace MathConst; @@ -37,14 +38,13 @@ enum { PHI, VARIABLE }; /* ---------------------------------------------------------------------- */ ComputeDihedralLocal::ComputeDihedralLocal(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg), - bstyle(nullptr), vvar(nullptr), pstr(nullptr), vstr(nullptr), vlocal(nullptr), alocal(nullptr) + Compute(lmp, narg, arg), bstyle(nullptr), vvar(nullptr), pstr(nullptr), vstr(nullptr), + vlocal(nullptr), alocal(nullptr) { - if (narg < 4) error->all(FLERR,"Illegal compute dihedral/local command"); + if (narg < 4) error->all(FLERR, "Illegal compute dihedral/local command"); if (atom->avec->dihedrals_allow == 0) - error->all(FLERR, - "Compute dihedral/local used when dihedrals are not allowed"); + error->all(FLERR, "Compute dihedral/local used when dihedrals are not allowed"); local_flag = 1; @@ -52,7 +52,7 @@ ComputeDihedralLocal::ComputeDihedralLocal(LAMMPS *lmp, int narg, char **arg) : nvalues = narg - 3; bstyle = new int[nvalues]; - vstr = new char*[nvalues]; + vstr = new char *[nvalues]; vvar = new int[nvalues]; nvalues = 0; @@ -60,13 +60,14 @@ ComputeDihedralLocal::ComputeDihedralLocal(LAMMPS *lmp, int narg, char **arg) : int iarg; for (iarg = 3; iarg < narg; iarg++) { - if (strcmp(arg[iarg],"phi") == 0) { + if (strcmp(arg[iarg], "phi") == 0) { bstyle[nvalues++] = PHI; - } else if (strncmp(arg[iarg],"v_",2) == 0) { + } else if (strncmp(arg[iarg], "v_", 2) == 0) { bstyle[nvalues++] = VARIABLE; vstr[nvar] = utils::strdup(&arg[iarg][2]); nvar++; - } else break; + } else + break; } // optional args @@ -75,47 +76,45 @@ ComputeDihedralLocal::ComputeDihedralLocal(LAMMPS *lmp, int narg, char **arg) : pstr = nullptr; while (iarg < narg) { - if (strcmp(arg[iarg],"set") == 0) { + if (strcmp(arg[iarg], "set") == 0) { setflag = 1; - if (iarg+3 > narg) - error->all(FLERR,"Illegal compute dihedral/local command"); - if (strcmp(arg[iarg+1],"phi") == 0) { - delete [] pstr; - pstr = utils::strdup(arg[iarg+2]); - } else error->all(FLERR,"Illegal compute dihedral/local command"); + if (iarg + 3 > narg) error->all(FLERR, "Illegal compute dihedral/local command"); + if (strcmp(arg[iarg + 1], "phi") == 0) { + delete[] pstr; + pstr = utils::strdup(arg[iarg + 2]); + } else + error->all(FLERR, "Illegal compute dihedral/local command"); iarg += 3; - } else error->all(FLERR,"Illegal compute dihedral/local command"); + } else + error->all(FLERR, "Illegal compute dihedral/local command"); } // error check if (nvar) { - if (!setflag) - error->all(FLERR,"Compute dihedral/local variable requires a set variable"); + if (!setflag) error->all(FLERR, "Compute dihedral/local variable requires a set variable"); for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); - if (vvar[i] < 0) - error->all(FLERR, - "Variable name for copute dihedral/local does not exist"); + if (vvar[i] < 0) error->all(FLERR, "Variable name for compute dihedral/local does not exist"); if (!input->variable->equalstyle(vvar[i])) - error->all(FLERR,"Variable for compute dihedral/local is invalid style"); + error->all(FLERR, "Variable for compute dihedral/local is invalid style"); } if (pstr) { pvar = input->variable->find(pstr); - if (pvar < 0) - error->all(FLERR, - "Variable name for compute dihedral/local does not exist"); + if (pvar < 0) error->all(FLERR, "Variable name for compute dihedral/local does not exist"); if (!input->variable->internalstyle(pvar)) - error->all(FLERR,"Variable for compute dihedral/local is invalid style"); + error->all(FLERR, "Variable for compute dihedral/local is invalid style"); } } else if (setflag) - error->all(FLERR,"Compute dihedral/local set with no variable"); + error->all(FLERR, "Compute dihedral/local set with no variable"); // initialize output - if (nvalues == 1) size_local_cols = 0; - else size_local_cols = nvalues; + if (nvalues == 1) + size_local_cols = 0; + else + size_local_cols = nvalues; nmax = 0; vlocal = nullptr; @@ -126,12 +125,12 @@ ComputeDihedralLocal::ComputeDihedralLocal(LAMMPS *lmp, int narg, char **arg) : ComputeDihedralLocal::~ComputeDihedralLocal() { - delete [] bstyle; - for (int i = 0; i < nvar; i++) delete [] vstr[i]; - delete [] vstr; - delete [] vvar; + delete[] bstyle; + for (int i = 0; i < nvar; i++) delete[] vstr[i]; + delete[] vstr; + delete[] vvar; - delete [] pstr; + delete[] pstr; memory->destroy(vlocal); memory->destroy(alocal); @@ -142,21 +141,17 @@ ComputeDihedralLocal::~ComputeDihedralLocal() void ComputeDihedralLocal::init() { if (force->dihedral == nullptr) - error->all(FLERR,"No dihedral style is defined for compute dihedral/local"); + error->all(FLERR, "No dihedral style is defined for compute dihedral/local"); if (nvar) { for (int i = 0; i < nvar; i++) { vvar[i] = input->variable->find(vstr[i]); - if (vvar[i] < 0) - error->all(FLERR, - "Variable name for compute dihedral/local does not exist"); + if (vvar[i] < 0) error->all(FLERR, "Variable name for compute dihedral/local does not exist"); } if (pstr) { pvar = input->variable->find(pstr); - if (pvar < 0) - error->all(FLERR, - "Variable name for compute dihedral/local does not exist"); + if (pvar < 0) error->all(FLERR, "Variable name for compute dihedral/local does not exist"); } } @@ -191,11 +186,11 @@ void ComputeDihedralLocal::compute_local() int ComputeDihedralLocal::compute_dihedrals(int flag) { - int i,m,nd,atom1,atom2,atom3,atom4,imol,iatom,ivar; + int i, m, nd, atom1, atom2, atom3, atom4, imol, iatom, ivar; tagint tagprev; - double vb1x,vb1y,vb1z,vb2x,vb2y,vb2z,vb3x,vb3y,vb3z,vb2xm,vb2ym,vb2zm; - double ax,ay,az,bx,by,bz,rasq,rbsq,rgsq,rg,ra2inv,rb2inv,rabinv; - double s,c,phi; + double vb1x, vb1y, vb1z, vb2x, vb2y, vb2z, vb3x, vb3y, vb3z, vb2xm, vb2ym, vb2zm; + double ax, ay, az, bx, by, bz, rasq, rbsq, rgsq, rg, ra2inv, rb2inv, rabinv; + double s, c, phi; double *ptr; double **x = atom->x; @@ -220,7 +215,8 @@ int ComputeDihedralLocal::compute_dihedrals(int flag) for (atom2 = 0; atom2 < nlocal; atom2++) { if (!(mask[atom2] & groupbit)) continue; - if (molecular == Atom::MOLECULAR) nd = num_dihedral[atom2]; + if (molecular == Atom::MOLECULAR) + nd = num_dihedral[atom2]; else { if (molindex[atom2] < 0) continue; imol = molindex[atom2]; @@ -237,9 +233,9 @@ int ComputeDihedralLocal::compute_dihedrals(int flag) } else { if (tag[atom2] != onemols[imol]->dihedral_atom2[atom2][i]) continue; tagprev = tag[atom2] - iatom - 1; - atom1 = atom->map(onemols[imol]->dihedral_atom1[atom2][i]+tagprev); - atom3 = atom->map(onemols[imol]->dihedral_atom3[atom2][i]+tagprev); - atom4 = atom->map(onemols[imol]->dihedral_atom4[atom2][i]+tagprev); + atom1 = atom->map(onemols[imol]->dihedral_atom1[atom2][i] + tagprev); + atom3 = atom->map(onemols[imol]->dihedral_atom3[atom2][i] + tagprev); + atom4 = atom->map(onemols[imol]->dihedral_atom4[atom2][i] + tagprev); } if (atom1 < 0 || !(mask[atom1] & groupbit)) continue; @@ -256,64 +252,66 @@ int ComputeDihedralLocal::compute_dihedrals(int flag) vb1x = x[atom1][0] - x[atom2][0]; vb1y = x[atom1][1] - x[atom2][1]; vb1z = x[atom1][2] - x[atom2][2]; - domain->minimum_image(vb1x,vb1y,vb1z); + domain->minimum_image(vb1x, vb1y, vb1z); vb2x = x[atom3][0] - x[atom2][0]; vb2y = x[atom3][1] - x[atom2][1]; vb2z = x[atom3][2] - x[atom2][2]; - domain->minimum_image(vb2x,vb2y,vb2z); + domain->minimum_image(vb2x, vb2y, vb2z); vb2xm = -vb2x; vb2ym = -vb2y; vb2zm = -vb2z; - domain->minimum_image(vb2xm,vb2ym,vb2zm); + domain->minimum_image(vb2xm, vb2ym, vb2zm); vb3x = x[atom4][0] - x[atom3][0]; vb3y = x[atom4][1] - x[atom3][1]; vb3z = x[atom4][2] - x[atom3][2]; - domain->minimum_image(vb3x,vb3y,vb3z); + domain->minimum_image(vb3x, vb3y, vb3z); - ax = vb1y*vb2zm - vb1z*vb2ym; - ay = vb1z*vb2xm - vb1x*vb2zm; - az = vb1x*vb2ym - vb1y*vb2xm; - bx = vb3y*vb2zm - vb3z*vb2ym; - by = vb3z*vb2xm - vb3x*vb2zm; - bz = vb3x*vb2ym - vb3y*vb2xm; + ax = vb1y * vb2zm - vb1z * vb2ym; + ay = vb1z * vb2xm - vb1x * vb2zm; + az = vb1x * vb2ym - vb1y * vb2xm; + bx = vb3y * vb2zm - vb3z * vb2ym; + by = vb3z * vb2xm - vb3x * vb2zm; + bz = vb3x * vb2ym - vb3y * vb2xm; - rasq = ax*ax + ay*ay + az*az; - rbsq = bx*bx + by*by + bz*bz; - rgsq = vb2xm*vb2xm + vb2ym*vb2ym + vb2zm*vb2zm; + rasq = ax * ax + ay * ay + az * az; + rbsq = bx * bx + by * by + bz * bz; + rgsq = vb2xm * vb2xm + vb2ym * vb2ym + vb2zm * vb2zm; rg = sqrt(rgsq); ra2inv = rb2inv = 0.0; - if (rasq > 0) ra2inv = 1.0/rasq; - if (rbsq > 0) rb2inv = 1.0/rbsq; - rabinv = sqrt(ra2inv*rb2inv); + if (rasq > 0) ra2inv = 1.0 / rasq; + if (rbsq > 0) rb2inv = 1.0 / rbsq; + rabinv = sqrt(ra2inv * rb2inv); - c = (ax*bx + ay*by + az*bz)*rabinv; - s = rg*rabinv*(ax*vb3x + ay*vb3y + az*vb3z); + c = (ax * bx + ay * by + az * bz) * rabinv; + s = rg * rabinv * (ax * vb3x + ay * vb3y + az * vb3z); if (c > 1.0) c = 1.0; if (c < -1.0) c = -1.0; - phi = atan2(s,c); + phi = atan2(s, c); - if (nvalues == 1) ptr = &vlocal[m]; - else ptr = alocal[m]; + if (nvalues == 1) + ptr = &vlocal[m]; + else + ptr = alocal[m]; if (nvar) { ivar = 0; - if (pstr) input->variable->internal_set(pvar,phi); + if (pstr) input->variable->internal_set(pvar, phi); } for (int n = 0; n < nvalues; n++) { switch (bstyle[n]) { - case PHI: - ptr[n] = 180.0*phi/MY_PI; - break; - case VARIABLE: - ptr[n] = input->variable->compute_equal(vvar[ivar]); - ivar++; - break; + case PHI: + ptr[n] = 180.0 * phi / MY_PI; + break; + case VARIABLE: + ptr[n] = input->variable->compute_equal(vvar[ivar]); + ivar++; + break; } } @@ -334,11 +332,11 @@ void ComputeDihedralLocal::reallocate(int n) if (nvalues == 1) { memory->destroy(vlocal); - memory->create(vlocal,nmax,"dihedral/local:vector_local"); + memory->create(vlocal, nmax, "dihedral/local:vector_local"); vector_local = vlocal; } else { memory->destroy(alocal); - memory->create(alocal,nmax,nvalues,"dihedral/local:array_local"); + memory->create(alocal, nmax, nvalues, "dihedral/local:array_local"); array_local = alocal; } } @@ -349,6 +347,6 @@ void ComputeDihedralLocal::reallocate(int n) double ComputeDihedralLocal::memory_usage() { - double bytes = (double)nmax*nvalues * sizeof(double); + double bytes = (double) nmax * nvalues * sizeof(double); return bytes; } diff --git a/src/compute_improper_local.cpp b/src/compute_improper_local.cpp index a58f4f4d0d..ff8f069a03 100644 --- a/src/compute_improper_local.cpp +++ b/src/compute_improper_local.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -13,36 +12,35 @@ ------------------------------------------------------------------------- */ #include "compute_improper_local.h" -#include -#include + #include "atom.h" #include "atom_vec.h" -#include "molecule.h" -#include "update.h" #include "domain.h" +#include "error.h" #include "force.h" #include "math_const.h" #include "memory.h" -#include "error.h" +#include "molecule.h" +#include "update.h" + +#include +#include using namespace LAMMPS_NS; using namespace MathConst; static constexpr int DELTA = 10000; - -static constexpr double SMALL = 0.001; +static constexpr double SMALL = 0.001; /* ---------------------------------------------------------------------- */ ComputeImproperLocal::ComputeImproperLocal(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg), - vlocal(nullptr), alocal(nullptr) + Compute(lmp, narg, arg), vlocal(nullptr), alocal(nullptr) { - if (narg < 4) error->all(FLERR,"Illegal compute improper/local command"); + if (narg < 4) error->all(FLERR, "Illegal compute improper/local command"); if (atom->avec->impropers_allow == 0) - error->all(FLERR, - "Compute improper/local used when impropers are not allowed"); + error->all(FLERR, "Compute improper/local used when impropers are not allowed"); local_flag = 1; nvalues = narg - 3; @@ -50,12 +48,16 @@ ComputeImproperLocal::ComputeImproperLocal(LAMMPS *lmp, int narg, char **arg) : nvalues = 0; for (int iarg = 3; iarg < narg; iarg++) { - if (strcmp(arg[iarg],"chi") == 0) cflag = nvalues++; - else error->all(FLERR,"Invalid keyword in compute improper/local command"); + if (strcmp(arg[iarg], "chi") == 0) + cflag = nvalues++; + else + error->all(FLERR, "Invalid keyword in compute improper/local command"); } - if (nvalues == 1) size_local_cols = 0; - else size_local_cols = nvalues; + if (nvalues == 1) + size_local_cols = 0; + else + size_local_cols = nvalues; nmax = 0; vlocal = nullptr; @@ -75,7 +77,7 @@ ComputeImproperLocal::~ComputeImproperLocal() void ComputeImproperLocal::init() { if (force->improper == nullptr) - error->all(FLERR,"No improper style is defined for compute improper/local"); + error->all(FLERR, "No improper style is defined for compute improper/local"); // do initial memory allocation so that memory_usage() is correct @@ -108,11 +110,11 @@ void ComputeImproperLocal::compute_local() int ComputeImproperLocal::compute_impropers(int flag) { - int i,m,n,ni,atom1,atom2,atom3,atom4,imol,iatom; + int i, m, n, ni, atom1, atom2, atom3, atom4, imol, iatom; tagint tagprev; - double vb1x,vb1y,vb1z,vb2x,vb2y,vb2z,vb3x,vb3y,vb3z; - double ss1,ss2,ss3,r1,r2,r3,c0,c1,c2,s1,s2; - double s12,c; + double vb1x, vb1y, vb1z, vb2x, vb2y, vb2z, vb3x, vb3y, vb3z; + double ss1, ss2, ss3, r1, r2, r3, c0, c1, c2, s1, s2; + double s12, c; double *cbuf; double **x = atom->x; @@ -135,8 +137,10 @@ int ComputeImproperLocal::compute_impropers(int flag) if (nvalues == 1) { if (cflag >= 0) cbuf = vlocal; } else { - if (cflag >= 0 && alocal) cbuf = &alocal[0][cflag]; - else cbuf = nullptr; + if (cflag >= 0 && alocal) + cbuf = &alocal[0][cflag]; + else + cbuf = nullptr; } } @@ -144,7 +148,8 @@ int ComputeImproperLocal::compute_impropers(int flag) for (atom2 = 0; atom2 < nlocal; atom2++) { if (!(mask[atom2] & groupbit)) continue; - if (molecular == Atom::MOLECULAR) ni = num_improper[atom2]; + if (molecular == Atom::MOLECULAR) + ni = num_improper[atom2]; else { if (molindex[atom2] < 0) continue; imol = molindex[atom2]; @@ -161,9 +166,9 @@ int ComputeImproperLocal::compute_impropers(int flag) } else { if (tag[atom2] != onemols[imol]->improper_atom2[atom2][i]) continue; tagprev = tag[atom2] - iatom - 1; - atom1 = atom->map(onemols[imol]->improper_atom1[atom2][i]+tagprev); - atom3 = atom->map(onemols[imol]->improper_atom3[atom2][i]+tagprev); - atom4 = atom->map(onemols[imol]->improper_atom4[atom2][i]+tagprev); + atom1 = atom->map(onemols[imol]->improper_atom1[atom2][i] + tagprev); + atom3 = atom->map(onemols[imol]->improper_atom3[atom2][i] + tagprev); + atom4 = atom->map(onemols[imol]->improper_atom4[atom2][i] + tagprev); } if (atom1 < 0 || !(mask[atom1] & groupbit)) continue; @@ -178,21 +183,21 @@ int ComputeImproperLocal::compute_impropers(int flag) vb1x = x[atom1][0] - x[atom2][0]; vb1y = x[atom1][1] - x[atom2][1]; vb1z = x[atom1][2] - x[atom2][2]; - domain->minimum_image(vb1x,vb1y,vb1z); + domain->minimum_image(vb1x, vb1y, vb1z); vb2x = x[atom3][0] - x[atom2][0]; vb2y = x[atom3][1] - x[atom2][1]; vb2z = x[atom3][2] - x[atom2][2]; - domain->minimum_image(vb2x,vb2y,vb2z); + domain->minimum_image(vb2x, vb2y, vb2z); vb3x = x[atom4][0] - x[atom3][0]; vb3y = x[atom4][1] - x[atom3][1]; vb3z = x[atom4][2] - x[atom3][2]; - domain->minimum_image(vb3x,vb3y,vb3z); + domain->minimum_image(vb3x, vb3y, vb3z); - ss1 = 1.0 / (vb1x*vb1x + vb1y*vb1y + vb1z*vb1z); - ss2 = 1.0 / (vb2x*vb2x + vb2y*vb2y + vb2z*vb2z); - ss3 = 1.0 / (vb3x*vb3x + vb3y*vb3y + vb3z*vb3z); + ss1 = 1.0 / (vb1x * vb1x + vb1y * vb1y + vb1z * vb1z); + ss2 = 1.0 / (vb2x * vb2x + vb2y * vb2y + vb2z * vb2z); + ss3 = 1.0 / (vb3x * vb3x + vb3y * vb3y + vb3z * vb3z); r1 = sqrt(ss1); r2 = sqrt(ss2); @@ -202,20 +207,20 @@ int ComputeImproperLocal::compute_impropers(int flag) c1 = (vb1x * vb2x + vb1y * vb2y + vb1z * vb2z) * r1 * r2; c2 = -(vb3x * vb2x + vb3y * vb2y + vb3z * vb2z) * r3 * r2; - s1 = 1.0 - c1*c1; + s1 = 1.0 - c1 * c1; if (s1 < SMALL) s1 = SMALL; s1 = 1.0 / s1; - s2 = 1.0 - c2*c2; + s2 = 1.0 - c2 * c2; if (s2 < SMALL) s2 = SMALL; s2 = 1.0 / s2; - s12 = sqrt(s1*s2); - c = (c1*c2 + c0) * s12; + s12 = sqrt(s1 * s2); + c = (c1 * c2 + c0) * s12; if (c > 1.0) c = 1.0; if (c < -1.0) c = -1.0; - cbuf[n] = 180.0*acos(c)/MY_PI; + cbuf[n] = 180.0 * acos(c) / MY_PI; } n += nvalues; } @@ -237,11 +242,11 @@ void ComputeImproperLocal::reallocate(int n) if (nvalues == 1) { memory->destroy(vlocal); - memory->create(vlocal,nmax,"improper/local:vector_local"); + memory->create(vlocal, nmax, "improper/local:vector_local"); vector_local = vlocal; } else { memory->destroy(alocal); - memory->create(alocal,nmax,nvalues,"improper/local:array_local"); + memory->create(alocal, nmax, nvalues, "improper/local:array_local"); array_local = alocal; } } @@ -252,6 +257,6 @@ void ComputeImproperLocal::reallocate(int n) double ComputeImproperLocal::memory_usage() { - double bytes = (double)nmax*nvalues * sizeof(double); + double bytes = (double) nmax * nvalues * sizeof(double); return bytes; } diff --git a/src/compute_pair_local.cpp b/src/compute_pair_local.cpp index 351b499468..57f15264f0 100644 --- a/src/compute_pair_local.cpp +++ b/src/compute_pair_local.cpp @@ -38,7 +38,7 @@ enum { TYPE, RADIUS }; ComputePairLocal::ComputePairLocal(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg), pstyle(nullptr), pindex(nullptr), vlocal(nullptr), alocal(nullptr) { - if (narg < 4) error->all(FLERR, "Illegal compute pair/local command"); + if (narg < 4) utils::missing_cmd_args(FLERR, "compute pair/local", error); local_flag = 1; nvalues = narg - 3; @@ -97,7 +97,7 @@ ComputePairLocal::ComputePairLocal(LAMMPS *lmp, int narg, char **arg) : // error check if (cutstyle == RADIUS && !atom->radius_flag) - error->all(FLERR, "This compute pair/local requires atom attribute radius"); + error->all(FLERR, "Compute pair/local with ID {} requires atom attribute radius", id); // set singleflag if need to call pair->single() diff --git a/src/compute_property_local.cpp b/src/compute_property_local.cpp index 64f3859117..872f4173ec 100644 --- a/src/compute_property_local.cpp +++ b/src/compute_property_local.cpp @@ -39,7 +39,7 @@ ComputePropertyLocal::ComputePropertyLocal(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg), vlocal(nullptr), alocal(nullptr), indices(nullptr), pack_choice(nullptr) { - if (narg < 4) error->all(FLERR, "Illegal compute property/local command"); + if (narg < 4) utils::missing_cmd_args(FLERR, "compute property/local", error); local_flag = 1; nvalues = narg - 3; @@ -202,25 +202,23 @@ ComputePropertyLocal::ComputePropertyLocal(LAMMPS *lmp, int narg, char **arg) : while (iarg < narg) { if (strcmp(arg[iarg], "cutoff") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal compute property/local command"); + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "compute property/local cutoff", error); if (strcmp(arg[iarg + 1], "type") == 0) cutstyle = TYPE; else if (strcmp(arg[iarg + 1], "radius") == 0) cutstyle = RADIUS; else - error->all(FLERR, "Illegal compute property/local command"); + error->all(FLERR, "Unknown compute property/local cutoff keyword: {}", arg[iarg + 1]); iarg += 2; } else - error->all(FLERR, "Illegal compute property/local command"); + error->all(FLERR, "Unknown compute property/local keyword: {}", arg[iarg]); } // error check if (atom->molecular == 2 && (kindflag == BOND || kindflag == ANGLE || kindflag == DIHEDRAL || kindflag == IMPROPER)) - error->all(FLERR, - "Compute property/local does not (yet) work " - "with atom_style template"); + error->all(FLERR, "Compute property/local does not (yet) work with atom_style template"); if (kindflag == BOND && atom->avec->bonds_allow == 0) error->all(FLERR, "Compute property/local for property that isn't allocated"); @@ -231,7 +229,7 @@ ComputePropertyLocal::ComputePropertyLocal(LAMMPS *lmp, int narg, char **arg) : if (kindflag == IMPROPER && atom->avec->impropers_allow == 0) error->all(FLERR, "Compute property/local for property that isn't allocated"); if (cutstyle == RADIUS && !atom->radius_flag) - error->all(FLERR, "Compute property/local requires atom attribute radius"); + error->all(FLERR, "Compute property/local with ID {} requires atom attribute radius", id); nmax = 0; vlocal = nullptr; @@ -255,8 +253,6 @@ void ComputePropertyLocal::init() if (kindflag == NEIGH || kindflag == PAIR) { if (force->pair == nullptr) error->all(FLERR, "No pair style is defined for compute property/local"); - if (force->pair->single_enable == 0) - error->all(FLERR, "Pair style does not support compute property/local"); } // for NEIGH/PAIR need an occasional half neighbor list diff --git a/src/delete_atoms.h b/src/delete_atoms.h index 0aef095327..a1825dab93 100644 --- a/src/delete_atoms.h +++ b/src/delete_atoms.h @@ -30,7 +30,7 @@ class DeleteAtoms : public Command { DeleteAtoms(class LAMMPS *); void command(int, char **) override; - private: + protected: int *dlist; int allflag, compress_flag, bond_flag, mol_flag; std::map *hash; diff --git a/src/domain.cpp b/src/domain.cpp index 419091775a..572575ad22 100644 --- a/src/domain.cpp +++ b/src/domain.cpp @@ -1668,7 +1668,7 @@ void Domain::remap(double *x) adjust 3 image flags encoded in image accordingly resulting coord must satisfy lo <= coord < hi MAX is important since coord - prd < lo can happen when coord = hi - for triclinic, point is converted to lamda coords (0-1) before doing remap + for triclinic, point is converted to lamda coords (0-1) within remap() image = 10 bits for each dimension increment/decrement in wrap-around fashion ------------------------------------------------------------------------- */ @@ -1679,9 +1679,7 @@ void Domain::remap_all() imageint *image = atom->image; int nlocal = atom->nlocal; - if (triclinic) x2lamda(nlocal); for (int i = 0; i < nlocal; i++) remap(x[i],image[i]); - if (triclinic) lamda2x(nlocal); } /* ---------------------------------------------------------------------- diff --git a/src/dump.cpp b/src/dump.cpp index c648016abc..7773be5ef2 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -73,6 +73,7 @@ Dump::Dump(LAMMPS *lmp, int /*narg*/, char **arg) : clearstep = 0; sort_flag = 0; + sortcol = 0; balance_flag = 0; append_flag = 0; buffer_allow = 0; diff --git a/src/dump_image.cpp b/src/dump_image.cpp index f8403e7c71..9610ef4d9a 100644 --- a/src/dump_image.cpp +++ b/src/dump_image.cpp @@ -1097,7 +1097,7 @@ void DumpImage::create_image() color = colortype[itype]; } - ibonus = body[i]; + ibonus = body[j]; n = bptr->image(ibonus,bodyflag1,bodyflag2,bodyvec,bodyarray); for (k = 0; k < n; k++) { if (bodyvec[k] == SPHERE) diff --git a/src/fix_efield.h b/src/fix_efield.h index 72fd204898..108395cc2c 100644 --- a/src/fix_efield.h +++ b/src/fix_efield.h @@ -26,6 +26,7 @@ namespace LAMMPS_NS { class FixEfield : public Fix { friend class FixQEqReaxFF; + friend class FixQtpieReaxFF; public: FixEfield(class LAMMPS *, int, char **); diff --git a/src/fix_external.cpp b/src/fix_external.cpp index 349558fe86..1580dd27e1 100644 --- a/src/fix_external.cpp +++ b/src/fix_external.cpp @@ -30,31 +30,33 @@ enum{PF_CALLBACK,PF_ARRAY}; /* ---------------------------------------------------------------------- */ FixExternal::FixExternal(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - fexternal(nullptr), caller_vector(nullptr) + Fix(lmp, narg, arg), fexternal(nullptr), caller_vector(nullptr) { if (narg < 4) error->all(FLERR,"Illegal fix external command"); scalar_flag = 1; global_freq = 1; + peratom_flag = 1; + peratom_freq = 1; + size_peratom_cols = 3; extscalar = 1; energy_global_flag = energy_peratom_flag = 1; virial_global_flag = virial_peratom_flag = 1; thermo_energy = thermo_virial = 1; if (strcmp(arg[3],"pf/callback") == 0) { - if (narg != 6) error->all(FLERR,"Illegal fix external command"); + if (narg != 6) error->all(FLERR,"Incorrect number of args for fix external pf/callback"); mode = PF_CALLBACK; ncall = utils::inumeric(FLERR,arg[4],false,lmp); napply = utils::inumeric(FLERR,arg[5],false,lmp); if (ncall <= 0 || napply <= 0) - error->all(FLERR,"Illegal fix external command"); + error->all(FLERR,"Illegal values for ncall or napply in fix external pf/callback"); } else if (strcmp(arg[3],"pf/array") == 0) { - if (narg != 5) error->all(FLERR,"Illegal fix external command"); + if (narg != 5) error->all(FLERR,"Incorrect number of args for fix external pf/array"); mode = PF_ARRAY; napply = utils::inumeric(FLERR,arg[4],false,lmp); - if (napply <= 0) error->all(FLERR,"Illegal fix external command"); - } else error->all(FLERR,"Illegal fix external command"); + if (napply <= 0) error->all(FLERR,"Illegal value for napply for fix external pf/array"); + } else error->all(FLERR,"Unknown fix external mode {}", arg[3]); callback = nullptr; @@ -323,6 +325,7 @@ void FixExternal::grow_arrays(int nmax) { memory->grow(fexternal,nmax,3,"external:fexternal"); memset(&fexternal[0][0], 0, sizeof(double)*3*nmax); + array_atom = fexternal; } /* ---------------------------------------------------------------------- diff --git a/src/fix_nve.cpp b/src/fix_nve.cpp index 30c1f24867..58a5677b92 100644 --- a/src/fix_nve.cpp +++ b/src/fix_nve.cpp @@ -15,6 +15,7 @@ #include "fix_nve.h" #include "atom.h" +#include "error.h" #include "force.h" #include "respa.h" #include "update.h" @@ -28,7 +29,11 @@ FixNVE::FixNVE(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) { if (!utils::strmatch(style,"^nve/sphere") && narg < 3) - utils::missing_cmd_args(FLERR, "fix nve", error); + utils::missing_cmd_args(FLERR, fmt::format("fix {}", style), error); + + auto plain_style = utils::strip_style_suffix(style, lmp); + if (utils::strmatch(plain_style, "^nve$") && narg > 3) + error->all(FLERR, "Unsupported additional arguments for fix {}", style); dynamic_group_allow = 1; time_integrate = 1; diff --git a/src/fix_nve_limit.h b/src/fix_nve_limit.h index 2a32aee975..e8a07d815a 100644 --- a/src/fix_nve_limit.h +++ b/src/fix_nve_limit.h @@ -36,7 +36,7 @@ class FixNVELimit : public Fix { void reset_dt() override; double compute_scalar() override; - private: + protected: double dtv, dtf; double *step_respa; int ncount; diff --git a/src/fix_recenter.h b/src/fix_recenter.h index a45f0201bf..dfdb48b8d2 100644 --- a/src/fix_recenter.h +++ b/src/fix_recenter.h @@ -34,7 +34,7 @@ class FixRecenter : public Fix { double compute_scalar() override; double compute_vector(int) override; - private: + protected: int group2bit, scaleflag; int xflag, yflag, zflag; int xinitflag, yinitflag, zinitflag; diff --git a/src/fix_spring_self.cpp b/src/fix_spring_self.cpp index df00a2ba8c..d0c7ed8f94 100644 --- a/src/fix_spring_self.cpp +++ b/src/fix_spring_self.cpp @@ -21,9 +21,11 @@ #include "atom.h" #include "domain.h" #include "error.h" +#include "input.h" #include "memory.h" #include "respa.h" #include "update.h" +#include "variable.h" #include @@ -33,8 +35,7 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ FixSpringSelf::FixSpringSelf(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - xoriginal(nullptr) + Fix(lmp, narg, arg), xoriginal(nullptr), kstr(nullptr), kval(nullptr) { if ((narg < 4) || (narg > 5)) error->all(FLERR,"Illegal fix spring/self command"); @@ -45,9 +46,17 @@ FixSpringSelf::FixSpringSelf(LAMMPS *lmp, int narg, char **arg) : extscalar = 1; energy_global_flag = 1; respa_level_support = 1; + maxatom = 0; + kvar = -1; - k = utils::numeric(FLERR,arg[3],false,lmp); - if (k <= 0.0) error->all(FLERR,"Illegal fix spring/self command"); + if (utils::strmatch(arg[3], "^v_")) { + kstr = utils::strdup(arg[3] + 2); + kstyle = NONE; + } else { + k = utils::numeric(FLERR,arg[3],false,lmp); + kstyle = CONSTANT; + if (k <= 0.0) error->all(FLERR,"Illegal force constant for fix spring/self command"); + } xflag = yflag = zflag = 1; @@ -103,8 +112,10 @@ FixSpringSelf::~FixSpringSelf() atom->delete_callback(id,Atom::GROW); atom->delete_callback(id,Atom::RESTART); - // delete locally stored array + // delete locally stored arrays + delete[] kstr; + memory->destroy(kval); memory->destroy(xoriginal); } @@ -123,6 +134,25 @@ int FixSpringSelf::setmask() void FixSpringSelf::init() { + // check variable + + if (kstr) { + kvar = input->variable->find(kstr); + if (kvar < 0) error->all(FLERR, "Variable {} for fix spring/self does not exist", kstr); + if (input->variable->equalstyle(kvar)) + kstyle = EQUAL; + else if (input->variable->atomstyle(kvar)) + kstyle = ATOM; + else + error->all(FLERR, "Variable {} for fix spring/self is invalid style", kstr); + } + + + if ((kstyle == ATOM) && (atom->nmax > maxatom)) { + maxatom = atom->nmax; + memory->destroy(kval); + memory->create(kval, maxatom, "sprint/self:kval"); + } if (utils::strmatch(update->integrate_style,"^respa")) { ilevel_respa = (dynamic_cast(update->integrate))->nlevels-1; if (respa_level >= 0) ilevel_respa = MIN(respa_level,ilevel_respa); @@ -162,24 +192,58 @@ void FixSpringSelf::post_force(int /*vflag*/) double dx,dy,dz; double unwrap[3]; + // reallocate kval array if necessary + + if ((kstyle == ATOM) && (atom->nmax > maxatom)) { + maxatom = atom->nmax; + memory->destroy(kval); + memory->create(kval, maxatom, "sprint/self:kval"); + } + espring = 0.0; - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - domain->unmap(x[i],image[i],unwrap); - dx = unwrap[0] - xoriginal[i][0]; - dy = unwrap[1] - xoriginal[i][1]; - dz = unwrap[2] - xoriginal[i][2]; - if (!xflag) dx = 0.0; - if (!yflag) dy = 0.0; - if (!zflag) dz = 0.0; - f[i][0] -= k*dx; - f[i][1] -= k*dy; - f[i][2] -= k*dz; - espring += k * (dx*dx + dy*dy + dz*dz); + if ((kstyle == CONSTANT) || (kstyle == EQUAL)) { + // update k if equal style variable + if (kstyle == EQUAL) { + k = input->variable->compute_equal(kvar); + if (k < 0.0) + error->all(FLERR,"Evaluation of {} gave bad value {} for fix spring/self", kstr, k); } + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + domain->unmap(x[i],image[i],unwrap); + dx = unwrap[0] - xoriginal[i][0]; + dy = unwrap[1] - xoriginal[i][1]; + dz = unwrap[2] - xoriginal[i][2]; + if (!xflag) dx = 0.0; + if (!yflag) dy = 0.0; + if (!zflag) dz = 0.0; + f[i][0] -= k*dx; + f[i][1] -= k*dy; + f[i][2] -= k*dz; + espring += k * (dx*dx + dy*dy + dz*dz); + } + espring *= 0.5; + } else { + // update kval for kstyle == ATOM + input->variable->compute_atom(kvar, igroup, kval, 1, 0); + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + domain->unmap(x[i],image[i],unwrap); + dx = unwrap[0] - xoriginal[i][0]; + dy = unwrap[1] - xoriginal[i][1]; + dz = unwrap[2] - xoriginal[i][2]; + if (!xflag) dx = 0.0; + if (!yflag) dy = 0.0; + if (!zflag) dz = 0.0; + f[i][0] -= kval[i]*dx; + f[i][1] -= kval[i]*dy; + f[i][2] -= kval[i]*dz; + espring += kval[i] * (dx*dx + dy*dy + dz*dz); + } - espring *= 0.5; + espring *= 0.5; + } } /* ---------------------------------------------------------------------- */ @@ -213,7 +277,8 @@ double FixSpringSelf::compute_scalar() double FixSpringSelf::memory_usage() { - double bytes = (double)atom->nmax*3 * sizeof(double); + double bytes = (double)atom->nmax*4 * sizeof(double); + if (kstyle == ATOM) bytes += (double)atom->nmax * sizeof(double); return bytes; } diff --git a/src/fix_spring_self.h b/src/fix_spring_self.h index f13f2be918..9699ca33f3 100644 --- a/src/fix_spring_self.h +++ b/src/fix_spring_self.h @@ -26,6 +26,7 @@ namespace LAMMPS_NS { class FixSpringSelf : public Fix { public: + enum { NONE, CONSTANT, EQUAL, ATOM }; FixSpringSelf(class LAMMPS *, int, char **); ~FixSpringSelf() override; int setmask() override; @@ -50,8 +51,11 @@ class FixSpringSelf : public Fix { protected: double k, espring; double **xoriginal; // original coords of atoms + char *kstr; // name of variable for K + double *kval; // per-atom variable values for K + int kvar, kstyle; int xflag, yflag, zflag; - int ilevel_respa; + int ilevel_respa, maxatom; }; } // namespace LAMMPS_NS diff --git a/src/fix_vector.cpp b/src/fix_vector.cpp index 7c75f93a3a..3703e96130 100644 --- a/src/fix_vector.cpp +++ b/src/fix_vector.cpp @@ -114,9 +114,11 @@ FixVector::FixVector(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Fix for fix {} vector not computed at compatible time", val.id); if (val.argindex == 0) + value = ifix->extscalar; + else if (ifix->extvector >= 0) value = ifix->extvector; else - value = ifix->extarray; + value = ifix->extlist[val.argindex - 1]; val.val.f = ifix; } else if (val.which == ArgInfo::VARIABLE) { diff --git a/src/fix_wall_region.cpp b/src/fix_wall_region.cpp index 3d817f34f4..8c245a3ed6 100644 --- a/src/fix_wall_region.cpp +++ b/src/fix_wall_region.cpp @@ -100,6 +100,7 @@ FixWallRegion::FixWallRegion(LAMMPS *lmp, int narg, char **arg) : FixWallRegion::~FixWallRegion() { + if (copymode) return; delete[] idregion; } diff --git a/src/fix_wall_region.h b/src/fix_wall_region.h index 77b82d012c..fb07f00ee9 100644 --- a/src/fix_wall_region.h +++ b/src/fix_wall_region.h @@ -38,7 +38,7 @@ class FixWallRegion : public Fix { double compute_scalar() override; double compute_vector(int) override; - private: + protected: int style; double epsilon, sigma, cutoff; double alpha; diff --git a/src/group.cpp b/src/group.cpp index 909e741c6b..136faa4059 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -1141,10 +1141,10 @@ void Group::xcm(int igroup, double masstotal, double *cm, Region *region) /* ---------------------------------------------------------------------- compute the center-of-mass velocity of group of atoms masstotal = total mass - return center-of-mass velocity in cm[] + return center-of-mass velocity in vcm[] ------------------------------------------------------------------------- */ -void Group::vcm(int igroup, double masstotal, double *cm) +void Group::vcm(int igroup, double masstotal, double *vcm) { int groupbit = bitmask[igroup]; @@ -1176,21 +1176,21 @@ void Group::vcm(int igroup, double masstotal, double *cm) } } - MPI_Allreduce(p, cm, 3, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(p, vcm, 3, MPI_DOUBLE, MPI_SUM, world); if (masstotal > 0.0) { - cm[0] /= masstotal; - cm[1] /= masstotal; - cm[2] /= masstotal; + vcm[0] /= masstotal; + vcm[1] /= masstotal; + vcm[2] /= masstotal; } } /* ---------------------------------------------------------------------- compute the center-of-mass velocity of group of atoms in region masstotal = total mass - return center-of-mass velocity in cm[] + return center-of-mass velocity in vcm[] ------------------------------------------------------------------------- */ -void Group::vcm(int igroup, double masstotal, double *cm, Region *region) +void Group::vcm(int igroup, double masstotal, double *vcm, Region *region) { int groupbit = bitmask[igroup]; region->prematch(); @@ -1224,11 +1224,11 @@ void Group::vcm(int igroup, double masstotal, double *cm, Region *region) } } - MPI_Allreduce(p, cm, 3, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(p, vcm, 3, MPI_DOUBLE, MPI_SUM, world); if (masstotal > 0.0) { - cm[0] /= masstotal; - cm[1] /= masstotal; - cm[2] /= masstotal; + vcm[0] /= masstotal; + vcm[1] /= masstotal; + vcm[2] /= masstotal; } } @@ -1236,7 +1236,7 @@ void Group::vcm(int igroup, double masstotal, double *cm, Region *region) compute the total force on group of atoms ------------------------------------------------------------------------- */ -void Group::fcm(int igroup, double *cm) +void Group::fcm(int igroup, double *fcm) { int groupbit = bitmask[igroup]; @@ -1254,14 +1254,14 @@ void Group::fcm(int igroup, double *cm) flocal[2] += f[i][2]; } - MPI_Allreduce(flocal, cm, 3, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(flocal, fcm, 3, MPI_DOUBLE, MPI_SUM, world); } /* ---------------------------------------------------------------------- compute the total force on group of atoms in region ------------------------------------------------------------------------- */ -void Group::fcm(int igroup, double *cm, Region *region) +void Group::fcm(int igroup, double *fcm, Region *region) { int groupbit = bitmask[igroup]; region->prematch(); @@ -1281,7 +1281,7 @@ void Group::fcm(int igroup, double *cm, Region *region) flocal[2] += f[i][2]; } - MPI_Allreduce(flocal, cm, 3, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(flocal, fcm, 3, MPI_DOUBLE, MPI_SUM, world); } /* ---------------------------------------------------------------------- diff --git a/src/label_map.cpp b/src/label_map.cpp index c4865d5ace..9934868c49 100644 --- a/src/label_map.cpp +++ b/src/label_map.cpp @@ -43,8 +43,6 @@ LabelMap::LabelMap(LAMMPS *_lmp, int _natomtypes, int _nbondtypes, int _nanglety Pointers(_lmp), natomtypes(_natomtypes), nbondtypes(_nbondtypes), nangletypes(_nangletypes), ndihedraltypes(_ndihedraltypes), nimpropertypes(_nimpropertypes) { - if (lmp->citeme) lmp->citeme->add(cite_type_label_framework); - lmap2lmap.atom = lmap2lmap.bond = lmap2lmap.angle = lmap2lmap.dihedral = lmap2lmap.improper = nullptr; reset_type_labels(); @@ -112,6 +110,8 @@ void LabelMap::modify_lmap(int narg, char **arg) if ((narg < 1) || ((narg > 2) && ((narg % 2) == 0))) error->all(FLERR, "Incorrect number of arguments for labelmap command"); + if (lmp->citeme) lmp->citeme->add(cite_type_label_framework); + int ntypes; std::vector *labels; std::unordered_map *labels_map; @@ -238,6 +238,8 @@ int LabelMap::find_or_create(const std::string &mylabel, std::vectorsecond; + if (lmp->citeme) lmp->citeme->add(cite_type_label_framework); + // if no match found, create new label at next available index // label map assumed to be intialized with numeric index // user labels are assumed to be alphanumeric (not a number) diff --git a/src/library.cpp b/src/library.cpp index 0065f10454..2f915f1baf 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -519,7 +519,7 @@ must be freed with :cpp:func:`lammps_free` after use to avoid a memory leak. \endverbatim * * \param handle pointer to a previously created LAMMPS instance - * \param cmd string with a single LAMMPS input line + * \param line string with a single LAMMPS input line * \return string with expanded line */ char *lammps_expand(void *handle, const char *line) @@ -2159,7 +2159,7 @@ int lammps_extract_atom_datatype(void *handle, const char *name) * \verbatim embed:rst -.. versionadded:: TBD +.. versionadded:: 19Nov2024 This function returns an integer with the size of the per-atom property with the specified name. This allows to accurately determine diff --git a/src/lmptype.h b/src/lmptype.h index d2181c9898..ab3c97d5ad 100644 --- a/src/lmptype.h +++ b/src/lmptype.h @@ -287,7 +287,7 @@ struct multitype { int64_t b; } data; - multitype() : type(LAMMPS_NONE) { data.d = 0.0; } + multitype() noexcept : type(LAMMPS_NONE) { data.d = 0.0; } multitype(const multitype &) = default; multitype(multitype &&) = default; ~multitype() = default; diff --git a/src/modify.cpp b/src/modify.cpp index 1a9c056027..89cc1d0643 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -825,16 +825,16 @@ Fix *Modify::add_fix(int narg, char **arg, int trysuffix) // clang-format off const char *exceptions[] = - {"GPU", "OMP", "INTEL", "property/atom", "cmap", "cmap3", "rx", - "deprecated", "STORE/KIM", "amoeba/pitorsion", "amoeba/bitorsion", - nullptr}; + {"GPU", "OMP", "INTEL", "property/atom", "cmap", "cmap3", "rx", "deprecated", "STORE/KIM", + "amoeba/pitorsion", "amoeba/bitorsion", "DUMMY", nullptr}; // clang-format on if (domain->box_exist == 0) { int m; for (m = 0; exceptions[m] != nullptr; m++) if (strcmp(arg[2], exceptions[m]) == 0) break; - if (exceptions[m] == nullptr) error->all(FLERR, "Fix command before simulation box is defined"); + if (exceptions[m] == nullptr) + error->all(FLERR, "Fix {} command before simulation box is defined", arg[2]); } // check group ID diff --git a/src/molecule.cpp b/src/molecule.cpp index e7656acbbc..2a9b8a944d 100644 --- a/src/molecule.cpp +++ b/src/molecule.cpp @@ -958,7 +958,7 @@ void Molecule::diameters(char *line) } /* ---------------------------------------------------------------------- - read charges from file + read dipoles from file ------------------------------------------------------------------------- */ void Molecule::dipoles(char *line) diff --git a/src/nstencil.cpp b/src/nstencil.cpp index 5d2bf5d239..00a6526d77 100644 --- a/src/nstencil.cpp +++ b/src/nstencil.cpp @@ -223,15 +223,15 @@ void NStencil::create_setup() // smax = max possible size of entire 3d stencil // stencil will be empty if cutneighmax = 0.0 - sx = static_cast(cutneighmax*bininvx); - if (sx*binsizex < cutneighmax) sx++; - sy = static_cast(cutneighmax*bininvy); - if (sy*binsizey < cutneighmax) sy++; - sz = static_cast(cutneighmax*bininvz); - if (sz*binsizez < cutneighmax) sz++; + sx = static_cast(cutneighmax * bininvx); + if (sx * binsizex < cutneighmax) sx++; + sy = static_cast(cutneighmax * bininvy); + if (sy * binsizey < cutneighmax) sy++; + sz = static_cast(cutneighmax * bininvz); + if (sz * binsizez < cutneighmax) sz++; if (dimension == 2) sz = 0; - int smax = (2*sx+1) * (2*sy+1) * (2*sz+1); + int smax = (2 * sx + 1) * (2 * sy + 1) * (2 * sz + 1); // reallocate stencil structs if necessary // for BIN and MULTI_OLD styles @@ -240,10 +240,10 @@ void NStencil::create_setup() if (smax > maxstencil) { maxstencil = smax; memory->destroy(stencil); - memory->create(stencil,maxstencil,"neighstencil:stencil"); + memory->create(stencil, maxstencil, "neighstencil:stencil"); if (xyzflag) { memory->destroy(stencilxyz); - memory->create(stencilxyz,maxstencil,3,"neighstencil:stencilxyz"); + memory->create(stencilxyz, maxstencil, 3, "neighstencil:stencilxyz"); } } @@ -251,9 +251,9 @@ void NStencil::create_setup() int i; int n = atom->ntypes; if (maxstencil_multi_old == 0) { - nstencil_multi_old = new int[n+1]; - stencil_multi_old = new int*[n+1]; - distsq_multi_old = new double*[n+1]; + nstencil_multi_old = new int[n + 1]; + stencil_multi_old = new int*[n + 1]; + distsq_multi_old = new double*[n + 1]; for (i = 1; i <= n; i++) { nstencil_multi_old[i] = 0; stencil_multi_old[i] = nullptr; @@ -265,9 +265,9 @@ void NStencil::create_setup() for (i = 1; i <= n; i++) { memory->destroy(stencil_multi_old[i]); memory->destroy(distsq_multi_old[i]); - memory->create(stencil_multi_old[i],maxstencil_multi_old, + memory->create(stencil_multi_old[i], maxstencil_multi_old, "neighstencil:stencil_multi_old"); - memory->create(distsq_multi_old[i],maxstencil_multi_old, + memory->create(distsq_multi_old[i], maxstencil_multi_old, "neighstencil:distsq_multi_old"); } } @@ -280,7 +280,7 @@ void NStencil::create_setup() if (nb) copy_bin_info_multi(); // Deallocate arrays if previously allocated - if((n > maxcollections) && stencil_multi){ + if ((n > maxcollections) && stencil_multi){ memory->destroy(nstencil_multi); for (i = 0; i < maxcollections; i++) { for (j = 0; j < maxcollections; j++) @@ -339,10 +339,10 @@ void NStencil::create_setup() memory->create(maxstencil_multi, n, n, "neighstencil::maxstencil_multi"); memory->create(nstencil_multi, n, n, "neighstencil::nstencil_multi"); stencil_multi = new int**[n](); - for (i = 0; i < n; ++i) { + for (i = 0; i < n; i++) { stencil_multi[i] = new int*[n](); - for (j = 0; j < n; ++j) { - maxstencil_multi[i][j] = 0; + for (j = 0; j < n; j++) { + maxstencil_multi[i][j] = 0; nstencil_multi[i][j] = 0; stencil_multi[i][j] = nullptr; } @@ -378,23 +378,23 @@ void NStencil::create_setup() stencil_range = sqrt(cutcollectionsq[i][j]); - sx = static_cast (stencil_range*bininvx_multi[bin_collection]); - if (sx*binsizex_multi[bin_collection] < stencil_range) sx++; - sy = static_cast (stencil_range*bininvy_multi[bin_collection]); - if (sy*binsizey_multi[bin_collection] < stencil_range) sy++; - sz = static_cast (stencil_range*bininvz_multi[bin_collection]); - if (sz*binsizez_multi[bin_collection] < stencil_range) sz++; + sx = static_cast (stencil_range * bininvx_multi[bin_collection]); + if (sx * binsizex_multi[bin_collection] < stencil_range) sx++; + sy = static_cast (stencil_range * bininvy_multi[bin_collection]); + if (sy * binsizey_multi[bin_collection] < stencil_range) sy++; + sz = static_cast (stencil_range * bininvz_multi[bin_collection]); + if (sz * binsizez_multi[bin_collection] < stencil_range) sz++; if (dimension == 2) sz = 0; stencil_sx_multi[i][j] = sx; stencil_sy_multi[i][j] = sy; stencil_sz_multi[i][j] = sz; - smax = ((2*sx+1) * (2*sy+1) * (2*sz+1)); + smax = ((2 * sx + 1) * (2 * sy + 1) * (2 * sz + 1)); if (smax > maxstencil_multi[i][j]) { maxstencil_multi[i][j] = smax; - if(stencil_multi[i][j]) + if (stencil_multi[i][j]) memory->destroy(stencil_multi[i][j]); memory->create(stencil_multi[i][j], smax, "neighstencil::stencil_multi"); @@ -457,16 +457,20 @@ double NStencil::memory_usage() { double bytes = 0; if (neighstyle == Neighbor::BIN) { - bytes += memory->usage(stencil,maxstencil); - bytes += memory->usage(stencilxyz,maxstencil,3); + bytes += memory->usage(stencil, maxstencil); + bytes += memory->usage(stencilxyz, maxstencil, 3); } else if (neighstyle == Neighbor::MULTI_OLD) { - bytes += (double)atom->ntypes*maxstencil_multi_old * sizeof(int); - bytes += (double)atom->ntypes*maxstencil_multi_old * sizeof(double); + bytes += (double)atom->ntypes * maxstencil_multi_old * sizeof(int); + bytes += (double)atom->ntypes * maxstencil_multi_old * sizeof(double); } else if (neighstyle == Neighbor::MULTI) { int n = ncollections; - for (int i = 0; i < n; i++) { - for (int j = 0; j < n; j++) { - bytes += (double)maxstencil_multi[i][j] * sizeof(int); + + // May not yet be initialized for occasional lists + if (maxstencil_multi) { + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + bytes += (double)maxstencil_multi[i][j] * sizeof(int); + } } } } diff --git a/src/pair_hybrid.h b/src/pair_hybrid.h index b59cc82cb4..995de37e59 100644 --- a/src/pair_hybrid.h +++ b/src/pair_hybrid.h @@ -28,6 +28,7 @@ namespace LAMMPS_NS { class PairHybrid : public Pair { friend class AtomVecDielectric; friend class ComputeSpin; + friend class FixAtomSwap; friend class FixGPU; friend class FixIntel; friend class FixNVESpin; diff --git a/src/region.cpp b/src/region.cpp index 0017186c5d..7399b14adb 100644 --- a/src/region.cpp +++ b/src/region.cpp @@ -53,7 +53,6 @@ Region::~Region() delete[] id; delete[] style; - delete[] xstr; delete[] ystr; delete[] zstr; diff --git a/src/region_block.cpp b/src/region_block.cpp index 9376016843..36c38f517c 100644 --- a/src/region_block.cpp +++ b/src/region_block.cpp @@ -262,6 +262,7 @@ RegBlock::RegBlock(LAMMPS *lmp, int narg, char **arg) : RegBlock::~RegBlock() { if (copymode) return; + delete[] xlostr; delete[] xhistr; delete[] ylostr; diff --git a/src/region_sphere.cpp b/src/region_sphere.cpp index f449978938..ec472c031c 100644 --- a/src/region_sphere.cpp +++ b/src/region_sphere.cpp @@ -101,6 +101,8 @@ RegSphere::RegSphere(LAMMPS *lmp, int narg, char **arg) : RegSphere::~RegSphere() { + if (copymode) return; + delete[] xstr; delete[] ystr; delete[] zstr; diff --git a/src/region_sphere.h b/src/region_sphere.h index f0e0bd195c..3053d98edb 100644 --- a/src/region_sphere.h +++ b/src/region_sphere.h @@ -36,7 +36,7 @@ class RegSphere : public Region { void set_velocity_shape() override; void velocity_contact_shape(double *, double *) override; - private: + protected: double xc, yc, zc; double radius; int xstyle, xvar; diff --git a/src/tokenizer.h b/src/tokenizer.h index 42a62fefa0..2334c52790 100644 --- a/src/tokenizer.h +++ b/src/tokenizer.h @@ -59,17 +59,21 @@ class TokenizerException : public std::exception { std::string message; public: - // remove unused default constructor + /** The default constructor is disabled */ TokenizerException() = delete; /** Thrown during retrieving or skipping tokens * - * \param msg String with error message - * \param token String of the token/word that caused the error */ + * \param msg String with error message + * \param token String of the token or word that caused the error */ explicit TokenizerException(const std::string &msg, const std::string &token); /** Retrieve message describing the thrown exception - * \return string with error message */ + * + * This function provides the message that can be retrieved when the corresponding + * exception is caught. + * + * \return String with error message */ const char *what() const noexcept override { return message.c_str(); } }; diff --git a/src/utils.h b/src/utils.h index 2fbbd339e5..200963ff28 100644 --- a/src/utils.h +++ b/src/utils.h @@ -59,7 +59,7 @@ namespace utils { void missing_cmd_args(const std::string &file, int line, const std::string &cmd, Error *error); - /* Internal function handling the argument list for logmesg(). */ + /*! Internal function handling the argument list for logmesg(). */ void fmtargs_logmesg(LAMMPS *lmp, fmt::string_view format, fmt::format_args args); @@ -426,12 +426,11 @@ This functions adds the following case to :cpp:func:`utils::bounds() containing the 3 sub-strings */ std::vector parse_grid_id(const char *file, int line, const std::string &name, diff --git a/src/variable.cpp b/src/variable.cpp index 279c14d999..b0667b9941 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -277,7 +277,8 @@ void Variable::set(int narg, char **arg) copy(num[nvar],&arg[2],data[nvar]); } else if (strcmp(arg[1],"uloop") == 0) { if (narg < 3 || narg > 4) - error->all(FLERR,"Illegal variable command: expected 3 or 4 arguments but found {}", narg); + error->all(FLERR,"Illegal variable command: expected 3 or 4 arguments but found {}: {}", + narg, utils::errorurl(3)); if (narg == 4 && strcmp(arg[3],"pad") != 0) error->all(FLERR, "Invalid variable uloop argument: {}", arg[3]); if (find(arg[0]) >= 0) return; @@ -314,7 +315,9 @@ void Variable::set(int narg, char **arg) // data = 1 value, string to eval } else if (strcmp(arg[1],"string") == 0) { - if (narg != 3) error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}", narg); + if (narg != 3) + error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}{}", + narg, utils::errorurl(3)); int maxcopy = strlen(arg[2]) + 1; int maxwork = maxcopy; @@ -348,7 +351,9 @@ void Variable::set(int narg, char **arg) // data = 1 value, string to eval } else if (strcmp(arg[1],"getenv") == 0) { - if (narg != 3) error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}", narg); + if (narg != 3) + error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}{}", + narg, utils::errorurl(3)); if (find(arg[0]) >= 0) { if (style[find(arg[0])] != GETENV) error->all(FLERR,"Cannot redefine variable as a different style"); @@ -368,7 +373,9 @@ void Variable::set(int narg, char **arg) // data = 1 value, string to eval } else if (strcmp(arg[1],"file") == 0) { - if (narg != 3) error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}", narg); + if (narg != 3) + error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}{}", + narg, utils::errorurl(3)); if (find(arg[0]) >= 0) return; if (nvar == maxvar) grow(); style[nvar] = SCALARFILE; @@ -387,7 +394,9 @@ void Variable::set(int narg, char **arg) // data = nullptr } else if (strcmp(arg[1],"atomfile") == 0) { - if (narg != 3) error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}", narg); + if (narg != 3) + error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}{}", + narg, utils::errorurl(3)); if (find(arg[0]) >= 0) return; if (nvar == maxvar) grow(); style[nvar] = ATOMFILE; @@ -409,7 +418,9 @@ void Variable::set(int narg, char **arg) } else if (strcmp(arg[1],"format") == 0) { constexpr char validfmt[] = "^% ?-?[0-9]*\\.?[0-9]*[efgEFG]$"; - if (narg != 4) error->all(FLERR,"Illegal variable command: expected 4 arguments but found {}", narg); + if (narg != 4) + error->all(FLERR,"Illegal variable command: expected 4 arguments but found {}{}", + narg, utils::errorurl(3)); int ivar = find(arg[0]); int jvar = find(arg[2]); if (jvar < 0) @@ -446,7 +457,9 @@ void Variable::set(int narg, char **arg) // data = 2 values, 1st is string to eval, 2nd is filled on retrieval } else if (strcmp(arg[1],"equal") == 0) { - if (narg != 3) error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}", narg); + if (narg != 3) + error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}{}", + narg, utils::errorurl(3)); int ivar = find(arg[0]); if (ivar >= 0) { if (style[ivar] != EQUAL) @@ -472,7 +485,9 @@ void Variable::set(int narg, char **arg) // data = 1 value, string to eval } else if (strcmp(arg[1],"atom") == 0) { - if (narg != 3) error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}", narg); + if (narg != 3) + error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}{}", + narg, utils::errorurl(3)); int ivar = find(arg[0]); if (ivar >= 0) { if (style[ivar] != ATOM) @@ -498,7 +513,9 @@ void Variable::set(int narg, char **arg) // immediately store it as N-length vector and set dynamic flag to 0 } else if (strcmp(arg[1],"vector") == 0) { - if (narg != 3) error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}", narg); + if (narg != 3) + error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}{}", + narg, utils::errorurl(3)); int ivar = find(arg[0]); if (ivar >= 0) { if (style[ivar] != VECTOR) @@ -540,7 +557,9 @@ void Variable::set(int narg, char **arg) // data = 2 values, 1st is Python func to invoke, 2nd is filled by invoke } else if (strcmp(arg[1],"python") == 0) { - if (narg != 3) error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}", narg); + if (narg != 3) + error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}{}", + narg, utils::errorurl(3)); if (!python->is_enabled()) error->all(FLERR,"LAMMPS is not built with Python embedded"); int ivar = find(arg[0]); @@ -593,7 +612,9 @@ void Variable::set(int narg, char **arg) // dvalue = numeric initialization from 2nd arg, reset by internal_set() } else if (strcmp(arg[1],"internal") == 0) { - if (narg != 3) error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}", narg); + if (narg != 3) + error->all(FLERR,"Illegal variable command: expected 3 arguments but found {}{}", + narg, utils::errorurl(3)); int ivar = find(arg[0]); if (ivar >= 0) { if (style[ivar] != INTERNAL) diff --git a/src/version.h b/src/version.h index 9c382b3768..fbd7faf69b 100644 --- a/src/version.h +++ b/src/version.h @@ -1,2 +1,2 @@ -#define LAMMPS_VERSION "29 Aug 2024" +#define LAMMPS_VERSION "19 Nov 2024" #define LAMMPS_UPDATE "Development" diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index fc111f5c64..5ac23daac7 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -205,7 +205,7 @@ if(FLATPAK_COMMAND AND FLATPAK_BUILDER) file(STRINGS ${LAMMPS_DIR}/src/version.h line REGEX LAMMPS_VERSION) string(REGEX REPLACE "#define LAMMPS_VERSION \"([0-9]+) ([A-Za-z][A-Za-z][A-Za-z])[A-Za-z]* ([0-9]+)\"" "\\1\\2\\3" LAMMPS_RELEASE "${line}") - set(FLATPAK_BUNDLE "LAMMPS_GUI-Linux-amd64-${LAMMPS_RELEASE}.flatpak") + set(FLATPAK_BUNDLE "LAMMPS-Linux-x86_64-GUI-${LAMMPS_RELEASE}.flatpak") add_custom_target(flatpak COMMAND ${FLATPAK_COMMAND} --user remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo COMMAND ${FLATPAK_BUILDER} --force-clean --verbose --repo=${CMAKE_CURRENT_BINARY_DIR}/flatpak-repo diff --git a/tools/lammps-gui/chartviewer.cpp b/tools/lammps-gui/chartviewer.cpp index eb5444de8e..8543da166a 100644 --- a/tools/lammps-gui/chartviewer.cpp +++ b/tools/lammps-gui/chartviewer.cpp @@ -423,27 +423,6 @@ void ChartViewer::add_data(int step, double data) { if (last_step < step) { last_step = step; - - // do not add data that deviates by more than 4 sigma from the average - // over the last 5 to 20 data items. this is a hack to work around - // getting corrupted data from lammps_get_last_thermo() - const auto &points = series->points(); - const auto count = points.count(); - if (count > 4) { - double ysum = 0.0; - double ysumsq = 0.0; - int first = count - 20; - if (first < 0) first = 0; - for (int i = first; i < count; ++i) { - double val = points[i].y(); - ysum += val; - ysumsq += val * val; - } - const double num = count - first; - const double avg = ysum / num; - const double avgsq = ysumsq / num; - if (fabs(data - avg) > (5.0 * sqrt(avgsq - (avg * avg)))) return; - } series->append(step, data); QSettings settings; diff --git a/tools/lammps-gui/lammps-gui.appdata.xml b/tools/lammps-gui/lammps-gui.appdata.xml index 4c8843957e..1f74fc479c 100644 --- a/tools/lammps-gui/lammps-gui.appdata.xml +++ b/tools/lammps-gui/lammps-gui.appdata.xml @@ -56,6 +56,9 @@ + move cursor to end of log buffer before inserting new text + remove empirical filter to remove outliers from corrupted data + change tutorial download URL to tutorial website diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index fe6b8c5391..fb38b6fc92 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -988,6 +988,7 @@ void LammpsGui::logupdate() if (logwindow) { const auto text = capturer->GetChunk(); if (text.size() > 0) { + logwindow->moveCursor(QTextCursor::End); logwindow->insertPlainText(text.c_str()); logwindow->moveCursor(QTextCursor::End); logwindow->textCursor().deleteChar(); @@ -2016,8 +2017,8 @@ bool LammpsGui::eventFilter(QObject *watched, QEvent *event) } // LAMMPS geturl command with current location of the input and solution files on the web -static const QString geturl = "geturl https://raw.githubusercontent.com/akohlmey/" - "lammps-tutorials-inputs/main/tutorial%1/%2 output %2 verify no"; +static const QString geturl = "geturl https://raw.githubusercontent.com/lammpstutorials/" + "lammpstutorials-article/refs/heads/main/files/tutorial%1/%2 output %2 verify no"; void LammpsGui::setup_tutorial(int tutno, const QString &dir, bool purgedir, bool getsolution) { diff --git a/tools/lammps-gui/org.lammps.lammps-gui.yml b/tools/lammps-gui/org.lammps.lammps-gui.yml index 548c4ce93e..02d517e210 100644 --- a/tools/lammps-gui/org.lammps.lammps-gui.yml +++ b/tools/lammps-gui/org.lammps.lammps-gui.yml @@ -88,6 +88,7 @@ modules: - -D PKG_QTB=yes - -D PKG_REACTION=yes - -D PKG_REAXFF=yes + - -D PKG_RHEO=yes - -D PKG_RIGID=yes - -D PKG_SHOCK=yes - -D PKG_SMTBQ=yes diff --git a/tools/regression-tests/README b/tools/regression-tests/README index 1342e50310..b698be6669 100644 --- a/tools/regression-tests/README +++ b/tools/regression-tests/README @@ -106,7 +106,7 @@ An example of the test configuration `config.yaml` is given as below. --- lmp_binary: "" - nprocs: "4" + nprocs: "" args: "-cite none" mpiexec: "mpirun" mpiexec_numproc_flag: "-np" @@ -135,7 +135,8 @@ An example of the test configuration `config.yaml` is given as below. abs: 1e-2 rel: 1e-4 skip: - [ in.displ, + [ + in.displ, in.displ2, in.*_imd*, ] @@ -144,6 +145,13 @@ An example of the test configuration `config.yaml` is given as below. epsilon: 1e-16 timeout: 180 +Note that if nprocs is left empty "", as in the above example, the test for a given input script will use the maximum number of procs among the log files. +For instance, for the input script examples/melt/in.melt, there are 2 log files with 1 and 4 procs. The test for in.melt will then run with 4 procs and the output is compare against the 4-proc log file. This is the typical configuration. + +If nprocs is specified explicitly, for example, nprocs: "2", this value of nprocs will be used for ALL the input scripts (except for the valgrind test). +In this case, the reference log file is again the one with the maximum number of procs, that is, 4. One example of this configuration is for KOKKOS tests where +the runs are often `mpirun -np 2 lmp -in in.melt -k on g 2` (with the CUDA backend) or `mpirun -np 2 lmp -in in.melt -k on t 2` (with the OpenMP backend). + An example of the list of example subfolders in a text file `list_subfolders1.txt` /home/codes/lammps/examples/melt 1 diff --git a/tools/regression-tests/config_kokkos.yaml b/tools/regression-tests/config_kokkos.yaml index 8c94e04071..455d1ad0dd 100644 --- a/tools/regression-tests/config_kokkos.yaml +++ b/tools/regression-tests/config_kokkos.yaml @@ -1,33 +1,26 @@ --- lmp_binary: "" - nprocs: "4" - args: "-cite none -k on g 1 -sf kk -pk kokkos newton on neigh half" + nprocs: "2" + args: "-cite none -k on g 2 -sf kk -pk kokkos newton on neigh half" mpiexec: "mpirun" - mpiexec_numproc_flag: "-np" + mpiexec_numproc_flag: "--host localhost:2 -np" tolerance: PotEng: abs: 1e-4 - rel: 1e-7 + rel: 1e-6 TotEng: abs: 1e-4 - rel: 1e-7 + rel: 1e-6 Press: abs: 1e-4 - rel: 1e-7 + rel: 1e-6 Temp: abs: 1e-4 - rel: 1e-7 + rel: 1e-6 E_vdwl: abs: 1e-3 - rel: 1e-7 - overrides: - in.rigid.tnr: - Temp: - abs: 1e-3 - rel: 1e-5 - Press: - abs: 1e-2 - rel: 1e-4 + rel: 1e-6 + timeout: 120 nugget: 1.0 epsilon: 1e-16 diff --git a/tools/regression-tests/config_kokkos_openmp.yaml b/tools/regression-tests/config_kokkos_openmp.yaml new file mode 100644 index 0000000000..1979d54b6a --- /dev/null +++ b/tools/regression-tests/config_kokkos_openmp.yaml @@ -0,0 +1,26 @@ +--- + lmp_binary: "" + nprocs: "2" + args: "-cite none -k on t 2 -sf kk -pk kokkos newton on neigh half" + mpiexec: "mpirun" + mpiexec_numproc_flag: "--host localhost:2 -np" + tolerance: + PotEng: + abs: 1e-4 + rel: 1e-6 + TotEng: + abs: 1e-4 + rel: 1e-6 + Press: + abs: 1e-4 + rel: 1e-6 + Temp: + abs: 1e-4 + rel: 1e-6 + E_vdwl: + abs: 1e-3 + rel: 1e-7 + + timeout: 120 + nugget: 1.0 + epsilon: 1e-16 diff --git a/tools/regression-tests/get_kokkos_input.py b/tools/regression-tests/get_kokkos_input.py new file mode 100644 index 0000000000..f94ca42c8e --- /dev/null +++ b/tools/regression-tests/get_kokkos_input.py @@ -0,0 +1,101 @@ +# This script looks for input scripts under examples/ that have pair/fix/compute styles with KOKKOS support +# and print out separate sets of input lists into 4 files: +# input-list-pair-kk.txt +# input-list-fix-kk.txt +# input-list-compute-kk.txt +# input-list-misc-kk.txt +# These 4 files will be read in by the regression tester run_tests.py + +from argparse import ArgumentParser +import random +import subprocess +import sys + +# in_style = fix, pair, compute, angle, bond, dihedral, improper, min +def generate_list(in_style, example_toplevel, filter_out, output_list): + + # find all the pair styles with the kokkos suffix + cmd_str = f"ls {example_toplevel}/../src/KOKKOS | grep {in_style} | grep .cpp" + p = subprocess.run(cmd_str, shell=True, text=True, capture_output=True) + kokkos_styles = p.stdout.split('\n') + style_names = [] + for style in kokkos_styles: + if style != "": + # replace "{in_style}_[name]_kokkos.cpp" into "[name]" + style = style.replace(f"{in_style}_","") + style = style.replace("_kokkos.cpp","") + style = style.replace("_","/") + style_names.append(style) + + for style in style_names: + # find in the in. script a line with "pair_style [name]" + if in_style == "pair" or in_style == "angle" or in_style == "bond" or in_style == "dihedral" or in_style == "improper": + cmd_str = f"grep -rl '{in_style}_style.*{style}' {example_toplevel}/*/in.* " + else: + # find in the in. script a line with "fix ... [name]" (or "compute ... [name]") + cmd_str = f"grep -rl '{in_style}.*{style}' {example_toplevel}/*/in.* " + + p = subprocess.run(cmd_str, shell=True, text=True, capture_output=True) + input_list = p.stdout.split('\n') + input_list = ' '.join(input_list).split() + for input in input_list: + if input != "": + skip = False + for filter in filter_out: + if filter in input: + skip = True + break + if skip == True: + continue + else: + if input not in output_list: + output_list.append(input) + + +if __name__ == "__main__": + parser = ArgumentParser() + parser.add_argument("--examples-top-level", dest="example_toplevel", default="", help="Examples top-level") + parser.add_argument("--filter-out", dest="filter_out", default="", help="Filter out input scripts that contain strings") + parser.add_argument("--batch-size", dest="batch_size", default=50, help="Batch size of scripts per input list") + + args = parser.parse_args() + example_toplevel = args.example_toplevel + filter_out = args.filter_out.split(";") + batch_size = int(args.batch_size) + + # print the list of the input scripts that has each feature to a separate file + features = [ 'pair', 'fix', 'compute' ] + for feature in features: + input_list = [] + generate_list(feature, example_toplevel, filter_out, input_list) + + num_batches = int(len(input_list) / batch_size) + if num_batches < 2: + with open(f"input-list-{feature}-kk.txt", "w") as f: + for input in input_list: + if input != "": + f.write(f"{input}\n") + else: + for idx in range(num_batches): + with open(f"input-list-{feature}-{idx}-kk.txt", "w") as f: + if len(input_list) > batch_size: + sampled = random.sample(input_list, batch_size) + else: + sampled = input_list + for input in sampled: + if input != "": + if input in input_list: + input_list.remove(input) + f.write(f"{input}\n") + + # combine the list of the input scripts that have these feature to a single file input-list-misc-kk.txt + features = [ 'angle', 'bond', 'dihedral', 'improper', 'min' ] + input_list = [] + for feature in features: + generate_list(feature, example_toplevel, filter_out, input_list) + + with open(f"input-list-misc-kk.txt", "w") as f: + for input in input_list: + if input != "": + f.write(f"{input}\n") + diff --git a/tools/regression-tests/run_tests.py b/tools/regression-tests/run_tests.py index 32b89bd27c..577ca211c0 100755 --- a/tools/regression-tests/run_tests.py +++ b/tools/regression-tests/run_tests.py @@ -147,10 +147,13 @@ class TestResult: def iterate(lmp_binary, input_folder, input_list, config, results, progress_file, failure_file, walltime_ref=1, verbose=False, last_progress=None, output_buf=None): num_tests = len(input_list) + + num_skipped = 0 + num_error = 0 + num_timeout = 0 + num_failed = 0 num_completed = 0 num_passed = 0 - num_skipped = 0 - num_error = 0 num_memleak = 0 test_id = 0 @@ -187,7 +190,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file msg = " + " + input + f" ({test_id+1}/{num_tests}): skipped as specified in {configFileName}" print(msg) logger.info(msg) - progress.write(f"{input}: {{ folder: {input_folder}, status: \"skipped\", walltime: {walltime} }}\n") + progress.write(f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': 'skipped', 'walltime': '{walltime}' }} }}\n") progress.close() num_skipped = num_skipped + 1 test_id = test_id + 1 @@ -205,7 +208,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file msg = " + " + input + f" ({test_id+1}/{num_tests}): skipped as specified in {configFileName}" print(msg) logger.info(msg) - progress.write(f"{input}: {{ folder: {input_folder}, status: \"skipped\", walltime: {walltime} }}\n") + progress.write(f"{{ '{input}': {{ 'folder': {input_folder}, 'status': 'skipped', 'walltime': '{walltime}' }} }}\n") progress.close() num_skipped = num_skipped + 1 test_id = test_id + 1 @@ -300,12 +303,15 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file saved_nprocs = config['nprocs'] - # if the maximum number of procs is different from the value in the configuration file - # then override the setting for this particular input script - if max_np != int(config['nprocs']): + # if the nprocs value in the configuration file is empty then use max_np for this particular input script + if config['nprocs'] == "": config['nprocs'] = str(max_np) + else: + # otherwise use the nprocs value in the configuration file (4 for most examples) + logger.info(f" Using {config['nprocs']} nprocs for {input_test} as enforced in the config file.") + logger.info(f" WARNING: The maximum number of procs found from the reference log files is {max_np}.") - # store the value of nprocs + # store the value of nprocs to name the generated log file nprocs = int(config['nprocs']) # if valgrind is used for mem check, the run command will be @@ -322,7 +328,12 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file result = TestResult(name=input, output="", time="", status="passed") # run the LAMMPS binary with the input script - cmd_str, output, error, returncode, logfilename = execute(lmp_binary, config, input_test) + status = execute(lmp_binary, config, input_test) + cmd_str = status['cmd_str'] + output = status['stdout'] + error = status['stderr'] + returncode = status['returncode'] + logfilename = status['logfilename'] # restore the nprocs value in the configuration config['nprocs'] = saved_nprocs @@ -352,7 +363,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file results.append(result) print(f"{result.status}") - msg = f"{input}: {{ folder: {input_folder}, status: \"{result.status}\", walltime: {walltime} }}\n" + msg = f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': '{result.status}', 'walltime': '{walltime}' }} }}\n" progress.write(msg) progress.close() failure.write(msg) @@ -369,7 +380,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file logger.info(f" {output}") logger.info(f" Error:\n{error}") - msg = f"{input}: {{ folder: {input_folder}, status: \"failed, no log file generated\", walltime: {walltime} }}\n" + msg = f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': 'failed, no log file generated', 'walltime': '{walltime}' }} }}\n" progress.write(msg) progress.close() failure.write(msg) @@ -399,7 +410,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file result.status = msg results.append(result) - msg = f"{input}: {{ folder: {input_folder}, status: \"{msg}\", walltime: {walltime} }}\n" + msg = f"{{ '{input}': {{ 'folder': '{input_folder}', status: \"{msg}\", 'walltime': '{walltime}' }} }}\n" progress.write(msg) progress.close() failure.write(msg) @@ -418,11 +429,15 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file logger.info(f"\n Output:\n{output}") logger.info(f"\n Error:\n{error}") - msg = f"{input}: {{ folder: {input_folder}, status: \"failed, no Total wall time in the output, {error}\", walltime: {walltime} }}\n" + msg = f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': 'failed, no Total wall time in the output, {error}', 'walltime': '{walltime}' }} }}\n" progress.write(msg) progress.close() failure.write(msg) + returncode = int(returncode) + if returncode == -1: + num_timeout = num_timeout + 1 + num_error = num_error + 1 test_id = test_id + 1 continue @@ -449,7 +464,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file logger.info(f"\n Output:\n{output}") logger.info(f"\n Error:\n{error}") - msg = f"{input}: {{ folder: {input_folder}, status: \"completed, but no Step nor Loop in the output.\", walltime: {walltime}, walltime_norm: {walltime_norm} }}\n" + msg = f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': 'completed, but no Step nor Loop in the output.', 'walltime': '{walltime}', 'walltime_norm': '{walltime_norm}' }} }}\n" progress.write(msg) progress.close() failure.write(msg) @@ -477,7 +492,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file result.status = msg + f", error parsing {logfilename} into YAML" results.append(result) - progress.write(f"{input}: {{ folder: {input_folder}, status: \"{result.status}\", walltime: {walltime}, walltime_norm: {walltime_norm} }}\n") + progress.write(f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': '{result.status}', 'walltime': '{walltime}', 'walltime_norm': '{walltime_norm}' }} }}\n") progress.close() if verbose == True: @@ -495,14 +510,14 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file if thermo_ref: num_runs_ref = len(thermo_ref) else: - # thhe thermo_ref dictionary is empty + # the thermo_ref dictionary is empty logger.info(f" failed, error parsing the reference log file {thermo_ref_file}.") result.status = "skipped numerical checks due to parsing the reference log file" results.append(result) - progress.write(f"{input}: {{ folder: {input_folder}, status: \"completed, numerical checks skipped, unsupported log file format\", walltime: {walltime}, walltime_norm: {walltime_norm} }}\n") + progress.write(f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': 'completed, numerical checks skipped, unsupported log file format', 'walltime': '{walltime}', 'walltime_norm': '{walltime_norm}' }} }}\n") progress.close() num_completed = num_completed + 1 - num_error = num_error + 1 + num_failed = num_failed + 1 test_id = test_id + 1 continue else: @@ -521,12 +536,12 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file result.status = "skipped due to missing the reference log file" results.append(result) - msg = f"{input}: {{ folder: {input_folder}, status: \"completed, numerical checks skipped due to missing the reference log file\", walltime: {walltime}, walltime_norm: {walltime_norm} }}\n" + msg = f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': 'completed, numerical checks skipped due to missing the reference log file', 'walltime': '{walltime}', 'walltime_norm': '{walltime_norm}' }} }}\n" progress.write(msg) progress.close() failure.write(msg) num_completed = num_completed + 1 - num_error = num_error + 1 + num_failed = num_failed + 1 test_id = test_id + 1 continue @@ -539,9 +554,10 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file " Check README in the folder, possibly due to using mpirun with partitions or parsing the wrong reference log file.") result.status = "failed, incomplete runs" results.append(result) - progress.write(f"{input}: {{ folder: {input_folder}, status: \"{result.status}\", walltime: {walltime}, walltime_norm: {walltime_norm} }}\n") + progress.write(f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': '{result.status}', 'walltime': '{walltime}', 'walltime_norm': '{walltime_norm}' }} }}\n") progress.close() - num_error = num_error + 1 + num_completed = num_completed + 1 + num_failed = num_failed + 1 test_id = test_id + 1 continue @@ -555,9 +571,10 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file logger.info(f" Check both log files for more details.") result.status = "failed, mismatched columns in the log files" results.append(result) - progress.write(f"{input}: {{ folder: {input_folder}, status: \"{result.status}\", walltime: {walltime}, walltime_norm: {walltime_norm} }}\n") + progress.write(f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': '{result.status}', 'walltime': '{walltime}', 'walltime_norm': '{walltime_norm}' }} }}\n") progress.close() - num_error = num_error + 1 + num_completed = num_completed + 1 + num_failed = num_failed + 1 test_id = test_id + 1 continue @@ -581,6 +598,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file failed_rel_output = [] num_checks = 0 mismatched_columns = False + mismatched_num_steps = False for irun in range(num_runs): num_fields = len(thermo[irun]['keywords']) @@ -593,6 +611,13 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file # get the total number of the thermo output lines nthermo_steps = len(thermo[irun]['data']) + nthermo_steps_ref = len(thermo_ref[irun]['data']) + + if nthermo_steps_ref != nthermo_steps: + logger.info(f" failed: Number of thermo steps in {logfilename} ({nthermo_steps})") + logger.info(f" is different from that in the reference log ({nthermo_steps_ref}) in run {irun}.") + mismatched_num_steps = True + continue # get the output at the last timestep thermo_step = nthermo_steps - 1 @@ -644,19 +669,41 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file print(f" {thermo[irun]['keywords'][i].ljust(width)} {str(val).rjust(20)} {str(ref).rjust(20)} {abs_diff_check.rjust(20)} {rel_diff_check.rjust(20)}") # after all runs completed, or are interrupted in one of the runs (mismatched_columns = True) - if mismatched_columns == True: - msg = f" mismatched log files after the first run. Check both log files for more details." + msg = f" mismatched columns in the log files after the first run. Check both log files for more details." print(msg) logger.info(msg) result.status = "thermo checks failed due to mismatched log files after the first run" + results.append(result) + progress.write(f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': '{result.status}', 'walltime': '{walltime}', 'walltime_norm': '{walltime_norm}' }} }}\n") + progress.close() + num_completed = num_completed + 1 + num_failed = num_failed + 1 + test_id = test_id + 1 + continue + + # some runs that involve the minimize command that leads to different number of steps vs the reference log file + if mismatched_num_steps == True: + msg = f" mismatched num steps in the log files. Check both log files for more details." + print(msg) + logger.info(msg) + result.status = "thermo checks failed due to mismatched log files " + results.append(result) + progress.write(f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': '{result.status}', 'walltime': '{walltime}', 'walltime_norm': '{walltime_norm}' }} }}\n") + progress.close() + num_completed = num_completed + 1 + num_failed = num_failed + 1 + test_id = test_id + 1 + continue result.status = "" if num_abs_failed > 0: msg = f" {num_abs_failed} abs diff checks failed." print(msg) logger.info(msg) - #result.status = f"abs_diff_failed: {num_abs_failed}, " + for out in failed_abs_output: + logger.info(f" - {out}") + if verbose == True: for out in failed_abs_output: print(f" - {out}") @@ -665,7 +712,9 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file msg = f" {num_rel_failed} rel diff checks failed." print(msg) logger.info(msg) - #result.status += f"rel_diff_failed: {num_rel_failed}" + for out in failed_rel_output: + logger.info(f" - {out}") + if verbose == True: for out in failed_rel_output: print(f" - {out}") @@ -674,12 +723,14 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file msg = f" all {num_checks} checks passed." print(msg) logger.info(msg) - #result.status = f"all {num_checks} checks passed." + + result.status = f" 'status': 'passed', 'abs_diff_failed': '{num_abs_failed}', 'rel_diff_failed': '{num_rel_failed}' " + num_passed = num_passed + 1 else: - num_error = num_error + 1 + result.status = f" 'status': 'failed', 'abs_diff_failed': '{num_abs_failed}', 'rel_diff_failed': '{num_rel_failed}' " + num_failed = num_failed + 1 - result.status = f"abs_diff_failed: {num_abs_failed}, rel_diff_failed: {num_rel_failed}" results.append(result) # check if memleak detects from valgrind run (need to replace "mpirun" -> valgrind --leak-check=yes mpirun") @@ -691,12 +742,12 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file msg += ", memory leaks detected" num_memleak = num_memleak + 1 - progress.write(f"{input}: {{ folder: {input_folder}, status: \"{msg}\", failed_checks: {{ {result.status} }}, walltime: {walltime}, walltime_norm: {walltime_norm} }}\n") + progress.write(f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': '{msg}', 'failed_checks': {{ {result.status} }}, 'walltime': '{walltime}', 'walltime_norm': '{walltime_norm}' }} }}\n") progress.close() # write to failure if there is any numerical failed check if num_abs_failed > 0 or num_rel_failed > 0: - failure.write(f"{input}: {{ folder: {input_folder}, status: \"{msg}\", failed_checks: {{ {result.status} }}, walltime: {walltime}, walltime_norm: {walltime_norm} }}\n") + failure.write(f"{{ '{input}': {{ 'folder': '{input_folder}', 'status': '{msg}', 'failed_checks': '{{ {result.status} }}, 'walltime': '{walltime}', 'walltime_norm': '{walltime_norm}' }} }}\n") # count the number of completed runs num_completed = num_completed + 1 @@ -709,6 +760,8 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file 'num_passed': num_passed, 'num_skipped': num_skipped, 'num_error': num_error, + 'num_timeout': num_timeout, + 'num_failed': num_failed, 'num_memleak': num_memleak, } return stat @@ -886,7 +939,14 @@ def execute(lmp_binary, config, input_file_name, generate_ref=False): try: p = subprocess.run(cmd_str, shell=True, text=True, capture_output=True, timeout=timeout) - return cmd_str, p.stdout, p.stderr, p.returncode, logfilename + status = { + 'cmd_str': cmd_str, + 'stdout': p.stdout, + 'stderr': p.stderr, + 'returncode': p.returncode, + 'logfilename': logfilename, + } + return status except subprocess.TimeoutExpired: msg = f" Timeout for: {cmd_str} ({timeout}s expired)" @@ -894,7 +954,14 @@ def execute(lmp_binary, config, input_file_name, generate_ref=False): print(msg) error_str = f"timeout ({timeout}s expired)" - return cmd_str, "", error_str, -1, logfilename + status = { + 'cmd_str': cmd_str, + 'stdout': "", + 'stderr': error_str, + 'returncode': -1, + 'logfilename': logfilename, + } + return status ''' get the reference walltime by running the lmp_binary with config with an input script in the bench/ folder @@ -932,6 +999,7 @@ def get_reference_walltime(lmp_binary, config): logger.info(msg) print(msg) + looptime = 1.0 for line in output.split('\n'): if "Total wall time" in line: walltime_str = line.split('time:')[1] @@ -940,6 +1008,14 @@ def get_reference_walltime(lmp_binary, config): minutes = float(hms[1]) seconds = float(hms[2]) walltime = hours * 3600.0 + minutes * 60.0 + seconds + if "Loop time" in line: + looptime_str = line.split(' ')[3] + seconds = float(looptime_str) + looptime = seconds + + # there is case where total walltime with in.lj is reported as zero seconds, then use loop time + if float(walltime) < float(config['epsilon']): + walltime = looptime logger.info(f" Reference walltime, sec = {walltime}") @@ -1104,7 +1180,7 @@ if __name__ == "__main__": help="Determine which test inputs have commands changed between a branch and the head") parser.add_argument("--quick-branch", dest="quick_branch", default=quick_branch, help="Branch to which compare the current head to for changed styles") - parser.add_argument("--quick-max", dest="quick_max", default=50, + parser.add_argument("--quick-max", dest="quick_max", default=0, help="Maximum number of inputs to randomly select") parser.add_argument("--quick-reference", dest="quick_reference", default=quick_reference, help="Reference YAML file with progress data from full regression test run") @@ -1351,6 +1427,13 @@ if __name__ == "__main__": example_inputs.append(input) num_inputscripts += 1 + # allow to select randomly some input scripts at this point if quick_max is set + if quick_max > 0 and len(example_inputs) > quick_max: + example_inputs = random.sample(example_inputs, quick_max) + msg = "\nTesting " + str(quick_max) + " randomly selected inputs" + print(msg) + logger.info(msg) + example_subfolders = folder_list msg = f"\nThere are {num_inputscripts} input scripts listed in {list_input}." print(msg) @@ -1437,6 +1520,8 @@ if __name__ == "__main__": passed_tests = 0 skipped_tests = 0 error_tests = 0 + timeout_tests = 0 + failed_tests = 0 memleak_tests = 0 # default setting is to use inplace_input @@ -1456,6 +1541,9 @@ if __name__ == "__main__": for directory in example_subfolders: + if os.path.exists(directory) is False: + continue + # change to the directory where the input script and data files are located print("-"*80) print("Entering " + directory) @@ -1490,6 +1578,8 @@ if __name__ == "__main__": skipped_tests += stat['num_skipped'] passed_tests += stat['num_passed'] error_tests += stat['num_error'] + timeout_tests += stat['num_timeout'] + failed_tests += stat['num_failed'] memleak_tests += stat['num_memleak'] # append the results to the all_results list @@ -1509,26 +1599,34 @@ if __name__ == "__main__": skipped_tests = stat['num_skipped'] passed_tests = stat['num_passed'] error_tests = stat['num_error'] + timeout_tests += stat['num_timeout'] + failed_tests = stat['num_failed'] memleak_tests = stat['num_memleak'] all_results.extend(results) - # print out summary + # print out summary: + # error_tests = number of runs that errored out + # failed_tests = number of runs that failed the numerical checks, including missing the reference log files, different num runs and num steps in a run + # completed_tests = number of runs that reached the end (Total wall time printed out) = failed_sests + passed_tests + msg = "\nSummary:\n" msg += f" Total number of input scripts: {total_tests}\n" msg += f" - Skipped : {skipped_tests}\n" - msg += f" - Failed : {error_tests}\n" + msg += f" - Error : {error_tests}\n" + msg += f" - timeout : {timeout_tests}\n" msg += f" - Completed: {completed_tests}\n" + msg += f" - failed : {failed_tests}\n" # print notice to GitHub if 'GITHUB_STEP_SUMMARY' in os.environ: with open(os.environ.get('GITHUB_STEP_SUMMARY'), 'w') as f: - print(f"Skipped: {skipped_tests} Failed: {error_tests} Completed: {completed_tests}", file=f) + print(f"Skipped: {skipped_tests} Error: {error_tests} Timeout: {timeout_tests} Failed: {failed_tests} Completed: {completed_tests}", file=f) if memleak_tests < completed_tests and 'valgrind' in config['mpiexec']: - msg += f" - memory leak detected : {memleak_tests}\n" + msg += f" - memory leak detected : {memleak_tests}\n" if passed_tests <= completed_tests: - msg += f" - numerical tests passed: {passed_tests}\n" + msg += f" - numerical tests passed: {passed_tests}\n" msg += "\nOutput:\n" msg += f" - List of failed inputs : {failure_file}\n" msg += f" - Status of the tested inputs : {progress_file}\n" @@ -1544,12 +1642,10 @@ if __name__ == "__main__": for result in all_results: #print(f"{result.name}: {result.status}") case = TestCase(name=result.name, classname=result.name) - if result.status == "failed": - case.add_failure_info(message="Actual values did not match expected ones.") - if result.status == "skipped": + if "passed" not in result.status: + case.add_failure_info(message=result.status) + if "skipped" in result.status: case.add_skipped_info(message="Test was skipped.") - if result.status == "error": - case.add_skipped_info(message="Test run had errors.") test_cases.append(case) current_timestamp = datetime.datetime.now() diff --git a/unittest/c-library/test_library_external.cpp b/unittest/c-library/test_library_external.cpp index 606d53d38b..63ef4eee32 100644 --- a/unittest/c-library/test_library_external.cpp +++ b/unittest/c-library/test_library_external.cpp @@ -123,6 +123,18 @@ TEST(lammps_external, callback) EXPECT_DOUBLE_EQ(reduce[5], 1.4); EXPECT_DOUBLE_EQ(reduce[6], 1.4); + double **fext = + (double **)lammps_extract_fix(handle, "ext", LMP_STYLE_ATOM, LMP_TYPE_ARRAY, 0, 0); + EXPECT_DOUBLE_EQ(fext[0][0], 10.0); + EXPECT_DOUBLE_EQ(fext[0][1], 10.0); + EXPECT_DOUBLE_EQ(fext[0][2], 10.0); + EXPECT_DOUBLE_EQ(fext[3][0], 10.0); + EXPECT_DOUBLE_EQ(fext[3][1], 10.0); + EXPECT_DOUBLE_EQ(fext[3][2], 10.0); + EXPECT_DOUBLE_EQ(fext[7][0], 10.0); + EXPECT_DOUBLE_EQ(fext[7][1], 10.0); + EXPECT_DOUBLE_EQ(fext[7][2], 10.0); + ::testing::internal::CaptureStdout(); lammps_close(handle); output = ::testing::internal::GetCapturedStdout(); @@ -193,6 +205,18 @@ TEST(lammps_external, array) EXPECT_DOUBLE_EQ(pe, 1.0 / 8.0); EXPECT_DOUBLE_EQ(press, 0.15416666666666667); + double **fext = + (double **)lammps_extract_fix(handle, "ext", LMP_STYLE_ATOM, LMP_TYPE_ARRAY, 0, 0); + EXPECT_DOUBLE_EQ(fext[0][0], 6.0); + EXPECT_DOUBLE_EQ(fext[0][1], 6.0); + EXPECT_DOUBLE_EQ(fext[0][2], 6.0); + EXPECT_DOUBLE_EQ(fext[3][0], 6.0); + EXPECT_DOUBLE_EQ(fext[3][1], 6.0); + EXPECT_DOUBLE_EQ(fext[3][2], 6.0); + EXPECT_DOUBLE_EQ(fext[7][0], 6.0); + EXPECT_DOUBLE_EQ(fext[7][1], 6.0); + EXPECT_DOUBLE_EQ(fext[7][2], 6.0); + ::testing::internal::CaptureStdout(); lammps_close(handle); output = ::testing::internal::GetCapturedStdout(); diff --git a/unittest/force-styles/test_fix_timestep.cpp b/unittest/force-styles/test_fix_timestep.cpp index 069f07abad..957226d22b 100644 --- a/unittest/force-styles/test_fix_timestep.cpp +++ b/unittest/force-styles/test_fix_timestep.cpp @@ -430,7 +430,8 @@ TEST(FixTimestep, plain) // fix nve/limit cannot work with r-RESPA ifix = lmp->modify->get_fix_by_id("test"); if (ifix && !utils::strmatch(ifix->style, "^rigid") && - !utils::strmatch(ifix->style, "^nve/limit")) { + !utils::strmatch(ifix->style, "^nve/limit") && + !utils::strmatch(ifix->style, "^recenter")) { if (!verbose) ::testing::internal::CaptureStdout(); cleanup_lammps(lmp, test_config); if (!verbose) ::testing::internal::GetCapturedStdout(); diff --git a/unittest/force-styles/tests/angle-amoeba.yaml b/unittest/force-styles/tests/angle-amoeba.yaml index 6265ce09fd..e94a3c3b62 100644 --- a/unittest/force-styles/tests/angle-amoeba.yaml +++ b/unittest/force-styles/tests/angle-amoeba.yaml @@ -20,7 +20,13 @@ angle_coeff: ! | * ub 0.0 0.0 4 ub -7.6 1.5537 equilibrium: 4 1.9320794819577227 1.9687313962496038 2.1676989309769574 1.8936822384138474 -extract: ! "" +extract: ! | + k2 1 + k3 1 + k4 1 + k5 1 + k6 1 + theta0 1 natoms: 29 init_energy: 22.644137017730763 init_stress: ! |2- diff --git a/unittest/force-styles/tests/angle-class2_p6.yaml b/unittest/force-styles/tests/angle-class2_p6.yaml index 065b3cb348..47c82e2925 100644 --- a/unittest/force-styles/tests/angle-class2_p6.yaml +++ b/unittest/force-styles/tests/angle-class2_p6.yaml @@ -23,7 +23,13 @@ angle_coeff: ! | 3 ba 10.0 10.0 1.5 1.5 4 ba 0.0 20.0 1.5 1.5 equilibrium: 4 1.9216075064457565 1.9373154697137058 2.0943951023931953 1.8936822384138474 -extract: ! "" +extract: ! | + k2 1 + k3 1 + k4 1 + k5 1 + k6 1 + theta0 1 natoms: 29 init_energy: 46.44080287964778 init_stress: ! |2- diff --git a/unittest/force-styles/tests/angle-cross.yaml b/unittest/force-styles/tests/angle-cross.yaml index 61ae6c4748..c03e4ab050 100644 --- a/unittest/force-styles/tests/angle-cross.yaml +++ b/unittest/force-styles/tests/angle-cross.yaml @@ -16,7 +16,13 @@ angle_coeff: ! | 3 100.0 150.0 120.0 1.45 1.35 98.2 4 250.0 90.0 110.0 1.05 1.20 99.9 equilibrium: 4 1.8675022996339325 1.911135530933791 1.7139133254584316 1.7435839227423353 -extract: ! "" +extract: ! | + r00 1 + r01 1 + kss 1 + kbs0 1 + kbs1 1 + theta0 1 natoms: 29 init_energy: -138.93227715361755 init_stress: ! |- diff --git a/unittest/force-styles/tests/angle-gaussian.yaml b/unittest/force-styles/tests/angle-gaussian.yaml index 0022862384..8fbc353df3 100644 --- a/unittest/force-styles/tests/angle-gaussian.yaml +++ b/unittest/force-styles/tests/angle-gaussian.yaml @@ -16,7 +16,10 @@ angle_coeff: ! | 3 300.0 2 0.2189 8.66 88.1 0.5439 9.94 142.7 4 300.0 2 0.0214 14.29 85.3 0.3934 18.22 118.1 equilibrium: 4 1.5376350710070041 1.4887658519511628 1.5376350710070041 1.4887658519511628 -extract: ! "" +extract: ! | + alpha 2 + width 2 + theta0 2 natoms: 29 init_energy: 57.794009158943744 init_stress: ! |2- diff --git a/unittest/force-styles/tests/atomic-pair-reaxff-qtpie.yaml b/unittest/force-styles/tests/atomic-pair-reaxff-qtpie.yaml new file mode 100644 index 0000000000..00524a037d --- /dev/null +++ b/unittest/force-styles/tests/atomic-pair-reaxff-qtpie.yaml @@ -0,0 +1,177 @@ +--- +lammps_version: 29 Aug 2024 +tags: slow, unstable +date_generated: Fri Nov 15 13:22:57 2024 +epsilon: 2e-10 +skip_tests: kokkos_omp +prerequisites: ! | + pair reaxff + fix qtpie/reaxff +pre_commands: ! | + echo screen + variable newton_pair delete + variable newton_pair index on + atom_modify map array + units real + atom_style charge + lattice diamond 3.77 + region box block 0 2 0 2 0 2 + create_box 3 box + create_atoms 1 box + displace_atoms all random 0.1 0.1 0.1 623426 + mass 1 1.0 + mass 2 12.0 + mass 3 16.0 + set type 1 type/fraction 2 0.5 998877 + set type 2 type/fraction 3 0.5 887766 + set type 1 charge 0.00 + set type 2 charge 0.01 + set type 3 charge -0.01 + velocity all create 100 4534624 loop geom +post_commands: ! | + fix qeq all qtpie/reaxff 1 0.0 8.0 1.0e-20 reaxff ${input_dir}/gauss_exp.txt +input_file: in.empty +pair_style: reaxff NULL checkqeq yes +pair_coeff: ! | + * * ffield.reax.mattsson H C O +extract: ! "" +natoms: 64 +init_vdwl: -3296.3503506624793 +init_coul: -268.63677950571287 +init_stress: ! |- + -1.0115766891336298e+03 -1.2088131753999489e+03 -8.2791874767348656e+02 -2.3899453277851464e+02 1.9901049958702231e+02 -6.5090424115686358e+02 +init_forces: ! |2 + 1 -8.6436073169042203e+01 -2.4400814471028966e+01 1.0905778351740135e+02 + 2 -1.0912360851161381e+02 -1.7785390915789219e+02 -2.2174396944101937e+02 + 3 -1.7205686042941795e+02 1.8323463801374010e+02 1.3330073949860362e+01 + 4 3.5074883698050790e+01 -5.4658573523678996e+01 8.8946983653047340e+01 + 5 1.8037666038924445e+02 1.5258130212658664e+01 -8.1473951707266664e+01 + 6 1.3687016587487102e+02 -2.9993359047535205e+02 3.1610843762057812e+01 + 7 -5.3040478511967407e+01 -1.2906564054460426e+02 -1.6364626011721845e+02 + 8 -1.5098093043741406e+02 4.1651970160590970e+01 1.5340103366817354e+02 + 9 1.7340129928959293e+01 8.8054766076132950e+01 2.4310262794648661e+01 + 10 8.3732473664111822e+01 1.4163802420547773e+02 1.2086953212785974e+02 + 11 -4.2433035390388874e+01 6.5812517236648006e+01 1.3461956725415703e+02 + 12 -9.6266601388748128e+01 -2.5379001755851835e+01 7.7659919394842500e+00 + 13 -6.5393078499150931e+01 -4.9454699468880946e+01 -3.8254305288102898e+01 + 14 8.2607951316806449e+01 -6.8984439086417567e+01 -9.2468559306204710e+01 + 15 -6.6187434150450684e+01 2.1289685674401704e+02 7.8580288164394176e+01 + 16 1.8897543273751987e+02 5.3397684583320228e+01 6.3460608305143431e+01 + 17 1.4554759813765031e+02 -3.9370375612854211e+01 -9.7056561289015221e+01 + 18 -4.5104710861585204e+01 -1.8896520586433442e+02 1.1164278206176432e+02 + 19 2.6896526778434691e+02 3.6948523216182610e+02 -3.3986956263391414e+02 + 20 -7.5462858727084978e+01 -8.6024949892680127e+01 -4.6529428267542672e-01 + 21 -7.3095936427312608e+01 -5.7463824581552551e+01 -1.1787940398446622e+02 + 22 1.5517223233172072e+02 -1.2975611741340879e+02 8.0541352960578152e+01 + 23 7.9113780255105098e+01 -1.3159747874504722e+01 -2.5876270623789040e+01 + 24 -2.0721357932150298e+02 2.1426998940883044e+02 -1.2404916276617425e+02 + 25 -1.1375172605965993e+02 1.9145650691697844e+02 -8.3221527665980318e+01 + 26 2.8613004810395404e+02 -2.1814761019305757e+02 2.3221022419460809e+02 + 27 -6.4957092731555079e+01 6.8730894090822545e+01 1.7879679090575814e+02 + 28 -3.5591147454501368e+00 3.8919120211497962e+01 3.2899891202019738e+01 + 29 -7.1006654872719238e+01 3.4395396834237154e+01 2.5490290273424105e+01 + 30 -1.7028325267142560e+02 -1.9865767607180553e+02 -1.1525322636144483e+02 + 31 -1.4030343203666592e+02 1.6505252880438636e+02 -1.2536824728321348e+02 + 32 2.8083940532792852e+01 -5.9613080258602423e+01 -1.7589243121123940e+02 + 33 -6.0786787938223988e+01 -6.2914083425882403e+01 6.1724187337270543e+01 + 34 -2.2381506031982109e+01 1.0258481649700494e+02 -7.2581426601092289e+01 + 35 2.6826897000164860e+02 -2.1830766483611634e+02 1.2929910897210587e+02 + 36 1.0617788606545010e+02 1.8844480945948908e+02 -1.9952637621677195e+02 + 37 -1.8500771626166176e+02 1.2691494490100189e+02 -6.1799194093629900e+01 + 38 -2.9568079732966703e+02 1.0466330586524869e+02 1.5539102098367138e+02 + 39 9.0313772894092821e+01 -5.7763893527493209e+01 2.4405485803219346e+01 + 40 2.0368385039374967e+01 -1.0212243725288241e+02 5.8977256992383225e+01 + 41 -5.4472403223120203e+01 1.3664060494004097e+01 -7.0498722233072925e+01 + 42 -1.0110613172512772e+02 3.7733470557342038e+01 -7.1384152705391784e+01 + 43 2.2496360806160274e+02 9.5374846176895645e+01 1.2314600313131321e+02 + 44 8.9930414141415653e+01 -9.8548000406723986e+01 -8.6016793720029909e+01 + 45 1.8042451487789609e+01 1.2291681595021672e+02 4.8750513798444771e+01 + 46 1.4360528923605511e+01 -2.8393705665522205e+01 2.5000665776800748e+01 + 47 3.3430180733495789e+01 -1.9134003719608592e+02 -6.9378872162649785e+01 + 48 6.5977481507414737e+01 -2.0569144157798024e+02 -2.3305633430859448e+01 + 49 -3.6805309882726834e+02 -2.5080697208449138e+01 1.0725330582435194e+02 + 50 3.3568380074196661e+01 -7.2887959381521910e+01 8.4247363622347109e+01 + 51 1.3937571489940009e+02 -1.0241922204671263e+02 1.5837793886668237e+02 + 52 -1.1015736921987484e+02 1.2143381508599626e+02 -1.3301954780997897e+02 + 53 -5.5053511032747757e+01 3.3318719859853354e+02 -5.4695756604566270e-02 + 54 -9.3809048702850468e+00 6.3003589530582012e+01 1.8485428176102951e+02 + 55 1.1268442794862931e+02 -1.7912573126673601e+02 7.6216834182693233e+01 + 56 -4.5797371929680743e+01 -1.3685285921363297e+02 4.1670118112644616e+01 + 57 9.5486141883804535e+01 7.3675172824019725e+01 -6.4017779318177091e+01 + 58 -2.6940387352055815e+01 -9.1882719416077734e+00 -1.6496876672222488e+01 + 59 -6.1110604213739784e+01 1.0339564891274583e+02 8.0387279300896552e+01 + 60 -1.3438307290047304e+01 6.2821560489016619e+01 -1.4960910695536089e+02 + 61 -3.7436807177941901e+01 -1.0060440409572418e+02 -7.2129567761936670e+01 + 62 1.5913069360497735e+01 -7.4587444709681003e+00 2.7411930168532034e+01 + 63 1.3132402121938716e+02 -1.2633666867998599e+02 -5.9237822651056007e+01 + 64 1.0528416436964088e+02 1.1185676743727093e+02 7.6927706681792429e+01 +run_vdwl: -3296.3468820327244 +run_coul: -268.63661874354375 +run_stress: ! |- + -1.0114879837664473e+03 -1.2087430287015966e+03 -8.2783958944769802e+02 -2.3908224870200783e+02 1.9895929948999779e+02 -6.5093393277361292e+02 +run_forces: ! |2 + 1 -8.6437645087040067e+01 -2.4400562180957351e+01 1.0906066254553539e+02 + 2 -1.0912275665241053e+02 -1.7786252590616218e+02 -2.2173930761917526e+02 + 3 -1.7205763157578019e+02 1.8323288100722453e+02 1.3329429976402201e+01 + 4 3.5076762638460409e+01 -5.4659870228622246e+01 8.8949923949362500e+01 + 5 1.8037851727311079e+02 1.5258819157296621e+01 -8.1471824505046186e+01 + 6 1.3693758232722558e+02 -2.9996076554788232e+02 3.1544103577304767e+01 + 7 -5.3040940882157734e+01 -1.2906590024224255e+02 -1.6365072194268137e+02 + 8 -1.5098199162393547e+02 4.1652246872814757e+01 1.5340185354669362e+02 + 9 1.7338937131206805e+01 8.8052623671376480e+01 2.4311464733168261e+01 + 10 8.3731216255426517e+01 1.4163544349001512e+02 1.2086773194932107e+02 + 11 -4.2431645167783358e+01 6.5809284879610303e+01 1.3461058585127651e+02 + 12 -9.6268502974108401e+01 -2.5380508031933715e+01 7.7613919613213387e+00 + 13 -6.5394480799184038e+01 -4.9454690134569510e+01 -3.8251921533789378e+01 + 14 8.2607648143581144e+01 -6.8981518310093449e+01 -9.2465919648906919e+01 + 15 -6.6184911564685194e+01 2.1289827790699042e+02 7.8579764996083128e+01 + 16 1.8897212100631526e+02 5.3401557991805042e+01 6.3454265397142500e+01 + 17 1.4554879673647156e+02 -3.9369818695332363e+01 -9.7059433050641857e+01 + 18 -4.5104364652465691e+01 -1.8896630466961875e+02 1.1164283921546559e+02 + 19 2.6896544439509694e+02 3.6948380976016932e+02 -3.3986849873937234e+02 + 20 -7.5474652635907873e+01 -8.6015213272245504e+01 -4.8259676480768809e-01 + 21 -7.3095940937548960e+01 -5.7464788467137694e+01 -1.1787855066724634e+02 + 22 1.5517351794732136e+02 -1.2975689546114967e+02 8.0540859481818742e+01 + 23 7.9115865455975012e+01 -1.3150472802357561e+01 -2.5876503956346053e+01 + 24 -2.0722276003223385e+02 2.1428270990874043e+02 -1.2405357611708547e+02 + 25 -1.1375429959489580e+02 1.9146061264686494e+02 -8.3222256641294663e+01 + 26 2.8613970510624404e+02 -2.1815485596507278e+02 2.3221441960858138e+02 + 27 -6.4953545994003377e+01 6.8732504333245046e+01 1.7879777515705371e+02 + 28 -3.5609706858523174e+00 3.8914845051174211e+01 3.2895014258375397e+01 + 29 -7.1006962970615220e+01 3.4395946962585107e+01 2.5490302918559674e+01 + 30 -1.7028397298399719e+02 -1.9865780309887722e+02 -1.1525330878428163e+02 + 31 -1.4030595583104076e+02 1.6505149109610096e+02 -1.2536961295119134e+02 + 32 2.8084746879715730e+01 -5.9606705649399501e+01 -1.7588207877218977e+02 + 33 -6.0786242960574022e+01 -6.2913885176828828e+01 6.1724433850103161e+01 + 34 -2.2381168039316268e+01 1.0258398798459802e+02 -7.2580420302975753e+01 + 35 2.6830990081622787e+02 -2.1835204404249015e+02 1.2931018843147504e+02 + 36 1.0617963217845744e+02 1.8843796909876622e+02 -1.9952176446060335e+02 + 37 -1.8503402227685811e+02 1.2695504061699209e+02 -6.1823411355500355e+01 + 38 -2.9568399770704622e+02 1.0466662636959578e+02 1.5539009610875451e+02 + 39 9.0314570392701199e+01 -5.7764115394488343e+01 2.4405095735494033e+01 + 40 2.0369156227530599e+01 -1.0212187254286960e+02 5.8977622919450276e+01 + 41 -5.4470510869266015e+01 1.3662227244573693e+01 -7.0490380604491506e+01 + 42 -1.0110530047858049e+02 3.7731202989968210e+01 -7.1386374496910719e+01 + 43 2.2495960799582232e+02 9.5372714343303912e+01 1.2314241456430595e+02 + 44 8.9934882887196963e+01 -9.8543527246862695e+01 -8.6022172212180365e+01 + 45 1.8033520031139599e+01 1.2290938260195539e+02 4.8756688104804162e+01 + 46 1.4361839506594013e+01 -2.8393917262125949e+01 2.5000422631182474e+01 + 47 3.3429877782459641e+01 -1.9133540583883391e+02 -6.9377262749149708e+01 + 48 6.5990004078562464e+01 -2.0569338794984392e+02 -2.3314637198125183e+01 + 49 -3.6809322631363733e+02 -2.5025981981696823e+01 1.0734144239898833e+02 + 50 3.3569219922950602e+01 -7.2886698417202680e+01 8.4245785013977056e+01 + 51 1.3937840161131851e+02 -1.0242257034381630e+02 1.5838167570232804e+02 + 52 -1.1015632519571759e+02 1.2143397586854937e+02 -1.3302347496060023e+02 + 53 -5.5089426238213143e+01 3.3316281975316286e+02 -7.4271240172002706e-02 + 54 -9.3687742955109137e+00 6.2990741970756417e+01 1.8487238090605700e+02 + 55 1.1268678311310606e+02 -1.7912913164827566e+02 7.6217416717889748e+01 + 56 -4.5806154616486943e+01 -1.3684453580988600e+02 4.1676759373489766e+01 + 57 9.5485704227965911e+01 7.3672454441368231e+01 -6.4019152364471736e+01 + 58 -2.6940596532815384e+01 -9.1863734979434319e+00 -1.6497051289566816e+01 + 59 -6.1118963218972965e+01 1.0340128135495597e+02 8.0392569432165885e+01 + 60 -1.3439582130914836e+01 6.2820376074347955e+01 -1.4960914576393716e+02 + 61 -3.7435810911347573e+01 -1.0060262070691427e+02 -7.2129466739698870e+01 + 62 1.5913491338811767e+01 -7.4593609075659995e+00 2.7412825126279046e+01 + 63 1.3132146995609114e+02 -1.2633718643910591e+02 -5.9233334916534574e+01 + 64 1.0528511106781713e+02 1.1185795842149707e+02 7.6928226208764087e+01 +... diff --git a/unittest/force-styles/tests/bond-class2.yaml b/unittest/force-styles/tests/bond-class2.yaml index 42c73346a6..8ee724e5e4 100644 --- a/unittest/force-styles/tests/bond-class2.yaml +++ b/unittest/force-styles/tests/bond-class2.yaml @@ -18,6 +18,9 @@ bond_coeff: ! | 5 0.97 532.50 -1282.90 2004.76 equilibrium: 5 1.42 1.1 1.3 1.2 0.97 extract: ! | + k2 1 + k3 1 + k4 1 r0 1 natoms: 29 init_energy: 26.429859642132705 diff --git a/unittest/force-styles/tests/bond-gaussian.yaml b/unittest/force-styles/tests/bond-gaussian.yaml index 469c01a7e7..298e31723c 100644 --- a/unittest/force-styles/tests/bond-gaussian.yaml +++ b/unittest/force-styles/tests/bond-gaussian.yaml @@ -17,7 +17,10 @@ bond_coeff: ! | 4 300.0 1 0.0100 0.098 2.45 5 300.0 1 0.0100 0.098 2.85 equilibrium: 5 1.45 1.37 1.61 2.45 2.85 -extract: ! "" +extract: ! | + alpha 2 + width 2 + r0 2 natoms: 29 init_energy: 4638.6541482649545 init_stress: ! |2- diff --git a/unittest/force-styles/tests/bond-morse.yaml b/unittest/force-styles/tests/bond-morse.yaml index d17e1db97e..f56662efd6 100644 --- a/unittest/force-styles/tests/bond-morse.yaml +++ b/unittest/force-styles/tests/bond-morse.yaml @@ -18,6 +18,8 @@ bond_coeff: ! | 5 7000.0 0.3 1.0 equilibrium: 5 1.5 1.1 1.3 1.2 1 extract: ! | + d0 1 + alpha 1 r0 1 natoms: 29 init_energy: 5.607154540709207 diff --git a/unittest/force-styles/tests/bond-nonlinear.yaml b/unittest/force-styles/tests/bond-nonlinear.yaml index ae52190dd9..995d39425f 100644 --- a/unittest/force-styles/tests/bond-nonlinear.yaml +++ b/unittest/force-styles/tests/bond-nonlinear.yaml @@ -17,7 +17,10 @@ bond_coeff: ! | 4 650.0 1.2 1.4 5 450.0 1.0 1.1 equilibrium: 5 1.5 1.1 1.3 1.2 1 -extract: ! "" +extract: ! | + lamda 1 + epsilon 1 + r0 1 natoms: 29 init_energy: 1.9451728032820943 init_stress: ! |- diff --git a/unittest/force-styles/tests/data.cmap b/unittest/force-styles/tests/data.cmap new file mode 100644 index 0000000000..ad86b1c3ed --- /dev/null +++ b/unittest/force-styles/tests/data.cmap @@ -0,0 +1,232 @@ +LAMMPS data file via write_data, version 5 May 2020, timestep = 0 + +29 atoms +5 atom types +24 bonds +5 bond types +30 angles +4 angle types +31 dihedrals +5 dihedral types +2 impropers +2 improper types +5 crossterms + + -6.024572 8.975428 xlo xhi + -7.692866 7.307134 ylo yhi + -8.086924 6.913076 zlo zhi + +Masses + +1 12.0107 +2 4.00794 +3 14.0067 +4 15.9994 +5 15.9994 + +Pair Coeffs # zero + +1 +2 +3 +4 +5 + +Bond Coeffs # zero + +1 1.5 +2 1.1 +3 1.3 +4 1.2 +5 1 + +Angle Coeffs # zero + +1 110.1 +2 111 +3 120 +4 108.5 + +Dihedral Coeffs # zero + +1 +2 +3 +4 +5 + +Improper Coeffs # zero + +1 +2 + +Atoms # full + +10 2 1 7.0000000000000007e-02 2.0185283555536988e+00 -1.4283966846517357e+00 -9.6733527271133024e-01 0 0 0 +11 2 2 8.9999999999999997e-02 1.7929780509347666e+00 -1.9871047540768743e+00 -1.8840626643185674e+00 0 0 0 +12 2 1 -2.7000000000000002e-01 3.0030247876861225e+00 -4.8923319967572748e-01 -1.6188658531537248e+00 0 0 0 +13 2 2 8.9999999999999997e-02 4.0447273787895934e+00 -9.0131998547446246e-01 -1.6384447268320836e+00 0 0 0 +14 2 2 8.9999999999999997e-02 2.6033152817257075e+00 -4.0789761505963579e-01 -2.6554413538823063e+00 0 0 0 + 2 1 2 3.1000000000000000e-01 3.0197083955402204e-01 2.9515239068888608e+00 -8.5689735572907566e-01 0 0 0 + 3 1 1 -2.0000000000000000e-02 -6.9435377880558602e-01 1.2440473127136711e+00 -6.2233801468892025e-01 0 0 0 + 4 1 2 8.9999999999999997e-02 -1.5771614164685133e+00 1.4915333140468066e+00 -1.2487126845040522e+00 0 0 0 + 6 1 1 5.1000000000000001e-01 2.9412607937706009e-01 2.2719282656652909e-01 -1.2843094067857870e+00 0 0 0 + 7 1 4 -5.1000000000000001e-01 3.4019871062879609e-01 -9.1277350075786561e-03 -2.4633113224304561e+00 0 0 0 +19 3 2 4.2359999999999998e-01 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 0 0 0 +15 2 2 8.9999999999999997e-02 2.9756315249791303e+00 5.6334269722969288e-01 -1.2437650754599008e+00 0 0 0 +18 3 4 -8.4719999999999995e-01 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 0 0 0 +20 3 2 4.2359999999999998e-01 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 0 0 0 + 8 2 3 -4.6999999999999997e-01 1.1641187171852805e+00 -4.8375305955385234e-01 -6.7659823767368688e-01 0 0 0 + 9 2 2 3.1000000000000000e-01 1.3777459838125838e+00 -2.5366338669522998e-01 2.6877644730326306e-01 0 0 0 +16 2 1 5.1000000000000001e-01 2.6517554244980306e+00 -2.3957110424978438e+00 3.2908335999178327e-02 0 0 0 +17 2 4 -5.1000000000000001e-01 2.2309964792710639e+00 -2.1022918943319384e+00 1.1491948328949437e+00 0 0 0 + 1 1 3 -4.6999999999999997e-01 -2.7993683669226832e-01 2.4726588069312840e+00 -1.7200860244148433e-01 0 0 0 + 5 1 2 8.9999999999999997e-02 -8.9501761359359255e-01 9.3568128743071344e-01 4.0227731871484346e-01 0 0 0 +21 4 5 -8.4719999999999995e-01 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 0 0 0 +22 4 2 4.2359999999999998e-01 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 0 0 0 +23 4 2 4.2359999999999998e-01 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 0 0 0 +24 5 5 -8.4719999999999995e-01 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 0 0 0 +25 5 2 4.2359999999999998e-01 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 0 0 0 +26 5 2 4.2359999999999998e-01 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 0 0 0 +27 6 5 -8.4719999999999995e-01 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 0 0 0 +28 6 2 4.2359999999999998e-01 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 0 0 0 +29 6 2 4.2359999999999998e-01 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 0 0 0 + +Velocities + +1 7.7867804888392077e-04 5.8970331623292821e-04 -2.2179517633030531e-04 +2 2.7129529964126462e-03 4.6286427111164284e-03 3.5805549693846352e-03 +3 -1.2736791029204805e-03 1.6108674226414498e-03 -3.3618185901550799e-04 +4 -9.2828595122009308e-04 -1.2537885319521818e-03 -4.1204974953432108e-03 +5 -1.1800848061603740e-03 7.5424401975844038e-04 6.9023177964912290e-05 +6 -3.0914004879905335e-04 1.2755385764678133e-03 7.9574303350202582e-04 +7 -1.1037894966874103e-04 -7.6764845099077425e-04 -7.7217630460203659e-04 +8 3.9060281273221989e-04 -8.1444231918053418e-04 1.5134641148324972e-04 +9 1.2475530960659720e-03 -2.6608454451432528e-03 1.1117602907112732e-03 +10 4.5008983776042893e-04 4.9530197647538077e-04 -2.3336234361093645e-04 +11 -3.6977669078869707e-04 -1.5289071951960539e-03 -2.9176389881837113e-03 +12 1.0850834530183159e-03 -6.4965897903201833e-04 -1.2971152622619948e-03 +13 4.0754559196230639e-03 3.5043502394946119e-03 -7.8324487687854666e-04 +14 -1.3837220448746613e-04 -4.0656048637594394e-03 -3.9333461173944500e-03 +15 -4.3301707382721859e-03 -3.1802661664634938e-03 3.2037919043360571e-03 +16 -9.6715751018414326e-05 -5.0016572678960377e-04 1.4945658875149626e-03 +17 6.5692180538157174e-04 3.6635779995305095e-04 8.3495414466050911e-04 +18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 +19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 +20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 +21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 +22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 +23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 +24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 +25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 +26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 +27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 +28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 +29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 + +Bonds + +1 5 1 2 +2 3 1 3 +3 2 3 4 +4 2 3 5 +5 1 3 6 +6 3 6 8 +7 4 6 7 +8 5 8 9 +9 3 8 10 +10 2 10 11 +11 1 10 12 +12 1 10 16 +13 2 12 13 +14 2 12 14 +15 2 12 15 +16 4 16 17 +17 5 18 19 +18 5 18 20 +19 5 21 22 +20 5 21 23 +21 5 24 25 +22 5 24 26 +23 5 27 28 +24 5 27 29 + +Angles + +1 4 2 1 3 +2 4 1 3 5 +3 4 1 3 4 +4 4 1 3 6 +5 4 4 3 5 +6 2 5 3 6 +7 2 4 3 6 +8 3 3 6 7 +9 3 3 6 8 +10 3 7 6 8 +11 2 6 8 9 +12 2 9 8 10 +13 3 6 8 10 +14 2 8 10 11 +15 3 8 10 16 +16 2 11 10 12 +17 1 12 10 16 +18 1 8 10 12 +19 2 11 10 16 +20 2 10 12 15 +21 2 10 12 14 +22 2 10 12 13 +23 4 13 12 15 +24 4 13 12 14 +25 4 14 12 15 +26 4 10 16 17 +27 1 19 18 20 +28 1 22 21 23 +29 1 25 24 26 +30 1 28 27 29 + +Dihedrals + +1 2 2 1 3 6 +2 2 2 1 3 4 +3 3 2 1 3 5 +4 1 1 3 6 8 +5 1 1 3 6 7 +6 5 4 3 6 8 +7 5 4 3 6 7 +8 5 5 3 6 8 +9 5 5 3 6 7 +10 4 3 6 8 9 +11 3 3 6 8 10 +12 3 7 6 8 9 +13 4 7 6 8 10 +14 2 6 8 10 12 +15 2 6 8 10 16 +16 2 6 8 10 11 +17 2 9 8 10 12 +18 4 9 8 10 16 +19 5 9 8 10 11 +20 5 8 10 12 13 +21 1 8 10 12 14 +22 5 8 10 12 15 +23 4 8 10 16 17 +24 5 11 10 12 13 +25 5 11 10 12 14 +26 5 11 10 12 15 +27 2 11 10 16 17 +28 2 12 10 16 17 +29 5 16 10 12 13 +30 5 16 10 12 14 +31 5 16 10 12 15 + +Impropers + +1 1 6 3 8 7 +2 2 8 6 10 9 + +CMAP + +1 1 8 10 12 18 20 +2 2 18 20 22 25 27 +3 3 2 4 5 6 7 +4 4 10 11 12 13 14 +5 5 5 10 15 20 25 diff --git a/unittest/force-styles/tests/fix-timestep-efield_const.yaml b/unittest/force-styles/tests/fix-timestep-efield_const.yaml index 932f11179e..21bfc808da 100644 --- a/unittest/force-styles/tests/fix-timestep-efield_const.yaml +++ b/unittest/force-styles/tests/fix-timestep-efield_const.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Tue Aug 6 02:04:43 2024 epsilon: 2e-13 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-efield_dipole_const.yaml b/unittest/force-styles/tests/fix-timestep-efield_dipole_const.yaml index 503f7253f1..aa2323fc03 100644 --- a/unittest/force-styles/tests/fix-timestep-efield_dipole_const.yaml +++ b/unittest/force-styles/tests/fix-timestep-efield_dipole_const.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Sun Aug 4 21:46:33 2024 epsilon: 2e-13 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-efield_dipole_variable.yaml b/unittest/force-styles/tests/fix-timestep-efield_dipole_variable.yaml index 069526c4c0..b6e636d719 100644 --- a/unittest/force-styles/tests/fix-timestep-efield_dipole_variable.yaml +++ b/unittest/force-styles/tests/fix-timestep-efield_dipole_variable.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Sun Aug 4 22:46:18 2024 epsilon: 2e-13 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-efield_region.yaml b/unittest/force-styles/tests/fix-timestep-efield_region_block.yaml similarity index 99% rename from unittest/force-styles/tests/fix-timestep-efield_region.yaml rename to unittest/force-styles/tests/fix-timestep-efield_region_block.yaml index d0770a1ab8..a155343e6d 100644 --- a/unittest/force-styles/tests/fix-timestep-efield_region.yaml +++ b/unittest/force-styles/tests/fix-timestep-efield_region_block.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Sat Aug 3 05:18:10 2024 epsilon: 2e-13 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-efield_region_sphere.yaml b/unittest/force-styles/tests/fix-timestep-efield_region_sphere.yaml new file mode 100644 index 0000000000..ac3748ae11 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-efield_region_sphere.yaml @@ -0,0 +1,82 @@ +--- +lammps_version: 29 Aug 2024 +date_generated: Wed Oct 9 18:02:13 2024 +epsilon: 2e-13 +skip_tests: +prerequisites: ! | + atom full + fix efield +pre_commands: ! "" +post_commands: ! | + region 1 sphere 0 0 0 1 + fix move all nve + fix test solute efield 0.1 0.1 0.1 region 1 + fix_modify test virial yes +input_file: in.fourmol +natoms: 29 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +global_scalar: 0 +global_vector: ! |- + 3 0 0 0 +run_pos: ! |2 + 1 -2.7045559775384032e-01 2.4912159905679729e+00 -1.6695851791541888e-01 + 2 3.1004029573899528e-01 2.9612354631094391e+00 -8.5466363037021464e-01 + 3 -7.0398551400789477e-01 1.2305509955830618e+00 -6.2777526944456274e-01 + 4 -1.5818159336499285e+00 1.4837407818929933e+00 -1.2538710836062004e+00 + 5 -9.0719763672789266e-01 9.2652103885675297e-01 3.9954210488374786e-01 + 6 2.4831720524855985e-01 2.8313021497871271e-01 -1.2314233331711453e+00 + 7 3.4143527641386412e-01 -2.2646551041391422e-02 -2.5292291414903052e+00 + 8 1.1743552229100009e+00 -4.8863228565853950e-01 -6.3783432910825522e-01 + 9 1.3800524229500313e+00 -2.5274721030406683e-01 2.8353985887095157e-01 + 10 2.0510765220543883e+00 -1.4604063740302866e+00 -9.8323745081712954e-01 + 11 1.7878031944442556e+00 -1.9921863272948861e+00 -1.8890602447625777e+00 + 12 3.0063007039340053e+00 -4.9013350496963293e-01 -1.6231898107386229e+00 + 13 4.0515402959192999e+00 -8.9202011606653986e-01 -1.6400005529924957e+00 + 14 2.6066963345543819e+00 -4.1789253965514156e-01 -2.6634003608794394e+00 + 15 2.9695287185712913e+00 5.5422613165234036e-01 -1.2342022021790127e+00 + 16 2.6747029695228521e+00 -2.4124119054564295e+00 -2.3435746150616148e-02 + 17 2.2153577785283796e+00 -2.0897985186907717e+00 1.1963150794479436e+00 + 18 2.1369701704115704e+00 3.0158507413630606e+00 -3.5179348337215015e+00 + 19 1.5355837136087378e+00 2.6255292355375675e+00 -4.2353987779879052e+00 + 20 2.7727573005678776e+00 3.6923910449610169e+00 -3.9330842459133493e+00 + 21 4.9040128073204299e+00 -4.0752348172957946e+00 -3.6210314709891711e+00 + 22 4.3582355554440841e+00 -4.2126119427287048e+00 -4.4612844196314052e+00 + 23 5.7439382849307599e+00 -3.5821957939275029e+00 -3.8766361295935821e+00 + 24 2.0689243582422630e+00 3.1513346907271012e+00 3.1550389754828800e+00 + 25 1.3045351331492134e+00 3.2665125705842848e+00 2.5111855257433504e+00 + 26 2.5809237402711274e+00 4.0117602605482832e+00 3.2212060529089896e+00 + 27 -1.9611343130357228e+00 -4.3563411931359752e+00 2.1098293115523705e+00 + 28 -2.7473562684513411e+00 -4.0200819932379330e+00 1.5830052163433954e+00 + 29 -1.3126000191359855e+00 -3.5962518039482929e+00 2.2746342468737835e+00 +run_vel: ! |2 + 1 8.1705744183262364e-03 1.6516406176274284e-02 4.7902264318912908e-03 + 2 5.4501493445687802e-03 5.1791699408496447e-03 -1.4372931530376594e-03 + 3 -8.2298292722385660e-03 -1.2926551614621379e-02 -4.0984181178163794e-03 + 4 -3.7699042590093549e-03 -6.5722892098813894e-03 -1.1184640360133316e-03 + 5 -1.1021961004346582e-02 -9.8906780939336109e-03 -2.8410737829284421e-03 + 6 -3.9676663166400034e-02 4.6817061464710256e-02 3.7148491979476124e-02 + 7 9.1033953013898601e-04 -1.0128524411938794e-02 -5.1568251805019748e-02 + 8 7.9064712058855690e-03 -3.3507254552631780e-03 3.4557098492564636e-02 + 9 1.5644176117320919e-03 3.7365546102722177e-03 1.5047408822037646e-02 + 10 2.9201446820573178e-02 -2.9249578745486140e-02 -1.5018077424322538e-02 + 11 -4.7835961513517560e-03 -3.7481385134185202e-03 -2.3464104142290089e-03 + 12 2.2696451841920581e-03 -3.4774154398129452e-04 -3.0640770327796884e-03 + 13 2.7531740451953108e-03 5.8171061612840597e-03 -7.9467454022159748e-04 + 14 3.5246182371994170e-03 -5.7939995585585503e-03 -3.9478431172751327e-03 + 15 -1.8547943640122978e-03 -5.8554729942777769e-03 6.2938485140538701e-03 + 16 1.8681499973445235e-02 -1.3262466204585334e-02 -4.5638651457003243e-02 + 17 -1.2896269981100382e-02 9.7527665265956451e-03 3.7296535360836762e-02 + 18 -8.0065794848261610e-04 -8.6270473212554308e-04 -1.4483040697508777e-03 + 19 1.2452390836182583e-03 -2.5061097118772749e-03 7.2998631009713062e-03 + 20 3.5930060229597072e-03 3.6938860309252974e-03 3.2322732687893115e-03 + 21 -1.4689220370766539e-03 -2.7352129761527648e-04 7.0581624215243120e-04 + 22 -7.0694199254630382e-03 -4.2577148924878598e-03 2.8079117614252034e-04 + 23 6.0446963117374939e-03 -1.4000131614795382e-03 2.5819754847014320e-03 + 24 3.1926367902287864e-04 -9.9445664749276113e-04 1.4999996959365281e-04 + 25 1.3789754514814445e-04 -4.4335894884532700e-03 -8.1808136725080140e-04 + 26 2.0485904035217606e-03 2.7813358633835958e-03 4.3245727149206761e-03 + 27 4.5604120293369819e-04 -1.0305523026921102e-03 2.1188058381358391e-04 + 28 -6.2544520861855151e-03 1.4127711176146864e-03 -1.8429821884794260e-03 + 29 6.4110631534402261e-04 3.1273432719593807e-03 3.7253671105656745e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-efield_variable.yaml b/unittest/force-styles/tests/fix-timestep-efield_variable.yaml index 7680373091..1ec1e4098a 100644 --- a/unittest/force-styles/tests/fix-timestep-efield_variable.yaml +++ b/unittest/force-styles/tests/fix-timestep-efield_variable.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Sat Aug 3 05:18:19 2024 epsilon: 2e-13 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-gravity.yaml b/unittest/force-styles/tests/fix-timestep-gravity.yaml index c151723e8a..8195dd2643 100644 --- a/unittest/force-styles/tests/fix-timestep-gravity.yaml +++ b/unittest/force-styles/tests/fix-timestep-gravity.yaml @@ -1,6 +1,5 @@ --- lammps_version: 17 Apr 2024 -tags: generated date_generated: Fri Jun 7 18:18:25 2024 epsilon: 5e-14 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-nph_sphere.yaml b/unittest/force-styles/tests/fix-timestep-nph_sphere.yaml index 40a4fc1c6e..b95a0265de 100644 --- a/unittest/force-styles/tests/fix-timestep-nph_sphere.yaml +++ b/unittest/force-styles/tests/fix-timestep-nph_sphere.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Sun Aug 4 23:15:54 2024 epsilon: 1e-12 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml b/unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml index 807fcdc46f..12022224df 100644 --- a/unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml +++ b/unittest/force-styles/tests/fix-timestep-npt_sphere_aniso.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Sun Aug 4 23:03:14 2024 epsilon: 4e-13 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml b/unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml index f3ee607578..717ab63162 100644 --- a/unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml +++ b/unittest/force-styles/tests/fix-timestep-npt_sphere_iso.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Sun Aug 4 23:03:30 2024 epsilon: 1e-12 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml b/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml index b31284da57..3724246956 100644 --- a/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml +++ b/unittest/force-styles/tests/fix-timestep-npt_sphere_tri.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Sun Aug 4 23:05:01 2024 epsilon: 1e-12 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-nve_sphere.yaml b/unittest/force-styles/tests/fix-timestep-nve_sphere.yaml index 0eaa00db36..b794fb2416 100644 --- a/unittest/force-styles/tests/fix-timestep-nve_sphere.yaml +++ b/unittest/force-styles/tests/fix-timestep-nve_sphere.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Sun Aug 4 23:05:44 2024 epsilon: 5e-14 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole.yaml b/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole.yaml index 4ea520aba9..5d03cc7a05 100644 --- a/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole.yaml +++ b/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Sun Aug 4 23:06:12 2024 epsilon: 5e-14 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole_dlm.yaml b/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole_dlm.yaml index d95542744f..aa39b8f4c2 100644 --- a/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole_dlm.yaml +++ b/unittest/force-styles/tests/fix-timestep-nve_sphere_dipole_dlm.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Sun Aug 4 23:06:24 2024 epsilon: 1e-09 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-nvt_sphere.yaml b/unittest/force-styles/tests/fix-timestep-nvt_sphere.yaml index 41f021897a..ff8020cc27 100644 --- a/unittest/force-styles/tests/fix-timestep-nvt_sphere.yaml +++ b/unittest/force-styles/tests/fix-timestep-nvt_sphere.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Sun Aug 4 23:11:49 2024 epsilon: 5e-14 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-recenter-coords.yaml b/unittest/force-styles/tests/fix-timestep-recenter-coords.yaml new file mode 100644 index 0000000000..31c682fc07 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-recenter-coords.yaml @@ -0,0 +1,79 @@ +--- +lammps_version: 29 Aug 2024 +date_generated: Tue Oct 1 12:45:25 2024 +epsilon: 2e-13 +skip_tests: +prerequisites: ! | + atom full + fix nve + fix recenter +pre_commands: ! "" +post_commands: ! | + fix move all nve + fix test solute recenter 0.45 0.5 0.55 shift all units fraction +input_file: in.fourmol +natoms: 29 +global_scalar: 4.868395120178045e-05 +global_vector: ! |- + 3 -4.5648814136156624e-05 -3.3198799039568794e-06 1.6591903748613968e-05 +run_pos: ! |2 + 1 -7.5132769500671226e-01 2.4986248943444171e+00 7.9802680459215103e-01 + 2 -1.7083180151387659e-01 2.9686443668858833e+00 1.1032169213735510e-01 + 3 -1.1848576112607669e+00 1.2379598993595067e+00 3.3721005306300700e-01 + 4 -2.0626880309028004e+00 1.4911496856694382e+00 -2.8888576109863040e-01 + 5 -1.3880697339807648e+00 9.3392994263319751e-01 1.3645274273913177e+00 + 6 -2.3255489200431190e-01 2.9053911875515726e-01 -2.6643801066357575e-01 + 7 -1.3943682083900774e-01 -1.5237647264946797e-02 -1.5642438189827357e+00 + 8 6.9348312565712877e-01 -4.8122338188209490e-01 3.2715099339931453e-01 + 9 8.9918032569715922e-01 -2.4533830652762220e-01 1.2485251813785214e+00 + 10 1.5702044248015166e+00 -1.4529974702538417e+00 -1.8252128309559742e-02 + 11 1.3069310971913839e+00 -1.9847774235184412e+00 -9.2407492225500776e-01 + 12 2.5254286066811331e+00 -4.8272460119318827e-01 -6.5820448823105326e-01 + 13 3.5706681986664290e+00 -8.8461121229009532e-01 -6.7501523048492595e-01 + 14 2.1258242373015102e+00 -4.1048363587869696e-01 -1.6984150383718699e+00 + 15 2.4886566213184191e+00 5.6163503542878490e-01 -2.6921687967144270e-01 + 16 2.1938308722699804e+00 -2.4050030016799853e+00 9.4154957635695380e-01 + 17 1.7344856812755074e+00 -2.0823896149143275e+00 2.1613004019555140e+00 + 18 1.6560980731586978e+00 3.0232596451395048e+00 -2.5529495112139315e+00 + 19 1.0547116163558656e+00 2.6329381393140117e+00 -3.2704134554803344e+00 + 20 2.2918852033150059e+00 3.6997999487374611e+00 -2.9680989234057789e+00 + 21 4.4231407100675586e+00 -4.0678259135193509e+00 -2.6560461484816007e+00 + 22 3.8773634581912133e+00 -4.2052030389522610e+00 -3.4962990971238348e+00 + 23 5.2630661876778886e+00 -3.5747868901510587e+00 -2.9116508070860116e+00 + 24 1.5880522609893917e+00 3.1587435945035454e+00 4.1200242979904500e+00 + 25 8.2366303589634160e-01 3.2739214743607290e+00 3.4761708482509213e+00 + 26 2.1000516430182552e+00 4.0191691643247269e+00 4.1861913754165592e+00 + 27 -2.4420064102885943e+00 -4.3489322893595315e+00 3.0748146340599405e+00 + 28 -3.2282283657042123e+00 -4.0126730894614893e+00 2.5479905388509652e+00 + 29 -1.7934721163888576e+00 -3.5888429001718487e+00 3.2396195693813534e+00 +run_vel: ! |2 + 1 8.1705744183262520e-03 1.6516406176274312e-02 4.7902264318912926e-03 + 2 5.4501493445687594e-03 5.1791699408496325e-03 -1.4372931530376343e-03 + 3 -8.2298292722385816e-03 -1.2926551614621412e-02 -4.0984181178163994e-03 + 4 -3.7699042590093445e-03 -6.5722892098813860e-03 -1.1184640360133362e-03 + 5 -1.1021961004346569e-02 -9.8906780939336126e-03 -2.8410737829284312e-03 + 6 -3.9676663166400034e-02 4.6817061464710250e-02 3.7148491979475992e-02 + 7 9.1033953013898092e-04 -1.0128524411938771e-02 -5.1568251805019630e-02 + 8 7.9064712058855725e-03 -3.3507254552631849e-03 3.4557098492564643e-02 + 9 1.5644176117320875e-03 3.7365546102722203e-03 1.5047408822037638e-02 + 10 2.9201446820573192e-02 -2.9249578745486140e-02 -1.5018077424322537e-02 + 11 -4.7835961513517603e-03 -3.7481385134185263e-03 -2.3464104142290176e-03 + 12 2.2696451841920920e-03 -3.4774154398130042e-04 -3.0640770327796979e-03 + 13 2.7531740451952145e-03 5.8171061612840866e-03 -7.9467454022159282e-04 + 14 3.5246182371994239e-03 -5.7939995585585425e-03 -3.9478431172750902e-03 + 15 -1.8547943640123080e-03 -5.8554729942777830e-03 6.2938485140538606e-03 + 16 1.8681499973445179e-02 -1.3262466204585288e-02 -4.5638651457003097e-02 + 17 -1.2896269981100333e-02 9.7527665265956121e-03 3.7296535360836651e-02 + 18 -8.0065794848260612e-04 -8.6270473212553646e-04 -1.4483040697508677e-03 + 19 1.2452390836182341e-03 -2.5061097118772879e-03 7.2998631009712671e-03 + 20 3.5930060229596903e-03 3.6938860309252827e-03 3.2322732687893093e-03 + 21 -1.4689220370766394e-03 -2.7352129761527014e-04 7.0581624215243781e-04 + 22 -7.0694199254630772e-03 -4.2577148924878711e-03 2.8079117614247622e-04 + 23 6.0446963117374731e-03 -1.4000131614795503e-03 2.5819754847014498e-03 + 24 3.1926367902286048e-04 -9.9445664749277913e-04 1.4999996959364468e-04 + 25 1.3789754514817134e-04 -4.4335894884532752e-03 -8.1808136725077560e-04 + 26 2.0485904035218057e-03 2.7813358633836725e-03 4.3245727149206822e-03 + 27 4.5604120293371412e-04 -1.0305523026921115e-03 2.1188058381359324e-04 + 28 -6.2544520861855810e-03 1.4127711176147026e-03 -1.8429821884794668e-03 + 29 6.4110631534402326e-04 3.1273432719593694e-03 3.7253671105656788e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-recenter-init.yaml b/unittest/force-styles/tests/fix-timestep-recenter-init.yaml new file mode 100644 index 0000000000..ca539aa911 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-recenter-init.yaml @@ -0,0 +1,79 @@ +--- +lammps_version: 29 Aug 2024 +date_generated: Tue Oct 1 12:45:46 2024 +epsilon: 1e-12 +skip_tests: +prerequisites: ! | + atom full + fix nve + fix recenter +pre_commands: ! "" +post_commands: ! | + fix move all nve + fix test solute recenter INIT INIT INIT shift all units box +input_file: in.fourmol +natoms: 29 +global_scalar: 4.868395120232176e-05 +global_vector: ! |- + 3 -4.5648814136711735e-05 -3.319879903845857e-06 1.6591903748697234e-05 +run_pos: ! |2 + 1 -2.7082064032386499e-01 2.4911895589422826e+00 -1.6682586822486273e-01 + 2 3.0967525316897071e-01 2.9612090314837487e+00 -8.5453098067965849e-01 + 3 -7.0435055657791923e-01 1.2305245639573710e+00 -6.2764261975400659e-01 + 4 -1.5821809762199530e+00 1.4837143502673025e+00 -1.2537384339156445e+00 + 5 -9.0756267929791723e-01 9.2649460723106236e-01 3.9967475457430401e-01 + 6 2.4795216267853529e-01 2.8310378335302211e-01 -1.2312906834805892e+00 + 7 3.4107023384383955e-01 -2.2672982667081999e-02 -2.5290964917997489e+00 + 8 1.1739901803399764e+00 -4.8865871728423016e-01 -6.3770167941769906e-01 + 9 1.3796873803800067e+00 -2.5277364192975738e-01 2.8367250856150772e-01 + 10 2.0507114794843648e+00 -1.4604328056559772e+00 -9.8310480112657339e-01 + 11 1.7874381518742311e+00 -1.9922127589205765e+00 -1.8889275950720215e+00 + 12 3.0059356613639814e+00 -4.9015993659532353e-01 -1.6230571610480671e+00 + 13 4.0511752533492755e+00 -8.9204654769223046e-01 -1.6398679033019394e+00 + 14 2.6063312919843575e+00 -4.1791897128083211e-01 -2.6632677111888836e+00 + 15 2.9691636760012665e+00 5.5419970002664964e-01 -1.2340695524884564e+00 + 16 2.6743379269528269e+00 -2.4124383370821203e+00 -2.3303096460060031e-02 + 17 2.2149927359583548e+00 -2.0898249503164625e+00 1.1964477291384996e+00 + 18 2.1366051278415465e+00 3.0158243097373703e+00 -3.5178021840309452e+00 + 19 1.5352186710387132e+00 2.6255028039118771e+00 -4.2352661282973489e+00 + 20 2.7723922579978524e+00 3.6923646133353265e+00 -3.9329515962227930e+00 + 21 4.9036477647504055e+00 -4.0752612489214854e+00 -3.6208988212986148e+00 + 22 4.3578705128740589e+00 -4.2126383743543956e+00 -4.4611517699408489e+00 + 23 5.7435732423607346e+00 -3.5822222255531937e+00 -3.8765034799030262e+00 + 24 2.0685593156722382e+00 3.1513082591014108e+00 3.1551716251734359e+00 + 25 1.3041700905791889e+00 3.2664861389585940e+00 2.5113181754339067e+00 + 26 2.5805586977011035e+00 4.0117338289225923e+00 3.2213387025995455e+00 + 27 -1.9614993556057472e+00 -4.3563676247616661e+00 2.1099619612429263e+00 + 28 -2.7477213110213659e+00 -4.0201084248636239e+00 1.5831378660339515e+00 + 29 -1.3129650617060100e+00 -3.5962782355739837e+00 2.2747668965643393e+00 +run_vel: ! |2 + 1 8.1705744183262104e-03 1.6516406176274218e-02 4.7902264318912665e-03 + 2 5.4501493445687794e-03 5.1791699408496421e-03 -1.4372931530376607e-03 + 3 -8.2298292722385487e-03 -1.2926551614621277e-02 -4.0984181178163560e-03 + 4 -3.7699042590093415e-03 -6.5722892098814042e-03 -1.1184640360133158e-03 + 5 -1.1021961004346589e-02 -9.8906780939336161e-03 -2.8410737829284308e-03 + 6 -3.9676663166400034e-02 4.6817061464710229e-02 3.7148491979476020e-02 + 7 9.1033953013898157e-04 -1.0128524411938776e-02 -5.1568251805019651e-02 + 8 7.9064712058856471e-03 -3.3507254552632795e-03 3.4557098492564615e-02 + 9 1.5644176117320901e-03 3.7365546102722182e-03 1.5047408822037646e-02 + 10 2.9201446820573056e-02 -2.9249578745486018e-02 -1.5018077424322512e-02 + 11 -4.7835961513517386e-03 -3.7481385134185206e-03 -2.3464104142289959e-03 + 12 2.2696451841920360e-03 -3.4774154398128042e-04 -3.0640770327796927e-03 + 13 2.7531740451953762e-03 5.8171061612840589e-03 -7.9467454022160203e-04 + 14 3.5246182371994326e-03 -5.7939995585585581e-03 -3.9478431172751110e-03 + 15 -1.8547943640122733e-03 -5.8554729942777882e-03 6.2938485140538684e-03 + 16 1.8681499973445276e-02 -1.3262466204585354e-02 -4.5638651457003278e-02 + 17 -1.2896269981100394e-02 9.7527665265956520e-03 3.7296535360836797e-02 + 18 -8.0065794848264635e-04 -8.6270473212556715e-04 -1.4483040697508916e-03 + 19 1.2452390836183188e-03 -2.5061097118772376e-03 7.2998631009713894e-03 + 20 3.5930060229597644e-03 3.6938860309253564e-03 3.2322732687892846e-03 + 21 -1.4689220370766513e-03 -2.7352129761527480e-04 7.0581624215242762e-04 + 22 -7.0694199254630373e-03 -4.2577148924878580e-03 2.8079117614252934e-04 + 23 6.0446963117374757e-03 -1.4000131614795444e-03 2.5819754847014359e-03 + 24 3.1926367902287810e-04 -9.9445664749280038e-04 1.4999996959366859e-04 + 25 1.3789754514808927e-04 -4.4335894884532361e-03 -8.1808136725085713e-04 + 26 2.0485904035218191e-03 2.7813358633837193e-03 4.3245727149206674e-03 + 27 4.5604120293371239e-04 -1.0305523026920900e-03 2.1188058381358600e-04 + 28 -6.2544520861855203e-03 1.4127711176146766e-03 -1.8429821884794249e-03 + 29 6.4110631534397057e-04 3.1273432719593091e-03 3.7253671105656658e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-recenter-null.yaml b/unittest/force-styles/tests/fix-timestep-recenter-null.yaml new file mode 100644 index 0000000000..a860180cd7 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-recenter-null.yaml @@ -0,0 +1,79 @@ +--- +lammps_version: 29 Aug 2024 +date_generated: Tue Oct 1 12:45:37 2024 +epsilon: 2e-13 +skip_tests: +prerequisites: ! | + atom full + fix nve + fix recenter +pre_commands: ! "" +post_commands: ! | + fix move all nve + fix test solute recenter NULL NULL NULL shift all units lattice +input_file: in.fourmol +natoms: 29 +global_scalar: 0 +global_vector: ! |- + 3 0 0 0 +run_pos: ! |2 + 1 -2.7045559775384032e-01 2.4912159905679729e+00 -1.6695851791541888e-01 + 2 3.1004029573899528e-01 2.9612354631094391e+00 -8.5466363037021464e-01 + 3 -7.0398551400789477e-01 1.2305509955830618e+00 -6.2777526944456274e-01 + 4 -1.5818159336499285e+00 1.4837407818929933e+00 -1.2538710836062004e+00 + 5 -9.0719763672789266e-01 9.2652103885675297e-01 3.9954210488374786e-01 + 6 2.4831720524855985e-01 2.8313021497871271e-01 -1.2314233331711453e+00 + 7 3.4143527641386412e-01 -2.2646551041391422e-02 -2.5292291414903052e+00 + 8 1.1743552229100009e+00 -4.8863228565853950e-01 -6.3783432910825522e-01 + 9 1.3800524229500313e+00 -2.5274721030406683e-01 2.8353985887095157e-01 + 10 2.0510765220543883e+00 -1.4604063740302866e+00 -9.8323745081712954e-01 + 11 1.7878031944442556e+00 -1.9921863272948861e+00 -1.8890602447625777e+00 + 12 3.0063007039340053e+00 -4.9013350496963293e-01 -1.6231898107386229e+00 + 13 4.0515402959192999e+00 -8.9202011606653986e-01 -1.6400005529924957e+00 + 14 2.6066963345543819e+00 -4.1789253965514156e-01 -2.6634003608794394e+00 + 15 2.9695287185712913e+00 5.5422613165234036e-01 -1.2342022021790127e+00 + 16 2.6747029695228521e+00 -2.4124119054564295e+00 -2.3435746150616148e-02 + 17 2.2153577785283796e+00 -2.0897985186907717e+00 1.1963150794479436e+00 + 18 2.1369701704115704e+00 3.0158507413630606e+00 -3.5179348337215015e+00 + 19 1.5355837136087378e+00 2.6255292355375675e+00 -4.2353987779879052e+00 + 20 2.7727573005678776e+00 3.6923910449610169e+00 -3.9330842459133493e+00 + 21 4.9040128073204299e+00 -4.0752348172957946e+00 -3.6210314709891711e+00 + 22 4.3582355554440841e+00 -4.2126119427287048e+00 -4.4612844196314052e+00 + 23 5.7439382849307599e+00 -3.5821957939275029e+00 -3.8766361295935821e+00 + 24 2.0689243582422630e+00 3.1513346907271012e+00 3.1550389754828800e+00 + 25 1.3045351331492134e+00 3.2665125705842848e+00 2.5111855257433504e+00 + 26 2.5809237402711274e+00 4.0117602605482832e+00 3.2212060529089896e+00 + 27 -1.9611343130357228e+00 -4.3563411931359752e+00 2.1098293115523705e+00 + 28 -2.7473562684513411e+00 -4.0200819932379330e+00 1.5830052163433954e+00 + 29 -1.3126000191359855e+00 -3.5962518039482929e+00 2.2746342468737835e+00 +run_vel: ! |2 + 1 8.1705744183262364e-03 1.6516406176274284e-02 4.7902264318912908e-03 + 2 5.4501493445687802e-03 5.1791699408496447e-03 -1.4372931530376594e-03 + 3 -8.2298292722385660e-03 -1.2926551614621379e-02 -4.0984181178163794e-03 + 4 -3.7699042590093549e-03 -6.5722892098813894e-03 -1.1184640360133316e-03 + 5 -1.1021961004346582e-02 -9.8906780939336109e-03 -2.8410737829284421e-03 + 6 -3.9676663166400034e-02 4.6817061464710256e-02 3.7148491979476124e-02 + 7 9.1033953013898601e-04 -1.0128524411938794e-02 -5.1568251805019748e-02 + 8 7.9064712058855690e-03 -3.3507254552631780e-03 3.4557098492564636e-02 + 9 1.5644176117320919e-03 3.7365546102722177e-03 1.5047408822037646e-02 + 10 2.9201446820573178e-02 -2.9249578745486140e-02 -1.5018077424322538e-02 + 11 -4.7835961513517560e-03 -3.7481385134185202e-03 -2.3464104142290089e-03 + 12 2.2696451841920581e-03 -3.4774154398129452e-04 -3.0640770327796884e-03 + 13 2.7531740451953108e-03 5.8171061612840597e-03 -7.9467454022159748e-04 + 14 3.5246182371994170e-03 -5.7939995585585503e-03 -3.9478431172751327e-03 + 15 -1.8547943640122978e-03 -5.8554729942777769e-03 6.2938485140538701e-03 + 16 1.8681499973445235e-02 -1.3262466204585334e-02 -4.5638651457003243e-02 + 17 -1.2896269981100382e-02 9.7527665265956451e-03 3.7296535360836762e-02 + 18 -8.0065794848261610e-04 -8.6270473212554308e-04 -1.4483040697508777e-03 + 19 1.2452390836182583e-03 -2.5061097118772749e-03 7.2998631009713062e-03 + 20 3.5930060229597072e-03 3.6938860309252974e-03 3.2322732687893115e-03 + 21 -1.4689220370766539e-03 -2.7352129761527648e-04 7.0581624215243120e-04 + 22 -7.0694199254630382e-03 -4.2577148924878598e-03 2.8079117614252034e-04 + 23 6.0446963117374939e-03 -1.4000131614795382e-03 2.5819754847014320e-03 + 24 3.1926367902287864e-04 -9.9445664749276113e-04 1.4999996959365281e-04 + 25 1.3789754514814445e-04 -4.4335894884532700e-03 -8.1808136725080140e-04 + 26 2.0485904035217606e-03 2.7813358633835958e-03 4.3245727149206761e-03 + 27 4.5604120293369819e-04 -1.0305523026921102e-03 2.1188058381358391e-04 + 28 -6.2544520861855151e-03 1.4127711176146864e-03 -1.8429821884794260e-03 + 29 6.4110631534402261e-04 3.1273432719593807e-03 3.7253671105656745e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-setforce_region.yaml b/unittest/force-styles/tests/fix-timestep-setforce_region_block.yaml similarity index 100% rename from unittest/force-styles/tests/fix-timestep-setforce_region.yaml rename to unittest/force-styles/tests/fix-timestep-setforce_region_block.yaml diff --git a/unittest/force-styles/tests/fix-timestep-setforce_region_sphere.yaml b/unittest/force-styles/tests/fix-timestep-setforce_region_sphere.yaml new file mode 100644 index 0000000000..25990ef478 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-setforce_region_sphere.yaml @@ -0,0 +1,78 @@ +--- +lammps_version: 29 Aug 2024 +date_generated: Wed Oct 9 17:59:56 2024 +epsilon: 5e-12 +skip_tests: +prerequisites: ! | + atom full + fix setforce +pre_commands: ! "" +post_commands: ! | + region 1 sphere 0 0 0 1 + fix move all nve + fix test solute setforce 0.0 0.0 0.0 region 1 +input_file: in.fourmol +natoms: 29 +global_vector: ! |- + 3 0 0 0 +run_pos: ! |2 + 1 -2.7045559775384032e-01 2.4912159905679729e+00 -1.6695851791541888e-01 + 2 3.1004029573899528e-01 2.9612354631094391e+00 -8.5466363037021464e-01 + 3 -7.0398551400789477e-01 1.2305509955830618e+00 -6.2777526944456274e-01 + 4 -1.5818159336499285e+00 1.4837407818929933e+00 -1.2538710836062004e+00 + 5 -9.0719763672789266e-01 9.2652103885675297e-01 3.9954210488374786e-01 + 6 2.4831720524855985e-01 2.8313021497871271e-01 -1.2314233331711453e+00 + 7 3.4143527641386412e-01 -2.2646551041391422e-02 -2.5292291414903052e+00 + 8 1.1743552229100009e+00 -4.8863228565853950e-01 -6.3783432910825522e-01 + 9 1.3800524229500313e+00 -2.5274721030406683e-01 2.8353985887095157e-01 + 10 2.0510765220543883e+00 -1.4604063740302866e+00 -9.8323745081712954e-01 + 11 1.7878031944442556e+00 -1.9921863272948861e+00 -1.8890602447625777e+00 + 12 3.0063007039340053e+00 -4.9013350496963293e-01 -1.6231898107386229e+00 + 13 4.0515402959192999e+00 -8.9202011606653986e-01 -1.6400005529924957e+00 + 14 2.6066963345543819e+00 -4.1789253965514156e-01 -2.6634003608794394e+00 + 15 2.9695287185712913e+00 5.5422613165234036e-01 -1.2342022021790127e+00 + 16 2.6747029695228521e+00 -2.4124119054564295e+00 -2.3435746150616148e-02 + 17 2.2153577785283796e+00 -2.0897985186907717e+00 1.1963150794479436e+00 + 18 2.1369701704115704e+00 3.0158507413630606e+00 -3.5179348337215015e+00 + 19 1.5355837136087378e+00 2.6255292355375675e+00 -4.2353987779879052e+00 + 20 2.7727573005678776e+00 3.6923910449610169e+00 -3.9330842459133493e+00 + 21 4.9040128073204299e+00 -4.0752348172957946e+00 -3.6210314709891711e+00 + 22 4.3582355554440841e+00 -4.2126119427287048e+00 -4.4612844196314052e+00 + 23 5.7439382849307599e+00 -3.5821957939275029e+00 -3.8766361295935821e+00 + 24 2.0689243582422630e+00 3.1513346907271012e+00 3.1550389754828800e+00 + 25 1.3045351331492134e+00 3.2665125705842848e+00 2.5111855257433504e+00 + 26 2.5809237402711274e+00 4.0117602605482832e+00 3.2212060529089896e+00 + 27 -1.9611343130357228e+00 -4.3563411931359752e+00 2.1098293115523705e+00 + 28 -2.7473562684513411e+00 -4.0200819932379330e+00 1.5830052163433954e+00 + 29 -1.3126000191359855e+00 -3.5962518039482929e+00 2.2746342468737835e+00 +run_vel: ! |2 + 1 8.1705744183262364e-03 1.6516406176274284e-02 4.7902264318912908e-03 + 2 5.4501493445687802e-03 5.1791699408496447e-03 -1.4372931530376594e-03 + 3 -8.2298292722385660e-03 -1.2926551614621379e-02 -4.0984181178163794e-03 + 4 -3.7699042590093549e-03 -6.5722892098813894e-03 -1.1184640360133316e-03 + 5 -1.1021961004346582e-02 -9.8906780939336109e-03 -2.8410737829284421e-03 + 6 -3.9676663166400034e-02 4.6817061464710256e-02 3.7148491979476124e-02 + 7 9.1033953013898601e-04 -1.0128524411938794e-02 -5.1568251805019748e-02 + 8 7.9064712058855690e-03 -3.3507254552631780e-03 3.4557098492564636e-02 + 9 1.5644176117320919e-03 3.7365546102722177e-03 1.5047408822037646e-02 + 10 2.9201446820573178e-02 -2.9249578745486140e-02 -1.5018077424322538e-02 + 11 -4.7835961513517560e-03 -3.7481385134185202e-03 -2.3464104142290089e-03 + 12 2.2696451841920581e-03 -3.4774154398129452e-04 -3.0640770327796884e-03 + 13 2.7531740451953108e-03 5.8171061612840597e-03 -7.9467454022159748e-04 + 14 3.5246182371994170e-03 -5.7939995585585503e-03 -3.9478431172751327e-03 + 15 -1.8547943640122978e-03 -5.8554729942777769e-03 6.2938485140538701e-03 + 16 1.8681499973445235e-02 -1.3262466204585334e-02 -4.5638651457003243e-02 + 17 -1.2896269981100382e-02 9.7527665265956451e-03 3.7296535360836762e-02 + 18 -8.0065794848261610e-04 -8.6270473212554308e-04 -1.4483040697508777e-03 + 19 1.2452390836182583e-03 -2.5061097118772749e-03 7.2998631009713062e-03 + 20 3.5930060229597072e-03 3.6938860309252974e-03 3.2322732687893115e-03 + 21 -1.4689220370766539e-03 -2.7352129761527648e-04 7.0581624215243120e-04 + 22 -7.0694199254630382e-03 -4.2577148924878598e-03 2.8079117614252034e-04 + 23 6.0446963117374939e-03 -1.4000131614795382e-03 2.5819754847014320e-03 + 24 3.1926367902287864e-04 -9.9445664749276113e-04 1.4999996959365281e-04 + 25 1.3789754514814445e-04 -4.4335894884532700e-03 -8.1808136725080140e-04 + 26 2.0485904035217606e-03 2.7813358633835958e-03 4.3245727149206761e-03 + 27 4.5604120293369819e-04 -1.0305523026921102e-03 2.1188058381358391e-04 + 28 -6.2544520861855151e-03 1.4127711176146864e-03 -1.8429821884794260e-03 + 29 6.4110631534402261e-04 3.1273432719593807e-03 3.7253671105656745e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-spring_self_atom.yaml b/unittest/force-styles/tests/fix-timestep-spring_self_atom.yaml new file mode 100644 index 0000000000..e8b35e6455 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-spring_self_atom.yaml @@ -0,0 +1,77 @@ +--- +lammps_version: 17 Feb 2022 +date_generated: Fri Mar 18 22:18:01 2022 +epsilon: 5e-14 +skip_tests: kokkos_omp +prerequisites: ! | + atom full + fix spring/self +pre_commands: ! | + variable kvar atom 10.0 +post_commands: ! | + fix move all nve + fix test solute spring/self v_kvar xyz +input_file: in.fourmol +natoms: 29 +global_scalar: 0.12623705370750438 +run_pos: ! |2 + 1 -2.7045669792379945e-01 2.4912140072031601e+00 -1.6695897908630153e-01 + 2 3.1003572362014503e-01 2.9612290242130319e+00 -8.5466689099875615e-01 + 3 -7.0398410505917419e-01 1.2305522448803927e+00 -6.2777452858703953e-01 + 4 -1.5818137373512378e+00 1.4837442978868092e+00 -1.2538665277734968e+00 + 5 -9.0719266809604937e-01 9.2652365891304722e-01 3.9954299416556610e-01 + 6 2.4832271436421161e-01 2.8312320769893828e-01 -1.2314303818391423e+00 + 7 3.4143518373063453e-01 -2.2645187306940717e-02 -2.5292229406165907e+00 + 8 1.1743540824610306e+00 -4.8863162985819381e-01 -6.3783828665914544e-01 + 9 1.3800508883119953e+00 -2.5274565574966718e-01 2.8353436538531862e-01 + 10 2.0510726036138696e+00 -1.4604027090169940e+00 -9.8323554549077119e-01 + 11 1.7878052123899795e+00 -1.9921835931655048e+00 -1.8890566136917575e+00 + 12 3.0063000763288268e+00 -4.9013323763786637e-01 -1.6231890083142151e+00 + 13 4.0515352007695906e+00 -8.9202569828585798e-01 -1.6399995011867139e+00 + 14 2.6066952690925067e+00 -4.1788633645045253e-01 -2.6633949696742012e+00 + 15 2.9695337662435719e+00 5.5423141568538492e-01 -1.2342076641871542e+00 + 16 2.6747001492056977e+00 -2.4124097322472577e+00 -2.3429048072365732e-02 + 17 2.2153591049025310e+00 -2.0897997214660862e+00 1.1963106355359285e+00 + 18 2.1369701704115056e+00 3.0158507413628213e+00 -3.5179348337213843e+00 + 19 1.5355837136087338e+00 2.6255292355375399e+00 -4.2353987779878857e+00 + 20 2.7727573005678758e+00 3.6923910449610102e+00 -3.9330842459133470e+00 + 21 4.9040128073205524e+00 -4.0752348172959030e+00 -3.6210314709893159e+00 + 22 4.3582355554440877e+00 -4.2126119427287101e+00 -4.4612844196314150e+00 + 23 5.7439382849307670e+00 -3.5821957939275060e+00 -3.8766361295935892e+00 + 24 2.0689243582422914e+00 3.1513346907271247e+00 3.1550389754829422e+00 + 25 1.3045351331492516e+00 3.2665125705842941e+00 2.5111855257434352e+00 + 26 2.5809237402711318e+00 4.0117602605482858e+00 3.2212060529089945e+00 + 27 -1.9611343130357277e+00 -4.3563411931359841e+00 2.1098293115523528e+00 + 28 -2.7473562684513411e+00 -4.0200819932379330e+00 1.5830052163433952e+00 + 29 -1.3126000191359812e+00 -3.5962518039482934e+00 2.2746342468737817e+00 +run_vel: ! |2 + 1 8.1685220941861477e-03 1.6512578512542727e-02 4.7892799147935001e-03 + 2 5.4427456394786321e-03 5.1693257879352533e-03 -1.4414043022813649e-03 + 3 -8.2272458036248362e-03 -1.2923813188884230e-02 -4.0970749471144546e-03 + 4 -3.7660861920462349e-03 -6.5659911420830365e-03 -1.1120922532834726e-03 + 5 -1.1012635909013241e-02 -9.8847866026321157e-03 -2.8391869073674538e-03 + 6 -3.9665990411620729e-02 4.6803722380071487e-02 3.7135522426802389e-02 + 7 9.1016763589152859e-04 -1.0126055720737583e-02 -5.1556610019025714e-02 + 8 7.9043585267658430e-03 -3.3496064544244345e-03 3.4549326598010660e-02 + 9 1.5620907286754389e-03 3.7378245105921431e-03 1.5036774253075934e-02 + 10 2.9193799040059056e-02 -2.9242248165535563e-02 -1.5014281912567770e-02 + 11 -4.7797459644718264e-03 -3.7436196398511232e-03 -2.3410499103477603e-03 + 12 2.2686069875175316e-03 -3.4732729502899497e-04 -3.0627334265471650e-03 + 13 2.7456854188010020e-03 5.8081889921879817e-03 -7.9308949311655092e-04 + 14 3.5223319737918667e-03 -5.7842699330258648e-03 -3.9396805101296825e-03 + 15 -1.8475459117759364e-03 -5.8469790281561471e-03 6.2849983323582511e-03 + 16 1.8676069228413028e-02 -1.3258381729410438e-02 -4.5625616778429308e-02 + 17 -1.2893668780819389e-02 9.7505325833410258e-03 3.7288200735675299e-02 + 18 -8.0065794869105819e-04 -8.6270473288011819e-04 -1.4483040693746142e-03 + 19 1.2452390836051499e-03 -2.5061097119616180e-03 7.2998631010316650e-03 + 20 3.5930060229538143e-03 3.6938860309035470e-03 3.2322732687958995e-03 + 21 -1.4689220366910704e-03 -2.7352129796142532e-04 7.0581624168175334e-04 + 22 -7.0694199254520765e-03 -4.2577148925037030e-03 2.8079117611209205e-04 + 23 6.0446963117617505e-03 -1.4000131614895336e-03 2.5819754846773601e-03 + 24 3.1926367911308686e-04 -9.9445664741642462e-04 1.4999996978363057e-04 + 25 1.3789754526895179e-04 -4.4335894884219599e-03 -8.1808136698604454e-04 + 26 2.0485904035342870e-03 2.7813358633902757e-03 4.3245727149365584e-03 + 27 4.5604120291626942e-04 -1.0305523027244966e-03 2.1188058375789067e-04 + 28 -6.2544520861839200e-03 1.4127711176141612e-03 -1.8429821884806304e-03 + 29 6.4110631535703737e-04 3.1273432719578029e-03 3.7253671105604122e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-spring_self_equal.yaml b/unittest/force-styles/tests/fix-timestep-spring_self_equal.yaml new file mode 100644 index 0000000000..382cc2cc73 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-spring_self_equal.yaml @@ -0,0 +1,77 @@ +--- +lammps_version: 17 Feb 2022 +date_generated: Fri Mar 18 22:18:01 2022 +epsilon: 5e-14 +skip_tests: kokkos_omp +prerequisites: ! | + atom full + fix spring/self +pre_commands: ! | + variable kvar equal 10.0 +post_commands: ! | + fix move all nve + fix test solute spring/self v_kvar xyz +input_file: in.fourmol +natoms: 29 +global_scalar: 0.12623705370750438 +run_pos: ! |2 + 1 -2.7045669792379945e-01 2.4912140072031601e+00 -1.6695897908630153e-01 + 2 3.1003572362014503e-01 2.9612290242130319e+00 -8.5466689099875615e-01 + 3 -7.0398410505917419e-01 1.2305522448803927e+00 -6.2777452858703953e-01 + 4 -1.5818137373512378e+00 1.4837442978868092e+00 -1.2538665277734968e+00 + 5 -9.0719266809604937e-01 9.2652365891304722e-01 3.9954299416556610e-01 + 6 2.4832271436421161e-01 2.8312320769893828e-01 -1.2314303818391423e+00 + 7 3.4143518373063453e-01 -2.2645187306940717e-02 -2.5292229406165907e+00 + 8 1.1743540824610306e+00 -4.8863162985819381e-01 -6.3783828665914544e-01 + 9 1.3800508883119953e+00 -2.5274565574966718e-01 2.8353436538531862e-01 + 10 2.0510726036138696e+00 -1.4604027090169940e+00 -9.8323554549077119e-01 + 11 1.7878052123899795e+00 -1.9921835931655048e+00 -1.8890566136917575e+00 + 12 3.0063000763288268e+00 -4.9013323763786637e-01 -1.6231890083142151e+00 + 13 4.0515352007695906e+00 -8.9202569828585798e-01 -1.6399995011867139e+00 + 14 2.6066952690925067e+00 -4.1788633645045253e-01 -2.6633949696742012e+00 + 15 2.9695337662435719e+00 5.5423141568538492e-01 -1.2342076641871542e+00 + 16 2.6747001492056977e+00 -2.4124097322472577e+00 -2.3429048072365732e-02 + 17 2.2153591049025310e+00 -2.0897997214660862e+00 1.1963106355359285e+00 + 18 2.1369701704115056e+00 3.0158507413628213e+00 -3.5179348337213843e+00 + 19 1.5355837136087338e+00 2.6255292355375399e+00 -4.2353987779878857e+00 + 20 2.7727573005678758e+00 3.6923910449610102e+00 -3.9330842459133470e+00 + 21 4.9040128073205524e+00 -4.0752348172959030e+00 -3.6210314709893159e+00 + 22 4.3582355554440877e+00 -4.2126119427287101e+00 -4.4612844196314150e+00 + 23 5.7439382849307670e+00 -3.5821957939275060e+00 -3.8766361295935892e+00 + 24 2.0689243582422914e+00 3.1513346907271247e+00 3.1550389754829422e+00 + 25 1.3045351331492516e+00 3.2665125705842941e+00 2.5111855257434352e+00 + 26 2.5809237402711318e+00 4.0117602605482858e+00 3.2212060529089945e+00 + 27 -1.9611343130357277e+00 -4.3563411931359841e+00 2.1098293115523528e+00 + 28 -2.7473562684513411e+00 -4.0200819932379330e+00 1.5830052163433952e+00 + 29 -1.3126000191359812e+00 -3.5962518039482934e+00 2.2746342468737817e+00 +run_vel: ! |2 + 1 8.1685220941861477e-03 1.6512578512542727e-02 4.7892799147935001e-03 + 2 5.4427456394786321e-03 5.1693257879352533e-03 -1.4414043022813649e-03 + 3 -8.2272458036248362e-03 -1.2923813188884230e-02 -4.0970749471144546e-03 + 4 -3.7660861920462349e-03 -6.5659911420830365e-03 -1.1120922532834726e-03 + 5 -1.1012635909013241e-02 -9.8847866026321157e-03 -2.8391869073674538e-03 + 6 -3.9665990411620729e-02 4.6803722380071487e-02 3.7135522426802389e-02 + 7 9.1016763589152859e-04 -1.0126055720737583e-02 -5.1556610019025714e-02 + 8 7.9043585267658430e-03 -3.3496064544244345e-03 3.4549326598010660e-02 + 9 1.5620907286754389e-03 3.7378245105921431e-03 1.5036774253075934e-02 + 10 2.9193799040059056e-02 -2.9242248165535563e-02 -1.5014281912567770e-02 + 11 -4.7797459644718264e-03 -3.7436196398511232e-03 -2.3410499103477603e-03 + 12 2.2686069875175316e-03 -3.4732729502899497e-04 -3.0627334265471650e-03 + 13 2.7456854188010020e-03 5.8081889921879817e-03 -7.9308949311655092e-04 + 14 3.5223319737918667e-03 -5.7842699330258648e-03 -3.9396805101296825e-03 + 15 -1.8475459117759364e-03 -5.8469790281561471e-03 6.2849983323582511e-03 + 16 1.8676069228413028e-02 -1.3258381729410438e-02 -4.5625616778429308e-02 + 17 -1.2893668780819389e-02 9.7505325833410258e-03 3.7288200735675299e-02 + 18 -8.0065794869105819e-04 -8.6270473288011819e-04 -1.4483040693746142e-03 + 19 1.2452390836051499e-03 -2.5061097119616180e-03 7.2998631010316650e-03 + 20 3.5930060229538143e-03 3.6938860309035470e-03 3.2322732687958995e-03 + 21 -1.4689220366910704e-03 -2.7352129796142532e-04 7.0581624168175334e-04 + 22 -7.0694199254520765e-03 -4.2577148925037030e-03 2.8079117611209205e-04 + 23 6.0446963117617505e-03 -1.4000131614895336e-03 2.5819754846773601e-03 + 24 3.1926367911308686e-04 -9.9445664741642462e-04 1.4999996978363057e-04 + 25 1.3789754526895179e-04 -4.4335894884219599e-03 -8.1808136698604454e-04 + 26 2.0485904035342870e-03 2.7813358633902757e-03 4.3245727149365584e-03 + 27 4.5604120291626942e-04 -1.0305523027244966e-03 2.1188058375789067e-04 + 28 -6.2544520861839200e-03 1.4127711176141612e-03 -1.8429821884806304e-03 + 29 6.4110631535703737e-04 3.1273432719578029e-03 3.7253671105604122e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-wall_lj93_const.yaml b/unittest/force-styles/tests/fix-timestep-wall_lj93_const.yaml index a5eff76773..5431a8e0a8 100644 --- a/unittest/force-styles/tests/fix-timestep-wall_lj93_const.yaml +++ b/unittest/force-styles/tests/fix-timestep-wall_lj93_const.yaml @@ -1,6 +1,5 @@ --- lammps_version: 27 Jun 2024 -tags: generated date_generated: Fri Aug 2 23:56:34 2024 epsilon: 2e-14 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-wall_reflect.yaml b/unittest/force-styles/tests/fix-timestep-wall_reflect.yaml index ed9ac69350..56b9de4462 100644 --- a/unittest/force-styles/tests/fix-timestep-wall_reflect.yaml +++ b/unittest/force-styles/tests/fix-timestep-wall_reflect.yaml @@ -1,6 +1,5 @@ --- lammps_version: 17 Apr 2024 -tags: generated date_generated: Fri Jun 7 18:23:44 2024 epsilon: 4e-14 skip_tests: diff --git a/unittest/force-styles/tests/fix-timestep-wall_region_harmonic_const.yaml b/unittest/force-styles/tests/fix-timestep-wall_region_harmonic.yaml similarity index 63% rename from unittest/force-styles/tests/fix-timestep-wall_region_harmonic_const.yaml rename to unittest/force-styles/tests/fix-timestep-wall_region_harmonic.yaml index 5ae9df3a06..46455f68a0 100644 --- a/unittest/force-styles/tests/fix-timestep-wall_region_harmonic_const.yaml +++ b/unittest/force-styles/tests/fix-timestep-wall_region_harmonic.yaml @@ -1,6 +1,6 @@ --- -lammps_version: 3 Aug 2022 -date_generated: Mon Aug 15 01:14:02 2022 +lammps_version: 29 Aug 2024 +date_generated: Tue Oct 1 12:59:45 2024 epsilon: 4e-14 skip_tests: prerequisites: ! | @@ -51,33 +51,33 @@ run_pos: ! |2 28 -2.7473562684513411e+00 -4.0200819932379330e+00 1.5830052163433954e+00 29 -1.3126000191359855e+00 -3.5962518039482929e+00 2.2746342468737835e+00 run_vel: ! |2 - 1 8.1705744183262832e-03 1.6516406176274298e-02 4.7902264318913212e-03 - 2 5.4501493445687828e-03 5.1791699408496412e-03 -1.4372931530376577e-03 - 3 -8.2298292722385591e-03 -1.2926551614621364e-02 -4.0984181178163734e-03 - 4 -3.7699042590093506e-03 -6.5722892098813894e-03 -1.1184640360133316e-03 - 5 -1.1021961004346575e-02 -9.8906780939336039e-03 -2.8410737829284390e-03 + 1 8.1705744183262832e-03 1.6516406176274298e-02 4.7902264318913203e-03 + 2 5.4501493445687828e-03 5.1791699408496447e-03 -1.4372931530376549e-03 + 3 -8.2298292722385574e-03 -1.2926551614621364e-02 -4.0984181178163699e-03 + 4 -3.7699042590093523e-03 -6.5722892098813894e-03 -1.1184640360133299e-03 + 5 -1.1021961004346582e-02 -9.8906780939336091e-03 -2.8410737829284408e-03 6 -3.9676663166400027e-02 4.6817061464710263e-02 3.7148491979476131e-02 - 7 9.1033953013898753e-04 -1.0128524411938794e-02 -5.1568251805019748e-02 - 8 7.9064712058855742e-03 -3.3507254552631585e-03 3.4557098492564643e-02 - 9 1.5644176117320938e-03 3.7365546102722208e-03 1.5047408822037651e-02 - 10 2.9201446820573192e-02 -2.9249578745486140e-02 -1.5018077424322544e-02 - 11 -4.7835961513517542e-03 -3.7481385134185211e-03 -2.3464104142290089e-03 - 12 2.2696451841920672e-03 -3.4774154398129641e-04 -3.0640770327796966e-03 - 13 2.7531740451953164e-03 5.8171061612840502e-03 -7.9467454022160669e-04 - 14 3.5246182371994205e-03 -5.7939995585585538e-03 -3.9478431172751361e-03 - 15 -1.8547943640122950e-03 -5.8554729942777778e-03 6.2938485140538675e-03 + 7 9.1033953013898742e-04 -1.0128524411938794e-02 -5.1568251805019748e-02 + 8 7.9064712058855742e-03 -3.3507254552631576e-03 3.4557098492564650e-02 + 9 1.5644176117320932e-03 3.7365546102722212e-03 1.5047408822037651e-02 + 10 2.9201446820573192e-02 -2.9249578745486147e-02 -1.5018077424322544e-02 + 11 -4.7835961513517542e-03 -3.7481385134185202e-03 -2.3464104142290089e-03 + 12 2.2696451841920694e-03 -3.4774154398129690e-04 -3.0640770327796979e-03 + 13 2.7531740451953164e-03 5.8171061612840493e-03 -7.9467454022160377e-04 + 14 3.5246182371994183e-03 -5.7939995585585503e-03 -3.9478431172751344e-03 + 15 -1.8547943640122972e-03 -5.8554729942777778e-03 6.2938485140538692e-03 16 1.8681499973445252e-02 -1.3262466204585332e-02 -4.5638651457003250e-02 17 -1.2896269981100378e-02 9.7527665265956451e-03 3.7296535360836762e-02 - 18 -8.0065795274987550e-04 -8.6270473974390637e-04 -1.4483040536385791e-03 - 19 1.2452390067376827e-03 -2.5061097800836321e-03 7.2998639311871857e-03 - 20 3.5930058460518109e-03 3.6938852051849871e-03 3.2322738480194727e-03 - 21 -1.4689219756961610e-03 -2.7352107824530291e-04 7.0581625180892197e-04 - 22 -7.0694199165145105e-03 -4.2577148692717545e-03 2.8079117911323598e-04 - 23 6.0446963236685230e-03 -1.4000131545098772e-03 2.5819754799379716e-03 - 24 3.1926368451268083e-04 -9.9445664487428820e-04 1.4999960207062409e-04 - 25 1.3789752933078488e-04 -4.4335894831520756e-03 -8.1808138106080120e-04 - 26 2.0485904023409989e-03 2.7813358660936129e-03 4.3245726853349256e-03 - 27 4.5604120293369840e-04 -1.0305523026921111e-03 2.1188058381358413e-04 - 28 -6.2544520861855151e-03 1.4127711176146879e-03 -1.8429821884794260e-03 - 29 6.4110631534402174e-04 3.1273432719593824e-03 3.7253671105656736e-03 + 18 -8.0065795274987550e-04 -8.6270473974390605e-04 -1.4483040536385806e-03 + 19 1.2452390067376805e-03 -2.5061097800836356e-03 7.2998639311871892e-03 + 20 3.5930058460518109e-03 3.6938852051849871e-03 3.2322738480194770e-03 + 21 -1.4689219756961604e-03 -2.7352107824530231e-04 7.0581625180892046e-04 + 22 -7.0694199165145140e-03 -4.2577148692717554e-03 2.8079117911323815e-04 + 23 6.0446963236685256e-03 -1.4000131545098772e-03 2.5819754799379755e-03 + 24 3.1926368451268056e-04 -9.9445664487428712e-04 1.4999960207062358e-04 + 25 1.3789752933078488e-04 -4.4335894831520773e-03 -8.1808138106080109e-04 + 26 2.0485904023410002e-03 2.7813358660936120e-03 4.3245726853349290e-03 + 27 4.5604120293369819e-04 -1.0305523026921102e-03 2.1188058381358391e-04 + 28 -6.2544520861855151e-03 1.4127711176146864e-03 -1.8429821884794260e-03 + 29 6.4110631534402261e-04 3.1273432719593807e-03 3.7253671105656745e-03 ... diff --git a/unittest/force-styles/tests/fix-timestep-wall_region_lj1043.yaml b/unittest/force-styles/tests/fix-timestep-wall_region_lj1043.yaml new file mode 100644 index 0000000000..7b900ce6a3 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-wall_region_lj1043.yaml @@ -0,0 +1,83 @@ +--- +lammps_version: 29 Aug 2024 +date_generated: Tue Oct 1 13:00:12 2024 +epsilon: 4e-14 +skip_tests: +prerequisites: ! | + atom full + fix wall/region +pre_commands: ! | + boundary f f f +post_commands: ! | + fix move all nve + region box block EDGE EDGE EDGE EDGE EDGE EDGE + fix test solute wall/region box lj1043 1.0 1.0 2.5 + fix_modify test virial yes +input_file: in.fourmol +natoms: 29 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +global_scalar: 0 +global_vector: ! |- + 3 0 0 0 +run_pos: ! |2 + 1 -2.7045559775384026e-01 2.4912159905679729e+00 -1.6695851791541885e-01 + 2 3.1004029573899528e-01 2.9612354631094391e+00 -8.5466363037021464e-01 + 3 -7.0398551400789466e-01 1.2305509955830618e+00 -6.2777526944456274e-01 + 4 -1.5818159336499285e+00 1.4837407818929933e+00 -1.2538710836062004e+00 + 5 -9.0719763672789266e-01 9.2652103885675297e-01 3.9954210488374786e-01 + 6 2.4831720524855988e-01 2.8313021497871271e-01 -1.2314233331711453e+00 + 7 3.4143527641386412e-01 -2.2646551041391422e-02 -2.5292291414903052e+00 + 8 1.1743552229100009e+00 -4.8863228565853944e-01 -6.3783432910825522e-01 + 9 1.3800524229500313e+00 -2.5274721030406683e-01 2.8353985887095157e-01 + 10 2.0510765220543883e+00 -1.4604063740302866e+00 -9.8323745081712954e-01 + 11 1.7878031944442556e+00 -1.9921863272948861e+00 -1.8890602447625777e+00 + 12 3.0063007039340053e+00 -4.9013350496963298e-01 -1.6231898107386231e+00 + 13 4.0515402959192999e+00 -8.9202011606653986e-01 -1.6400005529924957e+00 + 14 2.6066963345543819e+00 -4.1789253965514156e-01 -2.6634003608794394e+00 + 15 2.9695287185712913e+00 5.5422613165234036e-01 -1.2342022021790127e+00 + 16 2.6747029695228521e+00 -2.4124119054564295e+00 -2.3435746150616152e-02 + 17 2.2153577785283796e+00 -2.0897985186907717e+00 1.1963150794479436e+00 + 18 2.1369701704094664e+00 3.0158507413593139e+00 -3.5179348337135590e+00 + 19 1.5355837135395243e+00 2.6255292354730009e+00 -4.2353987771401354e+00 + 20 2.7727573003748263e+00 3.6923910441179069e+00 -3.9330842453167185e+00 + 21 4.9040128073837339e+00 -4.0752348170758461e+00 -3.6210314709795299e+00 + 22 4.3582355554510048e+00 -4.2126119427061379e+00 -4.4612844196307497e+00 + 23 5.7439382849366911e+00 -3.5821957939240279e+00 -3.8766361295959513e+00 + 24 2.0689243582454213e+00 3.1513346907303501e+00 3.1550389751128463e+00 + 25 1.3045351331414130e+00 3.2665125705869009e+00 2.5111855257365274e+00 + 26 2.5809237402714267e+00 4.0117602605512728e+00 3.2212060528800821e+00 + 27 -1.9611343130357228e+00 -4.3563411931359752e+00 2.1098293115523705e+00 + 28 -2.7473562684513411e+00 -4.0200819932379330e+00 1.5830052163433954e+00 + 29 -1.3126000191359855e+00 -3.5962518039482929e+00 2.2746342468737835e+00 +run_vel: ! |2 + 1 8.1705744183262832e-03 1.6516406176274298e-02 4.7902264318913203e-03 + 2 5.4501493445687828e-03 5.1791699408496447e-03 -1.4372931530376549e-03 + 3 -8.2298292722385574e-03 -1.2926551614621364e-02 -4.0984181178163699e-03 + 4 -3.7699042590093523e-03 -6.5722892098813894e-03 -1.1184640360133299e-03 + 5 -1.1021961004346582e-02 -9.8906780939336091e-03 -2.8410737829284408e-03 + 6 -3.9676663166400027e-02 4.6817061464710263e-02 3.7148491979476131e-02 + 7 9.1033953013898742e-04 -1.0128524411938794e-02 -5.1568251805019748e-02 + 8 7.9064712058855742e-03 -3.3507254552631576e-03 3.4557098492564650e-02 + 9 1.5644176117320932e-03 3.7365546102722212e-03 1.5047408822037651e-02 + 10 2.9201446820573192e-02 -2.9249578745486147e-02 -1.5018077424322544e-02 + 11 -4.7835961513517542e-03 -3.7481385134185202e-03 -2.3464104142290089e-03 + 12 2.2696451841920694e-03 -3.4774154398129690e-04 -3.0640770327796979e-03 + 13 2.7531740451953164e-03 5.8171061612840493e-03 -7.9467454022160377e-04 + 14 3.5246182371994183e-03 -5.7939995585585503e-03 -3.9478431172751344e-03 + 15 -1.8547943640122972e-03 -5.8554729942777778e-03 6.2938485140538692e-03 + 16 1.8681499973445252e-02 -1.3262466204585332e-02 -4.5638651457003250e-02 + 17 -1.2896269981100378e-02 9.7527665265956451e-03 3.7296535360836762e-02 + 18 -8.0065795274987550e-04 -8.6270473974390605e-04 -1.4483040536385806e-03 + 19 1.2452390067376805e-03 -2.5061097800836356e-03 7.2998639311871892e-03 + 20 3.5930058460518109e-03 3.6938852051849871e-03 3.2322738480194770e-03 + 21 -1.4689219756961604e-03 -2.7352107824530231e-04 7.0581625180892046e-04 + 22 -7.0694199165145140e-03 -4.2577148692717554e-03 2.8079117911323815e-04 + 23 6.0446963236685256e-03 -1.4000131545098772e-03 2.5819754799379755e-03 + 24 3.1926368451268056e-04 -9.9445664487428712e-04 1.4999960207062358e-04 + 25 1.3789752933078488e-04 -4.4335894831520773e-03 -8.1808138106080109e-04 + 26 2.0485904023410002e-03 2.7813358660936120e-03 4.3245726853349290e-03 + 27 4.5604120293369819e-04 -1.0305523026921102e-03 2.1188058381358391e-04 + 28 -6.2544520861855151e-03 1.4127711176146864e-03 -1.8429821884794260e-03 + 29 6.4110631534402261e-04 3.1273432719593807e-03 3.7253671105656745e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-wall_region_lj126.yaml b/unittest/force-styles/tests/fix-timestep-wall_region_lj126.yaml new file mode 100644 index 0000000000..2dcb9eccbb --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-wall_region_lj126.yaml @@ -0,0 +1,83 @@ +--- +lammps_version: 29 Aug 2024 +date_generated: Tue Oct 1 12:59:56 2024 +epsilon: 4e-14 +skip_tests: +prerequisites: ! | + atom full + fix wall/region +pre_commands: ! | + boundary f f f +post_commands: ! | + fix move all nve + region box block EDGE EDGE EDGE EDGE EDGE EDGE + fix test solute wall/region box lj126 1.0 1.0 2.5 + fix_modify test virial yes +input_file: in.fourmol +natoms: 29 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +global_scalar: 0 +global_vector: ! |- + 3 0 0 0 +run_pos: ! |2 + 1 -2.7045559775384026e-01 2.4912159905679729e+00 -1.6695851791541885e-01 + 2 3.1004029573899528e-01 2.9612354631094391e+00 -8.5466363037021464e-01 + 3 -7.0398551400789466e-01 1.2305509955830618e+00 -6.2777526944456274e-01 + 4 -1.5818159336499285e+00 1.4837407818929933e+00 -1.2538710836062004e+00 + 5 -9.0719763672789266e-01 9.2652103885675297e-01 3.9954210488374786e-01 + 6 2.4831720524855988e-01 2.8313021497871271e-01 -1.2314233331711453e+00 + 7 3.4143527641386412e-01 -2.2646551041391422e-02 -2.5292291414903052e+00 + 8 1.1743552229100009e+00 -4.8863228565853944e-01 -6.3783432910825522e-01 + 9 1.3800524229500313e+00 -2.5274721030406683e-01 2.8353985887095157e-01 + 10 2.0510765220543883e+00 -1.4604063740302866e+00 -9.8323745081712954e-01 + 11 1.7878031944442556e+00 -1.9921863272948861e+00 -1.8890602447625777e+00 + 12 3.0063007039340053e+00 -4.9013350496963298e-01 -1.6231898107386231e+00 + 13 4.0515402959192999e+00 -8.9202011606653986e-01 -1.6400005529924957e+00 + 14 2.6066963345543819e+00 -4.1789253965514156e-01 -2.6634003608794394e+00 + 15 2.9695287185712913e+00 5.5422613165234036e-01 -1.2342022021790127e+00 + 16 2.6747029695228521e+00 -2.4124119054564295e+00 -2.3435746150616152e-02 + 17 2.2153577785283796e+00 -2.0897985186907717e+00 1.1963150794479436e+00 + 18 2.1369701704094664e+00 3.0158507413593139e+00 -3.5179348337135590e+00 + 19 1.5355837135395243e+00 2.6255292354730009e+00 -4.2353987771401354e+00 + 20 2.7727573003748263e+00 3.6923910441179069e+00 -3.9330842453167185e+00 + 21 4.9040128073837339e+00 -4.0752348170758461e+00 -3.6210314709795299e+00 + 22 4.3582355554510048e+00 -4.2126119427061379e+00 -4.4612844196307497e+00 + 23 5.7439382849366911e+00 -3.5821957939240279e+00 -3.8766361295959513e+00 + 24 2.0689243582454213e+00 3.1513346907303501e+00 3.1550389751128463e+00 + 25 1.3045351331414130e+00 3.2665125705869009e+00 2.5111855257365274e+00 + 26 2.5809237402714267e+00 4.0117602605512728e+00 3.2212060528800821e+00 + 27 -1.9611343130357228e+00 -4.3563411931359752e+00 2.1098293115523705e+00 + 28 -2.7473562684513411e+00 -4.0200819932379330e+00 1.5830052163433954e+00 + 29 -1.3126000191359855e+00 -3.5962518039482929e+00 2.2746342468737835e+00 +run_vel: ! |2 + 1 8.1705744183262832e-03 1.6516406176274298e-02 4.7902264318913203e-03 + 2 5.4501493445687828e-03 5.1791699408496447e-03 -1.4372931530376549e-03 + 3 -8.2298292722385574e-03 -1.2926551614621364e-02 -4.0984181178163699e-03 + 4 -3.7699042590093523e-03 -6.5722892098813894e-03 -1.1184640360133299e-03 + 5 -1.1021961004346582e-02 -9.8906780939336091e-03 -2.8410737829284408e-03 + 6 -3.9676663166400027e-02 4.6817061464710263e-02 3.7148491979476131e-02 + 7 9.1033953013898742e-04 -1.0128524411938794e-02 -5.1568251805019748e-02 + 8 7.9064712058855742e-03 -3.3507254552631576e-03 3.4557098492564650e-02 + 9 1.5644176117320932e-03 3.7365546102722212e-03 1.5047408822037651e-02 + 10 2.9201446820573192e-02 -2.9249578745486147e-02 -1.5018077424322544e-02 + 11 -4.7835961513517542e-03 -3.7481385134185202e-03 -2.3464104142290089e-03 + 12 2.2696451841920694e-03 -3.4774154398129690e-04 -3.0640770327796979e-03 + 13 2.7531740451953164e-03 5.8171061612840493e-03 -7.9467454022160377e-04 + 14 3.5246182371994183e-03 -5.7939995585585503e-03 -3.9478431172751344e-03 + 15 -1.8547943640122972e-03 -5.8554729942777778e-03 6.2938485140538692e-03 + 16 1.8681499973445252e-02 -1.3262466204585332e-02 -4.5638651457003250e-02 + 17 -1.2896269981100378e-02 9.7527665265956451e-03 3.7296535360836762e-02 + 18 -8.0065795274987550e-04 -8.6270473974390605e-04 -1.4483040536385806e-03 + 19 1.2452390067376805e-03 -2.5061097800836356e-03 7.2998639311871892e-03 + 20 3.5930058460518109e-03 3.6938852051849871e-03 3.2322738480194770e-03 + 21 -1.4689219756961604e-03 -2.7352107824530231e-04 7.0581625180892046e-04 + 22 -7.0694199165145140e-03 -4.2577148692717554e-03 2.8079117911323815e-04 + 23 6.0446963236685256e-03 -1.4000131545098772e-03 2.5819754799379755e-03 + 24 3.1926368451268056e-04 -9.9445664487428712e-04 1.4999960207062358e-04 + 25 1.3789752933078488e-04 -4.4335894831520773e-03 -8.1808138106080109e-04 + 26 2.0485904023410002e-03 2.7813358660936120e-03 4.3245726853349290e-03 + 27 4.5604120293369819e-04 -1.0305523026921102e-03 2.1188058381358391e-04 + 28 -6.2544520861855151e-03 1.4127711176146864e-03 -1.8429821884794260e-03 + 29 6.4110631534402261e-04 3.1273432719593807e-03 3.7253671105656745e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-wall_region_lj93.yaml b/unittest/force-styles/tests/fix-timestep-wall_region_lj93.yaml new file mode 100644 index 0000000000..cc74769cb2 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-wall_region_lj93.yaml @@ -0,0 +1,83 @@ +--- +lammps_version: 29 Aug 2024 +date_generated: Tue Oct 1 13:00:05 2024 +epsilon: 4e-14 +skip_tests: +prerequisites: ! | + atom full + fix wall/region +pre_commands: ! | + boundary f f f +post_commands: ! | + fix move all nve + region box block EDGE EDGE EDGE EDGE EDGE EDGE + fix test solute wall/region box lj93 1.0 1.0 2.5 + fix_modify test virial yes +input_file: in.fourmol +natoms: 29 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +global_scalar: 0 +global_vector: ! |- + 3 0 0 0 +run_pos: ! |2 + 1 -2.7045559775384026e-01 2.4912159905679729e+00 -1.6695851791541885e-01 + 2 3.1004029573899528e-01 2.9612354631094391e+00 -8.5466363037021464e-01 + 3 -7.0398551400789466e-01 1.2305509955830618e+00 -6.2777526944456274e-01 + 4 -1.5818159336499285e+00 1.4837407818929933e+00 -1.2538710836062004e+00 + 5 -9.0719763672789266e-01 9.2652103885675297e-01 3.9954210488374786e-01 + 6 2.4831720524855988e-01 2.8313021497871271e-01 -1.2314233331711453e+00 + 7 3.4143527641386412e-01 -2.2646551041391422e-02 -2.5292291414903052e+00 + 8 1.1743552229100009e+00 -4.8863228565853944e-01 -6.3783432910825522e-01 + 9 1.3800524229500313e+00 -2.5274721030406683e-01 2.8353985887095157e-01 + 10 2.0510765220543883e+00 -1.4604063740302866e+00 -9.8323745081712954e-01 + 11 1.7878031944442556e+00 -1.9921863272948861e+00 -1.8890602447625777e+00 + 12 3.0063007039340053e+00 -4.9013350496963298e-01 -1.6231898107386231e+00 + 13 4.0515402959192999e+00 -8.9202011606653986e-01 -1.6400005529924957e+00 + 14 2.6066963345543819e+00 -4.1789253965514156e-01 -2.6634003608794394e+00 + 15 2.9695287185712913e+00 5.5422613165234036e-01 -1.2342022021790127e+00 + 16 2.6747029695228521e+00 -2.4124119054564295e+00 -2.3435746150616152e-02 + 17 2.2153577785283796e+00 -2.0897985186907717e+00 1.1963150794479436e+00 + 18 2.1369701704094664e+00 3.0158507413593139e+00 -3.5179348337135590e+00 + 19 1.5355837135395243e+00 2.6255292354730009e+00 -4.2353987771401354e+00 + 20 2.7727573003748263e+00 3.6923910441179069e+00 -3.9330842453167185e+00 + 21 4.9040128073837339e+00 -4.0752348170758461e+00 -3.6210314709795299e+00 + 22 4.3582355554510048e+00 -4.2126119427061379e+00 -4.4612844196307497e+00 + 23 5.7439382849366911e+00 -3.5821957939240279e+00 -3.8766361295959513e+00 + 24 2.0689243582454213e+00 3.1513346907303501e+00 3.1550389751128463e+00 + 25 1.3045351331414130e+00 3.2665125705869009e+00 2.5111855257365274e+00 + 26 2.5809237402714267e+00 4.0117602605512728e+00 3.2212060528800821e+00 + 27 -1.9611343130357228e+00 -4.3563411931359752e+00 2.1098293115523705e+00 + 28 -2.7473562684513411e+00 -4.0200819932379330e+00 1.5830052163433954e+00 + 29 -1.3126000191359855e+00 -3.5962518039482929e+00 2.2746342468737835e+00 +run_vel: ! |2 + 1 8.1705744183262832e-03 1.6516406176274298e-02 4.7902264318913203e-03 + 2 5.4501493445687828e-03 5.1791699408496447e-03 -1.4372931530376549e-03 + 3 -8.2298292722385574e-03 -1.2926551614621364e-02 -4.0984181178163699e-03 + 4 -3.7699042590093523e-03 -6.5722892098813894e-03 -1.1184640360133299e-03 + 5 -1.1021961004346582e-02 -9.8906780939336091e-03 -2.8410737829284408e-03 + 6 -3.9676663166400027e-02 4.6817061464710263e-02 3.7148491979476131e-02 + 7 9.1033953013898742e-04 -1.0128524411938794e-02 -5.1568251805019748e-02 + 8 7.9064712058855742e-03 -3.3507254552631576e-03 3.4557098492564650e-02 + 9 1.5644176117320932e-03 3.7365546102722212e-03 1.5047408822037651e-02 + 10 2.9201446820573192e-02 -2.9249578745486147e-02 -1.5018077424322544e-02 + 11 -4.7835961513517542e-03 -3.7481385134185202e-03 -2.3464104142290089e-03 + 12 2.2696451841920694e-03 -3.4774154398129690e-04 -3.0640770327796979e-03 + 13 2.7531740451953164e-03 5.8171061612840493e-03 -7.9467454022160377e-04 + 14 3.5246182371994183e-03 -5.7939995585585503e-03 -3.9478431172751344e-03 + 15 -1.8547943640122972e-03 -5.8554729942777778e-03 6.2938485140538692e-03 + 16 1.8681499973445252e-02 -1.3262466204585332e-02 -4.5638651457003250e-02 + 17 -1.2896269981100378e-02 9.7527665265956451e-03 3.7296535360836762e-02 + 18 -8.0065795274987550e-04 -8.6270473974390605e-04 -1.4483040536385806e-03 + 19 1.2452390067376805e-03 -2.5061097800836356e-03 7.2998639311871892e-03 + 20 3.5930058460518109e-03 3.6938852051849871e-03 3.2322738480194770e-03 + 21 -1.4689219756961604e-03 -2.7352107824530231e-04 7.0581625180892046e-04 + 22 -7.0694199165145140e-03 -4.2577148692717554e-03 2.8079117911323815e-04 + 23 6.0446963236685256e-03 -1.4000131545098772e-03 2.5819754799379755e-03 + 24 3.1926368451268056e-04 -9.9445664487428712e-04 1.4999960207062358e-04 + 25 1.3789752933078488e-04 -4.4335894831520773e-03 -8.1808138106080109e-04 + 26 2.0485904023410002e-03 2.7813358660936120e-03 4.3245726853349290e-03 + 27 4.5604120293369819e-04 -1.0305523026921102e-03 2.1188058381358391e-04 + 28 -6.2544520861855151e-03 1.4127711176146864e-03 -1.8429821884794260e-03 + 29 6.4110631534402261e-04 3.1273432719593807e-03 3.7253671105656745e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-wall_region_morse.yaml b/unittest/force-styles/tests/fix-timestep-wall_region_morse.yaml new file mode 100644 index 0000000000..6bb6e8ce40 --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-wall_region_morse.yaml @@ -0,0 +1,83 @@ +--- +lammps_version: 29 Aug 2024 +date_generated: Tue Oct 1 13:00:18 2024 +epsilon: 4e-14 +skip_tests: +prerequisites: ! | + atom full + fix wall/region +pre_commands: ! | + boundary f f f +post_commands: ! | + fix move all nve + region box block EDGE EDGE EDGE EDGE EDGE EDGE + fix test solute wall/region box morse 1.0 1.0 1.5 3.0 + fix_modify test virial yes +input_file: in.fourmol +natoms: 29 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +global_scalar: 0 +global_vector: ! |- + 3 0 0 0 +run_pos: ! |2 + 1 -2.7045559775384026e-01 2.4912159905679729e+00 -1.6695851791541885e-01 + 2 3.1004029573899528e-01 2.9612354631094391e+00 -8.5466363037021464e-01 + 3 -7.0398551400789466e-01 1.2305509955830618e+00 -6.2777526944456274e-01 + 4 -1.5818159336499285e+00 1.4837407818929933e+00 -1.2538710836062004e+00 + 5 -9.0719763672789266e-01 9.2652103885675297e-01 3.9954210488374786e-01 + 6 2.4831720524855988e-01 2.8313021497871271e-01 -1.2314233331711453e+00 + 7 3.4143527641386412e-01 -2.2646551041391422e-02 -2.5292291414903052e+00 + 8 1.1743552229100009e+00 -4.8863228565853944e-01 -6.3783432910825522e-01 + 9 1.3800524229500313e+00 -2.5274721030406683e-01 2.8353985887095157e-01 + 10 2.0510765220543883e+00 -1.4604063740302866e+00 -9.8323745081712954e-01 + 11 1.7878031944442556e+00 -1.9921863272948861e+00 -1.8890602447625777e+00 + 12 3.0063007039340053e+00 -4.9013350496963298e-01 -1.6231898107386231e+00 + 13 4.0515402959192999e+00 -8.9202011606653986e-01 -1.6400005529924957e+00 + 14 2.6066963345543819e+00 -4.1789253965514156e-01 -2.6634003608794394e+00 + 15 2.9695287185712913e+00 5.5422613165234036e-01 -1.2342022021790127e+00 + 16 2.6747029695228521e+00 -2.4124119054564295e+00 -2.3435746150616152e-02 + 17 2.2153577785283796e+00 -2.0897985186907717e+00 1.1963150794479436e+00 + 18 2.1369701704094664e+00 3.0158507413593139e+00 -3.5179348337135590e+00 + 19 1.5355837135395243e+00 2.6255292354730009e+00 -4.2353987771401354e+00 + 20 2.7727573003748263e+00 3.6923910441179069e+00 -3.9330842453167185e+00 + 21 4.9040128073837339e+00 -4.0752348170758461e+00 -3.6210314709795299e+00 + 22 4.3582355554510048e+00 -4.2126119427061379e+00 -4.4612844196307497e+00 + 23 5.7439382849366911e+00 -3.5821957939240279e+00 -3.8766361295959513e+00 + 24 2.0689243582454213e+00 3.1513346907303501e+00 3.1550389751128463e+00 + 25 1.3045351331414130e+00 3.2665125705869009e+00 2.5111855257365274e+00 + 26 2.5809237402714267e+00 4.0117602605512728e+00 3.2212060528800821e+00 + 27 -1.9611343130357228e+00 -4.3563411931359752e+00 2.1098293115523705e+00 + 28 -2.7473562684513411e+00 -4.0200819932379330e+00 1.5830052163433954e+00 + 29 -1.3126000191359855e+00 -3.5962518039482929e+00 2.2746342468737835e+00 +run_vel: ! |2 + 1 8.1705744183262832e-03 1.6516406176274298e-02 4.7902264318913203e-03 + 2 5.4501493445687828e-03 5.1791699408496447e-03 -1.4372931530376549e-03 + 3 -8.2298292722385574e-03 -1.2926551614621364e-02 -4.0984181178163699e-03 + 4 -3.7699042590093523e-03 -6.5722892098813894e-03 -1.1184640360133299e-03 + 5 -1.1021961004346582e-02 -9.8906780939336091e-03 -2.8410737829284408e-03 + 6 -3.9676663166400027e-02 4.6817061464710263e-02 3.7148491979476131e-02 + 7 9.1033953013898742e-04 -1.0128524411938794e-02 -5.1568251805019748e-02 + 8 7.9064712058855742e-03 -3.3507254552631576e-03 3.4557098492564650e-02 + 9 1.5644176117320932e-03 3.7365546102722212e-03 1.5047408822037651e-02 + 10 2.9201446820573192e-02 -2.9249578745486147e-02 -1.5018077424322544e-02 + 11 -4.7835961513517542e-03 -3.7481385134185202e-03 -2.3464104142290089e-03 + 12 2.2696451841920694e-03 -3.4774154398129690e-04 -3.0640770327796979e-03 + 13 2.7531740451953164e-03 5.8171061612840493e-03 -7.9467454022160377e-04 + 14 3.5246182371994183e-03 -5.7939995585585503e-03 -3.9478431172751344e-03 + 15 -1.8547943640122972e-03 -5.8554729942777778e-03 6.2938485140538692e-03 + 16 1.8681499973445252e-02 -1.3262466204585332e-02 -4.5638651457003250e-02 + 17 -1.2896269981100378e-02 9.7527665265956451e-03 3.7296535360836762e-02 + 18 -8.0065795274987550e-04 -8.6270473974390605e-04 -1.4483040536385806e-03 + 19 1.2452390067376805e-03 -2.5061097800836356e-03 7.2998639311871892e-03 + 20 3.5930058460518109e-03 3.6938852051849871e-03 3.2322738480194770e-03 + 21 -1.4689219756961604e-03 -2.7352107824530231e-04 7.0581625180892046e-04 + 22 -7.0694199165145140e-03 -4.2577148692717554e-03 2.8079117911323815e-04 + 23 6.0446963236685256e-03 -1.4000131545098772e-03 2.5819754799379755e-03 + 24 3.1926368451268056e-04 -9.9445664487428712e-04 1.4999960207062358e-04 + 25 1.3789752933078488e-04 -4.4335894831520773e-03 -8.1808138106080109e-04 + 26 2.0485904023410002e-03 2.7813358660936120e-03 4.3245726853349290e-03 + 27 4.5604120293369819e-04 -1.0305523026921102e-03 2.1188058381358391e-04 + 28 -6.2544520861855151e-03 1.4127711176146864e-03 -1.8429821884794260e-03 + 29 6.4110631534402261e-04 3.1273432719593807e-03 3.7253671105656745e-03 +... diff --git a/unittest/force-styles/tests/fix-timestep-wall_region_sphere.yaml b/unittest/force-styles/tests/fix-timestep-wall_region_sphere.yaml new file mode 100644 index 0000000000..cf7348194e --- /dev/null +++ b/unittest/force-styles/tests/fix-timestep-wall_region_sphere.yaml @@ -0,0 +1,83 @@ +--- +lammps_version: 29 Aug 2024 +date_generated: Mon Oct 7 17:02:09 2024 +epsilon: 4e-14 +skip_tests: +prerequisites: ! | + atom full + fix wall/region +pre_commands: ! | + boundary f f f +post_commands: ! | + fix move all nve + region 1 sphere 0 0 0 10 + fix test solute wall/region 1 lj93 1.0 1.0 2.5 + fix_modify test virial yes +input_file: in.fourmol +natoms: 29 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +global_scalar: 0 +global_vector: ! |- + 3 0 0 0 +run_pos: ! |2 + 1 -2.7045559775384026e-01 2.4912159905679729e+00 -1.6695851791541885e-01 + 2 3.1004029573899528e-01 2.9612354631094391e+00 -8.5466363037021464e-01 + 3 -7.0398551400789466e-01 1.2305509955830618e+00 -6.2777526944456274e-01 + 4 -1.5818159336499285e+00 1.4837407818929933e+00 -1.2538710836062004e+00 + 5 -9.0719763672789266e-01 9.2652103885675297e-01 3.9954210488374786e-01 + 6 2.4831720524855988e-01 2.8313021497871271e-01 -1.2314233331711453e+00 + 7 3.4143527641386412e-01 -2.2646551041391422e-02 -2.5292291414903052e+00 + 8 1.1743552229100009e+00 -4.8863228565853944e-01 -6.3783432910825522e-01 + 9 1.3800524229500313e+00 -2.5274721030406683e-01 2.8353985887095157e-01 + 10 2.0510765220543883e+00 -1.4604063740302866e+00 -9.8323745081712954e-01 + 11 1.7878031944442556e+00 -1.9921863272948861e+00 -1.8890602447625777e+00 + 12 3.0063007039340053e+00 -4.9013350496963298e-01 -1.6231898107386231e+00 + 13 4.0515402959192999e+00 -8.9202011606653986e-01 -1.6400005529924957e+00 + 14 2.6066963345543819e+00 -4.1789253965514156e-01 -2.6634003608794394e+00 + 15 2.9695287185712913e+00 5.5422613165234036e-01 -1.2342022021790127e+00 + 16 2.6747029695228521e+00 -2.4124119054564295e+00 -2.3435746150616152e-02 + 17 2.2153577785283796e+00 -2.0897985186907717e+00 1.1963150794479436e+00 + 18 2.1369701704094664e+00 3.0158507413593139e+00 -3.5179348337135590e+00 + 19 1.5355837135395243e+00 2.6255292354730009e+00 -4.2353987771401354e+00 + 20 2.7727573003748263e+00 3.6923910441179069e+00 -3.9330842453167185e+00 + 21 4.9040128073837339e+00 -4.0752348170758461e+00 -3.6210314709795299e+00 + 22 4.3582355554510048e+00 -4.2126119427061379e+00 -4.4612844196307497e+00 + 23 5.7439382849366911e+00 -3.5821957939240279e+00 -3.8766361295959513e+00 + 24 2.0689243582454213e+00 3.1513346907303501e+00 3.1550389751128463e+00 + 25 1.3045351331414130e+00 3.2665125705869009e+00 2.5111855257365274e+00 + 26 2.5809237402714267e+00 4.0117602605512728e+00 3.2212060528800821e+00 + 27 -1.9611343130357228e+00 -4.3563411931359752e+00 2.1098293115523705e+00 + 28 -2.7473562684513411e+00 -4.0200819932379330e+00 1.5830052163433954e+00 + 29 -1.3126000191359855e+00 -3.5962518039482929e+00 2.2746342468737835e+00 +run_vel: ! |2 + 1 8.1705744183262832e-03 1.6516406176274298e-02 4.7902264318913203e-03 + 2 5.4501493445687828e-03 5.1791699408496447e-03 -1.4372931530376549e-03 + 3 -8.2298292722385574e-03 -1.2926551614621364e-02 -4.0984181178163699e-03 + 4 -3.7699042590093523e-03 -6.5722892098813894e-03 -1.1184640360133299e-03 + 5 -1.1021961004346582e-02 -9.8906780939336091e-03 -2.8410737829284408e-03 + 6 -3.9676663166400027e-02 4.6817061464710263e-02 3.7148491979476131e-02 + 7 9.1033953013898742e-04 -1.0128524411938794e-02 -5.1568251805019748e-02 + 8 7.9064712058855742e-03 -3.3507254552631576e-03 3.4557098492564650e-02 + 9 1.5644176117320932e-03 3.7365546102722212e-03 1.5047408822037651e-02 + 10 2.9201446820573192e-02 -2.9249578745486147e-02 -1.5018077424322544e-02 + 11 -4.7835961513517542e-03 -3.7481385134185202e-03 -2.3464104142290089e-03 + 12 2.2696451841920694e-03 -3.4774154398129690e-04 -3.0640770327796979e-03 + 13 2.7531740451953164e-03 5.8171061612840493e-03 -7.9467454022160377e-04 + 14 3.5246182371994183e-03 -5.7939995585585503e-03 -3.9478431172751344e-03 + 15 -1.8547943640122972e-03 -5.8554729942777778e-03 6.2938485140538692e-03 + 16 1.8681499973445252e-02 -1.3262466204585332e-02 -4.5638651457003250e-02 + 17 -1.2896269981100378e-02 9.7527665265956451e-03 3.7296535360836762e-02 + 18 -8.0065795274987550e-04 -8.6270473974390605e-04 -1.4483040536385806e-03 + 19 1.2452390067376805e-03 -2.5061097800836356e-03 7.2998639311871892e-03 + 20 3.5930058460518109e-03 3.6938852051849871e-03 3.2322738480194770e-03 + 21 -1.4689219756961604e-03 -2.7352107824530231e-04 7.0581625180892046e-04 + 22 -7.0694199165145140e-03 -4.2577148692717554e-03 2.8079117911323815e-04 + 23 6.0446963236685256e-03 -1.4000131545098772e-03 2.5819754799379755e-03 + 24 3.1926368451268056e-04 -9.9445664487428712e-04 1.4999960207062358e-04 + 25 1.3789752933078488e-04 -4.4335894831520773e-03 -8.1808138106080109e-04 + 26 2.0485904023410002e-03 2.7813358660936120e-03 4.3245726853349290e-03 + 27 4.5604120293369819e-04 -1.0305523026921102e-03 2.1188058381358391e-04 + 28 -6.2544520861855151e-03 1.4127711176146864e-03 -1.8429821884794260e-03 + 29 6.4110631534402261e-04 3.1273432719593807e-03 3.7253671105656745e-03 +... diff --git a/unittest/force-styles/tests/gauss_exp.txt b/unittest/force-styles/tests/gauss_exp.txt new file mode 100644 index 0000000000..30c637d124 --- /dev/null +++ b/unittest/force-styles/tests/gauss_exp.txt @@ -0,0 +1,6 @@ +# Gaussian orbital exponents (required for fix qtpie/reaxff) taken from Table 2.2 +# of Chen, J. (2009). Theory and applications of fluctuating-charge models. +# The units of the exponents are 1 / (Bohr radius)^2 . +1 0.5434 # H +2 0.2069 # C +3 0.2240 # O diff --git a/unittest/force-styles/tests/in.cmap b/unittest/force-styles/tests/in.cmap new file mode 100644 index 0000000000..6a731ea759 --- /dev/null +++ b/unittest/force-styles/tests/in.cmap @@ -0,0 +1,33 @@ +variable newton_pair index on +variable newton_bond index on +variable bond_factor index 0.10 +variable angle_factor index 0.25 +variable dihedral_factor index 0.50 +variable units index real +variable input_dir index . +variable data_file index ${input_dir}/data.cmap +variable pair_style index 'zero 8.0' +variable bond_style index zero +variable angle_style index zero +variable dihedral_style index zero +variable improper_style index zero +variable t_target index 100.0 + +atom_style full +atom_modify map array +neigh_modify delay 2 every 2 check no +units ${units} +timestep 0.1 +newton ${newton_pair} ${newton_bond} +special_bonds lj/coul ${bond_factor} ${angle_factor} ${dihedral_factor} + +pair_style ${pair_style} +bond_style ${bond_style} +angle_style ${angle_style} +dihedral_style ${dihedral_style} +improper_style ${improper_style} + +fix cmap all cmap charmm36.cmap +fix_modify cmap energy yes + +read_data ${data_file} fix cmap crossterm CMAP diff --git a/unittest/formats/test_atom_styles.cpp b/unittest/formats/test_atom_styles.cpp index 921d469e31..f41584876b 100644 --- a/unittest/formats/test_atom_styles.cpp +++ b/unittest/formats/test_atom_styles.cpp @@ -347,8 +347,8 @@ void ASSERT_ATOM_STATE_EQ(Atom *atom, const AtomState &expected) ASSERT_ARRAY_ALLOCATED(atom->x, expected.has_x); ASSERT_ARRAY_ALLOCATED(atom->v, expected.has_v); ASSERT_ARRAY_ALLOCATED(atom->f, expected.has_f); - ASSERT_ARRAY_ALLOCATED(atom->q, expected.q_flag); ASSERT_ARRAY_ALLOCATED(atom->mu, expected.mu_flag); + ASSERT_ARRAY_ALLOCATED(atom->q, expected.q_flag); ASSERT_ARRAY_ALLOCATED(atom->omega, expected.omega_flag); ASSERT_ARRAY_ALLOCATED(atom->angmom, expected.angmom_flag); diff --git a/unittest/python/python-fix-external.py b/unittest/python/python-fix-external.py index c061b9f466..55934b8e79 100644 --- a/unittest/python/python-fix-external.py +++ b/unittest/python/python-fix-external.py @@ -1,6 +1,6 @@ import sys,os,unittest from ctypes import * -from lammps import lammps, LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR +from lammps import lammps, LMP_STYLE_GLOBAL, LMP_STYLE_ATOM, LMP_TYPE_VECTOR, LMP_TYPE_ARRAY try: import numpy @@ -92,6 +92,17 @@ class PythonExternal(unittest.TestCase): self.assertAlmostEqual(reduce[5],6.5,14) self.assertAlmostEqual(reduce[6],-0.6,14) + fext = lmp.extract_fix("ext", LMP_STYLE_ATOM, LMP_TYPE_ARRAY) + self.assertAlmostEqual(float(fext[0][0]), 0.0) + self.assertAlmostEqual(float(fext[0][1]), 0.0) + self.assertAlmostEqual(float(fext[0][2]), 0.0) + self.assertAlmostEqual(float(fext[1][0]), 0.0) + self.assertAlmostEqual(float(fext[1][1]), 0.0) + self.assertAlmostEqual(float(fext[1][2]), 0.0) + self.assertAlmostEqual(float(fext[2][0]), 0.0) + self.assertAlmostEqual(float(fext[2][1]), 0.0) + self.assertAlmostEqual(float(fext[2][2]), 0.0) + lmp.command("run 10 post no") self.assertAlmostEqual(lmp.get_thermo("temp"),1.0/30.0,14) self.assertAlmostEqual(lmp.get_thermo("pe"),1.0/8.0,14) @@ -110,6 +121,17 @@ class PythonExternal(unittest.TestCase): val += lmp.extract_fix("ext",LMP_STYLE_GLOBAL,LMP_TYPE_VECTOR,nrow=i) self.assertAlmostEqual(val,15.0,14) + fext = lmp.extract_fix("ext", LMP_STYLE_ATOM, LMP_TYPE_ARRAY) + self.assertAlmostEqual(float(fext[0][0]), 10.0) + self.assertAlmostEqual(float(fext[0][1]), 10.0) + self.assertAlmostEqual(float(fext[0][2]), 10.0) + self.assertAlmostEqual(float(fext[1][0]), 10.0) + self.assertAlmostEqual(float(fext[1][1]), 10.0) + self.assertAlmostEqual(float(fext[1][2]), 10.0) + self.assertAlmostEqual(float(fext[2][0]), 10.0) + self.assertAlmostEqual(float(fext[2][1]), 10.0) + self.assertAlmostEqual(float(fext[2][2]), 10.0) + def testExternalArray(self): """Test fix external from Python with pf/array""" @@ -142,6 +164,16 @@ class PythonExternal(unittest.TestCase): force[i][2] = 0.0 lmp.fix_external_set_energy_global("ext", 0.5) lmp.fix_external_set_virial_global("ext",[0.5, 0.5, 0.5, 0.0, 0.0, 0.0]) + fext = lmp.extract_fix("ext", LMP_STYLE_ATOM, LMP_TYPE_ARRAY) + self.assertAlmostEqual(float(fext[0][0]), 0.0) + self.assertAlmostEqual(float(fext[0][1]), 0.0) + self.assertAlmostEqual(float(fext[0][2]), 0.0) + self.assertAlmostEqual(float(fext[1][0]), 0.0) + self.assertAlmostEqual(float(fext[1][1]), 0.0) + self.assertAlmostEqual(float(fext[1][2]), 0.0) + self.assertAlmostEqual(float(fext[2][0]), 0.0) + self.assertAlmostEqual(float(fext[2][1]), 0.0) + self.assertAlmostEqual(float(fext[2][2]), 0.0) lmp.command("run 5 post no") self.assertAlmostEqual(lmp.get_thermo("temp"),4.0/525.0,14) @@ -170,6 +202,16 @@ class PythonExternal(unittest.TestCase): self.assertEqual(npforce[0][0],6.0) self.assertEqual(npforce[3][1],6.0) self.assertEqual(npforce[7][2],6.0) + fext = lmp.extract_fix("ext", LMP_STYLE_ATOM, LMP_TYPE_ARRAY) + self.assertAlmostEqual(float(fext[0][0]), 6.0) + self.assertAlmostEqual(float(fext[0][1]), 6.0) + self.assertAlmostEqual(float(fext[0][2]), 6.0) + self.assertAlmostEqual(float(fext[1][0]), 6.0) + self.assertAlmostEqual(float(fext[1][1]), 6.0) + self.assertAlmostEqual(float(fext[1][2]), 6.0) + self.assertAlmostEqual(float(fext[2][0]), 6.0) + self.assertAlmostEqual(float(fext[2][1]), 6.0) + self.assertAlmostEqual(float(fext[2][2]), 6.0) ############################## if __name__ == "__main__":