diff --git a/.github/workflows/compile-msvc.yml b/.github/workflows/compile-msvc.yml index e384f191e5..03af27788b 100644 --- a/.github/workflows/compile-msvc.yml +++ b/.github/workflows/compile-msvc.yml @@ -1,4 +1,4 @@ -# GitHub action to build LAMMPS on Windows with Visual C++ +# GitHub action to test LAMMPS on Windows with Visual C++ name: "Windows Unit Tests" on: diff --git a/.github/workflows/full-regression.yml b/.github/workflows/full-regression.yml new file mode 100644 index 0000000000..73e1803bb6 --- /dev/null +++ b/.github/workflows/full-regression.yml @@ -0,0 +1,108 @@ +# GitHub action to build LAMMPS on Linux and run regression tests +name: "Full Regression Test" + +on: + push: + branches: + - develop + + workflow_dispatch: + +jobs: + build: + name: Build LAMMPS + # restrict to official LAMMPS repository + if: ${{ github.repository == 'lammps/lammps' }} + runs-on: ubuntu-latest + env: + CCACHE_DIR: ${{ github.workspace }}/.ccache + strategy: + max-parallel: 8 + matrix: + idx: [ 0, 1, 2, 3, 4, 5, 6, 7 ] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 2 + show-progress: false + + - name: Install extra packages + run: | + sudo apt-get install -y ccache ninja-build libeigen3-dev \ + libgsl-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-full-ccache-${{ github.sha }} + restore-keys: linux-full-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/most.cmake \ + -D CMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -D CMAKE_C_COMPILER_LAUNCHER=ccache \ + -D BUILD_SHARED_LIBS=off \ + -D DOWNLOAD_POTENTIALS=off \ + -D PKG_MANIFOLD=on \ + -D PKG_ML-PACE=on \ + -D PKG_ML-RANN=on \ + -D PKG_RHEO=on \ + -D PKG_PTM=on \ + -D PKG_PYTHON=on \ + -D PKG_QTB=on \ + -D PKG_SMTBQ=on \ + -G Ninja + cmake --build build + ccache -s + + - name: Run Full Regression Tests + shell: bash + run: | + source linuxenv/bin/activate + python3 tools/regression-tests/run_tests.py \ + --lmp-bin=build/lmp \ + --config-file=tools/regression-tests/config_serial.yaml \ + --examples-top-level=examples --analyze --num-workers=8 + + python3 tools/regression-tests/run_tests.py \ + --lmp-bin=build/lmp \ + --config-file=tools/regression-tests/config_serial.yaml \ + --list-input=input-list-${{ matrix.idx }}.txt \ + --output-file=output-${{ matrix.idx }}.xml \ + --progress-file=progress-${{ matrix.idx }}.yaml \ + --log-file=run-${{ matrix.idx }}.log + + tar -cvf full-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: full-regression-test-artifact-${{ matrix.idx }} + path: full-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-full-regresssion-artifact + pattern: full-regression-test-artifact-* + diff --git a/.github/workflows/quick-regression.yml b/.github/workflows/quick-regression.yml new file mode 100644 index 0000000000..985177b2c1 --- /dev/null +++ b/.github/workflows/quick-regression.yml @@ -0,0 +1,113 @@ +# GitHub action to build LAMMPS on Linux and run selected regression tests +name: "Quick Regression Test" + +on: + pull_request: + branches: + - develop + + workflow_dispatch: + +jobs: + build: + name: Build LAMMPS + # restrict to official LAMMPS repository + if: ${{ github.repository == 'lammps/lammps' }} + runs-on: ubuntu-latest + env: + CCACHE_DIR: ${{ github.workspace }}/.ccache + strategy: + max-parallel: 4 + matrix: + idx: [ 0, 1, 2, 3 ] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + show-progress: false + + - name: Install extra packages + run: | + sudo apt-get install -y ccache ninja-build libeigen3-dev \ + libgsl-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-quick-ccache-${{ github.sha }} + restore-keys: linux-quick-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/most.cmake \ + -D CMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -D CMAKE_C_COMPILER_LAUNCHER=ccache \ + -D BUILD_SHARED_LIBS=off \ + -D DOWNLOAD_POTENTIALS=off \ + -D PKG_MANIFOLD=on \ + -D PKG_ML-PACE=on \ + -D PKG_ML-RANN=on \ + -D PKG_RHEO=on \ + -D PKG_PTM=on \ + -D PKG_PYTHON=on \ + -D PKG_QTB=on \ + -D PKG_SMTBQ=on \ + -G Ninja + cmake --build build + ccache -s + + - name: Run Regression Tests for Modified Styles + shell: bash + run: | + source linuxenv/bin/activate + python3 tools/regression-tests/run_tests.py \ + --lmp-bin=build/lmp \ + --config-file=tools/regression-tests/config_quick.yaml \ + --examples-top-level=examples \ + --quick-reference=tools/regression-tests/reference.yaml \ + --quick --quick-branch=origin/develop --quick-max=100 --num-workers=4 + + if [ -f input-list-${{ matrix.idx }}.txt ] + then \ + python3 tools/regression-tests/run_tests.py \ + --lmp-bin=build/lmp \ + --config-file=tools/regression-tests/config_quick.yaml \ + --list-input=input-list-${{ matrix.idx }}.txt \ + --output-file=output-${{ matrix.idx }}.xml \ + --progress-file=progress-${{ matrix.idx }}.yaml \ + --log-file=run-${{ matrix.idx }}.log + fi + + tar -cvf quick-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: quick-regression-test-artifact-${{ matrix.idx }} + path: quick-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-quick-regresssion-artifact + pattern: quick-regression-test-artifact-* + diff --git a/doc/src/Build_development.rst b/doc/src/Build_development.rst index f315569b24..3adec76abb 100644 --- a/doc/src/Build_development.rst +++ b/doc/src/Build_development.rst @@ -138,12 +138,27 @@ during development: The status of this automated testing can be viewed on `https://ci.lammps.org `_. -The scripts and inputs for integration, run, and regression testing -are maintained in a -`separate repository `_ -of the LAMMPS project on GitHub. A few tests are also run as GitHub -Actions and their configuration files are in the ``.github/workflows/`` -folder of the LAMMPS git tree. +The scripts and inputs for integration, run, and legacy regression +testing are maintained in a `separate repository +`_ of the LAMMPS project on +GitHub. A few tests are also run as GitHub Actions and their +configuration files are in the ``.github/workflows/`` folder of the +LAMMPS git tree. + +Regression tests can also be performed locally with the :ref:`regression +tester tool `. The tool checks if a given LAMMPS binary run +with selected input examples produces thermo output that is consistent +with the provided log files. The script can be run in one pass over all +available input files, but it can also first create multiple lists of +inputs or folders that can then be run with multiple workers +concurrently to speed things up. Another mode allows to do a quick +check of inputs that contain commands that have changes in the current +checkout branch relative to a git branch. This works similar to the two +pass mode, but will select only shorter runs and no more than 100 inputs +that are chosen randomly. This ensures that this test runs +significantly faster compared to the full test run. These test runs can +also be performed with instrumented LAMMPS binaries (see previous +section). The unit testing facility is integrated into the CMake build process of the LAMMPS source code distribution itself. It can be enabled by diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index 9f9f63f46a..ba7cb2035a 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -1022,7 +1022,7 @@ regression tests with a given LAMMPS binary. The tool launches the LAMMPS binary with any given input script under one of the `examples` subdirectories, and compares the thermo output in the generated log file with those in the provided log file with the same number of processors -ub the same subdirectory. If the differences between the actual and +in the same subdirectory. If the differences between the actual and reference values are within specified tolerances, the test is considered passed. For each test batch, that is, a set of example input scripts, the mpirun command, the LAMMPS command line arguments, and the diff --git a/doc/src/group2ndx.rst b/doc/src/group2ndx.rst index 19c472e109..e1c4fd23f5 100644 --- a/doc/src/group2ndx.rst +++ b/doc/src/group2ndx.rst @@ -51,7 +51,7 @@ index file. When specifying group IDs, only those groups will be written to the index file. In order to follow the Gromacs conventions, the group *all* will be renamed to *System* in the index file. -The *ndx2group* command will create of update group definitions from +The *ndx2group* command will create or update group definitions from those stored in an index file. Without specifying any group IDs, all groups except *System* will be read from the index file and the corresponding groups recreated. If a group of the same name already diff --git a/examples/bpm/impact/brokenDump b/examples/bpm/impact/brokenDump deleted file mode 100644 index 0a2316cd5e..0000000000 --- a/examples/bpm/impact/brokenDump +++ /dev/null @@ -1,3914 +0,0 @@ -599 1817 5468 -600 1808 1815 -554 1938 5471 -548 5471 5591 -554 1938 5471 -571 5471 5590 -572 5471 5589 -599 1817 5468 -548 5471 5591 -571 5471 5590 -572 5471 5589 -608 1814 1815 -616 1815 1926 -622 5231 5350 -622 1818 1935 -635 1818 1929 -638 5468 5469 -648 1806 1923 -648 1818 1937 -649 1811 1812 -650 1822 5468 -650 1822 1935 -652 5469 5472 -655 1822 5589 -660 1812 1813 -662 1816 1929 -666 1810 1923 -672 1935 1937 -676 1810 1812 -676 1822 1938 -677 1806 1917 -677 1822 1937 -679 1812 1816 -683 1819 1937 -683 1816 1931 -684 1816 1937 -686 1810 1931 -695 1583 1584 -699 1821 1822 -700 1812 1929 -616 1815 1926 -635 1818 1929 -648 1806 1923 -650 1822 1935 -660 1923 1930 -662 1816 1929 -666 1810 1923 -671 1935 1936 -672 1935 1937 -676 1822 1938 -677 1806 1917 -683 1816 1931 -686 1810 1931 -687 2052 5709 -692 1923 2040 -692 2169 5709 -694 2052 5588 -696 1936 1940 -700 1812 1929 -605 5477 5596 -610 5467 5468 -611 5237 5350 -622 5231 5350 -628 5467 5474 -629 5473 5474 -635 5467 5472 -637 5473 5480 -638 5468 5469 -640 5474 5475 -646 5354 5467 -647 5467 5475 -650 1822 5468 -652 5347 5354 -652 5469 5472 -653 5479 5480 -658 5473 5478 -661 5472 5475 -661 5474 5478 -663 5480 5481 -665 5358 5478 -668 5227 5234 -669 5480 5593 -670 5347 5355 -671 5234 5347 -672 5479 5486 -674 5352 5354 -674 5475 5478 -677 5471 5472 -678 5478 5593 -679 5478 5481 -681 5352 5355 -682 5352 5475 -682 5468 5471 -687 5352 5357 -687 5486 5599 -689 5232 5234 -689 5481 5601 -690 5476 5478 -691 5480 5484 -693 5484 5599 -694 5471 5477 -700 5479 5484 -655 1822 5589 -669 5480 5593 -678 5478 5593 -687 5486 5599 -687 2052 5709 -692 2169 5709 -693 5484 5599 -693 5594 5600 -694 2052 5588 -695 5600 5714 -699 5828 5829 -700 5951 5958 -704 1806 1925 -706 1810 1925 -711 1816 1932 -711 1937 1940 -712 1800 1917 -716 1926 1931 -720 1457 1464 -721 1804 1917 -722 5469 5470 -722 1803 1920 -728 1820 5471 -729 1802 1809 -730 1925 1928 -734 1353 1469 -735 1923 1925 -737 5230 5231 -738 1804 1925 -739 1810 1926 -739 1816 1821 -740 1911 1918 -743 1822 5471 -745 1821 1937 -746 1458 1574 -755 1586 5231 -756 1469 4994 -756 1463 1470 -756 1467 1577 -756 1815 1931 -757 1804 1919 -758 1683 1793 -758 1800 1919 -760 1809 1810 -762 1692 1808 -763 5469 5471 -763 1932 1937 -765 1808 1810 -766 1914 1915 -769 1804 1806 -769 1821 1938 -771 1806 1809 -774 1926 1933 -776 1459 1574 -776 1568 1575 -776 1573 1574 -779 4994 5110 -779 5111 5229 -779 5229 5230 -781 1804 1807 -783 1797 1908 -783 1800 1806 -784 5112 5229 -787 1799 1804 -788 1799 1805 -789 1464 1580 -789 1802 1807 -795 1807 1810 -800 1674 1790 -800 1790 1797 -703 2057 5709 -704 5952 6071 -711 1816 1932 -711 1937 1940 -711 2052 5710 -712 1800 1917 -716 1926 1931 -717 2169 5829 -719 2277 2278 -721 1804 1917 -722 1803 1920 -724 2037 2038 -727 1940 2052 -730 1925 1928 -730 1940 2054 -731 1928 1930 -734 2169 5830 -735 1923 1925 -736 1928 1931 -736 1924 2040 -736 2044 2154 -736 2057 5710 -740 1911 1918 -745 1928 1934 -746 1923 1928 -746 1923 1931 -748 1921 2031 -749 1939 1940 -750 2170 2286 -751 1928 2048 -754 1928 2040 -755 1931 1933 -756 1917 1919 -756 1815 1931 -757 1804 1919 -758 1800 1919 -758 1933 2043 -759 1930 2040 -761 2057 5830 -762 1921 2038 -762 2283 2284 -763 1932 1937 -764 2287 2402 -766 1914 1915 -766 2040 2047 -769 1821 1938 -771 2161 2271 -774 1926 1933 -774 2406 2513 -778 2040 2042 -782 1930 1931 -784 2174 5829 -785 1912 2028 -788 2043 2048 -788 2041 2157 -790 1923 1924 -793 1940 2055 -795 2038 2039 -796 2174 5830 -799 1931 1934 -799 1937 1938 -799 2286 2287 -702 5114 5233 -702 5484 5601 -703 5470 5472 -704 5116 5117 -704 5255 5368 -707 5352 5470 -707 5495 5608 -710 5232 5237 -711 5232 5355 -713 5483 5602 -714 5478 5483 -716 5476 5477 -717 5232 5235 -718 5470 5471 -720 5227 5235 -721 5230 5232 -721 5599 5607 -722 5469 5470 -722 5482 5483 -725 5364 5484 -726 5123 5236 -728 1820 5471 -729 5366 5485 -729 5483 5601 -734 5350 5355 -737 5230 5231 -737 5350 5357 -739 5234 5235 -741 5374 5375 -742 5488 5495 -743 1822 5471 -745 5481 5484 -746 5114 5227 -749 5500 5501 -749 5606 5607 -751 5486 5605 -751 5604 5607 -751 5614 5615 -753 5479 5487 -760 5601 5602 -762 5113 5120 -763 5000 5110 -763 5469 5471 -763 5492 5605 -765 5108 5114 -767 5112 5227 -771 5472 5477 -773 5476 5596 -775 5381 5494 -778 5486 5487 -779 4994 5110 -779 5111 5229 -779 5229 5230 -779 5375 5488 -779 5470 5477 -781 5107 5108 -783 5116 5118 -784 5112 5229 -784 5242 5243 -784 5602 5604 -787 5368 5369 -787 5475 5477 -789 5233 5235 -791 5129 5242 -791 5602 5603 -792 5248 5249 -794 5485 5486 -795 5477 5478 -702 5484 5601 -703 2057 5709 -704 5952 6071 -708 5957 5964 -709 5593 5600 -711 2052 5710 -717 2169 5829 -718 5709 5829 -720 5736 5855 -721 5593 5601 -721 5599 5607 -722 5720 5721 -729 5483 5601 -730 5598 5600 -730 5828 5830 -733 5735 5742 -733 5709 5830 -733 5958 6077 -734 2169 5830 -736 2057 5710 -738 5714 5722 -740 5598 5601 -747 5605 5606 -749 5606 5607 -751 5486 5605 -751 5604 5607 -751 5614 5615 -751 5849 5856 -757 5841 5954 -759 5621 5741 -760 5601 5602 -761 5721 5722 -761 2057 5830 -761 5828 5833 -763 5492 5605 -769 5835 5948 -772 5721 5725 -776 5615 5735 -784 5602 5604 -784 2174 5829 -785 5833 5835 -786 5969 5976 -790 5726 5727 -791 5602 5603 -795 5831 5951 -796 2174 5830 -798 5605 5726 -799 5960 5961 -801 1568 1685 -801 1586 5229 -802 1463 1465 -802 1799 1800 -803 4991 5107 -803 1673 1680 -803 1685 1692 -803 5108 5112 -804 1799 1806 -804 1806 1807 -804 1911 1916 -805 1799 1802 -807 1807 1809 -808 1573 1575 -808 1586 1588 -808 5350 5351 -808 5351 5352 -810 1354 1469 -813 4994 5109 -813 1353 1468 -816 1580 1587 -816 1819 1821 -818 5351 5470 -819 1685 1690 -820 1689 1799 -821 1463 1468 -821 1911 1912 -823 1464 1574 -823 1575 1685 -823 1689 1806 -824 1471 5229 -824 1685 1687 -824 1799 1801 -825 1570 1575 -827 1583 1586 -827 1676 1677 -831 1463 1464 -833 1683 1801 -835 1805 1806 -836 5108 5109 -841 1586 1587 -841 1687 1807 -842 1686 1687 -843 1686 1802 -845 1681 1793 -847 1676 1681 -848 1471 5108 -849 1570 1690 -849 1687 1689 -849 1692 1802 -850 1684 1690 -851 1808 1809 -852 1676 1678 -853 1348 1465 -853 1464 1465 -854 1462 1464 -854 1464 1579 -854 1471 1583 -856 1348 1468 -857 1684 1687 -857 1687 1801 -857 1687 1799 -858 1570 1576 -859 1806 1810 -860 1585 5229 -860 1585 1588 -864 1462 1465 -865 1354 5109 -868 1681 1683 -870 1459 1576 -871 1573 1576 -872 1354 1468 -872 1683 1799 -873 1686 1801 -876 1585 1587 -877 1459 1579 -879 1687 1802 -882 1683 1686 -885 1584 1585 -885 1681 1801 -886 1466 5108 -886 1583 1585 -893 4995 5109 -896 1459 1464 -900 1354 1466 -900 1682 1684 -801 2045 2047 -802 2041 2158 -802 2396 2403 -803 1929 1931 -803 2039 2154 -804 1911 1916 -805 2045 2048 -805 2154 2159 -808 2040 2048 -812 1918 1919 -812 2045 2051 -812 2045 2157 -814 2040 2045 -814 2154 2161 -817 1928 1933 -818 1932 1938 -819 1932 1934 -819 2047 2050 -821 1911 1912 -821 2045 2165 -821 2156 2161 -822 2048 2050 -823 2286 5829 -825 2055 5710 -825 2047 2157 -828 2036 2038 -829 2156 2159 -829 2172 5830 -831 2161 2276 -831 2274 2281 -838 2167 2277 -839 1931 1932 -839 2022 2029 -841 1938 1939 -842 2159 2161 -842 2164 2280 -844 2276 2277 -848 2039 2153 -849 6191 6307 -852 2049 2050 -855 2050 2051 -856 2047 2165 -859 2161 2162 -861 5710 5712 -861 2157 2164 -863 5830 5832 -868 2162 2276 -869 2050 2165 -873 2631 6191 -874 5831 5832 -875 2276 2282 -876 2031 2036 -876 2290 2399 -879 2044 2161 -879 5712 5830 -881 2163 2165 -881 2161 2277 -884 2051 2165 -884 2507 2508 -885 2055 5591 -887 2051 2166 -889 2277 2279 -890 2160 2161 -890 2519 2520 -892 1933 1934 -896 2163 2164 -897 2393 2394 -897 2394 2501 -898 2282 2284 -898 2405 5952 -803 4991 5107 -803 5108 5112 -803 5118 5123 -803 5366 5487 -806 5477 5590 -808 5350 5351 -808 5351 5352 -812 5507 5620 -818 5351 5470 -822 5115 5116 -822 5122 5123 -822 5483 5596 -822 5484 5602 -824 5247 5248 -825 5365 5372 -825 5364 5487 -826 5129 5247 -829 5255 5373 -829 5364 5370 -832 5477 5595 -832 5483 5484 -832 5484 5486 -832 5611 5612 -834 5123 5241 -837 5124 5129 -840 5373 5374 -841 5000 5115 -842 5250 5255 -843 5130 5247 -843 5349 5350 -844 5122 5124 -846 5366 5370 -848 5248 5250 -848 5363 5483 -850 5249 5250 -853 5499 5500 -856 5365 5370 -859 5118 5121 -859 5235 5238 -859 5481 5482 -862 5124 5127 -865 5230 5237 -865 5256 5373 -865 5367 5370 -869 4995 5110 -869 5476 5483 -874 5350 5352 -875 5250 5256 -876 5374 5376 -877 5364 5482 -877 5376 5381 -879 5130 5250 -884 5250 5253 -884 5365 5373 -888 5001 5115 -891 5364 5369 -891 5381 5499 -891 5481 5483 -893 4995 5109 -894 4990 4997 -897 4997 5113 -898 5245 5250 -899 4995 5115 -900 5245 5247 -900 5371 5378 -803 5604 5609 -803 5970 6089 -805 5620 5627 -806 5477 5590 -810 5606 5610 -811 6196 6203 -812 5507 5620 -813 5612 5726 -815 6197 6313 -816 5856 5975 -816 6083 6090 -823 2286 5829 -825 2055 5710 -829 2172 5830 -832 5477 5595 -832 5611 5612 -832 5854 5855 -833 6084 6202 -833 6197 6307 -836 5971 5976 -837 5835 5955 -840 5971 6089 -840 6084 6090 -841 5732 5733 -843 5969 5974 -847 5737 5742 -847 5958 6071 -848 6075 6187 -849 6201 6202 -849 6085 6202 -849 6191 6307 -850 5727 5840 -852 5954 5955 -853 5855 5862 -855 5609 5723 -856 5610 5726 -858 6201 6203 -859 5740 5741 -861 5710 5712 -862 5604 5728 -862 5955 6074 -862 5955 5959 -863 5830 5832 -863 5954 5956 -864 5737 5855 -865 5955 5956 -865 5953 6071 -865 6088 6089 -866 5970 6088 -866 6083 6085 -866 6197 6312 -867 5835 5956 -867 5974 5976 -867 6083 6088 -868 5961 5967 -869 6085 6090 -871 5610 5728 -871 5954 5959 -872 5606 5728 -872 5740 5742 -872 5954 6074 -873 5857 5862 -873 6088 6090 -874 5831 5832 -877 5857 5975 -877 5948 5956 -877 6068 6075 -878 6074 6076 -879 5712 5830 -880 5974 5975 -881 5833 5836 -882 6192 6307 -883 5955 6076 -885 2055 5591 -888 5954 5957 -888 6201 6204 -891 6198 6203 -893 5961 6074 -894 5609 5728 -895 6198 6313 -897 5740 5743 -898 5830 5833 -898 5959 5961 -900 6068 6076 -901 1683 1684 -904 1570 1682 -906 1815 1816 -907 1677 1793 -913 1570 1572 -916 1571 1573 -918 1572 1573 -925 1467 1583 -928 1459 1571 -931 1582 1585 -937 1459 1461 -938 1810 1815 -942 1580 1582 -943 1566 1683 -944 1465 1582 -945 1560 1670 -949 1821 1932 -953 1461 1462 -958 1821 1939 -962 1577 1585 -965 1676 1683 -967 1566 1682 -968 1460 1465 -978 1460 1462 -979 1813 1815 -984 1348 1460 -986 1350 1468 -989 1565 1572 -994 1455 1571 -902 2165 2171 -904 2284 2285 -905 2277 2284 -907 2279 2282 -908 6191 6306 -910 2164 2165 -910 2285 2399 -912 1933 2048 -912 2400 2513 -914 2282 2398 -915 2163 2168 -916 2162 2164 -918 2033 2036 -920 2274 2276 -921 2401 2513 -923 2166 2171 -923 2164 2274 -925 1915 1916 -925 2274 2279 -926 2289 2290 -928 2056 2166 -929 1916 2031 -929 5712 5713 -929 2156 2158 -929 2158 2276 -931 2151 2156 -931 2279 2281 -932 2151 2158 -933 2030 2036 -935 2285 2398 -936 2162 2168 -936 2168 2170 -938 2165 2168 -940 2513 2518 -941 2399 2404 -949 1821 1932 -949 2274 2275 -949 2518 2520 -954 2056 2173 -957 2166 2168 -958 1821 1939 -958 5711 5712 -958 2274 2282 -959 2520 6191 -960 2399 2405 -961 2281 2398 -964 1932 1939 -964 1933 1939 -965 2170 2280 -967 2151 2153 -969 2168 2171 -969 2171 2173 -969 2512 2513 -970 2396 2398 -970 2521 2631 -971 1933 2049 -974 5712 5832 -974 2151 2152 -974 5832 5833 -977 2158 2268 -977 6192 6306 -985 2519 2521 -987 2289 5832 -990 2035 2153 -991 2281 2390 -995 5829 5833 -996 5712 5831 -997 2512 2514 -999 2172 2173 -904 5123 5242 -904 5252 5253 -904 5250 5252 -905 5245 5248 -906 5376 5379 -911 5245 5253 -912 5501 5502 -913 5245 5252 -913 5371 5372 -916 5121 5124 -917 5113 5121 -919 5118 5124 -920 5252 5256 -921 5130 5245 -922 5246 5250 -925 5367 5369 -926 5120 5121 -926 5245 5246 -926 5371 5374 -929 5123 5124 -935 5367 5368 -938 5363 5482 -939 5119 5124 -943 5132 5245 -944 5126 5130 -944 5256 5371 -945 5382 5499 -946 5363 5369 -948 5126 5247 -948 5502 5620 -953 5119 5239 -956 5117 5230 -956 5362 5368 -956 5499 5502 -957 5232 5350 -960 4995 5107 -961 5502 5619 -963 5001 5113 -963 5119 5120 -965 5118 5233 -965 5378 5381 -968 5371 5379 -971 5126 5127 -972 5116 5123 -974 5378 5379 -992 5125 5126 -902 5737 5860 -904 5728 5729 -905 5726 5734 -906 5971 6094 -907 5723 5730 -908 5732 5852 -911 5831 5833 -912 5728 5734 -912 5852 5855 -915 5829 5830 -916 5974 5977 -921 5742 5855 -923 5833 5838 -925 5833 5956 -926 5953 5956 -926 6198 6318 -927 5620 5625 -927 5723 5843 -927 5953 5955 -929 5712 5713 -929 5857 5980 -930 5728 5730 -930 5974 5980 -930 6088 6094 -932 6085 6207 -933 5733 5734 -933 5961 6082 -934 6088 6207 -934 6085 6091 -935 5953 6076 -936 5965 6088 -937 5728 5731 -939 5833 5951 -939 6073 6075 -939 6198 6312 -940 5956 6076 -944 6088 6091 -946 5726 5731 -946 5733 5737 -948 5502 5620 -949 5621 5622 -949 5831 5838 -950 5857 5860 -951 5724 5843 -951 6192 6312 -952 5727 5731 -952 5959 5962 -954 5852 5860 -955 6080 6081 -957 5718 5838 -957 5730 5736 -958 5711 5712 -959 5729 5730 -961 5502 5619 -964 5836 5838 -966 5739 5852 -966 5951 5953 -967 5855 5860 -967 6192 6309 -968 5620 5622 -970 5731 5846 -971 5958 6076 -974 5739 5860 -974 5832 5833 -974 5953 5958 -975 5724 5844 -975 5837 5838 -977 5725 5730 -977 6192 6306 -979 5737 5852 -980 5731 5733 -985 5730 5849 -986 5725 5843 -987 6199 6207 -987 2289 5832 -988 5837 5844 -989 5619 5625 -993 5843 5849 -993 6193 6194 -995 5730 5731 -995 5837 5839 -995 5829 5833 -996 5712 5831 -999 5619 5622 -1000 6199 6204 -1004 1460 1461 -1006 1465 1577 -1020 1580 1581 -1026 1574 1581 -1027 1454 1461 -1028 1344 1460 -1033 1579 1580 -1043 1574 1579 -1047 1461 1465 -1047 1465 1579 -1049 1350 1460 -1056 1350 1466 -1057 1681 1684 -1062 1799 1807 -1085 1343 1460 -1086 1574 1576 -1093 1466 4991 -1002 2401 2404 -1004 2170 2288 -1005 2507 2514 -1006 2404 2406 -1007 2172 5832 -1008 2173 2174 -1010 2033 2035 -1010 2405 2406 -1014 5950 5951 -1019 2521 6189 -1021 2521 6191 -1024 2035 2145 -1024 2510 2517 -1028 2396 2401 -1032 2028 2145 -1032 2515 2518 -1034 2162 2282 -1034 2512 2515 -1034 2518 2521 -1039 5829 5950 -1039 2510 2515 -1042 2028 2033 -1047 2167 2168 -1048 2401 2403 -1051 2507 2509 -1057 2509 2512 -1058 2028 2029 -1059 1916 2030 -1060 2401 2407 -1061 2396 2397 -1061 2506 2507 -1062 2174 2289 -1062 2406 2407 -1071 2504 2507 -1073 2517 2518 -1074 5832 5950 -1077 2507 2512 -1080 2274 2277 -1081 2028 2030 -1085 2511 2512 -1086 2403 2510 -1088 2394 2506 -1091 2395 2507 -1092 2162 2277 -1092 2516 2517 -1092 6190 6191 -1093 2166 2173 -1100 2516 2518 -1003 5003 5113 -1006 5252 5365 -1008 5118 5120 -1010 5119 5126 -1014 5251 5252 -1017 5378 5382 -1025 5258 5371 -1037 5126 5245 -1040 5377 5378 -1046 5362 5369 -1047 5498 5502 -1049 5118 5238 -1064 5235 5237 -1073 5382 5497 -1075 5118 5241 -1080 4997 5001 -1088 5497 5502 -1091 4995 4997 -1094 5497 5505 -1095 5236 5237 -1001 5730 5850 -1001 5848 5849 -1004 5730 5848 -1005 6087 6207 -1006 5729 5731 -1007 5739 5858 -1007 5835 5838 -1007 5972 5975 -1008 5622 5740 -1009 5731 5848 -1009 5739 5743 -1010 5727 5730 -1010 5731 5849 -1013 5733 5854 -1014 5950 5951 -1017 5725 5848 -1017 5846 5849 -1019 5731 5736 -1019 5848 5854 -1019 5973 6094 -1019 2521 6189 -1020 5842 5843 -1020 5973 5977 -1020 6087 6091 -1021 5731 5851 -1021 6086 6091 -1023 6086 6094 -1024 5852 5858 -1025 5725 5845 -1026 5849 5854 -1026 5849 5850 -1028 5852 5859 -1029 5736 5854 -1031 5731 5854 -1031 5842 5844 -1034 5849 5851 -1037 5730 5843 -1038 6200 6204 -1039 6198 6310 -1048 5836 5839 -1049 5731 5734 -1049 5842 5845 -1049 5733 5852 -1049 5972 5977 -1053 6068 6073 -1056 5736 5737 -1059 5736 5849 -1059 5737 5854 -1060 5839 5842 -1064 5610 5731 -1067 5727 5848 -1068 5729 5849 -1069 5857 5859 -1071 5841 5842 -1072 5972 5980 -1073 5834 5839 -1074 6200 6318 -1076 5859 5972 -1077 6199 6205 -1078 6194 6312 -1079 5738 5743 -1083 5835 5839 -1084 5972 5978 -1086 6075 6195 -1089 5972 5979 -1089 6193 6310 -1092 5618 5622 -1092 5857 5972 -1092 6190 6191 -1115 1349 1466 -1131 4991 4995 -1133 1574 1575 -1143 1354 4991 -1150 1350 4991 -1154 4990 4991 -1157 4991 4992 -1158 1908 1913 -1167 1905 1906 -1171 1349 4991 -1179 1349 4874 -1180 1905 1910 -1184 4874 4991 -1184 5107 5109 -1186 1349 4992 -1194 1905 1907 -1194 1905 1908 -1197 1574 1580 -1199 4991 5109 -1102 2277 2282 -1105 2167 2282 -1107 1912 2030 -1107 2174 2288 -1107 2400 2507 -1108 5951 5952 -1108 2394 2507 -1110 2510 2511 -1115 2403 2518 -1119 1913 2030 -1120 2174 5950 -1120 2405 2519 -1121 2516 2521 -1122 2041 2159 -1126 5829 5948 -1129 1913 1915 -1133 2407 2518 -1137 1912 2022 -1137 2151 2159 -1138 2166 2283 -1138 2521 6188 -1146 6069 6073 -1152 1910 1912 -1158 1908 1913 -1165 6188 6306 -1167 1905 1906 -1168 1910 1913 -1180 1905 1910 -1181 2407 2519 -1181 6069 6187 -1186 2045 2159 -1187 2174 2286 -1188 2504 2511 -1192 2628 6188 -1194 1905 1907 -1198 2519 6072 -1200 1899 1906 -1200 2039 2159 -1113 5230 5235 -1114 5502 5617 -1117 4996 4997 -1130 5236 5238 -1131 4991 4995 -1136 5249 5368 -1138 5247 5250 -1154 4990 4991 -1155 5384 5497 -1156 5617 5622 -1166 4997 4998 -1171 5250 5367 -1184 5107 5109 -1184 5236 5243 -1185 5617 5625 -1199 5118 5236 -1103 6192 6304 -1108 5951 5952 -1109 6194 6310 -1114 6070 6071 -1114 6070 6076 -1115 5834 5841 -1115 6087 6205 -1119 5972 6092 -1122 5840 5842 -1124 5972 5974 -1126 5829 5948 -1126 5973 6092 -1128 5745 5858 -1130 5725 5840 -1135 5622 5738 -1145 5855 5857 -1146 6069 6073 -1153 5739 5745 -1153 5853 5972 -1156 5617 5622 -1157 6200 6310 -1159 5973 6093 -1160 6086 6093 -1165 5855 5856 -1167 5727 5846 -1174 5738 5745 -1181 6069 6187 -1185 5617 5625 -1186 6070 6073 -1188 5738 5746 -1198 2519 6072 -1200 5721 5840 -1200 5835 5954 -1205 1349 1354 -1214 1809 1920 -1217 1240 1349 -1229 1792 1907 -1229 1792 1908 -1235 1686 1796 -1236 1804 1809 -1244 5109 5112 -1245 1788 1907 -1246 5109 5110 -1246 1809 1925 -1251 1809 1926 -1253 1788 1899 -1254 1350 1354 -1254 1925 1926 -1256 1791 1792 -1278 1348 1350 -1280 1680 1797 -1280 1790 1792 -1288 1680 1796 -1290 1788 1791 -1300 1349 1350 -1205 6188 6304 -1208 2174 5832 -1211 2519 6189 -1214 1809 1920 -1215 2041 2045 -1229 1792 1907 -1243 1926 1927 -1245 1788 1907 -1251 1809 1926 -1253 1788 1899 -1254 1925 1926 -1258 5832 5838 -1259 2042 2045 -1262 2167 2283 -1263 2039 2044 -1267 2040 2041 -1274 1927 1928 -1278 2282 2283 -1282 2166 2167 -1215 5617 5624 -1228 5504 5617 -1231 5236 5241 -1243 5250 5365 -1244 5109 5112 -1246 5109 5110 -1268 5497 5504 -1205 6188 6304 -1211 2519 6189 -1212 6194 6304 -1214 5624 5738 -1215 5617 5624 -1224 6189 6191 -1228 6194 6311 -1258 5832 5838 -1259 6191 6192 -1261 5958 5959 -1269 5726 5728 -1276 6199 6206 -1301 1681 1796 -1305 1790 1795 -1315 1680 1795 -1319 1343 1350 -1323 1681 1795 -1329 1782 1899 -1333 1350 1351 -1354 1789 1795 -1354 1789 1792 -1354 5110 5111 -1355 1675 1795 -1359 1786 1788 -1367 1675 1792 -1372 1787 1790 -1378 1786 1899 -1380 1786 1907 -1390 1782 1893 -1393 1788 1789 -1306 1924 1928 -1309 2519 6191 -1310 1928 2043 -1312 5832 5951 -1313 2165 2167 -1320 2162 2167 -1321 1928 2042 -1329 1782 1899 -1378 1786 1899 -1380 1786 1907 -1316 5111 5112 -1354 5110 5111 -1382 5501 5619 -1384 5501 5620 -1309 2519 6191 -1312 5832 5951 -1317 6200 6316 -1338 5733 5846 -1364 5606 5726 -1368 5619 5620 -1372 5620 5621 -1378 5614 5620 -1382 5501 5619 -1384 5501 5620 -1396 5619 5621 -1403 1782 1901 -1405 1677 1681 -1410 1804 1920 -1415 1787 1789 -1427 1677 1678 -1445 1675 1677 -1447 1787 1788 -1450 5111 5230 -1451 1675 1787 -1472 1671 1787 -1477 1670 1677 -1495 1462 1463 -1499 1469 5110 -1410 1804 1920 -1416 2279 2284 -1425 2044 2159 -1445 2284 2393 -1458 2516 6187 -1472 2031 2038 -1484 2284 2398 -1486 2032 2038 -1488 2042 2043 -1495 1927 2043 -1404 5368 5370 -1430 5006 5116 -1446 5116 5121 -1450 5111 5230 -1479 4999 5116 -1489 5129 5248 -1499 1469 5110 -1416 5621 5740 -1420 5614 5621 -1435 5616 5621 -1439 5733 5853 -1458 2516 6187 -1516 1347 1463 -1520 1781 1788 -1557 1338 1448 -1558 1348 1463 -1580 1560 1678 -1593 1454 1455 -1594 1782 1788 -1598 1564 1678 -1504 2398 2399 -1510 2038 2148 -1512 2033 2038 -1512 6069 6189 -1516 2393 2399 -1521 2284 2399 -1543 2033 2153 -1556 2037 2044 -1567 2038 2154 -1568 2038 2153 -1598 2042 2044 -1598 2504 2509 -1508 5000 5116 -1516 5129 5130 -1530 5127 5130 -1538 5001 5116 -1550 4880 4996 -1567 5128 5129 -1568 5128 5135 -1574 5128 5130 -1589 5009 5125 -1512 6069 6189 -1574 6072 6073 -1606 1459 1462 -1610 1353 1463 -1612 1558 1560 -1618 1553 1670 -1626 1679 1684 -1630 1448 1456 -1631 1684 1686 -1635 1553 1554 -1637 1455 1456 -1642 1553 1558 -1644 1554 1664 -1645 1558 1561 -1654 1557 1673 -1661 1439 1446 -1661 1440 1446 -1664 1440 1556 -1666 1455 1459 -1669 1547 1548 -1671 1553 1555 -1675 1556 1557 -1676 1680 1790 -1678 1673 1674 -1680 1554 1555 -1684 1437 1547 -1685 1564 1679 -1690 1331 1332 -1690 1555 1558 -1690 1679 1685 -1694 1453 1456 -1699 1563 1564 -1620 2275 2390 -1630 2390 2391 -1630 2518 2519 -1630 2506 2509 -1631 2275 2279 -1632 2511 2616 -1637 2390 2392 -1637 2399 2400 -1638 2275 2391 -1640 2397 2504 -1647 2262 2269 -1648 2384 2391 -1649 2505 2509 -1662 2276 2279 -1662 2504 2512 -1664 2029 2030 -1675 2279 2392 -1677 2395 2506 -1677 2505 2616 -1678 2406 2519 -1681 2392 2395 -1683 2263 2378 -1686 2278 2279 -1693 2391 2395 -1698 2506 2508 -1699 2504 2616 -1700 2510 2518 -1603 5121 5123 -1604 5125 5127 -1620 5013 5125 -1628 5009 5013 -1633 5251 5258 -1650 5008 5009 -1655 5010 5013 -1660 5127 5128 -1660 5256 5374 -1669 5122 5128 -1670 5256 5379 -1672 5013 5127 -1673 5008 5010 -1676 5255 5374 -1678 5256 5261 -1679 5012 5128 -1680 4892 5008 -1682 5138 5257 -1682 5255 5261 -1684 5258 5379 -1691 5377 5382 -1693 5254 5255 -1694 5012 5127 -1697 5258 5377 -1700 5254 5256 -1607 6071 6072 -1702 1561 1563 -1704 1569 1679 -1709 1554 1672 -1710 1336 1338 -1715 1437 1555 -1717 1563 1569 -1719 1672 1673 -1720 1556 1561 -1720 1557 1558 -1722 1440 1441 -1723 1441 1555 -1723 1547 1554 -1723 1552 1664 -1724 1329 1445 -1726 1439 1441 -1734 1563 1679 -1741 1439 1444 -1742 1674 1675 -1744 1675 1790 -1745 1441 1556 -1747 1681 1686 -1748 1435 1441 -1749 1435 1437 -1751 1569 1686 -1755 1217 1218 -1756 1329 1444 -1763 1679 1686 -1766 1329 1335 -1770 1438 1441 -1771 1224 1331 -1773 1562 1563 -1776 1670 1671 -1781 1453 1459 -1783 1331 1338 -1791 1437 1438 -1792 1430 1547 -1793 1555 1556 -1794 1436 1438 -1800 1459 1573 -1800 1563 1678 -1701 2394 2395 -1701 2385 2498 -1701 2492 2499 -1703 2030 2033 -1703 2610 2616 -1705 2278 2394 -1710 2027 2029 -1711 2023 2139 -1711 2512 2518 -1714 2506 2618 -1714 2505 2618 -1715 2391 2504 -1715 2407 6189 -1719 2389 2391 -1719 2501 2508 -1722 2250 2257 -1730 2610 2617 -1736 2385 2500 -1737 2504 2506 -1739 2503 2508 -1740 2399 2406 -1742 2389 2506 -1743 2389 2501 -1744 2401 2518 -1745 2401 2406 -1746 2031 2033 -1748 2610 2618 -1752 2503 2618 -1753 2389 2498 -1756 2400 2406 -1757 2391 2392 -1757 2493 2604 -1758 2612 2618 -1759 2389 2500 -1761 2386 2500 -1762 2492 2500 -1762 2504 2505 -1762 2503 2613 -1763 2610 2615 -1764 2615 2618 -1765 2140 2256 -1766 2388 2389 -1767 2611 2721 -1771 2503 2615 -1772 2383 2500 -1772 2502 2508 -1779 2399 2401 -1781 2032 2033 -1784 2492 2497 -1786 2611 2615 -1787 2027 2147 -1787 2387 2388 -1787 2383 2389 -1789 2493 2497 -1790 2502 2613 -1791 2612 2615 -1792 2027 2139 -1792 2386 2388 -1793 2392 2393 -1797 2612 2613 -1800 2391 2506 -1703 5258 5262 -1704 5251 5259 -1710 4896 5008 -1714 5138 5259 -1714 5253 5254 -1715 5377 5384 -1718 5256 5259 -1719 5012 5129 -1720 4891 4898 -1722 5258 5259 -1727 5258 5264 -1730 5010 5011 -1731 5377 5385 -1732 5012 5013 -1733 4896 4898 -1736 5264 5385 -1738 5264 5383 -1739 5011 5012 -1743 5136 5259 -1744 5257 5264 -1747 4896 5016 -1752 5257 5258 -1757 5136 5253 -1758 5136 5254 -1761 5263 5270 -1762 5135 5248 -1765 5135 5253 -1769 5135 5254 -1774 5138 5142 -1774 5251 5256 -1776 5262 5385 -1777 5136 5141 -1780 5000 5001 -1788 5137 5257 -1790 5136 5142 -1795 4898 4899 -1715 2407 6189 -1736 6072 6189 -1756 5957 5958 -1761 6072 6190 -1801 1336 1456 -1811 1430 1431 -1814 1670 1672 -1816 1430 1437 -1816 1554 1558 -1818 1458 1459 -1822 1670 1675 -1823 1430 1435 -1829 1110 1217 -1829 1324 1444 -1829 1457 1458 -1834 1672 1675 -1842 1558 1672 -1846 1456 1459 -1849 1552 1554 -1851 1324 1436 -1854 1552 1558 -1861 1435 1438 -1863 1324 1326 -1866 1675 1789 -1874 1454 1459 -1877 880 887 -1877 1320 1436 -1877 1446 1563 -1878 1671 1675 -1881 1457 1459 -1887 1554 1670 -1888 862 869 -1888 874 881 -1888 1329 1330 -1892 1671 1789 -1893 1304 1311 -1894 1314 1424 -1894 1671 1672 -1897 868 875 -1899 1671 1674 -1802 2721 2723 -1807 2721 2722 -1808 2715 2722 -1817 2383 2386 -1818 2615 2723 -1819 2492 2495 -1821 2032 2147 -1822 2133 2140 -1822 2383 2385 -1825 2406 2518 -1826 2383 2388 -1826 2385 2492 -1827 2381 2386 -1829 2728 2829 -1837 2032 2148 -1837 2272 2381 -1841 2378 2383 -1842 2614 2615 -1844 2721 2726 -1851 2267 2383 -1852 2267 2381 -1853 2244 2251 -1858 2391 2498 -1859 2278 2393 -1862 2726 2728 -1871 2378 2379 -1871 2395 2504 -1875 2134 2250 -1884 2835 2836 -1885 2378 2380 -1886 2267 2380 -1891 2726 2729 -1894 2263 2380 -1898 2612 2614 -1900 2266 2267 -1803 4896 5010 -1806 5130 5135 -1809 5256 5258 -1835 5137 5144 -1836 5269 5270 -1837 5134 5141 -1842 5134 5136 -1844 5137 5142 -1845 5139 5141 -1847 5139 5142 -1848 5027 5144 -1851 5130 5133 -1852 4777 4784 -1853 5250 5373 -1860 4896 5011 -1860 5027 5143 -1863 5137 5140 -1864 5139 5140 -1866 5137 5145 -1877 5027 5145 -1880 5135 5136 -1883 5377 5379 -1886 5026 5033 -1888 4784 4891 -1895 5025 5145 -1898 4891 4899 -1901 1327 1444 -1902 1197 1310 -1902 1670 1678 -1904 1446 1556 -1906 1675 1678 -1908 780 886 -1910 1319 1320 -1913 1673 1675 -1916 1331 1339 -1917 863 971 -1919 683 785 -1920 868 869 -1921 1319 1324 -1921 1678 1680 -1921 1669 1671 -1925 1675 1680 -1928 880 881 -1928 1324 1327 -1935 1671 1781 -1936 1082 1089 -1938 1664 1671 -1941 779 786 -1941 1196 1203 -1942 867 869 -1942 868 870 -1944 1327 1329 -1946 880 882 -1946 1558 1678 -1951 965 972 -1951 1305 1421 -1951 1680 1681 -1955 879 881 -1956 768 874 -1957 864 869 -1957 1321 1327 -1961 1083 1196 -1964 689 785 -1965 1322 1327 -1966 874 876 -1966 1212 1319 -1966 1319 1321 -1969 874 875 -1971 880 885 -1974 780 885 -1975 873 875 -1978 864 971 -1979 689 791 -1983 978 1088 -1983 1205 1206 -1983 1210 1324 -1985 763 870 -1985 1328 1329 -1985 1673 1678 -1986 1415 1422 -1989 1103 1104 -1989 1679 1680 -1995 1210 1212 -1997 780 781 -1997 1304 1309 -1998 970 971 -1999 779 781 -2000 873 876 -1919 2265 2266 -1923 2516 6189 -1927 2931 2932 -1930 2611 2614 -1931 2808 2809 -1932 2263 2372 -1934 2264 2266 -1934 2815 2913 -1937 2261 2263 -1937 2829 2837 -1939 2251 2366 -1944 2259 2265 -1945 2472 2577 -1949 2465 2466 -1949 2502 2607 -1952 2261 2264 -1952 2925 2926 -1954 2352 2459 -1956 2583 2584 -1957 2821 2919 -1958 2257 2372 -1962 2345 2346 -1962 2695 2701 -1963 2257 2373 -1964 2229 2230 -1965 2701 2802 -1965 2829 2836 -1969 2257 2261 -1970 2810 2913 -1972 2256 2261 -1973 2366 2372 -1975 1995 1996 -1975 2144 2261 -1976 2919 2920 -1977 2694 2695 -1977 2726 2837 -1979 2809 2810 -1979 3034 3125 -1982 2257 2374 -1985 2113 2229 -1987 2924 2926 -1989 2257 2366 -1991 2149 2265 -1992 1879 1995 -1992 2230 2345 -1992 2467 2472 -1992 2807 2809 -1993 2913 2918 -1993 3131 3132 -1994 2112 2113 -1994 2577 2582 -1999 2465 2467 -1904 4782 4784 -1907 5031 5143 -1914 5025 5140 -1917 4896 4899 -1917 4896 4901 -1920 5024 5134 -1922 5027 5031 -1923 4784 4785 -1927 4782 4899 -1929 4465 4564 -1931 5024 5139 -1933 4805 4912 -1944 5033 5143 -1948 4452 4453 -1948 5031 5145 -1950 4916 5032 -1951 5024 5141 -1953 4459 4558 -1953 5019 5024 -1957 5033 5034 -1961 5025 5030 -1962 4895 5011 -1964 5024 5140 -1965 4704 4705 -1971 4471 4570 -1974 4894 4900 -1981 4440 4441 -1982 4894 4901 -1989 4680 4686 -1995 4894 4899 -1995 5032 5033 -1998 5024 5030 -2000 4337 4434 -1913 5956 5959 -1923 2516 6189 -1926 5957 5959 -1995 6080 6082 -1999 5965 6082 -2004 684 785 -2004 867 870 -2005 1197 1309 -2011 695 791 -2011 4330 4331 -2012 1643 1650 -2013 1199 1205 -2014 1210 1321 -2015 1532 1539 -2016 1650 1760 -2017 1197 1198 -2017 1206 1319 -2018 970 972 -2018 1533 1649 -2018 1878 1879 -2019 879 882 -2022 689 790 -2022 966 1076 -2023 688 695 -2024 694 4331 -2024 683 784 -2024 876 879 -2026 775 885 -2026 867 976 -2029 1760 1767 -2031 1091 1092 -2034 1210 1327 -2035 870 873 -2035 1761 1878 -2037 690 791 -2037 1206 1210 -2037 1415 1420 -2041 779 784 -2041 1210 1216 -2042 864 973 -2043 778 885 -2043 1070 1077 -2043 1210 1322 -2046 694 695 -2046 1304 1306 -2047 967 972 -2048 865 870 -2050 1215 1322 -2051 878 879 -2051 1760 1765 -2052 970 973 -2052 1305 1306 -2052 1645 1650 -2053 1235 1236 -2054 864 976 -2055 694 696 -2055 1422 1532 -2055 1533 1534 -2059 1532 1537 -2059 1877 1878 -2060 778 781 -2060 1209 1210 -2060 1305 1420 -2062 693 695 -2062 1122 1235 -2063 1196 1197 -2064 1760 1878 -2065 678 784 -2066 1235 1237 -2066 1417 1422 -2067 684 787 -2067 967 1076 -2068 1532 1649 -2069 689 695 -2071 1236 1240 -2071 1532 1534 -2072 684 790 -2072 1417 1537 -2073 1098 1205 -2075 877 879 -2075 1192 1198 -2076 684 784 -2080 4329 4331 -2081 1235 1240 -2082 690 790 -2084 866 870 -2084 1648 1649 -2085 1529 1532 -2085 1648 1650 -2085 1761 1762 -2085 1762 1767 -2086 680 784 -2088 684 782 -2088 690 695 -2089 1531 1534 -2090 1192 1309 -2096 1417 1420 -2097 690 796 -2099 1300 1420 -2099 1534 1648 -2002 2464 2465 -2002 2611 2723 -2004 2259 2264 -2004 2802 2807 -2005 2694 2696 -2006 2695 2696 -2007 2467 2470 -2009 2918 2920 -2010 2693 2694 -2011 2258 2261 -2011 2347 2352 -2011 2696 2802 -2012 2344 2345 -2013 2230 2231 -2013 2352 2464 -2014 2696 2701 -2014 2926 2927 -2015 2584 2688 -2016 3138 3225 -2017 1996 2112 -2017 2113 2114 -2017 2228 2229 -2018 1878 1879 -2018 2582 2584 -2019 2255 2366 -2020 2584 2694 -2020 2584 2585 -2022 2353 2464 -2027 2255 2257 -2028 2810 2912 -2029 1996 1997 -2030 2607 2612 -2031 2579 2582 -2032 2919 2926 -2036 1994 1995 -2036 2345 2347 -2038 2579 2585 -2039 2256 2259 -2039 2467 2582 -2041 2347 2353 -2042 2111 2112 -2046 2347 2350 -2046 2693 2695 -2050 2516 6188 -2051 2231 2344 -2052 2149 2259 -2054 2920 2921 -2055 2585 2693 -2057 1879 1880 -2059 1877 1878 -2061 2696 2804 -2062 2804 2807 -2064 2467 2469 -2065 2137 2247 -2065 2143 2149 -2065 2144 2259 -2066 1997 2111 -2068 2228 2231 -2069 2142 2149 -2070 2609 2612 -2070 2696 2801 -2073 2114 2228 -2074 2462 2467 -2079 2921 3021 -2081 1994 1997 -2082 2111 2114 -2083 1880 1994 -2085 2258 2260 -2086 1877 1880 -2092 2462 2464 -2094 2574 2582 -2096 2609 2611 -2098 2258 2259 -2001 4787 4894 -2005 5023 5025 -2011 4330 4331 -2014 4577 4680 -2015 4464 4465 -2019 5254 5374 -2020 5031 5033 -2023 5031 5151 -2025 4780 4781 -2029 4349 4446 -2034 5023 5024 -2035 4782 4787 -2039 5254 5261 -2040 4783 4785 -2041 4440 4447 -2041 5025 5028 -2043 4672 4783 -2051 4361 4458 -2055 4785 4788 -2060 4686 4687 -2061 4459 4564 -2063 5027 5028 -2066 4687 4693 -2066 5022 5023 -2073 5020 5028 -2089 4459 4563 -2091 5261 5374 -2092 5034 5037 -2094 4676 4783 -2094 5254 5259 -2096 4915 4922 -2099 4907 5017 -2100 4440 4442 -2012 5962 5964 -2042 5964 5965 -2049 5963 5964 -2050 2516 6188 -2102 1760 1762 -2102 1762 1877 -2104 1121 1122 -2104 1207 1210 -2105 693 696 -2105 1075 1076 -2105 1126 1235 -2106 1208 1215 -2107 1240 4874 -2108 1205 1207 -2109 967 1081 -2109 1645 1765 -2112 775 877 -2112 1648 1651 -2114 1195 1196 -2115 1300 1306 -2117 1195 1198 -2118 1759 1762 -2119 1192 1306 -2120 872 873 -2120 968 971 -2120 1096 1207 -2121 1417 1419 -2123 696 4329 -2125 866 976 -2125 1092 1207 -2125 1195 1201 -2125 1645 1651 -2128 690 788 -2129 1092 1199 -2129 1205 1208 -2129 1208 1209 -2130 1092 1205 -2130 1303 1306 -2131 1208 1210 -2132 686 790 -2133 686 782 -2133 871 876 -2133 1207 1208 -2134 1092 1096 -2144 1085 1199 -2147 968 973 -2149 1096 1205 -2152 1101 1214 -2152 1417 1529 -2153 1092 1093 -2154 1240 4875 -2155 1085 1086 -2156 4329 4332 -2159 1646 1648 -2162 975 1086 -2162 1090 1092 -2163 1208 1213 -2164 968 976 -2164 1095 1208 -2166 690 692 -2168 776 784 -2168 1085 1090 -2169 1095 1096 -2170 1530 1534 -2171 975 1079 -2171 981 1085 -2172 1086 1087 -2172 1529 1531 -2174 1122 1126 -2175 1205 1210 -2181 1090 1093 -2181 1100 1107 -2181 1647 1648 -2189 776 781 -2190 1354 4992 -2194 1758 1762 -2195 1010 4648 -2195 1645 1647 -2199 1085 1087 -2102 1762 1877 -2105 2227 2231 -2107 2142 2147 -2108 2250 2255 -2108 2360 2367 -2108 2693 2696 -2111 2142 2259 -2113 2231 2342 -2113 2366 2368 -2114 2349 2464 -2116 2915 2918 -2118 2692 2696 -2120 2226 2231 -2120 2347 2349 -2121 2110 2114 -2123 2342 2350 -2128 2255 2258 -2128 2367 2368 -2131 2226 2227 -2132 2349 2456 -2132 2921 3020 -2133 2227 2342 -2133 2342 2347 -2134 1875 1877 -2134 2342 2349 -2134 2806 2807 -2135 2144 2149 -2135 2806 2810 -2136 2349 2350 -2136 2604 2609 -2137 2691 2693 -2138 2932 3027 -2139 2579 2581 -2142 2349 2353 -2143 1992 1994 -2143 2497 2607 -2145 2114 2226 -2146 1993 1997 -2146 2144 2264 -2148 2581 2693 -2152 2927 3027 -2154 2226 2234 -2157 2462 2463 -2159 2361 2474 -2159 2927 3026 -2160 2696 2799 -2161 2144 2146 -2161 2799 2807 -2162 2109 2114 -2162 2144 2147 -2162 3027 3032 -2165 2109 2226 -2165 2143 2144 -2166 2611 2715 -2169 2116 2226 -2169 2349 2462 -2169 2709 2716 -2170 2348 2349 -2172 2469 2574 -2174 2144 2256 -2175 2253 2258 -2175 2932 3034 -2176 1876 1880 -2178 2226 2233 -2179 3026 3027 -2180 2921 2926 -2182 2256 2258 -2182 3027 3034 -2183 2574 2581 -2185 2365 2367 -2185 2926 3027 -2187 2109 2110 -2189 2139 2144 -2189 2250 2251 -2190 3027 3029 -2192 2139 2142 -2192 2146 2256 -2195 2109 2111 -2195 2605 2715 -2197 2257 2258 -2104 4452 4454 -2106 4669 4774 -2107 4330 4332 -2108 4343 4446 -2108 4907 5022 -2110 5026 5027 -2117 4808 4921 -2118 5133 5136 -2123 5132 5133 -2127 4902 4907 -2128 4785 4787 -2131 4908 5022 -2140 4344 4446 -2140 4780 4787 -2141 4678 4789 -2147 4908 5020 -2149 5374 5379 -2150 4662 4663 -2154 4337 4439 -2154 4900 4901 -2156 4329 4332 -2156 4451 4453 -2156 4678 4684 -2157 5019 5136 -2162 4439 4440 -2163 4332 4337 -2165 4904 4908 -2168 4338 4439 -2169 4335 4439 -2169 4446 4451 -2169 4910 5026 -2170 4337 4440 -2173 4905 5022 -2174 4332 4335 -2175 4454 4459 -2176 4337 4338 -2178 4786 4787 -2182 4900 4902 -2182 4910 5028 -2185 4780 4782 -2190 4902 4905 -2191 4335 4337 -2192 4343 4445 -2193 4437 4440 -2194 4440 4445 -2198 5136 5139 -2109 5965 6083 -2110 5963 6083 -2129 5970 6083 -2140 5979 6092 -2143 5751 5864 -2147 6205 6206 -2150 5741 5742 -2159 6098 6099 -2160 5873 5880 -2169 5744 5745 -2174 5977 6092 -2174 6120 6238 -2177 6202 6203 -2180 6098 6217 -2187 6202 6209 -2188 5870 5871 -2191 5622 5743 -2192 6089 6090 -2192 6092 6100 -2192 6452 6459 -2195 5977 6097 -2198 5745 5746 -2198 6099 6100 -2198 6090 6202 -2200 5743 5746 -2200 6105 6217 -2201 1085 1092 -2201 1240 4992 -2202 1412 1420 -2203 1080 1187 -2208 777 885 -2209 975 1087 -2210 1083 1084 -2211 968 969 -2212 691 696 -2223 1456 1458 -2225 1757 1765 -2226 777 781 -2234 1302 1420 -2239 1084 1195 -2240 777 883 -2252 777 877 -2256 1302 1306 -2256 1757 1762 -2257 1530 1646 -2259 1082 1087 -2260 969 973 -2261 865 872 -2262 686 788 -2264 979 1087 -2264 1529 1530 -2270 969 970 -2271 1758 1875 -2272 692 693 -2273 1640 1646 -2280 1082 1084 -2289 978 1082 -2294 776 783 -2295 871 872 -2202 2605 2609 -2203 2810 2910 -2207 2226 2228 -2208 2257 2263 -2212 2256 2264 -2215 2606 2609 -2219 2143 2258 -2220 2365 2474 -2224 1993 2109 -2225 2910 2918 -2225 3027 3028 -2228 2142 2144 -2233 2251 2252 -2236 2252 2255 -2236 2605 2717 -2238 2031 2032 -2240 2139 2140 -2248 2917 2918 -2249 2139 2141 -2251 2917 2921 -2254 2709 2717 -2258 2025 2031 -2258 2581 2685 -2261 1915 2031 -2266 1875 1876 -2271 1758 1875 -2274 2251 2255 -2275 2805 2806 -2276 2474 2476 -2276 2691 2692 -2280 2921 3018 -2283 2368 2371 -2287 2030 2031 -2288 2921 3026 -2289 1992 1993 -2294 2468 2475 -2294 2698 2799 -2295 1876 1992 -2202 4336 4337 -2206 4338 4445 -2206 4904 4905 -2210 4678 4791 -2211 4676 4791 -2212 4678 4783 -2213 4344 4445 -2216 4899 4901 -2224 5374 5381 -2228 4897 4905 -2229 4678 4682 -2230 4343 4440 -2233 4338 4440 -2235 4344 4448 -2237 4779 4780 -2237 4788 4902 -2241 4330 4337 -2247 4899 4902 -2249 4454 4457 -2253 4336 4440 -2253 4677 4684 -2258 4338 4437 -2260 4448 4451 -2266 4327 4332 -2266 4451 4454 -2266 4669 4779 -2274 4450 4451 -2275 4903 5020 -2281 4443 4451 -2282 4785 4786 -2284 4677 4682 -2291 4910 5020 -2296 5635 5636 -2202 5977 6094 -2202 6440 6447 -2203 5976 6089 -2204 5757 5870 -2205 6446 6453 -2209 6202 6207 -2212 5975 5976 -2212 6452 6453 -2214 6097 6100 -2220 6548 6555 -2221 6099 6103 -2224 6451 6453 -2225 5741 5743 -2226 5744 5749 -2232 6316 6317 -2234 5746 5749 -2235 6103 6217 -2235 6202 6204 -2240 5744 5751 -2240 5749 5752 -2241 6452 6454 -2244 5746 5748 -2247 6232 6239 -2248 6316 6318 -2250 5747 5749 -2255 5741 5748 -2258 5751 5752 -2258 6448 6453 -2260 6344 6458 -2261 6103 6219 -2265 6217 6225 -2266 5766 5885 -2267 6219 6225 -2268 5750 5751 -2268 6005 6012 -2271 5627 5748 -2275 6343 6458 -2277 6094 6095 -2281 5747 5748 -2282 5630 5750 -2283 6095 6097 -2283 6080 6085 -2289 6223 6224 -2290 6224 6225 -2290 6343 6350 -2293 5892 6005 -2294 5885 5886 -2296 5635 5636 -2296 6119 6126 -2296 6343 6349 -2298 6653 6660 -2300 5750 5755 -2301 4762 4763 -2302 1081 1084 -2302 1640 1647 -2305 1757 1764 -2307 1647 1757 -2312 973 975 -2318 866 974 -2318 1126 1237 -2328 1193 1195 -2330 680 782 -2333 685 692 -2334 1301 1306 -2338 1301 1309 -2345 4328 4329 -2346 771 877 -2347 973 976 -2349 973 1087 -2351 1007 1014 -2352 691 692 -2352 1080 1084 -2360 1124 4651 -2363 1007 1008 -2363 1096 1213 -2364 973 978 -2365 1194 1195 -2367 1192 1194 -2374 971 972 -2380 1101 1213 -2383 1007 1009 -2386 971 973 -2391 1013 1014 -2394 1011 1121 -2398 691 4328 -2400 686 692 -2305 2812 2910 -2309 2365 2482 -2310 2495 2502 -2311 2143 2259 -2312 2255 2368 -2331 2586 2593 -2353 2254 2255 -2358 2368 2369 -2361 2513 2520 -2363 2916 2917 -2370 2253 2255 -2374 2253 2260 -2374 2917 2923 -2393 2110 2226 -2398 2513 2625 -2301 4762 4763 -2303 4903 4904 -2306 4344 4443 -2310 4340 4445 -2310 5629 5636 -2313 4332 4334 -2324 4460 4564 -2326 4334 4439 -2326 5141 5254 -2329 4683 4690 -2334 4768 4769 -2340 4899 4900 -2345 4328 4329 -2347 4568 4677 -2347 4657 4762 -2348 4897 4902 -2357 4775 4882 -2368 4460 4566 -2369 5638 5645 -2371 4460 4563 -2375 4897 4898 -2376 4679 4682 -2376 4676 4786 -2378 4779 4781 -2386 4465 4570 -2386 4664 4774 -2394 4327 4328 -2397 4465 4569 -2398 691 4328 -2399 4449 4454 -2302 5752 5755 -2303 6097 6102 -2306 5752 5754 -2306 6090 6207 -2309 5747 5754 -2310 5629 5636 -2310 6222 6225 -2310 6233 6349 -2313 6345 6458 -2315 6006 6125 -2315 6090 6208 -2316 6345 6350 -2319 6224 6228 -2323 5645 5759 -2323 5757 5878 -2324 6094 6096 -2325 6653 6654 -2328 6090 6091 -2330 6102 6219 -2341 5976 6095 -2343 6334 6335 -2348 5752 5753 -2350 5765 5766 -2352 6219 6220 -2353 6348 6350 -2355 6348 6349 -2359 5755 5758 -2362 6457 6458 -2365 5755 5757 -2365 6234 6349 -2366 6340 6341 -2367 6457 6459 -2369 5638 5645 -2370 6224 6340 -2376 6234 6239 -2379 5884 5885 -2386 6096 6097 -2391 6340 6342 -2396 6237 6239 -2397 5640 5645 -2409 1080 1193 -2426 1079 1084 -2433 1121 1123 -2434 1079 1087 -2437 4650 4651 -2451 1413 1529 -2461 1192 1301 -2469 1079 1086 -2469 1641 1647 -2476 1412 1419 -2494 1354 4994 -2496 968 975 -2422 2917 3018 -2425 2474 2475 -2426 2254 2369 -2459 2253 2369 -2467 2368 2370 -2467 2513 2514 -2473 2233 2342 -2486 2365 2370 -2404 4774 4779 -2412 4782 4785 -2413 4460 4569 -2421 4897 4904 -2425 4346 4443 -2426 4466 4570 -2427 5525 5638 -2429 4776 4779 -2434 4779 4782 -2437 4650 4651 -2437 4663 4774 -2440 4327 4431 -2443 4340 4443 -2447 5635 5642 -2448 4768 4770 -2449 4683 4684 -2452 4684 4685 -2455 5635 5640 -2459 4466 4572 -2461 4460 4561 -2464 4773 4779 -2465 4683 4688 -2471 4768 4775 -2477 4664 4773 -2478 4778 4779 -2481 4466 4569 -2485 4663 4773 -2489 4658 4664 -2491 4334 4431 -2492 4663 4664 -2493 4340 4437 -2493 4544 4653 -2494 4462 4569 -2497 4682 4685 -2500 4658 4773 -2405 6218 6328 -2406 6228 6342 -2408 6237 6238 -2408 6345 6463 -2409 6220 6222 -2423 6097 6214 -2423 6121 6238 -2424 6121 6126 -2426 6348 6463 -2438 5766 5767 -2438 6340 6345 -2441 5876 5883 -2442 5976 5977 -2444 6457 6463 -2447 5635 5642 -2455 5635 5640 -2462 6089 6094 -2469 5636 5637 -2472 6455 6456 -2477 5633 5753 -2480 6234 6354 -2485 6228 6345 -2485 6340 6347 -2487 6005 6010 -2490 6124 6126 -2520 1123 1126 -2553 1187 1194 -2561 1010 4538 -2569 1188 1194 -2579 1010 4649 -2588 1301 1303 -2589 1015 4648 -2589 1188 1301 -2591 1302 1418 -2600 978 1087 -2502 2476 2479 -2507 2475 2476 -2519 2476 2588 -2530 2473 2475 -2534 2025 2032 -2537 2365 2477 -2543 2469 2580 -2549 2030 2032 -2557 2473 2580 -2558 2476 2477 -2572 2027 2032 -2575 3018 3020 -2578 2473 2588 -2579 2607 2613 -2584 2032 2142 -2590 2580 2582 -2593 2476 2478 -2503 4567 4569 -2507 4456 4563 -2508 4334 4437 -2512 4462 4567 -2512 4661 4663 -2515 4570 4575 -2516 4771 4779 -2517 4567 4570 -2519 4663 4768 -2519 4664 4771 -2520 4657 4767 -2522 4462 4568 -2524 4561 4569 -2524 4685 4688 -2524 4777 4782 -2531 4767 4769 -2531 4777 4778 -2532 4572 4575 -2537 4660 4664 -2544 4575 4577 -2547 4658 4768 -2552 4657 4768 -2554 4567 4572 -2556 4454 4456 -2556 4658 4661 -2561 1010 4538 -2564 4685 4687 -2569 4660 4773 -2571 4676 4681 -2585 4666 4778 -2589 4666 4771 -2596 4658 4767 -2598 4686 4688 -2599 4780 4786 -2501 6005 6007 -2505 5876 5881 -2507 5882 5883 -2517 5886 5887 -2518 6124 6125 -2519 6006 6007 -2520 6348 6354 -2524 5761 5878 -2524 5876 5878 -2541 5976 6094 -2546 6348 6351 -2554 5742 5861 -2555 6237 6240 -2557 5883 5884 -2568 5742 5743 -2570 5753 5755 -2573 5767 5885 -2575 6347 6348 -2578 6004 6007 -2581 5887 5892 -2583 5881 5884 -2583 6446 6447 -2599 6001 6007 -2605 1096 1208 -2613 1015 1121 -2615 1101 1208 -2628 1015 4761 -2628 1093 1095 -2646 1908 1915 -2654 1240 4877 -2659 1301 1302 -2667 1301 1418 -2688 1295 1301 -2696 1085 1088 -2607 2254 2370 -2617 2469 2582 -2619 2613 2614 -2621 2581 2582 -2646 1908 1915 -2655 2473 2478 -2655 2615 2724 -2662 1909 1915 -2665 2473 2583 -2676 2582 2585 -2685 2364 2477 -2690 1915 2025 -2700 2363 2370 -2611 4655 4767 -2616 4572 4577 -2616 4679 4685 -2620 4449 4450 -2624 4683 4691 -2626 5522 5641 -2628 1015 4761 -2636 4576 4577 -2644 4455 4561 -2644 4570 4577 -2649 4680 4685 -2662 4462 4561 -2670 4573 4580 -2675 4652 4657 -2677 5521 5528 -2679 4658 4765 -2683 4659 4660 -2692 4686 4693 -2694 4675 4786 -2601 6124 6243 -2602 5885 5887 -2604 6124 6127 -2606 6121 6243 -2618 6457 6460 -2619 5887 6010 -2619 5889 6002 -2619 6085 6088 -2626 5522 5641 -2626 5755 5760 -2637 6345 6347 -2641 5753 5873 -2641 5760 5878 -2645 5883 5887 -2648 5753 5754 -2648 5887 6002 -2654 5767 5772 -2656 5887 5890 -2660 5887 5893 -2661 5767 5890 -2663 5765 5772 -2667 6102 6214 -2669 5887 6004 -2687 5651 5771 -2688 5761 5879 -2689 5760 5873 -2717 871 878 -2730 1352 4992 -2738 1015 4649 -2744 901 4538 -2752 906 4538 -2762 1012 4649 -2763 906 4649 -2768 1087 1088 -2769 1015 4651 -2797 1013 4649 -2797 1125 1126 -2704 2025 2030 -2705 1910 2030 -2710 1910 1915 -2745 2027 2030 -2750 1915 2030 -2751 2022 2030 -2752 2473 2582 -2762 2604 2605 -2718 4660 4661 -2720 4572 4574 -2720 4692 4693 -2722 4572 4685 -2723 4456 4555 -2727 4679 4681 -2728 4677 4685 -2736 4456 4561 -2739 4691 4693 -2744 901 4538 -2749 4567 4568 -2749 4688 4691 -2750 4674 4681 -2752 906 4538 -2753 4679 4680 -2756 4555 4561 -2784 4692 4694 -2785 4690 4691 -2791 4691 4694 -2705 6095 6096 -2712 6220 6221 -2715 5889 6010 -2719 5879 5884 -2723 6089 6096 -2723 6096 6102 -2724 5884 5886 -2725 5766 5879 -2737 6214 6220 -2740 6007 6124 -2745 5760 5879 -2752 5889 6008 -2756 6003 6007 -2763 5895 6008 -2763 6122 6124 -2765 6002 6007 -2780 6002 6010 -2799 5893 6008 -2817 901 4432 -2818 1013 1015 -2819 1013 4651 -2820 1238 4875 -2827 1124 4761 -2832 1124 1126 -2832 1126 1238 -2833 4541 4649 -2837 901 4539 -2839 1088 1090 -2847 1012 1013 -2849 906 4539 -2852 1238 4877 -2858 1352 4877 -2872 1238 4763 -2872 1352 4994 -2808 3012 3019 -2812 2471 2478 -2848 3020 3023 -2849 2472 2582 -2854 3019 3020 -2880 3017 3019 -2810 4692 4699 -2814 4677 4683 -2817 901 4432 -2823 4698 4699 -2827 1124 4761 -2832 4694 4697 -2833 4541 4649 -2835 4697 4699 -2848 4574 4677 -2865 4689 4694 -2868 4658 4660 -2873 4705 4810 -2885 4689 4690 -2898 4699 4700 -2811 5893 6010 -2813 5893 6013 -2818 6014 6015 -2842 6002 6009 -2847 5766 5886 -2868 5887 6005 -2870 6003 6122 -2881 6008 6016 -2908 794 4432 -2911 971 976 -2938 1124 4763 -2940 971 978 -2946 869 971 -2958 799 4432 -2969 869 978 -2982 869 976 -2988 794 4431 -2990 799 4539 -2901 2620 2724 -2918 2724 2729 -2934 2472 2583 -2903 4680 4682 -2904 4700 4810 -2906 4689 4696 -2908 794 4432 -2921 4571 4680 -2942 4700 4809 -2958 799 4432 -2966 4680 4687 -2980 4810 4815 -2984 4653 4660 -2988 794 4431 -2990 4572 4680 -2902 5892 6012 -2904 5904 6023 -2907 6015 6016 -2913 5892 6010 -2918 6235 6238 -2922 6123 6127 -2928 6013 6016 -2928 6304 6305 -2929 6017 6024 -2937 6122 6123 -2949 5893 6011 -2950 6002 6122 -2957 6123 6243 -2960 6021 6134 -2973 5892 6011 -2974 6235 6243 -2980 6014 6019 -2983 5891 6011 -2984 5892 5898 -2995 5892 5893 -2995 5898 6011 -2999 6455 6463 -3000 6347 6455 -3014 794 4328 -3039 794 4433 -3073 696 4328 -3090 1353 4994 -3092 906 4541 -3021 2724 2731 -3040 2692 2799 -3014 794 4328 -3021 4654 4765 -3039 794 4433 -3039 4816 4817 -3054 4817 4823 -3073 696 4328 -3075 4650 4652 -3079 4654 4658 -3080 4696 4697 -3092 906 4541 -3002 5891 5898 -3004 6235 6240 -3005 5893 6016 -3006 5891 5892 -3010 5893 5898 -3021 6011 6016 -3025 6016 6018 -3027 6016 6019 -3028 5778 5891 -3028 5885 5891 -3029 6236 6240 -3030 5890 5892 -3030 6454 6459 -3040 6236 6354 -3045 5885 5890 -3052 5896 5898 -3052 6235 6241 -3058 6346 6354 -3068 5772 5885 -3071 6235 6242 -3075 6123 6241 -3075 6346 6351 -3083 6346 6347 -3093 5896 5897 -3096 6455 6460 -3107 904 4539 -3112 799 4433 -3116 906 1013 -3158 1090 1095 -3161 866 968 -3171 1088 1095 -3191 1088 1089 -3141 2729 2731 -3107 4652 4655 -3112 799 4433 -3164 4653 4654 -3188 4654 4655 -3102 5778 5897 -3106 5895 6016 -3118 6346 6352 -3120 6454 6566 -3132 6236 6352 -3135 6089 6091 -3141 6453 6454 -3150 5896 5899 -3155 6445 6447 -3157 6454 6571 -3170 6451 6565 -3184 6448 6560 -3187 5777 5784 -3198 6019 6021 -3213 1013 4650 -3225 1095 1207 -3233 1301 1308 -3213 1013 4650 -3202 6448 6565 -3206 6456 6460 -3209 6454 6565 -3213 6447 6560 -3227 6456 6462 -3233 6456 6571 -3243 6304 6306 -3245 5895 5899 -3246 6561 6671 -3250 6554 6560 -3251 6450 6565 -3267 6559 6560 -3271 6455 6462 -3273 5895 6014 -3278 6557 6560 -3284 6560 6561 -3290 6559 6562 -3294 6557 6565 -3297 6561 6562 -3371 4649 4651 -3383 4649 4652 -3394 1095 1202 -3325 2934 2941 -3337 2935 3036 -3340 2836 2940 -3345 2513 2515 -3327 4680 4681 -3338 4695 4702 -3363 4697 4700 -3369 4695 4696 -3371 5381 5500 -3383 4649 4652 -3305 6557 6562 -3311 6564 6565 -3313 6561 6670 -3316 6450 6557 -3320 6563 6564 -3326 6557 6564 -3327 6345 6348 -3329 6563 6565 -3333 6563 6571 -3334 5894 5899 -3334 6558 6562 -3336 6561 6665 -3353 6346 6461 -3355 6563 6568 -3357 6346 6353 -3363 6555 6665 -3367 6456 6569 -3368 6558 6564 -3379 5894 5901 -3382 6556 6665 -3464 696 4433 -3489 1302 1412 -3414 3029 3032 -3424 2728 2837 -3425 3029 3034 -3432 3125 3130 -3435 3130 3132 -3408 5381 5387 -3421 4680 4792 -3427 5379 5382 -3431 4695 4700 -3460 5381 5382 -3464 696 4433 -3482 5380 5381 -3494 5379 5380 -3417 6555 6666 -3418 6556 6670 -3466 6222 6227 -3476 6563 6570 -3477 6664 6665 -3489 6343 6345 -3500 6552 6662 -3508 1295 1412 -3509 1300 1302 -3529 1085 1093 -3531 799 4435 -3542 797 4433 -3546 975 1085 -3569 979 1085 -3512 3131 3133 -3527 3127 3130 -3574 2836 2840 -3583 2940 2942 -3590 2834 2837 -3524 4698 4700 -3528 5262 5379 -3531 799 4435 -3537 5261 5380 -3542 797 4433 -3544 5261 5381 -3549 4702 4703 -3552 5261 5379 -3560 4700 4703 -3563 4592 4701 -3581 4701 4703 -3595 4592 4598 -3598 4703 4706 -3505 6342 6343 -3515 5781 5900 -3518 6227 6342 -3521 6651 6752 -3526 6343 6344 -3528 5894 5902 -3528 6659 6666 -3540 5781 5902 -3540 6664 6666 -3555 6664 6667 -3560 6659 6660 -3561 5779 5902 -3561 6661 6666 -3563 6660 6666 -3577 6658 6660 -3585 5780 5787 -3588 6758 6759 -3598 6558 6670 -3601 1302 1303 -3608 3030 3037 -3623 2836 2837 -3625 2939 2941 -3625 2941 3036 -3642 2941 2942 -3653 2840 2942 -3663 2941 3044 -3676 3037 3134 -3680 3049 3140 -3685 3042 3043 -3687 2942 2945 -3611 4591 4598 -3618 4698 4705 -3630 4596 4701 -3639 4596 4598 -3646 4596 4706 -3674 4703 4705 -3676 4596 4709 -3694 4492 4591 -3602 5779 5897 -3606 5781 5785 -3614 6662 6664 -3615 6655 6660 -3617 6556 6662 -3623 5780 5785 -3632 6659 6661 -3642 5780 5786 -3647 5666 5786 -3647 6558 6668 -3655 5782 5785 -3665 5672 5786 -3673 5779 5784 -3691 5780 5788 -3694 5666 5788 -3696 5672 5792 -3702 1013 4541 -3739 3146 3147 -3748 3042 3044 -3755 3147 3240 -3771 3036 3038 -3775 3047 3049 -3781 2739 6420 -3787 3031 3128 -3796 2942 2943 -3702 1013 4541 -3711 4704 4706 -3713 4591 4599 -3721 4485 4492 -3737 4490 4492 -3748 4704 4709 -3771 4490 4599 -3774 4596 4599 -3776 4388 4492 -3782 4594 4599 -3785 4388 4491 -3800 4704 4711 -3701 5670 5786 -3718 5664 5788 -3722 6305 6419 -3726 5782 5784 -3726 6227 6337 -3737 5672 5794 -3748 6661 6667 -3750 5670 5788 -3769 6305 6309 -3775 5783 5785 -3781 2739 6420 -3797 5672 5676 -3810 2832 2837 -3815 3140 3148 -3817 2740 2847 -3822 3147 3151 -3824 2945 3044 -3834 3044 3050 -3836 3042 3047 -3839 3235 3322 -3844 3047 3050 -3845 3234 3241 -3849 3047 3148 -3850 3044 3047 -3852 3042 3050 -3852 3147 3148 -3853 3042 3049 -3853 3047 3052 -3855 3045 3050 -3856 3043 3047 -3857 2944 2945 -3857 3045 3047 -3858 2945 3042 -3858 3050 3052 -3863 2945 3045 -3865 3145 3148 -3866 3143 3148 -3874 2941 2947 -3875 2943 2944 -3879 2944 2950 -3880 2947 3042 -3880 3051 3052 -3887 2941 2945 -3889 2940 2941 -3892 3052 3053 -3895 2950 3045 -3895 3234 3242 -3898 3147 3242 -3801 4596 4601 -3803 4492 4493 -3803 4495 4599 -3820 4491 4493 -3822 4594 4601 -3827 5671 5676 -3829 4493 4496 -3850 5673 5794 -3856 4392 4491 -3858 4601 4704 -3863 4495 4496 -3865 4704 4710 -3871 4387 4394 -3886 4392 4394 -3890 5677 5684 -3897 4493 4499 -3812 5678 5792 -3813 5669 5788 -3816 6306 6309 -3818 5783 5788 -3824 5663 5784 -3827 5671 5676 -3839 5678 5798 -3843 5670 5794 -3843 5783 5784 -3850 5673 5794 -3864 5676 5792 -3864 5678 5800 -3878 5676 5678 -3880 5678 5682 -3881 5670 5789 -3890 5677 5684 -3891 5676 5794 -3933 1295 1302 -3987 859 860 -3904 2838 2839 -3909 3145 3242 -3912 2839 2840 -3914 3145 3150 -3914 3239 3241 -3919 3239 3242 -3922 2837 2839 -3922 3143 3149 -3923 3237 3242 -3937 3150 3237 -3944 3052 3143 -3944 3143 3150 -3951 3322 3324 -3952 2839 2943 -3952 3322 3323 -3956 3145 3237 -3957 3239 3322 -3965 3239 3330 -3973 3242 3244 -3982 3323 3404 -3987 2726 2731 -3988 3046 3052 -3991 3239 3244 -3992 3322 3327 -3993 2731 2832 -3994 3052 3149 -3996 3045 3052 -3996 3322 3325 -3999 3052 3148 -3901 4392 4499 -3903 5677 5682 -3909 4495 4600 -3925 4494 4496 -3931 5683 5684 -3953 4295 4393 -3961 4494 4499 -3964 5684 5685 -3973 5679 5682 -3973 5562 5682 -3981 4394 4395 -3991 4494 4501 -3991 5682 5685 -3992 5683 5690 -3996 4393 4395 -3903 5677 5682 -3905 5676 5797 -3908 5783 5790 -3914 5676 5800 -3921 5675 5794 -3930 5676 5795 -3931 5683 5684 -3939 6558 6669 -3940 6558 6662 -3941 5783 5789 -3948 6661 6664 -3949 6647 6654 -3954 5676 5681 -3964 5684 5685 -3971 6663 6664 -3973 5562 5682 -3973 5679 5682 -3973 6658 6661 -3977 5669 5789 -3988 6468 6575 -3989 6656 6663 -3991 5682 5685 -3992 5683 5690 -4007 2923 3026 -4010 3327 3329 -4011 3327 3330 -4012 2923 3025 -4014 3404 3405 -4020 2923 3018 -4025 3237 3244 -4033 3325 3330 -4040 3238 3244 -4044 3404 3406 -4048 3013 3110 -4053 3244 3325 -4063 3323 3327 -4012 4395 4398 -4016 4394 4397 -4019 5683 5688 -4023 4397 4499 -4034 5570 5689 -4044 4294 4301 -4053 4397 4398 -4062 5568 5688 -4065 5685 5688 -4082 4299 4393 -4094 4397 4500 -4019 5683 5688 -4028 6569 6570 -4029 6661 6663 -4045 6569 6680 -4053 6019 6022 -4055 6581 6582 -4055 6663 6764 -4062 5568 5688 -4062 6569 6571 -4062 6576 6680 -4065 5685 5688 -4068 5675 5789 -4082 6021 6142 -4084 6570 6574 -4085 6569 6574 -4096 5680 5682 -4097 6680 6688 -4099 6574 6680 -4128 696 4331 -4141 797 4331 -4150 797 4435 -4102 3327 3404 -4105 3024 3026 -4112 3327 3412 -4117 3405 3480 -4119 3405 3409 -4121 3406 3412 -4133 3404 3409 -4154 3024 3029 -4158 3474 3481 -4161 3406 3409 -4168 2508 2613 -4170 3327 3332 -4198 3029 3031 -4102 4299 4301 -4124 4299 4401 -4147 4207 4300 -4147 5576 5689 -4148 5683 5691 -4149 5679 5681 -4150 797 4435 -4151 5574 5689 -4153 4396 4398 -4154 5570 5691 -4158 4331 4433 -4163 5685 5687 -4164 4294 4302 -4166 4331 4435 -4167 4331 4332 -4174 5568 5691 -4182 4331 4434 -4197 5574 5691 -4106 5675 5795 -4108 6574 6682 -4112 6680 6683 -4115 6017 6019 -4117 6022 6142 -4117 6021 6140 -4117 6680 6685 -4119 6570 6680 -4120 6680 6682 -4123 6027 6140 -4123 6570 6571 -4130 6764 6771 -4132 6460 6571 -4135 6674 6680 -4136 6568 6571 -4137 6681 6788 -4138 6681 6685 -4140 6025 6140 -4142 6687 6788 -4147 5576 5689 -4148 5683 5691 -4149 5679 5681 -4151 5574 5689 -4151 6680 6681 -4154 5570 5691 -4163 5685 5687 -4165 6025 6142 -4166 6685 6687 -4168 6685 6688 -4174 5568 5691 -4174 6146 6147 -4176 6080 6199 -4176 6661 6772 -4180 6764 6772 -4182 6140 6148 -4183 6573 6574 -4187 6794 6795 -4189 6687 6795 -4190 6019 6024 -4195 6147 6148 -4197 5574 5691 -4201 962 969 -4210 1440 1555 -4204 3029 3130 -4209 3325 3332 -4227 3133 3138 -4239 3130 3133 -4253 3024 3025 -4271 3405 3482 -4282 3327 3407 -4290 3474 3482 -4238 5576 5695 -4246 5674 5681 -4259 5582 5695 -4275 5576 5697 -4294 5574 5694 -4299 5574 5697 -4211 6788 6796 -4214 6687 6796 -4219 6146 6265 -4220 6571 6573 -4226 6566 6571 -4232 6024 6142 -4233 6682 6683 -4237 6795 6799 -4238 5576 5695 -4241 6794 6899 -4242 6794 6796 -4245 6147 6151 -4246 5674 5681 -4249 6795 6899 -4254 6017 6018 -4258 6145 6148 -4259 5582 5695 -4266 6691 6796 -4275 5576 5697 -4278 6153 6265 -4286 6683 6684 -4287 6899 6900 -4291 6899 6901 -4294 5574 5694 -4296 6142 6143 -4296 6151 6265 -4299 5574 5697 -4300 6683 6685 -4301 3138 3230 -4302 3129 3130 -4306 3122 3130 -4317 3133 3136 -4345 3406 3407 -4352 3406 3482 -4364 3403 3482 -4370 3231 3232 -4302 4206 4213 -4308 4299 4302 -4309 5582 5701 -4339 4396 4401 -4340 4301 4302 -4349 5580 5695 -4384 4300 4302 -4388 4301 4304 -4390 5582 5703 -4305 6151 6267 -4306 6796 6799 -4306 6799 6901 -4326 6271 6272 -4328 6024 6137 -4337 6899 6904 -4337 6906 7000 -4341 6265 6273 -4349 5580 5695 -4360 6573 6683 -4360 6685 6690 -4363 6272 6273 -4365 6143 6145 -4368 6796 6797 -4368 6904 6906 -4369 5680 5681 -4375 5680 5687 -4397 6690 6796 -4405 3128 3133 -4408 3479 3481 -4411 3475 3543 -4455 3326 3332 -4457 3479 3482 -4458 3138 3231 -4476 3481 3543 -4497 3408 3409 -4408 5685 5686 -4431 5573 5691 -4433 5568 5686 -4447 5580 5697 -4472 4302 4305 -4474 5586 5701 -4477 5574 5692 -4479 4302 4308 -4480 5580 5700 -4408 5685 5686 -4416 6661 6767 -4417 7006 7007 -4425 6278 6388 -4431 5573 5691 -4433 5568 5686 -4434 6145 6150 -4434 6904 6907 -4439 6904 6910 -4442 6150 6267 -4443 6453 6459 -4445 6272 6276 -4447 5580 5697 -4451 5686 5688 -4452 5686 5691 -4456 6798 6799 -4464 6143 6144 -4465 6276 6388 -4465 7000 7008 -4467 6459 6566 -4470 6572 6573 -4470 6904 7008 -4474 6901 6902 -4475 7000 7007 -4477 7007 7097 -4480 5580 5700 -4480 6270 6273 -4485 6904 6909 -4487 6265 6268 -4489 5686 5687 -4492 6902 6904 -4500 7005 7007 -4502 3326 3407 -4508 3144 3237 -4518 3408 3483 -4524 3128 3129 -4533 3031 3122 -4534 3144 3231 -4550 3479 3551 -4559 3139 3231 -4566 3139 3230 -4567 3407 3408 -4567 3408 3482 -4568 3144 3236 -4573 3477 3482 -4596 3479 3543 -4598 3142 3236 -4507 4211 4300 -4530 4211 4213 -4535 5580 5703 -4555 5586 5703 -4568 4304 4401 -4585 5586 5707 -4586 4211 4308 -4511 7005 7008 -4512 6267 6268 -4519 6276 6390 -4521 7003 7008 -4526 7097 7105 -4536 7005 7105 -4545 6690 6791 -4547 7097 7104 -4553 7103 7104 -4554 7102 7105 -4556 6660 6661 -4563 6268 6270 -4564 6797 6798 -4572 6798 6902 -4572 7104 7188 -4574 7102 7104 -4580 6150 6262 -4587 5686 5693 -4595 6902 6903 -4598 7194 7195 -4627 904 4541 -4660 904 4435 -4667 1413 1523 -4672 962 963 -4691 854 963 -4699 962 967 -4609 3145 3236 -4610 3543 3545 -4618 3139 3236 -4618 3537 3544 -4641 3133 3135 -4645 3139 3228 -4663 3479 3484 -4667 3141 3236 -4667 3544 3545 -4676 3135 3139 -4686 3477 3484 -4606 4327 4334 -4627 904 4541 -4636 4235 4327 -4645 5572 5692 -4655 4327 4335 -4660 904 4435 -4667 4213 4214 -4692 5573 5692 -4616 6394 6395 -4635 7188 7196 -4647 7005 7010 -4653 7102 7196 -4657 7100 7105 -4669 6388 6396 -4674 6903 6909 -4674 7188 7195 -4688 6909 7003 -4699 7003 7010 -4711 967 970 -4718 1406 1407 -4735 854 956 -4742 963 964 -4746 848 854 -4754 956 964 -4762 852 956 -4765 961 964 -4770 964 967 -4788 964 966 -4790 965 967 -4710 3542 3544 -4720 3545 3548 -4730 3135 3136 -4733 3544 3597 -4743 3141 3228 -4746 3234 3236 -4766 3134 3135 -4766 3546 3551 -4789 3545 3605 -4794 3484 3546 -4706 4141 4228 -4708 5579 5697 -4711 5579 5692 -4721 4233 4235 -4723 4228 4235 -4739 4233 4335 -4744 4228 4236 -4763 4134 4141 -4776 4233 4236 -4776 5585 5703 -4779 4139 4141 -4789 4330 4335 -4708 5579 5697 -4710 6395 6396 -4710 7102 7107 -4755 7193 7196 -4767 7189 7273 -4768 7191 7196 -4780 7195 7196 -4782 7201 7279 -4792 6270 6275 -4801 959 964 -4806 848 950 -4807 965 966 -4813 848 956 -4825 848 958 -4832 852 854 -4833 852 964 -4840 852 958 -4858 846 848 -4888 841 846 -4891 841 842 -4895 852 959 -4898 959 965 -4802 3234 3235 -4804 3597 3604 -4807 3546 3548 -4808 3546 3553 -4828 3598 3604 -4831 3128 3135 -4831 3597 3605 -4836 3542 3605 -4841 3234 3239 -4851 3547 3548 -4857 3542 3602 -4859 3547 3605 -4864 3602 3604 -4872 3600 3605 -4873 3597 3602 -4879 3604 3645 -4883 3602 3605 -4900 3645 3652 -4807 4053 4134 -4808 4139 4236 -4828 5698 5703 -4839 4134 4142 -4840 4233 4238 -4884 5585 5704 -4892 4231 4236 -4896 4238 4330 -4802 5697 5698 -4808 6275 6390 -4809 6393 6396 -4809 7193 7199 -4809 7195 7199 -4811 7196 7198 -4828 5698 5703 -4829 7199 7281 -4830 7010 7100 -4833 7285 7286 -4836 6269 6275 -4844 6268 6269 -4845 6150 6269 -4857 7107 7191 -4867 7199 7279 -4873 7279 7287 -4876 5698 5700 -4883 7198 7199 -4884 5585 5704 -4896 6395 6399 -4899 7286 7287 -4904 857 959 -4906 851 852 -4908 850 959 -4910 846 849 -4914 851 959 -4917 1758 1869 -4922 849 851 -4938 850 851 -4943 1758 1877 -4945 841 843 -4952 735 842 -4963 843 849 -4971 735 835 -4979 844 851 -4990 735 843 -4925 3645 3653 -4943 1758 1877 -4949 3602 3653 -4958 3605 3607 -4972 3646 3678 -4979 3645 3650 -4985 3602 3650 -4985 3646 3650 -4995 3647 3650 -4998 3645 3648 -4939 4231 4238 -4947 4139 4142 -4910 7100 7107 -4926 7284 7287 -4935 7286 7364 -4937 7199 7282 -4940 7286 7290 -4963 5698 5705 -4967 7364 7365 -4981 7364 7366 -4984 6275 6385 -4991 7282 7287 -5002 739 843 -5011 736 843 -5018 1752 1869 -5022 1756 1869 -5027 844 846 -5031 1752 1863 -5036 733 735 -5036 1752 1871 -5044 844 845 -5065 1756 1877 -5072 1746 1863 -5073 1756 1871 -5076 843 844 -5084 733 835 -5015 3646 3679 -5017 3602 3607 -5030 3547 3606 -5034 3600 3607 -5036 1752 1871 -5048 3675 3679 -5065 1756 1877 -5065 2336 2343 -5073 1756 1871 -5084 3602 3648 -5036 5586 5704 -5032 7371 7436 -5036 5586 5704 -5049 7290 7366 -5088 7364 7369 -5102 733 843 -5118 729 835 -5121 1750 1863 -5101 3648 3653 -5104 3648 3650 -5119 3644 3679 -5148 3649 3650 -5154 3648 3655 -5161 3649 3679 -5187 3607 3648 -5188 2227 2344 -5127 4396 4403 -5185 4299 4304 -5119 7287 7289 -5127 7369 7371 -5130 7191 7197 -5131 5698 5699 -5154 7436 7443 -5168 6655 6761 -5171 6390 6391 -5193 7369 7372 -5243 3677 3679 -5291 3649 3680 -5224 4304 4396 -5263 4125 4206 -5217 7197 7198 -5243 7289 7290 -5252 7204 7282 -5258 7369 7443 -5299 7289 7295 -5310 4206 4214 -5372 4118 4125 -5311 7366 7367 -5314 7288 7289 -5346 6766 6772 -5360 7367 7369 -5365 7369 7374 -5373 7289 7367 -5418 728 735 -5478 632 728 -5481 733 736 -5489 728 736 -5406 4123 4125 -5414 4304 4305 -5439 4118 4124 -5459 4304 4403 -5463 4211 4214 -5478 4208 4214 -5482 4042 4124 -5496 4123 4214 -5415 7441 7443 -5529 1761 1877 -5542 738 843 -5529 1761 1877 -5509 4123 4129 -5523 4118 4126 -5526 4123 4126 -5546 4302 4303 -5564 4304 4402 -5568 4042 4118 -5583 4211 4216 -5506 7439 7443 -5521 7367 7368 -5557 7374 7439 -5602 4211 4303 -5612 4209 4214 -5616 4041 4126 -5617 4297 4303 -5621 4042 4045 -5627 4123 4128 -5628 4042 4126 -5634 4210 4303 -5659 4043 4045 -5662 4303 4304 -5696 4043 4044 -5789 630 728 -5789 630 733 -5795 738 838 -5715 4121 4126 -5849 733 738 -5856 732 738 -5833 4209 4216 -5888 4044 4126 -5909 731 733 -5941 731 732 -5944 630 730 -5946 625 626 -5951 626 630 -5956 730 731 -5959 627 730 -5973 626 627 -5983 629 730 -5988 619 626 -5917 4121 4128 -6013 629 725 -6037 619 624 -6039 624 627 -6050 619 620 -6063 624 629 -6083 519 620 -6009 4044 4045 -6013 4044 4127 -6052 4128 4209 -6228 620 621 -6242 621 624 -6250 4046 4047 -6259 622 624 -6292 519 613 -6250 4046 4047 -6337 618 621 -6354 613 621 -6364 621 623 -6378 622 623 -6445 616 621 -6514 517 613 -6539 6275 6391 -6656 517 615 -6724 513 517 -6760 517 616 -6765 512 513 -6784 506 512 -6792 513 514 -6801 522 616 -6831 516 517 -6853 506 514 -6854 515 616 -6877 511 514 -6885 417 506 -6908 514 516 -6921 415 506 -6942 515 516 -6947 411 506 -6959 509 515 -6966 509 514 -7022 411 500 -7023 420 509 -7043 411 508 -7047 415 508 -7068 412 508 -7093 415 509 -7099 409 500 -7102 413 509 -7135 409 502 -7160 414 508 -7161 409 508 -7174 409 503 -7175 409 411 -7177 409 415 -7180 414 509 -7185 409 414 -7194 409 412 -7173 6274 6281 -7231 414 503 -7204 6280 6281 diff --git a/lib/gpu/lal_neighbor.cpp b/lib/gpu/lal_neighbor.cpp index 10816e2fa6..288415e0e7 100644 --- a/lib/gpu/lal_neighbor.cpp +++ b/lib/gpu/lal_neighbor.cpp @@ -586,8 +586,25 @@ void Neighbor::build_nbor_list(double **x, const int inum, const int host_inum, const int b2y=_block_cell_2d; const int g2x=static_cast(ceil(static_cast(_maxspecial)/b2x)); const int g2y=static_cast(ceil(static_cast(nt)/b2y)); - _shared->k_transpose.set_size(g2x,g2y,b2x,b2y); - _shared->k_transpose.run(&dev_special,&dev_special_t,&_maxspecial,&nt); + // the maximum number of blocks on the device is typically 65535 + // in principle we can use a lower number to have more resource per block 32768 + const int max_num_blocks = 65535; + int shift = 0; + if (g2y < max_num_blocks) { + _shared->k_transpose.set_size(g2x,g2y,b2x,b2y); + _shared->k_transpose.run(&dev_special,&dev_special_t,&_maxspecial,&nt,&shift); + } else { + // using a fixed number of blocks + int g2y_m = max_num_blocks; + _shared->k_transpose.set_size(g2x,g2y_m,b2x,b2y); + // number of chunks needed for the whole transpose + const int num_chunks = ceil(static_cast(g2y) / g2y_m); + for (int i = 0; i < num_chunks; i++) { + _shared->k_transpose.run(&dev_special,&dev_special_t,&_maxspecial,&nt,&shift); + shift += g2y_m*b2y; + } + } + time_transpose.stop(); } diff --git a/lib/gpu/lal_neighbor_gpu.cu b/lib/gpu/lal_neighbor_gpu.cu index a7506fc5c3..7d0941ccd5 100644 --- a/lib/gpu/lal_neighbor_gpu.cu +++ b/lib/gpu/lal_neighbor_gpu.cu @@ -147,7 +147,7 @@ __kernel void kernel_calc_cell_counts(const unsigned *restrict cell_id, __kernel void transpose(__global tagint *restrict out, const __global tagint *restrict in, - int columns_in, int rows_in) + int columns_in, int rows_in, int shift) { __local tagint block[BLOCK_CELL_2D][BLOCK_CELL_2D+1]; @@ -158,15 +158,15 @@ __kernel void transpose(__global tagint *restrict out, unsigned i=bi*BLOCK_CELL_2D+ti; unsigned j=bj*BLOCK_CELL_2D+tj; - if ((i @@ -29,7 +27,7 @@ namespace LAMMPS_NS { class Ndx2Group : public Command { public: - Ndx2Group(class LAMMPS *lmp) : Command(lmp){}; + Ndx2Group(class LAMMPS *lmp) : Command(lmp) {}; void command(int, char **) override; private: diff --git a/src/GPU/pair_amoeba_gpu.h b/src/GPU/pair_amoeba_gpu.h index c90339585b..3f5f89424c 100644 --- a/src/GPU/pair_amoeba_gpu.h +++ b/src/GPU/pair_amoeba_gpu.h @@ -64,8 +64,7 @@ class PairAmoebaGPU : public PairAmoeba { void udirect2b_cpu(); - template - void compute_force_from_torque(const numtyp*, double**, double*); + template void compute_force_from_torque(const numtyp *, double **, double *); }; } // namespace LAMMPS_NS diff --git a/src/GPU/pair_hippo_gpu.h b/src/GPU/pair_hippo_gpu.h index 5f36d6e71f..d00c490243 100644 --- a/src/GPU/pair_hippo_gpu.h +++ b/src/GPU/pair_hippo_gpu.h @@ -65,8 +65,7 @@ class PairHippoGPU : public PairAmoeba { void udirect2b_cpu(); - template - void compute_force_from_torque(const numtyp*, double**, double*); + template void compute_force_from_torque(const numtyp *, double **, double *); }; } // namespace LAMMPS_NS diff --git a/src/GRANULAR/pair_granular.h b/src/GRANULAR/pair_granular.h index 46c5570543..f94f4f5dff 100644 --- a/src/GRANULAR/pair_granular.h +++ b/src/GRANULAR/pair_granular.h @@ -75,7 +75,7 @@ class PairGranular : public Pair { // granular models int nmodels, maxmodels; - class Granular_NS::GranularModel** models_list; + class Granular_NS::GranularModel **models_list; int **types_indices; // optional user-specified global cutoff, per-type user-specified cutoffs diff --git a/src/INTERLAYER/pair_aip_water_2dm.h b/src/INTERLAYER/pair_aip_water_2dm.h index 295cdfffb9..91f9395214 100644 --- a/src/INTERLAYER/pair_aip_water_2dm.h +++ b/src/INTERLAYER/pair_aip_water_2dm.h @@ -30,7 +30,6 @@ class PairAIPWATER2DM : virtual public PairILPTMD { protected: void settings(int, char **) override; - }; } // namespace LAMMPS_NS diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.h b/src/INTERLAYER/pair_ilp_graphene_hbn.h index e151ecc801..5d5c1cce54 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.h +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.h @@ -39,7 +39,12 @@ class PairILPGrapheneHBN : public Pair { static constexpr int NPARAMS_PER_LINE = 13; - enum { ILP_GrhBN, ILP_TMD, SAIP_METAL, AIP_WATER_2DM }; // for telling class variants apart in shared code + enum { + ILP_GrhBN, + ILP_TMD, + SAIP_METAL, + AIP_WATER_2DM + }; // for telling class variants apart in shared code protected: int me; diff --git a/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp b/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp index 308df20c0e..c0b263d736 100644 --- a/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp +++ b/src/KOKKOS/fix_acks2_reaxff_kokkos.cpp @@ -53,7 +53,8 @@ FixACKS2ReaxFFKokkos(LAMMPS *lmp, int narg, char **arg) : datamask_read = X_MASK | V_MASK | F_MASK | MASK_MASK | Q_MASK | TYPE_MASK | TAG_MASK; datamask_modify = Q_MASK | X_MASK; - nmax = m_cap = 0; + nmax = 0; + m_cap_big = 0; allocated_flag = 0; nprev = 4; @@ -66,7 +67,7 @@ FixACKS2ReaxFFKokkos(LAMMPS *lmp, int narg, char **arg) : buf = new double[2*nprev]; prev_last_rows_rank = 0; - d_mfill_offset = typename AT::t_int_scalar("acks2/kk:mfill_offset"); + d_mfill_offset = typename AT::t_bigint_scalar("acks2/kk:mfill_offset"); } /* ---------------------------------------------------------------------- */ @@ -418,10 +419,10 @@ void FixACKS2ReaxFFKokkos::pre_force(int /*vflag*/) template KOKKOS_INLINE_FUNCTION -void FixACKS2ReaxFFKokkos::num_neigh_item(int ii, int &maxneigh) const +void FixACKS2ReaxFFKokkos::num_neigh_item(int ii, bigint &totneigh) const { const int i = d_ilist[ii]; - maxneigh += d_numneigh[i]; + totneigh += d_numneigh[i]; } /* ---------------------------------------------------------------------- */ @@ -433,39 +434,39 @@ void FixACKS2ReaxFFKokkos::allocate_matrix() // determine the total space for the H matrix - m_cap = 0; + m_cap_big = 0; // limit scope of functor to allow deallocation of views { FixACKS2ReaxFFKokkosNumNeighFunctor neigh_functor(this); - Kokkos::parallel_reduce(nn,neigh_functor,m_cap); + Kokkos::parallel_reduce(nn,neigh_functor,m_cap_big); } // deallocate first to reduce memory overhead - d_firstnbr = typename AT::t_int_1d(); + d_firstnbr = typename AT::t_bigint_1d(); d_numnbrs = typename AT::t_int_1d(); d_jlist = typename AT::t_int_1d(); d_val = typename AT::t_ffloat_1d(); - d_firstnbr_X = typename AT::t_int_1d(); + d_firstnbr_X = typename AT::t_bigint_1d(); d_numnbrs_X = typename AT::t_int_1d(); d_jlist_X = typename AT::t_int_1d(); d_val_X = typename AT::t_ffloat_1d(); // H matrix - d_firstnbr = typename AT::t_int_1d("acks2/kk:firstnbr",nmax); + d_firstnbr = typename AT::t_bigint_1d("acks2/kk:firstnbr",nmax); d_numnbrs = typename AT::t_int_1d("acks2/kk:numnbrs",nmax); - d_jlist = typename AT::t_int_1d("acks2/kk:jlist",m_cap); - d_val = typename AT::t_ffloat_1d("acks2/kk:val",m_cap); + d_jlist = typename AT::t_int_1d("acks2/kk:jlist",m_cap_big); + d_val = typename AT::t_ffloat_1d("acks2/kk:val",m_cap_big); // X matrix - d_firstnbr_X = typename AT::t_int_1d("acks2/kk:firstnbr_X",nmax); + d_firstnbr_X = typename AT::t_bigint_1d("acks2/kk:firstnbr_X",nmax); d_numnbrs_X = typename AT::t_int_1d("acks2/kk:numnbrs_X",nmax); - d_jlist_X = typename AT::t_int_1d("acks2/kk:jlist_X",m_cap); - d_val_X = typename AT::t_ffloat_1d("acks2/kk:val_X",m_cap); + d_jlist_X = typename AT::t_int_1d("acks2/kk:jlist_X",m_cap_big); + d_val_X = typename AT::t_ffloat_1d("acks2/kk:val_X",m_cap_big); } /* ---------------------------------------------------------------------- */ @@ -566,7 +567,7 @@ void FixACKS2ReaxFFKokkos::operator() (TagACKS2Zero, const int &ii) template template KOKKOS_INLINE_FUNCTION -void FixACKS2ReaxFFKokkos::compute_h_item(int ii, int &m_fill, const bool &final) const +void FixACKS2ReaxFFKokkos::compute_h_item(int ii, bigint &m_fill, const bool &final) const { const int i = d_ilist[ii]; int j,jj,jtype; @@ -619,7 +620,7 @@ void FixACKS2ReaxFFKokkos::compute_h_item(int ii, int &m_fill, const m_fill++; } if (final) - d_numnbrs[i] = m_fill - d_firstnbr[i]; + d_numnbrs[i] = int(m_fill - d_firstnbr[i]); } } @@ -698,9 +699,9 @@ void FixACKS2ReaxFFKokkos::compute_h_team( // calculate the global memory offset from where the H matrix values to be // calculated by the current team will be stored in d_val - int team_firstnbr_idx = 0; + bigint team_firstnbr_idx = 0; Kokkos::single(Kokkos::PerTeam(team), - [=](int &val) { + [=](bigint &val) { int totalnbrs = s_firstnbr[lastatom - firstatom - 1] + s_numnbrs[lastatom - firstatom - 1]; val = Kokkos::atomic_fetch_add(&d_mfill_offset(), totalnbrs); @@ -726,7 +727,7 @@ void FixACKS2ReaxFFKokkos::compute_h_team( int jnum = s_numnbrs[idx]; // calculate the write-offset for atom-i's first neighbor - int atomi_firstnbr_idx = team_firstnbr_idx + s_firstnbr[idx]; + bigint atomi_firstnbr_idx = team_firstnbr_idx + s_firstnbr[idx]; Kokkos::single(Kokkos::PerThread(team), [&]() { d_firstnbr[i] = atomi_firstnbr_idx; }); @@ -739,7 +740,7 @@ void FixACKS2ReaxFFKokkos::compute_h_team( // are processed in batches and the batch size is vector_length for (int jj_start = 0; jj_start < jnum; jj_start += vector_length) { - int atomi_nbr_writeIdx = atomi_firstnbr_idx + atomi_nbrs_inH; + bigint atomi_nbr_writeIdx = atomi_firstnbr_idx + atomi_nbrs_inH; // count the # of neighbor atoms with non-zero electrostatic // interaction coefficients with atom-i in the current batch @@ -782,7 +783,8 @@ void FixACKS2ReaxFFKokkos::compute_h_team( valid = false; if (x(j, 2) == ztmp && x(j, 1) < ytmp) valid = false; - if (x(j, 2) == ztmp && x(j, 1) == ytmp && x(j, 0) < xtmp) + if (x(j, 2) == ztmp && x(j, 1) == ytmp && + x(j, 0) < xtmp) valid = false; } } @@ -851,7 +853,7 @@ double FixACKS2ReaxFFKokkos::calculate_H_k(const F_FLOAT &r, const F taper = taper * r + d_tap[0]; denom = r * r * r + shld; - denom = pow(denom,1.0/3.0); + denom = cbrt(denom); return taper * EV_TO_KCAL_PER_MOL / denom; } @@ -861,7 +863,7 @@ double FixACKS2ReaxFFKokkos::calculate_H_k(const F_FLOAT &r, const F template template KOKKOS_INLINE_FUNCTION -void FixACKS2ReaxFFKokkos::compute_x_item(int ii, int &m_fill, const bool &final) const +void FixACKS2ReaxFFKokkos::compute_x_item(int ii, bigint &m_fill, const bool &final) const { // The X_diag array is duplicated for OpenMP, atomic for GPU, and neither for Serial auto v_X_diag = ScatterViewHelper,decltype(dup_X_diag),decltype(ndup_X_diag)>::get(dup_X_diag,ndup_X_diag); @@ -927,7 +929,7 @@ void FixACKS2ReaxFFKokkos::compute_x_item(int ii, int &m_fill, const } if (final) { a_X_diag[i] += tmp; - d_numnbrs_X[i] = m_fill - d_firstnbr_X[i]; + d_numnbrs_X[i] = int(m_fill - d_firstnbr_X[i]); } } } @@ -1005,9 +1007,9 @@ void FixACKS2ReaxFFKokkos::compute_x_team( // calculate the global memory offset from where the H matrix values to be // calculated by the current team will be stored in d_val_X - int team_firstnbr_idx = 0; + bigint team_firstnbr_idx = 0; Kokkos::single(Kokkos::PerTeam(team), - [=](int &val) { + [=](bigint &val) { int totalnbrs = s_firstnbr[lastatom - firstatom - 1] + s_numnbrs[lastatom - firstatom - 1]; val = Kokkos::atomic_fetch_add(&d_mfill_offset(), totalnbrs); @@ -1033,7 +1035,7 @@ void FixACKS2ReaxFFKokkos::compute_x_team( int jnum = s_numnbrs[idx]; // calculate the write-offset for atom-i's first neighbor - int atomi_firstnbr_idx = team_firstnbr_idx + s_firstnbr[idx]; + bigint atomi_firstnbr_idx = team_firstnbr_idx + s_firstnbr[idx]; Kokkos::single(Kokkos::PerThread(team), [&]() { d_firstnbr_X[i] = atomi_firstnbr_idx; }); @@ -1046,7 +1048,7 @@ void FixACKS2ReaxFFKokkos::compute_x_team( // are processed in batches and the batch size is vector_length for (int jj_start = 0; jj_start < jnum; jj_start += vector_length) { - int atomi_nbr_writeIdx = atomi_firstnbr_idx + atomi_nbrs_inH; + bigint atomi_nbr_writeIdx = atomi_firstnbr_idx + atomi_nbrs_inH; // count the # of neighbor atoms with non-zero electrostatic // interaction coefficients with atom-i in the current batch @@ -1464,7 +1466,7 @@ void FixACKS2ReaxFFKokkos::operator() (TagACKS2SparseMatvec3_Half::operator() (TagACKS2SparseMatvec3_Half::operator() (TagACKS2SparseMatvec3_Full, c F_FLOAT sum; F_FLOAT sum2; - Kokkos::parallel_reduce(Kokkos::TeamThreadRange(team, d_firstnbr[i], d_firstnbr[i] + d_numnbrs[i]), [&] (const int &jj, F_FLOAT &sum) { + Kokkos::parallel_reduce(Kokkos::TeamThreadRange(team, d_firstnbr[i], d_firstnbr[i] + d_numnbrs[i]), [&] (const bigint &jj, F_FLOAT &sum) { const int j = d_jlist(jj); sum += d_val(jj) * d_xx[j]; }, sum); team.team_barrier(); - Kokkos::parallel_reduce(Kokkos::TeamThreadRange(team, d_firstnbr_X[i], d_firstnbr_X[i] + d_numnbrs_X[i]), [&] (const int &jj, F_FLOAT &sum2) { + Kokkos::parallel_reduce(Kokkos::TeamThreadRange(team, d_firstnbr_X[i], d_firstnbr_X[i] + d_numnbrs_X[i]), [&] (const bigint &jj, F_FLOAT &sum2) { const int j = d_jlist_X(jj); sum2 += d_val_X(jj) * d_xx[NN + j]; }, sum2); @@ -1865,8 +1867,8 @@ double FixACKS2ReaxFFKokkos::memory_usage() bytes += nmax*4 * sizeof(double); // storage bytes += size*11 * sizeof(double); // storage bytes += n_cap*4 * sizeof(int); // matrix... - bytes += m_cap*2 * sizeof(int); - bytes += m_cap*2 * sizeof(double); + bytes += m_cap_big*2 * sizeof(int); + bytes += m_cap_big*2 * sizeof(double); return bytes; } diff --git a/src/KOKKOS/fix_acks2_reaxff_kokkos.h b/src/KOKKOS/fix_acks2_reaxff_kokkos.h index cb16b4cd24..6adca39d17 100644 --- a/src/KOKKOS/fix_acks2_reaxff_kokkos.h +++ b/src/KOKKOS/fix_acks2_reaxff_kokkos.h @@ -74,7 +74,7 @@ class FixACKS2ReaxFFKokkos : public FixACKS2ReaxFF, public KokkosBase { DAT::tdual_ffloat_1d get_s() {return k_s;} KOKKOS_INLINE_FUNCTION - void num_neigh_item(int, int&) const; + void num_neigh_item(int, bigint&) const; KOKKOS_INLINE_FUNCTION void operator()(TagACKS2Zero, const int&) const; @@ -84,7 +84,7 @@ class FixACKS2ReaxFFKokkos : public FixACKS2ReaxFF, public KokkosBase { template KOKKOS_INLINE_FUNCTION - void compute_h_item(int, int &, const bool &) const; + void compute_h_item(int, bigint &, const bool &) const; template KOKKOS_INLINE_FUNCTION @@ -92,7 +92,7 @@ class FixACKS2ReaxFFKokkos : public FixACKS2ReaxFF, public KokkosBase { template KOKKOS_INLINE_FUNCTION - void compute_x_item(int, int &, const bool &) const; + void compute_x_item(int, bigint &, const bool &) const; template KOKKOS_INLINE_FUNCTION @@ -173,8 +173,9 @@ class FixACKS2ReaxFFKokkos : public FixACKS2ReaxFF, public KokkosBase { int allocated_flag, last_allocate; int need_dup,prev_last_rows_rank; double* buf; + bigint m_cap_big; - typename AT::t_int_scalar d_mfill_offset; + typename AT::t_bigint_scalar d_mfill_offset; typedef Kokkos::DualView tdual_int_1d; Kokkos::DualView k_params; @@ -197,12 +198,12 @@ class FixACKS2ReaxFFKokkos : public FixACKS2ReaxFF, public KokkosBase { DAT::tdual_ffloat_2d k_bcut; typename AT::t_ffloat_2d d_bcut; - typename AT::t_int_1d d_firstnbr; + typename AT::t_bigint_1d d_firstnbr; typename AT::t_int_1d d_numnbrs; typename AT::t_int_1d d_jlist; typename AT::t_ffloat_1d d_val; - typename AT::t_int_1d d_firstnbr_X; + typename AT::t_bigint_1d d_firstnbr_X; typename AT::t_int_1d d_numnbrs_X; typename AT::t_int_1d d_jlist_X; typename AT::t_ffloat_1d d_val_X; @@ -264,21 +265,21 @@ class FixACKS2ReaxFFKokkos : public FixACKS2ReaxFF, public KokkosBase { template struct FixACKS2ReaxFFKokkosNumNeighFunctor { typedef DeviceType device_type; - typedef int value_type; + typedef bigint value_type; FixACKS2ReaxFFKokkos c; FixACKS2ReaxFFKokkosNumNeighFunctor(FixACKS2ReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION - void operator()(const int ii, int &maxneigh) const { - c.num_neigh_item(ii, maxneigh); + void operator()(const int ii, bigint &totneigh) const { + c.num_neigh_item(ii, totneigh); } }; template struct FixACKS2ReaxFFKokkosComputeHFunctor { int atoms_per_team, vector_length; - typedef int value_type; + typedef bigint value_type; typedef Kokkos::ScratchMemorySpace scratch_space; FixACKS2ReaxFFKokkos c; @@ -293,7 +294,7 @@ struct FixACKS2ReaxFFKokkosComputeHFunctor { }; KOKKOS_INLINE_FUNCTION - void operator()(const int ii, int &m_fill, const bool &final) const { + void operator()(const int ii, bigint &m_fill, const bool &final) const { c.template compute_h_item(ii,m_fill,final); } @@ -325,7 +326,7 @@ struct FixACKS2ReaxFFKokkosComputeHFunctor { template struct FixACKS2ReaxFFKokkosComputeXFunctor { int atoms_per_team, vector_length; - typedef int value_type; + typedef bigint value_type; typedef Kokkos::ScratchMemorySpace scratch_space; FixACKS2ReaxFFKokkos c; @@ -340,7 +341,7 @@ struct FixACKS2ReaxFFKokkosComputeXFunctor { }; KOKKOS_INLINE_FUNCTION - void operator()(const int ii, int &m_fill, const bool &final) const { + void operator()(const int ii, bigint &m_fill, const bool &final) const { c.template compute_x_item(ii,m_fill,final); } diff --git a/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp index 6527ed9314..f93f6cb70e 100644 --- a/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp @@ -62,7 +62,8 @@ FixQEqReaxFFKokkos(LAMMPS *lmp, int narg, char **arg) : datamask_read = X_MASK | V_MASK | F_MASK | Q_MASK | MASK_MASK | TYPE_MASK | TAG_MASK; datamask_modify = X_MASK; - nmax = m_cap = 0; + nmax = 0; + m_cap_big = 0; allocated_flag = 0; nprev = 4; maxexchange = nprev*2; @@ -71,7 +72,7 @@ FixQEqReaxFFKokkos(LAMMPS *lmp, int narg, char **arg) : memory->destroy(t_hist); grow_arrays(atom->nmax); - d_mfill_offset = typename AT::t_int_scalar("qeq/kk:mfill_offset"); + d_mfill_offset = typename AT::t_bigint_scalar("qeq/kk:mfill_offset"); converged = 0; } @@ -301,10 +302,10 @@ void FixQEqReaxFFKokkos::pre_force(int /*vflag*/) template KOKKOS_INLINE_FUNCTION -void FixQEqReaxFFKokkos::num_neigh_item(int ii, bigint &maxneigh) const +void FixQEqReaxFFKokkos::num_neigh_item(int ii, bigint &totneigh) const { const int i = d_ilist[ii]; - maxneigh += d_numneigh[i]; + totneigh += d_numneigh[i]; } /* ---------------------------------------------------------------------- */ @@ -316,28 +317,25 @@ void FixQEqReaxFFKokkos::allocate_matrix() // determine the total space for the H matrix - bigint m_cap_big = 0; + m_cap_big = 0; // limit scope of functor to allow deallocation of views { FixQEqReaxFFKokkosNumNeighFunctor neigh_functor(this); Kokkos::parallel_reduce(nn,neigh_functor,m_cap_big); } - if (m_cap_big > MAXSMALLINT) - error->one(FLERR,"Too many neighbors in fix qeq/reaxff"); - m_cap = m_cap_big; // deallocate first to reduce memory overhead - d_firstnbr = typename AT::t_int_1d(); + d_firstnbr = typename AT::t_bigint_1d(); d_numnbrs = typename AT::t_int_1d(); d_jlist = typename AT::t_int_1d(); d_val = typename AT::t_ffloat_1d(); - d_firstnbr = typename AT::t_int_1d("qeq/kk:firstnbr",nmax); + d_firstnbr = typename AT::t_bigint_1d("qeq/kk:firstnbr",nmax); d_numnbrs = typename AT::t_int_1d("qeq/kk:numnbrs",nmax); - d_jlist = typename AT::t_int_1d("qeq/kk:jlist",m_cap); - d_val = typename AT::t_ffloat_1d("qeq/kk:val",m_cap); + d_jlist = typename AT::t_int_1d("qeq/kk:jlist",m_cap_big); + d_val = typename AT::t_ffloat_1d("qeq/kk:val",m_cap_big); } /* ---------------------------------------------------------------------- */ @@ -408,7 +406,7 @@ void FixQEqReaxFFKokkos::operator()(TagQEqZero, const int &ii) const template template KOKKOS_INLINE_FUNCTION -void FixQEqReaxFFKokkos::compute_h_item(int ii, int &m_fill, const bool &final) const +void FixQEqReaxFFKokkos::compute_h_item(int ii, bigint &m_fill, const bool &final) const { const int i = d_ilist[ii]; int j,jj,jtype; @@ -461,7 +459,7 @@ void FixQEqReaxFFKokkos::compute_h_item(int ii, int &m_fill, const b m_fill++; } if (final) - d_numnbrs[i] = m_fill - d_firstnbr[i]; + d_numnbrs[i] = int(m_fill - d_firstnbr[i]); } } @@ -540,9 +538,9 @@ void FixQEqReaxFFKokkos::compute_h_team( // calculate the global memory offset from where the H matrix values to be // calculated by the current team will be stored in d_val - int team_firstnbr_idx = 0; + bigint team_firstnbr_idx = 0; Kokkos::single(Kokkos::PerTeam(team), - [=](int &val) { + [=](bigint &val) { int totalnbrs = s_firstnbr[lastatom - firstatom - 1] + s_numnbrs[lastatom - firstatom - 1]; val = Kokkos::atomic_fetch_add(&d_mfill_offset(), totalnbrs); @@ -568,7 +566,7 @@ void FixQEqReaxFFKokkos::compute_h_team( int jnum = s_numnbrs[idx]; // removed "const" to work around GCC 7 bug // calculate the write-offset for atom-i's first neighbor - int atomi_firstnbr_idx = team_firstnbr_idx + s_firstnbr[idx]; + bigint atomi_firstnbr_idx = team_firstnbr_idx + s_firstnbr[idx]; Kokkos::single(Kokkos::PerThread(team), [&]() { d_firstnbr[i] = atomi_firstnbr_idx; }); @@ -581,7 +579,7 @@ void FixQEqReaxFFKokkos::compute_h_team( // are processed in batches and the batch size is vector_length for (int jj_start = 0; jj_start < jnum; jj_start += vector_length) { - int atomi_nbr_writeIdx = atomi_firstnbr_idx + atomi_nbrs_inH; + bigint atomi_nbr_writeIdx = atomi_firstnbr_idx + atomi_nbrs_inH; // count the # of neighbor atoms with non-zero electrostatic // interaction coefficients with atom-i in the current batch @@ -938,7 +936,7 @@ void FixQEqReaxFFKokkos::operator()(TagQEqSparseMatvec2_Half::operator()(TagQEqSparseMatvec2_Full, const const int i = d_ilist[k]; if (mask[i] & groupbit) { F_FLOAT2 doitmp; - Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(team, d_firstnbr[i], d_firstnbr[i] + d_numnbrs[i]), [&] (const int &jj, F_FLOAT2& doi) { + Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(team, d_firstnbr[i], d_firstnbr[i] + d_numnbrs[i]), [&] (const bigint &jj, F_FLOAT2& doi) { const int j = d_jlist(jj); const auto d_val_jj = d_val(jj); if (!(converged & 1)) @@ -1289,8 +1287,8 @@ double FixQEqReaxFFKokkos::memory_usage() bytes = atom->nmax*nprev*2 * sizeof(F_FLOAT); // s_hist & t_hist bytes += (double)atom->nmax*8 * sizeof(F_FLOAT); // storage bytes += (double)n_cap*2 * sizeof(int); // matrix... - bytes += (double)m_cap * sizeof(int); - bytes += (double)m_cap * sizeof(F_FLOAT); + bytes += (double)m_cap_big * sizeof(int); + bytes += (double)m_cap_big * sizeof(F_FLOAT); return bytes; } diff --git a/src/KOKKOS/fix_qeq_reaxff_kokkos.h b/src/KOKKOS/fix_qeq_reaxff_kokkos.h index 4bc5f8385b..0733a518a2 100644 --- a/src/KOKKOS/fix_qeq_reaxff_kokkos.h +++ b/src/KOKKOS/fix_qeq_reaxff_kokkos.h @@ -80,7 +80,7 @@ class FixQEqReaxFFKokkos : public FixQEqReaxFF, public KokkosBase { template KOKKOS_INLINE_FUNCTION - void compute_h_item(int, int &, const bool &) const; + void compute_h_item(int, bigint &, const bool &) const; template KOKKOS_INLINE_FUNCTION @@ -201,8 +201,9 @@ class FixQEqReaxFFKokkos : public FixQEqReaxFF, public KokkosBase { int allocated_flag, last_allocate; int need_dup; int converged; + bigint m_cap_big; - typename AT::t_int_scalar d_mfill_offset; + typename AT::t_bigint_scalar d_mfill_offset; typedef Kokkos::DualView tdual_int_1d; Kokkos::DualView k_params; @@ -227,7 +228,7 @@ class FixQEqReaxFFKokkos : public FixQEqReaxFF, public KokkosBase { DAT::tdual_ffloat_1d k_tap; typename AT::t_ffloat_1d d_tap; - typename AT::t_int_1d d_firstnbr; + typename AT::t_bigint_1d d_firstnbr; typename AT::t_int_1d d_numnbrs; typename AT::t_int_1d d_jlist; typename AT::t_ffloat_1d d_val; @@ -296,15 +297,15 @@ struct FixQEqReaxFFKokkosNumNeighFunctor { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION - void operator()(const int ii, bigint &maxneigh) const { - c.num_neigh_item(ii, maxneigh); + void operator()(const int ii, bigint &totneigh) const { + c.num_neigh_item(ii, totneigh); } }; template struct FixQEqReaxFFKokkosComputeHFunctor { int atoms_per_team, vector_length; - typedef int value_type; + typedef bigint value_type; typedef Kokkos::ScratchMemorySpace scratch_space; FixQEqReaxFFKokkos c; @@ -319,7 +320,7 @@ struct FixQEqReaxFFKokkosComputeHFunctor { }; KOKKOS_INLINE_FUNCTION - void operator()(const int ii, int &m_fill, const bool &final) const { + void operator()(const int ii, bigint &m_fill, const bool &final) const { c.template compute_h_item(ii,m_fill,final); } diff --git a/src/KOKKOS/kokkos_type.h b/src/KOKKOS/kokkos_type.h index e9061dd7a3..9d3e3fca0f 100644 --- a/src/KOKKOS/kokkos_type.h +++ b/src/KOKKOS/kokkos_type.h @@ -641,6 +641,14 @@ typedef tdual_int_scalar::t_dev_const t_int_scalar_const; typedef tdual_int_scalar::t_dev_um t_int_scalar_um; typedef tdual_int_scalar::t_dev_const_um t_int_scalar_const_um; +typedef Kokkos:: + DualView tdual_bigint_scalar; +typedef tdual_bigint_scalar::t_dev t_bigint_scalar; +typedef tdual_bigint_scalar::t_dev_const t_bigint_scalar_const; +typedef tdual_bigint_scalar::t_dev_um t_bigint_scalar_um; +typedef tdual_bigint_scalar::t_dev_const_um t_bigint_scalar_const_um; +typedef tdual_bigint_scalar::t_dev_const_randomread t_bigint_scalar_randomread; + typedef Kokkos:: DualView tdual_tagint_scalar; typedef tdual_tagint_scalar::t_dev t_tagint_scalar; @@ -666,6 +674,14 @@ typedef tdual_int_1d::t_dev_um t_int_1d_um; typedef tdual_int_1d::t_dev_const_um t_int_1d_const_um; typedef tdual_int_1d::t_dev_const_randomread t_int_1d_randomread; +typedef Kokkos:: + DualView tdual_bigint_1d; +typedef tdual_bigint_1d::t_dev t_bigint_1d; +typedef tdual_bigint_1d::t_dev_const t_bigint_1d_const; +typedef tdual_bigint_1d::t_dev_um t_bigint_1d_um; +typedef tdual_bigint_1d::t_dev_const_um t_bigint_1d_const_um; +typedef tdual_bigint_1d::t_dev_const_randomread t_bigint_1d_randomread; + typedef Kokkos:: DualView tdual_int_1d_3; typedef tdual_int_1d_3::t_dev t_int_1d_3; @@ -974,6 +990,12 @@ typedef tdual_int_scalar::t_host_const t_int_scalar_const; typedef tdual_int_scalar::t_host_um t_int_scalar_um; typedef tdual_int_scalar::t_host_const_um t_int_scalar_const_um; +typedef Kokkos::DualView tdual_bigint_scalar; +typedef tdual_bigint_scalar::t_host t_bigint_scalar; +typedef tdual_bigint_scalar::t_host_const t_bigint_scalar_const; +typedef tdual_bigint_scalar::t_host_um t_bigint_scalar_um; +typedef tdual_bigint_scalar::t_host_const_um t_bigint_scalar_const_um; + typedef Kokkos::DualView tdual_tagint_scalar; typedef tdual_tagint_scalar::t_host t_tagint_scalar; typedef tdual_tagint_scalar::t_host_const t_tagint_scalar_const; @@ -994,6 +1016,13 @@ typedef tdual_int_1d::t_host_um t_int_1d_um; typedef tdual_int_1d::t_host_const_um t_int_1d_const_um; typedef tdual_int_1d::t_host_const_randomread t_int_1d_randomread; +typedef Kokkos::DualView tdual_bigint_1d; +typedef tdual_bigint_1d::t_host t_bigint_1d; +typedef tdual_bigint_1d::t_host_const t_bigint_1d_const; +typedef tdual_bigint_1d::t_host_um t_bigint_1d_um; +typedef tdual_bigint_1d::t_host_const_um t_bigint_1d_const_um; +typedef tdual_bigint_1d::t_host_const_randomread t_bigint_1d_randomread; + typedef Kokkos::DualView tdual_int_1d_3; typedef tdual_int_1d_3::t_host t_int_1d_3; typedef tdual_int_1d_3::t_host_const t_int_1d_3_const; diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index 6ff955e6d8..7af5889e62 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -1502,21 +1502,11 @@ void PairReaxFFKokkos::allocate_array() } if (cut_hbsq > 0.0) { - MemKK::realloc_kokkos(d_hb_first,"reaxff/kk:hb_first",nmax); MemKK::realloc_kokkos(d_hb_num,"reaxff/kk:hb_num",nmax); - - if (((bigint) nmax*maxhb) > MAXSMALLINT) - error->one(FLERR,"Too many hydrogen bonds in pair reaxff"); - - MemKK::realloc_kokkos(d_hb_list,"reaxff/kk:hb_list",nmax*maxhb); + MemKK::realloc_kokkos(d_hb_list,"reaxff/kk:hb_list", nmax, maxhb); } - MemKK::realloc_kokkos(d_bo_first,"reaxff/kk:bo_first",nmax); MemKK::realloc_kokkos(d_bo_num,"reaxff/kk:bo_num",nmax); - - if (((bigint) nmax*maxbo) > MAXSMALLINT) - error->one(FLERR,"Too many bonds in pair reaxff"); - - MemKK::realloc_kokkos(d_bo_list,"reaxff/kk:bo_list",nmax*maxbo); + MemKK::realloc_kokkos(d_bo_list,"reaxff/kk:bo_list", nmax, maxbo); MemKK::realloc_kokkos(d_BO,"reaxff/kk:BO",nmax,maxbo); MemKK::realloc_kokkos(d_BO_s,"reaxff/kk:BO",nmax,maxbo); @@ -1547,9 +1537,9 @@ void PairReaxFFKokkos::allocate_array() MemKK::realloc_kokkos(d_Deltap,"reaxff/kk:Deltap",nmax); MemKK::realloc_kokkos(d_total_bo,"reaxff/kk:total_bo",nmax); - MemKK::realloc_kokkos(d_Cdbo,"reaxff/kk:Cdbo",nmax,3*maxbo); - MemKK::realloc_kokkos(d_Cdbopi,"reaxff/kk:Cdbopi",nmax,3*maxbo); - MemKK::realloc_kokkos(d_Cdbopi2,"reaxff/kk:Cdbopi2",nmax,3*maxbo); + MemKK::realloc_kokkos(d_Cdbo,"reaxff/kk:Cdbo",nmax,maxbo); + MemKK::realloc_kokkos(d_Cdbopi,"reaxff/kk:Cdbopi",nmax,maxbo); + MemKK::realloc_kokkos(d_Cdbopi2,"reaxff/kk:Cdbopi2",nmax,maxbo); MemKK::realloc_kokkos(d_Delta,"reaxff/kk:Delta",nmax); MemKK::realloc_kokkos(d_Delta_boc,"reaxff/kk:Delta_boc",nmax); @@ -1606,19 +1596,10 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< F_FLOAT dDeltap_self_i[3] = {0.0,0.0,0.0}; F_FLOAT total_bo_i = 0.0; - d_bo_first[i] = i*maxbo; - const int bo_first_i = d_bo_first[i]; - int ihb = -1; - int hb_first_i; - if (cut_hbsq > 0.0) { + if (cut_hbsq > 0.0) ihb = paramssing(itype).p_hbond; - if (ihb == 1) { - d_hb_first[i] = i*maxhb; - hb_first_i = d_hb_first[i]; - } - } int nnz; blocking_t selected_jj[blocksize]; @@ -1632,9 +1613,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< int j = d_neighbors(i,jj); j &= NEIGHMASK; - d_bo_first[j] = j*maxbo; - d_hb_first[j] = j*maxhb; - delij[0] = x(j,0) - xtmp; delij[1] = x(j,1) - ytmp; delij[2] = x(j,2) - ztmp; @@ -1663,7 +1641,7 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< const F_FLOAT rsq = delij[0]*delij[0] + delij[1]*delij[1] + delij[2]*delij[2]; // hbond list - build_hb_list(rsq, i, hb_first_i, ihb, j, jtype); + build_hb_list(rsq, i, ihb, j, jtype); if (rsq > cut_bosq) continue; @@ -1680,23 +1658,23 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< BO = BO_s + BO_pi + BO_pi2; if (BO < bo_cut) continue; - int ii_index = -1; - int jj_index = -1; - if (build_bo_list(bo_first_i, i, j, ii_index, jj_index)) { + int i_index = -1; + int j_index = -1; + if (build_bo_list(i, j, i_index, j_index)) { // from BondOrder1 - d_BO(i,jj_index) = BO; - d_BO_s(i,jj_index) = BO_s; + d_BO(i,j_index) = BO; + d_BO_s(i,j_index) = BO_s; - d_BO(j,ii_index) = BO; - d_BO_s(j,ii_index) = BO_s; + d_BO(j,i_index) = BO; + d_BO_s(j,i_index) = BO_s; - d_BO_pi(j,ii_index) = BO_pi; - d_BO_pi2(j,ii_index) = BO_pi2; + d_BO_pi(j,i_index) = BO_pi; + d_BO_pi2(j,i_index) = BO_pi2; - d_BO_pi(i,jj_index) = BO_pi; - d_BO_pi2(i,jj_index) = BO_pi2; + d_BO_pi(i,j_index) = BO_pi; + d_BO_pi2(i,j_index) = BO_pi2; F_FLOAT Cln_BOp_s = p_bo2 * C12 / rij / rij; F_FLOAT Cln_BOp_pi = p_bo4 * C34 / rij / rij; @@ -1709,18 +1687,18 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlocking< for (int d = 0; d < 3; d++) dDeltap_self_i[d] += dBOp_i[d]; for (int d = 0; d < 3; d++) a_dDeltap_self(j,d) += -dBOp_i[d]; - d_dln_BOp_pi(i,jj_index) = -(BO_pi*Cln_BOp_pi); - d_dln_BOp_pi(j,ii_index) = -(BO_pi*Cln_BOp_pi); + d_dln_BOp_pi(i,j_index) = -(BO_pi*Cln_BOp_pi); + d_dln_BOp_pi(j,i_index) = -(BO_pi*Cln_BOp_pi); - d_dln_BOp_pi2(i,jj_index) = -(BO_pi2*Cln_BOp_pi2); - d_dln_BOp_pi2(j,ii_index) = -(BO_pi2*Cln_BOp_pi2); + d_dln_BOp_pi2(i,j_index) = -(BO_pi2*Cln_BOp_pi2); + d_dln_BOp_pi2(j,i_index) = -(BO_pi2*Cln_BOp_pi2); - d_dBOp(i,jj_index) = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2); - d_dBOp(j,ii_index) = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2); - d_BO(i,jj_index) = BO - bo_cut; - d_BO(j,ii_index) = BO - bo_cut; - d_BO_s(i,jj_index) = BO_s - bo_cut; - d_BO_s(j,ii_index) = BO_s - bo_cut; + d_dBOp(i,j_index) = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2); + d_dBOp(j,i_index) = -(BO_s*Cln_BOp_s+BO_pi*Cln_BOp_pi+BO_pi2*Cln_BOp_pi2); + d_BO(i,j_index) = BO - bo_cut; + d_BO(j,i_index) = BO - bo_cut; + d_BO_s(i,j_index) = BO_s - bo_cut; + d_BO_s(j,i_index) = BO_s - bo_cut; total_bo_i += (BO - bo_cut); a_total_bo[j] += (BO - bo_cut); } @@ -1750,19 +1728,10 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlockingP F_FLOAT C12, C34, C56, BO_s, BO_pi, BO_pi2, BO, delij[3]; - d_bo_first[i] = i*maxbo; - const int bo_first_i = d_bo_first[i]; - int ihb = -1; - int hb_first_i; - if (cut_hbsq > 0.0) { + if (cut_hbsq > 0.0) ihb = paramssing(itype).p_hbond; - if (ihb == 1) { - d_hb_first[i] = i*maxhb; - hb_first_i = d_hb_first[i]; - } - } int nnz; blocking_t selected_jj[blocksize]; @@ -1780,9 +1749,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlockingP int j = d_neighbors(i,jj); j &= NEIGHMASK; - d_bo_first[j] = j*maxbo; - d_hb_first[j] = j*maxhb; - delij[0] = x(j,0) - xtmp; delij[1] = x(j,1) - ytmp; delij[2] = x(j,2) - ztmp; @@ -1808,7 +1774,7 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlockingP const F_FLOAT rsq = delij[0]*delij[0] + delij[1]*delij[1] + delij[2]*delij[2]; // hbond list - build_hb_list(rsq, i, hb_first_i, ihb, j, jtype); + build_hb_list(rsq, i, ihb, j, jtype); if (rsq > cut_bosq) continue; @@ -1825,9 +1791,9 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfBlockingP BO = BO_s + BO_pi + BO_pi2; if (BO < bo_cut) continue; - int ii_index = -1; - int jj_index = -1; - build_bo_list(bo_first_i, i, j, ii_index, jj_index); + int i_index = -1; + int j_index = -1; + build_bo_list(i, j, i_index, j_index); } } } @@ -1848,26 +1814,15 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfPreview 0.0) { + if (cut_hbsq > 0.0) ihb = paramssing(itype).p_hbond; - if (ihb == 1) { - d_hb_first[i] = i*maxhb; - hb_first_i = d_hb_first[i]; - } - } for (int jj = 0; jj < jnum; jj++) { int j = d_neighbors(i,jj); j &= NEIGHMASK; - d_bo_first[j] = j*maxbo; - d_hb_first[j] = j*maxhb; const int jtype = type(j); delij[0] = x(j,0) - xtmp; @@ -1876,7 +1831,7 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfPreview(rsq, i, hb_first_i, ihb, j, jtype); + build_hb_list(rsq, i, ihb, j, jtype); if (rsq > cut_bosq) continue; @@ -1893,10 +1848,10 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfPreview(bo_first_i, i, j, ii_index, jj_index); + build_bo_list(i, j, i_index, j_index); } } @@ -1905,7 +1860,7 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsHalfPreview template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::build_hb_list(F_FLOAT rsq, int i, int hb_first_i, int ihb, int j, int jtype) const { +void PairReaxFFKokkos::build_hb_list(F_FLOAT rsq, int i, int ihb, int j, int jtype) const { int i_index, j_index; int jhb = -1; @@ -1913,30 +1868,26 @@ void PairReaxFFKokkos::build_hb_list(F_FLOAT rsq, int i, int hb_firs jhb = paramssing(jtype).p_hbond; if (ihb == 1 && jhb == 2) { if (NEIGHFLAG == HALF) { - j_index = hb_first_i + d_hb_num[i]; + j_index = d_hb_num[i]; d_hb_num[i]++; } else - j_index = hb_first_i + Kokkos::atomic_fetch_add(&d_hb_num[i],1); + j_index = Kokkos::atomic_fetch_add(&d_hb_num[i],1); - const int jj_index = j_index - hb_first_i; - - if (jj_index >= maxhb) - d_resize_hb() = MAX(d_resize_hb(),jj_index+1); + if (j_index >= maxhb) + d_resize_hb() = MAX(d_resize_hb(), j_index+1); else - d_hb_list[j_index] = j; + d_hb_list(i, j_index) = j; } else if (j < nlocal && ihb == 2 && jhb == 1) { if (NEIGHFLAG == HALF) { - i_index = d_hb_first[j] + d_hb_num[j]; + i_index = d_hb_num[j]; d_hb_num[j]++; } else - i_index = d_hb_first[j] + Kokkos::atomic_fetch_add(&d_hb_num[j],1); + i_index = Kokkos::atomic_fetch_add(&d_hb_num[j],1); - const int ii_index = i_index - d_hb_first[j]; - - if (ii_index >= maxhb) - d_resize_hb() = MAX(d_resize_hb(),ii_index+1); + if (i_index >= maxhb) + d_resize_hb() = MAX(d_resize_hb(), i_index+1); else - d_hb_list[i_index] = i; + d_hb_list(j, i_index) = i; } } @@ -1947,31 +1898,27 @@ void PairReaxFFKokkos::build_hb_list(F_FLOAT rsq, int i, int hb_firs template template KOKKOS_INLINE_FUNCTION -bool PairReaxFFKokkos::build_bo_list(int bo_first_i, int i, int j, int& ii_index, int& jj_index) const { - int i_index, j_index; +bool PairReaxFFKokkos::build_bo_list(int i, int j, int& i_index, int& j_index) const { if (NEIGHFLAG == HALF) { - j_index = bo_first_i + d_bo_num[i]; - i_index = d_bo_first[j] + d_bo_num[j]; + j_index = d_bo_num[i]; + i_index = d_bo_num[j]; d_bo_num[i]++; d_bo_num[j]++; } else { - j_index = bo_first_i + Kokkos::atomic_fetch_add(&d_bo_num[i],1); - i_index = d_bo_first[j] + Kokkos::atomic_fetch_add(&d_bo_num[j],1); + j_index = Kokkos::atomic_fetch_add(&d_bo_num[i],1); + i_index = Kokkos::atomic_fetch_add(&d_bo_num[j],1); } - jj_index = j_index - bo_first_i; - ii_index = i_index - d_bo_first[j]; - bool set_dB_flag = true; - if (jj_index >= maxbo || ii_index >= maxbo) { - const int max_val = MAX(ii_index+1,jj_index+1); + if (j_index >= maxbo || i_index >= maxbo) { + const int max_val = MAX(i_index + 1, j_index + 1); d_resize_bo() = MAX(d_resize_bo(),max_val); set_dB_flag = false; } else { - d_bo_list[j_index] = j; - d_bo_list[i_index] = i; + d_bo_list(i, j_index) = j; + d_bo_list(j, i_index) = i; set_dB_flag = true; } @@ -1995,13 +1942,11 @@ void PairReaxFFKokkos::operator()(TagPairReaxBuildListsFull, const i F_FLOAT dDeltap_self_i[3] = {0.0,0.0,0.0}; F_FLOAT total_bo_i = 0.0; - const int j_start = d_bo_first[i]; - const int j_end = j_start + d_bo_num[i]; - for (int jj = j_start; jj < j_end; jj++) { - int j = d_bo_list[jj]; + const int jnum = d_bo_num[i]; + for (int j_index = 0; j_index < jnum; j_index++) { + int j = d_bo_list(i, j_index); j &= NEIGHMASK; const int jtype = type(j); - const int j_index = jj - j_start; delij[0] = x(j,0) - xtmp; delij[1] = x(j,1) - ytmp; delij[2] = x(j,2) - ztmp; @@ -2110,23 +2055,19 @@ void PairReaxFFKokkos::operator()(TagPairReaxBondOrder2, const int & const int i = d_ilist[ii]; const int itype = type(i); - const int j_start = d_bo_first[i]; - const int j_end = j_start + d_bo_num[i]; + const int jnum = d_bo_num[i]; const F_FLOAT val_i = paramssing(itype).valency; d_total_bo[i] = 0.0; F_FLOAT total_bo = 0.0; - for (int jj = j_start; jj < j_end; jj++) { - int j = d_bo_list[jj]; + for (int j_index = 0; j_index < jnum; j_index++) { + int j = d_bo_list(i, j_index); j &= NEIGHMASK; const int jtype = type(j); - const int j_index = jj - j_start; - const int i_index = maxbo+j_index; // calculate corrected BO and total bond order - const F_FLOAT val_j = paramssing(jtype).valency; const F_FLOAT ovc = paramstwbp(itype,jtype).ovc; const F_FLOAT v13cor = paramstwbp(itype,jtype).v13cor; @@ -2221,10 +2162,6 @@ void PairReaxFFKokkos::operator()(TagPairReaxBondOrder2, const int & d_Cdbo(i,j_index) = 0.0; d_Cdbopi(i,j_index) = 0.0; d_Cdbopi2(i,j_index) = 0.0; - d_Cdbo(j,i_index) = 0.0; - d_Cdbopi(j,i_index) = 0.0; - d_Cdbopi2(j,i_index) = 0.0; - d_CdDelta[j] = 0.0; } d_CdDelta[i] = 0.0; @@ -2279,20 +2216,18 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeMulti1, const in if (imass > 21.0) dfvl = 0.0; else dfvl = 1.0; - const int j_start = d_bo_first[i]; - const int j_end = j_start + d_bo_num[i]; + const int jnum = d_bo_num[i]; F_FLOAT sum_ovun1 = 0.0; F_FLOAT sum_ovun2 = 0.0; - for (int jj = j_start; jj < j_end; jj++) { - int j = d_bo_list[jj]; + for (int j_index = 0; j_index < jnum; j_index++) { + int j = d_bo_list(i, j_index); j &= NEIGHMASK; const int jtype = type(j); - const int j_index = jj - j_start; sum_ovun1 += paramstwbp(itype,jtype).p_ovun1 * paramstwbp(itype,jtype).De_s * d_BO(i,j_index); - sum_ovun2 += (d_Delta[j] - dfvl * d_Delta_lp_temp[j]) * (d_BO_pi(i,j_index) + d_BO_pi2(i,j_index)); + sum_ovun2 += (d_Delta[j] - dfvl * d_Delta_lp_temp[j]) * (d_BO_pi(i, j_index) + d_BO_pi2(i,j_index)); } d_sum_ovun(i,1) += sum_ovun1; d_sum_ovun(i,2) += sum_ovun2; @@ -2402,16 +2337,14 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeMulti2 0 || enobondsflag) a_CdDelta[i] += CEunder3; - const int j_start = d_bo_first[i]; - const int j_end = j_start + d_bo_num[i]; + const int jnum = d_bo_num[i]; F_FLOAT CdDelta_i = 0.0; - for (int jj = j_start; jj < j_end; jj++) { - int j = d_bo_list[jj]; + for (int j_index = 0; j_index < jnum; j_index++) { + int j = d_bo_list(i, j_index); j &= NEIGHMASK; const int jtype = type(j); const F_FLOAT jmass = paramssing(jtype).mass; - const int j_index = jj - j_start; const F_FLOAT De_s = paramstwbp(itype,jtype).De_s; // multibody lone pair: correction for C2 @@ -2461,24 +2394,23 @@ void PairReaxFFKokkos::operator()(TagPairReaxCountAngularTorsion(i, itype, j_start, j_end, location_angular); + int count_angular = preprocess_angular(i, itype, jnum, location_angular); location_angular = Kokkos::atomic_fetch_add(&d_count_angular_torsion(0), count_angular); if (POPULATE) { // Fill buffer for `i` - preprocess_angular(i, itype, j_start, j_end, location_angular); + preprocess_angular(i, itype, jnum, location_angular); } // Torsion @@ -2490,12 +2422,12 @@ void PairReaxFFKokkos::operator()(TagPairReaxCountAngularTorsion(i, itype, itag, xtmp, ytmp, ztmp, j_start, j_end, location_torsion); + int count_torsion = preprocess_torsion(i, itype, itag, xtmp, ytmp, ztmp, jnum, location_torsion); location_torsion = Kokkos::atomic_fetch_add(&d_count_angular_torsion(1), count_torsion); if (POPULATE) { // Fill buffer for `i` - preprocess_torsion(i, itype, itag, xtmp, ytmp, ztmp, j_start, j_end, location_torsion); + preprocess_torsion(i, itype, itag, xtmp, ytmp, ztmp, jnum, location_torsion); } } @@ -2504,7 +2436,7 @@ void PairReaxFFKokkos::operator()(TagPairReaxCountAngularTorsion KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::compute_angular_sbo(int i, int itype, int j_start, int j_end) const { +void PairReaxFFKokkos::compute_angular_sbo(int i, int itype, int jnum) const { F_FLOAT SBO2, CSBO2, dSBO1, dSBO2; @@ -2514,8 +2446,7 @@ void PairReaxFFKokkos::compute_angular_sbo(int i, int itype, int j_s F_FLOAT SBOp = 0.0; F_FLOAT prod_SBO = 1.0; - for (int jj = j_start; jj < j_end; jj++) { - const int j_index = jj - j_start; + for (int j_index = 0; j_index < jnum; j_index++) { const F_FLOAT bo_ij = d_BO(i,j_index); SBOp += (d_BO_pi(i,j_index) + d_BO_pi2(i,j_index)); @@ -2568,29 +2499,26 @@ void PairReaxFFKokkos::compute_angular_sbo(int i, int itype, int j_s template template KOKKOS_INLINE_FUNCTION -int PairReaxFFKokkos::preprocess_angular(int i, int itype, int j_start, int j_end, int location_angular) const { +int PairReaxFFKokkos::preprocess_angular(int i, int itype, int jnum, int location_angular) const { int count_angular = 0; - for (int jj = j_start; jj < j_end; jj++) { - int j = d_bo_list[jj]; + for (int j_index = 0; j_index < jnum; j_index++) { + int j = d_bo_list(i, j_index); j &= NEIGHMASK; - const int j_index = jj - j_start; const F_FLOAT bo_ij = d_BO(i,j_index); if (bo_ij <= thb_cut) continue; if (i >= nlocal && j >= nlocal) continue; - const int i_index = maxbo + j_index; const int jtype = type(j); - for (int kk = jj+1; kk < j_end; kk++) { + for (int k_index = j_index + 1; k_index < jnum; k_index++) { //for (int kk = j_start; kk < j_end; kk++) { - int k = d_bo_list[kk]; + int k = d_bo_list(i, k_index); k &= NEIGHMASK; if (k == j) continue; - const int k_index = kk - j_start; const F_FLOAT bo_ik = d_BO(i,k_index); if (bo_ij <= thb_cut || bo_ik <= thb_cut || bo_ij * bo_ik <= thb_cutsq) continue; @@ -2608,14 +2536,14 @@ int PairReaxFFKokkos::preprocess_angular(int i, int itype, int j_sta pack.i0 = i; pack.i1 = j; pack.i2 = k; - pack.i3 = j_start; + pack.i3 = jnum; d_angular_pack(location_angular, 0) = pack; - // Second pack stores i_index, j_index, k_index, and j_end - pack.i0 = i_index; + // Second pack stores j_index and k_index + // i0 is unused because there's no i_index pack.i1 = j_index; pack.i2 = k_index; - pack.i3 = j_end; + // i3 is unused d_angular_pack(location_angular, 1) = pack; location_angular++; @@ -2634,17 +2562,16 @@ template template KOKKOS_INLINE_FUNCTION int PairReaxFFKokkos::preprocess_torsion(int i, int /*itype*/, tagint itag, - F_FLOAT xtmp, F_FLOAT ytmp, F_FLOAT ztmp, int j_start, int j_end, int location_torsion) const { + F_FLOAT xtmp, F_FLOAT ytmp, F_FLOAT ztmp, int jknum, int location_torsion) const { // in reaxff_torsion_angles: j = i, k = j, i = k; int count_torsion = 0; - for (int jj = j_start; jj < j_end; jj++) { - int j = d_bo_list[jj]; + for (int j_index = 0; j_index < jknum; j_index++) { + int j = d_bo_list(i, j_index); j &= NEIGHMASK; const tagint jtag = tag(j); - const int j_index = jj - j_start; // skip half of the interactions if (itag > jtag) { @@ -2660,23 +2587,20 @@ int PairReaxFFKokkos::preprocess_torsion(int i, int /*itype*/, tagin const F_FLOAT bo_ij = d_BO(i,j_index); if (bo_ij < thb_cut) continue; - const int l_start = d_bo_first[j]; - const int l_end = l_start + d_bo_num[j]; + const int lnum = d_bo_num[j]; - for (int kk = j_start; kk < j_end; kk++) { - int k = d_bo_list[kk]; + for (int k_index = 0; k_index < jknum; k_index++) { + int k = d_bo_list(i, k_index); k &= NEIGHMASK; if (k == j) continue; - const int k_index = kk - j_start; const F_FLOAT bo_ik = d_BO(i,k_index); if (bo_ik < thb_cut) continue; - for (int ll = l_start; ll < l_end; ll++) { - int l = d_bo_list[ll]; + for (int l_index = 0; l_index < lnum; l_index++) { + int l = d_bo_list(j, l_index); l &= NEIGHMASK; if (l == i) continue; - const int l_index = ll - l_start; const F_FLOAT bo_jl = d_BO(j,l_index); if (l == k || bo_jl < thb_cut || bo_ij*bo_ik*bo_jl < thb_cut) continue; @@ -2716,9 +2640,9 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeAngularPreproces auto v_f = ScatterViewHelper,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); auto a_f = v_f.template access>(); - Kokkos::View::value,Kokkos::MemoryTraits::value>> a_Cdbo = d_Cdbo; - Kokkos::View::value,Kokkos::MemoryTraits::value>> a_Cdbopi = d_Cdbopi; - Kokkos::View::value,Kokkos::MemoryTraits::value>> a_Cdbopi2 = d_Cdbopi2; + Kokkos::View::value>> a_Cdbo = d_Cdbo; + Kokkos::View::value>> a_Cdbopi = d_Cdbopi; + Kokkos::View::value>> a_Cdbopi2 = d_Cdbopi2; auto v_CdDelta = ScatterViewHelper,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta); auto a_CdDelta = v_CdDelta.template access>(); @@ -2758,13 +2682,13 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeAngularPreproces const int i = pack.i0; const int j = pack.i1; const int k = pack.i2; - const int j_start = pack.i3; + const int jnum = pack.i3; pack = d_angular_pack(apack, 1); - const int i_index = pack.i0; + // i0 is unused const int j_index = pack.i1; const int k_index = pack.i2; - const int j_end = pack.i3; + // i3 is unused const int itype = type(i); const X_FLOAT xtmp = x(i,0); @@ -2914,17 +2838,13 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeAngularPreproces // Forces a_Cdbo(i,j_index) += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); - a_Cdbo(j,i_index) += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); a_Cdbo(i,k_index) += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); - a_Cdbo(k,i_index) += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); CdDelta_i += ((CEval3 + CEval7) + CEpen1 + CEcoa3); CdDelta_j += CEcoa4; a_CdDelta[k] += CEcoa5; - for (int ll = j_start; ll < j_end; ll++) { - const int l_index = ll - j_start; - + for (int l_index = 0; l_index < jnum; l_index++) { temp_bo_jt = d_BO(i,l_index); temp = temp_bo_jt * temp_bo_jt * temp_bo_jt; pBOjt7 = temp * temp * temp_bo_jt; @@ -2978,8 +2898,8 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeTorsionPreproces auto v_CdDelta = ScatterViewHelper,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta); auto a_CdDelta = v_CdDelta.template access>(); - Kokkos::View::value,Kokkos::MemoryTraits::value>> a_Cdbo = d_Cdbo; - Kokkos::View::value,Kokkos::MemoryTraits::value>> a_Cdbopi = d_Cdbopi; + Kokkos::View::value>> a_Cdbo = d_Cdbo; + Kokkos::View::value>> a_Cdbopi = d_Cdbopi; //auto a_Cdbo = dup_Cdbo.template access>(); // in reaxff_torsion_angles: j = i, k = j, i = k; @@ -3340,21 +3260,18 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeHydrogen= HB_THRESHOLD) { - hblist[top] = jj; + hblist[top] = j_index; top ++; } } @@ -3362,8 +3279,8 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeHydrogen::operator()(TagPairReaxComputeHydrogen KOKKOS_INLINE_FUNCTION void PairReaxFFKokkos::operator()(TagPairReaxUpdateBond, const int &ii) const { - Kokkos::View::value>> a_Cdbo = d_Cdbo; - Kokkos::View::value>> a_Cdbopi = d_Cdbopi; - Kokkos::View::value>> a_Cdbopi2 = d_Cdbopi2; + Kokkos::View::value>> a_Cdbo = d_Cdbo; + Kokkos::View::value>> a_Cdbopi = d_Cdbopi; + Kokkos::View::value>> a_Cdbopi2 = d_Cdbopi2; const int i = d_ilist[ii]; const X_FLOAT xtmp = x(i,0); const X_FLOAT ytmp = x(i,1); const X_FLOAT ztmp = x(i,2); const tagint itag = tag(i); - const int j_start = d_bo_first[i]; - const int j_end = j_start + d_bo_num[i]; + const int jnum = d_bo_num[i]; - for (int jj = j_start; jj < j_end; jj++) { - int j = d_bo_list[jj]; + for (int j_index = 0; j_index < jnum; j_index++) { + int j = d_bo_list(i, j_index); j &= NEIGHMASK; const tagint jtag = tag(j); @@ -3501,19 +3416,16 @@ void PairReaxFFKokkos::operator()(TagPairReaxUpdateBond, if (!flag) continue; - const int j_index = jj - j_start; const F_FLOAT Cdbo_i = d_Cdbo(i,j_index); const F_FLOAT Cdbopi_i = d_Cdbopi(i,j_index); const F_FLOAT Cdbopi2_i = d_Cdbopi2(i,j_index); - const int k_start = d_bo_first[j]; - const int k_end = k_start + d_bo_num[j]; + const int knum = d_bo_num[j]; - for (int kk = k_start; kk < k_end; kk++) { - int k = d_bo_list[kk]; + for (int k_index = 0; k_index < knum; k_index++) { + int k = d_bo_list(j, k_index); k &= NEIGHMASK; if (k != i) continue; - const int k_index = kk - k_start; a_Cdbo(j,k_index) += Cdbo_i; a_Cdbopi(j,k_index) += Cdbopi_i; @@ -3541,13 +3453,12 @@ void PairReaxFFKokkos::operator()(TagPairReaxComputeBond1::operator()(TagPairReaxComputeBond1::operator()(TagPairReaxComputeBond2::operator()(TagPairReaxComputeBond2::operator()(TagPairReaxComputeBond2::operator()(TagPairReaxComputeBond2::calculate_find_bond_item(int ii, int &numbond int nj = 0; if (mask[i] & groupbit) { - const int j_start = d_bo_first[i]; - const int j_end = j_start + d_bo_num[i]; - for (int jj = j_start; jj < j_end; jj++) { - int j = d_bo_list[jj]; + const int jnum = d_bo_num[i]; + for (int j_index = 0; j_index < jnum; j_index++) { + int j = d_bo_list(i, j_index); j &= NEIGHMASK; if (mask[j] & groupbit) { const tagint jtag = tag[j]; - const int j_index = jj - j_start; - double bo_tmp = d_BO(i,j_index); + double bo_tmp = d_BO(i, j_index); if (bo_tmp > bo_cut_bond) { d_neighid(i,nj) = jtag; @@ -4409,15 +4312,13 @@ KOKKOS_INLINE_FUNCTION void PairReaxFFKokkos::operator()(TagPairReaxFindBondSpecies, const int &i) const { int nj = 0; - const int j_start = d_bo_first[i]; - const int j_end = j_start + d_bo_num[i]; - for (int jj = j_start; jj < j_end; jj++) { - int j = d_bo_list[jj]; + const int jnum = d_bo_num[i]; + for (int j_index = 0; j_index < jnum; j_index++) { + int j = d_bo_list(i, j_index); j &= NEIGHMASK; if (j < i) continue; - const int j_index = jj - j_start; - double bo_tmp = d_BO(i,j_index); + double bo_tmp = d_BO(i, j_index); if (bo_tmp >= 0.10) { // Why is this a hardcoded value? k_tmpid.view()(i,nj) = j; diff --git a/src/KOKKOS/pair_reaxff_kokkos.h b/src/KOKKOS/pair_reaxff_kokkos.h index 5f228ebd19..0fe47fcba8 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.h +++ b/src/KOKKOS/pair_reaxff_kokkos.h @@ -178,14 +178,14 @@ class PairReaxFFKokkos : public PairReaxFF { // TagPairReaxBuildListsHalfBlocking, HalfBlockingPreview, HalfPreview template KOKKOS_INLINE_FUNCTION - void build_hb_list(F_FLOAT, int, int, int, int, int) const; + void build_hb_list(F_FLOAT, int, int, int, int) const; // Isolated function that builds the bond order list, reused across // TagPairReaxBuildListsHalfBlocking, HalfBlockingPreview, HalfPreview // Returns if we need to populate d_d* functions or not template KOKKOS_INLINE_FUNCTION - bool build_bo_list(int, int, int, int&, int&) const; + bool build_bo_list(int, int, int&, int&) const; KOKKOS_INLINE_FUNCTION void operator()(TagPairReaxBuildListsFull, const int&) const; @@ -245,17 +245,17 @@ class PairReaxFFKokkos : public PairReaxFF { // Abstraction for computing SBSO2, CSBO2, dSBO1, dsBO2 KOKKOS_INLINE_FUNCTION - void compute_angular_sbo(int, int, int, int) const; + void compute_angular_sbo(int, int, int) const; // Abstraction for counting and populating angular intermediates template KOKKOS_INLINE_FUNCTION - int preprocess_angular(int, int, int, int, int) const; + int preprocess_angular(int, int, int, int) const; // Abstraction for counting and populating torsion intermediated template KOKKOS_INLINE_FUNCTION - int preprocess_torsion(int, int, tagint, F_FLOAT, F_FLOAT, F_FLOAT, int, int, int) const; + int preprocess_torsion(int, int, tagint, F_FLOAT, F_FLOAT, F_FLOAT, int, int) const; template KOKKOS_INLINE_FUNCTION @@ -436,7 +436,7 @@ class PairReaxFFKokkos : public PairReaxFF { typename AT::t_ffloat_2d_dl d_C1dbo, d_C2dbo, d_C3dbo; typename AT::t_ffloat_2d_dl d_C1dbopi, d_C2dbopi, d_C3dbopi, d_C4dbopi; typename AT::t_ffloat_2d_dl d_C1dbopi2, d_C2dbopi2, d_C3dbopi2, d_C4dbopi2; - typename AT::t_ffloat_2d_dl d_Cdbo, d_Cdbopi, d_Cdbopi2, d_dDeltap_self; + typename AT::t_ffloat_2d_dl d_dDeltap_self, d_Cdbo, d_Cdbopi, d_Cdbopi2; int need_dup; @@ -470,7 +470,8 @@ class PairReaxFFKokkos : public PairReaxFF { typename AT::t_int_1d_randomread d_ilist; typename AT::t_int_1d_randomread d_numneigh; - typename AT::t_int_1d d_bo_first, d_bo_num, d_bo_list, d_hb_first, d_hb_num, d_hb_list; + typename AT::t_int_1d d_bo_num, d_hb_num; + typename AT::t_int_2d d_bo_list, d_hb_list; DAT::tdual_int_scalar k_resize_bo, k_resize_hb; typename AT::t_int_scalar d_resize_bo, d_resize_hb; diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index 73e2c1f06f..273a53ab8f 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -794,7 +794,7 @@ void PPPMKokkos::allocate() // 2nd FFT returns data in 3d brick decomposition // remap takes data from 3d brick to FFT decomposition - int collective_flag = 0; // not yet supported in Kokkos version + int collective_flag = force->kspace->collective_flag; int gpu_aware_flag = lmp->kokkos->gpu_aware_flag; int tmp; diff --git a/src/KOKKOS/remap_kokkos.cpp b/src/KOKKOS/remap_kokkos.cpp index 0d539ada83..573f4c2508 100644 --- a/src/KOKKOS/remap_kokkos.cpp +++ b/src/KOKKOS/remap_kokkos.cpp @@ -103,12 +103,10 @@ template void RemapKokkos::remap_3d_kokkos(typename FFT_AT::t_FFT_SCALAR_1d d_in, typename FFT_AT::t_FFT_SCALAR_1d d_out, typename FFT_AT::t_FFT_SCALAR_1d d_buf, struct remap_plan_3d_kokkos *plan) { - // collective flag not yet supported - // use point-to-point communication - - int i,isend,irecv; typename FFT_AT::t_FFT_SCALAR_1d d_scratch; + int me; + MPI_Comm_rank(plan->comm,&me); if (plan->memory == 0) d_scratch = d_buf; @@ -116,70 +114,132 @@ void RemapKokkos::remap_3d_kokkos(typename FFT_AT::t_FFT_SCALAR_1d d d_scratch = plan->d_scratch; // post all recvs into scratch space + // If not using GPU-aware MPI, mirror data to host FFT_SCALAR* v_scratch = d_scratch.data(); - if (!plan->usegpu_aware) { - plan->h_scratch = Kokkos::create_mirror_view(d_scratch); - v_scratch = plan->h_scratch.data(); - } - - for (irecv = 0; irecv < plan->nrecv; irecv++) { - FFT_SCALAR* scratch = v_scratch + plan->recv_bufloc[irecv]; - MPI_Irecv(scratch,plan->recv_size[irecv], - MPI_FFT_SCALAR,plan->recv_proc[irecv],0, - plan->comm,&plan->request[irecv]); - } - FFT_SCALAR* v_sendbuf = plan->d_sendbuf.data(); if (!plan->usegpu_aware) { + plan->h_scratch = Kokkos::create_mirror_view(d_scratch); plan->h_sendbuf = Kokkos::create_mirror_view(plan->d_sendbuf); + v_scratch = plan->h_scratch.data(); v_sendbuf = plan->h_sendbuf.data(); } - // send all messages to other procs + // use point-to-point communication - for (isend = 0; isend < plan->nsend; isend++) { - int in_offset = plan->send_offset[isend]; - plan->pack(d_in,in_offset, - plan->d_sendbuf,0,&plan->packplan[isend]); + if (!plan->usecollective) { + int i,isend,irecv; - if (!plan->usegpu_aware) - Kokkos::deep_copy(plan->h_sendbuf,plan->d_sendbuf); - MPI_Send(v_sendbuf,plan->send_size[isend],MPI_FFT_SCALAR, - plan->send_proc[isend],0,plan->comm); - } + for (irecv = 0; irecv < plan->nrecv; irecv++) { + FFT_SCALAR* scratch = v_scratch + plan->recv_bufloc[irecv]; + MPI_Irecv(scratch,plan->recv_size[irecv], + MPI_FFT_SCALAR,plan->recv_proc[irecv],0, + plan->comm,&plan->request[irecv]); + } - // copy in -> scratch -> out for self data + // send all messages to other procs - if (plan->self) { - isend = plan->nsend; - irecv = plan->nrecv; + for (isend = 0; isend < plan->nsend; isend++) { + int in_offset = plan->send_offset[isend]; + plan->pack(d_in,in_offset, + plan->d_sendbuf,0,&plan->packplan[isend]); - int in_offset = plan->send_offset[isend]; - int scratch_offset = plan->recv_bufloc[irecv]; - int out_offset = plan->recv_offset[irecv]; + if (!plan->usegpu_aware) + Kokkos::deep_copy(plan->h_sendbuf,plan->d_sendbuf); - plan->pack(d_in,in_offset, - d_scratch,scratch_offset, - &plan->packplan[isend]); - plan->unpack(d_scratch,scratch_offset, - d_out,out_offset,&plan->unpackplan[irecv]); - } + MPI_Send(v_sendbuf,plan->send_size[isend],MPI_FFT_SCALAR, + plan->send_proc[isend],0,plan->comm); + } - // unpack all messages from scratch -> out + // copy in -> scratch -> out for self data - for (i = 0; i < plan->nrecv; i++) { - MPI_Waitany(plan->nrecv,plan->request,&irecv,MPI_STATUS_IGNORE); + if (plan->self) { + isend = plan->nsend; + irecv = plan->nrecv; - int scratch_offset = plan->recv_bufloc[irecv]; - int out_offset = plan->recv_offset[irecv]; + int in_offset = plan->send_offset[isend]; + int scratch_offset = plan->recv_bufloc[irecv]; + int out_offset = plan->recv_offset[irecv]; - if (!plan->usegpu_aware) - Kokkos::deep_copy(d_scratch,plan->h_scratch); + plan->pack(d_in,in_offset, + d_scratch,scratch_offset, + &plan->packplan[isend]); + plan->unpack(d_scratch,scratch_offset, + d_out,out_offset,&plan->unpackplan[irecv]); + } - plan->unpack(d_scratch,scratch_offset, - d_out,out_offset,&plan->unpackplan[irecv]); + // unpack all messages from scratch -> out + + for (i = 0; i < plan->nrecv; i++) { + MPI_Waitany(plan->nrecv,plan->request,&irecv,MPI_STATUS_IGNORE); + + int scratch_offset = plan->recv_bufloc[irecv]; + int out_offset = plan->recv_offset[irecv]; + + if (!plan->usegpu_aware) + Kokkos::deep_copy(d_scratch,plan->h_scratch); + + plan->unpack(d_scratch,scratch_offset, + d_out,out_offset,&plan->unpackplan[irecv]); + } + } else { + if (plan->commringlen > 0) { + int isend,irecv; + + // populate send data + // buffers are allocated and count/displacement buffers + // are populated in remap_3d_create_plan_kokkos + + int numpacked = 0; + for (isend = 0; isend < plan->commringlen; isend++) { + if (plan->sendcnts[isend]) { + plan->pack(d_in,plan->send_offset[numpacked], + plan->d_sendbuf,plan->sdispls[isend], + &plan->packplan[numpacked]); + numpacked++; + } + else if (plan->commringlist[isend] == me && plan->self) { + numpacked++; + } + } + + if (!plan->usegpu_aware) + Kokkos::deep_copy(plan->h_sendbuf,plan->d_sendbuf); + + MPI_Alltoallv(v_sendbuf, plan->sendcnts, plan->sdispls, + MPI_FFT_SCALAR, v_scratch, plan->rcvcnts, + plan->rdispls, MPI_FFT_SCALAR, plan->comm); + + // unpack the data from the recv buffer into out + + if (!plan->usegpu_aware) + Kokkos::deep_copy(d_scratch,plan->h_scratch); + + // copy in -> scratch -> out for self data + + if (plan->self) { + plan->pack(d_in,plan->send_offset[plan->selfnsendloc], + plan->d_sendbuf,plan->sdispls[plan->selfcommringloc], + &plan->packplan[plan->selfnsendloc]); + plan->unpack(plan->d_sendbuf,plan->sdispls[plan->selfcommringloc], + d_out,plan->recv_offset[plan->selfnrecvloc], + &plan->unpackplan[plan->selfnrecvloc]); + } + + numpacked = 0; + for (irecv = 0; irecv < plan->commringlen; irecv++) { + if (plan->rcvcnts[irecv]) { + plan->unpack(d_scratch,plan->rdispls[irecv], + d_out,plan->recv_offset[numpacked], + &plan->unpackplan[numpacked]); + numpacked++; + } + else if (plan->commringlist[irecv] == me && plan->self) { + numpacked++; + } + } + } } } @@ -263,224 +323,488 @@ struct remap_plan_3d_kokkos* RemapKokkos::remap_3d_creat out.khi = out_khi; out.ksize = out.khi - out.klo + 1; - // combine output extents across all procs - inarray = (struct extent_3d *) malloc(nprocs*sizeof(struct extent_3d)); if (inarray == nullptr) return nullptr; outarray = (struct extent_3d *) malloc(nprocs*sizeof(struct extent_3d)); if (outarray == nullptr) return nullptr; - MPI_Allgather(&out,sizeof(struct extent_3d),MPI_BYTE, - outarray,sizeof(struct extent_3d),MPI_BYTE,comm); - - // count send collides, including self - - nsend = 0; - iproc = me; - for (i = 0; i < nprocs; i++) { - iproc++; - if (iproc == nprocs) iproc = 0; - nsend += remap_3d_collide(&in,&outarray[iproc],&overlap); - } - - // malloc space for send info - - if (nsend) { - plan->pack = PackKokkos::pack_3d; - - plan->send_offset = (int *) malloc(nsend*sizeof(int)); - plan->send_size = (int *) malloc(nsend*sizeof(int)); - plan->send_proc = (int *) malloc(nsend*sizeof(int)); - plan->packplan = (struct pack_plan_3d *) - malloc(nsend*sizeof(struct pack_plan_3d)); - - if (plan->send_offset == nullptr || plan->send_size == nullptr || - plan->send_proc == nullptr || plan->packplan == nullptr) return nullptr; - } - - // store send info, with self as last entry - - nsend = 0; - iproc = me; - for (i = 0; i < nprocs; i++) { - iproc++; - if (iproc == nprocs) iproc = 0; - if (remap_3d_collide(&in,&outarray[iproc],&overlap)) { - plan->send_proc[nsend] = iproc; - plan->send_offset[nsend] = nqty * - ((overlap.klo-in.klo)*in.jsize*in.isize + - ((overlap.jlo-in.jlo)*in.isize + overlap.ilo-in.ilo)); - plan->packplan[nsend].nfast = nqty*overlap.isize; - plan->packplan[nsend].nmid = overlap.jsize; - plan->packplan[nsend].nslow = overlap.ksize; - plan->packplan[nsend].nstride_line = nqty*in.isize; - plan->packplan[nsend].nstride_plane = nqty*in.jsize*in.isize; - plan->packplan[nsend].nqty = nqty; - plan->send_size[nsend] = nqty*overlap.isize*overlap.jsize*overlap.ksize; - nsend++; - } - } - - // plan->nsend = # of sends not including self - - if (nsend && plan->send_proc[nsend-1] == me) { - if (plan->usecollective) // for collectives include self in nsend list - plan->nsend = nsend; - else - plan->nsend = nsend - 1; - } else - plan->nsend = nsend; - - // combine input extents across all procs + // combine input & output extents across all procs MPI_Allgather(&in,sizeof(struct extent_3d),MPI_BYTE, inarray,sizeof(struct extent_3d),MPI_BYTE,comm); + MPI_Allgather(&out,sizeof(struct extent_3d),MPI_BYTE, + outarray,sizeof(struct extent_3d),MPI_BYTE,comm); - // count recv collides, including self + // for efficiency, handle collective & non-collective setup separately - nrecv = 0; - iproc = me; - for (i = 0; i < nprocs; i++) { - iproc++; - if (iproc == nprocs) iproc = 0; - nrecv += remap_3d_collide(&out,&inarray[iproc],&overlap); - } + if (!plan->usecollective) { + // count send & recv collides, including self - // malloc space for recv info - - if (nrecv) { - if (permute == 0) - plan->unpack = PackKokkos::unpack_3d; - else if (permute == 1) { - if (nqty == 1) - plan->unpack = PackKokkos::unpack_3d_permute1_1; - else if (nqty == 2) - plan->unpack = PackKokkos::unpack_3d_permute1_2; - else - plan->unpack = PackKokkos::unpack_3d_permute1_n; - } - else if (permute == 2) { - if (nqty == 1) - plan->unpack = PackKokkos::unpack_3d_permute2_1; - else if (nqty == 2) - plan->unpack = PackKokkos::unpack_3d_permute2_2; - else - plan->unpack = PackKokkos::unpack_3d_permute2_n; + nsend = 0; + nrecv = 0; + for (i = 0; i < nprocs; i++) { + nsend += remap_3d_collide(&in,&outarray[i],&overlap); + nrecv += remap_3d_collide(&out,&inarray[i],&overlap); } - plan->recv_offset = (int *) malloc(nrecv*sizeof(int)); - plan->recv_size = (int *) malloc(nrecv*sizeof(int)); - plan->recv_proc = (int *) malloc(nrecv*sizeof(int)); - plan->recv_bufloc = (int *) malloc(nrecv*sizeof(int)); - plan->request = (MPI_Request *) malloc(nrecv*sizeof(MPI_Request)); - plan->unpackplan = (struct pack_plan_3d *) - malloc(nrecv*sizeof(struct pack_plan_3d)); + // malloc space for send & recv info - if (plan->recv_offset == nullptr || plan->recv_size == nullptr || - plan->recv_proc == nullptr || plan->recv_bufloc == nullptr || - plan->request == nullptr || plan->unpackplan == nullptr) return nullptr; - } + if (nsend) { + plan->pack = PackKokkos::pack_3d; - // store recv info, with self as last entry + plan->send_offset = (int *) malloc(nsend*sizeof(int)); + plan->send_size = (int *) malloc(nsend*sizeof(int)); + plan->send_proc = (int *) malloc(nsend*sizeof(int)); + plan->packplan = (struct pack_plan_3d *) + malloc(nsend*sizeof(struct pack_plan_3d)); - ibuf = 0; - nrecv = 0; - iproc = me; + if (plan->send_offset == nullptr || plan->send_size == nullptr || + plan->send_proc == nullptr || plan->packplan == nullptr) return nullptr; + } - for (i = 0; i < nprocs; i++) { - iproc++; - if (iproc == nprocs) iproc = 0; - if (remap_3d_collide(&out,&inarray[iproc],&overlap)) { - plan->recv_proc[nrecv] = iproc; - plan->recv_bufloc[nrecv] = ibuf; - - if (permute == 0) { - plan->recv_offset[nrecv] = nqty * - ((overlap.klo-out.klo)*out.jsize*out.isize + - (overlap.jlo-out.jlo)*out.isize + (overlap.ilo-out.ilo)); - plan->unpackplan[nrecv].nfast = nqty*overlap.isize; - plan->unpackplan[nrecv].nmid = overlap.jsize; - plan->unpackplan[nrecv].nslow = overlap.ksize; - plan->unpackplan[nrecv].nstride_line = nqty*out.isize; - plan->unpackplan[nrecv].nstride_plane = nqty*out.jsize*out.isize; - plan->unpackplan[nrecv].nqty = nqty; - } + if (nrecv) { + if (permute == 0) + plan->unpack = PackKokkos::unpack_3d; else if (permute == 1) { - plan->recv_offset[nrecv] = nqty * - ((overlap.ilo-out.ilo)*out.ksize*out.jsize + - (overlap.klo-out.klo)*out.jsize + (overlap.jlo-out.jlo)); - plan->unpackplan[nrecv].nfast = overlap.isize; - plan->unpackplan[nrecv].nmid = overlap.jsize; - plan->unpackplan[nrecv].nslow = overlap.ksize; - plan->unpackplan[nrecv].nstride_line = nqty*out.jsize; - plan->unpackplan[nrecv].nstride_plane = nqty*out.ksize*out.jsize; - plan->unpackplan[nrecv].nqty = nqty; + if (nqty == 1) + plan->unpack = PackKokkos::unpack_3d_permute1_1; + else if (nqty == 2) + plan->unpack = PackKokkos::unpack_3d_permute1_2; + else + plan->unpack = PackKokkos::unpack_3d_permute1_n; } - else { - plan->recv_offset[nrecv] = nqty * - ((overlap.jlo-out.jlo)*out.isize*out.ksize + - (overlap.ilo-out.ilo)*out.ksize + (overlap.klo-out.klo)); - plan->unpackplan[nrecv].nfast = overlap.isize; - plan->unpackplan[nrecv].nmid = overlap.jsize; - plan->unpackplan[nrecv].nslow = overlap.ksize; - plan->unpackplan[nrecv].nstride_line = nqty*out.ksize; - plan->unpackplan[nrecv].nstride_plane = nqty*out.isize*out.ksize; - plan->unpackplan[nrecv].nqty = nqty; + else if (permute == 2) { + if (nqty == 1) + plan->unpack = PackKokkos::unpack_3d_permute2_1; + else if (nqty == 2) + plan->unpack = PackKokkos::unpack_3d_permute2_2; + else + plan->unpack = PackKokkos::unpack_3d_permute2_n; } - plan->recv_size[nrecv] = nqty*overlap.isize*overlap.jsize*overlap.ksize; - ibuf += plan->recv_size[nrecv]; - nrecv++; + plan->recv_offset = (int *) malloc(nrecv*sizeof(int)); + plan->recv_size = (int *) malloc(nrecv*sizeof(int)); + plan->recv_proc = (int *) malloc(nrecv*sizeof(int)); + plan->recv_bufloc = (int *) malloc(nrecv*sizeof(int)); + plan->request = (MPI_Request *) malloc(nrecv*sizeof(MPI_Request)); + plan->unpackplan = (struct pack_plan_3d *) + malloc(nrecv*sizeof(struct pack_plan_3d)); + + if (plan->recv_offset == nullptr || plan->recv_size == nullptr || + plan->recv_proc == nullptr || plan->recv_bufloc == nullptr || + plan->request == nullptr || plan->unpackplan == nullptr) return nullptr; } + + // store send info, with self as last entry + + nsend = 0; + iproc = me; + for (i = 0; i < nprocs; i++) { + iproc++; + if (iproc == nprocs) iproc = 0; + if (remap_3d_collide(&in,&outarray[iproc],&overlap)) { + plan->send_proc[nsend] = iproc; + plan->send_offset[nsend] = nqty * + ((overlap.klo-in.klo)*in.jsize*in.isize + + ((overlap.jlo-in.jlo)*in.isize + overlap.ilo-in.ilo)); + plan->packplan[nsend].nfast = nqty*overlap.isize; + plan->packplan[nsend].nmid = overlap.jsize; + plan->packplan[nsend].nslow = overlap.ksize; + plan->packplan[nsend].nstride_line = nqty*in.isize; + plan->packplan[nsend].nstride_plane = nqty*in.jsize*in.isize; + plan->packplan[nsend].nqty = nqty; + plan->send_size[nsend] = nqty*overlap.isize*overlap.jsize*overlap.ksize; + nsend++; + } + } + + // plan->nsend = # of sends not including self + + if (nsend && plan->send_proc[nsend-1] == me) plan->nsend = nsend - 1; + else plan->nsend = nsend; + + // store recv info, with self as last entry + + ibuf = 0; + nrecv = 0; + iproc = me; + + for (i = 0; i < nprocs; i++) { + iproc++; + if (iproc == nprocs) iproc = 0; + if (remap_3d_collide(&out,&inarray[iproc],&overlap)) { + plan->recv_proc[nrecv] = iproc; + plan->recv_bufloc[nrecv] = ibuf; + + if (permute == 0) { + plan->recv_offset[nrecv] = nqty * + ((overlap.klo-out.klo)*out.jsize*out.isize + + (overlap.jlo-out.jlo)*out.isize + (overlap.ilo-out.ilo)); + plan->unpackplan[nrecv].nfast = nqty*overlap.isize; + plan->unpackplan[nrecv].nmid = overlap.jsize; + plan->unpackplan[nrecv].nslow = overlap.ksize; + plan->unpackplan[nrecv].nstride_line = nqty*out.isize; + plan->unpackplan[nrecv].nstride_plane = nqty*out.jsize*out.isize; + plan->unpackplan[nrecv].nqty = nqty; + } + else if (permute == 1) { + plan->recv_offset[nrecv] = nqty * + ((overlap.ilo-out.ilo)*out.ksize*out.jsize + + (overlap.klo-out.klo)*out.jsize + (overlap.jlo-out.jlo)); + plan->unpackplan[nrecv].nfast = overlap.isize; + plan->unpackplan[nrecv].nmid = overlap.jsize; + plan->unpackplan[nrecv].nslow = overlap.ksize; + plan->unpackplan[nrecv].nstride_line = nqty*out.jsize; + plan->unpackplan[nrecv].nstride_plane = nqty*out.ksize*out.jsize; + plan->unpackplan[nrecv].nqty = nqty; + } + else { + plan->recv_offset[nrecv] = nqty * + ((overlap.jlo-out.jlo)*out.isize*out.ksize + + (overlap.ilo-out.ilo)*out.ksize + (overlap.klo-out.klo)); + plan->unpackplan[nrecv].nfast = overlap.isize; + plan->unpackplan[nrecv].nmid = overlap.jsize; + plan->unpackplan[nrecv].nslow = overlap.ksize; + plan->unpackplan[nrecv].nstride_line = nqty*out.ksize; + plan->unpackplan[nrecv].nstride_plane = nqty*out.isize*out.ksize; + plan->unpackplan[nrecv].nqty = nqty; + } + + plan->recv_size[nrecv] = nqty*overlap.isize*overlap.jsize*overlap.ksize; + ibuf += plan->recv_size[nrecv]; + nrecv++; + } + } + + // plan->nrecv = # of recvs not including self + + if (nrecv && plan->recv_proc[nrecv-1] == me) plan->nrecv = nrecv - 1; + else plan->nrecv = nrecv; + + // init remaining fields in remap plan + + plan->memory = memory; + + if (nrecv == plan->nrecv) plan->self = 0; + else plan->self = 1; + + + // the plan->d_sendbuf and plan->d_recvbuf are used by both the + // collective & non-collective implementations. + // For non-collective, the buffer size is MAX(send_size) for any one send + + // find biggest send message (not including self) and malloc space for it + + size = 0; + for (nsend = 0; nsend < plan->nsend; nsend++) + size = MAX(size,plan->send_size[nsend]); + + if (size) { + plan->d_sendbuf = typename FFT_AT::t_FFT_SCALAR_1d("remap3d:sendbuf",size); + if (!plan->d_sendbuf.data()) return nullptr; + } + + // if requested, allocate internal scratch space for recvs, + // only need it if I will receive any data (including self) + + if (memory == 1) { + if (nrecv > 0) { + plan->d_scratch = + typename FFT_AT::t_FFT_SCALAR_1d("remap3d:scratch",nqty*out.isize*out.jsize*out.ksize); + if (!plan->d_scratch.data()) return nullptr; + } + } + + // Non-collectives do not use MPI Communicator Groups + + MPI_Comm_dup(comm,&plan->comm); + } else { + + // Improved approach - use an AllReduce to aggregate which ranks need to be included + // To do this, we build the local proc's send/receive list, then do an AllReduce + // to create the send/recv count for the Alltoallv + + // local arrays to be used in the allreduce + // start with max length -- nprocs. Unused entries will be removed later + + int *local_cnts = (int*) malloc(2*nprocs*sizeof(int)); + if (local_cnts == nullptr) return nullptr; + int *local_sendcnts = local_cnts; + int *local_recvcnts = (local_cnts + nprocs); + + // local arrays used to store the results of the allreduce + + int *global_cnts = (int*) malloc(2*nprocs*sizeof(int)); + if (global_cnts == nullptr) return nullptr; + int *global_sendcnts = global_cnts; + int *global_recvcnts = (global_cnts + nprocs); + + // count send & recv collides, including self + + nsend = 0; + nrecv = 0; + for (i = 0; i < nprocs; i++) { + local_sendcnts[i] = remap_3d_collide(&in,&outarray[i],&overlap); + local_recvcnts[i] = remap_3d_collide(&out,&inarray[i],&overlap); + nsend += local_sendcnts[i]; + nrecv += local_recvcnts[i]; + } + + // perform an AllReduce to get the counts from all other processors and build sendcnts list + + MPI_Allreduce(local_cnts, global_cnts, 2*nprocs, MPI_INT, MPI_SUM, comm); + + // now remove procs that are 0 in send or recv to create minimized sendcnts/recvcnts for AlltoAllv + // also builds commringlist -- which is already sorted + + int *commringlist = (int*) malloc(nprocs * sizeof(int)); + int commringlen = 0; + + for (i = 0; i < nprocs; i++) { + if (global_sendcnts[i] > 0 || global_recvcnts[i] > 0) { + commringlist[commringlen] = i; + commringlen++; + } + } + + // resize commringlist to final size + + commringlist = (int *) realloc(commringlist, commringlen*sizeof(int)); + + // set the plan->commringlist + + plan->commringlen = commringlen; + plan->commringlist = commringlist; + + // clean up local buffers that are finished + + local_sendcnts = nullptr; + local_recvcnts = nullptr; + global_recvcnts = nullptr; + global_sendcnts = nullptr; + free(local_cnts); + free(global_cnts); + + // malloc space for send & recv info + // if the current proc is involved in any way in the communication, allocate space + // because of the Alltoallv, both send and recv have to be initialized even if + // only one of those is performed + + if (nsend || nrecv) { + + // send space + + plan->selfcommringloc = -1; + plan->selfnsendloc = -1; + plan->selfnrecvloc = -1; + + plan->nsend = nsend; + plan->pack = PackKokkos::pack_3d; + + plan->send_offset = (int *) malloc(nsend*sizeof(int)); + plan->send_size = (int *) malloc(plan->commringlen*sizeof(int)); + + plan->sendcnts = (int *) malloc(plan->commringlen*sizeof(int)); + plan->sdispls = (int *) malloc(plan->commringlen*sizeof(int)); + + // only used when sendcnt > 0 + + plan->packplan = (struct pack_plan_3d *) + malloc(nsend*sizeof(struct pack_plan_3d)); + + if (plan->send_offset == nullptr || plan->send_size == nullptr || + plan->sendcnts == nullptr || plan->sdispls == nullptr || + plan->packplan == nullptr) return nullptr; + + // recv space + + plan->nrecv = nrecv; + + if (permute == 0) + plan->unpack = PackKokkos::unpack_3d; + else if (permute == 1) { + if (nqty == 1) + plan->unpack = PackKokkos::unpack_3d_permute1_1; + else if (nqty == 2) + plan->unpack = PackKokkos::unpack_3d_permute1_2; + else + plan->unpack = PackKokkos::unpack_3d_permute1_n; + } + else if (permute == 2) { + if (nqty == 1) + plan->unpack = PackKokkos::unpack_3d_permute2_1; + else if (nqty == 2) + plan->unpack = PackKokkos::unpack_3d_permute2_2; + else + plan->unpack = PackKokkos::unpack_3d_permute2_n; + } + + plan->recv_offset = (int *) malloc(nrecv*sizeof(int)); + plan->recv_size = (int *) malloc(plan->commringlen*sizeof(int)); + + plan->rcvcnts = (int *) malloc(plan->commringlen*sizeof(int)); + plan->rdispls = (int *) malloc(plan->commringlen*sizeof(int)); + + // only used when recvcnt > 0 + + plan->unpackplan = (struct pack_plan_3d *) + malloc(nrecv*sizeof(struct pack_plan_3d)); + + if (plan->recv_offset == nullptr || plan->recv_size == nullptr || + plan->rcvcnts == nullptr || plan->rdispls == nullptr || + plan->unpackplan == nullptr) return nullptr; + } + + // store send info, with self as last entry + + nsend = 0; + ibuf = 0; + int total_send_size = 0; + for (i = 0; i < plan->commringlen; i++) { + iproc = plan->commringlist[i]; + if (iproc == me) { + plan->selfcommringloc = i; + plan->selfnsendloc = nsend; + } + if (remap_3d_collide(&in,&outarray[iproc],&overlap)) { + //plan->send_proc[nsend] = i; + // number of entries required for this pack's 3-d coords + plan->send_offset[nsend] = nqty * + ((overlap.klo-in.klo)*in.jsize*in.isize + + ((overlap.jlo-in.jlo)*in.isize + overlap.ilo-in.ilo)); + plan->packplan[nsend].nfast = nqty*overlap.isize; + plan->packplan[nsend].nmid = overlap.jsize; + plan->packplan[nsend].nslow = overlap.ksize; + plan->packplan[nsend].nstride_line = nqty*in.isize; + plan->packplan[nsend].nstride_plane = nqty*in.jsize*in.isize; + plan->packplan[nsend].nqty = nqty; + // total amount of overlap + plan->send_size[i] = nqty*overlap.isize*overlap.jsize*overlap.ksize; + plan->sendcnts[i] = plan->send_size[i]; + plan->sdispls[i] = ibuf; + ibuf += plan->send_size[i]; + nsend++; + } else { + plan->send_size[i] = 0; + plan->sdispls[i] = ibuf; + plan->sendcnts[i] = 0; + } + total_send_size += plan->send_size[i]; + } + + if (total_send_size) { + plan->d_sendbuf = typename FFT_AT::t_FFT_SCALAR_1d("remap3d:sendbuf",total_send_size); + if (!plan->d_sendbuf.data()) return nullptr; + } + + // store recv info, with self as last entry + + ibuf = 0; + nrecv = 0; + + for (i = 0; i < plan->commringlen; i++) { + iproc = plan->commringlist[i]; + if (iproc == me) { + plan->selfnrecvloc = nrecv; + } + if (remap_3d_collide(&out,&inarray[iproc],&overlap)) { + + if (permute == 0) { + plan->recv_offset[nrecv] = nqty * + ((overlap.klo-out.klo)*out.jsize*out.isize + + (overlap.jlo-out.jlo)*out.isize + (overlap.ilo-out.ilo)); + plan->unpackplan[nrecv].nfast = nqty*overlap.isize; + plan->unpackplan[nrecv].nmid = overlap.jsize; + plan->unpackplan[nrecv].nslow = overlap.ksize; + plan->unpackplan[nrecv].nstride_line = nqty*out.isize; + plan->unpackplan[nrecv].nstride_plane = nqty*out.jsize*out.isize; + plan->unpackplan[nrecv].nqty = nqty; + } + else if (permute == 1) { + plan->recv_offset[nrecv] = nqty * + ((overlap.ilo-out.ilo)*out.ksize*out.jsize + + (overlap.klo-out.klo)*out.jsize + (overlap.jlo-out.jlo)); + plan->unpackplan[nrecv].nfast = overlap.isize; + plan->unpackplan[nrecv].nmid = overlap.jsize; + plan->unpackplan[nrecv].nslow = overlap.ksize; + plan->unpackplan[nrecv].nstride_line = nqty*out.jsize; + plan->unpackplan[nrecv].nstride_plane = nqty*out.ksize*out.jsize; + plan->unpackplan[nrecv].nqty = nqty; + } + else { + plan->recv_offset[nrecv] = nqty * + ((overlap.jlo-out.jlo)*out.isize*out.ksize + + (overlap.ilo-out.ilo)*out.ksize + (overlap.klo-out.klo)); + plan->unpackplan[nrecv].nfast = overlap.isize; + plan->unpackplan[nrecv].nmid = overlap.jsize; + plan->unpackplan[nrecv].nslow = overlap.ksize; + plan->unpackplan[nrecv].nstride_line = nqty*out.ksize; + plan->unpackplan[nrecv].nstride_plane = nqty*out.isize*out.ksize; + plan->unpackplan[nrecv].nqty = nqty; + } + + plan->recv_size[i] = nqty*overlap.isize*overlap.jsize*overlap.ksize; + plan->rcvcnts[i] = plan->recv_size[i]; + plan->rdispls[i] = ibuf; + ibuf += plan->recv_size[i]; + nrecv++; + } else { + plan->recv_size[i] = 0; + plan->rcvcnts[i] = 0; + plan->rdispls[i] = ibuf; + } + } + + // init remaining fields in remap plan + + plan->memory = memory; + + if (plan->sendcnts[plan->selfcommringloc]) { + plan->self = 1; + plan->sendcnts[plan->selfcommringloc] = 0; + plan->rcvcnts[plan->selfcommringloc] = 0; + } + else { + plan->self = 0; + } + + + // if requested, allocate internal scratch space for recvs, + // only need it if I will receive any data (including self) + + if (memory == 1) { + if (nrecv > 0) { + plan->d_scratch = + typename FFT_AT::t_FFT_SCALAR_1d("remap3d:scratch",nqty*out.isize*out.jsize*out.ksize); + if (!plan->d_scratch.data()) return nullptr; + } + } + + // if using collective and the commringlist is NOT empty create a + // communicator for the plan based off an MPI_Group created with + // ranks from the commringlist + + if (plan->commringlen > 0) { + MPI_Group orig_group, new_group; + MPI_Comm_group(comm, &orig_group); + MPI_Group_incl(orig_group, plan->commringlen, + plan->commringlist, &new_group); + MPI_Comm_create(comm, new_group, &plan->comm); + } + + // if using collective and the comm ring list is empty create + // a communicator for the plan with an empty group + + else + MPI_Comm_create(comm, MPI_GROUP_EMPTY, &plan->comm); } - // plan->nrecv = # of recvs not including self - // for collectives include self in the nsend list - - if (nrecv && plan->recv_proc[nrecv-1] == me) { - if (plan->usecollective) plan->nrecv = nrecv; - else plan->nrecv = nrecv - 1; - } else plan->nrecv = nrecv; - - // init remaining fields in remap plan - - plan->memory = memory; - - if (nrecv == plan->nrecv) plan->self = 0; - else plan->self = 1; - // free locally malloced space free(inarray); free(outarray); - // find biggest send message (not including self) and malloc space for it - - size = 0; - for (nsend = 0; nsend < plan->nsend; nsend++) - size = MAX(size,plan->send_size[nsend]); - - if (size) { - plan->d_sendbuf = typename FFT_AT::t_FFT_SCALAR_1d("remap3d:sendbuf",size); - if (!plan->d_sendbuf.data()) return nullptr; - } - - // if requested, allocate internal scratch space for recvs, - // only need it if I will receive any data (including self) - - if (memory == 1) { - if (nrecv > 0) { - plan->d_scratch = - typename FFT_AT::t_FFT_SCALAR_1d("remap3d:scratch",nqty*out.isize*out.jsize*out.ksize); - if (!plan->d_scratch.data()) return nullptr; - } - } - - // not using collective - dup comm - - MPI_Comm_dup(comm,&plan->comm); - // return pointer to plan return plan; @@ -500,22 +824,45 @@ void RemapKokkos::remap_3d_destroy_plan_kokkos(struct remap_plan_3d_ if (!((plan->usecollective) && (plan->commringlen == 0))) MPI_Comm_free(&plan->comm); - // free internal arrays + if (plan->usecollective) { + if (plan->commringlist != nullptr) { + free(plan->commringlist); + free(plan->sendcnts); + free(plan->rcvcnts); + free(plan->sdispls); + free(plan->rdispls); + } - if (plan->nsend || plan->self) { - free(plan->send_offset); - free(plan->send_size); - free(plan->send_proc); - free(plan->packplan); - } + if (plan->nsend) { + free(plan->send_offset); + free(plan->send_size); + free(plan->packplan); + } - if (plan->nrecv || plan->self) { - free(plan->recv_offset); - free(plan->recv_size); - free(plan->recv_proc); - free(plan->recv_bufloc); - free(plan->request); - free(plan->unpackplan); + if (plan->nrecv) { + free(plan->recv_offset); + free(plan->recv_size); + free(plan->unpackplan); + } + } else { + + // free arrays used in pt2pt communication + + if (plan->nsend || plan->self) { + free(plan->send_offset); + free(plan->send_size); + free(plan->send_proc); + free(plan->packplan); + } + + if (plan->nrecv || plan->self) { + free(plan->recv_offset); + free(plan->recv_size); + free(plan->recv_proc); + free(plan->recv_bufloc); + free(plan->request); + free(plan->unpackplan); + } } // free plan itself diff --git a/src/KOKKOS/remap_kokkos.h b/src/KOKKOS/remap_kokkos.h index 77a3b1a37a..b0ccdb342d 100644 --- a/src/KOKKOS/remap_kokkos.h +++ b/src/KOKKOS/remap_kokkos.h @@ -44,6 +44,7 @@ struct remap_plan_3d_kokkos { int *recv_size; // size of each recv message int *recv_proc; // proc to recv each message from int *recv_bufloc; // offset in scratch buf for each recv + int *nrecvmap; // maps receive index to rank index MPI_Request *request; // MPI request for each posted recv struct pack_plan_3d *unpackplan; // unpack plan for each recv message int nrecv; // # of recvs from other procs @@ -52,9 +53,17 @@ struct remap_plan_3d_kokkos { int memory; // user provides scratch space or not MPI_Comm comm; // group of procs performing remap int usecollective; // use collective or point-to-point MPI + int usegpu_aware; // use GPU-Aware MPI or not + // variables for collective MPI only int commringlen; // length of commringlist int *commringlist; // ranks on communication ring of this plan - int usegpu_aware; // use GPU-Aware MPI or not + int *sendcnts; // # of elements in send buffer for each rank + int *rcvcnts; // # of elements in recv buffer for each rank + int *sdispls; // extraction location in send buffer for each rank + int *rdispls; // extraction location in recv buffer for each rank + int selfcommringloc; // current proc's location in commringlist + int selfnsendloc; // current proc's location in send lists + int selfnrecvloc; // current proc's location in recv lists }; template diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 4fe5075f44..9665d2392d 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -1384,15 +1384,20 @@ void PPPM::set_grid_local() // npey_fft,npez_fft = # of procs in y,z dims // if nprocs is small enough, proc can own 1 or more entire xy planes, // else proc owns 2d sub-blocks of yz plane + // NOTE: commented out lines support this + // need to ensure fft3d.cpp and remap.cpp support 2D planes // me_y,me_z = which proc (0-npe_fft-1) I am in y,z dimensions // nlo_fft,nhi_fft = lower/upper limit of the section // of the global FFT mesh that I own in x-pencil decomposition int npey_fft,npez_fft; - if (nz_pppm >= nprocs) { - npey_fft = 1; - npez_fft = nprocs; - } else procs2grid2d(nprocs,ny_pppm,nz_pppm,&npey_fft,&npez_fft); + + //if (nz_pppm >= nprocs) { + // npey_fft = 1; + // npez_fft = nprocs; + //} else procs2grid2d(nprocs,ny_pppm,nz_pppm,&npey_fft,&npez_fft); + + procs2grid2d(nprocs,ny_pppm,nz_pppm,&npey_fft,&npez_fft); int me_y = me % npey_fft; int me_z = me / npey_fft; diff --git a/src/LEPTON/pair_lepton_coul.h b/src/LEPTON/pair_lepton_coul.h index 8153792bd5..c58177c6cb 100644 --- a/src/LEPTON/pair_lepton_coul.h +++ b/src/LEPTON/pair_lepton_coul.h @@ -27,8 +27,8 @@ namespace LAMMPS_NS { class PairLeptonCoul : public PairLepton { public: - PairLeptonCoul(class LAMMPS *_lmp) : PairLepton(_lmp){}; - ~PairLeptonCoul() override{}; + PairLeptonCoul(class LAMMPS *_lmp) : PairLepton(_lmp) {}; + ~PairLeptonCoul() override {}; void compute(int, int) override; void settings(int, char **) override; void init_style() override; diff --git a/src/LEPTON/pair_lepton_sphere.h b/src/LEPTON/pair_lepton_sphere.h index ab586a309b..9e2642ac50 100644 --- a/src/LEPTON/pair_lepton_sphere.h +++ b/src/LEPTON/pair_lepton_sphere.h @@ -27,7 +27,7 @@ namespace LAMMPS_NS { class PairLeptonSphere : public PairLepton { public: - PairLeptonSphere(class LAMMPS *_lmp) : PairLepton(_lmp){}; + PairLeptonSphere(class LAMMPS *_lmp) : PairLepton(_lmp) {}; void compute(int, int) override; void settings(int, char **) override; diff --git a/src/MANYBODY/pair_bop.h b/src/MANYBODY/pair_bop.h index b210d1cc07..cdc6033f00 100644 --- a/src/MANYBODY/pair_bop.h +++ b/src/MANYBODY/pair_bop.h @@ -57,18 +57,18 @@ class PairBOP : public Pair { struct PairList1 { double r, dis[3]; double betaS, dBetaS, betaP, dBetaP, rep, dRep; - PairList1(){}; + PairList1() {}; }; struct PairList2 { double r, dis[3]; double rep, dRep; - PairList2(){}; + PairList2() {}; }; struct TripleList { double G, dG, cosAng, dCosAngi[3], dCosAngj[3], dCosAngk[3]; - TripleList(){}; + TripleList() {}; }; struct B_SG { diff --git a/src/MANYBODY/pair_meam_spline.h b/src/MANYBODY/pair_meam_spline.h index ee09b045cf..47f3f3d8df 100644 --- a/src/MANYBODY/pair_meam_spline.h +++ b/src/MANYBODY/pair_meam_spline.h @@ -197,16 +197,10 @@ class PairMEAMSpline : public Pair { } /// Returns the number of bytes used by this function object. - double memory_usage() const - { - return sizeof(*this) + sizeof(X[0]) * N * 3; - } + double memory_usage() const { return sizeof(*this) + sizeof(X[0]) * N * 3; } /// Returns the cutoff radius of this function. - double cutoff() const - { - return X[N - 1]; - } + double cutoff() const { return X[N - 1]; } /// Writes a Gnuplot script that plots the spline function. void writeGnuplot(const char *filename, const char *title = nullptr) const; diff --git a/src/MANYBODY/pair_meam_sw_spline.h b/src/MANYBODY/pair_meam_sw_spline.h index 9123f8c560..a5c1b0ffd4 100644 --- a/src/MANYBODY/pair_meam_sw_spline.h +++ b/src/MANYBODY/pair_meam_sw_spline.h @@ -187,16 +187,10 @@ class PairMEAMSWSpline : public Pair { } /// Returns the number of bytes used by this function object. - double memory_usage() const - { - return sizeof(*this) + sizeof(X[0]) * N * 3; - } + double memory_usage() const { return sizeof(*this) + sizeof(X[0]) * N * 3; } /// Returns the cutoff radius of this function. - double cutoff() const - { - return X[N - 1]; - } + double cutoff() const { return X[N - 1]; } /// Writes a Gnuplot script that plots the spline function. void writeGnuplot(const char *filename, const char *title = nullptr) const; diff --git a/src/MANYBODY/pair_rebomos.h b/src/MANYBODY/pair_rebomos.h index 856a52ca81..d36eb41a74 100644 --- a/src/MANYBODY/pair_rebomos.h +++ b/src/MANYBODY/pair_rebomos.h @@ -49,7 +49,7 @@ class PairREBOMoS : public Pair { int *REBO_numneigh; // # of pair neighbors for each atom int **REBO_firstneigh; // ptr to 1st neighbor of each atom - double *nM, *nS; // sum of weighting fns with REBO neighs + double *nM, *nS; // sum of weighting fns with REBO neighs double rcmin[2][2], rcmax[2][2], rcmaxsq[2][2], rcmaxp[2][2]; double Q[2][2], alpha[2][2], A[2][2], BIJc[2][2], Beta[2][2]; diff --git a/src/MANYBODY/pair_tersoff_mod_c.h b/src/MANYBODY/pair_tersoff_mod_c.h index aff1883bbd..8cea97baaf 100644 --- a/src/MANYBODY/pair_tersoff_mod_c.h +++ b/src/MANYBODY/pair_tersoff_mod_c.h @@ -26,7 +26,7 @@ namespace LAMMPS_NS { class PairTersoffMODC : public PairTersoffMOD { public: - PairTersoffMODC(class LAMMPS *lmp) : PairTersoffMOD(lmp){}; + PairTersoffMODC(class LAMMPS *lmp) : PairTersoffMOD(lmp) {}; static constexpr int NPARAMS_PER_LINE = 21; diff --git a/src/ML-PACE/pair_pace.h b/src/ML-PACE/pair_pace.h index 5cff7045fa..a972e857d2 100644 --- a/src/ML-PACE/pair_pace.h +++ b/src/ML-PACE/pair_pace.h @@ -55,7 +55,7 @@ class PairPACE : public Pair { int nmax_corerep; virtual void allocate(); - double *corerep_factor; //per-atom core-rep factor (= 1 - fcut) + double *corerep_factor; //per-atom core-rep factor (= 1 - fcut) int flag_corerep_factor; double **scale; diff --git a/src/ML-QUIP/pair_quip.h b/src/ML-QUIP/pair_quip.h index 2cbbcd4af8..7f23ab4478 100644 --- a/src/ML-QUIP/pair_quip.h +++ b/src/ML-QUIP/pair_quip.h @@ -43,8 +43,10 @@ class PairQUIP : public Pair { double init_one(int, int) override; void allocate(); void *extract(const char *, int &); + protected: double scale; + private: double cutoff; int *quip_potential; diff --git a/src/MOLECULE/angle_harmonic.cpp b/src/MOLECULE/angle_harmonic.cpp index e9f1c528ef..040cbe7530 100644 --- a/src/MOLECULE/angle_harmonic.cpp +++ b/src/MOLECULE/angle_harmonic.cpp @@ -276,17 +276,17 @@ void AngleHarmonic::born_matrix(int type, int i1, int i2, int i3, double &du, do double delx1 = x[i1][0] - x[i2][0]; double dely1 = x[i1][1] - x[i2][1]; double delz1 = x[i1][2] - x[i2][2]; - domain->minimum_image(delx1,dely1,delz1); - double r1 = sqrt(delx1*delx1 + dely1*dely1 + delz1*delz1); + domain->minimum_image(delx1, dely1, delz1); + double r1 = sqrt(delx1 * delx1 + dely1 * dely1 + delz1 * delz1); double delx2 = x[i3][0] - x[i2][0]; double dely2 = x[i3][1] - x[i2][1]; double delz2 = x[i3][2] - x[i2][2]; - domain->minimum_image(delx2,dely2,delz2); - double r2 = sqrt(delx2*delx2 + dely2*dely2 + delz2*delz2); + domain->minimum_image(delx2, dely2, delz2); + double r2 = sqrt(delx2 * delx2 + dely2 * dely2 + delz2 * delz2); - double c = delx1*delx2 + dely1*dely2 + delz1*delz2; - c /= r1*r2; + double c = delx1 * delx2 + dely1 * dely2 + delz1 * delz2; + c /= r1 * r2; if (c > 1.0) c = 1.0; if (c < -1.0) c = -1.0; double theta = acos(c); diff --git a/src/MOLECULE/dihedral_multi_harmonic.cpp b/src/MOLECULE/dihedral_multi_harmonic.cpp index 8e6685cac9..2d1e16b9e4 100644 --- a/src/MOLECULE/dihedral_multi_harmonic.cpp +++ b/src/MOLECULE/dihedral_multi_harmonic.cpp @@ -326,8 +326,8 @@ void DihedralMultiHarmonic::write_data(FILE *fp) /* ---------------------------------------------------------------------- */ -void DihedralMultiHarmonic::born_matrix(int nd, int i1, int i2, int i3, int i4, - double &du, double &du2) +void DihedralMultiHarmonic::born_matrix(int nd, int i1, int i2, int i3, int i4, double &du, + double &du2) { double vb1x, vb1y, vb1z, vb2x, vb2y, vb2z, vb3x, vb3y, vb3z, vb2xm, vb2ym, vb2zm; double sb1, sb3, rb1, rb3, c0, b1mag2, b1mag, b2mag2; diff --git a/src/MOLECULE/dihedral_opls.cpp b/src/MOLECULE/dihedral_opls.cpp index eced454d68..e99d83f631 100644 --- a/src/MOLECULE/dihedral_opls.cpp +++ b/src/MOLECULE/dihedral_opls.cpp @@ -336,8 +336,7 @@ void DihedralOPLS::write_data(FILE *fp) /* ----------------------------------------------------------------------*/ -void DihedralOPLS::born_matrix(int nd, int i1, int i2, int i3, int i4, - double &du, double &du2) +void DihedralOPLS::born_matrix(int nd, int i1, int i2, int i3, int i4, double &du, double &du2) { double vb1x, vb1y, vb1z, vb2x, vb2y, vb2z, vb3x, vb3y, vb3z, vb2xm, vb2ym, vb2zm; double sb1, sb3, rb1, rb3, c0, b1mag2, b1mag, b2mag2; @@ -425,9 +424,10 @@ void DihedralOPLS::born_matrix(int nd, int i1, int i2, int i3, int i4, si = sin(phi); if (fabs(si) < SMALLER) si = SMALLER; - du = k1[type] - 2.0 * k2[type] * sin(2.0 * phi) / si + 3.0 * k3[type] * sin(3.0 * phi) / si - - 4.0 * k4[type] * sin(4.0 * phi) / si; - du2 = (4.0 * k2[type] * si * cos(2.0 * phi) - 2.0 * k2[type] * sin(2.0 * phi) - - 9.0 * k3[type] * si * cos(3.0 * phi) + 3.0 * k3[type] * sin(3.0 * phi) - + 16.0 * k4[type] * si * cos(4.0 * phi) - 4.0 * k4[type] * sin(4.0 * phi)) / (si * si * si); + du = k1[type] - 2.0 * k2[type] * sin(2.0 * phi) / si + 3.0 * k3[type] * sin(3.0 * phi) / si - + 4.0 * k4[type] * sin(4.0 * phi) / si; + du2 = (4.0 * k2[type] * si * cos(2.0 * phi) - 2.0 * k2[type] * sin(2.0 * phi) - + 9.0 * k3[type] * si * cos(3.0 * phi) + 3.0 * k3[type] * sin(3.0 * phi) + + 16.0 * k4[type] * si * cos(4.0 * phi) - 4.0 * k4[type] * sin(4.0 * phi)) / + (si * si * si); } diff --git a/src/OPT/pair_aip_water_2dm_opt.h b/src/OPT/pair_aip_water_2dm_opt.h index 50b5043360..18eee58d72 100644 --- a/src/OPT/pair_aip_water_2dm_opt.h +++ b/src/OPT/pair_aip_water_2dm_opt.h @@ -1,4 +1,4 @@ - /* -*- c++ -*- ---------------------------------------------------------- +/* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories LAMMPS development team: developers@lammps.org @@ -20,8 +20,8 @@ PairStyle(aip/water/2dm/opt,PairAIPWATER2DMOpt); #ifndef LMP_PAIR_AIP_WATER_2DM_OPT_H #define LMP_PAIR_AIP_WATER_2DM_OPT_H -#include "pair_ilp_graphene_hbn_opt.h" #include "pair_aip_water_2dm.h" +#include "pair_ilp_graphene_hbn_opt.h" namespace LAMMPS_NS { diff --git a/src/OPT/pair_ilp_graphene_hbn_opt.h b/src/OPT/pair_ilp_graphene_hbn_opt.h index 01b66bb2fa..f2fa30d595 100644 --- a/src/OPT/pair_ilp_graphene_hbn_opt.h +++ b/src/OPT/pair_ilp_graphene_hbn_opt.h @@ -35,8 +35,8 @@ class PairILPGrapheneHBNOpt : virtual public PairILPGrapheneHBN { protected: void update_internal_list(); template - void calc_atom_normal(int i, int itype, int *ILP_neigh, int nneigh, double *normal, double (*dnormdri)[3], - double (*dnormdrk)[3][3]); + void calc_atom_normal(int i, int itype, int *ILP_neigh, int nneigh, double *normal, + double (*dnormdri)[3], double (*dnormdrk)[3][3]); template void eval(); int *layered_neigh; @@ -51,7 +51,6 @@ class PairILPGrapheneHBNOpt : virtual public PairILPGrapheneHBN { SAIP_BNCH, WATER, }; - }; } // namespace LAMMPS_NS diff --git a/src/Purge.list b/src/Purge.list index 14708a111e..7098d39e3a 100644 --- a/src/Purge.list +++ b/src/Purge.list @@ -53,6 +53,11 @@ lmpinstalledpkgs.h lmpgitversion.h mliap_model_python_couple.cpp mliap_model_python_couple.h +# renamed in September 2024 +group_ndx.cpp +group_ndx.h +ndx_group.cpp +ndx_group.h # removed in August 2023 dump_atom_mpiio.cpp dump_atom_mpiio.h diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index 31fbf4a053..cd331b5f30 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -271,7 +271,7 @@ void FixQEq::allocate_matrix() } bigint m_cap_big = (bigint)MAX(m * safezone, mincap * MIN_NBRS); if (m_cap_big > MAXSMALLINT) - error->one(FLERR,"Too many neighbors in fix qeq"); + error->one(FLERR,"Too many neighbors in fix {}",style); m_cap = m_cap_big; H.n = n_cap; diff --git a/src/REAXFF/fix_qeq_reaxff.cpp b/src/REAXFF/fix_qeq_reaxff.cpp index adaf5be031..921f6e0261 100644 --- a/src/REAXFF/fix_qeq_reaxff.cpp +++ b/src/REAXFF/fix_qeq_reaxff.cpp @@ -363,7 +363,7 @@ void FixQEqReaxFF::allocate_matrix() } 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 qeq/reaxff"); + error->one(FLERR,"Too many neighbors in fix {}",style); m_cap = m_cap_big; H.n = n_cap; diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index ee94c2d9a7..40bb206bd2 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -214,8 +214,10 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : iarg += 2; } else if (strcmp(arg[iarg], "inputs") == 0) { if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, mycmd + " inputs", error); - if (strcmp(arg[iarg+1], "peratom") == 0) input_mode = PERATOM; - else if (strcmp(arg[iarg+1], "local") == 0) input_mode = LOCAL; + if (strcmp(arg[iarg + 1], "peratom") == 0) + input_mode = PERATOM; + else if (strcmp(arg[iarg + 1], "local") == 0) + input_mode = LOCAL; iarg += 2; } else error->all(FLERR, "Unknown compute {} keyword: {}", style, arg[iarg]); @@ -242,7 +244,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : for (auto &val : values) { if (val.which == ArgInfo::X || val.which == ArgInfo::V || val.which == ArgInfo::F) { - if (input_mode == LOCAL) error->all(FLERR,"Compute {} inputs must be all local"); + if (input_mode == LOCAL) error->all(FLERR, "Compute {} inputs must be all local"); } else if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); @@ -251,11 +253,14 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : if (input_mode == PERATOM) { if (!val.val.c->peratom_flag) - error->all(FLERR, "Compute {} compute {} does not calculate per-atom values", style, val.id); + error->all(FLERR, "Compute {} compute {} does not calculate per-atom values", style, + val.id); if (val.argindex == 0 && val.val.c->size_peratom_cols != 0) - error->all(FLERR, "Compute {} compute {} does not calculate a per-atom vector", style, val.id); + error->all(FLERR, "Compute {} compute {} does not calculate a per-atom vector", style, + val.id); if (val.argindex && val.val.c->size_peratom_cols == 0) - error->all(FLERR, "Compute {} compute {} does not calculate a per-atom array", style, val.id); + error->all(FLERR, "Compute {} compute {} does not calculate a per-atom array", style, + val.id); if (val.argindex && val.argindex > val.val.c->size_peratom_cols) error->all(FLERR, "Compute {} compute {} array is accessed out-of-range", style, val.id); @@ -263,9 +268,11 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : if (!val.val.c->local_flag) error->all(FLERR, "Compute {} compute {} does not calculate local values", style, val.id); if (val.argindex == 0 && val.val.c->size_local_cols != 0) - error->all(FLERR, "Compute {} compute {} does not calculate a local vector", style, val.id); + error->all(FLERR, "Compute {} compute {} does not calculate a local vector", style, + val.id); if (val.argindex && val.val.c->size_local_cols == 0) - error->all(FLERR, "Compute {} compute {} does not calculate a local array", style, val.id); + error->all(FLERR, "Compute {} compute {} does not calculate a local array", style, + val.id); if (val.argindex && val.argindex > val.val.c->size_local_cols) error->all(FLERR, "Compute {} compute {} array is accessed out-of-range", style, val.id); } @@ -278,7 +285,8 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : if (!val.val.f->peratom_flag) error->all(FLERR, "Compute {} fix {} does not calculate per-atom values", style, val.id); if (val.argindex == 0 && (val.val.f->size_peratom_cols != 0)) - error->all(FLERR, "Compute {} fix {} does not calculate a per-atom vector", style, val.id); + error->all(FLERR, "Compute {} fix {} does not calculate a per-atom vector", style, + val.id); if (val.argindex && (val.val.f->size_peratom_cols == 0)) error->all(FLERR, "Compute {} fix {} does not calculate a per-atom array", style, val.id); if (val.argindex && (val.argindex > val.val.f->size_peratom_cols)) @@ -296,7 +304,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : } } else if (val.which == ArgInfo::VARIABLE) { - if (input_mode == LOCAL) error->all(FLERR,"Compute {} inputs must be all local"); + if (input_mode == LOCAL) error->all(FLERR, "Compute {} inputs must be all local"); val.val.v = input->variable->find(val.id.c_str()); if (val.val.v < 0) error->all(FLERR, "Variable name {} for compute {} does not exist", val.id, style); @@ -417,7 +425,8 @@ void ComputeReduce::compute_vector() } else if (mode == MINN) { if (!replace) { for (int m = 0; m < nvalues; m++) - MPI_Allreduce(&onevec[m], &vector[m], 1, MPI_DOUBLE, this->scalar_reduction_operation, world); + MPI_Allreduce(&onevec[m], &vector[m], 1, MPI_DOUBLE, this->scalar_reduction_operation, + world); } else { for (int m = 0; m < nvalues; m++) @@ -437,7 +446,8 @@ void ComputeReduce::compute_vector() } else if (mode == MAXX) { if (!replace) { for (int m = 0; m < nvalues; m++) - MPI_Allreduce(&onevec[m], &vector[m], 1, MPI_DOUBLE, this->scalar_reduction_operation, world); + MPI_Allreduce(&onevec[m], &vector[m], 1, MPI_DOUBLE, this->scalar_reduction_operation, + world); } else { for (int m = 0; m < nvalues; m++) diff --git a/src/fix_efield.cpp b/src/fix_efield.cpp index 81be66b3e3..a5f02cc7c8 100644 --- a/src/fix_efield.cpp +++ b/src/fix_efield.cpp @@ -114,7 +114,8 @@ FixEfield::FixEfield(LAMMPS *lmp, int narg, char **arg) : } if (estr && pstr) - error->all(FLERR, "Must not use energy and potential keywords at the same time with fix efield"); + error->all(FLERR, + "Must not use energy and potential keywords at the same time with fix efield"); force_flag = 0; fsum[0] = fsum[1] = fsum[2] = fsum[3] = 0.0; @@ -171,7 +172,8 @@ void FixEfield::init() if (xstr) { xvar = input->variable->find(xstr); - if (xvar < 0) error->all(FLERR, "Variable {} for x-field in fix {} does not exist", xstr, style); + if (xvar < 0) + error->all(FLERR, "Variable {} for x-field in fix {} does not exist", xstr, style); if (input->variable->equalstyle(xvar)) xstyle = EQUAL; else if (input->variable->atomstyle(xvar)) @@ -182,7 +184,8 @@ void FixEfield::init() if (ystr) { yvar = input->variable->find(ystr); - if (yvar < 0) error->all(FLERR, "Variable {} for y-field in fix {} does not exist", ystr, style); + if (yvar < 0) + error->all(FLERR, "Variable {} for y-field in fix {} does not exist", ystr, style); if (input->variable->equalstyle(yvar)) ystyle = EQUAL; else if (input->variable->atomstyle(yvar)) @@ -193,7 +196,8 @@ void FixEfield::init() if (zstr) { zvar = input->variable->find(zstr); - if (zvar < 0) error->all(FLERR, "Variable {} for z-field in fix {} does not exist", zstr, style); + if (zvar < 0) + error->all(FLERR, "Variable {} for z-field in fix {} does not exist", zstr, style); if (input->variable->equalstyle(zvar)) zstyle = EQUAL; else if (input->variable->atomstyle(zvar)) @@ -213,7 +217,8 @@ void FixEfield::init() if (pstr) { pvar = input->variable->find(pstr); - if (pvar < 0) error->all(FLERR, "Variable {} for potential in fix {} does not exist", pstr, style); + if (pvar < 0) + error->all(FLERR, "Variable {} for potential in fix {} does not exist", pstr, style); if (input->variable->atomstyle(pvar)) pstyle = ATOM; else @@ -244,8 +249,10 @@ void FixEfield::init() error->all(FLERR, "Cannot use variable energy with constant efield in fix {}", style); if (varflag == CONSTANT && pstyle != NONE) error->all(FLERR, "Cannot use variable potential with constant efield in fix {}", style); - if ((varflag == EQUAL || varflag == ATOM) && update->whichflag == 2 && estyle == NONE && pstyle == NONE) - error->all(FLERR, "Must use variable energy or potential with fix {} during minimization", style); + if ((varflag == EQUAL || varflag == ATOM) && update->whichflag == 2 && estyle == NONE && + pstyle == NONE) + error->all(FLERR, "Must use variable energy or potential with fix {} during minimization", + style); if (utils::strmatch(update->integrate_style, "^respa")) { ilevel_respa = (dynamic_cast(update->integrate))->nlevels - 1; @@ -403,8 +410,10 @@ void FixEfield::post_force(int vflag) } f[i][2] += fz; fsum[3] += fz; - if (pstyle == ATOM) fsum[0] += qe2f * q[i] * efield[i][3]; - else if (estyle == ATOM) fsum[0] += efield[i][3]; + if (pstyle == ATOM) + fsum[0] += qe2f * q[i] * efield[i][3]; + else if (estyle == ATOM) + fsum[0] += efield[i][3]; } } @@ -504,8 +513,10 @@ void FixEfield::update_efield_variables() } else if (zstyle == ATOM) { input->variable->compute_atom(zvar, igroup, &efield[0][2], 4, 0); } - if (pstyle == ATOM) input->variable->compute_atom(pvar, igroup, &efield[0][3], 4, 0); - else if (estyle == ATOM) input->variable->compute_atom(evar, igroup, &efield[0][3], 4, 0); + if (pstyle == ATOM) + input->variable->compute_atom(pvar, igroup, &efield[0][3], 4, 0); + else if (estyle == ATOM) + input->variable->compute_atom(evar, igroup, &efield[0][3], 4, 0); modify->addstep_compute(update->ntimestep + 1); } diff --git a/tools/regression-tests/README b/tools/regression-tests/README index 810b96e87c..1342e50310 100644 --- a/tools/regression-tests/README +++ b/tools/regression-tests/README @@ -1,5 +1,5 @@ The script `run_tests.py` in this folder is used to perform regression tests -using in-place example scripts. +using in-place example scripts and provided log files as reference. What this single script does is to launch the selected LAMMPS binary using a testing configuration defined in a `.yaml` file (e.g., `config.yaml`) @@ -19,60 +19,88 @@ within the specified tolerances in the test configuration `config.yaml` file. With the current features, users can: + specify which LAMMPS binary version to test (e.g., the version from a commit, or those from `lammps-testing`) - + specify the examples subfolders (thus the reference log files) seperately (e.g. from other LAMMPS versions or commits) - + specify tolerances for individual quantities for any input script to override the global values - + launch tests with `mpirun` with all supported command line features (multiple procs, multiple paritions, and suffices) - + skip certain input files if not interested, or no reference log file exists - + simplify the main LAMMPS builds, as long as a LAMMPS binary is available + + specify the examples subfolders (thus the reference log files) seperately (e.g. from other LAMMPS versions or commits), or + + specify a file that lists of the examples input scripts to test + + specify tolerances for individual quantities for any input script to override the global values in the config file + + launch tests with `mpirun` with all supported command line features (multiple procs, multiple paritions, and suffixes) + + skip certain input files (whose names match specified patterns) if not interested, or packaged not installed, or no reference log file exists + + set a timeout for every input script run if they may take too long + + skip numerical checks if the goal is just to check if the runs do not fail + +Some benefits include: + + + separating regression testing from building LAMMPS + + performing quick and full regression tests + + keeping track of the testing progress to resume the testing from the last checkpoint (skipping completed runs) + + distributing the input list across multiple processes by + splitting the list of input scripts into separate runs (there are ~800 input scripts under the top-level examples) + +Input arguments: + + + the path to a LAMMPS binary (can be relative to the working directory) + + a test configuration file (see tools/regression-tests/config.yaml for an example) + + a text file that lists of folders where the input scripts reside and how many of them line by line, or + a text file that list of input scripts, or + the path to the top-level examples + +Output: + + + failure.yaml : a dictionary of the failed runs and reasons + + progress.yaml: full testing results of the tested input scripts with the status (completed, failed or skipped) + with error messages (for failed runs), and walltime (in seconds) + + output.xml : testing results in the JUnit XML format + + run.log : screen output and error of individual runs Limitations: - - input scripts use thermo style multi (e.g., examples/peptide) do not work with the expected thermo output format - - input scripts that require partition runs (e.g. examples/neb) need a separate config file, e.g. "args: --partition 2x1" - - testing accelerator packages (GPU, INTEL, KOKKOS, OPENMP) need separate config files, "args: -sf omp -pk omp 4" - -TODO: - - + keep track of the testing progress to resume the testing from the last checkpoint - + distribute the input list across multiple processes via multiprocessing, or - split the list of input scripts into separate runs (there are 800+ input script under the top-level examples) - + be able to be invoked from run_tests in the lammps-testing infrastruture - + + input scripts use thermo style multi (e.g., examples/peptide) do not work with the expected thermo output format + + input scripts that require partition runs (e.g. examples/neb) need a separate config file, e.g., args: "--partition 3x1" + + testing with accelerator packages (GPU, INTEL, KOKKOS, OPENMP) need separate config files, e.g., args: "-sf omp -pk omp 4" The following Python packages need to be installed into an activated environment: - + python3 -m venv testing-env source testing-env/bin/activate pip install numpy pyyaml junit_xml +For all the supported arguments, run: -Example uses: + python3 tools/regression-tests/run_tests.py -h + +Example uses (aka, tests for this script): 1) Simple use (using the provided tools/regression-tests/config.yaml and the examples/ folder at the top level) - python3 run_tests.py --lmp-bin=/path/to/lmp_binary + python3 run_tests.py --lmp-bin=build/lmp --config-file=tools/regression-tests/config.yaml 2) Use a custom testing configuration python3 run_tests.py --lmp-bin=/path/to/lmp_binary --config-file=/path/to/config/file/config.yaml 3) Specify a list of example folders python3 run_tests.py --lmp-bin=/path/to/lmp_binary --config-file=/path/to/config/file/config.yaml \ - --example-folders="/path/to/examples/folder1;/path/to/examples/folder2" + --example-folders="/path/to/examples/melt;/path/to/examples/rigid" - The example folders can also be loaded from a text file list_subfolders1.txt: + The example subfolders can also be loaded from a text file list_subfolders1.txt: python3 run_tests.py --lmp-bin=/path/to/lmp_binary --config-file=/path/to/config/file/config.yaml \ - --list-input=list_subfolders1.txt --output-file=output1.txt --progress-file=progress1.yaml \ + --list-subfolders=list_subfolders1.txt --output-file=output1.txt --progress-file=progress1.yaml \ --log-file=run1.log - - 4) Test a LAMMPS binary with the whole top-level /examples folder in a LAMMPS source tree - python3 run_tests.py --lmp-bin=/path/to/lmp_binary --examples-top-level=/path/to/lammps/examples - 5) Analyze (dry run) the LAMMPS binary annd whole top-level /examples folder in a LAMMPS source tree + 4) Specify a list of example input scripts (e.g. obtained from running tools/regression-tests/get-quick-list.py) + python3 run_tests.py --lmp-bin=/path/to/lmp_binary --config-file=/path/to/config/file/config.yaml \ + --list-input=input_list.txt + + 5) Test a LAMMPS binary with the whole top-level /examples folder in a LAMMPS source tree + python3 run_tests.py --lmp-bin=/path/to/lmp_binary --examples-top-level=/path/to/lammps/examples + --config-file=tools/regression-tests/config.yaml + + 6) Analyze the LAMMPS binary and whole top-level /examples folder in a LAMMPS source tree and generate separate input lists for 8 workers: python3 run_tests.py --lmp-bin=/path/to/lmp_binary --examples-top-level=/path/to/lammps/examples \ - --dry-run --num-workers=8 + --analyze --num-workers=8 - This is used for splitting the subfolders into separate input lists and launching different instances - of run_tests.py simultaneously. + The output of this run is 8 files folder-list-[0-7].txt that lists the subfolders + and 8 files input-list-[0-7].txt that lists the input scripts under the top-level example folders. + With these lists, one can launch multiple instances of run_tests.py simultaneously + each with a list of example subfolders (Case 3), or with a list of input scripts (Case 4). An example of the test configuration `config.yaml` is given as below. @@ -107,17 +135,31 @@ An example of the test configuration `config.yaml` is given as below. abs: 1e-2 rel: 1e-4 skip: - [ in.rigid.poems3, - in.rigid.poems4, - in.rigid.poems5, + [ in.displ, + in.displ2, + in.*_imd*, ] nugget: 1.0 epsilon: 1e-16 + timeout: 180 -An example of the list of input scripts in a text file `list_subfolders1.txt` +An example of the list of example subfolders in a text file `list_subfolders1.txt` + + /home/codes/lammps/examples/melt 1 + /home/codes/lammps/examples/body 5 + /home/codes/lammps/examples/PACKAGES/dielectric 2 + /home/codes/lammps/examples/PACKAGES/tally 3 + +where the numbers are the number of input scripts (in.*) in the folders. + + +An example of the list of input scripts in a text file `input_list.txt` + + /home/codes/lammps/examples/melt/in.melt + /home/codes/lammps/examples/body/in.body + /home/codes/lammps/examples/body/in.cubes + /home/codes/lammps/examples/PACKAGES/dielectric/in.confined + /home/codes/lammps/examples/PACKAGES/tally/in.pe + /home/codes/lammps/examples/PACKAGES/tally/in.force -/home/codes/lammps/examples/melt -/home/codes/lammps/examples/body -/home/codes/lammps/examples/PACKAGES/dielectric -/home/codes/lammps/examples/PACKAGES/tally diff --git a/tools/regression-tests/config.yaml b/tools/regression-tests/config.yaml index 24f1ab0d67..dd7ffe0b03 100644 --- a/tools/regression-tests/config.yaml +++ b/tools/regression-tests/config.yaml @@ -3,7 +3,7 @@ nprocs: "4" args: "-cite none" mpiexec: "mpirun" - mpiexec_numproc_flag: "-np" + mpiexec_numproc_flag: "--host localhost:4 -np" tolerance: PotEng: abs: 1e-4 @@ -29,13 +29,10 @@ abs: 1e-2 rel: 1e-4 skip: - [ in.rigid.poems3, - in.rigid.poems4, - in.rigid.poems5, - in.peptide, - in.voronoi, - in.voronoi.2d, - in.voronoi.data, + [ + in.disp, + in.disp2, + in.dos, in.*_imd*, in.bucky-plus-cnt*, ] diff --git a/tools/regression-tests/config_quick.yaml b/tools/regression-tests/config_quick.yaml new file mode 100644 index 0000000000..bc6e19b730 --- /dev/null +++ b/tools/regression-tests/config_quick.yaml @@ -0,0 +1,44 @@ +--- + lmp_binary: "" + nprocs: "1" + args: "-cite none" + mpiexec: "" + mpiexec_numproc_flag: "" + tolerance: + PotEng: + abs: 1e-4 + rel: 1e-7 + TotEng: + abs: 1e-4 + rel: 1e-7 + Press: + abs: 1e-4 + rel: 1e-7 + Temp: + abs: 1e-4 + rel: 1e-7 + 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 + skip: + [ + in.disp, + in.disp2, + in.dos, + in.*_imd*, + in.bucky-plus-cnt*, + ] + + timeout: 30 + nugget: 1.0 + epsilon: 1e-16 + + diff --git a/tools/regression-tests/config_serial.yaml b/tools/regression-tests/config_serial.yaml new file mode 100644 index 0000000000..c685815ff0 --- /dev/null +++ b/tools/regression-tests/config_serial.yaml @@ -0,0 +1,44 @@ +--- + lmp_binary: "" + nprocs: "1" + args: "-cite none" + mpiexec: "" + mpiexec_numproc_flag: "" + tolerance: + PotEng: + abs: 1e-4 + rel: 1e-7 + TotEng: + abs: 1e-4 + rel: 1e-7 + Press: + abs: 1e-4 + rel: 1e-7 + Temp: + abs: 1e-4 + rel: 1e-7 + 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 + skip: + [ + in.disp, + in.disp2, + in.dos, + in.*_imd*, + in.bucky-plus-cnt*, + ] + + timeout: 180 + nugget: 1.0 + epsilon: 1e-16 + + diff --git a/tools/regression-tests/get_quick_list.py b/tools/regression-tests/get_quick_list.py new file mode 100644 index 0000000000..9ebcce0aa2 --- /dev/null +++ b/tools/regression-tests/get_quick_list.py @@ -0,0 +1,281 @@ +#!/usr/bin/env python3 +""" +Find all example input files containing commands changed in this branch versus develop. +Companion script to run_tests.py regression tester. +""" + +import os, re, sys, subprocess +from pathlib import Path + +if sys.version_info < (3,5): + raise BaseException("Must use at least Python 3.5") + +# infer top level LAMMPS dir from filename +LAMMPS_DIR = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..')) + +# ---------------------------------------------------------------------- + +def changed_files_from_git(branch='develop'): + """ + Return list of changed file from git. + + This function queries git to return the list of changed files on + the current branch relative to a given branch (default is 'develop'). + + param branch: branch to compare with + type branch: string + return: path names of files with changes relative to the repository root + rtype: list of strings + """ + + # get list of changed files relative to the develop branch from git + output = None + try: + output = subprocess.run('git diff --diff-filter=MA --name-status ' + branch, + shell=True, capture_output=True) + except: + pass + + # collect header files to check for styles + # - skip files that don't end in '.h' or '.cpp' + # - skip paths that don't start with 'src/' + # - replace '.cpp' with '.h' w/o checking it exists + headers = [] + # output will have a letter 'A' or 'M' for added or modified files followed by pathname + # append iterms to list and return it + if output: + for changed in output.stdout.decode().split(): + if (changed == 'A') or (changed == 'M'): continue + if not changed.startswith('src/'): continue + if changed.endswith('.h'): headers.append(changed) + if changed.endswith('.cpp'): headers.append(changed.replace('.cpp','.h')) + return headers + +# ---------------------------------------------------------------------- + +def get_command_from_header(headers, topdir="."): + """ + Loop over list of header files and extract style names, if present. + + LAMMPS commands have macros XxxxStyle() that connects a string with a class. + We search the header files for those macros, extract the string and append + it to a list in a dictionary of different types of styles. We skip over known + suffixes and deprecated commands. + + param headers: header files to check for commands + type headers: + return: dictionary with lists of style names + rtype: dict + """ + + styles = {} + styles['command'] = [] + styles['atom'] = [] + styles['compute'] = [] + styles['fix'] = [] + styles['pair'] = [] + styles['body'] = [] + styles['bond'] = [] + styles['angle'] = [] + styles['dihedral'] = [] + styles['improper'] = [] + styles['kspace'] = [] + styles['dump'] = [] + styles['region'] = [] + styles['integrate'] = [] + styles['minimize'] = [] + + # some regex + style_pattern = re.compile(r"(.+)Style\((.+),(.+)\)") + upper = re.compile("[A-Z]+") + gpu = re.compile("(.+)/gpu$") + intel = re.compile("(.+)/intel$") + kokkos = re.compile("(.+)/kk$") + kokkos_skip = re.compile("(.+)/kk/(host|device)$") + omp = re.compile("(.+)/omp$") + opt = re.compile("(.+)/opt$") + removed = re.compile("(.*)Deprecated$") + + for file in headers: + # don't fail if file is not present + try: + with open(os.path.join(topdir,file)) as f: + for line in f: + matches = style_pattern.findall(line) + for m in matches: + # skip over internal styles w/o explicit documentation + style = m[1] + if upper.match(style): + continue + + # skip over suffix styles: + suffix = kokkos_skip.match(style) + if suffix: + continue + suffix = gpu.match(style) + if suffix: + continue + suffix = intel.match(style) + if suffix: + continue + suffix = kokkos.match(style) + if suffix: + continue + suffix = omp.match(style) + if suffix: + continue + suffix = opt.match(style) + if suffix: + continue + deprecated = removed.match(m[2]) + if deprecated: + continue + + # register style and suffix flags + if m[0] == 'Angle': + styles['angle'].append(style) + elif m[0] == 'Atom': + styles['atom'].append(style) + elif m[0] == 'Body': + styles['body'].append(style) + elif m[0] == 'Bond': + styles['bond'].applend(style) + elif m[0] == 'Command': + styles['command'].append(style) + elif m[0] == 'Compute': + styles['compute'].append(style) + elif m[0] == 'Dihedral': + styles['dihedral'].append(style) + elif m[0] == 'Dump': + styles['dump'].append(style) + elif m[0] == 'Fix': + styles['fix'].append(style) + elif m[0] == 'Improper': + styles['improper'].append(style) + elif m[0] == 'Integrate': + styles['integrate'].append(style) + elif m[0] == 'KSpace': + styles['kspace'].append(style) + elif m[0] == 'Minimize': + styles['minimize'].append(style) + elif m[0] == 'Pair': + styles['pair'].append(style) + elif m[0] == 'Region': + styles['region'].append(style) + else: + pass + # header file not found or not readable + except: + pass + return styles + +# ---------------------------------------------------------------------- + +def make_regex(styles): + """Convert dictionary with styles into a regular expression to scan input files with + + This will construct a regular expression matching LAMMPS commands. Ignores continuation + + param styles: dictionary with style names + type styles: dict + return: combined regular expression string + rtype: string + """ + + restring = "^\\s*(" + if len(styles['command']): + restring += '(' + '|'.join(styles['command']) + ')|' + if len(styles['atom']): + restring += '(atom_style\\s+(' + '|'.join(styles['atom']) + '))|' + if len(styles['compute']): + restring += '(compute\\s+\\S+\\s+\\S+\\s+(' + '|'.join(styles['compute']) + '))|' + if len(styles['fix']): + restring += '(fix\\s+\\S+\\s+\\S+\\s+(' + '|'.join(styles['fix']) + '))|' + if len(styles['pair']): + restring += '(pair_style\\s+(' + '|'.join(styles['pair']) + '))|' + if len(styles['body']): + restring += '(atom_style\\s+body\\s+(' + '|'.join(styles['body']) + '))|' + if len(styles['bond']): + restring += '(bond_style\\s+(' + '|'.join(styles['bond']) + '))|' + if len(styles['angle']): + restring += '(angle_style\\s+(' + '|'.join(styles['angle']) + '))|' + if len(styles['dihedral']): + restring += '(dihedral_style\\s+(' + '|'.join(styles['dihedral']) + '))|' + if len(styles['improper']): + restring += '(improper_style\\s+(' + '|'.join(styles['improper']) + '))|' + if len(styles['kspace']): + restring += '(kspace_style\\s+(' + '|'.join(styles['kspace']) + '))|' + if len(styles['dump']): + restring += '(dump\\s+\\S+\\s+\\S+\\s+(' + '|'.join(styles['dump']) + '))|' + if len(styles['region']): + restring += '(region\\s+(' + '|'.join(styles['region']) + '))|' + if len(styles['integrate']): + restring += '(run_style\\s+(' + '|'.join(styles['integrate']) + '))|' + if len(styles['minimize']): + restring += '(min_style\\s+(' + '|'.join(styles['minimize']) + '))|' + + # replace last (pipe) character with closing parenthesis + length = len(restring) + restring = restring[:length-1] + ')' + # return combined regex string + if length > 5: + return restring + else: + return None + +# ---------------------------------------------------------------------- + +def get_examples_using_styles(regex, examples='examples'): + """ + Loop through LAMMPS examples tree and find all files staring with 'in.' + that have at least one line matching the regex. + + param regex: string pattern matching LAMMPS commands + type regex: compiled regex + param example: path where to start looking for examples recursively + type example: string + return: list of matching example inputs + rtype: list of strings + """ + + commands = re.compile(regex) + inputs = [] + for filename in Path(examples).rglob('in.*'): + with open(filename) as f: + for line in f: + if commands.match(line): + inputs.append(str(filename)) + break + return inputs + +# ---------------------------------------------------------------------- +# ---------------------------------------------------------------------- + +if __name__ == "__main__": + + headers = changed_files_from_git('origin/develop') + styles = get_command_from_header(headers, LAMMPS_DIR) + regex = make_regex(styles) + if regex: + inputs = get_examples_using_styles(regex, os.path.join(LAMMPS_DIR,'examples')) + else: + inputs = [] + print("Found changes to the following styles:") + print("Commands: ", styles['command']) + print("Atom styles: ", styles['atom']) + print("Compute styles: ", styles['compute']) + print("Fix styles: ", styles['fix']) + print("Pair styles: ", styles['pair']) + print("Body styles: ", styles['body']) + print("Bond styles: ", styles['bond']) + print("Angle styles: ", styles['angle']) + print("Dihedral styles: ", styles['dihedral']) + print("Improper styles: ", styles['improper']) + print("Kspace styles: ", styles['kspace']) + print("Dump styles: ", styles['dump']) + print("Region styles: ", styles['region']) + print("Integrate styles: ", styles['integrate']) + print("Minimize styles: ", styles['minimize']) + + print("Example input files affected: ", len(inputs)) + print("inputs: ", inputs.sort()) diff --git a/tools/regression-tests/reference.yaml b/tools/regression-tests/reference.yaml new file mode 100644 index 0000000000..c18883f375 --- /dev/null +++ b/tools/regression-tests/reference.yaml @@ -0,0 +1,932 @@ +in.granregion.box: { folder: examples/granregion, status: "completed", failed_checks: { abs_diff_failed: 5, rel_diff_failed: 8 }, walltime: 0.0, walltime_norm: 0.0 } +in.granregion.funnel: { folder: examples/granregion, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 106.0, walltime_norm: 17.666666666666668 } +in.granregion.mixer: { folder: examples/granregion, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 84.0, walltime_norm: 14.0 } +in.melt: { folder: examples/melt, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.airebo: { folder: examples/airebo, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 60.0, walltime_norm: 10.0 } +in.airebo-0-0: { folder: examples/airebo, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 5.0, walltime_norm: 0.8333333333333334 } +in.airebo-m: { folder: examples/airebo, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 63.0, walltime_norm: 10.5 } +in.rebo2: { folder: examples/airebo, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 5.0, walltime_norm: 0.8333333333333334 } +in.hybrid: { folder: examples/template, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 7.0, walltime_norm: 1.1666666666666667 } +in.mol-data-mix: { folder: examples/template, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 18.0, walltime_norm: 3.0 } +in.mol-restart-mix: { folder: examples/template, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 45.0, walltime_norm: 7.5 } +in.molecular-mix: { folder: examples/template, status: "completed", failed_checks: { abs_diff_failed: 5, rel_diff_failed: 5 }, walltime: 26.0, walltime_norm: 4.333333333333333 } +in.template-mix: { folder: examples/template, status: "completed", failed_checks: { abs_diff_failed: 5, rel_diff_failed: 5 }, walltime: 26.0, walltime_norm: 4.333333333333333 } +in.tmpl-data-mix: { folder: examples/template, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 18.0, walltime_norm: 3.0 } +in.tmpl-restart-mix: { folder: examples/template, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 45.0, walltime_norm: 7.5 } +in.first: { folder: examples/rerun, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 16.0, walltime_norm: 2.6666666666666665 } +in.rdf.first: { folder: examples/rerun, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 16.0, walltime_norm: 2.6666666666666665 } +in.rdf.rerun: { folder: examples/rerun, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 5.0, walltime_norm: 0.8333333333333334 } +in.read_dump: { folder: examples/rerun, status: "failed, no Total wall time in the output, -------------------------------------------------------------------------- +MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD +with errorcode 1. + +NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. +You may or may not see output from other processes, depending on +exactly when Open MPI kills them. +-------------------------------------------------------------------------- +", walltime: -1 } +in.rerun: { folder: examples/rerun, status: "failed, no Total wall time in the output, -------------------------------------------------------------------------- +MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD +with errorcode 1. + +NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. +You may or may not see output from other processes, depending on +exactly when Open MPI kills them. +-------------------------------------------------------------------------- +", walltime: -1 } +in.lj.ehex: { folder: examples/HEAT, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.lj.hex: { folder: examples/HEAT, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.spce.ehex: { folder: examples/HEAT, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.spce.hex: { folder: examples/HEAT, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.vashishta.inp: { folder: examples/vashishta, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.vashishta.sio2: { folder: examples/vashishta, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.vashishta.table.inp: { folder: examples/vashishta, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.vashishta.table.sio2: { folder: examples/vashishta, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.rigid: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.rigid.atomfile: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.rigid.atomvar: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.rigid.early: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.rigid.gravity: { folder: examples/rigid, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.rigid.infile: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.rigid.molecule: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.rigid.nve: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 0.0, walltime_norm: 0.0 } +in.rigid.nve.early: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 0.0, walltime_norm: 0.0 } +in.rigid.poems: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 3.0, walltime_norm: 0.5 } +in.rigid.poems2: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 3.0, walltime_norm: 0.5 } +in.rigid.poems3: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.rigid.poems4: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 3.0, walltime_norm: 0.5 } +in.rigid.poems5: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 3.0, walltime_norm: 0.5 } +in.rigid.property: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.rigid.small: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.rigid.small.infile: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.rigid.tnr: { folder: examples/rigid, status: "completed", failed_checks: { abs_diff_failed: 18, rel_diff_failed: 22 }, walltime: 21.0, walltime_norm: 3.5 } +in.voronoi: { folder: examples/voronoi, status: "completed, but no Step nor Loop in the output.", walltime: 6.0, walltime_norm: 1.0 } +in.voronoi.2d: { folder: examples/voronoi, status: "completed, but no Step nor Loop in the output.", walltime: 0.0, walltime_norm: 0.0 } +in.voronoi.data: { folder: examples/voronoi, status: "completed, but no Step nor Loop in the output.", walltime: 0.0, walltime_norm: 0.0 } +in.ehex: { folder: examples/KAPPA, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.heat: { folder: examples/KAPPA, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.heatflux: { folder: examples/KAPPA, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.langevin: { folder: examples/KAPPA, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.mp: { folder: examples/KAPPA, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.pour: { folder: examples/pour, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 20.0, walltime_norm: 3.3333333333333335 } +in.pour.2d: { folder: examples/pour, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.pour.2d.molecule: { folder: examples/pour, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.deposit.atom: { folder: examples/deposit, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 3.0, walltime_norm: 0.5 } +in.deposit.molecule: { folder: examples/deposit, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.deposit.molecule.rigid-nve-small: { folder: examples/deposit, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.deposit.molecule.rigid-nvt-small: { folder: examples/deposit, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.deposit.molecule.rigid-small: { folder: examples/deposit, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.deposit.molecule.shake: { folder: examples/deposit, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.charmmfsw: { folder: examples/charmmfsw, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 17.0, walltime_norm: 2.8333333333333335 } +in.indent: { folder: examples/indent, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.indent.min: { folder: examples/indent, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.qeq.buck: { folder: examples/qeq, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 21.0, walltime_norm: 3.5 } +in.qeq.reaxff: { folder: examples/qeq, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.dreiding: { folder: examples/dreiding, status: "completed, error parsing log.lammps into YAML", walltime: 0.0, walltime_norm: 0.0 } +in.22DMH.real: { folder: examples/relres, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 57.0, walltime_norm: 9.5 } +in.22DMH.relres: { folder: examples/relres, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 8.0, walltime_norm: 1.3333333333333333 } +in.22DMH.respa: { folder: examples/relres, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 6.0, walltime_norm: 1.0 } +in.track: { folder: examples/tracker, status: "failed, ERROR: Illegal pair_style command (src/MISC/pair_tracker.cpp:221).", walltime: -1 } +in.pour.drum: { folder: examples/granular, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.pour.flatwall: { folder: examples/granular, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.pour.heat: { folder: examples/granular, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 83.0, walltime_norm: 13.833333333333334 } +in.restitution: { folder: examples/granular, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 5.0, walltime_norm: 0.8333333333333334 } +in.micelle: { folder: examples/micelle, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 1 }, walltime: 0.0, walltime_norm: 0.0 } +in.micelle-rigid: { folder: examples/micelle, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.replicate.bond.x: { folder: examples/replicate, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.replicate.bond.x.noloop: { folder: examples/replicate, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.replicate.bond.x.y: { folder: examples/replicate, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.replicate.bond.xy: { folder: examples/replicate, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.replicate.cnt: { folder: examples/replicate, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 8.0, walltime_norm: 1.3333333333333333 } +in.srd.mixture: { folder: examples/srd, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.srd.pure: { folder: examples/srd, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.ttm: { folder: examples/ttm, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.ttm.grid: { folder: examples/ttm, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.ttm.mod: { folder: examples/ttm, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.colloid: { folder: examples/multi, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 0.0, walltime_norm: 0.0 } +in.granular: { folder: examples/multi, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.powerlaw: { folder: examples/multi, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.msst: { folder: examples/msst, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 6.0, walltime_norm: 1.0 } +in.gjf.vfull: { folder: examples/gjf, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.gjf.vhalf: { folder: examples/gjf, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.spin.cobalt_fcc: { folder: examples/SPIN/cobalt_fcc, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.spin.nickel: { folder: examples/SPIN/nickel, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.spin.nickel_cubic: { folder: examples/SPIN/nickel, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.spin.cobalt_hcp: { folder: examples/SPIN/cobalt_hcp, status: "completed", failed_checks: { abs_diff_failed: 4, rel_diff_failed: 4 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.spin.iron: { folder: examples/SPIN/iron, status: "completed", failed_checks: { abs_diff_failed: 4, rel_diff_failed: 4 }, walltime: 0.0, walltime_norm: 0.0 } +in.spin.iron_cubic: { folder: examples/SPIN/iron, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 0.0, walltime_norm: 0.0 } +in.gneb.skyrmion: { folder: examples/SPIN/gneb/skyrmion, status: "failed, ERROR: Did not assign all atoms correctly (src/read_data.cpp:1562).", walltime: -1 } +in.gneb.iron: { folder: examples/SPIN/gneb/iron, status: "failed, ERROR: Cannot use NEBSpin with a single replica (src/SPIN/neb_spin.cpp:133).", walltime: -1 } +in.spin.read_data: { folder: examples/SPIN/read_restart, status: "failed, no Total wall time in the output, -------------------------------------------------------------------------- +MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD +with errorcode 1. + +NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. +You may or may not see output from other processes, depending on +exactly when Open MPI kills them. +-------------------------------------------------------------------------- +", walltime: -1 } +in.spin.restart: { folder: examples/SPIN/read_restart, status: "failed, ERROR: Invalid flag in force field section of restart file (src/read_restart.cpp:948).", walltime: -1 } +in.spin.write_restart: { folder: examples/SPIN/read_restart, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.spin.bfo_min: { folder: examples/SPIN/spinmin, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 6.0, walltime_norm: 1.0 } +in.spin.bfo_min_cg: { folder: examples/SPIN/spinmin, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 7.0, walltime_norm: 1.1666666666666667 } +in.spin.bfo_min_lbfgs: { folder: examples/SPIN/spinmin, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.spin.iron_min: { folder: examples/SPIN/spinmin, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.spin.setforce: { folder: examples/SPIN/setforce_spin, status: "failed, no Total wall time in the output, [fv-az1014-42:16323] *** Process received signal *** +[fv-az1014-42:16323] Signal: Segmentation fault (11) +[fv-az1014-42:16323] Signal code: Address not mapped (1) +[fv-az1014-42:16323] Failing at address: 0x390 +[fv-az1014-42:16323] [ 0] /lib/x86_64-linux-gnu/libc.so.6(+0x42520)[0x7f09e7842520] +[fv-az1014-42:16323] [ 1] /home/runner/work/lammps/lammps/build/lmp(_ZN9LAMMPS_NS11ComputeSpin14compute_vectorEv+0x2d8)[0x5590ad415268] +[fv-az1014-42:16323] [ 2] /home/runner/work/lammps/lammps/build/lmp(_ZN9LAMMPS_NS8Variable8evaluateEPcPPNS0_4TreeEi+0x6e7f)[0x5590ad0078ef] +[fv-az1014-42:16323] [ 3] /home/runner/work/lammps/lammps/build/lmp(_ZN9LAMMPS_NS8Variable13compute_equalEi+0x22b)[0x5590ad00d2ab] +[fv-az1014-42:16323] [ 4] /home/runner/work/lammps/lammps/build/lmp(_ZN9LAMMPS_NS6Thermo16compute_variableEv+0x5b)[0x5590acfbfa6b] +[fv-az1014-42:16323] [ 5] /home/runner/work/lammps/lammps/build/lmp(_ZN9LAMMPS_NS6Thermo7computeEi+0x203)[0x5590acfc9dc3] +[fv-az1014-42:16323] [ 6] /home/runner/work/lammps/lammps/build/lmp(_ZN9LAMMPS_NS6Output5setupEi+0x64)[0x5590acf57f14] +[fv-az1014-42:16323] [ 7] /home/runner/work/lammps/lammps/build/lmp(_ZN9LAMMPS_NS3Min5setupEi+0x57d)[0x5590acee421d] +[fv-az1014-42:16323] [ 8] /home/runner/work/lammps/lammps/build/lmp(_ZN9LAMMPS_NS8Minimize7commandEiPPc+0x1d7)[0x5590acee5a67] +[fv-az1014-42:16323] [ 9] /home/runner/work/lammps/lammps/build/lmp(_ZN9LAMMPS_NS5Input15execute_commandEv+0xb1d)[0x5590ace91b9d] +[fv-az1014-42:16323] [10] /home/runner/work/lammps/lammps/build/lmp(_ZN9LAMMPS_NS5Input4fileEv+0x19e)[0x5590ace91f5e] +[fv-az1014-42:16323] [11] /home/runner/work/lammps/lammps/build/lmp(main+0x51)[0x5590ace7ed41] +[fv-az1014-42:16323] [12] /lib/x86_64-linux-gnu/libc.so.6(+0x29d90)[0x7f09e7829d90] +[fv-az1014-42:16323] [13] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80)[0x7f09e7829e40] +[fv-az1014-42:16323] [14] /home/runner/work/lammps/lammps/build/lmp(_start+0x25)[0x5590ace834e5] +[fv-az1014-42:16323] *** End of error message *** +Segmentation fault (core dumped) +", walltime: -1 } +in.spin.bfo: { folder: examples/SPIN/bfo, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 7.0, walltime_norm: 1.1666666666666667 } +in.spin.iron_dipole_cut: { folder: examples/SPIN/dipole_spin, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 6.0, walltime_norm: 1.0 } +in.spin.iron_dipole_ewald: { folder: examples/SPIN/dipole_spin, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 0 }, walltime: 20.0, walltime_norm: 3.3333333333333335 } +in.spin.iron_dipole_pppm: { folder: examples/SPIN/dipole_spin, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.spin.iron-nve: { folder: examples/SPIN/test_problems/validation_nve, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 19.0, walltime_norm: 3.1666666666666665 } +in.spin.nvt_lattice: { folder: examples/SPIN/test_problems/validation_nvt, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 95.0, walltime_norm: 15.833333333333334 } +in.spin.nvt_spin: { folder: examples/SPIN/test_problems/validation_nvt, status: "failed, ERROR: Fix langevin period must be > 0.0 (src/fix_langevin.cpp:80).", walltime: -1 } +in.mliap.ace.compute: { folder: examples/mliap, status: "completed, but no Step nor Loop in the output.", walltime: 0.0, walltime_norm: 0.0 } +in.mliap.nn.Cu: { folder: examples/mliap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.mliap.nn.Ta06A: { folder: examples/mliap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.mliap.pytorch.Ta06A: { folder: examples/mliap, status: "failed, ERROR: Using pair_style mliap model mliappy requires ML-IAP with python support (src/ML-IAP/pair_mliap.cpp:173).", walltime: -1 } +in.mliap.pytorch.ace: { folder: examples/mliap, status: "failed, ERROR: Using pair_style mliap model mliappy requires ML-IAP with python support (src/ML-IAP/pair_mliap.cpp:173).", walltime: -1 } +in.mliap.pytorch.ace.NN: { folder: examples/mliap, status: "failed, ERROR: Using pair_style mliap model mliappy requires ML-IAP with python support (src/ML-IAP/pair_mliap.cpp:173).", walltime: -1 } +in.mliap.pytorch.relu1hidden: { folder: examples/mliap, status: "failed, ERROR: Using pair_style mliap model mliappy requires ML-IAP with python support (src/ML-IAP/pair_mliap.cpp:173).", walltime: -1 } +in.mliap.quadratic.compute: { folder: examples/mliap, status: "failed, no Total wall time in the output, munmap_chunk(): invalid pointer +[fv-az1014-42:16535] *** Process received signal *** +[fv-az1014-42:16535] Signal: Aborted (6) +[fv-az1014-42:16535] Signal code: (-6) +corrupted double-linked list +Aborted (core dumped) +", walltime: -1 } +in.mliap.snap.Ta06A: { folder: examples/mliap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.mliap.snap.WBe.PRB2019: { folder: examples/mliap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.mliap.snap.chem: { folder: examples/mliap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 15.0, walltime_norm: 2.5 } +in.mliap.snap.compute: { folder: examples/mliap, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.mliap.snap.quadratic: { folder: examples/mliap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.mliap.so3.Ni_Mo: { folder: examples/mliap, status: "completed, but no Step nor Loop in the output.", walltime: 0.0, walltime_norm: 0.0 } +in.mliap.so3.nn.Si: { folder: examples/mliap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 3.0, walltime_norm: 0.5 } +in.mliap.unified.lj.Ar: { folder: examples/mliap, status: "failed, ERROR: Could not process Python string: .", walltime: -1 } +in.run: { folder: examples/mliap/jax, status: "failed, ERROR: Using pair_style mliap unified requires ML-IAP with python support (src/ML-IAP/pair_mliap.cpp:213).", walltime: -1 } +in.eim: { folder: examples/eim, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 3.0, walltime_norm: 0.5 } +in.shear: { folder: examples/shear, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.shear.void: { folder: examples/shear, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 3.0, walltime_norm: 0.5 } +in.aimd.alone: { folder: examples/mdi, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.aimd.driver: { folder: examples/mdi, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.aimd.driver.plugin: { folder: examples/mdi, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.aimd.engine: { folder: examples/mdi, status: "failed, unknown command, package not installed, ERROR: Unknown command: mdi engine (src/input.cpp:314)", walltime: -1 } +in.aimdpy.mm: { folder: examples/mdi, status: "failed, unknown command, package not installed, ERROR: Unknown command: mdi engine (src/input.cpp:314)", walltime: -1 } +in.aimdpy.qm: { folder: examples/mdi, status: "failed, unknown command, package not installed, ERROR: Unknown command: mdi engine (src/input.cpp:314)", walltime: -1 } +in.sequence.python: { folder: examples/mdi, status: "failed, unknown command, package not installed, ERROR: Unknown command: mdi engine (src/input.cpp:314)", walltime: -1 } +in.series.alone: { folder: examples/mdi, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.series.driver: { folder: examples/mdi, status: "failed, unknown command, package not installed, ERROR: Unknown command: mdi connect (src/input.cpp:314)", walltime: -1 } +in.series.driver.plugin: { folder: examples/mdi, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.series.engine: { folder: examples/mdi, status: "failed, unknown command, package not installed, ERROR: Unknown command: mdi engine (src/input.cpp:314)", walltime: -1 } +in.snapshot.alone: { folder: examples/mdi, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.snapshot.driver: { folder: examples/mdi, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.snapshot.driver.plugin: { folder: examples/mdi, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.snapshot.engine: { folder: examples/mdi, status: "failed, unknown command, package not installed, ERROR: Unknown command: mdi engine (src/input.cpp:314)", walltime: -1 } +in.lammps: { folder: examples/PACKAGES/dpd-smooth/2d-diffusion, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 57.0, walltime_norm: 9.5 } +in.lammps: { folder: examples/PACKAGES/dpd-smooth/2d-diffusion-in-shear-flow, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 102.0, walltime_norm: 17.0 } +in.lammps: { folder: examples/PACKAGES/dpd-smooth/equipartition-verification, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 41.0, walltime_norm: 6.833333333333333 } +in.fitpod: { folder: examples/PACKAGES/pod/InP, status: "failed, ERROR: Cannot fit potential without data files. The data paths may not be valid. Please check the data paths in the POD data file. (src/ML-POD/fitpod_command.cpp:718).", walltime: -1 } +in.pod: { folder: examples/PACKAGES/pod/InP, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.fitpod: { folder: examples/PACKAGES/pod/Ta, status: "completed, but no Step nor Loop in the output.", walltime: 0.0, walltime_norm: 0.0 } +in.pod: { folder: examples/PACKAGES/pod/Ta, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.pod.compute: { folder: examples/PACKAGES/pod/Ta, status: "failed, ERROR: Per-atom data too large (src/ML-POD/compute_podd_atom.cpp:62).", walltime: -1 } +in.duplex2: { folder: examples/PACKAGES/cgdna/examples/real_units/oxRNA2/duplex2, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 1 }, walltime: 22.0, walltime_norm: 3.6666666666666665 } +in.duplex2: { folder: examples/PACKAGES/cgdna/examples/real_units/oxRNA2/potential_file, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 1 }, walltime: 19.0, walltime_norm: 3.1666666666666665 } +in.duplex2: { folder: examples/PACKAGES/cgdna/examples/real_units/oxDNA/duplex2, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 21.0, walltime_norm: 3.5 } +in.duplex1: { folder: examples/PACKAGES/cgdna/examples/real_units/oxDNA/duplex1, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.duplex1: { folder: examples/PACKAGES/cgdna/examples/real_units/oxDNA/potential_file, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.duplex2: { folder: examples/PACKAGES/cgdna/examples/real_units/oxDNA2/duplex2, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 24.0, walltime_norm: 4.0 } +in.duplex1: { folder: examples/PACKAGES/cgdna/examples/real_units/oxDNA2/duplex1, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.dsring: { folder: examples/PACKAGES/cgdna/examples/real_units/oxDNA2/dsring, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 46.0, walltime_norm: 7.666666666666667 } +in.duplex1: { folder: examples/PACKAGES/cgdna/examples/real_units/oxDNA2/potential_file, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.duplex4.4type: { folder: examples/PACKAGES/cgdna/examples/real_units/oxDNA2/unique_bp, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 51.0, walltime_norm: 8.5 } +in.duplex4.8type: { folder: examples/PACKAGES/cgdna/examples/real_units/oxDNA2/unique_bp, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 50.0, walltime_norm: 8.333333333333334 } +in.duplex3: { folder: examples/PACKAGES/cgdna/examples/real_units/oxDNA2/duplex3, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.duplex2: { folder: examples/PACKAGES/cgdna/examples/lj_units/oxRNA2/duplex2, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 19.0, walltime_norm: 3.1666666666666665 } +in.duplex2: { folder: examples/PACKAGES/cgdna/examples/lj_units/oxRNA2/potential_file, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 19.0, walltime_norm: 3.1666666666666665 } +in.duplex2: { folder: examples/PACKAGES/cgdna/examples/lj_units/oxDNA/duplex2, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 22.0, walltime_norm: 3.6666666666666665 } +in.duplex1: { folder: examples/PACKAGES/cgdna/examples/lj_units/oxDNA/duplex1, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.duplex1: { folder: examples/PACKAGES/cgdna/examples/lj_units/oxDNA/potential_file, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.duplex2: { folder: examples/PACKAGES/cgdna/examples/lj_units/oxDNA2/duplex2, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 25.0, walltime_norm: 4.166666666666667 } +in.duplex1: { folder: examples/PACKAGES/cgdna/examples/lj_units/oxDNA2/duplex1, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.dsring: { folder: examples/PACKAGES/cgdna/examples/lj_units/oxDNA2/dsring, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 46.0, walltime_norm: 7.666666666666667 } +in.duplex1: { folder: examples/PACKAGES/cgdna/examples/lj_units/oxDNA2/potential_file, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.duplex4.4type: { folder: examples/PACKAGES/cgdna/examples/lj_units/oxDNA2/unique_bp, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 50.0, walltime_norm: 8.333333333333334 } +in.duplex4.8type: { folder: examples/PACKAGES/cgdna/examples/lj_units/oxDNA2/unique_bp, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 50.0, walltime_norm: 8.333333333333334 } +in.duplex3: { folder: examples/PACKAGES/cgdna/examples/lj_units/oxDNA2/duplex3, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.temper_npt: { folder: examples/PACKAGES/temper_npt, status: "failed, ERROR: World variable count doesn't match # of partitions (src/variable.cpp:255).", walltime: -1 } +in.peptide-plumed: { folder: examples/PACKAGES/plumed, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'plumed' is part of the PLUMED package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.methanol: { folder: examples/PACKAGES/bocs, status: "completed", failed_checks: { abs_diff_failed: 4, rel_diff_failed: 4 }, walltime: 23.0, walltime_norm: 3.8333333333333335 } +in.pedone.melt: { folder: examples/PACKAGES/pedone, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 2 }, walltime: 13.0, walltime_norm: 2.1666666666666665 } +in.pedone.relax: { folder: examples/PACKAGES/pedone, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 15.0, walltime_norm: 2.5 } +in.methanol_implicit_water: { folder: examples/PACKAGES/local_density/methanol_implicit_water, status: "completed, but no Step nor Loop in the output.", walltime: 62.0, walltime_norm: 10.333333333333334 } +in.benzene_water: { folder: examples/PACKAGES/local_density/benzene_water, status: "completed, but no Step nor Loop in the output.", walltime: 25.0, walltime_norm: 4.166666666666667 } +in.gauss-diel: { folder: examples/PACKAGES/gauss_diel, status: "completed, error parsing log.lammps into YAML", walltime: 8.0, walltime_norm: 1.3333333333333333 } +in.gauss-diel-cg: { folder: examples/PACKAGES/gauss_diel, status: "completed, error parsing log.lammps into YAML", walltime: 3.0, walltime_norm: 0.5 } +in.gauss-diel-split: { folder: examples/PACKAGES/gauss_diel, status: "completed, error parsing log.lammps into YAML", walltime: 3.0, walltime_norm: 0.5 } +in.alloy: { folder: examples/PACKAGES/alchemy, status: "failed, ERROR: World variable count doesn't match # of partitions (src/variable.cpp:255).", walltime: -1 } +in.twowater: { folder: examples/PACKAGES/alchemy, status: "failed, ERROR: World variable count doesn't match # of partitions (src/variable.cpp:255).", walltime: -1 } +in.sds-hybrid: { folder: examples/PACKAGES/cgspica/sds-monolayer, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 6.0, walltime_norm: 1.0 } +in.sds-regular: { folder: examples/PACKAGES/cgspica/sds-monolayer, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 6.0, walltime_norm: 1.0 } +in.pegc12e8: { folder: examples/PACKAGES/cgspica/peg-verlet, status: "completed, error parsing log.lammps into YAML", walltime: 69.0, walltime_norm: 11.5 } +in.pegc12e8-angle: { folder: examples/PACKAGES/cgspica/peg-verlet, status: "completed, error parsing log.lammps into YAML", walltime: 69.0, walltime_norm: 11.5 } +in.hkust1: { folder: examples/PACKAGES/mofff, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.hkust1_long: { folder: examples/PACKAGES/mofff, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.e3b-tip4p2005: { folder: examples/PACKAGES/e3b, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.uf3.Nb: { folder: examples/PACKAGES/uf3, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.fep01.lmp: { folder: examples/PACKAGES/fep/CC-CO/fep01, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.fep10.lmp: { folder: examples/PACKAGES/fep/CC-CO/fep10, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.insertion: { folder: examples/PACKAGES/fep/C7inEthanol/fep01, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.deletion: { folder: examples/PACKAGES/fep/C7inEthanol/fep10, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.fep01.lmp: { folder: examples/PACKAGES/fep/CH4-CF4/fep01, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.fep10.lmp: { folder: examples/PACKAGES/fep/CH4-CF4/fep10, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.bar10.lmp: { folder: examples/PACKAGES/fep/CH4-CF4/bar10, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.bar01.lmp: { folder: examples/PACKAGES/fep/CH4-CF4/bar01, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.fep01.lmp: { folder: examples/PACKAGES/fep/CH4hyd/fep01, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.fdti01.lmp: { folder: examples/PACKAGES/fep/CH4hyd/fdti01, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.fep10.lmp: { folder: examples/PACKAGES/fep/CH4hyd/fep10, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.fdti10.lmp: { folder: examples/PACKAGES/fep/CH4hyd/fdti10, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.spce.lmp: { folder: examples/PACKAGES/fep/ta, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.gap: { folder: examples/PACKAGES/quip, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized pair style 'quip' is part of the ML-QUIP package which is not enabled in this LAMMPS binary. (src/force.cpp:275)", walltime: -1 } +in.molecular: { folder: examples/PACKAGES/quip, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized pair style 'quip' is part of the ML-QUIP package which is not enabled in this LAMMPS binary. (src/force.cpp:275)", walltime: -1 } +in.sw: { folder: examples/PACKAGES/quip, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized pair style 'quip' is part of the ML-QUIP package which is not enabled in this LAMMPS binary. (src/force.cpp:275)", walltime: -1 } +in.srp_react: { folder: examples/PACKAGES/srp_react, status: "failed, ERROR: Invalid bond type 0 for pair style srp (src/MISC/pair_srp.cpp:403).", walltime: -1 } +in.spce: { folder: examples/PACKAGES/manybody_table, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 5.0, walltime_norm: 0.8333333333333334 } +in.spce2: { folder: examples/PACKAGES/manybody_table, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 6.0, walltime_norm: 1.0 } +in.spce_sw: { folder: examples/PACKAGES/manybody_table, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 1 }, walltime: 5.0, walltime_norm: 0.8333333333333334 } +in.confined: { folder: examples/PACKAGES/dielectric, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.nopbc: { folder: examples/PACKAGES/dielectric, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.methane_qtb: { folder: examples/PACKAGES/qtb/methane_qtb, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 9.0, walltime_norm: 1.5 } +in.alpha_quartz_qtb: { folder: examples/PACKAGES/qtb/alpha_quartz_qtb, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.alpha_quartz_qbmsst: { folder: examples/PACKAGES/qtb/alpha_quartz_qbmsst, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 42.0, walltime_norm: 7.0 } +in.methane_qbmsst: { folder: examples/PACKAGES/qtb/methane_qbmsst, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 97.0, walltime_norm: 16.166666666666668 } +in.tmd: { folder: examples/PACKAGES/tmd, status: "completed, error parsing log.lammps into YAML", walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.meam-spline.Si: { folder: examples/PACKAGES/meam_spline, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.meam-spline.TiO2: { folder: examples/PACKAGES/meam_spline, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 79.0, walltime_norm: 13.166666666666666 } +in.silicon: { folder: examples/PACKAGES/phonon/dynamical_matrix_command/Silicon, status: "completed, but no Step nor Loop in the output.", walltime: 0.0, walltime_norm: 0.0 } +in.EAM3D: { folder: examples/PACKAGES/phonon/3-3D-FCC-Cu-EAM, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.disp: { folder: examples/PACKAGES/phonon/3-3D-FCC-Cu-EAM, status: "skipped", walltime: -2 } +in.disp2: { folder: examples/PACKAGES/phonon/3-3D-FCC-Cu-EAM, status: "skipped", walltime: -2 } +in.dos: { folder: examples/PACKAGES/phonon/3-3D-FCC-Cu-EAM, status: "skipped", walltime: -2 } +in.Ana: { folder: examples/PACKAGES/phonon/1-1D-mono, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 6.0, walltime_norm: 1.0 } +in.disp: { folder: examples/PACKAGES/phonon/1-1D-mono, status: "skipped", walltime: -2 } +in.Ana: { folder: examples/PACKAGES/phonon/2-1D-diatomic, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 17.0, walltime_norm: 2.8333333333333335 } +in.disp: { folder: examples/PACKAGES/phonon/2-1D-diatomic, status: "skipped", walltime: -2 } +in.disp: { folder: examples/PACKAGES/phonon/4-Graphene, status: "skipped", walltime: -2 } +in.graphene: { folder: examples/PACKAGES/phonon/4-Graphene, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.dpde-shardlow: { folder: examples/PACKAGES/dpd-react/dpde-shardlow, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.dpde-vv: { folder: examples/PACKAGES/dpd-react/dpde-vv, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 14.0, walltime_norm: 2.3333333333333335 } +in.dpd-shardlow: { folder: examples/PACKAGES/dpd-react/dpd-shardlow, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.dpd-vv: { folder: examples/PACKAGES/dpd-react/dpd-vv, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.dpdp-shardlow: { folder: examples/PACKAGES/dpd-react/dpdp-shardlow, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.multi-lucy: { folder: examples/PACKAGES/dpd-react/multi-lucy, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.dpdh-shardlow: { folder: examples/PACKAGES/dpd-react/dpdh-shardlow, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 3.0, walltime_norm: 0.5 } +in.dpdrx-shardlow: { folder: examples/PACKAGES/dpd-react/dpdrx-shardlow, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.GD: { folder: examples/PACKAGES/flow_gauss, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.basal: { folder: examples/PACKAGES/basal, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.cascade_AlCu: { folder: examples/PACKAGES/electron_stopping, status: "failed, ERROR: Must set 'extscalar' when setting 'scalar_flag' for fix electron/stopping/fit. Contact the developer. (src/fix.cpp:135).", walltime: -1 } +in.cascade_SiSi: { folder: examples/PACKAGES/electron_stopping, status: "failed, ERROR: Must set 'extscalar' when setting 'scalar_flag' for fix electron/stopping/fit. Contact the developer. (src/fix.cpp:135).", walltime: -1 } +in.elstop: { folder: examples/PACKAGES/electron_stopping, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 26.0, walltime_norm: 4.333333333333333 } +in.elstop.only: { folder: examples/PACKAGES/electron_stopping, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.chreg-acid: { folder: examples/PACKAGES/charge_regulation, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 1 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.chreg-acid-real: { folder: examples/PACKAGES/charge_regulation, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 1 }, walltime: 0.0, walltime_norm: 0.0 } +in.chreg-polymer: { folder: examples/PACKAGES/charge_regulation, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 1 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.adatom: { folder: examples/PACKAGES/agni, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 16.0, walltime_norm: 2.6666666666666665 } +in.vacancy: { folder: examples/PACKAGES/agni, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.bucky-plus-cnt: { folder: examples/PACKAGES/imd, status: "skipped", walltime: -2 } +in.bucky-plus-cnt-gpu: { folder: examples/PACKAGES/imd, status: "skipped", walltime: -2 } +in.deca-ala-solv-filter_imd: { folder: examples/PACKAGES/imd, status: "skipped", walltime: -2 } +in.deca-ala-solv_imd: { folder: examples/PACKAGES/imd, status: "skipped", walltime: -2 } +in.deca-ala_imd: { folder: examples/PACKAGES/imd, status: "skipped", walltime: -2 } +in.deca-ala_imd-gpu: { folder: examples/PACKAGES/imd, status: "skipped", walltime: -2 } +in.melt_imd: { folder: examples/PACKAGES/imd, status: "skipped", walltime: -2 } +in.melt_imd-gpu: { folder: examples/PACKAGES/imd, status: "skipped", walltime: -2 } +in.first: { folder: examples/PACKAGES/adios/rerun, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized dump style 'custom/adios' is part of the ADIOS package which is not enabled in this LAMMPS binary. (src/output.cpp:776)", walltime: -1 } +in.read_dump: { folder: examples/PACKAGES/adios/rerun, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized reader style 'adios' is part of the ADIOS package which is not enabled in this LAMMPS binary. (src/read_dump.cpp:236)", walltime: -1 } +in.rerun: { folder: examples/PACKAGES/adios/rerun, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized reader style 'adios' is part of the ADIOS package which is not enabled in this LAMMPS binary. (src/read_dump.cpp:236)", walltime: -1 } +in.adios_balance: { folder: examples/PACKAGES/adios/balance, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized dump style 'custom/adios' is part of the ADIOS package which is not enabled in this LAMMPS binary. (src/output.cpp:776)", walltime: -1 } +in.adios_balance2: { folder: examples/PACKAGES/adios/balance, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized reader style 'adios' is part of the ADIOS package which is not enabled in this LAMMPS binary. (src/read_dump.cpp:236)", walltime: -1 } +in.bcc0: { folder: examples/PACKAGES/mgpt, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized pair style 'mgpt' is part of the MGPT package which is not enabled in this LAMMPS binary. (src/force.cpp:275)", walltime: -1 } +in.vac0-bcc: { folder: examples/PACKAGES/mgpt, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized pair style 'mgpt' is part of the MGPT package which is not enabled in this LAMMPS binary. (src/force.cpp:275)", walltime: -1 } +in.vacmin-bcc: { folder: examples/PACKAGES/mgpt, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized pair style 'mgpt' is part of the MGPT package which is not enabled in this LAMMPS binary. (src/force.cpp:275)", walltime: -1 } +in.vtk: { folder: examples/PACKAGES/vtk, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized dump style 'vtk' is part of the VTK package which is not enabled in this LAMMPS binary. (src/output.cpp:776)", walltime: -1 } +in.vtp: { folder: examples/PACKAGES/vtk, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized dump style 'vtk' is part of the VTK package which is not enabled in this LAMMPS binary. (src/output.cpp:776)", walltime: -1 } +in.dpdext: { folder: examples/PACKAGES/dpd-basic/dpdext, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.dpd: { folder: examples/PACKAGES/dpd-basic/dpd, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 0.0, walltime_norm: 0.0 } +in.dpdext_tstat: { folder: examples/PACKAGES/dpd-basic/dpdext_tstat, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 30.0, walltime_norm: 5.0 } +in.dpd_tstat: { folder: examples/PACKAGES/dpd-basic/dpd_tstat, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.dpd_coul_slater_long: { folder: examples/PACKAGES/dpd-basic/dpd_coul_slater_long, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.piston: { folder: examples/PACKAGES/electrode/piston, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.cg: { folder: examples/PACKAGES/electrode/madelung, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.eta: { folder: examples/PACKAGES/electrode/madelung, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.eta_cg: { folder: examples/PACKAGES/electrode/madelung, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.eta_mix: { folder: examples/PACKAGES/electrode/madelung, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.ewald-ew2d: { folder: examples/PACKAGES/electrode/madelung, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.ewald-ew3dc: { folder: examples/PACKAGES/electrode/madelung, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.ewald-ffield: { folder: examples/PACKAGES/electrode/madelung, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.pppm-ew3dc: { folder: examples/PACKAGES/electrode/madelung, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.pppm-ffield: { folder: examples/PACKAGES/electrode/madelung, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.ffield: { folder: examples/PACKAGES/electrode/au-aq, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.tf: { folder: examples/PACKAGES/electrode/au-aq, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.conp: { folder: examples/PACKAGES/electrode/graph-il, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 96.0, walltime_norm: 16.0 } +in.conq: { folder: examples/PACKAGES/electrode/graph-il, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 90.0, walltime_norm: 15.0 } +in.conq2: { folder: examples/PACKAGES/electrode/graph-il, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 62.0, walltime_norm: 10.333333333333334 } +in.etypes: { folder: examples/PACKAGES/electrode/graph-il, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 58.0, walltime_norm: 9.666666666666666 } +in.ffield: { folder: examples/PACKAGES/electrode/graph-il, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 41.0, walltime_norm: 6.833333333333333 } +in.ramp: { folder: examples/PACKAGES/electrode/graph-il, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 60.0, walltime_norm: 10.0 } +in.thermo: { folder: examples/PACKAGES/electrode/graph-il, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 57.0, walltime_norm: 9.5 } +in.planar-ewald-ew2d: { folder: examples/PACKAGES/electrode/planar, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.planar-ewald-ew3dc: { folder: examples/PACKAGES/electrode/planar, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.planar-ewald-ffield: { folder: examples/PACKAGES/electrode/planar, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.planar-pppm-ew3dc: { folder: examples/PACKAGES/electrode/planar, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.planar-pppm-ffield: { folder: examples/PACKAGES/electrode/planar, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.convective_pulse: { folder: examples/PACKAGES/atc/drift_diffusion, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.ddm_schrodinger: { folder: examples/PACKAGES/atc/drift_diffusion, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.finite_well: { folder: examples/PACKAGES/atc/drift_diffusion, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.no_atoms_ddm: { folder: examples/PACKAGES/atc/drift_diffusion, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.null_material_ddm: { folder: examples/PACKAGES/atc/drift_diffusion, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.poisson1d_noatoms: { folder: examples/PACKAGES/atc/drift_diffusion, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.poisson2d_noatoms: { folder: examples/PACKAGES/atc/drift_diffusion, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.schrodinger-poisson2d_Jconstraint: { folder: examples/PACKAGES/atc/drift_diffusion, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.schrodinger-poisson2d_convective: { folder: examples/PACKAGES/atc/drift_diffusion, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.schrodinger-poisson2d_noatoms: { folder: examples/PACKAGES/atc/drift_diffusion, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.cb_biaxial: { folder: examples/PACKAGES/atc/cauchy_born, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.cb_shear: { folder: examples/PACKAGES/atc/cauchy_born, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.cb_unistrain: { folder: examples/PACKAGES/atc/cauchy_born, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.cb_unistrain_eam: { folder: examples/PACKAGES/atc/cauchy_born, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.cb_unistrain_eam_linear: { folder: examples/PACKAGES/atc/cauchy_born, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.cb_unistrain_linear: { folder: examples/PACKAGES/atc/cauchy_born, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.cb_volumetric: { folder: examples/PACKAGES/atc/cauchy_born, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.flying_cube: { folder: examples/PACKAGES/atc/cauchy_born, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.ftcb_constV: { folder: examples/PACKAGES/atc/cauchy_born, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.read_xref: { folder: examples/PACKAGES/atc/cauchy_born, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.consistency: { folder: examples/PACKAGES/atc/hardy, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.eam_kernel_convergence: { folder: examples/PACKAGES/atc/hardy, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.eam_unistrain_cell: { folder: examples/PACKAGES/atc/hardy, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.eam_unistrain_mesh: { folder: examples/PACKAGES/atc/hardy, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.eam_unistrain_qcylinder: { folder: examples/PACKAGES/atc/hardy, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.eam_unistrain_qsphere: { folder: examples/PACKAGES/atc/hardy, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.eam_unistrain_step: { folder: examples/PACKAGES/atc/hardy, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.eam_volume_stretch: { folder: examples/PACKAGES/atc/hardy, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.eshelby_static: { folder: examples/PACKAGES/atc/hardy, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.nvt: { folder: examples/PACKAGES/atc/hardy, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_fluids: { folder: examples/PACKAGES/atc/fluids, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.concentration: { folder: examples/PACKAGES/atc/fluids, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.conducting_interface: { folder: examples/PACKAGES/atc/fluids, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.dielectric_interface: { folder: examples/PACKAGES/atc/fluids, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.double_layer: { folder: examples/PACKAGES/atc/fluids, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.liquid_electrostatic: { folder: examples/PACKAGES/atc/fluids, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.opp_force: { folder: examples/PACKAGES/atc/fluids, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.poisson: { folder: examples/PACKAGES/atc/fluids, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.shear_flow: { folder: examples/PACKAGES/atc/fluids, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.shear_no_atoms: { folder: examples/PACKAGES/atc/fluids, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.harmonic_bonds: { folder: examples/PACKAGES/atc/molecule, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.polarize: { folder: examples/PACKAGES/atc/molecule, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.quartic_bonds: { folder: examples/PACKAGES/atc/molecule, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.water: { folder: examples/PACKAGES/atc/molecule, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d: { folder: examples/PACKAGES/atc/thermal, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_all_atoms: { folder: examples/PACKAGES/atc/thermal, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_combined: { folder: examples/PACKAGES/atc/thermal, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_flux: { folder: examples/PACKAGES/atc/thermal, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_frac_step: { folder: examples/PACKAGES/atc/thermal, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_hoover: { folder: examples/PACKAGES/atc/thermal, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_interpolate: { folder: examples/PACKAGES/atc/thermal, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_lumped: { folder: examples/PACKAGES/atc/thermal, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.no_atoms: { folder: examples/PACKAGES/atc/thermal, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.gaussianIC1d_hex: { folder: examples/PACKAGES/atc/mesh, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.gaussianIC2d_hex: { folder: examples/PACKAGES/atc/mesh, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.gaussianIC2d_hex20_uniform: { folder: examples/PACKAGES/atc/mesh, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.gaussianIC2d_hex27_uniform: { folder: examples/PACKAGES/atc/mesh, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.gaussianIC2d_tet: { folder: examples/PACKAGES/atc/mesh, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.kernel2d_hex: { folder: examples/PACKAGES/atc/mesh, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.kernel2d_tet: { folder: examples/PACKAGES/atc/mesh, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.mesh2d_tet: { folder: examples/PACKAGES/atc/mesh, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.semicircle: { folder: examples/PACKAGES/atc/mesh, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d: { folder: examples/PACKAGES/atc/elastic, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_damped: { folder: examples/PACKAGES/atc/elastic, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_flux: { folder: examples/PACKAGES/atc/elastic, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_frac_step: { folder: examples/PACKAGES/atc/elastic, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_ghost_flux: { folder: examples/PACKAGES/atc/elastic, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_thermo_elastic: { folder: examples/PACKAGES/atc/elastic, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.eam_energy: { folder: examples/PACKAGES/atc/elastic, status: "failed, no Total wall time in the output, -------------------------------------------------------------------------- +MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD +with errorcode 1. + +NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. +You may or may not see output from other processes, depending on +exactly when Open MPI kills them. +-------------------------------------------------------------------------- +", walltime: -1 } +in.electron_density: { folder: examples/PACKAGES/atc/elastic, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.no_atoms: { folder: examples/PACKAGES/atc/elastic, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.no_atoms_cb: { folder: examples/PACKAGES/atc/elastic, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.no_atoms_cb_linear: { folder: examples/PACKAGES/atc/elastic, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.bar1d_ttm: { folder: examples/PACKAGES/atc/two_temperature, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.cutout: { folder: examples/PACKAGES/atc/two_temperature, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.gaussianIC_ttm: { folder: examples/PACKAGES/atc/two_temperature, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.no_atoms: { folder: examples/PACKAGES/atc/two_temperature, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.restart: { folder: examples/PACKAGES/atc/two_temperature, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.uniform_exchange: { folder: examples/PACKAGES/atc/two_temperature, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.uniform_heating: { folder: examples/PACKAGES/atc/two_temperature, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'atc' is part of the ATC package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.pits: { folder: examples/PACKAGES/latboltz/pit_geometry, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'lb/fluid' is part of the LATBOLTZ package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.polymer: { folder: examples/PACKAGES/latboltz/polymer, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'lb/fluid' is part of the LATBOLTZ package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.confined_colloids: { folder: examples/PACKAGES/latboltz/confined_colloid, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'lb/fluid' is part of the LATBOLTZ package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.trapnewsphere: { folder: examples/PACKAGES/latboltz/diffusingsphere, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'lb/fluid' is part of the LATBOLTZ package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.translocation: { folder: examples/PACKAGES/latboltz/translocation, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'lb/fluid' is part of the LATBOLTZ package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.toycar: { folder: examples/PACKAGES/latboltz/toycar, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.microrheology: { folder: examples/PACKAGES/latboltz/microrheology, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'lb/fluid' is part of the LATBOLTZ package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.dragtest: { folder: examples/PACKAGES/latboltz/dragforce, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'lb/fluid' is part of the LATBOLTZ package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.planewall: { folder: examples/PACKAGES/latboltz/planewall, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'lb/fluid' is part of the LATBOLTZ package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.compute: { folder: examples/PACKAGES/pace/compute, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.pace.product: { folder: examples/PACKAGES/pace, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 9.0, walltime_norm: 1.5 } +in.pace.recursive: { folder: examples/PACKAGES/pace, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 7.0, walltime_norm: 1.1666666666666667 } +in.addtorque: { folder: examples/PACKAGES/addtorque, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 3 }, walltime: 51.0, walltime_norm: 8.5 } +in.cnp: { folder: examples/PACKAGES/cnp, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 18.0, walltime_norm: 3.0 } +in.CH4fc.ang: { folder: examples/PACKAGES/eff/fixed-core/CH4, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 3.0, walltime_norm: 0.5 } +in.CH4fc.bohr: { folder: examples/PACKAGES/eff/fixed-core/CH4, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.CH4fc.spe.ang: { folder: examples/PACKAGES/eff/fixed-core/CH4, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.CH4fc.spe.bohr: { folder: examples/PACKAGES/eff/fixed-core/CH4, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.C2H6fc.ang: { folder: examples/PACKAGES/eff/fixed-core/C2H6, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.C2H6fc.bohr: { folder: examples/PACKAGES/eff/fixed-core/C2H6, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.ch4.dynamics: { folder: examples/PACKAGES/eff/CH4, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.ch4.min: { folder: examples/PACKAGES/eff/CH4, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.ch4_ionized.dynamics: { folder: examples/PACKAGES/eff/CH4, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 16.0, walltime_norm: 2.6666666666666665 } +in.Be-solid.spe: { folder: examples/PACKAGES/eff/Be-solid, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 14.0, walltime_norm: 2.3333333333333335 } +in.adamantane_ionized.nve: { folder: examples/PACKAGES/eff/Auger-Adamantane, status: "failed, ERROR: Lost atoms: original 101 current 100 (src/thermo.cpp:494).", walltime: -1 } +in.SiH4: { folder: examples/PACKAGES/eff/ECP/SiH4, status: "completed, error parsing log.lammps into YAML", walltime: 0.0, walltime_norm: 0.0 } +in.SiH4.ang: { folder: examples/PACKAGES/eff/ECP/SiH4, status: "completed, error parsing log.lammps into YAML", walltime: 0.0, walltime_norm: 0.0 } +in.Si2H6: { folder: examples/PACKAGES/eff/ECP/Si2H6, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.Si2H6.ang: { folder: examples/PACKAGES/eff/ECP/Si2H6, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.SiC: { folder: examples/PACKAGES/eff/ECP/SiC/bulk, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 31.0, walltime_norm: 5.166666666666667 } +in.h2bulk.npt: { folder: examples/PACKAGES/eff/H_plasma, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 46.0, walltime_norm: 7.666666666666667 } +in.h2bulk.nve: { folder: examples/PACKAGES/eff/H_plasma, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 78.0, walltime_norm: 13.0 } +in.h2bulk.nve.ang: { folder: examples/PACKAGES/eff/H_plasma, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 87.0, walltime_norm: 14.5 } +in.Li-dendritic.min: { folder: examples/PACKAGES/eff/Li-dendritic, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 35.0, walltime_norm: 5.833333333333333 } +in.Li-dendritic.nvt: { folder: examples/PACKAGES/eff/Li-dendritic, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 69.0, walltime_norm: 11.5 } +in.Li.ang: { folder: examples/PACKAGES/eff/Li-solid, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 74.0, walltime_norm: 12.333333333333334 } +in.Li.bohr: { folder: examples/PACKAGES/eff/Li-solid, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 53.0, walltime_norm: 8.833333333333334 } +in.h2: { folder: examples/PACKAGES/eff/H2, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.h_atom.spe.ang: { folder: examples/PACKAGES/eff/H, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.h_atom.spe.bohr: { folder: examples/PACKAGES/eff/H, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.npt_biaxial: { folder: examples/PACKAGES/uef/npt_biaxial, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 3.0, walltime_norm: 0.5 } +in.nvt_uniaxial: { folder: examples/PACKAGES/uef/nvt_uniaxial, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 3.0, walltime_norm: 0.5 } +in.crystal: { folder: examples/PACKAGES/rhok, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 23.0, walltime_norm: 3.8333333333333335 } +in.pinning: { folder: examples/PACKAGES/rhok, status: "failed, ERROR: Cannot open file data.halfhalf: No such file or directory (src/read_data.cpp:367).", walltime: -1 } +in.setup: { folder: examples/PACKAGES/rhok, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 17.0, walltime_norm: 2.8333333333333335 } +in.peptide-colvars: { folder: examples/PACKAGES/colvars, status: "completed, error parsing log.lammps into YAML", walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.peptide-colvars2: { folder: examples/PACKAGES/colvars, status: "completed, error parsing log.lammps into YAML", walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.peptide-spring: { folder: examples/PACKAGES/colvars, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.peptide-spring2: { folder: examples/PACKAGES/colvars, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.hdnnp: { folder: examples/PACKAGES/hdnnp, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized pair style 'hdnnp' is part of the ML-HDNNP package which is not enabled in this LAMMPS binary. (src/force.cpp:275)", walltime: -1 } +in.hybrid: { folder: examples/PACKAGES/hdnnp, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized pair style 'hdnnp' is part of the ML-HDNNP package which is not enabled in this LAMMPS binary. (src/force.cpp:275)", walltime: -1 } +in.edip-Si: { folder: examples/PACKAGES/edip, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.edip-Si-multi: { folder: examples/PACKAGES/edip, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.edip-SiC: { folder: examples/PACKAGES/edip, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.large_nylon_melt: { folder: examples/PACKAGES/reaction/nylon,6-6_melt, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 60.0, walltime_norm: 10.0 } +in.tiny_polystyrene.stabilized: { folder: examples/PACKAGES/reaction/tiny_polystyrene, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 18.0, walltime_norm: 3.0 } +in.tiny_epoxy.stabilized: { folder: examples/PACKAGES/reaction/tiny_epoxy, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 1 }, walltime: 0.0, walltime_norm: 0.0 } +in.grow_styrene: { folder: examples/PACKAGES/reaction/create_atoms_polystyrene, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 6.0, walltime_norm: 1.0 } +in.tiny_nylon.stabilized: { folder: examples/PACKAGES/reaction/tiny_nylon, status: "failed, unknown command, package not installed, ERROR: Unknown command: react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map rescale_charges yes (src/input.cpp:314)", walltime: -1 } +in.tiny_nylon.stabilized_variable_probability: { folder: examples/PACKAGES/reaction/tiny_nylon, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 0.0, walltime_norm: 0.0 } +in.tiny_nylon.unstabilized: { folder: examples/PACKAGES/reaction/tiny_nylon, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 0.0, walltime_norm: 0.0 } +in.BulkNi: { folder: examples/PACKAGES/diffraction, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 158.0, walltime_norm: 26.333333333333332 } +in.tdpd: { folder: examples/PACKAGES/dpd-meso/tdpd, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 64.0, walltime_norm: 10.666666666666666 } +in.tdpd-region: { folder: examples/PACKAGES/dpd-meso/tdpd, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 63.0, walltime_norm: 10.5 } +in.mdpd: { folder: examples/PACKAGES/dpd-meso/mdpd, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 100.0, walltime_norm: 16.666666666666668 } +in.edpd: { folder: examples/PACKAGES/dpd-meso/edpd, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 87.0, walltime_norm: 14.5 } +in.edpd-region: { folder: examples/PACKAGES/dpd-meso/edpd, status: "completed", failed_checks: { abs_diff_failed: 6, rel_diff_failed: 6 }, walltime: 87.0, walltime_norm: 14.5 } +in.cylinder: { folder: examples/PACKAGES/stressprofile, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.flat: { folder: examples/PACKAGES/stressprofile, status: "failed, ERROR: Illegal compute stress/cartesian command: missing argument(s) (src/EXTRA-COMPUTE/compute_stress_cartesian.cpp:65).", walltime: -1 } +in.sphere: { folder: examples/PACKAGES/stressprofile, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.srp: { folder: examples/PACKAGES/srp, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 6.0, walltime_norm: 1.0 } +in.scafacos: { folder: examples/PACKAGES/scafacos, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized kspace style 'scafacos' is part of the SCAFACOS package which is not enabled in this LAMMPS binary. (src/force.cpp:660)", walltime: -1 } +in.scafacos.cw.ewald: { folder: examples/PACKAGES/scafacos, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized kspace style 'scafacos' is part of the SCAFACOS package which is not enabled in this LAMMPS binary. (src/force.cpp:660)", walltime: -1 } +in.scafacos.cw.fmm: { folder: examples/PACKAGES/scafacos, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized kspace style 'scafacos' is part of the SCAFACOS package which is not enabled in this LAMMPS binary. (src/force.cpp:660)", walltime: -1 } +in.scafacos.cw.p2nfft: { folder: examples/PACKAGES/scafacos, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized kspace style 'scafacos' is part of the SCAFACOS package which is not enabled in this LAMMPS binary. (src/force.cpp:660)", walltime: -1 } +in.scafacos.cw.p3m: { folder: examples/PACKAGES/scafacos, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized kspace style 'scafacos' is part of the SCAFACOS package which is not enabled in this LAMMPS binary. (src/force.cpp:660)", walltime: -1 } +in.scafacos.ewald: { folder: examples/PACKAGES/scafacos, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized kspace style 'scafacos' is part of the SCAFACOS package which is not enabled in this LAMMPS binary. (src/force.cpp:660)", walltime: -1 } +in.scafacos.fmm: { folder: examples/PACKAGES/scafacos, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized kspace style 'scafacos' is part of the SCAFACOS package which is not enabled in this LAMMPS binary. (src/force.cpp:660)", walltime: -1 } +in.scafacos.hsph.direct: { folder: examples/PACKAGES/scafacos, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized kspace style 'scafacos' is part of the SCAFACOS package which is not enabled in this LAMMPS binary. (src/force.cpp:660)", walltime: -1 } +in.scafacos.hsph.fmm: { folder: examples/PACKAGES/scafacos, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized kspace style 'scafacos' is part of the SCAFACOS package which is not enabled in this LAMMPS binary. (src/force.cpp:660)", walltime: -1 } +in.scafacos.hsph.p2nfft: { folder: examples/PACKAGES/scafacos, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized kspace style 'scafacos' is part of the SCAFACOS package which is not enabled in this LAMMPS binary. (src/force.cpp:660)", walltime: -1 } +in.scafacos.p2nfft: { folder: examples/PACKAGES/scafacos, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized kspace style 'scafacos' is part of the SCAFACOS package which is not enabled in this LAMMPS binary. (src/force.cpp:660)", walltime: -1 } +in.scafacos.p3m: { folder: examples/PACKAGES/scafacos, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized kspace style 'scafacos' is part of the SCAFACOS package which is not enabled in this LAMMPS binary. (src/force.cpp:660)", walltime: -1 } +in.h_atom: { folder: examples/PACKAGES/awpmd, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized atom style 'wavepacket' is part of the AWPMD package which is not enabled in this LAMMPS binary. (src/atom.cpp:745)", walltime: -1 } +in.h_molecule: { folder: examples/PACKAGES/awpmd, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized atom style 'wavepacket' is part of the AWPMD package which is not enabled in this LAMMPS binary. (src/atom.cpp:745)", walltime: -1 } +in.gold_gr: { folder: examples/PACKAGES/interlayer/saip_metal, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.atom-diffusion: { folder: examples/PACKAGES/interlayer/kolmogorov_crespi_z, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.bilayer-graphene: { folder: examples/PACKAGES/interlayer/kolmogorov_crespi_z, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.gr_water: { folder: examples/PACKAGES/interlayer/aip_water_2dm, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 19.0, walltime_norm: 3.1666666666666665 } +in.gr_water.opt: { folder: examples/PACKAGES/interlayer/aip_water_2dm, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.bilayer-graphene: { folder: examples/PACKAGES/interlayer/kolmogorov_crespi_full, status: "failed, mismatched columns in the log files", walltime: 121.0, walltime_norm: 20.166666666666668 } +in.CH_drip: { folder: examples/PACKAGES/interlayer/drip, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 1 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.C_drip: { folder: examples/PACKAGES/interlayer/drip, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.mos2: { folder: examples/PACKAGES/interlayer/ilp_tmds, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 1 }, walltime: 57.0, walltime_norm: 9.5 } +in.bilayer-graphene: { folder: examples/PACKAGES/interlayer/ilp_graphene_hbn, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 70.0, walltime_norm: 11.666666666666666 } +in.bilayer-hBN: { folder: examples/PACKAGES/interlayer/ilp_graphene_hbn, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 134.0, walltime_norm: 22.333333333333332 } +in.grhBN: { folder: examples/PACKAGES/interlayer/ilp_graphene_hbn, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 123.0, walltime_norm: 20.5 } +in.ilp_graphene_hbn: { folder: examples/PACKAGES/interlayer/ilp_graphene_hbn, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 129.0, walltime_norm: 21.5 } +in.smatbAgCuPancake: { folder: examples/PACKAGES/smtbq, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.smatbBulkFCC: { folder: examples/PACKAGES/smtbq, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.smtbq.Al: { folder: examples/PACKAGES/smtbq, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 3.0, walltime_norm: 0.5 } +in.smtbq.Al2O3: { folder: examples/PACKAGES/smtbq, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.smtbq.TiO2: { folder: examples/PACKAGES/smtbq, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.slater: { folder: examples/PACKAGES/slater, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.slcsa: { folder: examples/PACKAGES/sna_nnn_slcsa, status: "completed, error parsing log.lammps into YAML", walltime: 42.0, walltime_norm: 7.0 } +in.orient_eco: { folder: examples/PACKAGES/orient_eco, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 128.0, walltime_norm: 21.333333333333332 } +in.entropy: { folder: examples/PACKAGES/entropy, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 13.0, walltime_norm: 2.1666666666666665 } +in.bpti: { folder: examples/PACKAGES/filter_corotate, status: "completed, error parsing log.lammps into YAML", walltime: 24.0, walltime_norm: 4.0 } +in.peptide: { folder: examples/PACKAGES/filter_corotate, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 98.0, walltime_norm: 16.333333333333332 } +in.graphene: { folder: examples/PACKAGES/ipi, status: "failed, no Total wall time in the output, -------------------------------------------------------------------------- +MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD +with errorcode 1. + +NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. +You may or may not see output from other processes, depending on +exactly when Open MPI kills them. +-------------------------------------------------------------------------- +", walltime: -1 } +in.gREM-npt: { folder: examples/PACKAGES/grem/lj-single, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.gREM-nvt: { folder: examples/PACKAGES/grem/lj-single, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.gREM: { folder: examples/PACKAGES/grem/lj-6rep, status: "failed, ERROR: Cannot open file restart_file: No such file or directory (src/read_data.cpp:367).", walltime: -1 } +in.gREM-temper: { folder: examples/PACKAGES/grem/lj-temper, status: "failed, ERROR: World variable count doesn't match # of partitions (src/variable.cpp:255).", walltime: -1 } +in.compute_stress_mop: { folder: examples/PACKAGES/mop, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.fix_wall: { folder: examples/PACKAGES/ees, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.fix_wall_region: { folder: examples/PACKAGES/ees, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.ti_spring: { folder: examples/PACKAGES/ti, status: "failed, no Total wall time in the output, -------------------------------------------------------------------------- +MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD +with errorcode 1. + +NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. +You may or may not see output from other processes, depending on +exactly when Open MPI kills them. +-------------------------------------------------------------------------- +", walltime: -1 } +in.extep-bn: { folder: examples/PACKAGES/extep, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 0.0, walltime_norm: 0.0 } +in.toluene.lang: { folder: examples/PACKAGES/drude/toluene, status: "completed", failed_checks: { abs_diff_failed: 4, rel_diff_failed: 5 }, walltime: 68.0, walltime_norm: 11.333333333333334 } +in.toluene.nh: { folder: examples/PACKAGES/drude/toluene, status: "completed", failed_checks: { abs_diff_failed: 5, rel_diff_failed: 5 }, walltime: 68.0, walltime_norm: 11.333333333333334 } +in.butane.lang: { folder: examples/PACKAGES/drude/butane, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 50.0, walltime_norm: 8.333333333333334 } +in.butane.nh: { folder: examples/PACKAGES/drude/butane, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 5 }, walltime: 49.0, walltime_norm: 8.166666666666666 } +in.butane.tgnh: { folder: examples/PACKAGES/drude/butane, status: "completed", failed_checks: { abs_diff_failed: 4, rel_diff_failed: 4 }, walltime: 49.0, walltime_norm: 8.166666666666666 } +in.swm4-ndp.lang: { folder: examples/PACKAGES/drude/swm4-ndp, status: "completed", failed_checks: { abs_diff_failed: 5, rel_diff_failed: 5 }, walltime: 65.0, walltime_norm: 10.833333333333334 } +in.swm4-ndp.nh: { folder: examples/PACKAGES/drude/swm4-ndp, status: "completed", failed_checks: { abs_diff_failed: 5, rel_diff_failed: 5 }, walltime: 54.0, walltime_norm: 9.0 } +in.ethylene_glycol: { folder: examples/PACKAGES/drude/ethylene_glycol, status: "completed", failed_checks: { abs_diff_failed: 4, rel_diff_failed: 4 }, walltime: 25.0, walltime_norm: 4.166666666666667 } +in.ethanol.lang: { folder: examples/PACKAGES/drude/ethanol, status: "completed", failed_checks: { abs_diff_failed: 5, rel_diff_failed: 5 }, walltime: 43.0, walltime_norm: 7.166666666666667 } +in.ethanol.nh: { folder: examples/PACKAGES/drude/ethanol, status: "completed", failed_checks: { abs_diff_failed: 5, rel_diff_failed: 5 }, walltime: 42.0, walltime_norm: 7.0 } +in.ethanol.tgnh: { folder: examples/PACKAGES/drude/ethanol, status: "completed", failed_checks: { abs_diff_failed: 5, rel_diff_failed: 5 }, walltime: 44.0, walltime_norm: 7.333333333333333 } +in.force: { folder: examples/PACKAGES/tally, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.pe: { folder: examples/PACKAGES/tally, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.stress: { folder: examples/PACKAGES/tally, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.system: { folder: examples/PACKAGES/momb, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 13.0, walltime_norm: 2.1666666666666665 } +in.momentum: { folder: examples/PACKAGES/momentum, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 41.0, walltime_norm: 6.833333333333333 } +in.alpha: { folder: examples/PACKAGES/meam_sw_spline/Ti, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.alpha_relaxation: { folder: examples/PACKAGES/meam_sw_spline/Ti, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.beta: { folder: examples/PACKAGES/meam_sw_spline/Ti, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.energy_conservation.meam.sw: { folder: examples/PACKAGES/meam_sw_spline/Ti, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 74.0, walltime_norm: 12.333333333333334 } +in.fcc: { folder: examples/PACKAGES/meam_sw_spline/Ti, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.hexagonal: { folder: examples/PACKAGES/meam_sw_spline/Ti, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.omega: { folder: examples/PACKAGES/meam_sw_spline/Ti, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.single_atom: { folder: examples/PACKAGES/meam_sw_spline/Ti, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.bcc: { folder: examples/PACKAGES/meam_sw_spline/Si, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.bcc_relax: { folder: examples/PACKAGES/meam_sw_spline/Si, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.dc: { folder: examples/PACKAGES/meam_sw_spline/Si, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.dc_relax: { folder: examples/PACKAGES/meam_sw_spline/Si, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.energy_conservation.meam.sw: { folder: examples/PACKAGES/meam_sw_spline/Si, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.fcc: { folder: examples/PACKAGES/meam_sw_spline/Si, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.fcc_relax: { folder: examples/PACKAGES/meam_sw_spline/Si, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.hcp_relax: { folder: examples/PACKAGES/meam_sw_spline/Si, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.sc: { folder: examples/PACKAGES/meam_sw_spline/Si, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.sc_relax: { folder: examples/PACKAGES/meam_sw_spline/Si, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.single_atom: { folder: examples/PACKAGES/meam_sw_spline/Si, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.film_mesocnt: { folder: examples/PACKAGES/mesont, status: "failed, no Total wall time in the output, -------------------------------------------------------------------------- +MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD +with errorcode 1. + +NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. +You may or may not see output from other processes, depending on +exactly when Open MPI kills them. +-------------------------------------------------------------------------- +", walltime: -1 } +in.cauchystat: { folder: examples/PACKAGES/cauchy, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 1 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.rubber_strip_pull: { folder: examples/PACKAGES/machdyn/rubber_strip_pull, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.aluminum_strip_pull: { folder: examples/PACKAGES/machdyn/aluminum_strip_pull, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.funnel_flow: { folder: examples/PACKAGES/machdyn/funnel_flow, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 29.0, walltime_norm: 4.833333333333333 } +in.fluid_structure_interaction: { folder: examples/PACKAGES/machdyn/fluid_structure_interaction, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 32.0, walltime_norm: 5.333333333333333 } +in.rubber_rings_3d: { folder: examples/PACKAGES/machdyn/rubber_rings_3d, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 21.0, walltime_norm: 3.5 } +in.h2o-quantum: { folder: examples/PACKAGES/gle, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 13.0, walltime_norm: 2.1666666666666665 } +in.h2o-smart: { folder: examples/PACKAGES/gle, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 13.0, walltime_norm: 2.1666666666666665 } +in.pafi: { folder: examples/PACKAGES/pafi, status: "failed, no Total wall time in the output, -------------------------------------------------------------------------- +MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD +with errorcode 1. + +NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. +You may or may not see output from other processes, depending on +exactly when Open MPI kills them. +-------------------------------------------------------------------------- +", walltime: -1 } +in.scp: { folder: examples/PACKAGES/pimd/prot-hairpin, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 15.0, walltime_norm: 2.5 } +in.scp: { folder: examples/PACKAGES/pimd/para-h2, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 6.0, walltime_norm: 1.0 } +in.lmp: { folder: examples/PACKAGES/pimd/langevin_reduced_units, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.langevin.metal: { folder: examples/PACKAGES/pimd/langevin_metal_units, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 0.0, walltime_norm: 0.0 } +in.pimd-langevin.metal: { folder: examples/PACKAGES/pimd/langevin_metal_units, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 0.0, walltime_norm: 0.0 } +in.rann: { folder: examples/PACKAGES/rann, status: "failed, no Total wall time in the output, -------------------------------------------------------------------------- +MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD +with errorcode 1. + +NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. +You may or may not see output from other processes, depending on +exactly when Open MPI kills them. +-------------------------------------------------------------------------- +", walltime: -1 } +in.msd.2d: { folder: examples/DIFFUSE, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 36.0, walltime_norm: 6.0 } +in.vacf.2d: { folder: examples/DIFFUSE, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 39.0, walltime_norm: 6.5 } +in.numdiff: { folder: examples/numdiff, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.bpm.pour: { folder: examples/bpm/pour, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.bpm.impact.rotational: { folder: examples/bpm/impact, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 102.0, walltime_norm: 17.0 } +in.bpm.impact.spring: { folder: examples/bpm/impact, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 12.0, walltime_norm: 2.0 } +in.rheo.balloon: { folder: examples/rheo/balloon, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.rheo.oxidation: { folder: examples/rheo/oxidation, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.rheo.taylor.green: { folder: examples/rheo/taylor-green, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 113.0, walltime_norm: 18.833333333333332 } +in.rheo.ice.cubes: { folder: examples/rheo/ice-cubes, status: "failed, no Total wall time in the output, -------------------------------------------------------------------------- +MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD +with errorcode 1. + +NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. +You may or may not see output from other processes, depending on +exactly when Open MPI kills them. +-------------------------------------------------------------------------- +", walltime: -1 } +in.rheo.poiseuille: { folder: examples/rheo/poiseuille, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 29.0, walltime_norm: 4.833333333333333 } +in.rheo.dam.break: { folder: examples/rheo/dam-break, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 159.0, walltime_norm: 26.5 } +in.peptide: { folder: examples/peptide, status: "completed, error parsing log.lammps into YAML", walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.coreshell: { folder: examples/coreshell, status: "completed", failed_checks: { abs_diff_failed: 7, rel_diff_failed: 9 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.coreshell.dsf: { folder: examples/coreshell, status: "completed", failed_checks: { abs_diff_failed: 7, rel_diff_failed: 8 }, walltime: 20.0, walltime_norm: 3.3333333333333335 } +in.coreshell.thermostats: { folder: examples/coreshell, status: "completed", failed_checks: { abs_diff_failed: 12, rel_diff_failed: 14 }, walltime: 14.0, walltime_norm: 2.3333333333333335 } +in.coreshell.wolf: { folder: examples/coreshell, status: "completed", failed_checks: { abs_diff_failed: 5, rel_diff_failed: 5 }, walltime: 22.0, walltime_norm: 3.6666666666666665 } +in.marble_race: { folder: examples/mesh, status: "completed", failed_checks: { abs_diff_failed: 5, rel_diff_failed: 5 }, walltime: 131.0, walltime_norm: 21.833333333333332 } +in.mesh_box: { folder: examples/mesh, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.abcfire: { folder: examples/fire, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.abcfire_mod: { folder: examples/fire, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.cg: { folder: examples/fire, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.fire: { folder: examples/fire, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.fire_mod: { folder: examples/fire, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.meam.abcfire: { folder: examples/fire, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 43.0, walltime_norm: 7.166666666666667 } +in.meam.fire: { folder: examples/fire, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 62.0, walltime_norm: 10.333333333333334 } +in.neb.sivac.abcfire: { folder: examples/fire, status: "failed, ERROR: Cannot use NEB with a single replica (src/REPLICA/neb.cpp:141).", walltime: -1 } +in.neb.sivac.abcfire_mod: { folder: examples/fire, status: "failed, ERROR: Cannot use NEB with a single replica (src/REPLICA/neb.cpp:141).", walltime: -1 } +in.neb.sivac.fire: { folder: examples/fire, status: "failed, ERROR: Cannot use NEB with a single replica (src/REPLICA/neb.cpp:141).", walltime: -1 } +in.neb.sivac.fire_mod: { folder: examples/fire, status: "failed, ERROR: Cannot use NEB with a single replica (src/REPLICA/neb.cpp:141).", walltime: -1 } +in.neb.sivac.qm: { folder: examples/fire, status: "failed, ERROR: Cannot use NEB with a single replica (src/REPLICA/neb.cpp:141).", walltime: -1 } +in.bcc.orthog: { folder: examples/triclinic, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.bcc.primitive: { folder: examples/triclinic, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.data.general: { folder: examples/triclinic, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.fcc.orthog: { folder: examples/triclinic, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.fcc.primitive: { folder: examples/triclinic, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.hex.orthog: { folder: examples/triclinic, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.hex.primitive: { folder: examples/triclinic, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.sq2.orthog: { folder: examples/triclinic, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.sq2.primitive: { folder: examples/triclinic, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.tri.srd: { folder: examples/ASPHERE/tri, status: "completed", failed_checks: { abs_diff_failed: 4, rel_diff_failed: 4 }, walltime: 143.0, walltime_norm: 23.833333333333332 } +in.star: { folder: examples/ASPHERE/star, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 12.0, walltime_norm: 2.0 } +in.star.mp: { folder: examples/ASPHERE/star, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 12.0, walltime_norm: 2.0 } +in.box: { folder: examples/ASPHERE/box, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 3 }, walltime: 18.0, walltime_norm: 3.0 } +in.box.mp: { folder: examples/ASPHERE/box, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 19.0, walltime_norm: 3.1666666666666665 } +in.dimer: { folder: examples/ASPHERE/dimer, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 6.0, walltime_norm: 1.0 } +in.dimer.mp: { folder: examples/ASPHERE/dimer, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 16.0, walltime_norm: 2.6666666666666665 } +in.vesicle: { folder: examples/ASPHERE/vesicle, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 9.0, walltime_norm: 1.5 } +in.line: { folder: examples/ASPHERE/line, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.line.srd: { folder: examples/ASPHERE/line, status: "failed, no Total wall time in the output, -------------------------------------------------------------------------- +MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD +with errorcode 1. + +NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. +You may or may not see output from other processes, depending on +exactly when Open MPI kills them. +-------------------------------------------------------------------------- +", walltime: -1 } +in.poly: { folder: examples/ASPHERE/poly, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 8.0, walltime_norm: 1.3333333333333333 } +in.poly.mp: { folder: examples/ASPHERE/poly, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 8.0, walltime_norm: 1.3333333333333333 } +in.flat_membrane: { folder: examples/ASPHERE/flat_membrane, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 7.0, walltime_norm: 1.1666666666666667 } +in.ellipsoid: { folder: examples/ASPHERE/ellipsoid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 9.0, walltime_norm: 1.5 } +in.ellipsoid.mp: { folder: examples/ASPHERE/ellipsoid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 9.0, walltime_norm: 1.5 } +in.ubiquitin: { folder: examples/amoeba, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 12.0, walltime_norm: 2.0 } +in.water_box.amoeba: { folder: examples/amoeba, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 8.0, walltime_norm: 1.3333333333333333 } +in.water_box.hippo: { folder: examples/amoeba, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 6.0, walltime_norm: 1.0 } +in.water_dimer.amoeba: { folder: examples/amoeba, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.water_dimer.hippo: { folder: examples/amoeba, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 1 }, walltime: 0.0, walltime_norm: 0.0 } +in.water_hexamer.amoeba: { folder: examples/amoeba, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 1 }, walltime: 0.0, walltime_norm: 0.0 } +in.water_hexamer.hippo: { folder: examples/amoeba, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 1 }, walltime: 0.0, walltime_norm: 0.0 } +in.nb3b: { folder: examples/nb3b, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 5.0, walltime_norm: 0.8333333333333334 } +in.nb3b.screened: { folder: examples/nb3b, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 29.0, walltime_norm: 4.833333333333333 } +in.min: { folder: examples/min, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.min.box: { folder: examples/min, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.balance: { folder: examples/balance, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.balance.bond.fast: { folder: examples/balance, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.balance.bond.slow: { folder: examples/balance, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.balance.clock.dynamic: { folder: examples/balance, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 16.0, walltime_norm: 2.6666666666666665 } +in.balance.clock.static: { folder: examples/balance, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 6.0, walltime_norm: 1.0 } +in.balance.group.dynamic: { folder: examples/balance, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.balance.group.static: { folder: examples/balance, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.balance.kspace: { folder: examples/balance, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 6.0, walltime_norm: 1.0 } +in.balance.neigh.dynamic: { folder: examples/balance, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 16.0, walltime_norm: 2.6666666666666665 } +in.balance.neigh.rcb: { folder: examples/balance, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.balance.neigh.static: { folder: examples/balance, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.balance.var.dynamic: { folder: examples/balance, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 16.0, walltime_norm: 2.6666666666666665 } +in.ch4: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.ch4.plugin: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.graphene: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.graphene.plugin: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.series: { folder: examples/QUANTUM/LATTE, status: "failed, unknown command, package not installed, ERROR: Unknown command: mdi connect (src/input.cpp:314)", walltime: -1 } +in.series.plugin: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.sucrose: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.sucrose.plugin: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.uo2: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.uo2.plugin: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.water: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.water.min: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.water.min.plugin: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.water.plugin: { folder: examples/QUANTUM/LATTE, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.mixture.mm: { folder: examples/QUANTUM/PySCF, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.mixture.qmmm: { folder: examples/QUANTUM/PySCF, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qmmm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.mixture.qmmm.plugin: { folder: examples/QUANTUM/PySCF, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qmmm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.water.qmmm: { folder: examples/QUANTUM/PySCF, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qmmm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.water.qmmm.plugin: { folder: examples/QUANTUM/PySCF, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qmmm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.series: { folder: examples/QUANTUM/NWChem, status: "failed, unknown command, package not installed, ERROR: Unknown command: mdi connect (src/input.cpp:314)", walltime: -1 } +in.series.plugin: { folder: examples/QUANTUM/NWChem, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.water.mm: { folder: examples/QUANTUM/NWChem, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.water.qmmm: { folder: examples/QUANTUM/NWChem, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qmmm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.water.qmmm.plugin: { folder: examples/QUANTUM/NWChem, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qmmm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.zeolite.mm: { folder: examples/QUANTUM/NWChem, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.zeolite.qmmm: { folder: examples/QUANTUM/NWChem, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qmmm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.zeolite.qmmm.plugin: { folder: examples/QUANTUM/NWChem, status: "failed, unrecognized command, package not installed, ERROR: Unrecognized fix style 'mdi/qmmm' is part of the MDI package which is not enabled in this LAMMPS binary. (src/modify.cpp:924)", walltime: -1 } +in.wall.ccl: { folder: examples/wall, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.wall.diffusive: { folder: examples/wall, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.wall.flow: { folder: examples/wall, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 5.0, walltime_norm: 0.8333333333333334 } +in.wall.lepton: { folder: examples/wall, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.wall.maxwell: { folder: examples/wall, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.wall.specular: { folder: examples/wall, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.wall.table: { folder: examples/wall, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.meam: { folder: examples/meam, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.meam.shear: { folder: examples/meam, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 31.0, walltime_norm: 5.166666666666667 } +in.msmeam: { folder: examples/meam/msmeam, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.hugoniostat: { folder: examples/hugoniostat, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.comb.Cu: { folder: examples/comb, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.comb.Cu2O.elastic: { folder: examples/comb, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 21.0, walltime_norm: 3.5 } +in.comb.HfO2: { folder: examples/comb, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.comb.Si: { folder: examples/comb, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.comb.Si.elastic: { folder: examples/comb, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.comb3: { folder: examples/comb, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.tad: { folder: examples/tad, status: "failed, ERROR: Cannot use TAD with a single replica for NEB (src/REPLICA/tad.cpp:79).", walltime: -1 } +in.controller.temp: { folder: examples/controller, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 6.0, walltime_norm: 1.0 } +in.controller.wall: { folder: examples/controller, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 19.0, walltime_norm: 3.1666666666666665 } +in.reaxff.rdx: { folder: examples/reaxff, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 0.0, walltime_norm: 0.0 } +in.reaxff.rdx-shielded: { folder: examples/reaxff, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.reaxff.tatb: { folder: examples/reaxff, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 2 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.reaxff.tatb-shielded: { folder: examples/reaxff, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 2 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.ci-reax.CH: { folder: examples/reaxff/ci-reaxFF, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 12.0, walltime_norm: 2.0 } +in.reaxff.hns: { folder: examples/reaxff/HNS, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 20.0, walltime_norm: 3.3333333333333335 } +in.VOH: { folder: examples/reaxff/VOH, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 2 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.water.acks2: { folder: examples/reaxff/water, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 13.0, walltime_norm: 2.1666666666666665 } +in.water.acks2.field: { folder: examples/reaxff/water, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 17.0, walltime_norm: 2.8333333333333335 } +in.water.qeq: { folder: examples/reaxff/water, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 6.0, walltime_norm: 1.0 } +in.water.qeq.field: { folder: examples/reaxff/water, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 5.0, walltime_norm: 0.8333333333333334 } +in.ZnOH2: { folder: examples/reaxff/ZnOH2, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.FC: { folder: examples/reaxff/FC, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 15.0, walltime_norm: 2.5 } +in.RDX: { folder: examples/reaxff/RDX, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 6.0, walltime_norm: 1.0 } +in.AuO: { folder: examples/reaxff/AuO, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 6.0, walltime_norm: 1.0 } +in.CHO: { folder: examples/reaxff/CHO, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 2 }, walltime: 3.0, walltime_norm: 0.5 } +in.FeOH3: { folder: examples/reaxff/FeOH3, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.AB: { folder: examples/reaxff/AB, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.grid.2d: { folder: examples/grid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.grid.3d: { folder: examples/grid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.sph: { folder: examples/grid, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 36.0, walltime_norm: 6.0 } +in.yaml: { folder: examples/yaml, status: "completed, error parsing log.lammps into YAML", walltime: 3.0, walltime_norm: 0.5 } +in.hBN_shift: { folder: examples/tersoff, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.tersoff: { folder: examples/tersoff, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.friction: { folder: examples/friction, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.cmap: { folder: examples/cmap, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 1 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.dipole: { folder: examples/dipole, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.colloid: { folder: examples/colloid, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.streitz.ewald: { folder: examples/streitz, status: "completed", failed_checks: { abs_diff_failed: 1, rel_diff_failed: 2 }, walltime: 53.0, walltime_norm: 8.833333333333334 } +in.streitz.wolf: { folder: examples/streitz, status: "failed, mismatched columns in the log files", walltime: 57.0, walltime_norm: 9.5 } +in.neb.hop1: { folder: examples/neb, status: "failed, ERROR: Cannot use NEB with a single replica (src/REPLICA/neb.cpp:141).", walltime: -1 } +in.neb.hop1.end: { folder: examples/neb, status: "failed, ERROR: Cannot use NEB with a single replica (src/REPLICA/neb.cpp:141).", walltime: -1 } +in.neb.hop2: { folder: examples/neb, status: "failed, ERROR: Cannot use NEB with a single replica (src/REPLICA/neb.cpp:141).", walltime: -1 } +in.neb.sivac: { folder: examples/neb, status: "failed, ERROR: Cannot use NEB with a single replica (src/REPLICA/neb.cpp:141).", walltime: -1 } +in.fix_python_invoke: { folder: examples/python, status: "failed, ERROR: Could not process Python string: .", walltime: -1 } +in.fix_python_invoke_neighlist: { folder: examples/python, status: "failed, ERROR: Could not process Python string: .", walltime: -1 } +in.fix_python_move_nve_melt: { folder: examples/python, status: "failed, ERROR: Loading python integrator module failure (src/PYTHON/fix_python_move.cpp:64).", walltime: -1 } +in.fix_python_move_nve_melt_opt: { folder: examples/python, status: "failed, ERROR: Loading python integrator module failure (src/PYTHON/fix_python_move.cpp:64).", walltime: -1 } +in.pair_python_coulomb: { folder: examples/python, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 3.0, walltime_norm: 0.5 } +in.pair_python_harmonic: { folder: examples/python, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 45.0, walltime_norm: 7.5 } +in.pair_python_hybrid: { folder: examples/python, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 3 }, walltime: 13.0, walltime_norm: 2.1666666666666665 } +in.pair_python_long: { folder: examples/python, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 4.0, walltime_norm: 0.6666666666666666 } +in.pair_python_melt: { folder: examples/python, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 3 }, walltime: 28.0, walltime_norm: 4.666666666666667 } +in.pair_python_spce: { folder: examples/python, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.pair_python_table: { folder: examples/python, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.python: { folder: examples/python, status: "failed, ERROR on proc 0: Python evaluation of function loop failed (src/PYTHON/python_impl.cpp:384).", walltime: -1 } +in.bcc: { folder: examples/steinhardt, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.fcc: { folder: examples/steinhardt, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.icos: { folder: examples/steinhardt, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.kim-ex.melt: { folder: examples/kim, status: "failed, unknown command, package not installed, ERROR: Unknown command: kim init LennardJones_Ar real (src/input.cpp:314)", walltime: -1 } +in.kim-pm-property: { folder: examples/kim, status: "failed, unknown command, package not installed, ERROR: Unknown command: kim init LJ_Shifted_Bernardes_1958MedCutoff_Ar__MO_126566794224_004 metal (src/input.cpp:314)", walltime: -1 } +in.kim-pm-query.melt: { folder: examples/kim, status: "failed, unknown command, package not installed, ERROR: Unknown command: kim init SW_StillingerWeber_1985_Si__MO_405512056662_005 real (src/input.cpp:314)", walltime: -1 } +in.kim-pm.melt: { folder: examples/kim, status: "failed, unknown command, package not installed, ERROR: Unknown command: kim init SW_StillingerWeber_1985_Si__MO_405512056662_005 real (src/input.cpp:314)", walltime: -1 } +in.kim-query: { folder: examples/kim, status: "failed, unknown command, package not installed, ERROR: Unknown command: kim init EAM_Dynamo_ErcolessiAdams_1994_Al__MO_123629422045_005 metal (src/input.cpp:314)", walltime: -1 } +in.kim-sm.melt: { folder: examples/kim, status: "failed, unknown command, package not installed, ERROR: Unknown command: kim init Sim_LAMMPS_ReaxFF_StrachanVanDuinChakraborty_2003_CHNO__SM_107643900657_000 real (src/input.cpp:314)", walltime: -1 } +in.lammps.melt: { folder: examples/kim, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.ellipse.gayberne: { folder: examples/ellipse, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.ellipse.resquared: { folder: examples/ellipse, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 2 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.cos.1000SPCE: { folder: examples/VISCOSITY, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 36.0, walltime_norm: 6.0 } +in.einstein.2d: { folder: examples/VISCOSITY, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 39.0, walltime_norm: 6.5 } +in.gk.2d: { folder: examples/VISCOSITY, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 39.0, walltime_norm: 6.5 } +in.mp.2d: { folder: examples/VISCOSITY, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 5.0, walltime_norm: 0.8333333333333334 } +in.nemd.2d: { folder: examples/VISCOSITY, status: "completed", failed_checks: { abs_diff_failed: 8, rel_diff_failed: 8 }, walltime: 17.0, walltime_norm: 2.8333333333333335 } +in.wall.2d: { folder: examples/VISCOSITY, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 10.0, walltime_norm: 1.6666666666666667 } +in.gcmc.co2: { folder: examples/mc, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.gcmc.h2o: { folder: examples/mc, status: "completed", failed_checks: { abs_diff_failed: 8, rel_diff_failed: 8 }, walltime: 138.0, walltime_norm: 23.0 } +in.gcmc.lj: { folder: examples/mc, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 11.0, walltime_norm: 1.8333333333333333 } +in.mixed: { folder: examples/mc, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 57.0, walltime_norm: 9.5 } +in.pure: { folder: examples/mc, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 57.0, walltime_norm: 9.5 } +in.sgcmc.eam: { folder: examples/mc, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 43.0, walltime_norm: 7.166666666666667 } +in.widom.lj: { folder: examples/mc, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 8.0, walltime_norm: 1.3333333333333333 } +in.widom.spce: { folder: examples/mc, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 44.0, walltime_norm: 7.333333333333333 } +in.mc: { folder: examples/MC-LOOP, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.flow.couette: { folder: examples/flow, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.flow.pois: { folder: examples/flow, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.prd: { folder: examples/prd, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 3.0, walltime_norm: 0.5 } +in.C_SNAP: { folder: examples/snap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 34.0, walltime_norm: 5.666666666666667 } +in.grid.snap: { folder: examples/snap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.grid.tri: { folder: examples/snap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.snap.InP.JCPA2020: { folder: examples/snap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 15.0, walltime_norm: 2.5 } +in.snap.Mo_Chen: { folder: examples/snap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.snap.Ta06A: { folder: examples/snap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.snap.W.2940: { folder: examples/snap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.snap.WBe.PRB2019: { folder: examples/snap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.snap.compute: { folder: examples/snap, status: "completed, but no Step nor Loop in the output.", walltime: 0.0, walltime_norm: 0.0 } +in.snap.compute.quadratic: { folder: examples/snap, status: "completed, but no Step nor Loop in the output.", walltime: 0.0, walltime_norm: 0.0 } +in.snap.hybrid.WSNAP.HePair: { folder: examples/snap, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.snap.scale.Ni_Zuo_JCPA2020: { folder: examples/snap, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 3.0, walltime_norm: 0.5 } +in.lammps: { folder: examples/COUPLE/lammps_spparks, status: "failed, ERROR: Cannot open file data.lammps: No such file or directory (src/read_data.cpp:367).", walltime: -1 } +in.spparks: { folder: examples/COUPLE/lammps_spparks, status: "failed, unknown command, package not installed, ERROR: Unknown command: seed 56789 (src/input.cpp:314)", walltime: -1 } +in.lj: { folder: examples/COUPLE/plugin, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.fix_external: { folder: examples/COUPLE/python, status: "completed, but no Step nor Loop in the output.", walltime: 0.0, walltime_norm: 0.0 } +in.chain: { folder: examples/COUPLE/multiple, status: "failed, no Total wall time in the output, -------------------------------------------------------------------------- +MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD +with errorcode 1. + +NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes. +You may or may not see output from other processes, depending on +exactly when Open MPI kills them. +-------------------------------------------------------------------------- +", walltime: -1 } +in.lj: { folder: examples/COUPLE/simple, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.body: { folder: examples/body, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.cubes: { folder: examples/body, status: "completed", failed_checks: { abs_diff_failed: 2, rel_diff_failed: 2 }, walltime: 36.0, walltime_norm: 6.0 } +in.pour3d: { folder: examples/body, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.squares: { folder: examples/body, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 3.0, walltime_norm: 0.5 } +in.wall2d: { folder: examples/body, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 2.0, walltime_norm: 0.3333333333333333 } +in.atm: { folder: examples/atm, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 13.0, walltime_norm: 2.1666666666666665 } +in.ar.lj: { folder: examples/UNITS, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.ar.metal: { folder: examples/UNITS, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.ar.real: { folder: examples/UNITS, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.mos2-bulk: { folder: examples/threebody, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.mos2.rebomos: { folder: examples/threebody, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 21.0, walltime_norm: 3.5 } +in.mos2.sw.mod: { folder: examples/threebody, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.threebody: { folder: examples/threebody, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 1.0, walltime_norm: 0.16666666666666666 } +in.nemd: { folder: examples/nemd, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 0.0, walltime_norm: 0.0 } +in.obstacle: { folder: examples/obstacle, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 0.0, walltime_norm: 0.0 } +in.crack: { folder: examples/crack, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 3.0, walltime_norm: 0.5 } +in.elastic: { folder: examples/ELASTIC, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 0.0, walltime_norm: 0.0 } +in.peri-pmb: { folder: examples/peri, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 9.0, walltime_norm: 1.5 } +in.peri.eps: { folder: examples/peri, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 21.0, walltime_norm: 3.5 } +in.peri.lps: { folder: examples/peri, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 17.0, walltime_norm: 2.8333333333333335 } +in.peri.pmb: { folder: examples/peri, status: "completed", failed_checks: { abs_diff_failed: 0, rel_diff_failed: 0 }, walltime: 9.0, walltime_norm: 1.5 } +in.peri.ves: { folder: examples/peri, status: "completed", failed_checks: { abs_diff_failed: 3, rel_diff_failed: 3 }, walltime: 21.0, walltime_norm: 3.5 } +in.hyper.global: { folder: examples/hyper, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 53.0, walltime_norm: 8.833333333333334 } +in.hyper.local: { folder: examples/hyper, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 13.0, walltime_norm: 2.1666666666666665 } +in.spce: { folder: examples/rdf-adf, status: "completed", failed_checks: { abs_diff_failed: 6, rel_diff_failed: 6 }, walltime: 88.0, walltime_norm: 14.666666666666666 } +in.elastic: { folder: examples/ELASTIC_T/BORN_MATRIX/Silicon, status: "completed, error parsing log.lammps into YAML", walltime: 62.0, walltime_norm: 10.333333333333334 } +in.ljcov: { folder: examples/ELASTIC_T/BORN_MATRIX/Argon/Analytical, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.ljcov: { folder: examples/ELASTIC_T/BORN_MATRIX/Argon/Numdiff, status: "failed, no Total wall time in the output, timeout (180s expired)", walltime: -1 } +in.elastic: { folder: examples/ELASTIC_T/DEFORMATION/Silicon, status: "completed, numerical checks skipped due to missing the reference log file", walltime: 6.0, walltime_norm: 1.0 } diff --git a/tools/regression-tests/run_tests.py b/tools/regression-tests/run_tests.py old mode 100644 new mode 100755 index b2144478ec..63fa8c59c1 --- a/tools/regression-tests/run_tests.py +++ b/tools/regression-tests/run_tests.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 ''' -UPDATE: August 13, 2024: +UPDATE: September 4, 2024: Launching the LAMMPS binary under testing using a configuration defined in a yaml file (e.g. config.yaml). Comparing the output thermo with that in the existing log file (with the same nprocs) + data in the log files are extracted and converted into yaml data structure @@ -9,55 +9,81 @@ UPDATE: August 13, 2024: With the current features, users can: + specify which LAMMPS binary version to test (e.g., the version from a commit, or those from `lammps-testing`) + specify the examples subfolders (thus the reference log files) seperately (e.g. from other LAMMPS versions or commits) + + specify the list of examples input scripts to test + specify tolerances for individual quantities for any input script to override the global values - + launch tests with `mpirun` with all supported command line features (multiple procs, multiple paritions, and suffices) + + launch tests with `mpirun` with all supported command line features (multiple procs, multiple paritions, and suffixes) + skip certain input files (whose names match specified patterns) if not interested, or packaged not installed, or no reference log file exists - + simplify the main LAMMPS builds, as long as a LAMMPS binary is available - + keep track of the testing progress to resume the testing from the last checkpoint (skipping completed runs) - + distribute the input list across multiple processes via multiprocessing, or - split the list of input scripts into separate runs (there are 800+ input script under the top-level examples) + + set a timeout for every input script run if they may take too long + + skip numerical checks if the goal is just to check if the runs do not fail + +Some benefits include: + + + separating regression testing from building LAMMPS + + performing quick and full regression tests + + keeping track of the testing progress to resume the testing from the last checkpoint (skipping completed runs) + + distributing the input list across multiple processes by + splitting the list of input scripts into separate runs (there are ~800 input scripts under the top-level examples) + + generating new reference log files if desirable + +Input arguments: + + the path to a LAMMPS binary (can be relative to the working directory) + + a test configuration file (see tools/regression-tests/config.yaml for an example) + + a text file that lists of folders where the input scripts reside and how many of them line by line, or + a text file that list of input scripts, or + the path to the top-level examples + +Output: + + failure.yaml : list of the failed runs and reasons + + progress.yaml: full testing results of the tested input scripts with the status (completed, failed or skipped) + with error messages (for failed runs), and walltime (in seconds) + + output.xml : testing results in the JUnit XML format + + run.log : screen output and error of individual runs Limitations: - input scripts use thermo style multi (e.g., examples/peptide) do not work with the expected thermo output format - input scripts that require partition runs (e.g. examples/neb) need a separate config file, e.g. args: "--partition 3x1" - testing accelerator packages (GPU, INTEL, KOKKOS, OPENMP) need separate config files, "args: -sf omp -pk omp 4" -TODO: - + be able to be invoked from run_tests in the lammps-testing infrastruture - The following Python packages need to be installed into an activated environment: - + python3 -m venv testing-env source testing-env/bin/activate pip install numpy pyyaml junit_xml -Example usage: +Example usage (aka, tests for this script): 1) Simple use (using the provided tools/regression-tests/config.yaml and the examples/ folder at the top level) - python3 run_tests.py --lmp-bin=/path/to/lmp_binary + python3 run_tests.py --lmp-bin=build/lmp --config-file=tools/regression-tests/config.yaml 2) Use a custom testing configuration python3 run_tests.py --lmp-bin=/path/to/lmp_binary --config-file=/path/to/config/file/config.yaml 3) Specify a list of example folders python3 run_tests.py --lmp-bin=/path/to/lmp_binary --config-file=/path/to/config/file/config.yaml \ - --example-folders="/path/to/examples/folder1;/path/to/examples/folder2" + --example-folders="/path/to/examples/melt;/path/to/examples/rigid" - The example folders can also be loaded from a text file list_subfolders1.txt: + The example subfolders can also be loaded from a text file list_subfolders1.txt: python3 run_tests.py --lmp-bin=/path/to/lmp_binary --config-file=/path/to/config/file/config.yaml \ - --list-input=list_subfolders1.txt --output-file=output1.txt --progress-file=progress1.yaml \ + --list-subfolders=list_subfolders1.txt --output-file=output1.txt --progress-file=progress1.yaml \ --log-file=run1.log - - 4) Test a LAMMPS binary with the whole top-level /examples folder in a LAMMPS source tree - python3 run_tests.py --lmp-bin=/path/to/lmp_binary --examples-top-level=/path/to/lammps/examples - 5) Analyze the LAMMPS binary annd whole top-level /examples folder in a LAMMPS source tree + 4) Specify a list of example input scripts (e.g. obtained from running tools/regression-tests/get-quick-list.py) + python3 run_tests.py --lmp-bin=/path/to/lmp_binary --config-file=/path/to/config/file/config.yaml \ + --list-input=input_list.txt + + 5) Test a LAMMPS binary with the whole top-level /examples folder in a LAMMPS source tree + python3 run_tests.py --lmp-bin=/path/to/lmp_binary --examples-top-level=/path/to/lammps/examples + --config-file=tools/regression-tests/config_serial.yaml + + 6) Analyze the LAMMPS binary and whole top-level /examples folder in a LAMMPS source tree and generate separate input lists for 8 workers: python3 run_tests.py --lmp-bin=/path/to/lmp_binary --examples-top-level=/path/to/lammps/examples \ --analyze --num-workers=8 - This is used for splitting the subfolders into separate input lists and launching different instances - of run_tests.py simultaneously. + The output of this run is 8 files folder-list-[0-7].txt that lists the subfolders + and 8 files input-list-[0-7].txt that lists the input scripts under the top-level example folders. + With these lists, one can launch multiple instances of run_tests.py simultaneously + each with a list of example subfolders (Case 3), or with a list of input scripts (Case 4). ''' from argparse import ArgumentParser @@ -65,8 +91,10 @@ import datetime import fnmatch import logging import os +import random import re import subprocess +import sys #from multiprocessing import Pool # need "pip install numpy pyyaml" @@ -81,6 +109,13 @@ try: except ImportError: from yaml import SafeLoader as Loader +# infer top level LAMMPS dir from filename +LAMMPS_DIR = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..')) + +# import git interface module +sys.path.append(os.path.realpath(os.path.join(LAMMPS_DIR, 'tools', 'regression-tests'))) +import get_quick_list + ''' data structure to store the test result ''' @@ -95,20 +130,21 @@ class TestResult: ''' Iterate over a list of input folders and scripts using the given lmp_binary and the testing configuration - lmp_binary : full path to the LAMMPS binary + lmp_binary : full path to the LAMMPS binary input_folder : the absolute path to the input files input_list : list of the input scripts under the input_folder config : the dict that contains the test configuration - - output_buf: placeholder for storing the output of a given worker + walltime_ref : reference walltime return results : a list of TestResult objects stat : a dictionary that lists the number of passed, skipped, failed tests progress_file: yaml file that stores the tested input script and status + failure_file : file that reports the failed runs (a subset of progress_file) last_progress: the dictionary that shows the status of the last tests + output_buf: placeholder for storing the output of a given worker ''' -def iterate(lmp_binary, input_folder, input_list, config, results, progress_file, last_progress=None, output_buf=None): +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_completed = 0 @@ -122,10 +158,15 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file using_markers = False EPSILON = np.float64(config['epsilon']) nugget = float(config['nugget']) + genref = config['genref'] + compiler = config['compiler'] use_valgrind = False if 'valgrind' in config['mpiexec']: use_valgrind = True + # record all the failed runs + failure = open(failure_file, "a") + # iterate over the input scripts for input in input_list: @@ -135,13 +176,18 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file else: progress = open(progress_file, "w") + # walltime = -2: skipped tests + # -1: failed tests + # >= 0: walltime in seconds (e.g. in.melt walltime = 0.2 seconds) + walltime = -2 + # skip the input file if listed in the config file or matched with a pattern if 'skip' in config: if input in config['skip']: 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\" }}\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 @@ -150,6 +196,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file matched_pattern = False for skipped_files in config['skip']: if '*' in skipped_files: + # check input script name e.g. in.*_imd* if fnmatch.fnmatch(input, skipped_files): matched_pattern = True break @@ -158,7 +205,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\" }}\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 @@ -176,7 +223,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file num_skipped = num_skipped + 1 test_id = test_id + 1 continue - + if 'packaged not installed' in status: msg = " + " + input + f" ({test_id+1}/{num_tests}): due to package not installed (see {progress_file})" logger.info(msg) @@ -186,14 +233,14 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file num_skipped = num_skipped + 1 test_id = test_id + 1 continue - + # if annotating input scripts with REG markers is True if using_markers == True: input_test = 'test.' + input if os.path.isfile(input) == True: if has_markers(input): process_markers(input, input_test) - + else: print(f"WARNING: {input} does not have REG markers") input_markers = input + '.markers' @@ -204,7 +251,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file os.system(cmd_str) generate_markers(input, input_markers) process_markers(input_markers, input_test) - + else: # else the same file name for testing input_test = input @@ -212,7 +259,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file str_t = " + " + input_test + f" ({test_id+1}/{num_tests})" logger.info(str_t) print(str_t) - + # check if a reference log file exists in the current folder: log.DDMMMYY.basename.g++.[nprocs] # assuming that input file names start with "in." (except in.disp, in.disp2 and in.dos in phonon/) basename = input_test[3:] @@ -234,7 +281,8 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file if fnmatch.fnmatch(file, pattern): p = file.rsplit('.', 1) if p[1].isnumeric(): - if use_valgrind == True: + # if using valgrind or running in serial, then use the log file with 1 proc + if use_valgrind == True or config['mpiexec'] == "": if int(p[1]) == 1: max_np = int(p[1]) ref_logfile_exist = True @@ -249,14 +297,15 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file # if there is no ref log file and not running with valgrind if ref_logfile_exist == False and use_valgrind == False: max_np = 4 - - # if the maximum number of procs is different from the value in the configuration file - # then override the setting for this input script + 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']): config['nprocs'] = str(max_np) - # store the value of nprocs + # store the value of nprocs nprocs = int(config['nprocs']) # if valgrind is used for mem check, the run command will be @@ -267,16 +316,19 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file config['mpiexec_numproc_flag'] = "" nprocs = 1 + # default walltime value of failed tests + walltime = -1 + result = TestResult(name=input, output="", time="", status="passed") # run the LAMMPS binary with the input script - cmd_str, output, error, returncode = execute(lmp_binary, config, input_test) + cmd_str, output, error, returncode, logfilename = execute(lmp_binary, config, input_test) # restore the nprocs value in the configuration config['nprocs'] = saved_nprocs # check if the output contains ERROR - # there might not be a log.lammps generated at this point, or only log.lammps contains only the date line + # there might not be a log file generated at this point, or only the log file contains only the date line if "ERROR" in output: error_line = "" for line in output.split('\n'): @@ -284,13 +336,13 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file error_line = line break logger.info(f" The run terminated with {input_test} gives the following output:") - logger.info(f" {error_line}") + logger.info(f" {error_line}") if "Unrecognized" in output: - result.status = f"error, unrecognized command, package not installed, {error_line}" + result.status = f"failed, unrecognized command, package not installed, {error_line}" elif "Unknown" in output: - result.status = f"error, unknown command, package not installed, {error_line}" + result.status = f"failed, unknown command, package not installed, {error_line}" else: - result.status = f"error, {error_line}." + result.status = f"failed, {error_line}." logger.info(f" Output:") logger.info(f" {output}") @@ -298,57 +350,119 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file num_error = num_error + 1 results.append(result) - progress.write(f"{input}: {{ folder: {input_folder}, status: \"{result.status}\" }}\n") - progress.close() + print(f"{result.status}") + msg = f"{input}: {{ folder: {input_folder}, status: \"{result.status}\", walltime: {walltime} }}\n" + progress.write(msg) + progress.close() + failure.write(msg) + + test_id = test_id + 1 + continue + + # check if a log file log.{basename}.{nprocs} exists in the current folder + if os.path.isfile(logfilename) == False: + msg = f" failed, no log.{basename}.{nprocs} generated with {input_test} with return code {returncode}.\n" + print(msg) + logger.info(msg) + logger.info(f" Output:") + 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" + progress.write(msg) + progress.close() + failure.write(msg) + + num_error = num_error + 1 + test_id = test_id + 1 + continue + else: + # generate a new log file whose name has the format of log.{date}.{basename}.{compiler}.{nprocs} + if genref == True: + dmy = datetime.datetime.now() + date = dmy.strftime("%d%b%y") + # assume g++ for now, but is be available from running "lmp_binary -h" + compiler = "g++" + cmd_str = f"cp log.{basename}.{nprocs} log.{date}.{basename}.{compiler}.{nprocs}" + p = subprocess.run(cmd_str, shell=True, text=True, capture_output=True) + + # if skip numerical checks, then skip the rest + if skip_numerical_check == True: + msg = "completed, skipping numerical checks" + if use_valgrind == True: + if "All heap blocks were freed" in error: + msg += ", no memory leak" + else: + msg += ", memory leaks detected" + num_memleak = num_memleak + 1 + result.status = msg + results.append(result) + + msg = f"{input}: {{ folder: {input_folder}, status: \"{msg}\", walltime: {walltime} }}\n" + progress.write(msg) + progress.close() + failure.write(msg) + + # count the number of completed runs + num_completed = num_completed + 1 test_id = test_id + 1 continue # if there is no ERROR in the output, but there is no Total wall time printed out if "Total wall time" not in output: - logger.info(f" ERROR: no Total wall time in the output.\n") + msg = f" failed, no Total wall time in the output.\n" + print(msg) + logger.info(msg) logger.info(f"\n{input_test}:") logger.info(f"\n Output:\n{output}") logger.info(f"\n Error:\n{error}") - progress.write(f"{input}: {{ folder: {input_folder}, status: \"error, no Total wall time in the output.\" }}\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) + num_error = num_error + 1 test_id = test_id + 1 continue + # NOTE: Total wall time could be 00:00:00 whereas Loop time is non-zero seconds + walltime_norm = 1.0 + for line in output.split('\n'): + if "Total wall time" in line: + walltime_str = line.split('time:')[1] + hms = walltime_str.split(':') + hours = float(hms[0]) + minutes = float(hms[1]) + seconds = float(hms[2]) + walltime = hours * 3600.0 + minutes * 60.0 + seconds + walltime_norm = float(walltime) / float(walltime_ref) + break + # if there is no Step or no Loop printed out if "Step" not in output or "Loop" not in output: - logger.info(f" ERROR: no Step nor Loop in the output.\n") + msg = f" completed, but no Step nor Loop in the output.\n" + print(msg) + logger.info(msg) logger.info(f"\n{input_test}:") logger.info(f"\n Output:\n{output}") logger.info(f"\n Error:\n{error}") - progress.write(f"{input}: {{ folder: {input_folder}, status: \"error, no Step nor Loop in the output.\" }}\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) + num_error = num_error + 1 test_id = test_id + 1 continue - # check if a log.lammps file exists in the current folder - if os.path.isfile("log.lammps") == False: - logger.info(f" ERROR: No log.lammps generated with {input_test} with return code {returncode}.\n") - logger.info(f" Output:") - logger.info(f" {output}") - logger.info(f" Error:\n{error}") - progress.write(f"{input}: {{ folder: {input_folder}, status: \"error, no log.lammps\" }}\n") - progress.close() - num_error = num_error + 1 - test_id = test_id + 1 - continue - else: - # save a copy of the log file for further inspection - cmd_str = f"cp log.lammps log.{basename}.{nprocs}" - p = subprocess.run(cmd_str, shell=True, text=True, capture_output=True) - - # parse thermo output in log.lammps from the run - thermo = extract_data_to_yaml("log.lammps") + # parse thermo output in the log file from the run + thermo = extract_data_to_yaml(logfilename) num_runs = len(thermo) - # the run completed normally but log.lammps may not be friendly for parsing into YAML format + # the run completed normally but the log file may not be friendly for parsing into YAML format if num_runs == 0: logger.info(f" The run terminated with {input_test} gives the following output:") logger.info(f" {output}") @@ -361,16 +475,19 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file msg += ", memory leaks detected" num_memleak = num_memleak + 1 - result.status = msg + ", error parsing log.lammps into YAML" + result.status = msg + f", error parsing {logfilename} into YAML" results.append(result) - progress.write(f"{input}: {{ folder: {input_folder}, status: \"{result.status}\" }}\n") + progress.write(f"{input}: {{ folder: {input_folder}, status: \"{result.status}\", walltime: {walltime}, walltime_norm: {walltime_norm} }}\n") progress.close() + if verbose == True: + print(result.status) + num_completed = num_completed + 1 test_id = test_id + 1 continue - # At this point, the run completed without trivial errors, proceed with numerical checks + # At this point, the run completed without trivial errors, proceed with numerical checks for thermo output # check if there is a reference log file for this input if ref_logfile_exist: # parse the thermo output in reference log file @@ -378,17 +495,18 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file if thermo_ref: num_runs_ref = len(thermo_ref) else: - # dictionary is empty - logger.info(f" ERROR: Error parsing the reference log file {thermo_ref_file}.") + # thhe 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\" }}\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 test_id = test_id + 1 continue else: - msg = f" Cannot find the reference log file for {input_test} with the expected format log.[date].{basename}.*.[nprocs]" + msg = f" failed, cannot find the reference log file for {input_test} with the expected format log.[date].{basename}.*.[nprocs]" logger.info(msg) print(msg) # attempt to read in the thermo yaml output from the working directory (the following section will be deprecated) @@ -398,26 +516,30 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file thermo_ref = extract_thermo(thermo_ref_file) num_runs_ref = len(thermo_ref) else: - # mostly will come to here if the reference log file does not exist + # most likely to reach here if the reference log file does not exist logger.info(f" {thermo_ref_file} also does not exist in the working directory.") result.status = "skipped due to missing the reference log file" results.append(result) - progress.write(f"{input}: {{ folder: {input_folder}, status: \"completed, numerical checks skipped, missing the reference log file\" }}\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 test_id = test_id + 1 continue - logger.info(f" Comparing thermo output from log.lammps against the reference log file {thermo_ref_file}") + logger.info(f" Comparing thermo output from {logfilename} against the reference log file {thermo_ref_file}") # check if the number of runs matches with that in the reference log file # maybe due to some changes to the input where the ref log file is not updated yet if num_runs != num_runs_ref: - logger.info(f" ERROR: Number of runs in log.lammps ({num_runs}) is different from that in the reference log ({num_runs_ref})." + logger.info(f" ERROR: Number of runs in {logfilename} ({num_runs}) is different from that in the reference log ({num_runs_ref})." " Check README in the folder, possibly due to using mpirun with partitions or parsing the wrong reference log file.") - result.status = "error, incomplete runs" + result.status = "failed, incomplete runs" results.append(result) - progress.write(f"{input}: {{ folder: {input_folder}, status: \"{result.status}\" }}\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 test_id = test_id + 1 @@ -429,11 +551,11 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file num_fields = len(thermo[0]['keywords']) num_fields_ref = len(thermo_ref[0]['keywords']) if num_fields != num_fields_ref: - logger.info(f" ERROR: Number of thermo colums in log.lammps ({num_fields}) is different from that in the reference log ({num_fields_ref}) in the first run.") + logger.info(f" failed, number of thermo colums in {logfilename} ({num_fields}) is different from that in the reference log ({num_fields_ref}) in the first run.") logger.info(f" Check both log files for more details.") - result.status = "error, mismatched columns in the log files" + result.status = "failed, mismatched columns in the log files" results.append(result) - progress.write(f"{input}: {{ folder: {input_folder}, status: \"{result.status}\" }}\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 test_id = test_id + 1 @@ -442,9 +564,9 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file # comparing output vs reference values width = 20 if verbose == True: - print("Quantities".ljust(width) + "Output".center(width) + "Reference".center(width) + + print(" Quantities".ljust(width) + "Output".center(width) + "Reference".center(width) + "Abs Diff Check".center(width) + "Rel Diff Check".center(width)) - + # check if overrides for this input scipt is specified overrides = {} if 'overrides' in config: @@ -464,7 +586,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file num_fields = len(thermo[irun]['keywords']) num_fields_ref = len(thermo_ref[irun]['keywords']) if num_fields != num_fields_ref: - logger.info(f" ERROR: Number of thermo columns in log.lammps ({num_fields})") + logger.info(f" failed: Number of thermo columns in {logfilename} ({num_fields})") logger.info(f" is different from that in the reference log ({num_fields_ref}) in run {irun}.") mismatched_columns = True continue @@ -490,7 +612,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file abs_diff_check = "PASSED" rel_diff_check = "PASSED" - + if quantity in config['tolerance'] or quantity in overrides: if quantity in config['tolerance']: @@ -516,42 +638,48 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file else: # N/A means that tolerances are not defined in the config file abs_diff_check = "N/A" - rel_diff_check = "N/A" + rel_diff_check = "N/A" if verbose == True and abs_diff_check != "N/A" and rel_diff_check != "N/A": - 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)}") + 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 log files after the first run. Check both log files for more details." print(msg) logger.info(msg) - result.status = "failed" + result.status = "thermo checks failed due to mismatched log files after the first run" + result.status = "" if num_abs_failed > 0: - msg = f" {num_abs_failed} abs diff thermo checks failed." + msg = f" {num_abs_failed} abs diff checks failed." print(msg) logger.info(msg) - result.status = "failed" + #result.status = f"abs_diff_failed: {num_abs_failed}, " if verbose == True: - for i in failed_abs_output: - print(f"- {i}") - if num_rel_failed > 0: - msg = f" {num_rel_failed} rel diff thermo checks failed." - print(msg) - logger.info(msg) - result.status = "failed" - if verbose == True: - for i in failed_rel_output: - print(f"- {i}") - if num_abs_failed == 0 and num_rel_failed == 0: - msg = f" all {num_checks} thermo checks passed." - print(msg) - logger.info(msg) - result.status = "passed" - num_passed = num_passed + 1 + for out in failed_abs_output: + print(f" - {out}") + if num_rel_failed > 0: + msg = f" {num_rel_failed} rel diff checks failed." + print(msg) + logger.info(msg) + #result.status += f"rel_diff_failed: {num_rel_failed}" + if verbose == True: + for out in failed_rel_output: + print(f" - {out}") + + if num_abs_failed == 0 and num_rel_failed == 0: + msg = f" all {num_checks} checks passed." + print(msg) + logger.info(msg) + #result.status = f"all {num_checks} checks passed." + num_passed = num_passed + 1 + else: + num_error = num_error + 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") @@ -563,13 +691,20 @@ 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}\" }}\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") + # count the number of completed runs num_completed = num_completed + 1 test_id = test_id + 1 + # close the failure file + failure.close() + stat = { 'num_completed': num_completed, 'num_passed': num_passed, 'num_skipped': num_skipped, @@ -590,7 +725,7 @@ def iterate(lmp_binary, input_folder, input_list, config, results, progress_file of output and the inner list the values of the columns matching the header keywords for that step. ''' def extract_thermo(yamlFileName): - docs = "" + docs = "" with open(yamlFileName) as f: for line in f: m = re.search(r"^(keywords:.*$|data:$|---$|\.\.\.$| - \[.*\]$)", line) @@ -627,7 +762,7 @@ def extract_data_to_yaml(inputFileName): if "Loop" in line: reading = False docs += "...\n" - + if reading == True and "Step" not in line: if "WARNING" in line: continue @@ -662,7 +797,7 @@ def extract_data_to_yaml(inputFileName): return thermo ''' - return a tuple of the list of installed packages, OS, GitInfo and compile_flags + return a dictionary of the list of installed packages, OS, GitInfo, compiler and compile_flags ''' def get_lammps_build_configuration(lmp_binary): cmd_str = lmp_binary + " -h" @@ -672,6 +807,8 @@ def get_lammps_build_configuration(lmp_binary): reading = False operating_system = "" GitInfo = "" + compiler = "g++" + compiler_full = "" row = 0 for line in output: if line != "": @@ -687,7 +824,12 @@ def get_lammps_build_configuration(lmp_binary): operating_system = line if "Git info" in line: GitInfo = line - + if "Compiler" in line: + compiler_full = line + if "GNU" in line: + compiler = "g++" + if "Intel" in line: + compiler = "icc" row += 1 packages = packages.strip() @@ -698,24 +840,124 @@ def get_lammps_build_configuration(lmp_binary): if line != "": if "-DLAMMPS" in line: compile_flags += " " + line.strip() - + row += 1 - return packages.split(" "), operating_system, GitInfo, compile_flags + installed_packages = packages.split(" ") + build_config = { + 'installed_packages': installed_packages, + 'operating_system': operating_system, + 'git_info': GitInfo, + 'compiler': compiler, + 'compiler_full': compiler_full, + 'compile_flags': compile_flags, + } + + return build_config ''' launch LAMMPS using the configuration defined in the dictionary config with an input file - TODO: - - generate new reference values if needed - - wrap subprocess with try/catch to handle exceptions + return + - cmd_str: the complete command used to launch LAMMPS with the input + - stdout: stdout of the process + - stderr: stderr of the process + - errorcode: error code returned by the process + - logfilename: the log file name for the given input + to avoid duplicate writes to log.lammps if multiple workers execute in the same folder ''' -def execute(lmp_binary, config, input_file_name, generate_ref_yaml=False): - cmd_str = config['mpiexec'] + " " + config['mpiexec_numproc_flag'] + " " + config['nprocs'] + " " - cmd_str += lmp_binary + " -in " + input_file_name + " " + config['args'] - logger.info(f" Executing: {cmd_str}") - p = subprocess.run(cmd_str, shell=True, text=True, capture_output=True) +def execute(lmp_binary, config, input_file_name, generate_ref=False): + cmd_str = "" + # check if mpiexec/mpirun is used + if config['mpiexec']: + cmd_str += config['mpiexec'] + " " + config['mpiexec_numproc_flag'] + " " + config['nprocs'] + " " - return cmd_str, p.stdout, p.stderr, p.returncode + # write to a log file with format log.{basename}.{nprocs} + basename = input_file_name[3:] + logfilename = f"log.{basename}.{config['nprocs']}" + + cmd_str += lmp_binary + " -in " + input_file_name + " " + config['args'] + " -log " + logfilename + + logger.info(f" Executing: {cmd_str}") + # set a timeout (in seconds) for each run + timeout = 60 + if 'timeout' in config: + if config['timeout'] != "": + timeout = int(config['timeout']) + + 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 + + except subprocess.TimeoutExpired: + msg = f" Timeout for: {cmd_str} ({timeout}s expired)" + logger.info(msg) + print(msg) + + error_str = f"timeout ({timeout}s expired)" + return cmd_str, "", error_str, -1, logfilename + +''' + get the reference walltime by running the lmp_binary with config with an input script in the bench/ folder + in.lj is suitable as it doesn't need any potential file, nor any extra packages +''' +def get_reference_walltime(lmp_binary, config): + cmd_str = "" + # check if mpiexec/mpirun is used + if config['mpiexec']: + cmd_str += config['mpiexec'] + " " + config['mpiexec_numproc_flag'] + " " + config['nprocs'] + " " + + # guess the build folder path + lmp_build_folder = lmp_binary.rsplit('/', 1)[0] + + # guess the bench folder + lmp_bench_folder = lmp_build_folder + "/../bench/" + + # run with replicate for a copple of seconds long run + cmd_str += lmp_binary + " -in " + lmp_bench_folder + "in.lj -v x 2 -v y 2 -v z 1 " + config['args'] + + logger.info(f" Executing for reference walltime: {cmd_str}") + + # walltime = -1 indicates some timeout (issues) + walltime = -1 + + # set a timeout for this reference run + timeout = 60 + output = "" + try: + p = subprocess.run(cmd_str, shell=True, text=True, capture_output=True, timeout=timeout) + output = p.stdout + + except subprocess.TimeoutExpired: + msg = f" Timeout for: {cmd_str} ({timeout}s expired)" + logger.info(msg) + print(msg) + + for line in output.split('\n'): + if "Total wall time" in line: + walltime_str = line.split('time:')[1] + hms = walltime_str.split(':') + hours = float(hms[0]) + minutes = float(hms[1]) + seconds = float(hms[2]) + walltime = hours * 3600.0 + minutes * 60.0 + seconds + + logger.info(f" Reference walltime, sec = {walltime}") + + return walltime + +''' + infer the tools/regression-tests folder from the absolute path to lmp_binary + return the default config file path tools/regression-tests/config.yaml +''' +def get_default_config(lmp_binary): + # guess the build folder path + lmp_build_folder = lmp_binary.rsplit('/', 1)[0] + + # guess the tools/regression-tests folder + regression_tests_folder = lmp_build_folder + "/../tools/regression-tests/" + + defaultConfigFile = regression_tests_folder + "config.yaml" + return defaultConfigFile ''' split a list into a list of N sublists @@ -732,7 +974,7 @@ def execute(lmp_binary, config, input_file_name, generate_ref_yaml=False): for i in range(num_workers): args.append((input1, input2, output_buf)) - with Pool(num_workers) as pool: + with Pool(num_workers) as pool: results = pool.starmap(func, args) ''' def divide_into_N(original_list, N): @@ -759,7 +1001,7 @@ def process_markers(inputFileName, outputFileName): # replace #REG:ADD with empty string (i.e. adding the text at the end of the line) data = data.replace("#REG:ADD", "") - # replace the line contaning #REG:SUB with a line with the text that follows this marker + # replace the line contaning #REG:SUB with a line with the text that follows this marker data = data.splitlines() separator="#REG:SUB" out = [] @@ -823,14 +1065,21 @@ if __name__ == "__main__": lmp_binary = "" configFileName = "config.yaml" example_subfolders = [] + example_inputs = [] example_toplevel = "" genref = False verbose = False output_file = "output.xml" progress_file = "progress.yaml" + failure_file = "failure.yaml" log_file = "run.log" list_input = "" + list_subfolders = "" analyze = False + quick = False + quick_branch = "origin/develop" + quick_max = 50 + quick_reference = os.path.join(LAMMPS_DIR, 'tools', 'regression-tests', 'reference.yaml') # distribute the total number of input scripts over the workers num_workers = 1 @@ -838,93 +1087,178 @@ if __name__ == "__main__": # parse the arguments parser = ArgumentParser() parser.add_argument("--lmp-bin", dest="lmp_binary", default="", help="LAMMPS binary") - parser.add_argument("--config-file", dest="config_file", default=configFileName, - help="Configuration YAML file") + parser.add_argument("--config-file", dest="config_file", default="", help="Configuration YAML file") parser.add_argument("--examples-top-level", dest="example_toplevel", default="", help="Examples top-level") parser.add_argument("--example-folders", dest="example_folders", default="", help="Example subfolders") - parser.add_argument("--list-input", dest="list_input", default="", help="File that lists the subfolders") + parser.add_argument("--list-input", dest="list_input", default="", help="File that lists the input scripts") + parser.add_argument("--list-subfolders", dest="list_subfolders", default="", help="File that lists the subfolders") parser.add_argument("--num-workers", dest="num_workers", default=1, help="Number of workers") - parser.add_argument("--gen-ref",dest="genref", action='store_true', default=False, - help="Generating reference data") - parser.add_argument("--verbose",dest="verbose", action='store_true', default=False, - help="Verbose output") - parser.add_argument("--resume",dest="resume", action='store_true', default=False, - help="Resume the test run") parser.add_argument("--output-file",dest="output", default=output_file, help="Output file") parser.add_argument("--log-file",dest="logfile", default=log_file, help="Log file") parser.add_argument("--progress-file",dest="progress_file", default=progress_file, help="Progress file") - parser.add_argument("--analyze",dest="analyze", action='store_true', default=False, + parser.add_argument("--failure-file",dest="failure_file", default=failure_file, help="Failure file") + analyze = parser.add_mutually_exclusive_group() + analyze.add_argument("--analyze",dest="analyze", action='store_true', default=False, help="Analyze the testing folders and report statistics, not running the tests") + analyze.add_argument("--quick", dest="quick", action='store_true', default=False, + 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, + 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") + parser.add_argument("--skip-numerical-check",dest="skip_numerical_check", action='store_true', default=False, + help="Skip numerical checks") + parser.add_argument("--gen-ref",dest="genref", action='store_true', default=False, + help="Generating reference log files") + parser.add_argument("--verbose",dest="verbose", action='store_true', default=False, + help="Verbose screen output") + parser.add_argument("--resume",dest="resume", action='store_true', default=False, + help="Resume the test run from the list of inputs given the progress in progress.yaml") args = parser.parse_args() lmp_binary = os.path.abspath(args.lmp_binary) - configFileName = args.config_file + if len(args.config_file) > 0: + configFileName = args.config_file + else: + configFileName = get_default_config(lmp_binary) + output_file = args.output if int(args.num_workers) > 0: num_workers = int(args.num_workers) list_input = args.list_input + list_subfolders = args.list_subfolders # example_toplevel is where all the examples subfolders reside if args.example_toplevel != "": example_toplevel = args.example_toplevel if args.example_folders != "": example_subfolders = args.example_folders.split(';') - + genref = args.genref verbose = args.verbose log_file = args.logfile analyze = args.analyze + quick = args.quick + quick_branch = args.quick_branch + quick_max = int(args.quick_max) + quick_reference = args.quick_reference + skip_numerical_check = args.skip_numerical_check resume = args.resume progress_file = args.progress_file + failure_file = args.failure_file # logging logger = logging.getLogger(__name__) logging.basicConfig(filename=log_file, level=logging.INFO, filemode="w") - # read in the configuration of the tests - with open(configFileName, 'r') as f: - config = yaml.load(f, Loader=Loader) - absolute_path = os.path.abspath(configFileName) - print(f"\nRegression tests with the settings defined in the configuration file:\n {absolute_path}") - f.close() - - # check if lmp_binary is specified in the config yaml - if lmp_binary == "": - if config['lmp_binary'] == "": - print("Needs a valid LAMMPS binary") - quit() - else: - lmp_binary = os.path.abspath(config['lmp_binary']) - - # print out the binary info - packages, operating_system, GitInfo, compile_flags = get_lammps_build_configuration(lmp_binary) - print("\nLAMMPS build info:") - print(f" - {operating_system}") - print(f" - {GitInfo}") - print(f" - Active compile flags: {compile_flags}") - print(f" - List of {len(packages)} installed packages:") - all_pkgs = "" - for p in packages: - all_pkgs += p + " " - print(all_pkgs) - if len(example_subfolders) > 0: print("\nExample folders to test:") print(*example_subfolders, sep='\n') if example_toplevel != "": print("\nTop-level example folder:") print(f" {example_toplevel}") + if list_input != "": + print("\nInput scripts to test as listed in the file:") + print(f" {list_input}") # Using in place input scripts inplace_input = True test_cases = [] + # generate list of input scripts with commands that have been changed + if quick: + headers = get_quick_list.changed_files_from_git(quick_branch) + styles = get_quick_list.get_command_from_header(headers, LAMMPS_DIR) + regex = get_quick_list.make_regex(styles) + if regex: + if not example_toplevel: example_toplevel = os.path.join(LAMMPS_DIR, 'examples') + input_list = get_quick_list.get_examples_using_styles(regex, example_toplevel) + msg = f"\nThere are {len(input_list)} input scripts with changed styles relative to branch {quick_branch}." + msg += "\nChanged styles: " + str(styles) + + # read in refrence data from a previous test run + with open(quick_reference, 'r') as f: + reference = yaml.load(f, Loader=Loader) + f.close() + + # trim previously failing run and runs that would take too long + new_list = [] + keys = reference.keys() + msg += "\nTrimming inputs using reference data from " + str(len(keys)) + " previous runs: " + for infile in input_list: + input = os.path.split(infile)[1] + if input in keys: + if (reference[input]['walltime'] < 0.0): + # print("Skipping ", input, " for previous failure") + pass + elif (reference[input]['walltime'] > 29.0): + # print("Skipping ", input, " for wall time limit") + pass + else: + new_list.append(infile) + else: + new_list.append(infile) + input_list = new_list + msg += "trimmed list has " + str(len(input_list)) + " entries" + + if len(input_list) > quick_max: + input_list = random.sample(input_list, quick_max) + msg += "\nTesting " + str(quick_max) + " randomly selected inputs" + + print(msg) + logger.info(msg) + + # divide the list of input scripts into num_workers chunks + sublists = divide_into_N(input_list, num_workers) + + # write each chunk to a file + idx = 0 + for list_input in sublists: + filename = f"input-list-{idx}.txt" + with open(filename, "w") as f: + for inp in list_input: + f.write(inp + '\n') + f.close() + idx = idx + 1 + else: + msg = f"\nThere are no input scripts with changed styles relative to branch {quick_branch}." + print(msg) + logger.info(msg) + for idx in range(0, num_workers): + try: + os.remove(f"folder-list-{idx}.txt") + except: + pass + try: + os.remove(f"input-list-{idx}.txt") + except: + pass + filename = f"run-{idx}.log" + with open(filename, "w") as f: + f.write('\n') + f.close() + filename = f"progress-{idx}.yaml" + with open(filename, "w") as f: + f.write('\n') + f.close() + filename = f"output-{idx}.xml" + with open(filename, "w") as f: + f.write('\n') + f.close() + filename = f"failure-{idx}.yaml" + with open(filename, "w") as f: + f.write('\n') + f.close() + quit() + # if the example folders are not specified from the command-line argument --example-folders # then use the path from --example-top-folder, or from the input-list read from a text file - if len(example_subfolders) == 0: + elif len(example_subfolders) == 0: - # need top level specified + # if the top level is specified if len(example_toplevel) != 0: # getting the list of all the input files because there are subfolders (e.g. PACKAGES) under the top level cmd_str = f"find {example_toplevel} -name \"in.*\" " @@ -951,7 +1285,7 @@ if __name__ == "__main__": # write each chunk to a file idx = 0 for list_input in sublists: - filename = f"input-list-{idx}.txt" + filename = f"folder-list-{idx}.txt" with open(filename, "w") as f: for folder in list_input: # count the number of input scripts in each folder @@ -965,14 +1299,28 @@ if __name__ == "__main__": # working on all the folders for now example_subfolders = folder_list - # if a list of subfolders are provided from a text file (list_input from the command-line argument) - elif len(list_input) != 0: + # divide the list of input scripts into num_workers chunks + sublists = divide_into_N(input_list, num_workers) + + # write each chunk to a file + idx = 0 + for list_input in sublists: + filename = f"input-list-{idx}.txt" + with open(filename, "w") as f: + for inp in list_input: + f.write(inp + '\n') + f.close() + idx = idx + 1 + + # if a list of subfolders is provided from a text file (list_subfolders from the command-line argument) + elif len(list_subfolders) != 0: num_inputscripts = 0 - with open(list_input, "r") as f: + with open(list_subfolders, "r") as f: all_subfolders = f.read().splitlines() f.close() for line in all_subfolders: if len(line) > 0: + # skip subfolders if line[0] == '#': continue folder = line.split()[0] @@ -981,6 +1329,33 @@ if __name__ == "__main__": msg = f"\nThere are {len(example_subfolders)} folders with {num_inputscripts} input scripts in total listed in {list_input}." print(msg) logger.info(msg) + + # if a list of input scripts is provided from a text file (list_input from the command-line argument) + elif len(list_input) != 0: + num_inputscripts = 0 + folder_list = [] + with open(list_input, "r") as f: + all_inputs = f.read().splitlines() + f.close() + + for line in all_inputs: + if len(line) > 0: + # skip input scripts + if line[0] == '#': + continue + input = line.split()[0] + folder = input.rsplit('/', 1)[0] + # unique folders in the list + if folder not in folder_list: + folder_list.append(folder) + example_inputs.append(input) + num_inputscripts += 1 + + example_subfolders = folder_list + msg = f"\nThere are {num_inputscripts} input scripts listed in {list_input}." + print(msg) + logger.info(msg) + else: inplace_input = False @@ -988,6 +1363,45 @@ if __name__ == "__main__": if analyze == True: quit() + # read in the configuration of the tests + with open(configFileName, 'r') as f: + config = yaml.load(f, Loader=Loader) + absolute_path = os.path.abspath(configFileName) + print(f"\nRegression test configuration file:\n {absolute_path}") + f.close() + + # check if lmp_binary is specified in the config yaml + if lmp_binary == "": + if config['lmp_binary'] == "": + print("Needs a valid LAMMPS binary") + quit() + else: + lmp_binary = os.path.abspath(config['lmp_binary']) + + # print out the binary info + build_config = get_lammps_build_configuration(lmp_binary) + packages = build_config['installed_packages'] + operating_system = build_config['operating_system'] + GitInfo = build_config['git_info'] + compiler = build_config['compiler'] + compiler_full = build_config['compiler_full'] + compile_flags = build_config['compile_flags'] + + print("\nLAMMPS build info:") + print(f" - {operating_system}") + print(f" - {GitInfo}") + print(f" - {compiler_full}") + print(f" - Active compile flags: {compile_flags}") + print(f" - List of {len(packages)} installed packages:") + all_pkgs = "" + for p in packages: + all_pkgs += p + " " + print(all_pkgs) + + # augment config with additional keys + config['compiler'] = compiler + config['genref'] = genref + all_results = [] # save current working dir @@ -995,7 +1409,7 @@ if __name__ == "__main__": pwd = p.stdout.split('\n')[0] pwd = os.path.abspath(pwd) print("\nWorking directory: " + pwd) - + progress_file_abs = pwd + "/" + progress_file last_progress = {} if resume == False: @@ -1009,6 +1423,14 @@ if __name__ == "__main__": except Exception: print(f" Cannot open progress file {progress_file_abs} to resume, rerun all the tests") + # get a reference walltime + walltime_ref = get_reference_walltime(lmp_binary, config) + + # record all the failure cases (overwrite if the file exists) + failure_file_abs = pwd + "/" + failure_file + failure = open(failure_file_abs, "w") + failure.close() + # initialize all the counters total_tests = 0 completed_tests = 0 @@ -1028,7 +1450,7 @@ if __name__ == "__main__": for i in range(num_workers): args.append((input1, input2, output)) - with Pool(num_workers) as pool: + with Pool(num_workers) as pool: results = pool.starmap(func, args) ''' @@ -1042,15 +1464,27 @@ if __name__ == "__main__": cmd_str = "ls in.*" p = subprocess.run(cmd_str, shell=True, text=True, capture_output=True) - input_list = p.stdout.split('\n') - input_list.remove('') + all_input_list = p.stdout.split('\n') + all_input_list.remove('') - print(f"{len(input_list)} input script(s): {input_list}") + # if the list of example input scripts is provided + # if an input script is not in the list, then remove it from input_list + input_list = [] + if len(example_inputs) > 0: + for inp in all_input_list: + full_path = directory + "/" + inp + if full_path in example_inputs: + input_list.append(inp) + else: + input_list = all_input_list + + print(f"{len(input_list)} input script(s) to be tested: {input_list}") total_tests += len(input_list) # iterate through the input scripts results = [] - stat = iterate(lmp_binary, directory, input_list, config, results, progress_file_abs, last_progress) + stat = iterate(lmp_binary, directory, input_list, config, + results, progress_file_abs, failure_file_abs, walltime_ref, verbose, last_progress) completed_tests += stat['num_completed'] skipped_tests += stat['num_skipped'] @@ -1090,16 +1524,17 @@ if __name__ == "__main__": if passed_tests <= completed_tests: msg += f" - numerical tests passed: {passed_tests}\n" msg += "\nOutput:\n" + msg += f" - Failed inputs and reasons : {failure_file}\n" + msg += f" - Status of the tested inputs : {progress_file}\n" msg += f" - Running log with screen output: {log_file}\n" - msg += f" - Progress with the input list : {progress_file}\n" - msg += f" - Regression test results : {output_file}\n" + msg += f" - Testing result in JUnit XML : {output_file}\n" print(msg) # optional: need to check if junit_xml packaged is already installed in the env - # generate a JUnit XML file + # generate a JUnit XML file with open(output_file, 'w') as f: - test_cases = [] + test_cases = [] for result in all_results: #print(f"{result.name}: {result.status}") case = TestCase(name=result.name, classname=result.name)