diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..3ad2217 --- /dev/null +++ b/.flake8 @@ -0,0 +1,6 @@ +[flake8] +max-line-length = 88 +extend-ignore = E203 + +copyright-check = True +copyright-author = Graphcore Ltd diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml new file mode 100644 index 0000000..bd27cfc --- /dev/null +++ b/.github/workflows/pre-commit.yaml @@ -0,0 +1,14 @@ +name: Pre-Commit Checks + +on: + pull_request: + push: + branches: [main] + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v3 + - uses: pre-commit/action@v3.0.0 \ No newline at end of file diff --git a/.github/workflows/unittest.yaml b/.github/workflows/unittest.yaml index e10c219..3e9d64a 100644 --- a/.github/workflows/unittest.yaml +++ b/.github/workflows/unittest.yaml @@ -33,4 +33,4 @@ jobs: JAX_IPU_MODEL_NUM_TILES: 46 JAX_PLATFORMS: cpu,ipu run: | - pytest -s . + pytest . diff --git a/.isort.cfg b/.isort.cfg new file mode 100644 index 0000000..b9fb3f3 --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,2 @@ +[settings] +profile=black diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..170e796 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,37 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: end-of-file-fixer + files: (^pyscf_ipu/experimental/)|(^test/)|(\.(cfg|txt|flake8|ini)) + - id: trailing-whitespace + files: (^pyscf_ipu/experimental/)|(^test/) + +- repo: https://github.com/psf/black + rev: 23.9.1 + hooks: + - id: black-jupyter + files: (^pyscf_ipu/experimental/)|(^test/) + name: Format code + +- repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + files: (^pyscf_ipu/experimental/)|(^test/) + name: Sort imports + +- repo: https://github.com/PyCQA/flake8 + rev: 6.1.0 + hooks: + - id: flake8 + files: (^pyscf_ipu/experimental/)|(^test/) + name: Check PEP8 + +- repo: https://github.com/PyCQA/flake8 + rev: 6.1.0 + hooks: + - id: flake8 + args: [--select=C] + additional_dependencies: [flake8-copyright] + name: copyright check diff --git a/.pytest.ini b/.pytest.ini new file mode 100644 index 0000000..2b7ebd6 --- /dev/null +++ b/.pytest.ini @@ -0,0 +1,2 @@ +[pytest] +addopts = -s -v --durations=10 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..c96e85c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,91 @@ +# Contributing to pyscf-ipu + +This project is still evolving but at the moment is focused around a high-performance and easily hackable implementation of Gaussian basis set DFT. +We hope this is useful for the generation of large-scale datasets needed +for training machine-learning models. We are interested in hearing any and +all feedback so feel free to raise any questions, bugs encountered, or enhancement requests as [Issues](https://github.com/graphcore-research/pyscf-ipu/issues). + +## Setting up a development environment +We recommend using the conda package manager as this can automatically enable +the Graphcore Poplar SDK. This is particularly useful in VS Code which can automatically +activate the conda environment in a variety of scenarios: +* visual debugging +* running quick experiments in an interactive Jupyter window +* using VS code for Jupyter notebook development. + +The following assumes that you have already set up an install of conda and that +the conda command is available on your system path. Refer to your preferred conda +installer: +* [miniforge installation](https://github.com/conda-forge/miniforge#install) +* [conda installation documentation](https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html). + +1. Create a new conda environment with the same python version as required by the Poplar SDK. + For example, on ubuntu 20 use `python=3.8.10` + ```bash + conda create -n pyscf-ipu python=3.8.10 + ``` + +2. Confirm that you have the Poplar SDK installed on your machine and store the location + in a temporary shell variable. The following will test that the SDK is found and + configured correctly: + ```bash + TMP_POPLAR_SDK=/path/to/sdk + source $TMP_POPLAR_SDK/enable + gc-monitor + +3. Activate the environment and make POPLAR_SDK a persistent environment variable. + ```bash + conda activate pyscf-ipu + conda env config vars set POPLAR_SDK=$TMP_POPLAR_SDK + ``` + +4. You have to reactivate the conda environment to use the `$POPLAR_SDK` + variable in the environment. + ```bash + conda deactivate + conda activate pyscf-ipu + ``` + +5. Setup the conda environment to automatically enable the Poplar SDK whenever + the environment is activated. + ```bash + mkdir -p $CONDA_PREFIX/etc/conda/activate.d + echo "source $POPLAR_SDK/enable" > $CONDA_PREFIX/etc/conda/activate.d/enable.sh + ``` + +6. Check that everything is working by once reactivating the pyscf-ipu + environment _in a new shell_ and calling `gc-monitor`: + ```bash + conda deactivate + conda activate pyscf-ipu + gc-monitor + +7. Install all required packages for developing JAX DFT: + ```bash + pip install -e ".[ipu,test]" + ``` + +8. Install the pre-commit hooks + ```bash + pre-commit install + ``` + +9. Create a feature branch, make changes, and when you commit them the + pre-commit hooks will run. + ```bash + git checkout -b feature + ... + git push --set-upstream origin feature + ``` + The last command will prints a link that you can follow to open a PR. + + +## Testing +Run all the tests using `pytest` +```bash +pytest +``` +We also use the nbmake package to check our notebooks work in the `IpuModel` environment. These checks can also be run on IPU hardware equiped machines e.g.: +```bash +pytest --nbmake --nbmake-timeout=3000 notebooks/nanoDFT-demo.ipynb +``` diff --git a/README.md b/README.md index 6455503..a4a1680 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![notebook-tests](https://github.com/graphcore-research/pyscf-ipu/actions/workflows/notebooks.yaml/badge.svg)](https://github.com/graphcore-research/pyscf-ipu/actions/workflows/notebooks.yaml) [![nanoDFT CLI](https://github.com/graphcore-research/pyscf-ipu/actions/workflows/cli.yaml/badge.svg)](https://github.com/graphcore-research/pyscf-ipu/actions/workflows/cli.yaml) [![unit tests](https://github.com/graphcore-research/pyscf-ipu/actions/workflows/unittest.yaml/badge.svg)](https://github.com/graphcore-research/pyscf-ipu/actions/workflows/unittest.yaml) +[![pre-commit checks](https://github.com/graphcore-research/pyscf-ipu/actions/workflows/pre-commit.yaml/badge.svg)](https://github.com/graphcore-research/pyscf-ipu/actions/workflows/pre-commit.yaml) [**Installation guide**](#installation) | [**Example DFT Computations**](#example-dft-computations) @@ -31,7 +32,7 @@ To generate datasets based on the paper __Repurposing Density Functional Theory To run the notebook on Graphcore IPU hardware on Paperspace: -[![Run on Gradient](https://assets.paperspace.io/img/gradient-badge.svg)](https://ipu.dev/ipobmC) +[![Run on Gradient](https://assets.paperspace.io/img/gradient-badge.svg)](https://ipu.dev/YX0jlK) ### For DFT teaching and learning: nanoDFT @@ -43,6 +44,7 @@ To run the notebook on Graphcore IPU hardware on Paperspace: [![Run on Gradient](https://assets.paperspace.io/img/gradient-badge.svg)](https://ipu.dev/ipobmC) + Additional notebooks in [notebooks](notebooks) demonstrate other aspects of the computation. ## Installation diff --git a/notebooks/DFT-dataset-generation.ipynb b/notebooks/DFT-dataset-generation.ipynb index bfd8f5e..cb633d1 100644 --- a/notebooks/DFT-dataset-generation.ipynb +++ b/notebooks/DFT-dataset-generation.ipynb @@ -7,31 +7,23 @@ "source": [ "Copyright (c) 2023 Graphcore Ltd. All rights reserved.\n", "\n", - "# DFT dataset generation using PySCF IPU" - ] - }, - { - "cell_type": "markdown", - "id": "885d94eb", - "metadata": {}, - "source": [ - "## Dependencies and configuration\n", + "# DFT dataset generation using PySCF IPU\n", "\n", - "Install the JAX experimental for IPU (and addons). " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "10b9ba5c", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "# Update working directory to root directory of the repo.\n", - "if len([d for d in os.listdir() if d.endswith(\".ipynb\")]) > 0:\n", - " os.chdir(os.getcwd() + \"/..\")\n", - "print(\"Working directory:\", os.getcwd())" + "This notebook shows how to generate DFT datasets on the Graphcore IPU based on\n", + "\"PySCFIPU: Repurposing Density Functional Theory to Suit Deep Learning\", Mathiasen et al, (SynS & ML) Workshop, ICML 2023\n", + "\n", + "https://icml.cc/virtual/2023/28485\n", + "\n", + "Density Functional Theory (DFT) accurately predicts the properties of molecules given their atom types and positions,\n", + "and often serves as ground truth for molecular property prediction tasks.\n", + "Research in other areas of machine learning has shown that generalisation performance \n", + "of Neural Networks tends to improve with increased dataset size, however, \n", + "the computational cost of DFT has limited the size of DFT datasets.\n", + "\n", + "PySCF_IPU allowed us to create QM10X, a dataset with 100 million conformers, in 3000 IPU-hours.\n", + "\n", + "This notebook, running on 4 IPUs on Paperspace, creates 100K conformers in about 1 hour;\n", + "it can be run on multiple 16-IPU systems (paid instances) to generate the full dataset." ] }, { @@ -44,22 +36,139 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "5f54d5a7", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2023-09-21T17:22:48.413594Z", + "iopub.status.busy": "2023-09-21T17:22:48.413357Z", + "iopub.status.idle": "2023-09-21T17:22:59.171899Z", + "shell.execute_reply": "2023-09-21T17:22:59.171228Z", + "shell.execute_reply.started": "2023-09-21T17:22:48.413568Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Obtaining file:///notebooks\n", + " Preparing metadata (setup.py) ... \u001b[?25ldone\n", + "\u001b[?25hCollecting jax@ https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jax-0.3.16%2Bipu-py3-none-any.whl\n", + " Using cached https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jax-0.3.16%2Bipu-py3-none-any.whl (1.2 MB)\n", + "Collecting jaxlib@ https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jaxlib-0.3.15%2Bipu.sdk320-cp38-none-manylinux2014_x86_64.whl\n", + " Downloading https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jaxlib-0.3.15%2Bipu.sdk320-cp38-none-manylinux2014_x86_64.whl (111.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m111.3/111.3 MB\u001b[0m \u001b[31m52.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", + "\u001b[?25hCollecting tessellate-ipu@ git+https://github.com/graphcore-research/tessellate-ipu.git@main\n", + " Cloning https://github.com/graphcore-research/tessellate-ipu.git (to revision main) to /tmp/pip-install-mb470ioz/tessellate-ipu_258fa1046cdf4b848d1a67b623862219\n", + " Running command git clone --filter=blob:none --quiet https://github.com/graphcore-research/tessellate-ipu.git /tmp/pip-install-mb470ioz/tessellate-ipu_258fa1046cdf4b848d1a67b623862219\n", + " Resolved https://github.com/graphcore-research/tessellate-ipu.git to commit e254e597bc9b2ffdfa6e3f6d814bebde9bd2f716\n", + " Installing build dependencies ... \u001b[?25ldone\n", + "\u001b[?25h Getting requirements to build wheel ... \u001b[?25ldone\n", + "\u001b[?25h Installing backend dependencies ... \u001b[?25ldone\n", + "\u001b[?25h Preparing metadata (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (1.24.4)\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (3.7.3)\n", + "Requirement already satisfied: pandas in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (2.0.3)\n", + "Requirement already satisfied: scipy in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (1.10.1)\n", + "Requirement already satisfied: h5py in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (3.9.0)\n", + "Requirement already satisfied: pubchempy in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (1.0.4)\n", + "Requirement already satisfied: pyscf==2.2.1 in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (2.2.1)\n", + "Requirement already satisfied: icecream in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (2.1.3)\n", + "Requirement already satisfied: seaborn in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (0.12.2)\n", + "Requirement already satisfied: tqdm in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (4.65.0)\n", + "Requirement already satisfied: natsort in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (8.4.0)\n", + "Requirement already satisfied: rdkit in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (2023.3.3)\n", + "Requirement already satisfied: jsonargparse[all] in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (4.24.1)\n", + "Requirement already satisfied: mogli in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (0.3.0)\n", + "Requirement already satisfied: imageio[ffmpeg] in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (2.31.3)\n", + "Requirement already satisfied: py3Dmol in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (2.0.4)\n", + "Requirement already satisfied: basis-set-exchange in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (0.9.1)\n", + "Requirement already satisfied: periodictable in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (1.6.1)\n", + "Requirement already satisfied: sympy in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (1.12)\n", + "Requirement already satisfied: setuptools<60.0 in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (59.8.0)\n", + "Requirement already satisfied: jaxtyping==0.2.8 in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (0.2.8)\n", + "Requirement already satisfied: chex in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (0.1.6)\n", + "Requirement already satisfied: jax==0.3.16 in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (0.3.16+ipu)\n", + "Requirement already satisfied: jaxlib==0.3.15 in /usr/local/lib/python3.8/dist-packages (from pyscf-ipu==0.0.1) (0.3.15+ipu.sdk320)\n", + "Requirement already satisfied: pybind11 in /usr/local/lib/python3.8/dist-packages (from jax@ https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jax-0.3.16%2Bipu-py3-none-any.whl->pyscf-ipu==0.0.1) (2.11.1)\n", + "Requirement already satisfied: cppimport in /usr/local/lib/python3.8/dist-packages (from jax@ https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jax-0.3.16%2Bipu-py3-none-any.whl->pyscf-ipu==0.0.1) (22.8.2)\n", + "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.8/dist-packages (from jax@ https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jax-0.3.16%2Bipu-py3-none-any.whl->pyscf-ipu==0.0.1) (4.8.0)\n", + "Requirement already satisfied: etils[epath] in /usr/local/lib/python3.8/dist-packages (from jax@ https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jax-0.3.16%2Bipu-py3-none-any.whl->pyscf-ipu==0.0.1) (1.3.0)\n", + "Requirement already satisfied: opt-einsum in /usr/local/lib/python3.8/dist-packages (from jax@ https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jax-0.3.16%2Bipu-py3-none-any.whl->pyscf-ipu==0.0.1) (3.3.0)\n", + "Requirement already satisfied: absl-py in /usr/local/lib/python3.8/dist-packages (from jax@ https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jax-0.3.16%2Bipu-py3-none-any.whl->pyscf-ipu==0.0.1) (2.0.0)\n", + "Requirement already satisfied: typeguard>=2.13.3 in /usr/local/lib/python3.8/dist-packages (from jaxtyping==0.2.8->pyscf-ipu==0.0.1) (4.1.5)\n", + "Requirement already satisfied: regex in /usr/local/lib/python3.8/dist-packages (from basis-set-exchange->pyscf-ipu==0.0.1) (2023.8.8)\n", + "Requirement already satisfied: argcomplete in /usr/local/lib/python3.8/dist-packages (from basis-set-exchange->pyscf-ipu==0.0.1) (3.1.2)\n", + "Requirement already satisfied: unidecode in /usr/local/lib/python3.8/dist-packages (from basis-set-exchange->pyscf-ipu==0.0.1) (1.3.6)\n", + "Requirement already satisfied: jsonschema in /usr/local/lib/python3.8/dist-packages (from basis-set-exchange->pyscf-ipu==0.0.1) (4.17.3)\n", + "Requirement already satisfied: dm-tree>=0.1.5 in /usr/local/lib/python3.8/dist-packages (from chex->pyscf-ipu==0.0.1) (0.1.8)\n", + "Requirement already satisfied: toolz>=0.9.0 in /usr/local/lib/python3.8/dist-packages (from chex->pyscf-ipu==0.0.1) (0.12.0)\n", + "Requirement already satisfied: asttokens>=2.0.1 in /usr/local/lib/python3.8/dist-packages (from icecream->pyscf-ipu==0.0.1) (2.4.0)\n", + "Requirement already satisfied: executing>=0.3.1 in /usr/local/lib/python3.8/dist-packages (from icecream->pyscf-ipu==0.0.1) (1.2.0)\n", + "Requirement already satisfied: pygments>=2.2.0 in /usr/local/lib/python3.8/dist-packages (from icecream->pyscf-ipu==0.0.1) (2.14.0)\n", + "Requirement already satisfied: colorama>=0.3.9 in /usr/local/lib/python3.8/dist-packages (from icecream->pyscf-ipu==0.0.1) (0.4.4)\n", + "Requirement already satisfied: pillow>=8.3.2 in /usr/local/lib/python3.8/dist-packages (from imageio[ffmpeg]->pyscf-ipu==0.0.1) (10.0.1)\n", + "Requirement already satisfied: psutil in /usr/local/lib/python3.8/dist-packages (from imageio[ffmpeg]->pyscf-ipu==0.0.1) (5.9.5)\n", + "Requirement already satisfied: imageio-ffmpeg in /usr/local/lib/python3.8/dist-packages (from imageio[ffmpeg]->pyscf-ipu==0.0.1) (0.4.9)\n", + "Requirement already satisfied: PyYAML>=3.13 in /usr/local/lib/python3.8/dist-packages (from jsonargparse[all]->pyscf-ipu==0.0.1) (5.4.1)\n", + "Requirement already satisfied: importlib-resources>=3.2.0 in /usr/local/lib/python3.8/dist-packages (from matplotlib->pyscf-ipu==0.0.1) (5.12.0)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.8/dist-packages (from matplotlib->pyscf-ipu==0.0.1) (4.42.1)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.8/dist-packages (from matplotlib->pyscf-ipu==0.0.1) (0.11.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib->pyscf-ipu==0.0.1) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.8/dist-packages (from matplotlib->pyscf-ipu==0.0.1) (2.8.2)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib->pyscf-ipu==0.0.1) (1.1.1)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.8/dist-packages (from matplotlib->pyscf-ipu==0.0.1) (23.0)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.8/dist-packages (from matplotlib->pyscf-ipu==0.0.1) (1.4.5)\n", + "Requirement already satisfied: glfw in /usr/local/lib/python3.8/dist-packages (from mogli->pyscf-ipu==0.0.1) (2.6.2)\n", + "Requirement already satisfied: PyOpenGL in /usr/local/lib/python3.8/dist-packages (from mogli->pyscf-ipu==0.0.1) (3.1.7)\n", + "Requirement already satisfied: gr in /usr/local/lib/python3.8/dist-packages (from mogli->pyscf-ipu==0.0.1) (1.23.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.8/dist-packages (from pandas->pyscf-ipu==0.0.1) (2023.3)\n", + "Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.8/dist-packages (from pandas->pyscf-ipu==0.0.1) (2023.3)\n", + "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.8/dist-packages (from sympy->pyscf-ipu==0.0.1) (1.3.0)\n", + "Requirement already satisfied: six>=1.12.0 in /usr/lib/python3/dist-packages (from asttokens>=2.0.1->icecream->pyscf-ipu==0.0.1) (1.14.0)\n", + "Requirement already satisfied: zipp>=3.1.0 in /usr/local/lib/python3.8/dist-packages (from importlib-resources>=3.2.0->matplotlib->pyscf-ipu==0.0.1) (3.15.0)\n", + "Requirement already satisfied: importlib-metadata>=3.6 in /usr/local/lib/python3.8/dist-packages (from typeguard>=2.13.3->jaxtyping==0.2.8->pyscf-ipu==0.0.1) (6.1.0)\n", + "Requirement already satisfied: mako in /usr/local/lib/python3.8/dist-packages (from cppimport->jax@ https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jax-0.3.16%2Bipu-py3-none-any.whl->pyscf-ipu==0.0.1) (1.2.4)\n", + "Requirement already satisfied: filelock in /usr/local/lib/python3.8/dist-packages (from cppimport->jax@ https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jax-0.3.16%2Bipu-py3-none-any.whl->pyscf-ipu==0.0.1) (3.12.4)\n", + "Requirement already satisfied: fsspec>=0.8.4 in /usr/local/lib/python3.8/dist-packages (from jsonargparse[all]->pyscf-ipu==0.0.1) (2023.9.1)\n", + "Requirement already satisfied: jsonnet>=0.13.0 in /usr/local/lib/python3.8/dist-packages (from jsonargparse[all]->pyscf-ipu==0.0.1) (0.20.0)\n", + "Requirement already satisfied: attrs>=17.4.0 in /usr/local/lib/python3.8/dist-packages (from jsonschema->basis-set-exchange->pyscf-ipu==0.0.1) (22.2.0)\n", + "Requirement already satisfied: pkgutil-resolve-name>=1.3.10 in /usr/local/lib/python3.8/dist-packages (from jsonschema->basis-set-exchange->pyscf-ipu==0.0.1) (1.3.10)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /usr/local/lib/python3.8/dist-packages (from jsonschema->basis-set-exchange->pyscf-ipu==0.0.1) (0.19.3)\n", + "Requirement already satisfied: omegaconf>=2.1.1 in /usr/local/lib/python3.8/dist-packages (from jsonargparse[all]->pyscf-ipu==0.0.1) (2.3.0)\n", + "Requirement already satisfied: reconplogger>=4.4.0 in /usr/local/lib/python3.8/dist-packages (from jsonargparse[all]->pyscf-ipu==0.0.1) (4.12.0)\n", + "Requirement already satisfied: ruyaml>=0.20.0 in /usr/local/lib/python3.8/dist-packages (from jsonargparse[all]->pyscf-ipu==0.0.1) (0.91.0)\n", + "Requirement already satisfied: docstring-parser>=0.15 in /usr/local/lib/python3.8/dist-packages (from jsonargparse[all]->pyscf-ipu==0.0.1) (0.15)\n", + "Requirement already satisfied: typeshed-client>=2.1.0 in /usr/local/lib/python3.8/dist-packages (from jsonargparse[all]->pyscf-ipu==0.0.1) (2.3.0)\n", + "Requirement already satisfied: requests>=2.18.4 in /usr/local/lib/python3.8/dist-packages (from jsonargparse[all]->pyscf-ipu==0.0.1) (2.28.2)\n", + "Requirement already satisfied: antlr4-python3-runtime==4.9.* in /usr/local/lib/python3.8/dist-packages (from omegaconf>=2.1.1->jsonargparse[all]->pyscf-ipu==0.0.1) (4.9.3)\n", + "Requirement already satisfied: logmatic-python>=0.1.7 in /usr/local/lib/python3.8/dist-packages (from reconplogger>=4.4.0->jsonargparse[all]->pyscf-ipu==0.0.1) (0.1.7)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/lib/python3/dist-packages (from requests>=2.18.4->jsonargparse[all]->pyscf-ipu==0.0.1) (1.25.8)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/lib/python3/dist-packages (from requests>=2.18.4->jsonargparse[all]->pyscf-ipu==0.0.1) (2.8)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.8/dist-packages (from requests>=2.18.4->jsonargparse[all]->pyscf-ipu==0.0.1) (3.1.0)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/lib/python3/dist-packages (from requests>=2.18.4->jsonargparse[all]->pyscf-ipu==0.0.1) (2019.11.28)\n", + "Requirement already satisfied: distro>=1.3.0 in /usr/lib/python3/dist-packages (from ruyaml>=0.20.0->jsonargparse[all]->pyscf-ipu==0.0.1) (1.4.0)\n", + "Requirement already satisfied: MarkupSafe>=0.9.2 in /usr/local/lib/python3.8/dist-packages (from mako->cppimport->jax@ https://github.com/graphcore-research/jax-experimental/releases/download/jax-v0.3.16-ipu-beta3-sdk3/jax-0.3.16%2Bipu-py3-none-any.whl->pyscf-ipu==0.0.1) (2.1.2)\n", + "Requirement already satisfied: python-json-logger in /usr/local/lib/python3.8/dist-packages (from logmatic-python>=0.1.7->reconplogger>=4.4.0->jsonargparse[all]->pyscf-ipu==0.0.1) (2.0.7)\n", + "Installing collected packages: pyscf-ipu\n", + " Attempting uninstall: pyscf-ipu\n", + " Found existing installation: pyscf-ipu 0.0.1\n", + " Can't uninstall 'pyscf-ipu'. No files were found to uninstall.\n", + " Running setup.py develop for pyscf-ipu\n", + "Successfully installed pyscf-ipu\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n", + "install done\n" + ] + } + ], "source": [ - "%pip install -e \"..[ipu]\"" + "# PySCF IPU dependencies \n", + "%pip install -e \"..[ipu]\"\n", + "print('install done - restart kernel if packages where installed')" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "74f8d675", - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "id": "16f39a33", @@ -70,63 +179,77 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "88c260e3", - "metadata": {}, - "outputs": [], - "source": [ - "# Download and extract GDB11 dataset.\n", - "!wget -p -O ./gdb/gdb11.tgz https://zenodo.org/record/5172018/files/gdb11.tgz\\?download\\=1\n", - "!tar -xvf ./gdb/gdb11.tgz --directory ./gdb/" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "350ad136", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2023-09-21T17:25:16.225823Z", + "iopub.status.busy": "2023-09-21T17:25:16.225416Z", + "iopub.status.idle": "2023-09-21T17:25:16.239357Z", + "shell.execute_reply": "2023-09-21T17:25:16.238219Z", + "shell.execute_reply.started": "2023-09-21T17:25:16.225799Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found ./data/gdb11_size09_sorted.csv\n" + ] + } + ], "source": [ - "import gdb.sortgdb as sortgdb\n", + "import os\n", + "from gdb import sortgdb # Restart kernel if gdb not found - it was installed above\n", "\n", - "# Filter & sort GDB11 dataset (size 9).\n", - "gdb_filename = \"./gdb/gdb11_size09.smi\"\n", - "gdb_sorted = sortgdb.sort_gdb(gdb_filename, keep_only_atoms_count=9)\n", - "# Save output as csv.\n", + "gdb_filename = \"./data/gdb11_size09.smi\"\n", "out_filename = gdb_filename.replace(\".smi\", \"_sorted.csv\")\n", - "gdb_sorted.to_csv(out_filename, index=False, header=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4cdf3730", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "530cbea8", - "metadata": {}, - "outputs": [], - "source": [ - "import subprocess\n", - "import sys\n", - "import time\n", "\n", - "import numpy as np\n", - "from dataclasses import dataclass" + "loaded = os.path.exists(out_filename) and os.path.getsize(out_filename) == 6985727\n", + "\n", + "if loaded:\n", + " print(f'Found {out_filename}')\n", + "else:\n", + " print(f'Did not find {out_filename}, or size was wrong')\n", + "\n", + " # Download and extract GDB11 dataset.\n", + " !mkdir -p ./data\n", + " !wget -p -O ./data/gdb11.tgz https://zenodo.org/record/5172018/files/gdb11.tgz\\?download\\=1\n", + " !tar -xvf ./data/gdb11.tgz --directory ./data\n", + "\n", + " # Filter & sort GDB11 dataset (size 9).\n", + " gdb_sorted = sortgdb.sort_gdb(gdb_filename, keep_only_atoms_count=9)\n", + " # Save output as csv.\n", + " gdb_sorted.to_csv(out_filename, index=False, header=False)\n", + " print('done')\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "a9da90c6", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2023-09-21T17:25:50.209218Z", + "iopub.status.busy": "2023-09-21T17:25:50.208877Z", + "iopub.status.idle": "2023-09-21T17:25:50.213530Z", + "shell.execute_reply": "2023-09-21T17:25:50.212888Z", + "shell.execute_reply.started": "2023-09-21T17:25:50.209196Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "import done\n" + ] + } + ], "source": [ + "import os\n", + "\n", "# PySCF IPU setup: use a single device per process.\n", "os.environ[\"JAX_IPU_DEVICE_COUNT\"] = \"1\"\n", "# JAX/XLA IPU compilation cache.\n", @@ -134,9 +257,10 @@ " --executable_cache_path=/tmp/ipu-ef-cache\n", "\"\"\"\n", "\n", - "# First import of JAX and TessellateIPU make take a few minutes...\n", + "# First import of JAX and TessellateIPU may take a few minutes...\n", "import jax\n", - "import tessellate_ipu" + "import tessellate_ipu\n", + "print('import done')" ] }, { @@ -146,131 +270,171 @@ "source": [ "# Create a DFT dataset using PySCF IPU\n", "\n", - "In just a couple of Python lines, we can launch a background process building a DFT dataset using PySCF IPU.\n", "In the following example, we use only a single IPU. Multiple IPUs can be used by simply launching a collection of PySCF IPU processes instead of a single one." ] }, { "cell_type": "code", - "execution_count": null, - "id": "d48596cc", - "metadata": {}, - "outputs": [], - "source": [ - "# Some PySCF parameters.\n", - "\n", - "# Number of conformers per molecule.\n", - "num_conformers = 1000\n", - "# Dataset name.\n", - "dataset_name = \"notebook_dataset\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "96ea8a6f", - "metadata": {}, - "outputs": [], - "source": [ - "@dataclass(frozen=True)\n", - "class DFTProcess:\n", - " # Underlying process.\n", - " process: subprocess.Popen\n", - " # Path of the dataset generated.\n", - " path: str\n", - " \n", - " @property\n", - " def pid(self):\n", - " return self.process.pid\n", - " \n", - " def is_running(self):\n", - " return self.process.poll() == None\n", - " \n", - " def __del__(self):\n", - " print(\"Killing DFT dataset process with PID:\", self.process.pid)\n", - " self.process.kill()\n", - "\n", - " \n", - "def launch_dft_process() -> DFTProcess:\n", - " \"\"\"Launch an external PySCF IPU process building a DFT molecular dataset. \n", - " \"\"\"\n", - " try:\n", - " # Make sure the root directory exists.\n", - " rootpath = f\"./data/generated/{dataset_name}/\"\n", - " os.makedirs(rootpath, exist_ok=True)\n", - " num_datasets = len(os.listdir(rootpath))\n", - " # Launch DFT process...\n", - " command_line = [\n", - " \"python\", \"density_functional_theory.py\",\n", - " \"-generate\",\n", - " \"-save\",\n", - " \"-fname\", dataset_name,\n", - " \"-level\",\"0\",\n", - " \"-plevel\",\"0\",\n", - " \"-num_conformers\", str(num_conformers),\n", - " \"-gdb\",\"9\",\n", - " \"-backend\",\"ipu\",\n", - " \"-float32\",\n", - " ]\n", - " raw_process = subprocess.Popen(command_line, env=os.environ.copy())\n", - " print(\"Launching DFT dataset process with PID\", raw_process.pid, \"... Please wait...\")\n", - " # Wait the new directory is created...\n", - " while len(os.listdir(rootpath)) == num_datasets or raw_process.poll() != None:\n", - " time.sleep(1.0)\n", - " # Failure while launching?\n", - " if raw_process.poll() != None:\n", - " raise RuntimeError(\"Error while launching PySCF IPU process...\")\n", - " # Find the dataset path (sorted by date).\n", - " paths = sorted(os.listdir(rootpath), key=lambda x: os.path.getmtime(rootpath + x))\n", - " filename = os.path.join(rootpath, paths[-1], \"data.csv\")\n", - " return DFTProcess(raw_process, filename)\n", - " except Exception as e:\n", - " # Capture any issue, and kill the process in this case.\n", - " raw_process.kill()\n", - " raise e\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2dbfe415", - "metadata": {}, - "outputs": [], - "source": [ - "# Launching an external PySCF IPU process\n", - "dft_process = launch_dft_process()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "894a97a0", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2023-09-21T17:26:20.435072Z", + "iopub.status.busy": "2023-09-21T17:26:20.434581Z", + "iopub.status.idle": "2023-09-21T17:26:20.469210Z", + "shell.execute_reply": "2023-09-21T17:26:20.468642Z", + "shell.execute_reply.started": "2023-09-21T17:26:20.435051Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[BASIS] STO-3G\n", + "Loaded 444285 molecules from gdb11_size09\n" + ] + } + ], "source": [ - "print(\"PySCF IPU DFT computation on-going. Dataset saved in:\", dft_process.path)\n", - "dft_process.is_running()" + "# Equivalent to command line:\n", + "# python pyscf_ipu/dft.py -generate -save -fname \"notebook_dataset\"\n", + "# -level 0 -plevel 0 -num_conformers 1000\n", + "# -gdb 9 -float32\n", + "\n", + "import time\n", + "from pyscf_ipu.dft import get_args, process_args\n", + "\n", + "args = get_args([])\n", + "args.backend = 'cpu'\n", + "args.generate = True\n", + "args.save = True\n", + "args.fname = \"notebook_dataset\"\n", + "\n", + "args.level = 0\n", + "args.plevel = 0\n", + "\n", + "args.float32 = True\n", + "\n", + "quick = True # Set to False to generate full dataset (takes some time)\n", + "\n", + "if quick:\n", + " args.id = 1\n", + " args.num_conformers = 32 # Set to 1000 for full dataset\n", + " args.limit = 33 # Comment out for full dataset\n", + "else:\n", + " args.num_conformers = 1000\n", + "\n", + "process_args(args)\n", + "\n", + "# Load GDB09 data\n", + "args.gdb = 1 # positive => split for multi ipus\n", + "args.split = [0,1] # Partition 0 of 1 (i.e. single IPU)\n", + "gdb = 'gdb11_size09'\n", + "args.smiles = open(f\"data/{gdb}_sorted.csv\", \"r\").read().split(\"\\n\")\n", + "print(f'Loaded {len(args.smiles)} molecules from {gdb}')" ] }, { "cell_type": "code", - "execution_count": null, - "id": "b192ca68", - "metadata": {}, - "outputs": [], + "execution_count": 8, + "id": "41564018", + "metadata": { + "execution": { + "iopub.execute_input": "2023-09-21T17:26:26.147917Z", + "iopub.status.busy": "2023-09-21T17:26:26.147159Z", + "iopub.status.idle": "2023-09-21T17:27:11.130943Z", + "shell.execute_reply": "2023-09-21T17:27:11.129875Z", + "shell.execute_reply.started": "2023-09-21T17:26:26.147880Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Length GDB: 444285\n", + "Trying FC(F)=C(F)C#CC#N\n", + "Conformer: F -3.303279 -2.551231 -0.665592; C -3.551114 -0.180504 -1.594233; F -5.642254 0.510763 -2.775206; C -1.480470 1.359424 -1.330889; F -1.829597 3.736696 -2.292413; C 0.721395 0.525248 -0.394711; C 2.921869 -0.329714 0.586346; C 5.124244 -1.156335 1.526403; N 7.039206 -1.914347 2.335843; \n", + "recompute: 33\n", + ">>> 0 32\n", + "_0_32\n", + "0_GDB1_f32True_grid0_backendcpu_0_32\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/33 [00:00\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 29\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 30\u001b[0;31m \u001b[0mrecompute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mour_fun\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mjax_dft\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstring\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/notebooks/pyscf_ipu/dft.py\u001b[0m in \u001b[0;36mrecompute\u001b[0;34m(args, molecules, id, num, our_fun, str, atom_string)\u001b[0m\n\u001b[1;32m 1142\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1143\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mskipus\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1144\u001b[0;31m \u001b[0menergies\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mour_energy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mour_hlgap\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt_us\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt_main_loop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mus_hlgap\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mour_fun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1145\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1146\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mskippyscf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/notebooks/pyscf_ipu/dft.py\u001b[0m in \u001b[0;36mjax_dft\u001b[0;34m(str, args)\u001b[0m\n\u001b[1;32m 1327\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstep\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrepeats\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1328\u001b[0m \u001b[0mt0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1329\u001b[0;31m \u001b[0mvals\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdensity_functional_theory\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0matom_positions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1330\u001b[0m \u001b[0menergies\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0me_tot\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmo_energy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmo_coeff\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL_inv\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mvals\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1331\u001b[0m \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mt0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/notebooks/pyscf_ipu/dft.py\u001b[0m in \u001b[0;36mdensity_functional_theory\u001b[0;34m(atom_positions, args, mf_diis_space)\u001b[0m\n\u001b[1;32m 678\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mforloop\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 679\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mskip_minao\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mdensity_matrix\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mminao\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmol\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 680\u001b[0;31m \u001b[0mvals\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m \u001b[0mdo_compute_jit\u001b[0m\u001b[0;34m(\u001b[0m \u001b[0mdensity_matrix\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkinetic\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnuclear\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moverlap\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mao\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0melectron_repulsion\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweights\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcoords\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnuclear_energy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmf_diis_space\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhyb\u001b[0m \u001b[0;34m,\u001b[0m \u001b[0mmask\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_input_floats\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_input_ints\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdcargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL_inv\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 681\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 682\u001b[0m \u001b[0;31m# make this into a flag.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], "source": [ - "# Want to stop the process?\n", - "# dft_process.process.kill()" + "from rdkit import Chem\n", + "\n", + "from pyscf_ipu.dft import angstrom_to_bohr, get_atom_string, jax_dft, recompute\n", + "\n", + "print(\"Length GDB: \", len(args.smiles))\n", + "\n", + "if args.limit != -1:\n", + " args.smiles = args.smiles[:args.limit]\n", + "\n", + "for i in range(int(args.id), min(int(args.id)+1000, len(args.smiles))):\n", + " smile = args.smiles[i]\n", + "\n", + " print('Trying', smile)\n", + "\n", + " b = Chem.MolFromSmiles(smile)\n", + " b = Chem.AddHs(b, explicitOnly=False)\n", + "\n", + " e = Chem.AllChem.EmbedMolecule(b)\n", + " if e == -1:\n", + " print('Did not embed', b) \n", + " continue\n", + "\n", + " locs = b.GetConformer().GetPositions() * angstrom_to_bohr\n", + " atoms = [atom.GetSymbol() for atom in b.GetAtoms()]\n", + " atom_string, string = get_atom_string(\" \".join(atoms), locs)\n", + "\n", + " print('Conformer: ', string)\n", + " break\n", + "\n", + "recompute(args, None, 0, 0, our_fun=jax_dft, str=string)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "1a62d0e8", - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "id": "e0ec0c9d", @@ -278,14 +442,24 @@ "source": [ "# Loading & visualizing generated data\n", "\n", - "As the dataset is being created in the background, we can load the data which has been already generated." + "After the dataset has been created, we can load the data.\n", + "(You may wish to spin up a new notebook, and view the data as \n", + "it's being generated in this one)." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "d778133f", - "metadata": {}, + "metadata": { + "execution": { + "iopub.execute_input": "2023-09-21T17:27:59.930326Z", + "iopub.status.busy": "2023-09-21T17:27:59.930089Z", + "iopub.status.idle": "2023-09-21T17:27:59.934793Z", + "shell.execute_reply": "2023-09-21T17:27:59.933812Z", + "shell.execute_reply.started": "2023-09-21T17:27:59.930306Z" + } + }, "outputs": [], "source": [ "import pandas as pd" @@ -293,32 +467,732 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "3dfd2293", - "metadata": {}, + "metadata": { + "execution": { + "iopub.execute_input": "2023-09-21T17:28:00.320279Z", + "iopub.status.busy": "2023-09-21T17:28:00.319998Z", + "iopub.status.idle": "2023-09-21T17:28:00.329206Z", + "shell.execute_reply": "2023-09-21T17:28:00.328492Z", + "shell.execute_reply.started": "2023-09-21T17:28:00.320258Z" + } + }, "outputs": [], "source": [ "# Output DFT dataset is a compressed CSV file.\n", "# NOTE: it may take a couple of minutes before the file is generated.\n", - "df = pd.read_csv(dft_process.path, compression=\"gzip\")" + "rootpath = f'./data/generated/{args.fname}/'\n", + "paths = sorted(os.listdir(rootpath), key=lambda x: os.path.getmtime(rootpath + x))\n", + "filename = os.path.join(rootpath, paths[-1], \"data.csv\")\n", + "\n", + "df = pd.read_csv(filename, compression=\"gzip\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "b3e816e8", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2023-09-21T17:28:01.800043Z", + "iopub.status.busy": "2023-09-21T17:28:01.799745Z", + "iopub.status.idle": "2023-09-21T17:28:01.822706Z", + "shell.execute_reply": "2023-09-21T17:28:01.821854Z", + "shell.execute_reply.started": "2023-09-21T17:28:01.800021Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0smileatomsatom_positionsenergiesstdpyscf_energiespyscf_hlgappyscf_homopyscf_lumotimeshomolumohlgapNbasis
00FC(F)(C#N)C(=O)C#NFCFCNCOCN[0.15332033500393688, -2.3606980417798886, -2....[-14387.150902075824, -14321.477650378294, -14...0.000685[0.0]000[4.5475e+03 0.0000e+00 0.0000e+00 1.0000e-01 3...-5.872426-0.8724704.99995645STO-3G
10FC(F)(C#N)C(=O)C#NFCFCNCOCN[-2.3403320213763945, -1.054070549382328, 2.95...[-14386.940987492488, -14327.730510746002, -14...0.001410[0.0]000[1.386e+03 8.000e-01 2.000e-01 2.000e-01 5.600...-5.924247-1.2236144.70063345STO-3G
20FC(F)(C#N)C(=O)C#NFCFCNCOCN[-2.508312250101616, -2.9848902777921023, 0.05...[-14386.867679381283, -14319.960709000135, -14...0.001749[0.0]000[1.432e+03 1.000e-01 0.000e+00 1.000e-01 3.200...-5.924836-1.2350374.68979945STO-3G
30FC(F)(C#N)C(=O)C#NFCFCNCOCN[-3.2551803300125353, -2.1329334256170753, 0.8...[-14387.076018358, -14329.75193126052, -14398....0.001727[0.0]000[1.4513e+03 0.0000e+00 0.0000e+00 1.0000e-01 3...-5.899619-1.1696394.72998045STO-3G
40FC(F)(C#N)C(=O)C#NFCFCNCOCN[-2.84609364909322, -2.7599543764642225, -0.10...[-14386.926915515363, -14322.835535730032, -14...0.001680[0.0]000[1.3103e+03 0.0000e+00 0.0000e+00 1.0000e-01 2...-5.838394-1.1489674.68942845STO-3G
50FC(F)(C#N)C(=O)C#NFCFCNCOCN[-2.5512611780706536, -0.09244560716693372, 2....[-14387.064401315674, -14325.209987703642, -14...0.001245[0.0]000[1.3518e+03 1.0000e-01 0.0000e+00 1.0000e-01 3...-5.920997-1.2304274.69057145STO-3G
60FC(F)(C#N)C(=O)C#NFCFCNCOCN[-2.4575617356051964, -3.0864061240906833, -0....[-14386.692958603096, -14324.748326944484, -14...0.001462[0.0]000[1.3116e+03 1.0000e-01 0.0000e+00 1.0000e-01 2...-5.964935-1.2719674.69296845STO-3G
70FC(F)(C#N)C(=O)C#NFCFCNCOCN[-2.7357029092813003, -2.8385241218542117, -0....[-14386.7613926158, -14324.300083556986, -1439...0.001496[0.0]000[1.295e+03 0.000e+00 0.000e+00 1.000e-01 2.900...-5.921196-1.0424114.87878545STO-3G
80FC(F)(C#N)C(=O)C#NFCFCNCOCN[-2.42430136622039, -0.706409910822915, -2.953...[-14387.090781291115, -14328.945259046752, -14...0.001376[0.0]000[1.4328e+03 1.0000e-01 0.0000e+00 1.0000e-01 3...-5.934455-1.1749144.75954045STO-3G
90FC(F)(C#N)C(=O)C#NFCFCNCOCN[-3.1701050619634006, -2.335481199371203, 0.06...[-14387.030638933082, -14324.197525311902, -14...0.001235[0.0]000[1.3675e+03 0.0000e+00 0.0000e+00 1.0000e-01 3...-5.927952-1.2662434.66170945STO-3G
100FC(F)(C#N)C(=O)C#NFCFCNCOCN[-0.4955235145604512, -3.815391262169907, 1.06...[-14387.03486542885, -14321.65699116902, -1439...0.001234[0.0]000[1.3478e+03 0.0000e+00 0.0000e+00 1.0000e-01 2...-5.902995-1.2398004.66319545STO-3G
110FC(F)(C#N)C(=O)C#NFCFCNCOCN[-2.896145568625801, -2.6944503417478223, 0.04...[-14387.180671110935, -14329.323375554111, -14...0.000544[0.0]000[1.4026e+03 3.0000e-01 2.0000e-01 2.0000e-01 5...-5.917533-1.0788334.83870045STO-3G
120FC(F)(C#N)C(=O)C#NFCFCNCOCN[-3.448789435155949, -1.9135614246323718, -0.2...[-14386.95869711719, -14324.17509990307, -1439...0.000551[0.0]000[1.3035e+03 1.0000e-01 0.0000e+00 1.0000e-01 2...-5.903519-1.2327304.67079045STO-3G
130FC(F)(C#N)C(=O)C#NFCFCNCOCN[-0.8669695806667599, -3.388088649845672, 1.85...[-14386.79277249616, -14327.145576278795, -143...0.001521[0.0]000[1.3845e+03 2.0000e-01 1.0000e-01 3.0000e-01 6...-5.854690-1.1317494.72294245STO-3G
140FC(F)(C#N)C(=O)C#NFCFCNCOCN[-1.8848237401881731, -2.1472662490216803, 1.6...[-14387.739973912656, -14336.080636989258, -14...0.001136[0.0]000[1.3781e+03 0.0000e+00 0.0000e+00 1.0000e-01 3...-5.815578-1.2673004.54827945STO-3G
150FC(F)(C#N)C(=O)C#NFCFCNCOCN[0.7052799833000835, -2.246904661007722, -3.05...[-14384.332974702002, -14300.881901333787, -14...0.001447[0.0]000[1.2682e+03 0.0000e+00 0.0000e+00 1.0000e-01 2...-5.4358340.0130345.44886845STO-3G
160FC(F)(C#N)C(=O)C#NFCFCNCOCN[-2.171671209126482, -2.888501784031278, -1.60...[-14387.113524688302, -14326.735076174467, -14...0.001817[0.0]000[1.4629e+03 0.0000e+00 0.0000e+00 1.0000e-01 2...-5.841239-1.0848184.75642045STO-3G
170FC(F)(C#N)C(=O)C#NFCFCNCOCN[-1.710188439380679, -2.702621686452995, 2.293...[-14387.13593990543, -14326.763387395, -14398....0.002308[0.0]000[1.4376e+03 0.0000e+00 0.0000e+00 1.0000e-01 3...-5.880317-1.1986764.68164145STO-3G
180FC(F)(C#N)C(=O)C#NFCFCNCOCN[-3.4057943826886565, -1.561154489323613, 1.28...[-14386.9272498957, -14326.420290319717, -1439...0.001696[0.0]000[1.3925e+03 0.0000e+00 0.0000e+00 1.0000e-01 2...-5.849538-1.1859624.66357545STO-3G
190FC(F)(C#N)C(=O)C#NFCFCNCOCN[-1.9708144435369819, -3.327291089234618, -0.0...[-14386.895978053113, -14324.132897142825, -14...0.000951[0.0]000[1.385e+03 1.000e-01 0.000e+00 1.000e-01 3.200...-5.976503-1.2126004.76390345STO-3G
200FC(F)(C#N)C(=O)C#NFCFCNCOCN[-3.0388700018391934, -1.424549775933863, 2.16...[-14387.046482045282, -14323.971142266193, -14...0.001052[0.0]000[1.3807e+03 1.0000e-01 0.0000e+00 1.0000e-01 2...-5.880249-1.1149174.76533245STO-3G
210FC(F)(C#N)C(=O)C#NFCFCNCOCN[-0.22353180805978884, -3.849116405960359, -0....[-14386.735734917036, -14325.886920164316, -14...0.001624[0.0]000[1.3943e+03 0.0000e+00 0.0000e+00 1.0000e-01 2...-6.052645-1.2469264.80571945STO-3G
220FC(F)(C#N)C(=O)C#NFCFCNCOCN[-2.453279357441664, -2.704595223076375, 0.606...[-14386.986872654463, -14324.686839346645, -14...0.000837[0.0]000[1.3794e+03 0.0000e+00 0.0000e+00 1.0000e-01 3...-5.866542-1.1275684.73897445STO-3G
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 smile atoms \\\n", + "0 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "1 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "2 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "3 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "4 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "5 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "6 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "7 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "8 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "9 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "10 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "11 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "12 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "13 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "14 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "15 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "16 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "17 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "18 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "19 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "20 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "21 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "22 0 FC(F)(C#N)C(=O)C#N FCFCNCOCN \n", + "\n", + " atom_positions \\\n", + "0 [0.15332033500393688, -2.3606980417798886, -2.... \n", + "1 [-2.3403320213763945, -1.054070549382328, 2.95... \n", + "2 [-2.508312250101616, -2.9848902777921023, 0.05... \n", + "3 [-3.2551803300125353, -2.1329334256170753, 0.8... \n", + "4 [-2.84609364909322, -2.7599543764642225, -0.10... \n", + "5 [-2.5512611780706536, -0.09244560716693372, 2.... \n", + "6 [-2.4575617356051964, -3.0864061240906833, -0.... \n", + "7 [-2.7357029092813003, -2.8385241218542117, -0.... \n", + "8 [-2.42430136622039, -0.706409910822915, -2.953... \n", + "9 [-3.1701050619634006, -2.335481199371203, 0.06... \n", + "10 [-0.4955235145604512, -3.815391262169907, 1.06... \n", + "11 [-2.896145568625801, -2.6944503417478223, 0.04... \n", + "12 [-3.448789435155949, -1.9135614246323718, -0.2... \n", + "13 [-0.8669695806667599, -3.388088649845672, 1.85... \n", + "14 [-1.8848237401881731, -2.1472662490216803, 1.6... \n", + "15 [0.7052799833000835, -2.246904661007722, -3.05... \n", + "16 [-2.171671209126482, -2.888501784031278, -1.60... \n", + "17 [-1.710188439380679, -2.702621686452995, 2.293... \n", + "18 [-3.4057943826886565, -1.561154489323613, 1.28... \n", + "19 [-1.9708144435369819, -3.327291089234618, -0.0... \n", + "20 [-3.0388700018391934, -1.424549775933863, 2.16... \n", + "21 [-0.22353180805978884, -3.849116405960359, -0.... \n", + "22 [-2.453279357441664, -2.704595223076375, 0.606... \n", + "\n", + " energies std \\\n", + "0 [-14387.150902075824, -14321.477650378294, -14... 0.000685 \n", + "1 [-14386.940987492488, -14327.730510746002, -14... 0.001410 \n", + "2 [-14386.867679381283, -14319.960709000135, -14... 0.001749 \n", + "3 [-14387.076018358, -14329.75193126052, -14398.... 0.001727 \n", + "4 [-14386.926915515363, -14322.835535730032, -14... 0.001680 \n", + "5 [-14387.064401315674, -14325.209987703642, -14... 0.001245 \n", + "6 [-14386.692958603096, -14324.748326944484, -14... 0.001462 \n", + "7 [-14386.7613926158, -14324.300083556986, -1439... 0.001496 \n", + "8 [-14387.090781291115, -14328.945259046752, -14... 0.001376 \n", + "9 [-14387.030638933082, -14324.197525311902, -14... 0.001235 \n", + "10 [-14387.03486542885, -14321.65699116902, -1439... 0.001234 \n", + "11 [-14387.180671110935, -14329.323375554111, -14... 0.000544 \n", + "12 [-14386.95869711719, -14324.17509990307, -1439... 0.000551 \n", + "13 [-14386.79277249616, -14327.145576278795, -143... 0.001521 \n", + "14 [-14387.739973912656, -14336.080636989258, -14... 0.001136 \n", + "15 [-14384.332974702002, -14300.881901333787, -14... 0.001447 \n", + "16 [-14387.113524688302, -14326.735076174467, -14... 0.001817 \n", + "17 [-14387.13593990543, -14326.763387395, -14398.... 0.002308 \n", + "18 [-14386.9272498957, -14326.420290319717, -1439... 0.001696 \n", + "19 [-14386.895978053113, -14324.132897142825, -14... 0.000951 \n", + "20 [-14387.046482045282, -14323.971142266193, -14... 0.001052 \n", + "21 [-14386.735734917036, -14325.886920164316, -14... 0.001624 \n", + "22 [-14386.986872654463, -14324.686839346645, -14... 0.000837 \n", + "\n", + " pyscf_energies pyscf_hlgap pyscf_homo pyscf_lumo \\\n", + "0 [0.0] 0 0 0 \n", + "1 [0.0] 0 0 0 \n", + "2 [0.0] 0 0 0 \n", + "3 [0.0] 0 0 0 \n", + "4 [0.0] 0 0 0 \n", + "5 [0.0] 0 0 0 \n", + "6 [0.0] 0 0 0 \n", + "7 [0.0] 0 0 0 \n", + "8 [0.0] 0 0 0 \n", + "9 [0.0] 0 0 0 \n", + "10 [0.0] 0 0 0 \n", + "11 [0.0] 0 0 0 \n", + "12 [0.0] 0 0 0 \n", + "13 [0.0] 0 0 0 \n", + "14 [0.0] 0 0 0 \n", + "15 [0.0] 0 0 0 \n", + "16 [0.0] 0 0 0 \n", + "17 [0.0] 0 0 0 \n", + "18 [0.0] 0 0 0 \n", + "19 [0.0] 0 0 0 \n", + "20 [0.0] 0 0 0 \n", + "21 [0.0] 0 0 0 \n", + "22 [0.0] 0 0 0 \n", + "\n", + " times homo lumo \\\n", + "0 [4.5475e+03 0.0000e+00 0.0000e+00 1.0000e-01 3... -5.872426 -0.872470 \n", + "1 [1.386e+03 8.000e-01 2.000e-01 2.000e-01 5.600... -5.924247 -1.223614 \n", + "2 [1.432e+03 1.000e-01 0.000e+00 1.000e-01 3.200... -5.924836 -1.235037 \n", + "3 [1.4513e+03 0.0000e+00 0.0000e+00 1.0000e-01 3... -5.899619 -1.169639 \n", + "4 [1.3103e+03 0.0000e+00 0.0000e+00 1.0000e-01 2... -5.838394 -1.148967 \n", + "5 [1.3518e+03 1.0000e-01 0.0000e+00 1.0000e-01 3... -5.920997 -1.230427 \n", + "6 [1.3116e+03 1.0000e-01 0.0000e+00 1.0000e-01 2... -5.964935 -1.271967 \n", + "7 [1.295e+03 0.000e+00 0.000e+00 1.000e-01 2.900... -5.921196 -1.042411 \n", + "8 [1.4328e+03 1.0000e-01 0.0000e+00 1.0000e-01 3... -5.934455 -1.174914 \n", + "9 [1.3675e+03 0.0000e+00 0.0000e+00 1.0000e-01 3... -5.927952 -1.266243 \n", + "10 [1.3478e+03 0.0000e+00 0.0000e+00 1.0000e-01 2... -5.902995 -1.239800 \n", + "11 [1.4026e+03 3.0000e-01 2.0000e-01 2.0000e-01 5... -5.917533 -1.078833 \n", + "12 [1.3035e+03 1.0000e-01 0.0000e+00 1.0000e-01 2... -5.903519 -1.232730 \n", + "13 [1.3845e+03 2.0000e-01 1.0000e-01 3.0000e-01 6... -5.854690 -1.131749 \n", + "14 [1.3781e+03 0.0000e+00 0.0000e+00 1.0000e-01 3... -5.815578 -1.267300 \n", + "15 [1.2682e+03 0.0000e+00 0.0000e+00 1.0000e-01 2... -5.435834 0.013034 \n", + "16 [1.4629e+03 0.0000e+00 0.0000e+00 1.0000e-01 2... -5.841239 -1.084818 \n", + "17 [1.4376e+03 0.0000e+00 0.0000e+00 1.0000e-01 3... -5.880317 -1.198676 \n", + "18 [1.3925e+03 0.0000e+00 0.0000e+00 1.0000e-01 2... -5.849538 -1.185962 \n", + "19 [1.385e+03 1.000e-01 0.000e+00 1.000e-01 3.200... -5.976503 -1.212600 \n", + "20 [1.3807e+03 1.0000e-01 0.0000e+00 1.0000e-01 2... -5.880249 -1.114917 \n", + "21 [1.3943e+03 0.0000e+00 0.0000e+00 1.0000e-01 2... -6.052645 -1.246926 \n", + "22 [1.3794e+03 0.0000e+00 0.0000e+00 1.0000e-01 3... -5.866542 -1.127568 \n", + "\n", + " hlgap N basis \n", + "0 4.999956 45 STO-3G \n", + "1 4.700633 45 STO-3G \n", + "2 4.689799 45 STO-3G \n", + "3 4.729980 45 STO-3G \n", + "4 4.689428 45 STO-3G \n", + "5 4.690571 45 STO-3G \n", + "6 4.692968 45 STO-3G \n", + "7 4.878785 45 STO-3G \n", + "8 4.759540 45 STO-3G \n", + "9 4.661709 45 STO-3G \n", + "10 4.663195 45 STO-3G \n", + "11 4.838700 45 STO-3G \n", + "12 4.670790 45 STO-3G \n", + "13 4.722942 45 STO-3G \n", + "14 4.548279 45 STO-3G \n", + "15 5.448868 45 STO-3G \n", + "16 4.756420 45 STO-3G \n", + "17 4.681641 45 STO-3G \n", + "18 4.663575 45 STO-3G \n", + "19 4.763903 45 STO-3G \n", + "20 4.765332 45 STO-3G \n", + "21 4.805719 45 STO-3G \n", + "22 4.738974 45 STO-3G " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "9cd76867", - "metadata": {}, - "outputs": [], + "metadata": { + "execution": { + "iopub.execute_input": "2023-09-21T17:28:08.148775Z", + "iopub.status.busy": "2023-09-21T17:28:08.148512Z", + "iopub.status.idle": "2023-09-21T17:28:08.154608Z", + "shell.execute_reply": "2023-09-21T17:28:08.153901Z", + "shell.execute_reply.started": "2023-09-21T17:28:08.148754Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0 4.999956\n", + "1 4.700633\n", + "2 4.689799\n", + "3 4.729980\n", + "4 4.689428\n", + "5 4.690571\n", + "6 4.692968\n", + "7 4.878785\n", + "8 4.759540\n", + "9 4.661709\n", + "10 4.663195\n", + "11 4.838700\n", + "12 4.670790\n", + "13 4.722942\n", + "14 4.548279\n", + "15 5.448868\n", + "16 4.756420\n", + "17 4.681641\n", + "18 4.663575\n", + "19 4.763903\n", + "20 4.765332\n", + "21 4.805719\n", + "22 4.738974\n", + "Name: hlgap, dtype: float64" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# HLgap data.\n", "df[\"hlgap\"]" @@ -327,7 +1201,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a6e50efa", + "id": "fb46e364-e56f-48b5-8be5-c913444e9c07", "metadata": {}, "outputs": [], "source": [] @@ -335,7 +1209,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, diff --git a/notebooks/ERI-visualisation-JK.ipynb b/notebooks/ERI-visualisation-JK.ipynb index 36cf4fa..feb02ab 100644 --- a/notebooks/ERI-visualisation-JK.ipynb +++ b/notebooks/ERI-visualisation-JK.ipynb @@ -238,7 +238,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python 3", "language": "python", "name": "python3" }, diff --git a/notebooks/SPICE-nao_nr.ipynb b/notebooks/SPICE-nao_nr.ipynb new file mode 100644 index 0000000..d766a96 --- /dev/null +++ b/notebooks/SPICE-nao_nr.ipynb @@ -0,0 +1,453 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Number of atomic orbitals for molecules in the SPICE dataset\n", + "\n", + "This notebook computes a histogram of the number of atomic orbitals for the molecules in the SPICE data set using the `def2-TZVPPD` basis set.\n", + "\n", + "To reduce the computation time, one out of every ten molecules is sampled from the dataset. The computation is then distributed over a number of parallel processes.\n", + "\n", + "For each molecule, only the first conformation is used out of the several listed in the dataset.\n", + "\n", + "NOTE: the notebook expects the file `SPICE-1.1.4.hdf5` under `notebooks`. The dataset can be downloaded with the following command:\n", + "```\n", + "wget https://zenodo.org/record/8222043/files/SPICE-1.1.4.hdf5?download=1\n", + "```\n", + "Be patient as it is a 16GB file." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: h5py in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (3.9.0)\n", + "Requirement already satisfied: mendeleev in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (0.14.0)\n", + "Requirement already satisfied: numpy>=1.17.3 in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (from h5py) (1.24.4)\n", + "Requirement already satisfied: Pygments<3.0.0,>=2.8.0 in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (from mendeleev) (2.16.1)\n", + "Requirement already satisfied: SQLAlchemy>=1.4.0 in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (from mendeleev) (2.0.21)\n", + "Requirement already satisfied: colorama<0.5.0,>=0.4.4 in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (from mendeleev) (0.4.6)\n", + "Requirement already satisfied: pandas>=1.0.0 in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (from mendeleev) (1.5.2)\n", + "Requirement already satisfied: pyfiglet<0.9,>=0.8.post1 in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (from mendeleev) (0.8.post1)\n", + "Requirement already satisfied: six<2.0.0,>=1.15.0 in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (from mendeleev) (1.16.0)\n", + "Requirement already satisfied: python-dateutil>=2.8.1 in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (from pandas>=1.0.0->mendeleev) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (from pandas>=1.0.0->mendeleev) (2023.3.post1)\n", + "Requirement already satisfied: typing-extensions>=4.2.0 in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (from SQLAlchemy>=1.4.0->mendeleev) (4.7.1)\n", + "Requirement already satisfied: greenlet!=0.4.17 in /nethome/paolot/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages (from SQLAlchemy>=1.4.0->mendeleev) (2.0.2)\n" + ] + } + ], + "source": [ + "!pip install h5py mendeleev" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import h5py\n", + "import numpy as np\n", + "import pyscf\n", + "import mendeleev\n", + "import tqdm\n", + "import itertools\n", + "from matplotlib import pyplot as plt\n", + "import multiprocessing" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "f = h5py.File(\"./SPICE-1.1.4.hdf5\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The dataset contains 19238 molecules\n" + ] + } + ], + "source": [ + "print(f\"The dataset contains {len(f)} molecules\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next cell computes the number of atomic orbitals for the specified basis set for each compound in the SPICE data.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "1924it [06:25, 4.99it/s] \n" + ] + } + ], + "source": [ + "def build_mol(mol_str, basis_name):\n", + " mol = pyscf.gto.mole.Mole()\n", + " mol.build(atom=mol_str, unit=\"Angstrom\", basis=basis_name, spin=0, verbose=0)\n", + " return mol\n", + "\n", + "def get_mol_str_list_spice(f, entry=\"trp\", conformation=0, conv_fact=1.0):\n", + " mol = f[entry]\n", + " return list(\n", + " zip(\n", + " (mendeleev.element(int(n)).symbol for n in mol['atomic_numbers']),\n", + " mol['conformations'][conformation])\n", + " )\n", + "\n", + "nao_nrs = []\n", + "\n", + "def compute_nao_nr(entry):\n", + " mol_str = get_mol_str_list_spice(f,entry)\n", + " try:\n", + " return build_mol(mol_str, basis_name=\"def2-TZVPPD\").nao_nr()\n", + " except RuntimeError: # ions are not handled\n", + " return np.nan\n", + "\n", + "sampling_factor = 10\n", + "\n", + "with multiprocessing.Pool(processes=32) as p:\n", + " nao_nrs = list(tqdm.tqdm(\n", + " p.imap_unordered(compute_nao_nr, itertools.islice(f, None, None, sampling_factor)),\n", + " total=int(len(f)/10), ncols=120\n", + " ))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "nao_nrs = np.array(nao_nrs)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 429., 735., nan, ..., 1396., 1490., 2171.])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nao_nrs" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "build_mol() failed on 173 molecules out of 2097\n" + ] + } + ], + "source": [ + "failed_count = np.sum(np.isnan(nao_nrs))\n", + "print(f\"build_mol() failed on {failed_count} molecules out of {failed_count+len(nao_nrs)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Tuzdu9f9+g0MDDS9evVKt9/cuXPTPP9HjhwxoaGh5sEHH0zTv06dOqZnz555Mub0/PXXX0aSefHFF9Ms69Wr11Xt01q1apXh43Ip13tk1apVOd7G6tWr0zy+rvaUlJR0+z777LPZXv+VvNaXLl1qHA6H6dy5s7ttzJgxRpJZv359uvepUaOGqVmzpvv2iy++aCSZv/76y6Nf165djSSzbt06Y8zV7YdctmzZYsqWLWtCQ0M99keudWflal8nsBenvSFPXX7NT3JyskaNGqXq1avLz89PpUqV0i233KK4uDhJf5/DGxsbK0keh8pdzp49q6FDh6pixYpyOp2qUaOGXn31VRljPLZ7/vx5DRw4UKVLl1bx4sXVuXNnHThwQA6Hw+OIkusQ//bt29W9e3eVKFFCt9xyiyTpp59+Uu/evd2nBoWHh+uRRx7RsWPHPLblWsfOnTv10EMPKSQkRGXKlNHzzz8vY4x+//1391GH8PBwvfbaa9l67C5evKgxY8aoatWqcjqdqly5sv71r38pMTHR3cfhcGjGjBk6e/as+7HK7LQc16mJ27dv16233qqAgACVL19eEydO9OiXlJSkF154QY0aNVJISIgCAwPVokULrVq1Ks06s/ucZMV1/vaBAwd01113KSgoSGXKlNE///lPpaSkuPu5ThF59dVXNWXKFPfjs337dknSggUL1KZNm3RPm7jtttu0b9++TM/Nd52msWfPHi1atMjjdBNJOnLkiPr27auwsDD5+fmpfv36mjVrlsc6shrj5X777TdJ0s0335xmmbe3t0qVKpXpYyfJ/c3pnj17MuwzceJEJSQk6L333lO5cuXSLK9WrZqeeuqpLLeVXdu2bVObNm3k7++vChUqaOzYsR7f/rt8/vnn6tSpkyIiIuR0OlW1alWNGTPG43lv3bq1Fi1apH379rmfE9c1JDl5vaZnwYIF8vX1VcuWLT3anU5nut/UZ1d61/w4HA4NGDBACxYsUJ06deR0OlW7dm0tWbIkW+uMjIzM1ilB8+bNU1hYmLp27epuK1OmjO677z59/vnnHvsR6e/3xpdffpnp+/bkyZPy9vbWG2+84W47evSovLy8VKpUKY/79u/f3+Oxu/San71796pMmTKSpFGjRrmfz8uP9me1L8iJP/74Q3fddZcCAwNVtmxZDR48OM1j4LJhwwZ16NBBISEh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4sWLmjp1qoKCgtzT3+bUrl27tH///jTtJ0+e1Pr161WiRIlsXTuUleHDhyswMFCPPvqox6+wu/z22296/fXXr3o70t+P1XfffaeNGze62/766y998MEHHv3Se60lJSWlef9Kf+8b0jsNLruv14xERUVp69atGU59XBjdc889Onz4sD777DN329GjR/XJJ5/ozjvvTHM9UHx8vEJCQtyztWWmRYsW2rt3r+bOnes+Dc7Ly0vNmzfXpEmTlJycnOX1Pq5rR9K7ni233X777Tp48KDH1Mbnzp3z+DFf6e8Z76pWrapXX3013R8R/euvv7Lc1tmzZ3X77bfrwIEDWrx4sccXcJdvq127du5/tWrVynY933//vZ555hk1atRIEyZMyNZ9/P39dffdd2vx4sWaPn26AgMD1aVLl2xvMy/8+OOPGjRokEqUKKGYmJgrXs+lf3+MMXrzzTfl4+Ojtm3bSvp7/+BwONL8ZMKCBQs81nP8+PE063YdAcxo33Du3Dn3qaQuVatWVfHixYvU/qSo4cgP8lWtWrXUunVrNWrUSCVLltQPP/ygefPmeVyw6JqOeODAgYqOjpa3t7ceeOAB3Xnnnbr11lv17LPPau/evapfv76WLVumzz//XIMGDXJ/a9eoUSN169ZNU6ZM0bFjx9xTXbu+DcrON47BwcFq2bKlJk6cqOTkZJUvX17Lli3Lt2+H69evr169eumdd95xnxa0ceNGzZo1S3fddZduvfXWPN3+HXfcoc8++0x33323OnXqpD179uitt95SrVq1PD4UZPc5yU9dunTR/Pnz0722Jy4uTpUqVbriUxH69eunt99+W71791Z8fLwqV66sefPm6dtvv9WUKVOu+Lz1H3/8Ud27d1fHjh3VokUL97Tds2bN0sGDBzVlypRcOQ2oatWqmjNnjnta9ocfflh16tRRUlKS1q1b5562+1IHDhxI99vLoKAg3XXXXRlua/jw4Zo9e7Y6dOigp556yj3VtevomUvz5s1VokQJ9erVSwMHDpTD4dDs2bPTPQWsUaNGmjt3roYMGaKbbrpJQUFBuvPOO7P9es1Ily5dNGbMGK1evVrt27f3WPbmm2/q5MmTOnjwoKS/pwv/448/JP09iUpOr9O4Wl9++aV+/PFHSX+fMvTTTz9p7Nixkv7+dt91/eQ999yjZs2aqU+fPtq+fbtKly6t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HFFCQoImTJigDh06aNmyZbr77rvVtWtXrV69WlLR2idPnTpVtWrVUoUKFeTr66sOHTooNjZWLVu2lFQ4a83LzwsZ9Tl9+rTOnz+fF+VkKr1aL3f06FGNGTNG/fr1c7cVtlozqnPw4MFq3ry5unTpku79CludklQs37eIa1ZMTIy2bt2qb775pqCHkut+//13PfXUU4qLi5Ofn19BDydPpaamqnHjxho3bpwkqWHDhtq6daveeust9erVq4BHl7s+/vhjffDBB5ozZ45q166tLVu2aNCgQYqIiChyteLvyQ/uu+8+GWM0ffr0gh5OroqPj9frr7+uTZs2yeFwFPRw8lRqaqokqUuXLho8eLAkqUGDBlq3bp3eeusttWrVqiCHl+umTp2q7777Tl988YUiIyO1Zs0axcTEKCIiIs234YVFUf68cLmsaj19+rQ6deqkWrVqaeTIkfk7uFyUXp1ffPGFVq5cqc2bNxfgyHIfR36uUOnSpeXt7Z1mFpPDhw+ne1jwWjdgwAAtXLhQq1atUoUKFdzt4eHhSkpK0smTJz36X1pneHh4uo+Da9m1ID4+XkeOHNGNN96oYsWKqVixYlq9erXeeOMNFStWTGFhYUWiTkkqV66catWq5dF2ww03uGdRco01s9dueHi4jhw54rH84sWLOn78+DVV67Bhw9xHf+rWrauePXtq8ODB7qN7RanWS+VWXYXlNS39X/DZt2+f4uLi3Ed9pKJR69q1a3XkyBFVqlTJvY/at2+fhg4dqsqVK0sqGnVKf//9LFasWJb7qaKwTz5//rz+9a9/adKkSbrzzjtVr149DRgwQPfff79effVVSYWv1rz+vJBRn+DgYPn7++d2OZnKqFaXM2fOqEOHDipevLjmz58vHx8f97LCVGtGda5cuVK//fabQkND3fslSerWrZtat26daQ2uZZn1KYjnVCL8XDFfX181atRIK1ascLelpqZqxYoVioqKKsCR5YwxRgMGDND8+fO1cuVKValSxWN5o0aN5OPj41Hnjh07tH//fnedUVFR+vnnnz3+KLs+nFz+x62gtG3bVj///LO2bNni/te4cWP16NHD/f9FoU5Juvnmm9NMVblz505FRkZKkqpUqaLw8HCPWk+fPq0NGzZ41Hry5EnFx8e7+6xcuVKpqalq2rRpPlSRPefOnZOXl+duzNvb2/3NclGq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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "bins = np.linspace(0,2400,13)\n", + "plt.figure(figsize=(10,8))\n", + "plt.hist(nao_nrs, bins=bins)\n", + "plt.xlabel(\"nao_nr()\")\n", + "plt.xticks(bins)\n", + "plt.grid()\n", + "plt.title(\"Histogram of nao_nr() for SPICE data (1 in 10) with 'def2-TZVPPD' basis\");\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Within the present sample of molecules, the maximum number of atomic orbital is 2273.0\n" + ] + } + ], + "source": [ + "print(f\"Within the present sample of molecules, the maximum number of atomic orbital is {max(nao_nrs)}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's have a look at one of the entries of the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "entry = \"val-met\"\n", + "mol_str = get_mol_str_list_spice(f, entry=entry)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1188" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "m = build_mol(mol_str, basis_name=\"def2-TZVPPD\")\n", + "m.nao_nr()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "129" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "build_mol(mol_str, basis_name=\"sto-3g\").nao_nr()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`def2-TZVPPD` results in >9x the `sto-3g` orbitals.\n", + "\n", + "Let's see what happens if one tries to compute the ERIs with the 8-fold symmetry accounted for." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "ename": "MemoryError", + "evalue": "Unable to allocate 1.81 TiB for an array with shape (249406184511,) and data type float64", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mMemoryError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/nethome/paolot/workspace/dev/DFT/pyscf-ipu/notebooks/SPICE-nao_nr.ipynb Cell 18\u001b[0m line \u001b[0;36m1\n\u001b[0;32m----> 1\u001b[0m ERI \u001b[39m=\u001b[39m m\u001b[39m.\u001b[39;49mintor(\u001b[39m\"\u001b[39;49m\u001b[39mint2e_sph\u001b[39;49m\u001b[39m\"\u001b[39;49m, aosym\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39ms8\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n", + "File \u001b[0;32m~/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages/pyscf/gto/mole.py:3489\u001b[0m, in \u001b[0;36mMole.intor\u001b[0;34m(self, intor, comp, hermi, aosym, out, shls_slice, grids)\u001b[0m\n\u001b[1;32m 3487\u001b[0m env[NGRIDS] \u001b[39m=\u001b[39m grids\u001b[39m.\u001b[39mshape[\u001b[39m0\u001b[39m]\n\u001b[1;32m 3488\u001b[0m env[PTR_GRIDS] \u001b[39m=\u001b[39m env\u001b[39m.\u001b[39msize \u001b[39m-\u001b[39m grids\u001b[39m.\u001b[39msize\n\u001b[0;32m-> 3489\u001b[0m \u001b[39mreturn\u001b[39;00m moleintor\u001b[39m.\u001b[39;49mgetints(intor, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_atm, bas, env,\n\u001b[1;32m 3490\u001b[0m shls_slice, comp, hermi, aosym, out\u001b[39m=\u001b[39;49mout)\n", + "File \u001b[0;32m~/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages/pyscf/gto/moleintor.py:240\u001b[0m, in \u001b[0;36mgetints\u001b[0;34m(intor_name, atm, bas, env, shls_slice, comp, hermi, aosym, ao_loc, cintopt, out)\u001b[0m\n\u001b[1;32m 237\u001b[0m \u001b[39mreturn\u001b[39;00m getints2c(intor_name, atm, bas, env, shls_slice, comp,\n\u001b[1;32m 238\u001b[0m hermi, ao_loc, cintopt, out)\n\u001b[1;32m 239\u001b[0m \u001b[39melif\u001b[39;00m intor_name\u001b[39m.\u001b[39mstartswith(\u001b[39m'\u001b[39m\u001b[39mint2e\u001b[39m\u001b[39m'\u001b[39m) \u001b[39mor\u001b[39;00m intor_name\u001b[39m.\u001b[39mstartswith(\u001b[39m'\u001b[39m\u001b[39mint4c1e\u001b[39m\u001b[39m'\u001b[39m):\n\u001b[0;32m--> 240\u001b[0m \u001b[39mreturn\u001b[39;00m getints4c(intor_name, atm, bas, env, shls_slice, comp,\n\u001b[1;32m 241\u001b[0m aosym, ao_loc, cintopt, out)\n\u001b[1;32m 242\u001b[0m \u001b[39melif\u001b[39;00m intor_name\u001b[39m.\u001b[39mstartswith(\u001b[39m'\u001b[39m\u001b[39mint3c\u001b[39m\u001b[39m'\u001b[39m):\n\u001b[1;32m 243\u001b[0m \u001b[39mreturn\u001b[39;00m getints3c(intor_name, atm, bas, env, shls_slice, comp,\n\u001b[1;32m 244\u001b[0m aosym, ao_loc, cintopt, out)\n", + "File \u001b[0;32m~/workspace/dev/d4ft-ipu/popsdk-venvs/poplar_sdk-ubuntu_20_04-3.2.0+1277-7cd8ade3cd/3.2.0+1277_poptorch/lib/python3.8/site-packages/pyscf/gto/moleintor.py:598\u001b[0m, in \u001b[0;36mgetints4c\u001b[0;34m(intor_name, atm, bas, env, shls_slice, comp, aosym, ao_loc, cintopt, out)\u001b[0m\n\u001b[1;32m 596\u001b[0m nao \u001b[39m=\u001b[39m ao_loc[\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m]\n\u001b[1;32m 597\u001b[0m nao_pair \u001b[39m=\u001b[39m nao\u001b[39m*\u001b[39m(nao\u001b[39m+\u001b[39m\u001b[39m1\u001b[39m)\u001b[39m/\u001b[39m\u001b[39m/\u001b[39m\u001b[39m2\u001b[39m\n\u001b[0;32m--> 598\u001b[0m out \u001b[39m=\u001b[39m numpy\u001b[39m.\u001b[39;49mndarray((nao_pair\u001b[39m*\u001b[39;49m(nao_pair\u001b[39m+\u001b[39;49m\u001b[39m1\u001b[39;49m)\u001b[39m/\u001b[39;49m\u001b[39m/\u001b[39;49m\u001b[39m2\u001b[39;49m), buffer\u001b[39m=\u001b[39;49mout)\n\u001b[1;32m 599\u001b[0m \u001b[39mif\u001b[39;00m nao_pair \u001b[39m==\u001b[39m \u001b[39m0\u001b[39m:\n\u001b[1;32m 600\u001b[0m \u001b[39mreturn\u001b[39;00m out\n", + "\u001b[0;31mMemoryError\u001b[0m: Unable to allocate 1.81 TiB for an array with shape (249406184511,) and data type float64" + ] + } + ], + "source": [ + "ERI = m.intor(\"int2e_sph\", aosym=\"s8\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's check the shape of the output tensor and the size of the array" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1188.5003155235786" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(249_406_184_511 * 8)**0.25" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'1,995,249,476,088'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f\"{249_406_184_511 * 8:,d}\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As an aside, let's check in what units the coordinates are given in the conformations. Let's compute the minimum interatomic distance for the molecule. It should be around 90pm, 0.9 angstrom, the length of the O-H bond. " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "import operator\n", + "\n", + "def min_interatomic_distance(mol_str):\n", + " \"\"\"This computes the minimum distance between atoms.\"\"\"\n", + " coords = map(operator.itemgetter(1), mol_str) \n", + " distances = map(\n", + " lambda x: np.linalg.norm(x[0] - x[1]),\n", + " itertools.combinations(coords, 2)\n", + " )\n", + " return min(distances)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.844831" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "min_interatomic_distance(mol_str=mol_str)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This value of the minimum interatomic distance suggests that the unit for the coordinates in the conformations is `bohr`.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/binom_factor_table.ipynb b/notebooks/binom_factor_table.ipynb new file mode 100644 index 0000000..ee2258e --- /dev/null +++ b/notebooks/binom_factor_table.ipynb @@ -0,0 +1,532 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from jax.scipy.special import betaln, gammainc, gammaln\n", + "import numpy as np\n", + "from sympy import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Table lookup for \"binom factor\"\n", + "\n", + "The function called \"binom factor\" is one of those with a variable-sized loop, \n", + "which is tricky to vectorize. Its definition is\n", + "$$\n", + "B(i,j,a,b,s) = \\sum_{n=s-i}^j \\binom{i}{s-n} \\binom{j}{n} a^{i-(s-n)} b^{j-n}\n", + "$$\n", + "\n", + "Its arguments are three integers $(i,j,s)$ and two floats. It can't be a lookup table because of the floats, and it can't be a simple table of functions because JAX would not be impressed.\n", + "\n", + "But... For a given $i,j,s$ we know it will be a polynomial in $(a,b)$:\n", + "$$\n", + "B(i,j,a,b,s) = \\sum_{p=1}^{max} \\sum_{q=1}^{max} w^{i,j,s}_{p,q} a^p b^q\n", + "$$\n", + "\n", + "This notebook computes those weights. If max=5, that is a 5x5x5x25 array." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "kilobytes=12.20703125\n" + ] + } + ], + "source": [ + "kilobytes = 5*5*5*25 * 4 / 1024\n", + "print(f'{kilobytes=}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In fact, they are all small integers and it is sparse, so it could be less, but certainly not a huge memory burden." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(0, 0, 0) 1\n", + "(0, 0, 1) 0\n", + "(0, 0, 2) 0\n", + "(0, 0, 3) 0\n", + "(0, 1, 0) b\n", + "(0, 1, 1) 1\n", + "(0, 1, 2) 0\n", + "(0, 1, 3) 0\n", + "(0, 2, 0) b**2\n", + "(0, 2, 1) 2*b\n", + "(0, 2, 2) 1\n", + "(0, 2, 3) 0\n", + "(0, 3, 0) b**3\n", + "(0, 3, 1) 3*b**2\n", + "(0, 3, 2) 3*b\n", + "(0, 3, 3) 1\n", + "(1, 0, 0) a\n", + "(1, 0, 1) 1\n", + "(1, 0, 2) 0\n", + "(1, 0, 3) 0\n", + "(1, 1, 0) a*b\n", + "(1, 1, 1) a + b\n", + "(1, 1, 2) 1\n", + "(1, 1, 3) 0\n", + "(1, 2, 0) a*b**2\n", + "(1, 2, 1) 2*a*b + b**2\n", + "(1, 2, 2) a + 2*b\n", + "(1, 2, 3) 1\n", + "(1, 3, 0) a*b**3\n", + "(1, 3, 1) 3*a*b**2 + b**3\n", + "(1, 3, 2) 3*a*b + 3*b**2\n", + "(1, 3, 3) a + 3*b\n", + "(2, 0, 0) a**2\n", + "(2, 0, 1) 2*a\n", + "(2, 0, 2) 1\n", + "(2, 0, 3) 0\n", + "(2, 1, 0) a**2*b\n", + "(2, 1, 1) a**2 + 2*a*b\n", + "(2, 1, 2) 2*a + b\n", + "(2, 1, 3) 1\n", + "(2, 2, 0) a**2*b**2\n", + "(2, 2, 1) 2*a**2*b + 2*a*b**2\n", + "(2, 2, 2) a**2 + 4*a*b + b**2\n", + "(2, 2, 3) 2*a + 2*b\n", + "(2, 3, 0) a**2*b**3\n", + "(2, 3, 1) 3*a**2*b**2 + 2*a*b**3\n", + "(2, 3, 2) 3*a**2*b + 6*a*b**2 + b**3\n", + "(2, 3, 3) a**2 + 6*a*b + 3*b**2\n", + "(3, 0, 0) a**3\n", + "(3, 0, 1) 3*a**2\n", + "(3, 0, 2) 3*a\n", + "(3, 0, 3) 1\n", + "(3, 1, 0) a**3*b\n", + "(3, 1, 1) a**3 + 3*a**2*b\n", + "(3, 1, 2) 3*a**2 + 3*a*b\n", + "(3, 1, 3) 3*a + b\n", + "(3, 2, 0) a**3*b**2\n", + "(3, 2, 1) 2*a**3*b + 3*a**2*b**2\n", + "(3, 2, 2) a**3 + 6*a**2*b + 3*a*b**2\n", + "(3, 2, 3) 3*a**2 + 6*a*b + b**2\n", + "(3, 3, 0) a**3*b**3\n", + "(3, 3, 1) 3*a**3*b**2 + 3*a**2*b**3\n", + "(3, 3, 2) 3*a**3*b + 9*a**2*b**2 + 3*a*b**3\n", + "(3, 3, 3) a**3 + 9*a**2*b + 9*a*b**2 + b**3\n" + ] + }, + { + "data": { + "text/latex": [ + "$\\displaystyle a^{3} + 9 a^{2} b + 9 a b^{2} + b^{3}$" + ], + "text/plain": [ + "a**3 + 9*a**2*b + 9*a*b**2 + b**3" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "def binom(x, y):\n", + " approx = 1.0 / ((x + 1) * np.exp(betaln(x - y + 1, y + 1)))\n", + " return int(np.rint(approx))\n", + "\n", + "def binom_factor(i: int, j: int, a: float, b: float, s: int):\n", + " out = 0\n", + " for t in range(max(s - i, 0), j + 1):\n", + " assert ((s - i) <= t) & (t <= j)\n", + " val = binom(i, s - t) * binom(j, t) * a ** (i - (s - t)) * b ** (j - t)\n", + " out += val\n", + " return out\n", + "\n", + "a,b = symbols(\"a b\", real=True)\n", + "LMAX = 4\n", + "for i in range(LMAX):\n", + " for j in range(LMAX):\n", + " for s in range(LMAX):\n", + " bf = binom_factor(i,j,a,b,s)\n", + " print((i,j,s),bf)\n", + "\n", + "bf" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{1: 0,\n", + " b**2: 0,\n", + " b**3: 1,\n", + " a**2: 0,\n", + " a**3: 1,\n", + " a**2*b**2: 0,\n", + " a**3*b**2: 0,\n", + " a*b**2: 9,\n", + " a**2*b**3: 0,\n", + " a**3*b**3: 0,\n", + " a*b**3: 0,\n", + " a**2*b: 9,\n", + " a**3*b: 0,\n", + " a*b: 0,\n", + " b: 0,\n", + " a: 0}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# https://stackoverflow.com/questions/74731353/is-there-any-all-coeffs-for-multivariable-polynomials-in-sympy\n", + "def all_coeffs(expr,*free):\n", + " x = IndexedBase('x')\n", + " expr = expr.expand()\n", + " free = list(free) or list(expr.free_symbols)\n", + " pows = [p.as_base_exp() for p in expr.atoms(Pow,Symbol)]\n", + " P = {}\n", + " for p,e in pows:\n", + " if p not in free:\n", + " continue\n", + " elif p not in P:\n", + " P[p]=e\n", + " elif e>P[p]:\n", + " P[p] = e\n", + " reps = dict([(f, x[i]) for i,f in enumerate(free)])\n", + " xzero = dict([(v,0) for k,v in reps.items()])\n", + " e = expr.xreplace(reps); reps = {v:k for k,v in reps.items()}\n", + " return dict([(m.xreplace(reps), e.coeff(m).xreplace(xzero) if m!=1 else e.xreplace(xzero)) for m in monoms(*[P[f] for f in free])])\n", + "\n", + "def monoms(*o):\n", + " x = IndexedBase('x')\n", + " f = []\n", + " for i,o in enumerate(o):\n", + " f.append(Poly([1]*(o+1),x[i]).as_expr())\n", + " return Mul(*f).expand().args\n", + "\n", + "all_coeffs(S(bf))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "25" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\left( 1, \\ a b^{2}, \\ b^{4}, \\ a b, \\ b, \\ a^{3} b^{2}, \\ a^{4} b^{3}, \\ a^{4}, \\ a^{4} b^{4}, \\ a^{2} b^{3}, \\ a^{2} b, \\ b^{3}, \\ a^{2} b^{4}, \\ a^{3}, \\ a^{3} b, \\ a, \\ a^{3} b^{3}, \\ a b^{3}, \\ a^{3} b^{4}, \\ a b^{4}, \\ a^{4} b^{2}, \\ b^{2}, \\ a^{2}, \\ a^{2} b^{2}, \\ a^{4} b\\right)$" + ], + "text/plain": [ + "(1, a*b**2, b**4, a*b, b, a**3*b**2, a**4*b**3, a**4, a**4*b**4, a**2*b**3, a**2*b, b**3, a**2*b**4, a**3, a**3*b, a, a**3*b**3, a*b**3, a**3*b**4, a*b**4, a**4*b**2, b**2, a**2, a**2*b**2, a**4*b)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(0, 0, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(0, 0, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(0, 0, 2) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(0, 0, 3) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(0, 0, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(0, 1, 0) [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] b\n", + "(0, 1, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(0, 1, 2) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(0, 1, 3) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(0, 1, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(0, 2, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0] b**2\n", + "(0, 2, 1) [0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2*b\n", + "(0, 2, 2) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(0, 2, 3) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(0, 2, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(0, 3, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] b**3\n", + "(0, 3, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0] 3*b**2\n", + "(0, 3, 2) [0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 3*b\n", + "(0, 3, 3) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(0, 3, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(0, 4, 0) [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] b**4\n", + "(0, 4, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4*b**3\n", + "(0, 4, 2) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0] 6*b**2\n", + "(0, 4, 3) [0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4*b\n", + "(0, 4, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(1, 0, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] a\n", + "(1, 0, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(1, 0, 2) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(1, 0, 3) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(1, 0, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(1, 1, 0) [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a*b\n", + "(1, 1, 1) [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] a + b\n", + "(1, 1, 2) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(1, 1, 3) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(1, 1, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(1, 2, 0) [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a*b**2\n", + "(1, 2, 1) [0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0] 2*a*b + b**2\n", + "(1, 2, 2) [0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] a + 2*b\n", + "(1, 2, 3) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(1, 2, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(1, 3, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0] a*b**3\n", + "(1, 3, 1) [0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 3*a*b**2 + b**3\n", + "(1, 3, 2) [0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0] 3*a*b + 3*b**2\n", + "(1, 3, 3) [0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] a + 3*b\n", + "(1, 3, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(1, 4, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0] a*b**4\n", + "(1, 4, 1) [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0] 4*a*b**3 + b**4\n", + "(1, 4, 2) [0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 6*a*b**2 + 4*b**3\n", + "(1, 4, 3) [0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0] 4*a*b + 6*b**2\n", + "(1, 4, 4) [0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] a + 4*b\n", + "(2, 0, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0] a**2\n", + "(2, 0, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2*a\n", + "(2, 0, 2) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(2, 0, 3) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(2, 0, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(2, 1, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**2*b\n", + "(2, 1, 1) [0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0] a**2 + 2*a*b\n", + "(2, 1, 2) [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2*a + b\n", + "(2, 1, 3) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(2, 1, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(2, 2, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0] a**2*b**2\n", + "(2, 2, 1) [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2*a**2*b + 2*a*b**2\n", + "(2, 2, 2) [0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0] a**2 + 4*a*b + b**2\n", + "(2, 2, 3) [0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2*a + 2*b\n", + "(2, 2, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(2, 3, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**2*b**3\n", + "(2, 3, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0] 3*a**2*b**2 + 2*a*b**3\n", + "(2, 3, 2) [0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 3*a**2*b + 6*a*b**2 + b**3\n", + "(2, 3, 3) [0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0] a**2 + 6*a*b + 3*b**2\n", + "(2, 3, 4) [0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2*a + 3*b\n", + "(2, 4, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**2*b**4\n", + "(2, 4, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0] 4*a**2*b**3 + 2*a*b**4\n", + "(2, 4, 2) [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 6, 0] 6*a**2*b**2 + 8*a*b**3 + b**4\n", + "(2, 4, 3) [0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4*a**2*b + 12*a*b**2 + 4*b**3\n", + "(2, 4, 4) [0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0] a**2 + 8*a*b + 6*b**2\n", + "(3, 0, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**3\n", + "(3, 0, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0] 3*a**2\n", + "(3, 0, 2) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0] 3*a\n", + "(3, 0, 3) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(3, 0, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0\n", + "(3, 1, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**3*b\n", + "(3, 1, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**3 + 3*a**2*b\n", + "(3, 1, 2) [0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0] 3*a**2 + 3*a*b\n", + "(3, 1, 3) [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0] 3*a + b\n", + "(3, 1, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(3, 2, 0) [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**3*b**2\n", + "(3, 2, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0] 2*a**3*b + 3*a**2*b**2\n", + "(3, 2, 2) [0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**3 + 6*a**2*b + 3*a*b**2\n", + "(3, 2, 3) [0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0] 3*a**2 + 6*a*b + b**2\n", + "(3, 2, 4) [0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0] 3*a + 2*b\n", + "(3, 3, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0] a**3*b**3\n", + "(3, 3, 1) [0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 3*a**3*b**2 + 3*a**2*b**3\n", + "(3, 3, 2) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 9, 0] 3*a**3*b + 9*a**2*b**2 + 3*a*b**3\n", + "(3, 3, 3) [0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**3 + 9*a**2*b + 9*a*b**2 + b**3\n", + "(3, 3, 4) [0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0] 3*a**2 + 9*a*b + 3*b**2\n", + "(3, 4, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0] a**3*b**4\n", + "(3, 4, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0] 4*a**3*b**3 + 3*a**2*b**4\n", + "(3, 4, 2) [0, 0, 0, 0, 0, 6, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0] 6*a**3*b**2 + 12*a**2*b**3 + 3*a*b**4\n", + "(3, 4, 3) [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 12, 0, 0, 0, 0, 0, 18, 0] 4*a**3*b + 18*a**2*b**2 + 12*a*b**3 + b**4\n", + "(3, 4, 4) [0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 12, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**3 + 12*a**2*b + 18*a*b**2 + 4*b**3\n", + "(4, 0, 0) [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**4\n", + "(4, 0, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4*a**3\n", + "(4, 0, 2) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0] 6*a**2\n", + "(4, 0, 3) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4*a\n", + "(4, 0, 4) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1\n", + "(4, 1, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] a**4*b\n", + "(4, 1, 1) [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**4 + 4*a**3*b\n", + "(4, 1, 2) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4*a**3 + 6*a**2*b\n", + "(4, 1, 3) [0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0] 6*a**2 + 4*a*b\n", + "(4, 1, 4) [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4*a + b\n", + "(4, 2, 0) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0] a**4*b**2\n", + "(4, 2, 1) [0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2] 2*a**4*b + 4*a**3*b**2\n", + "(4, 2, 2) [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0] a**4 + 8*a**3*b + 6*a**2*b**2\n", + "(4, 2, 3) [0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4*a**3 + 12*a**2*b + 4*a*b**2\n", + "(4, 2, 4) [0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 0, 0] 6*a**2 + 8*a*b + b**2\n", + "(4, 3, 0) [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**4*b**3\n", + "(4, 3, 1) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0] 3*a**4*b**2 + 4*a**3*b**3\n", + "(4, 3, 2) [0, 0, 0, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3] 3*a**4*b + 12*a**3*b**2 + 6*a**2*b**3\n", + "(4, 3, 3) [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 12, 0, 0, 4, 0, 0, 0, 0, 0, 18, 0] a**4 + 12*a**3*b + 18*a**2*b**2 + 4*a*b**3\n", + "(4, 3, 4) [0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 18, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4*a**3 + 18*a**2*b + 12*a*b**2 + b**3\n", + "(4, 4, 0) [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] a**4*b**4\n", + "(4, 4, 1) [0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0] 4*a**4*b**3 + 4*a**3*b**4\n", + "(4, 4, 2) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 16, 0, 0, 0, 6, 0, 0, 0, 0] 6*a**4*b**2 + 16*a**3*b**3 + 6*a**2*b**4\n", + "(4, 4, 3) [0, 0, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4] 4*a**4*b + 24*a**3*b**2 + 24*a**2*b**3 + 4*a*b**4\n", + "(4, 4, 4) [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 0, 0, 36, 0] a**4 + 16*a**3*b + 36*a**2*b**2 + 16*a*b**3 + b**4\n" + ] + } + ], + "source": [ + "LMAX = 5\n", + "all_monoms = set()\n", + "for i in range(LMAX):\n", + " for j in range(LMAX):\n", + " for s in range(LMAX):\n", + " bf = binom_factor(i,j,a,b,s)\n", + " coefs = all_coeffs(S(bf))\n", + " all_monoms = all_monoms.union(set(coefs.keys()))\n", + "all_monoms = tuple(all_monoms)\n", + "n = len(all_monoms)\n", + "display(n, S(all_monoms))\n", + "#monom_map = {k:i for i,k in enumerate(all_monoms)}\n", + "\n", + "weights = np.zeros((LMAX, LMAX, LMAX, n))\n", + "for i in range(LMAX):\n", + " for j in range(LMAX):\n", + " for s in range(LMAX):\n", + " bf = binom_factor(i,j,a,b,s)\n", + " coefs = all_coeffs(S(bf))\n", + " #display(bf, S(coefs))\n", + " val = [coefs.get(monom, 0) for monom in all_monoms]\n", + " print((i,j,s), val, bf)\n", + " weights[i,j,s,:] = val" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", + " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", + " 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n", + " 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n", + " 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n", + " 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n", + " 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]),\n", + " array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3,\n", + " 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 1, 1, 1, 1, 1, 2, 2,\n", + " 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,\n", + " 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,\n", + " 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,\n", + " 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,\n", + " 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,\n", + " 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]),\n", + " array([0, 0, 1, 0, 1, 2, 0, 1, 2, 3, 0, 0, 1, 1, 0, 1, 1, 2, 2, 0, 1, 1,\n", + " 2, 2, 3, 3, 0, 1, 1, 2, 2, 3, 3, 4, 4, 0, 1, 0, 1, 1, 2, 2, 0, 1,\n", + " 1, 2, 2, 2, 3, 3, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 0, 1, 1, 2, 2,\n", + " 2, 3, 3, 3, 4, 4, 4, 0, 1, 2, 0, 1, 1, 2, 2, 3, 3, 0, 1, 1, 2, 2,\n", + " 2, 3, 3, 3, 4, 4, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 0, 1, 1,\n", + " 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 0, 1, 2, 3, 0, 1, 1, 2, 2, 3, 3,\n", + " 4, 4, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 0, 1, 1, 2, 2, 2, 3, 3,\n", + " 3, 3, 4, 4, 4, 4, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4]),\n", + " array([ 4, 21, 4, 11, 21, 4, 2, 11, 21, 4, 15, 3, 4, 15, 1, 3, 21,\n", + " 4, 15, 17, 1, 11, 3, 21, 4, 15, 19, 2, 17, 1, 11, 3, 21, 4,\n", + " 15, 22, 15, 10, 3, 22, 4, 15, 23, 1, 10, 3, 21, 22, 4, 15, 9,\n", + " 17, 23, 1, 10, 11, 3, 21, 22, 4, 15, 12, 9, 19, 2, 17, 23, 1,\n", + " 10, 11, 3, 21, 22, 13, 22, 15, 14, 10, 13, 3, 22, 4, 15, 5, 14,\n", + " 23, 1, 10, 13, 3, 21, 22, 4, 15, 16, 5, 9, 14, 17, 23, 1, 10,\n", + " 11, 13, 3, 21, 22, 18, 12, 16, 5, 9, 19, 2, 14, 17, 23, 1, 10,\n", + " 11, 13, 7, 13, 22, 15, 24, 7, 14, 10, 13, 3, 22, 4, 15, 20, 5,\n", + " 24, 7, 14, 23, 1, 10, 13, 3, 21, 22, 6, 16, 20, 5, 9, 24, 7,\n", + " 14, 17, 23, 1, 10, 11, 13, 8, 6, 18, 12, 16, 20, 5, 9, 19, 24,\n", + " 2, 7, 14, 17, 23])),\n", + " array([ 1., 1., 2., 1., 3., 3., 1., 4., 6., 4., 1., 1., 1.,\n", + " 1., 1., 2., 1., 2., 1., 1., 3., 1., 3., 3., 3., 1.,\n", + " 1., 1., 4., 6., 4., 4., 6., 4., 1., 1., 2., 1., 2.,\n", + " 1., 1., 2., 1., 2., 2., 4., 1., 1., 2., 2., 1., 2.,\n", + " 3., 6., 3., 1., 6., 3., 1., 3., 2., 1., 4., 2., 1.,\n", + " 8., 6., 12., 4., 4., 8., 6., 1., 1., 3., 3., 1., 3.,\n", + " 1., 3., 3., 1., 3., 1., 2., 3., 3., 6., 1., 6., 1.,\n", + " 3., 2., 3., 1., 3., 3., 3., 3., 9., 9., 9., 1., 1.,\n", + " 9., 3., 3., 1., 3., 4., 6., 12., 3., 1., 4., 12., 18.,\n", + " 18., 12., 4., 1., 1., 4., 6., 4., 1., 1., 4., 6., 4.,\n", + " 4., 6., 1., 4., 1., 4., 2., 1., 8., 6., 4., 12., 4.,\n", + " 8., 1., 6., 1., 4., 3., 12., 6., 3., 1., 12., 4., 18.,\n", + " 12., 18., 1., 4., 1., 4., 4., 6., 16., 6., 24., 24., 4.,\n", + " 4., 1., 1., 16., 16., 36.]))" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inds = np.nonzero(weights)\n", + "inds, weights[inds]\n", + "\n", + "with open(\"../pyscf_ipu/experimental/binom_factor_table.py\", \"w\") as f:\n", + " print(\"# Copyright (c) 2023 Graphcore Ltd. All rights reserved.\", file=f)\n", + " print(\"# AUTOGENERATED from notebooks/binom_factor_table.ipynb\", file=f)\n", + " print(\"# fmt: off\", file=f)\n", + " print(\"# flake8: noqa\", file=f)\n", + " print(\"# isort: skip_file\", file=f)\n", + " print(\"from numpy import array\", file=f)\n", + " print(\"binom_factor_table = \", repr((inds, weights[inds])), file=f)\n", + "\n", + "import pyscf_ipu.experimental.binom_factor_table\n", + "\n", + "pyscf_ipu.experimental.binom_factor_table.binom_factor_table" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "jaxipu", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.18" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/gammanu.ipynb b/notebooks/gammanu.ipynb new file mode 100644 index 0000000..35ad4e2 --- /dev/null +++ b/notebooks/gammanu.ipynb @@ -0,0 +1,1128 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Copyright (c) 2023 Graphcore Ltd. All rights reserved.*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation of the auxiliary gamma function\n", + "\n", + "The evaluation of integrals involving a $\\frac{1}{r}$ term require computing the following:\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{1}\n", + "F(\\nu, t) = \\int_0^1 u^{2 \\nu} e^{-t u^2} du\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Taketa et al. call this the auxiliary function $F$ and we can show its relationship to the $\\gamma$ function with SymPy.\n", + "First we build up the integral as stated in equation 2.11 in the THO paper." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "sns.set_theme()\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\int\\limits_{0}^{1} u^{2 \\nu} e^{- t u^{2}}\\, du$" + ], + "text/plain": [ + "Integral(u**(2*nu)*exp(-t*u**2), (u, 0, 1))" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sympy import *\n", + "\n", + "u, t = symbols(\"u t\", real=True, nonnegative=True)\n", + "nu = Symbol(\"nu\", integer=True, nonnegative=True)\n", + "F_nu = Integral(u ** (2 * nu) * exp(-t * u **2), (u, 0, 1))\n", + "F_nu" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Evaluating the integral results in an expression involving the [lower incomplete Gamma function](https://mathworld.wolfram.com/IncompleteGammaFunction.html)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{t^{- \\nu - \\frac{1}{2}} \\gamma\\left(\\nu + \\frac{1}{2}, t\\right)}{2}$" + ], + "text/plain": [ + "t**(-nu - 1/2)*lowergamma(nu + 1/2, t)/2" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "F_nu_expanded = simplify(F_nu.doit())\n", + "F_nu_expanded" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some implementations will fail at $t=0$, so let's re-evaluate the integral for that special case:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{1}{2 \\nu + 1}$" + ], + "text/plain": [ + "1/(2*nu + 1)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "F_nu_expanded_t0 = F_nu.subs(t, 0).doit()\n", + "F_nu_expanded_t0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using `lambdify` we can use SymPy to generate a scipy compatible implementation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function _lambdifygenerated:\n", + "\n", + "_lambdifygenerated(nu, t)\n", + " Created with lambdify. Signature:\n", + " \n", + " func(nu, t)\n", + " \n", + " Expression:\n", + " \n", + " t**(-nu - 1/2)*lowergamma(nu + 1/2, t)/2\n", + " \n", + " Source code:\n", + " \n", + " def _lambdifygenerated(nu, t):\n", + " return (1/2)*t**(-nu - 1/2)*gamma(nu + 1/2)*gammainc(nu + 1/2, t)\n", + " \n", + " \n", + " Imported modules:\n", + "\n" + ] + } + ], + "source": [ + "F_nu_lambdified = lambdify((nu, t), F_nu_expanded, modules=\"scipy\")\n", + "help(F_nu_lambdified)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We might need this lambda implementation later but for now let us see if SymPy can find a simpler way to evaluate this function for the integers 0, 1, 2, 3, ..." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\sqrt{\\pi} \\operatorname{erf}{\\left(\\sqrt{t} \\right)}}{2 \\sqrt{t}}$" + ], + "text/plain": [ + "sqrt(pi)*erf(sqrt(t))/(2*sqrt(t))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{e^{- t}}{2 t} + \\frac{\\sqrt{\\pi} \\operatorname{erf}{\\left(\\sqrt{t} \\right)}}{4 t^{\\frac{3}{2}}}$" + ], + "text/plain": [ + "-exp(-t)/(2*t) + sqrt(pi)*erf(sqrt(t))/(4*t**(3/2))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{e^{- t}}{2 t} - \\frac{3 e^{- t}}{4 t^{2}} + \\frac{3 \\sqrt{\\pi} \\operatorname{erf}{\\left(\\sqrt{t} \\right)}}{8 t^{\\frac{5}{2}}}$" + ], + "text/plain": [ + "-exp(-t)/(2*t) - 3*exp(-t)/(4*t**2) + 3*sqrt(pi)*erf(sqrt(t))/(8*t**(5/2))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\left(- 8 t^{\\frac{5}{2}} - 20 t^{\\frac{3}{2}} - 30 \\sqrt{t} + 15 \\sqrt{\\pi} e^{t} \\operatorname{erf}{\\left(\\sqrt{t} \\right)}\\right) e^{- t}}{16 t^{\\frac{7}{2}}}$" + ], + "text/plain": [ + "(-8*t**(5/2) - 20*t**(3/2) - 30*sqrt(t) + 15*sqrt(pi)*exp(t)*erf(sqrt(t)))*exp(-t)/(16*t**(7/2))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\left(- 16 t^{\\frac{7}{2}} - 56 t^{\\frac{5}{2}} - 140 t^{\\frac{3}{2}} - 210 \\sqrt{t} + 105 \\sqrt{\\pi} e^{t} \\operatorname{erf}{\\left(\\sqrt{t} \\right)}\\right) e^{- t}}{32 t^{\\frac{9}{2}}}$" + ], + "text/plain": [ + "(-16*t**(7/2) - 56*t**(5/2) - 140*t**(3/2) - 210*sqrt(t) + 105*sqrt(pi)*exp(t)*erf(sqrt(t)))*exp(-t)/(32*t**(9/2))" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(5):\n", + " display(simplify(F_nu_expanded.subs(nu, i)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This has a whiff of a recurrence but unfortunately SymPy doesn't seem to find it. Lets see if we can spot the pattern:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\sqrt{\\pi} \\operatorname{erf}{\\left(\\sqrt{t} \\right)}}{2 \\sqrt{t}}$" + ], + "text/plain": [ + "sqrt(pi)*erf(sqrt(t))/(2*sqrt(t))" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f_0 = simplify(F_nu_expanded.subs(nu, 0))\n", + "f_0" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{e^{- t}}{2 t} + \\frac{\\sqrt{\\pi} \\operatorname{erf}{\\left(\\sqrt{t} \\right)}}{4 t^{\\frac{3}{2}}}$" + ], + "text/plain": [ + "-exp(-t)/(2*t) + sqrt(pi)*erf(sqrt(t))/(4*t**(3/2))" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f_1 = simplify(1/(2* t) * (f_0 - exp(-t)))\n", + "f_1" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{e^{- t}}{2 t} - \\frac{3 e^{- t}}{4 t^{2}} + \\frac{3 \\sqrt{\\pi} \\operatorname{erf}{\\left(\\sqrt{t} \\right)}}{8 t^{\\frac{5}{2}}}$" + ], + "text/plain": [ + "-exp(-t)/(2*t) - 3*exp(-t)/(4*t**2) + 3*sqrt(pi)*erf(sqrt(t))/(8*t**(5/2))" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f_2 = simplify(1 / (2 * t) * (3 * f_1 - exp(-t)))\n", + "f_2" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left(- \\frac{1}{2 t} - \\frac{5}{4 t^{2}} - \\frac{15}{8 t^{3}}\\right) e^{- t} + \\frac{15 \\sqrt{\\pi} \\operatorname{erf}{\\left(\\sqrt{t} \\right)}}{16 t^{\\frac{7}{2}}}$" + ], + "text/plain": [ + "(-1/(2*t) - 5/(4*t**2) - 15/(8*t**3))*exp(-t) + 15*sqrt(pi)*erf(sqrt(t))/(16*t**(7/2))" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f_3 = collect(simplify(1 / (2 * t) * (5 * f_2 - exp(-t))), exp(-t))\n", + "f_3" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\left(- 16 t^{\\frac{19}{2}} - 14 t^{\\frac{13}{2}} \\cdot \\left(4 t^{2} + 10 t + 15\\right) + 105 \\sqrt{\\pi} t^{6} e^{t} \\operatorname{erf}{\\left(\\sqrt{t} \\right)}\\right) e^{- t}}{32 t^{\\frac{21}{2}}}$" + ], + "text/plain": [ + "(-16*t**(19/2) - 14*t**(13/2)*(4*t**2 + 10*t + 15) + 105*sqrt(pi)*t**6*exp(t)*erf(sqrt(t)))*exp(-t)/(32*t**(21/2))" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f_4 = simplify(1 / (2 * t) * (7 * f_3 - exp(-t)))\n", + "f_4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From this, we propose the following recurrence:\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + "\\tag{2}\n", + "F(0, t) &= \\frac{1}{2} \\text{erf}(\\sqrt{t}) \\sqrt{\\frac{\\pi}{t}} \\\\\n", + "F(\\nu, t) &= \\frac{1}{2 t} \\left( (2\\nu - 1) F(\\nu - 1, t) - e^{-t} \\right)\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "We test this recurrence out by comparing to the earlier lambda implementation derived by SymPy. We also compare this to the SymPy lambdafy implementation but implement a \"safe\" version as `Fnu_lambda_safe` which avoids the divide by zero warnings when $t=0$" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_959421/3085702436.py:4: RuntimeWarning: divide by zero encountered in divide\n", + " return np.where(t == 0, 1.0, erf(np.sqrt(t)) * np.sqrt(np.pi / (4 * t)))\n", + "/tmp/ipykernel_959421/3085702436.py:4: RuntimeWarning: invalid value encountered in multiply\n", + " return np.where(t == 0, 1.0, erf(np.sqrt(t)) * np.sqrt(np.pi / (4 * t)))\n", + "/tmp/ipykernel_959421/3085702436.py:11: RuntimeWarning: divide by zero encountered in divide\n", + " v = 1/ (2 * t) * ( (2 * nu - 1) * f_nu(nu-1, t) - np.exp(-t) )\n", + "/tmp/ipykernel_959421/3085702436.py:11: RuntimeWarning: invalid value encountered in multiply\n", + " v = 1/ (2 * t) * ( (2 * nu - 1) * f_nu(nu-1, t) - np.exp(-t) )\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nu = 0 max error = 3.6637359812630166e-15\n", + "nu = 1 max error = 1.942890293094024e-16\n", + "nu = 2 max error = 3.3306690738754696e-16\n", + "nu = 3 max error = 1.6237011735142914e-15\n", + "nu = 4 max error = 1.1310397063368782e-14\n", + "nu = 5 max error = 9.851147675377092e-14\n", + "nu = 6 max error = 1.0467876565556367e-12\n", + "nu = 7 max error = 1.3154359546074801e-11\n", + "nu = 8 max error = 1.9073770340938268e-10\n", + "nu = 9 max error = 3.1344563958257687e-09\n" + ] + }, + { + "data": { + "image/png": "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CxcuVF5enoYOHaqrr7661e1eeuklTZo0ScOHD9c111yjLVu2dHGlgdFevzU1NSosLNT111+v0aNH6+KLL9Ytt9yi3bt3h6jizuno+3vKm2++qYyMjHa3C3eElG9UVVVp+vTpamxsVGFhoebOnat169Zp2bJloS4tKFauXKn4+HjNnz9fy5cvV3Z2thYsWKCioqJQl9YlHn/8cbnd7lCXEXTLly/X4sWLdeWVV6qkpET333+/UlJSIrL3Dz74QLfddpvOO+88FRUV6Z577tE///lP5efnR0Qo27Nnj0pLS3XOOecoPT291W3+9re/acGCBcrNzdWKFSuUmZmp2267TTt27OjaYgOgvX4PHTqkF198UePHj9cjjzyixYsXq7q6WlOmTNG+fftCUHHndOT9PaW+vl5LlixRnz59uqi6ELJgWZZlPfHEE1ZmZqZ1/Pjx5rEXXnjBGjJkiHX48OHQFRYkX331VYuxe++917rooosst9sdgoq6zt69e63MzExr7dq11uDBg62dO3eGuqSg2LdvnzV06FDrv/7rv0JdSpdYsGCBlZOTY3k8nuax999/3xo8eLD13//93yGsLDBO/3d59913W1dddVWLbX74wx9ad911l9fYlClTrF/84hdBry/Q2uv3xIkTVm1trddYTU2NNWbMGOv+++/vkhoDqSPv7ymPPPKI9bOf/azd7SIBR1K+8c477ygrK0tJSUnNY7m5ufJ4PNq6dWvoCguS5OTkFmNDhgxRTU2NamtrQ1BR13nggQc0depUDRo0KNSlBNVf//pXpaSkaMKECaEupUs0NTUpISFBNputeaxXr16SFBGnMe32tr9dl5eX6/PPP1dubq7X+JVXXqn3338/7E5dt9dvjx49FB8f7zWWkJCgs88+W0eOHAlmaUHRXr+nHDhwQM8884zuvffeIFdkBkLKN8rKypSWluY15nQ61bdvX5WVlYWoqq61bds29e/fXz179gx1KUGzadMmffrpp5o9e3aoSwm6jz/+WIMHD9bjjz+urKwsDRs2TFOnTtXHH38c6tKC4tprr9W+ffu0Zs0aVVdXq7y8XA8//LCGDh2qiy66KNTlBd2p71PfDd/p6elqbGyMmGtz2uJyubRnz54W38sjyR/+8Afl5eXpe9/7XqhL6RKElG+4XC45nc4W44mJiaqqqgpBRV3rww8/1IYNG5Sfnx/qUoKmrq5Oy5Yt09y5cyM6iJ1y9OhRvfvuu3rttdf0+9//XkVFRbLZbMrPz9dXX30V6vICbvTo0Xrsscf00EMPafTo0Zo4caK++uorrVixQjExMaEuL+hOfZ/67vexU8+j4fvYH//4R9lsNv30pz8NdSlB8fbbb+ujjz7SnXfeGepSugwhBTp8+LDmzp2rsWPH6qabbgp1OUGzfPly/cu//Iuuu+66UJfSJSzLUm1trf785z9r8uTJmjBhgpYvXy7LsvTcc8+FuryA2759u37729/q3/7t3/Tss8/qz3/+szwej375y19GxIWzaNtf/vIXrVu3TgsXLtRZZ50V6nICrqGhQUuWLNHtt9/e6un6SBUb6gJM4XQ6VV1d3WK8qqpKiYmJIaioa7hcLs2aNUtJSUkqLCzs8HnRcHPw4EE9/fTTKioqan6fT117U1tbqxMnTighISGUJQac0+lUUlKS12HhpKQkDR06VHv37g1hZcHxwAMPaNy4cZo/f37zWGZmpi699FK99tprmjJlSgirC75T36eqq6vVt2/f5nGXy+X1eiQqLS3VwoULdeutt+onP/lJqMsJimeffVZ2u11XXXVV83va2Ngoj8cjl8ul7t27y+FwhLjKwCOkfCMtLa3FtSfV1dU6evRoxJ7frK+vV0FBgaqrq/Xiiy82X2QYib744gs1Njbql7/8ZYvXbrrpJo0cOVLr1q0LQWXBc9555+nAgQOtvtbQ0NDF1QTfvn37dPnll3uNnXXWWerdu/cZ/xwiyanvU9+9vq6srEzdunVTampqqEoLqh07dujOO+/Uj3/844g+DVJWVqb9+/crKyurxWvf//73dd9990XkaS5Cyjeys7P1xBNPeF2bsmnTJtntdo0fPz7E1QVeU1OT5syZo7KyMq1Zs0b9+/cPdUlBNWTIEK1atcpr7B//+IeWLl2qRYsWafjw4SGqLHguu+wy/fWvf9U//vEPDRkyRJJ0/PhxffLJJ5oxY0ZoiwuCAQMG6O9//7vX2MGDB3X8+HENHDgwRFV1ndTUVJ177rnatGmTJk6c2Dy+YcMGZWVlReT/svfu3auCggKNGzdOixYtCnU5QTVr1qwWR4mKi4v12WefaenSpTr33HNDU1iQEVK+MXXqVK1evVqzZ89WQUGBKioq9OCDD2rq1KkR+QN80aJF2rJli+bPn6+amhqvmz0NHTo04r6hOZ1OjR07ttXXLrjgAl1wwQVdXFHwTZw4UcOHD9cdd9yhuXPnKi4uTsXFxXI4HJo2bVqoywu4qVOnasmSJXrggQeUk5OjysrK5uuQvvux3HBUV1en0tJSSV+Hr5qaGm3atEmSNGbMGCUnJ+v222/XvHnzdPbZZ2vs2LHasGGDdu7cGZbXILXXr2VZmjlzpuLi4jR9+nTt2rWreW7Pnj113nnnhaRuf7XXb3p6eoubvL3yyiuqqKg44/e2SGCzIuEGAgGyb98+LV68WB999JESEhKUl5enuXPnRtwPbEnKycnRwYMHW33trbfeUkpKShdX1PU++OAD3XTTTXr55Zcj8kiKJB07dkxLly7Vli1b1NjYqNGjR+t3v/td2H0D7wjLsvTCCy9o7dq1Ki8vV0JCgjIzMzV37tx27+AZDr744osWp7NOWbVqVfMPqpdeekkrVqzQoUOHNGjQIN1111267LLLurLUgGivX0lnvNB/zJgxWr16ddBqC4aOvr+nmz9/vnbt2qX169cHu7yQIaQAAAAjReZHOQAAQNgjpAAAACMRUgAAgJEIKQAAwEiEFAAAYCRCCgAAMBIhBQAAGImQAgAAjERIAQAARiKkAAAAIxFSAACAkf4//hhhiCEItZsAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def f_0(t):\n", + " from scipy.special import erf \n", + "\n", + " return np.where(t == 0, 1.0, erf(np.sqrt(t)) * np.sqrt(np.pi / (4 * t)))\n", + "\n", + "\n", + "def f_nu(nu, t, epsilon=1e-10):\n", + " if nu == 0:\n", + " return f_0(t)\n", + "\n", + " v = 1/ (2 * t) * ( (2 * nu - 1) * f_nu(nu-1, t) - np.exp(-t) )\n", + " return np.where(t <= epsilon, 1 / (2 * nu + 1), v)\n", + "\n", + "\n", + "def Fnu_lambda_safe(nu, t, epsilon=1e-10):\n", + " \"\"\"nan safe implementation of F_nu_lambdafied\n", + " \"\"\"\n", + " from scipy.special import gammainc, gammaln\n", + "\n", + " te = np.maximum(t, epsilon)\n", + " v = np.exp(np.log(0.5) - (nu + 0.5) * np.log(te) + np.log(gammainc(nu + 0.5, te)) + gammaln(nu + 0.5))\n", + " return np.where(t <= epsilon, 1 / (2 * nu + 1), v)\n", + " \n", + "x = np.linspace(0, 15, 30)\n", + "\n", + "for n in range(10):\n", + " y1 = f_nu(n, x)\n", + " y2 = Fnu_lambda_safe(n, x)\n", + " e = np.abs(y1-y2)\n", + " print(f\"nu = {n} max error = {e.max()}\")\n", + " plt.stem(x, e)\n", + "\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Boost Math\n", + "\n", + "The boost math library contains a comprehensive implementation of the four different different variants of the gamma function. For consistent definitions we follow their notation repeated here:\n", + "\n", + "\n", + "\n", + "1. The lower incomplete gamma function of $a$ and $z$\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{3}\n", + "\\gamma(a, z) = \\int_0^z t^{a-1} e^{-t} dt\n", + "\\end{equation}\n", + "$$ \n", + "\n", + "2. normalised lower incomplete gamma function of $a$ and $z$. This definition is consistent with the [scipy.special.gammainc](https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.gammainc.html) implementation\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{4}\n", + "P(a, z) = \\frac{\\gamma(a, z)}{\\Gamma(a)} = \\frac{1}{\\Gamma(a)} \\int_0^z t^{a-1} e^{-t} dt\n", + "\\end{equation}\n", + "$$\n", + "\n", + "3. upper incomplete gamma function of $a$ and $z$.\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{5}\n", + "\\Gamma(a, z) = \\int_z^\\infty t^{a-1} e^{-t} dt\n", + "\\end{equation}\n", + "$$\n", + "\n", + "4. normalised upper incomplete gamma function of $a$ and $z$. This definition is consisent with the [scipy.special.gammaincc](https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.gammaincc.html) implementation\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{6}\n", + "Q(a, z) = \\frac{\\Gamma(a, z)}{\\Gamma(a)} = \\frac{1}{\\Gamma(a)} \\int_z^\\infty t^{a-1} e^{-t} dt\n", + "\\end{equation}\n", + "$$\n", + "\n", + "An additional identiy that follows from the integral definition:\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{7}\n", + "\\gamma(a, z) + \\Gamma(a, z) = \\Gamma(a)\n", + "\\end{equation}\n", + "$$\n", + "and for the normalised functions we have:\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{8}\n", + "P(a, z) + Q(a, z) = 1\n", + "\\end{equation}\n", + "$$\n", + "\n", + "Back to the boost libary, see [#10](https://beta.boost.org/doc/libs/1_82_0/libs/math/doc/html/math_toolkit/sf_gamma/igamma.html#math_toolkit.sf_gamma.igamma.implementation) of their implementation notes which states for half-integers $a \\in [\\frac{1}{2}, 30]$ that the following series expansion should be used to evaluate the upper incomplete regularised gamma function:\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{9}\n", + "Q(a, x) = \\text{erfc}(\\sqrt{x}) + \\frac{e^{-x}}{\\sqrt{\\pi x}} \\sum_{n=1}^{a - \\frac{1}{2}} \\frac{x^n}{(1 - \\frac{1}{2}) \\cdots (n - \\frac{1}{2})}\n", + "\\end{equation}\n", + "$$\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6.661338147750939e-16 4.459776977656937e-16\n", + "1.6653345369377348e-16 4.3946638485055916e-16\n", + "2.220446049250313e-16 1.107246765857766e-15\n", + "4.163336342344337e-16 3.1194323558338866e-15\n", + "2.2620794126737565e-15 2.2792539957273192e-14\n", + "1.2420620087993939e-14 1.5776276943287004e-13\n", + "6.49896803039951e-14 9.977832158152448e-13\n", + "3.554517791215517e-13 6.405459416834582e-12\n", + "2.5983729057266203e-12 5.3784749837562836e-11\n", + "1.7344348179904046e-11 4.0561555937670355e-10\n", + "1.4016347804624019e-10 3.6552429262447314e-09\n", + "1.069651311969011e-09 3.077936926389166e-08\n", + "1.255947506412225e-08 3.9531191153418467e-07\n", + "9.648126094580212e-08 3.2975236827047864e-06\n", + "1.2419848460266947e-06 4.580767701633588e-05\n", + "1.7948268090407782e-05 0.0007105560037904496\n", + "1.7915769273919163e-05 0.0007577831080872898\n", + "0.0032044584860772968 0.14421996957159758\n", + "0.020957303649203077 1.0\n", + "0.01983067633881408 1.0\n" + ] + } + ], + "source": [ + "def g(a, x):\n", + " from scipy.special import erfc, gamma\n", + "\n", + " term = np.exp(-x) / np.sqrt(np.pi * x)\n", + " q = erfc(np.sqrt(x))\n", + "\n", + " for n in range(1, int(a+0.5)):\n", + " term /= n - 0.5\n", + " term *= x\n", + " q += term\n", + "\n", + " return (1 - q) * gamma(a)\n", + "\n", + "def gv(a, x, amax=30):\n", + " from scipy.special import erfc, gamma\n", + "\n", + " n = np.arange(1, amax+1)\n", + " mask = n <= a\n", + " q = erfc(np.sqrt(x))\n", + " q += np.exp(-x) / np.sqrt(np.pi * x) * np.sum(mask * x ** n / np.cumprod(n-0.5))\n", + "\n", + " return (1 - q) * gamma(a)\n", + "\n", + "def og(a, x):\n", + " from scipy.special import gammainc, gamma, gammaln\n", + "\n", + " return np.exp(gammaln(a) + np.log(gammainc(a, x)))\n", + " \n", + "def pq(a, x):\n", + " from pyquante2.utils import gamm_inc\n", + "\n", + " return gamm_inc(a, x)\n", + "\n", + "x = 1.0\n", + "for prev_a in range(20):\n", + " abs_error = np.abs(og(prev_a+0.5, x) - g(prev_a+0.5, x))\n", + " rel_error = abs_error / og(prev_a+0.5, x)\n", + " print(abs_error, rel_error)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Series evaluation of lower incomplete gamma function\n", + "\n", + "The special case above appears to have excessive errors as `a` increases. We can instead try the standard series expansion method:\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{10}\n", + "\\gamma(a, z) = z^a e^{-z} \\sum_{k=0}^{\\infty} \\frac{\\Gamma(a)}{\\Gamma(a + k + 1)} z^k\n", + "\\end{equation}\n", + "$$\n", + "See [#4](https://beta.boost.org/doc/libs/1_82_0/libs/math/doc/html/math_toolkit/sf_gamma/igamma.html#math_toolkit.sf_gamma.igamma.implementation) on the boost documentation which also shows how this series can be simplfied to:\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{11}\n", + "\\gamma(a, z) = z^a e^{-z} \\sum_{k=0}^{\\infty} \\frac{z^k}{a^{\\overline{k + 1}}}\n", + "\\end{equation}\n", + "$$\n", + "by using the recursion relation:\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{12}\n", + "\\Gamma(z+1) = z \\Gamma(z)\n", + "\\end{equation}\n", + "$$\n", + "where we use $a^{\\overline{k + 1}}$ as the [Pochhammer symbol](https://en.wikipedia.org/wiki/Falling_and_rising_factorials) evaluated as:\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{13}\n", + "a^{\\overline{k + 1}} = a(a + 1)(a+2) \\cdots (a + k)\n", + "\\end{equation}\n", + "$$\n", + "\n", + "This can be used to build a log-space implementation of the lower incomplete gamma function." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(3.327401488179459e-15, 3.556877452881491e-15)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def gammaincln_loop(a: float, z: float, num_terms=32, epsilon=1e-10):\n", + " \"\"\"Lower incomplete gamma function computed from its series representation in log-space\n", + "\n", + " Should be equivalent to:\n", + "\n", + " import numpy as np\n", + " from scipy.special import gammainc, gammaln\n", + "\n", + " gammaln(a) + np.log(gammainc(a, z))\n", + " \"\"\"\n", + " a0 = a\n", + " term = 1 / a\n", + " total = 0.0\n", + "\n", + " for _ in range(num_terms):\n", + " a += 1\n", + " term *= z / a\n", + " total += term\n", + "\n", + " total += 1 / a0\n", + " z = max(z, epsilon)\n", + " return a0 * np.log(z) - z + np.log(total)\n", + "\n", + "\n", + "def gammaincln_vec(a, z, num_terms=32, epsilon=1e-10, dtype=np.float64):\n", + " ak = a + np.arange(num_terms, dtype=dtype)\n", + " zk = np.full(ak.shape, z, dtype=dtype)\n", + " zk[0] = 1.0\n", + " total = np.sum(np.cumprod(zk / ak))\n", + " z = np.maximum(z, epsilon)\n", + " return a * np.log(z) - z + np.log(total)\n", + "\n", + "\n", + "gammaincln = gammaincln_vec\n", + "\n", + "\n", + "def reference_scipy(a, z):\n", + " # https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.gammainc.html\n", + " from scipy.special import gammaln, gammainc\n", + "\n", + " return gammaln(a) + np.log(gammainc(a, z))\n", + "\n", + "\n", + "def reference_mpmath(a, z):\n", + " # https://mpmath.org/doc/current/functions/expintegrals.html#gammainc\n", + " from mpmath import gammainc, log\n", + "\n", + " return float(log(gammainc(float(a), b=float(z))))\n", + "\n", + "\n", + "prev_a = 1.5\n", + "z = 10.0\n", + "\n", + "ref_sp = reference_scipy(prev_a, z)\n", + "ref_mp = reference_mpmath(prev_a, z)\n", + "ans = gammaincln(prev_a, z, 64)\n", + "abs((ref_sp - ans) / ref_sp), abs((ref_mp - ans) / ref_mp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How many terms need to be evaluated to converge?" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
aznum_termsactual_fp64actual_fp32expectrel_error_fp64abs_error_fp64rel_error_fp32abs_error_fp32
00.50.032-10.819778-10.819778-10.8197786.161556e-126.666667e-111.698729e-101.837988e-09
10.50.064-10.819778-10.819778-10.8197786.161556e-126.666667e-111.698729e-101.837988e-09
20.50.0128-10.819778-10.819778-10.8197786.161556e-126.666667e-111.698729e-101.837988e-09
34.50.032-105.120407-105.120407-105.1204071.729035e-131.817568e-113.594136e-103.778170e-08
44.50.064-105.120407-105.120407-105.1204071.729035e-131.817568e-113.594136e-103.778170e-08
\n", + "
" + ], + "text/plain": [ + " a z num_terms actual_fp64 actual_fp32 expect rel_error_fp64 \\\n", + "0 0.5 0.0 32 -10.819778 -10.819778 -10.819778 6.161556e-12 \n", + "1 0.5 0.0 64 -10.819778 -10.819778 -10.819778 6.161556e-12 \n", + "2 0.5 0.0 128 -10.819778 -10.819778 -10.819778 6.161556e-12 \n", + "3 4.5 0.0 32 -105.120407 -105.120407 -105.120407 1.729035e-13 \n", + "4 4.5 0.0 64 -105.120407 -105.120407 -105.120407 1.729035e-13 \n", + "\n", + " abs_error_fp64 rel_error_fp32 abs_error_fp32 \n", + "0 6.666667e-11 1.698729e-10 1.837988e-09 \n", + "1 6.666667e-11 1.698729e-10 1.837988e-09 \n", + "2 6.666667e-11 1.698729e-10 1.837988e-09 \n", + "3 1.817568e-11 3.594136e-10 3.778170e-08 \n", + "4 1.817568e-11 3.594136e-10 3.778170e-08 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "from functools import partial\n", + "\n", + "A = np.arange(0, 16, 4) + 0.5\n", + "Z = np.linspace(0, 20, 5)\n", + "N = np.array([32, 64, 128])\n", + "\n", + "vals = np.meshgrid(A, Z, N)\n", + "A, Z, N = [t.reshape(-1) for t in vals]\n", + "\n", + "gammaincln_fp64 = partial(gammaincln, dtype=np.float64)\n", + "gammaincln_fp32 = partial(gammaincln, dtype=np.float32)\n", + "actual_fp64 = np.vectorize(gammaincln_fp64)(A, Z, N)\n", + "actual_fp32 = np.vectorize(gammaincln_fp32)(A, Z, N)\n", + "expect = reference_scipy(A, np.maximum(Z, 1e-10))\n", + "\n", + "df = pd.DataFrame(\n", + " {\n", + " \"a\": A,\n", + " \"z\": Z,\n", + " \"num_terms\": N,\n", + " \"actual_fp64\": actual_fp64,\n", + " \"actual_fp32\": actual_fp32,\n", + " \"expect\": expect,\n", + " }\n", + ")\n", + "df[\"rel_error_fp64\"] = np.abs((df.actual_fp64 - df.expect) / df.expect)\n", + "df[\"abs_error_fp64\"] = np.abs(df.actual_fp64 - df.expect)\n", + "df[\"rel_error_fp32\"] = np.abs((df.actual_fp32 - df.expect) / df.expect)\n", + "df[\"abs_error_fp32\"] = np.abs(df.actual_fp32 - df.expect)\n", + "\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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FEXhwgsvpKamRuquDePGjePBBx/knnvuYdy4ccyaNYuamhoeffRRNBoNIN+/9oi1rlwuV/MTl59yOBxSnz9z9913oygKZ511VvM2qT/RHUmuj4/k+/hIvu9Yku87Xk/L99L478H++c9/kpmZyemnn57oULqdaDRKQ0MD//jHPzjhhBOYPn06//znP4lGozz55JOJDi/pffbZZ/zud7/jF7/4BY8//jj/+Mc/iEQiXHzxxS0mABIiEV544QWee+45brjhBnr37p3ocISIi+T6+Ei+j4/ke5HMemK+l8Z/D1VaWsp//vMfLr/8ctxuNy6Xi4aGBgAaGhrwer04HA6gaamLn3K5XADN7/dEdrudtLQ0DjnkkOZtaWlpjBgxgh07dkjdteHWW29l0qRJXHfddUyaNIkTTjiBRx55hK1bt7Jq1SoAqcN2iLWu7HY7Ho+nVXmn0yn1+YP169dzww038Otf/5r58+e3eE/qT3Q3kuvjJ/k+PpLvO5bk+47TU/O9NP57qJKSEoLBIBdffDHjx49n/PjxXHrppQCce+65XHDBBc1jX34+tqWgoACdTseAAQO6PO5kMWTIkP2+19jYyMCBA9HpdPusO6DV2MCeZufOnS0upAB69+5Neno6RUVFAPL9a4dY6yovL49du3Y1T7K0165du3r8dxLgiy++4IorruDUU0/liiuuaPW+1J/obiTXx0/yfXwk33csyfcdoyfne2n891CHHnooTzzxRIuf66+/HoCbbrqJG2+8kQEDBjBo0KBW69S+/vrrTJ48Gb1en4jQk8KMGTOor6/n22+/bd5WV1fHN998w8iRI9Hr9UycOJE333yzRbnXX3+d/Px8+vfv39UhJ5W+ffuydevWFttKS0upq6ujX79+APL9a4dY62ratGk4nU4++OCD5n127drF1q1bmTZtWpfGnGx27NjBJZdcwqRJk7jpppv2uY/Un+huJNfHT/J9fCTfdyzJ9/Hr6flem+gARGLY7XYmTpy4z/dGjhzJyJEjAfjNb37DNddcw8CBA5k4cSKvv/46X375ZY8f5zZr1ixGjx7N5ZdfzlVXXYXBYOCRRx5Br9fzy1/+EoDLLruMc889l7/85S/MmTOHjz76iFdffZV77703wdEn3sKFC/nrX//KrbfeysyZM6mvr28el/rT5Wvk+9fE5/Oxfv16oOmiyePxNCf+CRMmkJGREVNdHXHEEUydOpU//OEP/P73v8dgMHDvvfcyfPhwZs+enZBz6wpt1V80GmXRokUYDAbOO+88vv766+ayVqu1+clfT60/0X1Jro+f5Pv4SL5vH8n38ZF83zYl+vP+DKLH+uijjzj33HP573//y+jRo5u3P//88zz66KPs2bOHwYMHc/XVVzNjxowERpocamtruf3221m3bh3BYJBx48Zx/fXXt+giuHbtWu677z527dpF3759ufjii1mwYEECo04O0WiUZ555hpUrV1JcXIzFYmHMmDFcddVVzcsj7SXfv6auu8cee+w+33viiSeaL+5jqSu3283tt9/O22+/TSgUYurUqfzpT38iJyen088jUdqqP2jqAr0vEyZMYMWKFc2ve2L9idQiub79JN8fPMn37SP5Pj6S79smjX8hhBBCCCGEECLFyZh/IYQQQgghhBAixUnjXwghhBBCCCGESHHS+BdCCCGEEEIIIVKcNP6FEEIIIYQQQogUJ41/IYQQQgghhBAixUnjXwghhBBCCCGESHHS+BdCCCGEEEIIIVKcNP6FEEIIIYQQQogUJ41/IURSeuqpp3jxxRcTHYYQQgghOonkeiG6ljT+hRBJaeXKlbz00kuJDkMIIYQQnURyvRBdSxr/QogeIxQKEQgEEh2GEEIIITqJ5Hoh9k8a/0L0AA888ADDhw+nsLCQ6667jnHjxjF27Fiuv/56fD4fACUlJQwfPnyf3e+GDx/OAw880Op4u3bt4pprrmHs2LFMmjSJ++67j2g0SllZGZdddhlHHnkkU6ZM4T//+U+74p05cybbt2/n448/Zvjw4QwfPpxzzjmn+X2Xy8Vtt93G9OnTGTVqFMcddxyPPPIIkUikeZ+957Ns2TIee+wxZs2axejRo9m5c2eHxL9ixQpOPPFEDj/8cMaPH89pp53GK6+80q7zFEIIITqK5HrJ9UK0RZvoAIQQXefKK6+kf//+XH311WzdupXnn3+ejIwMrr322oM63lVXXUV+fj6//e1vWb9+Pf/85z9JS0vjmWeeYdKkSVxzzTW88sor3HnnnYwePZrx48fHdNw//OEP3HLLLZjNZi699FIAsrKyAPD5fJx99tlUVFSwcOFC+vTpw+eff87f//53qqqq+OMf/9jiWC+++CKNjY384he/QK/X43A44o7/ueee49Zbb+X444/n3HPPpbGxkW3btrFlyxZOPvnkg6pLIYQQoiNIrpdcL8T+SONfiB7k0EMP5a9//Wvz6/r6ev773/8e9AXBYYcdxs033wzAmWeeycyZM7njjju4+uqrufjiiwE46aSTOProo3nhhRdiviCYNWsW9913H+np6cybN6/Fe8uXL6e4uJiXXnqJQYMGAbBw4UJ69erFsmXLuPDCC+nTp0/z/uXl5bz99ttkZGR0WPzvvvsuQ4cO5f77729HbQkhhBCdT3J9x8QvuV6kIun2L0QPsnDhwhavx40bR319PR6P56COt2DBgub/1mg0jBo1img02mK73W5n8ODBFBcXH1zQP7N69WrGjh2L3W6ntra2+eeoo44iHA7zySeftNh/9uzZ+7wYiCd+u91OeXk5X375ZYeckxBCCNFRJNd3TPyS60Uqkif/QvQgffv2bfHabrcD4HQ6O+R4NpsNg8HQKgHbbDbq6+sP6jN+rrCwkG3btjF58uR9vl9bW9vidf/+/fd7rION/1e/+hWbNm3ijDPOIDc3lylTpnDSSScxduzYdp6NEEII0bEk17ckuV6IH0njX4geRFX33dknGo2iKMo+3wuHw+06nkaj2e9ndIRIJMKUKVO46KKL9vn+3u6BexmNxv0e62Djz8/PZ/Xq1bz77ru89957vPXWWzz99NMsXryYyy+/PIazEEIIITqH5PqWJNcL8SNp/AshAJonx3G5XC2279mzJxHh7PcCZeDAgTQ0NHDUUUd1cUQtmc1m5s6dy9y5cwkEAvzmN7/hX//6F5dccgkGgyGhsQkhhBD7Irm+fSTXi1QjY/6FEABYrVbS09PZvHlzi+1PP/10QuIxmUytLk4A5syZw+eff857773X6j2Xy0UoFOr02Orq6lq81uv15OfnE41GCQaDnf75QgghxMGQXB87yfUiFcmTfyFEszPOOINHHnmEP/7xj4waNYrNmzeza9euhMQycuRIVq5cycMPP0xubi4ZGRlMnjyZRYsW8c4773DppZcyf/58Ro4cic/n4/vvv+fNN99k7dq1+530p6MsWrSIrKwsjjzySDIzMykoKODJJ59k+vTpWK3WTv1sIYQQIh6S62MjuV6kImn8CyGaLV68mNraWt58803eeOMNpk2bxtKlS/c74U5nx7Jnzx6WLl2K1+tlwoQJTJ48GZPJxIoVK/j3v//N6tWrefnl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HyxjSStDb28vvvWtb+HJJ59EIpHAsmXL8JWvfCWni+ATTzyB22+/HXv37sXMmTNxySWXYNOmTWUsdWUwTRMPPvggHnjgAezfvx9OpxOnnHIKrrnmmszySGn8/CW77v7jP/5jwX333Xdf5st9MXUVCATwrW99C3/+85+haRrOOOMM/Pu//zsaGxvH/X2Uy3D1ByS7QBeyYsUK3H///ZnnU7H+qLqwrR85tvejx/Z+ZNjel4bt/fAY/BMRERERERFVOY75JyIiIiIiIqpyDP6JiIiIiIiIqhyDfyIiIiIiIqIqx+CfiIiIiIiIqMox+CciIiIiIiKqcgz+iYiIiIiIiKocg38iIiIiIiKiKsfgn4iIiIiIiKjKMfgnoor0y1/+Er/73e/KXQwiIiIaJ2zriSYWg38iqkgPPPAAtm/fXu5iEBER0ThhW080sRj8E9GUoWka4vF4uYtBRERE44RtPdHQGPwTTQF33HEHWltbsW/fPlx33XVYtmwZli5diq985SuIRCIAgAMHDqC1tbVg97vW1lbccccdeefbu3cvvvCFL2Dp0qVYtWoVbr/9dpimicOHD+Pyyy/HaaedhjVr1uCnP/3piMq7bt06tLW14W9/+xtaW1vR2tqKT33qU5n9fr8f3/jGN3DmmWdi8eLF+Kd/+ifcddddMAwjc0z6/Wzbtg0/+9nPsH79eixZsgTt7e1jUv77778fH/nIR3DyySdj+fLlOO+88/D73/9+RO+TiIhorLCtZ1tPNByl3AUgoolz9dVXY/bs2bj22mvx1ltv4aGHHkJdXR2++MUvjup811xzDVpaWvD5z38eu3btwp133omamho8+OCDWLVqFb7whS/g97//Pf7jP/4DS5YswfLly4s67/XXX49bbrkFDocDl112GQCgoaEBABCJRPCv//qv6OzsxJYtWzBjxgy88sor+N73vofu7m589atfzTnX7373O8RiMXzyk5+ExWKB1+stufy/+c1vcOutt+LDH/4wLrjgAsRiMbzzzjt47bXX8NGPfnRUdUlERDQW2NazrScaCoN/oinkxBNPxDe/+c3M8/7+fvz2t78d9ReCk046CTfffDMAYPPmzVi3bh1uu+02XHvttbjkkksAAOeccw7+4R/+AQ8//HDRXwjWr1+P22+/HbW1tdi4cWPOvnvvvRf79+/H9u3bMW/ePADAli1bMH36dGzbtg0XXnghZsyYkTn+yJEj+POf/4y6uroxK//OnTtxwgkn4L/+679GUFtERETjj2392JSfbT1VI3b7J5pCtmzZkvN82bJl6O/vRzAYHNX5Nm3alPlZlmUsXrwYpmnmbPd4PJg/fz72798/ukIPsmPHDixduhQejwe9vb2Z/04//XTouo4XXngh5/gPfehDBb8MlFJ+j8eDI0eO4PXXXx+T90RERDRW2NaPTfnZ1lM14p1/oilk5syZOc89Hg8AwOfzjcn53G43rFZrXgPsdrvR398/qmsMtm/fPrzzzjtYvXp1wf29vb05z2fPnj3kuUZb/s985jN49tlncf7552Pu3LlYs2YNzjnnHCxdunSE74aIiGhssa3PxbaeaACDf6IpRJIKd/YxTRNCiIL7dF0f0flkWR7yGmPBMAysWbMGF198ccH96e6BaTabbchzjbb8LS0t2LFjB3bu3ImnnnoKf/rTn/CrX/0KW7duxZVXXlnEuyAiIhofbOtzsa0nGsDgn4gAIDM5jt/vz9l+6NChchRnyC8oc+bMQTgcxumnnz7BJcrlcDhw9tln4+yzz0Y8HsfnPvc5/OQnP8Gll14Kq9Va1rIREREVwrZ+ZNjWU7XhmH8iAgC4XC7U1tbixRdfzNn+q1/9qizlsdvteV9OAGDDhg145ZVX8NRTT+Xt8/v90DRt3MvW19eX89xisaClpQWmaSKRSIz79YmIiEaDbX3x2NZTNeKdfyLKOP/883HXXXfhq1/9KhYvXowXX3wRe/fuLUtZFi1ahAceeAA//vGPMXfuXNTV1WH16tW46KKL8Ne//hWXXXYZzj33XCxatAiRSATvvvsuHn/8cTzxxBNDTvozVi666CI0NDTgtNNOQ319PTo6OvCLX/wCZ555Jlwu17hem4iIqBRs64vDtp6qEYN/IsrYunUrent78fjjj+OPf/wj1q5di3vuuWfICXfGuyyHDh3CPffcg1AohBUrVmD16tWw2+24//778d///d/YsWMH/ud//gculwvz5s3D5z73Objd7nEv2+bNm/H73/8e9957L8LhMJqamvCpT30Kn/3sZ8f92kRERKVgW18ctvVUjYQ5VjNzEBEREREREVFF4ph/IiIiIiIioirHbv9ENKF6e3uPuaSQqqqoqamZuAIRERHRmGJbT1SZ2O2fiCbUunXrcPDgwSH3r1ixAvfff/8EloiIiIjGEtt6osrE4J+IJtRLL72EWCw25H6Px4PFixdPYImIiIhoLLGtJ6pMDP6JiIiIiIiIqhwn/CMiIiIiIiKqcgz+iYiIiIiIiKocg38iIiIiIiKiKsfgn4iIiIiIiKjKMfgnIiIiIiIiqnIM/omIiIiIiIiqHIN/IiIiIiIioirH4J+IiIiIiIioyv3//SDK0Qgy0D0AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "_, ax = plt.subplots(2, 2, figsize=(12,10), )\n", + "sns.lineplot(ax=ax[0, 0], data=df, x=\"num_terms\", y=\"rel_error_fp32\", hue=\"a\")\n", + "sns.lineplot(ax=ax[0, 1], data=df, x=\"num_terms\", y=\"rel_error_fp64\", hue=\"a\")\n", + "sns.lineplot(ax=ax[1, 0], data=df, x=\"num_terms\", y=\"rel_error_fp32\", hue=\"z\")\n", + "sns.lineplot(ax=ax[1, 1], data=df, x=\"num_terms\", y=\"rel_error_fp64\", hue=\"z\")\n", + "\n", + "for prev_a in ax.flat:\n", + " prev_a.set(yscale=\"log\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Combining series evaluation with $F(\\nu, t)$ \n", + "\n", + "Remember from earlier that goal is to evaluate:\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{14}\n", + "F(\\nu, t) = \\int_0^1 u^{2 \\nu} e^{-t u^2} du\n", + "\\end{equation}\n", + "$$\n", + "which we used SymPy to show that\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{15}\n", + "F(\\nu, t) = \\frac{1}{2} t^{-\\nu - \\frac{1}{2}} \\gamma(\\nu + \\frac{1}{2}, t)\n", + "\\end{equation}\n", + "$$\n", + "now combining this result with the series representation for the lower incomplete gamma function:\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{16}\n", + "\\gamma(\\nu + \\frac{1}{2}, t) = t^{\\nu + \\frac{1}{2}} e^{-t} \\sum_{k=0}^{\\infty} \\frac{t^k}{(\\nu + \\frac{1}{2})^{\\overline{k+1}}}\n", + "\\end{equation}\n", + "$$\n", + "we arrive at:\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{17}\n", + "F(\\nu, t) = \\frac{e^{-t}}{2} \\sum_{k=0}^{\\infty} \\frac{t^k}{(\\nu + \\frac{1}{2})^{\\overline{k+1}}}\n", + "\\end{equation}\n", + "$$\n", + "recall that $a^{\\overline{k + 1}}$ is the [Pochhammer symbol](https://en.wikipedia.org/wiki/Falling_and_rising_factorials) evaluated as:\n", + "$$\n", + "\\begin{equation}\n", + "\\tag{18}\n", + "a^{\\overline{k + 1}} = a(a + 1)(a+2) \\cdots (a + k)\n", + "\\end{equation}\n", + "$$\n", + "which leads to a simple recurrence that can be used to evaluate the series:\n", + "$$\n", + "\\begin{aligned}\n", + "\\tag{19}\n", + "a &\\equiv \\nu + \\frac{1}{2} \\\\ \n", + "f_0 &= \\frac{1}{a}\\\\\n", + "f_k &= \\frac{t}{a + 1} f_{k-1} \\\\\n", + "F(\\nu, t) &= \\frac{e^{-t}}{2} \\sum_{k=0}^{\\infty} f_k \n", + "\\end{aligned}\n", + "$$\n", + "This series will converge as $k \\rightarrow \\infty$ since the denominator terms will grow faster then the numerator. \n", + "In practice the number of terms needed to converge should be expected to be similar to the study above for the convergence of the lower incomplete gamma function in log space.\n", + "\n", + "As a sanity check we can see that the $t=0$ case agrees with evaluation of the integral:\n", + "$$\n", + "\\tag{20}\n", + "F(\\nu, 0) = \\frac{1}{2 \\nu + 1}\n", + "$$\n", + "without resorting to any special casing to avoid a singularity as $t \\rightarrow 0$ that is inherent in Equation 15." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.331779296901205e-13" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pyquante2.utils import Fgamma as reference_pyquante\n", + "\n", + "\n", + "def Fnut(nu, t, num_terms=128):\n", + " a = nu + 0.5\n", + " total = 1 / a\n", + " term = 1 / a\n", + "\n", + " for _ in range(num_terms):\n", + " a += 1\n", + " term *= t / a\n", + " total += term\n", + "\n", + " return np.exp(-t) / 2 * total\n", + "\n", + "\n", + "nu = 0.0\n", + "t = 0.0\n", + "\n", + "abs((Fnut(nu, t) - reference_pyquante(nu, t)) / reference_pyquante(nu, t))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This absolute error is a little misleading since the special case of $\\nu=t=0$ should be handled correctly by `Fnut`:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1.0, 0.9999999999996668)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Fnut(nu, t), reference_pyquante(nu, t)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nu = 0 max error = 3.885780586188048e-15\n", + "nu = 1 max error = 5.551115123125783e-17\n", + "nu = 2 max error = 4.163336342344337e-17\n", + "nu = 3 max error = 3.642919299551295e-17\n", + "nu = 4 max error = 4.85722573273506e-17\n", + "nu = 5 max error = 7.632783294297951e-17\n", + "nu = 6 max error = 5.551115123125783e-17\n", + "nu = 7 max error = 3.469446951953614e-17\n", + "nu = 8 max error = 1.3877787807814457e-17\n", + "nu = 9 max error = 4.163336342344337e-17\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAikAAAGxCAYAAACnTiatAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/OQEPoAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+qElEQVR4nO3df0BUdb7/8RcDDCI6Ivljr0KltJKmiD9SyQ2LbMutXXa3ulq7pWFGu9kPu265fdPNasvb3do2MhXCSjPLumWbq25Wrt6tbm2ampWGYkZ4xRJh+C3MzPePkhwZYH7PmZnn4x+GM+dzPp/3OcPw4nPOHGIcDodDAAAABmMK9QAAAABcIaQAAABDIqQAAABDIqQAAABDIqQAAABDIqQAAABDIqQAAABDIqQAAABDIqQAAABDigv1APzh4MGDKikp0c6dO1VaWqrBgwdr3bp1Qen7448/1vPPP68dO3bowIEDmjRpkpYtW9ZuvdzcXFVUVLRbvmvXLiUkJARjqAAAhJWICCmlpaXasmWLRo4cKbvdrmDe6X/79u368MMPlZmZqebm5k7XveSSS5Sfn++0zGw2B3J4AACErYgIKbm5uZo8ebIkad68edq9e3fQ+r722ms1ffr0tsed6dOnj7KysoIwKgAAwl9EXJNiMnVdhsPhUElJiS655BINHz5cF110kZ555pmg9A0AADwXETMp7vjjH/+ol156STfddJNGjhyp7du3609/+pMSEhJ09dVXB2UMr7/+utasWaP4+HiNHTtWc+fOVUZGRlD6BgAg3ERFSPnyyy/13HPPaeHChZo6daok6bzzzlNTU5MWL16sqVOnBnxGJDc3V5mZmRowYIDKy8u1dOlSXXPNNVq7dq3S0tIC2jcAAOEoKkLKu+++K0n68Y9/rNbW1rbl5513noqLi/V///d/GjhwoBobG3Xo0KEut/dv//Zv6t69u0djuOeee9oejx07VhMnTtSUKVNUUlKie++916NtAQAQDaIipBw7dkwOh0MTJkxw+fyJkPLRRx/p+uuv73J7xcXFysnJ8WlM/fr105gxY/TJJ5/4tB0AACJVVISUXr16KSYmRs8//7zi4+PbPT9o0CBJ386s7N27N9jDAwAALkRFSMnOzpYkVVdXKzc3N8Sj+VZlZaW2bdumvLy8UA8FAABDioiQ0tjYqC1btkiSKioqVFdXp40bN0qSxo0bp0GDBulXv/qV7rzzTs2cOVMjR45US0uLvvjiC73//vt68sknve67qqpKH3zwQdvj+vr6tr4nTZqkxMRErVu3Tps3b9akSZPUr18/lZeXq6ioSLGxsW6dXgIAIBrFOIJ5e9YA+eqrr3TRRRe5fG7FihUaP368HA6HVq1apRdffFEHDhxQUlKSBg0apEsvvVQzZszwuu/3339f1113ncvn3nrrLaWmpmrHjh165JFHVFpaqtraWvXs2VMTJkzQrbfeqsGDB3vdNwAAkSwiQgoAAIg83C4VAAAYEiEFAAAYUlhfOOtwOGS3B+ZslckUE7BtGxH1RjbqjXzRVjP1hi+TKUYxMTFurRvWIcVud6iqqt7v242LM6l37yRZrQ1qbbX7fftGQ72RjXojX7TVTL3hLSUlSbGx7oUUn0731NfXKycnRxkZGfr44487XdfhcKioqEgXXHCBMjMzNXXqVO3YscOX7gEAQATzKaQ8+eSTstlsbq1bXFysxx9/XDNmzNCyZcvUt29f5efnq7y83JchAACACOV1SNm/f7+ef/553XLLLV2u29zcrGXLlik/P18zZsxQdna2Hn30USUnJ6ukpMTbIQAAgAjmdUh54IEHNG3atLb/e9OZ7du3q66uTlOmTGlbZjabdfHFF2vr1q3eDgEAAEQwry6c3bhxoz7//HMVFha69V98y8rKJKnd3VXT09P17LPPqqmpSd26dfNmKIqL8/+nqGNjTU5fIx31RjbqjXzRVjP1Rg+PQ0pjY6MWLVqkOXPmqEePHm61sVqtMpvNSkhIcFpusVjkcDhUU1PjVUgxmWLUu3eSx+3cZbEkBmzbRkS9kY16I1+01Uy9kc/jkLJkyRKddtppuuKKKwIxHo/Y7Q5ZrQ1+325srEkWS6Ks1kbZbOH/ca+uUG9ko97IF201U294s1gS3Z4V8iikVFRUaPny5Vq8eLFqa2slSQ0NDW1f6+vrlZTUfmbDYrHo+PHjam5udppNsVqtiomJUa9evTwZhpNAfmbcZrNHxGfS3UW9kY16I1+01Uy9kc+jkPLVV1+ppaVFN954Y7vnrrvuOo0cOVJr1qxp99yJa1EOHDigs88+u215WVmZBgwY4PX1KAAAIHJ5FFKGDh2qFStWOC377LPP9NBDD2nhwoUaMWKEy3ajR49Wjx49tGHDhraQ0tLSojfeeEM5OTleDh0AAEQyj0KKxWLR+PHjXT53zjnn6JxzzpEkTZ8+XYcOHdKmTZskSQkJCSooKFBhYaFSUlI0ZMgQrV69WtXV1Zo5c6aPJUQOu92hz8urVV3frOSkBA1JS5bJ5N6tgwEAiDQB+d89dru93Z1oZ82aJYfDoeXLl6uqqkpDhw5VSUmJ0tLSAjGEsLNt7xE9/2apjtU2ty3r3TNB10z+ocZk9AvhyAAACI0Yh8MRtv9W0WazB/QfDB47Vh+Ui5S27T2ixa/u7vD5m38xPKBBJdj1hhr1RrZoq1eKvpqpN7x9+w8G3ft0T/TdGcZg7HaHnn+ztNN1Vr9ZGjH/ohsAAHcRUkLs8/Jqp1M8rlTVNuvz8urgDAgAAIMgpIRYdX3nAcXT9QAAiBSElBBLTkroeiUP1gMAIFIQUkJsSFqyevfsPICk9Pz248gAAEQTQkqImUwxumbyDztd5+rJP+R+KQCAqENIMYAxGf108y+GK7mH2Wl5Ss+EgH/8GAAAowrIzdzguTEZ/TTsjBTd/NhWSdKcq0bqnEEpzKAAAKIWMykGcnIg4Zb4AIBoR0gBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGFOfJylu2bFFxcbH27dunuro69e/fX5MnT9bs2bPVs2fPDttde+21+uCDD9otX79+vdLT0z0fNQAAiHgehZTq6mplZmbq2muvVXJyskpLS1VYWKjS0lItX76807ajR4/WXXfd5bQsNTXV8xEDAICo4FFIycvLc/p+/PjxMpvNmj9/viorK9W/f/8O21osFmVlZXk1SAAAEH18viYlOTlZktTS0uLrpgAAANp4NJNygs1mU2trq/bt26fFixcrNze3y1M3H3zwgbKysmSz2TRy5EjddtttOvfcc70a9Mni4vx/7W9srMnpa7DY7I62x3FxpoDU5kqo6g0V6o1s0VavFH01U2/08CqkXHjhhaqsrJQknX/++XrkkUc6Xf/cc89VXl6ezjzzTB05ckQlJSW6/vrrtXLlSo0aNcqbIUiSTKYY9e6d5HX7rlgsiQHbtitNza1tj5OTu6tbgleHx2vBrjfUqDeyRVu9UvTVTL2RL8bhcDi6Xs3Znj171NjYqH379mnJkiVKTU3V008/rdjYWLfaNzQ06PLLL1d6erqKi4s9HvQJNptdVmuj1+07EhtrksWSKKu1UTab3e/b70jzcZtmPbxZklR854VKMLu3P30VqnpDhXojW7TVK0VfzdQb3iyWRLdnhbz6U/3ss8+WJI0aNUojRoxQXl6eNm3apEsvvdSt9t27d9ekSZP097//3ZvunbS2Bu6A2Wz2gG7/VCf31dpqV6wpJmh9S8GvN9SoN7JFW71S9NVMvZHP5xNcGRkZio+P15dffumP8QAAAEjyQ0jZuXOnWlpaPLrnSUNDg/7xj39oxIgRvnYPAAAilEene2bPnq3hw4crIyND3bp10549e1RSUqKMjAxNnjxZknT33Xdr7dq1+vTTTyVJH374oZ566ildfPHFGjhwoI4cOaKnn35aX3/9tf7yl7/4vyIAABARPAopmZmZWr9+vYqKiuRwODRw4EBdddVVmjlzpsxmsyTJbrfLZrO1tenbt69aWlr05z//WdXV1UpMTNSoUaO0cOFCZWZm+rcaAAAQMbz6dI9R2Gx2VVXV+327cXEm9e6dpGPH6oN6kVLzcZt+8+gWSdKSOyYF7dM9oao3VKg3skVbvVL01Uy94S0lJcntT/dE351hAABAWCCkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQyKkAAAAQ/IopGzZskW//vWvNWHCBA0fPlwXXXSRHnroIdXW1nbZ9qWXXtIll1yiESNG6Gc/+5k2b97s9aABAEDki/Nk5erqamVmZuraa69VcnKySktLVVhYqNLSUi1fvrzDdn/72980f/583XTTTZowYYLWr1+v2bNna9WqVcrKyvK1BgAAEIE8Cil5eXlO348fP15ms1nz589XZWWl+vfv77Ld448/rssuu0y33367JGnChAn6/PPPtXjxYhUXF3s3cgAAENF8viYlOTlZktTS0uLy+fLycn3xxReaMmWK0/Kf/OQneu+993T8+HFfhwAAACKQRzMpJ9hsNrW2tmrfvn1avHixcnNzlZqa6nLdsrIySdKgQYOclqenp6ulpUXl5eVKT0/3ZhiSpLg4/1/7GxtrcvoaLDa7o+1xXJwpILW5Eqp6Q4V6I1u01StFX83UGz28CikXXnihKisrJUnnn3++HnnkkQ7XrampkSRZLBan5Se+P/G8N0ymGPXuneR1+65YLIkB27YrTc2tbY+Tk7urW4JXh8drwa431Kg3skVbvVL01Uy9kc+r34JFRUVqbGzUvn37tGTJEt100016+umnFRsb6+/xdcpud8hqbfD7dmNjTbJYEmW1Nspms/t9+x1pPm5re1xd3aAEc3D2Z6jqDRXqjWzRVq8UfTVTb3izWBLdnhXyKqScffbZkqRRo0ZpxIgRysvL06ZNm3TppZe2W7dXr16SpNraWvXt27dtudVqdXreW62tgTtgNps9oNs/1cl9tbbaFWuKCVrfUvDrDTXqjWzRVq8UfTVTb+Tz+QRXRkaG4uPj9eWXX7p8fvDgwZK+vzblhLKyMsXHxystLc3XIQAAgAjkc0jZuXOnWlpaOrxwNi0tTWeeeaY2btzotHz9+vXKzs6W2Wz2dQgAACACeXS6Z/bs2Ro+fLgyMjLUrVs37dmzRyUlJcrIyNDkyZMlSXfffbfWrl2rTz/9tK3dLbfcorlz5+r000/X+PHjtX79eu3atUvPPfecf6sBAAARw6OQkpmZqfXr16uoqEgOh0MDBw7UVVddpZkzZ7bNiNjtdtlsNqd2l19+uRobG1VcXKyioiINGjRITzzxhEaNGuW/SgAAQESJcTgcjq5XMyabza6qqnq/bzcuzqTevZN07Fh9UC9Saj5u028e3SJJWnLHpKB9uidU9YYK9Ua2aKtXir6aqTe8paQkuf3pnui7MwwAAAgLhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIhBQAAGBIcZ6svGHDBv31r3/VJ598IqvVqjPOOEPXXnutrrjiCsXExHTYLjc3VxUVFe2W79q1SwkJCZ6PGgAARDyPQsozzzyjgQMHat68eerdu7feffddzZ8/X4cPH9bs2bM7bXvJJZcoPz/faZnZbPZ8xAAAICp4FFKWLFmilJSUtu+zs7NVXV2tp59+Wr/97W9lMnV89qhPnz7KysryeqAAACC6eHRNyskB5YShQ4eqrq5ODQ0NfhsUAACARzMprmzbtk39+/dXjx49Ol3v9ddf15o1axQfH6+xY8dq7ty5ysjI8LV7xcX5/9rf2FiT09dgsdkdbY/j4kwBqc2VUNUbKtQb2aKtXin6aqbe6OFTSPnwww+1fv163XXXXZ2ul5ubq8zMTA0YMEDl5eVaunSprrnmGq1du1ZpaWle928yxah37ySv23fFYkkM2LZdaWpubXucnNxd3RJ8zpAeCXa9oUa9kS3a6pWir2bqjXwxDofD0fVq7R0+fFhXXXWV0tPTtXz58k6vRznVkSNHNGXKFP30pz/Vvffe6033kiSbzS6rtdHr9h2JjTXJYkmU1doom83u9+13pPm4TbMe3ixJKr7zQiWYY4PSb6jqDRXqjWzRVq8UfTVTb3izWBLdnhXy6k91q9WqWbNmKTk5WYWFhR4FFEnq16+fxowZo08++cSb7p20tgbugNls9oBu/1Qn99XaalesqeOPdQdCsOsNNeqNbNFWrxR9NVNv5PM4pDQ1NamgoEC1tbV68cUX1bNnz0CMCwAARDmPpkBaW1t1++23q6ysTE899ZT69+/vVaeVlZXatm2bRowY4VV7AAAQ+TyaSVm4cKE2b96sefPmqa6uTjt27Gh7btiwYTKbzZo+fboOHTqkTZs2SZLWrVunzZs3a9KkSerXr5/Ky8tVVFSk2NhYXX/99X4tBgAARA6PQso777wjSVq0aFG759566y2lpqbKbrfLZrO1LU9NTdWRI0f04IMPqra2Vj179tSECRN06623+vTJHgAAENk8Cilvv/12l+usXLnS6fusrKx2ywAAALoSfXeGAQAAYYGQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAADImQAgAA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AACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACGREgBAACG5HFIOXjwoBYsWKC8vDwNGzZMl19+uVvtHA6HioqKdMEFFygzM1NTp07Vjh07PO0eAABECY9DSmlpqbZs2aIzzjhD6enpbrcrLi7W448/rhkzZmjZsmXq27ev8vPzVV5e7ukQAABAFPA4pOTm5mrLli16/PHHdc4557jVprm5WcuWLVN+fr5mzJih7OxsPfroo0pOTlZJSYnHgwYAAJHP45BiMnl+Gcv27dtVV1enKVOmtC0zm826+OKLtXXrVo+3BwAAIl9QLpwtKyuTJA0ePNhpeXp6ug4dOqSmpqZgDAMAAISRuGB0YrVaZTablZCQ4LTcYrHI4XCopqZG3bp182rbcXH+z1mxsSanr8FiszvaHsfFmQJSmyuhqjdUqDeyRVu9UvTVTL3RIyghJVBMphj17p0UsO1bLIkB27YrTc2tbY+Tk7urW0JwD0+w6w016o1s0VavFH01U2/kC8pvQYvFouPHj6u5udlpNsVqtSomJka9evXyart2u0NWa4O/htkmNtYkiyVRVmujbDa737ffkebjtrbH1dUNSjDHBqXfUNUbKtQb2aKtXin6aqbe8GaxJLo9KxSUkHLiWpQDBw7o7LPPblteVlamAQMGeH2qR5JaWwN3wGw2e0C3f6qT+2pttSvWFBO0vqXg1xtq1BvZoq1eKfpqpt7IF5QTXKNHj1aPHj20YcOGtmUtLS164403lJOTE4whAACAMOPxTEpjY6O2bNkiSaqoqFBdXZ02btwoSRo3bpxSUlI0ffp0HTp0SJs2bZIkJSQkqKCgQIWFhUpJSdGQIUO0evVqVVdXa+bMmX4sBwAARAqPQ8rRo0d12223OS078f2KFSs0fvx42e122Ww2p3VmzZolh8Oh5cuXq6qqSkOHDlVJSYnS0tJ8GD4AAIhUHoeU1NRU7d27t9N1Vq5c2W5ZTEyMCgoKVFBQ4GmXAAAgCkXfh64BAEBYIKQAAABDIqQAAABDIqQAAABDIqQAAABDIqQAAABDIqQAAABDIqQAAABDIqQAAABDIqQAAABDIqQAAABD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V199pZaWFt14443tnrvuuus0cuRIrVmzJgQjC5yzzjpLX375pcvnmpubgzyawNu/f78uuugip2U/+MEP1Lt37w73QyQ58T516vV1ZWVlio+PV1paWqiGFlA7duzQbbfdpp///OcRfRqkrKxMBw8eVHZ2drvnzj33XN17770ReZqLkPKdnJwcLV261OnalI0bN8pkMmnixIkhHp3/tba26vbbb1dZWZlWrVql/v37h3pIATV06FCtWLHCadlnn32mhx56SAsXLtSIESNCNLLAufDCC/XKK6/os88+09ChQyVJx44d0yeffKIZM2aEdnABMGDAAH366adOyyoqKnTs2DENHDgwRKMKnrS0NJ155pnauHGjJk+e3LZ8/fr1ys7Ojsi/svft26eCggJNmDBBCxcuDPVwAmrWrFntZomKiop04MABPfTQQzrzzDNDM7AAI6R8Z9q0aVq5cqVuvvlmFRQUqLKyUg8//LCmTZsWkb/AFy5cqM2bN2vevHmqq6tzutnTsGHDIu4NzWKxaPz48S6fO+ecc3TOOecEeUSBN3nyZI0YMUK33nqr5syZo4SEBBUVFclsNuuaa64J9fD8btq0aXrwwQf1wAMPKDc3V9XV1W3XIZ36sdxw1NjYqC1btkj6NnzV1dVp48aNkqRx48YpJSVFt9xyi+bOnavTTz9d48eP1/r167Vr166wvAapq3odDodmzpyphIQETZ8+Xbt3725r26NHD5111lkhGbe3uqo3PT293U3eXn31VVVWVnb43hYJYhyRcAMBP9m/f7/uv/9+ffTRR0pKSlJeXp7mzJkTcb+wJSk3N1cVFRUun3vrrbeUmpoa5BEF3/vvv6/rrrtOL7/8ckTOpEhSVVWVHnroIW3evFktLS0aO3asfv/734fdG7g7HA6HXnjhBa1evVrl5eVKSkpSVlaW5syZ0+UdPMPBV1991e501gkrVqxo+0X10ksvqbi4WIcOHdKgQYN0xx136MILLwzmUP2iq3oldXih/7hx47Ry5cqAjS0Q3D2+J5s3b552796tdevWBXp4IUNIAQAAhhSZH+UAAABhj5ACAAAMiZACAAAMiZACAAAMiZACAAAMiZACAAAMiZACAAAMiZACAAAMiZACAAAMiZACAAAMiZACAAAM6f8DDWhzyUywCnMAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = np.linspace(0, 15, 30)\n", + "\n", + "for n in range(10):\n", + " y1 = Fnut(n, x)\n", + " y2 = Fnu_lambda_safe(n, x)\n", + " e = np.abs(y1-y2)\n", + " print(f\"nu = {n} max error = {e.max()}\")\n", + " plt.stem(x, e)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pyscf-ipu", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/nanoDFT-demo.ipynb b/notebooks/nanoDFT-demo.ipynb index 30c2d61..4b0db13 100644 --- a/notebooks/nanoDFT-demo.ipynb +++ b/notebooks/nanoDFT-demo.ipynb @@ -147,7 +147,7 @@ "def h2_energy(r: float) -> float:\n", " mol = build_mol(h2_geom(r), opts.basis)\n", " energies,_dbginfo = nanoDFT(mol, opts)\n", - " Etotal, E_core, E_J2, negE_K4, E_xc, E_nuc = energies[-1, :]\n", + " Etotal, E_core, E_diff_JK, E_xc, E_nuc = energies[-1, :]\n", " return Etotal\n", "\n", "\n", @@ -189,7 +189,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "efa3bc23", "metadata": {}, "outputs": [], @@ -219,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "id": "25acb1b7", "metadata": {}, "outputs": [ @@ -254,7 +254,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 16, "id": "fc79c21d", "metadata": {}, "outputs": [ @@ -282,67 +282,14 @@ "molecular_orbitals.shape" ] }, - { - "cell_type": "markdown", - "id": "85db5266", - "metadata": {}, - "source": [ - "Below we define functions for visualising the molecular orbitals of benzene using the [py3Dmol](https://3dmol.org/) package" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "63fbdbd2", - "metadata": {}, - "outputs": [], - "source": [ - "def cube_data(axes, value) -> str:\n", - " fmt = \"cube format\\n\\n\"\n", - " x, y, z = axes\n", - " nx, ny, nz = [ax.shape[0] for ax in axes]\n", - " fmt += \"0 \" + \" \".join([f\"{v:12.6f}\" for v in [x[0], y[0], z[0]]]) + \"\\n\"\n", - " fmt += f\"{nx} \" + \" \".join([f\"{v:12.6f}\" for v in [x[1] - x[0], 0.0, 0.0]]) + \"\\n\"\n", - " fmt += f\"{ny} \" + \" \".join([f\"{v:12.6f}\" for v in [0.0, y[1] - y[0], 0.0]]) + \"\\n\"\n", - " fmt += f\"{nz} \" + \" \".join([f\"{v:12.6f}\" for v in [0.0, 0.0, z[1] - z[0]]]) + \"\\n\"\n", - "\n", - " line = \"\"\n", - " for i in range(len(value)):\n", - " line += f\"{value[i]:12.6f}\"\n", - "\n", - " if i % 6 == 0:\n", - " fmt += line + \"\\n\"\n", - " line = \"\"\n", - "\n", - " return fmt\n", - "\n", - "\n", - "def build_transferfn(value) -> dict:\n", - " v = np.percentile(value, [99.9, 75])\n", - " a = [0.02, 0.0005]\n", - " return {\n", - " \"transferfn\": [\n", - " {\"color\": \"blue\", \"opacity\": a[0], \"value\": -v[0]},\n", - " {\"color\": \"blue\", \"opacity\": a[1], \"value\": -v[1]},\n", - " {\"color\": \"white\", \"opacity\": 0.0, \"value\": 0.0},\n", - " {\"color\": \"red\", \"opacity\": a[1], \"value\": v[1]},\n", - " {\"color\": \"red\", \"opacity\": a[0], \"value\": v[0]},\n", - " ]\n", - " }\n", - "\n", - "\n", - "def plot_orbital(orbital, mol):\n", - " xyzfmt = f\"{len(mol.atom)}\\n\\n\" + mol.tostring()\n", - " v = py3Dmol.view(data=xyzfmt, style={\"stick\": {\"radius\": 0.06}, \"sphere\": {\"radius\": 0.2}})\n", - " v.addVolumetricData(cube_data(axes, orbital), \"cube\", build_transferfn(orbital))\n", - " return v" - ] - }, { "cell_type": "markdown", "id": "8efd393a", "metadata": {}, "source": [ + "Below we use `plot_volume` from the `pyscf_ipu.experimental.plot` module to \n", + "visualise the molecular orbitals of benzene using the [py3Dmol](https://3dmol.org/) package.\n", + "\n", "Try changing the `mo_index` variable to select the different molecular orbitals benzene." ] }, @@ -353,10 +300,13 @@ "metadata": {}, "outputs": [], "source": [ + "from pyscf_ipu.experimental.plot import plot_volume\n", + "from pyscf_ipu.experimental.interop import from_pyscf\n", "mo_index = 5\n", "\n", "orbital = molecular_orbitals[:, mo_index]\n", - "mol_view = plot_orbital(orbital, mol)\n", + "structure, _ = from_pyscf(mol)\n", + "mol_view = plot_volume(structure, orbital, axes)\n", "mol_view.spin()" ] } diff --git a/notebooks/plot_utils.py b/notebooks/plot_utils.py index 1643e7d..cd7a817 100644 --- a/notebooks/plot_utils.py +++ b/notebooks/plot_utils.py @@ -1,3 +1,4 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt diff --git a/notebooks/sparse_grid_ao.ipynb b/notebooks/sparse_grid_ao.ipynb index e7eaaea..4944dee 100644 --- a/notebooks/sparse_grid_ao.ipynb +++ b/notebooks/sparse_grid_ao.ipynb @@ -160,7 +160,7 @@ " \n", " for line in output.split(\"\\n\"):\n", " if \"Number of electrons\" in line: num_electrons = line.split(\" \")[-1].replace(' ', '')\n", - " elif \"sparsity_grid_AO\" in line: sparsity_level = line.split(\"=\")[-1]\n", + " elif \"axis=( , ) sparsity in grid_AO:\" in line: sparsity_level = line.split(\"=\")[-1]\n", " elif \"Error Energy\" in line: error_energy = dict(zip(iterations, line.split()[-7:])) \n", " elif \"Error HLGAP\" in line: error_hlgap = dict(zip(iterations, line.split()[-7:]))\n", " \n", @@ -182,47 +182,6 @@ "compute_results(results)" ] }, - { - "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "60\n", - "54\n" - ] - } - ], - "source": [ - "to_del = []\n", - "for pair, value in results.items():\n", - " (mol, thresh) = pair\n", - " if float(thresh) == 0.1:\n", - " to_del.append(pair)\n", - "to_del\n", - "\n", - "print(len(results))\n", - "for delli in to_del:\n", - " results.pop(delli)\n", - "print(len(results))" - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [], - "source": [ - "# Convert tuple keys to string before saving\n", - "str_results = {f\"{key[0]}:{key[1]}\": value for key, value in results.items()}\n", - "# Cache the results after each computation\n", - "with open(results_file, 'w') as f:\n", - " json.dump(str_results, f, indent=4)" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -371,20 +330,6 @@ "# Call the function to plot\n", "plot_sparsity_3d_surface(results)\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/density_functional_theory.py b/pyscf_ipu/dft.py similarity index 91% rename from density_functional_theory.py rename to pyscf_ipu/dft.py index a265dd2..19ac7e4 100644 --- a/density_functional_theory.py +++ b/pyscf_ipu/dft.py @@ -28,6 +28,7 @@ from rdkit import Chem from rdkit.Chem import AllChem from rdkit import RDLogger +from collections import namedtuple from pyscf_ipu.pyscf_utils.minao import minao from pyscf_ipu.pyscf_utils.build_grid import build_grid @@ -43,9 +44,18 @@ lg = RDLogger.logger() lg.setLevel(RDLogger.CRITICAL) +# Constants angstrom_to_bohr = 1.88973 hartree_to_eV = 27.2114 +# Global variables, set from args +g_float32 = False +g_ipu = False +EPSILON_B3LYP = 1e-20 +CLIP_RHO_MIN = 1e-9 +CLIP_RHO_MAX = 1e12 + + def get_atom_string(atoms, locs): atom_string = atoms atoms = re.findall('[a-zA-Z][^A-Z]*', atoms) @@ -54,8 +64,24 @@ def get_atom_string(atoms, locs): str += "%s %4f %4f %4f; "%((atom,) + tuple(loc) ) return atom_string, str -def _do_compute(density_matrix, kinetic, nuclear, overlap, ao, - electron_repulsion, weights, coords, nuclear_energy, disable_cache, mf_diis_space, N, hyb, mask, _input_floats, _input_ints, L_inv=None): +# Explicit list of arguments used in do_compute and callees +do_compute_args_names = ( + 'its', 'backend', 'ipumult', 'seperate','threads_int', + 'intv', 'skiperi', 'randeri', 'float16', 'float32', 'nan', 'forloop', + 'sk', 'xc', 'threads', 'multv', 'debug', + 'skipdiis', 'skipeigh', 'geneigh', 'density_mixing' +) +dcargs_t = namedtuple('dcargs', do_compute_args_names) + +_do_compute_static_argnums = (10,11,16) +def _do_compute(density_matrix, kinetic, nuclear, overlap, ao, # 0-4 + electron_repulsion, weights, coords, # 5-7 + nuclear_energy, disable_cache, # 8-9 + mf_diis_space, N, hyb, mask, _input_floats, # 10,11,12-14 + _input_ints, # 15 + args, # 16 + L_inv=None): + # --- INITIALIZE MATRICES USED FOR DIIS --- # mf_diis_H = np.zeros((mf_diis_space+1, mf_diis_space+1)) mf_diis_H[0,1:] = mf_diis_H[1:,0] = 1 @@ -87,10 +113,10 @@ def _do_compute(density_matrix, kinetic, nuclear, overlap, ao, cs = np.zeros((args.its, mf_diis_space+1)) allvals = np.zeros((args.its, density_matrix.shape[0])) + indxs = None if args.backend == "ipu" and not args.ipumult: from pyscf_ipu.electron_repulsion.direct import prepare_integrals_2_inputs , compute_integrals_2 _, _, _tuple_ijkl, _shapes, _sizes, _counts, indxs, indxs_inv, num_calls = prepare_integrals_2_inputs(mol) - args.indxs = indxs if not args.seperate: electron_repulsion = compute_integrals_2( _input_floats, _input_ints, _tuple_ijkl, _shapes, _sizes, _counts, tuple(indxs_inv), num_threads=args.threads_int, v=args.intv)[0] electron_repulsion = [a for a in electron_repulsion] @@ -114,10 +140,10 @@ def _do_compute(density_matrix, kinetic, nuclear, overlap, ao, _num_calls = np.zeros(num_calls) cycle = 0 if type(electron_repulsion) == type([]): - if args.float32: E_xc, V_xc, E_coulomb, vj, vk = xc( density_matrix.astype(np.float32), dms.astype(np.float32), cycle, ao.astype(np.float32), electron_repulsion, weights.astype(np.float32), vj.astype(np.float32), vk.astype(np.float32), hyb, _num_calls) + if args.float32: E_xc, V_xc, E_coulomb, vj, vk = xc((args, indxs), density_matrix.astype(np.float32), dms.astype(np.float32), cycle, ao.astype(np.float32), electron_repulsion, weights.astype(np.float32), vj.astype(np.float32), vk.astype(np.float32), hyb, _num_calls) else: - if args.float32: E_xc, V_xc, E_coulomb, vj, vk = xc( density_matrix.astype(np.float32), dms.astype(np.float32), cycle, ao.astype(np.float32), electron_repulsion.astype(np.float32), weights.astype(np.float32), vj.astype(np.float32), vk.astype(np.float32), hyb, _num_calls) - else: E_xc, V_xc, E_coulomb, vj, vk = xc( density_matrix.astype(np.float64), dms.astype(np.float64), cycle, ao.astype(np.float64), electron_repulsion.astype(np.float64), weights.astype(np.float64), vj.astype(np.float64), vk.astype(np.float64), hyb, _num_calls) + if args.float32: E_xc, V_xc, E_coulomb, vj, vk = xc((args, indxs), density_matrix.astype(np.float32), dms.astype(np.float32), cycle, ao.astype(np.float32), electron_repulsion.astype(np.float32), weights.astype(np.float32), vj.astype(np.float32), vk.astype(np.float32), hyb, _num_calls) + else: E_xc, V_xc, E_coulomb, vj, vk = xc((args, indxs), density_matrix.astype(np.float64), dms.astype(np.float64), cycle, ao.astype(np.float64), electron_repulsion.astype(np.float64), weights.astype(np.float64), vj.astype(np.float64), vk.astype(np.float64), hyb, _num_calls) vals = [mask, allvals, cs, energies, V_xc, density_matrix, _V, _H, mf_diis_H, vj, vk, eigvals, eigvects, energy, overlap, electron_repulsion, @@ -126,13 +152,13 @@ def _do_compute(density_matrix, kinetic, nuclear, overlap, ao, vals = [f(a, args.float32) for a in vals] if args.nan or args.forloop: - if args.jit: _iter = jax.jit(iter, backend=args.backend) + if args.jit: _iter = jax.jit(dft_iter, backend=args.backend) os.makedirs("numerror/%s/"%(str(args.sk)) , exist_ok=True) for n in tqdm(range(int(args.its))): - if args.jit: vals = _iter(n, vals) - else: vals = iter(n, vals) + if args.jit: vals = _iter((args,indxs), n, vals) + else: vals = dft_iter((args,indxs), n, vals) if args.numerror: _str = ["mask", "allvals", "cs", "energies", "V_xc", "density_matrix", "_V", "_H", "mf_diis_H", @@ -149,9 +175,9 @@ def _do_compute(density_matrix, kinetic, nuclear, overlap, ao, exit() elif args.its == 1: - vals = jax.jit(iter, backend=args.backend)(0, vals) + vals = jax.jit(dft_iter, backend=args.backend)((args,indxs), 0, vals) else: - vals = jax.lax.fori_loop(0, args.its, iter, vals) + vals = jax.lax.fori_loop(0, args.its, lambda i, vals: dft_iter((args,indxs), i, vals), vals) eigenvalues = vals[11] eigenvectors = vals[12] @@ -162,7 +188,13 @@ def _do_compute(density_matrix, kinetic, nuclear, overlap, ao, return energies, energy, eigenvalues, eigenvectors, dms, fixed_hamiltonian, part_energies, L_inv -def density_functional_theory(atom_positions, mf_diis_space=9): +do_compute_jit = None +def compile_do_compute(device_1): + global do_compute_jit + do_compute_jit = jax.jit(_do_compute, device=device_1, static_argnums=_do_compute_static_argnums) + + +def density_functional_theory(atom_positions, args, mf_diis_space=9): if args.backend == "ipu": mf_diis_space = 9 if args.generate: global mol @@ -266,8 +298,6 @@ def density_functional_theory(atom_positions, mf_diis_space=9): assert args.plevel == args.level initialized = False - device_1 = jax.devices(args.backend)[0] - function = jax.jit(_do_compute, device=device_1, static_argnums=(10,11)) if args.seperate: device_2 = jax.devices("ipu")[1] print(device_2) @@ -636,13 +666,22 @@ def callback(envs): times = [time.perf_counter()] if np.sum(np.isnan(density_matrix)) > 0 or density_matrix.shape != kinetic.shape: density_matrix = np.array(minao(mol)) + dcargs_names = ( + 'its', 'backend', 'ipumult', 'seperate','threads_int', + 'intv', 'skiperi', 'randeri', 'float16', 'float32', 'nan', 'forloop', + 'sk', 'xc', 'threads', 'multv', 'debug', + 'skipdiis', 'skipeigh', 'geneigh', 'density_mixing' + ) + + dcargs = dcargs_t(*(args.__dict__[a] for a in do_compute_args_names)) + if not args.forloop: if not args.skip_minao: density_matrix = np.array(minao(mol)) - vals.append( function( density_matrix, kinetic, nuclear, overlap, ao, electron_repulsion, weights, coords, nuclear_energy, 0, mf_diis_space, N, hyb , mask, _input_floats, _input_ints, L_inv) ) + vals.append( do_compute_jit( density_matrix, kinetic, nuclear, overlap, ao, electron_repulsion, weights, coords, nuclear_energy, 0, mf_diis_space, N, hyb , mask, _input_floats, _input_ints, dcargs, L_inv) ) else: # make this into a flag. if not args.skip_minao: density_matrix = np.array(minao(mol)) - vals.append(_do_compute( density_matrix, kinetic, nuclear, overlap, ao, electron_repulsion, weights, coords, nuclear_energy, 0, mf_diis_space, N, hyb , mask, _input_floats, _input_ints, L_inv) ) + vals.append(_do_compute( density_matrix, kinetic, nuclear, overlap, ao, electron_repulsion, weights, coords, nuclear_energy, 0, mf_diis_space, N, hyb , mask, _input_floats, _input_ints, dcargs, L_inv) ) times.append(time.perf_counter()) @@ -668,11 +707,11 @@ def callback(envs): electron_repulsion = [np.asarray(a) for a in electron_repulsion] - vals = jax.jit(_do_compute, static_argnums=(10,11), device=device_1) ( density_matrix, kinetic, nuclear, overlap, + vals = jax.jit(_do_compute, static_argnums=_do_compute_static_argnums, device=device_1) ( density_matrix, kinetic, nuclear, overlap, ao, electron_repulsion, weights, coords, nuclear_energy, 0, mf_diis_space, N, hyb , - mask, input_floats, input_ints, L_inv) + mask, input_floats, input_ints, args, L_inv) energies_, energy, eigenvalues, eigenvectors, dms, fixed_hamiltonian, part_energies, _ = [np.asarray(a).astype(np.float64) for a in vals] print(density_matrix.dtype) @@ -694,7 +733,7 @@ def callback(envs): ao, electron_repulsion, weights, coords, nuclear_energy, 0, mf_diis_space, N, hyb , - mask, input_floats, input_ints, L_inv) + mask, input_floats, input_ints, args, L_inv) print([a.dtype for a in vals]) energies_, energy, eigenvalues, eigenvectors, dms, fixed_hamiltonian, part_energies = [np.asarray(a).astype(np.float64) for a in vals] @@ -710,15 +749,15 @@ def callback(envs): # utility functions for investigating float{64,32} def f(x, float32): - if not args.float32: return x # in float64 mode just return x + if not g_float32: return x # in float64 mode just return x - if args.backend == "ipu": + if g_ipu: try: return x.astype(np.float32) # could (shouldn't) do a copy except: return x - if not args.float32: + if not g_float32: if type(x) == type(.1): return x return x.astype(np.float64) @@ -747,16 +786,18 @@ def body(i, val): xy, error, sum = jax.lax.fori_loop(np.zeros(1, dtype=np.int32), np.asarray(len(x), dtype=np.int32), body, (xy, error, sum)) return sum -def iter( cycle, val ): +def dft_iter(args_indxs, cycle, val ): + args, indxs = args_indxs + mask, allvals, cs, energies, V_xc, density_matrix, _V, _H, mf_diis_H, vj, vk, eigvals, eigvects, energy, overlap, electron_repulsion, \ fixed_hamiltonian, L_inv, weights, hyb, ao, nuclear_energy, num_calls, cholesky, generalized_hamiltonian, sdf, errvec, hamiltonian, dms, part_energies = val for i, a in enumerate(val): try: if type(a) == type([]): - print([(b.shape, b.nbytes/10**6) for b in a]) + print('dft_iter:', [(b.shape, b.nbytes/10**6) for b in a]) else: - if a.nbytes>1000000: print(a.nbytes/10**6, a.shape, i) + if a.nbytes>1000000: print('dft_iter:', a.nbytes/10**6, a.shape, i) except: pass @@ -767,7 +808,7 @@ def iter( cycle, val ): sdf = overlap @ density_matrix @ hamiltonian sdf, hamiltonian, _V, _H, mf_diis_H, fixed_hamiltonian, V_xc, overlap, density_matrix, hamiltonian = f(sdf, d), f(hamiltonian, d), f(_V, d), f(_H,d), f(mf_diis_H, d), f(fixed_hamiltonian, d), f(V_xc, d), f(overlap, d), f(density_matrix, d), f(hamiltonian, d) if not args.skipdiis: - hamiltonian, _V, _H, mf_diis_H, errvec = DIIS(cycle, sdf, hamiltonian, _V, _H, mf_diis_H) + hamiltonian, _V, _H, mf_diis_H, errvec = DIIS(cycle, sdf, hamiltonian, _V, _H, mf_diis_H, args.backend == "ipu", args.float32) d = args.float32 sdf, hamiltonian, _V, _H, mf_diis_H, fixed_hamiltonian, V_xc, overlap, density_matrix, hamiltonian = f(sdf, d), f(hamiltonian, d), f(_V, d), f(_H,d), f(mf_diis_H, d), f(fixed_hamiltonian, d), f(V_xc, d), f(overlap, d), f(density_matrix, d), f(hamiltonian, d) @@ -812,10 +853,10 @@ def iter( cycle, val ): if type(electron_repulsion) == type([]): - if args.float32: E_xc, V_xc, E_coulomb, vj, vk = xc( density_matrix.astype(np.float32), dms.astype(np.float32), cycle, ao.astype(np.float32), electron_repulsion, weights.astype(np.float32), vj.astype(np.float32), vk.astype(np.float32), hyb, num_calls) + if args.float32: E_xc, V_xc, E_coulomb, vj, vk = xc((args, indxs), density_matrix.astype(np.float32), dms.astype(np.float32), cycle, ao.astype(np.float32), electron_repulsion, weights.astype(np.float32), vj.astype(np.float32), vk.astype(np.float32), hyb, num_calls) else: - if args.float32: E_xc, V_xc, E_coulomb, vj, vk = xc( density_matrix.astype(np.float32), dms.astype(np.float32), cycle, ao.astype(np.float32), electron_repulsion.astype(np.float32), weights.astype(np.float32), vj.astype(np.float32), vk.astype(np.float32), hyb, num_calls) - else: E_xc, V_xc, E_coulomb, vj, vk = xc( density_matrix.astype(np.float64), dms.astype(np.float64), cycle, ao.astype(np.float64), electron_repulsion.astype(np.float64), weights.astype(np.float64), vj.astype(np.float64), vk.astype(np.float64), hyb, num_calls) + if args.float32: E_xc, V_xc, E_coulomb, vj, vk = xc((args, indxs), density_matrix.astype(np.float32), dms.astype(np.float32), cycle, ao.astype(np.float32), electron_repulsion.astype(np.float32), weights.astype(np.float32), vj.astype(np.float32), vk.astype(np.float32), hyb, num_calls) + else: E_xc, V_xc, E_coulomb, vj, vk = xc((args, indxs), density_matrix.astype(np.float64), dms.astype(np.float64), cycle, ao.astype(np.float64), electron_repulsion.astype(np.float64), weights.astype(np.float64), vj.astype(np.float64), vk.astype(np.float64), hyb, num_calls) if type(part_energies) == type(jnp.array(1)): part_energies = part_energies.at[cycle].set( E_xc ) else: part_energies[cycle] =E_xc @@ -855,8 +896,9 @@ def body(i, val): return sum -def xc(density_matrix, dms, cycle, ao, electron_repulsion, weights, vj, vk, hyb, num_calls): +def xc(args_indxs, density_matrix, dms, cycle, ao, electron_repulsion, weights, vj, vk, hyb, num_calls): # the f notation below allows testing the error when running entire dft in f64 except a single operation in f32. + args, indxs = args_indxs n = density_matrix.shape[0] @@ -940,8 +982,8 @@ def xc(density_matrix, dms, cycle, ao, electron_repulsion, weights, vj, vk, hyb, density_matrix, _tuple_indices, _tuple_do_lists, _N, num_calls.size, - tuple(args.indxs.tolist()), - tuple(args.indxs.tolist()), + tuple(indxs.tolist()), + tuple(indxs.tolist()), int(args.threads), v=int(args.multv) ) @@ -995,7 +1037,7 @@ def xc(density_matrix, dms, cycle, ao, electron_repulsion, weights, vj, vk, hyb, def _eigh(x): - if args.backend == "ipu" and x.shape[0] >= 6: + if g_ipu and x.shape[0] >= 6: t0 = time.time() print("tracing ipu eigh (%s): "%str(x.shape)) from tessellate_ipu.linalg import ipu_eigh @@ -1015,11 +1057,11 @@ def _eigh(x): eigvects = jnp.roll(eigvects, -(-col)) eigvects = eigvects[:-1] else: - eigvals, eigvects = jnp.linalg.eigh(f(x, args.float32)) + eigvals, eigvects = jnp.linalg.eigh(f(x, g_float32)) return eigvals, eigvects -def DIIS(cycle, sdf, hamiltonian, _V, _H, mf_diis_H): +def DIIS(cycle, sdf, hamiltonian, _V, _H, mf_diis_H, use_ipu, use_float32): # Update hamiltonian as linear combination of previous iterations mf_diis_head = cycle % _V.shape[0] nd, d = _V.shape @@ -1051,12 +1093,12 @@ def DIIS(cycle, sdf, hamiltonian, _V, _H, mf_diis_H): mask_ = jnp.concatenate([jnp.ones(1, dtype=mask.dtype), mask]) masked_mf_diis_H = mf_diis_H[:nd+1, :nd+1] * mask_.reshape(-1, 1) * mask_.reshape(1, -1) - if args.backend == "ipu": + if use_ipu: #c = pinv( masked_mf_diis_H )[0, :] c = pinv0( masked_mf_diis_H ) #c = jnp.linalg.pinv( masked_mf_diis_H )[0, :] else: - c = jnp.linalg.pinv(f(masked_mf_diis_H, args.float32))[0, :] + c = jnp.linalg.pinv(f(masked_mf_diis_H, use_float32))[0, :] scaled_H = _H[:nd] * c[1:].reshape(nd, 1) @@ -1080,9 +1122,10 @@ def pinv0(a): # take out first row c = vect @ ( jnp.where( jnp.abs(vals) > cond, 1/vals, 0) * vect[0, :]) return c -table = None def recompute(args, molecules, id, num, our_fun, str="", atom_string=""): - global table + g_float32 = args.float32 + g_ipu = args.backend == 'ipu' + t0 = time.time() if str == "": @@ -1095,10 +1138,10 @@ def recompute(args, molecules, id, num, our_fun, str="", atom_string=""): mol.build(atom=str, unit="Bohr", basis=args.basis, spin=args.spin, verbose=0) - print("\t", atom_string, end="") + print("recompute:", atom_string, end="") if not args.skipus: - energies, our_energy, our_hlgap, t_us, t_main_loop, us_hlgap = our_fun(str) + energies, our_energy, our_hlgap, t_us, t_main_loop, us_hlgap = our_fun(str, args) if not args.skippyscf: mol = Mole(atom=str, unit='Bohr', basis=args.basis, spin=args.spin) @@ -1155,15 +1198,16 @@ def callback(envs): if molecules is not None: pcq_hlgap = molecules["hlgap"][id] else: pcq_hlgap = -1 + chemAcc = 0.043 print("UNITS IS [eV]!") print("pyscf:\t\t%15f"%pyscf_energy) print("us:\t\t%15f"%our_energy) print("mus:\t\t%15f"%np.mean(energies[-10:])) print("diff:\t\t%15f"%np.abs(pyscf_energy-our_energy)) print("mdiff:\t\t%15f"%np.abs(pyscf_energy-np.mean(energies[-10:])), np.std(energies[-10:])) - print("chemAcc: \t%15f"%0.043) - print("chemAcc/diff: \t%15f"%(0.043/np.abs(pyscf_energy-our_energy))) - print("chemAcc/mdiff: \t%15f"%(0.043/np.abs(pyscf_energy-np.mean(energies[-10:])))) + print("chemAcc: \t%15f"%chemAcc) + print("chemAcc/diff: \t%15f"%(chemAcc/np.abs(pyscf_energy-our_energy))) + print("chemAcc/mdiff: \t%15f"%(chemAcc/np.abs(pyscf_energy-np.mean(energies[-10:])))) print("> diffs:") print(np.abs(energies.reshape(-1)[-5:] - pyscf_energy)) print("mean+-var: %f +- %f"%( np.mean(np.abs(energies.reshape(-1)[-5:] - pyscf_energy)), np.var(np.abs(energies.reshape(-1)[-5:] - pyscf_energy)))) @@ -1255,7 +1299,7 @@ def prepare(val): mol = None _str = None -def jax_dft(str): +def jax_dft(str, args): global mol mol = Mole() @@ -1282,7 +1326,7 @@ def jax_dft(str): ts = [] for step in range(repeats): t0 = time.time() - vals = density_functional_theory(atom_positions) + vals = density_functional_theory(atom_positions, args) energies, e_tot, mo_energy, mo_coeff, dms, L_inv = [np.asarray(a) for a in vals] t = time.time() - t0 e_tot = energies[-1]*hartree_to_eV @@ -1302,8 +1346,7 @@ def jax_dft(str): return energies * hartree_to_eV, e_tot, hlgap, t, t, hlgap - -if __name__ == "__main__": +def get_args(argv=None): parser = argparse.ArgumentParser(description='Arguments for Density Functional Theory. ') parser.add_argument('-generate', action="store_true", help='Enable conformer data generation mode (instead of single point computation). ') parser.add_argument('-num_conformers', default=1000, type=int, help='How many rdkit conformers to perfor DFT for. ') @@ -1383,14 +1426,14 @@ def jax_dft(str): parser.add_argument('-checkc', action="store_true" , help='Check convergence; plot energy every iteration to compare against pyscf. ') parser.add_argument('-geneigh', action="store_true" , help='Use generalized eigendecomposition like pyscf; relies on scipy, only works in debug mode with -forloop. ') - args = parser.parse_args() + return parser.parse_args(argv) - print(sys.argv) - print(natsorted(vars(args).items()) ) +def process_args(args): print("[BASIS]", args.basis) + args.sk = tuple(args.sk) - if -1 in args.sk: args.sk = list(range(20)) + if -1 in args.sk: args.sk = tuple(range(20)) if args.checkc: args.pyscf = True @@ -1398,9 +1441,6 @@ def jax_dft(str): if args.pyscf: args.verbose = True - if args.backend == "cpu": - args.seperate = False - if True: # currently tensor scaling is turned off by default. args.scale_w = 1 @@ -1411,40 +1451,49 @@ def jax_dft(str): args.scale_ghamil = 1 args.scale_eigvects = 1 - - sys.argv = sys.argv[:1] - if args.numerror: args.forloop = True args.backend = "cpu" args.its = 20 - print("") + g_ipu = (args.backend == "ipu") + + if not args.backend == "ipu": + args.seperate = False if args.backend == "ipu": # allows use of cpu float64 in jnp while using float32 on ipu - args.float32 = True - args.sk = list(range(20)) + args.ipu = True + args.sk = tuple(range(20)) args.debug = True if args.float32 or args.float16: - if args.enable64: config.update('jax_enable_x64', True) # - EPSILON_B3LYP = 1e-20 - CLIP_RHO_MIN = 1e-9 - CLIP_RHO_MAX = 1e12 + if args.enable64: config.update('jax_enable_x64', True) else: # float64 config.update('jax_enable_x64', True) - EPSILON_B3LYP = 1e-20 - CLIP_RHO_MIN = 1e-9 - CLIP_RHO_MAX = 1e12 if args.nan: config.update("jax_debug_nans", True) + compile_do_compute(jax.devices(args.backend)[0]) + + return args + +def main(): + args = get_args() + + args = process_args(args) + + print(sys.argv) + print(natsorted(vars(args).items()) ) + + sys.argv = sys.argv[:1] + + print("") + backend = args.backend eigh = _eigh - if args.str != "": recompute(args, None, 0, 0, our_fun=jax_dft, str=args.str) @@ -1454,10 +1503,10 @@ def jax_dft(str): t0 = time.time() print("loading gdb data") - if args.gdb == 10: args.smiles = [a for a in open("gdb/gdb11_size10_sorted.csv", "r").read().split("\n")] - if args.gdb == 9: args.smiles = [a for a in open("gdb/gdb11_size09_sorted.csv", "r").read().split("\n")] - if args.gdb == 7: args.smiles = [a for a in open("gdb/gdb11_size07_sorted.csv", "r").read().split("\n")] - if args.gdb == 8: args.smiles = [a for a in open("gdb/gdb11_size08_sorted.csv", "r").read().split("\n")] + if args.gdb == 10: args.smiles = [a for a in open("data/gdb11_size10_sorted.csv", "r").read().split("\n")] + if args.gdb == 9: args.smiles = [a for a in open("data/gdb11_size09_sorted.csv", "r").read().split("\n")] + if args.gdb == 7: args.smiles = [a for a in open("data/gdb11_size07_sorted.csv", "r").read().split("\n")] + if args.gdb == 8: args.smiles = [a for a in open("data/gdb11_size08_sorted.csv", "r").read().split("\n")] # used as example data for quick testing. if args.gdb == 6: args.smiles = ["c1ccccc1"]*args.num_conformers @@ -1528,3 +1577,6 @@ def jax_dft(str): ["H", (1, 0, 0)], ["H", (0, 1, 0)], ["H", (1, 1, 0)]]) + +if __name__ == "__main__": + main() diff --git a/pyscf_ipu/electron_repulsion/__init__.py b/pyscf_ipu/electron_repulsion/__init__.py index e69de29..3fa68fc 100644 --- a/pyscf_ipu/electron_repulsion/__init__.py +++ b/pyscf_ipu/electron_repulsion/__init__.py @@ -0,0 +1 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. \ No newline at end of file diff --git a/pyscf_ipu/electron_repulsion/direct.sh b/pyscf_ipu/electron_repulsion/direct.sh index e4b7d77..61364bc 100755 --- a/pyscf_ipu/electron_repulsion/direct.sh +++ b/pyscf_ipu/electron_repulsion/direct.sh @@ -5,4 +5,10 @@ cc cpu_int2e_sph.cpp -shared -fpic -o gen.so -lpoplar -lpoputil -fpermissive echo "Done compiling" #echo "Calling from python"; -TF_POPLAR_FLAGS=--show_progress_bar=true python direct.py $@ +export XLA_IPU_PLATFORM_DEVICE_COUNT=1 +export POPLAR_ENGINE_OPTIONS="{ +\"autoReport.outputExecutionProfile\": \"true\", +\"autoReport.directory\": \"profs/\" +}" +export TF_POPLAR_FLAGS=--show_progress_bar=true +python direct.py $@ diff --git a/pyscf_ipu/electron_repulsion/popcint/libcint.c b/pyscf_ipu/electron_repulsion/popcint/libcint.c new file mode 100644 index 0000000..f45cae4 --- /dev/null +++ b/pyscf_ipu/electron_repulsion/popcint/libcint.c @@ -0,0 +1,28667 @@ +// Copyright (c) 2023 Graphcore Ltd. All rights reserved. +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#ifdef __POPC__ +#else + #include +#endif + +#define dtype float +#define print false + +#define CINT_VERSION 6.0.0 +#define CINT_SOVERSION @cint_SOVERSION + +#ifdef I8 +#include +#define FINT int //int +#else +#define FINT int//int +#endif + +#ifdef CACHE_SIZE_I8 +#include +#define CACHE_SIZE_T int64_t +#else +#define CACHE_SIZE_T int64_t +#endif + +#define PTR_EXPCUTOFF 0 +#define PTR_COMMON_ORIG 1 +#define PTR_RINV_ORIG 4 +#define PTR_RINV_ZETA 7 +#define PTR_RANGE_OMEGA 8 +#define PTR_F12_ZETA 9 +#define PTR_GTG_ZETA 10 +#define NGRIDS 11 +#define PTR_GRIDS 12 +#define PTR_ENV_START 20 + +#define CHARGE_OF 0 +#define PTR_COORD 1 +#define NUC_MOD_OF 2 +#define PTR_ZETA 3 +#define PTR_FRAC_CHARGE 4 +#define RESERVE_ATMSLOT 5 +#define ATM_SLOTS 6 + + +#define ATOM_OF 0 +#define ANG_OF 1 +#define NPRIM_OF 2 +#define NCTR_OF 3 +#define KAPPA_OF 4 +#define PTR_EXP 5 +#define PTR_COEFF 6 +#define RESERVE_BASLOT 7 +#define BAS_SLOTS 8 + +#define POSX 0 +#define POSY 1 +#define POSZ 2 +#define POS1 3 + +#define POSXX 0 +#define POSYX 1 +#define POSZX 2 +#define POS1X 3 +#define POSXY 4 +#define POSYY 5 +#define POSZY 6 +#define POS1Y 7 +#define POSXZ 8 +#define POSYZ 9 +#define POSZZ 10 +#define POS1Z 11 +#define POSX1 12 +#define POSY1 13 +#define POSZ1 14 +#define POS11 15 + + +#define TSRX 0 +#define TSRY 1 +#define TSRZ 2 +#define TSRXX 0 +#define TSRXY 1 +#define TSRXZ 2 +#define TSRYX 3 +#define TSRYY 4 +#define TSRYZ 5 +#define TSRZX 6 +#define TSRZY 7 +#define TSRZZ 8 + + +#define MXRYSROOTS 32 +#define ANG_MAX 15 +#define LMAX1 16 +#define CART_MAX 136 +#define SHLS_MAX 1048576 +#define NPRIM_MAX 64 +#define NCTR_MAX 64 + +#define POINT_NUC 1 +#define GAUSSIAN_NUC 2 +#define FRAC_CHARGE_NUC 3 + +#define bas(SLOT,I) bas[BAS_SLOTS * (I) + (SLOT)] +#define atm(SLOT,I) atm[ATM_SLOTS * (I) + (SLOT)] + +#if !defined HAVE_DEFINED_CINTOPT_H +#define HAVE_DEFINED_CINTOPT_H +typedef struct { + dtype rij[3]; + dtype eij; + dtype cceij; +} PairData; +typedef struct { + FINT **index_xyz_array; + FINT **non0ctr; + FINT **sortedidx; + FINT nbas; + dtype **log_max_coeff; + PairData **pairdata; +} CINTOpt; + + +#define HAVE_DEFINED_CINTENVVARS_H +typedef struct { + FINT *atm; + FINT *bas; + dtype *env; + FINT *shls; + FINT natm; + FINT nbas; + + FINT i_l; + FINT j_l; + FINT k_l; + FINT l_l; + FINT nfi; + FINT nfj; + + union {FINT nfk; FINT grids_offset;}; + union {FINT nfl; FINT ngrids;}; + FINT nf; + FINT rys_order; + FINT x_ctr[4]; + + FINT gbits; + FINT ncomp_e1; + FINT ncomp_e2; + FINT ncomp_tensor; + + + FINT li_ceil; + FINT lj_ceil; + FINT lk_ceil; + FINT ll_ceil; + FINT g_stride_i; + FINT g_stride_k; + FINT g_stride_l; + FINT g_stride_j; + FINT nrys_roots; + FINT g_size; + + FINT g2d_ijmax; + FINT g2d_klmax; + dtype common_factor; + dtype expcutoff; + dtype rirj[3]; + dtype rkrl[3]; + dtype *rx_in_rijrx; + dtype *rx_in_rklrx; + + dtype *ri; + dtype *rj; + dtype *rk; + + + union {dtype *rl; dtype *grids;}; + + #ifdef __cplusplus + FINT (*f_g0_2e)(...); + void (*f_g0_2d4d)(...); + void (*f_gout)(...); + #else + FINT (*f_g0_2e)(); + void (*f_g0_2d4d)(); + void (*f_gout)(); + #endif + + + + CINTOpt *opt; + + + int *idx; + dtype ai[1]; + dtype aj[1]; + dtype ak[1]; + dtype al[1]; + dtype fac[1]; + dtype rij[3]; + dtype rkl[3]; +} CINTEnvVars; +#endif + +// using global variable instead of inside envs. +// fixes problem with inconsistency between IPU model and IPU. +//void (*f_gout)(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty); +// +int WHICH_INTEGRAL = -1; + +int INT1E_KIN = 0; +int INT1E_NUC = 1; +int INT1E_OVLP = 2; + +int INT1E_KIN_IP = 3; +int INT1E_NUC_IP = 4; +int INT1E_OVLP_IP = 5; + +int INT2E_SPH = 6; +int INT2E_IP1_SPH = 7; + + +FINT CINTlen_cart(const FINT l); +FINT CINTlen_spinor(const FINT bas_id, const FINT *bas); + +FINT CINTcgtos_cart(const FINT bas_id, const FINT *bas); +FINT CINTcgtos_spheric(const FINT bas_id, const FINT *bas); +FINT CINTcgtos_spinor(const FINT bas_id, const FINT *bas); +FINT CINTcgto_cart(const FINT bas_id, const FINT *bas); +FINT CINTcgto_spheric(const FINT bas_id, const FINT *bas); +FINT CINTcgto_spinor(const FINT bas_id, const FINT *bas); + +void CINTgout1e_int1e_kin(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty); + + + +FINT CINTtot_pgto_spheric(const FINT *bas, const FINT nbas); +FINT CINTtot_pgto_spinor(const FINT *bas, const FINT nbas); + +FINT CINTtot_cgto_cart(const FINT *bas, const FINT nbas); +FINT CINTtot_cgto_spheric(const FINT *bas, const FINT nbas); +FINT CINTtot_cgto_spinor(const FINT *bas, const FINT nbas); + +void CINTshells_cart_offset(FINT ao_loc[], const FINT *bas, const FINT nbas); +void CINTshells_spheric_offset(FINT ao_loc[], const FINT *bas, const FINT nbas); +void CINTshells_spinor_offset(FINT ao_loc[], const FINT *bas, const FINT nbas); + +dtype *CINTc2s_bra_sph(dtype *sph, FINT nket, dtype *cart, FINT l); +dtype *CINTc2s_ket_sph(dtype *sph, FINT nket, dtype *cart, FINT l); +dtype *CINTc2s_ket_sph1(dtype *sph, dtype *cart, FINT lds, FINT ldc, FINT l); + +dtype CINTgto_norm(FINT n, dtype a); + +void CINTinit_2e_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env){}; +void CINTinit_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env); +void CINTdel_2e_optimizer(CINTOpt **opt); +void CINTdel_optimizer(CINTOpt **opt); + +FINT cint2e_cart(dtype *opijkl, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, + CINTOpt *opt); +void cint2e_cart_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env); +FINT cint2e_sph(dtype *opijkl, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, + CINTOpt *opt); +void cint2e_sph_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env); +FINT cint2e(dtype *opijkl, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, + CINTOpt *opt); +void cint2e_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env); + +#ifndef __cplusplus +//#include + +void CINTc2s_ket_spinor_sf1(dtype *gspa, dtype *gspb, dtype *gcart, + FINT lds, FINT ldc, FINT nctr, FINT l, FINT kappa); +void CINTc2s_iket_spinor_sf1(dtype *gspa, dtype *gspb, dtype *gcart, + FINT lds, FINT ldc, FINT nctr, FINT l, FINT kappa); +void CINTc2s_ket_spinor_si1(dtype *gspa, dtype *gspb, dtype *gcart, + FINT lds, FINT ldc, FINT nctr, FINT l, FINT kappa); +void CINTc2s_iket_spinor_si1(dtype *gspa, dtype *gspb, dtype *gcart, + FINT lds, FINT ldc, FINT nctr, FINT l, FINT kappa); +#endif + +#define HAVE_EXPL +#define HAVE_SQRTL + + +#define HAVE_QUADMATH_H + + + +#ifndef M_PI +#define M_PI 3.1415926535897932384626433832795028 +#endif +#define SQRTPI 1.7724538509055160272981674833411451 + + +#define IINC 0 +#define JINC 1 +#define KINC 2 +#define LINC 3 +#define GSHIFT 4 +#define POS_E1 5 +#define POS_E2 6 +#define SLOT_RYS_ROOTS 6 +#define TENSOR 7 + +#define EXPCUTOFF 60 +#ifndef MIN_EXPCUTOFF + +#define MIN_EXPCUTOFF 40 +#endif + +#define OF_CMPLX 2 + +#define GRID_BLKSIZE 104 + +FINT CINTlen_cart(const FINT l); +FINT CINTlen_spinor(const FINT bas_id, const FINT *bas); + +FINT CINTcgtos_cart(const FINT bas_id, const FINT *bas); +FINT CINTcgtos_spheric(const FINT bas_id, const FINT *bas); +FINT CINTcgtos_spinor(const FINT bas_id, const FINT *bas); +FINT CINTcgto_cart(const FINT bas_id, const FINT *bas); +FINT CINTcgto_spheric(const FINT bas_id, const FINT *bas); +FINT CINTcgto_spinor(const FINT bas_id, const FINT *bas); + +FINT CINTtot_pgto_spheric(const FINT *bas, const FINT nbas); +FINT CINTtot_pgto_spinor(const FINT *bas, const FINT nbas); + +FINT CINTtot_cgto_cart(const FINT *bas, const FINT nbas); +FINT CINTtot_cgto_spheric(const FINT *bas, const FINT nbas); +FINT CINTtot_cgto_spinor(const FINT *bas, const FINT nbas); + +void CINTshells_cart_offset(FINT ao_loc[], const FINT *bas, const FINT nbas); +void CINTshells_spheric_offset(FINT ao_loc[], const FINT *bas, const FINT nbas); +void CINTshells_spinor_offset(FINT ao_loc[], const FINT *bas, const FINT nbas); + +void CINTcart_comp(FINT *nx, FINT *ny, FINT *nz, const FINT lmax); + + + +#define NOVALUE ((void *)0xffffffffffffffffuL) +#define MAX_PGTO_FOR_PAIRDATA 2048 + +void CINTinit_2e_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env); +void CINTinit_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env); +void CINTdel_2e_optimizer(CINTOpt **opt); +void CINTdel_optimizer(CINTOpt **opt); +void CINTdel_pairdata_optimizer(CINTOpt *cintopt); +void CINTOpt_log_max_pgto_coeff(dtype *log_maxc, dtype *coeff, FINT nprim, FINT nctr); +void CINTOpt_log_max_pgto_coeff(dtype *log_maxc, dtype *coeff, FINT nprim, FINT nctr); +//void CINTOpt_set_log_maxc(CINTOpt *opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); +//void CINTOpt_setij(CINTOpt *opt, FINT *ng, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); +void CINTOpt_non0coeff_byshell(FINT *sortedidx, FINT *non0ctr, dtype *ci, FINT iprim, FINT ictr); +void CINTOpt_set_non0coeff(CINTOpt *opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env); +FINT CINTset_pairdata(PairData *pairdata, dtype *ai, dtype *aj, dtype *ri, dtype *rj, + dtype *log_maxci, dtype *log_maxcj, + FINT li_ceil, FINT lj_ceil, FINT iprim, FINT jprim, + dtype rr_ij, dtype expcutoff, dtype *env); + +void CINTOpt_4cindex_xyz(CINTOpt *opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); +void CINTOpt_3cindex_xyz(CINTOpt *opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); +void CINTOpt_2cindex_xyz(CINTOpt *opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); +void CINTOpt_3c1eindex_xyz(CINTOpt *opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); + + +void CINTno_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env); +void CINTall_1e_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env){} +void CINTall_2e_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env){} +void CINTall_3c2e_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env){} +void CINTall_2c2e_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env){} +void CINTall_3c1e_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env){} +void CINTall_1e_grids_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env){} + +#ifdef WITH_F12 +void CINTall_2e_stg_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); +#endif + +#ifndef HAVE_DEFINED_APPROX_LOG +#define HAVE_DEFINED_APPROX_LOG +#ifdef __X86__ + + + + + + + + + + + + +#define approx_log log +#else +#define approx_log log +#endif +#endif + + + +void CINTinit_int1e_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); +void CINTinit_int3c1e_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); + +void CINTg1e_index_xyz(FINT *idx, CINTEnvVars *envs); + +FINT CINTg1e_ovlp(dtype *g, CINTEnvVars *envs); + +FINT CINTg1e_nuc(dtype *g, CINTEnvVars *envs, FINT nuc_id); + +void CINTnabla1i_1e(dtype *f, dtype *g, + FINT li, FINT lj, FINT lk, CINTEnvVars *envs); + +void CINTnabla1j_1e(dtype *f, dtype *g, + FINT li, FINT lj, FINT lk, CINTEnvVars *envs); + +void CINTnabla1k_1e(dtype *f, dtype *g, + FINT li, FINT lj, FINT lk, CINTEnvVars *envs); + +void CINTx1i_1e(dtype *f, dtype *g, dtype ri[3], + FINT li, FINT lj, FINT lk, CINTEnvVars *envs); + +void CINTx1j_1e(dtype *f, dtype *g, dtype rj[3], + FINT li, FINT lj, FINT lk, CINTEnvVars *envs); + +void CINTx1k_1e(dtype *f, dtype *g, dtype rk[3], + FINT li, FINT lj, FINT lk, CINTEnvVars *envs); + +void CINTprim_to_ctr(dtype *gc, FINT nf, dtype *gp, + FINT inc, FINT nprim, + FINT nctr, dtype *pcoeff); + +dtype CINTcommon_fac_sp(FINT l); + +void CINTprim_to_ctr_0(dtype *gc, dtype *gp, dtype *coeff, size_t nf, + FINT nprim, FINT nctr, FINT non0ctr, FINT *sortedidx); +void CINTprim_to_ctr_1(dtype *gc, dtype *gp, dtype *coeff, size_t nf, + FINT nprim, FINT nctr, FINT non0ctr, FINT *sortedidx); + +#define G1E_D_I(f, g, li, lj, lk) CINTnabla1i_1e(f, g, li, lj, lk, envs) +#define G1E_D_J(f, g, li, lj, lk) CINTnabla1j_1e(f, g, li, lj, lk, envs) +#define G1E_D_K(f, g, li, lj, lk) CINTnabla1k_1e(f, g, li, lj, lk, envs) + +#define G1E_R0I(f, g, li, lj, lk) CINTx1i_1e(f, g, envs->ri, li, lj, lk, envs) +#define G1E_R0J(f, g, li, lj, lk) CINTx1j_1e(f, g, envs->rj, li, lj, lk, envs) +#define G1E_R0K(f, g, li, lj, lk) CINTx1k_1e(f, g, envs->rk, li, lj, lk, envs) + +#define G1E_RCI(f, g, li, lj, lk) CINTx1i_1e(f, g, dri, li, lj, lk, envs) +#define G1E_RCJ(f, g, li, lj, lk) CINTx1j_1e(f, g, drj, li, lj, lk, envs) +#define G1E_RCK(f, g, li, lj, lk) CINTx1k_1e(f, g, drk, li, lj, lk, envs) + +#define G1E_R_I(f, g, li, lj, lk) f = g + envs->g_stride_i +#define G1E_R_J(f, g, li, lj, lk) f = g + envs->g_stride_j +#define G1E_R_K(f, g, li, lj, lk) f = g + envs->g_stride_k + + + +//#include + +FINT CINT1e_loop(dtype *gctr, CINTEnvVars *envs, dtype *cache, FINT int1e_type); + +CACHE_SIZE_T CINT1e_drv(dtype *out, FINT *dims, CINTEnvVars *envs, dtype *cache, void (*f_c2s)(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache), FINT int1e_type); + +CACHE_SIZE_T CINT1e_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, + dtype *cache, void (*f_c2s)(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache), FINT int1e_type); + +dtype CINTnuc_mod(dtype aij, FINT nuc_id, FINT *atm, dtype *env); + +CACHE_SIZE_T int1e_cache_size(CINTEnvVars *envs); + +#ifdef __cplusplus +CACHE_SIZE_T CINT3c1e_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(...), FINT int_type, FINT is_ssc); +CACHE_SIZE_T CINT3c1e_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(...), FINT int_type, FINT is_ssc); +#else +CACHE_SIZE_T CINT3c1e_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(), FINT int_type, FINT is_ssc); +CACHE_SIZE_T CINT3c1e_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(), FINT int_type, FINT is_ssc); +#endif + +#define INT1E_TYPE_OVLP 0 +#define INT1E_TYPE_RINV 1 +#define INT1E_TYPE_NUC 2 + +CACHE_SIZE_T CINT1e_grids_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, + dtype *cache, void (*f_c2s)(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache)); +CACHE_SIZE_T CINT1e_grids_drv(dtype *out, FINT *dims, CINTEnvVars *envs, + dtype *cache, void (*f_c2s)(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache)); + + + +#include + + + +#if defined __cplusplus +extern "C" { +#endif +//#include + +void CINTdset0(FINT n, dtype *x); +void CINTdaxpy2v(const FINT n, dtype a, dtype *x, dtype *y, dtype *v); +void CINTdmat_transpose(dtype *a_t, dtype *a, FINT m, FINT n); +void CINTdplus_transpose(dtype *a_t, dtype *a, FINT m, FINT n); +void CINTzmat_transpose(dtype *a_t, dtype *a, FINT m, FINT n); +void CINTzmat_dagger(dtype *a_c, dtype *a, FINT m, FINT n); + +void CINTdgemm_NN(FINT m, FINT n, FINT k, + dtype *a, dtype *b, dtype *c); +void CINTdgemm_NN1(FINT m, FINT n, FINT k, + dtype *a, dtype *b, dtype *c, FINT ldc); +void CINTdgemm_TN(FINT m, FINT n, FINT k, + dtype *a, dtype *b, dtype *c); +void CINTdgemm_NT(FINT m, FINT n, FINT k, + dtype *a, dtype *b, dtype *c); +#if defined __cplusplus +} +#endif + +#define MIN(X,Y) ((X)<(Y)?(X):(Y)) +#define MAX(X,Y) ((X)>(Y)?(X):(Y)) +#define SQUARE(r) ((r)[0]*(r)[0] + (r)[1]*(r)[1] + (r)[2]*(r)[2]) + +void CINTdcmplx_re(const FINT n, dtype *z, const dtype *re); +void CINTdcmplx_im(const FINT n, dtype *z, const dtype *im); +void CINTdcmplx_pp(const FINT n, dtype *z, const dtype *re, const dtype *im); +void CINTdcmplx_pn(const FINT n, dtype *z, const dtype *re, const dtype *im); +void CINTdcmplx_np(const FINT n, dtype *z, const dtype *re, const dtype *im); +void CINTdcmplx_nn(const FINT n, dtype *z, const dtype *re, const dtype *im); + +dtype CINTsquare_dist(const dtype *r1, const dtype *r2); + +dtype CINTgto_norm(FINT n, dtype a); + + +#ifdef __cplusplus +#define MALLOC_INSTACK(var, n) \ + var = reinterpret_cast(new char[(n) * sizeof(*var)]); + +#define MALLOC(type, var) \ + type var[256]; + +#else +#define MALLOC_INSTACK(var, n) \ + var = (void *)(((uintptr_t)cache + 7) & (-(uintptr_t)8)); \ + cache = (dtype *)(var + (n)); +#endif + +/*#ifdef __cplusplus +#define //var = reinterpret_cast(new char[(n) * sizeof(*var)]); + var = reinterpret_cast(new char[(1024) * sizeof(*var)]); + //var = reinterpret_cast(new char[(n) * sizeof(*var)]); + +#else +#define MALLOC_INSTACK(var, n) \ + var = (void *)(((uintptr_t)cache + 7) & (-(uintptr_t)8)); \ + cache = (dtype *)(var + (n)); +#endif */ + +#ifdef __cplusplus +#define MALLOC_ALIGN8_INSTACK(var, n) \ + var = reinterpret_cast(new char[(n) * sizeof(*var)]); + //var = reinterpret_cast(new char[(n) * sizeof(*var)]); + //var = reinterpret_cast(new char[(n) * sizeof(*var)]); +#else +#define MALLOC_ALIGN8_INSTACK(var, n) \ + var = (void *)(((uintptr_t)cache + 63) & (-(uintptr_t)64)); \ + cache = (dtype *)(var + (n)); +#endif + +#ifdef WITH_CINT2_INTERFACE +#define ALL_CINT(NAME) \ +FINT c##NAME##_cart(dtype *out, FINT *shls, FINT *atm, FINT natm, \ + FINT *bas, FINT nbas, dtype *env, CINTOpt *opt) { \ + return NAME##_cart(out, NULL, shls, atm, natm, bas, nbas, env, opt, NULL); \ +} \ +void c##NAME##_cart_optimizer(CINTOpt **opt, FINT *atm, FINT natm, \ + FINT *bas, FINT nbas, dtype *env) { \ + NAME##_optimizer(opt, atm, natm, bas, nbas, env); \ +} \ +FINT c##NAME##_sph(dtype *out, FINT *shls, FINT *atm, FINT natm, \ + FINT *bas, FINT nbas, dtype *env, CINTOpt *opt) { \ + return NAME##_sph(out, NULL, shls, atm, natm, bas, nbas, env, opt, NULL); \ +} \ +void c##NAME##_sph_optimizer(CINTOpt **opt, FINT *atm, FINT natm, \ + FINT *bas, FINT nbas, dtype *env) { \ + NAME##_optimizer(opt, atm, natm, bas, nbas, env); \ +} \ +FINT c##NAME(dtype *out, FINT *shls, FINT *atm, FINT natm, \ + FINT *bas, FINT nbas, dtype *env, CINTOpt *opt) { \ + return NAME##_spinor((dtype *)out, NULL, shls, \ + atm, natm, bas, nbas, env, opt, NULL); \ +} \ +void c##NAME##_optimizer(CINTOpt **opt, FINT *atm, FINT natm, \ + FINT *bas, FINT nbas, dtype *env) { \ + NAME##_optimizer(opt, atm, natm, bas, nbas, env); \ +} + +#define ALL_CINT1E(NAME) \ +FINT c##NAME##_cart(dtype *out, FINT *shls, FINT *atm, FINT natm, \ + FINT *bas, FINT nbas, dtype *env) { \ + return NAME##_cart(out, NULL, shls, atm, natm, bas, nbas, env, NULL, NULL); \ +} \ +FINT c##NAME##_sph(dtype *out, FINT *shls, FINT *atm, FINT natm, \ + FINT *bas, FINT nbas, dtype *env) { \ + return NAME##_sph(out, NULL, shls, atm, natm, bas, nbas, env, NULL, NULL); \ +} \ +FINT c##NAME(dtype *out, FINT *shls, FINT *atm, FINT natm, \ + FINT *bas, FINT nbas, dtype *env) { \ + return NAME##_spinor((dtype *)out, NULL, shls, \ + atm, natm, bas, nbas, env, NULL, NULL); \ +} + +#else + +#define ALL_CINT(NAME) +#define ALL_CINT1E(NAME) + +#endif + + + + +//#include + +void c2s_sph_1e(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_sph_2e1(dtype *fijkl, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_sph_2e2(); + +void c2s_cart_1e(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_cart_2e1(dtype *fijkl, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_cart_2e2(); + +void c2s_sf_1e(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_sf_1ei(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); + +void c2s_si_1e(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_si_1ei(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); + +void c2s_sph_1e_grids(dtype *out, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_cart_1e_grids(dtype *out, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); + +void c2s_sf_1e_grids(dtype *out, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_sf_1e_gridsi(dtype *out, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_si_1e_grids(dtype *out, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_si_1e_gridsi(dtype *out, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); + +void c2s_sf_2e1(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_sf_2e1i(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); + +void c2s_sf_2e2(dtype *fijkl, dtype *opij, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_sf_2e2i(dtype *fijkl, dtype *opij, FINT *dims, CINTEnvVars *envs, dtype *cache); + +void c2s_si_2e1(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_si_2e1i(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); + +void c2s_si_2e2(dtype *fijkl, dtype *opij, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_si_2e2i(dtype *fijkl, dtype *opij, FINT *dims, CINTEnvVars *envs, dtype *cache); + +void c2s_sph_3c2e1(dtype *fijkl, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_cart_3c2e1(dtype *fijkl, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_sph_3c2e1_ssc(dtype *fijkl, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); + +void c2s_sf_3c2e1(dtype *opijk, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_sf_3c2e1i(dtype *opijk, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_si_3c2e1(dtype *opijk, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_si_3c2e1i(dtype *opijk, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_sf_3c2e1_ssc(dtype *opijk, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_sf_3c2e1i_ssc(dtype *opijk, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_si_3c2e1_ssc(dtype *opijk, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_si_3c2e1i_ssc(dtype *opijk, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); + +void c2s_sph_3c1e(dtype *fijkl, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); +void c2s_cart_3c1e(dtype *fijkl, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache); + +void c2s_dset0(dtype *out, FINT *dims, FINT *counts); +void c2s_zset0(dtype *out, FINT *dims, FINT *counts); +void c2s_grids_dset0(dtype *out, FINT *dims, FINT *counts); +void c2s_grids_zset0(dtype *out, FINT *dims, FINT *counts); + + +void c2s_sph_vec(dtype *sph, dtype *cart, FINT l, FINT nvec); + + + +#ifdef WITH_FORTRAN + +#define ALL_CINT_FORTRAN_(NAME) \ +FINT c##NAME##_sph_(dtype *out, FINT *shls, FINT *atm, FINT *natm, \ + FINT *bas, FINT *nbas, dtype *env, size_t optptr_as_integer8) { \ + CINTOpt **opt = (CINTOpt **)optptr_as_integer8; \ + return NAME##_sph(out, NULL, shls, \ + atm, *natm, bas, *nbas, env, *opt, NULL); \ +} \ +void c##NAME##_sph_optimizer_(size_t optptr_as_integer8, FINT *atm, FINT *natm, \ + FINT *bas, FINT *nbas, dtype *env) { \ + CINTOpt **opt = (CINTOpt **)optptr_as_integer8; \ + NAME##_optimizer(opt, atm, *natm, bas, *nbas, env); \ +} \ +FINT c##NAME##_cart_(dtype *out, FINT *shls, FINT *atm, FINT *natm, \ + FINT *bas, FINT *nbas, dtype *env, size_t optptr_as_integer8) { \ + CINTOpt **opt = (CINTOpt **)optptr_as_integer8; \ + return NAME##_cart(out, NULL, shls, \ + atm, *natm, bas, *nbas, env, *opt, NULL); \ +} \ +void c##NAME##_cart_optimizer_(CINTOpt **opt, FINT *atm, FINT *natm, \ + FINT *bas, FINT *nbas, dtype *env) { \ + NAME##_optimizer(opt, atm, *natm, bas, *nbas, env); \ +} \ +FINT c##NAME##_(dtype *out, FINT *shls, FINT *atm, FINT *natm, \ + FINT *bas, FINT *nbas, dtype *env, size_t optptr_as_integer8) { \ + CINTOpt **opt = (CINTOpt **)optptr_as_integer8; \ + return NAME##_spinor((dtype *)out, NULL, shls, \ + atm, *natm, bas, *nbas, env, *opt, NULL); \ +} \ +void c##NAME##_optimizer_(size_t optptr_as_integer8, FINT *atm, FINT *natm, \ + FINT *bas, FINT *nbas, dtype *env) { \ + CINTOpt **opt = (CINTOpt **)optptr_as_integer8; \ + NAME##_optimizer(opt, atm, *natm, bas, *nbas, env); \ +} + +#define ALL_CINT1E_FORTRAN_(NAME) \ +FINT c##NAME##_sph_(dtype *out, FINT *shls, FINT *atm, FINT *natm, \ + FINT *bas, FINT *nbas, dtype *env) { \ + return NAME##_sph(out, NULL, shls, atm, *natm, bas, *nbas, env, NULL, NULL); \ +} \ +FINT c##NAME##_cart_(dtype *out, FINT *shls, FINT *atm, FINT *natm, \ + FINT *bas, FINT *nbas, dtype *env) { \ + return NAME##_cart(out, NULL, shls, \ + atm, *natm, bas, *nbas, env, NULL, NULL); \ +} \ +FINT c##NAME##_(dtype *out, FINT *shls, FINT *atm, FINT *natm, \ + FINT *bas, FINT *nbas, dtype *env) { \ + return NAME##_spinor((dtype *)out, NULL, shls, \ + atm, *natm, bas, *nbas, env, NULL, NULL); \ +} + +#else + +#define ALL_CINT_FORTRAN_(NAME) +#define ALL_CINT1E_FORTRAN_(NAME) + +#endif + +#define PRIM2CTR0(ctrsymb, gp, ngp) \ + if (ctrsymb##_ctr > 1) {\ + if (*ctrsymb##empty) { \ + CINTprim_to_ctr_0(gctr##ctrsymb, gp, c##ctrsymb+ctrsymb##p, \ + ngp, ctrsymb##_prim, ctrsymb##_ctr, \ + non0ctr##ctrsymb[ctrsymb##p], \ + non0idx##ctrsymb+ctrsymb##p*ctrsymb##_ctr); \ + } else { \ + CINTprim_to_ctr_1(gctr##ctrsymb, gp, c##ctrsymb+ctrsymb##p, \ + ngp, ctrsymb##_prim, ctrsymb##_ctr, \ + non0ctr##ctrsymb[ctrsymb##p], \ + non0idx##ctrsymb+ctrsymb##p*ctrsymb##_ctr); \ + } \ + } \ + *ctrsymb##empty = 0 + +static void make_g1e_gout(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT empty, FINT int1e_type); + +void CINTOpt_non0coeff_byshell(FINT *sortedidx, FINT *non0ctr, dtype *ci, FINT iprim, FINT ictr) { + FINT ip, j, k, kp; + //FINT zeroidx[ictr]; + FINT zeroidx[100]; + for (ip = 0; ip < iprim; ip++) { + for (j = 0, k = 0, kp = 0; j < ictr; j++) { + if (ci[iprim*j+ip] != 0) { + sortedidx[k] = j; + k++; + } else { + zeroidx[kp] = j; + kp++; + } + } + + for (j = 0; j < kp; j++) { + sortedidx[k+j] = zeroidx[j]; + } + non0ctr[ip] = k; + sortedidx += ictr; + } +} + +FINT CINT1e_loop(dtype *gctr, CINTEnvVars *envs, dtype *cache, FINT int1e_type) { + if (print) printf("inside CINT1e_loop\n"); + //printf("inside CINT1e_loop\n"); + + FINT *shls = envs->shls; + FINT *bas = envs->bas; + dtype *env = envs->env; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT i_prim = bas(NPRIM_OF, i_sh); + FINT j_prim = bas(NPRIM_OF, j_sh); + //printf("i_primt/j_prim, %d %d\n", i_prim, j_prim); + dtype *ai = env + bas(PTR_EXP, i_sh); + dtype *aj = env + bas(PTR_EXP, j_sh); + dtype *ci = env + bas(PTR_COEFF, i_sh); + dtype *cj = env + bas(PTR_COEFF, j_sh); + FINT n_comp = envs->ncomp_e1 * envs->ncomp_tensor; + + dtype expcutoff = envs->expcutoff; + dtype *log_maxcj; + PairData *pdata_ij; + //MALLOC_INSTACK(log_maxci, i_prim+j_prim); + //MALLOC_INSTACK(pdata_base, i_prim*j_prim); + MALLOC(dtype, log_maxci); + MALLOC(PairData, pdata_base); + log_maxcj = log_maxci + i_prim; + + + //if (print) printf("before opt_log_max_pgto\n"); + //printf("before opt_log_max_pgto\n"); + CINTOpt_log_max_pgto_coeff(log_maxci, ci, i_prim, i_ctr); + CINTOpt_log_max_pgto_coeff(log_maxcj, cj, j_prim, j_ctr); + //if (print) printf("after\n"); + //printf("after\n"); + + if (CINTset_pairdata(pdata_base, ai, aj, envs->ri, envs->rj, + log_maxci, log_maxcj, envs->li_ceil, envs->lj_ceil, + i_prim, j_prim, SQUARE(envs->rirj), expcutoff, env)) { + printf("inside CINTset_pairdata\n"); + return 0; + } + else{ + //printf("Not isnide CINTset_pairdat\n"); + + } + //printf("after CINset\n"); + + dtype fac1i, fac1j, expij; + FINT ip, jp; + FINT empty[4] = {1, 1, 1, 1}; + FINT *gempty = empty + 0; + FINT *iempty = empty + 1; + FINT *jempty = empty + 2; + dtype *rij; + //FINT *idx; + //MALLOC_INSTACK(idx, envs->nf * 3); + MALLOC(FINT, idx); + CINTg1e_index_xyz(idx, envs); + + FINT *non0idxi, *non0idxj; + //FINT *non0ctri, *non0ctrj; + //MALLOC_INSTACK(non0ctri, i_prim+j_prim+i_prim*i_ctr+j_prim*j_ctr); + FINT *non0ctrj; + MALLOC(FINT, non0ctri); + + non0ctrj = non0ctri + i_prim; + non0idxi = non0ctrj + j_prim; + non0idxj = non0idxi + i_prim*i_ctr; + CINTOpt_non0coeff_byshell(non0idxi, non0ctri, ci, i_prim, i_ctr); + CINTOpt_non0coeff_byshell(non0idxj, non0ctrj, cj, j_prim, j_ctr); + + const FINT nc = i_ctr * j_ctr; + + const FINT leng = envs->g_size * 3 * ((1<gbits)+1); + const FINT lenj = envs->nf * nc * n_comp; + const FINT leni = envs->nf * i_ctr * n_comp; + const FINT len0 = envs->nf * n_comp; + const FINT len = leng + lenj + leni + len0; + //dtype *g, *gout, *gctri, *gctrj; + //MALLOC_INSTACK(g, len); + dtype *gout, *gctri, *gctrj; + MALLOC(dtype, g); + dtype *g1 = g + leng; + if (n_comp == 1) { + gctrj = gctr; + } else { + gctrj = g1; + g1 += lenj; + } + if (j_ctr == 1) { + gctri = gctrj; + iempty = jempty; + } else { + gctri = g1; + g1 += leni; + } + if (i_ctr == 1) { + gout = gctri; + gempty = iempty; + } else { + gout = g1; + } + + dtype common_factor = envs->common_factor + * CINTcommon_fac_sp(envs->i_l) * CINTcommon_fac_sp(envs->j_l); + + + + pdata_ij = pdata_base; + for (jp = 0; jp < j_prim; jp++) { + envs->aj[0] = aj[jp]; + if (j_ctr == 1) { + fac1j = common_factor * cj[jp]; + } else { + fac1j = common_factor; + *iempty = 1; + } + for (ip = 0; ip < i_prim; ip++, pdata_ij++) { + //printf("[%d : %d]\n", jp, ip); + if (pdata_ij->cceij > expcutoff) { + continue; + } + envs->ai[0] = ai[ip]; + expij = pdata_ij->eij; + rij = pdata_ij->rij; + envs->rij[0] = rij[0]; + envs->rij[1] = rij[1]; + envs->rij[2] = rij[2]; + if (i_ctr == 1) { + fac1i = fac1j*ci[ip]*expij; + } else { + fac1i = fac1j*expij; + } + envs->fac[0] = fac1i; + //printf("before gout\n"); + make_g1e_gout(gout, g, idx, envs, *gempty, int1e_type); + PRIM2CTR0(i, gout, envs->nf*n_comp); + //printf("done iteration\n"); + + //for (int t = 0; t < 3; t++){ + // printf("%f ", gout[t]); + //} + //printf("\n"); + // all the same for ipnuc_sph here! + } + if (!*iempty) { + PRIM2CTR0(j, gctri, envs->nf*i_ctr*n_comp); + } + } + + //printf("ASDKLADKLAJDKLJSKDJASKLDJKLAJSDLKA\n"); + + if (n_comp > 1 && !*jempty) { + //printf("!!!!!!!!doing transpose!!!!!!!!!!\n"); + CINTdmat_transpose(gctr, gctrj, envs->nf*nc, n_comp); + } + else { + //printf("NOT DOING TRANSPOSE\n"); + } + + //printf("\n"); + + return !*jempty; +} + +CACHE_SIZE_T int1e_cache_size(CINTEnvVars *envs) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_prim = bas(NPRIM_OF, shls[0]); + FINT j_prim = bas(NPRIM_OF, shls[1]); + FINT *x_ctr = envs->x_ctr; + FINT nc = envs->nf * x_ctr[0] * x_ctr[1]; + FINT n_comp = envs->ncomp_e1 * envs->ncomp_tensor; + FINT leng = envs->g_size*3*((1<gbits)+1); + FINT lenj = envs->nf * nc * n_comp; + FINT leni = envs->nf * x_ctr[0] * n_comp; + FINT len0 = envs->nf*n_comp; + FINT pdata_size = (i_prim*j_prim * 5 + + i_prim * x_ctr[0] + + j_prim * x_ctr[1] + +(i_prim+j_prim)*2 + envs->nf*3); + FINT cache_size = MAX(nc*n_comp + leng+lenj+leni+len0 + pdata_size, + nc*n_comp + envs->nf*8*OF_CMPLX); + return cache_size; +} + + +CACHE_SIZE_T CINT1e_drv(dtype *out, FINT *dims, CINTEnvVars *envs, + dtype *cache, void (*f_c2s)(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache), FINT int1e_type) +{ + if (print) printf("inside CINT1e_drv\n"); + + /*if (out == NULL) {// + printf("out null\n"); + //return 128; //int1e_cache_size(envs); + }*/ + FINT *x_ctr = envs->x_ctr; + FINT nc = envs->nf * x_ctr[0] * x_ctr[1]; + FINT n_comp = envs->ncomp_e1 * envs->ncomp_tensor; + //dtype *stack = NULL; + MALLOC(dtype, stack); + /*if (cache == NULL) { + size_t cache_size = 128;//int1e_cache_size(envs); + #ifdef __cplusplus + //stack = new dtype[10000]; + #else + stack = malloc(sizeof(dtype)*cache_size); + #endif + cache = stack; + }*/ + //dtype *gctr; + //MALLOC_INSTACK(gctr, nc*n_comp); + MALLOC(dtype, gctr); + + if (print) printf("before CINt1e_loop\n"); + FINT has_value = CINT1e_loop(gctr, envs, cache, int1e_type); + if (print) printf("after CINT1e_loop\n"); + + + /*printf("\t"); + for (int i = 0; i < 12; i++){ + printf("%f ", gctr[i]); + } + printf("\n");*/ + + + FINT counts[4]; + if (dims == NULL) { + dims = counts; + } + if (f_c2s == &c2s_sph_1e) { + counts[0] = (envs->i_l*2+1) * x_ctr[0]; + counts[1] = (envs->j_l*2+1) * x_ctr[1]; + } else if (f_c2s == &c2s_cart_1e) { + counts[0] = envs->nfi * x_ctr[0]; + counts[1] = envs->nfj * x_ctr[1]; + } + counts[2] = 1; + counts[3] = 1; + FINT nout = dims[0] * dims[1]; + FINT n; + if (print) printf("before c2s_dset0\n"); + if (has_value) { + for (n = 0; n < n_comp; n++) { + (*f_c2s)(out+nout*n, gctr+nc*n, dims, envs, cache); + } + } else { + for (n = 0; n < n_comp; n++) { + c2s_dset0(out+nout*n, dims, counts); + } + } + + + + /*if (stack != NULL) { + + //free(stack); + }*/ + if (print) printf("return cint1e_drv\n"); + return has_value; +} + +CACHE_SIZE_T CINT1e_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, + dtype *cache, void (*f_c2s)(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache), FINT int1e_type) +{ + return 0; // todo + if (out == NULL) { + return int1e_cache_size(envs); + } + FINT *x_ctr = envs->x_ctr; + FINT nc = envs->nf * x_ctr[0] * x_ctr[1] * envs->ncomp_e1; + dtype *stack = NULL; + if (cache == NULL) { + size_t cache_size = int1e_cache_size(envs); + #ifdef __cplusplus + stack = new dtype[10000]; + #else + stack = malloc(sizeof(dtype)*cache_size); + #endif + cache = stack; + } + dtype *gctr; + MALLOC_INSTACK(gctr, nc*envs->ncomp_tensor); + + FINT has_value = CINT1e_loop(gctr, envs, cache, int1e_type); + + FINT counts[4]; + if (dims == NULL) { + dims = counts; + } + counts[0] = CINTcgto_spinor(envs->shls[0], envs->bas); + counts[1] = CINTcgto_spinor(envs->shls[1], envs->bas); + counts[2] = 1; + counts[3] = 1; + FINT nout = dims[0] * dims[1]; + FINT n; + if (has_value) { + for (n = 0; n < envs->ncomp_tensor; n++) { + (*f_c2s)(out+nout*n, gctr+nc*n, dims, envs, cache); + } + } else { + for (n = 0; n < envs->ncomp_tensor; n++) { + c2s_zset0(out+nout*n, dims, counts); + } + } + + if (stack != NULL) { + //free(stack); + } + return has_value; +} + + +void CINTgout1e(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT empty) +{ + FINT nf = envs->nf; + FINT n, ix, iy, iz; + if (empty) { + for (n = 0; n < nf; n++) { + ix = idx[n*3+0]; + iy = idx[n*3+1]; + iz = idx[n*3+2]; + gout[n] = g[ix] * g[iy] * g[iz]; + } + } else { + for (n = 0; n < nf; n++) { + ix = idx[n*3+0]; + iy = idx[n*3+1]; + iz = idx[n*3+2]; + gout[n] += g[ix] * g[iy] * g[iz]; + } + } +} + +void CINTgout1e_nuc(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT empty) +{ + FINT nf = envs->nf; + FINT nrys_roots = envs->nrys_roots; + FINT n, i; + dtype *gx, *gy, *gz; + dtype s; + + if (empty) { + for (n = 0; n < nf; n++) { + gx = g + idx[n*3+0]; + gy = g + idx[n*3+1]; + gz = g + idx[n*3+2]; + s = 0; + for (i = 0; i < nrys_roots; i++) { + s += gx[i] * gy[i] * gz[i]; + } + gout[n] = s; + } + } else { + for (n = 0; n < nf; n++) { + gx = g + idx[n*3+0]; + gy = g + idx[n*3+1]; + gz = g + idx[n*3+2]; + s = 0; + for (i = 0; i < nrys_roots; i++) { + s += gx[i] * gy[i] * gz[i]; + } + gout[n] += s; + } + } +} + +CACHE_SIZE_T int1e_ovlp_sph(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) +{ + + WHICH_INTEGRAL = INT1E_OVLP; + FINT ng[] = {0, 0, 0, 0, 0, 1, 1, 1}; + CINTEnvVars envs; + CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); + #ifdef __cplusplus + envs.f_gout = (void (*)(...))&CINTgout1e; + #else + envs.f_gout = &CINTgout1e; + #endif + return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} + +CACHE_SIZE_T int1e_ovlp_cart(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) +{ + FINT ng[] = {0, 0, 0, 0, 0, 1, 1, 1}; + CINTEnvVars envs; + CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); + #ifdef __cplusplus + envs.f_gout = (void (*)(...))&CINTgout1e; + #else + envs.f_gout = &CINTgout1e; + #endif + return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} + +CACHE_SIZE_T int1e_ovlp_spinor(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) +{ + FINT ng[] = {0, 0, 0, 0, 0, 1, 1, 1}; + CINTEnvVars envs; + CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); + #ifdef __cplusplus + envs.f_gout = (void (*)(...))&CINTgout1e; + #else + envs.f_gout = &CINTgout1e; + #endif + return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} + +void int1e_ovlp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env) +{ + *opt = NULL; +} + +CACHE_SIZE_T int1e_nuc_sph(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) +{ + WHICH_INTEGRAL = INT1E_NUC; + FINT ng[] = {0, 0, 0, 0, 0, 1, 0, 1}; + CINTEnvVars envs; + CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); + #ifdef __cplusplus + envs.f_gout = (void (*)(...))&CINTgout1e_nuc; + #else + envs.f_gout = &CINTgout1e_nuc; + #endif + return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 2); +} + +CACHE_SIZE_T int1e_nuc_cart(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) +{ + FINT ng[] = {0, 0, 0, 0, 0, 1, 0, 1}; + CINTEnvVars envs; + CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); + #ifdef __cplusplus + envs.f_gout = (void (*)(...))&CINTgout1e_nuc; + #else + envs.f_gout = &CINTgout1e_nuc; + #endif + return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 2); +} + +CACHE_SIZE_T int1e_nuc_spinor(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) +{ + FINT ng[] = {0, 0, 0, 0, 0, 1, 0, 1}; + CINTEnvVars envs; + CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); + #ifdef __cplusplus + envs.f_gout = (void (*)(...))&CINTgout1e_nuc; + #else + envs.f_gout = &CINTgout1e_nuc; + #endif + return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 2); +} + +void int1e_nuc_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env) +{ + *opt = NULL; +} + +ALL_CINT(int1e_ovlp); +ALL_CINT(int1e_nuc); +ALL_CINT_FORTRAN_(int1e_ovlp); +ALL_CINT_FORTRAN_(int1e_nuc); + + + + +#include +//#include + +void CINTinit_int1e_grids_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); + +FINT CINTg0_1e_grids(dtype *g, dtype cutoff, + CINTEnvVars *envs, dtype *cache, dtype *gridsT); + +void CINTgout1e_grids(dtype *gout, dtype *g, FINT *idx, + CINTEnvVars *envs, FINT gout_empty); + +void CINTnabla1i_grids(dtype *f, dtype *g, + FINT li, FINT lj, CINTEnvVars *envs); + +void CINTnabla1j_grids(dtype *f, dtype *g, + FINT li, FINT lj, CINTEnvVars *envs); + +void CINTx1i_grids(dtype *f, dtype *g, dtype *ri, + FINT li, FINT lj, CINTEnvVars *envs); + +void CINTx1j_grids(dtype *f, dtype *g, dtype *rj, + FINT li, FINT lj, CINTEnvVars *envs); + +#define G1E_GRIDS_D_I(f, g, li, lj) CINTnabla1i_grids(f, g, li, lj, envs) +#define G1E_GRIDS_D_J(f, g, li, lj) CINTnabla1j_grids(f, g, li, lj, envs) + +#define G1E_GRIDS_R0I(f, g, li, lj) CINTx1i_grids(f, g, ri, li, lj, envs) +#define G1E_GRIDS_R0J(f, g, li, lj) CINTx1j_grids(f, g, rj, li, lj, envs) + +#define G1E_GRIDS_RCI(f, g, li, lj) CINTx1i_grids(f, g, dri, li, lj, envs) +#define G1E_GRIDS_RCJ(f, g, li, lj) CINTx1j_grids(f, g, drj, li, lj, envs) + +#define G1E_GRIDS_R_I(f, g, li, lj) f = g + envs->g_stride_i +#define G1E_GRIDS_R_J(f, g, li, lj) f = g + envs->g_stride_j + + + +#ifndef HAVE_RYS2E +#define HAVE_RYS2E +typedef struct { + dtype c00x[MXRYSROOTS]; + dtype c00y[MXRYSROOTS]; + dtype c00z[MXRYSROOTS]; + dtype c0px[MXRYSROOTS]; + dtype c0py[MXRYSROOTS]; + dtype c0pz[MXRYSROOTS]; + dtype b01[MXRYSROOTS]; + dtype b00[MXRYSROOTS]; + dtype b10[MXRYSROOTS]; +} Rys2eT; +#endif + +void CINTg2e_index_xyz(FINT *idx, const CINTEnvVars *envs); + +void CINTinit_int2e_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); +void CINTinit_int3c2e_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env){}; +void CINTinit_int2c2e_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env){}; + +FINT CINTg0_2e(dtype *g, dtype *rij, dtype *rkl, dtype cutoff, CINTEnvVars *envs); +void CINTg0_2e_2d(dtype *g, Rys2eT *bc, CINTEnvVars *envs); +void CINTg0_2e_2d4d_unrolled(dtype *g, Rys2eT *bc, CINTEnvVars *envs); +void CINTsrg0_2e_2d4d_unrolled(dtype *g, Rys2eT *bc, CINTEnvVars *envs); +void CINTg0_2e_lj2d4d(dtype *g, Rys2eT *bc, CINTEnvVars *envs); +void CINTg0_2e_kj2d4d(dtype *g, Rys2eT *bc, CINTEnvVars *envs); +void CINTg0_2e_il2d4d(dtype *g, Rys2eT *bc, CINTEnvVars *envs); +void CINTg0_2e_ik2d4d(dtype *g, Rys2eT *bc, CINTEnvVars *envs); + +void CINTg0_lj2d_4d(dtype *g, CINTEnvVars *envs); +void CINTg0_kj2d_4d(dtype *g, CINTEnvVars *envs); +void CINTg0_il2d_4d(dtype *g, CINTEnvVars *envs); +void CINTg0_ik2d_4d(dtype *g, CINTEnvVars *envs); + +void CINTnabla1i_2e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs); + +void CINTnabla1j_2e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs); + +void CINTnabla1k_2e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs); + +void CINTnabla1l_2e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs); + +void CINTx1i_2e(dtype *f, const dtype *g, const dtype *ri, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs); + +void CINTx1j_2e(dtype *f, const dtype *g, const dtype *rj, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs); + +void CINTx1k_2e(dtype *f, const dtype *g, const dtype *rk, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs); + +void CINTx1l_2e(dtype *f, const dtype *g, const dtype *rl, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs); + +#ifdef WITH_F12 +void CINTinit_int2e_stg_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); +void CINTinit_int2e_yp_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); +#endif + +#define G2E_D_I(f, g, li, lj, lk, ll) CINTnabla1i_2e(f, g, li, lj, lk, ll, envs) +#define G2E_D_J(f, g, li, lj, lk, ll) CINTnabla1j_2e(f, g, li, lj, lk, ll, envs) +#define G2E_D_K(f, g, li, lj, lk, ll) CINTnabla1k_2e(f, g, li, lj, lk, ll, envs) +#define G2E_D_L(f, g, li, lj, lk, ll) CINTnabla1l_2e(f, g, li, lj, lk, ll, envs) + +#define G2E_R0I(f, g, li, lj, lk, ll) CINTx1i_2e(f, g, envs->ri, li, lj, lk, ll, envs) +#define G2E_R0J(f, g, li, lj, lk, ll) CINTx1j_2e(f, g, envs->rj, li, lj, lk, ll, envs) +#define G2E_R0K(f, g, li, lj, lk, ll) CINTx1k_2e(f, g, envs->rk, li, lj, lk, ll, envs) +#define G2E_R0L(f, g, li, lj, lk, ll) CINTx1l_2e(f, g, envs->rl, li, lj, lk, ll, envs) + +#define G2E_RCI(f, g, li, lj, lk, ll) CINTx1i_2e(f, g, dri, li, lj, lk, ll, envs) +#define G2E_RCJ(f, g, li, lj, lk, ll) CINTx1j_2e(f, g, drj, li, lj, lk, ll, envs) +#define G2E_RCK(f, g, li, lj, lk, ll) CINTx1k_2e(f, g, drk, li, lj, lk, ll, envs) +#define G2E_RCL(f, g, li, lj, lk, ll) CINTx1l_2e(f, g, drl, li, lj, lk, ll, envs) + +#define G2E_R_I(f, g, li, lj, lk, ll) f = g + envs->g_stride_i +#define G2E_R_K(f, g, li, lj, lk, ll) f = g + envs->g_stride_k +#define G2E_R_L(f, g, li, lj, lk, ll) f = g + envs->g_stride_l +#define G2E_R_J(f, g, li, lj, lk, ll) f = g + envs->g_stride_j + + + +//#include + +void CINTgout2e(dtype *g, dtype *gout, FINT *idx, CINTEnvVars *envs, FINT gout_empty); + +FINT CINT2e_loop(dtype *gctr, CINTEnvVars *envs, dtype *cache, FINT *empty); + +CACHE_SIZE_T CINT2e_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache);//, void (*f_c2s)(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache)); +#ifdef __cplusplus +CACHE_SIZE_T CINT2e_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(...), void (*f_e2_c2s)(...)); +CACHE_SIZE_T CINT3c2e_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(...), FINT is_ssc); +CACHE_SIZE_T CINT3c2e_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(...), FINT is_ssc); +#else +CACHE_SIZE_T CINT2e_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(), void (*f_e2_c2s)()); +CACHE_SIZE_T CINT3c2e_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(), FINT is_ssc); +CACHE_SIZE_T CINT3c2e_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(), FINT is_ssc); +#endif +CACHE_SIZE_T CINT2c2e_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_c2s)(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache)); + + + +#ifdef __cplusplus +CACHE_SIZE_T CINT2c2e_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(...)); +#else +CACHE_SIZE_T CINT2c2e_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)()); +#endif + + +void CINTgout1e_int1e_kin(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { + if (print) printf("inside fgout\n"); + if (print) printf("envs-> nf %d\n", envs->nf); + //printf("inside fgout\n"); + FINT nf = envs->nf; + //printf("a\n"); + if (print) printf("got nf\n"); + FINT ix, iy, iz, n; + if (print) printf("engs->g-size, %d", envs->g_size); + //printf("a\n"); + dtype *g0 = g; + dtype *g1 = g0 + envs->g_size * 3; + dtype *g2 = g1 + envs->g_size * 3; + dtype *g3 = g2 + envs->g_size * 3; + dtype s[9]; + //printf("a\n"); + if (print) printf("before g1e_d_j\n"); + G1E_D_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); + G1E_D_J(g2, g0, envs->i_l+0, envs->j_l+1, 0); + G1E_D_J(g3, g2, envs->i_l+0, envs->j_l+0, 0); + + //CINTnabla1j_1e(f, g, li, lj, lk, envs) + //CINTnabla1j_1e(g1, g0, envs->i_l+0, envs->j_l+0, 0, envs); + ///CINTnabla1j_1e(g2, g0, envs->i_l+0, envs->j_l+1, 0, envs); + //CINTnabla1j_1e(g3, g2, envs->i_l+0, envs->j_l+0, 0, envs); + + if (print) printf("for loop\n"); + + for (n = 0; n < nf; n++) { + ix = idx[0+n*3]; + iy = idx[1+n*3]; + iz = idx[2+n*3]; + s[0] = + g3[ix+0]*g0[iy+0]*g0[iz+0]; + s[1] = + g2[ix+0]*g1[iy+0]*g0[iz+0]; + s[2] = + g2[ix+0]*g0[iy+0]*g1[iz+0]; + s[3] = + g1[ix+0]*g2[iy+0]*g0[iz+0]; + s[4] = + g0[ix+0]*g3[iy+0]*g0[iz+0]; + s[5] = + g0[ix+0]*g2[iy+0]*g1[iz+0]; + s[6] = + g1[ix+0]*g0[iy+0]*g2[iz+0]; + s[7] = + g0[ix+0]*g1[iy+0]*g2[iz+0]; + s[8] = + g0[ix+0]*g0[iy+0]*g3[iz+0]; + + if (gout_empty) { + gout[n*1+0] = - s[0] - s[4] - s[8]; + } else { + gout[n*1+0] += - s[0] - s[4] - s[8]; + } + } + if (print) printf("done fgout\n"); +} + +void int1e_kin_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_kin_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_kin; +#else +envs.f_gout = &CINTgout1e_int1e_kin; +#endif +envs.common_factor *= 0.5; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_kin_sph(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, +CINTOpt *opt, dtype *cache) { + + WHICH_INTEGRAL = INT1E_KIN; + if (print) printf("int1e_kin_sph>\n"); + //printf("shls %d %d \n", shls[0], shls[1]); + //int shls[] = {0, 0}; + FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; + CINTEnvVars envs; + CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); + if (print) printf("int1e_kin_sph> post init env\n"); + + #ifdef __cplusplus + if (print) printf("before gout\n"); + envs.f_gout = (void (*)(...))&CINTgout1e_int1e_kin; + //f_gout = CINTgout1e_int1e_kin; + + if (print) printf("after gout \n"); + #else + envs.f_gout = &CINTgout1e_int1e_kin; + #endif + + if (print) printf("\n\n\ncommon_factor %f\n\n\n", envs.common_factor); + envs.common_factor *= 0.5; + if (print) printf("Calling cint1e_drv\n"); + return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_kin_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_kin; +#else +envs.f_gout = &CINTgout1e_int1e_kin; +#endif +envs.common_factor *= 0.5; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_kin) +ALL_CINT1E_FORTRAN_(int1e_kin) + +void CINTgout1e_int1e_ia01p(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +G2E_D_J(g1, g0, envs->i_l+0, envs->j_l+0, 0, 0); +G2E_D_J(g2, g0, envs->i_l+0, envs->j_l+1, 0, 0); +G2E_D_I(g3, g0, envs->i_l+0, envs->j_l+1, 0, 0); +for (ix = 0; ix < envs->g_size * 3; ix++) {g2[ix] += g3[ix];} +G2E_D_J(g3, g2, envs->i_l+0, envs->j_l+0, 0, 0); +dtype s[9]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 9; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g3[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g2[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g2[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g1[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g0[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g0[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g1[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g0[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g0[ix+i] * g0[iy+i] * g3[iz+i]; +} +if (gout_empty) { +gout[n*3+0] = + s[5] - s[7]; +gout[n*3+1] = + s[6] - s[2]; +gout[n*3+2] = + s[1] - s[3]; +} else { +gout[n*3+0] += + s[5] - s[7]; +gout[n*3+1] += + s[6] - s[2]; +gout[n*3+2] += + s[1] - s[3]; +}}} +void int1e_ia01p_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 2, 0, 0, 2, 1, 0, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ia01p_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 2, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_ia01p; +#else +#endif +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 1); +} +CACHE_SIZE_T int1e_ia01p_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 2, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_ia01p; +#else +envs.f_gout = &CINTgout1e_int1e_ia01p; +#endif + +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 1); +} +/*CACHE_SIZE_T int1e_ia01p_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 2, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ia01p; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 1); +} +ALL_CINT1E(int1e_ia01p) +ALL_CINT1E_FORTRAN_(int1e_ia01p) + +void CINTgout1e_int1e_giao_irjxp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype s[9]; +G1E_D_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g3, g2, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g3[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g2[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g2[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g1[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g0[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g0[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g1[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g0[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g0[ix+0]*g0[iy+0]*g3[iz+0]; +if (gout_empty) { +gout[n*3+0] = + s[5] - s[7]; +gout[n*3+1] = + s[6] - s[2]; +gout[n*3+2] = + s[1] - s[3]; +} else { +gout[n*3+0] += + s[5] - s[7]; +gout[n*3+1] += + s[6] - s[2]; +gout[n*3+2] += + s[1] - s[3]; +}}} +void int1e_giao_irjxp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_giao_irjxp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_giao_irjxp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_giao_irjxp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_giao_irjxp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_giao_irjxp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_giao_irjxp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_giao_irjxp) +ALL_CINT1E_FORTRAN_(int1e_giao_irjxp) + +void CINTgout1e_int1e_cg_irxp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +dtype s[9]; +G1E_D_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g3, g2, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g3[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g2[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g2[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g1[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g0[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g0[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g1[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g0[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g0[ix+0]*g0[iy+0]*g3[iz+0]; +if (gout_empty) { +gout[n*3+0] = + s[5] - s[7]; +gout[n*3+1] = + s[6] - s[2]; +gout[n*3+2] = + s[1] - s[3]; +} else { +gout[n*3+0] += + s[5] - s[7]; +gout[n*3+1] += + s[6] - s[2]; +gout[n*3+2] += + s[1] - s[3]; +}}} +void int1e_cg_irxp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_cg_irxp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_cg_irxp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_cg_irxp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_cg_irxp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_cg_irxp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_cg_irxp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} */ +ALL_CINT1E(int1e_cg_irxp) +ALL_CINT1E_FORTRAN_(int1e_cg_irxp) + +void CINTgout1e_int1e_giao_a11part(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +G2E_R_J(g1, g0, envs->i_l+0, envs->j_l+0, 0, 0); +G2E_D_J(g2, g0, envs->i_l+0, envs->j_l+1, 0, 0); +G2E_D_I(g3, g0, envs->i_l+0, envs->j_l+1, 0, 0); +for (ix = 0; ix < envs->g_size * 3; ix++) {g2[ix] += g3[ix];} +G2E_R_J(g3, g2, envs->i_l+0, envs->j_l+0, 0, 0); +dtype s[9]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 9; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g3[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g2[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g2[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g1[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g0[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g0[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g1[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g0[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g0[ix+i] * g0[iy+i] * g3[iz+i]; +} +if (gout_empty) { +gout[n*9+0] = + s[0]; +gout[n*9+1] = + s[1]; +gout[n*9+2] = + s[2]; +gout[n*9+3] = + s[3]; +gout[n*9+4] = + s[4]; +gout[n*9+5] = + s[5]; +gout[n*9+6] = + s[6]; +gout[n*9+7] = + s[7]; +gout[n*9+8] = + s[8]; +} else { +gout[n*9+0] += + s[0]; +gout[n*9+1] += + s[1]; +gout[n*9+2] += + s[2]; +gout[n*9+3] += + s[3]; +gout[n*9+4] += + s[4]; +gout[n*9+5] += + s[5]; +gout[n*9+6] += + s[6]; +gout[n*9+7] += + s[7]; +gout[n*9+8] += + s[8]; +}}} +void int1e_giao_a11part_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 2, 0, 0, 2, 1, 0, 9}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_giao_a11part_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 2, 1, 0, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_giao_a11part; +#else +envs.f_gout = &CINTgout1e_int1e_giao_a11part; +#endif +envs.common_factor *= -0.5; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 1); +} +CACHE_SIZE_T int1e_giao_a11part_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 2, 1, 0, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_giao_a11part; +#else +envs.f_gout = &CINTgout1e_int1e_giao_a11part; +#endif +envs.common_factor *= -0.5; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 1); +} +CACHE_SIZE_T int1e_giao_a11part_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 2, 1, 0, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_giao_a11part; +#else +envs.f_gout = &CINTgout1e_int1e_giao_a11part; +#endif +envs.common_factor *= -0.5; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 1); +} +ALL_CINT1E(int1e_giao_a11part) +ALL_CINT1E_FORTRAN_(int1e_giao_a11part) + +void CINTgout1e_int1e_cg_a11part(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +G2E_RCJ(g1, g0, envs->i_l+0, envs->j_l+0, 0, 0); +G2E_D_J(g2, g0, envs->i_l+0, envs->j_l+1, 0, 0); +G2E_D_I(g3, g0, envs->i_l+0, envs->j_l+1, 0, 0); +for (ix = 0; ix < envs->g_size * 3; ix++) {g2[ix] += g3[ix];} +G2E_RCJ(g3, g2, envs->i_l+0, envs->j_l+0, 0, 0); +dtype s[9]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 9; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g3[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g2[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g2[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g1[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g0[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g0[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g1[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g0[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g0[ix+i] * g0[iy+i] * g3[iz+i]; +} +if (gout_empty) { +gout[n*9+0] = + s[0]; +gout[n*9+1] = + s[1]; +gout[n*9+2] = + s[2]; +gout[n*9+3] = + s[3]; +gout[n*9+4] = + s[4]; +gout[n*9+5] = + s[5]; +gout[n*9+6] = + s[6]; +gout[n*9+7] = + s[7]; +gout[n*9+8] = + s[8]; +} else { +gout[n*9+0] += + s[0]; +gout[n*9+1] += + s[1]; +gout[n*9+2] += + s[2]; +gout[n*9+3] += + s[3]; +gout[n*9+4] += + s[4]; +gout[n*9+5] += + s[5]; +gout[n*9+6] += + s[6]; +gout[n*9+7] += + s[7]; +gout[n*9+8] += + s[8]; +}}} +void int1e_cg_a11part_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 2, 0, 0, 2, 1, 0, 9}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_cg_a11part_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 2, 1, 0, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_cg_a11part; +#else +envs.f_gout = &CINTgout1e_int1e_cg_a11part; +#endif +envs.common_factor *= -0.5; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 1); +} +CACHE_SIZE_T int1e_cg_a11part_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 2, 1, 0, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_cg_a11part; +#else +envs.f_gout = &CINTgout1e_int1e_cg_a11part; +#endif +envs.common_factor *= -0.5; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 1); +} +CACHE_SIZE_T int1e_cg_a11part_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 2, 1, 0, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_cg_a11part; +#else +envs.f_gout = &CINTgout1e_int1e_cg_a11part; +#endif +envs.common_factor *= -0.5; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 1); +} +ALL_CINT1E(int1e_cg_a11part) +ALL_CINT1E_FORTRAN_(int1e_cg_a11part) + +void CINTgout1e_int1e_a01gp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype rirj[3], c[3]; +rirj[0] = envs->ri[0] - envs->rj[0]; +rirj[1] = envs->ri[1] - envs->rj[1]; +rirj[2] = envs->ri[2] - envs->rj[2]; +c[0] = 1 * rirj[0]; +c[1] = 1 * rirj[1]; +c[2] = 1 * rirj[2]; +G2E_D_J(g1, g0, envs->i_l+2, envs->j_l+0, 0, 0); +G2E_D_J(g2, g0, envs->i_l+1, envs->j_l+1, 0, 0); +G2E_D_I(g3, g0, envs->i_l+1, envs->j_l+1, 0, 0); +for (ix = 0; ix < envs->g_size * 3; ix++) {g2[ix] += g3[ix];} +G2E_D_J(g3, g2, envs->i_l+2, envs->j_l+0, 0, 0); +G2E_R0I(g4, g0, envs->i_l+0, envs->j_l, 0, 0); +G2E_R0I(g5, g1, envs->i_l+0, envs->j_l, 0, 0); +G2E_R0I(g6, g2, envs->i_l+0, envs->j_l, 0, 0); +G2E_R0I(g7, g3, envs->i_l+0, envs->j_l, 0, 0); +dtype s[27]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 27; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g7[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g6[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g6[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g5[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g4[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g4[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g5[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g4[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g4[ix+i] * g0[iy+i] * g3[iz+i]; +s[9] += g3[ix+i] * g4[iy+i] * g0[iz+i]; +s[10] += g2[ix+i] * g5[iy+i] * g0[iz+i]; +s[11] += g2[ix+i] * g4[iy+i] * g1[iz+i]; +s[12] += g1[ix+i] * g6[iy+i] * g0[iz+i]; +s[13] += g0[ix+i] * g7[iy+i] * g0[iz+i]; +s[14] += g0[ix+i] * g6[iy+i] * g1[iz+i]; +s[15] += g1[ix+i] * g4[iy+i] * g2[iz+i]; +s[16] += g0[ix+i] * g5[iy+i] * g2[iz+i]; +s[17] += g0[ix+i] * g4[iy+i] * g3[iz+i]; +s[18] += g3[ix+i] * g0[iy+i] * g4[iz+i]; +s[19] += g2[ix+i] * g1[iy+i] * g4[iz+i]; +s[20] += g2[ix+i] * g0[iy+i] * g5[iz+i]; +s[21] += g1[ix+i] * g2[iy+i] * g4[iz+i]; +s[22] += g0[ix+i] * g3[iy+i] * g4[iz+i]; +s[23] += g0[ix+i] * g2[iy+i] * g5[iz+i]; +s[24] += g1[ix+i] * g0[iy+i] * g6[iz+i]; +s[25] += g0[ix+i] * g1[iy+i] * g6[iz+i]; +s[26] += g0[ix+i] * g0[iy+i] * g7[iz+i]; +} +if (gout_empty) { +gout[n*9+0] = + c[1]*s[23] - c[2]*s[14] - c[1]*s[25] + c[2]*s[16]; +gout[n*9+1] = + c[1]*s[24] - c[2]*s[15] - c[1]*s[20] + c[2]*s[11]; +gout[n*9+2] = + c[1]*s[19] - c[2]*s[10] - c[1]*s[21] + c[2]*s[12]; +gout[n*9+3] = + c[2]*s[5] - c[0]*s[23] - c[2]*s[7] + c[0]*s[25]; +gout[n*9+4] = + c[2]*s[6] - c[0]*s[24] - c[2]*s[2] + c[0]*s[20]; +gout[n*9+5] = + c[2]*s[1] - c[0]*s[19] - c[2]*s[3] + c[0]*s[21]; +gout[n*9+6] = + c[0]*s[14] - c[1]*s[5] - c[0]*s[16] + c[1]*s[7]; +gout[n*9+7] = + c[0]*s[15] - c[1]*s[6] - c[0]*s[11] + c[1]*s[2]; +gout[n*9+8] = + c[0]*s[10] - c[1]*s[1] - c[0]*s[12] + c[1]*s[3]; +} else { +gout[n*9+0] += + c[1]*s[23] - c[2]*s[14] - c[1]*s[25] + c[2]*s[16]; +gout[n*9+1] += + c[1]*s[24] - c[2]*s[15] - c[1]*s[20] + c[2]*s[11]; +gout[n*9+2] += + c[1]*s[19] - c[2]*s[10] - c[1]*s[21] + c[2]*s[12]; +gout[n*9+3] += + c[2]*s[5] - c[0]*s[23] - c[2]*s[7] + c[0]*s[25]; +gout[n*9+4] += + c[2]*s[6] - c[0]*s[24] - c[2]*s[2] + c[0]*s[20]; +gout[n*9+5] += + c[2]*s[1] - c[0]*s[19] - c[2]*s[3] + c[0]*s[21]; +gout[n*9+6] += + c[0]*s[14] - c[1]*s[5] - c[0]*s[16] + c[1]*s[7]; +gout[n*9+7] += + c[0]*s[15] - c[1]*s[6] - c[0]*s[11] + c[1]*s[2]; +gout[n*9+8] += + c[0]*s[10] - c[1]*s[1] - c[0]*s[12] + c[1]*s[3]; +}}} +void int1e_a01gp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {2, 2, 0, 0, 3, 1, 0, 9}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_a01gp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 2, 0, 0, 3, 1, 0, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_a01gp; +#else +envs.f_gout = &CINTgout1e_int1e_a01gp; +#endif +envs.common_factor *= 0.5; +if (out != NULL && envs.shls[0] == envs.shls[1]) { +FINT i, nout; +FINT counts[4]; +counts[0] = envs.nfi * envs.x_ctr[0]; +counts[1] = envs.nfj * envs.x_ctr[1]; +counts[2] = 1; +counts[3] = 1; +if (dims == NULL) { dims = counts; } +nout = dims[0] * dims[1]; +for (i = 0; i < envs.ncomp_e1 * envs.ncomp_tensor; i++) { +c2s_dset0(out+nout*i, dims, counts); } + +return 0; } +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 1); +} +CACHE_SIZE_T int1e_a01gp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 2, 0, 0, 3, 1, 0, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_a01gp; +#else +envs.f_gout = &CINTgout1e_int1e_a01gp; +#endif +envs.common_factor *= 0.5; +if (out != NULL && envs.shls[0] == envs.shls[1]) { +FINT i, nout; +FINT counts[4]; +counts[0] = (envs.i_l*2+1) * envs.x_ctr[0]; +counts[1] = (envs.j_l*2+1) * envs.x_ctr[1]; +counts[2] = 1; +counts[3] = 1; +if (dims == NULL) { dims = counts; } +nout = dims[0] * dims[1]; +for (i = 0; i < envs.ncomp_e1 * envs.ncomp_tensor; i++) { +c2s_dset0(out+nout*i, dims, counts); } +return 0; } +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 1); +} +CACHE_SIZE_T int1e_a01gp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 2, 0, 0, 3, 1, 0, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_a01gp; +#else +envs.f_gout = &CINTgout1e_int1e_a01gp; +#endif +envs.common_factor *= 0.5; +if (out != NULL && envs.shls[0] == envs.shls[1]) { +FINT i, nout; +FINT counts[4]; +counts[0] = CINTcgto_spinor(envs.shls[0], envs.bas); +counts[1] = CINTcgto_spinor(envs.shls[1], envs.bas); +counts[2] = 1; +counts[3] = 1; +if (dims == NULL) { dims = counts; } +nout = dims[0] * dims[1]; +for (i = 0; i < envs.ncomp_tensor; i++) { +c2s_zset0(out+nout*i, dims, counts); } +return 0; } +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 1); +} +ALL_CINT1E(int1e_a01gp) +ALL_CINT1E_FORTRAN_(int1e_a01gp) + +void CINTgout1e_int1e_igkin(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype rirj[3], c[3]; +rirj[0] = envs->ri[0] - envs->rj[0]; +rirj[1] = envs->ri[1] - envs->rj[1]; +rirj[2] = envs->ri[2] - envs->rj[2]; +c[0] = 1 * rirj[0]; +c[1] = 1 * rirj[1]; +c[2] = 1 * rirj[2]; +dtype s[27]; +G1E_D_J(g1, g0, envs->i_l+1, envs->j_l+0, 0); +G1E_D_J(g2, g0, envs->i_l+1, envs->j_l+1, 0); +G1E_D_J(g3, g2, envs->i_l+1, envs->j_l+0, 0); +G1E_R0I(g4, g0, envs->i_l+0, envs->j_l, 0); +G1E_R0I(g5, g1, envs->i_l+0, envs->j_l, 0); +G1E_R0I(g6, g2, envs->i_l+0, envs->j_l, 0); +G1E_R0I(g7, g3, envs->i_l+0, envs->j_l, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g7[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g6[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g6[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g5[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g4[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g4[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g5[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g4[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g4[ix+0]*g0[iy+0]*g3[iz+0]; +s[9] = + g3[ix+0]*g4[iy+0]*g0[iz+0]; +s[10] = + g2[ix+0]*g5[iy+0]*g0[iz+0]; +s[11] = + g2[ix+0]*g4[iy+0]*g1[iz+0]; +s[12] = + g1[ix+0]*g6[iy+0]*g0[iz+0]; +s[13] = + g0[ix+0]*g7[iy+0]*g0[iz+0]; +s[14] = + g0[ix+0]*g6[iy+0]*g1[iz+0]; +s[15] = + g1[ix+0]*g4[iy+0]*g2[iz+0]; +s[16] = + g0[ix+0]*g5[iy+0]*g2[iz+0]; +s[17] = + g0[ix+0]*g4[iy+0]*g3[iz+0]; +s[18] = + g3[ix+0]*g0[iy+0]*g4[iz+0]; +s[19] = + g2[ix+0]*g1[iy+0]*g4[iz+0]; +s[20] = + g2[ix+0]*g0[iy+0]*g5[iz+0]; +s[21] = + g1[ix+0]*g2[iy+0]*g4[iz+0]; +s[22] = + g0[ix+0]*g3[iy+0]*g4[iz+0]; +s[23] = + g0[ix+0]*g2[iy+0]*g5[iz+0]; +s[24] = + g1[ix+0]*g0[iy+0]*g6[iz+0]; +s[25] = + g0[ix+0]*g1[iy+0]*g6[iz+0]; +s[26] = + g0[ix+0]*g0[iy+0]*g7[iz+0]; +if (gout_empty) { +gout[n*3+0] = + c[1]*s[18] - c[2]*s[9] + c[1]*s[22] - c[2]*s[13] + c[1]*s[26] - c[2]*s[17]; +gout[n*3+1] = + c[2]*s[0] - c[0]*s[18] + c[2]*s[4] - c[0]*s[22] + c[2]*s[8] - c[0]*s[26]; +gout[n*3+2] = + c[0]*s[9] - c[1]*s[0] + c[0]*s[13] - c[1]*s[4] + c[0]*s[17] - c[1]*s[8]; +} else { +gout[n*3+0] += + c[1]*s[18] - c[2]*s[9] + c[1]*s[22] - c[2]*s[13] + c[1]*s[26] - c[2]*s[17]; +gout[n*3+1] += + c[2]*s[0] - c[0]*s[18] + c[2]*s[4] - c[0]*s[22] + c[2]*s[8] - c[0]*s[26]; +gout[n*3+2] += + c[0]*s[9] - c[1]*s[0] + c[0]*s[13] - c[1]*s[4] + c[0]*s[17] - c[1]*s[8]; +}}} +void int1e_igkin_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 2, 0, 0, 3, 1, 1, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +/* +CACHE_SIZE_T int1e_igkin_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 3, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_igkin; +envs.common_factor *= 0.25; +if (out != NULL && envs.shls[0] == envs.shls[1]) { +FINT i, nout; +FINT counts[4]; +counts[0] = envs.nfi * envs.x_ctr[0]; +counts[1] = envs.nfj * envs.x_ctr[1]; +counts[2] = 1; +counts[3] = 1; +if (dims == NULL) { dims = counts; } +nout = dims[0] * dims[1]; +for (i = 0; i < envs.ncomp_e1 * envs.ncomp_tensor; i++) { +c2s_dset0(out+nout*i, dims, counts); } +return 0; } +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_igkin_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 3, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_igkin; +envs.common_factor *= 0.25; +if (out != NULL && envs.shls[0] == envs.shls[1]) { +FINT i, nout; +FINT counts[4]; +counts[0] = (envs.i_l*2+1) * envs.x_ctr[0]; +counts[1] = (envs.j_l*2+1) * envs.x_ctr[1]; +counts[2] = 1; +counts[3] = 1; +if (dims == NULL) { dims = counts; } +nout = dims[0] * dims[1]; +for (i = 0; i < envs.ncomp_e1 * envs.ncomp_tensor; i++) { +c2s_dset0(out+nout*i, dims, counts); } +return 0; } +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_igkin_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 3, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_igkin; +envs.common_factor *= 0.25; +if (out != NULL && envs.shls[0] == envs.shls[1]) { +FINT i, nout; +FINT counts[4]; +counts[0] = CINTcgto_spinor(envs.shls[0], envs.bas); +counts[1] = CINTcgto_spinor(envs.shls[1], envs.bas); +counts[2] = 1; +counts[3] = 1; +if (dims == NULL) { dims = counts; } +nout = dims[0] * dims[1]; +for (i = 0; i < envs.ncomp_tensor; i++) { +c2s_zset0(out+nout*i, dims, counts); } +return 0; } +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_igkin) +ALL_CINT1E_FORTRAN_(int1e_igkin) + +void CINTgout1e_int1e_igovlp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype rirj[3], c[3]; +rirj[0] = envs->ri[0] - envs->rj[0]; +rirj[1] = envs->ri[1] - envs->rj[1]; +rirj[2] = envs->ri[2] - envs->rj[2]; +c[0] = 1 * rirj[0]; +c[1] = 1 * rirj[1]; +c[2] = 1 * rirj[2]; +dtype s[3]; +G1E_R0I(g1, g0, envs->i_l+0, envs->j_l, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]; +if (gout_empty) { +gout[n*3+0] = - c[1]*s[2] + c[2]*s[1]; +gout[n*3+1] = - c[2]*s[0] + c[0]*s[2]; +gout[n*3+2] = - c[0]*s[1] + c[1]*s[0]; +} else { +gout[n*3+0] += - c[1]*s[2] + c[2]*s[1]; +gout[n*3+1] += - c[2]*s[0] + c[0]*s[2]; +gout[n*3+2] += - c[0]*s[1] + c[1]*s[0]; +}}} +void int1e_igovlp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 1, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_igovlp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_igovlp; +envs.common_factor *= 0.5; +if (out != NULL && envs.shls[0] == envs.shls[1]) { +FINT i, nout; +FINT counts[4]; +counts[0] = envs.nfi * envs.x_ctr[0]; +counts[1] = envs.nfj * envs.x_ctr[1]; +counts[2] = 1; +counts[3] = 1; +if (dims == NULL) { dims = counts; } +nout = dims[0] * dims[1]; +for (i = 0; i < envs.ncomp_e1 * envs.ncomp_tensor; i++) { +c2s_dset0(out+nout*i, dims, counts); } +return 0; } +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_igovlp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_igovlp; +envs.common_factor *= 0.5; +if (out != NULL && envs.shls[0] == envs.shls[1]) { +FINT i, nout; +FINT counts[4]; +counts[0] = (envs.i_l*2+1) * envs.x_ctr[0]; +counts[1] = (envs.j_l*2+1) * envs.x_ctr[1]; +counts[2] = 1; +counts[3] = 1; +if (dims == NULL) { dims = counts; } +nout = dims[0] * dims[1]; +for (i = 0; i < envs.ncomp_e1 * envs.ncomp_tensor; i++) { +c2s_dset0(out+nout*i, dims, counts); } +return 0; } +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_igovlp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_igovlp; +envs.common_factor *= 0.5; +if (out != NULL && envs.shls[0] == envs.shls[1]) { +FINT i, nout; +FINT counts[4]; +counts[0] = CINTcgto_spinor(envs.shls[0], envs.bas); +counts[1] = CINTcgto_spinor(envs.shls[1], envs.bas); +counts[2] = 1; +counts[3] = 1; +if (dims == NULL) { dims = counts; } +nout = dims[0] * dims[1]; +for (i = 0; i < envs.ncomp_tensor; i++) { +c2s_zset0(out+nout*i, dims, counts); } +return 0; } +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_igovlp) +ALL_CINT1E_FORTRAN_(int1e_igovlp) + +void CINTgout1e_int1e_ignuc(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype rirj[3], c[3]; +rirj[0] = envs->ri[0] - envs->rj[0]; +rirj[1] = envs->ri[1] - envs->rj[1]; +rirj[2] = envs->ri[2] - envs->rj[2]; +c[0] = 1 * rirj[0]; +c[1] = 1 * rirj[1]; +c[2] = 1 * rirj[2]; +G2E_R0I(g1, g0, envs->i_l+0, envs->j_l, 0, 0); +dtype s[3]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 3; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g1[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g0[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g0[ix+i] * g0[iy+i] * g1[iz+i]; +} +if (gout_empty) { +gout[n*3+0] = - c[1]*s[2] + c[2]*s[1]; +gout[n*3+1] = - c[2]*s[0] + c[0]*s[2]; +gout[n*3+2] = - c[0]*s[1] + c[1]*s[0]; +} else { +gout[n*3+0] += - c[1]*s[2] + c[2]*s[1]; +gout[n*3+1] += - c[2]*s[0] + c[0]*s[2]; +gout[n*3+2] += - c[0]*s[1] + c[1]*s[0]; +}}} +void int1e_ignuc_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 0, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ignuc_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ignuc; +envs.common_factor *= 0.5; +if (out != NULL && envs.shls[0] == envs.shls[1]) { +FINT i, nout; +FINT counts[4]; +counts[0] = envs.nfi * envs.x_ctr[0]; +counts[1] = envs.nfj * envs.x_ctr[1]; +counts[2] = 1; +counts[3] = 1; +if (dims == NULL) { dims = counts; } +nout = dims[0] * dims[1]; +for (i = 0; i < envs.ncomp_e1 * envs.ncomp_tensor; i++) { +c2s_dset0(out+nout*i, dims, counts); } +return 0; } +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 2); +} +CACHE_SIZE_T int1e_ignuc_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ignuc; +envs.common_factor *= 0.5; +if (out != NULL && envs.shls[0] == envs.shls[1]) { +FINT i, nout; +FINT counts[4]; +counts[0] = (envs.i_l*2+1) * envs.x_ctr[0]; +counts[1] = (envs.j_l*2+1) * envs.x_ctr[1]; +counts[2] = 1; +counts[3] = 1; +if (dims == NULL) { dims = counts; } +nout = dims[0] * dims[1]; +for (i = 0; i < envs.ncomp_e1 * envs.ncomp_tensor; i++) { +c2s_dset0(out+nout*i, dims, counts); } +return 0; } +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 2); +} +CACHE_SIZE_T int1e_ignuc_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ignuc; +envs.common_factor *= 0.5; +if (out != NULL && envs.shls[0] == envs.shls[1]) { +FINT i, nout; +FINT counts[4]; +counts[0] = CINTcgto_spinor(envs.shls[0], envs.bas); +counts[1] = CINTcgto_spinor(envs.shls[1], envs.bas); +counts[2] = 1; +counts[3] = 1; +if (dims == NULL) { dims = counts; } +nout = dims[0] * dims[1]; +for (i = 0; i < envs.ncomp_tensor; i++) { +c2s_zset0(out+nout*i, dims, counts); } +return 0; } +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 2); +} +ALL_CINT1E(int1e_ignuc) +ALL_CINT1E_FORTRAN_(int1e_ignuc) + +void CINTgout1e_int1e_pnucp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +G2E_D_J(g1, g0, envs->i_l+1, envs->j_l+0, 0, 0); +G2E_D_I(g2, g0, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g3, g1, envs->i_l+0, envs->j_l, 0, 0); +dtype s[9]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 9; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g3[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g2[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g2[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g1[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g0[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g0[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g1[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g0[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g0[ix+i] * g0[iy+i] * g3[iz+i]; +} +if (gout_empty) { +gout[n*1+0] = + s[0] + s[4] + s[8]; +} else { +gout[n*1+0] += + s[0] + s[4] + s[8]; +}}} +void int1e_pnucp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_pnucp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_pnucp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 2); +} +CACHE_SIZE_T int1e_pnucp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_pnucp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 2); +} +CACHE_SIZE_T int1e_pnucp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_pnucp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 2); +} +ALL_CINT1E(int1e_pnucp) +ALL_CINT1E_FORTRAN_(int1e_pnucp) + +void CINTgout1e_int1e_z(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +dtype s[3]; +G1E_RCJ(g1, g0, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]; +if (gout_empty) { +gout[n*1+0] = + s[2]; +} else { +gout[n*1+0] += + s[2]; +}}} +void int1e_z_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_z_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_z; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_z_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_z; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_z_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_z; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_z) +ALL_CINT1E_FORTRAN_(int1e_z) + +void CINTgout1e_int1e_zz(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +dtype s[9]; +G1E_RCJ(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g3, g2, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g3[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g2[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g2[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g1[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g0[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g0[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g1[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g0[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g0[ix+0]*g0[iy+0]*g3[iz+0]; +if (gout_empty) { +gout[n*1+0] = + s[8]; +} else { +gout[n*1+0] += + s[8]; +}}} +void int1e_zz_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_zz_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_zz; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_zz_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_zz; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_zz_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_zz; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_zz) +ALL_CINT1E_FORTRAN_(int1e_zz) + +void CINTgout1e_int1e_r(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +dtype s[3]; +G1E_RCJ(g1, g0, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]; +if (gout_empty) { +gout[n*3+0] = + s[0]; +gout[n*3+1] = + s[1]; +gout[n*3+2] = + s[2]; +} else { +gout[n*3+0] += + s[0]; +gout[n*3+1] += + s[1]; +gout[n*3+2] += + s[2]; +}}} +void int1e_r_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_r_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_r_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_r_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_r) +ALL_CINT1E_FORTRAN_(int1e_r) + +void CINTgout1e_int1e_r2(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +dtype s[9]; +G1E_RCJ(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g3, g2, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g3[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g2[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g2[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g1[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g0[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g0[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g1[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g0[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g0[ix+0]*g0[iy+0]*g3[iz+0]; +if (gout_empty) { +gout[n*1+0] = + s[0] + s[4] + s[8]; +} else { +gout[n*1+0] += + s[0] + s[4] + s[8]; +}}} +void int1e_r2_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_r2_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r2; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_r2_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r2; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_r2_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r2; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_r2) +ALL_CINT1E_FORTRAN_(int1e_r2) + +void CINTgout1e_int1e_r4(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype *g8 = g7 + envs->g_size * 3; +dtype *g9 = g8 + envs->g_size * 3; +dtype *g10 = g9 + envs->g_size * 3; +dtype *g11 = g10 + envs->g_size * 3; +dtype *g12 = g11 + envs->g_size * 3; +dtype *g13 = g12 + envs->g_size * 3; +dtype *g14 = g13 + envs->g_size * 3; +dtype *g15 = g14 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +dtype s[81]; +G1E_RCJ(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g3, g2, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g4, g0, envs->i_l+0, envs->j_l+2, 0); +G1E_RCJ(g5, g4, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g6, g4, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g7, g6, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g8, g0, envs->i_l+0, envs->j_l+3, 0); +G1E_RCJ(g9, g8, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g10, g8, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g11, g10, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g12, g8, envs->i_l+0, envs->j_l+2, 0); +G1E_RCJ(g13, g12, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g14, g12, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g15, g14, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g15[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g14[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g14[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g13[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g12[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g12[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g13[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g12[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g12[ix+0]*g0[iy+0]*g3[iz+0]; +s[9] = + g11[ix+0]*g4[iy+0]*g0[iz+0]; +s[10] = + g10[ix+0]*g5[iy+0]*g0[iz+0]; +s[11] = + g10[ix+0]*g4[iy+0]*g1[iz+0]; +s[12] = + g9[ix+0]*g6[iy+0]*g0[iz+0]; +s[13] = + g8[ix+0]*g7[iy+0]*g0[iz+0]; +s[14] = + g8[ix+0]*g6[iy+0]*g1[iz+0]; +s[15] = + g9[ix+0]*g4[iy+0]*g2[iz+0]; +s[16] = + g8[ix+0]*g5[iy+0]*g2[iz+0]; +s[17] = + g8[ix+0]*g4[iy+0]*g3[iz+0]; +s[18] = + g11[ix+0]*g0[iy+0]*g4[iz+0]; +s[19] = + g10[ix+0]*g1[iy+0]*g4[iz+0]; +s[20] = + g10[ix+0]*g0[iy+0]*g5[iz+0]; +s[21] = + g9[ix+0]*g2[iy+0]*g4[iz+0]; +s[22] = + g8[ix+0]*g3[iy+0]*g4[iz+0]; +s[23] = + g8[ix+0]*g2[iy+0]*g5[iz+0]; +s[24] = + g9[ix+0]*g0[iy+0]*g6[iz+0]; +s[25] = + g8[ix+0]*g1[iy+0]*g6[iz+0]; +s[26] = + g8[ix+0]*g0[iy+0]*g7[iz+0]; +s[27] = + g7[ix+0]*g8[iy+0]*g0[iz+0]; +s[28] = + g6[ix+0]*g9[iy+0]*g0[iz+0]; +s[29] = + g6[ix+0]*g8[iy+0]*g1[iz+0]; +s[30] = + g5[ix+0]*g10[iy+0]*g0[iz+0]; +s[31] = + g4[ix+0]*g11[iy+0]*g0[iz+0]; +s[32] = + g4[ix+0]*g10[iy+0]*g1[iz+0]; +s[33] = + g5[ix+0]*g8[iy+0]*g2[iz+0]; +s[34] = + g4[ix+0]*g9[iy+0]*g2[iz+0]; +s[35] = + g4[ix+0]*g8[iy+0]*g3[iz+0]; +s[36] = + g3[ix+0]*g12[iy+0]*g0[iz+0]; +s[37] = + g2[ix+0]*g13[iy+0]*g0[iz+0]; +s[38] = + g2[ix+0]*g12[iy+0]*g1[iz+0]; +s[39] = + g1[ix+0]*g14[iy+0]*g0[iz+0]; +s[40] = + g0[ix+0]*g15[iy+0]*g0[iz+0]; +s[41] = + g0[ix+0]*g14[iy+0]*g1[iz+0]; +s[42] = + g1[ix+0]*g12[iy+0]*g2[iz+0]; +s[43] = + g0[ix+0]*g13[iy+0]*g2[iz+0]; +s[44] = + g0[ix+0]*g12[iy+0]*g3[iz+0]; +s[45] = + g3[ix+0]*g8[iy+0]*g4[iz+0]; +s[46] = + g2[ix+0]*g9[iy+0]*g4[iz+0]; +s[47] = + g2[ix+0]*g8[iy+0]*g5[iz+0]; +s[48] = + g1[ix+0]*g10[iy+0]*g4[iz+0]; +s[49] = + g0[ix+0]*g11[iy+0]*g4[iz+0]; +s[50] = + g0[ix+0]*g10[iy+0]*g5[iz+0]; +s[51] = + g1[ix+0]*g8[iy+0]*g6[iz+0]; +s[52] = + g0[ix+0]*g9[iy+0]*g6[iz+0]; +s[53] = + g0[ix+0]*g8[iy+0]*g7[iz+0]; +s[54] = + g7[ix+0]*g0[iy+0]*g8[iz+0]; +s[55] = + g6[ix+0]*g1[iy+0]*g8[iz+0]; +s[56] = + g6[ix+0]*g0[iy+0]*g9[iz+0]; +s[57] = + g5[ix+0]*g2[iy+0]*g8[iz+0]; +s[58] = + g4[ix+0]*g3[iy+0]*g8[iz+0]; +s[59] = + g4[ix+0]*g2[iy+0]*g9[iz+0]; +s[60] = + g5[ix+0]*g0[iy+0]*g10[iz+0]; +s[61] = + g4[ix+0]*g1[iy+0]*g10[iz+0]; +s[62] = + g4[ix+0]*g0[iy+0]*g11[iz+0]; +s[63] = + g3[ix+0]*g4[iy+0]*g8[iz+0]; +s[64] = + g2[ix+0]*g5[iy+0]*g8[iz+0]; +s[65] = + g2[ix+0]*g4[iy+0]*g9[iz+0]; +s[66] = + g1[ix+0]*g6[iy+0]*g8[iz+0]; +s[67] = + g0[ix+0]*g7[iy+0]*g8[iz+0]; +s[68] = + g0[ix+0]*g6[iy+0]*g9[iz+0]; +s[69] = + g1[ix+0]*g4[iy+0]*g10[iz+0]; +s[70] = + g0[ix+0]*g5[iy+0]*g10[iz+0]; +s[71] = + g0[ix+0]*g4[iy+0]*g11[iz+0]; +s[72] = + g3[ix+0]*g0[iy+0]*g12[iz+0]; +s[73] = + g2[ix+0]*g1[iy+0]*g12[iz+0]; +s[74] = + g2[ix+0]*g0[iy+0]*g13[iz+0]; +s[75] = + g1[ix+0]*g2[iy+0]*g12[iz+0]; +s[76] = + g0[ix+0]*g3[iy+0]*g12[iz+0]; +s[77] = + g0[ix+0]*g2[iy+0]*g13[iz+0]; +s[78] = + g1[ix+0]*g0[iy+0]*g14[iz+0]; +s[79] = + g0[ix+0]*g1[iy+0]*g14[iz+0]; +s[80] = + g0[ix+0]*g0[iy+0]*g15[iz+0]; +if (gout_empty) { +gout[n*1+0] = + s[0] + 2*s[4] + 2*s[8] + s[40] + 2*s[44] + s[80]; +} else { +gout[n*1+0] += + s[0] + 2*s[4] + 2*s[8] + s[40] + 2*s[44] + s[80]; +}}} +void int1e_r4_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_r4_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r4; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_r4_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r4; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_r4_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r4; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_r4) +ALL_CINT1E_FORTRAN_(int1e_r4) + +void CINTgout1e_int1e_rr(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +dtype s[9]; +G1E_RCJ(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g3, g2, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g3[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g2[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g2[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g1[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g0[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g0[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g1[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g0[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g0[ix+0]*g0[iy+0]*g3[iz+0]; +if (gout_empty) { +gout[n*9+0] = + s[0]; +gout[n*9+1] = + s[1]; +gout[n*9+2] = + s[2]; +gout[n*9+3] = + s[3]; +gout[n*9+4] = + s[4]; +gout[n*9+5] = + s[5]; +gout[n*9+6] = + s[6]; +gout[n*9+7] = + s[7]; +gout[n*9+8] = + s[8]; +} else { +gout[n*9+0] += + s[0]; +gout[n*9+1] += + s[1]; +gout[n*9+2] += + s[2]; +gout[n*9+3] += + s[3]; +gout[n*9+4] += + s[4]; +gout[n*9+5] += + s[5]; +gout[n*9+6] += + s[6]; +gout[n*9+7] += + s[7]; +gout[n*9+8] += + s[8]; +}}} +void int1e_rr_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_rr_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rr; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_rr_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rr; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_rr_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rr; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_rr) +ALL_CINT1E_FORTRAN_(int1e_rr) + +void CINTgout1e_int1e_rrr(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +dtype s[27]; +G1E_RCJ(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g3, g2, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g4, g0, envs->i_l+0, envs->j_l+2, 0); +G1E_RCJ(g5, g4, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g6, g4, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g7, g6, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g7[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g6[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g6[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g5[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g4[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g4[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g5[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g4[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g4[ix+0]*g0[iy+0]*g3[iz+0]; +s[9] = + g3[ix+0]*g4[iy+0]*g0[iz+0]; +s[10] = + g2[ix+0]*g5[iy+0]*g0[iz+0]; +s[11] = + g2[ix+0]*g4[iy+0]*g1[iz+0]; +s[12] = + g1[ix+0]*g6[iy+0]*g0[iz+0]; +s[13] = + g0[ix+0]*g7[iy+0]*g0[iz+0]; +s[14] = + g0[ix+0]*g6[iy+0]*g1[iz+0]; +s[15] = + g1[ix+0]*g4[iy+0]*g2[iz+0]; +s[16] = + g0[ix+0]*g5[iy+0]*g2[iz+0]; +s[17] = + g0[ix+0]*g4[iy+0]*g3[iz+0]; +s[18] = + g3[ix+0]*g0[iy+0]*g4[iz+0]; +s[19] = + g2[ix+0]*g1[iy+0]*g4[iz+0]; +s[20] = + g2[ix+0]*g0[iy+0]*g5[iz+0]; +s[21] = + g1[ix+0]*g2[iy+0]*g4[iz+0]; +s[22] = + g0[ix+0]*g3[iy+0]*g4[iz+0]; +s[23] = + g0[ix+0]*g2[iy+0]*g5[iz+0]; +s[24] = + g1[ix+0]*g0[iy+0]*g6[iz+0]; +s[25] = + g0[ix+0]*g1[iy+0]*g6[iz+0]; +s[26] = + g0[ix+0]*g0[iy+0]*g7[iz+0]; +if (gout_empty) { +gout[n*27+0] = + s[0]; +gout[n*27+1] = + s[1]; +gout[n*27+2] = + s[2]; +gout[n*27+3] = + s[3]; +gout[n*27+4] = + s[4]; +gout[n*27+5] = + s[5]; +gout[n*27+6] = + s[6]; +gout[n*27+7] = + s[7]; +gout[n*27+8] = + s[8]; +gout[n*27+9] = + s[9]; +gout[n*27+10] = + s[10]; +gout[n*27+11] = + s[11]; +gout[n*27+12] = + s[12]; +gout[n*27+13] = + s[13]; +gout[n*27+14] = + s[14]; +gout[n*27+15] = + s[15]; +gout[n*27+16] = + s[16]; +gout[n*27+17] = + s[17]; +gout[n*27+18] = + s[18]; +gout[n*27+19] = + s[19]; +gout[n*27+20] = + s[20]; +gout[n*27+21] = + s[21]; +gout[n*27+22] = + s[22]; +gout[n*27+23] = + s[23]; +gout[n*27+24] = + s[24]; +gout[n*27+25] = + s[25]; +gout[n*27+26] = + s[26]; +} else { +gout[n*27+0] += + s[0]; +gout[n*27+1] += + s[1]; +gout[n*27+2] += + s[2]; +gout[n*27+3] += + s[3]; +gout[n*27+4] += + s[4]; +gout[n*27+5] += + s[5]; +gout[n*27+6] += + s[6]; +gout[n*27+7] += + s[7]; +gout[n*27+8] += + s[8]; +gout[n*27+9] += + s[9]; +gout[n*27+10] += + s[10]; +gout[n*27+11] += + s[11]; +gout[n*27+12] += + s[12]; +gout[n*27+13] += + s[13]; +gout[n*27+14] += + s[14]; +gout[n*27+15] += + s[15]; +gout[n*27+16] += + s[16]; +gout[n*27+17] += + s[17]; +gout[n*27+18] += + s[18]; +gout[n*27+19] += + s[19]; +gout[n*27+20] += + s[20]; +gout[n*27+21] += + s[21]; +gout[n*27+22] += + s[22]; +gout[n*27+23] += + s[23]; +gout[n*27+24] += + s[24]; +gout[n*27+25] += + s[25]; +gout[n*27+26] += + s[26]; +}}} +void int1e_rrr_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 27}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_rrr_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 27}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rrr; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_rrr_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 27}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rrr; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_rrr_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 27}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rrr; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_rrr) +ALL_CINT1E_FORTRAN_(int1e_rrr) + +void CINTgout1e_int1e_rrrr(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype *g8 = g7 + envs->g_size * 3; +dtype *g9 = g8 + envs->g_size * 3; +dtype *g10 = g9 + envs->g_size * 3; +dtype *g11 = g10 + envs->g_size * 3; +dtype *g12 = g11 + envs->g_size * 3; +dtype *g13 = g12 + envs->g_size * 3; +dtype *g14 = g13 + envs->g_size * 3; +dtype *g15 = g14 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +dtype s[81]; +G1E_RCJ(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g3, g2, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g4, g0, envs->i_l+0, envs->j_l+2, 0); +G1E_RCJ(g5, g4, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g6, g4, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g7, g6, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g8, g0, envs->i_l+0, envs->j_l+3, 0); +G1E_RCJ(g9, g8, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g10, g8, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g11, g10, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g12, g8, envs->i_l+0, envs->j_l+2, 0); +G1E_RCJ(g13, g12, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g14, g12, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g15, g14, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g15[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g14[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g14[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g13[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g12[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g12[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g13[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g12[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g12[ix+0]*g0[iy+0]*g3[iz+0]; +s[9] = + g11[ix+0]*g4[iy+0]*g0[iz+0]; +s[10] = + g10[ix+0]*g5[iy+0]*g0[iz+0]; +s[11] = + g10[ix+0]*g4[iy+0]*g1[iz+0]; +s[12] = + g9[ix+0]*g6[iy+0]*g0[iz+0]; +s[13] = + g8[ix+0]*g7[iy+0]*g0[iz+0]; +s[14] = + g8[ix+0]*g6[iy+0]*g1[iz+0]; +s[15] = + g9[ix+0]*g4[iy+0]*g2[iz+0]; +s[16] = + g8[ix+0]*g5[iy+0]*g2[iz+0]; +s[17] = + g8[ix+0]*g4[iy+0]*g3[iz+0]; +s[18] = + g11[ix+0]*g0[iy+0]*g4[iz+0]; +s[19] = + g10[ix+0]*g1[iy+0]*g4[iz+0]; +s[20] = + g10[ix+0]*g0[iy+0]*g5[iz+0]; +s[21] = + g9[ix+0]*g2[iy+0]*g4[iz+0]; +s[22] = + g8[ix+0]*g3[iy+0]*g4[iz+0]; +s[23] = + g8[ix+0]*g2[iy+0]*g5[iz+0]; +s[24] = + g9[ix+0]*g0[iy+0]*g6[iz+0]; +s[25] = + g8[ix+0]*g1[iy+0]*g6[iz+0]; +s[26] = + g8[ix+0]*g0[iy+0]*g7[iz+0]; +s[27] = + g7[ix+0]*g8[iy+0]*g0[iz+0]; +s[28] = + g6[ix+0]*g9[iy+0]*g0[iz+0]; +s[29] = + g6[ix+0]*g8[iy+0]*g1[iz+0]; +s[30] = + g5[ix+0]*g10[iy+0]*g0[iz+0]; +s[31] = + g4[ix+0]*g11[iy+0]*g0[iz+0]; +s[32] = + g4[ix+0]*g10[iy+0]*g1[iz+0]; +s[33] = + g5[ix+0]*g8[iy+0]*g2[iz+0]; +s[34] = + g4[ix+0]*g9[iy+0]*g2[iz+0]; +s[35] = + g4[ix+0]*g8[iy+0]*g3[iz+0]; +s[36] = + g3[ix+0]*g12[iy+0]*g0[iz+0]; +s[37] = + g2[ix+0]*g13[iy+0]*g0[iz+0]; +s[38] = + g2[ix+0]*g12[iy+0]*g1[iz+0]; +s[39] = + g1[ix+0]*g14[iy+0]*g0[iz+0]; +s[40] = + g0[ix+0]*g15[iy+0]*g0[iz+0]; +s[41] = + g0[ix+0]*g14[iy+0]*g1[iz+0]; +s[42] = + g1[ix+0]*g12[iy+0]*g2[iz+0]; +s[43] = + g0[ix+0]*g13[iy+0]*g2[iz+0]; +s[44] = + g0[ix+0]*g12[iy+0]*g3[iz+0]; +s[45] = + g3[ix+0]*g8[iy+0]*g4[iz+0]; +s[46] = + g2[ix+0]*g9[iy+0]*g4[iz+0]; +s[47] = + g2[ix+0]*g8[iy+0]*g5[iz+0]; +s[48] = + g1[ix+0]*g10[iy+0]*g4[iz+0]; +s[49] = + g0[ix+0]*g11[iy+0]*g4[iz+0]; +s[50] = + g0[ix+0]*g10[iy+0]*g5[iz+0]; +s[51] = + g1[ix+0]*g8[iy+0]*g6[iz+0]; +s[52] = + g0[ix+0]*g9[iy+0]*g6[iz+0]; +s[53] = + g0[ix+0]*g8[iy+0]*g7[iz+0]; +s[54] = + g7[ix+0]*g0[iy+0]*g8[iz+0]; +s[55] = + g6[ix+0]*g1[iy+0]*g8[iz+0]; +s[56] = + g6[ix+0]*g0[iy+0]*g9[iz+0]; +s[57] = + g5[ix+0]*g2[iy+0]*g8[iz+0]; +s[58] = + g4[ix+0]*g3[iy+0]*g8[iz+0]; +s[59] = + g4[ix+0]*g2[iy+0]*g9[iz+0]; +s[60] = + g5[ix+0]*g0[iy+0]*g10[iz+0]; +s[61] = + g4[ix+0]*g1[iy+0]*g10[iz+0]; +s[62] = + g4[ix+0]*g0[iy+0]*g11[iz+0]; +s[63] = + g3[ix+0]*g4[iy+0]*g8[iz+0]; +s[64] = + g2[ix+0]*g5[iy+0]*g8[iz+0]; +s[65] = + g2[ix+0]*g4[iy+0]*g9[iz+0]; +s[66] = + g1[ix+0]*g6[iy+0]*g8[iz+0]; +s[67] = + g0[ix+0]*g7[iy+0]*g8[iz+0]; +s[68] = + g0[ix+0]*g6[iy+0]*g9[iz+0]; +s[69] = + g1[ix+0]*g4[iy+0]*g10[iz+0]; +s[70] = + g0[ix+0]*g5[iy+0]*g10[iz+0]; +s[71] = + g0[ix+0]*g4[iy+0]*g11[iz+0]; +s[72] = + g3[ix+0]*g0[iy+0]*g12[iz+0]; +s[73] = + g2[ix+0]*g1[iy+0]*g12[iz+0]; +s[74] = + g2[ix+0]*g0[iy+0]*g13[iz+0]; +s[75] = + g1[ix+0]*g2[iy+0]*g12[iz+0]; +s[76] = + g0[ix+0]*g3[iy+0]*g12[iz+0]; +s[77] = + g0[ix+0]*g2[iy+0]*g13[iz+0]; +s[78] = + g1[ix+0]*g0[iy+0]*g14[iz+0]; +s[79] = + g0[ix+0]*g1[iy+0]*g14[iz+0]; +s[80] = + g0[ix+0]*g0[iy+0]*g15[iz+0]; +if (gout_empty) { +gout[n*81+0] = + s[0]; +gout[n*81+1] = + s[1]; +gout[n*81+2] = + s[2]; +gout[n*81+3] = + s[3]; +gout[n*81+4] = + s[4]; +gout[n*81+5] = + s[5]; +gout[n*81+6] = + s[6]; +gout[n*81+7] = + s[7]; +gout[n*81+8] = + s[8]; +gout[n*81+9] = + s[9]; +gout[n*81+10] = + s[10]; +gout[n*81+11] = + s[11]; +gout[n*81+12] = + s[12]; +gout[n*81+13] = + s[13]; +gout[n*81+14] = + s[14]; +gout[n*81+15] = + s[15]; +gout[n*81+16] = + s[16]; +gout[n*81+17] = + s[17]; +gout[n*81+18] = + s[18]; +gout[n*81+19] = + s[19]; +gout[n*81+20] = + s[20]; +gout[n*81+21] = + s[21]; +gout[n*81+22] = + s[22]; +gout[n*81+23] = + s[23]; +gout[n*81+24] = + s[24]; +gout[n*81+25] = + s[25]; +gout[n*81+26] = + s[26]; +gout[n*81+27] = + s[27]; +gout[n*81+28] = + s[28]; +gout[n*81+29] = + s[29]; +gout[n*81+30] = + s[30]; +gout[n*81+31] = + s[31]; +gout[n*81+32] = + s[32]; +gout[n*81+33] = + s[33]; +gout[n*81+34] = + s[34]; +gout[n*81+35] = + s[35]; +gout[n*81+36] = + s[36]; +gout[n*81+37] = + s[37]; +gout[n*81+38] = + s[38]; +gout[n*81+39] = + s[39]; +gout[n*81+40] = + s[40]; +gout[n*81+41] = + s[41]; +gout[n*81+42] = + s[42]; +gout[n*81+43] = + s[43]; +gout[n*81+44] = + s[44]; +gout[n*81+45] = + s[45]; +gout[n*81+46] = + s[46]; +gout[n*81+47] = + s[47]; +gout[n*81+48] = + s[48]; +gout[n*81+49] = + s[49]; +gout[n*81+50] = + s[50]; +gout[n*81+51] = + s[51]; +gout[n*81+52] = + s[52]; +gout[n*81+53] = + s[53]; +gout[n*81+54] = + s[54]; +gout[n*81+55] = + s[55]; +gout[n*81+56] = + s[56]; +gout[n*81+57] = + s[57]; +gout[n*81+58] = + s[58]; +gout[n*81+59] = + s[59]; +gout[n*81+60] = + s[60]; +gout[n*81+61] = + s[61]; +gout[n*81+62] = + s[62]; +gout[n*81+63] = + s[63]; +gout[n*81+64] = + s[64]; +gout[n*81+65] = + s[65]; +gout[n*81+66] = + s[66]; +gout[n*81+67] = + s[67]; +gout[n*81+68] = + s[68]; +gout[n*81+69] = + s[69]; +gout[n*81+70] = + s[70]; +gout[n*81+71] = + s[71]; +gout[n*81+72] = + s[72]; +gout[n*81+73] = + s[73]; +gout[n*81+74] = + s[74]; +gout[n*81+75] = + s[75]; +gout[n*81+76] = + s[76]; +gout[n*81+77] = + s[77]; +gout[n*81+78] = + s[78]; +gout[n*81+79] = + s[79]; +gout[n*81+80] = + s[80]; +} else { +gout[n*81+0] += + s[0]; +gout[n*81+1] += + s[1]; +gout[n*81+2] += + s[2]; +gout[n*81+3] += + s[3]; +gout[n*81+4] += + s[4]; +gout[n*81+5] += + s[5]; +gout[n*81+6] += + s[6]; +gout[n*81+7] += + s[7]; +gout[n*81+8] += + s[8]; +gout[n*81+9] += + s[9]; +gout[n*81+10] += + s[10]; +gout[n*81+11] += + s[11]; +gout[n*81+12] += + s[12]; +gout[n*81+13] += + s[13]; +gout[n*81+14] += + s[14]; +gout[n*81+15] += + s[15]; +gout[n*81+16] += + s[16]; +gout[n*81+17] += + s[17]; +gout[n*81+18] += + s[18]; +gout[n*81+19] += + s[19]; +gout[n*81+20] += + s[20]; +gout[n*81+21] += + s[21]; +gout[n*81+22] += + s[22]; +gout[n*81+23] += + s[23]; +gout[n*81+24] += + s[24]; +gout[n*81+25] += + s[25]; +gout[n*81+26] += + s[26]; +gout[n*81+27] += + s[27]; +gout[n*81+28] += + s[28]; +gout[n*81+29] += + s[29]; +gout[n*81+30] += + s[30]; +gout[n*81+31] += + s[31]; +gout[n*81+32] += + s[32]; +gout[n*81+33] += + s[33]; +gout[n*81+34] += + s[34]; +gout[n*81+35] += + s[35]; +gout[n*81+36] += + s[36]; +gout[n*81+37] += + s[37]; +gout[n*81+38] += + s[38]; +gout[n*81+39] += + s[39]; +gout[n*81+40] += + s[40]; +gout[n*81+41] += + s[41]; +gout[n*81+42] += + s[42]; +gout[n*81+43] += + s[43]; +gout[n*81+44] += + s[44]; +gout[n*81+45] += + s[45]; +gout[n*81+46] += + s[46]; +gout[n*81+47] += + s[47]; +gout[n*81+48] += + s[48]; +gout[n*81+49] += + s[49]; +gout[n*81+50] += + s[50]; +gout[n*81+51] += + s[51]; +gout[n*81+52] += + s[52]; +gout[n*81+53] += + s[53]; +gout[n*81+54] += + s[54]; +gout[n*81+55] += + s[55]; +gout[n*81+56] += + s[56]; +gout[n*81+57] += + s[57]; +gout[n*81+58] += + s[58]; +gout[n*81+59] += + s[59]; +gout[n*81+60] += + s[60]; +gout[n*81+61] += + s[61]; +gout[n*81+62] += + s[62]; +gout[n*81+63] += + s[63]; +gout[n*81+64] += + s[64]; +gout[n*81+65] += + s[65]; +gout[n*81+66] += + s[66]; +gout[n*81+67] += + s[67]; +gout[n*81+68] += + s[68]; +gout[n*81+69] += + s[69]; +gout[n*81+70] += + s[70]; +gout[n*81+71] += + s[71]; +gout[n*81+72] += + s[72]; +gout[n*81+73] += + s[73]; +gout[n*81+74] += + s[74]; +gout[n*81+75] += + s[75]; +gout[n*81+76] += + s[76]; +gout[n*81+77] += + s[77]; +gout[n*81+78] += + s[78]; +gout[n*81+79] += + s[79]; +gout[n*81+80] += + s[80]; +}}} +void int1e_rrrr_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 81}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_rrrr_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 81}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rrrr; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_rrrr_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 81}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rrrr; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_rrrr_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 81}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rrrr; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_rrrr) +ALL_CINT1E_FORTRAN_(int1e_rrrr) + +void CINTgout1e_int1e_z_origj(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype s[3]; +G1E_R_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]; +if (gout_empty) { +gout[n*1+0] = + s[2]; +} else { +gout[n*1+0] += + s[2]; +}}} +void int1e_z_origj_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_z_origj_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_z_origj; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_z_origj_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_z_origj; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_z_origj_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_z_origj; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_z_origj) +ALL_CINT1E_FORTRAN_(int1e_z_origj) + +void CINTgout1e_int1e_zz_origj(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype s[9]; +G1E_R_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_R_J(g3, g2, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g3[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g2[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g2[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g1[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g0[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g0[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g1[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g0[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g0[ix+0]*g0[iy+0]*g3[iz+0]; +if (gout_empty) { +gout[n*1+0] = + s[8]; +} else { +gout[n*1+0] += + s[8]; +}}} +void int1e_zz_origj_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_zz_origj_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_zz_origj; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_zz_origj_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_zz_origj; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_zz_origj_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_zz_origj; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_zz_origj) +ALL_CINT1E_FORTRAN_(int1e_zz_origj) + +void CINTgout1e_int1e_r_origj(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype s[3]; +G1E_R_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]; +if (gout_empty) { +gout[n*3+0] = + s[0]; +gout[n*3+1] = + s[1]; +gout[n*3+2] = + s[2]; +} else { +gout[n*3+0] += + s[0]; +gout[n*3+1] += + s[1]; +gout[n*3+2] += + s[2]; +}}} +void int1e_r_origj_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_r_origj_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r_origj; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_r_origj_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r_origj; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_r_origj_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r_origj; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_r_origj) +ALL_CINT1E_FORTRAN_(int1e_r_origj) + +void CINTgout1e_int1e_rr_origj(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype s[9]; +G1E_R_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_R_J(g3, g2, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g3[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g2[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g2[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g1[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g0[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g0[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g1[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g0[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g0[ix+0]*g0[iy+0]*g3[iz+0]; +if (gout_empty) { +gout[n*9+0] = + s[0]; +gout[n*9+1] = + s[1]; +gout[n*9+2] = + s[2]; +gout[n*9+3] = + s[3]; +gout[n*9+4] = + s[4]; +gout[n*9+5] = + s[5]; +gout[n*9+6] = + s[6]; +gout[n*9+7] = + s[7]; +gout[n*9+8] = + s[8]; +} else { +gout[n*9+0] += + s[0]; +gout[n*9+1] += + s[1]; +gout[n*9+2] += + s[2]; +gout[n*9+3] += + s[3]; +gout[n*9+4] += + s[4]; +gout[n*9+5] += + s[5]; +gout[n*9+6] += + s[6]; +gout[n*9+7] += + s[7]; +gout[n*9+8] += + s[8]; +}}} +void int1e_rr_origj_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_rr_origj_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rr_origj; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_rr_origj_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rr_origj; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_rr_origj_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rr_origj; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_rr_origj) +ALL_CINT1E_FORTRAN_(int1e_rr_origj) + +void CINTgout1e_int1e_r2_origj(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype s[9]; +G1E_R_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_R_J(g3, g2, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g3[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g2[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g2[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g1[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g0[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g0[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g1[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g0[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g0[ix+0]*g0[iy+0]*g3[iz+0]; +if (gout_empty) { +gout[n*1+0] = + s[0] + s[4] + s[8]; +} else { +gout[n*1+0] += + s[0] + s[4] + s[8]; +}}} +void int1e_r2_origj_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_r2_origj_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r2_origj; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_r2_origj_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r2_origj; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_r2_origj_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r2_origj; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_r2_origj) +ALL_CINT1E_FORTRAN_(int1e_r2_origj) + +void CINTgout1e_int1e_r4_origj(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype *g8 = g7 + envs->g_size * 3; +dtype *g9 = g8 + envs->g_size * 3; +dtype *g10 = g9 + envs->g_size * 3; +dtype *g11 = g10 + envs->g_size * 3; +dtype *g12 = g11 + envs->g_size * 3; +dtype *g13 = g12 + envs->g_size * 3; +dtype *g14 = g13 + envs->g_size * 3; +dtype *g15 = g14 + envs->g_size * 3; +dtype s[81]; +G1E_R_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_R_J(g3, g2, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g4, g0, envs->i_l+0, envs->j_l+2, 0); +G1E_R_J(g5, g4, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g6, g4, envs->i_l+0, envs->j_l+1, 0); +G1E_R_J(g7, g6, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g8, g0, envs->i_l+0, envs->j_l+3, 0); +G1E_R_J(g9, g8, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g10, g8, envs->i_l+0, envs->j_l+1, 0); +G1E_R_J(g11, g10, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g12, g8, envs->i_l+0, envs->j_l+2, 0); +G1E_R_J(g13, g12, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g14, g12, envs->i_l+0, envs->j_l+1, 0); +G1E_R_J(g15, g14, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g15[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g14[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g14[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g13[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g12[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g12[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g13[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g12[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g12[ix+0]*g0[iy+0]*g3[iz+0]; +s[9] = + g11[ix+0]*g4[iy+0]*g0[iz+0]; +s[10] = + g10[ix+0]*g5[iy+0]*g0[iz+0]; +s[11] = + g10[ix+0]*g4[iy+0]*g1[iz+0]; +s[12] = + g9[ix+0]*g6[iy+0]*g0[iz+0]; +s[13] = + g8[ix+0]*g7[iy+0]*g0[iz+0]; +s[14] = + g8[ix+0]*g6[iy+0]*g1[iz+0]; +s[15] = + g9[ix+0]*g4[iy+0]*g2[iz+0]; +s[16] = + g8[ix+0]*g5[iy+0]*g2[iz+0]; +s[17] = + g8[ix+0]*g4[iy+0]*g3[iz+0]; +s[18] = + g11[ix+0]*g0[iy+0]*g4[iz+0]; +s[19] = + g10[ix+0]*g1[iy+0]*g4[iz+0]; +s[20] = + g10[ix+0]*g0[iy+0]*g5[iz+0]; +s[21] = + g9[ix+0]*g2[iy+0]*g4[iz+0]; +s[22] = + g8[ix+0]*g3[iy+0]*g4[iz+0]; +s[23] = + g8[ix+0]*g2[iy+0]*g5[iz+0]; +s[24] = + g9[ix+0]*g0[iy+0]*g6[iz+0]; +s[25] = + g8[ix+0]*g1[iy+0]*g6[iz+0]; +s[26] = + g8[ix+0]*g0[iy+0]*g7[iz+0]; +s[27] = + g7[ix+0]*g8[iy+0]*g0[iz+0]; +s[28] = + g6[ix+0]*g9[iy+0]*g0[iz+0]; +s[29] = + g6[ix+0]*g8[iy+0]*g1[iz+0]; +s[30] = + g5[ix+0]*g10[iy+0]*g0[iz+0]; +s[31] = + g4[ix+0]*g11[iy+0]*g0[iz+0]; +s[32] = + g4[ix+0]*g10[iy+0]*g1[iz+0]; +s[33] = + g5[ix+0]*g8[iy+0]*g2[iz+0]; +s[34] = + g4[ix+0]*g9[iy+0]*g2[iz+0]; +s[35] = + g4[ix+0]*g8[iy+0]*g3[iz+0]; +s[36] = + g3[ix+0]*g12[iy+0]*g0[iz+0]; +s[37] = + g2[ix+0]*g13[iy+0]*g0[iz+0]; +s[38] = + g2[ix+0]*g12[iy+0]*g1[iz+0]; +s[39] = + g1[ix+0]*g14[iy+0]*g0[iz+0]; +s[40] = + g0[ix+0]*g15[iy+0]*g0[iz+0]; +s[41] = + g0[ix+0]*g14[iy+0]*g1[iz+0]; +s[42] = + g1[ix+0]*g12[iy+0]*g2[iz+0]; +s[43] = + g0[ix+0]*g13[iy+0]*g2[iz+0]; +s[44] = + g0[ix+0]*g12[iy+0]*g3[iz+0]; +s[45] = + g3[ix+0]*g8[iy+0]*g4[iz+0]; +s[46] = + g2[ix+0]*g9[iy+0]*g4[iz+0]; +s[47] = + g2[ix+0]*g8[iy+0]*g5[iz+0]; +s[48] = + g1[ix+0]*g10[iy+0]*g4[iz+0]; +s[49] = + g0[ix+0]*g11[iy+0]*g4[iz+0]; +s[50] = + g0[ix+0]*g10[iy+0]*g5[iz+0]; +s[51] = + g1[ix+0]*g8[iy+0]*g6[iz+0]; +s[52] = + g0[ix+0]*g9[iy+0]*g6[iz+0]; +s[53] = + g0[ix+0]*g8[iy+0]*g7[iz+0]; +s[54] = + g7[ix+0]*g0[iy+0]*g8[iz+0]; +s[55] = + g6[ix+0]*g1[iy+0]*g8[iz+0]; +s[56] = + g6[ix+0]*g0[iy+0]*g9[iz+0]; +s[57] = + g5[ix+0]*g2[iy+0]*g8[iz+0]; +s[58] = + g4[ix+0]*g3[iy+0]*g8[iz+0]; +s[59] = + g4[ix+0]*g2[iy+0]*g9[iz+0]; +s[60] = + g5[ix+0]*g0[iy+0]*g10[iz+0]; +s[61] = + g4[ix+0]*g1[iy+0]*g10[iz+0]; +s[62] = + g4[ix+0]*g0[iy+0]*g11[iz+0]; +s[63] = + g3[ix+0]*g4[iy+0]*g8[iz+0]; +s[64] = + g2[ix+0]*g5[iy+0]*g8[iz+0]; +s[65] = + g2[ix+0]*g4[iy+0]*g9[iz+0]; +s[66] = + g1[ix+0]*g6[iy+0]*g8[iz+0]; +s[67] = + g0[ix+0]*g7[iy+0]*g8[iz+0]; +s[68] = + g0[ix+0]*g6[iy+0]*g9[iz+0]; +s[69] = + g1[ix+0]*g4[iy+0]*g10[iz+0]; +s[70] = + g0[ix+0]*g5[iy+0]*g10[iz+0]; +s[71] = + g0[ix+0]*g4[iy+0]*g11[iz+0]; +s[72] = + g3[ix+0]*g0[iy+0]*g12[iz+0]; +s[73] = + g2[ix+0]*g1[iy+0]*g12[iz+0]; +s[74] = + g2[ix+0]*g0[iy+0]*g13[iz+0]; +s[75] = + g1[ix+0]*g2[iy+0]*g12[iz+0]; +s[76] = + g0[ix+0]*g3[iy+0]*g12[iz+0]; +s[77] = + g0[ix+0]*g2[iy+0]*g13[iz+0]; +s[78] = + g1[ix+0]*g0[iy+0]*g14[iz+0]; +s[79] = + g0[ix+0]*g1[iy+0]*g14[iz+0]; +s[80] = + g0[ix+0]*g0[iy+0]*g15[iz+0]; +if (gout_empty) { +gout[n*1+0] = + s[0] + 2*s[4] + 2*s[8] + s[40] + 2*s[44] + s[80]; +} else { +gout[n*1+0] += + s[0] + 2*s[4] + 2*s[8] + s[40] + 2*s[44] + s[80]; +}}} +void int1e_r4_origj_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_r4_origj_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r4_origj; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_r4_origj_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r4_origj; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_r4_origj_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_r4_origj; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_r4_origj) +ALL_CINT1E_FORTRAN_(int1e_r4_origj) + +void CINTgout1e_int1e_p4(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype *g8 = g7 + envs->g_size * 3; +dtype *g9 = g8 + envs->g_size * 3; +dtype *g10 = g9 + envs->g_size * 3; +dtype *g11 = g10 + envs->g_size * 3; +dtype *g12 = g11 + envs->g_size * 3; +dtype *g13 = g12 + envs->g_size * 3; +dtype *g14 = g13 + envs->g_size * 3; +dtype *g15 = g14 + envs->g_size * 3; +dtype s[81]; +G1E_D_J(g1, g0, envs->i_l+2, envs->j_l+0, 0); +G1E_D_J(g2, g0, envs->i_l+2, envs->j_l+1, 0); +G1E_D_J(g3, g2, envs->i_l+2, envs->j_l+0, 0); +G1E_D_I(g4, g0, envs->i_l+1, envs->j_l, 0); +G1E_D_I(g5, g1, envs->i_l+1, envs->j_l, 0); +G1E_D_I(g6, g2, envs->i_l+1, envs->j_l, 0); +G1E_D_I(g7, g3, envs->i_l+1, envs->j_l, 0); +G1E_D_I(g8, g0, envs->i_l+0, envs->j_l, 0); +G1E_D_I(g9, g1, envs->i_l+0, envs->j_l, 0); +G1E_D_I(g10, g2, envs->i_l+0, envs->j_l, 0); +G1E_D_I(g11, g3, envs->i_l+0, envs->j_l, 0); +G1E_D_I(g12, g4, envs->i_l+0, envs->j_l, 0); +G1E_D_I(g13, g5, envs->i_l+0, envs->j_l, 0); +G1E_D_I(g14, g6, envs->i_l+0, envs->j_l, 0); +G1E_D_I(g15, g7, envs->i_l+0, envs->j_l, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g15[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g14[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g14[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g13[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g12[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g12[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g13[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g12[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g12[ix+0]*g0[iy+0]*g3[iz+0]; +s[9] = + g11[ix+0]*g4[iy+0]*g0[iz+0]; +s[10] = + g10[ix+0]*g5[iy+0]*g0[iz+0]; +s[11] = + g10[ix+0]*g4[iy+0]*g1[iz+0]; +s[12] = + g9[ix+0]*g6[iy+0]*g0[iz+0]; +s[13] = + g8[ix+0]*g7[iy+0]*g0[iz+0]; +s[14] = + g8[ix+0]*g6[iy+0]*g1[iz+0]; +s[15] = + g9[ix+0]*g4[iy+0]*g2[iz+0]; +s[16] = + g8[ix+0]*g5[iy+0]*g2[iz+0]; +s[17] = + g8[ix+0]*g4[iy+0]*g3[iz+0]; +s[18] = + g11[ix+0]*g0[iy+0]*g4[iz+0]; +s[19] = + g10[ix+0]*g1[iy+0]*g4[iz+0]; +s[20] = + g10[ix+0]*g0[iy+0]*g5[iz+0]; +s[21] = + g9[ix+0]*g2[iy+0]*g4[iz+0]; +s[22] = + g8[ix+0]*g3[iy+0]*g4[iz+0]; +s[23] = + g8[ix+0]*g2[iy+0]*g5[iz+0]; +s[24] = + g9[ix+0]*g0[iy+0]*g6[iz+0]; +s[25] = + g8[ix+0]*g1[iy+0]*g6[iz+0]; +s[26] = + g8[ix+0]*g0[iy+0]*g7[iz+0]; +s[27] = + g7[ix+0]*g8[iy+0]*g0[iz+0]; +s[28] = + g6[ix+0]*g9[iy+0]*g0[iz+0]; +s[29] = + g6[ix+0]*g8[iy+0]*g1[iz+0]; +s[30] = + g5[ix+0]*g10[iy+0]*g0[iz+0]; +s[31] = + g4[ix+0]*g11[iy+0]*g0[iz+0]; +s[32] = + g4[ix+0]*g10[iy+0]*g1[iz+0]; +s[33] = + g5[ix+0]*g8[iy+0]*g2[iz+0]; +s[34] = + g4[ix+0]*g9[iy+0]*g2[iz+0]; +s[35] = + g4[ix+0]*g8[iy+0]*g3[iz+0]; +s[36] = + g3[ix+0]*g12[iy+0]*g0[iz+0]; +s[37] = + g2[ix+0]*g13[iy+0]*g0[iz+0]; +s[38] = + g2[ix+0]*g12[iy+0]*g1[iz+0]; +s[39] = + g1[ix+0]*g14[iy+0]*g0[iz+0]; +s[40] = + g0[ix+0]*g15[iy+0]*g0[iz+0]; +s[41] = + g0[ix+0]*g14[iy+0]*g1[iz+0]; +s[42] = + g1[ix+0]*g12[iy+0]*g2[iz+0]; +s[43] = + g0[ix+0]*g13[iy+0]*g2[iz+0]; +s[44] = + g0[ix+0]*g12[iy+0]*g3[iz+0]; +s[45] = + g3[ix+0]*g8[iy+0]*g4[iz+0]; +s[46] = + g2[ix+0]*g9[iy+0]*g4[iz+0]; +s[47] = + g2[ix+0]*g8[iy+0]*g5[iz+0]; +s[48] = + g1[ix+0]*g10[iy+0]*g4[iz+0]; +s[49] = + g0[ix+0]*g11[iy+0]*g4[iz+0]; +s[50] = + g0[ix+0]*g10[iy+0]*g5[iz+0]; +s[51] = + g1[ix+0]*g8[iy+0]*g6[iz+0]; +s[52] = + g0[ix+0]*g9[iy+0]*g6[iz+0]; +s[53] = + g0[ix+0]*g8[iy+0]*g7[iz+0]; +s[54] = + g7[ix+0]*g0[iy+0]*g8[iz+0]; +s[55] = + g6[ix+0]*g1[iy+0]*g8[iz+0]; +s[56] = + g6[ix+0]*g0[iy+0]*g9[iz+0]; +s[57] = + g5[ix+0]*g2[iy+0]*g8[iz+0]; +s[58] = + g4[ix+0]*g3[iy+0]*g8[iz+0]; +s[59] = + g4[ix+0]*g2[iy+0]*g9[iz+0]; +s[60] = + g5[ix+0]*g0[iy+0]*g10[iz+0]; +s[61] = + g4[ix+0]*g1[iy+0]*g10[iz+0]; +s[62] = + g4[ix+0]*g0[iy+0]*g11[iz+0]; +s[63] = + g3[ix+0]*g4[iy+0]*g8[iz+0]; +s[64] = + g2[ix+0]*g5[iy+0]*g8[iz+0]; +s[65] = + g2[ix+0]*g4[iy+0]*g9[iz+0]; +s[66] = + g1[ix+0]*g6[iy+0]*g8[iz+0]; +s[67] = + g0[ix+0]*g7[iy+0]*g8[iz+0]; +s[68] = + g0[ix+0]*g6[iy+0]*g9[iz+0]; +s[69] = + g1[ix+0]*g4[iy+0]*g10[iz+0]; +s[70] = + g0[ix+0]*g5[iy+0]*g10[iz+0]; +s[71] = + g0[ix+0]*g4[iy+0]*g11[iz+0]; +s[72] = + g3[ix+0]*g0[iy+0]*g12[iz+0]; +s[73] = + g2[ix+0]*g1[iy+0]*g12[iz+0]; +s[74] = + g2[ix+0]*g0[iy+0]*g13[iz+0]; +s[75] = + g1[ix+0]*g2[iy+0]*g12[iz+0]; +s[76] = + g0[ix+0]*g3[iy+0]*g12[iz+0]; +s[77] = + g0[ix+0]*g2[iy+0]*g13[iz+0]; +s[78] = + g1[ix+0]*g0[iy+0]*g14[iz+0]; +s[79] = + g0[ix+0]*g1[iy+0]*g14[iz+0]; +s[80] = + g0[ix+0]*g0[iy+0]*g15[iz+0]; +if (gout_empty) { +gout[n*1+0] = + s[0] + 2*s[4] + 2*s[8] + s[40] + 2*s[44] + s[80]; +} else { +gout[n*1+0] += + s[0] + 2*s[4] + 2*s[8] + s[40] + 2*s[44] + s[80]; +}}} +void int1e_p4_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {2, 2, 0, 0, 4, 1, 1, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_p4_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 2, 0, 0, 4, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_p4; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_p4_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 2, 0, 0, 4, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_p4; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_p4_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 2, 0, 0, 4, 1, 1, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_p4; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_p4) +ALL_CINT1E_FORTRAN_(int1e_p4) + +void CINTgout1e_int1e_prinvp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +G2E_D_J(g1, g0, envs->i_l+1, envs->j_l+0, 0, 0); +G2E_D_I(g2, g0, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g3, g1, envs->i_l+0, envs->j_l, 0, 0); +dtype s[9]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 9; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g3[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g2[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g2[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g1[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g0[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g0[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g1[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g0[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g0[ix+i] * g0[iy+i] * g3[iz+i]; +} +if (gout_empty) { +gout[n*1+0] = + s[0] + s[4] + s[8]; +} else { +gout[n*1+0] += + s[0] + s[4] + s[8]; +}}} +void int1e_prinvp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_prinvp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_prinvp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 1); +} +CACHE_SIZE_T int1e_prinvp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_prinvp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 1); +} +CACHE_SIZE_T int1e_prinvp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_prinvp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 1); +} +ALL_CINT1E(int1e_prinvp) +ALL_CINT1E_FORTRAN_(int1e_prinvp) + +void CINTgout1e_int1e_prinvxp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +G2E_D_J(g1, g0, envs->i_l+1, envs->j_l+0, 0, 0); +G2E_D_I(g2, g0, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g3, g1, envs->i_l+0, envs->j_l, 0, 0); +dtype s[9]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 9; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g3[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g2[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g2[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g1[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g0[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g0[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g1[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g0[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g0[ix+i] * g0[iy+i] * g3[iz+i]; +} +if (gout_empty) { +gout[n*3+0] = + s[5] - s[7]; +gout[n*3+1] = + s[6] - s[2]; +gout[n*3+2] = + s[1] - s[3]; +} else { +gout[n*3+0] += + s[5] - s[7]; +gout[n*3+1] += + s[6] - s[2]; +gout[n*3+2] += + s[1] - s[3]; +}}} +void int1e_prinvxp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_prinvxp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_prinvxp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 1); +} +CACHE_SIZE_T int1e_prinvxp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_prinvxp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 1); +} +CACHE_SIZE_T int1e_prinvxp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_prinvxp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 1); +} +ALL_CINT1E(int1e_prinvxp) +ALL_CINT1E_FORTRAN_(int1e_prinvxp) + +void CINTgout1e_int1e_pnucxp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +G2E_D_J(g1, g0, envs->i_l+1, envs->j_l+0, 0, 0); +G2E_D_I(g2, g0, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g3, g1, envs->i_l+0, envs->j_l, 0, 0); +dtype s[9]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 9; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g3[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g2[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g2[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g1[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g0[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g0[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g1[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g0[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g0[ix+i] * g0[iy+i] * g3[iz+i]; +} +if (gout_empty) { +gout[n*3+0] = + s[5] - s[7]; +gout[n*3+1] = + s[6] - s[2]; +gout[n*3+2] = + s[1] - s[3]; +} else { +gout[n*3+0] += + s[5] - s[7]; +gout[n*3+1] += + s[6] - s[2]; +gout[n*3+2] += + s[1] - s[3]; +}}} +void int1e_pnucxp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_pnucxp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_pnucxp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 2); +} +CACHE_SIZE_T int1e_pnucxp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_pnucxp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 2); +} +CACHE_SIZE_T int1e_pnucxp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 2, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_pnucxp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 2); +} +ALL_CINT1E(int1e_pnucxp) +ALL_CINT1E_FORTRAN_(int1e_pnucxp) + +void CINTgout1e_int1e_irp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +dtype s[9]; +G1E_D_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g3, g2, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g3[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g2[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g2[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g1[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g0[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g0[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g1[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g0[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g0[ix+0]*g0[iy+0]*g3[iz+0]; +if (gout_empty) { +gout[n*9+0] = + s[0]; +gout[n*9+1] = + s[1]; +gout[n*9+2] = + s[2]; +gout[n*9+3] = + s[3]; +gout[n*9+4] = + s[4]; +gout[n*9+5] = + s[5]; +gout[n*9+6] = + s[6]; +gout[n*9+7] = + s[7]; +gout[n*9+8] = + s[8]; +} else { +gout[n*9+0] += + s[0]; +gout[n*9+1] += + s[1]; +gout[n*9+2] += + s[2]; +gout[n*9+3] += + s[3]; +gout[n*9+4] += + s[4]; +gout[n*9+5] += + s[5]; +gout[n*9+6] += + s[6]; +gout[n*9+7] += + s[7]; +gout[n*9+8] += + s[8]; +}}} +void int1e_irp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_irp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_irp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_irp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_irp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_irp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_irp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_irp) +ALL_CINT1E_FORTRAN_(int1e_irp) + +void CINTgout1e_int1e_irrp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +dtype s[27]; +G1E_D_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g3, g2, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g4, g0, envs->i_l+0, envs->j_l+2, 0); +G1E_D_J(g5, g4, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g6, g4, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g7, g6, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g7[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g6[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g6[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g5[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g4[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g4[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g5[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g4[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g4[ix+0]*g0[iy+0]*g3[iz+0]; +s[9] = + g3[ix+0]*g4[iy+0]*g0[iz+0]; +s[10] = + g2[ix+0]*g5[iy+0]*g0[iz+0]; +s[11] = + g2[ix+0]*g4[iy+0]*g1[iz+0]; +s[12] = + g1[ix+0]*g6[iy+0]*g0[iz+0]; +s[13] = + g0[ix+0]*g7[iy+0]*g0[iz+0]; +s[14] = + g0[ix+0]*g6[iy+0]*g1[iz+0]; +s[15] = + g1[ix+0]*g4[iy+0]*g2[iz+0]; +s[16] = + g0[ix+0]*g5[iy+0]*g2[iz+0]; +s[17] = + g0[ix+0]*g4[iy+0]*g3[iz+0]; +s[18] = + g3[ix+0]*g0[iy+0]*g4[iz+0]; +s[19] = + g2[ix+0]*g1[iy+0]*g4[iz+0]; +s[20] = + g2[ix+0]*g0[iy+0]*g5[iz+0]; +s[21] = + g1[ix+0]*g2[iy+0]*g4[iz+0]; +s[22] = + g0[ix+0]*g3[iy+0]*g4[iz+0]; +s[23] = + g0[ix+0]*g2[iy+0]*g5[iz+0]; +s[24] = + g1[ix+0]*g0[iy+0]*g6[iz+0]; +s[25] = + g0[ix+0]*g1[iy+0]*g6[iz+0]; +s[26] = + g0[ix+0]*g0[iy+0]*g7[iz+0]; +if (gout_empty) { +gout[n*27+0] = + s[0]; +gout[n*27+1] = + s[1]; +gout[n*27+2] = + s[2]; +gout[n*27+3] = + s[3]; +gout[n*27+4] = + s[4]; +gout[n*27+5] = + s[5]; +gout[n*27+6] = + s[6]; +gout[n*27+7] = + s[7]; +gout[n*27+8] = + s[8]; +gout[n*27+9] = + s[9]; +gout[n*27+10] = + s[10]; +gout[n*27+11] = + s[11]; +gout[n*27+12] = + s[12]; +gout[n*27+13] = + s[13]; +gout[n*27+14] = + s[14]; +gout[n*27+15] = + s[15]; +gout[n*27+16] = + s[16]; +gout[n*27+17] = + s[17]; +gout[n*27+18] = + s[18]; +gout[n*27+19] = + s[19]; +gout[n*27+20] = + s[20]; +gout[n*27+21] = + s[21]; +gout[n*27+22] = + s[22]; +gout[n*27+23] = + s[23]; +gout[n*27+24] = + s[24]; +gout[n*27+25] = + s[25]; +gout[n*27+26] = + s[26]; +} else { +gout[n*27+0] += + s[0]; +gout[n*27+1] += + s[1]; +gout[n*27+2] += + s[2]; +gout[n*27+3] += + s[3]; +gout[n*27+4] += + s[4]; +gout[n*27+5] += + s[5]; +gout[n*27+6] += + s[6]; +gout[n*27+7] += + s[7]; +gout[n*27+8] += + s[8]; +gout[n*27+9] += + s[9]; +gout[n*27+10] += + s[10]; +gout[n*27+11] += + s[11]; +gout[n*27+12] += + s[12]; +gout[n*27+13] += + s[13]; +gout[n*27+14] += + s[14]; +gout[n*27+15] += + s[15]; +gout[n*27+16] += + s[16]; +gout[n*27+17] += + s[17]; +gout[n*27+18] += + s[18]; +gout[n*27+19] += + s[19]; +gout[n*27+20] += + s[20]; +gout[n*27+21] += + s[21]; +gout[n*27+22] += + s[22]; +gout[n*27+23] += + s[23]; +gout[n*27+24] += + s[24]; +gout[n*27+25] += + s[25]; +gout[n*27+26] += + s[26]; +}}} +void int1e_irrp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 27}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_irrp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 27}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_irrp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_irrp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 27}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_irrp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_irrp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 27}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_irrp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_irrp) +ALL_CINT1E_FORTRAN_(int1e_irrp) + +void CINTgout1e_int1e_irpr(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype drj[3]; +drj[0] = envs->rj[0] - envs->env[PTR_COMMON_ORIG+0]; +drj[1] = envs->rj[1] - envs->env[PTR_COMMON_ORIG+1]; +drj[2] = envs->rj[2] - envs->env[PTR_COMMON_ORIG+2]; +dtype s[27]; +G1E_RCJ(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_D_J(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g3, g2, envs->i_l+0, envs->j_l+0, 0); +G1E_RCJ(g4, g0, envs->i_l+0, envs->j_l+2, 0); +G1E_RCJ(g5, g4, envs->i_l+0, envs->j_l+0, 0); +G1E_D_J(g6, g4, envs->i_l+0, envs->j_l+1, 0); +G1E_RCJ(g7, g6, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g7[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g6[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g6[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g5[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g4[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g4[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g5[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g4[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g4[ix+0]*g0[iy+0]*g3[iz+0]; +s[9] = + g3[ix+0]*g4[iy+0]*g0[iz+0]; +s[10] = + g2[ix+0]*g5[iy+0]*g0[iz+0]; +s[11] = + g2[ix+0]*g4[iy+0]*g1[iz+0]; +s[12] = + g1[ix+0]*g6[iy+0]*g0[iz+0]; +s[13] = + g0[ix+0]*g7[iy+0]*g0[iz+0]; +s[14] = + g0[ix+0]*g6[iy+0]*g1[iz+0]; +s[15] = + g1[ix+0]*g4[iy+0]*g2[iz+0]; +s[16] = + g0[ix+0]*g5[iy+0]*g2[iz+0]; +s[17] = + g0[ix+0]*g4[iy+0]*g3[iz+0]; +s[18] = + g3[ix+0]*g0[iy+0]*g4[iz+0]; +s[19] = + g2[ix+0]*g1[iy+0]*g4[iz+0]; +s[20] = + g2[ix+0]*g0[iy+0]*g5[iz+0]; +s[21] = + g1[ix+0]*g2[iy+0]*g4[iz+0]; +s[22] = + g0[ix+0]*g3[iy+0]*g4[iz+0]; +s[23] = + g0[ix+0]*g2[iy+0]*g5[iz+0]; +s[24] = + g1[ix+0]*g0[iy+0]*g6[iz+0]; +s[25] = + g0[ix+0]*g1[iy+0]*g6[iz+0]; +s[26] = + g0[ix+0]*g0[iy+0]*g7[iz+0]; +if (gout_empty) { +gout[n*27+0] = + s[0]; +gout[n*27+1] = + s[1]; +gout[n*27+2] = + s[2]; +gout[n*27+3] = + s[3]; +gout[n*27+4] = + s[4]; +gout[n*27+5] = + s[5]; +gout[n*27+6] = + s[6]; +gout[n*27+7] = + s[7]; +gout[n*27+8] = + s[8]; +gout[n*27+9] = + s[9]; +gout[n*27+10] = + s[10]; +gout[n*27+11] = + s[11]; +gout[n*27+12] = + s[12]; +gout[n*27+13] = + s[13]; +gout[n*27+14] = + s[14]; +gout[n*27+15] = + s[15]; +gout[n*27+16] = + s[16]; +gout[n*27+17] = + s[17]; +gout[n*27+18] = + s[18]; +gout[n*27+19] = + s[19]; +gout[n*27+20] = + s[20]; +gout[n*27+21] = + s[21]; +gout[n*27+22] = + s[22]; +gout[n*27+23] = + s[23]; +gout[n*27+24] = + s[24]; +gout[n*27+25] = + s[25]; +gout[n*27+26] = + s[26]; +} else { +gout[n*27+0] += + s[0]; +gout[n*27+1] += + s[1]; +gout[n*27+2] += + s[2]; +gout[n*27+3] += + s[3]; +gout[n*27+4] += + s[4]; +gout[n*27+5] += + s[5]; +gout[n*27+6] += + s[6]; +gout[n*27+7] += + s[7]; +gout[n*27+8] += + s[8]; +gout[n*27+9] += + s[9]; +gout[n*27+10] += + s[10]; +gout[n*27+11] += + s[11]; +gout[n*27+12] += + s[12]; +gout[n*27+13] += + s[13]; +gout[n*27+14] += + s[14]; +gout[n*27+15] += + s[15]; +gout[n*27+16] += + s[16]; +gout[n*27+17] += + s[17]; +gout[n*27+18] += + s[18]; +gout[n*27+19] += + s[19]; +gout[n*27+20] += + s[20]; +gout[n*27+21] += + s[21]; +gout[n*27+22] += + s[22]; +gout[n*27+23] += + s[23]; +gout[n*27+24] += + s[24]; +gout[n*27+25] += + s[25]; +gout[n*27+26] += + s[26]; +}}} +void int1e_irpr_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 27}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_irpr_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 27}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_irpr; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_irpr_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 27}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_irpr; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_irpr_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 27}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_irpr; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_irpr) +ALL_CINT1E_FORTRAN_(int1e_irpr) + +void CINTgout1e_int1e_ggovlp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype rirj[3], c[9]; +rirj[0] = envs->ri[0] - envs->rj[0]; +rirj[1] = envs->ri[1] - envs->rj[1]; +rirj[2] = envs->ri[2] - envs->rj[2]; +c[0] = 1 * rirj[0] * rirj[0]; +c[1] = 1 * rirj[0] * rirj[1]; +c[2] = 1 * rirj[0] * rirj[2]; +c[3] = 1 * rirj[1] * rirj[0]; +c[4] = 1 * rirj[1] * rirj[1]; +c[5] = 1 * rirj[1] * rirj[2]; +c[6] = 1 * rirj[2] * rirj[0]; +c[7] = 1 * rirj[2] * rirj[1]; +c[8] = 1 * rirj[2] * rirj[2]; +dtype s[9]; +G1E_R0J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_R0J(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_R0J(g3, g2, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g3[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g2[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g2[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g1[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g0[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g0[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g1[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g0[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g0[ix+0]*g0[iy+0]*g3[iz+0]; +if (gout_empty) { +gout[n*9+0] = - c[4]*s[8] + 2*c[5]*s[7] - c[8]*s[4]; +gout[n*9+1] = - c[5]*s[6] + c[8]*s[3] + c[3]*s[8] - c[6]*s[5]; +gout[n*9+2] = - c[3]*s[7] + c[6]*s[4] + c[4]*s[6] - c[7]*s[3]; +gout[n*9+3] = - c[7]*s[2] + c[1]*s[8] + c[8]*s[1] - c[2]*s[7]; +gout[n*9+4] = - c[8]*s[0] + 2*c[6]*s[2] - c[0]*s[8]; +gout[n*9+5] = - c[6]*s[1] + c[0]*s[7] + c[7]*s[0] - c[1]*s[6]; +gout[n*9+6] = - c[1]*s[5] + c[4]*s[2] + c[2]*s[4] - c[5]*s[1]; +gout[n*9+7] = - c[2]*s[3] + c[5]*s[0] + c[0]*s[5] - c[3]*s[2]; +gout[n*9+8] = - c[0]*s[4] + 2*c[1]*s[3] - c[4]*s[0]; +} else { +gout[n*9+0] += - c[4]*s[8] + 2*c[5]*s[7] - c[8]*s[4]; +gout[n*9+1] += - c[5]*s[6] + c[8]*s[3] + c[3]*s[8] - c[6]*s[5]; +gout[n*9+2] += - c[3]*s[7] + c[6]*s[4] + c[4]*s[6] - c[7]*s[3]; +gout[n*9+3] += - c[7]*s[2] + c[1]*s[8] + c[8]*s[1] - c[2]*s[7]; +gout[n*9+4] += - c[8]*s[0] + 2*c[6]*s[2] - c[0]*s[8]; +gout[n*9+5] += - c[6]*s[1] + c[0]*s[7] + c[7]*s[0] - c[1]*s[6]; +gout[n*9+6] += - c[1]*s[5] + c[4]*s[2] + c[2]*s[4] - c[5]*s[1]; +gout[n*9+7] += - c[2]*s[3] + c[5]*s[0] + c[0]*s[5] - c[3]*s[2]; +gout[n*9+8] += - c[0]*s[4] + 2*c[1]*s[3] - c[4]*s[0]; +}}} +void int1e_ggovlp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ggovlp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ggovlp; +envs.common_factor *= 0.25; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_ggovlp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ggovlp; +envs.common_factor *= 0.25; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_ggovlp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ggovlp; +envs.common_factor *= 0.25; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_ggovlp) +ALL_CINT1E_FORTRAN_(int1e_ggovlp) + +void CINTgout1e_int1e_ggkin(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype *g8 = g7 + envs->g_size * 3; +dtype *g9 = g8 + envs->g_size * 3; +dtype *g10 = g9 + envs->g_size * 3; +dtype *g11 = g10 + envs->g_size * 3; +dtype *g12 = g11 + envs->g_size * 3; +dtype *g13 = g12 + envs->g_size * 3; +dtype *g14 = g13 + envs->g_size * 3; +dtype *g15 = g14 + envs->g_size * 3; +dtype rirj[3], c[9]; +rirj[0] = envs->ri[0] - envs->rj[0]; +rirj[1] = envs->ri[1] - envs->rj[1]; +rirj[2] = envs->ri[2] - envs->rj[2]; +c[0] = 1 * rirj[0] * rirj[0]; +c[1] = 1 * rirj[0] * rirj[1]; +c[2] = 1 * rirj[0] * rirj[2]; +c[3] = 1 * rirj[1] * rirj[0]; +c[4] = 1 * rirj[1] * rirj[1]; +c[5] = 1 * rirj[1] * rirj[2]; +c[6] = 1 * rirj[2] * rirj[0]; +c[7] = 1 * rirj[2] * rirj[1]; +c[8] = 1 * rirj[2] * rirj[2]; +dtype s[81]; +G1E_D_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_D_J(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g3, g2, envs->i_l+0, envs->j_l+0, 0); +G1E_R0J(g4, g0, envs->i_l+0, envs->j_l+2, 0); +G1E_D_J(g5, g4, envs->i_l+0, envs->j_l+0, 0); +G1E_D_J(g6, g4, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g7, g6, envs->i_l+0, envs->j_l+0, 0); +G1E_R0J(g8, g0, envs->i_l+0, envs->j_l+3, 0); +G1E_D_J(g9, g8, envs->i_l+0, envs->j_l+0, 0); +G1E_D_J(g10, g8, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g11, g10, envs->i_l+0, envs->j_l+0, 0); +G1E_R0J(g12, g8, envs->i_l+0, envs->j_l+2, 0); +G1E_D_J(g13, g12, envs->i_l+0, envs->j_l+0, 0); +G1E_D_J(g14, g12, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g15, g14, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g15[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g14[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g14[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g13[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g12[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g12[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g13[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g12[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g12[ix+0]*g0[iy+0]*g3[iz+0]; +s[9] = + g11[ix+0]*g4[iy+0]*g0[iz+0]; +s[10] = + g10[ix+0]*g5[iy+0]*g0[iz+0]; +s[11] = + g10[ix+0]*g4[iy+0]*g1[iz+0]; +s[12] = + g9[ix+0]*g6[iy+0]*g0[iz+0]; +s[13] = + g8[ix+0]*g7[iy+0]*g0[iz+0]; +s[14] = + g8[ix+0]*g6[iy+0]*g1[iz+0]; +s[15] = + g9[ix+0]*g4[iy+0]*g2[iz+0]; +s[16] = + g8[ix+0]*g5[iy+0]*g2[iz+0]; +s[17] = + g8[ix+0]*g4[iy+0]*g3[iz+0]; +s[18] = + g11[ix+0]*g0[iy+0]*g4[iz+0]; +s[19] = + g10[ix+0]*g1[iy+0]*g4[iz+0]; +s[20] = + g10[ix+0]*g0[iy+0]*g5[iz+0]; +s[21] = + g9[ix+0]*g2[iy+0]*g4[iz+0]; +s[22] = + g8[ix+0]*g3[iy+0]*g4[iz+0]; +s[23] = + g8[ix+0]*g2[iy+0]*g5[iz+0]; +s[24] = + g9[ix+0]*g0[iy+0]*g6[iz+0]; +s[25] = + g8[ix+0]*g1[iy+0]*g6[iz+0]; +s[26] = + g8[ix+0]*g0[iy+0]*g7[iz+0]; +s[27] = + g7[ix+0]*g8[iy+0]*g0[iz+0]; +s[28] = + g6[ix+0]*g9[iy+0]*g0[iz+0]; +s[29] = + g6[ix+0]*g8[iy+0]*g1[iz+0]; +s[30] = + g5[ix+0]*g10[iy+0]*g0[iz+0]; +s[31] = + g4[ix+0]*g11[iy+0]*g0[iz+0]; +s[32] = + g4[ix+0]*g10[iy+0]*g1[iz+0]; +s[33] = + g5[ix+0]*g8[iy+0]*g2[iz+0]; +s[34] = + g4[ix+0]*g9[iy+0]*g2[iz+0]; +s[35] = + g4[ix+0]*g8[iy+0]*g3[iz+0]; +s[36] = + g3[ix+0]*g12[iy+0]*g0[iz+0]; +s[37] = + g2[ix+0]*g13[iy+0]*g0[iz+0]; +s[38] = + g2[ix+0]*g12[iy+0]*g1[iz+0]; +s[39] = + g1[ix+0]*g14[iy+0]*g0[iz+0]; +s[40] = + g0[ix+0]*g15[iy+0]*g0[iz+0]; +s[41] = + g0[ix+0]*g14[iy+0]*g1[iz+0]; +s[42] = + g1[ix+0]*g12[iy+0]*g2[iz+0]; +s[43] = + g0[ix+0]*g13[iy+0]*g2[iz+0]; +s[44] = + g0[ix+0]*g12[iy+0]*g3[iz+0]; +s[45] = + g3[ix+0]*g8[iy+0]*g4[iz+0]; +s[46] = + g2[ix+0]*g9[iy+0]*g4[iz+0]; +s[47] = + g2[ix+0]*g8[iy+0]*g5[iz+0]; +s[48] = + g1[ix+0]*g10[iy+0]*g4[iz+0]; +s[49] = + g0[ix+0]*g11[iy+0]*g4[iz+0]; +s[50] = + g0[ix+0]*g10[iy+0]*g5[iz+0]; +s[51] = + g1[ix+0]*g8[iy+0]*g6[iz+0]; +s[52] = + g0[ix+0]*g9[iy+0]*g6[iz+0]; +s[53] = + g0[ix+0]*g8[iy+0]*g7[iz+0]; +s[54] = + g7[ix+0]*g0[iy+0]*g8[iz+0]; +s[55] = + g6[ix+0]*g1[iy+0]*g8[iz+0]; +s[56] = + g6[ix+0]*g0[iy+0]*g9[iz+0]; +s[57] = + g5[ix+0]*g2[iy+0]*g8[iz+0]; +s[58] = + g4[ix+0]*g3[iy+0]*g8[iz+0]; +s[59] = + g4[ix+0]*g2[iy+0]*g9[iz+0]; +s[60] = + g5[ix+0]*g0[iy+0]*g10[iz+0]; +s[61] = + g4[ix+0]*g1[iy+0]*g10[iz+0]; +s[62] = + g4[ix+0]*g0[iy+0]*g11[iz+0]; +s[63] = + g3[ix+0]*g4[iy+0]*g8[iz+0]; +s[64] = + g2[ix+0]*g5[iy+0]*g8[iz+0]; +s[65] = + g2[ix+0]*g4[iy+0]*g9[iz+0]; +s[66] = + g1[ix+0]*g6[iy+0]*g8[iz+0]; +s[67] = + g0[ix+0]*g7[iy+0]*g8[iz+0]; +s[68] = + g0[ix+0]*g6[iy+0]*g9[iz+0]; +s[69] = + g1[ix+0]*g4[iy+0]*g10[iz+0]; +s[70] = + g0[ix+0]*g5[iy+0]*g10[iz+0]; +s[71] = + g0[ix+0]*g4[iy+0]*g11[iz+0]; +s[72] = + g3[ix+0]*g0[iy+0]*g12[iz+0]; +s[73] = + g2[ix+0]*g1[iy+0]*g12[iz+0]; +s[74] = + g2[ix+0]*g0[iy+0]*g13[iz+0]; +s[75] = + g1[ix+0]*g2[iy+0]*g12[iz+0]; +s[76] = + g0[ix+0]*g3[iy+0]*g12[iz+0]; +s[77] = + g0[ix+0]*g2[iy+0]*g13[iz+0]; +s[78] = + g1[ix+0]*g0[iy+0]*g14[iz+0]; +s[79] = + g0[ix+0]*g1[iy+0]*g14[iz+0]; +s[80] = + g0[ix+0]*g0[iy+0]*g15[iz+0]; +if (gout_empty) { +gout[n*9+0] = + c[4]*s[72] -2*c[5]*s[63] + c[8]*s[36] + c[4]*s[76] -2*c[5]*s[67] + c[8]*s[40] + c[4]*s[80] -2*c[5]*s[71] + c[8]*s[44]; +gout[n*9+1] = + c[5]*s[54] - c[8]*s[27] - c[3]*s[72] + c[6]*s[45] + c[5]*s[58] - c[8]*s[31] - c[3]*s[76] + c[6]*s[49] + c[5]*s[62] - c[8]*s[35] - c[3]*s[80] + c[6]*s[53]; +gout[n*9+2] = + c[3]*s[63] - c[6]*s[36] - c[4]*s[54] + c[7]*s[27] + c[3]*s[67] - c[6]*s[40] - c[4]*s[58] + c[7]*s[31] + c[3]*s[71] - c[6]*s[44] - c[4]*s[62] + c[7]*s[35]; +gout[n*9+3] = + c[7]*s[18] - c[1]*s[72] - c[8]*s[9] + c[2]*s[63] + c[7]*s[22] - c[1]*s[76] - c[8]*s[13] + c[2]*s[67] + c[7]*s[26] - c[1]*s[80] - c[8]*s[17] + c[2]*s[71]; +gout[n*9+4] = + c[8]*s[0] -2*c[6]*s[18] + c[0]*s[72] + c[8]*s[4] -2*c[6]*s[22] + c[0]*s[76] + c[8]*s[8] -2*c[6]*s[26] + c[0]*s[80]; +gout[n*9+5] = + c[6]*s[9] - c[0]*s[63] - c[7]*s[0] + c[1]*s[54] + c[6]*s[13] - c[0]*s[67] - c[7]*s[4] + c[1]*s[58] + c[6]*s[17] - c[0]*s[71] - c[7]*s[8] + c[1]*s[62]; +gout[n*9+6] = + c[1]*s[45] - c[4]*s[18] - c[2]*s[36] + c[5]*s[9] + c[1]*s[49] - c[4]*s[22] - c[2]*s[40] + c[5]*s[13] + c[1]*s[53] - c[4]*s[26] - c[2]*s[44] + c[5]*s[17]; +gout[n*9+7] = + c[2]*s[27] - c[5]*s[0] - c[0]*s[45] + c[3]*s[18] + c[2]*s[31] - c[5]*s[4] - c[0]*s[49] + c[3]*s[22] + c[2]*s[35] - c[5]*s[8] - c[0]*s[53] + c[3]*s[26]; +gout[n*9+8] = + c[0]*s[36] -2*c[1]*s[27] + c[4]*s[0] + c[0]*s[40] -2*c[1]*s[31] + c[4]*s[4] + c[0]*s[44] -2*c[1]*s[35] + c[4]*s[8]; +} else { +gout[n*9+0] += + c[4]*s[72] -2*c[5]*s[63] + c[8]*s[36] + c[4]*s[76] -2*c[5]*s[67] + c[8]*s[40] + c[4]*s[80] -2*c[5]*s[71] + c[8]*s[44]; +gout[n*9+1] += + c[5]*s[54] - c[8]*s[27] - c[3]*s[72] + c[6]*s[45] + c[5]*s[58] - c[8]*s[31] - c[3]*s[76] + c[6]*s[49] + c[5]*s[62] - c[8]*s[35] - c[3]*s[80] + c[6]*s[53]; +gout[n*9+2] += + c[3]*s[63] - c[6]*s[36] - c[4]*s[54] + c[7]*s[27] + c[3]*s[67] - c[6]*s[40] - c[4]*s[58] + c[7]*s[31] + c[3]*s[71] - c[6]*s[44] - c[4]*s[62] + c[7]*s[35]; +gout[n*9+3] += + c[7]*s[18] - c[1]*s[72] - c[8]*s[9] + c[2]*s[63] + c[7]*s[22] - c[1]*s[76] - c[8]*s[13] + c[2]*s[67] + c[7]*s[26] - c[1]*s[80] - c[8]*s[17] + c[2]*s[71]; +gout[n*9+4] += + c[8]*s[0] -2*c[6]*s[18] + c[0]*s[72] + c[8]*s[4] -2*c[6]*s[22] + c[0]*s[76] + c[8]*s[8] -2*c[6]*s[26] + c[0]*s[80]; +gout[n*9+5] += + c[6]*s[9] - c[0]*s[63] - c[7]*s[0] + c[1]*s[54] + c[6]*s[13] - c[0]*s[67] - c[7]*s[4] + c[1]*s[58] + c[6]*s[17] - c[0]*s[71] - c[7]*s[8] + c[1]*s[62]; +gout[n*9+6] += + c[1]*s[45] - c[4]*s[18] - c[2]*s[36] + c[5]*s[9] + c[1]*s[49] - c[4]*s[22] - c[2]*s[40] + c[5]*s[13] + c[1]*s[53] - c[4]*s[26] - c[2]*s[44] + c[5]*s[17]; +gout[n*9+7] += + c[2]*s[27] - c[5]*s[0] - c[0]*s[45] + c[3]*s[18] + c[2]*s[31] - c[5]*s[4] - c[0]*s[49] + c[3]*s[22] + c[2]*s[35] - c[5]*s[8] - c[0]*s[53] + c[3]*s[26]; +gout[n*9+8] += + c[0]*s[36] -2*c[1]*s[27] + c[4]*s[0] + c[0]*s[40] -2*c[1]*s[31] + c[4]*s[4] + c[0]*s[44] -2*c[1]*s[35] + c[4]*s[8]; +}}} +void int1e_ggkin_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 9}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ggkin_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ggkin; +envs.common_factor *= 0.125; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_ggkin_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ggkin; +envs.common_factor *= 0.125; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_ggkin_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 4, 0, 0, 4, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ggkin; +envs.common_factor *= 0.125; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_ggkin) +ALL_CINT1E_FORTRAN_(int1e_ggkin) + +void CINTgout1e_int1e_ggnuc(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype rirj[3], c[9]; +rirj[0] = envs->ri[0] - envs->rj[0]; +rirj[1] = envs->ri[1] - envs->rj[1]; +rirj[2] = envs->ri[2] - envs->rj[2]; +c[0] = 1 * rirj[0] * rirj[0]; +c[1] = 1 * rirj[0] * rirj[1]; +c[2] = 1 * rirj[0] * rirj[2]; +c[3] = 1 * rirj[1] * rirj[0]; +c[4] = 1 * rirj[1] * rirj[1]; +c[5] = 1 * rirj[1] * rirj[2]; +c[6] = 1 * rirj[2] * rirj[0]; +c[7] = 1 * rirj[2] * rirj[1]; +c[8] = 1 * rirj[2] * rirj[2]; +G2E_R0J(g1, g0, envs->i_l+0, envs->j_l+0, 0, 0); +G2E_R0J(g2, g0, envs->i_l+0, envs->j_l+1, 0, 0); +G2E_R0J(g3, g2, envs->i_l+0, envs->j_l+0, 0, 0); +dtype s[9]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 9; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g3[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g2[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g2[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g1[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g0[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g0[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g1[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g0[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g0[ix+i] * g0[iy+i] * g3[iz+i]; +} +if (gout_empty) { +gout[n*9+0] = - c[4]*s[8] + 2*c[5]*s[7] - c[8]*s[4]; +gout[n*9+1] = - c[5]*s[6] + c[8]*s[3] + c[3]*s[8] - c[6]*s[5]; +gout[n*9+2] = - c[3]*s[7] + c[6]*s[4] + c[4]*s[6] - c[7]*s[3]; +gout[n*9+3] = - c[7]*s[2] + c[1]*s[8] + c[8]*s[1] - c[2]*s[7]; +gout[n*9+4] = - c[8]*s[0] + 2*c[6]*s[2] - c[0]*s[8]; +gout[n*9+5] = - c[6]*s[1] + c[0]*s[7] + c[7]*s[0] - c[1]*s[6]; +gout[n*9+6] = - c[1]*s[5] + c[4]*s[2] + c[2]*s[4] - c[5]*s[1]; +gout[n*9+7] = - c[2]*s[3] + c[5]*s[0] + c[0]*s[5] - c[3]*s[2]; +gout[n*9+8] = - c[0]*s[4] + 2*c[1]*s[3] - c[4]*s[0]; +} else { +gout[n*9+0] += - c[4]*s[8] + 2*c[5]*s[7] - c[8]*s[4]; +gout[n*9+1] += - c[5]*s[6] + c[8]*s[3] + c[3]*s[8] - c[6]*s[5]; +gout[n*9+2] += - c[3]*s[7] + c[6]*s[4] + c[4]*s[6] - c[7]*s[3]; +gout[n*9+3] += - c[7]*s[2] + c[1]*s[8] + c[8]*s[1] - c[2]*s[7]; +gout[n*9+4] += - c[8]*s[0] + 2*c[6]*s[2] - c[0]*s[8]; +gout[n*9+5] += - c[6]*s[1] + c[0]*s[7] + c[7]*s[0] - c[1]*s[6]; +gout[n*9+6] += - c[1]*s[5] + c[4]*s[2] + c[2]*s[4] - c[5]*s[1]; +gout[n*9+7] += - c[2]*s[3] + c[5]*s[0] + c[0]*s[5] - c[3]*s[2]; +gout[n*9+8] += - c[0]*s[4] + 2*c[1]*s[3] - c[4]*s[0]; +}}} +void int1e_ggnuc_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 0, 9}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ggnuc_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 0, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ggnuc; +envs.common_factor *= 0.25; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 2); +} +CACHE_SIZE_T int1e_ggnuc_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 0, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ggnuc; +envs.common_factor *= 0.25; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 2); +} +CACHE_SIZE_T int1e_ggnuc_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 2, 0, 0, 2, 1, 0, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ggnuc; +envs.common_factor *= 0.25; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 2); +} +ALL_CINT1E(int1e_ggnuc) +ALL_CINT1E_FORTRAN_(int1e_ggnuc) + +void CINTgout1e_int1e_grjxp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype rirj[3], c[3]; +rirj[0] = envs->ri[0] - envs->rj[0]; +rirj[1] = envs->ri[1] - envs->rj[1]; +rirj[2] = envs->ri[2] - envs->rj[2]; +c[0] = 1 * rirj[0]; +c[1] = 1 * rirj[1]; +c[2] = 1 * rirj[2]; +dtype s[27]; +G1E_D_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g3, g2, envs->i_l+0, envs->j_l+0, 0); +G1E_R0J(g4, g0, envs->i_l+0, envs->j_l+2, 0); +G1E_D_J(g5, g4, envs->i_l+0, envs->j_l+0, 0); +G1E_R_J(g6, g4, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g7, g6, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g7[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g6[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g6[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g5[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g4[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g4[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g5[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g4[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g4[ix+0]*g0[iy+0]*g3[iz+0]; +s[9] = + g3[ix+0]*g4[iy+0]*g0[iz+0]; +s[10] = + g2[ix+0]*g5[iy+0]*g0[iz+0]; +s[11] = + g2[ix+0]*g4[iy+0]*g1[iz+0]; +s[12] = + g1[ix+0]*g6[iy+0]*g0[iz+0]; +s[13] = + g0[ix+0]*g7[iy+0]*g0[iz+0]; +s[14] = + g0[ix+0]*g6[iy+0]*g1[iz+0]; +s[15] = + g1[ix+0]*g4[iy+0]*g2[iz+0]; +s[16] = + g0[ix+0]*g5[iy+0]*g2[iz+0]; +s[17] = + g0[ix+0]*g4[iy+0]*g3[iz+0]; +s[18] = + g3[ix+0]*g0[iy+0]*g4[iz+0]; +s[19] = + g2[ix+0]*g1[iy+0]*g4[iz+0]; +s[20] = + g2[ix+0]*g0[iy+0]*g5[iz+0]; +s[21] = + g1[ix+0]*g2[iy+0]*g4[iz+0]; +s[22] = + g0[ix+0]*g3[iy+0]*g4[iz+0]; +s[23] = + g0[ix+0]*g2[iy+0]*g5[iz+0]; +s[24] = + g1[ix+0]*g0[iy+0]*g6[iz+0]; +s[25] = + g0[ix+0]*g1[iy+0]*g6[iz+0]; +s[26] = + g0[ix+0]*g0[iy+0]*g7[iz+0]; +if (gout_empty) { +gout[n*9+0] = + c[1]*s[23] - c[2]*s[14] - c[1]*s[25] + c[2]*s[16]; +gout[n*9+1] = + c[1]*s[24] - c[2]*s[15] - c[1]*s[20] + c[2]*s[11]; +gout[n*9+2] = + c[1]*s[19] - c[2]*s[10] - c[1]*s[21] + c[2]*s[12]; +gout[n*9+3] = + c[2]*s[5] - c[0]*s[23] - c[2]*s[7] + c[0]*s[25]; +gout[n*9+4] = + c[2]*s[6] - c[0]*s[24] - c[2]*s[2] + c[0]*s[20]; +gout[n*9+5] = + c[2]*s[1] - c[0]*s[19] - c[2]*s[3] + c[0]*s[21]; +gout[n*9+6] = + c[0]*s[14] - c[1]*s[5] - c[0]*s[16] + c[1]*s[7]; +gout[n*9+7] = + c[0]*s[15] - c[1]*s[6] - c[0]*s[11] + c[1]*s[2]; +gout[n*9+8] = + c[0]*s[10] - c[1]*s[1] - c[0]*s[12] + c[1]*s[3]; +} else { +gout[n*9+0] += + c[1]*s[23] - c[2]*s[14] - c[1]*s[25] + c[2]*s[16]; +gout[n*9+1] += + c[1]*s[24] - c[2]*s[15] - c[1]*s[20] + c[2]*s[11]; +gout[n*9+2] += + c[1]*s[19] - c[2]*s[10] - c[1]*s[21] + c[2]*s[12]; +gout[n*9+3] += + c[2]*s[5] - c[0]*s[23] - c[2]*s[7] + c[0]*s[25]; +gout[n*9+4] += + c[2]*s[6] - c[0]*s[24] - c[2]*s[2] + c[0]*s[20]; +gout[n*9+5] += + c[2]*s[1] - c[0]*s[19] - c[2]*s[3] + c[0]*s[21]; +gout[n*9+6] += + c[0]*s[14] - c[1]*s[5] - c[0]*s[16] + c[1]*s[7]; +gout[n*9+7] += + c[0]*s[15] - c[1]*s[6] - c[0]*s[11] + c[1]*s[2]; +gout[n*9+8] += + c[0]*s[10] - c[1]*s[1] - c[0]*s[12] + c[1]*s[3]; +}}} +void int1e_grjxp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 9}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_grjxp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_grjxp; +envs.common_factor *= 0.5; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_grjxp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_grjxp; +envs.common_factor *= 0.5; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_grjxp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 9}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_grjxp; +envs.common_factor *= 0.5; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_grjxp) +ALL_CINT1E_FORTRAN_(int1e_grjxp) + +void CINTgout1e_int1e_rinv(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype s[1]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 1; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g0[ix+i] * g0[iy+i] * g0[iz+i]; +} +if (gout_empty) { +gout[n*1+0] = + s[0]; +} else { +gout[n*1+0] += + s[0]; +}}} +void int1e_rinv_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 0, 0, 0, 0, 1, 0, 1}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_rinv_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 0, 0, 0, 0, 1, 0, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rinv; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 1); +} +CACHE_SIZE_T int1e_rinv_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 0, 0, 0, 0, 1, 0, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rinv; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 1); +} +CACHE_SIZE_T int1e_rinv_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 0, 0, 0, 0, 1, 0, 1}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_rinv; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 1); +} +ALL_CINT1E(int1e_rinv) +ALL_CINT1E_FORTRAN_(int1e_rinv) + +void CINTgout1e_int1e_drinv(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +G2E_D_J(g1, g0, envs->i_l+0, envs->j_l+0, 0, 0); +G2E_D_I(g2, g0, envs->i_l+0, envs->j_l+0, 0, 0); +for (ix = 0; ix < envs->g_size * 3; ix++) {g1[ix] += g2[ix];} +dtype s[3]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 3; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g1[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g0[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g0[ix+i] * g0[iy+i] * g1[iz+i]; +} +if (gout_empty) { +gout[n*3+0] = + s[0]; +gout[n*3+1] = + s[1]; +gout[n*3+2] = + s[2]; +} else { +gout[n*3+0] += + s[0]; +gout[n*3+1] += + s[1]; +gout[n*3+2] += + s[2]; +}}} +void int1e_drinv_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 1, 0, 0, 1, 1, 0, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_drinv_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 1, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_drinv; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 1); +} +CACHE_SIZE_T int1e_drinv_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 1, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_drinv; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 1); +} +CACHE_SIZE_T int1e_drinv_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 1, 0, 0, 1, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_drinv; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 1); +} +ALL_CINT1E(int1e_drinv) +ALL_CINT1E_FORTRAN_(int1e_drinv) + + + + +#include +//#include + + +*/void CINTgout1e_int1e_ipovlp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype s[3]; +G1E_D_I(g1, g0, envs->i_l+0, envs->j_l, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]; +if (gout_empty) { +gout[n*3+0] = + s[0]; +gout[n*3+1] = + s[1]; +gout[n*3+2] = + s[2]; +} else { +gout[n*3+0] += + s[0]; +gout[n*3+1] += + s[1]; +gout[n*3+2] += + s[2]; +}}} +/*void int1e_ipovlp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 1, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ipovlp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipovlp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +*/ +CACHE_SIZE_T int1e_ipovlp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { + + WHICH_INTEGRAL = INT1E_OVLP_IP; +FINT ng[] = {1, 0, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_ipovlp; +#else +envs.f_gout = &CINTgout1e_int1e_ipovlp; +#endif +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} /* +CACHE_SIZE_T int1e_ipovlp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipovlp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_ipovlp) +ALL_CINT1E_FORTRAN_(int1e_ipovlp) + +void CINTgout1e_int1e_ovlpip(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype s[3]; +G1E_D_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]; +if (gout_empty) { +gout[n*3+0] = + s[0]; +gout[n*3+1] = + s[1]; +gout[n*3+2] = + s[2]; +} else { +gout[n*3+0] += + s[0]; +gout[n*3+1] += + s[1]; +gout[n*3+2] += + s[2]; +}}} +void int1e_ovlpip_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ovlpip_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ovlpip; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_ovlpip_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ovlpip; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_ovlpip_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 1, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ovlpip; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_ovlpip) +ALL_CINT1E_FORTRAN_(int1e_ovlpip) + +*/ +void CINTgout1e_int1e_ipkin(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype s[27]; +G1E_D_J(g1, g0, envs->i_l+1, envs->j_l+0, 0); +G1E_D_J(g2, g0, envs->i_l+1, envs->j_l+1, 0); +G1E_D_J(g3, g2, envs->i_l+1, envs->j_l+0, 0); +G1E_D_I(g4, g0, envs->i_l+0, envs->j_l, 0); +G1E_D_I(g5, g1, envs->i_l+0, envs->j_l, 0); +G1E_D_I(g6, g2, envs->i_l+0, envs->j_l, 0); +G1E_D_I(g7, g3, envs->i_l+0, envs->j_l, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g7[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g6[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g6[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g5[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g4[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g4[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g5[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g4[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g4[ix+0]*g0[iy+0]*g3[iz+0]; +s[9] = + g3[ix+0]*g4[iy+0]*g0[iz+0]; +s[10] = + g2[ix+0]*g5[iy+0]*g0[iz+0]; +s[11] = + g2[ix+0]*g4[iy+0]*g1[iz+0]; +s[12] = + g1[ix+0]*g6[iy+0]*g0[iz+0]; +s[13] = + g0[ix+0]*g7[iy+0]*g0[iz+0]; +s[14] = + g0[ix+0]*g6[iy+0]*g1[iz+0]; +s[15] = + g1[ix+0]*g4[iy+0]*g2[iz+0]; +s[16] = + g0[ix+0]*g5[iy+0]*g2[iz+0]; +s[17] = + g0[ix+0]*g4[iy+0]*g3[iz+0]; +s[18] = + g3[ix+0]*g0[iy+0]*g4[iz+0]; +s[19] = + g2[ix+0]*g1[iy+0]*g4[iz+0]; +s[20] = + g2[ix+0]*g0[iy+0]*g5[iz+0]; +s[21] = + g1[ix+0]*g2[iy+0]*g4[iz+0]; +s[22] = + g0[ix+0]*g3[iy+0]*g4[iz+0]; +s[23] = + g0[ix+0]*g2[iy+0]*g5[iz+0]; +s[24] = + g1[ix+0]*g0[iy+0]*g6[iz+0]; +s[25] = + g0[ix+0]*g1[iy+0]*g6[iz+0]; +s[26] = + g0[ix+0]*g0[iy+0]*g7[iz+0]; +if (gout_empty) { +gout[n*3+0] = - s[0] - s[4] - s[8]; +gout[n*3+1] = - s[9] - s[13] - s[17]; +gout[n*3+2] = - s[18] - s[22] - s[26]; +} else { +gout[n*3+0] += - s[0] - s[4] - s[8]; +gout[n*3+1] += - s[9] - s[13] - s[17]; +gout[n*3+2] += - s[18] - s[22] - s[26]; +}}} +/* +void int1e_ipkin_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 2, 0, 0, 3, 1, 1, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ipkin_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 3, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipkin; +envs.common_factor *= 0.5; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +*/ +CACHE_SIZE_T int1e_ipkin_sph(dtype *out, FINT *dims, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { + WHICH_INTEGRAL = INT1E_KIN_IP; + FINT ng[] = {1, 2, 0, 0, 3, 1, 1, 3}; + CINTEnvVars envs; + CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); + + #ifdef __cplusplus + envs.f_gout = (void (*)(...))&CINTgout1e_int1e_ipkin; + #else + envs.f_gout = &CINTgout1e_int1e_ipkin; + #endif + envs.common_factor *= 0.5; + return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} /* +CACHE_SIZE_T int1e_ipkin_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 2, 0, 0, 3, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipkin; +envs.common_factor *= 0.5; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_ipkin) +ALL_CINT1E_FORTRAN_(int1e_ipkin) + +void CINTgout1e_int1e_kinip(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT ix, iy, iz, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype s[27]; +G1E_D_J(g1, g0, envs->i_l+0, envs->j_l+0, 0); +G1E_D_J(g2, g0, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g3, g2, envs->i_l+0, envs->j_l+0, 0); +G1E_D_J(g4, g0, envs->i_l+0, envs->j_l+2, 0); +G1E_D_J(g5, g4, envs->i_l+0, envs->j_l+0, 0); +G1E_D_J(g6, g4, envs->i_l+0, envs->j_l+1, 0); +G1E_D_J(g7, g6, envs->i_l+0, envs->j_l+0, 0); +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +s[0] = + g7[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g6[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g6[ix+0]*g0[iy+0]*g1[iz+0]; +s[3] = + g5[ix+0]*g2[iy+0]*g0[iz+0]; +s[4] = + g4[ix+0]*g3[iy+0]*g0[iz+0]; +s[5] = + g4[ix+0]*g2[iy+0]*g1[iz+0]; +s[6] = + g5[ix+0]*g0[iy+0]*g2[iz+0]; +s[7] = + g4[ix+0]*g1[iy+0]*g2[iz+0]; +s[8] = + g4[ix+0]*g0[iy+0]*g3[iz+0]; +s[9] = + g3[ix+0]*g4[iy+0]*g0[iz+0]; +s[10] = + g2[ix+0]*g5[iy+0]*g0[iz+0]; +s[11] = + g2[ix+0]*g4[iy+0]*g1[iz+0]; +s[12] = + g1[ix+0]*g6[iy+0]*g0[iz+0]; +s[13] = + g0[ix+0]*g7[iy+0]*g0[iz+0]; +s[14] = + g0[ix+0]*g6[iy+0]*g1[iz+0]; +s[15] = + g1[ix+0]*g4[iy+0]*g2[iz+0]; +s[16] = + g0[ix+0]*g5[iy+0]*g2[iz+0]; +s[17] = + g0[ix+0]*g4[iy+0]*g3[iz+0]; +s[18] = + g3[ix+0]*g0[iy+0]*g4[iz+0]; +s[19] = + g2[ix+0]*g1[iy+0]*g4[iz+0]; +s[20] = + g2[ix+0]*g0[iy+0]*g5[iz+0]; +s[21] = + g1[ix+0]*g2[iy+0]*g4[iz+0]; +s[22] = + g0[ix+0]*g3[iy+0]*g4[iz+0]; +s[23] = + g0[ix+0]*g2[iy+0]*g5[iz+0]; +s[24] = + g1[ix+0]*g0[iy+0]*g6[iz+0]; +s[25] = + g0[ix+0]*g1[iy+0]*g6[iz+0]; +s[26] = + g0[ix+0]*g0[iy+0]*g7[iz+0]; +if (gout_empty) { +gout[n*3+0] = - s[0] - s[12] - s[24]; +gout[n*3+1] = - s[1] - s[13] - s[25]; +gout[n*3+2] = - s[2] - s[14] - s[26]; +} else { +gout[n*3+0] += - s[0] - s[12] - s[24]; +gout[n*3+1] += - s[1] - s[13] - s[25]; +gout[n*3+2] += - s[2] - s[14] - s[26]; +}}} +void int1e_kinip_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_kinip_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_kinip; +envs.common_factor *= 0.5; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 0); +} +CACHE_SIZE_T int1e_kinip_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_kinip; +envs.common_factor *= 0.5; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 0); +} +CACHE_SIZE_T int1e_kinip_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 3, 0, 0, 3, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_kinip; +envs.common_factor *= 0.5; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 0); +} +ALL_CINT1E(int1e_kinip) +ALL_CINT1E_FORTRAN_(int1e_kinip) + +*/void CINTgout1e_int1e_ipnuc(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +G2E_D_I(g1, g0, envs->i_l+0, envs->j_l, 0, 0); +dtype s[3]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 3; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g1[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g0[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g0[ix+i] * g0[iy+i] * g1[iz+i]; +} +if (gout_empty) { +gout[n*3+0] = + s[0]; +gout[n*3+1] = + s[1]; +gout[n*3+2] = + s[2]; +} else { +gout[n*3+0] += + s[0]; +gout[n*3+1] += + s[1]; +gout[n*3+2] += + s[2]; +}}}/* +void int1e_ipnuc_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 0, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ipnuc_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipnuc; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 2); +} +*/ +CACHE_SIZE_T int1e_ipnuc_sph(dtype *out, FINT *dims, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { + + //printf("int1e_ipnuc_sph\n"); + + //int ish= shls[0]; + //int jsh = shls[1]; + //printf("ish,jsh %d %d", ish, jsh); + //FINT i_prim = bas(NPRIM_OF, ish); + //FINT j_prim = bas(NPRIM_OF, jsh); + //printf("i_primt/j_prim, %d %d\n", i_prim, j_prim); + + WHICH_INTEGRAL = INT1E_NUC_IP; + FINT ng[] = {1, 0, 0, 0, 1, 1, 0, 3}; + CINTEnvVars envs; + CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); + return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 2); +}/* +CACHE_SIZE_T int1e_ipnuc_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipnuc; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 2); +} +ALL_CINT1E(int1e_ipnuc) +ALL_CINT1E_FORTRAN_(int1e_ipnuc) + +*/void CINTgout1e_int1e_iprinv(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +G2E_D_I(g1, g0, envs->i_l+0, envs->j_l, 0, 0); +dtype s[3]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 3; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g1[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g0[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g0[ix+i] * g0[iy+i] * g1[iz+i]; +} +if (gout_empty) { +gout[n*3+0] = + s[0]; +gout[n*3+1] = + s[1]; +gout[n*3+2] = + s[2]; +} else { +gout[n*3+0] += + s[0]; +gout[n*3+1] += + s[1]; +gout[n*3+2] += + s[2]; +}}}/* +void int1e_iprinv_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 0, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_iprinv_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_iprinv; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 1); +} +*/CACHE_SIZE_T int1e_iprinv_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout1e_int1e_iprinv; +#else +envs.f_gout = &CINTgout1e_int1e_iprinv; +#endif +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 1); +}/* +CACHE_SIZE_T int1e_iprinv_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_iprinv; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 1); +} +ALL_CINT1E(int1e_iprinv) +ALL_CINT1E_FORTRAN_(int1e_iprinv) + +void CINTgout1e_int1e_ipspnucsp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +G2E_D_J(g1, g0, envs->i_l+2, envs->j_l+0, 0, 0); +G2E_D_I(g2, g0, envs->i_l+1, envs->j_l, 0, 0); +G2E_D_I(g3, g1, envs->i_l+1, envs->j_l, 0, 0); +G2E_D_I(g4, g0, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g5, g1, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g6, g2, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g7, g3, envs->i_l+0, envs->j_l, 0, 0); +dtype s[27]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 27; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g7[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g6[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g6[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g5[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g4[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g4[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g5[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g4[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g4[ix+i] * g0[iy+i] * g3[iz+i]; +s[9] += g3[ix+i] * g4[iy+i] * g0[iz+i]; +s[10] += g2[ix+i] * g5[iy+i] * g0[iz+i]; +s[11] += g2[ix+i] * g4[iy+i] * g1[iz+i]; +s[12] += g1[ix+i] * g6[iy+i] * g0[iz+i]; +s[13] += g0[ix+i] * g7[iy+i] * g0[iz+i]; +s[14] += g0[ix+i] * g6[iy+i] * g1[iz+i]; +s[15] += g1[ix+i] * g4[iy+i] * g2[iz+i]; +s[16] += g0[ix+i] * g5[iy+i] * g2[iz+i]; +s[17] += g0[ix+i] * g4[iy+i] * g3[iz+i]; +s[18] += g3[ix+i] * g0[iy+i] * g4[iz+i]; +s[19] += g2[ix+i] * g1[iy+i] * g4[iz+i]; +s[20] += g2[ix+i] * g0[iy+i] * g5[iz+i]; +s[21] += g1[ix+i] * g2[iy+i] * g4[iz+i]; +s[22] += g0[ix+i] * g3[iy+i] * g4[iz+i]; +s[23] += g0[ix+i] * g2[iy+i] * g5[iz+i]; +s[24] += g1[ix+i] * g0[iy+i] * g6[iz+i]; +s[25] += g0[ix+i] * g1[iy+i] * g6[iz+i]; +s[26] += g0[ix+i] * g0[iy+i] * g7[iz+i]; +} +if (gout_empty) { +gout[n*12+0] = + s[11] - s[19]; +gout[n*12+1] = + s[18] - s[2]; +gout[n*12+2] = + s[1] - s[9]; +gout[n*12+3] = + s[0] + s[10] + s[20]; +gout[n*12+4] = + s[14] - s[22]; +gout[n*12+5] = + s[21] - s[5]; +gout[n*12+6] = + s[4] - s[12]; +gout[n*12+7] = + s[3] + s[13] + s[23]; +gout[n*12+8] = + s[17] - s[25]; +gout[n*12+9] = + s[24] - s[8]; +gout[n*12+10] = + s[7] - s[15]; +gout[n*12+11] = + s[6] + s[16] + s[26]; +} else { +gout[n*12+0] += + s[11] - s[19]; +gout[n*12+1] += + s[18] - s[2]; +gout[n*12+2] += + s[1] - s[9]; +gout[n*12+3] += + s[0] + s[10] + s[20]; +gout[n*12+4] += + s[14] - s[22]; +gout[n*12+5] += + s[21] - s[5]; +gout[n*12+6] += + s[4] - s[12]; +gout[n*12+7] += + s[3] + s[13] + s[23]; +gout[n*12+8] += + s[17] - s[25]; +gout[n*12+9] += + s[24] - s[8]; +gout[n*12+10] += + s[7] - s[15]; +gout[n*12+11] += + s[6] + s[16] + s[26]; +}}} +void int1e_ipspnucsp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 0, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ipspnucsp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipspnucsp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 2); +} +CACHE_SIZE_T int1e_ipspnucsp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipspnucsp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 2); +} +CACHE_SIZE_T int1e_ipspnucsp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipspnucsp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_si_1e, 2); +} +ALL_CINT1E(int1e_ipspnucsp) +ALL_CINT1E_FORTRAN_(int1e_ipspnucsp) + +void CINTgout1e_int1e_ipsprinvsp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +G2E_D_J(g1, g0, envs->i_l+2, envs->j_l+0, 0, 0); +G2E_D_I(g2, g0, envs->i_l+1, envs->j_l, 0, 0); +G2E_D_I(g3, g1, envs->i_l+1, envs->j_l, 0, 0); +G2E_D_I(g4, g0, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g5, g1, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g6, g2, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g7, g3, envs->i_l+0, envs->j_l, 0, 0); +dtype s[27]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 27; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g7[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g6[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g6[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g5[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g4[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g4[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g5[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g4[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g4[ix+i] * g0[iy+i] * g3[iz+i]; +s[9] += g3[ix+i] * g4[iy+i] * g0[iz+i]; +s[10] += g2[ix+i] * g5[iy+i] * g0[iz+i]; +s[11] += g2[ix+i] * g4[iy+i] * g1[iz+i]; +s[12] += g1[ix+i] * g6[iy+i] * g0[iz+i]; +s[13] += g0[ix+i] * g7[iy+i] * g0[iz+i]; +s[14] += g0[ix+i] * g6[iy+i] * g1[iz+i]; +s[15] += g1[ix+i] * g4[iy+i] * g2[iz+i]; +s[16] += g0[ix+i] * g5[iy+i] * g2[iz+i]; +s[17] += g0[ix+i] * g4[iy+i] * g3[iz+i]; +s[18] += g3[ix+i] * g0[iy+i] * g4[iz+i]; +s[19] += g2[ix+i] * g1[iy+i] * g4[iz+i]; +s[20] += g2[ix+i] * g0[iy+i] * g5[iz+i]; +s[21] += g1[ix+i] * g2[iy+i] * g4[iz+i]; +s[22] += g0[ix+i] * g3[iy+i] * g4[iz+i]; +s[23] += g0[ix+i] * g2[iy+i] * g5[iz+i]; +s[24] += g1[ix+i] * g0[iy+i] * g6[iz+i]; +s[25] += g0[ix+i] * g1[iy+i] * g6[iz+i]; +s[26] += g0[ix+i] * g0[iy+i] * g7[iz+i]; +} +if (gout_empty) { +gout[n*12+0] = + s[11] - s[19]; +gout[n*12+1] = + s[18] - s[2]; +gout[n*12+2] = + s[1] - s[9]; +gout[n*12+3] = + s[0] + s[10] + s[20]; +gout[n*12+4] = + s[14] - s[22]; +gout[n*12+5] = + s[21] - s[5]; +gout[n*12+6] = + s[4] - s[12]; +gout[n*12+7] = + s[3] + s[13] + s[23]; +gout[n*12+8] = + s[17] - s[25]; +gout[n*12+9] = + s[24] - s[8]; +gout[n*12+10] = + s[7] - s[15]; +gout[n*12+11] = + s[6] + s[16] + s[26]; +} else { +gout[n*12+0] += + s[11] - s[19]; +gout[n*12+1] += + s[18] - s[2]; +gout[n*12+2] += + s[1] - s[9]; +gout[n*12+3] += + s[0] + s[10] + s[20]; +gout[n*12+4] += + s[14] - s[22]; +gout[n*12+5] += + s[21] - s[5]; +gout[n*12+6] += + s[4] - s[12]; +gout[n*12+7] += + s[3] + s[13] + s[23]; +gout[n*12+8] += + s[17] - s[25]; +gout[n*12+9] += + s[24] - s[8]; +gout[n*12+10] += + s[7] - s[15]; +gout[n*12+11] += + s[6] + s[16] + s[26]; +}}} +void int1e_ipsprinvsp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 0, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ipsprinvsp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipsprinvsp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 1); +} +CACHE_SIZE_T int1e_ipsprinvsp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipsprinvsp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 1); +} +CACHE_SIZE_T int1e_ipsprinvsp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipsprinvsp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_si_1e, 1); +} +ALL_CINT1E(int1e_ipsprinvsp) +ALL_CINT1E_FORTRAN_(int1e_ipsprinvsp) + +void CINTgout1e_int1e_ippnucp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +G2E_D_J(g1, g0, envs->i_l+2, envs->j_l+0, 0, 0); +G2E_D_I(g2, g0, envs->i_l+1, envs->j_l, 0, 0); +G2E_D_I(g3, g1, envs->i_l+1, envs->j_l, 0, 0); +G2E_D_I(g4, g0, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g5, g1, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g6, g2, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g7, g3, envs->i_l+0, envs->j_l, 0, 0); +dtype s[27]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 27; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g7[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g6[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g6[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g5[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g4[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g4[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g5[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g4[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g4[ix+i] * g0[iy+i] * g3[iz+i]; +s[9] += g3[ix+i] * g4[iy+i] * g0[iz+i]; +s[10] += g2[ix+i] * g5[iy+i] * g0[iz+i]; +s[11] += g2[ix+i] * g4[iy+i] * g1[iz+i]; +s[12] += g1[ix+i] * g6[iy+i] * g0[iz+i]; +s[13] += g0[ix+i] * g7[iy+i] * g0[iz+i]; +s[14] += g0[ix+i] * g6[iy+i] * g1[iz+i]; +s[15] += g1[ix+i] * g4[iy+i] * g2[iz+i]; +s[16] += g0[ix+i] * g5[iy+i] * g2[iz+i]; +s[17] += g0[ix+i] * g4[iy+i] * g3[iz+i]; +s[18] += g3[ix+i] * g0[iy+i] * g4[iz+i]; +s[19] += g2[ix+i] * g1[iy+i] * g4[iz+i]; +s[20] += g2[ix+i] * g0[iy+i] * g5[iz+i]; +s[21] += g1[ix+i] * g2[iy+i] * g4[iz+i]; +s[22] += g0[ix+i] * g3[iy+i] * g4[iz+i]; +s[23] += g0[ix+i] * g2[iy+i] * g5[iz+i]; +s[24] += g1[ix+i] * g0[iy+i] * g6[iz+i]; +s[25] += g0[ix+i] * g1[iy+i] * g6[iz+i]; +s[26] += g0[ix+i] * g0[iy+i] * g7[iz+i]; +} +if (gout_empty) { +gout[n*3+0] = + s[0] + s[4] + s[8]; +gout[n*3+1] = + s[9] + s[13] + s[17]; +gout[n*3+2] = + s[18] + s[22] + s[26]; +} else { +gout[n*3+0] += + s[0] + s[4] + s[8]; +gout[n*3+1] += + s[9] + s[13] + s[17]; +gout[n*3+2] += + s[18] + s[22] + s[26]; +}}} +void int1e_ippnucp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {2, 1, 0, 0, 3, 1, 0, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ippnucp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ippnucp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 2); +} +CACHE_SIZE_T int1e_ippnucp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ippnucp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 2); +} +CACHE_SIZE_T int1e_ippnucp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ippnucp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 2); +} +ALL_CINT1E(int1e_ippnucp) +ALL_CINT1E_FORTRAN_(int1e_ippnucp) + +void CINTgout1e_int1e_ipprinvp(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, n, i; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +G2E_D_J(g1, g0, envs->i_l+2, envs->j_l+0, 0, 0); +G2E_D_I(g2, g0, envs->i_l+1, envs->j_l, 0, 0); +G2E_D_I(g3, g1, envs->i_l+1, envs->j_l, 0, 0); +G2E_D_I(g4, g0, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g5, g1, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g6, g2, envs->i_l+0, envs->j_l, 0, 0); +G2E_D_I(g7, g3, envs->i_l+0, envs->j_l, 0, 0); +dtype s[27]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 27; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g7[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g6[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g6[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g5[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g4[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g4[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g5[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g4[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g4[ix+i] * g0[iy+i] * g3[iz+i]; +s[9] += g3[ix+i] * g4[iy+i] * g0[iz+i]; +s[10] += g2[ix+i] * g5[iy+i] * g0[iz+i]; +s[11] += g2[ix+i] * g4[iy+i] * g1[iz+i]; +s[12] += g1[ix+i] * g6[iy+i] * g0[iz+i]; +s[13] += g0[ix+i] * g7[iy+i] * g0[iz+i]; +s[14] += g0[ix+i] * g6[iy+i] * g1[iz+i]; +s[15] += g1[ix+i] * g4[iy+i] * g2[iz+i]; +s[16] += g0[ix+i] * g5[iy+i] * g2[iz+i]; +s[17] += g0[ix+i] * g4[iy+i] * g3[iz+i]; +s[18] += g3[ix+i] * g0[iy+i] * g4[iz+i]; +s[19] += g2[ix+i] * g1[iy+i] * g4[iz+i]; +s[20] += g2[ix+i] * g0[iy+i] * g5[iz+i]; +s[21] += g1[ix+i] * g2[iy+i] * g4[iz+i]; +s[22] += g0[ix+i] * g3[iy+i] * g4[iz+i]; +s[23] += g0[ix+i] * g2[iy+i] * g5[iz+i]; +s[24] += g1[ix+i] * g0[iy+i] * g6[iz+i]; +s[25] += g0[ix+i] * g1[iy+i] * g6[iz+i]; +s[26] += g0[ix+i] * g0[iy+i] * g7[iz+i]; +} +if (gout_empty) { +gout[n*3+0] = + s[0] + s[4] + s[8]; +gout[n*3+1] = + s[9] + s[13] + s[17]; +gout[n*3+2] = + s[18] + s[22] + s[26]; +} else { +gout[n*3+0] += + s[0] + s[4] + s[8]; +gout[n*3+1] += + s[9] + s[13] + s[17]; +gout[n*3+2] += + s[18] + s[22] + s[26]; +}}} +void int1e_ipprinvp_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {2, 1, 0, 0, 3, 1, 0, 3}; +CINTall_1e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int1e_ipprinvp_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipprinvp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_cart_1e, 1); +} +CACHE_SIZE_T int1e_ipprinvp_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipprinvp; +return CINT1e_drv(out, dims, &envs, cache, &c2s_sph_1e, 1); +} +CACHE_SIZE_T int1e_ipprinvp_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 1, 0, 3}; +CINTEnvVars envs; +CINTinit_int1e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout1e_int1e_ipprinvp; +return CINT1e_spinor_drv(out, dims, &envs, cache, &c2s_sf_1e, 1); +} */ +ALL_CINT1E(int1e_ipprinvp) +ALL_CINT1E_FORTRAN_(int1e_ipprinvp) + + + + +#include +//#include + + +void CINTgout2e_int2e_ip1(dtype *gout, + dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { + //printf("inside cintgout2e_int2e_ip1\n"); + FINT nf = envs->nf; + //printf("nf %d\n", nf); + FINT nrys_roots = envs->nrys_roots; + FINT ix, iy, iz, i, n; + dtype *g0 = g; + dtype *g1 = g0 + envs->g_size * 3; + G2E_D_I(g1, g0, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); + dtype s[3]; + //printf("before for loop;\n"); + for (n = 0; n < nf; n++) { + //printf("for loop: %d / %d root=%d\n", n, nf, nrys_roots); + ix = idx[0+n*3]; + iy = idx[1+n*3]; + iz = idx[2+n*3]; + //printf("before switch\n"); + switch (nrys_roots) { + case 1: + //printf("case 1\n"); + s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]; + s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]; + s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]; + break; + case 2: + //printf("case 2\n"); + s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]+ g1[ix+1]*g0[iy+1]*g0[iz+1]; + s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]+ g0[ix+1]*g1[iy+1]*g0[iz+1]; + s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]+ g0[ix+1]*g0[iy+1]*g1[iz+1]; + break; + case 3: + //printf("case 3\n"); + s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]+ g1[ix+1]*g0[iy+1]*g0[iz+1]+ g1[ix+2]*g0[iy+2]*g0[iz+2]; + s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]+ g0[ix+1]*g1[iy+1]*g0[iz+1]+ g0[ix+2]*g1[iy+2]*g0[iz+2]; + s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]+ g0[ix+1]*g0[iy+1]*g1[iz+1]+ g0[ix+2]*g0[iy+2]*g1[iz+2]; + break; + case 4: + //printf("case 4\n"); + s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]+ g1[ix+1]*g0[iy+1]*g0[iz+1]+ g1[ix+2]*g0[iy+2]*g0[iz+2]+ g1[ix+3]*g0[iy+3]*g0[iz+3]; + s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]+ g0[ix+1]*g1[iy+1]*g0[iz+1]+ g0[ix+2]*g1[iy+2]*g0[iz+2]+ g0[ix+3]*g1[iy+3]*g0[iz+3]; + s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]+ g0[ix+1]*g0[iy+1]*g1[iz+1]+ g0[ix+2]*g0[iy+2]*g1[iz+2]+ g0[ix+3]*g0[iy+3]*g1[iz+3]; + break; + default: + //printf("case default \n"); + for (i = 0; i < 3; i++) { s[i] = 0; } + for (i = 0; i < nrys_roots; i++) { + s[0] += g1[ix+i] * g0[iy+i] * g0[iz+i]; + s[1] += g0[ix+i] * g1[iy+i] * g0[iz+i]; + s[2] += g0[ix+i] * g0[iy+i] * g1[iz+i]; + } + break; + } + //printf("after switching \n"); + if (gout_empty) { + gout[n*3+0] = + s[0]; + gout[n*3+1] = + s[1]; + gout[n*3+2] = + s[2]; + } + else { + gout[n*3+0] += + s[0]; + gout[n*3+1] += + s[1]; + gout[n*3+2] += + s[2]; + } + //printf("first for loop over\n"); + } + //printf("done. \n"); +} +void int2e_ip1_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 1, 3}; +CINTall_2e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int2e_ip1_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout2e_int2e_ip1; +#else +envs.f_gout = &CINTgout2e_int2e_ip1; +#endif +return CINT2e_drv(out, dims, &envs, opt, cache);//, &c2s_cart_2e1); +} +CACHE_SIZE_T int2e_ip1_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { + FINT ng[] = {1, 0, 0, 0, 1, 1, 1, 3}; + WHICH_INTEGRAL = INT2E_IP1_SPH; + CINTEnvVars envs; + CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); + /*#ifdef __cplusplus + envs.f_gout = (void (*)(...))&CINTgout2e_int2e_ip1; + #else + envs.f_gout = &CINTgout2e_int2e_ip1; + #endif*/ + return CINT2e_drv(out, dims, &envs, opt, cache);//, &c2s_sph_2e1); +} +/*CACHE_SIZE_T int2e_ip1_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 0, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +#ifdef __cplusplus +envs.f_gout = (void (*)(...))&CINTgout2e_int2e_ip1; +#else +envs.f_gout = &CINTgout2e_int2e_ip1; +#endif +return CINT2e_spinor_drv(out, dims, &envs, opt, cache, &c2s_sf_2e1, &c2s_sf_2e2); +}*/ +ALL_CINT(int2e_ip1) +ALL_CINT_FORTRAN_(int2e_ip1) + +void CINTgout2e_int2e_ip2(dtype *gout, +dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, i, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +G2E_D_K(g1, g0, envs->i_l+0, envs->j_l+0, envs->k_l+0, envs->l_l); +dtype s[3]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +switch (nrys_roots) { +case 1: +s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]; +s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]; +s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]; +break; +case 2: +s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]+ g1[ix+1]*g0[iy+1]*g0[iz+1]; +s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]+ g0[ix+1]*g1[iy+1]*g0[iz+1]; +s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]+ g0[ix+1]*g0[iy+1]*g1[iz+1]; +break; +case 3: +s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]+ g1[ix+1]*g0[iy+1]*g0[iz+1]+ g1[ix+2]*g0[iy+2]*g0[iz+2]; +s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]+ g0[ix+1]*g1[iy+1]*g0[iz+1]+ g0[ix+2]*g1[iy+2]*g0[iz+2]; +s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]+ g0[ix+1]*g0[iy+1]*g1[iz+1]+ g0[ix+2]*g0[iy+2]*g1[iz+2]; +break; +case 4: +s[0] = + g1[ix+0]*g0[iy+0]*g0[iz+0]+ g1[ix+1]*g0[iy+1]*g0[iz+1]+ g1[ix+2]*g0[iy+2]*g0[iz+2]+ g1[ix+3]*g0[iy+3]*g0[iz+3]; +s[1] = + g0[ix+0]*g1[iy+0]*g0[iz+0]+ g0[ix+1]*g1[iy+1]*g0[iz+1]+ g0[ix+2]*g1[iy+2]*g0[iz+2]+ g0[ix+3]*g1[iy+3]*g0[iz+3]; +s[2] = + g0[ix+0]*g0[iy+0]*g1[iz+0]+ g0[ix+1]*g0[iy+1]*g1[iz+1]+ g0[ix+2]*g0[iy+2]*g1[iz+2]+ g0[ix+3]*g0[iy+3]*g1[iz+3]; +break; +default: +for (i = 0; i < 3; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g1[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g0[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g0[ix+i] * g0[iy+i] * g1[iz+i]; +} break;} +if (gout_empty) { +gout[n*3+0] = + s[0]; +gout[n*3+1] = + s[1]; +gout[n*3+2] = + s[2]; +} else { +gout[n*3+0] += + s[0]; +gout[n*3+1] += + s[1]; +gout[n*3+2] += + s[2]; +}}} +void int2e_ip2_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {0, 0, 1, 0, 1, 1, 1, 3}; +CINTall_2e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +/*CACHE_SIZE_T int2e_ip2_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 0, 1, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ip2; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_cart_2e1); +} +CACHE_SIZE_T int2e_ip2_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 0, 1, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ip2; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_sph_2e1); +} +CACHE_SIZE_T int2e_ip2_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {0, 0, 1, 0, 1, 1, 1, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ip2; +return CINT2e_spinor_drv(out, dims, &envs, opt, cache, &c2s_sf_2e1, &c2s_sf_2e2); +} +ALL_CINT(int2e_ip2) +ALL_CINT_FORTRAN_(int2e_ip2) + +void CINTgout2e_int2e_ipspsp1(dtype *gout, +dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, i, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +G2E_D_J(g1, g0, envs->i_l+2, envs->j_l+0, envs->k_l, envs->l_l); +G2E_D_I(g2, g0, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g3, g1, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g4, g0, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g5, g1, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g6, g2, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g7, g3, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +dtype s[27]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 27; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g7[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g6[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g6[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g5[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g4[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g4[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g5[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g4[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g4[ix+i] * g0[iy+i] * g3[iz+i]; +s[9] += g3[ix+i] * g4[iy+i] * g0[iz+i]; +s[10] += g2[ix+i] * g5[iy+i] * g0[iz+i]; +s[11] += g2[ix+i] * g4[iy+i] * g1[iz+i]; +s[12] += g1[ix+i] * g6[iy+i] * g0[iz+i]; +s[13] += g0[ix+i] * g7[iy+i] * g0[iz+i]; +s[14] += g0[ix+i] * g6[iy+i] * g1[iz+i]; +s[15] += g1[ix+i] * g4[iy+i] * g2[iz+i]; +s[16] += g0[ix+i] * g5[iy+i] * g2[iz+i]; +s[17] += g0[ix+i] * g4[iy+i] * g3[iz+i]; +s[18] += g3[ix+i] * g0[iy+i] * g4[iz+i]; +s[19] += g2[ix+i] * g1[iy+i] * g4[iz+i]; +s[20] += g2[ix+i] * g0[iy+i] * g5[iz+i]; +s[21] += g1[ix+i] * g2[iy+i] * g4[iz+i]; +s[22] += g0[ix+i] * g3[iy+i] * g4[iz+i]; +s[23] += g0[ix+i] * g2[iy+i] * g5[iz+i]; +s[24] += g1[ix+i] * g0[iy+i] * g6[iz+i]; +s[25] += g0[ix+i] * g1[iy+i] * g6[iz+i]; +s[26] += g0[ix+i] * g0[iy+i] * g7[iz+i]; +} +if (gout_empty) { +gout[n*12+0] = + s[11] - s[19]; +gout[n*12+1] = + s[18] - s[2]; +gout[n*12+2] = + s[1] - s[9]; +gout[n*12+3] = + s[0] + s[10] + s[20]; +gout[n*12+4] = + s[14] - s[22]; +gout[n*12+5] = + s[21] - s[5]; +gout[n*12+6] = + s[4] - s[12]; +gout[n*12+7] = + s[3] + s[13] + s[23]; +gout[n*12+8] = + s[17] - s[25]; +gout[n*12+9] = + s[24] - s[8]; +gout[n*12+10] = + s[7] - s[15]; +gout[n*12+11] = + s[6] + s[16] + s[26]; +} else { +gout[n*12+0] += + s[11] - s[19]; +gout[n*12+1] += + s[18] - s[2]; +gout[n*12+2] += + s[1] - s[9]; +gout[n*12+3] += + s[0] + s[10] + s[20]; +gout[n*12+4] += + s[14] - s[22]; +gout[n*12+5] += + s[21] - s[5]; +gout[n*12+6] += + s[4] - s[12]; +gout[n*12+7] += + s[3] + s[13] + s[23]; +gout[n*12+8] += + s[17] - s[25]; +gout[n*12+9] += + s[24] - s[8]; +gout[n*12+10] += + s[7] - s[15]; +gout[n*12+11] += + s[6] + s[16] + s[26]; +}}} +void int2e_ipspsp1_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 1, 3}; +CINTall_2e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int2e_ipspsp1_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 1, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ipspsp1; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_cart_2e1); +} +CACHE_SIZE_T int2e_ipspsp1_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 1, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ipspsp1; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_sph_2e1); +} +CACHE_SIZE_T int2e_ipspsp1_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 1, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ipspsp1; +return CINT2e_spinor_drv(out, dims, &envs, opt, cache, &c2s_si_2e1, &c2s_sf_2e2); +} +ALL_CINT(int2e_ipspsp1) +ALL_CINT_FORTRAN_(int2e_ipspsp1) + +void CINTgout2e_int2e_ip1spsp2(dtype *gout, +dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, i, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +G2E_D_L(g1, g0, envs->i_l+1, envs->j_l+0, envs->k_l+1, envs->l_l+0); +G2E_D_K(g2, g0, envs->i_l+1, envs->j_l+0, envs->k_l+0, envs->l_l); +G2E_D_K(g3, g1, envs->i_l+1, envs->j_l+0, envs->k_l+0, envs->l_l); +G2E_D_I(g4, g0, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g5, g1, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g6, g2, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g7, g3, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +dtype s[27]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 27; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g7[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g6[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g6[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g5[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g4[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g4[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g5[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g4[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g4[ix+i] * g0[iy+i] * g3[iz+i]; +s[9] += g3[ix+i] * g4[iy+i] * g0[iz+i]; +s[10] += g2[ix+i] * g5[iy+i] * g0[iz+i]; +s[11] += g2[ix+i] * g4[iy+i] * g1[iz+i]; +s[12] += g1[ix+i] * g6[iy+i] * g0[iz+i]; +s[13] += g0[ix+i] * g7[iy+i] * g0[iz+i]; +s[14] += g0[ix+i] * g6[iy+i] * g1[iz+i]; +s[15] += g1[ix+i] * g4[iy+i] * g2[iz+i]; +s[16] += g0[ix+i] * g5[iy+i] * g2[iz+i]; +s[17] += g0[ix+i] * g4[iy+i] * g3[iz+i]; +s[18] += g3[ix+i] * g0[iy+i] * g4[iz+i]; +s[19] += g2[ix+i] * g1[iy+i] * g4[iz+i]; +s[20] += g2[ix+i] * g0[iy+i] * g5[iz+i]; +s[21] += g1[ix+i] * g2[iy+i] * g4[iz+i]; +s[22] += g0[ix+i] * g3[iy+i] * g4[iz+i]; +s[23] += g0[ix+i] * g2[iy+i] * g5[iz+i]; +s[24] += g1[ix+i] * g0[iy+i] * g6[iz+i]; +s[25] += g0[ix+i] * g1[iy+i] * g6[iz+i]; +s[26] += g0[ix+i] * g0[iy+i] * g7[iz+i]; +} +if (gout_empty) { +gout[n*12+0] = + s[5] - s[7]; +gout[n*12+1] = + s[6] - s[2]; +gout[n*12+2] = + s[1] - s[3]; +gout[n*12+3] = + s[0] + s[4] + s[8]; +gout[n*12+4] = + s[14] - s[16]; +gout[n*12+5] = + s[15] - s[11]; +gout[n*12+6] = + s[10] - s[12]; +gout[n*12+7] = + s[9] + s[13] + s[17]; +gout[n*12+8] = + s[23] - s[25]; +gout[n*12+9] = + s[24] - s[20]; +gout[n*12+10] = + s[19] - s[21]; +gout[n*12+11] = + s[18] + s[22] + s[26]; +} else { +gout[n*12+0] += + s[5] - s[7]; +gout[n*12+1] += + s[6] - s[2]; +gout[n*12+2] += + s[1] - s[3]; +gout[n*12+3] += + s[0] + s[4] + s[8]; +gout[n*12+4] += + s[14] - s[16]; +gout[n*12+5] += + s[15] - s[11]; +gout[n*12+6] += + s[10] - s[12]; +gout[n*12+7] += + s[9] + s[13] + s[17]; +gout[n*12+8] += + s[23] - s[25]; +gout[n*12+9] += + s[24] - s[20]; +gout[n*12+10] += + s[19] - s[21]; +gout[n*12+11] += + s[18] + s[22] + s[26]; +}}} +void int2e_ip1spsp2_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 0, 1, 1, 3, 1, 4, 3}; +CINTall_2e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int2e_ip1spsp2_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 1, 1, 3, 1, 4, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ip1spsp2; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_cart_2e1); +} +CACHE_SIZE_T int2e_ip1spsp2_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 1, 1, 3, 1, 4, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ip1spsp2; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_sph_2e1); +} +CACHE_SIZE_T int2e_ip1spsp2_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 1, 1, 3, 1, 4, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ip1spsp2; +return CINT2e_spinor_drv(out, dims, &envs, opt, cache, &c2s_sf_2e1, &c2s_si_2e2); +} +ALL_CINT(int2e_ip1spsp2) +ALL_CINT_FORTRAN_(int2e_ip1spsp2) + +void CINTgout2e_int2e_ipspsp1spsp2(dtype *gout, +dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, i, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype *g8 = g7 + envs->g_size * 3; +dtype *g9 = g8 + envs->g_size * 3; +dtype *g10 = g9 + envs->g_size * 3; +dtype *g11 = g10 + envs->g_size * 3; +dtype *g12 = g11 + envs->g_size * 3; +dtype *g13 = g12 + envs->g_size * 3; +dtype *g14 = g13 + envs->g_size * 3; +dtype *g15 = g14 + envs->g_size * 3; +dtype *g16 = g15 + envs->g_size * 3; +dtype *g17 = g16 + envs->g_size * 3; +dtype *g18 = g17 + envs->g_size * 3; +dtype *g19 = g18 + envs->g_size * 3; +dtype *g20 = g19 + envs->g_size * 3; +dtype *g21 = g20 + envs->g_size * 3; +dtype *g22 = g21 + envs->g_size * 3; +dtype *g23 = g22 + envs->g_size * 3; +dtype *g24 = g23 + envs->g_size * 3; +dtype *g25 = g24 + envs->g_size * 3; +dtype *g26 = g25 + envs->g_size * 3; +dtype *g27 = g26 + envs->g_size * 3; +dtype *g28 = g27 + envs->g_size * 3; +dtype *g29 = g28 + envs->g_size * 3; +dtype *g30 = g29 + envs->g_size * 3; +dtype *g31 = g30 + envs->g_size * 3; +G2E_D_L(g1, g0, envs->i_l+2, envs->j_l+1, envs->k_l+1, envs->l_l+0); +G2E_D_K(g2, g0, envs->i_l+2, envs->j_l+1, envs->k_l+0, envs->l_l); +G2E_D_K(g3, g1, envs->i_l+2, envs->j_l+1, envs->k_l+0, envs->l_l); +G2E_D_J(g4, g0, envs->i_l+2, envs->j_l+0, envs->k_l, envs->l_l); +G2E_D_J(g5, g1, envs->i_l+2, envs->j_l+0, envs->k_l, envs->l_l); +G2E_D_J(g6, g2, envs->i_l+2, envs->j_l+0, envs->k_l, envs->l_l); +G2E_D_J(g7, g3, envs->i_l+2, envs->j_l+0, envs->k_l, envs->l_l); +G2E_D_I(g8, g0, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g9, g1, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g10, g2, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g11, g3, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g12, g4, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g13, g5, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g14, g6, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g15, g7, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g16, g0, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g17, g1, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g18, g2, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g19, g3, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g20, g4, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g21, g5, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g22, g6, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g23, g7, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g24, g8, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g25, g9, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g26, g10, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g27, g11, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g28, g12, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g29, g13, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g30, g14, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g31, g15, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +dtype s[243]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 243; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g31[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g30[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g30[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g29[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g28[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g28[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g29[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g28[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g28[ix+i] * g0[iy+i] * g3[iz+i]; +s[9] += g27[ix+i] * g4[iy+i] * g0[iz+i]; +s[10] += g26[ix+i] * g5[iy+i] * g0[iz+i]; +s[11] += g26[ix+i] * g4[iy+i] * g1[iz+i]; +s[12] += g25[ix+i] * g6[iy+i] * g0[iz+i]; +s[13] += g24[ix+i] * g7[iy+i] * g0[iz+i]; +s[14] += g24[ix+i] * g6[iy+i] * g1[iz+i]; +s[15] += g25[ix+i] * g4[iy+i] * g2[iz+i]; +s[16] += g24[ix+i] * g5[iy+i] * g2[iz+i]; +s[17] += g24[ix+i] * g4[iy+i] * g3[iz+i]; +s[18] += g27[ix+i] * g0[iy+i] * g4[iz+i]; +s[19] += g26[ix+i] * g1[iy+i] * g4[iz+i]; +s[20] += g26[ix+i] * g0[iy+i] * g5[iz+i]; +s[21] += g25[ix+i] * g2[iy+i] * g4[iz+i]; +s[22] += g24[ix+i] * g3[iy+i] * g4[iz+i]; +s[23] += g24[ix+i] * g2[iy+i] * g5[iz+i]; +s[24] += g25[ix+i] * g0[iy+i] * g6[iz+i]; +s[25] += g24[ix+i] * g1[iy+i] * g6[iz+i]; +s[26] += g24[ix+i] * g0[iy+i] * g7[iz+i]; +s[27] += g23[ix+i] * g8[iy+i] * g0[iz+i]; +s[28] += g22[ix+i] * g9[iy+i] * g0[iz+i]; +s[29] += g22[ix+i] * g8[iy+i] * g1[iz+i]; +s[30] += g21[ix+i] * g10[iy+i] * g0[iz+i]; +s[31] += g20[ix+i] * g11[iy+i] * g0[iz+i]; +s[32] += g20[ix+i] * g10[iy+i] * g1[iz+i]; +s[33] += g21[ix+i] * g8[iy+i] * g2[iz+i]; +s[34] += g20[ix+i] * g9[iy+i] * g2[iz+i]; +s[35] += g20[ix+i] * g8[iy+i] * g3[iz+i]; +s[36] += g19[ix+i] * g12[iy+i] * g0[iz+i]; +s[37] += g18[ix+i] * g13[iy+i] * g0[iz+i]; +s[38] += g18[ix+i] * g12[iy+i] * g1[iz+i]; +s[39] += g17[ix+i] * g14[iy+i] * g0[iz+i]; +s[40] += g16[ix+i] * g15[iy+i] * g0[iz+i]; +s[41] += g16[ix+i] * g14[iy+i] * g1[iz+i]; +s[42] += g17[ix+i] * g12[iy+i] * g2[iz+i]; +s[43] += g16[ix+i] * g13[iy+i] * g2[iz+i]; +s[44] += g16[ix+i] * g12[iy+i] * g3[iz+i]; +s[45] += g19[ix+i] * g8[iy+i] * g4[iz+i]; +s[46] += g18[ix+i] * g9[iy+i] * g4[iz+i]; +s[47] += g18[ix+i] * g8[iy+i] * g5[iz+i]; +s[48] += g17[ix+i] * g10[iy+i] * g4[iz+i]; +s[49] += g16[ix+i] * g11[iy+i] * g4[iz+i]; +s[50] += g16[ix+i] * g10[iy+i] * g5[iz+i]; +s[51] += g17[ix+i] * g8[iy+i] * g6[iz+i]; +s[52] += g16[ix+i] * g9[iy+i] * g6[iz+i]; +s[53] += g16[ix+i] * g8[iy+i] * g7[iz+i]; +s[54] += g23[ix+i] * g0[iy+i] * g8[iz+i]; +s[55] += g22[ix+i] * g1[iy+i] * g8[iz+i]; +s[56] += g22[ix+i] * g0[iy+i] * g9[iz+i]; +s[57] += g21[ix+i] * g2[iy+i] * g8[iz+i]; +s[58] += g20[ix+i] * g3[iy+i] * g8[iz+i]; +s[59] += g20[ix+i] * g2[iy+i] * g9[iz+i]; +s[60] += g21[ix+i] * g0[iy+i] * g10[iz+i]; +s[61] += g20[ix+i] * g1[iy+i] * g10[iz+i]; +s[62] += g20[ix+i] * g0[iy+i] * g11[iz+i]; +s[63] += g19[ix+i] * g4[iy+i] * g8[iz+i]; +s[64] += g18[ix+i] * g5[iy+i] * g8[iz+i]; +s[65] += g18[ix+i] * g4[iy+i] * g9[iz+i]; +s[66] += g17[ix+i] * g6[iy+i] * g8[iz+i]; +s[67] += g16[ix+i] * g7[iy+i] * g8[iz+i]; +s[68] += g16[ix+i] * g6[iy+i] * g9[iz+i]; +s[69] += g17[ix+i] * g4[iy+i] * g10[iz+i]; +s[70] += g16[ix+i] * g5[iy+i] * g10[iz+i]; +s[71] += g16[ix+i] * g4[iy+i] * g11[iz+i]; +s[72] += g19[ix+i] * g0[iy+i] * g12[iz+i]; +s[73] += g18[ix+i] * g1[iy+i] * g12[iz+i]; +s[74] += g18[ix+i] * g0[iy+i] * g13[iz+i]; +s[75] += g17[ix+i] * g2[iy+i] * g12[iz+i]; +s[76] += g16[ix+i] * g3[iy+i] * g12[iz+i]; +s[77] += g16[ix+i] * g2[iy+i] * g13[iz+i]; +s[78] += g17[ix+i] * g0[iy+i] * g14[iz+i]; +s[79] += g16[ix+i] * g1[iy+i] * g14[iz+i]; +s[80] += g16[ix+i] * g0[iy+i] * g15[iz+i]; +s[81] += g15[ix+i] * g16[iy+i] * g0[iz+i]; +s[82] += g14[ix+i] * g17[iy+i] * g0[iz+i]; +s[83] += g14[ix+i] * g16[iy+i] * g1[iz+i]; +s[84] += g13[ix+i] * g18[iy+i] * g0[iz+i]; +s[85] += g12[ix+i] * g19[iy+i] * g0[iz+i]; +s[86] += g12[ix+i] * g18[iy+i] * g1[iz+i]; +s[87] += g13[ix+i] * g16[iy+i] * g2[iz+i]; +s[88] += g12[ix+i] * g17[iy+i] * g2[iz+i]; +s[89] += g12[ix+i] * g16[iy+i] * g3[iz+i]; +s[90] += g11[ix+i] * g20[iy+i] * g0[iz+i]; +s[91] += g10[ix+i] * g21[iy+i] * g0[iz+i]; +s[92] += g10[ix+i] * g20[iy+i] * g1[iz+i]; +s[93] += g9[ix+i] * g22[iy+i] * g0[iz+i]; +s[94] += g8[ix+i] * g23[iy+i] * g0[iz+i]; +s[95] += g8[ix+i] * g22[iy+i] * g1[iz+i]; +s[96] += g9[ix+i] * g20[iy+i] * g2[iz+i]; +s[97] += g8[ix+i] * g21[iy+i] * g2[iz+i]; +s[98] += g8[ix+i] * g20[iy+i] * g3[iz+i]; +s[99] += g11[ix+i] * g16[iy+i] * g4[iz+i]; +s[100] += g10[ix+i] * g17[iy+i] * g4[iz+i]; +s[101] += g10[ix+i] * g16[iy+i] * g5[iz+i]; +s[102] += g9[ix+i] * g18[iy+i] * g4[iz+i]; +s[103] += g8[ix+i] * g19[iy+i] * g4[iz+i]; +s[104] += g8[ix+i] * g18[iy+i] * g5[iz+i]; +s[105] += g9[ix+i] * g16[iy+i] * g6[iz+i]; +s[106] += g8[ix+i] * g17[iy+i] * g6[iz+i]; +s[107] += g8[ix+i] * g16[iy+i] * g7[iz+i]; +s[108] += g7[ix+i] * g24[iy+i] * g0[iz+i]; +s[109] += g6[ix+i] * g25[iy+i] * g0[iz+i]; +s[110] += g6[ix+i] * g24[iy+i] * g1[iz+i]; +s[111] += g5[ix+i] * g26[iy+i] * g0[iz+i]; +s[112] += g4[ix+i] * g27[iy+i] * g0[iz+i]; +s[113] += g4[ix+i] * g26[iy+i] * g1[iz+i]; +s[114] += g5[ix+i] * g24[iy+i] * g2[iz+i]; +s[115] += g4[ix+i] * g25[iy+i] * g2[iz+i]; +s[116] += g4[ix+i] * g24[iy+i] * g3[iz+i]; +s[117] += g3[ix+i] * g28[iy+i] * g0[iz+i]; +s[118] += g2[ix+i] * g29[iy+i] * g0[iz+i]; +s[119] += g2[ix+i] * g28[iy+i] * g1[iz+i]; +s[120] += g1[ix+i] * g30[iy+i] * g0[iz+i]; +s[121] += g0[ix+i] * g31[iy+i] * g0[iz+i]; +s[122] += g0[ix+i] * g30[iy+i] * g1[iz+i]; +s[123] += g1[ix+i] * g28[iy+i] * g2[iz+i]; +s[124] += g0[ix+i] * g29[iy+i] * g2[iz+i]; +s[125] += g0[ix+i] * g28[iy+i] * g3[iz+i]; +s[126] += g3[ix+i] * g24[iy+i] * g4[iz+i]; +s[127] += g2[ix+i] * g25[iy+i] * g4[iz+i]; +s[128] += g2[ix+i] * g24[iy+i] * g5[iz+i]; +s[129] += g1[ix+i] * g26[iy+i] * g4[iz+i]; +s[130] += g0[ix+i] * g27[iy+i] * g4[iz+i]; +s[131] += g0[ix+i] * g26[iy+i] * g5[iz+i]; +s[132] += g1[ix+i] * g24[iy+i] * g6[iz+i]; +s[133] += g0[ix+i] * g25[iy+i] * g6[iz+i]; +s[134] += g0[ix+i] * g24[iy+i] * g7[iz+i]; +s[135] += g7[ix+i] * g16[iy+i] * g8[iz+i]; +s[136] += g6[ix+i] * g17[iy+i] * g8[iz+i]; +s[137] += g6[ix+i] * g16[iy+i] * g9[iz+i]; +s[138] += g5[ix+i] * g18[iy+i] * g8[iz+i]; +s[139] += g4[ix+i] * g19[iy+i] * g8[iz+i]; +s[140] += g4[ix+i] * g18[iy+i] * g9[iz+i]; +s[141] += g5[ix+i] * g16[iy+i] * g10[iz+i]; +s[142] += g4[ix+i] * g17[iy+i] * g10[iz+i]; +s[143] += g4[ix+i] * g16[iy+i] * g11[iz+i]; +s[144] += g3[ix+i] * g20[iy+i] * g8[iz+i]; +s[145] += g2[ix+i] * g21[iy+i] * g8[iz+i]; +s[146] += g2[ix+i] * g20[iy+i] * g9[iz+i]; +s[147] += g1[ix+i] * g22[iy+i] * g8[iz+i]; +s[148] += g0[ix+i] * g23[iy+i] * g8[iz+i]; +s[149] += g0[ix+i] * g22[iy+i] * g9[iz+i]; +s[150] += g1[ix+i] * g20[iy+i] * g10[iz+i]; +s[151] += g0[ix+i] * g21[iy+i] * g10[iz+i]; +s[152] += g0[ix+i] * g20[iy+i] * g11[iz+i]; +s[153] += g3[ix+i] * g16[iy+i] * g12[iz+i]; +s[154] += g2[ix+i] * g17[iy+i] * g12[iz+i]; +s[155] += g2[ix+i] * g16[iy+i] * g13[iz+i]; +s[156] += g1[ix+i] * g18[iy+i] * g12[iz+i]; +s[157] += g0[ix+i] * g19[iy+i] * g12[iz+i]; +s[158] += g0[ix+i] * g18[iy+i] * g13[iz+i]; +s[159] += g1[ix+i] * g16[iy+i] * g14[iz+i]; +s[160] += g0[ix+i] * g17[iy+i] * g14[iz+i]; +s[161] += g0[ix+i] * g16[iy+i] * g15[iz+i]; +s[162] += g15[ix+i] * g0[iy+i] * g16[iz+i]; +s[163] += g14[ix+i] * g1[iy+i] * g16[iz+i]; +s[164] += g14[ix+i] * g0[iy+i] * g17[iz+i]; +s[165] += g13[ix+i] * g2[iy+i] * g16[iz+i]; +s[166] += g12[ix+i] * g3[iy+i] * g16[iz+i]; +s[167] += g12[ix+i] * g2[iy+i] * g17[iz+i]; +s[168] += g13[ix+i] * g0[iy+i] * g18[iz+i]; +s[169] += g12[ix+i] * g1[iy+i] * g18[iz+i]; +s[170] += g12[ix+i] * g0[iy+i] * g19[iz+i]; +s[171] += g11[ix+i] * g4[iy+i] * g16[iz+i]; +s[172] += g10[ix+i] * g5[iy+i] * g16[iz+i]; +s[173] += g10[ix+i] * g4[iy+i] * g17[iz+i]; +s[174] += g9[ix+i] * g6[iy+i] * g16[iz+i]; +s[175] += g8[ix+i] * g7[iy+i] * g16[iz+i]; +s[176] += g8[ix+i] * g6[iy+i] * g17[iz+i]; +s[177] += g9[ix+i] * g4[iy+i] * g18[iz+i]; +s[178] += g8[ix+i] * g5[iy+i] * g18[iz+i]; +s[179] += g8[ix+i] * g4[iy+i] * g19[iz+i]; +s[180] += g11[ix+i] * g0[iy+i] * g20[iz+i]; +s[181] += g10[ix+i] * g1[iy+i] * g20[iz+i]; +s[182] += g10[ix+i] * g0[iy+i] * g21[iz+i]; +s[183] += g9[ix+i] * g2[iy+i] * g20[iz+i]; +s[184] += g8[ix+i] * g3[iy+i] * g20[iz+i]; +s[185] += g8[ix+i] * g2[iy+i] * g21[iz+i]; +s[186] += g9[ix+i] * g0[iy+i] * g22[iz+i]; +s[187] += g8[ix+i] * g1[iy+i] * g22[iz+i]; +s[188] += g8[ix+i] * g0[iy+i] * g23[iz+i]; +s[189] += g7[ix+i] * g8[iy+i] * g16[iz+i]; +s[190] += g6[ix+i] * g9[iy+i] * g16[iz+i]; +s[191] += g6[ix+i] * g8[iy+i] * g17[iz+i]; +s[192] += g5[ix+i] * g10[iy+i] * g16[iz+i]; +s[193] += g4[ix+i] * g11[iy+i] * g16[iz+i]; +s[194] += g4[ix+i] * g10[iy+i] * g17[iz+i]; +s[195] += g5[ix+i] * g8[iy+i] * g18[iz+i]; +s[196] += g4[ix+i] * g9[iy+i] * g18[iz+i]; +s[197] += g4[ix+i] * g8[iy+i] * g19[iz+i]; +s[198] += g3[ix+i] * g12[iy+i] * g16[iz+i]; +s[199] += g2[ix+i] * g13[iy+i] * g16[iz+i]; +s[200] += g2[ix+i] * g12[iy+i] * g17[iz+i]; +s[201] += g1[ix+i] * g14[iy+i] * g16[iz+i]; +s[202] += g0[ix+i] * g15[iy+i] * g16[iz+i]; +s[203] += g0[ix+i] * g14[iy+i] * g17[iz+i]; +s[204] += g1[ix+i] * g12[iy+i] * g18[iz+i]; +s[205] += g0[ix+i] * g13[iy+i] * g18[iz+i]; +s[206] += g0[ix+i] * g12[iy+i] * g19[iz+i]; +s[207] += g3[ix+i] * g8[iy+i] * g20[iz+i]; +s[208] += g2[ix+i] * g9[iy+i] * g20[iz+i]; +s[209] += g2[ix+i] * g8[iy+i] * g21[iz+i]; +s[210] += g1[ix+i] * g10[iy+i] * g20[iz+i]; +s[211] += g0[ix+i] * g11[iy+i] * g20[iz+i]; +s[212] += g0[ix+i] * g10[iy+i] * g21[iz+i]; +s[213] += g1[ix+i] * g8[iy+i] * g22[iz+i]; +s[214] += g0[ix+i] * g9[iy+i] * g22[iz+i]; +s[215] += g0[ix+i] * g8[iy+i] * g23[iz+i]; +s[216] += g7[ix+i] * g0[iy+i] * g24[iz+i]; +s[217] += g6[ix+i] * g1[iy+i] * g24[iz+i]; +s[218] += g6[ix+i] * g0[iy+i] * g25[iz+i]; +s[219] += g5[ix+i] * g2[iy+i] * g24[iz+i]; +s[220] += g4[ix+i] * g3[iy+i] * g24[iz+i]; +s[221] += g4[ix+i] * g2[iy+i] * g25[iz+i]; +s[222] += g5[ix+i] * g0[iy+i] * g26[iz+i]; +s[223] += g4[ix+i] * g1[iy+i] * g26[iz+i]; +s[224] += g4[ix+i] * g0[iy+i] * g27[iz+i]; +s[225] += g3[ix+i] * g4[iy+i] * g24[iz+i]; +s[226] += g2[ix+i] * g5[iy+i] * g24[iz+i]; +s[227] += g2[ix+i] * g4[iy+i] * g25[iz+i]; +s[228] += g1[ix+i] * g6[iy+i] * g24[iz+i]; +s[229] += g0[ix+i] * g7[iy+i] * g24[iz+i]; +s[230] += g0[ix+i] * g6[iy+i] * g25[iz+i]; +s[231] += g1[ix+i] * g4[iy+i] * g26[iz+i]; +s[232] += g0[ix+i] * g5[iy+i] * g26[iz+i]; +s[233] += g0[ix+i] * g4[iy+i] * g27[iz+i]; +s[234] += g3[ix+i] * g0[iy+i] * g28[iz+i]; +s[235] += g2[ix+i] * g1[iy+i] * g28[iz+i]; +s[236] += g2[ix+i] * g0[iy+i] * g29[iz+i]; +s[237] += g1[ix+i] * g2[iy+i] * g28[iz+i]; +s[238] += g0[ix+i] * g3[iy+i] * g28[iz+i]; +s[239] += g0[ix+i] * g2[iy+i] * g29[iz+i]; +s[240] += g1[ix+i] * g0[iy+i] * g30[iz+i]; +s[241] += g0[ix+i] * g1[iy+i] * g30[iz+i]; +s[242] += g0[ix+i] * g0[iy+i] * g31[iz+i]; +} +if (gout_empty) { +gout[n*48+0] = + s[104] - s[176] - s[106] + s[178]; +gout[n*48+1] = + s[167] - s[23] - s[169] + s[25]; +gout[n*48+2] = + s[14] - s[86] - s[16] + s[88]; +gout[n*48+3] = + s[5] + s[95] + s[185] - s[7] - s[97] - s[187]; +gout[n*48+4] = + s[105] - s[177] - s[101] + s[173]; +gout[n*48+5] = + s[168] - s[24] - s[164] + s[20]; +gout[n*48+6] = + s[15] - s[87] - s[11] + s[83]; +gout[n*48+7] = + s[6] + s[96] + s[186] - s[2] - s[92] - s[182]; +gout[n*48+8] = + s[100] - s[172] - s[102] + s[174]; +gout[n*48+9] = + s[163] - s[19] - s[165] + s[21]; +gout[n*48+10] = + s[10] - s[82] - s[12] + s[84]; +gout[n*48+11] = + s[1] + s[91] + s[181] - s[3] - s[93] - s[183]; +gout[n*48+12] = + s[99] - s[171] + s[103] - s[175] + s[107] - s[179]; +gout[n*48+13] = + s[162] - s[18] + s[166] - s[22] + s[170] - s[26]; +gout[n*48+14] = + s[9] - s[81] + s[13] - s[85] + s[17] - s[89]; +gout[n*48+15] = + s[0] + s[90] + s[180] + s[4] + s[94] + s[184] + s[8] + s[98] + s[188]; +gout[n*48+16] = + s[131] - s[203] - s[133] + s[205]; +gout[n*48+17] = + s[194] - s[50] - s[196] + s[52]; +gout[n*48+18] = + s[41] - s[113] - s[43] + s[115]; +gout[n*48+19] = + s[32] + s[122] + s[212] - s[34] - s[124] - s[214]; +gout[n*48+20] = + s[132] - s[204] - s[128] + s[200]; +gout[n*48+21] = + s[195] - s[51] - s[191] + s[47]; +gout[n*48+22] = + s[42] - s[114] - s[38] + s[110]; +gout[n*48+23] = + s[33] + s[123] + s[213] - s[29] - s[119] - s[209]; +gout[n*48+24] = + s[127] - s[199] - s[129] + s[201]; +gout[n*48+25] = + s[190] - s[46] - s[192] + s[48]; +gout[n*48+26] = + s[37] - s[109] - s[39] + s[111]; +gout[n*48+27] = + s[28] + s[118] + s[208] - s[30] - s[120] - s[210]; +gout[n*48+28] = + s[126] - s[198] + s[130] - s[202] + s[134] - s[206]; +gout[n*48+29] = + s[189] - s[45] + s[193] - s[49] + s[197] - s[53]; +gout[n*48+30] = + s[36] - s[108] + s[40] - s[112] + s[44] - s[116]; +gout[n*48+31] = + s[27] + s[117] + s[207] + s[31] + s[121] + s[211] + s[35] + s[125] + s[215]; +gout[n*48+32] = + s[158] - s[230] - s[160] + s[232]; +gout[n*48+33] = + s[221] - s[77] - s[223] + s[79]; +gout[n*48+34] = + s[68] - s[140] - s[70] + s[142]; +gout[n*48+35] = + s[59] + s[149] + s[239] - s[61] - s[151] - s[241]; +gout[n*48+36] = + s[159] - s[231] - s[155] + s[227]; +gout[n*48+37] = + s[222] - s[78] - s[218] + s[74]; +gout[n*48+38] = + s[69] - s[141] - s[65] + s[137]; +gout[n*48+39] = + s[60] + s[150] + s[240] - s[56] - s[146] - s[236]; +gout[n*48+40] = + s[154] - s[226] - s[156] + s[228]; +gout[n*48+41] = + s[217] - s[73] - s[219] + s[75]; +gout[n*48+42] = + s[64] - s[136] - s[66] + s[138]; +gout[n*48+43] = + s[55] + s[145] + s[235] - s[57] - s[147] - s[237]; +gout[n*48+44] = + s[153] - s[225] + s[157] - s[229] + s[161] - s[233]; +gout[n*48+45] = + s[216] - s[72] + s[220] - s[76] + s[224] - s[80]; +gout[n*48+46] = + s[63] - s[135] + s[67] - s[139] + s[71] - s[143]; +gout[n*48+47] = + s[54] + s[144] + s[234] + s[58] + s[148] + s[238] + s[62] + s[152] + s[242]; +} else { +gout[n*48+0] += + s[104] - s[176] - s[106] + s[178]; +gout[n*48+1] += + s[167] - s[23] - s[169] + s[25]; +gout[n*48+2] += + s[14] - s[86] - s[16] + s[88]; +gout[n*48+3] += + s[5] + s[95] + s[185] - s[7] - s[97] - s[187]; +gout[n*48+4] += + s[105] - s[177] - s[101] + s[173]; +gout[n*48+5] += + s[168] - s[24] - s[164] + s[20]; +gout[n*48+6] += + s[15] - s[87] - s[11] + s[83]; +gout[n*48+7] += + s[6] + s[96] + s[186] - s[2] - s[92] - s[182]; +gout[n*48+8] += + s[100] - s[172] - s[102] + s[174]; +gout[n*48+9] += + s[163] - s[19] - s[165] + s[21]; +gout[n*48+10] += + s[10] - s[82] - s[12] + s[84]; +gout[n*48+11] += + s[1] + s[91] + s[181] - s[3] - s[93] - s[183]; +gout[n*48+12] += + s[99] - s[171] + s[103] - s[175] + s[107] - s[179]; +gout[n*48+13] += + s[162] - s[18] + s[166] - s[22] + s[170] - s[26]; +gout[n*48+14] += + s[9] - s[81] + s[13] - s[85] + s[17] - s[89]; +gout[n*48+15] += + s[0] + s[90] + s[180] + s[4] + s[94] + s[184] + s[8] + s[98] + s[188]; +gout[n*48+16] += + s[131] - s[203] - s[133] + s[205]; +gout[n*48+17] += + s[194] - s[50] - s[196] + s[52]; +gout[n*48+18] += + s[41] - s[113] - s[43] + s[115]; +gout[n*48+19] += + s[32] + s[122] + s[212] - s[34] - s[124] - s[214]; +gout[n*48+20] += + s[132] - s[204] - s[128] + s[200]; +gout[n*48+21] += + s[195] - s[51] - s[191] + s[47]; +gout[n*48+22] += + s[42] - s[114] - s[38] + s[110]; +gout[n*48+23] += + s[33] + s[123] + s[213] - s[29] - s[119] - s[209]; +gout[n*48+24] += + s[127] - s[199] - s[129] + s[201]; +gout[n*48+25] += + s[190] - s[46] - s[192] + s[48]; +gout[n*48+26] += + s[37] - s[109] - s[39] + s[111]; +gout[n*48+27] += + s[28] + s[118] + s[208] - s[30] - s[120] - s[210]; +gout[n*48+28] += + s[126] - s[198] + s[130] - s[202] + s[134] - s[206]; +gout[n*48+29] += + s[189] - s[45] + s[193] - s[49] + s[197] - s[53]; +gout[n*48+30] += + s[36] - s[108] + s[40] - s[112] + s[44] - s[116]; +gout[n*48+31] += + s[27] + s[117] + s[207] + s[31] + s[121] + s[211] + s[35] + s[125] + s[215]; +gout[n*48+32] += + s[158] - s[230] - s[160] + s[232]; +gout[n*48+33] += + s[221] - s[77] - s[223] + s[79]; +gout[n*48+34] += + s[68] - s[140] - s[70] + s[142]; +gout[n*48+35] += + s[59] + s[149] + s[239] - s[61] - s[151] - s[241]; +gout[n*48+36] += + s[159] - s[231] - s[155] + s[227]; +gout[n*48+37] += + s[222] - s[78] - s[218] + s[74]; +gout[n*48+38] += + s[69] - s[141] - s[65] + s[137]; +gout[n*48+39] += + s[60] + s[150] + s[240] - s[56] - s[146] - s[236]; +gout[n*48+40] += + s[154] - s[226] - s[156] + s[228]; +gout[n*48+41] += + s[217] - s[73] - s[219] + s[75]; +gout[n*48+42] += + s[64] - s[136] - s[66] + s[138]; +gout[n*48+43] += + s[55] + s[145] + s[235] - s[57] - s[147] - s[237]; +gout[n*48+44] += + s[153] - s[225] + s[157] - s[229] + s[161] - s[233]; +gout[n*48+45] += + s[216] - s[72] + s[220] - s[76] + s[224] - s[80]; +gout[n*48+46] += + s[63] - s[135] + s[67] - s[139] + s[71] - s[143]; +gout[n*48+47] += + s[54] + s[144] + s[234] + s[58] + s[148] + s[238] + s[62] + s[152] + s[242]; +}}} +void int2e_ipspsp1spsp2_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {2, 1, 1, 1, 5, 4, 4, 3}; +CINTall_2e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int2e_ipspsp1spsp2_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 1, 1, 5, 4, 4, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ipspsp1spsp2; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_cart_2e1); +} +CACHE_SIZE_T int2e_ipspsp1spsp2_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 1, 1, 5, 4, 4, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ipspsp1spsp2; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_sph_2e1); +} +CACHE_SIZE_T int2e_ipspsp1spsp2_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 1, 1, 5, 4, 4, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ipspsp1spsp2; +return CINT2e_spinor_drv(out, dims, &envs, opt, cache, &c2s_si_2e1, &c2s_si_2e2); +} +ALL_CINT(int2e_ipspsp1spsp2) +ALL_CINT_FORTRAN_(int2e_ipspsp1spsp2) + +void CINTgout2e_int2e_ipsrsr1(dtype *gout, +dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, i, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +G2E_R_J(g1, g0, envs->i_l+2, envs->j_l+0, envs->k_l, envs->l_l); +G2E_D_I(g2, g0, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g3, g1, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g4, g0, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g5, g1, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g6, g2, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g7, g3, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +dtype s[27]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 27; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g7[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g6[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g6[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g5[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g4[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g4[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g5[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g4[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g4[ix+i] * g0[iy+i] * g3[iz+i]; +s[9] += g3[ix+i] * g4[iy+i] * g0[iz+i]; +s[10] += g2[ix+i] * g5[iy+i] * g0[iz+i]; +s[11] += g2[ix+i] * g4[iy+i] * g1[iz+i]; +s[12] += g1[ix+i] * g6[iy+i] * g0[iz+i]; +s[13] += g0[ix+i] * g7[iy+i] * g0[iz+i]; +s[14] += g0[ix+i] * g6[iy+i] * g1[iz+i]; +s[15] += g1[ix+i] * g4[iy+i] * g2[iz+i]; +s[16] += g0[ix+i] * g5[iy+i] * g2[iz+i]; +s[17] += g0[ix+i] * g4[iy+i] * g3[iz+i]; +s[18] += g3[ix+i] * g0[iy+i] * g4[iz+i]; +s[19] += g2[ix+i] * g1[iy+i] * g4[iz+i]; +s[20] += g2[ix+i] * g0[iy+i] * g5[iz+i]; +s[21] += g1[ix+i] * g2[iy+i] * g4[iz+i]; +s[22] += g0[ix+i] * g3[iy+i] * g4[iz+i]; +s[23] += g0[ix+i] * g2[iy+i] * g5[iz+i]; +s[24] += g1[ix+i] * g0[iy+i] * g6[iz+i]; +s[25] += g0[ix+i] * g1[iy+i] * g6[iz+i]; +s[26] += g0[ix+i] * g0[iy+i] * g7[iz+i]; +} +if (gout_empty) { +gout[n*12+0] = + s[11] - s[19]; +gout[n*12+1] = + s[18] - s[2]; +gout[n*12+2] = + s[1] - s[9]; +gout[n*12+3] = + s[0] + s[10] + s[20]; +gout[n*12+4] = + s[14] - s[22]; +gout[n*12+5] = + s[21] - s[5]; +gout[n*12+6] = + s[4] - s[12]; +gout[n*12+7] = + s[3] + s[13] + s[23]; +gout[n*12+8] = + s[17] - s[25]; +gout[n*12+9] = + s[24] - s[8]; +gout[n*12+10] = + s[7] - s[15]; +gout[n*12+11] = + s[6] + s[16] + s[26]; +} else { +gout[n*12+0] += + s[11] - s[19]; +gout[n*12+1] += + s[18] - s[2]; +gout[n*12+2] += + s[1] - s[9]; +gout[n*12+3] += + s[0] + s[10] + s[20]; +gout[n*12+4] += + s[14] - s[22]; +gout[n*12+5] += + s[21] - s[5]; +gout[n*12+6] += + s[4] - s[12]; +gout[n*12+7] += + s[3] + s[13] + s[23]; +gout[n*12+8] += + s[17] - s[25]; +gout[n*12+9] += + s[24] - s[8]; +gout[n*12+10] += + s[7] - s[15]; +gout[n*12+11] += + s[6] + s[16] + s[26]; +}}} +void int2e_ipsrsr1_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 1, 3}; +CINTall_2e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int2e_ipsrsr1_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 1, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ipsrsr1; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_cart_2e1); +} +CACHE_SIZE_T int2e_ipsrsr1_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 1, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ipsrsr1; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_sph_2e1); +} +CACHE_SIZE_T int2e_ipsrsr1_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 0, 0, 3, 4, 1, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ipsrsr1; +return CINT2e_spinor_drv(out, dims, &envs, opt, cache, &c2s_si_2e1, &c2s_sf_2e2); +} +ALL_CINT(int2e_ipsrsr1) +ALL_CINT_FORTRAN_(int2e_ipsrsr1) + +void CINTgout2e_int2e_ip1srsr2(dtype *gout, +dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, i, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +G2E_R_L(g1, g0, envs->i_l+1, envs->j_l+0, envs->k_l+1, envs->l_l+0); +G2E_R_K(g2, g0, envs->i_l+1, envs->j_l+0, envs->k_l+0, envs->l_l); +G2E_R_K(g3, g1, envs->i_l+1, envs->j_l+0, envs->k_l+0, envs->l_l); +G2E_D_I(g4, g0, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g5, g1, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g6, g2, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g7, g3, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +dtype s[27]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 27; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g7[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g6[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g6[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g5[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g4[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g4[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g5[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g4[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g4[ix+i] * g0[iy+i] * g3[iz+i]; +s[9] += g3[ix+i] * g4[iy+i] * g0[iz+i]; +s[10] += g2[ix+i] * g5[iy+i] * g0[iz+i]; +s[11] += g2[ix+i] * g4[iy+i] * g1[iz+i]; +s[12] += g1[ix+i] * g6[iy+i] * g0[iz+i]; +s[13] += g0[ix+i] * g7[iy+i] * g0[iz+i]; +s[14] += g0[ix+i] * g6[iy+i] * g1[iz+i]; +s[15] += g1[ix+i] * g4[iy+i] * g2[iz+i]; +s[16] += g0[ix+i] * g5[iy+i] * g2[iz+i]; +s[17] += g0[ix+i] * g4[iy+i] * g3[iz+i]; +s[18] += g3[ix+i] * g0[iy+i] * g4[iz+i]; +s[19] += g2[ix+i] * g1[iy+i] * g4[iz+i]; +s[20] += g2[ix+i] * g0[iy+i] * g5[iz+i]; +s[21] += g1[ix+i] * g2[iy+i] * g4[iz+i]; +s[22] += g0[ix+i] * g3[iy+i] * g4[iz+i]; +s[23] += g0[ix+i] * g2[iy+i] * g5[iz+i]; +s[24] += g1[ix+i] * g0[iy+i] * g6[iz+i]; +s[25] += g0[ix+i] * g1[iy+i] * g6[iz+i]; +s[26] += g0[ix+i] * g0[iy+i] * g7[iz+i]; +} +if (gout_empty) { +gout[n*12+0] = + s[5] - s[7]; +gout[n*12+1] = + s[6] - s[2]; +gout[n*12+2] = + s[1] - s[3]; +gout[n*12+3] = + s[0] + s[4] + s[8]; +gout[n*12+4] = + s[14] - s[16]; +gout[n*12+5] = + s[15] - s[11]; +gout[n*12+6] = + s[10] - s[12]; +gout[n*12+7] = + s[9] + s[13] + s[17]; +gout[n*12+8] = + s[23] - s[25]; +gout[n*12+9] = + s[24] - s[20]; +gout[n*12+10] = + s[19] - s[21]; +gout[n*12+11] = + s[18] + s[22] + s[26]; +} else { +gout[n*12+0] += + s[5] - s[7]; +gout[n*12+1] += + s[6] - s[2]; +gout[n*12+2] += + s[1] - s[3]; +gout[n*12+3] += + s[0] + s[4] + s[8]; +gout[n*12+4] += + s[14] - s[16]; +gout[n*12+5] += + s[15] - s[11]; +gout[n*12+6] += + s[10] - s[12]; +gout[n*12+7] += + s[9] + s[13] + s[17]; +gout[n*12+8] += + s[23] - s[25]; +gout[n*12+9] += + s[24] - s[20]; +gout[n*12+10] += + s[19] - s[21]; +gout[n*12+11] += + s[18] + s[22] + s[26]; +}}} +void int2e_ip1srsr2_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {1, 0, 1, 1, 3, 1, 4, 3}; +CINTall_2e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int2e_ip1srsr2_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 1, 1, 3, 1, 4, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ip1srsr2; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_cart_2e1); +} +CACHE_SIZE_T int2e_ip1srsr2_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 1, 1, 3, 1, 4, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ip1srsr2; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_sph_2e1); +} +CACHE_SIZE_T int2e_ip1srsr2_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {1, 0, 1, 1, 3, 1, 4, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ip1srsr2; +return CINT2e_spinor_drv(out, dims, &envs, opt, cache, &c2s_sf_2e1, &c2s_si_2e2); +} +ALL_CINT(int2e_ip1srsr2) +ALL_CINT_FORTRAN_(int2e_ip1srsr2) + +void CINTgout2e_int2e_ipsrsr1srsr2(dtype *gout, +dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty) { +FINT nf = envs->nf; +FINT nrys_roots = envs->nrys_roots; +FINT ix, iy, iz, i, n; +dtype *g0 = g; +dtype *g1 = g0 + envs->g_size * 3; +dtype *g2 = g1 + envs->g_size * 3; +dtype *g3 = g2 + envs->g_size * 3; +dtype *g4 = g3 + envs->g_size * 3; +dtype *g5 = g4 + envs->g_size * 3; +dtype *g6 = g5 + envs->g_size * 3; +dtype *g7 = g6 + envs->g_size * 3; +dtype *g8 = g7 + envs->g_size * 3; +dtype *g9 = g8 + envs->g_size * 3; +dtype *g10 = g9 + envs->g_size * 3; +dtype *g11 = g10 + envs->g_size * 3; +dtype *g12 = g11 + envs->g_size * 3; +dtype *g13 = g12 + envs->g_size * 3; +dtype *g14 = g13 + envs->g_size * 3; +dtype *g15 = g14 + envs->g_size * 3; +dtype *g16 = g15 + envs->g_size * 3; +dtype *g17 = g16 + envs->g_size * 3; +dtype *g18 = g17 + envs->g_size * 3; +dtype *g19 = g18 + envs->g_size * 3; +dtype *g20 = g19 + envs->g_size * 3; +dtype *g21 = g20 + envs->g_size * 3; +dtype *g22 = g21 + envs->g_size * 3; +dtype *g23 = g22 + envs->g_size * 3; +dtype *g24 = g23 + envs->g_size * 3; +dtype *g25 = g24 + envs->g_size * 3; +dtype *g26 = g25 + envs->g_size * 3; +dtype *g27 = g26 + envs->g_size * 3; +dtype *g28 = g27 + envs->g_size * 3; +dtype *g29 = g28 + envs->g_size * 3; +dtype *g30 = g29 + envs->g_size * 3; +dtype *g31 = g30 + envs->g_size * 3; +G2E_R_L(g1, g0, envs->i_l+2, envs->j_l+1, envs->k_l+1, envs->l_l+0); +G2E_R_K(g2, g0, envs->i_l+2, envs->j_l+1, envs->k_l+0, envs->l_l); +G2E_R_K(g3, g1, envs->i_l+2, envs->j_l+1, envs->k_l+0, envs->l_l); +G2E_R_J(g4, g0, envs->i_l+2, envs->j_l+0, envs->k_l, envs->l_l); +G2E_R_J(g5, g1, envs->i_l+2, envs->j_l+0, envs->k_l, envs->l_l); +G2E_R_J(g6, g2, envs->i_l+2, envs->j_l+0, envs->k_l, envs->l_l); +G2E_R_J(g7, g3, envs->i_l+2, envs->j_l+0, envs->k_l, envs->l_l); +G2E_D_I(g8, g0, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g9, g1, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g10, g2, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g11, g3, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g12, g4, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g13, g5, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g14, g6, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_D_I(g15, g7, envs->i_l+1, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g16, g0, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g17, g1, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g18, g2, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g19, g3, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g20, g4, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g21, g5, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g22, g6, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g23, g7, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g24, g8, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g25, g9, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g26, g10, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g27, g11, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g28, g12, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g29, g13, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g30, g14, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +G2E_R_I(g31, g15, envs->i_l+0, envs->j_l, envs->k_l, envs->l_l); +dtype s[243]; +for (n = 0; n < nf; n++) { +ix = idx[0+n*3]; +iy = idx[1+n*3]; +iz = idx[2+n*3]; +for (i = 0; i < 243; i++) { s[i] = 0; } +for (i = 0; i < nrys_roots; i++) { +s[0] += g31[ix+i] * g0[iy+i] * g0[iz+i]; +s[1] += g30[ix+i] * g1[iy+i] * g0[iz+i]; +s[2] += g30[ix+i] * g0[iy+i] * g1[iz+i]; +s[3] += g29[ix+i] * g2[iy+i] * g0[iz+i]; +s[4] += g28[ix+i] * g3[iy+i] * g0[iz+i]; +s[5] += g28[ix+i] * g2[iy+i] * g1[iz+i]; +s[6] += g29[ix+i] * g0[iy+i] * g2[iz+i]; +s[7] += g28[ix+i] * g1[iy+i] * g2[iz+i]; +s[8] += g28[ix+i] * g0[iy+i] * g3[iz+i]; +s[9] += g27[ix+i] * g4[iy+i] * g0[iz+i]; +s[10] += g26[ix+i] * g5[iy+i] * g0[iz+i]; +s[11] += g26[ix+i] * g4[iy+i] * g1[iz+i]; +s[12] += g25[ix+i] * g6[iy+i] * g0[iz+i]; +s[13] += g24[ix+i] * g7[iy+i] * g0[iz+i]; +s[14] += g24[ix+i] * g6[iy+i] * g1[iz+i]; +s[15] += g25[ix+i] * g4[iy+i] * g2[iz+i]; +s[16] += g24[ix+i] * g5[iy+i] * g2[iz+i]; +s[17] += g24[ix+i] * g4[iy+i] * g3[iz+i]; +s[18] += g27[ix+i] * g0[iy+i] * g4[iz+i]; +s[19] += g26[ix+i] * g1[iy+i] * g4[iz+i]; +s[20] += g26[ix+i] * g0[iy+i] * g5[iz+i]; +s[21] += g25[ix+i] * g2[iy+i] * g4[iz+i]; +s[22] += g24[ix+i] * g3[iy+i] * g4[iz+i]; +s[23] += g24[ix+i] * g2[iy+i] * g5[iz+i]; +s[24] += g25[ix+i] * g0[iy+i] * g6[iz+i]; +s[25] += g24[ix+i] * g1[iy+i] * g6[iz+i]; +s[26] += g24[ix+i] * g0[iy+i] * g7[iz+i]; +s[27] += g23[ix+i] * g8[iy+i] * g0[iz+i]; +s[28] += g22[ix+i] * g9[iy+i] * g0[iz+i]; +s[29] += g22[ix+i] * g8[iy+i] * g1[iz+i]; +s[30] += g21[ix+i] * g10[iy+i] * g0[iz+i]; +s[31] += g20[ix+i] * g11[iy+i] * g0[iz+i]; +s[32] += g20[ix+i] * g10[iy+i] * g1[iz+i]; +s[33] += g21[ix+i] * g8[iy+i] * g2[iz+i]; +s[34] += g20[ix+i] * g9[iy+i] * g2[iz+i]; +s[35] += g20[ix+i] * g8[iy+i] * g3[iz+i]; +s[36] += g19[ix+i] * g12[iy+i] * g0[iz+i]; +s[37] += g18[ix+i] * g13[iy+i] * g0[iz+i]; +s[38] += g18[ix+i] * g12[iy+i] * g1[iz+i]; +s[39] += g17[ix+i] * g14[iy+i] * g0[iz+i]; +s[40] += g16[ix+i] * g15[iy+i] * g0[iz+i]; +s[41] += g16[ix+i] * g14[iy+i] * g1[iz+i]; +s[42] += g17[ix+i] * g12[iy+i] * g2[iz+i]; +s[43] += g16[ix+i] * g13[iy+i] * g2[iz+i]; +s[44] += g16[ix+i] * g12[iy+i] * g3[iz+i]; +s[45] += g19[ix+i] * g8[iy+i] * g4[iz+i]; +s[46] += g18[ix+i] * g9[iy+i] * g4[iz+i]; +s[47] += g18[ix+i] * g8[iy+i] * g5[iz+i]; +s[48] += g17[ix+i] * g10[iy+i] * g4[iz+i]; +s[49] += g16[ix+i] * g11[iy+i] * g4[iz+i]; +s[50] += g16[ix+i] * g10[iy+i] * g5[iz+i]; +s[51] += g17[ix+i] * g8[iy+i] * g6[iz+i]; +s[52] += g16[ix+i] * g9[iy+i] * g6[iz+i]; +s[53] += g16[ix+i] * g8[iy+i] * g7[iz+i]; +s[54] += g23[ix+i] * g0[iy+i] * g8[iz+i]; +s[55] += g22[ix+i] * g1[iy+i] * g8[iz+i]; +s[56] += g22[ix+i] * g0[iy+i] * g9[iz+i]; +s[57] += g21[ix+i] * g2[iy+i] * g8[iz+i]; +s[58] += g20[ix+i] * g3[iy+i] * g8[iz+i]; +s[59] += g20[ix+i] * g2[iy+i] * g9[iz+i]; +s[60] += g21[ix+i] * g0[iy+i] * g10[iz+i]; +s[61] += g20[ix+i] * g1[iy+i] * g10[iz+i]; +s[62] += g20[ix+i] * g0[iy+i] * g11[iz+i]; +s[63] += g19[ix+i] * g4[iy+i] * g8[iz+i]; +s[64] += g18[ix+i] * g5[iy+i] * g8[iz+i]; +s[65] += g18[ix+i] * g4[iy+i] * g9[iz+i]; +s[66] += g17[ix+i] * g6[iy+i] * g8[iz+i]; +s[67] += g16[ix+i] * g7[iy+i] * g8[iz+i]; +s[68] += g16[ix+i] * g6[iy+i] * g9[iz+i]; +s[69] += g17[ix+i] * g4[iy+i] * g10[iz+i]; +s[70] += g16[ix+i] * g5[iy+i] * g10[iz+i]; +s[71] += g16[ix+i] * g4[iy+i] * g11[iz+i]; +s[72] += g19[ix+i] * g0[iy+i] * g12[iz+i]; +s[73] += g18[ix+i] * g1[iy+i] * g12[iz+i]; +s[74] += g18[ix+i] * g0[iy+i] * g13[iz+i]; +s[75] += g17[ix+i] * g2[iy+i] * g12[iz+i]; +s[76] += g16[ix+i] * g3[iy+i] * g12[iz+i]; +s[77] += g16[ix+i] * g2[iy+i] * g13[iz+i]; +s[78] += g17[ix+i] * g0[iy+i] * g14[iz+i]; +s[79] += g16[ix+i] * g1[iy+i] * g14[iz+i]; +s[80] += g16[ix+i] * g0[iy+i] * g15[iz+i]; +s[81] += g15[ix+i] * g16[iy+i] * g0[iz+i]; +s[82] += g14[ix+i] * g17[iy+i] * g0[iz+i]; +s[83] += g14[ix+i] * g16[iy+i] * g1[iz+i]; +s[84] += g13[ix+i] * g18[iy+i] * g0[iz+i]; +s[85] += g12[ix+i] * g19[iy+i] * g0[iz+i]; +s[86] += g12[ix+i] * g18[iy+i] * g1[iz+i]; +s[87] += g13[ix+i] * g16[iy+i] * g2[iz+i]; +s[88] += g12[ix+i] * g17[iy+i] * g2[iz+i]; +s[89] += g12[ix+i] * g16[iy+i] * g3[iz+i]; +s[90] += g11[ix+i] * g20[iy+i] * g0[iz+i]; +s[91] += g10[ix+i] * g21[iy+i] * g0[iz+i]; +s[92] += g10[ix+i] * g20[iy+i] * g1[iz+i]; +s[93] += g9[ix+i] * g22[iy+i] * g0[iz+i]; +s[94] += g8[ix+i] * g23[iy+i] * g0[iz+i]; +s[95] += g8[ix+i] * g22[iy+i] * g1[iz+i]; +s[96] += g9[ix+i] * g20[iy+i] * g2[iz+i]; +s[97] += g8[ix+i] * g21[iy+i] * g2[iz+i]; +s[98] += g8[ix+i] * g20[iy+i] * g3[iz+i]; +s[99] += g11[ix+i] * g16[iy+i] * g4[iz+i]; +s[100] += g10[ix+i] * g17[iy+i] * g4[iz+i]; +s[101] += g10[ix+i] * g16[iy+i] * g5[iz+i]; +s[102] += g9[ix+i] * g18[iy+i] * g4[iz+i]; +s[103] += g8[ix+i] * g19[iy+i] * g4[iz+i]; +s[104] += g8[ix+i] * g18[iy+i] * g5[iz+i]; +s[105] += g9[ix+i] * g16[iy+i] * g6[iz+i]; +s[106] += g8[ix+i] * g17[iy+i] * g6[iz+i]; +s[107] += g8[ix+i] * g16[iy+i] * g7[iz+i]; +s[108] += g7[ix+i] * g24[iy+i] * g0[iz+i]; +s[109] += g6[ix+i] * g25[iy+i] * g0[iz+i]; +s[110] += g6[ix+i] * g24[iy+i] * g1[iz+i]; +s[111] += g5[ix+i] * g26[iy+i] * g0[iz+i]; +s[112] += g4[ix+i] * g27[iy+i] * g0[iz+i]; +s[113] += g4[ix+i] * g26[iy+i] * g1[iz+i]; +s[114] += g5[ix+i] * g24[iy+i] * g2[iz+i]; +s[115] += g4[ix+i] * g25[iy+i] * g2[iz+i]; +s[116] += g4[ix+i] * g24[iy+i] * g3[iz+i]; +s[117] += g3[ix+i] * g28[iy+i] * g0[iz+i]; +s[118] += g2[ix+i] * g29[iy+i] * g0[iz+i]; +s[119] += g2[ix+i] * g28[iy+i] * g1[iz+i]; +s[120] += g1[ix+i] * g30[iy+i] * g0[iz+i]; +s[121] += g0[ix+i] * g31[iy+i] * g0[iz+i]; +s[122] += g0[ix+i] * g30[iy+i] * g1[iz+i]; +s[123] += g1[ix+i] * g28[iy+i] * g2[iz+i]; +s[124] += g0[ix+i] * g29[iy+i] * g2[iz+i]; +s[125] += g0[ix+i] * g28[iy+i] * g3[iz+i]; +s[126] += g3[ix+i] * g24[iy+i] * g4[iz+i]; +s[127] += g2[ix+i] * g25[iy+i] * g4[iz+i]; +s[128] += g2[ix+i] * g24[iy+i] * g5[iz+i]; +s[129] += g1[ix+i] * g26[iy+i] * g4[iz+i]; +s[130] += g0[ix+i] * g27[iy+i] * g4[iz+i]; +s[131] += g0[ix+i] * g26[iy+i] * g5[iz+i]; +s[132] += g1[ix+i] * g24[iy+i] * g6[iz+i]; +s[133] += g0[ix+i] * g25[iy+i] * g6[iz+i]; +s[134] += g0[ix+i] * g24[iy+i] * g7[iz+i]; +s[135] += g7[ix+i] * g16[iy+i] * g8[iz+i]; +s[136] += g6[ix+i] * g17[iy+i] * g8[iz+i]; +s[137] += g6[ix+i] * g16[iy+i] * g9[iz+i]; +s[138] += g5[ix+i] * g18[iy+i] * g8[iz+i]; +s[139] += g4[ix+i] * g19[iy+i] * g8[iz+i]; +s[140] += g4[ix+i] * g18[iy+i] * g9[iz+i]; +s[141] += g5[ix+i] * g16[iy+i] * g10[iz+i]; +s[142] += g4[ix+i] * g17[iy+i] * g10[iz+i]; +s[143] += g4[ix+i] * g16[iy+i] * g11[iz+i]; +s[144] += g3[ix+i] * g20[iy+i] * g8[iz+i]; +s[145] += g2[ix+i] * g21[iy+i] * g8[iz+i]; +s[146] += g2[ix+i] * g20[iy+i] * g9[iz+i]; +s[147] += g1[ix+i] * g22[iy+i] * g8[iz+i]; +s[148] += g0[ix+i] * g23[iy+i] * g8[iz+i]; +s[149] += g0[ix+i] * g22[iy+i] * g9[iz+i]; +s[150] += g1[ix+i] * g20[iy+i] * g10[iz+i]; +s[151] += g0[ix+i] * g21[iy+i] * g10[iz+i]; +s[152] += g0[ix+i] * g20[iy+i] * g11[iz+i]; +s[153] += g3[ix+i] * g16[iy+i] * g12[iz+i]; +s[154] += g2[ix+i] * g17[iy+i] * g12[iz+i]; +s[155] += g2[ix+i] * g16[iy+i] * g13[iz+i]; +s[156] += g1[ix+i] * g18[iy+i] * g12[iz+i]; +s[157] += g0[ix+i] * g19[iy+i] * g12[iz+i]; +s[158] += g0[ix+i] * g18[iy+i] * g13[iz+i]; +s[159] += g1[ix+i] * g16[iy+i] * g14[iz+i]; +s[160] += g0[ix+i] * g17[iy+i] * g14[iz+i]; +s[161] += g0[ix+i] * g16[iy+i] * g15[iz+i]; +s[162] += g15[ix+i] * g0[iy+i] * g16[iz+i]; +s[163] += g14[ix+i] * g1[iy+i] * g16[iz+i]; +s[164] += g14[ix+i] * g0[iy+i] * g17[iz+i]; +s[165] += g13[ix+i] * g2[iy+i] * g16[iz+i]; +s[166] += g12[ix+i] * g3[iy+i] * g16[iz+i]; +s[167] += g12[ix+i] * g2[iy+i] * g17[iz+i]; +s[168] += g13[ix+i] * g0[iy+i] * g18[iz+i]; +s[169] += g12[ix+i] * g1[iy+i] * g18[iz+i]; +s[170] += g12[ix+i] * g0[iy+i] * g19[iz+i]; +s[171] += g11[ix+i] * g4[iy+i] * g16[iz+i]; +s[172] += g10[ix+i] * g5[iy+i] * g16[iz+i]; +s[173] += g10[ix+i] * g4[iy+i] * g17[iz+i]; +s[174] += g9[ix+i] * g6[iy+i] * g16[iz+i]; +s[175] += g8[ix+i] * g7[iy+i] * g16[iz+i]; +s[176] += g8[ix+i] * g6[iy+i] * g17[iz+i]; +s[177] += g9[ix+i] * g4[iy+i] * g18[iz+i]; +s[178] += g8[ix+i] * g5[iy+i] * g18[iz+i]; +s[179] += g8[ix+i] * g4[iy+i] * g19[iz+i]; +s[180] += g11[ix+i] * g0[iy+i] * g20[iz+i]; +s[181] += g10[ix+i] * g1[iy+i] * g20[iz+i]; +s[182] += g10[ix+i] * g0[iy+i] * g21[iz+i]; +s[183] += g9[ix+i] * g2[iy+i] * g20[iz+i]; +s[184] += g8[ix+i] * g3[iy+i] * g20[iz+i]; +s[185] += g8[ix+i] * g2[iy+i] * g21[iz+i]; +s[186] += g9[ix+i] * g0[iy+i] * g22[iz+i]; +s[187] += g8[ix+i] * g1[iy+i] * g22[iz+i]; +s[188] += g8[ix+i] * g0[iy+i] * g23[iz+i]; +s[189] += g7[ix+i] * g8[iy+i] * g16[iz+i]; +s[190] += g6[ix+i] * g9[iy+i] * g16[iz+i]; +s[191] += g6[ix+i] * g8[iy+i] * g17[iz+i]; +s[192] += g5[ix+i] * g10[iy+i] * g16[iz+i]; +s[193] += g4[ix+i] * g11[iy+i] * g16[iz+i]; +s[194] += g4[ix+i] * g10[iy+i] * g17[iz+i]; +s[195] += g5[ix+i] * g8[iy+i] * g18[iz+i]; +s[196] += g4[ix+i] * g9[iy+i] * g18[iz+i]; +s[197] += g4[ix+i] * g8[iy+i] * g19[iz+i]; +s[198] += g3[ix+i] * g12[iy+i] * g16[iz+i]; +s[199] += g2[ix+i] * g13[iy+i] * g16[iz+i]; +s[200] += g2[ix+i] * g12[iy+i] * g17[iz+i]; +s[201] += g1[ix+i] * g14[iy+i] * g16[iz+i]; +s[202] += g0[ix+i] * g15[iy+i] * g16[iz+i]; +s[203] += g0[ix+i] * g14[iy+i] * g17[iz+i]; +s[204] += g1[ix+i] * g12[iy+i] * g18[iz+i]; +s[205] += g0[ix+i] * g13[iy+i] * g18[iz+i]; +s[206] += g0[ix+i] * g12[iy+i] * g19[iz+i]; +s[207] += g3[ix+i] * g8[iy+i] * g20[iz+i]; +s[208] += g2[ix+i] * g9[iy+i] * g20[iz+i]; +s[209] += g2[ix+i] * g8[iy+i] * g21[iz+i]; +s[210] += g1[ix+i] * g10[iy+i] * g20[iz+i]; +s[211] += g0[ix+i] * g11[iy+i] * g20[iz+i]; +s[212] += g0[ix+i] * g10[iy+i] * g21[iz+i]; +s[213] += g1[ix+i] * g8[iy+i] * g22[iz+i]; +s[214] += g0[ix+i] * g9[iy+i] * g22[iz+i]; +s[215] += g0[ix+i] * g8[iy+i] * g23[iz+i]; +s[216] += g7[ix+i] * g0[iy+i] * g24[iz+i]; +s[217] += g6[ix+i] * g1[iy+i] * g24[iz+i]; +s[218] += g6[ix+i] * g0[iy+i] * g25[iz+i]; +s[219] += g5[ix+i] * g2[iy+i] * g24[iz+i]; +s[220] += g4[ix+i] * g3[iy+i] * g24[iz+i]; +s[221] += g4[ix+i] * g2[iy+i] * g25[iz+i]; +s[222] += g5[ix+i] * g0[iy+i] * g26[iz+i]; +s[223] += g4[ix+i] * g1[iy+i] * g26[iz+i]; +s[224] += g4[ix+i] * g0[iy+i] * g27[iz+i]; +s[225] += g3[ix+i] * g4[iy+i] * g24[iz+i]; +s[226] += g2[ix+i] * g5[iy+i] * g24[iz+i]; +s[227] += g2[ix+i] * g4[iy+i] * g25[iz+i]; +s[228] += g1[ix+i] * g6[iy+i] * g24[iz+i]; +s[229] += g0[ix+i] * g7[iy+i] * g24[iz+i]; +s[230] += g0[ix+i] * g6[iy+i] * g25[iz+i]; +s[231] += g1[ix+i] * g4[iy+i] * g26[iz+i]; +s[232] += g0[ix+i] * g5[iy+i] * g26[iz+i]; +s[233] += g0[ix+i] * g4[iy+i] * g27[iz+i]; +s[234] += g3[ix+i] * g0[iy+i] * g28[iz+i]; +s[235] += g2[ix+i] * g1[iy+i] * g28[iz+i]; +s[236] += g2[ix+i] * g0[iy+i] * g29[iz+i]; +s[237] += g1[ix+i] * g2[iy+i] * g28[iz+i]; +s[238] += g0[ix+i] * g3[iy+i] * g28[iz+i]; +s[239] += g0[ix+i] * g2[iy+i] * g29[iz+i]; +s[240] += g1[ix+i] * g0[iy+i] * g30[iz+i]; +s[241] += g0[ix+i] * g1[iy+i] * g30[iz+i]; +s[242] += g0[ix+i] * g0[iy+i] * g31[iz+i]; +} +if (gout_empty) { +gout[n*48+0] = + s[104] - s[176] - s[106] + s[178]; +gout[n*48+1] = + s[167] - s[23] - s[169] + s[25]; +gout[n*48+2] = + s[14] - s[86] - s[16] + s[88]; +gout[n*48+3] = + s[5] + s[95] + s[185] - s[7] - s[97] - s[187]; +gout[n*48+4] = + s[105] - s[177] - s[101] + s[173]; +gout[n*48+5] = + s[168] - s[24] - s[164] + s[20]; +gout[n*48+6] = + s[15] - s[87] - s[11] + s[83]; +gout[n*48+7] = + s[6] + s[96] + s[186] - s[2] - s[92] - s[182]; +gout[n*48+8] = + s[100] - s[172] - s[102] + s[174]; +gout[n*48+9] = + s[163] - s[19] - s[165] + s[21]; +gout[n*48+10] = + s[10] - s[82] - s[12] + s[84]; +gout[n*48+11] = + s[1] + s[91] + s[181] - s[3] - s[93] - s[183]; +gout[n*48+12] = + s[99] - s[171] + s[103] - s[175] + s[107] - s[179]; +gout[n*48+13] = + s[162] - s[18] + s[166] - s[22] + s[170] - s[26]; +gout[n*48+14] = + s[9] - s[81] + s[13] - s[85] + s[17] - s[89]; +gout[n*48+15] = + s[0] + s[90] + s[180] + s[4] + s[94] + s[184] + s[8] + s[98] + s[188]; +gout[n*48+16] = + s[131] - s[203] - s[133] + s[205]; +gout[n*48+17] = + s[194] - s[50] - s[196] + s[52]; +gout[n*48+18] = + s[41] - s[113] - s[43] + s[115]; +gout[n*48+19] = + s[32] + s[122] + s[212] - s[34] - s[124] - s[214]; +gout[n*48+20] = + s[132] - s[204] - s[128] + s[200]; +gout[n*48+21] = + s[195] - s[51] - s[191] + s[47]; +gout[n*48+22] = + s[42] - s[114] - s[38] + s[110]; +gout[n*48+23] = + s[33] + s[123] + s[213] - s[29] - s[119] - s[209]; +gout[n*48+24] = + s[127] - s[199] - s[129] + s[201]; +gout[n*48+25] = + s[190] - s[46] - s[192] + s[48]; +gout[n*48+26] = + s[37] - s[109] - s[39] + s[111]; +gout[n*48+27] = + s[28] + s[118] + s[208] - s[30] - s[120] - s[210]; +gout[n*48+28] = + s[126] - s[198] + s[130] - s[202] + s[134] - s[206]; +gout[n*48+29] = + s[189] - s[45] + s[193] - s[49] + s[197] - s[53]; +gout[n*48+30] = + s[36] - s[108] + s[40] - s[112] + s[44] - s[116]; +gout[n*48+31] = + s[27] + s[117] + s[207] + s[31] + s[121] + s[211] + s[35] + s[125] + s[215]; +gout[n*48+32] = + s[158] - s[230] - s[160] + s[232]; +gout[n*48+33] = + s[221] - s[77] - s[223] + s[79]; +gout[n*48+34] = + s[68] - s[140] - s[70] + s[142]; +gout[n*48+35] = + s[59] + s[149] + s[239] - s[61] - s[151] - s[241]; +gout[n*48+36] = + s[159] - s[231] - s[155] + s[227]; +gout[n*48+37] = + s[222] - s[78] - s[218] + s[74]; +gout[n*48+38] = + s[69] - s[141] - s[65] + s[137]; +gout[n*48+39] = + s[60] + s[150] + s[240] - s[56] - s[146] - s[236]; +gout[n*48+40] = + s[154] - s[226] - s[156] + s[228]; +gout[n*48+41] = + s[217] - s[73] - s[219] + s[75]; +gout[n*48+42] = + s[64] - s[136] - s[66] + s[138]; +gout[n*48+43] = + s[55] + s[145] + s[235] - s[57] - s[147] - s[237]; +gout[n*48+44] = + s[153] - s[225] + s[157] - s[229] + s[161] - s[233]; +gout[n*48+45] = + s[216] - s[72] + s[220] - s[76] + s[224] - s[80]; +gout[n*48+46] = + s[63] - s[135] + s[67] - s[139] + s[71] - s[143]; +gout[n*48+47] = + s[54] + s[144] + s[234] + s[58] + s[148] + s[238] + s[62] + s[152] + s[242]; +} else { +gout[n*48+0] += + s[104] - s[176] - s[106] + s[178]; +gout[n*48+1] += + s[167] - s[23] - s[169] + s[25]; +gout[n*48+2] += + s[14] - s[86] - s[16] + s[88]; +gout[n*48+3] += + s[5] + s[95] + s[185] - s[7] - s[97] - s[187]; +gout[n*48+4] += + s[105] - s[177] - s[101] + s[173]; +gout[n*48+5] += + s[168] - s[24] - s[164] + s[20]; +gout[n*48+6] += + s[15] - s[87] - s[11] + s[83]; +gout[n*48+7] += + s[6] + s[96] + s[186] - s[2] - s[92] - s[182]; +gout[n*48+8] += + s[100] - s[172] - s[102] + s[174]; +gout[n*48+9] += + s[163] - s[19] - s[165] + s[21]; +gout[n*48+10] += + s[10] - s[82] - s[12] + s[84]; +gout[n*48+11] += + s[1] + s[91] + s[181] - s[3] - s[93] - s[183]; +gout[n*48+12] += + s[99] - s[171] + s[103] - s[175] + s[107] - s[179]; +gout[n*48+13] += + s[162] - s[18] + s[166] - s[22] + s[170] - s[26]; +gout[n*48+14] += + s[9] - s[81] + s[13] - s[85] + s[17] - s[89]; +gout[n*48+15] += + s[0] + s[90] + s[180] + s[4] + s[94] + s[184] + s[8] + s[98] + s[188]; +gout[n*48+16] += + s[131] - s[203] - s[133] + s[205]; +gout[n*48+17] += + s[194] - s[50] - s[196] + s[52]; +gout[n*48+18] += + s[41] - s[113] - s[43] + s[115]; +gout[n*48+19] += + s[32] + s[122] + s[212] - s[34] - s[124] - s[214]; +gout[n*48+20] += + s[132] - s[204] - s[128] + s[200]; +gout[n*48+21] += + s[195] - s[51] - s[191] + s[47]; +gout[n*48+22] += + s[42] - s[114] - s[38] + s[110]; +gout[n*48+23] += + s[33] + s[123] + s[213] - s[29] - s[119] - s[209]; +gout[n*48+24] += + s[127] - s[199] - s[129] + s[201]; +gout[n*48+25] += + s[190] - s[46] - s[192] + s[48]; +gout[n*48+26] += + s[37] - s[109] - s[39] + s[111]; +gout[n*48+27] += + s[28] + s[118] + s[208] - s[30] - s[120] - s[210]; +gout[n*48+28] += + s[126] - s[198] + s[130] - s[202] + s[134] - s[206]; +gout[n*48+29] += + s[189] - s[45] + s[193] - s[49] + s[197] - s[53]; +gout[n*48+30] += + s[36] - s[108] + s[40] - s[112] + s[44] - s[116]; +gout[n*48+31] += + s[27] + s[117] + s[207] + s[31] + s[121] + s[211] + s[35] + s[125] + s[215]; +gout[n*48+32] += + s[158] - s[230] - s[160] + s[232]; +gout[n*48+33] += + s[221] - s[77] - s[223] + s[79]; +gout[n*48+34] += + s[68] - s[140] - s[70] + s[142]; +gout[n*48+35] += + s[59] + s[149] + s[239] - s[61] - s[151] - s[241]; +gout[n*48+36] += + s[159] - s[231] - s[155] + s[227]; +gout[n*48+37] += + s[222] - s[78] - s[218] + s[74]; +gout[n*48+38] += + s[69] - s[141] - s[65] + s[137]; +gout[n*48+39] += + s[60] + s[150] + s[240] - s[56] - s[146] - s[236]; +gout[n*48+40] += + s[154] - s[226] - s[156] + s[228]; +gout[n*48+41] += + s[217] - s[73] - s[219] + s[75]; +gout[n*48+42] += + s[64] - s[136] - s[66] + s[138]; +gout[n*48+43] += + s[55] + s[145] + s[235] - s[57] - s[147] - s[237]; +gout[n*48+44] += + s[153] - s[225] + s[157] - s[229] + s[161] - s[233]; +gout[n*48+45] += + s[216] - s[72] + s[220] - s[76] + s[224] - s[80]; +gout[n*48+46] += + s[63] - s[135] + s[67] - s[139] + s[71] - s[143]; +gout[n*48+47] += + s[54] + s[144] + s[234] + s[58] + s[148] + s[238] + s[62] + s[152] + s[242]; +}}} +void int2e_ipsrsr1srsr2_optimizer(CINTOpt **opt, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) { +FINT ng[] = {2, 1, 1, 1, 5, 4, 4, 3}; +CINTall_2e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} +CACHE_SIZE_T int2e_ipsrsr1srsr2_cart(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 1, 1, 5, 4, 4, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ipsrsr1srsr2; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_cart_2e1); +} +CACHE_SIZE_T int2e_ipsrsr1srsr2_sph(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 1, 1, 5, 4, 4, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ipsrsr1srsr2; +return CINT2e_drv(out, dims, &envs, opt, cache, &c2s_sph_2e1); +} +CACHE_SIZE_T int2e_ipsrsr1srsr2_spinor(dtype *out, FINT *dims, FINT *shls, +FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) { +FINT ng[] = {2, 1, 1, 1, 5, 4, 4, 3}; +CINTEnvVars envs; +CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); +envs.f_gout = &CINTgout2e_int2e_ipsrsr1srsr2; +return CINT2e_spinor_drv(out, dims, &envs, opt, cache, &c2s_si_2e1, &c2s_si_2e2); +} */ +ALL_CINT(int2e_ipsrsr1srsr2) +ALL_CINT_FORTRAN_(int2e_ipsrsr1srsr2) + + +FINT CINTlen_cart(const FINT l) +{ + return (l + 1) * (l + 2) / 2; +} + +FINT CINTlen_spinor(const FINT bas_id, const FINT *bas) +{ + if (0 == bas(KAPPA_OF, bas_id)) { + return 4 * bas(ANG_OF, bas_id) + 2; + } else if (bas(KAPPA_OF, bas_id) < 0) { + return 2 * bas(ANG_OF, bas_id) + 2; + } else { + return 2 * bas(ANG_OF, bas_id); + } +} + + +FINT CINTcgtos_cart(const FINT bas_id, const FINT *bas) +{ + FINT l = bas(ANG_OF, bas_id); + return (l+1)*(l+2)/2 * bas(NCTR_OF, bas_id); +} +FINT CINTcgto_cart(const FINT bas_id, const FINT *bas) +{ + FINT l = bas(ANG_OF, bas_id); + return (l+1)*(l+2)/2 * bas(NCTR_OF, bas_id); +} + + +FINT CINTcgtos_spheric(const FINT bas_id, const FINT *bas) +{ + return (bas(ANG_OF, bas_id) * 2 + 1) * bas(NCTR_OF, bas_id); +} +FINT CINTcgto_spheric(const FINT bas_id, const FINT *bas) +{ + return (bas(ANG_OF, bas_id) * 2 + 1) * bas(NCTR_OF, bas_id); +} + + +FINT CINTcgtos_spinor(const FINT bas_id, const FINT *bas) +{ + return CINTlen_spinor(bas_id, bas) * bas(NCTR_OF, bas_id); +} +FINT CINTcgto_spinor(const FINT bas_id, const FINT *bas) +{ + return CINTlen_spinor(bas_id, bas) * bas(NCTR_OF, bas_id); +} + + +FINT CINTtot_pgto_spheric(const FINT *bas, const FINT nbas) +{ + FINT i; + FINT s = 0; + + for (i = 0; i < nbas; i++) { + s += (bas(ANG_OF, i) * 2 + 1) + * bas(NPRIM_OF, i); + } + return s; +} + + +FINT CINTtot_pgto_spinor(const FINT *bas, const FINT nbas) +{ + FINT i; + FINT s = 0; + + for (i = 0; i < nbas; i++) { + s += CINTlen_spinor(i, bas) * bas(NPRIM_OF, i); + } + return s; +} + +#ifdef __cplusplus +static FINT tot_cgto_accum(FINT (*f)(...), const FINT *bas, const FINT nbas) +#else +static FINT tot_cgto_accum(FINT (*f)(), const FINT *bas, const FINT nbas) +#endif + +{ + FINT i; + FINT s = 0; + + for (i = 0; i < nbas; i++) { + s += (*f)(i, bas); + } + return s; +} + +/*FINT CINTtot_cgto_spheric(const FINT *bas, const FINT nbas) +{ + return tot_cgto_accum(&CINTcgto_spheric, bas, nbas); +} + + +FINT CINTtot_cgto_spinor(const FINT *bas, const FINT nbas) +{ + return tot_cgto_accum(&CINTcgto_spinor, bas, nbas); +} + + +FINT CINTtot_cgto_cart(const FINT *bas, const FINT nbas) +{ + return tot_cgto_accum(&CINTcgto_cart, bas, nbas); +}*/ + +#ifdef __cplusplus +static void shells_cgto_offset(FINT (*f)(...), FINT ao_loc[], const FINT *bas, const FINT nbas) +#else +static void shells_cgto_offset(FINT (*f)(), FINT ao_loc[], const FINT *bas, const FINT nbas) +#endif +{ + FINT i; + ao_loc[0] = 0; + for (i = 1; i < nbas; i++) { + ao_loc[i] = ao_loc[i-1] + (*f)(i-1, bas); + } +} + +/*void CINTshells_cart_offset(FINT ao_loc[], const FINT *bas, const FINT nbas) +{ + shells_cgto_offset(&CINTcgto_cart, ao_loc, bas, nbas); +} + + +void CINTshells_spheric_offset(FINT ao_loc[], const FINT *bas, const FINT nbas) +{ + shells_cgto_offset(&CINTcgto_spheric, ao_loc, bas, nbas); +} + + +void CINTshells_spinor_offset(FINT ao_loc[], const FINT *bas, const FINT nbas) +{ + shells_cgto_offset(&CINTcgto_spinor, ao_loc, bas, nbas); +}*/ + + +void CINTcart_comp(FINT *nx, FINT *ny, FINT *nz, const FINT lmax) +{ + FINT inc = 0; + FINT lx, ly, lz; + + for (lx = lmax; lx >= 0; lx--) { + for (ly = lmax - lx; ly >= 0; ly--) { + lz = lmax - lx - ly; + nx[inc] = lx; + ny[inc] = ly; + nz[inc] = lz; + inc++; + } + } +} + + + +#include +#include +#include +#include + +void CINTinit_int3c1e_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); + +void CINTg3c1e_ovlp(dtype *g, dtype ai, dtype aj, dtype ak, + CINTEnvVars *envs); +void CINTg3c1e_nuc(dtype *g, dtype ai, dtype aj, dtype ak, dtype *rijk, + dtype *cr, dtype t2, CINTEnvVars *envs); + +void CINTnabla1i_3c1e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, + const CINTEnvVars *envs); + +void CINTnabla1j_3c1e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, + const CINTEnvVars *envs); + +void CINTnabla1k_3c1e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, + const CINTEnvVars *envs); +void CINTx1i_3c1e(dtype *f, const dtype *g, const dtype *ri, + const FINT li, const FINT lj, const FINT lk, + const CINTEnvVars *envs); + +void CINTx1j_3c1e(dtype *f, const dtype *g, const dtype *rj, + const FINT li, const FINT lj, const FINT lk, + const CINTEnvVars *envs); + +void CINTx1k_3c1e(dtype *f, const dtype *g, const dtype *rk, + const FINT li, const FINT lj, const FINT lk, + const CINTEnvVars *envs); + +#define G3C1E_D_I(f, g, li, lj, lk) CINTnabla1i_3c1e(f, g, li, lj, lk, envs) +#define G3C1E_D_J(f, g, li, lj, lk) CINTnabla1j_3c1e(f, g, li, lj, lk, envs) +#define G3C1E_D_K(f, g, li, lj, lk) CINTnabla1k_3c1e(f, g, li, lj, lk, envs) + +#define G3C1E_R0I(f, g, li, lj, lk) CINTx1i_3c1e(f, g, ri, li, lj, lk, envs) +#define G3C1E_R0J(f, g, li, lj, lk) CINTx1j_3c1e(f, g, rj, li, lj, lk, envs) +#define G3C1E_R0K(f, g, li, lj, lk) CINTx1k_3c1e(f, g, rk, li, lj, lk, envs) + +#define G3C1E_RCI(f, g, li, lj, lk) CINTx1i_3c1e(f, g, dri, li, lj, lk, envs) +#define G3C1E_RCJ(f, g, li, lj, lk) CINTx1j_3c1e(f, g, drj, li, lj, lk, envs) +#define G3C1E_RCK(f, g, li, lj, lk) CINTx1k_3c1e(f, g, drk, li, lj, lk, envs) + +#define G3C1E_R_I(f, g, li, lj, lk) f = g + envs->g_stride_i +#define G3C1E_R_J(f, g, li, lj, lk) f = g + envs->g_stride_j +#define G3C1E_R_K(f, g, li, lj, lk) f = g + envs->g_stride_k + + +/*void CINTinit_2e_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env) +{ + + + CINTOpt *opt0 = (CINTOpt *)malloc(sizeof(CINTOpt)); + + opt0->index_xyz_array = NULL; + opt0->non0ctr = NULL; + opt0->sortedidx = NULL; + opt0->nbas = nbas; + opt0->log_max_coeff = NULL; + opt0->pairdata = NULL; + *opt = opt0; +}*/ +void CINTinit_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env) +{ + CINTinit_2e_optimizer(opt, atm, natm, bas, nbas, env); +} + +void CINTdel_2e_optimizer(CINTOpt **opt) +{ + CINTOpt *opt0 = *opt; + if (opt0 == NULL) { + return; + } + + if (opt0->index_xyz_array != NULL) { + //free(opt0->index_xyz_array[0]); + //free(opt0->index_xyz_array); + } + + if (opt0->non0ctr != NULL) { + //free(opt0->sortedidx[0]); + //free(opt0->sortedidx); + //free(opt0->non0ctr[0]); + //free(opt0->non0ctr); + } + + if (opt0->log_max_coeff != NULL) { + //free(opt0->log_max_coeff[0]); + //free(opt0->log_max_coeff); + } + + CINTdel_pairdata_optimizer(opt0); + + //free(opt0); + *opt = NULL; +} +void CINTdel_optimizer(CINTOpt **opt) +{ + CINTdel_2e_optimizer(opt); +} + +void CINTno_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env) +{ + *opt = NULL; +} + +static FINT _make_fakebas(FINT *fakebas, FINT *bas, FINT nbas, dtype *env) +{ + FINT i; + FINT max_l = 0; + for (i = 0; i < nbas; i++) { + max_l = MAX(max_l, bas(ANG_OF,i)); + } + + FINT fakenbas = max_l + 1; + for (i = 0; i < BAS_SLOTS*fakenbas; i++) { + fakebas[i] = 0; + } + + + for (i = 0; i <= max_l; i++) { + fakebas[BAS_SLOTS*i+ANG_OF] = i; + } + return max_l; +} +static FINT *_allocate_index_xyz(CINTOpt *opt, FINT max_l, FINT l_allow, FINT order) +{ + FINT i; + FINT cumcart = (l_allow+1) * (l_allow+2) * (l_allow+3) / 6; + size_t ll = max_l + 1; + size_t cc = cumcart; + for (i = 1; i < order; i++) { + ll *= LMAX1; + cc *= cumcart; + } + #ifdef __cplusplus + FINT *buf = new FINT[1000]; + FINT **ppbuf = new FINT*[ll]{new FINT[1000]}; + #else + FINT *buf = malloc(sizeof(FINT) * cc * 3); + FINT **ppbuf = malloc(sizeof(FINT*) * ll); + #endif + + ppbuf[0] = buf; + for (i = 1; i < ll; i++) { + ppbuf[i] = NULL; + } + opt->index_xyz_array = ppbuf; + return buf; +} +#ifdef __cplusplus +static void gen_idx(CINTOpt *opt, void (*finit)(...), void (*findex_xyz)(...), + FINT order, FINT l_allow, FINT *ng, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) +#else +static void gen_idx(CINTOpt *opt, void (*finit)(), void (*findex_xyz)(), + FINT order, FINT l_allow, FINT *ng, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) +#endif +{ + FINT i, j, k, l, ptr; + FINT fakebas[BAS_SLOTS*LMAX1]; + FINT max_l = _make_fakebas(fakebas, bas, nbas, env); + FINT fakenbas = max_l+1; + + l_allow = MIN(max_l, l_allow); + FINT *buf = _allocate_index_xyz(opt, max_l, l_allow, order); + + CINTEnvVars envs; + FINT shls[4] = {0,}; + if (order == 2) { + for (i = 0; i <= l_allow; i++) { + for (j = 0; j <= l_allow; j++) { + shls[0] = i; shls[1] = j; + (*finit)(&envs, ng, shls, atm, natm, fakebas, fakenbas, env); + ptr = i*LMAX1 + j; + opt->index_xyz_array[ptr] = buf; + (*findex_xyz)(buf, &envs); + buf += envs.nf * 3; + } } + + } else if (order == 3) { + for (i = 0; i <= l_allow; i++) { + for (j = 0; j <= l_allow; j++) { + for (k = 0; k <= l_allow; k++) { + shls[0] = i; shls[1] = j; shls[2] = k; + (*finit)(&envs, ng, shls, atm, natm, fakebas, fakenbas, env); + ptr = i*LMAX1*LMAX1 + j*LMAX1 + k; + opt->index_xyz_array[ptr] = buf; + (*findex_xyz)(buf, &envs); + buf += envs.nf * 3; + } } } + + } else { + for (i = 0; i <= l_allow; i++) { + for (j = 0; j <= l_allow; j++) { + for (k = 0; k <= l_allow; k++) { + for (l = 0; l <= l_allow; l++) { + shls[0] = i; shls[1] = j; shls[2] = k; shls[3] = l; + (*finit)(&envs, ng, shls, atm, natm, fakebas, fakenbas, env); + ptr = i*LMAX1*LMAX1*LMAX1 + + j*LMAX1*LMAX1 + + k*LMAX1 + + l; + opt->index_xyz_array[ptr] = buf; + (*findex_xyz)(buf, &envs); + buf += envs.nf * 3; + } } } } + } +} + +/*void CINTall_1e_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) +{ + CINTinit_2e_optimizer(opt, atm, natm, bas, nbas, env); + CINTOpt_set_log_maxc(*opt, atm, natm, bas, nbas, env); + CINTOpt_set_non0coeff(*opt, atm, natm, bas, nbas, env); + gen_idx(*opt, &CINTinit_int1e_EnvVars, &CINTg1e_index_xyz, + 2, ANG_MAX, ng, atm, natm, bas, nbas, env); +} + +void CINTall_2e_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) +{ + CINTinit_2e_optimizer(opt, atm, natm, bas, nbas, env); + CINTOpt_setij(*opt, ng, atm, natm, bas, nbas, env); + CINTOpt_set_non0coeff(*opt, atm, natm, bas, nbas, env); + gen_idx(*opt, &CINTinit_int2e_EnvVars, &CINTg2e_index_xyz, + 4, 6, ng, atm, natm, bas, nbas, env); +} + +void CINTall_3c2e_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) +{ + CINTinit_2e_optimizer(opt, atm, natm, bas, nbas, env); + CINTOpt_setij(*opt, ng, atm, natm, bas, nbas, env); + CINTOpt_set_non0coeff(*opt, atm, natm, bas, nbas, env); + gen_idx(*opt, &CINTinit_int3c2e_EnvVars, &CINTg2e_index_xyz, + 3, 12, ng, atm, natm, bas, nbas, env); +} + +void CINTall_2c2e_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) +{ + CINTinit_2e_optimizer(opt, atm, natm, bas, nbas, env); + CINTOpt_set_log_maxc(*opt, atm, natm, bas, nbas, env); + CINTOpt_set_non0coeff(*opt, atm, natm, bas, nbas, env); + gen_idx(*opt, &CINTinit_int2c2e_EnvVars, &CINTg1e_index_xyz, + 2, ANG_MAX, ng, atm, natm, bas, nbas, env); +} + +void CINTg3c1e_index_xyz(FINT *idx, const CINTEnvVars *envs); +void CINTall_3c1e_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) +{ + CINTinit_2e_optimizer(opt, atm, natm, bas, nbas, env); + CINTOpt_setij(*opt, ng, atm, natm, bas, nbas, env); + CINTOpt_set_non0coeff(*opt, atm, natm, bas, nbas, env); + gen_idx(*opt, &CINTinit_int3c1e_EnvVars, &CINTg3c1e_index_xyz, + 3, 12, ng, atm, natm, bas, nbas, env); +} + +void CINTall_1e_grids_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) +{ + CINTinit_2e_optimizer(opt, atm, natm, bas, nbas, env); + CINTOpt_set_log_maxc(*opt, atm, natm, bas, nbas, env); + CINTOpt_set_non0coeff(*opt, atm, natm, bas, nbas, env); + gen_idx(*opt, &CINTinit_int1e_grids_EnvVars, &CINTg1e_index_xyz, + 2, ANG_MAX, ng, atm, natm, bas, nbas, env); +}*/ + +#ifdef WITH_F12 +void CINTinit_int2e_stg_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env); +void CINTall_2e_stg_optimizer(CINTOpt **opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) +{ + CINTinit_2e_optimizer(opt, atm, natm, bas, nbas, env); + CINTOpt_setij(*opt, ng, atm, natm, bas, nbas, env); + CINTOpt_set_non0coeff(*opt, atm, natm, bas, nbas, env); + gen_idx(*opt, &CINTinit_int2e_stg_EnvVars, &CINTg2e_index_xyz, + 4, 6, ng, atm, natm, bas, nbas, env); +} +#endif + +void CINTOpt_log_max_pgto_coeff(dtype *log_maxc, dtype *coeff, FINT nprim, FINT nctr) +{ + FINT i, ip; + dtype maxc; + for (ip = 0; ip < nprim; ip++) { + maxc = 0; + for (i = 0; i < nctr; i++) { + maxc = MAX(maxc, fabs(coeff[i*nprim+ip])); + } + log_maxc[ip] = approx_log(maxc); + } +} + +/*void CINTOpt_set_log_maxc(CINTOpt *opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env) +{ + printf("ASD"); // this isn't caled? + return; + FINT i, iprim, ictr; + dtype *ci; + size_t tot_prim = 0; + for (i = 0; i < nbas; i++) { + tot_prim += bas(NPRIM_OF, i); + } + if (tot_prim == 0) { + return; + } + + #ifdef __cplusplus + opt->log_max_coeff = new dtype*[1024]; + dtype *plog_maxc = new dtype[1024]; + //opt->log_max_coeff = new dtype*[128]; + //dtype *plog_maxc = new dtype[128]; + #else + opt->log_max_coeff = malloc(sizeof(dtype *) * MAX(nbas, 1)); + dtype *plog_maxc = malloc(sizeof(dtype) * tot_prim); + #endif + + opt->log_max_coeff[0] = plog_maxc; + for (i = 0; i < nbas; i++) { + iprim = bas(NPRIM_OF, i); + ictr = bas(NCTR_OF, i); + ci = env + bas(PTR_COEFF, i); + opt->log_max_coeff[i] = plog_maxc; + CINTOpt_log_max_pgto_coeff(plog_maxc, ci, iprim, ictr); + plog_maxc += iprim; + } +}*/ + +FINT CINTset_pairdata(PairData *pairdata, dtype *ai, dtype *aj, dtype *ri, dtype *rj, + dtype *log_maxci, dtype *log_maxcj, + FINT li_ceil, FINT lj_ceil, FINT iprim, FINT jprim, + dtype rr_ij, dtype expcutoff, dtype *env) +{ + FINT ip, jp, n; + dtype aij, eij, cceij, wj; + + aij = ai[iprim-1] + aj[jprim-1]; + dtype log_rr_ij = 1.7 - 1.5 * approx_log(aij); + int lij = li_ceil + lj_ceil; + + //printf("before first if\n"); + + if (lij > 0) { + dtype dist_ij = sqrt(rr_ij); + dtype omega = env[PTR_RANGE_OMEGA]; + if (omega < 0) { + dtype r_guess = 8.; + dtype omega2 = omega * omega; + dtype theta = omega2 / (omega2 + aij); + log_rr_ij += lij * approx_log(dist_ij + theta*r_guess + 1.); + } else { + log_rr_ij += lij * approx_log(dist_ij + 1.); + } + } + PairData *pdata; + + FINT empty = 1; + //printf("before for loop %d %d\n", jprim, iprim); + for (n = 0, jp = 0; jp < jprim; jp++) { + for (ip = 0; ip < iprim; ip++, n++) { + aij = 1/(ai[ip] + aj[jp]); + eij = rr_ij * ai[ip] * aj[jp] * aij; + cceij = eij - log_rr_ij - log_maxci[ip] - log_maxcj[jp]; + pdata = pairdata + n; + pdata->cceij = cceij; + //printf("%f\n", cceij) ; + //printf("%f\n", expcutoff) ; + //printf("%f < %f \n", cceij, expcutoff); + if (cceij < (float)expcutoff) { + empty = 0; + wj = aj[jp] * aij; + pdata->rij[0] = ri[0] + wj * (rj[0]-ri[0]); + pdata->rij[1] = ri[1] + wj * (rj[1]-ri[1]); + pdata->rij[2] = ri[2] + wj * (rj[2]-ri[2]); + pdata->eij = exp(-eij); + } else { + pdata->rij[0] = 1e18; + pdata->rij[1] = 1e18; + pdata->rij[2] = 1e18; + pdata->eij = 0; + } + } + } + return empty; +} + +/*void CINTOpt_setij(CINTOpt *opt, FINT *ng, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) +{ + printf("---> CINTOpt_set_ij <--- \n"); + return; + FINT i, j, ip, jp; + FINT iprim, jprim, li, lj; + dtype *ai, *aj, *ri, *rj; + dtype expcutoff; + if (env[PTR_EXPCUTOFF] == 0) { + expcutoff = EXPCUTOFF; + } else { + expcutoff = MAX(MIN_EXPCUTOFF, env[PTR_EXPCUTOFF]); + } + + if (opt->log_max_coeff == NULL) { + CINTOpt_set_log_maxc(opt, atm, natm, bas, nbas, env); + } + dtype **log_max_coeff = opt->log_max_coeff; + dtype *log_maxci, *log_maxcj; + + size_t tot_prim = 0; + for (i = 0; i < nbas; i++) { + tot_prim += bas(NPRIM_OF, i); + } + if (tot_prim == 0 || tot_prim > MAX_PGTO_FOR_PAIRDATA) { + return; + } + #ifdef __cplusplus + opt->pairdata = new PairData*[128]; + PairData *pdata = new PairData[128]; + #else + opt->pairdata = malloc(sizeof(PairData *) * MAX(nbas * nbas, 1)); + PairData *pdata = malloc(sizeof(PairData) * tot_prim * tot_prim); + #endif + opt->pairdata[0] = pdata; + + FINT ijkl_inc; + if ((ng[IINC]+ng[JINC]) > (ng[KINC]+ng[LINC])) { + ijkl_inc = ng[IINC] + ng[JINC]; + } else { + ijkl_inc = ng[KINC] + ng[LINC]; + } + + FINT empty; + dtype rr; + PairData *pdata0; + for (i = 0; i < nbas; i++) { + ri = env + atm(PTR_COORD,bas(ATOM_OF,i)); + ai = env + bas(PTR_EXP,i); + iprim = bas(NPRIM_OF,i); + li = bas(ANG_OF,i); + log_maxci = log_max_coeff[i]; + + for (j = 0; j <= i; j++) { + rj = env + atm(PTR_COORD,bas(ATOM_OF,j)); + aj = env + bas(PTR_EXP,j); + jprim = bas(NPRIM_OF,j); + lj = bas(ANG_OF,j); + log_maxcj = log_max_coeff[j]; + rr = (ri[0]-rj[0])*(ri[0]-rj[0]) + + (ri[1]-rj[1])*(ri[1]-rj[1]) + + (ri[2]-rj[2])*(ri[2]-rj[2]); + + empty = CINTset_pairdata(pdata, ai, aj, ri, rj, log_maxci, log_maxcj, + li+ijkl_inc, lj, iprim, jprim, rr, expcutoff, env); + if (i == 0 && j == 0) { + opt->pairdata[0] = pdata; + pdata += iprim * jprim; + } else if (!empty) { + opt->pairdata[i*nbas+j] = pdata; + pdata += iprim * jprim; + if (i != j) { + opt->pairdata[j*nbas+i] = pdata; + pdata0 = opt->pairdata[i*nbas+j]; + + for (ip = 0; ip < iprim; ip++) { + for (jp = 0; jp < jprim; jp++, pdata++) { + memcpy(pdata, pdata0+jp*iprim+ip, + sizeof(PairData)); + } } + } + } else { + // ALEX: Warning + //opt->pairdata[i*nbas+j] = NOVALUE; + //opt->pairdata[j*nbas+i] = NOVALUE; + } + } + } +}*/ + +void CINTdel_pairdata_optimizer(CINTOpt *cintopt) +{ + if (cintopt != NULL && cintopt->pairdata != NULL) { + //free(cintopt->pairdata[0]); + //free(cintopt->pairdata); + cintopt->pairdata = NULL; + } +} + + +// start return +/*void CINTOpt_set_non0coeff(CINTOpt *opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env) +{ + return; + FINT i, iprim, ictr; + dtype *ci; + size_t tot_prim = 0; + size_t tot_prim_ctr = 0; + for (i = 0; i < nbas; i++) { + tot_prim += bas(NPRIM_OF, i); + tot_prim_ctr += bas(NPRIM_OF, i) * bas(NCTR_OF,i); + } + if (tot_prim == 0) { + return; + } + + #ifdef __cplusplus + opt->non0ctr = new FINT*[128]; + opt->sortedidx = new FINT*[128]; + FINT *pnon0ctr = new FINT[128]; + FINT *psortedidx = new FINT[128]; + #else + opt->non0ctr = malloc(sizeof(FINT *) * MAX(nbas, 1)); + opt->sortedidx = malloc(sizeof(FINT *) * MAX(nbas, 1)); + FINT *pnon0ctr = malloc(sizeof(FINT) * tot_prim); + FINT *psortedidx = malloc(sizeof(FINT) * tot_prim_ctr); + #endif + opt->non0ctr[0] = pnon0ctr; + opt->sortedidx[0] = psortedidx; + for (i = 0; i < nbas; i++) { + iprim = bas(NPRIM_OF, i); + ictr = bas(NCTR_OF, i); + ci = env + bas(PTR_COEFF, i); + opt->non0ctr[i] = pnon0ctr; + opt->sortedidx[i] = psortedidx; + CINTOpt_non0coeff_byshell(psortedidx, pnon0ctr, ci, iprim, ictr); + pnon0ctr += iprim; + psortedidx += iprim * ictr; + } +}*/ + + +#include +#include +#include + +void CINTrys_roots(int nroots, dtype x, dtype *u, dtype *w); +void CINTsr_rys_roots(int nroots, dtype x, dtype lower, dtype *u, dtype *w); +void CINTstg_roots(int nroots, dtype ta, dtype ua, dtype* rr, dtype* ww); +int CINTsr_rys_polyfits(int nroots, dtype x, dtype lower, dtype *u, dtype *w); + +int CINTrys_schmidt(int nroots, dtype x, dtype lower, dtype *roots, dtype *weights); +int CINTlrys_schmidt(int nroots, dtype x, dtype lower, dtype *roots, dtype *weights); +int CINTrys_laguerre(int n, dtype x, dtype lower, dtype *roots, dtype *weights); +int CINTlrys_laguerre(int n, dtype x, dtype lower, dtype *roots, dtype *weights) {return 0; }; +int CINTrys_jacobi(int n, dtype x, dtype lower, dtype *roots, dtype *weights){ return 0; } +int CINTlrys_jacobi(int n, dtype x, dtype lower, dtype *roots, dtype *weights){ return 0; } +#ifdef HAVE_QUADMATH_H +int CINTqrys_schmidt(int nroots, dtype x, dtype lower, dtype *roots, dtype *weights) {return 0; }; +int CINTqrys_laguerre(int n, dtype x, dtype lower, dtype *roots, dtype *weights){return 0;}; +int CINTqrys_jacobi(int n, dtype x, dtype lower, dtype *roots, dtype *weights){return 0; }; +#else +#define CINTqrys_schmidt CINTlrys_schmidt +#define CINTqrys_laguerre CINTlrys_laguerre +#define CINTqrys_jacobi CINTlrys_jacobi +#endif + +void gamma_inc_like(dtype *f, dtype t, int m){} +void lgamma_inc_like(dtype *f, dtype t, int m){} + + +void fmt_erfc_like(dtype *f, dtype t, dtype lower, int m){} +void fmt1_erfc_like(dtype *f, dtype t, dtype lower, int m); +void fmt_lerfc_like(dtype *f, dtype t, dtype lower, int m){} +void fmt1_lerfc_like(dtype *f, dtype t, dtype lower, int m); +#ifdef HAVE_QUADMATH_H +#define __float128 dtype +void qgamma_inc_like(__float128 *f, __float128 t, int m){} +void fmt_qerfc_like(__float128 *f, __float128 t, __float128 lower, int m){} +void fmt1_qerfc_like(__float128 *f, __float128 t, __float128 lower, int m); +#else +#define qgamma_inc_like lgamma_inc_like +#define fmt_qerfc_like fmt_lerfc_like +#define fmt1_qerfc_like fmt1_lerfc_like +#endif + +#define EXPCUTOFF_SR 40 + + +void CINTinit_int1e_EnvVars(CINTEnvVars *envs, + FINT *ng, FINT *shls, + FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env) { + // FIXME + envs->natm = natm; + envs->nbas = nbas; + envs->atm = atm; + envs->bas = bas; + envs->env = env; + envs->shls = shls; + + //const FINT i_sh = (const int)shls[0]; + //const FINT j_sh = (const int)shls[1]; + const FINT i_sh = shls[0]; + const FINT j_sh = shls[1]; + envs->i_l = bas(ANG_OF, i_sh); + envs->j_l = bas(ANG_OF, j_sh); + envs->x_ctr[0] = bas(NCTR_OF, i_sh); + envs->x_ctr[1] = bas(NCTR_OF, j_sh); + envs->nfi = (envs->i_l+1)*(envs->i_l+2)/2; + envs->nfj = (envs->j_l+1)*(envs->j_l+2)/2; + envs->nf = envs->nfi * envs->nfj; + envs->common_factor = 1; + if (env[PTR_EXPCUTOFF] == 0) { + envs->expcutoff = EXPCUTOFF; + } else { + envs->expcutoff = MAX(MIN_EXPCUTOFF, env[PTR_EXPCUTOFF]); + } + + envs->li_ceil = envs->i_l + ng[IINC]; + envs->lj_ceil = envs->j_l + ng[JINC]; + envs->ri = env + atm(PTR_COORD, bas(ATOM_OF, i_sh)); + envs->rj = env + atm(PTR_COORD, bas(ATOM_OF, j_sh)); + + envs->gbits = ng[GSHIFT]; + envs->ncomp_e1 = ng[POS_E1]; + envs->ncomp_tensor = ng[TENSOR]; + if (ng[SLOT_RYS_ROOTS] > 0) { + envs->nrys_roots = ng[SLOT_RYS_ROOTS]; + } else { + envs->nrys_roots = (envs->li_ceil + envs->lj_ceil)/2 + 1; + } + + FINT dli, dlj; + FINT ibase = envs->li_ceil > envs->lj_ceil; + if (ibase) { + dli = envs->li_ceil + envs->lj_ceil + 1; + dlj = envs->lj_ceil + 1; + envs->rirj[0] = envs->ri[0] - envs->rj[0]; + envs->rirj[1] = envs->ri[1] - envs->rj[1]; + envs->rirj[2] = envs->ri[2] - envs->rj[2]; + } else { + dli = envs->li_ceil + 1; + dlj = envs->li_ceil + envs->lj_ceil + 1; + envs->rirj[0] = envs->rj[0] - envs->ri[0]; + envs->rirj[1] = envs->rj[1] - envs->ri[1]; + envs->rirj[2] = envs->rj[2] - envs->ri[2]; + } + envs->g_stride_i = envs->nrys_roots; + envs->g_stride_j = envs->nrys_roots * dli; + envs->g_size = envs->nrys_roots * dli * dlj; + envs->g_stride_k = envs->g_size; + envs->g_stride_l = envs->g_size; + + /*assert(i_sh < SHLS_MAX); + assert(j_sh < SHLS_MAX); + assert(envs->i_l < ANG_MAX); + assert(envs->j_l < ANG_MAX); + assert(bas(ATOM_OF,i_sh) >= 0); + assert(bas(ATOM_OF,j_sh) >= 0); + assert(bas(ATOM_OF,i_sh) < natm); + assert(bas(ATOM_OF,j_sh) < natm); + assert(envs->nrys_roots < MXRYSROOTS);*/ +} + +void CINTg1e_index_xyz(FINT *idx, CINTEnvVars *envs) +{ + const FINT i_l = envs->i_l; + const FINT j_l = envs->j_l; + const FINT nfi = envs->nfi; + const FINT nfj = envs->nfj; + const FINT di = envs->g_stride_i; + const FINT dj = envs->g_stride_j; + FINT i, j, n; + FINT ofx, ofjx; + FINT ofy, ofjy; + FINT ofz, ofjz; + FINT i_nx[CART_MAX], i_ny[CART_MAX], i_nz[CART_MAX]; + FINT j_nx[CART_MAX], j_ny[CART_MAX], j_nz[CART_MAX]; + + CINTcart_comp(i_nx, i_ny, i_nz, i_l); + CINTcart_comp(j_nx, j_ny, j_nz, j_l); + + ofx = 0; + ofy = envs->g_size; + ofz = envs->g_size * 2; + n = 0; + for (j = 0; j < nfj; j++) { + ofjx = ofx + dj * j_nx[j]; + ofjy = ofy + dj * j_ny[j]; + ofjz = ofz + dj * j_nz[j]; + for (i = 0; i < nfi; i++) { + idx[n+0] = ofjx + di * i_nx[i]; + idx[n+1] = ofjy + di * i_ny[i]; + idx[n+2] = ofjz + di * i_nz[i]; + n += 3; + } + } +} + +FINT CINTg1e_ovlp(dtype *g, CINTEnvVars *envs) +{ + if (print) printf("ovlp\n"); + dtype *gx = g; + dtype *gy = g + envs->g_size; + dtype *gz = g + envs->g_size * 2; + dtype aij = envs->ai[0] + envs->aj[0]; + + gx[0] = 1; + gy[0] = 1; + gz[0] = envs->fac[0] * SQRTPI*M_PI / (aij * sqrt(aij)); + + FINT nmax = envs->li_ceil + envs->lj_ceil; + if (nmax == 0) { + return 1; + } + + dtype *rij = envs->rij; + dtype *rirj = envs->rirj; + FINT lj, di, dj; + FINT i, j, n, ptr; + dtype *rx; + if (envs->li_ceil > envs->lj_ceil) { + + lj = envs->lj_ceil; + di = envs->g_stride_i; + dj = envs->g_stride_j; + rx = envs->ri; + } else { + + lj = envs->li_ceil; + di = envs->g_stride_j; + dj = envs->g_stride_i; + rx = envs->rj; + } + dtype rijrx[3]; + rijrx[0] = rij[0] - rx[0]; + rijrx[1] = rij[1] - rx[1]; + rijrx[2] = rij[2] - rx[2]; + + gx[di] = rijrx[0] * gx[0]; + gy[di] = rijrx[1] * gy[0]; + gz[di] = rijrx[2] * gz[0]; + + dtype aij2 = .5 / aij; + for (i = 1; i < nmax; i++) { + gx[(i+1)*di] = i * aij2 * gx[(i-1)*di] + rijrx[0] * gx[i*di]; + gy[(i+1)*di] = i * aij2 * gy[(i-1)*di] + rijrx[1] * gy[i*di]; + gz[(i+1)*di] = i * aij2 * gz[(i-1)*di] + rijrx[2] * gz[i*di]; + } + + for (j = 1; j <= lj; j++) { + ptr = dj * j; + for (i = 0, n = ptr; i <= nmax-j; i++, n+=di) { + gx[n] = gx[n+di-dj] + rirj[0] * gx[n-dj]; + gy[n] = gy[n+di-dj] + rirj[1] * gy[n-dj]; + gz[n] = gz[n+di-dj] + rirj[2] * gz[n-dj]; + } + } + if (print) printf("end ovlp\n"); + return 1; +} + + +dtype CINTnuc_mod(dtype aij, FINT nuc_id, FINT *atm, dtype *env) +{ + dtype zeta; + if (nuc_id < 0) { + zeta = env[PTR_RINV_ZETA]; + } else if (atm(NUC_MOD_OF, nuc_id) == GAUSSIAN_NUC) { + zeta = env[atm(PTR_ZETA, nuc_id)]; + } else { + zeta = 0; + } + + if (zeta > 0) { + return sqrt(zeta / (aij + zeta)); + } else { + return 1; + } +} + +FINT CINTg1e_nuc(dtype *g, CINTEnvVars *envs, FINT nuc_id) +{ + FINT nrys_roots = envs->nrys_roots; + FINT *atm = envs->atm; + dtype *env = envs->env; + dtype *rij = envs->rij; + dtype *gx = g; + dtype *gy = g + envs->g_size; + dtype *gz = g + envs->g_size * 2; + dtype u[MXRYSROOTS]; + dtype *w = gz; + dtype *cr; + FINT i, j, n; + dtype crij[3]; + dtype x, fac1; + dtype aij = envs->ai[0] + envs->aj[0]; + dtype tau = CINTnuc_mod(aij, nuc_id, atm, env); + + if (nuc_id < 0) { + fac1 = 2*M_PI * envs->fac[0] * tau / aij; + cr = env + PTR_RINV_ORIG; + } else if (atm(NUC_MOD_OF, nuc_id) == FRAC_CHARGE_NUC) { + fac1 = 2*M_PI * -env[atm[PTR_FRAC_CHARGE+nuc_id*ATM_SLOTS]] * envs->fac[0] * tau / aij; + cr = env + atm(PTR_COORD, nuc_id); + } else { + fac1 = 2*M_PI * -fabs(atm[CHARGE_OF+nuc_id*ATM_SLOTS]) * envs->fac[0] * tau / aij; + cr = env + atm(PTR_COORD, nuc_id); + } + crij[0] = cr[0] - rij[0]; + crij[1] = cr[1] - rij[1]; + crij[2] = cr[2] - rij[2]; + x = aij * tau * tau * SQUARE(crij); + CINTrys_roots(nrys_roots, x, u, w); + + for (i = 0; i < nrys_roots; i++) { + gx[i] = 1; + gy[i] = 1; + gz[i] *= fac1; + } + FINT nmax = envs->li_ceil + envs->lj_ceil; + if (nmax == 0) { + return 1; + } + + dtype *p0x, *p0y, *p0z; + dtype *p1x, *p1y, *p1z; + dtype *p2x, *p2y, *p2z; + FINT lj, di, dj; + dtype *rx; + if (envs->li_ceil > envs->lj_ceil) { + + lj = envs->lj_ceil; + di = envs->g_stride_i; + dj = envs->g_stride_j; + rx = envs->ri; + } else { + + lj = envs->li_ceil; + di = envs->g_stride_j; + dj = envs->g_stride_i; + rx = envs->rj; + } + dtype rijrx = rij[0] - rx[0]; + dtype rijry = rij[1] - rx[1]; + dtype rijrz = rij[2] - rx[2]; + dtype aij2 = 0.5 / aij; + dtype ru, rt, r0, r1, r2; + + p0x = gx + di; + p0y = gy + di; + p0z = gz + di; + p1x = gx - di; + p1y = gy - di; + p1z = gz - di; + for (n = 0; n < nrys_roots; n++) { + ru = tau * tau * u[n] / (1 + u[n]); + rt = aij2 - aij2 * ru; + r0 = rijrx + ru * crij[0]; + r1 = rijry + ru * crij[1]; + r2 = rijrz + ru * crij[2]; + + p0x[n] = r0 * gx[n]; + p0y[n] = r1 * gy[n]; + p0z[n] = r2 * gz[n]; + for (i = 1; i < nmax; i++) { + p0x[n+i*di] = i * rt * p1x[n+i*di] + r0 * gx[n+i*di]; + p0y[n+i*di] = i * rt * p1y[n+i*di] + r1 * gy[n+i*di]; + p0z[n+i*di] = i * rt * p1z[n+i*di] + r2 * gz[n+i*di]; + } + } + + dtype rirjx = envs->rirj[0]; + dtype rirjy = envs->rirj[1]; + dtype rirjz = envs->rirj[2]; + for (j = 1; j <= lj; j++) { + p0x = gx + j * dj; + p0y = gy + j * dj; + p0z = gz + j * dj; + p1x = p0x - dj; + p1y = p0y - dj; + p1z = p0z - dj; + p2x = p1x + di; + p2y = p1y + di; + p2z = p1z + di; + for (i = 0; i <= nmax - j; i++) { + for (n = 0; n < nrys_roots; n++) { + p0x[n+i*di] = p2x[n+i*di] + rirjx * p1x[n+i*di]; + p0y[n+i*di] = p2y[n+i*di] + rirjy * p1y[n+i*di]; + p0z[n+i*di] = p2z[n+i*di] + rirjz * p1z[n+i*di]; + } } + } + return 1; +} + +void CINTnabla1i_1e(dtype *f, dtype *g, + FINT li, FINT lj, FINT lk, CINTEnvVars *envs) +{ + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + const dtype ai2 = -2 * envs->ai[0]; + FINT i, j, k, ptr; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (k = 0; k <= lk; k++) { + for (j = 0; j <= lj; j++) { + ptr = dj * j + dk * k; + + fx[ptr] = ai2 * gx[ptr+1]; + fy[ptr] = ai2 * gy[ptr+1]; + fz[ptr] = ai2 * gz[ptr+1]; + + for (i = 1; i <= li; i++) { + fx[ptr+i] = i * gx[ptr+i-1] + ai2 * gx[ptr+i+1]; + fy[ptr+i] = i * gy[ptr+i-1] + ai2 * gy[ptr+i+1]; + fz[ptr+i] = i * gz[ptr+i-1] + ai2 * gz[ptr+i+1]; + } + } } +} + +void CINTnabla1j_1e(dtype *f, dtype *g, + FINT li, FINT lj, FINT lk, CINTEnvVars *envs) { + if (print) printf("inside GINT1nable_1j_e1\n"); + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + const dtype aj2 = -2 * envs->aj[0]; + FINT i, j, k, ptr; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (k = 0; k <= lk; k++) { + ptr = dk * k; + + for (i = ptr; i <= ptr+li; i++) { + fx[i] = aj2 * gx[i+dj]; + fy[i] = aj2 * gy[i+dj]; + fz[i] = aj2 * gz[i+dj]; + } + + for (j = 1; j <= lj; j++) { + ptr = dj * j + dk * k; + for (i = ptr; i <= ptr+li; i++) { + fx[i] = j * gx[i-dj] + aj2 * gx[i+dj]; + fy[i] = j * gy[i-dj] + aj2 * gy[i+dj]; + fz[i] = j * gz[i-dj] + aj2 * gz[i+dj]; + } + } + } + if (print) printf("done nabla\n"); +} + + +void CINTnabla1k_1e(dtype *f, dtype *g, + FINT li, FINT lj, FINT lk, CINTEnvVars *envs) +{ + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + const dtype ak2 = -2 * envs->ak[0]; + FINT i, j, k, ptr; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (j = 0; j <= lj; j++) { + ptr = dj * j; + for (i = ptr; i <= ptr+li; i++) { + fx[i] = ak2 * gx[i+dk]; + fy[i] = ak2 * gy[i+dk]; + fz[i] = ak2 * gz[i+dk]; + } + } + for (k = 1; k <= lk; k++) { + for (j = 0; j <= lj; j++) { + ptr = dj * j + dk * k; + for (i = ptr; i <= ptr+li; i++) { + fx[i] = k * gx[i-dk] + ak2 * gx[i+dk]; + fy[i] = k * gy[i-dk] + ak2 * gy[i+dk]; + fz[i] = k * gz[i-dk] + ak2 * gz[i+dk]; + } + } + } +} + + +void CINTx1i_1e(dtype *f, dtype *g, dtype ri[3], + FINT li, FINT lj, FINT lk, CINTEnvVars *envs) +{ + FINT i, j, k, ptr; + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (k = 0; k <= lk; k++) { + for (j = 0; j <= lj; j++) { + ptr = dj * j + dk * k; + for (i = ptr; i <= ptr+li; i++) { + fx[i] = gx[i+1] + ri[0] * gx[i]; + fy[i] = gy[i+1] + ri[1] * gy[i]; + fz[i] = gz[i+1] + ri[2] * gz[i]; + } + } } +} + +void CINTx1j_1e(dtype *f, dtype *g, dtype rj[3], + FINT li, FINT lj, FINT lk, CINTEnvVars *envs) +{ + FINT i, j, k, ptr; + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (k = 0; k <= lk; k++) { + for (j = 0; j <= lj; j++) { + ptr = dj * j + dk * k; + for (i = ptr; i <= ptr+li; i++) { + fx[i] = gx[i+dj] + rj[0] * gx[i]; + fy[i] = gy[i+dj] + rj[1] * gy[i]; + fz[i] = gz[i+dj] + rj[2] * gz[i]; + } + } } +} + +void CINTx1k_1e(dtype *f, dtype *g, dtype *rk, + FINT li, FINT lj, FINT lk, CINTEnvVars *envs) +{ + FINT i, j, k, ptr; + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (k = 0; k <= lk; k++) { + for (j = 0; j <= lj; j++) { + ptr = dj * j + dk * k; + for (i = ptr; i <= ptr+li; i++) { + fx[i] = gx[i+dk] + rk[0] * gx[i]; + fy[i] = gy[i+dk] + rk[1] * gy[i]; + fz[i] = gz[i+dk] + rk[2] * gz[i]; + } + } } +} + + +void CINTprim_to_ctr(dtype *gc, FINT nf, dtype *gp, + FINT inc, FINT nprim, FINT nctr, dtype *coeff) +{ + FINT n, i, k; + dtype *pgc = gc; + dtype c; + + for (i = 0; i < inc; i++) { + + for (n = 0; n < nctr; n++) { + c = coeff[nprim*n]; + if (c != 0) { + for (k = 0; k < nf; k++) { + pgc[k] += c * gp[k*inc+i]; + } + } + + pgc += nf; + } + } +} + +void CINTprim_to_ctr_0(dtype *gc, dtype *gp, dtype *coeff, size_t nf, + FINT nprim, FINT nctr, FINT non0ctr, FINT *sortedidx) +{ + FINT i; + size_t n; + dtype c0; + + for (i = 0; i < nctr; i++) { + c0 = coeff[nprim* i]; + for (n = 0; n < nf; n++) { + gc[nf*i+n] = c0 * gp[n]; + } + } +} + +void CINTprim_to_ctr_1(dtype *gc, dtype *gp, dtype *coeff, size_t nf, + FINT nprim, FINT nctr, FINT non0ctr, FINT *sortedidx) +{ + FINT i, j; + size_t n; + dtype c0; + + for (i = 0; i < non0ctr; i++) { + c0 = coeff[nprim*sortedidx[i]]; + j = sortedidx[i]; + for (n = 0; n < nf; n++) { + gc[nf*j+n] += c0 * gp[n]; + } + } +} + + +dtype CINTcommon_fac_sp(FINT l) +{ + switch (l) { + case 0: return 0.282094791773878143; + case 1: return 0.488602511902919921; + default: return 1; + } +} + + +#include +#include + +#define PRIM2CTR0(ctrsymb, gp, ngp) \ + if (ctrsymb##_ctr > 1) {\ + if (*ctrsymb##empty) { \ + CINTprim_to_ctr_0(gctr##ctrsymb, gp, c##ctrsymb+ctrsymb##p, \ + ngp, ctrsymb##_prim, ctrsymb##_ctr, \ + non0ctr##ctrsymb[ctrsymb##p], \ + non0idx##ctrsymb+ctrsymb##p*ctrsymb##_ctr); \ + } else { \ + CINTprim_to_ctr_1(gctr##ctrsymb, gp, c##ctrsymb+ctrsymb##p, \ + ngp, ctrsymb##_prim, ctrsymb##_ctr, \ + non0ctr##ctrsymb[ctrsymb##p], \ + non0idx##ctrsymb+ctrsymb##p*ctrsymb##_ctr); \ + } \ + } \ + *ctrsymb##empty = 0 + + + + + + + + + + + + + + + + +ALL_CINT(int1e_ovlp); +ALL_CINT(int1e_nuc); +ALL_CINT_FORTRAN_(int1e_ovlp); +ALL_CINT_FORTRAN_(int1e_nuc); + + +#include +//#include + +#define OF_CMPLX 2 + +void CINTdset0(FINT n, dtype *x) +{ + FINT i; + for (i = 0; i < n; i++) { + x[i] = 0; + } +} + + +void CINTdaxpy2v(FINT n, dtype a, dtype *x, dtype *y, dtype *v) +{ + + + FINT i; + for (i = 0; i < n; i++) { + v[i] = a * x[i] + y[i]; + } +} + + +void CINTdmat_transpose(dtype *a_t, dtype *a, FINT m, FINT n) +{ + FINT i, j, k; + + for (j = 0; j < n-3; j+=4) { +//#pragma GCC ivdep + + for (i = 0; i < m; i++) { + a_t[(j+0)*m+i] = a[i*n+j+0]; + a_t[(j+1)*m+i] = a[i*n+j+1]; + a_t[(j+2)*m+i] = a[i*n+j+2]; + a_t[(j+3)*m+i] = a[i*n+j+3]; + } + } + + //printf("n-j: %d\n", n-j); + + switch (n-j) { + case 1: + //#pragma GCC ivdep + for (i = 0; i < m; i++) { + a_t[j*m+i] = a[i*n+j]; + } + break; + case 2: + //#pragma GCC ivdep + for (i = 0; i < m; i++) { + a_t[(j+0)*m+i] = a[i*n+j+0]; + a_t[(j+1)*m+i] = a[i*n+j+1]; + } + break; + case 3: + //#pragma GCC ivdep + for (i = 0; i < m; i++) { + a_t[(j+0)*m+i] = a[i*n+j+0]; + a_t[(j+1)*m+i] = a[i*n+j+1]; + a_t[(j+2)*m+i] = a[i*n+j+2]; + } + break; + } +} + + +void CINTdplus_transpose(dtype *a_t, dtype *a, FINT m, FINT n) +{ + FINT i, j, k; + + for (j = 0; j < n-3; j+=4) { +#pragma GCC ivdep + for (i = 0; i < m; i++) { + a_t[(j+0)*m+i] += a[i*n+j+0]; + a_t[(j+1)*m+i] += a[i*n+j+1]; + a_t[(j+2)*m+i] += a[i*n+j+2]; + a_t[(j+3)*m+i] += a[i*n+j+3]; + } + } + + switch (n-j) { + case 1: +#pragma GCC ivdep + for (i = 0; i < m; i++) { + a_t[j*m+i] += a[i*n+j]; + } + break; + case 2: +#pragma GCC ivdep + for (i = 0; i < m; i++) { + a_t[(j+0)*m+i] += a[i*n+j+0]; + a_t[(j+1)*m+i] += a[i*n+j+1]; + } + break; + case 3: +#pragma GCC ivdep + for (i = 0; i < m; i++) { + a_t[(j+0)*m+i] += a[i*n+j+0]; + a_t[(j+1)*m+i] += a[i*n+j+1]; + a_t[(j+2)*m+i] += a[i*n+j+2]; + } + break; + } +} + + +void CINTzmat_transpose(dtype *a_t, dtype *a, FINT m, FINT n) +{ + FINT i, j; + + switch (n) { + case 2: + for (i = 0; i < m; i++) { + a_t[i ] = a[2*i+0]; + a_t[i+m] = a[2*i+1]; + } + break; + default: + switch (m) { + case 2: for (i = 0; i < n; i++) { + a_t[2*i+0] = a[i ]; + a_t[2*i+1] = a[i+n]; + } + break; + default: + for (i = 0; i < n; i++) { + for (j = 0; j < m; j++) { + a_t[i*m+j] = a[j*n+i]; + } + } + } + } +} + + +void CINTdgemm_NN1(FINT m, FINT n, FINT k, + dtype *a, dtype *b, dtype *c, FINT ldc) +{ + FINT i, j, kp; + dtype bi; + for (j = 0; j < n; j++) { + for (i = 0; i < m; i++) { + c[i+ldc*j] = 0; + } + for (kp = 0; kp < k; kp++) { + bi = b[kp+k*j]; +#pragma GCC ivdep + for (i = 0; i < m; i++) { + c[i+ldc*j] += a[i+m*kp] * bi; + } + } + } +} + +void CINTdgemm_NN(FINT m, FINT n, FINT k, + dtype *a, dtype *b, dtype *c) +{ + CINTdgemm_NN1(m, n, k, a, b, c, m); +} + +void CINTdgemm_TN(FINT m, FINT n, FINT k, + dtype *a, dtype *b, dtype *c) +{ + FINT i, j, kp; + dtype ci; + for (j = 0; j < n; j++) { + for (i = 0; i < m; i++) { + ci = 0; +#pragma GCC ivdep + for (kp = 0; kp < k; kp++) { + ci += a[kp+k*i] * b[kp+k*j]; + } + c[i+m*j] = ci; + } + } +} + +void CINTdgemm_NT(FINT m, FINT n, FINT k, + dtype *a, dtype *b, dtype *c) +{ + FINT i, j, kp; + dtype bi; + for (j = 0; j < n; j++) { + for (i = 0; i < m; i++) { + c[i+m*j] = 0; + } + for (kp = 0; kp < k; kp++) { + bi = b[j+n*kp]; +#pragma GCC ivdep + for (i = 0; i < m; i++) { + c[i+m*j] += a[i+m*kp] * bi; + } + } + } +} + + +#include +//#include + + + +dtype CINTsquare_dist(const dtype *r1, const dtype *r2) +{ + dtype r12[3]; + + r12[0] = r1[0] - r2[0]; + r12[1] = r1[1] - r2[1]; + r12[2] = r1[2] - r2[2]; + + return r12[0] * r12[0] + r12[1] * r12[1] + r12[2] * r12[2]; +} + +/*static dtype _gaussian_int(FINT n, dtype alpha) +{ + dtype n1 = (n + 1) * .5; + return exp(lgamma(n1)) / (2. * pow(alpha, n1)); +} + +dtype CINTgto_norm(FINT n, dtype a) +{ + + return 1. / sqrt(_gaussian_int(n*2+2, 2*a)); +} +dtype CINTgto_norm_(FINT *n, dtype *a) +{ + return CINTgto_norm(*n, *a); +}*/ + + +#include +//#include + +static dtype g_trans_cart2sph[] = { + 1, + +#ifdef PYPZPX + + 0, 1, 0, 0, 0, 1, 1, 0, 0, +#else +1, 0, 0, 0, 1, 0, 0, 0, 1, +#endif + 0, 1.092548430592079070, 0, 0, 0, 0, 0, 0, 0, 0, 1.092548430592079070, 0, -0.315391565252520002, 0, 0, -0.315391565252520002, 0, 0.630783130505040012, 0, + 0, 1.092548430592079070, 0, 0, 0, 0.546274215296039535, 0, 0, -0.546274215296039535, 0, 0, 0, 1.770130769779930531, + 0, 0, 0, 0, -0.590043589926643510, 0, 0, 0, 0, 0, 0, 0, 2.890611442640554055, 0, + 0, 0, 0, 0, 0, -0.457045799464465739, 0, 0, 0, 0, -0.457045799464465739, 0, 1.828183197857862944, 0, + 0, 0, -1.119528997770346170, 0, 0, 0, 0, -1.119528997770346170, 0, 0.746352665180230782, -0.457045799464465739, 0, 0, + -0.457045799464465739, 0, 1.828183197857862944, 0, 0, 0, 0, 0, 0, 1.445305721320277020, 0, 0, 0, 0, -1.445305721320277020, + 0, 0, 0.590043589926643510, 0, 0, -1.770130769779930530, 0, 0, 0, 0, + 0, 0, 0, 2.503342941796704538, 0, 0, 0, 0, -2.503342941796704530, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.310392309339791593, 0, 0, 0, 0, 0, 0, -1.770130769779930530, 0, 0, 0, 0, -0.946174695757560014, 0, 0, 0, 0, -0.946174695757560014, 0, 5.677048174545360108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.007139630671867500, 0, 0, 0, 0, 0, 0, -2.007139630671867500, 0, 2.676186174229156671, 0, 0.317356640745612911, 0, 0, + 0.634713281491225822, 0, -2.538853125964903290, 0, 0, 0, 0, 0.317356640745612911, 0, -2.538853125964903290, 0, 0.846284375321634430, 0, 0, -2.007139630671867500, 0, 0, 0, 0, -2.007139630671867500, 0, 2.676186174229156671, 0, 0, 0, 0, 0, -0.473087347878780002, 0, 0, 0, 0, 2.838524087272680054, 0, 0, 0, 0, 0.473087347878780009, 0, -2.838524087272680050, 0, 0, 0, 0, 1.770130769779930531, 0, 0, 0, 0, -5.310392309339791590, 0, 0, 0, 0, 0, 0, 0, 0.625835735449176134, + 0, 0, -3.755014412695056800, 0, 0, 0, 0, 0, 0, 0.625835735449176134, 0, 0, 0, 0, 0, 3.281910284200850514, 0, 0, 0, 0, -6.563820568401701020, 0, 0, 0, 0, 0, 0, 0, 0, 0.656382056840170102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.302649259524165115, 0, 0, 0, 0, 0, 0, -8.302649259524165110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.467714898305751160, 0, 0, 0, 0, -0.978476598870500779, 0, 11.741719186446009300, 0, 0, 0, 0, 0, 0, 0.489238299435250387, 0, -3.913906395482003100, 0, 0, 0, 0, 0, 0, 0, -4.793536784973323750, 0, 0, 0, 0, 0, 0, -4.793536784973323750, 0, 9.587073569946647510, 0, 0, 0, 0, 0, 0, 0, 0, 0.452946651195696921, 0, 0, 0, 0, 0.905893302391393842, 0, -5.435359814348363050, 0, 0, 0, 0, 0, 0, 0.452946651195696921, 0, -5.435359814348363050, 0, 3.623573209565575370, 0, 0, 0, 1.754254836801353946, 0, 0, 0, 0, 3.508509673602707893, 0, -4.678012898136943850, 0, 0, 0, 0, 0, 0, 1.754254836801353946, 0, -4.678012898136943850, 0, 0.935602579627388771, 0.452946651195696921, 0, 0, 0.905893302391393842, 0, -5.435359814348363050, 0, 0, 0, 0, 0.452946651195696921, 0, -5.435359814348363050, 0, 3.623573209565575370, 0, 0, 0, 0, 0, 0, 0, 0, -2.396768392486661870, 0, 0, 0, 0, 0, 0, 4.793536784973323755, 0, 0, 0, 0, 0, 0, 2.396768392486661877, 0, -4.793536784973323750, 0, 0, -0.489238299435250389, 0, 0, 0.978476598870500775, 0, 3.913906395482003101, 0, 0, 0, 0, 1.467714898305751163, 0, -11.741719186446009300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.075662314881041278, 0, 0, 0, 0, -12.453973889286247600, 0, 0, 0, 0, 0, 0, 0, 0, 2.075662314881041278, 0, 0, 0, 0, 0.656382056840170102, 0, 0, -6.563820568401701020, 0, 0, 0, 0, 0, 0, 3.281910284200850514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4.0991046311514863, 0, 0, 0, 0, -13.6636821038382887, 0, 0, 0, 0, 0, 0, 0, 0, 4.0991046311514863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 11.8330958111587634, 0, 0, 0, 0, 0, 0, -23.6661916223175268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.3666191622317525, 0, 0, 0, 0, 0, + + 0, -2.0182596029148963, 0, 0, 0, 0, 0, 0, 20.1825960291489679, 0, 0, 0, 0, 0, 0, 2.0182596029148963, 0, -20.1825960291489679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -8.2908473356343109, 0, 0, 0, 0, 0, 0, -5.5272315570895412, 0, 22.1089262283581647, 0, 0, 0, 0, 0, 0, 0, 0, 2.7636157785447706, 0, -7.3696420761193888, 0, 0, 0, + + 0, 0.9212052595149236, 0, 0, 0, 0, 1.8424105190298472, 0, -14.7392841522387776, 0, 0, 0, 0, 0, 0, 0.9212052595149236, 0, -14.7392841522387776, 0, 14.7392841522387776, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 2.9131068125936568, 0, 0, 0, 0, 0, 0, 5.8262136251873136, 0, -11.6524272503746271, 0, 0, 0, 0, 0, 0, 0, 0, 2.9131068125936568, 0, -11.6524272503746271, 0, 4.6609709001498505, 0, + + -0.3178460113381421, 0, 0, -0.9535380340144264, 0, 5.7212282040865583, 0, 0, 0, 0, -0.9535380340144264, 0, 11.4424564081731166, 0, -7.6283042721154111, 0, 0, 0, 0, 0, 0, -0.3178460113381421, 0, 5.7212282040865583, 0, -7.6283042721154111, 0, 1.0171072362820548, + + 0, 0, 2.9131068125936568, 0, 0, 0, 0, 5.8262136251873136, 0, -11.6524272503746271, 0, 0, 0, 0, 0, 0, 2.9131068125936568, 0, -11.6524272503746271, 0, 4.6609709001498505, 0, 0, 0, 0, 0, 0, 0, + + 0.4606026297574618, 0, 0, 0.4606026297574618, 0, -7.3696420761193888, 0, 0, 0, 0, -0.4606026297574618, 0, 0, 0, 7.3696420761193888, 0, 0, 0, 0, 0, 0, -0.4606026297574618, 0, 7.3696420761193888, 0, -7.3696420761193888, 0, 0, + + 0, 0, -2.7636157785447706, 0, 0, 0, 0, 5.5272315570895412, 0, 7.3696420761193888, 0, 0, 0, 0, 0, 0, 8.2908473356343109, 0, -22.1089262283581647, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.5045649007287241, 0, 0, 2.5228245036436201, 0, 5.0456490072872420, 0, 0, 0, 0, 2.5228245036436201, 0, -30.2738940437234518, 0, 0, 0, 0, 0, 0, 0, 0, -0.5045649007287241, 0, 5.0456490072872420, 0, 0, 0, 0, + + 0, 0, 2.3666191622317525, 0, 0, 0, 0, -23.6661916223175268, 0, 0, 0, 0, 0, 0, 0, 0, 11.8330958111587634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.6831841051919144, 0, 0, -10.2477615778787161, 0, 0, 0, 0, 0, 0, 10.2477615778787161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.6831841051919144, 0, 0, 0, 0, 0, 0, + + 0, 4.9501391276721742, 0, 0, 0, 0, -24.7506956383608703, 0, 0, 0, 0, 0, 0, 0, 0, 14.8504173830165218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.7071627325245963, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 15.8757639708114002, 0, 0, 0, 0, 0, 0, -52.9192132360380043, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15.8757639708114002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -2.5945778936013020, 0, 0, 0, 0, 2.5945778936013020, 0, 31.1349347232156219, 0, 0, 0, 0, 0, 0, 4.6702402084823440, 0, -62.2698694464312439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.5189155787202604, 0, 6.2269869446431247, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -12.4539738892862495, 0, 0, 0, 0, 0, 0, 0, 0, 41.5132462976208316, 0, 0, 0, 0, 0, 0, 0, 0, 12.4539738892862495, 0, -41.5132462976208316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.4081304047606462, 0, 0, 0, 0, 2.3468840079344107, 0, -28.1626080952129243, 0, 0, 0, 0, 0, 0, 0.4693768015868821, 0, -18.7750720634752817, 0, 37.5501441269505705, 0, 0, 0, 0, 0, 0, 0, 0, -0.4693768015868821, 0, 9.3875360317376408, 0, -12.5167147089835229, 0, 0, 0, + + 0, 0, 0, 0, 6.6379903866747414, 0, 0, 0, 0, 0, 0, 13.2759807733494828, 0, -35.4026153955986160, 0, 0, 0, 0, 0, 0, 0, 0, 6.6379903866747414, 0, -35.4026153955986160, 0, 21.2415692373591725, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.4516580379125866, 0, 0, 0, 0, -1.3549741137377600, 0, 10.8397929099020782, 0, 0, 0, 0, 0, 0, -1.3549741137377600, 0, 21.6795858198041564, 0, -21.6795858198041564, 0, 0, 0, 0, 0, 0, 0, 0, -0.4516580379125866, 0, 10.8397929099020782, 0, -21.6795858198041564, 0, 5.7812228852811094, 0, + + 0, 0, -2.3899496919201728, 0, 0, 0, 0, -7.1698490757605189, 0, 14.3396981515210360, 0, 0, 0, 0, 0, 0, -7.1698490757605189, 0, 28.6793963030420720, 0, -11.4717585212168292, 0, 0, 0, 0, 0, 0, 0, 0, -2.3899496919201728, 0, 14.3396981515210360, 0, -11.4717585212168292, 0, 1.0925484305920790, + + -0.4516580379125866, 0, 0, -1.3549741137377600, 0, 10.8397929099020782, 0, 0, 0, 0, -1.3549741137377600, 0, 21.6795858198041564, 0, -21.6795858198041564, 0, 0, 0, 0, 0, 0, -0.4516580379125866, 0, 10.8397929099020782, 0, -21.6795858198041564, 0, 5.7812228852811094, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 3.3189951933373707, 0, 0, 0, 0, 3.3189951933373707, 0, -17.7013076977993080, 0, 0, 0, 0, 0, 0, -3.3189951933373707, 0, 0, 0, 10.6207846186795862, 0, 0, 0, 0, 0, 0, 0, 0, -3.3189951933373707, 0, 17.7013076977993080, 0, -10.6207846186795862, 0, 0, + + 0.4693768015868821, 0, 0, -0.4693768015868821, 0, -9.3875360317376408, 0, 0, 0, 0, -2.3468840079344107, 0, 18.7750720634752817, 0, 12.5167147089835229, 0, 0, 0, 0, 0, 0, -1.4081304047606462, 0, 28.1626080952129243, 0, -37.5501441269505705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -3.1134934723215624, 0, 0, 0, 0, 15.5674673616078110, 0, 10.3783115744052079, 0, 0, 0, 0, 0, 0, 15.5674673616078110, 0, -62.2698694464312439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.1134934723215624, 0, 10.3783115744052079, 0, 0, 0, 0, + + -0.5189155787202604, 0, 0, 4.6702402084823440, 0, 6.2269869446431247, 0, 0, 0, 0, 2.5945778936013020, 0, -62.2698694464312439, 0, 0, 0, 0, 0, 0, 0, 0, -2.5945778936013020, 0, 31.1349347232156219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.6459606618019000, 0, 0, 0, 0, -39.6894099270284997, 0, 0, 0, 0, 0, 0, 0, 0, 39.6894099270284997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.6459606618019000, 0, 0, 0, 0, 0, 0, + + 0.7071627325245963, 0, 0, -14.8504173830165218, 0, 0, 0, 0, 0, 0, 24.7506956383608703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.9501391276721742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 5.83141328139864, 0, 0, 0, 0, -40.81989296979048, 0, 0, 0, 0, 0, 0, 0, 0, 40.81989296979048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.83141328139864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20.40994648489524, 0, 0, 0, 0, 0, 0, -102.0497324244762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61.22983945468572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.91570664069932, 0, 0, 0, 0, 0, 0, 0, + 0, -3.193996596357255, 0, 0, 0, 0, 7.452658724833595, 0, 44.71595234900157, 0, 0, 0, 0, 0, 0, 7.452658724833595, 0, -149.0531744966719, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.193996596357255, 0, 44.71595234900157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17.24955311049054, 0, 0, 0, 0, 0, 0, 17.24955311049054, 0, 68.99821244196217, 0, 0, 0, 0, 0, 0, 0, 0, 31.04919559888297, 0, -137.9964248839243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.449910622098108, 0, 13.79964248839243, 0, 0, 0, 0, 0, + 0, 1.913666099037323, 0, 0, 0, 0, 1.913666099037323, 0, -45.92798637689575, 0, 0, 0, 0, 0, 0, -1.913666099037323, 0, 0, 0, 76.54664396149292, 0, 0, 0, 0, 0, 0, 0, 0, -1.913666099037323, 0, 45.92798637689575, 0, -76.54664396149292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 11.1173953976599, 0, 0, 0, 0, 0, 0, 18.52899232943316, 0, -74.11596931773265, 0, 0, 0, 0, 0, 0, 0, 0, 3.705798465886632, 0, -49.41064621182176, 0, 59.29277545418611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.705798465886632, 0, 24.70532310591088, 0, -19.7642584847287, 0, 0, 0, + 0, -0.9123045168698189, 0, 0, 0, 0, -2.736913550609457, 0, 27.36913550609457, 0, 0, 0, 0, 0, 0, -2.736913550609457, 0, 54.73827101218914, 0, -72.98436134958553, 0, 0, 0, 0, 0, 0, 0, 0, -0.9123045168698189, 0, 27.36913550609457, 0, -72.98436134958553, 0, 29.19374453983421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3.8164436064573, 0, 0, 0, 0, 0, 0, -11.4493308193719, 0, 30.5315488516584, 0, 0, 0, 0, 0, 0, 0, 0, -11.4493308193719, 0, 61.06309770331679, 0, -36.63785862199007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.8164436064573, 0, 30.5315488516584, 0, -36.63785862199007, 0, 6.978639737521918, 0, + 0.3180369672047749, 0, 0, 1.272147868819099, 0, -10.1771829505528, 0, 0, 0, 0, 1.908221803228649, 0, -30.53154885165839, 0, 30.53154885165839, 0, 0, 0, 0, 0, 0, 1.272147868819099, 0, -30.53154885165839, 0, 61.06309770331677, 0, -16.28349272088447, 0, 0, 0, 0, 0, 0, 0, 0, 0.3180369672047749, 0, -10.1771829505528, 0, 30.53154885165839, 0, -16.28349272088447, 0, 1.16310662292032, + 0, 0, -3.8164436064573, 0, 0, 0, 0, -11.4493308193719, 0, 30.5315488516584, 0, 0, 0, 0, 0, 0, -11.4493308193719, 0, 61.06309770331679, 0, -36.63785862199007, 0, 0, 0, 0, 0, 0, 0, 0, -3.8164436064573, 0, 30.5315488516584, 0, -36.63785862199007, 0, 6.978639737521918, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.4561522584349095, 0, 0, -0.9123045168698189, 0, 13.68456775304729, 0, 0, 0, 0, 0, 0, 13.68456775304729, 0, -36.49218067479276, 0, 0, 0, 0, 0, 0, 0.9123045168698189, 0, -13.68456775304729, 0, 0, 0, 14.5968722699171, 0, 0, 0, 0, 0, 0, 0, 0, 0.4561522584349095, 0, -13.68456775304729, 0, 36.49218067479276, 0, -14.5968722699171, 0, 0, + 0, 0, 3.705798465886632, 0, 0, 0, 0, -3.705798465886632, 0, -24.70532310591088, 0, 0, 0, 0, 0, 0, -18.52899232943316, 0, 49.41064621182176, 0, 19.7642584847287, 0, 0, 0, 0, 0, 0, 0, 0, -11.1173953976599, 0, 74.11596931773265, 0, -59.29277545418611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.4784165247593308, 0, 0, -1.913666099037323, 0, -11.48199659422394, 0, 0, 0, 0, -4.784165247593307, 0, 57.40998297111968, 0, 19.13666099037323, 0, 0, 0, 0, 0, 0, -1.913666099037323, 0, 57.40998297111968, 0, -114.8199659422394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4784165247593308, 0, -11.48199659422394, 0, 19.13666099037323, 0, 0, 0, 0, + 0, 0, -3.449910622098108, 0, 0, 0, 0, 31.04919559888297, 0, 13.79964248839243, 0, 0, 0, 0, 0, 0, 17.24955311049054, 0, -137.9964248839243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.24955311049054, 0, 68.99821244196217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.5323327660595425, 0, 0, 7.452658724833595, 0, 7.452658724833595, 0, 0, 0, 0, 0, 0, -111.7898808725039, 0, 0, 0, 0, 0, 0, 0, 0, -7.452658724833595, 0, 111.7898808725039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5323327660595425, 0, -7.452658724833595, 0, 0, 0, 0, 0, 0, + 0, 0, 2.91570664069932, 0, 0, 0, 0, -61.22983945468572, 0, 0, 0, 0, 0, 0, 0, 0, 102.0497324244762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -20.40994648489524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.72892666017483, 0, 0, -20.40994648489524, 0, 0, 0, 0, 0, 0, 51.0248662122381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -20.40994648489524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.72892666017483, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 6.740108566678694, 0, 0, 0, 0, -62.9076799556678, 0, 0, 0, 0, 0, 0, 0, 0, 94.36151993350171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26.96043426671477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.7489009518531882, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25.41854119163758, 0, 0, 0, 0, 0, 0, -177.9297883414631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177.9297883414631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -25.41854119163758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3.814338369408373, 0, 0, 0, 0, 15.25735347763349, 0, 61.02941391053396, 0, 0, 0, 0, 0, 0, 7.628676738816745, 0, -305.1470695526698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.89810962688107, 0, 183.0882417316019, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5449054813440533, 0, -8.718487701504852, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22.65129549625621, 0, 0, 0, 0, 0, 0, 52.85302282459782, 0, 105.7060456491956, 0, 0, 0, 0, 0, 0, 0, 0, 52.85302282459782, 0, -352.3534854973187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22.65129549625621, 0, 105.7060456491956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2.436891395195093, 0, 0, 0, 0, 0, 0, -68.23295906546261, 0, 0, 0, 0, 0, 0, -6.82329590654626, 0, 68.23295906546261, 0, 136.4659181309252, 0, 0, 0, 0, 0, 0, 0, 0, -3.899026232312149, 0, 122.8193263178327, 0, -272.9318362618504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4873782790390186, 0, -13.64659181309252, 0, 27.29318362618504, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 16.31079695491669, 0, 0, 0, 0, 0, 0, 16.31079695491669, 0, -130.4863756393335, 0, 0, 0, 0, 0, 0, 0, 0, -16.31079695491669, 0, 0, 0, 130.4863756393335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16.31079695491669, 0, 130.4863756393335, 0, -130.4863756393335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1.385125560048583, 0, 0, 0, 0, -3.693668160129556, 0, 49.864520161749, 0, 0, 0, 0, 0, 0, -2.770251120097167, 0, 83.107533602915, 0, -166.21506720583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16.621506720583, 0, -110.8100448038867, 0, 88.64803584310934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4617085200161945, 0, -16.621506720583, 0, 55.40502240194333, 0, -29.54934528103645, 0, 0, 0, + 0, 0, 0, 0, -8.46325696792098, 0, 0, 0, 0, 0, 0, -25.38977090376294, 0, 84.63256967920979, 0, 0, 0, 0, 0, 0, 0, 0, -25.38977090376294, 0, 169.2651393584196, 0, -135.4121114867357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.46325696792098, 0, 84.63256967920979, 0, -135.4121114867357, 0, 38.68917471049591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.451093112065591, 0, 0, 0, 0, 1.804372448262364, 0, -18.04372448262364, 0, 0, 0, 0, 0, 0, 2.706558672393546, 0, -54.13117344787092, 0, 72.17489793049457, 0, 0, 0, 0, 0, 0, 0, 0, 1.804372448262364, 0, -54.13117344787092, 0, 144.3497958609891, 0, -57.73991834439565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.451093112065591, 0, -18.04372448262364, 0, 72.17489793049457, 0, -57.73991834439565, 0, 8.248559763485094, 0, + 0, 0, 3.026024588281776, 0, 0, 0, 0, 12.1040983531271, 0, -32.27759560833895, 0, 0, 0, 0, 0, 0, 18.15614752969066, 0, -96.83278682501685, 0, 58.0996720950101, 0, 0, 0, 0, 0, 0, 0, 0, 12.1040983531271, 0, -96.83278682501685, 0, 116.1993441900202, 0, -22.1332084171467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.026024588281776, 0, -32.27759560833895, 0, 58.0996720950101, 0, -22.1332084171467, 0, 1.229622689841484, + 0.451093112065591, 0, 0, 1.804372448262364, 0, -18.04372448262364, 0, 0, 0, 0, 2.706558672393546, 0, -54.13117344787092, 0, 72.17489793049457, 0, 0, 0, 0, 0, 0, 1.804372448262364, 0, -54.13117344787092, 0, 144.3497958609891, 0, -57.73991834439565, 0, 0, 0, 0, 0, 0, 0, 0, 0.451093112065591, 0, -18.04372448262364, 0, 72.17489793049457, 0, -57.73991834439565, 0, 8.248559763485094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4.23162848396049, 0, 0, 0, 0, -8.46325696792098, 0, 42.3162848396049, 0, 0, 0, 0, 0, 0, 0, 0, 42.3162848396049, 0, -67.70605574336784, 0, 0, 0, 0, 0, 0, 0, 0, 8.46325696792098, 0, -42.3162848396049, 0, 0, 0, 19.34458735524795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.23162848396049, 0, -42.3162848396049, 0, 67.70605574336784, 0, -19.34458735524795, 0, 0, + -0.4617085200161945, 0, 0, 0, 0, 16.621506720583, 0, 0, 0, 0, 2.770251120097167, 0, -16.621506720583, 0, -55.40502240194333, 0, 0, 0, 0, 0, 0, 3.693668160129556, 0, -83.107533602915, 0, 110.8100448038867, 0, 29.54934528103645, 0, 0, 0, 0, 0, 0, 0, 0, 1.385125560048583, 0, -49.864520161749, 0, 166.21506720583, 0, -88.64803584310934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4.077699238729173, 0, 0, 0, 0, -16.31079695491669, 0, -32.62159390983339, 0, 0, 0, 0, 0, 0, -40.77699238729173, 0, 163.1079695491669, 0, 32.62159390983339, 0, 0, 0, 0, 0, 0, 0, 0, -16.31079695491669, 0, 163.1079695491669, 0, -195.7295634590003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.077699238729173, 0, -32.62159390983339, 0, 32.62159390983339, 0, 0, 0, 0, + 0.4873782790390186, 0, 0, -3.899026232312149, 0, -13.64659181309252, 0, 0, 0, 0, -6.82329590654626, 0, 122.8193263178327, 0, 27.29318362618504, 0, 0, 0, 0, 0, 0, 0, 0, 68.23295906546261, 0, -272.9318362618504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.436891395195093, 0, -68.23295906546261, 0, 136.4659181309252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3.775215916042701, 0, 0, 0, 0, 52.85302282459782, 0, 17.61767427486594, 0, 0, 0, 0, 0, 0, 0, 0, -264.2651141229891, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52.85302282459782, 0, 264.2651141229891, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.775215916042701, 0, -17.61767427486594, 0, 0, 0, 0, 0, 0, + -0.5449054813440533, 0, 0, 10.89810962688107, 0, 8.718487701504852, 0, 0, 0, 0, -7.628676738816745, 0, -183.0882417316019, 0, 0, 0, 0, 0, 0, 0, 0, -15.25735347763349, 0, 305.1470695526698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.814338369408373, 0, -61.02941391053396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3.177317648954698, 0, 0, 0, 0, -88.96489417073154, 0, 0, 0, 0, 0, 0, 0, 0, 222.4122354268289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -88.96489417073154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.177317648954698, 0, 0, 0, 0, 0, 0, 0, 0, + 0.7489009518531882, 0, 0, -26.96043426671477, 0, 0, 0, 0, 0, 0, 94.36151993350171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62.9076799556678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.740108566678694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 7.673951182219901, 0, 0, 0, 0, -92.08741418663881, 0, 0, 0, 0, 0, 0, 0, 0, 193.3835697919415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -92.08741418663881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.673951182219901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 30.88705769902543, 0, 0, 0, 0, 0, 0, -288.2792051909041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 432.4188077863561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -123.5482307961017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.431895299891715, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4.453815461763347, 0, 0, 0, 0, 26.72289277058008, 0, 80.16867831174027, 0, 0, 0, 0, 0, 0, 0, 0, -561.1807481821819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26.72289277058008, 0, 561.1807481821819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.453815461763347, 0, -80.16867831174027, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28.63763513582592, 0, 0, 0, 0, 0, 0, 114.5505405433037, 0, 152.7340540577382, 0, 0, 0, 0, 0, 0, 0, 0, 57.27527027165184, 0, -763.6702702886912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -81.82181467378834, 0, 458.2021621732147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.091090733689417, 0, -21.81915057967689, 0, 0, 0, 0, 0, 0, 0, + 0, 2.976705744527138, 0, 0, 0, 0, -3.968940992702851, 0, -95.25458382486842, 0, 0, 0, 0, 0, 0, -13.89129347445998, 0, 222.2606955913596, 0, 222.2606955913597, 0, 0, 0, 0, 0, 0, 0, 0, -3.968940992702851, 0, 222.2606955913596, 0, -740.8689853045323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.976705744527138, 0, -95.25458382486842, 0, 222.2606955913597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22.18705464592268, 0, 0, 0, 0, 0, 0, 0, 0, -207.0791766952783, 0, 0, 0, 0, 0, 0, 0, 0, -62.12375300858349, 0, 207.0791766952783, 0, 248.495012034334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35.49928743347628, 0, 372.742518051501, 0, -496.990024068668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.437410929184535, 0, -41.41583533905566, 0, 49.6990024068668, 0, 0, 0, 0, 0, + 0, -1.870976726712969, 0, 0, 0, 0, -3.741953453425937, 0, 78.58102252194469, 0, 0, 0, 0, 0, 0, 0, 0, 78.58102252194469, 0, -314.3240900877788, 0, 0, 0, 0, 0, 0, 0, 0, 3.741953453425937, 0, -78.58102252194469, 0, 0, 0, 209.5493933918525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.870976726712969, 0, -78.58102252194469, 0, 314.3240900877788, 0, -209.5493933918525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13.89129347445998, 0, 0, 0, 0, 0, 0, -37.04344926522661, 0, 166.6955216935197, 0, 0, 0, 0, 0, 0, 0, 0, -27.78258694891996, 0, 277.8258694891996, 0, -333.3910433870395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55.56517389783991, 0, -222.2606955913596, 0, 127.0061117664912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.630431158153326, 0, -55.56517389783991, 0, 111.1303477956798, 0, -42.33537058883041, 0, 0, 0, + 0, 0.9081022627604556, 0, 0, 0, 0, 3.632409051041822, 0, -43.58890861250187, 0, 0, 0, 0, 0, 0, 5.448613576562733, 0, -130.7667258375056, 0, 217.9445430625093, 0, 0, 0, 0, 0, 0, 0, 0, 3.632409051041822, 0, -130.7667258375056, 0, 435.8890861250187, 0, -232.4741792666766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.9081022627604556, 0, -43.58890861250187, 0, 217.9445430625093, 0, -232.4741792666766, 0, 49.815895557145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4.718637772708116, 0, 0, 0, 0, 0, 0, 18.87455109083247, 0, -62.91517030277488, 0, 0, 0, 0, 0, 0, 0, 0, 28.3118266362487, 0, -188.7455109083247, 0, 150.9964087266597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18.87455109083247, 0, -188.7455109083247, 0, 301.9928174533194, 0, -86.28366212951984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.718637772708116, 0, -62.91517030277488, 0, 150.9964087266597, 0, -86.28366212951984, 0, 9.587073569946648, 0, + -0.3181304937373671, 0, 0, -1.590652468686835, 0, 15.90652468686835, 0, 0, 0, 0, -3.181304937373671, 0, 63.62609874747341, 0, -84.83479832996456, 0, 0, 0, 0, 0, 0, -3.181304937373671, 0, 95.43914812121012, 0, -254.5043949898937, 0, 101.8017579959575, 0, 0, 0, 0, 0, 0, 0, 0, -1.590652468686835, 0, 63.62609874747341, 0, -254.5043949898937, 0, 203.6035159919149, 0, -29.08621657027356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.3181304937373671, 0, 15.90652468686835, 0, -84.83479832996456, 0, 101.8017579959575, 0, -29.08621657027356, 0, 1.292720736456603, + 0, 0, 4.718637772708116, 0, 0, 0, 0, 18.87455109083247, 0, -62.91517030277488, 0, 0, 0, 0, 0, 0, 28.3118266362487, 0, -188.7455109083247, 0, 150.9964087266597, 0, 0, 0, 0, 0, 0, 0, 0, 18.87455109083247, 0, -188.7455109083247, 0, 301.9928174533194, 0, -86.28366212951984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.718637772708116, 0, -62.91517030277488, 0, 150.9964087266597, 0, -86.28366212951984, 0, 9.587073569946648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.4540511313802278, 0, 0, 1.362153394140683, 0, -21.79445430625093, 0, 0, 0, 0, 0.9081022627604556, 0, -43.58890861250187, 0, 108.9722715312547, 0, 0, 0, 0, 0, 0, -0.9081022627604556, 0, 0, 0, 108.9722715312547, 0, -116.2370896333383, 0, 0, 0, 0, 0, 0, 0, 0, -1.362153394140683, 0, 43.58890861250187, 0, -108.9722715312547, 0, 0, 0, 24.9079477785725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4540511313802278, 0, 21.79445430625093, 0, -108.9722715312547, 0, 116.2370896333383, 0, -24.9079477785725, 0, 0, + 0, 0, -4.630431158153326, 0, 0, 0, 0, 0, 0, 55.56517389783991, 0, 0, 0, 0, 0, 0, 27.78258694891996, 0, -55.56517389783991, 0, -111.1303477956798, 0, 0, 0, 0, 0, 0, 0, 0, 37.04344926522661, 0, -277.8258694891996, 0, 222.2606955913596, 0, 42.33537058883041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.89129347445998, 0, -166.6955216935197, 0, 333.3910433870395, 0, -127.0061117664912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.4677441816782422, 0, 0, 1.403232545034726, 0, 19.64525563048617, 0, 0, 0, 0, 6.548418543495391, 0, -78.58102252194469, 0, -78.58102252194469, 0, 0, 0, 0, 0, 0, 6.548418543495391, 0, -196.4525563048617, 0, 392.9051126097235, 0, 52.38734834796313, 0, 0, 0, 0, 0, 0, 0, 0, 1.403232545034726, 0, -78.58102252194469, 0, 392.9051126097235, 0, -314.3240900877788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4677441816782422, 0, 19.64525563048617, 0, -78.58102252194469, 0, 52.38734834796313, 0, 0, 0, 0, + 0, 0, 4.437410929184535, 0, 0, 0, 0, -35.49928743347628, 0, -41.41583533905566, 0, 0, 0, 0, 0, 0, -62.12375300858349, 0, 372.742518051501, 0, 49.6990024068668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207.0791766952783, 0, -496.990024068668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.18705464592268, 0, -207.0791766952783, 0, 248.495012034334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.4961176240878564, 0, 0, -6.449529113142133, 0, -15.8757639708114, 0, 0, 0, 0, -6.945646737229989, 0, 222.2606955913596, 0, 37.04344926522661, 0, 0, 0, 0, 0, 0, 6.945646737229989, 0, 0, 0, -555.6517389783992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.449529113142133, 0, -222.2606955913596, 0, 555.6517389783992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4961176240878564, 0, 15.8757639708114, 0, -37.04344926522661, 0, 0, 0, 0, 0, 0, + 0, 0, -4.091090733689417, 0, 0, 0, 0, 81.82181467378834, 0, 21.81915057967689, 0, 0, 0, 0, 0, 0, -57.27527027165184, 0, -458.2021621732147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -114.5505405433037, 0, 763.6702702886912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28.63763513582592, 0, -152.7340540577382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.5567269327204184, 0, 0, 15.0316271834513, 0, 10.02108478896753, 0, 0, 0, 0, -23.38253117425757, 0, -280.590374091091, 0, 0, 0, 0, 0, 0, 0, 0, -23.38253117425757, 0, 701.4759352277273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15.0316271834513, 0, -280.590374091091, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.5567269327204184, 0, 10.02108478896753, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3.431895299891715, 0, 0, 0, 0, -123.5482307961017, 0, 0, 0, 0, 0, 0, 0, 0, 432.4188077863561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -288.2792051909041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30.88705769902543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.7673951182219901, 0, 0, -34.53278031998956, 0, 0, 0, 0, 0, 0, 161.1529748266179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -161.1529748266179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34.53278031998956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.7673951182219901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 8.631063163659167, 0, 0, 0, 0, -129.4659474548875, 0, 0, 0, 0, 0, 0, 0, 0, 362.504652873685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -258.9318949097751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43.15531581829584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.7846421057871971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 36.80297698805311, 0, 0, 0, 0, 0, 0, -441.6357238566373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 927.4350200989384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -441.6357238566373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36.80297698805311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5.110940374050938, 0, 0, 0, 0, 42.59116978375781, 0, 102.2188074810188, 0, 0, 0, 0, 0, 0, -23.85105507890438, 0, -954.0422031561751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51.10940374050938, 0, 1431.063304734263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19.87587923242031, 0, -408.875229924075, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.5678822637834375, 0, 11.35764527566875, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -35.19037680383713, 0, 0, 0, 0, 0, 0, 211.1422608230228, 0, 211.1422608230228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1477.995825761159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -211.1422608230228, 0, 1477.995825761159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35.19037680383713, 0, -211.1422608230228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3.532036427339827, 0, 0, 0, 0, -10.59610928201948, 0, -127.1533113842337, 0, 0, 0, 0, 0, 0, -21.19221856403896, 0, 508.613245536935, 0, 339.0754970246234, 0, 0, 0, 0, 0, 0, 0, 0, 3.027459794862709, 0, 254.3066227684675, 0, -1695.377485123117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.586956017065244, 0, -363.295175383525, 0, 1017.22649107387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.5045766324771181, 0, 18.16475876917625, 0, -48.43935671780334, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28.72100542905686, 0, 0, 0, 0, 0, 0, -38.29467390540915, 0, -306.3573912432732, 0, 0, 0, 0, 0, 0, 0, 0, -134.031358668932, 0, 714.8339129009709, 0, 428.9003477405824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38.29467390540915, 0, 714.8339129009709, 0, -1429.667825801941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28.72100542905686, 0, -306.3573912432732, 0, 428.9003477405824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2.369836079783365, 0, 0, 0, 0, -2.369836079783365, 0, 113.7521318296015, 0, 0, 0, 0, 0, 0, 6.63554102339342, 0, 0, 0, -530.8432818714737, 0, 0, 0, 0, 0, 0, 0, 0, 10.4272787510468, 0, -318.5059691228842, 0, 530.8432818714737, 0, 424.674625497179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.31777051169671, 0, -182.0034109273624, 0, 955.5179073686526, 0, -849.349250994358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4739672159566729, 0, 22.7504263659203, 0, -106.1686563742947, 0, 84.9349250994358, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20.06399012830402, 0, 0, 0, 0, 0, 0, -40.12798025660804, 0, 280.8958617962563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280.8958617962563, 0, -674.150068311015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40.12798025660804, 0, -280.8958617962563, 0, 0, 0, 321.0238420528643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20.06399012830402, 0, -280.8958617962563, 0, 674.150068311015, 0, -321.0238420528643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1.373687498354136, 0, 0, 0, 0, 5.036854160631831, 0, -76.92649990783158, 0, 0, 0, 0, 0, 0, 6.410541658985967, 0, -205.1373330875509, 0, 461.5589994469895, 0, 0, 0, 0, 0, 0, 0, 0, 2.747374996708271, 0, -153.8529998156632, 0, 769.2649990783159, 0, -615.4119992626527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4578958327847119, 0, 0, 0, 153.8529998156632, 0, -410.2746661751018, 0, 175.8319997893294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4578958327847119, 0, 25.64216663594386, 0, -153.8529998156632, 0, 205.1373330875509, 0, -58.61066659644312, 0, 0, 0, + 0, 0, 0, 0, 10.27973595067153, 0, 0, 0, 0, 0, 0, 41.11894380268614, 0, -164.4757752107446, 0, 0, 0, 0, 0, 0, 0, 0, 61.67841570402921, 0, -493.4273256322336, 0, 493.4273256322337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41.11894380268614, 0, -493.4273256322336, 0, 986.8546512644674, 0, -375.9446290531304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.27973595067153, 0, -164.4757752107446, 0, 493.4273256322337, 0, -375.9446290531304, 0, 62.65743817552173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.4507962425947618, 0, 0, 0, 0, -2.253981212973809, 0, 27.04777455568571, 0, 0, 0, 0, 0, 0, -4.507962425947618, 0, 108.1910982227429, 0, -180.3184970379047, 0, 0, 0, 0, 0, 0, 0, 0, -4.507962425947618, 0, 162.2866473341143, 0, -540.9554911137142, 0, 288.5095952606476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.253981212973809, 0, 108.1910982227429, 0, -540.9554911137142, 0, 577.0191905212952, 0, -123.6469693974204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4507962425947618, 0, 27.04777455568571, 0, -180.3184970379047, 0, 288.5095952606476, 0, -123.6469693974204, 0, 10.99084172421515, 0, + 0, 0, -3.662285987505434, 0, 0, 0, 0, -18.31142993752717, 0, 61.03809979175723, 0, 0, 0, 0, 0, 0, -36.62285987505434, 0, 244.1523991670289, 0, -195.3219193336232, 0, 0, 0, 0, 0, 0, 0, 0, -36.62285987505434, 0, 366.2285987505434, 0, -585.9657580008695, 0, 167.4187880002484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18.31142993752717, 0, 244.1523991670289, 0, -585.9657580008695, 0, 334.8375760004968, 0, -37.20417511116631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.662285987505434, 0, 61.03809979175723, 0, -195.3219193336232, 0, 167.4187880002484, 0, -37.20417511116631, 0, 1.352879094951502, + -0.4507962425947618, 0, 0, -2.253981212973809, 0, 27.04777455568571, 0, 0, 0, 0, -4.507962425947618, 0, 108.1910982227429, 0, -180.3184970379047, 0, 0, 0, 0, 0, 0, -4.507962425947618, 0, 162.2866473341143, 0, -540.9554911137142, 0, 288.5095952606476, 0, 0, 0, 0, 0, 0, 0, 0, -2.253981212973809, 0, 108.1910982227429, 0, -540.9554911137142, 0, 577.0191905212952, 0, -123.6469693974204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4507962425947618, 0, 27.04777455568571, 0, -180.3184970379047, 0, 288.5095952606476, 0, -123.6469693974204, 0, 10.99084172421515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5.139867975335767, 0, 0, 0, 0, 15.4196039260073, 0, -82.23788760537228, 0, 0, 0, 0, 0, 0, 10.27973595067153, 0, -164.4757752107446, 0, 246.7136628161169, 0, 0, 0, 0, 0, 0, 0, 0, -10.27973595067153, 0, 0, 0, 246.7136628161169, 0, -187.9723145265652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15.4196039260073, 0, 164.4757752107446, 0, -246.7136628161169, 0, 0, 0, 31.32871908776087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.139867975335767, 0, 82.23788760537228, 0, -246.7136628161169, 0, 187.9723145265652, 0, -31.32871908776087, 0, 0, + 0.4578958327847119, 0, 0, 0.4578958327847119, 0, -25.64216663594386, 0, 0, 0, 0, -2.747374996708271, 0, 0, 0, 153.8529998156632, 0, 0, 0, 0, 0, 0, -6.410541658985967, 0, 153.8529998156632, 0, -153.8529998156632, 0, -205.1373330875509, 0, 0, 0, 0, 0, 0, 0, 0, -5.036854160631831, 0, 205.1373330875509, 0, -769.2649990783159, 0, 410.2746661751018, 0, 58.61066659644312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.373687498354136, 0, 76.92649990783158, 0, -461.5589994469895, 0, 615.4119992626527, 0, -175.8319997893294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5.015997532076005, 0, 0, 0, 0, 15.04799259622802, 0, 70.22396544906408, 0, 0, 0, 0, 0, 0, 70.22396544906407, 0, -280.8958617962563, 0, -168.5375170777538, 0, 0, 0, 0, 0, 0, 0, 0, 70.22396544906407, 0, -702.2396544906408, 0, 842.6875853887689, 0, 80.25596051321608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15.04799259622802, 0, -280.8958617962563, 0, 842.6875853887689, 0, -481.5357630792965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.015997532076005, 0, 70.22396544906408, 0, -168.5375170777538, 0, 80.25596051321608, 0, 0, 0, 0, + -0.4739672159566729, 0, 0, 3.31777051169671, 0, 22.7504263659203, 0, 0, 0, 0, 10.4272787510468, 0, -182.0034109273624, 0, -106.1686563742947, 0, 0, 0, 0, 0, 0, 6.63554102339342, 0, -318.5059691228842, 0, 955.5179073686526, 0, 84.9349250994358, 0, 0, 0, 0, 0, 0, 0, 0, -2.369836079783365, 0, 0, 0, 530.8432818714737, 0, -849.349250994358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.369836079783365, 0, 113.7521318296015, 0, -530.8432818714737, 0, 424.674625497179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4.786834238176144, 0, 0, 0, 0, -62.22884509628987, 0, -51.0595652072122, 0, 0, 0, 0, 0, 0, -67.01567933446601, 0, 714.8339129009709, 0, 71.48339129009707, 0, 0, 0, 0, 0, 0, 0, 0, 67.01567933446601, 0, 0, 0, -1072.250869351456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62.22884509628987, 0, -714.8339129009709, 0, 1072.250869351456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.786834238176144, 0, 51.0595652072122, 0, -71.48339129009707, 0, 0, 0, 0, 0, 0, + 0.5045766324771181, 0, 0, -9.586956017065244, 0, -18.16475876917625, 0, 0, 0, 0, -3.027459794862709, 0, 363.295175383525, 0, 48.43935671780334, 0, 0, 0, 0, 0, 0, 21.19221856403896, 0, -254.3066227684675, 0, -1017.22649107387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.59610928201948, 0, -508.613245536935, 0, 1695.377485123117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.532036427339827, 0, 127.1533113842337, 0, -339.0754970246234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4.398797100479641, 0, 0, 0, 0, 118.7675217129503, 0, 26.39278260287784, 0, 0, 0, 0, 0, 0, -184.7494782201449, 0, -738.9979128805796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184.7494782201449, 0, 1847.494782201449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118.7675217129503, 0, -738.9979128805796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.398797100479641, 0, 26.39278260287784, 0, 0, 0, 0, 0, 0, 0, 0, + -0.5678822637834375, 0, 0, 19.87587923242031, 0, 11.35764527566875, 0, 0, 0, 0, -51.10940374050938, 0, -408.875229924075, 0, 0, 0, 0, 0, 0, 0, 0, -23.85105507890438, 0, 1431.063304734263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42.59116978375781, 0, -954.0422031561751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.110940374050938, 0, 102.2188074810188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3.680297698805311, 0, 0, 0, 0, -165.613396446239, 0, 0, 0, 0, 0, 0, 0, 0, 772.8625167491152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -772.8625167491152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165.613396446239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.680297698805311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.7846421057871971, 0, 0, -43.15531581829584, 0, 0, 0, 0, 0, 0, 258.9318949097751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362.504652873685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129.4659474548875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.631063163659167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 9.609863949407661, 0, 0, 0, 0, -176.1808390724738, 0, 0, 0, 0, 0, 0, 0, 0, 634.2510206609056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -634.2510206609056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176.1808390724738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.609863949407661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 43.15531581829583, 0, 0, 0, 0, 0, 0, -647.3297372744373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1812.523264368425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1294.659474548875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215.7765790914791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.923210528935984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5.784458347938102, 0, 0, 0, 0, 63.62904182731912, 0, 127.2580836546383, 0, 0, 0, 0, 0, 0, -76.35485019278295, 0, -1527.097003855659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76.35485019278295, 0, 3206.903708096884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63.62904182731912, 0, -1527.097003855659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.784458347938102, 0, 127.2580836546383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -42.2938455917996, 0, 0, 0, 0, 0, 0, 352.4487132649967, 0, 281.9589706119974, 0, 0, 0, 0, 0, 0, 0, 0, -197.3712794283981, 0, -2631.617059045309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -422.938455917996, 0, 3947.425588567963, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164.4760661903318, 0, -1127.835882447989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.699316176866622, 0, 31.32877451244415, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4.101899446670816, 0, 0, 0, 0, -20.50949723335408, 0, -164.0759778668327, 0, 0, 0, 0, 0, 0, -24.6113966800249, 0, 984.455867200996, 0, 492.2279336004979, 0, 0, 0, 0, 0, 0, 0, 0, 24.6113966800249, 0, 0, 0, -3445.595535203485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20.50949723335408, 0, -984.455867200996, 0, 3445.595535203485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.101899446670816, 0, 164.0759778668327, 0, -492.2279336004979, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 35.89162015836965, 0, 0, 0, 0, 0, 0, -107.6748604751089, 0, -430.6994419004357, 0, 0, 0, 0, 0, 0, 0, 0, -215.3497209502179, 0, 1722.797767601743, 0, 689.1191070406971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30.76424585003112, 0, 861.3988838008713, 0, -3445.595535203485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97.42011185843189, 0, -1230.569834001245, 0, 2067.357321122091, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.127374308338521, 0, 61.52849170006224, 0, -98.44558672009958, 0, 0, 0, 0, 0, 0, 0, + 0, -2.881335616715016, 0, 0, 0, 0, 0.9604452055716719, 0, 155.5921233026108, 0, 0, 0, 0, 0, 0, 17.28801370029009, 0, -207.4561644034811, 0, -829.8246576139245, 0, 0, 0, 0, 0, 0, 0, 0, 17.28801370029009, 0, -726.0965754121839, 0, 1936.257534432491, 0, 774.5030137729962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.9604452055716719, 0, -207.4561644034811, 0, 1936.257534432491, 0, -2581.676712576654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.881335616715016, 0, 155.5921233026108, 0, -829.8246576139245, 0, 774.5030137729962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -26.95242673514147, 0, 0, 0, 0, 0, 0, -26.95242673514147, 0, 431.2388277622634, 0, 0, 0, 0, 0, 0, 0, 0, 75.4667948583961, 0, 0, 0, -1207.468717734338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118.5906776346225, 0, -1207.468717734338, 0, 1207.468717734338, 0, 689.9821244196215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37.73339742919805, 0, -689.9821244196215, 0, 2173.443691921808, 0, -1379.964248839243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.390485347028293, 0, 86.24776555245269, 0, -241.4937435468676, 0, 137.9964248839243, 0, 0, 0, 0, 0, + 0, 1.848921220493557, 0, 0, 0, 0, 5.54676366148067, 0, -118.3309581115876, 0, 0, 0, 0, 0, 0, 3.697842440987113, 0, -236.6619162231752, 0, 828.3167067811135, 0, 0, 0, 0, 0, 0, 0, 0, -3.697842440987113, 0, 0, 0, 828.3167067811135, 0, -1325.306730849781, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.54676366148067, 0, 236.6619162231752, 0, -828.3167067811135, 0, 0, 0, 473.3238324463505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.848921220493557, 0, 118.3309581115876, 0, -828.3167067811135, 0, 1325.306730849781, 0, -473.3238324463505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 16.64029098444201, 0, 0, 0, 0, 0, 0, 61.01440027628737, 0, -310.6187650429175, 0, 0, 0, 0, 0, 0, 0, 0, 77.65469126072938, 0, -828.3167067811133, 0, 1118.227554154503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33.28058196888402, 0, -621.237530085835, 0, 1863.712590257505, 0, -1064.978623004289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.54676366148067, 0, 0, 0, 372.742518051501, 0, -709.9857486695257, 0, 236.6619162231752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.54676366148067, 0, 103.5395883476392, 0, -372.742518051501, 0, 354.9928743347629, 0, -78.88730540772508, 0, 0, 0, + 0, -0.9057827129626244, 0, 0, 0, 0, -4.528913564813122, 0, 63.4047899073837, 0, 0, 0, 0, 0, 0, -9.057827129626244, 0, 253.6191596295348, 0, -507.2383192590696, 0, 0, 0, 0, 0, 0, 0, 0, -9.057827129626244, 0, 380.4287394443022, 0, -1521.714957777209, 0, 1014.476638518139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.528913564813122, 0, 253.6191596295348, 0, -1521.714957777209, 0, 2028.953277036278, 0, -579.7009362960796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.9057827129626244, 0, 63.4047899073837, 0, -507.2383192590696, 0, 1014.476638518139, 0, -579.7009362960796, 0, 77.2934581728106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5.620233931023189, 0, 0, 0, 0, 0, 0, -28.10116965511595, 0, 112.4046786204638, 0, 0, 0, 0, 0, 0, 0, 0, -56.20233931023189, 0, 449.6187144818551, 0, -449.6187144818551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56.20233931023189, 0, 674.4280717227828, 0, -1348.856143445566, 0, 513.8499594078344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -28.10116965511595, 0, 449.6187144818551, 0, -1348.856143445566, 0, 1027.699918815669, 0, -171.2833198026115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.620233931023189, 0, 112.4046786204638, 0, -449.6187144818551, 0, 513.8499594078344, 0, -171.2833198026115, 0, 12.4569687129172, 0, + 0.318183090330888, 0, 0, 1.909098541985328, 0, -22.90918250382393, 0, 0, 0, 0, 4.77274635496332, 0, -114.5459125191197, 0, 190.9098541985328, 0, 0, 0, 0, 0, 0, 6.36366180661776, 0, -229.0918250382393, 0, 763.6394167941311, 0, -407.2743556235366, 0, 0, 0, 0, 0, 0, 0, 0, 4.77274635496332, 0, -229.0918250382393, 0, 1145.459125191197, 0, -1221.82306687061, 0, 261.8192286151307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.909098541985328, 0, -114.5459125191197, 0, 763.6394167941311, 0, -1221.82306687061, 0, 523.6384572302613, 0, -46.5456406426899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.318183090330888, 0, -22.90918250382393, 0, 190.9098541985328, 0, -407.2743556235366, 0, 261.8192286151307, 0, -46.5456406426899, 0, 1.410473958869391, + 0, 0, -5.620233931023189, 0, 0, 0, 0, -28.10116965511595, 0, 112.4046786204638, 0, 0, 0, 0, 0, 0, -56.20233931023189, 0, 449.6187144818551, 0, -449.6187144818551, 0, 0, 0, 0, 0, 0, 0, 0, -56.20233931023189, 0, 674.4280717227828, 0, -1348.856143445566, 0, 513.8499594078344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -28.10116965511595, 0, 449.6187144818551, 0, -1348.856143445566, 0, 1027.699918815669, 0, -171.2833198026115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.620233931023189, 0, 112.4046786204638, 0, -449.6187144818551, 0, 513.8499594078344, 0, -171.2833198026115, 0, 12.4569687129172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.4528913564813122, 0, 0, -1.811565425925249, 0, 31.70239495369185, 0, 0, 0, 0, -2.264456782406561, 0, 95.10718486107555, 0, -253.6191596295348, 0, 0, 0, 0, 0, 0, 0, 0, 63.4047899073837, 0, -507.2383192590696, 0, 507.2383192590696, 0, 0, 0, 0, 0, 0, 0, 0, 2.264456782406561, 0, -63.4047899073837, 0, 0, 0, 507.2383192590696, 0, -289.8504681480398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.811565425925249, 0, -95.10718486107555, 0, 507.2383192590696, 0, -507.2383192590696, 0, 0, 0, 38.6467290864053, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4528913564813122, 0, -31.70239495369185, 0, 253.6191596295348, 0, -507.2383192590696, 0, 289.8504681480398, 0, -38.6467290864053, 0, 0, + 0, 0, 5.54676366148067, 0, 0, 0, 0, 5.54676366148067, 0, -103.5395883476392, 0, 0, 0, 0, 0, 0, -33.28058196888402, 0, 0, 0, 372.742518051501, 0, 0, 0, 0, 0, 0, 0, 0, -77.65469126072938, 0, 621.237530085835, 0, -372.742518051501, 0, -354.9928743347629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61.01440027628737, 0, 828.3167067811133, 0, -1863.712590257505, 0, 709.9857486695257, 0, 78.88730540772508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16.64029098444201, 0, 310.6187650429175, 0, -1118.227554154503, 0, 1064.978623004289, 0, -236.6619162231752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.4622303051233891, 0, 0, -0.9244606102467783, 0, -29.5827395278969, 0, 0, 0, 0, -7.857915187097616, 0, 88.74821858369071, 0, 207.0791766952784, 0, 0, 0, 0, 0, 0, -12.9424485434549, 0, 414.1583533905567, 0, -828.3167067811135, 0, -331.3266827124453, 0, 0, 0, 0, 0, 0, 0, 0, -7.857915187097616, 0, 414.1583533905567, 0, -2070.791766952784, 0, 1656.633413562227, 0, 118.3309581115876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.9244606102467783, 0, 88.74821858369071, 0, -828.3167067811135, 0, 1656.633413562227, 0, -709.9857486695257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4622303051233891, 0, -29.5827395278969, 0, 207.0791766952784, 0, -331.3266827124453, 0, 118.3309581115876, 0, 0, 0, 0, + 0, 0, -5.390485347028293, 0, 0, 0, 0, 37.73339742919805, 0, 86.24776555245269, 0, 0, 0, 0, 0, 0, 118.5906776346225, 0, -689.9821244196215, 0, -241.4937435468676, 0, 0, 0, 0, 0, 0, 0, 0, 75.4667948583961, 0, -1207.468717734338, 0, 2173.443691921808, 0, 137.9964248839243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26.95242673514147, 0, 0, 0, 1207.468717734338, 0, -1379.964248839243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26.95242673514147, 0, 431.2388277622634, 0, -1207.468717734338, 0, 689.9821244196215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.480222602785836, 0, 0, 5.762671233430032, 0, 25.93202055043514, 0, 0, 0, 0, 12.96601027521757, 0, -337.1162671556568, 0, -138.3041096023208, 0, 0, 0, 0, 0, 0, 0, 0, -363.048287706092, 0, 1936.257534432491, 0, 129.0838356288327, 0, 0, 0, 0, 0, 0, 0, 0, -12.96601027521757, 0, 363.048287706092, 0, 0, 0, -1936.257534432491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.762671233430032, 0, 337.1162671556568, 0, -1936.257534432491, 0, 1936.257534432491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.480222602785836, 0, -25.93202055043514, 0, 138.3041096023208, 0, -129.0838356288327, 0, 0, 0, 0, 0, 0, + 0, 0, 5.127374308338521, 0, 0, 0, 0, -97.42011185843189, 0, -61.52849170006224, 0, 0, 0, 0, 0, 0, -30.76424585003112, 0, 1230.569834001245, 0, 98.44558672009958, 0, 0, 0, 0, 0, 0, 0, 0, 215.3497209502179, 0, -861.3988838008713, 0, -2067.357321122091, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107.6748604751089, 0, -1722.797767601743, 0, 3445.595535203485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35.89162015836965, 0, 430.6994419004357, 0, -689.1191070406971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.512737430833852, 0, 0, -13.33117320168015, 0, -20.50949723335408, 0, 0, 0, 0, 7.691061462507781, 0, 553.7564253005602, 0, 61.52849170006224, 0, 0, 0, 0, 0, 0, 43.06994419004357, 0, -861.3988838008714, 0, -1722.797767601743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.691061462507781, 0, -861.3988838008714, 0, 4306.994419004357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.33117320168015, 0, 553.7564253005602, 0, -1722.797767601743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.512737430833852, 0, -20.50949723335408, 0, 61.52849170006224, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4.699316176866622, 0, 0, 0, 0, 164.4760661903318, 0, 31.32877451244415, 0, 0, 0, 0, 0, 0, -422.938455917996, 0, -1127.835882447989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -197.3712794283981, 0, 3947.425588567963, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352.4487132649967, 0, -2631.617059045309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42.2938455917996, 0, 281.9589706119974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.5784458347938102, 0, 0, 25.45161673092765, 0, 12.72580836546383, 0, 0, 0, 0, -95.44356274097868, 0, -572.6613764458722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2672.419756747403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95.44356274097868, 0, -2672.419756747403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -25.45161673092765, 0, 572.6613764458722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5784458347938102, 0, -12.72580836546383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3.923210528935984, 0, 0, 0, 0, -215.7765790914791, 0, 0, 0, 0, 0, 0, 0, 0, 1294.659474548875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1812.523264368425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 647.3297372744373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43.15531581829583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.8008219957839717, 0, 0, -52.85425172174213, 0, 0, 0, 0, 0, 0, 396.406887913066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -739.9595241043899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 396.406887913066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52.85425172174213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.8008219957839717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 10.60900254488917, 0, 0, 0, 0, -233.3980559875617, 0, 0, 0, 0, 0, 0, 0, 0, 1050.291251944028, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1400.38833592537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 583.4951399689042, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63.65401526933501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.8160771188376283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 49.93431784259574, 0, 0, 0, 0, 0, 0, -915.4624937809218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3295.664977611319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3295.664977611319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 915.4624937809218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49.93431784259574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6.473297372744374, 0, 0, 0, 0, 90.62616321842124, 0, 155.359136945865, 0, 0, 0, 0, 0, 0, -174.7790290640981, 0, -2330.387054187975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77.67956847293249, 0, 6525.083751726329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161.8324343186094, 0, -4660.774108375949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -31.77800528438147, 0, 776.7956847293249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5884815793403977, 0, -14.12355790416954, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -49.93431784259574, 0, 0, 0, 0, 0, 0, 549.2774962685531, 0, 366.1849975123687, 0, 0, 0, 0, 0, 0, 0, 0, -659.1329955222637, 0, -4394.219970148425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -659.1329955222637, 0, 9227.861937311692, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 549.2774962685531, 0, -4394.219970148425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49.93431784259574, 0, 366.1849975123687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4.685411261829863, 0, 0, 0, 0, -34.35968258675233, 0, -206.158095520514, 0, 0, 0, 0, 0, 0, -17.17984129337616, 0, 1717.984129337616, 0, 687.1936517350465, 0, 0, 0, 0, 0, 0, 0, 0, 68.71936517350465, 0, -962.0711124290651, 0, -6413.807416193768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28.63306882229361, 0, -2061.58095520514, 0, 9620.711124290651, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.70044254469059, 0, 801.7259270242209, 0, -2748.774606940186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5206012513144292, 0, -22.90645505783488, 0, 76.35485019278295, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 43.68089589976209, 0, 0, 0, 0, 0, 0, -218.4044794988104, 0, -582.4119453301611, 0, 0, 0, 0, 0, 0, 0, 0, -262.0853753985725, 0, 3494.471671980967, 0, 1048.34150159429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262.0853753985725, 0, 0, 0, -7338.39051116003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218.4044794988104, 0, -3494.471671980967, 0, 7338.39051116003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43.68089589976209, 0, 582.4119453301611, 0, -1048.34150159429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3.404978058421841, 0, 0, 0, 0, 6.809956116843682, 0, 204.2986835053105, 0, 0, 0, 0, 0, 0, 30.64480252579657, 0, -612.8960505159314, 0, -1225.792101031863, 0, 0, 0, 0, 0, 0, 0, 0, 17.51131572902661, 0, -1225.792101031863, 0, 4903.168404127451, 0, 1307.511574433987, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -12.16063592293515, 0, 175.1131572902661, 0, 2451.584202063726, 0, -6537.557872169935, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.755657864513306, 0, 554.5249980858427, 0, -3502.263145805322, 0, 3922.534723301961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4864254369174059, 0, -29.18552621504435, 0, 175.1131572902661, 0, -186.7873677762839, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -34.53278031998955, 0, 0, 0, 0, 0, 0, 11.51092677332985, 0, 621.5900457598119, 0, 0, 0, 0, 0, 0, 0, 0, 207.1966819199373, 0, -828.7867276797492, 0, -1989.088146431398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207.1966819199373, 0, -2900.753546879122, 0, 4641.205675006596, 0, 1326.058764287599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11.51092677332985, 0, -828.7867276797492, 0, 4641.205675006596, 0, -4420.195880958662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34.53278031998955, 0, 621.5900457598119, 0, -1989.088146431398, 0, 1326.058764287599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2.334148624627139, 0, 0, 0, 0, 4.668297249254278, 0, -168.058700973154, 0, 0, 0, 0, 0, 0, -4.20146752432885, 0, -168.058700973154, 0, 1344.469607785232, 0, 0, 0, 0, 0, 0, 0, 0, -16.8058700973154, 0, 470.5643627248312, 0, 0, 0, -2509.6766011991, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.53806202283741, 0, 739.4582842818776, 0, -3764.51490179865, 0, 2509.6766011991, 0, 1075.575686228186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.800978349552567, 0, 235.2821813624156, 0, -2151.151372456371, 0, 4517.41788215838, 0, -2151.151372456371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4668297249254278, 0, -33.6117401946308, 0, 268.8939215570464, 0, -501.93532023982, 0, 215.1151372456371, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 23.76708941910389, 0, 0, 0, 0, 0, 0, 71.30126825731166, 0, -507.0312409408829, 0, 0, 0, 0, 0, 0, 0, 0, 47.53417883820777, 0, -1014.062481881766, 0, 2129.531211951708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47.53417883820777, 0, 0, 0, 2129.531211951708, 0, -2433.749956516238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71.30126825731166, 0, 1014.062481881766, 0, -2129.531211951708, 0, 0, 0, 676.0416545878439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -23.76708941910389, 0, 507.0312409408829, 0, -2129.531211951708, 0, 2433.749956516238, 0, -676.0416545878439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1.36713941034431, 0, 0, 0, 0, -6.379983914940114, 0, 109.3711528275448, 0, 0, 0, 0, 0, 0, -11.39282841953592, 0, 401.0275603676643, 0, -1020.797426390418, 0, 0, 0, 0, 0, 0, 0, 0, -9.114262735628734, 0, 510.3987131952091, 0, -2722.126470374449, 0, 2449.913823337004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.278565683907184, 0, 218.7423056550896, 0, -2041.594852780836, 0, 4083.189705561673, 0, -1749.938445240717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.9114262735628734, 0, -36.45705094251494, 0, 0, 0, 816.6379411123346, 0, -1166.625630160478, 0, 311.1001680427941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4557131367814367, 0, -36.45705094251494, 0, 340.2658087968061, 0, -816.6379411123346, 0, 583.312815080239, 0, -103.7000560142647, 0, 0, 0, + 0, 0, 0, 0, -12.09143589391947, 0, 0, 0, 0, 0, 0, -60.45717946959737, 0, 282.1335041914544, 0, 0, 0, 0, 0, 0, 0, 0, -120.9143589391947, 0, 1128.534016765818, 0, -1354.240820118981, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -120.9143589391947, 0, 1692.801025148726, 0, -4062.722460356943, 0, 1934.629743027116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -60.45717946959737, 0, 1128.534016765818, 0, -4062.722460356943, 0, 3869.259486054231, 0, -859.8354413453848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -12.09143589391947, 0, 282.1335041914544, 0, -1354.240820118981, 0, 1934.629743027116, 0, -859.8354413453848, 0, 93.80022996495107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.4506212100730813, 0, 0, 0, 0, 2.703727260438488, 0, -37.85218164613883, 0, 0, 0, 0, 0, 0, 6.75931815109622, 0, -189.2609082306941, 0, 378.5218164613883, 0, 0, 0, 0, 0, 0, 0, 0, 9.012424201461626, 0, -378.5218164613883, 0, 1514.087265845553, 0, -1009.391510563702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.75931815109622, 0, -378.5218164613883, 0, 2271.13089876833, 0, -3028.174531691106, 0, 865.1927233403161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.703727260438488, 0, -189.2609082306941, 0, 1514.087265845553, 0, -3028.174531691106, 0, 1730.385446680632, 0, -230.7180595574176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4506212100730813, 0, -37.85218164613883, 0, 378.5218164613883, 0, -1009.391510563702, 0, 865.1927233403161, 0, -230.7180595574176, 0, 13.98291270044955, 0, + 0, 0, 4.298652372786529, 0, 0, 0, 0, 25.79191423671917, 0, -103.1676569468767, 0, 0, 0, 0, 0, 0, 64.47978559179793, 0, -515.8382847343835, 0, 515.8382847343835, 0, 0, 0, 0, 0, 0, 0, 0, 85.97304745573058, 0, -1031.676569468767, 0, 2063.353138937534, 0, -786.0392910238224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64.47978559179793, 0, -1031.676569468767, 0, 3095.029708406301, 0, -2358.117873071467, 0, 393.0196455119112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25.79191423671917, 0, -515.8382847343835, 0, 2063.353138937534, 0, -2358.117873071467, 0, 786.0392910238224, 0, -57.16649389264163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.298652372786529, 0, -103.1676569468767, 0, 515.8382847343835, 0, -786.0392910238224, 0, 393.0196455119112, 0, -57.16649389264163, 0, 1.46580753570876, + 0.4506212100730813, 0, 0, 2.703727260438488, 0, -37.85218164613883, 0, 0, 0, 0, 6.75931815109622, 0, -189.2609082306941, 0, 378.5218164613883, 0, 0, 0, 0, 0, 0, 9.012424201461626, 0, -378.5218164613883, 0, 1514.087265845553, 0, -1009.391510563702, 0, 0, 0, 0, 0, 0, 0, 0, 6.75931815109622, 0, -378.5218164613883, 0, 2271.13089876833, 0, -3028.174531691106, 0, 865.1927233403161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.703727260438488, 0, -189.2609082306941, 0, 1514.087265845553, 0, -3028.174531691106, 0, 1730.385446680632, 0, -230.7180595574176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4506212100730813, 0, -37.85218164613883, 0, 378.5218164613883, 0, -1009.391510563702, 0, 865.1927233403161, 0, -230.7180595574176, 0, 13.98291270044955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -6.045717946959737, 0, 0, 0, 0, -24.18287178783895, 0, 141.0667520957272, 0, 0, 0, 0, 0, 0, -30.22858973479868, 0, 423.2002562871816, 0, -677.1204100594905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282.1335041914544, 0, -1354.240820118981, 0, 967.3148715135579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30.22858973479868, 0, -282.1335041914544, 0, 0, 0, 967.3148715135579, 0, -429.9177206726924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24.18287178783895, 0, -423.2002562871816, 0, 1354.240820118981, 0, -967.3148715135579, 0, 0, 0, 46.90011498247553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.045717946959737, 0, -141.0667520957272, 0, 677.1204100594905, 0, -967.3148715135579, 0, 429.9177206726924, 0, -46.90011498247553, 0, 0, + -0.4557131367814367, 0, 0, -0.9114262735628734, 0, 36.45705094251494, 0, 0, 0, 0, 2.278565683907184, 0, 36.45705094251494, 0, -340.2658087968061, 0, 0, 0, 0, 0, 0, 9.114262735628734, 0, -218.7423056550896, 0, 0, 0, 816.6379411123346, 0, 0, 0, 0, 0, 0, 0, 0, 11.39282841953592, 0, -510.3987131952091, 0, 2041.594852780836, 0, -816.6379411123346, 0, -583.312815080239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.379983914940114, 0, -401.0275603676643, 0, 2722.126470374449, 0, -4083.189705561673, 0, 1166.625630160478, 0, 103.7000560142647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.36713941034431, 0, -109.3711528275448, 0, 1020.797426390418, 0, -2449.913823337004, 0, 1749.938445240717, 0, -311.1001680427941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5.941772354775972, 0, 0, 0, 0, -11.88354470955194, 0, -126.7578102352207, 0, 0, 0, 0, 0, 0, -101.0101300311915, 0, 380.2734307056622, 0, 532.3828029879271, 0, 0, 0, 0, 0, 0, 0, 0, -166.3696259337272, 0, 1774.60934329309, 0, -2129.531211951708, 0, -608.4374891290595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -101.0101300311915, 0, 1774.60934329309, 0, -5323.828029879271, 0, 3042.187445645297, 0, 169.010413646961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -11.88354470955194, 0, 380.2734307056622, 0, -2129.531211951708, 0, 3042.187445645297, 0, -1014.062481881766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.941772354775972, 0, -126.7578102352207, 0, 532.3828029879271, 0, -608.4374891290595, 0, 169.010413646961, 0, 0, 0, 0, + 0.4668297249254278, 0, 0, -2.800978349552567, 0, -33.6117401946308, 0, 0, 0, 0, -13.53806202283741, 0, 235.2821813624156, 0, 268.8939215570464, 0, 0, 0, 0, 0, 0, -16.8058700973154, 0, 739.4582842818776, 0, -2151.151372456371, 0, -501.93532023982, 0, 0, 0, 0, 0, 0, 0, 0, -4.20146752432885, 0, 470.5643627248312, 0, -3764.51490179865, 0, 4517.41788215838, 0, 215.1151372456371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.668297249254278, 0, -168.058700973154, 0, 0, 0, 2509.6766011991, 0, -2151.151372456371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.334148624627139, 0, -168.058700973154, 0, 1344.469607785232, 0, -2509.6766011991, 0, 1075.575686228186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5.755463386664925, 0, 0, 0, 0, 69.0655606399791, 0, 103.5983409599687, 0, 0, 0, 0, 0, 0, 155.397511439953, 0, -1346.778432479592, 0, -331.5146910718997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1450.376773439561, 0, 4641.205675006596, 0, 221.0097940479331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -155.397511439953, 0, 1450.376773439561, 0, 0, 0, -3315.146910718997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69.0655606399791, 0, 1346.778432479592, 0, -4641.205675006596, 0, 3315.146910718997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.755463386664925, 0, -103.5983409599687, 0, 331.5146910718997, 0, -221.0097940479331, 0, 0, 0, 0, 0, 0, + -0.4864254369174059, 0, 0, 8.755657864513306, 0, 29.18552621504435, 0, 0, 0, 0, 12.16063592293515, 0, -554.5249980858427, 0, -175.1131572902661, 0, 0, 0, 0, 0, 0, -17.51131572902661, 0, -175.1131572902661, 0, 3502.263145805322, 0, 186.7873677762839, 0, 0, 0, 0, 0, 0, 0, 0, -30.64480252579657, 0, 1225.792101031863, 0, -2451.584202063726, 0, -3922.534723301961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.809956116843682, 0, 612.8960505159314, 0, -4903.168404127451, 0, 6537.557872169935, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.404978058421841, 0, -204.2986835053105, 0, 1225.792101031863, 0, -1307.511574433987, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5.460111987470261, 0, 0, 0, 0, -141.9629116742268, 0, -72.80149316627014, 0, 0, 0, 0, 0, 0, 81.90167981205391, 0, 1965.640315489294, 0, 131.0426876992863, 0, 0, 0, 0, 0, 0, 0, 0, 458.6494069475019, 0, -3057.662712983346, 0, -3669.195255580015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81.90167981205391, 0, -3057.662712983346, 0, 9172.988138950038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141.9629116742268, 0, 1965.640315489294, 0, -3669.195255580015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.460111987470261, 0, -72.80149316627014, 0, 131.0426876992863, 0, 0, 0, 0, 0, 0, 0, 0, + 0.5206012513144292, 0, 0, -17.70044254469059, 0, -22.90645505783488, 0, 0, 0, 0, 28.63306882229361, 0, 801.7259270242209, 0, 76.35485019278295, 0, 0, 0, 0, 0, 0, 68.71936517350465, 0, -2061.58095520514, 0, -2748.774606940186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.17984129337616, 0, -962.0711124290651, 0, 9620.711124290651, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34.35968258675233, 0, 1717.984129337616, 0, -6413.807416193768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.685411261829863, 0, -206.158095520514, 0, 687.1936517350465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4.993431784259574, 0, 0, 0, 0, 219.7109985074212, 0, 36.61849975123687, 0, 0, 0, 0, 0, 0, -823.9162444028297, 0, -1647.832488805659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7689.884947759744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 823.9162444028297, 0, -7689.884947759744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -219.7109985074212, 0, 1647.832488805659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.993431784259574, 0, -36.61849975123687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.5884815793403977, 0, 0, 31.77800528438147, 0, 14.12355790416954, 0, 0, 0, 0, -161.8324343186094, 0, -776.7956847293249, 0, 0, 0, 0, 0, 0, 0, 0, 77.67956847293249, 0, 4660.774108375949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174.7790290640981, 0, -6525.083751726329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -90.62616321842124, 0, 2330.387054187975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.473297372744374, 0, -155.359136945865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4.161193153549645, 0, 0, 0, 0, -274.6387481342766, 0, 0, 0, 0, 0, 0, 0, 0, 2059.790611007074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3844.942473879872, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2059.790611007074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -274.6387481342766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.161193153549645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.8160771188376283, 0, 0, -63.65401526933501, 0, 0, 0, 0, 0, 0, 583.4951399689042, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1400.38833592537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1050.291251944028, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -233.3980559875617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.60900254488917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 11.62730916290334, 0, 0, 0, 0, -302.3100382354867, 0, 0, 0, 0, 0, 0, 0, 0, 1662.705210295177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2850.351789077446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1662.705210295177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -302.3100382354867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11.62730916290334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 57.13122714353754, 0, 0, 0, 0, 0, 0, -1256.886997157826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5655.991487210216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7541.321982946955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3142.217492894565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -342.7873628612252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.394709780272118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7.176531019523646, 0, 0, 0, 0, 124.3932043384099, 0, 186.5898065076148, 0, 0, 0, 0, 0, 0, -342.0813119306271, 0, -3420.813119306271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12314.92722950258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 342.0813119306271, 0, -12314.92722950258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124.3932043384099, 0, 3420.813119306271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.176531019523646, 0, -186.5898065076148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -58.09962199636542, 0, 0, 0, 0, 0, 0, 813.3947079491158, 0, 464.7969759709233, 0, 0, 0, 0, 0, 0, 0, 0, -1568.689793901866, 0, -6971.95463956385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -697.195463956385, 0, 19521.47299077878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1452.490549909135, 0, -13943.9092791277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -285.2163261639757, 0, 2323.984879854617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.281783817851402, 0, -42.25427054281121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5.281783817851402, 0, 0, 0, 0, -52.81783817851402, 0, -253.5256232568673, 0, 0, 0, 0, 0, 0, 11.61992439927308, 0, 2788.78185582554, 0, 929.5939519418467, 0, 0, 0, 0, 0, 0, 0, 0, 139.439092791277, 0, -3346.538226990648, 0, -11155.12742330216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11.61992439927308, 0, -3346.538226990648, 0, 23425.76758893454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52.81783817851402, 0, 2788.78185582554, 0, -11155.12742330216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.281783817851402, 0, -253.5256232568673, 0, 929.5939519418467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52.07313853625346, 0, 0, 0, 0, 0, 0, -381.8696825991921, 0, -763.7393651983841, 0, 0, 0, 0, 0, 0, 0, 0, -190.934841299596, 0, 6364.494709986534, 0, 1527.478730396768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 763.7393651983841, 0, -3564.117037592459, 0, -14256.46815036984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318.2247354993267, 0, -7637.393651983841, 0, 21384.70222555475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -196.720745581402, 0, 2970.097531327049, 0, -6109.914921587073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.78590428180594, 0, -84.85992946648712, 0, 169.7198589329742, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3.940231044985851, 0, 0, 0, 0, 15.7609241799434, 0, 260.0552489690662, 0, 0, 0, 0, 0, 0, 43.34254149484436, 0, -1300.276244845331, 0, -1733.701659793774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1560.331493814397, 0, 10402.20995876265, 0, 2080.441991752529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43.34254149484436, 0, 1560.331493814397, 0, 0, 0, -14563.0939422677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15.7609241799434, 0, 1300.276244845331, 0, -10402.20995876265, 0, 14563.0939422677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.940231044985851, 0, -260.0552489690662, 0, 1733.701659793774, 0, -2080.441991752529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -42.78485868831644, 0, 0, 0, 0, 0, 0, 85.56971737663287, 0, 855.6971737663287, 0, 0, 0, 0, 0, 0, 0, 0, 385.0637281948479, 0, -2567.091521298986, 0, -3080.509825558783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220.0364161113417, 0, -5134.183042597972, 0, 12322.03930223513, 0, 2347.055105187644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152.8030667439873, 0, 733.4547203711389, 0, 6161.019651117567, 0, -11735.27552593822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -110.0182080556708, 0, 2322.606614508606, 0, -8801.456644453667, 0, 7041.165315562933, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.112122669759491, 0, -122.2424533951898, 0, 440.0728322226833, 0, -335.2935864553778, 0, 0, 0, 0, 0, 0, 0, + 0, 2.829363009969403, 0, 0, 0, 0, 1.886242006646268, 0, -226.3490407975522, 0, 0, 0, 0, 0, 0, -17.91929906313955, 0, 75.44968026585074, 0, 2037.14136717797, 0, 0, 0, 0, 0, 0, 0, 0, -33.95235611963283, 0, 1358.094244785313, 0, -2716.188489570627, 0, -4345.901583313003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.91929906313955, 0, 1358.094244785313, 0, -9506.659713497193, 0, 10140.43702773034, 0, 2172.950791656501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.886242006646268, 0, 75.44968026585074, 0, -2716.188489570627, 0, 10140.43702773034, 0, -7243.169305521671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.829363009969403, 0, -226.3490407975522, 0, 2037.14136717797, 0, -4345.901583313003, 0, 2172.950791656501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31.633240116575, 0, 0, 0, 0, 0, 0, 63.26648023315, 0, -759.1977627977999, 0, 0, 0, 0, 0, 0, 0, 0, -56.939832209835, 0, -759.1977627977999, 0, 3644.14926142944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -227.75932883934, 0, 2125.75373583384, 0, 0, 0, -4858.86568190592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183.472792676135, 0, 3340.47015631032, 0, -10203.61793200243, 0, 4858.86568190592, 0, 1619.62189396864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37.95988813989, 0, 1062.87686791692, 0, -5830.638818287104, 0, 8745.958227430655, 0, -3239.24378793728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.326648023315, 0, -151.83955255956, 0, 728.8298522858879, 0, -971.7731363811839, 0, 323.924378793728, 0, 0, 0, 0, 0, + 0, -1.835933153488193, 0, 0, 0, 0, -7.343732613952774, 0, 165.2339838139374, 0, 0, 0, 0, 0, 0, -9.179665767440967, 0, 495.7019514418122, 0, -1762.495827348666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330.4679676278748, 0, -3524.991654697331, 0, 4934.988316576264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.179665767440967, 0, -330.4679676278748, 0, 0, 0, 4934.988316576264, 0, -4229.989985636798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.343732613952774, 0, -495.7019514418122, 0, 3524.991654697331, 0, -4934.988316576264, 0, 0, 0, 939.997774585955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.835933153488193, 0, -165.2339838139374, 0, 1762.495827348666, 0, -4934.988316576264, 0, 4229.989985636798, 0, -939.997774585955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -19.37540204348254, 0, 0, 0, 0, 0, 0, -90.41854286958517, 0, 516.677387826201, 0, 0, 0, 0, 0, 0, 0, 0, -161.4616836956878, 0, 1894.483755362737, 0, -2893.393371826726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -129.1693469565502, 0, 2411.161143188938, 0, -7715.715658204601, 0, 4960.10292313153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32.29233673913756, 0, 1033.354775652402, 0, -5786.786743653451, 0, 8266.838205219216, 0, -2755.612735073072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12.91693469565502, 0, -172.225795942067, 0, 0, 0, 1653.367641043843, 0, -1837.075156715381, 0, 400.8163978288105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.458467347827512, 0, -172.225795942067, 0, 964.4644572755752, 0, -1653.367641043843, 0, 918.5375783576907, 0, -133.6054659429368, 0, 0, 0, + 0, 0.9043663200508067, 0, 0, 0, 0, 5.42619792030484, 0, -86.81916672487744, 0, 0, 0, 0, 0, 0, 13.5654948007621, 0, -434.0958336243872, 0, 1012.890278456903, 0, 0, 0, 0, 0, 0, 0, 0, 18.08732640101613, 0, -868.1916672487744, 0, 4051.561113827614, 0, -3241.248891062091, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.5654948007621, 0, -868.1916672487744, 0, 6077.341670741421, 0, -9723.746673186273, 0, 3472.766668995098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.42619792030484, 0, -434.0958336243872, 0, 4051.561113827614, 0, -9723.746673186273, 0, 6945.533337990195, 0, -1234.761482309368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.9043663200508067, 0, -86.81916672487744, 0, 1012.890278456903, 0, -3241.248891062091, 0, 3472.766668995098, 0, -1234.761482309368, 0, 112.2510438463062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6.521478277491721, 0, 0, 0, 0, 0, 0, 39.12886966495032, 0, -182.6013917697682, 0, 0, 0, 0, 0, 0, 0, 0, 97.82217416237581, 0, -913.0069588488409, 0, 1095.608350618609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130.4295655498344, 0, -1826.013917697682, 0, 4382.433402474436, 0, -2086.873048797351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97.82217416237581, 0, -1826.013917697682, 0, 6573.650103711654, 0, -6260.619146392052, 0, 1391.248699198234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39.12886966495032, 0, -913.0069588488409, 0, 4382.433402474436, 0, -6260.619146392052, 0, 2782.497398396467, 0, -303.5451707341601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.521478277491721, 0, -182.6013917697682, 0, 1095.608350618609, 0, -2086.873048797351, 0, 1391.248699198234, 0, -303.5451707341601, 0, 15.56641901200821, 0, + -0.3182155563368222, 0, 0, -2.227508894357756, 0, 31.18512452100858, 0, 0, 0, 0, -6.682526683073267, 0, 187.1107471260515, 0, -374.2214942521029, 0, 0, 0, 0, 0, 0, -11.13754447178878, 0, 467.7768678151287, 0, -1871.107471260515, 0, 1247.404980840343, 0, 0, 0, 0, 0, 0, 0, 0, -11.13754447178878, 0, 623.7024904201716, 0, -3742.214942521029, 0, 4989.619923361373, 0, -1425.605692388964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.682526683073267, 0, 467.7768678151287, 0, -3742.214942521029, 0, 7484.429885042059, 0, -4276.817077166891, 0, 570.2422769555854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.227508894357756, 0, 187.1107471260515, 0, -1871.107471260515, 0, 4989.619923361373, 0, -4276.817077166891, 0, 1140.484553911171, 0, -69.12027599461642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.3182155563368222, 0, 31.18512452100858, 0, -374.2214942521029, 0, 1247.404980840343, 0, -1425.605692388964, 0, 570.2422769555854, 0, -69.12027599461642, 0, 1.519126944936625, + 0, 0, 6.521478277491721, 0, 0, 0, 0, 39.12886966495032, 0, -182.6013917697682, 0, 0, 0, 0, 0, 0, 97.82217416237581, 0, -913.0069588488409, 0, 1095.608350618609, 0, 0, 0, 0, 0, 0, 0, 0, 130.4295655498344, 0, -1826.013917697682, 0, 4382.433402474436, 0, -2086.873048797351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97.82217416237581, 0, -1826.013917697682, 0, 6573.650103711654, 0, -6260.619146392052, 0, 1391.248699198234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39.12886966495032, 0, -913.0069588488409, 0, 4382.433402474436, 0, -6260.619146392052, 0, 2782.497398396467, 0, -303.5451707341601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.521478277491721, 0, -182.6013917697682, 0, 1095.608350618609, 0, -2086.873048797351, 0, 1391.248699198234, 0, -303.5451707341601, 0, 15.56641901200821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.4521831600254033, 0, 0, 2.260915800127017, 0, -43.40958336243872, 0, 0, 0, 0, 4.06964844022863, 0, -173.6383334497549, 0, 506.4451392284517, 0, 0, 0, 0, 0, 0, 2.260915800127017, 0, -217.0479168121936, 0, 1519.335417685355, 0, -1620.624445531046, 0, 0, 0, 0, 0, 0, 0, 0, -2.260915800127017, 0, 0, 0, 1012.890278456903, 0, -3241.248891062091, 0, 1736.383334497549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.06964844022863, 0, 217.0479168121936, 0, -1012.890278456903, 0, 0, 0, 1736.383334497549, 0, -617.380741154684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.260915800127017, 0, 173.6383334497549, 0, -1519.335417685355, 0, 3241.248891062091, 0, -1736.383334497549, 0, 0, 0, 56.12552192315309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4521831600254033, 0, 43.40958336243872, 0, -506.4451392284517, 0, 1620.624445531046, 0, -1736.383334497549, 0, 617.380741154684, 0, -56.12552192315309, 0, 0, + 0, 0, -6.458467347827512, 0, 0, 0, 0, -12.91693469565502, 0, 172.225795942067, 0, 0, 0, 0, 0, 0, 32.29233673913756, 0, 172.225795942067, 0, -964.4644572755752, 0, 0, 0, 0, 0, 0, 0, 0, 129.1693469565502, 0, -1033.354775652402, 0, 0, 0, 1653.367641043843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161.4616836956878, 0, -2411.161143188938, 0, 5786.786743653451, 0, -1653.367641043843, 0, -918.5375783576907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90.41854286958517, 0, -1894.483755362737, 0, 7715.715658204601, 0, -8266.838205219216, 0, 1837.075156715381, 0, 133.6054659429368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19.37540204348254, 0, -516.677387826201, 0, 2893.393371826726, 0, -4960.10292313153, 0, 2755.612735073072, 0, -400.8163978288105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.4589832883720484, 0, 0, 0.4589832883720484, 0, 41.30849595348435, 0, 0, 0, 0, 8.720682479068919, 0, -82.6169919069687, 0, -440.6239568371664, 0, 0, 0, 0, 0, 0, 20.65424797674218, 0, -702.244431209234, 0, 1321.871870511499, 0, 1233.747079144066, 0, 0, 0, 0, 0, 0, 0, 0, 20.65424797674218, 0, -1156.637886697562, 0, 6168.73539572033, 0, -4934.988316576264, 0, -1057.497496409199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.720682479068919, 0, -702.244431209234, 0, 6168.73539572033, 0, -12337.47079144066, 0, 5287.487482045997, 0, 234.9994436464888, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4589832883720484, 0, -82.6169919069687, 0, 1321.871870511499, 0, -4934.988316576264, 0, 5287.487482045997, 0, -1409.996661878933, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4589832883720484, 0, 41.30849595348435, 0, -440.6239568371664, 0, 1233.747079144066, 0, -1057.497496409199, 0, 234.9994436464888, 0, 0, 0, 0, + 0, 0, 6.326648023315, 0, 0, 0, 0, -37.95988813989, 0, -151.83955255956, 0, 0, 0, 0, 0, 0, -183.472792676135, 0, 1062.87686791692, 0, 728.8298522858879, 0, 0, 0, 0, 0, 0, 0, 0, -227.75932883934, 0, 3340.47015631032, 0, -5830.638818287104, 0, -971.7731363811839, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56.939832209835, 0, 2125.75373583384, 0, -10203.61793200243, 0, 8745.958227430655, 0, 323.924378793728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63.26648023315, 0, -759.1977627977999, 0, 0, 0, 4858.86568190592, 0, -3239.24378793728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31.633240116575, 0, -759.1977627977999, 0, 3644.14926142944, 0, -4858.86568190592, 0, 1619.62189396864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.4715605016615671, 0, 0, -5.187165518277238, 0, -37.72484013292537, 0, 0, 0, 0, -18.39085956480112, 0, 452.6980815951044, 0, 339.5235611963283, 0, 0, 0, 0, 0, 0, -12.73213354486231, 0, 1018.570683588985, 0, -4413.806295552268, 0, -724.3169305521671, 0, 0, 0, 0, 0, 0, 0, 0, 12.73213354486231, 0, 0, 0, -4753.329856748596, 0, 10140.43702773034, 0, 362.1584652760835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18.39085956480112, 0, -1018.570683588985, 0, 4753.329856748596, 0, 0, 0, -5432.376979141253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.187165518277238, 0, -452.6980815951044, 0, 4413.806295552268, 0, -10140.43702773034, 0, 5432.376979141253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4715605016615671, 0, 37.72484013292537, 0, -339.5235611963283, 0, 724.3169305521671, 0, -362.1584652760835, 0, 0, 0, 0, 0, 0, + 0, 0, -6.112122669759491, 0, 0, 0, 0, 110.0182080556708, 0, 122.2424533951898, 0, 0, 0, 0, 0, 0, 152.8030667439873, 0, -2322.606614508606, 0, -440.0728322226833, 0, 0, 0, 0, 0, 0, 0, 0, -220.0364161113417, 0, -733.4547203711389, 0, 8801.456644453667, 0, 335.2935864553778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -385.0637281948479, 0, 5134.183042597972, 0, -6161.019651117567, 0, -7041.165315562933, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -85.56971737663287, 0, 2567.091521298986, 0, -12322.03930223513, 0, 11735.27552593822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42.78485868831644, 0, -855.6971737663287, 0, 3080.509825558783, 0, -2347.055105187644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.4925288806232314, 0, 0, 12.31322201558078, 0, 32.50690612113327, 0, 0, 0, 0, 5.417817686855545, 0, -845.179559149465, 0, -216.7127074742218, 0, 0, 0, 0, 0, 0, -48.7603591816999, 0, 487.603591816999, 0, 5851.243101803988, 0, 260.0552489690662, 0, 0, 0, 0, 0, 0, 0, 0, -48.7603591816999, 0, 2730.580114175195, 0, -9101.933713917315, 0, -7281.546971133852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.417817686855545, 0, 487.603591816999, 0, -9101.933713917315, 0, 18203.86742783463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12.31322201558078, 0, -845.179559149465, 0, 5851.243101803988, 0, -7281.546971133852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4925288806232314, 0, 32.50690612113327, 0, -216.7127074742218, 0, 260.0552489690662, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5.78590428180594, 0, 0, 0, 0, -196.720745581402, 0, -84.85992946648712, 0, 0, 0, 0, 0, 0, 318.2247354993267, 0, 2970.097531327049, 0, 169.7198589329742, 0, 0, 0, 0, 0, 0, 0, 0, 763.7393651983841, 0, -7637.393651983841, 0, -6109.914921587073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -190.934841299596, 0, -3564.117037592459, 0, 21384.70222555475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -381.8696825991921, 0, 6364.494709986534, 0, -14256.46815036984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52.07313853625346, 0, -763.7393651983841, 0, 1527.478730396768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.5281783817851402, 0, 0, -22.71167041676103, 0, -25.35256232568673, 0, 0, 0, 0, 63.90958419600196, 0, 1115.512742330216, 0, 92.95939519418467, 0, 0, 0, 0, 0, 0, 87.14943299454813, 0, -4183.17278373831, 0, -4183.17278373831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -87.14943299454813, 0, 0, 0, 19521.47299077878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63.90958419600196, 0, 4183.17278373831, 0, -19521.47299077878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.71167041676103, 0, -1115.512742330216, 0, 4183.17278373831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.5281783817851402, 0, 25.35256232568673, 0, -92.95939519418467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5.281783817851402, 0, 0, 0, 0, 285.2163261639757, 0, 42.25427054281121, 0, 0, 0, 0, 0, 0, -1452.490549909135, 0, -2323.984879854617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 697.195463956385, 0, 13943.9092791277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1568.689793901866, 0, -19521.47299077878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -813.3947079491158, 0, 6971.95463956385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58.09962199636542, 0, -464.7969759709233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.5980442516269705, 0, 0, 38.87287635575308, 0, 15.54915054230123, 0, 0, 0, 0, -256.5609839479703, 0, -1026.243935791881, 0, 0, 0, 0, 0, 0, 0, 0, 256.5609839479703, 0, 7696.82951843911, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256.5609839479703, 0, -14367.41510108634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -256.5609839479703, 0, 7696.82951843911, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38.87287635575308, 0, -1026.243935791881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.5980442516269705, 0, 15.54915054230123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4.394709780272118, 0, 0, 0, 0, -342.7873628612252, 0, 0, 0, 0, 0, 0, 0, 0, 3142.217492894565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7541.321982946955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5655.991487210216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1256.886997157826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57.13122714353754, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.830522083064524, 0, 0, -75.57750955887168, 0, 0, 0, 0, 0, 0, 831.3526051475885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2494.057815442766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2494.057815442766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -831.3526051475885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75.57750955887168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.830522083064524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 12.66375976286059, 0, 0, 0, 0, -384.1340461401045, 0, 0, 0, 0, 0, 0, 0, 0, 2535.28470452469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5432.752938267193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4225.47450754115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1152.402138420314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88.64631834002413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.8442506508573726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 64.73811759282017, 0, 0, 0, 0, 0, 0, -1683.191057413324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9257.550815773284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15870.0871127542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9257.550815773284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1683.191057413324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64.73811759282017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7.893350484654575, 0, 0, 0, 0, 165.7603601777461, 0, 221.0138135703281, 0, 0, 0, 0, 0, 0, -607.7879873184023, 0, -4862.303898547218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 260.480565993601, 0, 21880.36754346248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607.7879873184023, 0, -29173.82339128331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -386.7741737480742, 0, 12155.75974636805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46.75292210141556, 0, -1326.082881421969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.6071808065118904, 0, 17.00106258233293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -66.77884815276176, 0, 0, 0, 0, 0, 0, 1157.500034647871, 0, 578.7500173239353, 0, 0, 0, 0, 0, 0, 0, 0, -3183.125095281644, 0, -10610.41698427215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38197.50114337973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3183.125095281644, 0, -38197.50114337973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1157.500034647871, 0, 10610.41698427215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66.77884815276176, 0, -578.7500173239353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5.890314521234328, 0, 0, 0, 0, -76.57408877604626, 0, -306.2963551041851, 0, 0, 0, 0, 0, 0, 76.57408877604626, 0, 4288.148971458591, 0, 1225.18542041674, 0, 0, 0, 0, 0, 0, 0, 0, 229.7222663281388, 0, -8270.001587812996, 0, -18377.7813062511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76.57408877604626, 0, -3675.556261250221, 0, 51457.78765750309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -118.3417735629806, 0, 7657.408877604626, 0, -36755.56261250221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28.38060632958358, 0, -1503.636652329636, 0, 6125.927102083701, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.5354831382940298, 0, 27.84512319128955, 0, -111.3804927651582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 61.05447148378159, 0, 0, 0, 0, 0, 0, -610.5447148378159, 0, -976.8715437405055, 0, 0, 0, 0, 0, 0, 0, 0, 134.3198372643195, 0, 10745.58698114556, 0, 2149.117396229112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1611.838047171834, 0, -12894.70437737467, 0, -25789.40875474934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134.3198372643195, 0, -12894.70437737467, 0, 54157.75838497362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -610.5447148378159, 0, 10745.58698114556, 0, -25789.40875474934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61.05447148378159, 0, -976.8715437405055, 0, 2149.117396229112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4.486569049517132, 0, 0, 0, 0, 28.4149373136085, 0, 323.0329715652335, 0, 0, 0, 0, 0, 0, 49.35225954468845, 0, -2368.908458145046, 0, -2368.908458145046, 0, 0, 0, 0, 0, 0, 0, 0, -49.35225954468845, 0, -1184.454229072523, 0, 19740.90381787538, 0, 3158.544610860061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -93.22093469552263, 0, 4737.816916290091, 0, -11054.90613801021, 0, -29479.74970136057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.46866111553997, 0, 1974.090381787538, 0, -23689.08458145046, 0, 44219.62455204085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16.45075318156282, 0, -1220.34678146866, 0, 9212.421781675177, 0, -12634.17844344024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4985076721685702, 0, 35.89255239613705, 0, -263.2120509050051, 0, 350.9494012066734, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -51.69118335186266, 0, 0, 0, 0, 0, 0, 206.7647334074506, 0, 1137.206033740979, 0, 0, 0, 0, 0, 0, 0, 0, 568.6030168704893, 0, -5686.030168704893, 0, -4548.824134963914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6823.236202445871, 0, 27292.94480978348, 0, 3898.992115683355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -568.6030168704893, 0, 6823.236202445871, 0, 0, 0, -27292.94480978348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -206.7647334074506, 0, 5686.030168704893, 0, -27292.94480978348, 0, 27292.94480978348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51.69118335186266, 0, -1137.206033740979, 0, 4548.824134963914, 0, -3898.992115683355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3.334384020345036, 0, 0, 0, 0, -3.334384020345036, 0, -293.4257937903632, 0, 0, 0, 0, 0, 0, -36.6782242237954, 0, 586.8515875807264, 0, 2934.257937903632, 0, 0, 0, 0, 0, 0, 0, 0, -47.15771685916551, 0, 2640.832144113269, 0, -8802.773813710896, 0, -7042.219050968717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.239746317685057, 0, 1509.046939493296, 0, -17605.54762742179, 0, 28168.87620387487, 0, 4024.125171982124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20.48264469640522, 0, -1047.949263537011, 0, 2515.078232488827, 0, 14084.43810193743, 0, -20120.62585991062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.097789763695088, 0, -754.5234697466482, 0, 7964.414402881287, 0, -20120.62585991062, 0, 12072.37551594637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4763405743350052, 0, 41.91797054148046, 0, -419.1797054148046, 0, 1006.031292995531, 0, -574.8750245688748, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 40.21623606427654, 0, 0, 0, 0, 0, 0, 26.81082404285103, 0, -1072.432961714041, 0, 0, 0, 0, 0, 0, 0, 0, -254.7028284070847, 0, 357.4776539046803, 0, 5791.137993255822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -482.5948327713185, 0, 6434.597770284246, 0, -7721.517324341095, 0, -8824.591227818395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -254.7028284070847, 0, 6434.597770284246, 0, -27025.31063519383, 0, 20590.71286490959, 0, 3431.785477484931, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26.81082404285103, 0, 357.4776539046803, 0, -7721.517324341095, 0, 20590.71286490959, 0, -11439.28492494977, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40.21623606427654, 0, -1072.432961714041, 0, 5791.137993255822, 0, -8824.591227818395, 0, 3431.785477484931, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2.312653286194929, 0, 0, 0, 0, -6.937959858584787, 0, 231.2653286194929, 0, 0, 0, 0, 0, 0, -0.4625306572389858, 0, 462.5306572389858, 0, -2775.183943433915, 0, 0, 0, 0, 0, 0, 0, 0, 20.81387957575436, 0, -416.2775915150872, 0, -2775.183943433915, 0, 8880.588618988527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30.06449272053408, 0, -1665.110366060349, 0, 7770.515041614961, 0, 0, 0, -8880.588618988527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16.1885730033645, 0, -1341.338905993059, 0, 12210.80935110922, 0, -24865.64813316788, 0, 8880.588618988527, 0, 2368.156965063607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.312653286194929, 0, -277.5183943433915, 0, 3885.257520807481, 0, -14208.94179038164, 0, 15985.05951417935, 0, -4736.313930127214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4625306572389858, 0, 46.25306572389858, 0, -555.0367886867829, 0, 1776.117723797705, 0, -1776.117723797705, 0, 473.6313930127214, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -27.44175328360903, 0, 0, 0, 0, 0, 0, -109.7670131344361, 0, 823.252598508271, 0, 0, 0, 0, 0, 0, 0, 0, -137.2087664180452, 0, 2469.757795524813, 0, -5268.816630452934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1646.505197016542, 0, -10537.63326090587, 0, 10537.63326090587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137.2087664180452, 0, -1646.505197016542, 0, 0, 0, 10537.63326090587, 0, -7025.088840603912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109.7670131344361, 0, -2469.757795524813, 0, 10537.63326090587, 0, -10537.63326090587, 0, 0, 0, 1277.288880109802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27.44175328360903, 0, -823.252598508271, 0, 5268.816630452934, 0, -10537.63326090587, 0, 7025.088840603912, 0, -1277.288880109802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1.363030880952603, 0, 0, 0, 0, 7.723841658731416, 0, -147.2073351428811, 0, 0, 0, 0, 0, 0, 17.71940145238384, 0, -686.9675640001119, 0, 1962.764468571748, 0, 0, 0, 0, 0, 0, 0, 0, 20.44546321428904, 0, -1226.727792857343, 0, 7196.803051429743, 0, -7327.654016001193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11.35859067460502, 0, -981.3822342858741, 0, 9159.567520001492, 0, -19540.41070933652, 0, 9421.269449144391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.363030880952603, 0, -245.3455585714685, 0, 3925.528937143496, 0, -14655.30803200239, 0, 15702.11574857399, 0, -4187.230866286396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.363030880952603, 0, 98.13822342858741, 0, -654.2548228572494, 0, 0, 0, 3140.423149714797, 0, -2791.487244190931, 0, 507.543135307442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.454343626984201, 0, 49.0691117142937, 0, -654.2548228572494, 0, 2442.551338667064, 0, -3140.423149714797, 0, 1395.743622095465, 0, -169.1810451024807, 0, 0, 0, + 0, 0, 0, 0, 13.90024211921377, 0, 0, 0, 0, 0, 0, 83.40145271528264, 0, -444.8077478148407, 0, 0, 0, 0, 0, 0, 0, 0, 208.5036317882066, 0, -2224.038739074204, 0, 3113.654234703885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278.0048423842755, 0, -4448.077478148407, 0, 12454.61693881554, 0, -7116.923965037452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208.5036317882066, 0, -4448.077478148407, 0, 18681.92540822331, 0, -21350.77189511235, 0, 5930.769970864543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83.40145271528264, 0, -2224.038739074204, 0, 12454.61693881554, 0, -21350.77189511235, 0, 11861.53994172909, 0, -1725.31490061514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.90024211921377, 0, -444.8077478148407, 0, 3113.654234703885, 0, -7116.923965037452, 0, 5930.769970864543, 0, -1725.31490061514, 0, 132.7165308165492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.4505094349975498, 0, 0, 0, 0, -3.153566044982849, 0, 50.45705671972558, 0, 0, 0, 0, 0, 0, -9.460698134948546, 0, 302.7423403183535, 0, -706.3987940761581, 0, 0, 0, 0, 0, 0, 0, 0, -15.76783022491424, 0, 756.8558507958837, 0, -3531.99397038079, 0, 2825.595176304632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15.76783022491424, 0, 1009.141134394512, 0, -7063.987940761581, 0, 11302.38070521853, 0, -4036.564537578046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.460698134948546, 0, 756.8558507958837, 0, -7063.987940761581, 0, 16953.57105782779, 0, -12109.69361273414, 0, 2152.834420041625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.153566044982849, 0, 302.7423403183535, 0, -3531.99397038079, 0, 11302.38070521853, 0, -12109.69361273414, 0, 4305.668840083249, 0, -391.4244400075681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4505094349975498, 0, 50.45705671972558, 0, -706.3987940761581, 0, 2825.595176304632, 0, -4036.564537578046, 0, 2152.834420041625, 0, -391.4244400075681, 0, 17.20546989044255, 0, + 0, 0, -4.935083598341307, 0, 0, 0, 0, -34.54558518838915, 0, 161.2127308791494, 0, 0, 0, 0, 0, 0, -103.6367555651675, 0, 967.2763852748962, 0, -1160.731662329875, 0, 0, 0, 0, 0, 0, 0, 0, -172.7279259419458, 0, 2418.190963187241, 0, -5803.658311649377, 0, 2763.646815071132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -172.7279259419458, 0, 3224.254617582987, 0, -11607.31662329875, 0, 11054.58726028453, 0, -2456.574946729895, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -103.6367555651675, 0, 2418.190963187241, 0, -11607.31662329875, 0, 16581.88089042679, 0, -7369.724840189685, 0, 803.9699825661475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34.54558518838915, 0, 967.2763852748962, 0, -5803.658311649377, 0, 11054.58726028453, 0, -7369.724840189685, 0, 1607.939965132295, 0, -82.4584597503741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.935083598341307, 0, 161.2127308791494, 0, -1160.731662329875, 0, 2763.646815071132, 0, -2456.574946729895, 0, 803.9699825661475, 0, -82.4584597503741, 0, 1.570637328578554, + -0.4505094349975498, 0, 0, -3.153566044982849, 0, 50.45705671972558, 0, 0, 0, 0, -9.460698134948546, 0, 302.7423403183535, 0, -706.3987940761581, 0, 0, 0, 0, 0, 0, -15.76783022491424, 0, 756.8558507958837, 0, -3531.99397038079, 0, 2825.595176304632, 0, 0, 0, 0, 0, 0, 0, 0, -15.76783022491424, 0, 1009.141134394512, 0, -7063.987940761581, 0, 11302.38070521853, 0, -4036.564537578046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.460698134948546, 0, 756.8558507958837, 0, -7063.987940761581, 0, 16953.57105782779, 0, -12109.69361273414, 0, 2152.834420041625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.153566044982849, 0, 302.7423403183535, 0, -3531.99397038079, 0, 11302.38070521853, 0, -12109.69361273414, 0, 4305.668840083249, 0, -391.4244400075681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4505094349975498, 0, 50.45705671972558, 0, -706.3987940761581, 0, 2825.595176304632, 0, -4036.564537578046, 0, 2152.834420041625, 0, -391.4244400075681, 0, 17.20546989044255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6.950121059606886, 0, 0, 0, 0, 34.75060529803443, 0, -222.4038739074204, 0, 0, 0, 0, 0, 0, 62.55108953646198, 0, -889.6154956296814, 0, 1556.827117351943, 0, 0, 0, 0, 0, 0, 0, 0, 34.75060529803443, 0, -1112.019369537102, 0, 4670.481352055828, 0, -3558.461982518726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34.75060529803443, 0, 0, 0, 3113.654234703885, 0, -7116.923965037452, 0, 2965.384985432271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62.55108953646198, 0, 1112.019369537102, 0, -3113.654234703885, 0, 0, 0, 2965.384985432271, 0, -862.6574503075699, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34.75060529803443, 0, 889.6154956296814, 0, -4670.481352055828, 0, 7116.923965037452, 0, -2965.384985432271, 0, 0, 0, 66.35826540827461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.950121059606886, 0, 222.4038739074204, 0, -1556.827117351943, 0, 3558.461982518726, 0, -2965.384985432271, 0, 862.6574503075699, 0, -66.35826540827461, 0, 0, + 0.454343626984201, 0, 0, 1.363030880952603, 0, -49.0691117142937, 0, 0, 0, 0, -1.363030880952603, 0, -98.13822342858741, 0, 654.2548228572494, 0, 0, 0, 0, 0, 0, -11.35859067460502, 0, 245.3455585714685, 0, 654.2548228572494, 0, -2442.551338667064, 0, 0, 0, 0, 0, 0, 0, 0, -20.44546321428904, 0, 981.3822342858741, 0, -3925.528937143496, 0, 0, 0, 3140.423149714797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.71940145238384, 0, 1226.727792857343, 0, -9159.567520001492, 0, 14655.30803200239, 0, -3140.423149714797, 0, -1395.743622095465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.723841658731416, 0, 686.9675640001119, 0, -7196.803051429743, 0, 19540.41070933652, 0, -15702.11574857399, 0, 2791.487244190931, 0, 169.1810451024807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.363030880952603, 0, 147.2073351428811, 0, -1962.764468571748, 0, 7327.654016001193, 0, -9421.269449144391, 0, 4187.230866286396, 0, -507.543135307442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -6.860438320902258, 0, 0, 0, 0, 6.860438320902258, 0, 205.8131496270677, 0, 0, 0, 0, 0, 0, 130.3483280971429, 0, -411.6262992541355, 0, -1317.204157613234, 0, 0, 0, 0, 0, 0, 0, 0, 308.7197244406016, 0, -3498.823543660152, 0, 3951.612472839701, 0, 2634.408315226467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 308.7197244406016, 0, -5762.768189557897, 0, 18440.85820658527, 0, -10537.63326090587, 0, -1756.272210150978, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130.3483280971429, 0, -3498.823543660152, 0, 18440.85820658527, 0, -26344.08315226467, 0, 8781.36105075489, 0, 319.3222200274506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.860438320902258, 0, -411.6262992541355, 0, 3951.612472839701, 0, -10537.63326090587, 0, 8781.36105075489, 0, -1915.933320164703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.860438320902258, 0, 205.8131496270677, 0, -1317.204157613234, 0, 2634.408315226467, 0, -1756.272210150978, 0, 319.3222200274506, 0, 0, 0, 0, + -0.4625306572389858, 0, 0, 2.312653286194929, 0, 46.25306572389858, 0, 0, 0, 0, 16.1885730033645, 0, -277.5183943433915, 0, -555.0367886867829, 0, 0, 0, 0, 0, 0, 30.06449272053408, 0, -1341.338905993059, 0, 3885.257520807481, 0, 1776.117723797705, 0, 0, 0, 0, 0, 0, 0, 0, 20.81387957575436, 0, -1665.110366060349, 0, 12210.80935110922, 0, -14208.94179038164, 0, -1776.117723797705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4625306572389858, 0, -416.2775915150872, 0, 7770.515041614961, 0, -24865.64813316788, 0, 15985.05951417935, 0, 473.6313930127214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.937959858584787, 0, 462.5306572389858, 0, -2775.183943433915, 0, 0, 0, 8880.588618988527, 0, -4736.313930127214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.312653286194929, 0, 231.2653286194929, 0, -2775.183943433915, 0, 8880.588618988527, 0, -8880.588618988527, 0, 2368.156965063607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6.702706010712756, 0, 0, 0, 0, -73.72976611784032, 0, -178.7388269523402, 0, 0, 0, 0, 0, 0, -261.4055344177975, 0, 2144.865923428082, 0, 965.1896655426369, 0, 0, 0, 0, 0, 0, 0, 0, -180.9730622892444, 0, 4825.948327713185, 0, -12547.46565205428, 0, -1470.765204636399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180.9730622892444, 0, 0, 0, -13512.65531759692, 0, 20590.71286490959, 0, 571.9642462474885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 261.4055344177975, 0, -4825.948327713185, 0, 13512.65531759692, 0, 0, 0, -8579.463693712328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73.72976611784032, 0, -2144.865923428082, 0, 12547.46565205428, 0, -20590.71286490959, 0, 8579.463693712328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.702706010712756, 0, 178.7388269523402, 0, -965.1896655426369, 0, 1470.765204636399, 0, -571.9642462474885, 0, 0, 0, 0, 0, 0, + 0.4763405743350052, 0, 0, -8.097789763695088, 0, -41.91797054148046, 0, 0, 0, 0, -20.48264469640522, 0, 754.5234697466482, 0, 419.1797054148046, 0, 0, 0, 0, 0, 0, 5.239746317685057, 0, 1047.949263537011, 0, -7964.414402881287, 0, -1006.031292995531, 0, 0, 0, 0, 0, 0, 0, 0, 47.15771685916551, 0, -1509.046939493296, 0, -2515.078232488827, 0, 20120.62585991062, 0, 574.8750245688748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36.6782242237954, 0, -2640.832144113269, 0, 17605.54762742179, 0, -14084.43810193743, 0, -12072.37551594637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.334384020345036, 0, -586.8515875807264, 0, 8802.773813710896, 0, -28168.87620387487, 0, 20120.62585991062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.334384020345036, 0, 293.4257937903632, 0, -2934.257937903632, 0, 7042.219050968717, 0, -4024.125171982124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -6.461397918982832, 0, 0, 0, 0, 161.5349479745708, 0, 142.1507542176223, 0, 0, 0, 0, 0, 0, 71.07537710881116, 0, -3695.91960965818, 0, -568.6030168704893, 0, 0, 0, 0, 0, 0, 0, 0, -639.6783939793004, 0, 2132.261313264335, 0, 15352.28145550321, 0, 487.3740144604194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -639.6783939793004, 0, 11940.66335428027, 0, -23881.32670856055, 0, -13646.47240489174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71.07537710881116, 0, 2132.261313264335, 0, -23881.32670856055, 0, 34116.18101222936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161.5349479745708, 0, -3695.91960965818, 0, 15352.28145550321, 0, -13646.47240489174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.461397918982832, 0, 142.1507542176223, 0, -568.6030168704893, 0, 487.3740144604194, 0, 0, 0, 0, 0, 0, 0, 0, + -0.4985076721685702, 0, 0, 16.45075318156282, 0, 35.89255239613705, 0, 0, 0, 0, -10.46866111553997, 0, -1220.34678146866, 0, -263.2120509050051, 0, 0, 0, 0, 0, 0, -93.22093469552263, 0, 1974.090381787538, 0, 9212.421781675177, 0, 350.9494012066734, 0, 0, 0, 0, 0, 0, 0, 0, -49.35225954468845, 0, 4737.816916290091, 0, -23689.08458145046, 0, -12634.17844344024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49.35225954468845, 0, -1184.454229072523, 0, -11054.90613801021, 0, 44219.62455204085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28.4149373136085, 0, -2368.908458145046, 0, 19740.90381787538, 0, -29479.74970136057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.486569049517132, 0, 323.0329715652335, 0, -2368.908458145046, 0, 3158.544610860061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6.105447148378159, 0, 0, 0, 0, -262.5342273802609, 0, -97.68715437405055, 0, 0, 0, 0, 0, 0, 738.7591049537573, 0, 4298.234792458224, 0, 214.9117396229112, 0, 0, 0, 0, 0, 0, 0, 0, 1007.398779482396, 0, -16118.38047171834, 0, -9671.028283031004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1007.398779482396, 0, 0, 0, 45131.46532081135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -738.7591049537573, 0, 16118.38047171834, 0, -45131.46532081135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262.5342273802609, 0, -4298.234792458224, 0, 9671.028283031004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.105447148378159, 0, 97.68715437405055, 0, -214.9117396229112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.5354831382940298, 0, 0, -28.38060632958358, 0, -27.84512319128955, 0, 0, 0, 0, 118.3417735629806, 0, 1503.636652329636, 0, 111.3804927651582, 0, 0, 0, 0, 0, 0, 76.57408877604626, 0, -7657.408877604626, 0, -6125.927102083701, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -229.7222663281388, 0, 3675.556261250221, 0, 36755.56261250221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76.57408877604626, 0, 8270.001587812996, 0, -51457.78765750309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76.57408877604626, 0, -4288.148971458591, 0, 18377.7813062511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.890314521234328, 0, 306.2963551041851, 0, -1225.18542041674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5.564904012730147, 0, 0, 0, 0, 361.7187608274595, 0, 48.22916811032794, 0, 0, 0, 0, 0, 0, -2387.343821461233, 0, -3183.125095281644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2387.343821461233, 0, 23873.43821461233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2387.343821461233, 0, -44563.75133394302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2387.343821461233, 0, 23873.43821461233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 361.7187608274595, 0, -3183.125095281644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.564904012730147, 0, 48.22916811032794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.6071808065118904, 0, 0, 46.75292210141556, 0, 17.00106258233293, 0, 0, 0, 0, -386.7741737480742, 0, -1326.082881421969, 0, 0, 0, 0, 0, 0, 0, 0, 607.7879873184023, 0, 12155.75974636805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 260.480565993601, 0, -29173.82339128331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -607.7879873184023, 0, 21880.36754346248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165.7603601777461, 0, -4862.303898547218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.893350484654575, 0, 221.0138135703281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4.624151256630012, 0, 0, 0, 0, -420.7977643533311, 0, 0, 0, 0, 0, 0, 0, 0, 4628.775407886642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13886.32622365993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13886.32622365993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4628.775407886642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 420.7977643533311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.624151256630012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.8442506508573726, 0, 0, -88.64631834002413, 0, 0, 0, 0, 0, 0, 1152.402138420314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4225.47450754115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5432.752938267193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2535.28470452469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 384.1340461401045, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -12.66375976286059, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + + +static dtype g_trans_cart2jR[] = { + 0, + 1, + 1, + 0, + -0.577350269189625764, + 0, + 0, + 0, + 0, + 0.577350269189625764, + 0, + 0, + -0.577350269189625764, + -0.577350269189625764, + 0, + 0, + 0, + 0, + 0, + 0.707106781186547524, + 0, + 0, + 0.408248290463863016, + 0, + 0, + 0, + 0, + 0.816496580927726033, + 0, + 0, + 0.816496580927726033, + -0.408248290463863016, + 0, + 0, + -0.707106781186547524, + 0, + 0, + 0, + 0, + 0, + -0.345494149471335479, + 0, + 0, + 0.345494149471335479, + 0, + 0, + 0, + 0, + 0.345494149471335479, + 0, + 0, + 0, + 0, + 0, + -0.598413420602149016, + 0, + 0, + 0, + -0.199471140200716338, + 0, + 0, + -0.199471140200716338, + 0, + 0.398942280401432677, + 0.199471140200716338, + 0, + 0, + 0.199471140200716338, + 0, + -0.398942280401432677, + 0, + 0, + -0.598413420602149016, + 0, + 0, + 0, + 0, + 0, + 0.345494149471335479, + 0, + 0, + 0, + 0.345494149471335479, + 0, + 0, + -0.345494149471335479, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.386274202023189580, + 0, + 0, + -0.386274202023189580, + 0, + 0, + 0.172747074735667739, + 0, + 0, + -0.172747074735667739, + 0, + 0, + 0, + 0, + 0.690988298942670958, + 0, + 0, + 0, + 0, + 0, + 0.488602511902919921, + 0, + 0, + 0, + -0.244301255951459960, + 0, + 0, + -0.244301255951459960, + 0, + 0.488602511902919921, + -0.244301255951459960, + 0, + 0, + -0.244301255951459960, + 0, + 0.488602511902919921, + 0, + 0, + -0.488602511902919921, + 0, + 0, + 0, + 0, + 0, + -0.690988298942670958, + 0, + 0, + 0, + 0.172747074735667739, + 0, + 0, + -0.172747074735667739, + 0, + 0, + 0.386274202023189580, + 0, + 0, + -0.386274202023189580, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.386274202023189580, + 0, + 0, + 1.158822606069568741, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.386274202023189580, + 0, + 0, + 0, + 0, + -0.386274202023189580, + 0, + 0, + 0, + 0, + -0.863735373678338698, + 0, + 0, + 0, + 0, + 0.863735373678338698, + 0, + 0, + -0.172747074735667739, + 0, + 0, + -0.172747074735667739, + 0, + 0.690988298942670958, + 0, + 0, + 0, + 0, + 0.244301255951459960, + 0, + 0, + 0.244301255951459960, + 0, + -0.977205023805839843, + 0, + 0, + 0, + 0, + 0, + 0, + -0.732903767854379882, + 0, + 0, + 0, + 0, + -0.732903767854379882, + 0, + 0.488602511902919921, + 0, + 0, + 0.732903767854379882, + 0, + 0, + 0, + 0, + 0.732903767854379882, + 0, + -0.488602511902919921, + 0.244301255951459960, + 0, + 0, + 0.244301255951459960, + 0, + -0.977205023805839843, + 0, + 0, + 0, + 0, + -0.172747074735667739, + 0, + 0, + -0.172747074735667739, + 0, + 0.690988298942670958, + 0, + 0, + 0, + 0, + 0, + 0, + 0.863735373678338698, + 0, + 0, + 0, + 0, + -0.863735373678338698, + 0, + 0, + 0, + 0, + -0.386274202023189580, + 0, + 0, + 0, + 0, + 0.386274202023189580, + 0, + 0, + -0.386274202023189580, + 0, + 0, + 1.158822606069568741, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.417223823632784089, + 0, + 0, + -1.251671470898352269, + 0, + 0, + 0, + 0, + 0, + 0, + 0.157695782626260003, + 0, + 0, + -0.473087347878780009, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.946174695757560018, + 0, + 0, + 0, + 0, + -0.946174695757560018, + 0, + 0, + 0, + 0, + 0.546274215296039535, + 0, + 0, + 0, + 0, + -0.546274215296039535, + 0, + 0, + -0.273137107648019767, + 0, + 0, + -0.273137107648019767, + 0, + 1.092548430592079070, + 0, + 0, + 0, + 0, + -0.211571093830408607, + 0, + 0, + -0.211571093830408607, + 0, + 0.846284375321634430, + 0, + 0, + 0, + 0, + 0, + 0, + -0.846284375321634430, + 0, + 0, + 0, + 0, + -0.846284375321634430, + 0, + 0.564189583547756286, + 0, + 0, + -0.846284375321634430, + 0, + 0, + 0, + 0, + -0.846284375321634430, + 0, + 0.564189583547756286, + 0.211571093830408607, + 0, + 0, + 0.211571093830408607, + 0, + -0.846284375321634430, + 0, + 0, + 0, + 0, + 0.273137107648019767, + 0, + 0, + 0.273137107648019767, + 0, + -1.092548430592079070, + 0, + 0, + 0, + 0, + 0, + 0, + 0.546274215296039535, + 0, + 0, + 0, + 0, + -0.546274215296039535, + 0, + 0, + 0, + 0, + 0.946174695757560018, + 0, + 0, + 0, + 0, + -0.946174695757560018, + 0, + 0, + -0.157695782626260003, + 0, + 0, + 0.473087347878780009, + 0, + 0, + 0, + 0, + 0, + 0, + -0.417223823632784089, + 0, + 0, + 1.251671470898352269, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + + -0.417223823632784089, 0, 0, 2.503342941796704538, 0, 0, 0, 0, 0, 0, -0.417223823632784089, 0, 0, 0, 0, + 0, 0, 0.417223823632784089, 0, 0, 0, 0, -1.251671470898352269, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.103870478383820021, 0, 0, 0, 0, 3.311611435151460063, 0, 0, 0, 0, 0, 0, 0, + -0.157695782626260003, 0, 0, 0, 0, 0.946174695757560018, 0, 0, 0, 0, 0.157695782626260003, 0, -0.946174695757560018, 0, 0, + + 0.273137107648019767, 0, 0, 0, 0, -1.638822645888118605, 0, 0, 0, 0, -0.273137107648019767, 0, 1.638822645888118605, 0, 0, + 0, 0, -0.819411322944059302, 0, 0, 0, 0, -0.819411322944059302, 0, 1.092548430592079070, 0, 0, 0, 0, 0, + + 0, 0, 1.057855469152043038, 0, 0, 0, 0, 1.057855469152043038, 0, -1.410473958869390717, 0, 0, 0, 0, 0, + 0.211571093830408607, 0, 0, 0.423142187660817215, 0, -1.692568750643268860, 0, 0, 0, 0, 0.211571093830408607, 0, -1.692568750643268860, 0, 0.564189583547756286, + + -0.211571093830408607, 0, 0, -0.423142187660817215, 0, 1.692568750643268860, 0, 0, 0, 0, -0.211571093830408607, 0, 1.692568750643268860, 0, -0.564189583547756286, + 0, 0, 1.057855469152043038, 0, 0, 0, 0, 1.057855469152043038, 0, -1.410473958869390717, 0, 0, 0, 0, 0, + + 0, 0, -0.819411322944059302, 0, 0, 0, 0, -0.819411322944059302, 0, 1.092548430592079070, 0, 0, 0, 0, 0, + -0.273137107648019767, 0, 0, 0, 0, 1.638822645888118605, 0, 0, 0, 0, 0.273137107648019767, 0, -1.638822645888118605, 0, 0, + + 0.157695782626260003, 0, 0, 0, 0, -0.946174695757560018, 0, 0, 0, 0, -0.157695782626260003, 0, 0.946174695757560018, 0, 0, + 0, 0, -1.103870478383820021, 0, 0, 0, 0, 3.311611435151460063, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.417223823632784089, 0, 0, 0, 0, -1.251671470898352269, 0, 0, 0, 0, 0, 0, 0, + 0.417223823632784089, 0, 0, -2.503342941796704538, 0, 0, 0, 0, 0, 0, 0.417223823632784089, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.442532692444982632, 0, 0, -2.655196154669895796, 0, 0, 0, 0, 0, 0, 0.442532692444982632, 0, 0, 0, 0, + + 0.147510897481660877, 0, 0, -0.885065384889965265, 0, 0, 0, 0, 0, 0, 0.147510897481660877, 0, 0, 0, 0, + 0, 0, 1.180087179853287020, 0, 0, 0, 0, -3.540261539559861062, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.590043589926643510, 0, 0, 0, 0, -1.770130769779930531, 0, 0, 0, 0, 0, 0, 0, + -0.295021794963321755, 0, 0, 0, 0, 1.770130769779930531, 0, 0, 0, 0, 0.295021794963321755, 0, -1.770130769779930531, 0, 0, + + -0.193137101011594790, 0, 0, 0, 0, 1.158822606069568741, 0, 0, 0, 0, 0.193137101011594790, 0, -1.158822606069568741, 0, 0, + 0, 0, -1.158822606069568741, 0, 0, 0, 0, -1.158822606069568741, 0, 1.545096808092758321, 0, 0, 0, 0, 0, + + 0, 0, -0.946174695757560018, 0, 0, 0, 0, -0.946174695757560018, 0, 1.261566261010080024, 0, 0, 0, 0, 0, + 0.236543673939390004, 0, 0, 0.473087347878780009, 0, -1.892349391515120036, 0, 0, 0, 0, 0.236543673939390004, 0, -1.892349391515120036, 0, 0.630783130505040012, + + 0.236543673939390004, 0, 0, 0.473087347878780009, 0, -1.892349391515120036, 0, 0, 0, 0, 0.236543673939390004, 0, -1.892349391515120036, 0, 0.630783130505040012, + 0, 0, 0.946174695757560018, 0, 0, 0, 0, 0.946174695757560018, 0, -1.261566261010080024, 0, 0, 0, 0, 0, + + 0, 0, 1.158822606069568741, 0, 0, 0, 0, 1.158822606069568741, 0, -1.545096808092758321, 0, 0, 0, 0, 0, + -0.193137101011594790, 0, 0, 0, 0, 1.158822606069568741, 0, 0, 0, 0, 0.193137101011594790, 0, -1.158822606069568741, 0, 0, + + -0.295021794963321755, 0, 0, 0, 0, 1.770130769779930531, 0, 0, 0, 0, 0.295021794963321755, 0, -1.770130769779930531, 0, 0, + 0, 0, -0.590043589926643510, 0, 0, 0, 0, 1.770130769779930531, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.180087179853287020, 0, 0, 0, 0, 3.540261539559861062, 0, 0, 0, 0, 0, 0, 0, + 0.147510897481660877, 0, 0, -0.885065384889965265, 0, 0, 0, 0, 0, 0, 0.147510897481660877, 0, 0, 0, 0, + + 0.442532692444982632, 0, 0, -2.655196154669895796, 0, 0, 0, 0, 0, 0, 0.442532692444982632, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.442532692444982632, 0, 0, 4.425326924449826327, 0, 0, 0, 0, 0, 0, -2.212663462224913163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0.442532692444982632, 0, 0, 0, 0, -2.655196154669895796, 0, 0, 0, 0, 0, 0, 0, 0, 0.442532692444982632, 0, 0, 0, 0, + + 0, 0, -1.327598077334947898, 0, 0, 0, 0, 7.965588464009687389, 0, 0, 0, 0, 0, 0, 0, 0, -1.327598077334947898, 0, 0, 0, 0, + -0.147510897481660877, 0, 0, 0.295021794963321755, 0, 1.180087179853287020, 0, 0, 0, 0, 0.442532692444982632, 0, -3.540261539559861062, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.295021794963321755, 0, 0, -0.590043589926643510, 0, -2.360174359706574041, 0, 0, 0, 0, -0.885065384889965265, 0, 7.080523079119722124, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -0.885065384889965265, 0, 0, 0, 0, 0, 0, 1.770130769779930531, 0, 0, 0, 0, 0, 0, 0.885065384889965265, 0, -1.770130769779930531, 0, 0, + + 0, 0, 1.351959707081163531, 0, 0, 0, 0, 0, 0, -2.703919414162327062, 0, 0, 0, 0, 0, 0, -1.351959707081163531, 0, 2.703919414162327062, 0, 0, + 0.193137101011594790, 0, 0, 0.386274202023189580, 0, -2.317645212139137482, 0, 0, 0, 0, 0.193137101011594790, 0, -2.317645212139137482, 0, 1.545096808092758321, 0, 0, 0, 0, 0, 0, + + -0.236543673939390004, 0, 0, -0.473087347878780009, 0, 2.838524087272680054, 0, 0, 0, 0, -0.236543673939390004, 0, 2.838524087272680054, 0, -1.892349391515120036, 0, 0, 0, 0, 0, 0, + 0, 0, 1.182718369696950022, 0, 0, 0, 0, 2.365436739393900045, 0, -3.153915652525200060, 0, 0, 0, 0, 0, 0, 1.182718369696950022, 0, -3.153915652525200060, 0, 0.630783130505040012, + + 0, 0, -1.182718369696950022, 0, 0, 0, 0, -2.365436739393900045, 0, 3.153915652525200060, 0, 0, 0, 0, 0, 0, -1.182718369696950022, 0, 3.153915652525200060, 0, -0.630783130505040012, + -0.236543673939390004, 0, 0, -0.473087347878780009, 0, 2.838524087272680054, 0, 0, 0, 0, -0.236543673939390004, 0, 2.838524087272680054, 0, -1.892349391515120036, 0, 0, 0, 0, 0, 0, + + 0.193137101011594790, 0, 0, 0.386274202023189580, 0, -2.317645212139137482, 0, 0, 0, 0, 0.193137101011594790, 0, -2.317645212139137482, 0, 1.545096808092758321, 0, 0, 0, 0, 0, 0, + 0, 0, -1.351959707081163531, 0, 0, 0, 0, 0, 0, 2.703919414162327062, 0, 0, 0, 0, 0, 0, 1.351959707081163531, 0, -2.703919414162327062, 0, 0, + + 0, 0, 0.885065384889965265, 0, 0, 0, 0, 0, 0, -1.770130769779930531, 0, 0, 0, 0, 0, 0, -0.885065384889965265, 0, 1.770130769779930531, 0, 0, + 0.295021794963321755, 0, 0, -0.590043589926643510, 0, -2.360174359706574041, 0, 0, 0, 0, -0.885065384889965265, 0, 7.080523079119722124, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.147510897481660877, 0, 0, 0.295021794963321755, 0, 1.180087179853287020, 0, 0, 0, 0, 0.442532692444982632, 0, -3.540261539559861062, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.327598077334947898, 0, 0, 0, 0, -7.965588464009687389, 0, 0, 0, 0, 0, 0, 0, 0, 1.327598077334947898, 0, 0, 0, 0, + + 0, 0, -0.442532692444982632, 0, 0, 0, 0, 2.655196154669895796, 0, 0, 0, 0, 0, 0, 0, 0, -0.442532692444982632, 0, 0, 0, 0, + -0.442532692444982632, 0, 0, 4.425326924449826327, 0, 0, 0, 0, 0, 0, -2.212663462224913163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.464132203440858160, 0, 0, -4.641322034408581606, 0, 0, 0, 0, 0, 0, 2.320661017204290803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.139941124721293271, 0, 0, -1.399411247212932717, 0, 0, 0, 0, 0, 0, 0.699705623606466358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.399411247212932717, 0, 0, 0, 0, -8.396467483277596306, 0, 0, 0, 0, 0, 0, 0, 0, 1.399411247212932717, 0, 0, 0, 0, + + 0, 0, 0.625835735449176134, 0, 0, 0, 0, -3.755014412695056807, 0, 0, 0, 0, 0, 0, 0, 0, 0.625835735449176134, 0, 0, 0, 0, + -0.312917867724588067, 0, 0, 0.625835735449176134, 0, 2.503342941796704538, 0, 0, 0, 0, 0.938753603173764201, 0, -7.510028825390113615, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.180663215165034628, 0, 0, 0.361326430330069256, 0, 1.445305721320277027, 0, 0, 0, 0, 0.541989645495103885, 0, -4.335917163960831083, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.445305721320277027, 0, 0, 0, 0, 0, 0, 2.890611442640554055, 0, 0, 0, 0, 0, 0, 1.445305721320277027, 0, -2.890611442640554055, 0, 0, + + 0, 0, -1.021985476433282363, 0, 0, 0, 0, 0, 0, 2.043970952866564726, 0, 0, 0, 0, 0, 0, 1.021985476433282363, 0, -2.043970952866564726, 0, 0, + 0.255496369108320590, 0, 0, 0.510992738216641181, 0, -3.065956429299847090, 0, 0, 0, 0, 0.255496369108320590, 0, -3.065956429299847090, 0, 2.043970952866564726, 0, 0, 0, 0, 0, 0, + + 0.215933843419584674, 0, 0, 0.431867686839169349, 0, -2.591206121035016094, 0, 0, 0, 0, 0.215933843419584674, 0, -2.591206121035016094, 0, 1.727470747356677396, 0, 0, 0, 0, 0, 0, + 0, 0, 1.295603060517508047, 0, 0, 0, 0, 2.591206121035016094, 0, -3.454941494713354792, 0, 0, 0, 0, 0, 0, 1.295603060517508047, 0, -3.454941494713354792, 0, 0.690988298942670958, + + 0, 0, 1.295603060517508047, 0, 0, 0, 0, 2.591206121035016094, 0, -3.454941494713354792, 0, 0, 0, 0, 0, 0, 1.295603060517508047, 0, -3.454941494713354792, 0, 0.690988298942670958, + -0.215933843419584674, 0, 0, -0.431867686839169349, 0, 2.591206121035016094, 0, 0, 0, 0, -0.215933843419584674, 0, 2.591206121035016094, 0, -1.727470747356677396, 0, 0, 0, 0, 0, 0, + + -0.255496369108320590, 0, 0, -0.510992738216641181, 0, 3.065956429299847090, 0, 0, 0, 0, -0.255496369108320590, 0, 3.065956429299847090, 0, -2.043970952866564726, 0, 0, 0, 0, 0, 0, + 0, 0, -1.021985476433282363, 0, 0, 0, 0, 0, 0, 2.043970952866564726, 0, 0, 0, 0, 0, 0, 1.021985476433282363, 0, -2.043970952866564726, 0, 0, + + 0, 0, -1.445305721320277027, 0, 0, 0, 0, 0, 0, 2.890611442640554055, 0, 0, 0, 0, 0, 0, 1.445305721320277027, 0, -2.890611442640554055, 0, 0, + 0.180663215165034628, 0, 0, -0.361326430330069256, 0, -1.445305721320277027, 0, 0, 0, 0, -0.541989645495103885, 0, 4.335917163960831083, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.312917867724588067, 0, 0, -0.625835735449176134, 0, -2.503342941796704538, 0, 0, 0, 0, -0.938753603173764201, 0, 7.510028825390113615, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0.625835735449176134, 0, 0, 0, 0, -3.755014412695056807, 0, 0, 0, 0, 0, 0, 0, 0, 0.625835735449176134, 0, 0, 0, 0, + + 0, 0, 1.399411247212932717, 0, 0, 0, 0, -8.396467483277596306, 0, 0, 0, 0, 0, 0, 0, 0, 1.399411247212932717, 0, 0, 0, 0, + -0.139941124721293271, 0, 0, 1.399411247212932717, 0, 0, 0, 0, 0, 0, -0.699705623606466358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.464132203440858160, 0, 0, 4.641322034408581606, 0, 0, 0, 0, 0, 0, -2.320661017204290803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.4641322034408583, 0, 0, 6.9619830516128740, 0, 0, 0, 0, 0, 0, -6.9619830516128740, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4641322034408583, 0, 0, 0, 0, 0, 0, + 0, 0, 0.4641322034408583, 0, 0, 0, 0, -4.6413220344085833, 0, 0, 0, 0, 0, 0, 0, 0, 2.3206610172042916, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.5393523719342264, 0, 0, 0, 0, 15.3935237193422640, 0, 0, 0, 0, 0, 0, 0, 0, -7.6967618596711320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.1399411247212932, 0, 0, 0.6997056236064662, 0, 1.3994112472129330, 0, 0, 0, 0, 0.6997056236064662, 0, -8.3964674832775970, 0, 0, 0, 0, 0, 0, 0, 0, -0.1399411247212932, 0, 1.3994112472129330, 0, 0, 0, 0, + + 0.3129178677245880, 0, 0, -1.5645893386229399, 0, -3.1291786772458812, 0, 0, 0, 0, -1.5645893386229399, 0, 18.7750720634752852, 0, 0, 0, 0, 0, 0, 0, 0, 0.3129178677245880, 0, -3.1291786772458812, 0, 0, 0, 0, + 0, 0, -0.9387536031737643, 0, 0, 0, 0, 1.8775072063475287, 0, 2.5033429417967050, 0, 0, 0, 0, 0, 0, 2.8162608095212929, 0, -7.5100288253901146, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.6259689364853118, 0, 0, 0, 0, -3.2519378729706236, 0, -4.3359171639608318, 0, 0, 0, 0, 0, 0, -4.8779068094559346, 0, 13.0077514918824946, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.1806632151650347, 0, 0, 0.1806632151650347, 0, -2.8906114426405547, 0, 0, 0, 0, -0.1806632151650347, 0, 0, 0, 2.8906114426405547, 0, 0, 0, 0, 0, 0, -0.1806632151650347, 0, 2.8906114426405547, 0, -2.8906114426405547, 0, 0, + + -0.2554963691083206, 0, 0, -0.2554963691083206, 0, 4.0879419057331301, 0, 0, 0, 0, 0.2554963691083206, 0, 0, 0, -4.0879419057331301, 0, 0, 0, 0, 0, 0, 0.2554963691083206, 0, -4.0879419057331301, 0, 4.0879419057331301, 0, 0, + 0, 0, 1.2774818455416030, 0, 0, 0, 0, 2.5549636910832061, 0, -5.1099273821664122, 0, 0, 0, 0, 0, 0, 1.2774818455416030, 0, -5.1099273821664122, 0, 2.0439709528665646, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.5115369039370925, 0, 0, 0, 0, -3.0230738078741850, 0, 6.0461476157483700, 0, 0, 0, 0, 0, 0, -1.5115369039370925, 0, 6.0461476157483700, 0, -2.4184590462993478, 0, 0, 0, 0, 0, 0, 0, + -0.2159338434195847, 0, 0, -0.6478015302587540, 0, 3.8868091815525241, 0, 0, 0, 0, -0.6478015302587540, 0, 7.7736183631050482, 0, -5.1824122420700318, 0, 0, 0, 0, 0, 0, -0.2159338434195847, 0, 3.8868091815525241, 0, -5.1824122420700318, 0, 0.6909882989426709, + + 0.2159338434195847, 0, 0, 0.6478015302587540, 0, -3.8868091815525241, 0, 0, 0, 0, 0.6478015302587540, 0, -7.7736183631050482, 0, 5.1824122420700318, 0, 0, 0, 0, 0, 0, 0.2159338434195847, 0, -3.8868091815525241, 0, 5.1824122420700318, 0, -0.6909882989426709, + 0, 0, -1.5115369039370925, 0, 0, 0, 0, -3.0230738078741850, 0, 6.0461476157483700, 0, 0, 0, 0, 0, 0, -1.5115369039370925, 0, 6.0461476157483700, 0, -2.4184590462993478, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.2774818455416030, 0, 0, 0, 0, 2.5549636910832061, 0, -5.1099273821664122, 0, 0, 0, 0, 0, 0, 1.2774818455416030, 0, -5.1099273821664122, 0, 2.0439709528665646, 0, 0, 0, 0, 0, 0, 0, + 0.2554963691083206, 0, 0, 0.2554963691083206, 0, -4.0879419057331301, 0, 0, 0, 0, -0.2554963691083206, 0, 0, 0, 4.0879419057331301, 0, 0, 0, 0, 0, 0, -0.2554963691083206, 0, 4.0879419057331301, 0, -4.0879419057331301, 0, 0, + + -0.1806632151650347, 0, 0, -0.1806632151650347, 0, 2.8906114426405547, 0, 0, 0, 0, 0.1806632151650347, 0, 0, 0, -2.8906114426405547, 0, 0, 0, 0, 0, 0, 0.1806632151650347, 0, -2.8906114426405547, 0, 2.8906114426405547, 0, 0, + 0, 0, 1.6259689364853118, 0, 0, 0, 0, -3.2519378729706236, 0, -4.3359171639608318, 0, 0, 0, 0, 0, 0, -4.8779068094559346, 0, 13.0077514918824946, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -0.9387536031737643, 0, 0, 0, 0, 1.8775072063475287, 0, 2.5033429417967050, 0, 0, 0, 0, 0, 0, 2.8162608095212929, 0, -7.5100288253901146, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.3129178677245880, 0, 0, 1.5645893386229399, 0, 3.1291786772458812, 0, 0, 0, 0, 1.5645893386229399, 0, -18.7750720634752852, 0, 0, 0, 0, 0, 0, 0, 0, -0.3129178677245880, 0, 3.1291786772458812, 0, 0, 0, 0, + + 0.1399411247212932, 0, 0, -0.6997056236064662, 0, -1.3994112472129330, 0, 0, 0, 0, -0.6997056236064662, 0, 8.3964674832775970, 0, 0, 0, 0, 0, 0, 0, 0, 0.1399411247212932, 0, -1.3994112472129330, 0, 0, 0, 0, + 0, 0, -1.5393523719342264, 0, 0, 0, 0, 15.3935237193422640, 0, 0, 0, 0, 0, 0, 0, 0, -7.6967618596711320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.4641322034408583, 0, 0, 0, 0, -4.6413220344085833, 0, 0, 0, 0, 0, 0, 0, 0, 2.3206610172042916, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.4641322034408583, 0, 0, -6.9619830516128740, 0, 0, 0, 0, 0, 0, 6.9619830516128740, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4641322034408583, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.4830841135800663, 0, 0, -7.2462617037009949, 0, 0, 0, 0, 0, 0, 7.2462617037009949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4830841135800663, 0, 0, 0, 0, 0, 0, + + 0.1339834262980768, 0, 0, -2.0097513944711523, 0, 0, 0, 0, 0, 0, 2.0097513944711523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.1339834262980768, 0, 0, 0, 0, 0, 0, + 0, 0, 1.6078011155769223, 0, 0, 0, 0, -16.0780111557692216, 0, 0, 0, 0, 0, 0, 0, 0, 8.0390055778846108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.6563820568401703, 0, 0, 0, 0, -6.5638205684017032, 0, 0, 0, 0, 0, 0, 0, 0, 3.2819102842008516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.3281910284200850, 0, 0, 1.6409551421004249, 0, 3.2819102842008507, 0, 0, 0, 0, 1.6409551421004249, 0, -19.6914617052051035, 0, 0, 0, 0, 0, 0, 0, 0, -0.3281910284200850, 0, 3.2819102842008507, 0, 0, 0, 0, + + -0.1713921747991747, 0, 0, 0.8569608739958732, 0, 1.7139217479917468, 0, 0, 0, 0, 0.8569608739958732, 0, -10.2835304879504807, 0, 0, 0, 0, 0, 0, 0, 0, -0.1713921747991747, 0, 1.7139217479917468, 0, 0, 0, 0, + 0, 0, -1.7139217479917466, 0, 0, 0, 0, 3.4278434959834931, 0, 4.5704579946446584, 0, 0, 0, 0, 0, 0, 5.1417652439752395, 0, -13.7113739839339726, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.0839792909902080, 0, 0, 0, 0, 2.1679585819804159, 0, 2.8906114426405547, 0, 0, 0, 0, 0, 0, 3.2519378729706232, 0, -8.6718343279216636, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.2709948227475520, 0, 0, 0.2709948227475520, 0, -4.3359171639608318, 0, 0, 0, 0, -0.2709948227475520, 0, 0, 0, 4.3359171639608318, 0, 0, 0, 0, 0, 0, -0.2709948227475520, 0, 4.3359171639608318, 0, -4.3359171639608318, 0, 0, + + 0.2019876150713442, 0, 0, 0.2019876150713442, 0, -3.2318018411415070, 0, 0, 0, 0, -0.2019876150713442, 0, 0, 0, 3.2318018411415070, 0, 0, 0, 0, 0, 0, -0.2019876150713442, 0, 3.2318018411415070, 0, -3.2318018411415070, 0, 0, + 0, 0, 1.6159009205707533, 0, 0, 0, 0, 3.2318018411415066, 0, -6.4636036822830132, 0, 0, 0, 0, 0, 0, 1.6159009205707533, 0, -6.4636036822830132, 0, 2.5854414729132049, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.3994112472129328, 0, 0, 0, 0, 2.7988224944258655, 0, -5.5976449888517310, 0, 0, 0, 0, 0, 0, 1.3994112472129328, 0, -5.5976449888517310, 0, 2.2390579955406920, 0, 0, 0, 0, 0, 0, 0, + -0.2332352078688221, 0, 0, -0.6997056236064663, 0, 4.1982337416387976, 0, 0, 0, 0, -0.6997056236064663, 0, 8.3964674832775952, 0, -5.5976449888517301, 0, 0, 0, 0, 0, 0, -0.2332352078688221, 0, 4.1982337416387976, 0, -5.5976449888517301, 0, 0.7463526651802307, + + -0.2332352078688221, 0, 0, -0.6997056236064663, 0, 4.1982337416387976, 0, 0, 0, 0, -0.6997056236064663, 0, 8.3964674832775952, 0, -5.5976449888517301, 0, 0, 0, 0, 0, 0, -0.2332352078688221, 0, 4.1982337416387976, 0, -5.5976449888517301, 0, 0.7463526651802307, + 0, 0, -1.3994112472129328, 0, 0, 0, 0, -2.7988224944258655, 0, 5.5976449888517310, 0, 0, 0, 0, 0, 0, -1.3994112472129328, 0, 5.5976449888517310, 0, -2.2390579955406920, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.6159009205707533, 0, 0, 0, 0, -3.2318018411415066, 0, 6.4636036822830132, 0, 0, 0, 0, 0, 0, -1.6159009205707533, 0, 6.4636036822830132, 0, -2.5854414729132049, 0, 0, 0, 0, 0, 0, 0, + 0.2019876150713442, 0, 0, 0.2019876150713442, 0, -3.2318018411415070, 0, 0, 0, 0, -0.2019876150713442, 0, 0, 0, 3.2318018411415070, 0, 0, 0, 0, 0, 0, -0.2019876150713442, 0, 3.2318018411415070, 0, -3.2318018411415070, 0, 0, + + 0.2709948227475520, 0, 0, 0.2709948227475520, 0, -4.3359171639608318, 0, 0, 0, 0, -0.2709948227475520, 0, 0, 0, 4.3359171639608318, 0, 0, 0, 0, 0, 0, -0.2709948227475520, 0, 4.3359171639608318, 0, -4.3359171639608318, 0, 0, + 0, 0, 1.0839792909902080, 0, 0, 0, 0, -2.1679585819804159, 0, -2.8906114426405547, 0, 0, 0, 0, 0, 0, -3.2519378729706232, 0, 8.6718343279216636, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.7139217479917466, 0, 0, 0, 0, -3.4278434959834931, 0, -4.5704579946446584, 0, 0, 0, 0, 0, 0, -5.1417652439752395, 0, 13.7113739839339726, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.1713921747991747, 0, 0, 0.8569608739958732, 0, 1.7139217479917468, 0, 0, 0, 0, 0.8569608739958732, 0, -10.2835304879504807, 0, 0, 0, 0, 0, 0, 0, 0, -0.1713921747991747, 0, 1.7139217479917468, 0, 0, 0, 0, + + -0.3281910284200850, 0, 0, 1.6409551421004249, 0, 3.2819102842008507, 0, 0, 0, 0, 1.6409551421004249, 0, -19.6914617052051035, 0, 0, 0, 0, 0, 0, 0, 0, -0.3281910284200850, 0, 3.2819102842008507, 0, 0, 0, 0, + 0, 0, -0.6563820568401703, 0, 0, 0, 0, 6.5638205684017032, 0, 0, 0, 0, 0, 0, 0, 0, -3.2819102842008516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.6078011155769223, 0, 0, 0, 0, 16.0780111557692216, 0, 0, 0, 0, 0, 0, 0, 0, -8.0390055778846108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.1339834262980768, 0, 0, -2.0097513944711523, 0, 0, 0, 0, 0, 0, 2.0097513944711523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.1339834262980768, 0, 0, 0, 0, 0, 0, + + 0.4830841135800663, 0, 0, -7.2462617037009949, 0, 0, 0, 0, 0, 0, 7.2462617037009949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4830841135800663, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.4830841135800663, 0, 0, 10.1447663851813932, 0, 0, 0, 0, 0, 0, -16.9079439753023237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.3815887950604644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0.4830841135800661, 0, 0, 0, 0, -7.2462617037009922, 0, 0, 0, 0, 0, 0, 0, 0, 7.2462617037009922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4830841135800661, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.7417845418749984, 0, 0, 0, 0, 26.1267681281249757, 0, 0, 0, 0, 0, 0, 0, 0, -26.1267681281249757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.7417845418749984, 0, 0, 0, 0, 0, 0, + -0.1339834262980768, 0, 0, 1.2058508366826914, 0, 1.6078011155769216, 0, 0, 0, 0, 0.6699171314903840, 0, -16.0780111557692145, 0, 0, 0, 0, 0, 0, 0, 0, -0.6699171314903840, 0, 8.0390055778846072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.3281910284200851, 0, 0, -2.9537192557807663, 0, -3.9382923410410213, 0, 0, 0, 0, -1.6409551421004256, 0, 39.3829234104102142, 0, 0, 0, 0, 0, 0, 0, 0, 1.6409551421004256, 0, -19.6914617052051071, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -0.9845730852602553, 0, 0, 0, 0, 4.9228654263012768, 0, 3.2819102842008512, 0, 0, 0, 0, 0, 0, 4.9228654263012768, 0, -19.6914617052051071, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.9845730852602553, 0, 3.2819102842008512, 0, 0, 0, 0, + + 0, 0, 1.8853139227909212, 0, 0, 0, 0, -9.4265696139546051, 0, -6.2843797426364043, 0, 0, 0, 0, 0, 0, -9.4265696139546051, 0, 37.7062784558184205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.8853139227909212, 0, -6.2843797426364043, 0, 0, 0, 0, + 0.1713921747991747, 0, 0, -0.1713921747991747, 0, -3.4278434959834923, 0, 0, 0, 0, -0.8569608739958733, 0, 6.8556869919669845, 0, 4.5704579946446575, 0, 0, 0, 0, 0, 0, -0.5141765243975239, 0, 10.2835304879504772, 0, -13.7113739839339726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.2709948227475520, 0, 0, 0.2709948227475520, 0, 5.4198964549510391, 0, 0, 0, 0, 1.3549741137377600, 0, -10.8397929099020782, 0, -7.2265286066013861, 0, 0, 0, 0, 0, 0, 0.8129844682426559, 0, -16.2596893648531164, 0, 21.6795858198041600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.3549741137377600, 0, 0, 0, 0, 1.3549741137377600, 0, -7.2265286066013861, 0, 0, 0, 0, 0, 0, -1.3549741137377600, 0, 0, 0, 4.3359171639608327, 0, 0, 0, 0, 0, 0, 0, 0, -1.3549741137377600, 0, 7.2265286066013861, 0, -4.3359171639608327, 0, 0, + + 0, 0, -1.8178885356420982, 0, 0, 0, 0, -1.8178885356420982, 0, 9.6954055234245224, 0, 0, 0, 0, 0, 0, 1.8178885356420982, 0, 0, 0, -5.8172433140547142, 0, 0, 0, 0, 0, 0, 0, 0, 1.8178885356420982, 0, -9.6954055234245224, 0, 5.8172433140547142, 0, 0, + -0.2019876150713442, 0, 0, -0.6059628452140327, 0, 4.8477027617122603, 0, 0, 0, 0, -0.6059628452140327, 0, 9.6954055234245207, 0, -9.6954055234245207, 0, 0, 0, 0, 0, 0, -0.2019876150713442, 0, 4.8477027617122603, 0, -9.6954055234245207, 0, 2.5854414729132063, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.2332352078688221, 0, 0, 0.6997056236064664, 0, -5.5976449888517301, 0, 0, 0, 0, 0.6997056236064664, 0, -11.1952899777034602, 0, 11.1952899777034602, 0, 0, 0, 0, 0, 0, 0.2332352078688221, 0, -5.5976449888517301, 0, 11.1952899777034602, 0, -2.9854106607209236, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.6326464550817545, 0, 0, 0, 0, -4.8979393652452643, 0, 9.7958787304905268, 0, 0, 0, 0, 0, 0, -4.8979393652452643, 0, 19.5917574609810536, 0, -7.8367029843924216, 0, 0, 0, 0, 0, 0, 0, 0, -1.6326464550817545, 0, 9.7958787304905268, 0, -7.8367029843924216, 0, 0.7463526651802307, + + 0, 0, 1.6326464550817545, 0, 0, 0, 0, 4.8979393652452643, 0, -9.7958787304905268, 0, 0, 0, 0, 0, 0, 4.8979393652452643, 0, -19.5917574609810536, 0, 7.8367029843924216, 0, 0, 0, 0, 0, 0, 0, 0, 1.6326464550817545, 0, -9.7958787304905268, 0, 7.8367029843924216, 0, -0.7463526651802307, + 0.2332352078688221, 0, 0, 0.6997056236064664, 0, -5.5976449888517301, 0, 0, 0, 0, 0.6997056236064664, 0, -11.1952899777034602, 0, 11.1952899777034602, 0, 0, 0, 0, 0, 0, 0.2332352078688221, 0, -5.5976449888517301, 0, 11.1952899777034602, 0, -2.9854106607209236, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.2019876150713442, 0, 0, -0.6059628452140327, 0, 4.8477027617122603, 0, 0, 0, 0, -0.6059628452140327, 0, 9.6954055234245207, 0, -9.6954055234245207, 0, 0, 0, 0, 0, 0, -0.2019876150713442, 0, 4.8477027617122603, 0, -9.6954055234245207, 0, 2.5854414729132063, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.8178885356420982, 0, 0, 0, 0, 1.8178885356420982, 0, -9.6954055234245224, 0, 0, 0, 0, 0, 0, -1.8178885356420982, 0, 0, 0, 5.8172433140547142, 0, 0, 0, 0, 0, 0, 0, 0, -1.8178885356420982, 0, 9.6954055234245224, 0, -5.8172433140547142, 0, 0, + + 0, 0, -1.3549741137377600, 0, 0, 0, 0, -1.3549741137377600, 0, 7.2265286066013861, 0, 0, 0, 0, 0, 0, 1.3549741137377600, 0, 0, 0, -4.3359171639608327, 0, 0, 0, 0, 0, 0, 0, 0, 1.3549741137377600, 0, -7.2265286066013861, 0, 4.3359171639608327, 0, 0, + -0.2709948227475520, 0, 0, 0.2709948227475520, 0, 5.4198964549510391, 0, 0, 0, 0, 1.3549741137377600, 0, -10.8397929099020782, 0, -7.2265286066013861, 0, 0, 0, 0, 0, 0, 0.8129844682426559, 0, -16.2596893648531164, 0, 21.6795858198041600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.1713921747991747, 0, 0, -0.1713921747991747, 0, -3.4278434959834923, 0, 0, 0, 0, -0.8569608739958733, 0, 6.8556869919669845, 0, 4.5704579946446575, 0, 0, 0, 0, 0, 0, -0.5141765243975239, 0, 10.2835304879504772, 0, -13.7113739839339726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.8853139227909212, 0, 0, 0, 0, 9.4265696139546051, 0, 6.2843797426364043, 0, 0, 0, 0, 0, 0, 9.4265696139546051, 0, -37.7062784558184205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.8853139227909212, 0, 6.2843797426364043, 0, 0, 0, 0, + + 0, 0, 0.9845730852602553, 0, 0, 0, 0, -4.9228654263012768, 0, -3.2819102842008512, 0, 0, 0, 0, 0, 0, -4.9228654263012768, 0, 19.6914617052051071, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.9845730852602553, 0, -3.2819102842008512, 0, 0, 0, 0, + 0.3281910284200851, 0, 0, -2.9537192557807663, 0, -3.9382923410410213, 0, 0, 0, 0, -1.6409551421004256, 0, 39.3829234104102142, 0, 0, 0, 0, 0, 0, 0, 0, 1.6409551421004256, 0, -19.6914617052051071, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.1339834262980768, 0, 0, 1.2058508366826914, 0, 1.6078011155769216, 0, 0, 0, 0, 0.6699171314903840, 0, -16.0780111557692145, 0, 0, 0, 0, 0, 0, 0, 0, -0.6699171314903840, 0, 8.0390055778846072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.7417845418749984, 0, 0, 0, 0, -26.1267681281249757, 0, 0, 0, 0, 0, 0, 0, 0, 26.1267681281249757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.7417845418749984, 0, 0, 0, 0, 0, 0, + + 0, 0, -0.4830841135800661, 0, 0, 0, 0, 7.2462617037009922, 0, 0, 0, 0, 0, 0, 0, 0, -7.2462617037009922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4830841135800661, 0, 0, 0, 0, 0, 0, + -0.4830841135800663, 0, 0, 10.1447663851813932, 0, 0, 0, 0, 0, 0, -16.9079439753023237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.3815887950604644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.5000395635705508, 0, 0, -10.5008308349815653, 0, 0, 0, 0, 0, 0, 17.5013847249692773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.5002769449938556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.1291096601435712, 0, 0, -2.7113028630149949, 0, 0, 0, 0, 0, 0, 4.5188381050249919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.9037676210049984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.8075352420099966, 0, 0, 0, 0, -27.1130286301499481, 0, 0, 0, 0, 0, 0, 0, 0, 27.1130286301499481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.8075352420099966, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.6831841051919142, 0, 0, 0, 0, -10.2477615778787126, 0, 0, 0, 0, 0, 0, 0, 0, 10.2477615778787126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.6831841051919142, 0, 0, 0, 0, 0, 0, + -0.3415920525959572, 0, 0, 3.0743284733636154, 0, 4.0991046311514863, 0, 0, 0, 0, 1.7079602629797861, 0, -40.9910463115148644, 0, 0, 0, 0, 0, 0, 0, 0, -1.7079602629797861, 0, 20.4955231557574322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.1640955142100426, 0, 0, 1.4768596278903832, 0, 1.9691461705205107, 0, 0, 0, 0, 0.8204775710502128, 0, -19.6914617052051071, 0, 0, 0, 0, 0, 0, 0, 0, -0.8204775710502128, 0, 9.8457308526025535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.9691461705205107, 0, 0, 0, 0, 9.8457308526025535, 0, 6.5638205684017024, 0, 0, 0, 0, 0, 0, 9.8457308526025535, 0, -39.3829234104102142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.9691461705205107, 0, 6.5638205684017024, 0, 0, 0, 0, + + 0, 0, -1.1368870716237374, 0, 0, 0, 0, 5.6844353581186864, 0, 3.7896235720791247, 0, 0, 0, 0, 0, 0, 5.6844353581186864, 0, -22.7377414324747456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1368870716237374, 0, 3.7896235720791247, 0, 0, 0, 0, + 0.2842217679059343, 0, 0, -0.2842217679059343, 0, -5.6844353581186855, 0, 0, 0, 0, -1.4211088395296716, 0, 11.3688707162373710, 0, 7.5792471441582485, 0, 0, 0, 0, 0, 0, -0.8526653037178029, 0, 17.0533060743560583, 0, -22.7377414324747456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.1916222768312404, 0, 0, -0.1916222768312404, 0, -3.8324455366248085, 0, 0, 0, 0, -0.9581113841562022, 0, 7.6648910732496169, 0, 5.1099273821664122, 0, 0, 0, 0, 0, 0, -0.5748668304937213, 0, 11.4973366098744254, 0, -15.3297821464992357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.9162227683124053, 0, 0, 0, 0, 1.9162227683124053, 0, -10.2198547643328261, 0, 0, 0, 0, 0, 0, -1.9162227683124053, 0, 0, 0, 6.1319128585996969, 0, 0, 0, 0, 0, 0, 0, 0, -1.9162227683124053, 0, 10.2198547643328261, 0, -6.1319128585996969, 0, 0, + + 0, 0, 1.4842997738594836, 0, 0, 0, 0, 1.4842997738594836, 0, -7.9162654605839124, 0, 0, 0, 0, 0, 0, -1.4842997738594836, 0, 0, 0, 4.7497592763503480, 0, 0, 0, 0, 0, 0, 0, 0, -1.4842997738594836, 0, 7.9162654605839124, 0, -4.7497592763503480, 0, 0, + -0.2473832956432473, 0, 0, -0.7421498869297418, 0, 5.9371990954379337, 0, 0, 0, 0, -0.7421498869297418, 0, 11.8743981908758673, 0, -11.8743981908758673, 0, 0, 0, 0, 0, 0, -0.2473832956432473, 0, 5.9371990954379337, 0, -11.8743981908758673, 0, 3.1665061842335653, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.2181715595945335, 0, 0, -0.6545146787836006, 0, 5.2361174302688038, 0, 0, 0, 0, -0.6545146787836006, 0, 10.4722348605376077, 0, -10.4722348605376077, 0, 0, 0, 0, 0, 0, -0.2181715595945335, 0, 5.2361174302688038, 0, -10.4722348605376077, 0, 2.7925959628100294, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.7453724767562677, 0, 0, 0, 0, -5.2361174302688038, 0, 10.4722348605376059, 0, 0, 0, 0, 0, 0, -5.2361174302688038, 0, 20.9444697210752118, 0, -8.3777878884300847, 0, 0, 0, 0, 0, 0, 0, 0, -1.7453724767562677, 0, 10.4722348605376059, 0, -8.3777878884300847, 0, 0.7978845608028652, + + 0, 0, -1.7453724767562677, 0, 0, 0, 0, -5.2361174302688038, 0, 10.4722348605376059, 0, 0, 0, 0, 0, 0, -5.2361174302688038, 0, 20.9444697210752118, 0, -8.3777878884300847, 0, 0, 0, 0, 0, 0, 0, 0, -1.7453724767562677, 0, 10.4722348605376059, 0, -8.3777878884300847, 0, 0.7978845608028652, + 0.2181715595945335, 0, 0, 0.6545146787836006, 0, -5.2361174302688038, 0, 0, 0, 0, 0.6545146787836006, 0, -10.4722348605376077, 0, 10.4722348605376077, 0, 0, 0, 0, 0, 0, 0.2181715595945335, 0, -5.2361174302688038, 0, 10.4722348605376077, 0, -2.7925959628100294, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.2473832956432473, 0, 0, 0.7421498869297418, 0, -5.9371990954379337, 0, 0, 0, 0, 0.7421498869297418, 0, -11.8743981908758673, 0, 11.8743981908758673, 0, 0, 0, 0, 0, 0, 0.2473832956432473, 0, -5.9371990954379337, 0, 11.8743981908758673, 0, -3.1665061842335653, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.4842997738594836, 0, 0, 0, 0, 1.4842997738594836, 0, -7.9162654605839124, 0, 0, 0, 0, 0, 0, -1.4842997738594836, 0, 0, 0, 4.7497592763503480, 0, 0, 0, 0, 0, 0, 0, 0, -1.4842997738594836, 0, 7.9162654605839124, 0, -4.7497592763503480, 0, 0, + + 0, 0, 1.9162227683124053, 0, 0, 0, 0, 1.9162227683124053, 0, -10.2198547643328261, 0, 0, 0, 0, 0, 0, -1.9162227683124053, 0, 0, 0, 6.1319128585996969, 0, 0, 0, 0, 0, 0, 0, 0, -1.9162227683124053, 0, 10.2198547643328261, 0, -6.1319128585996969, 0, 0, + -0.1916222768312404, 0, 0, 0.1916222768312404, 0, 3.8324455366248085, 0, 0, 0, 0, 0.9581113841562022, 0, -7.6648910732496169, 0, -5.1099273821664122, 0, 0, 0, 0, 0, 0, 0.5748668304937213, 0, -11.4973366098744254, 0, 15.3297821464992357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.2842217679059343, 0, 0, 0.2842217679059343, 0, 5.6844353581186855, 0, 0, 0, 0, 1.4211088395296716, 0, -11.3688707162373710, 0, -7.5792471441582485, 0, 0, 0, 0, 0, 0, 0.8526653037178029, 0, -17.0533060743560583, 0, 22.7377414324747456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.1368870716237374, 0, 0, 0, 0, 5.6844353581186864, 0, 3.7896235720791247, 0, 0, 0, 0, 0, 0, 5.6844353581186864, 0, -22.7377414324747456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1368870716237374, 0, 3.7896235720791247, 0, 0, 0, 0, + + 0, 0, -1.9691461705205107, 0, 0, 0, 0, 9.8457308526025535, 0, 6.5638205684017024, 0, 0, 0, 0, 0, 0, 9.8457308526025535, 0, -39.3829234104102142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.9691461705205107, 0, 6.5638205684017024, 0, 0, 0, 0, + 0.1640955142100426, 0, 0, -1.4768596278903832, 0, -1.9691461705205107, 0, 0, 0, 0, -0.8204775710502128, 0, 19.6914617052051071, 0, 0, 0, 0, 0, 0, 0, 0, 0.8204775710502128, 0, -9.8457308526025535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.3415920525959572, 0, 0, -3.0743284733636154, 0, -4.0991046311514863, 0, 0, 0, 0, -1.7079602629797861, 0, 40.9910463115148644, 0, 0, 0, 0, 0, 0, 0, 0, 1.7079602629797861, 0, -20.4955231557574322, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0.6831841051919142, 0, 0, 0, 0, -10.2477615778787126, 0, 0, 0, 0, 0, 0, 0, 0, 10.2477615778787126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.6831841051919142, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.8075352420099966, 0, 0, 0, 0, -27.1130286301499481, 0, 0, 0, 0, 0, 0, 0, 0, 27.1130286301499481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.8075352420099966, 0, 0, 0, 0, 0, 0, + -0.1291096601435712, 0, 0, 2.7113028630149949, 0, 0, 0, 0, 0, 0, -4.5188381050249919, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.9037676210049984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.5000395635705508, 0, 0, 10.5008308349815653, 0, 0, 0, 0, 0, 0, -17.5013847249692773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.5002769449938556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.500039563570550664, 0, 0, 14.0011077799754186, 0, 0, 0, 0, 0, 0, -35.0027694499385465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.0011077799754186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.500039563570550664, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0.500039563570550664, 0, 0, 0, 0, -10.5008308349815639, 0, 0, 0, 0, 0, 0, 0, 0, 17.5013847249692732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.50027694499385465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.93664490215356767, 0, 0, 0, 0, 40.669542945224921, 0, 0, 0, 0, 0, 0, 0, 0, -67.7825715753748683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.5565143150749737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.129109660143571178, 0, 0, 1.80753524200999649, 0, 1.80753524200999649, 0, 0, 0, 0, 0, 0, -27.1130286301499473, 0, 0, 0, 0, 0, 0, 0, 0, -1.80753524200999649, 0, 27.1130286301499473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.129109660143571178, 0, -1.80753524200999649, 0, 0, 0, 0, 0, 0, + + 0.341592052595957161, 0, 0, -4.78228873634340025, 0, -4.78228873634340025, 0, 0, 0, 0, 0, 0, 71.7343310451510038, 0, 0, 0, 0, 0, 0, 0, 0, 4.78228873634340025, 0, -71.7343310451510038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.341592052595957161, 0, 4.78228873634340025, 0, 0, 0, 0, 0, 0, + 0, 0, -1.02477615778787148, 0, 0, 0, 0, 9.22298542009084335, 0, 4.09910463115148593, 0, 0, 0, 0, 0, 0, 5.12388078893935741, 0, -40.9910463115148593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.12388078893935741, 0, 20.4955231557574297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.13324168473055283, 0, 0, 0, 0, -19.1991751625749755, 0, -8.53296673892221134, 0, 0, 0, 0, 0, 0, -10.6662084236527642, 0, 85.3296673892221134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.6662084236527642, 0, -42.6648336946110567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.164095514210042526, 0, 0, -0.656382056840170103, 0, -3.93829234104102062, 0, 0, 0, 0, -1.64095514210042526, 0, 19.6914617052051031, 0, 6.56382056840170103, 0, 0, 0, 0, 0, 0, -0.656382056840170103, 0, 19.6914617052051031, 0, -39.3829234104102062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.164095514210042526, 0, -3.93829234104102062, 0, 6.56382056840170103, 0, 0, 0, 0, + + -0.284221767905934336, 0, 0, 1.13688707162373734, 0, 6.82132242974242407, 0, 0, 0, 0, 2.84221767905934336, 0, -34.1066121487121203, 0, -11.3688707162373734, 0, 0, 0, 0, 0, 0, 1.13688707162373734, 0, -34.1066121487121203, 0, 68.2132242974242407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.284221767905934336, 0, 6.82132242974242407, 0, -11.3688707162373734, 0, 0, 0, 0, + 0, 0, 1.42110883952967168, 0, 0, 0, 0, -1.42110883952967168, 0, -9.47405893019781121, 0, 0, 0, 0, 0, 0, -7.1055441976483584, 0, 18.9481178603956224, 0, 7.57924714415824896, 0, 0, 0, 0, 0, 0, 0, 0, -4.26332651858901504, 0, 28.4221767905934336, 0, -22.7377414324747469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.10784504514364487, 0, 0, 0, 0, 2.10784504514364487, 0, 14.0523003009576325, 0, 0, 0, 0, 0, 0, 10.5392252257182244, 0, -28.104600601915265, 0, -11.241840240766106, 0, 0, 0, 0, 0, 0, 0, 0, 6.32353513543093462, 0, -42.1569009028728975, 0, 33.725520722298318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.191622276831240443, 0, 0, -0.383244553662480886, 0, 5.74866830493721329, 0, 0, 0, 0, 0, 0, 5.74866830493721329, 0, -15.3297821464992355, 0, 0, 0, 0, 0, 0, 0.383244553662480886, 0, -5.74866830493721329, 0, 0, 0, 6.13191285859969418, 0, 0, 0, 0, 0, 0, 0, 0, 0.191622276831240443, 0, -5.74866830493721329, 0, 15.3297821464992355, 0, -6.13191285859969418, 0, 0, + + 0.247383295643247195, 0, 0, 0.49476659128649439, 0, -7.42149886929741585, 0, 0, 0, 0, 0, 0, -7.42149886929741585, 0, 19.7906636514597756, 0, 0, 0, 0, 0, 0, -0.49476659128649439, 0, 7.42149886929741585, 0, 0, 0, -7.91626546058391024, 0, 0, 0, 0, 0, 0, 0, 0, -0.247383295643247195, 0, 7.42149886929741585, 0, -19.7906636514597756, 0, 7.91626546058391024, 0, 0, + 0, 0, -1.73168306950273036, 0, 0, 0, 0, -5.19504920850819109, 0, 13.8534645560218429, 0, 0, 0, 0, 0, 0, -5.19504920850819109, 0, 27.7069291120436858, 0, -16.6241574672262115, 0, 0, 0, 0, 0, 0, 0, 0, -1.73168306950273036, 0, 13.8534645560218429, 0, -16.6241574672262115, 0, 3.16650618423356409, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.96354403635080146, 0, 0, 0, 0, 5.89063210905240439, 0, -15.7083522908064117, 0, 0, 0, 0, 0, 0, 5.89063210905240439, 0, -31.4167045816128234, 0, 18.850022748967694, 0, 0, 0, 0, 0, 0, 0, 0, 1.96354403635080146, 0, -15.7083522908064117, 0, 18.850022748967694, 0, -3.5904805236128941, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.218171559594533496, 0, 0, 0.872686238378133983, 0, -6.98148990702507186, 0, 0, 0, 0, 1.30902935756720097, 0, -20.9444697210752156, 0, 20.9444697210752156, 0, 0, 0, 0, 0, 0, 0.872686238378133983, 0, -20.9444697210752156, 0, 41.8889394421504312, 0, -11.170383851240115, 0, 0, 0, 0, 0, 0, 0, 0, 0.218171559594533496, 0, -6.98148990702507186, 0, 20.9444697210752156, 0, -11.170383851240115, 0, 0.797884560802865356, + + -0.218171559594533496, 0, 0, -0.872686238378133983, 0, 6.98148990702507186, 0, 0, 0, 0, -1.30902935756720097, 0, 20.9444697210752156, 0, -20.9444697210752156, 0, 0, 0, 0, 0, 0, -0.872686238378133983, 0, 20.9444697210752156, 0, -41.8889394421504312, 0, 11.170383851240115, 0, 0, 0, 0, 0, 0, 0, 0, -0.218171559594533496, 0, 6.98148990702507186, 0, -20.9444697210752156, 0, 11.170383851240115, 0, -0.797884560802865356, + 0, 0, 1.96354403635080146, 0, 0, 0, 0, 5.89063210905240439, 0, -15.7083522908064117, 0, 0, 0, 0, 0, 0, 5.89063210905240439, 0, -31.4167045816128234, 0, 18.850022748967694, 0, 0, 0, 0, 0, 0, 0, 0, 1.96354403635080146, 0, -15.7083522908064117, 0, 18.850022748967694, 0, -3.5904805236128941, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.73168306950273036, 0, 0, 0, 0, -5.19504920850819109, 0, 13.8534645560218429, 0, 0, 0, 0, 0, 0, -5.19504920850819109, 0, 27.7069291120436858, 0, -16.6241574672262115, 0, 0, 0, 0, 0, 0, 0, 0, -1.73168306950273036, 0, 13.8534645560218429, 0, -16.6241574672262115, 0, 3.16650618423356409, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.247383295643247195, 0, 0, -0.49476659128649439, 0, 7.42149886929741585, 0, 0, 0, 0, 0, 0, 7.42149886929741585, 0, -19.7906636514597756, 0, 0, 0, 0, 0, 0, 0.49476659128649439, 0, -7.42149886929741585, 0, 0, 0, 7.91626546058391024, 0, 0, 0, 0, 0, 0, 0, 0, 0.247383295643247195, 0, -7.42149886929741585, 0, 19.7906636514597756, 0, -7.91626546058391024, 0, 0, + + 0.191622276831240443, 0, 0, 0.383244553662480886, 0, -5.74866830493721329, 0, 0, 0, 0, 0, 0, -5.74866830493721329, 0, 15.3297821464992355, 0, 0, 0, 0, 0, 0, -0.383244553662480886, 0, 5.74866830493721329, 0, 0, 0, -6.13191285859969418, 0, 0, 0, 0, 0, 0, 0, 0, -0.191622276831240443, 0, 5.74866830493721329, 0, -15.3297821464992355, 0, 6.13191285859969418, 0, 0, + 0, 0, -2.10784504514364487, 0, 0, 0, 0, 2.10784504514364487, 0, 14.0523003009576325, 0, 0, 0, 0, 0, 0, 10.5392252257182244, 0, -28.104600601915265, 0, -11.241840240766106, 0, 0, 0, 0, 0, 0, 0, 0, 6.32353513543093462, 0, -42.1569009028728975, 0, 33.725520722298318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.42110883952967168, 0, 0, 0, 0, -1.42110883952967168, 0, -9.47405893019781121, 0, 0, 0, 0, 0, 0, -7.1055441976483584, 0, 18.9481178603956224, 0, 7.57924714415824896, 0, 0, 0, 0, 0, 0, 0, 0, -4.26332651858901504, 0, 28.4221767905934336, 0, -22.7377414324747469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.284221767905934336, 0, 0, -1.13688707162373734, 0, -6.82132242974242407, 0, 0, 0, 0, -2.84221767905934336, 0, 34.1066121487121203, 0, 11.3688707162373734, 0, 0, 0, 0, 0, 0, -1.13688707162373734, 0, 34.1066121487121203, 0, -68.2132242974242407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.284221767905934336, 0, -6.82132242974242407, 0, 11.3688707162373734, 0, 0, 0, 0, + + -0.164095514210042526, 0, 0, 0.656382056840170103, 0, 3.93829234104102062, 0, 0, 0, 0, 1.64095514210042526, 0, -19.6914617052051031, 0, -6.56382056840170103, 0, 0, 0, 0, 0, 0, 0.656382056840170103, 0, -19.6914617052051031, 0, 39.3829234104102062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.164095514210042526, 0, 3.93829234104102062, 0, -6.56382056840170103, 0, 0, 0, 0, + 0, 0, 2.13324168473055283, 0, 0, 0, 0, -19.1991751625749755, 0, -8.53296673892221134, 0, 0, 0, 0, 0, 0, -10.6662084236527642, 0, 85.3296673892221134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.6662084236527642, 0, -42.6648336946110567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.02477615778787148, 0, 0, 0, 0, 9.22298542009084335, 0, 4.09910463115148593, 0, 0, 0, 0, 0, 0, 5.12388078893935741, 0, -40.9910463115148593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.12388078893935741, 0, 20.4955231557574297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.341592052595957161, 0, 0, 4.78228873634340025, 0, 4.78228873634340025, 0, 0, 0, 0, 0, 0, -71.7343310451510038, 0, 0, 0, 0, 0, 0, 0, 0, -4.78228873634340025, 0, 71.7343310451510038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.341592052595957161, 0, -4.78228873634340025, 0, 0, 0, 0, 0, 0, + + 0.129109660143571178, 0, 0, -1.80753524200999649, 0, -1.80753524200999649, 0, 0, 0, 0, 0, 0, 27.1130286301499473, 0, 0, 0, 0, 0, 0, 0, 0, 1.80753524200999649, 0, -27.1130286301499473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.129109660143571178, 0, 1.80753524200999649, 0, 0, 0, 0, 0, 0, + 0, 0, -1.93664490215356767, 0, 0, 0, 0, 40.669542945224921, 0, 0, 0, 0, 0, 0, 0, 0, -67.7825715753748683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.5565143150749737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.500039563570550664, 0, 0, 0, 0, -10.5008308349815639, 0, 0, 0, 0, 0, 0, 0, 0, 17.5013847249692732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.50027694499385465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.500039563570550664, 0, 0, -14.0011077799754186, 0, 0, 0, 0, 0, 0, 35.0027694499385465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.0011077799754186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.500039563570550664, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.51542898439728431, 0, 0, -14.4320115631239607, 0, 0, 0, 0, 0, 0, 36.0800289078099017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.4320115631239607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.51542898439728431, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.125009890892637666, 0, 0, -3.50027694499385465, 0, 0, 0, 0, 0, 0, 8.75069236248463662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.50027694499385465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.125009890892637666, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.00015825428220266, 0, 0, 0, 0, -42.0033233399262558, 0, 0, 0, 0, 0, 0, 0, 0, 70.005538899877093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.0011077799754186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.707162732524596178, 0, 0, 0, 0, -14.8504173830165197, 0, 0, 0, 0, 0, 0, 0, 0, 24.7506956383608662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.95013912767217325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.353581366262298089, 0, 0, 4.95013912767217325, 0, 4.95013912767217325, 0, 0, 0, 0, 0, 0, -74.2520869150825987, 0, 0, 0, 0, 0, 0, 0, 0, -4.95013912767217325, 0, 74.2520869150825987, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.353581366262298089, 0, -4.95013912767217325, 0, 0, 0, 0, 0, 0, + + -0.158126394107949853, 0, 0, 2.21376951751129794, 0, 2.21376951751129794, 0, 0, 0, 0, 0, 0, -33.2065427626694691, 0, 0, 0, 0, 0, 0, 0, 0, -2.21376951751129794, 0, 33.2065427626694691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.158126394107949853, 0, -2.21376951751129794, 0, 0, 0, 0, 0, 0, + 0, 0, -2.21376951751129794, 0, 0, 0, 0, 19.9239256576016814, 0, 8.85507807004519175, 0, 0, 0, 0, 0, 0, 11.0688475875564897, 0, -88.5507807004519175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -11.0688475875564897, 0, 44.2753903502259587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.18330958111587602, 0, 0, 0, 0, 10.6497862300428841, 0, 4.73323832446350406, 0, 0, 0, 0, 0, 0, 5.91654790557938008, 0, -47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.91654790557938008, 0, 23.6661916223175203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.295827395278969004, 0, 0, -1.18330958111587602, 0, -7.0998574866952561, 0, 0, 0, 0, -2.95827395278969004, 0, 35.4992874334762805, 0, 11.8330958111587602, 0, 0, 0, 0, 0, 0, -1.18330958111587602, 0, 35.4992874334762805, 0, -70.998574866952561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.295827395278969004, 0, -7.0998574866952561, 0, 11.8330958111587602, 0, 0, 0, 0, + + 0.183464362288218895, 0, 0, -0.733857449152875582, 0, -4.40314469491725349, 0, 0, 0, 0, -1.83464362288218895, 0, 22.0157234745862674, 0, 7.33857449152875582, 0, 0, 0, 0, 0, 0, -0.733857449152875582, 0, 22.0157234745862674, 0, -44.0314469491725349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.183464362288218895, 0, -4.40314469491725349, 0, 7.33857449152875582, 0, 0, 0, 0, + 0, 0, 2.20157234745862674, 0, 0, 0, 0, -2.20157234745862674, 0, -14.6771489830575116, 0, 0, 0, 0, 0, 0, -11.0078617372931337, 0, 29.3542979661150233, 0, 11.7417191864460093, 0, 0, 0, 0, 0, 0, 0, 0, -6.60471704237588023, 0, 44.0314469491725349, 0, -35.2251575593380279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.55674673616078096, 0, 0, 0, 0, -1.55674673616078096, 0, -10.3783115744052064, 0, 0, 0, 0, 0, 0, -7.7837336808039048, 0, 20.7566231488104128, 0, 8.30264925952416512, 0, 0, 0, 0, 0, 0, 0, 0, -4.67024020848234288, 0, 31.1349347232156192, 0, -24.9079477785724953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.25945778936013016, 0, 0, -0.51891557872026032, 0, 7.7837336808039048, 0, 0, 0, 0, 0, 0, 7.7837336808039048, 0, -20.7566231488104128, 0, 0, 0, 0, 0, 0, 0.51891557872026032, 0, -7.7837336808039048, 0, 0, 0, 8.30264925952416512, 0, 0, 0, 0, 0, 0, 0, 0, 0.25945778936013016, 0, -7.7837336808039048, 0, 20.7566231488104128, 0, -8.30264925952416512, 0, 0, + + -0.206975714696966254, 0, 0, -0.413951429393932508, 0, 6.20927144090898762, 0, 0, 0, 0, 0, 0, 6.20927144090898762, 0, -16.5580571757573003, 0, 0, 0, 0, 0, 0, 0.413951429393932508, 0, -6.20927144090898762, 0, 0, 0, 6.62322287030292013, 0, 0, 0, 0, 0, 0, 0, 0, 0.206975714696966254, 0, -6.20927144090898762, 0, 16.5580571757573003, 0, -6.62322287030292013, 0, 0, + 0, 0, -2.06975714696966254, 0, 0, 0, 0, -6.20927144090898762, 0, 16.5580571757573003, 0, 0, 0, 0, 0, 0, -6.20927144090898762, 0, 33.1161143515146006, 0, -19.8696686109087604, 0, 0, 0, 0, 0, 0, 0, 0, -2.06975714696966254, 0, 16.5580571757573003, 0, -19.8696686109087604, 0, 3.78469878303024007, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.85124707101607532, 0, 0, 0, 0, -5.55374121304822595, 0, 14.8099765681286025, 0, 0, 0, 0, 0, 0, -5.55374121304822595, 0, 29.6199531362572051, 0, -17.771971881754323, 0, 0, 0, 0, 0, 0, 0, 0, -1.85124707101607532, 0, 14.8099765681286025, 0, -17.771971881754323, 0, 3.38513750128653772, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.231405883877009415, 0, 0, 0.925623535508037658, 0, -7.40498828406430127, 0, 0, 0, 0, 1.38843530326205649, 0, -22.2149648521929038, 0, 22.2149648521929038, 0, 0, 0, 0, 0, 0, 0.925623535508037658, 0, -22.2149648521929038, 0, 44.4299297043858076, 0, -11.847981254502882, 0, 0, 0, 0, 0, 0, 0, 0, 0.231405883877009415, 0, -7.40498828406430127, 0, 22.2149648521929038, 0, -11.847981254502882, 0, 0.84628437532163443, + + 0.231405883877009415, 0, 0, 0.925623535508037658, 0, -7.40498828406430127, 0, 0, 0, 0, 1.38843530326205649, 0, -22.2149648521929038, 0, 22.2149648521929038, 0, 0, 0, 0, 0, 0, 0.925623535508037658, 0, -22.2149648521929038, 0, 44.4299297043858076, 0, -11.847981254502882, 0, 0, 0, 0, 0, 0, 0, 0, 0.231405883877009415, 0, -7.40498828406430127, 0, 22.2149648521929038, 0, -11.847981254502882, 0, 0.84628437532163443, + 0, 0, 1.85124707101607532, 0, 0, 0, 0, 5.55374121304822595, 0, -14.8099765681286025, 0, 0, 0, 0, 0, 0, 5.55374121304822595, 0, -29.6199531362572051, 0, 17.771971881754323, 0, 0, 0, 0, 0, 0, 0, 0, 1.85124707101607532, 0, -14.8099765681286025, 0, 17.771971881754323, 0, -3.38513750128653772, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.06975714696966254, 0, 0, 0, 0, 6.20927144090898762, 0, -16.5580571757573003, 0, 0, 0, 0, 0, 0, 6.20927144090898762, 0, -33.1161143515146006, 0, 19.8696686109087604, 0, 0, 0, 0, 0, 0, 0, 0, 2.06975714696966254, 0, -16.5580571757573003, 0, 19.8696686109087604, 0, -3.78469878303024007, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.206975714696966254, 0, 0, -0.413951429393932508, 0, 6.20927144090898762, 0, 0, 0, 0, 0, 0, 6.20927144090898762, 0, -16.5580571757573003, 0, 0, 0, 0, 0, 0, 0.413951429393932508, 0, -6.20927144090898762, 0, 0, 0, 6.62322287030292013, 0, 0, 0, 0, 0, 0, 0, 0, 0.206975714696966254, 0, -6.20927144090898762, 0, 16.5580571757573003, 0, -6.62322287030292013, 0, 0, + + -0.25945778936013016, 0, 0, -0.51891557872026032, 0, 7.7837336808039048, 0, 0, 0, 0, 0, 0, 7.7837336808039048, 0, -20.7566231488104128, 0, 0, 0, 0, 0, 0, 0.51891557872026032, 0, -7.7837336808039048, 0, 0, 0, 8.30264925952416512, 0, 0, 0, 0, 0, 0, 0, 0, 0.25945778936013016, 0, -7.7837336808039048, 0, 20.7566231488104128, 0, -8.30264925952416512, 0, 0, + 0, 0, -1.55674673616078096, 0, 0, 0, 0, 1.55674673616078096, 0, 10.3783115744052064, 0, 0, 0, 0, 0, 0, 7.7837336808039048, 0, -20.7566231488104128, 0, -8.30264925952416512, 0, 0, 0, 0, 0, 0, 0, 0, 4.67024020848234288, 0, -31.1349347232156192, 0, 24.9079477785724953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.20157234745862674, 0, 0, 0, 0, 2.20157234745862674, 0, 14.6771489830575116, 0, 0, 0, 0, 0, 0, 11.0078617372931337, 0, -29.3542979661150233, 0, -11.7417191864460093, 0, 0, 0, 0, 0, 0, 0, 0, 6.60471704237588023, 0, -44.0314469491725349, 0, 35.2251575593380279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.183464362288218895, 0, 0, -0.733857449152875582, 0, -4.40314469491725349, 0, 0, 0, 0, -1.83464362288218895, 0, 22.0157234745862674, 0, 7.33857449152875582, 0, 0, 0, 0, 0, 0, -0.733857449152875582, 0, 22.0157234745862674, 0, -44.0314469491725349, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.183464362288218895, 0, -4.40314469491725349, 0, 7.33857449152875582, 0, 0, 0, 0, + + 0.295827395278969004, 0, 0, -1.18330958111587602, 0, -7.0998574866952561, 0, 0, 0, 0, -2.95827395278969004, 0, 35.4992874334762805, 0, 11.8330958111587602, 0, 0, 0, 0, 0, 0, -1.18330958111587602, 0, 35.4992874334762805, 0, -70.998574866952561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.295827395278969004, 0, -7.0998574866952561, 0, 11.8330958111587602, 0, 0, 0, 0, + 0, 0, 1.18330958111587602, 0, 0, 0, 0, -10.6497862300428841, 0, -4.73323832446350406, 0, 0, 0, 0, 0, 0, -5.91654790557938008, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.91654790557938008, 0, -23.6661916223175203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.21376951751129794, 0, 0, 0, 0, -19.9239256576016814, 0, -8.85507807004519175, 0, 0, 0, 0, 0, 0, -11.0688475875564897, 0, 88.5507807004519175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11.0688475875564897, 0, -44.2753903502259587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.158126394107949853, 0, 0, 2.21376951751129794, 0, 2.21376951751129794, 0, 0, 0, 0, 0, 0, -33.2065427626694691, 0, 0, 0, 0, 0, 0, 0, 0, -2.21376951751129794, 0, 33.2065427626694691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.158126394107949853, 0, -2.21376951751129794, 0, 0, 0, 0, 0, 0, + + -0.353581366262298089, 0, 0, 4.95013912767217325, 0, 4.95013912767217325, 0, 0, 0, 0, 0, 0, -74.2520869150825987, 0, 0, 0, 0, 0, 0, 0, 0, -4.95013912767217325, 0, 74.2520869150825987, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.353581366262298089, 0, -4.95013912767217325, 0, 0, 0, 0, 0, 0, + 0, 0, -0.707162732524596178, 0, 0, 0, 0, 14.8504173830165197, 0, 0, 0, 0, 0, 0, 0, 0, -24.7506956383608662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.95013912767217325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.00015825428220266, 0, 0, 0, 0, 42.0033233399262558, 0, 0, 0, 0, 0, 0, 0, 0, -70.005538899877093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.0011077799754186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.125009890892637666, 0, 0, -3.50027694499385465, 0, 0, 0, 0, 0, 0, 8.75069236248463662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.50027694499385465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.125009890892637666, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.51542898439728431, 0, 0, -14.4320115631239607, 0, 0, 0, 0, 0, 0, 36.0800289078099017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.4320115631239607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.51542898439728431, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.51542898439728431, 0, 0, 18.5554434383022352, 0, 0, 0, 0, 0, 0, -64.944052034057823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43.296034689371882, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.63886085957555879, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0.51542898439728431, 0, 0, 0, 0, -14.4320115631239607, 0, 0, 0, 0, 0, 0, 0, 0, 36.0800289078099017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.4320115631239607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.51542898439728431, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.12516814517484032, 0, 0, 0, 0, 59.504708064895529, 0, 0, 0, 0, 0, 0, 0, 0, -148.761770162238823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59.504708064895529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.12516814517484032, 0, 0, 0, 0, 0, 0, 0, 0, + -0.125009890892637666, 0, 0, 2.50019781785275332, 0, 2.00015825428220266, 0, 0, 0, 0, -1.75013847249692732, 0, -42.0033233399262558, 0, 0, 0, 0, 0, 0, 0, 0, -3.50027694499385465, 0, 70.005538899877093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.875069236248463662, 0, -14.0011077799754186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.353581366262298089, 0, 0, -7.07162732524596178, 0, -5.65730186019676943, 0, 0, 0, 0, 4.95013912767217325, 0, 118.803339064132158, 0, 0, 0, 0, 0, 0, 0, 0, 9.9002782553443465, 0, -198.00556510688693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.47506956383608662, 0, 39.601113021377386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.06074409878689427, 0, 0, 0, 0, 14.8504173830165197, 0, 4.95013912767217325, 0, 0, 0, 0, 0, 0, 0, 0, -74.2520869150825987, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.8504173830165197, 0, 74.2520869150825987, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.06074409878689427, 0, -4.95013912767217325, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.37189591161924779, 0, 0, 0, 0, -33.2065427626694691, 0, -11.0688475875564897, 0, 0, 0, 0, 0, 0, 0, 0, 166.032713813347345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33.2065427626694691, 0, -166.032713813347345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.37189591161924779, 0, 11.0688475875564897, 0, 0, 0, 0, 0, 0, + 0.158126394107949853, 0, 0, -1.26501115286359882, 0, -4.42753903502259587, 0, 0, 0, 0, -2.21376951751129794, 0, 39.8478513152033629, 0, 8.85507807004519175, 0, 0, 0, 0, 0, 0, 0, 0, 22.1376951751129794, 0, -88.5507807004519175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.790631970539749263, 0, -22.1376951751129794, 0, 44.2753903502259587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.295827395278969004, 0, 0, 2.36661916223175203, 0, 8.28316706781113211, 0, 0, 0, 0, 4.14158353390556606, 0, -74.548503610300189, 0, -16.5663341356222642, 0, 0, 0, 0, 0, 0, 0, 0, -41.4158353390556606, 0, 165.663341356222642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.47913697639484502, 0, 41.4158353390556606, 0, -82.8316706781113211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.47913697639484502, 0, 0, 0, 0, -5.91654790557938008, 0, -11.8330958111587602, 0, 0, 0, 0, 0, 0, -14.7913697639484502, 0, 59.1654790557938008, 0, 11.8330958111587602, 0, 0, 0, 0, 0, 0, 0, 0, -5.91654790557938008, 0, 59.1654790557938008, 0, -70.998574866952561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.47913697639484502, 0, -11.8330958111587602, 0, 11.8330958111587602, 0, 0, 0, 0, + + 0, 0, -2.38503670974684564, 0, 0, 0, 0, 9.54014683898738256, 0, 19.0802936779747651, 0, 0, 0, 0, 0, 0, 23.8503670974684564, 0, -95.4014683898738256, 0, -19.0802936779747651, 0, 0, 0, 0, 0, 0, 0, 0, 9.54014683898738256, 0, -95.4014683898738256, 0, 114.481762067848591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.38503670974684564, 0, 19.0802936779747651, 0, -19.0802936779747651, 0, 0, 0, 0, + -0.183464362288218895, 0, 0, 0, 0, 6.60471704237588023, 0, 0, 0, 0, 1.10078617372931337, 0, -6.60471704237588023, 0, -22.0157234745862674, 0, 0, 0, 0, 0, 0, 1.46771489830575116, 0, -33.0235852118794012, 0, 44.0314469491725349, 0, 11.7417191864460093, 0, 0, 0, 0, 0, 0, 0, 0, 0.550393086864656686, 0, -19.8141511271276407, 0, 66.0471704237588023, 0, -35.2251575593380279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.25945778936013016, 0, 0, 0, 0, -9.34048041696468576, 0, 0, 0, 0, -1.55674673616078096, 0, 9.34048041696468576, 0, 31.1349347232156192, 0, 0, 0, 0, 0, 0, -2.07566231488104128, 0, 46.7024020848234288, 0, -62.2698694464312384, 0, -16.6052985190483302, 0, 0, 0, 0, 0, 0, 0, 0, -0.77837336808039048, 0, 28.0214412508940573, 0, -93.4048041696468576, 0, 49.8158955571449907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.81620452552091112, 0, 0, 0, 0, -3.63240905104182224, 0, 18.1620452552091112, 0, 0, 0, 0, 0, 0, 0, 0, 18.1620452552091112, 0, -29.0592724083345779, 0, 0, 0, 0, 0, 0, 0, 0, 3.63240905104182224, 0, -18.1620452552091112, 0, 0, 0, 8.30264925952416512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.81620452552091112, 0, -18.1620452552091112, 0, 29.0592724083345779, 0, -8.30264925952416512, 0, 0, + + 0, 0, 2.27673286166662879, 0, 0, 0, 0, 4.55346572333325759, 0, -22.7673286166662879, 0, 0, 0, 0, 0, 0, 0, 0, -22.7673286166662879, 0, 36.4277257866660607, 0, 0, 0, 0, 0, 0, 0, 0, -4.55346572333325759, 0, 22.7673286166662879, 0, 0, 0, -10.4079216533331602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.27673286166662879, 0, 22.7673286166662879, 0, -36.4277257866660607, 0, 10.4079216533331602, 0, 0, + 0.206975714696966254, 0, 0, 0.827902858787865016, 0, -8.27902858787865016, 0, 0, 0, 0, 1.24185428818179752, 0, -24.8370857636359505, 0, 33.1161143515146006, 0, 0, 0, 0, 0, 0, 0.827902858787865016, 0, -24.8370857636359505, 0, 66.2322287030292013, 0, -26.4928914812116805, 0, 0, 0, 0, 0, 0, 0, 0, 0.206975714696966254, 0, -8.27902858787865016, 0, 33.1161143515146006, 0, -26.4928914812116805, 0, 3.78469878303024007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.231405883877009415, 0, 0, -0.925623535508037658, 0, 9.25623535508037658, 0, 0, 0, 0, -1.38843530326205649, 0, 27.7687060652411297, 0, -37.0249414203215063, 0, 0, 0, 0, 0, 0, -0.925623535508037658, 0, 27.7687060652411297, 0, -74.0498828406430127, 0, 29.6199531362572051, 0, 0, 0, 0, 0, 0, 0, 0, -0.231405883877009415, 0, 9.25623535508037658, 0, -37.0249414203215063, 0, 29.6199531362572051, 0, -4.23142187660817215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.08265295489308473, 0, 0, 0, 0, 8.33061181957233892, 0, -22.2149648521929038, 0, 0, 0, 0, 0, 0, 12.4959177293585084, 0, -66.6448945565787114, 0, 39.9869367339472268, 0, 0, 0, 0, 0, 0, 0, 0, 8.33061181957233892, 0, -66.6448945565787114, 0, 79.9738734678944537, 0, -15.2331187557894197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.08265295489308473, 0, -22.2149648521929038, 0, 39.9869367339472268, 0, -15.2331187557894197, 0, 0.84628437532163443, + + 0, 0, -2.08265295489308473, 0, 0, 0, 0, -8.33061181957233892, 0, 22.2149648521929038, 0, 0, 0, 0, 0, 0, -12.4959177293585084, 0, 66.6448945565787114, 0, -39.9869367339472268, 0, 0, 0, 0, 0, 0, 0, 0, -8.33061181957233892, 0, 66.6448945565787114, 0, -79.9738734678944537, 0, 15.2331187557894197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.08265295489308473, 0, 22.2149648521929038, 0, -39.9869367339472268, 0, 15.2331187557894197, 0, -0.84628437532163443, + -0.231405883877009415, 0, 0, -0.925623535508037658, 0, 9.25623535508037658, 0, 0, 0, 0, -1.38843530326205649, 0, 27.7687060652411297, 0, -37.0249414203215063, 0, 0, 0, 0, 0, 0, -0.925623535508037658, 0, 27.7687060652411297, 0, -74.0498828406430127, 0, 29.6199531362572051, 0, 0, 0, 0, 0, 0, 0, 0, -0.231405883877009415, 0, 9.25623535508037658, 0, -37.0249414203215063, 0, 29.6199531362572051, 0, -4.23142187660817215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.206975714696966254, 0, 0, 0.827902858787865016, 0, -8.27902858787865016, 0, 0, 0, 0, 1.24185428818179752, 0, -24.8370857636359505, 0, 33.1161143515146006, 0, 0, 0, 0, 0, 0, 0.827902858787865016, 0, -24.8370857636359505, 0, 66.2322287030292013, 0, -26.4928914812116805, 0, 0, 0, 0, 0, 0, 0, 0, 0.206975714696966254, 0, -8.27902858787865016, 0, 33.1161143515146006, 0, -26.4928914812116805, 0, 3.78469878303024007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.27673286166662879, 0, 0, 0, 0, -4.55346572333325759, 0, 22.7673286166662879, 0, 0, 0, 0, 0, 0, 0, 0, 22.7673286166662879, 0, -36.4277257866660607, 0, 0, 0, 0, 0, 0, 0, 0, 4.55346572333325759, 0, -22.7673286166662879, 0, 0, 0, 10.4079216533331602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.27673286166662879, 0, -22.7673286166662879, 0, 36.4277257866660607, 0, -10.4079216533331602, 0, 0, + + 0, 0, 1.81620452552091112, 0, 0, 0, 0, 3.63240905104182224, 0, -18.1620452552091112, 0, 0, 0, 0, 0, 0, 0, 0, -18.1620452552091112, 0, 29.0592724083345779, 0, 0, 0, 0, 0, 0, 0, 0, -3.63240905104182224, 0, 18.1620452552091112, 0, 0, 0, -8.30264925952416512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.81620452552091112, 0, 18.1620452552091112, 0, -29.0592724083345779, 0, 8.30264925952416512, 0, 0, + 0.25945778936013016, 0, 0, 0, 0, -9.34048041696468576, 0, 0, 0, 0, -1.55674673616078096, 0, 9.34048041696468576, 0, 31.1349347232156192, 0, 0, 0, 0, 0, 0, -2.07566231488104128, 0, 46.7024020848234288, 0, -62.2698694464312384, 0, -16.6052985190483302, 0, 0, 0, 0, 0, 0, 0, 0, -0.77837336808039048, 0, 28.0214412508940573, 0, -93.4048041696468576, 0, 49.8158955571449907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.183464362288218895, 0, 0, 0, 0, 6.60471704237588023, 0, 0, 0, 0, 1.10078617372931337, 0, -6.60471704237588023, 0, -22.0157234745862674, 0, 0, 0, 0, 0, 0, 1.46771489830575116, 0, -33.0235852118794012, 0, 44.0314469491725349, 0, 11.7417191864460093, 0, 0, 0, 0, 0, 0, 0, 0, 0.550393086864656686, 0, -19.8141511271276407, 0, 66.0471704237588023, 0, -35.2251575593380279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.38503670974684564, 0, 0, 0, 0, -9.54014683898738256, 0, -19.0802936779747651, 0, 0, 0, 0, 0, 0, -23.8503670974684564, 0, 95.4014683898738256, 0, 19.0802936779747651, 0, 0, 0, 0, 0, 0, 0, 0, -9.54014683898738256, 0, 95.4014683898738256, 0, -114.481762067848591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.38503670974684564, 0, -19.0802936779747651, 0, 19.0802936779747651, 0, 0, 0, 0, + + 0, 0, -1.47913697639484502, 0, 0, 0, 0, 5.91654790557938008, 0, 11.8330958111587602, 0, 0, 0, 0, 0, 0, 14.7913697639484502, 0, -59.1654790557938008, 0, -11.8330958111587602, 0, 0, 0, 0, 0, 0, 0, 0, 5.91654790557938008, 0, -59.1654790557938008, 0, 70.998574866952561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.47913697639484502, 0, 11.8330958111587602, 0, -11.8330958111587602, 0, 0, 0, 0, + -0.295827395278969004, 0, 0, 2.36661916223175203, 0, 8.28316706781113211, 0, 0, 0, 0, 4.14158353390556606, 0, -74.548503610300189, 0, -16.5663341356222642, 0, 0, 0, 0, 0, 0, 0, 0, -41.4158353390556606, 0, 165.663341356222642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.47913697639484502, 0, 41.4158353390556606, 0, -82.8316706781113211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.158126394107949853, 0, 0, -1.26501115286359882, 0, -4.42753903502259587, 0, 0, 0, 0, -2.21376951751129794, 0, 39.8478513152033629, 0, 8.85507807004519175, 0, 0, 0, 0, 0, 0, 0, 0, 22.1376951751129794, 0, -88.5507807004519175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.790631970539749263, 0, -22.1376951751129794, 0, 44.2753903502259587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.37189591161924779, 0, 0, 0, 0, 33.2065427626694691, 0, 11.0688475875564897, 0, 0, 0, 0, 0, 0, 0, 0, -166.032713813347345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -33.2065427626694691, 0, 166.032713813347345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.37189591161924779, 0, -11.0688475875564897, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.06074409878689427, 0, 0, 0, 0, -14.8504173830165197, 0, -4.95013912767217325, 0, 0, 0, 0, 0, 0, 0, 0, 74.2520869150825987, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.8504173830165197, 0, -74.2520869150825987, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.06074409878689427, 0, 4.95013912767217325, 0, 0, 0, 0, 0, 0, + 0.353581366262298089, 0, 0, -7.07162732524596178, 0, -5.65730186019676943, 0, 0, 0, 0, 4.95013912767217325, 0, 118.803339064132158, 0, 0, 0, 0, 0, 0, 0, 0, 9.9002782553443465, 0, -198.00556510688693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.47506956383608662, 0, 39.601113021377386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.125009890892637666, 0, 0, 2.50019781785275332, 0, 2.00015825428220266, 0, 0, 0, 0, -1.75013847249692732, 0, -42.0033233399262558, 0, 0, 0, 0, 0, 0, 0, 0, -3.50027694499385465, 0, 70.005538899877093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.875069236248463662, 0, -14.0011077799754186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.12516814517484032, 0, 0, 0, 0, -59.504708064895529, 0, 0, 0, 0, 0, 0, 0, 0, 148.761770162238823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -59.504708064895529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.12516814517484032, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -0.51542898439728431, 0, 0, 0, 0, 14.4320115631239607, 0, 0, 0, 0, 0, 0, 0, 0, -36.0800289078099017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.4320115631239607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.51542898439728431, 0, 0, 0, 0, 0, 0, 0, 0, + -0.51542898439728431, 0, 0, 18.5554434383022352, 0, 0, 0, 0, 0, 0, -64.944052034057823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43.296034689371882, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.63886085957555879, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.52955294149244958, 0, 0, -19.0639058937281849, 0, 0, 0, 0, 0, 0, 66.723670628048647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44.4824470853657647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.76597647343204622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.121487776695804978, 0, 0, -4.37355996104897921, 0, 0, 0, 0, 0, 0, 15.3074598636714272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.2049732424476182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0933899902622448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.18677998052448961, 0, 0, 0, 0, -61.229839454685709, 0, 0, 0, 0, 0, 0, 0, 0, 153.074598636714272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61.229839454685709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.18677998052448961, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.728926660174829869, 0, 0, 0, 0, -20.4099464848952363, 0, 0, 0, 0, 0, 0, 0, 0, 51.0248662122380908, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -20.4099464848952363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.728926660174829869, 0, 0, 0, 0, 0, 0, 0, 0, + -0.364463330087414934, 0, 0, 7.28926660174829869, 0, 5.83141328139863895, 0, 0, 0, 0, -5.10248662122380908, 0, -122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, -10.2049732424476182, 0, 204.099464848952363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.55124331061190454, 0, -40.8198929697904727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.153105222743980097, 0, 0, 3.06210445487960195, 0, 2.44968356390368156, 0, 0, 0, 0, -2.14347311841572136, 0, -51.4433548419773127, 0, 0, 0, 0, 0, 0, 0, 0, -4.28694623683144273, 0, 85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.07173655920786068, 0, -17.1477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.44968356390368156, 0, 0, 0, 0, 34.2955698946515418, 0, 11.4318566315505139, 0, 0, 0, 0, 0, 0, 0, 0, -171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34.2955698946515418, 0, 171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.44968356390368156, 0, -11.4318566315505139, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.22484178195184078, 0, 0, 0, 0, 17.1477849473257709, 0, 5.71592831577525697, 0, 0, 0, 0, 0, 0, 0, 0, -85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.1477849473257709, 0, 85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.22484178195184078, 0, -5.71592831577525697, 0, 0, 0, 0, 0, 0, + 0.306210445487960195, 0, 0, -2.44968356390368156, 0, -8.57389247366288545, 0, 0, 0, 0, -4.28694623683144273, 0, 77.1650322629659691, 0, 17.1477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 42.8694623683144273, 0, -171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.53105222743980097, 0, -42.8694623683144273, 0, 85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.176790683131149045, 0, 0, -1.41432546504919236, 0, -4.95013912767217325, 0, 0, 0, 0, -2.47506956383608662, 0, 44.5512521490495592, 0, 9.9002782553443465, 0, 0, 0, 0, 0, 0, 0, 0, 24.7506956383608662, 0, -99.002782553443465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.883953415655745223, 0, -24.7506956383608662, 0, 49.5013912767217325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.47506956383608662, 0, 0, 0, 0, -9.9002782553443465, 0, -19.800556510688693, 0, 0, 0, 0, 0, 0, -24.7506956383608662, 0, 99.002782553443465, 0, 19.800556510688693, 0, 0, 0, 0, 0, 0, 0, 0, -9.9002782553443465, 0, 99.002782553443465, 0, -118.803339064132158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.47506956383608662, 0, -19.800556510688693, 0, 19.800556510688693, 0, 0, 0, 0, + + 0, 0, 1.62031337522288607, 0, 0, 0, 0, -6.48125350089154427, 0, -12.9625070017830885, 0, 0, 0, 0, 0, 0, -16.2031337522288607, 0, 64.8125350089154427, 0, 12.9625070017830885, 0, 0, 0, 0, 0, 0, 0, 0, -6.48125350089154427, 0, 64.8125350089154427, 0, -77.7750420106985312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.62031337522288607, 0, -12.9625070017830885, 0, 12.9625070017830885, 0, 0, 0, 0, + -0.270052229203814345, 0, 0, 0, 0, 9.7218802513373164, 0, 0, 0, 0, 1.62031337522288607, 0, -9.7218802513373164, 0, -32.4062675044577213, 0, 0, 0, 0, 0, 0, 2.16041783363051476, 0, -48.609401256686582, 0, 64.8125350089154427, 0, 17.2833426690441181, 0, 0, 0, 0, 0, 0, 0, 0, 0.810156687611443034, 0, -29.1656407540119492, 0, 97.218802513373164, 0, -51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.198164159898117403, 0, 0, 0, 0, 7.13390975633222651, 0, 0, 0, 0, 1.18898495938870442, 0, -7.13390975633222651, 0, -23.7796991877740884, 0, 0, 0, 0, 0, 0, 1.58531327918493922, 0, -35.6695487816611326, 0, 47.5593983755481767, 0, 12.6825062334795138, 0, 0, 0, 0, 0, 0, 0, 0, 0.594492479694352209, 0, -21.4017292689966795, 0, 71.3390975633222651, 0, -38.0475187004385414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.37796991877740884, 0, 0, 0, 0, -4.75593983755481767, 0, 23.7796991877740884, 0, 0, 0, 0, 0, 0, 0, 0, 23.7796991877740884, 0, -38.0475187004385414, 0, 0, 0, 0, 0, 0, 0, 0, 4.75593983755481767, 0, -23.7796991877740884, 0, 0, 0, 10.8707196286967261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.37796991877740884, 0, -23.7796991877740884, 0, 38.0475187004385414, 0, -10.8707196286967261, 0, 0, + + 0, 0, -1.9416043082307367, 0, 0, 0, 0, -3.88320861646147339, 0, 19.416043082307367, 0, 0, 0, 0, 0, 0, 0, 0, 19.416043082307367, 0, -31.0656689316917871, 0, 0, 0, 0, 0, 0, 0, 0, 3.88320861646147339, 0, -19.416043082307367, 0, 0, 0, 8.87590540905479632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.9416043082307367, 0, -19.416043082307367, 0, 31.0656689316917871, 0, -8.87590540905479632, 0, 0, + 0.242700538528842087, 0, 0, 0.970802154115368348, 0, -9.70802154115368348, 0, 0, 0, 0, 1.45620323117305252, 0, -29.1240646234610504, 0, 38.8320861646147339, 0, 0, 0, 0, 0, 0, 0.970802154115368348, 0, -29.1240646234610504, 0, 77.6641723292294678, 0, -31.0656689316917871, 0, 0, 0, 0, 0, 0, 0, 0, 0.242700538528842087, 0, -9.70802154115368348, 0, 38.8320861646147339, 0, -31.0656689316917871, 0, 4.43795270452739816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.219530897104735508, 0, 0, 0.878123588418942033, 0, -8.78123588418942033, 0, 0, 0, 0, 1.31718538262841305, 0, -26.343707652568261, 0, 35.1249435367576813, 0, 0, 0, 0, 0, 0, 0.878123588418942033, 0, -26.343707652568261, 0, 70.2498870735153626, 0, -28.0999548294061451, 0, 0, 0, 0, 0, 0, 0, 0, 0.219530897104735508, 0, -8.78123588418942033, 0, 35.1249435367576813, 0, -28.0999548294061451, 0, 4.01427926134373501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.19530897104735508, 0, 0, 0, 0, 8.78123588418942033, 0, -23.4166290245051209, 0, 0, 0, 0, 0, 0, 13.1718538262841305, 0, -70.2498870735153626, 0, 42.1499322441092176, 0, 0, 0, 0, 0, 0, 0, 0, 8.78123588418942033, 0, -70.2498870735153626, 0, 84.2998644882184352, 0, -16.05711704537494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.19530897104735508, 0, -23.4166290245051209, 0, 42.1499322441092176, 0, -16.05711704537494, 0, 0.892062058076385557, + + 0, 0, 2.19530897104735508, 0, 0, 0, 0, 8.78123588418942033, 0, -23.4166290245051209, 0, 0, 0, 0, 0, 0, 13.1718538262841305, 0, -70.2498870735153626, 0, 42.1499322441092176, 0, 0, 0, 0, 0, 0, 0, 0, 8.78123588418942033, 0, -70.2498870735153626, 0, 84.2998644882184352, 0, -16.05711704537494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.19530897104735508, 0, -23.4166290245051209, 0, 42.1499322441092176, 0, -16.05711704537494, 0, 0.892062058076385557, + -0.219530897104735508, 0, 0, -0.878123588418942033, 0, 8.78123588418942033, 0, 0, 0, 0, -1.31718538262841305, 0, 26.343707652568261, 0, -35.1249435367576813, 0, 0, 0, 0, 0, 0, -0.878123588418942033, 0, 26.343707652568261, 0, -70.2498870735153626, 0, 28.0999548294061451, 0, 0, 0, 0, 0, 0, 0, 0, -0.219530897104735508, 0, 8.78123588418942033, 0, -35.1249435367576813, 0, 28.0999548294061451, 0, -4.01427926134373501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.242700538528842087, 0, 0, -0.970802154115368348, 0, 9.70802154115368348, 0, 0, 0, 0, -1.45620323117305252, 0, 29.1240646234610504, 0, -38.8320861646147339, 0, 0, 0, 0, 0, 0, -0.970802154115368348, 0, 29.1240646234610504, 0, -77.6641723292294678, 0, 31.0656689316917871, 0, 0, 0, 0, 0, 0, 0, 0, -0.242700538528842087, 0, 9.70802154115368348, 0, -38.8320861646147339, 0, 31.0656689316917871, 0, -4.43795270452739816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.9416043082307367, 0, 0, 0, 0, -3.88320861646147339, 0, 19.416043082307367, 0, 0, 0, 0, 0, 0, 0, 0, 19.416043082307367, 0, -31.0656689316917871, 0, 0, 0, 0, 0, 0, 0, 0, 3.88320861646147339, 0, -19.416043082307367, 0, 0, 0, 8.87590540905479632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.9416043082307367, 0, -19.416043082307367, 0, 31.0656689316917871, 0, -8.87590540905479632, 0, 0, + + 0, 0, -2.37796991877740884, 0, 0, 0, 0, -4.75593983755481767, 0, 23.7796991877740884, 0, 0, 0, 0, 0, 0, 0, 0, 23.7796991877740884, 0, -38.0475187004385414, 0, 0, 0, 0, 0, 0, 0, 0, 4.75593983755481767, 0, -23.7796991877740884, 0, 0, 0, 10.8707196286967261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.37796991877740884, 0, -23.7796991877740884, 0, 38.0475187004385414, 0, -10.8707196286967261, 0, 0, + 0.198164159898117403, 0, 0, 0, 0, -7.13390975633222651, 0, 0, 0, 0, -1.18898495938870442, 0, 7.13390975633222651, 0, 23.7796991877740884, 0, 0, 0, 0, 0, 0, -1.58531327918493922, 0, 35.6695487816611326, 0, -47.5593983755481767, 0, -12.6825062334795138, 0, 0, 0, 0, 0, 0, 0, 0, -0.594492479694352209, 0, 21.4017292689966795, 0, -71.3390975633222651, 0, 38.0475187004385414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.270052229203814345, 0, 0, 0, 0, -9.7218802513373164, 0, 0, 0, 0, -1.62031337522288607, 0, 9.7218802513373164, 0, 32.4062675044577213, 0, 0, 0, 0, 0, 0, -2.16041783363051476, 0, 48.609401256686582, 0, -64.8125350089154427, 0, -17.2833426690441181, 0, 0, 0, 0, 0, 0, 0, 0, -0.810156687611443034, 0, 29.1656407540119492, 0, -97.218802513373164, 0, 51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.62031337522288607, 0, 0, 0, 0, -6.48125350089154427, 0, -12.9625070017830885, 0, 0, 0, 0, 0, 0, -16.2031337522288607, 0, 64.8125350089154427, 0, 12.9625070017830885, 0, 0, 0, 0, 0, 0, 0, 0, -6.48125350089154427, 0, 64.8125350089154427, 0, -77.7750420106985312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.62031337522288607, 0, -12.9625070017830885, 0, 12.9625070017830885, 0, 0, 0, 0, + + 0, 0, 2.47506956383608662, 0, 0, 0, 0, -9.9002782553443465, 0, -19.800556510688693, 0, 0, 0, 0, 0, 0, -24.7506956383608662, 0, 99.002782553443465, 0, 19.800556510688693, 0, 0, 0, 0, 0, 0, 0, 0, -9.9002782553443465, 0, 99.002782553443465, 0, -118.803339064132158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.47506956383608662, 0, -19.800556510688693, 0, 19.800556510688693, 0, 0, 0, 0, + -0.176790683131149045, 0, 0, 1.41432546504919236, 0, 4.95013912767217325, 0, 0, 0, 0, 2.47506956383608662, 0, -44.5512521490495592, 0, -9.9002782553443465, 0, 0, 0, 0, 0, 0, 0, 0, -24.7506956383608662, 0, 99.002782553443465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.883953415655745223, 0, 24.7506956383608662, 0, -49.5013912767217325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.306210445487960195, 0, 0, 2.44968356390368156, 0, 8.57389247366288545, 0, 0, 0, 0, 4.28694623683144273, 0, -77.1650322629659691, 0, -17.1477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, -42.8694623683144273, 0, 171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.53105222743980097, 0, 42.8694623683144273, 0, -85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.22484178195184078, 0, 0, 0, 0, 17.1477849473257709, 0, 5.71592831577525697, 0, 0, 0, 0, 0, 0, 0, 0, -85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.1477849473257709, 0, 85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.22484178195184078, 0, -5.71592831577525697, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.44968356390368156, 0, 0, 0, 0, 34.2955698946515418, 0, 11.4318566315505139, 0, 0, 0, 0, 0, 0, 0, 0, -171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34.2955698946515418, 0, 171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.44968356390368156, 0, -11.4318566315505139, 0, 0, 0, 0, 0, 0, + 0.153105222743980097, 0, 0, -3.06210445487960195, 0, -2.44968356390368156, 0, 0, 0, 0, 2.14347311841572136, 0, 51.4433548419773127, 0, 0, 0, 0, 0, 0, 0, 0, 4.28694623683144273, 0, -85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.07173655920786068, 0, 17.1477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.364463330087414934, 0, 0, -7.28926660174829869, 0, -5.83141328139863895, 0, 0, 0, 0, 5.10248662122380908, 0, 122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 10.2049732424476182, 0, -204.099464848952363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.55124331061190454, 0, 40.8198929697904727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0.728926660174829869, 0, 0, 0, 0, -20.4099464848952363, 0, 0, 0, 0, 0, 0, 0, 0, 51.0248662122380908, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -20.4099464848952363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.728926660174829869, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.18677998052448961, 0, 0, 0, 0, -61.229839454685709, 0, 0, 0, 0, 0, 0, 0, 0, 153.074598636714272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61.229839454685709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.18677998052448961, 0, 0, 0, 0, 0, 0, 0, 0, + -0.121487776695804978, 0, 0, 4.37355996104897921, 0, 0, 0, 0, 0, 0, -15.3074598636714272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.2049732424476182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.0933899902622448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.52955294149244958, 0, 0, 19.0639058937281849, 0, 0, 0, 0, 0, 0, -66.723670628048647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44.4824470853657647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.76597647343204622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.52955294149244958, 0, 0, 23.8298823671602311, 0, 0, 0, 0, 0, 0, -111.206117713414412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111.206117713414412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -23.8298823671602311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.52955294149244958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0.52955294149244958, 0, 0, 0, 0, -19.0639058937281849, 0, 0, 0, 0, 0, 0, 0, 0, 66.723670628048647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44.4824470853657647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.76597647343204622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.30826775722029458, 0, 0, 0, 0, 83.0976392599306051, 0, 0, 0, 0, 0, 0, 0, 0, -290.841737409757118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193.894491606504745, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -20.7744098149826513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.121487776695804978, 0, 0, 3.28016997078673441, 0, 2.18677998052448961, 0, 0, 0, 0, -5.10248662122380908, 0, -61.229839454685709, 0, 0, 0, 0, 0, 0, 0, 0, -5.10248662122380908, 0, 153.074598636714272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.28016997078673441, 0, -61.229839454685709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.121487776695804978, 0, 2.18677998052448961, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.364463330087414934, 0, 0, -9.84050991236020323, 0, -6.56033994157346882, 0, 0, 0, 0, 15.3074598636714272, 0, 183.689518364057127, 0, 0, 0, 0, 0, 0, 0, 0, 15.3074598636714272, 0, -459.223795910142817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.84050991236020323, 0, 183.689518364057127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.364463330087414934, 0, -6.56033994157346882, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.0933899902622448, 0, 0, 0, 0, 21.8677998052448961, 0, 5.83141328139863895, 0, 0, 0, 0, 0, 0, -15.3074598636714272, 0, -122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -30.6149197273428545, 0, 204.099464848952363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.65372993183571362, 0, -40.8198929697904727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.60278878664766166, 0, 0, 0, 0, -52.0557757329532331, 0, -13.8815401954541955, 0, 0, 0, 0, 0, 0, 36.4390430130672632, 0, 291.512344104538105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72.8780860261345264, 0, -485.853906840896842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18.2195215065336316, 0, 97.1707813681793685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.153105222743980097, 0, 0, -1.99036789567174127, 0, -4.89936712780736312, 0, 0, 0, 0, -2.14347311841572136, 0, 68.5911397893030836, 0, 11.4318566315505139, 0, 0, 0, 0, 0, 0, 2.14347311841572136, 0, 0, 0, -171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.99036789567174127, 0, -68.5911397893030836, 0, 171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.153105222743980097, 0, 4.89936712780736312, 0, -11.4318566315505139, 0, 0, 0, 0, 0, 0, + + -0.306210445487960195, 0, 0, 3.98073579134348253, 0, 9.79873425561472623, 0, 0, 0, 0, 4.28694623683144273, 0, -137.182279578606167, 0, -22.8637132631010279, 0, 0, 0, 0, 0, 0, -4.28694623683144273, 0, 0, 0, 342.955698946515418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.98073579134348253, 0, 137.182279578606167, 0, -342.955698946515418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.306210445487960195, 0, -9.79873425561472623, 0, 22.8637132631010279, 0, 0, 0, 0, 0, 0, + 0, 0, 1.53105222743980097, 0, 0, 0, 0, -12.2484178195184078, 0, -14.2898207894381424, 0, 0, 0, 0, 0, 0, -21.4347311841572136, 0, 128.608387104943282, 0, 17.1477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71.4491039471907121, 0, -171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.65526113719900487, 0, -71.4491039471907121, 0, 85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.65186024696723567, 0, 0, 0, 0, 21.2148819757378853, 0, 24.7506956383608662, 0, 0, 0, 0, 0, 0, 37.1260434575412994, 0, -222.756260745247796, 0, -29.7008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -123.753478191804331, 0, 297.008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.2593012348361783, 0, 123.753478191804331, 0, -148.504173830165197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.176790683131149045, 0, 0, 0.530372049393447134, 0, 7.42520869150825987, 0, 0, 0, 0, 2.47506956383608662, 0, -29.7008347660330395, 0, -29.7008347660330395, 0, 0, 0, 0, 0, 0, 2.47506956383608662, 0, -74.2520869150825987, 0, 148.504173830165197, 0, 19.800556510688693, 0, 0, 0, 0, 0, 0, 0, 0, 0.530372049393447134, 0, -29.7008347660330395, 0, 148.504173830165197, 0, -118.803339064132158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.176790683131149045, 0, 7.42520869150825987, 0, -29.7008347660330395, 0, 19.800556510688693, 0, 0, 0, 0, + + 0.270052229203814345, 0, 0, -0.810156687611443034, 0, -11.3421936265602025, 0, 0, 0, 0, -3.78073120885340082, 0, 45.3687745062408099, 0, 45.3687745062408099, 0, 0, 0, 0, 0, 0, -3.78073120885340082, 0, 113.421936265602025, 0, -226.843872531204049, 0, -30.2458496708272066, 0, 0, 0, 0, 0, 0, 0, 0, -0.810156687611443034, 0, 45.3687745062408099, 0, -226.843872531204049, 0, 181.47509802496324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.270052229203814345, 0, -11.3421936265602025, 0, 45.3687745062408099, 0, -30.2458496708272066, 0, 0, 0, 0, + 0, 0, -1.89036560442670041, 0, 0, 0, 0, 0, 0, 22.6843872531204049, 0, 0, 0, 0, 0, 0, 11.3421936265602025, 0, -22.6843872531204049, 0, -45.3687745062408099, 0, 0, 0, 0, 0, 0, 0, 0, 15.1229248354136033, 0, -113.421936265602025, 0, 90.7375490124816198, 0, 17.2833426690441181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.67109681328010124, 0, -68.0531617593612148, 0, 136.10632351872243, 0, -51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.57613407867552624, 0, 0, 0, 0, 0, 0, -30.9136089441063149, 0, 0, 0, 0, 0, 0, -15.4568044720531574, 0, 30.9136089441063149, 0, 61.8272178882126298, 0, 0, 0, 0, 0, 0, 0, 0, -20.6090726294042099, 0, 154.568044720531574, 0, -123.65443577642526, 0, -23.5532258621762399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.72840223602657872, 0, 92.7408268323189446, 0, -185.481653664637889, 0, 70.6596775865287197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.198164159898117403, 0, 0, 0.594492479694352209, 0, -9.51187967510963535, 0, 0, 0, 0, 0.396328319796234806, 0, -19.0237593502192707, 0, 47.5593983755481767, 0, 0, 0, 0, 0, 0, -0.396328319796234806, 0, 0, 0, 47.5593983755481767, 0, -50.7300249339180552, 0, 0, 0, 0, 0, 0, 0, 0, -0.594492479694352209, 0, 19.0237593502192707, 0, -47.5593983755481767, 0, 0, 0, 10.8707196286967261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.198164159898117403, 0, 9.51187967510963535, 0, -47.5593983755481767, 0, 50.7300249339180552, 0, -10.8707196286967261, 0, 0, + + -0.242700538528842087, 0, 0, -0.728101615586526261, 0, 11.6496258493844202, 0, 0, 0, 0, -0.485401077057684174, 0, 23.2992516987688403, 0, -58.2481292469221009, 0, 0, 0, 0, 0, 0, 0.485401077057684174, 0, 0, 0, -58.2481292469221009, 0, 62.1313378633835742, 0, 0, 0, 0, 0, 0, 0, 0, 0.728101615586526261, 0, -23.2992516987688403, 0, 58.2481292469221009, 0, 0, 0, -13.3138581135821945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.242700538528842087, 0, -11.6496258493844202, 0, 58.2481292469221009, 0, -62.1313378633835742, 0, 13.3138581135821945, 0, 0, + 0, 0, 2.18430484675957878, 0, 0, 0, 0, 8.73721938703831513, 0, -29.1240646234610504, 0, 0, 0, 0, 0, 0, 13.1058290805574727, 0, -87.3721938703831513, 0, 69.897755096306521, 0, 0, 0, 0, 0, 0, 0, 0, 8.73721938703831513, 0, -87.3721938703831513, 0, 139.795510192613042, 0, -39.9415743407465834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.18430484675957878, 0, -29.1240646234610504, 0, 69.897755096306521, 0, -39.9415743407465834, 0, 4.43795270452739816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.41483986815209059, 0, 0, 0, 0, -9.65935947260836236, 0, 32.1978649086945412, 0, 0, 0, 0, 0, 0, -14.4890392089125435, 0, 96.5935947260836236, 0, -77.2748757808668989, 0, 0, 0, 0, 0, 0, 0, 0, -9.65935947260836236, 0, 96.5935947260836236, 0, -154.549751561733798, 0, 44.1570718747810851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.41483986815209059, 0, 32.1978649086945412, 0, -77.2748757808668989, 0, 44.1570718747810851, 0, -4.90634131942012056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.219530897104735508, 0, 0, -1.09765448552367754, 0, 10.9765448552367754, 0, 0, 0, 0, -2.19530897104735508, 0, 43.9061794209471016, 0, -58.5415725612628022, 0, 0, 0, 0, 0, 0, -2.19530897104735508, 0, 65.8592691314206525, 0, -175.624717683788407, 0, 70.2498870735153626, 0, 0, 0, 0, 0, 0, 0, 0, -1.09765448552367754, 0, 43.9061794209471016, 0, -175.624717683788407, 0, 140.499774147030725, 0, -20.071396306718675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.219530897104735508, 0, 10.9765448552367754, 0, -58.5415725612628022, 0, 70.2498870735153626, 0, -20.071396306718675, 0, 0.892062058076385557, + + 0.219530897104735508, 0, 0, 1.09765448552367754, 0, -10.9765448552367754, 0, 0, 0, 0, 2.19530897104735508, 0, -43.9061794209471016, 0, 58.5415725612628022, 0, 0, 0, 0, 0, 0, 2.19530897104735508, 0, -65.8592691314206525, 0, 175.624717683788407, 0, -70.2498870735153626, 0, 0, 0, 0, 0, 0, 0, 0, 1.09765448552367754, 0, -43.9061794209471016, 0, 175.624717683788407, 0, -140.499774147030725, 0, 20.071396306718675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.219530897104735508, 0, -10.9765448552367754, 0, 58.5415725612628022, 0, -70.2498870735153626, 0, 20.071396306718675, 0, -0.892062058076385557, + 0, 0, -2.41483986815209059, 0, 0, 0, 0, -9.65935947260836236, 0, 32.1978649086945412, 0, 0, 0, 0, 0, 0, -14.4890392089125435, 0, 96.5935947260836236, 0, -77.2748757808668989, 0, 0, 0, 0, 0, 0, 0, 0, -9.65935947260836236, 0, 96.5935947260836236, 0, -154.549751561733798, 0, 44.1570718747810851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.41483986815209059, 0, 32.1978649086945412, 0, -77.2748757808668989, 0, 44.1570718747810851, 0, -4.90634131942012056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.18430484675957878, 0, 0, 0, 0, 8.73721938703831513, 0, -29.1240646234610504, 0, 0, 0, 0, 0, 0, 13.1058290805574727, 0, -87.3721938703831513, 0, 69.897755096306521, 0, 0, 0, 0, 0, 0, 0, 0, 8.73721938703831513, 0, -87.3721938703831513, 0, 139.795510192613042, 0, -39.9415743407465834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.18430484675957878, 0, -29.1240646234610504, 0, 69.897755096306521, 0, -39.9415743407465834, 0, 4.43795270452739816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.242700538528842087, 0, 0, 0.728101615586526261, 0, -11.6496258493844202, 0, 0, 0, 0, 0.485401077057684174, 0, -23.2992516987688403, 0, 58.2481292469221009, 0, 0, 0, 0, 0, 0, -0.485401077057684174, 0, 0, 0, 58.2481292469221009, 0, -62.1313378633835742, 0, 0, 0, 0, 0, 0, 0, 0, -0.728101615586526261, 0, 23.2992516987688403, 0, -58.2481292469221009, 0, 0, 0, 13.3138581135821945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.242700538528842087, 0, 11.6496258493844202, 0, -58.2481292469221009, 0, 62.1313378633835742, 0, -13.3138581135821945, 0, 0, + + -0.198164159898117403, 0, 0, -0.594492479694352209, 0, 9.51187967510963535, 0, 0, 0, 0, -0.396328319796234806, 0, 19.0237593502192707, 0, -47.5593983755481767, 0, 0, 0, 0, 0, 0, 0.396328319796234806, 0, 0, 0, -47.5593983755481767, 0, 50.7300249339180552, 0, 0, 0, 0, 0, 0, 0, 0, 0.594492479694352209, 0, -19.0237593502192707, 0, 47.5593983755481767, 0, 0, 0, -10.8707196286967261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.198164159898117403, 0, -9.51187967510963535, 0, 47.5593983755481767, 0, -50.7300249339180552, 0, 10.8707196286967261, 0, 0, + 0, 0, 2.57613407867552624, 0, 0, 0, 0, 0, 0, -30.9136089441063149, 0, 0, 0, 0, 0, 0, -15.4568044720531574, 0, 30.9136089441063149, 0, 61.8272178882126298, 0, 0, 0, 0, 0, 0, 0, 0, -20.6090726294042099, 0, 154.568044720531574, 0, -123.65443577642526, 0, -23.5532258621762399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.72840223602657872, 0, 92.7408268323189446, 0, -185.481653664637889, 0, 70.6596775865287197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.89036560442670041, 0, 0, 0, 0, 0, 0, 22.6843872531204049, 0, 0, 0, 0, 0, 0, 11.3421936265602025, 0, -22.6843872531204049, 0, -45.3687745062408099, 0, 0, 0, 0, 0, 0, 0, 0, 15.1229248354136033, 0, -113.421936265602025, 0, 90.7375490124816198, 0, 17.2833426690441181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.67109681328010124, 0, -68.0531617593612148, 0, 136.10632351872243, 0, -51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.270052229203814345, 0, 0, 0.810156687611443034, 0, 11.3421936265602025, 0, 0, 0, 0, 3.78073120885340082, 0, -45.3687745062408099, 0, -45.3687745062408099, 0, 0, 0, 0, 0, 0, 3.78073120885340082, 0, -113.421936265602025, 0, 226.843872531204049, 0, 30.2458496708272066, 0, 0, 0, 0, 0, 0, 0, 0, 0.810156687611443034, 0, -45.3687745062408099, 0, 226.843872531204049, 0, -181.47509802496324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.270052229203814345, 0, 11.3421936265602025, 0, -45.3687745062408099, 0, 30.2458496708272066, 0, 0, 0, 0, + + 0.176790683131149045, 0, 0, -0.530372049393447134, 0, -7.42520869150825987, 0, 0, 0, 0, -2.47506956383608662, 0, 29.7008347660330395, 0, 29.7008347660330395, 0, 0, 0, 0, 0, 0, -2.47506956383608662, 0, 74.2520869150825987, 0, -148.504173830165197, 0, -19.800556510688693, 0, 0, 0, 0, 0, 0, 0, 0, -0.530372049393447134, 0, 29.7008347660330395, 0, -148.504173830165197, 0, 118.803339064132158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.176790683131149045, 0, -7.42520869150825987, 0, 29.7008347660330395, 0, -19.800556510688693, 0, 0, 0, 0, + 0, 0, -2.65186024696723567, 0, 0, 0, 0, 21.2148819757378853, 0, 24.7506956383608662, 0, 0, 0, 0, 0, 0, 37.1260434575412994, 0, -222.756260745247796, 0, -29.7008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -123.753478191804331, 0, 297.008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.2593012348361783, 0, 123.753478191804331, 0, -148.504173830165197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.53105222743980097, 0, 0, 0, 0, -12.2484178195184078, 0, -14.2898207894381424, 0, 0, 0, 0, 0, 0, -21.4347311841572136, 0, 128.608387104943282, 0, 17.1477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71.4491039471907121, 0, -171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.65526113719900487, 0, -71.4491039471907121, 0, 85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.306210445487960195, 0, 0, -3.98073579134348253, 0, -9.79873425561472623, 0, 0, 0, 0, -4.28694623683144273, 0, 137.182279578606167, 0, 22.8637132631010279, 0, 0, 0, 0, 0, 0, 4.28694623683144273, 0, 0, 0, -342.955698946515418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.98073579134348253, 0, -137.182279578606167, 0, 342.955698946515418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.306210445487960195, 0, 9.79873425561472623, 0, -22.8637132631010279, 0, 0, 0, 0, 0, 0, + + -0.153105222743980097, 0, 0, 1.99036789567174127, 0, 4.89936712780736312, 0, 0, 0, 0, 2.14347311841572136, 0, -68.5911397893030836, 0, -11.4318566315505139, 0, 0, 0, 0, 0, 0, -2.14347311841572136, 0, 0, 0, 171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.99036789567174127, 0, 68.5911397893030836, 0, -171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.153105222743980097, 0, -4.89936712780736312, 0, 11.4318566315505139, 0, 0, 0, 0, 0, 0, + 0, 0, 2.60278878664766166, 0, 0, 0, 0, -52.0557757329532331, 0, -13.8815401954541955, 0, 0, 0, 0, 0, 0, 36.4390430130672632, 0, 291.512344104538105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72.8780860261345264, 0, -485.853906840896842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18.2195215065336316, 0, 97.1707813681793685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.0933899902622448, 0, 0, 0, 0, 21.8677998052448961, 0, 5.83141328139863895, 0, 0, 0, 0, 0, 0, -15.3074598636714272, 0, -122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -30.6149197273428545, 0, 204.099464848952363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.65372993183571362, 0, -40.8198929697904727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.364463330087414934, 0, 0, 9.84050991236020323, 0, 6.56033994157346882, 0, 0, 0, 0, -15.3074598636714272, 0, -183.689518364057127, 0, 0, 0, 0, 0, 0, 0, 0, -15.3074598636714272, 0, 459.223795910142817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.84050991236020323, 0, -183.689518364057127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.364463330087414934, 0, 6.56033994157346882, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.121487776695804978, 0, 0, -3.28016997078673441, 0, -2.18677998052448961, 0, 0, 0, 0, 5.10248662122380908, 0, 61.229839454685709, 0, 0, 0, 0, 0, 0, 0, 0, 5.10248662122380908, 0, -153.074598636714272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.28016997078673441, 0, 61.229839454685709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.121487776695804978, 0, -2.18677998052448961, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.30826775722029458, 0, 0, 0, 0, 83.0976392599306051, 0, 0, 0, 0, 0, 0, 0, 0, -290.841737409757118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193.894491606504745, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -20.7744098149826513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.52955294149244958, 0, 0, 0, 0, -19.0639058937281849, 0, 0, 0, 0, 0, 0, 0, 0, 66.723670628048647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44.4824470853657647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.76597647343204622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.52955294149244958, 0, 0, -23.8298823671602311, 0, 0, 0, 0, 0, 0, 111.206117713414412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111.206117713414412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23.8298823671602311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.52955294149244958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.542630291944221461, 0, 0, -24.4183631374899657, 0, 0, 0, 0, 0, 0, 113.952361308286507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -113.952361308286507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24.4183631374899657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.542630291944221461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.11841163748620862, 0, 0, -5.32852368687938788, 0, 0, 0, 0, 0, 0, 24.8664438721038101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -24.8664438721038101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.32852368687938788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.11841163748620862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.36823274972417239, 0, 0, 0, 0, -85.2563789900702061, 0, 0, 0, 0, 0, 0, 0, 0, 298.397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -198.931550976830481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21.3140947475175515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.748900951853188297, 0, 0, 0, 0, -26.9604342667147787, 0, 0, 0, 0, 0, 0, 0, 0, 94.3615199335017254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62.9076799556678169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.74010856667869467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.374450475926594148, 0, 0, 10.110162850018042, 0, 6.74010856667869467, 0, 0, 0, 0, -15.7269199889169542, 0, -188.723039867003451, 0, 0, 0, 0, 0, 0, 0, 0, -15.7269199889169542, 0, 471.807599667508627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.110162850018042, 0, -188.723039867003451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.374450475926594148, 0, 6.74010856667869467, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.148791531444953757, 0, 0, 4.01737134901375144, 0, 2.67824756600916763, 0, 0, 0, 0, -6.2492443206880578, 0, -74.9909318482566936, 0, 0, 0, 0, 0, 0, 0, 0, -6.2492443206880578, 0, 187.477329620641734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.01737134901375144, 0, -74.9909318482566936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.148791531444953757, 0, 2.67824756600916763, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.67824756600916763, 0, 0, 0, 0, 53.5649513201833526, 0, 14.2839870187155607, 0, 0, 0, 0, 0, 0, -37.4954659241283468, 0, -299.963727393026774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74.9909318482566936, 0, 499.939545655044624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18.7477329620641734, 0, -99.9879091310089248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.26253801041429866, 0, 0, 0, 0, 25.2507602082859732, 0, 6.73353605554292619, 0, 0, 0, 0, 0, 0, -17.6755321458001813, 0, -141.40425716640145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35.3510642916003625, 0, 235.673761944002417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.83776607290009063, 0, -47.1347523888004833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.315634502603574665, 0, 0, -4.10324853384647065, 0, -10.1003040833143893, 0, 0, 0, 0, -4.41888303645004531, 0, 141.40425716640145, 0, 23.5673761944002417, 0, 0, 0, 0, 0, 0, 4.41888303645004531, 0, 0, 0, -353.510642916003625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.10324853384647065, 0, -141.40425716640145, 0, 353.510642916003625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.315634502603574665, 0, 10.1003040833143893, 0, -23.5673761944002417, 0, 0, 0, 0, 0, 0, + + 0.171176842882893189, 0, 0, -2.22529895747761146, 0, -5.47765897225258205, 0, 0, 0, 0, -2.39647580036050465, 0, 76.6872256115361487, 0, 12.7812042685893581, 0, 0, 0, 0, 0, 0, 2.39647580036050465, 0, 0, 0, -191.718064028840372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.22529895747761146, 0, -76.6872256115361487, 0, 191.718064028840372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.171176842882893189, 0, 5.47765897225258205, 0, -12.7812042685893581, 0, 0, 0, 0, 0, 0, + 0, 0, 2.73882948612629102, 0, 0, 0, 0, -21.9106358890103282, 0, -25.5624085371787162, 0, 0, 0, 0, 0, 0, -38.3436128057680743, 0, 230.061676834608446, 0, 30.6748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127.812042685893581, 0, -306.748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.6941474306314551, 0, -127.812042685893581, 0, 153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.67718368337461811, 0, 0, 0, 0, -13.4174694669969449, 0, -15.6537143781631024, 0, 0, 0, 0, 0, 0, -23.4805715672446536, 0, 140.883429403467921, 0, 18.7844572537957229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78.2685718908155119, 0, -187.844572537957229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.38591841687309056, 0, -78.2685718908155119, 0, 93.9222862689786143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.279530613895769685, 0, 0, 0.838591841687309056, 0, 11.7402857836223268, 0, 0, 0, 0, 3.9134285945407756, 0, -46.9611431344893072, 0, -46.9611431344893072, 0, 0, 0, 0, 0, 0, 3.9134285945407756, 0, -117.402857836223268, 0, 234.805715672446536, 0, 31.3074287563262048, 0, 0, 0, 0, 0, 0, 0, 0, 0.838591841687309056, 0, -46.9611431344893072, 0, 234.805715672446536, 0, -187.844572537957229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.279530613895769685, 0, 11.7402857836223268, 0, -46.9611431344893072, 0, 31.3074287563262048, 0, 0, 0, 0, + + -0.190955762544560929, 0, 0, 0.572867287633682787, 0, 8.02014202687155901, 0, 0, 0, 0, 2.673380675623853, 0, -32.0805681074862361, 0, -32.0805681074862361, 0, 0, 0, 0, 0, 0, 2.673380675623853, 0, -80.2014202687155901, 0, 160.40284053743118, 0, 21.387045404990824, 0, 0, 0, 0, 0, 0, 0, 0, 0.572867287633682787, 0, -32.0805681074862361, 0, 160.40284053743118, 0, -128.322272429944944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.190955762544560929, 0, 8.02014202687155901, 0, -32.0805681074862361, 0, 21.387045404990824, 0, 0, 0, 0, + 0, 0, -2.673380675623853, 0, 0, 0, 0, 0, 0, 32.0805681074862361, 0, 0, 0, 0, 0, 0, 16.040284053743118, 0, -32.0805681074862361, 0, -64.1611362149724721, 0, 0, 0, 0, 0, 0, 0, 0, 21.387045404990824, 0, -160.40284053743118, 0, 128.322272429944944, 0, 24.4423376057037989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.02014202687155901, 0, -96.2417043224587082, 0, 192.483408644917416, 0, -73.3270128171113967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.02088583643044288, 0, 0, 0, 0, 0, 0, 24.2506300371653145, 0, 0, 0, 0, 0, 0, 12.1253150185826573, 0, -24.2506300371653145, 0, -48.501260074330629, 0, 0, 0, 0, 0, 0, 0, 0, 16.167086691443543, 0, -121.253150185826573, 0, 97.0025201486612581, 0, 18.4766705045069063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.06265750929132863, 0, -72.7518901114959435, 0, 145.503780222991887, 0, -55.4300115135207189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.25261072955380536, 0, 0, 0.757832188661416079, 0, -12.1253150185826573, 0, 0, 0, 0, 0.505221459107610719, 0, -24.2506300371653145, 0, 60.6265750929132863, 0, 0, 0, 0, 0, 0, -0.505221459107610719, 0, 0, 0, 60.6265750929132863, 0, -64.668346765774172, 0, 0, 0, 0, 0, 0, 0, 0, -0.757832188661416079, 0, 24.2506300371653145, 0, -60.6265750929132863, 0, 0, 0, 13.8575028783801797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.25261072955380536, 0, 12.1253150185826573, 0, -60.6265750929132863, 0, 64.668346765774172, 0, -13.8575028783801797, 0, 0, + + 0.210184831878141177, 0, 0, 0.630554495634423532, 0, -10.0888719301507765, 0, 0, 0, 0, 0.420369663756282355, 0, -20.177743860301553, 0, 50.4443596507538826, 0, 0, 0, 0, 0, 0, -0.420369663756282355, 0, 0, 0, 50.4443596507538826, 0, -53.8073169608041414, 0, 0, 0, 0, 0, 0, 0, 0, -0.630554495634423532, 0, 20.177743860301553, 0, -50.4443596507538826, 0, 0, 0, 11.5301393487437446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.210184831878141177, 0, 10.0888719301507765, 0, -50.4443596507538826, 0, 53.8073169608041414, 0, -11.5301393487437446, 0, 0, + 0, 0, 2.52221798253769413, 0, 0, 0, 0, 10.0888719301507765, 0, -33.6295731005025884, 0, 0, 0, 0, 0, 0, 15.1333078952261648, 0, -100.888719301507765, 0, 80.7109754412062121, 0, 0, 0, 0, 0, 0, 0, 0, 10.0888719301507765, 0, -100.888719301507765, 0, 161.421950882412424, 0, -46.1205573949749784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.52221798253769413, 0, -33.6295731005025884, 0, 80.7109754412062121, 0, -46.1205573949749784, 0, 5.12450637721944204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.30245947330177705, 0, 0, 0, 0, 9.20983789320710822, 0, -30.6994596440236941, 0, 0, 0, 0, 0, 0, 13.8147568398106623, 0, -92.0983789320710822, 0, 73.6787031456568658, 0, 0, 0, 0, 0, 0, 0, 0, 9.20983789320710822, 0, -92.0983789320710822, 0, 147.357406291313732, 0, -42.1021160832324947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.30245947330177705, 0, -30.6994596440236941, 0, 73.6787031456568658, 0, -42.1021160832324947, 0, 4.67801289813694386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.230245947330177705, 0, 0, -1.15122973665088853, 0, 11.5122973665088853, 0, 0, 0, 0, -2.30245947330177705, 0, 46.0491894660355411, 0, -61.3989192880473881, 0, 0, 0, 0, 0, 0, -2.30245947330177705, 0, 69.0737841990533116, 0, -184.196757864142164, 0, 73.6787031456568658, 0, 0, 0, 0, 0, 0, 0, 0, -1.15122973665088853, 0, 46.0491894660355411, 0, -184.196757864142164, 0, 147.357406291313732, 0, -21.0510580416162474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.230245947330177705, 0, 11.5122973665088853, 0, -61.3989192880473881, 0, 73.6787031456568658, 0, -21.0510580416162474, 0, 0.935602579627388772, + + -0.230245947330177705, 0, 0, -1.15122973665088853, 0, 11.5122973665088853, 0, 0, 0, 0, -2.30245947330177705, 0, 46.0491894660355411, 0, -61.3989192880473881, 0, 0, 0, 0, 0, 0, -2.30245947330177705, 0, 69.0737841990533116, 0, -184.196757864142164, 0, 73.6787031456568658, 0, 0, 0, 0, 0, 0, 0, 0, -1.15122973665088853, 0, 46.0491894660355411, 0, -184.196757864142164, 0, 147.357406291313732, 0, -21.0510580416162474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.230245947330177705, 0, 11.5122973665088853, 0, -61.3989192880473881, 0, 73.6787031456568658, 0, -21.0510580416162474, 0, 0.935602579627388772, + 0, 0, -2.30245947330177705, 0, 0, 0, 0, -9.20983789320710822, 0, 30.6994596440236941, 0, 0, 0, 0, 0, 0, -13.8147568398106623, 0, 92.0983789320710822, 0, -73.6787031456568658, 0, 0, 0, 0, 0, 0, 0, 0, -9.20983789320710822, 0, 92.0983789320710822, 0, -147.357406291313732, 0, 42.1021160832324947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.30245947330177705, 0, 30.6994596440236941, 0, -73.6787031456568658, 0, 42.1021160832324947, 0, -4.67801289813694386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.52221798253769413, 0, 0, 0, 0, -10.0888719301507765, 0, 33.6295731005025884, 0, 0, 0, 0, 0, 0, -15.1333078952261648, 0, 100.888719301507765, 0, -80.7109754412062121, 0, 0, 0, 0, 0, 0, 0, 0, -10.0888719301507765, 0, 100.888719301507765, 0, -161.421950882412424, 0, 46.1205573949749784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.52221798253769413, 0, 33.6295731005025884, 0, -80.7109754412062121, 0, 46.1205573949749784, 0, -5.12450637721944204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.210184831878141177, 0, 0, 0.630554495634423532, 0, -10.0888719301507765, 0, 0, 0, 0, 0.420369663756282355, 0, -20.177743860301553, 0, 50.4443596507538826, 0, 0, 0, 0, 0, 0, -0.420369663756282355, 0, 0, 0, 50.4443596507538826, 0, -53.8073169608041414, 0, 0, 0, 0, 0, 0, 0, 0, -0.630554495634423532, 0, 20.177743860301553, 0, -50.4443596507538826, 0, 0, 0, 11.5301393487437446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.210184831878141177, 0, 10.0888719301507765, 0, -50.4443596507538826, 0, 53.8073169608041414, 0, -11.5301393487437446, 0, 0, + + 0.25261072955380536, 0, 0, 0.757832188661416079, 0, -12.1253150185826573, 0, 0, 0, 0, 0.505221459107610719, 0, -24.2506300371653145, 0, 60.6265750929132863, 0, 0, 0, 0, 0, 0, -0.505221459107610719, 0, 0, 0, 60.6265750929132863, 0, -64.668346765774172, 0, 0, 0, 0, 0, 0, 0, 0, -0.757832188661416079, 0, 24.2506300371653145, 0, -60.6265750929132863, 0, 0, 0, 13.8575028783801797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.25261072955380536, 0, 12.1253150185826573, 0, -60.6265750929132863, 0, 64.668346765774172, 0, -13.8575028783801797, 0, 0, + 0, 0, 2.02088583643044288, 0, 0, 0, 0, 0, 0, -24.2506300371653145, 0, 0, 0, 0, 0, 0, -12.1253150185826573, 0, 24.2506300371653145, 0, 48.501260074330629, 0, 0, 0, 0, 0, 0, 0, 0, -16.167086691443543, 0, 121.253150185826573, 0, -97.0025201486612581, 0, -18.4766705045069063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.06265750929132863, 0, 72.7518901114959435, 0, -145.503780222991887, 0, 55.4300115135207189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.673380675623853, 0, 0, 0, 0, 0, 0, -32.0805681074862361, 0, 0, 0, 0, 0, 0, -16.040284053743118, 0, 32.0805681074862361, 0, 64.1611362149724721, 0, 0, 0, 0, 0, 0, 0, 0, -21.387045404990824, 0, 160.40284053743118, 0, -128.322272429944944, 0, -24.4423376057037989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.02014202687155901, 0, 96.2417043224587082, 0, -192.483408644917416, 0, 73.3270128171113967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.190955762544560929, 0, 0, 0.572867287633682787, 0, 8.02014202687155901, 0, 0, 0, 0, 2.673380675623853, 0, -32.0805681074862361, 0, -32.0805681074862361, 0, 0, 0, 0, 0, 0, 2.673380675623853, 0, -80.2014202687155901, 0, 160.40284053743118, 0, 21.387045404990824, 0, 0, 0, 0, 0, 0, 0, 0, 0.572867287633682787, 0, -32.0805681074862361, 0, 160.40284053743118, 0, -128.322272429944944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.190955762544560929, 0, 8.02014202687155901, 0, -32.0805681074862361, 0, 21.387045404990824, 0, 0, 0, 0, + + -0.279530613895769685, 0, 0, 0.838591841687309056, 0, 11.7402857836223268, 0, 0, 0, 0, 3.9134285945407756, 0, -46.9611431344893072, 0, -46.9611431344893072, 0, 0, 0, 0, 0, 0, 3.9134285945407756, 0, -117.402857836223268, 0, 234.805715672446536, 0, 31.3074287563262048, 0, 0, 0, 0, 0, 0, 0, 0, 0.838591841687309056, 0, -46.9611431344893072, 0, 234.805715672446536, 0, -187.844572537957229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.279530613895769685, 0, 11.7402857836223268, 0, -46.9611431344893072, 0, 31.3074287563262048, 0, 0, 0, 0, + 0, 0, -1.67718368337461811, 0, 0, 0, 0, 13.4174694669969449, 0, 15.6537143781631024, 0, 0, 0, 0, 0, 0, 23.4805715672446536, 0, -140.883429403467921, 0, -18.7844572537957229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -78.2685718908155119, 0, 187.844572537957229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.38591841687309056, 0, 78.2685718908155119, 0, -93.9222862689786143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.73882948612629102, 0, 0, 0, 0, 21.9106358890103282, 0, 25.5624085371787162, 0, 0, 0, 0, 0, 0, 38.3436128057680743, 0, -230.061676834608446, 0, -30.6748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -127.812042685893581, 0, 306.748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.6941474306314551, 0, 127.812042685893581, 0, -153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.171176842882893189, 0, 0, -2.22529895747761146, 0, -5.47765897225258205, 0, 0, 0, 0, -2.39647580036050465, 0, 76.6872256115361487, 0, 12.7812042685893581, 0, 0, 0, 0, 0, 0, 2.39647580036050465, 0, 0, 0, -191.718064028840372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.22529895747761146, 0, -76.6872256115361487, 0, 191.718064028840372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.171176842882893189, 0, 5.47765897225258205, 0, -12.7812042685893581, 0, 0, 0, 0, 0, 0, + + 0.315634502603574665, 0, 0, -4.10324853384647065, 0, -10.1003040833143893, 0, 0, 0, 0, -4.41888303645004531, 0, 141.40425716640145, 0, 23.5673761944002417, 0, 0, 0, 0, 0, 0, 4.41888303645004531, 0, 0, 0, -353.510642916003625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.10324853384647065, 0, -141.40425716640145, 0, 353.510642916003625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.315634502603574665, 0, 10.1003040833143893, 0, -23.5673761944002417, 0, 0, 0, 0, 0, 0, + 0, 0, 1.26253801041429866, 0, 0, 0, 0, -25.2507602082859732, 0, -6.73353605554292619, 0, 0, 0, 0, 0, 0, 17.6755321458001813, 0, 141.40425716640145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35.3510642916003625, 0, -235.673761944002417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.83776607290009063, 0, 47.1347523888004833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.67824756600916763, 0, 0, 0, 0, -53.5649513201833526, 0, -14.2839870187155607, 0, 0, 0, 0, 0, 0, 37.4954659241283468, 0, 299.963727393026774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74.9909318482566936, 0, -499.939545655044624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18.7477329620641734, 0, 99.9879091310089248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.148791531444953757, 0, 0, 4.01737134901375144, 0, 2.67824756600916763, 0, 0, 0, 0, -6.2492443206880578, 0, -74.9909318482566936, 0, 0, 0, 0, 0, 0, 0, 0, -6.2492443206880578, 0, 187.477329620641734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.01737134901375144, 0, -74.9909318482566936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.148791531444953757, 0, 2.67824756600916763, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.374450475926594148, 0, 0, 10.110162850018042, 0, 6.74010856667869467, 0, 0, 0, 0, -15.7269199889169542, 0, -188.723039867003451, 0, 0, 0, 0, 0, 0, 0, 0, -15.7269199889169542, 0, 471.807599667508627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.110162850018042, 0, -188.723039867003451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.374450475926594148, 0, 6.74010856667869467, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -0.748900951853188297, 0, 0, 0, 0, 26.9604342667147787, 0, 0, 0, 0, 0, 0, 0, 0, -94.3615199335017254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62.9076799556678169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.74010856667869467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.36823274972417239, 0, 0, 0, 0, 85.2563789900702061, 0, 0, 0, 0, 0, 0, 0, 0, -298.397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198.931550976830481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21.3140947475175515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.11841163748620862, 0, 0, -5.32852368687938788, 0, 0, 0, 0, 0, 0, 24.8664438721038101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -24.8664438721038101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.32852368687938788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.11841163748620862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.542630291944221461, 0, 0, -24.4183631374899657, 0, 0, 0, 0, 0, 0, 113.952361308286507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -113.952361308286507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24.4183631374899657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.542630291944221461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.542630291944221461, 0, 0, 29.8446660569321803, 0, 0, 0, 0, 0, 0, -179.067996341593082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250.695194878230315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -89.533998170796541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.96893321138643607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0.542630291944221461, 0, 0, 0, 0, -24.4183631374899657, 0, 0, 0, 0, 0, 0, 0, 0, 113.952361308286507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -113.952361308286507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24.4183631374899657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.542630291944221461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.48664438721038101, 0, 0, 0, 0, 111.898997424467146, 0, 0, 0, 0, 0, 0, 0, 0, -522.195321314180012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 522.195321314180012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111.898997424467146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.48664438721038101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.11841163748620862, 0, 0, 4.14440731201730169, 0, 2.36823274972417239, 0, 0, 0, 0, -10.6570473737587758, 0, -85.2563789900702061, 0, 0, 0, 0, 0, 0, 0, 0, -4.97328877442076202, 0, 298.397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.88087281146564647, 0, -198.931550976830481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.06570473737587758, 0, 21.3140947475175515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.374450475926594148, 0, 0, -13.1057666574307952, 0, -7.48900951853188297, 0, 0, 0, 0, 33.7005428333934733, 0, 269.604342667147787, 0, 0, 0, 0, 0, 0, 0, 0, 15.7269199889169542, 0, -943.615199335017254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -28.0837856944945611, 0, 629.076799556678169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.37005428333934733, 0, -67.4010856667869467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.12335142777978244, 0, 0, 0, 0, 30.330488550054126, 0, 6.74010856667869467, 0, 0, 0, 0, 0, 0, -47.1807599667508627, 0, -188.723039867003451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47.1807599667508627, 0, 471.807599667508627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30.330488550054126, 0, -188.723039867003451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.12335142777978244, 0, 6.74010856667869467, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.82703909745412139, 0, 0, 0, 0, -76.3300556312612774, 0, -16.9622345847247283, 0, 0, 0, 0, 0, 0, 118.735642093073098, 0, 474.942568372292393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118.735642093073098, 0, -1187.35642093073098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76.3300556312612774, 0, 474.942568372292393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.82703909745412139, 0, -16.9622345847247283, 0, 0, 0, 0, 0, 0, 0, 0, + 0.148791531444953757, 0, 0, -2.82703909745412139, 0, -5.35649513201833526, 0, 0, 0, 0, -0.892749188669722543, 0, 107.129902640366705, 0, 14.2839870187155607, 0, 0, 0, 0, 0, 0, 6.2492443206880578, 0, -74.9909318482566936, 0, -299.963727393026774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.1246221603440289, 0, -149.981863696513387, 0, 499.939545655044624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.0415407201146763, 0, 37.4954659241283468, 0, -99.9879091310089248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.315634502603574665, 0, 0, 5.99705554946791864, 0, 11.3628420937286879, 0, 0, 0, 0, 1.89380701562144799, 0, -227.256841874573759, 0, -30.3009122499431679, 0, 0, 0, 0, 0, 0, -13.2566491093501359, 0, 159.079789312201631, 0, 636.319157248806525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.62832455467506797, 0, 318.159578624403263, 0, -1060.53192874801088, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.20944151822502266, 0, -79.5398946561008156, 0, 212.106385749602175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.57817251301787333, 0, 0, 0, 0, -20.5162426692323532, 0, -16.8338401388573155, 0, 0, 0, 0, 0, 0, -22.0944151822502266, 0, 235.673761944002417, 0, 23.5673761944002417, 0, 0, 0, 0, 0, 0, 0, 0, 22.0944151822502266, 0, 0, 0, -353.510642916003625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20.5162426692323532, 0, -235.673761944002417, 0, 353.510642916003625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.57817251301787333, 0, 16.8338401388573155, 0, -23.5673761944002417, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.91000632900918421, 0, 0, 0, 0, 37.8300822771193948, 0, 31.0400675094312983, 0, 0, 0, 0, 0, 0, 40.740088606128579, 0, -434.560945132038176, 0, -43.4560945132038176, 0, 0, 0, 0, 0, 0, 0, 0, -40.740088606128579, 0, 0, 0, 651.841417698057264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37.8300822771193948, 0, 434.560945132038176, 0, -651.841417698057264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.91000632900918421, 0, -31.0400675094312983, 0, 43.4560945132038176, 0, 0, 0, 0, 0, 0, + -0.171176842882893189, 0, 0, 1.19823790018025232, 0, 8.21648845837887307, 0, 0, 0, 0, 3.76589054342365016, 0, -65.7319076670309846, 0, -38.3436128057680743, 0, 0, 0, 0, 0, 0, 2.39647580036050465, 0, -115.030838417304223, 0, 345.092515251912669, 0, 30.6748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, -0.855884214414465945, 0, 0, 0, 191.718064028840372, 0, -306.748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.855884214414465945, 0, 41.0824422918943654, 0, -191.718064028840372, 0, 153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.279530613895769685, 0, 0, -1.9567142972703878, 0, -13.4174694669969449, 0, 0, 0, 0, -6.14967350570693308, 0, 107.339755735975559, 0, 62.6148575126524095, 0, 0, 0, 0, 0, 0, -3.9134285945407756, 0, 187.844572537957229, 0, -563.533717613871686, 0, -50.0918860101219276, 0, 0, 0, 0, 0, 0, 0, 0, 1.39765306947884843, 0, 0, 0, -313.074287563262048, 0, 500.918860101219276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.39765306947884843, 0, -67.0873473349847245, 0, 313.074287563262048, 0, -250.459430050609638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.9567142972703878, 0, 0, 0, 0, 5.87014289181116339, 0, 27.3940001617854292, 0, 0, 0, 0, 0, 0, 27.3940001617854292, 0, -109.576000647141717, 0, -65.74560038828503, 0, 0, 0, 0, 0, 0, 0, 0, 27.3940001617854292, 0, -273.940001617854292, 0, 328.72800194142515, 0, 31.3074287563262048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.87014289181116339, 0, -109.576000647141717, 0, 328.72800194142515, 0, -187.844572537957229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.9567142972703878, 0, 27.3940001617854292, 0, -65.74560038828503, 0, 31.3074287563262048, 0, 0, 0, 0, + + 0, 0, 2.86433643816841393, 0, 0, 0, 0, -8.5930093145052418, 0, -40.1007101343577951, 0, 0, 0, 0, 0, 0, -40.1007101343577951, 0, 160.40284053743118, 0, 96.2417043224587082, 0, 0, 0, 0, 0, 0, 0, 0, -40.1007101343577951, 0, 401.007101343577951, 0, -481.208521612293541, 0, -45.8293830106946229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.5930093145052418, 0, 160.40284053743118, 0, -481.208521612293541, 0, 274.976298064167738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.86433643816841393, 0, -40.1007101343577951, 0, 96.2417043224587082, 0, -45.8293830106946229, 0, 0, 0, 0, + 0.190955762544560929, 0, 0, 0.190955762544560929, 0, -10.693522702495412, 0, 0, 0, 0, -1.14573457526736557, 0, 0, 0, 64.1611362149724721, 0, 0, 0, 0, 0, 0, -2.673380675623853, 0, 64.1611362149724721, 0, -64.1611362149724721, 0, -85.5481816199632961, 0, 0, 0, 0, 0, 0, 0, 0, -2.10051338799017022, 0, 85.5481816199632961, 0, -320.805681074862361, 0, 171.096363239926592, 0, 24.4423376057037989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.572867287633682787, 0, 32.0805681074862361, 0, -192.483408644917416, 0, 256.644544859889888, 0, -73.3270128171113967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.25261072955380536, 0, 0, -0.25261072955380536, 0, 14.1462008550131001, 0, 0, 0, 0, 1.51566437732283216, 0, 0, 0, -84.8772051300786008, 0, 0, 0, 0, 0, 0, 3.53655021375327503, 0, -84.8772051300786008, 0, 84.8772051300786008, 0, 113.169606840104801, 0, 0, 0, 0, 0, 0, 0, 0, 2.77871802509185895, 0, -113.169606840104801, 0, 424.386025650393004, 0, -226.339213680209602, 0, -32.334173382887086, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.757832188661416079, 0, -42.4386025650393004, 0, 254.631615390235802, 0, -339.508820520314403, 0, 97.0025201486612581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.27349656598424824, 0, 0, 0, 0, 6.82048969795274471, 0, -36.3759450557479718, 0, 0, 0, 0, 0, 0, 4.54699313196849647, 0, -72.7518901114959435, 0, 109.127835167243915, 0, 0, 0, 0, 0, 0, 0, 0, -4.54699313196849647, 0, 0, 0, 109.127835167243915, 0, -83.1450172702810783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.82048969795274471, 0, 72.7518901114959435, 0, -109.127835167243915, 0, 0, 0, 13.8575028783801797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.27349656598424824, 0, 36.3759450557479718, 0, -109.127835167243915, 0, 83.1450172702810783, 0, -13.8575028783801797, 0, 0, + + 0, 0, -2.73240281441583531, 0, 0, 0, 0, -8.19720844324750592, 0, 43.7184450306533649, 0, 0, 0, 0, 0, 0, -5.46480562883167061, 0, 87.4368900613067298, 0, -131.155335091960095, 0, 0, 0, 0, 0, 0, 0, 0, 5.46480562883167061, 0, 0, 0, -131.155335091960095, 0, 99.9278743557791198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.19720844324750592, 0, -87.4368900613067298, 0, 131.155335091960095, 0, 0, 0, -16.6546457259631866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.73240281441583531, 0, -43.7184450306533649, 0, 131.155335091960095, 0, -99.9278743557791198, 0, 16.6546457259631866, 0, 0, + -0.210184831878141177, 0, 0, -1.05092415939070589, 0, 12.6110899126884706, 0, 0, 0, 0, -2.10184831878141177, 0, 50.4443596507538826, 0, -84.073932751256471, 0, 0, 0, 0, 0, 0, -2.10184831878141177, 0, 75.6665394761308239, 0, -252.221798253769413, 0, 134.518292402010354, 0, 0, 0, 0, 0, 0, 0, 0, -1.05092415939070589, 0, 50.4443596507538826, 0, -252.221798253769413, 0, 269.036584804020707, 0, -57.650696743718723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.210184831878141177, 0, 12.6110899126884706, 0, -84.073932751256471, 0, 134.518292402010354, 0, -57.650696743718723, 0, 5.12450637721944204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.230245947330177705, 0, 0, 1.15122973665088853, 0, -13.8147568398106623, 0, 0, 0, 0, 2.30245947330177705, 0, -55.2590273592426493, 0, 92.0983789320710822, 0, 0, 0, 0, 0, 0, 2.30245947330177705, 0, -82.888541038863974, 0, 276.295136796213247, 0, -147.357406291313732, 0, 0, 0, 0, 0, 0, 0, 0, 1.15122973665088853, 0, -55.2590273592426493, 0, 276.295136796213247, 0, -294.714812582627463, 0, 63.1531741248487421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.230245947330177705, 0, -13.8147568398106623, 0, 92.0983789320710822, 0, -147.357406291313732, 0, 63.1531741248487421, 0, -5.61361547776433263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.53270542063195476, 0, 0, 0, 0, -12.6635271031597738, 0, 42.2117570105325793, 0, 0, 0, 0, 0, 0, -25.3270542063195476, 0, 168.847028042130317, 0, -135.077622433704254, 0, 0, 0, 0, 0, 0, 0, 0, -25.3270542063195476, 0, 253.270542063195476, 0, -405.232867301112762, 0, 115.78081922888936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -12.6635271031597738, 0, 168.847028042130317, 0, -405.232867301112762, 0, 231.561638457778721, 0, -25.7290709397531912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.53270542063195476, 0, 42.2117570105325793, 0, -135.077622433704254, 0, 115.78081922888936, 0, -25.7290709397531912, 0, 0.935602579627388772, + + 0, 0, 2.53270542063195476, 0, 0, 0, 0, 12.6635271031597738, 0, -42.2117570105325793, 0, 0, 0, 0, 0, 0, 25.3270542063195476, 0, -168.847028042130317, 0, 135.077622433704254, 0, 0, 0, 0, 0, 0, 0, 0, 25.3270542063195476, 0, -253.270542063195476, 0, 405.232867301112762, 0, -115.78081922888936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12.6635271031597738, 0, -168.847028042130317, 0, 405.232867301112762, 0, -231.561638457778721, 0, 25.7290709397531912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.53270542063195476, 0, -42.2117570105325793, 0, 135.077622433704254, 0, -115.78081922888936, 0, 25.7290709397531912, 0, -0.935602579627388772, + 0.230245947330177705, 0, 0, 1.15122973665088853, 0, -13.8147568398106623, 0, 0, 0, 0, 2.30245947330177705, 0, -55.2590273592426493, 0, 92.0983789320710822, 0, 0, 0, 0, 0, 0, 2.30245947330177705, 0, -82.888541038863974, 0, 276.295136796213247, 0, -147.357406291313732, 0, 0, 0, 0, 0, 0, 0, 0, 1.15122973665088853, 0, -55.2590273592426493, 0, 276.295136796213247, 0, -294.714812582627463, 0, 63.1531741248487421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.230245947330177705, 0, -13.8147568398106623, 0, 92.0983789320710822, 0, -147.357406291313732, 0, 63.1531741248487421, 0, -5.61361547776433263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.210184831878141177, 0, 0, -1.05092415939070589, 0, 12.6110899126884706, 0, 0, 0, 0, -2.10184831878141177, 0, 50.4443596507538826, 0, -84.073932751256471, 0, 0, 0, 0, 0, 0, -2.10184831878141177, 0, 75.6665394761308239, 0, -252.221798253769413, 0, 134.518292402010354, 0, 0, 0, 0, 0, 0, 0, 0, -1.05092415939070589, 0, 50.4443596507538826, 0, -252.221798253769413, 0, 269.036584804020707, 0, -57.650696743718723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.210184831878141177, 0, 12.6110899126884706, 0, -84.073932751256471, 0, 134.518292402010354, 0, -57.650696743718723, 0, 5.12450637721944204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.73240281441583531, 0, 0, 0, 0, 8.19720844324750592, 0, -43.7184450306533649, 0, 0, 0, 0, 0, 0, 5.46480562883167061, 0, -87.4368900613067298, 0, 131.155335091960095, 0, 0, 0, 0, 0, 0, 0, 0, -5.46480562883167061, 0, 0, 0, 131.155335091960095, 0, -99.9278743557791198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.19720844324750592, 0, 87.4368900613067298, 0, -131.155335091960095, 0, 0, 0, 16.6546457259631866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.73240281441583531, 0, 43.7184450306533649, 0, -131.155335091960095, 0, 99.9278743557791198, 0, -16.6546457259631866, 0, 0, + + 0, 0, -2.27349656598424824, 0, 0, 0, 0, -6.82048969795274471, 0, 36.3759450557479718, 0, 0, 0, 0, 0, 0, -4.54699313196849647, 0, 72.7518901114959435, 0, -109.127835167243915, 0, 0, 0, 0, 0, 0, 0, 0, 4.54699313196849647, 0, 0, 0, -109.127835167243915, 0, 83.1450172702810783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.82048969795274471, 0, -72.7518901114959435, 0, 109.127835167243915, 0, 0, 0, -13.8575028783801797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.27349656598424824, 0, -36.3759450557479718, 0, 109.127835167243915, 0, -83.1450172702810783, 0, 13.8575028783801797, 0, 0, + -0.25261072955380536, 0, 0, -0.25261072955380536, 0, 14.1462008550131001, 0, 0, 0, 0, 1.51566437732283216, 0, 0, 0, -84.8772051300786008, 0, 0, 0, 0, 0, 0, 3.53655021375327503, 0, -84.8772051300786008, 0, 84.8772051300786008, 0, 113.169606840104801, 0, 0, 0, 0, 0, 0, 0, 0, 2.77871802509185895, 0, -113.169606840104801, 0, 424.386025650393004, 0, -226.339213680209602, 0, -32.334173382887086, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.757832188661416079, 0, -42.4386025650393004, 0, 254.631615390235802, 0, -339.508820520314403, 0, 97.0025201486612581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.190955762544560929, 0, 0, 0.190955762544560929, 0, -10.693522702495412, 0, 0, 0, 0, -1.14573457526736557, 0, 0, 0, 64.1611362149724721, 0, 0, 0, 0, 0, 0, -2.673380675623853, 0, 64.1611362149724721, 0, -64.1611362149724721, 0, -85.5481816199632961, 0, 0, 0, 0, 0, 0, 0, 0, -2.10051338799017022, 0, 85.5481816199632961, 0, -320.805681074862361, 0, 171.096363239926592, 0, 24.4423376057037989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.572867287633682787, 0, 32.0805681074862361, 0, -192.483408644917416, 0, 256.644544859889888, 0, -73.3270128171113967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.86433643816841393, 0, 0, 0, 0, 8.5930093145052418, 0, 40.1007101343577951, 0, 0, 0, 0, 0, 0, 40.1007101343577951, 0, -160.40284053743118, 0, -96.2417043224587082, 0, 0, 0, 0, 0, 0, 0, 0, 40.1007101343577951, 0, -401.007101343577951, 0, 481.208521612293541, 0, 45.8293830106946229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.5930093145052418, 0, -160.40284053743118, 0, 481.208521612293541, 0, -274.976298064167738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.86433643816841393, 0, 40.1007101343577951, 0, -96.2417043224587082, 0, 45.8293830106946229, 0, 0, 0, 0, + + 0, 0, 1.9567142972703878, 0, 0, 0, 0, -5.87014289181116339, 0, -27.3940001617854292, 0, 0, 0, 0, 0, 0, -27.3940001617854292, 0, 109.576000647141717, 0, 65.74560038828503, 0, 0, 0, 0, 0, 0, 0, 0, -27.3940001617854292, 0, 273.940001617854292, 0, -328.72800194142515, 0, -31.3074287563262048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.87014289181116339, 0, 109.576000647141717, 0, -328.72800194142515, 0, 187.844572537957229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.9567142972703878, 0, -27.3940001617854292, 0, 65.74560038828503, 0, -31.3074287563262048, 0, 0, 0, 0, + 0.279530613895769685, 0, 0, -1.9567142972703878, 0, -13.4174694669969449, 0, 0, 0, 0, -6.14967350570693308, 0, 107.339755735975559, 0, 62.6148575126524095, 0, 0, 0, 0, 0, 0, -3.9134285945407756, 0, 187.844572537957229, 0, -563.533717613871686, 0, -50.0918860101219276, 0, 0, 0, 0, 0, 0, 0, 0, 1.39765306947884843, 0, 0, 0, -313.074287563262048, 0, 500.918860101219276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.39765306947884843, 0, -67.0873473349847245, 0, 313.074287563262048, 0, -250.459430050609638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.171176842882893189, 0, 0, 1.19823790018025232, 0, 8.21648845837887307, 0, 0, 0, 0, 3.76589054342365016, 0, -65.7319076670309846, 0, -38.3436128057680743, 0, 0, 0, 0, 0, 0, 2.39647580036050465, 0, -115.030838417304223, 0, 345.092515251912669, 0, 30.6748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, -0.855884214414465945, 0, 0, 0, 191.718064028840372, 0, -306.748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.855884214414465945, 0, 41.0824422918943654, 0, -191.718064028840372, 0, 153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.91000632900918421, 0, 0, 0, 0, -37.8300822771193948, 0, -31.0400675094312983, 0, 0, 0, 0, 0, 0, -40.740088606128579, 0, 434.560945132038176, 0, 43.4560945132038176, 0, 0, 0, 0, 0, 0, 0, 0, 40.740088606128579, 0, 0, 0, -651.841417698057264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37.8300822771193948, 0, -434.560945132038176, 0, 651.841417698057264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.91000632900918421, 0, 31.0400675094312983, 0, -43.4560945132038176, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.57817251301787333, 0, 0, 0, 0, 20.5162426692323532, 0, 16.8338401388573155, 0, 0, 0, 0, 0, 0, 22.0944151822502266, 0, -235.673761944002417, 0, -23.5673761944002417, 0, 0, 0, 0, 0, 0, 0, 0, -22.0944151822502266, 0, 0, 0, 353.510642916003625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -20.5162426692323532, 0, 235.673761944002417, 0, -353.510642916003625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.57817251301787333, 0, -16.8338401388573155, 0, 23.5673761944002417, 0, 0, 0, 0, 0, 0, + -0.315634502603574665, 0, 0, 5.99705554946791864, 0, 11.3628420937286879, 0, 0, 0, 0, 1.89380701562144799, 0, -227.256841874573759, 0, -30.3009122499431679, 0, 0, 0, 0, 0, 0, -13.2566491093501359, 0, 159.079789312201631, 0, 636.319157248806525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.62832455467506797, 0, 318.159578624403263, 0, -1060.53192874801088, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.20944151822502266, 0, -79.5398946561008156, 0, 212.106385749602175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.148791531444953757, 0, 0, -2.82703909745412139, 0, -5.35649513201833526, 0, 0, 0, 0, -0.892749188669722543, 0, 107.129902640366705, 0, 14.2839870187155607, 0, 0, 0, 0, 0, 0, 6.2492443206880578, 0, -74.9909318482566936, 0, -299.963727393026774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.1246221603440289, 0, -149.981863696513387, 0, 499.939545655044624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.0415407201146763, 0, 37.4954659241283468, 0, -99.9879091310089248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.82703909745412139, 0, 0, 0, 0, 76.3300556312612774, 0, 16.9622345847247283, 0, 0, 0, 0, 0, 0, -118.735642093073098, 0, -474.942568372292393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -118.735642093073098, 0, 1187.35642093073098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76.3300556312612774, 0, -474.942568372292393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.82703909745412139, 0, 16.9622345847247283, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.12335142777978244, 0, 0, 0, 0, -30.330488550054126, 0, -6.74010856667869467, 0, 0, 0, 0, 0, 0, 47.1807599667508627, 0, 188.723039867003451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47.1807599667508627, 0, -471.807599667508627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -30.330488550054126, 0, 188.723039867003451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.12335142777978244, 0, -6.74010856667869467, 0, 0, 0, 0, 0, 0, 0, 0, + 0.374450475926594148, 0, 0, -13.1057666574307952, 0, -7.48900951853188297, 0, 0, 0, 0, 33.7005428333934733, 0, 269.604342667147787, 0, 0, 0, 0, 0, 0, 0, 0, 15.7269199889169542, 0, -943.615199335017254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -28.0837856944945611, 0, 629.076799556678169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.37005428333934733, 0, -67.4010856667869467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.11841163748620862, 0, 0, 4.14440731201730169, 0, 2.36823274972417239, 0, 0, 0, 0, -10.6570473737587758, 0, -85.2563789900702061, 0, 0, 0, 0, 0, 0, 0, 0, -4.97328877442076202, 0, 298.397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.88087281146564647, 0, -198.931550976830481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.06570473737587758, 0, 21.3140947475175515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.48664438721038101, 0, 0, 0, 0, -111.898997424467146, 0, 0, 0, 0, 0, 0, 0, 0, 522.195321314180012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -522.195321314180012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111.898997424467146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.48664438721038101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -0.542630291944221461, 0, 0, 0, 0, 24.4183631374899657, 0, 0, 0, 0, 0, 0, 0, 0, -113.952361308286507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113.952361308286507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -24.4183631374899657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.542630291944221461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.542630291944221461, 0, 0, 29.8446660569321803, 0, 0, 0, 0, 0, 0, -179.067996341593082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250.695194878230315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -89.533998170796541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.96893321138643607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.554825753806619302, 0, 0, -30.5154164593640616, 0, 0, 0, 0, 0, 0, 183.09249875618437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -256.329498258658117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91.5462493780921848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.10308329187281232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.115689166958762041, 0, 0, -6.36290418273191227, 0, 0, 0, 0, 0, 0, 38.1774250963914736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -53.4483951349480631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19.0887125481957368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.27258083654638245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.54516167309276491, 0, 0, 0, 0, -114.532275289174421, 0, 0, 0, 0, 0, 0, 0, 0, 534.483951349480631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -534.483951349480631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114.532275289174421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.54516167309276491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.767395118221990013, 0, 0, 0, 0, -34.5327803199895506, 0, 0, 0, 0, 0, 0, 0, 0, 161.152974826617903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -161.152974826617903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34.5327803199895506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.767395118221990013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.383697559110995006, 0, 0, 13.4294145688848252, 0, 7.67395118221990013, 0, 0, 0, 0, -34.5327803199895506, 0, -276.262242559916405, 0, 0, 0, 0, 0, 0, 0, 0, -16.1152974826617903, 0, 966.917848959707416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28.7773169333246255, 0, -644.611899306471611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.45327803199895506, 0, 69.0655606399791011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.145024045724314041, 0, 0, 5.07584160035099142, 0, 2.90048091448628081, 0, 0, 0, 0, -13.0521641151882637, 0, -104.417312921506109, 0, 0, 0, 0, 0, 0, 0, 0, -6.09100992042118971, 0, 365.460595225271382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.876803429323553, 0, -243.640396816847588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.30521641151882637, 0, 26.1043282303765273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.90048091448628081, 0, 0, 0, 0, 78.3129846911295819, 0, 17.4028854869176849, 0, 0, 0, 0, 0, 0, -121.820198408423794, 0, -487.280793633695176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -121.820198408423794, 0, 1218.20198408423794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78.3129846911295819, 0, -487.280793633695176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.90048091448628081, 0, 17.4028854869176849, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.29713449844641568, 0, 0, 0, 0, 35.0226314580532234, 0, 7.78280699067849409, 0, 0, 0, 0, 0, 0, -54.4796489347494586, 0, -217.918595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54.4796489347494586, 0, 544.796489347494586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35.0226314580532234, 0, -217.918595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.29713449844641568, 0, 7.78280699067849409, 0, 0, 0, 0, 0, 0, 0, 0, + 0.32428362461160392, 0, 0, -6.16138886762047449, 0, -11.6742104860177411, 0, 0, 0, 0, -1.94570174766962352, 0, 233.484209720354823, 0, 31.1312279627139763, 0, 0, 0, 0, 0, 0, 13.6199122336873647, 0, -163.438946804248376, 0, -653.755787216993503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.80995611684368233, 0, -326.877893608496752, 0, 1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.26998537228122744, 0, 81.7194734021241879, 0, -217.918595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.166353989393607054, 0, 0, -3.16072579847853403, 0, -5.98874361816985396, 0, 0, 0, 0, -0.998123936361642327, 0, 119.774872363397079, 0, 15.9699829817862772, 0, 0, 0, 0, 0, 0, 6.98686755453149629, 0, -83.8424106543779555, 0, -335.369642617511822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.49343377726574814, 0, -167.684821308755911, 0, 558.949404362519703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.16447792575524938, 0, 41.9212053271889777, 0, -111.789880872503941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.99437180908492698, 0, 0, 0, 0, -38.9268335181040507, 0, -31.9399659635725545, 0, 0, 0, 0, 0, 0, -41.9212053271889777, 0, 447.159523490015762, 0, 44.7159523490015762, 0, 0, 0, 0, 0, 0, 0, 0, 41.9212053271889777, 0, 0, 0, -670.739285235023644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38.9268335181040507, 0, -447.159523490015762, 0, 670.739285235023644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.99437180908492698, 0, 31.9399659635725545, 0, -44.7159523490015762, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.72880137002900928, 0, 0, 0, 0, -22.4744178103771206, 0, -18.440547946976099, 0, 0, 0, 0, 0, 0, -24.2032191804061299, 0, 258.167671257665386, 0, 25.8167671257665386, 0, 0, 0, 0, 0, 0, 0, 0, 24.2032191804061299, 0, 0, 0, -387.251506886498079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.4744178103771206, 0, -258.167671257665386, 0, 387.251506886498079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.72880137002900928, 0, 18.440547946976099, 0, -25.8167671257665386, 0, 0, 0, 0, 0, 0, + -0.288133561671501547, 0, 0, 2.01693493170051083, 0, 13.8304109602320742, 0, 0, 0, 0, 6.33893835677303403, 0, -110.643287681856594, 0, -64.5419178144163464, 0, 0, 0, 0, 0, 0, 4.03386986340102165, 0, -193.625753443249039, 0, 580.877260329747118, 0, 51.6335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, -1.44066780835750773, 0, 0, 0, 322.709589072081732, 0, -516.335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.44066780835750773, 0, 69.1520548011603712, 0, -322.709589072081732, 0, 258.167671257665386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.184892122049355627, 0, 0, 1.29424485434548939, 0, 8.87482185836907012, 0, 0, 0, 0, 4.0676266850858238, 0, -70.998574866952561, 0, -41.4158353390556606, 0, 0, 0, 0, 0, 0, 2.58848970869097878, 0, -124.247506017166982, 0, 372.742518051500945, 0, 33.1326682712445284, 0, 0, 0, 0, 0, 0, 0, 0, -0.924460610246778137, 0, 0, 0, 207.079176695278303, 0, -331.326682712445284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.924460610246778137, 0, 44.3741092918453506, 0, -207.079176695278303, 0, 165.663341356222642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.95827395278969004, 0, 0, 0, 0, 8.87482185836907012, 0, 41.4158353390556606, 0, 0, 0, 0, 0, 0, 41.4158353390556606, 0, -165.663341356222642, 0, -99.3980048137335853, 0, 0, 0, 0, 0, 0, 0, 0, 41.4158353390556606, 0, -414.158353390556606, 0, 496.990024068667927, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.87482185836907012, 0, -165.663341356222642, 0, 496.990024068667927, 0, -283.994299467810244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.95827395278969004, 0, 41.4158353390556606, 0, -99.3980048137335853, 0, 47.3323832446350406, 0, 0, 0, 0, + + 0, 0, -2.09181557262512238, 0, 0, 0, 0, 6.27544671787536713, 0, 29.2854180167517133, 0, 0, 0, 0, 0, 0, 29.2854180167517133, 0, -117.141672067006853, 0, -70.2850032402041119, 0, 0, 0, 0, 0, 0, 0, 0, 29.2854180167517133, 0, -292.854180167517133, 0, 351.425016201020559, 0, 33.469049162001958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.27544671787536713, 0, -117.141672067006853, 0, 351.425016201020559, 0, -200.814294972011748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.09181557262512238, 0, 29.2854180167517133, 0, -70.2850032402041119, 0, 33.469049162001958, 0, 0, 0, 0, + 0.261476946578140297, 0, 0, 0.261476946578140297, 0, -14.6427090083758566, 0, 0, 0, 0, -1.56886167946884178, 0, 0, 0, 87.8562540502551398, 0, 0, 0, 0, 0, 0, -3.66067725209396416, 0, 87.8562540502551398, 0, -87.8562540502551398, 0, -117.141672067006853, 0, 0, 0, 0, 0, 0, 0, 0, -2.87624641235954327, 0, 117.141672067006853, 0, -439.281270251275699, 0, 234.283344134013706, 0, 33.469049162001958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.784430839734420891, 0, 43.9281270251275699, 0, -263.568762150765419, 0, 351.425016201020559, 0, -100.407147486005874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.202539171902860758, 0, 0, 0.202539171902860758, 0, -11.3421936265602025, 0, 0, 0, 0, -1.21523503141716455, 0, 0, 0, 68.0531617593612148, 0, 0, 0, 0, 0, 0, -2.83554840664005062, 0, 68.0531617593612148, 0, -68.0531617593612148, 0, -90.7375490124816198, 0, 0, 0, 0, 0, 0, 0, 0, -2.22793089093146834, 0, 90.7375490124816198, 0, -340.265808796806074, 0, 181.47509802496324, 0, 25.9250140035661771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.607617515708582275, 0, 34.0265808796806074, 0, -204.159485278083644, 0, 272.212647037444859, 0, -77.7750420106985312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.83554840664005062, 0, 0, 0, 0, 8.50664521992015185, 0, -45.3687745062408099, 0, 0, 0, 0, 0, 0, 5.67109681328010124, 0, -90.7375490124816198, 0, 136.10632351872243, 0, 0, 0, 0, 0, 0, 0, 0, -5.67109681328010124, 0, 0, 0, 136.10632351872243, 0, -103.700056014264708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.50664521992015185, 0, 90.7375490124816198, 0, -136.10632351872243, 0, 0, 0, 17.2833426690441181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.83554840664005062, 0, 45.3687745062408099, 0, -136.10632351872243, 0, 103.700056014264708, 0, -17.2833426690441181, 0, 0, + + 0, 0, 2.39647580036050465, 0, 0, 0, 0, 7.18942740108151394, 0, -38.3436128057680743, 0, 0, 0, 0, 0, 0, 4.79295160072100929, 0, -76.6872256115361487, 0, 115.030838417304223, 0, 0, 0, 0, 0, 0, 0, 0, -4.79295160072100929, 0, 0, 0, 115.030838417304223, 0, -87.6425435560413128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.18942740108151394, 0, 76.6872256115361487, 0, -115.030838417304223, 0, 0, 0, 14.6070905926735521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.39647580036050465, 0, 38.3436128057680743, 0, -115.030838417304223, 0, 87.6425435560413128, 0, -14.6070905926735521, 0, 0, + -0.239647580036050465, 0, 0, -1.19823790018025232, 0, 14.3788548021630279, 0, 0, 0, 0, -2.39647580036050465, 0, 57.5154192086521115, 0, -95.8590320144201859, 0, 0, 0, 0, 0, 0, -2.39647580036050465, 0, 86.2731288129781673, 0, -287.577096043260558, 0, 153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, -1.19823790018025232, 0, 57.5154192086521115, 0, -287.577096043260558, 0, 306.748902446144595, 0, -65.7319076670309846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.239647580036050465, 0, 14.3788548021630279, 0, -95.8590320144201859, 0, 153.374451223072297, 0, -65.7319076670309846, 0, 5.84283623706942085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.220443711424950199, 0, 0, -1.10221855712475099, 0, 13.2266226854970119, 0, 0, 0, 0, -2.20443711424950199, 0, 52.9064907419880478, 0, -88.1774845699800796, 0, 0, 0, 0, 0, 0, -2.20443711424950199, 0, 79.3597361129820716, 0, -264.532453709940239, 0, 141.083975311968127, 0, 0, 0, 0, 0, 0, 0, 0, -1.10221855712475099, 0, 52.9064907419880478, 0, -264.532453709940239, 0, 282.167950623936255, 0, -60.4645608479863403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.220443711424950199, 0, 13.2266226854970119, 0, -88.1774845699800796, 0, 141.083975311968127, 0, -60.4645608479863403, 0, 5.37462763093211914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.64532453709940239, 0, 0, 0, 0, -13.2266226854970119, 0, 44.0887422849900398, 0, 0, 0, 0, 0, 0, -26.4532453709940239, 0, 176.354969139960159, 0, -141.083975311968127, 0, 0, 0, 0, 0, 0, 0, 0, -26.4532453709940239, 0, 264.532453709940239, 0, -423.251925935904382, 0, 120.929121695972681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.2266226854970119, 0, 176.354969139960159, 0, -423.251925935904382, 0, 241.858243391945361, 0, -26.8731381546605957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.64532453709940239, 0, 44.0887422849900398, 0, -141.083975311968127, 0, 120.929121695972681, 0, -26.8731381546605957, 0, 0.977205023805839843, + + 0, 0, -2.64532453709940239, 0, 0, 0, 0, -13.2266226854970119, 0, 44.0887422849900398, 0, 0, 0, 0, 0, 0, -26.4532453709940239, 0, 176.354969139960159, 0, -141.083975311968127, 0, 0, 0, 0, 0, 0, 0, 0, -26.4532453709940239, 0, 264.532453709940239, 0, -423.251925935904382, 0, 120.929121695972681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.2266226854970119, 0, 176.354969139960159, 0, -423.251925935904382, 0, 241.858243391945361, 0, -26.8731381546605957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.64532453709940239, 0, 44.0887422849900398, 0, -141.083975311968127, 0, 120.929121695972681, 0, -26.8731381546605957, 0, 0.977205023805839843, + 0.220443711424950199, 0, 0, 1.10221855712475099, 0, -13.2266226854970119, 0, 0, 0, 0, 2.20443711424950199, 0, -52.9064907419880478, 0, 88.1774845699800796, 0, 0, 0, 0, 0, 0, 2.20443711424950199, 0, -79.3597361129820716, 0, 264.532453709940239, 0, -141.083975311968127, 0, 0, 0, 0, 0, 0, 0, 0, 1.10221855712475099, 0, -52.9064907419880478, 0, 264.532453709940239, 0, -282.167950623936255, 0, 60.4645608479863403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.220443711424950199, 0, -13.2266226854970119, 0, 88.1774845699800796, 0, -141.083975311968127, 0, 60.4645608479863403, 0, -5.37462763093211914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.239647580036050465, 0, 0, 1.19823790018025232, 0, -14.3788548021630279, 0, 0, 0, 0, 2.39647580036050465, 0, -57.5154192086521115, 0, 95.8590320144201859, 0, 0, 0, 0, 0, 0, 2.39647580036050465, 0, -86.2731288129781673, 0, 287.577096043260558, 0, -153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 1.19823790018025232, 0, -57.5154192086521115, 0, 287.577096043260558, 0, -306.748902446144595, 0, 65.7319076670309846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.239647580036050465, 0, -14.3788548021630279, 0, 95.8590320144201859, 0, -153.374451223072297, 0, 65.7319076670309846, 0, -5.84283623706942085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.39647580036050465, 0, 0, 0, 0, 7.18942740108151394, 0, -38.3436128057680743, 0, 0, 0, 0, 0, 0, 4.79295160072100929, 0, -76.6872256115361487, 0, 115.030838417304223, 0, 0, 0, 0, 0, 0, 0, 0, -4.79295160072100929, 0, 0, 0, 115.030838417304223, 0, -87.6425435560413128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.18942740108151394, 0, 76.6872256115361487, 0, -115.030838417304223, 0, 0, 0, 14.6070905926735521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.39647580036050465, 0, 38.3436128057680743, 0, -115.030838417304223, 0, 87.6425435560413128, 0, -14.6070905926735521, 0, 0, + + 0, 0, 2.83554840664005062, 0, 0, 0, 0, 8.50664521992015185, 0, -45.3687745062408099, 0, 0, 0, 0, 0, 0, 5.67109681328010124, 0, -90.7375490124816198, 0, 136.10632351872243, 0, 0, 0, 0, 0, 0, 0, 0, -5.67109681328010124, 0, 0, 0, 136.10632351872243, 0, -103.700056014264708, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.50664521992015185, 0, 90.7375490124816198, 0, -136.10632351872243, 0, 0, 0, 17.2833426690441181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.83554840664005062, 0, 45.3687745062408099, 0, -136.10632351872243, 0, 103.700056014264708, 0, -17.2833426690441181, 0, 0, + -0.202539171902860758, 0, 0, -0.202539171902860758, 0, 11.3421936265602025, 0, 0, 0, 0, 1.21523503141716455, 0, 0, 0, -68.0531617593612148, 0, 0, 0, 0, 0, 0, 2.83554840664005062, 0, -68.0531617593612148, 0, 68.0531617593612148, 0, 90.7375490124816198, 0, 0, 0, 0, 0, 0, 0, 0, 2.22793089093146834, 0, -90.7375490124816198, 0, 340.265808796806074, 0, -181.47509802496324, 0, -25.9250140035661771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.607617515708582275, 0, -34.0265808796806074, 0, 204.159485278083644, 0, -272.212647037444859, 0, 77.7750420106985312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.261476946578140297, 0, 0, -0.261476946578140297, 0, 14.6427090083758566, 0, 0, 0, 0, 1.56886167946884178, 0, 0, 0, -87.8562540502551398, 0, 0, 0, 0, 0, 0, 3.66067725209396416, 0, -87.8562540502551398, 0, 87.8562540502551398, 0, 117.141672067006853, 0, 0, 0, 0, 0, 0, 0, 0, 2.87624641235954327, 0, -117.141672067006853, 0, 439.281270251275699, 0, -234.283344134013706, 0, -33.469049162001958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.784430839734420891, 0, -43.9281270251275699, 0, 263.568762150765419, 0, -351.425016201020559, 0, 100.407147486005874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.09181557262512238, 0, 0, 0, 0, 6.27544671787536713, 0, 29.2854180167517133, 0, 0, 0, 0, 0, 0, 29.2854180167517133, 0, -117.141672067006853, 0, -70.2850032402041119, 0, 0, 0, 0, 0, 0, 0, 0, 29.2854180167517133, 0, -292.854180167517133, 0, 351.425016201020559, 0, 33.469049162001958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.27544671787536713, 0, -117.141672067006853, 0, 351.425016201020559, 0, -200.814294972011748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.09181557262512238, 0, 29.2854180167517133, 0, -70.2850032402041119, 0, 33.469049162001958, 0, 0, 0, 0, + + 0, 0, -2.95827395278969004, 0, 0, 0, 0, 8.87482185836907012, 0, 41.4158353390556606, 0, 0, 0, 0, 0, 0, 41.4158353390556606, 0, -165.663341356222642, 0, -99.3980048137335853, 0, 0, 0, 0, 0, 0, 0, 0, 41.4158353390556606, 0, -414.158353390556606, 0, 496.990024068667927, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.87482185836907012, 0, -165.663341356222642, 0, 496.990024068667927, 0, -283.994299467810244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.95827395278969004, 0, 41.4158353390556606, 0, -99.3980048137335853, 0, 47.3323832446350406, 0, 0, 0, 0, + 0.184892122049355627, 0, 0, -1.29424485434548939, 0, -8.87482185836907012, 0, 0, 0, 0, -4.0676266850858238, 0, 70.998574866952561, 0, 41.4158353390556606, 0, 0, 0, 0, 0, 0, -2.58848970869097878, 0, 124.247506017166982, 0, -372.742518051500945, 0, -33.1326682712445284, 0, 0, 0, 0, 0, 0, 0, 0, 0.924460610246778137, 0, 0, 0, -207.079176695278303, 0, 331.326682712445284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.924460610246778137, 0, -44.3741092918453506, 0, 207.079176695278303, 0, -165.663341356222642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.288133561671501547, 0, 0, -2.01693493170051083, 0, -13.8304109602320742, 0, 0, 0, 0, -6.33893835677303403, 0, 110.643287681856594, 0, 64.5419178144163464, 0, 0, 0, 0, 0, 0, -4.03386986340102165, 0, 193.625753443249039, 0, -580.877260329747118, 0, -51.6335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 1.44066780835750773, 0, 0, 0, -322.709589072081732, 0, 516.335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.44066780835750773, 0, -69.1520548011603712, 0, 322.709589072081732, 0, -258.167671257665386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.72880137002900928, 0, 0, 0, 0, -22.4744178103771206, 0, -18.440547946976099, 0, 0, 0, 0, 0, 0, -24.2032191804061299, 0, 258.167671257665386, 0, 25.8167671257665386, 0, 0, 0, 0, 0, 0, 0, 0, 24.2032191804061299, 0, 0, 0, -387.251506886498079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.4744178103771206, 0, -258.167671257665386, 0, 387.251506886498079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.72880137002900928, 0, 18.440547946976099, 0, -25.8167671257665386, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.99437180908492698, 0, 0, 0, 0, -38.9268335181040507, 0, -31.9399659635725545, 0, 0, 0, 0, 0, 0, -41.9212053271889777, 0, 447.159523490015762, 0, 44.7159523490015762, 0, 0, 0, 0, 0, 0, 0, 0, 41.9212053271889777, 0, 0, 0, -670.739285235023644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38.9268335181040507, 0, -447.159523490015762, 0, 670.739285235023644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.99437180908492698, 0, 31.9399659635725545, 0, -44.7159523490015762, 0, 0, 0, 0, 0, 0, + -0.166353989393607054, 0, 0, 3.16072579847853403, 0, 5.98874361816985396, 0, 0, 0, 0, 0.998123936361642327, 0, -119.774872363397079, 0, -15.9699829817862772, 0, 0, 0, 0, 0, 0, -6.98686755453149629, 0, 83.8424106543779555, 0, 335.369642617511822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.49343377726574814, 0, 167.684821308755911, 0, -558.949404362519703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.16447792575524938, 0, -41.9212053271889777, 0, 111.789880872503941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.32428362461160392, 0, 0, 6.16138886762047449, 0, 11.6742104860177411, 0, 0, 0, 0, 1.94570174766962352, 0, -233.484209720354823, 0, -31.1312279627139763, 0, 0, 0, 0, 0, 0, -13.6199122336873647, 0, 163.438946804248376, 0, 653.755787216993503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.80995611684368233, 0, 326.877893608496752, 0, -1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.26998537228122744, 0, -81.7194734021241879, 0, 217.918595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.29713449844641568, 0, 0, 0, 0, 35.0226314580532234, 0, 7.78280699067849409, 0, 0, 0, 0, 0, 0, -54.4796489347494586, 0, -217.918595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54.4796489347494586, 0, 544.796489347494586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35.0226314580532234, 0, -217.918595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.29713449844641568, 0, 7.78280699067849409, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.90048091448628081, 0, 0, 0, 0, 78.3129846911295819, 0, 17.4028854869176849, 0, 0, 0, 0, 0, 0, -121.820198408423794, 0, -487.280793633695176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -121.820198408423794, 0, 1218.20198408423794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78.3129846911295819, 0, -487.280793633695176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.90048091448628081, 0, 17.4028854869176849, 0, 0, 0, 0, 0, 0, 0, 0, + 0.145024045724314041, 0, 0, -5.07584160035099142, 0, -2.90048091448628081, 0, 0, 0, 0, 13.0521641151882637, 0, 104.417312921506109, 0, 0, 0, 0, 0, 0, 0, 0, 6.09100992042118971, 0, -365.460595225271382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.876803429323553, 0, 243.640396816847588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.30521641151882637, 0, -26.1043282303765273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.383697559110995006, 0, 0, -13.4294145688848252, 0, -7.67395118221990013, 0, 0, 0, 0, 34.5327803199895506, 0, 276.262242559916405, 0, 0, 0, 0, 0, 0, 0, 0, 16.1152974826617903, 0, -966.917848959707416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -28.7773169333246255, 0, 644.611899306471611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.45327803199895506, 0, -69.0655606399791011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0.767395118221990013, 0, 0, 0, 0, -34.5327803199895506, 0, 0, 0, 0, 0, 0, 0, 0, 161.152974826617903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -161.152974826617903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34.5327803199895506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.767395118221990013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.54516167309276491, 0, 0, 0, 0, -114.532275289174421, 0, 0, 0, 0, 0, 0, 0, 0, 534.483951349480631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -534.483951349480631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114.532275289174421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.54516167309276491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.115689166958762041, 0, 0, 6.36290418273191227, 0, 0, 0, 0, 0, 0, -38.1774250963914736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53.4483951349480631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -19.0887125481957368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.27258083654638245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.554825753806619302, 0, 0, 30.5154164593640616, 0, 0, 0, 0, 0, 0, -183.09249875618437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256.329498258658117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -91.5462493780921848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.10308329187281232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.554825753806619302, 0, 0, 36.6184997512368739, 0, 0, 0, 0, 0, 0, -274.638748134276554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 512.658996517316235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -274.638748134276554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36.6184997512368739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.554825753806619302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0.554825753806619302, 0, 0, 0, 0, -30.5154164593640616, 0, 0, 0, 0, 0, 0, 0, 0, 183.09249875618437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -256.329498258658117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91.5462493780921848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.10308329187281232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.66085084005152695, 0, 0, 0, 0, 146.346796202833982, 0, 0, 0, 0, 0, 0, 0, 0, -878.080777217003893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1229.31308810380545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -439.040388608501947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29.2693592405667964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.115689166958762041, 0, 0, 5.09032334618552982, 0, 2.54516167309276491, 0, 0, 0, 0, -19.0887125481957368, 0, -114.532275289174421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534.483951349480631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19.0887125481957368, 0, -534.483951349480631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.09032334618552982, 0, 114.532275289174421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.115689166958762041, 0, -2.54516167309276491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.383697559110995006, 0, 0, -16.8826926008837803, 0, -8.44134630044189014, 0, 0, 0, 0, 63.310097253314176, 0, 379.860583519885056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1772.68272309279693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63.310097253314176, 0, 1772.68272309279693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16.8826926008837803, 0, -379.860583519885056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.383697559110995006, 0, 8.44134630044189014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1.15109267733298502, 0, 0, 0, 0, 40.2882437066544757, 0, 7.67395118221990013, 0, 0, 0, 0, 0, 0, -103.598340959968652, 0, -276.262242559916405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48.3458924479853708, 0, 966.917848959707416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86.3319507999738764, 0, -644.611899306471611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.3598340959968652, 0, 69.0655606399791011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 3.04550496021059485, 0, 0, 0, 0, -106.59267360737082, 0, -20.3033664014039657, 0, 0, 0, 0, 0, 0, 274.095446418953537, 0, 730.921190450542765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127.911208328844984, 0, -2558.22416657689968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -228.412872015794614, 0, 1705.48277771793312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27.4095446418953537, 0, -182.730297612635691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.145024045724314041, 0, 0, -3.77062518883216506, 0, -5.80096182897256162, 0, 0, 0, 0, 2.17536068586471061, 0, 156.625969382259164, 0, 17.4028854869176849, 0, 0, 0, 0, 0, 0, 12.1820198408423794, 0, -243.640396816847588, 0, -487.280793633695176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.17536068586471061, 0, -243.640396816847588, 0, 1218.20198408423794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.77062518883216506, 0, 156.625969382259164, 0, -487.280793633695176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145024045724314041, 0, -5.80096182897256162, 0, 17.4028854869176849, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.32428362461160392, 0, 0, 8.43137423990170193, 0, 12.9713449844641568, 0, 0, 0, 0, -4.8642543691740588, 0, -350.226314580532234, 0, -38.9140349533924704, 0, 0, 0, 0, 0, 0, -27.2398244673747293, 0, 544.796489347494586, 0, 1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.8642543691740588, 0, 544.796489347494586, 0, -2723.98244673747293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.43137423990170193, 0, -350.226314580532234, 0, 1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.32428362461160392, 0, 12.9713449844641568, 0, -38.9140349533924704, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.6214181230580196, 0, 0, 0, 0, -30.8069443381023724, 0, -19.4570174766962352, 0, 0, 0, 0, 0, 0, -9.72850873834811761, 0, 389.140349533924704, 0, 31.1312279627139763, 0, 0, 0, 0, 0, 0, 0, 0, 68.0995611684368233, 0, -272.398244673747293, 0, -653.755787216993503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34.0497805842184116, 0, -544.796489347494586, 0, 1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -11.3499268614061372, 0, 136.199122336873647, 0, -217.918595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -3.16072579847853403, 0, 0, 0, 0, 60.0537901710921467, 0, 37.9287095817424084, 0, 0, 0, 0, 0, 0, 18.9643547908712042, 0, -758.574191634848168, 0, -60.6859353307878535, 0, 0, 0, 0, 0, 0, 0, 0, -132.750483536098429, 0, 531.001934144393718, 0, 1274.40464194654492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66.3752417680492147, 0, 1062.00386828878744, 0, -2124.00773657757487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.1250805893497382, 0, -265.500967072196859, 0, 424.801547315514974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.166353989393607054, 0, 0, 1.99624787272328465, 0, 8.98311542725478094, 0, 0, 0, 0, 4.49155771362739047, 0, -116.780500554312152, 0, -47.9099489453588317, 0, 0, 0, 0, 0, 0, 0, 0, -125.763615981566933, 0, 670.739285235023644, 0, 44.7159523490015762, 0, 0, 0, 0, 0, 0, 0, 0, -4.49155771362739047, 0, 125.763615981566933, 0, 0, 0, -670.739285235023644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.99624787272328465, 0, 116.780500554312152, 0, -670.739285235023644, 0, 670.739285235023644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.166353989393607054, 0, -8.98311542725478094, 0, 47.9099489453588317, 0, -44.7159523490015762, 0, 0, 0, 0, 0, 0, + + 0.288133561671501547, 0, 0, -3.45760274005801856, 0, -15.5592123302610835, 0, 0, 0, 0, -7.77960616513054176, 0, 202.269760293394086, 0, 82.9824657613924454, 0, 0, 0, 0, 0, 0, 0, 0, 217.828972623655169, 0, -1161.75452065949424, 0, -77.4503013772996157, 0, 0, 0, 0, 0, 0, 0, 0, 7.77960616513054176, 0, -217.828972623655169, 0, 0, 0, 1161.75452065949424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.45760274005801856, 0, -202.269760293394086, 0, 1161.75452065949424, 0, -1161.75452065949424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.288133561671501547, 0, 15.5592123302610835, 0, -82.9824657613924454, 0, 77.4503013772996157, 0, 0, 0, 0, 0, 0, + 0, 0, -2.01693493170051083, 0, 0, 0, 0, 14.1185445219035758, 0, 32.2709589072081732, 0, 0, 0, 0, 0, 0, 44.3725684974112382, 0, -258.167671257665386, 0, -90.358684940182885, 0, 0, 0, 0, 0, 0, 0, 0, 28.2370890438071516, 0, -451.793424700914425, 0, 813.228164461645965, 0, 51.6335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.0846746585025541, 0, 0, 0, 451.793424700914425, 0, -516.335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.0846746585025541, 0, 161.354794536040866, 0, -451.793424700914425, 0, 258.167671257665386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 3.14316607483904567, 0, 0, 0, 0, -22.0021625238733197, 0, -50.2906571974247307, 0, 0, 0, 0, 0, 0, -69.1496536464590047, 0, 402.325257579397845, 0, 140.813840152789246, 0, 0, 0, 0, 0, 0, 0, 0, -44.0043250477466393, 0, 704.06920076394623, 0, -1267.32456137510321, 0, -80.4650515158795691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15.7158303741952283, 0, 0, 0, -704.06920076394623, 0, 804.650515158795691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15.7158303741952283, 0, -251.453285987123653, 0, 704.06920076394623, 0, -402.325257579397845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.184892122049355627, 0, 0, -0.369784244098711255, 0, -11.8330958111587602, 0, 0, 0, 0, -3.14316607483904567, 0, 35.4992874334762805, 0, 82.8316706781113211, 0, 0, 0, 0, 0, 0, -5.17697941738195757, 0, 165.663341356222642, 0, -331.326682712445284, 0, -132.530673084978114, 0, 0, 0, 0, 0, 0, 0, 0, -3.14316607483904567, 0, 165.663341356222642, 0, -828.316706781113211, 0, 662.653365424890569, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.369784244098711255, 0, 35.4992874334762805, 0, -331.326682712445284, 0, 662.653365424890569, 0, -283.994299467810244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.184892122049355627, 0, -11.8330958111587602, 0, 82.8316706781113211, 0, -132.530673084978114, 0, 47.3323832446350406, 0, 0, 0, 0, + + -0.261476946578140297, 0, 0, 0.522953893156280594, 0, 16.734524581000979, 0, 0, 0, 0, 4.44510809182838505, 0, -50.203573743002937, 0, -117.141672067006853, 0, 0, 0, 0, 0, 0, 7.32135450418792832, 0, -234.283344134013706, 0, 468.566688268027412, 0, 187.426675307210965, 0, 0, 0, 0, 0, 0, 0, 0, 4.44510809182838505, 0, -234.283344134013706, 0, 1171.41672067006853, 0, -937.133376536054825, 0, -66.938098324003916, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.522953893156280594, 0, -50.203573743002937, 0, 468.566688268027412, 0, -937.133376536054825, 0, 401.628589944023496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.261476946578140297, 0, 16.734524581000979, 0, -117.141672067006853, 0, 187.426675307210965, 0, -66.938098324003916, 0, 0, 0, 0, + 0, 0, 2.35329251920326267, 0, 0, 0, 0, 2.35329251920326267, 0, -43.9281270251275699, 0, 0, 0, 0, 0, 0, -14.119755115219576, 0, 0, 0, 158.141257290459252, 0, 0, 0, 0, 0, 0, 0, 0, -32.9460952688456774, 0, 263.568762150765419, 0, -158.141257290459252, 0, -150.610721229008811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -25.8862177112358894, 0, 351.425016201020559, 0, -790.706286452296258, 0, 301.221442458017622, 0, 33.469049162001958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.05987755760978802, 0, 131.78438107538271, 0, -474.423771871377755, 0, 451.832163687026433, 0, -100.407147486005874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -3.03808757854291138, 0, 0, 0, 0, -3.03808757854291138, 0, 56.7109681328010124, 0, 0, 0, 0, 0, 0, 18.2285254712574683, 0, 0, 0, -204.159485278083644, 0, 0, 0, 0, 0, 0, 0, 0, 42.5332260996007593, 0, -340.265808796806074, 0, 204.159485278083644, 0, 194.437605026746328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33.4189633639720251, 0, -453.687745062408099, 0, 1020.79742639041822, 0, -388.875210053492656, 0, -43.2083566726102951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.11426273562873413, 0, -170.132904398403037, 0, 612.478455834250933, 0, -583.312815080238984, 0, 129.625070017830885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.202539171902860758, 0, 0, -0.810156687611443034, 0, 14.1777420332002531, 0, 0, 0, 0, -1.01269585951430379, 0, 42.5332260996007593, 0, -113.421936265602025, 0, 0, 0, 0, 0, 0, 0, 0, 28.3554840664005062, 0, -226.843872531204049, 0, 226.843872531204049, 0, 0, 0, 0, 0, 0, 0, 0, 1.01269585951430379, 0, -28.3554840664005062, 0, 0, 0, 226.843872531204049, 0, -129.625070017830885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.810156687611443034, 0, -42.5332260996007593, 0, 226.843872531204049, 0, -226.843872531204049, 0, 0, 0, 17.2833426690441181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.202539171902860758, 0, -14.1777420332002531, 0, 113.421936265602025, 0, -226.843872531204049, 0, 129.625070017830885, 0, -17.2833426690441181, 0, 0, + + 0.239647580036050465, 0, 0, 0.958590320144201859, 0, -16.7753306025235325, 0, 0, 0, 0, 1.19823790018025232, 0, -50.3259918075705976, 0, 134.20264482018826, 0, 0, 0, 0, 0, 0, 0, 0, -33.5506612050470651, 0, 268.40528964037652, 0, -268.40528964037652, 0, 0, 0, 0, 0, 0, 0, 0, -1.19823790018025232, 0, 33.5506612050470651, 0, 0, 0, -268.40528964037652, 0, 153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.958590320144201859, 0, 50.3259918075705976, 0, -268.40528964037652, 0, 268.40528964037652, 0, 0, 0, -20.449926829742973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.239647580036050465, 0, 16.7753306025235325, 0, -134.20264482018826, 0, 268.40528964037652, 0, -153.374451223072297, 0, 20.449926829742973, 0, 0, + 0, 0, -2.63612338039655511, 0, 0, 0, 0, -13.1806169019827756, 0, 52.7224676079311022, 0, 0, 0, 0, 0, 0, -26.3612338039655511, 0, 210.889870431724409, 0, -210.889870431724409, 0, 0, 0, 0, 0, 0, 0, 0, -26.3612338039655511, 0, 316.334805647586613, 0, -632.669611295173227, 0, 241.01699477911361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.1806169019827756, 0, 210.889870431724409, 0, -632.669611295173227, 0, 482.03398955822722, 0, -80.3389982597045367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.63612338039655511, 0, 52.7224676079311022, 0, -210.889870431724409, 0, 241.01699477911361, 0, -80.3389982597045367, 0, 5.84283623706942085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.86576824852435259, 0, 0, 0, 0, 14.3288412426217629, 0, -57.3153649704870517, 0, 0, 0, 0, 0, 0, 28.6576824852435259, 0, -229.261459881948207, 0, 229.261459881948207, 0, 0, 0, 0, 0, 0, 0, 0, 28.6576824852435259, 0, -343.89218982292231, 0, 687.784379645844621, 0, -262.013097007940808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.3288412426217629, 0, -229.261459881948207, 0, 687.784379645844621, 0, -524.026194015881616, 0, 87.337699002646936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.86576824852435259, 0, -57.3153649704870517, 0, 229.261459881948207, 0, -262.013097007940808, 0, 87.337699002646936, 0, -6.35183265473795898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.220443711424950199, 0, 0, 1.32266226854970119, 0, -15.8719472225964143, 0, 0, 0, 0, 3.30665567137425298, 0, -79.3597361129820716, 0, 132.266226854970119, 0, 0, 0, 0, 0, 0, 4.40887422849900398, 0, -158.719472225964143, 0, 529.064907419880478, 0, -282.167950623936255, 0, 0, 0, 0, 0, 0, 0, 0, 3.30665567137425298, 0, -158.719472225964143, 0, 793.597361129820716, 0, -846.503851871808764, 0, 181.393682543959021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.32266226854970119, 0, -79.3597361129820716, 0, 529.064907419880478, 0, -846.503851871808764, 0, 362.787365087918042, 0, -32.2477657855927148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.220443711424950199, 0, -15.8719472225964143, 0, 132.266226854970119, 0, -282.167950623936255, 0, 181.393682543959021, 0, -32.2477657855927148, 0, 0.977205023805839843, + + -0.220443711424950199, 0, 0, -1.32266226854970119, 0, 15.8719472225964143, 0, 0, 0, 0, -3.30665567137425298, 0, 79.3597361129820716, 0, -132.266226854970119, 0, 0, 0, 0, 0, 0, -4.40887422849900398, 0, 158.719472225964143, 0, -529.064907419880478, 0, 282.167950623936255, 0, 0, 0, 0, 0, 0, 0, 0, -3.30665567137425298, 0, 158.719472225964143, 0, -793.597361129820716, 0, 846.503851871808764, 0, -181.393682543959021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.32266226854970119, 0, 79.3597361129820716, 0, -529.064907419880478, 0, 846.503851871808764, 0, -362.787365087918042, 0, 32.2477657855927148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.220443711424950199, 0, 15.8719472225964143, 0, -132.266226854970119, 0, 282.167950623936255, 0, -181.393682543959021, 0, 32.2477657855927148, 0, -0.977205023805839843, + 0, 0, 2.86576824852435259, 0, 0, 0, 0, 14.3288412426217629, 0, -57.3153649704870517, 0, 0, 0, 0, 0, 0, 28.6576824852435259, 0, -229.261459881948207, 0, 229.261459881948207, 0, 0, 0, 0, 0, 0, 0, 0, 28.6576824852435259, 0, -343.89218982292231, 0, 687.784379645844621, 0, -262.013097007940808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.3288412426217629, 0, -229.261459881948207, 0, 687.784379645844621, 0, -524.026194015881616, 0, 87.337699002646936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.86576824852435259, 0, -57.3153649704870517, 0, 229.261459881948207, 0, -262.013097007940808, 0, 87.337699002646936, 0, -6.35183265473795898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.63612338039655511, 0, 0, 0, 0, -13.1806169019827756, 0, 52.7224676079311022, 0, 0, 0, 0, 0, 0, -26.3612338039655511, 0, 210.889870431724409, 0, -210.889870431724409, 0, 0, 0, 0, 0, 0, 0, 0, -26.3612338039655511, 0, 316.334805647586613, 0, -632.669611295173227, 0, 241.01699477911361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.1806169019827756, 0, 210.889870431724409, 0, -632.669611295173227, 0, 482.03398955822722, 0, -80.3389982597045367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.63612338039655511, 0, 52.7224676079311022, 0, -210.889870431724409, 0, 241.01699477911361, 0, -80.3389982597045367, 0, 5.84283623706942085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.239647580036050465, 0, 0, -0.958590320144201859, 0, 16.7753306025235325, 0, 0, 0, 0, -1.19823790018025232, 0, 50.3259918075705976, 0, -134.20264482018826, 0, 0, 0, 0, 0, 0, 0, 0, 33.5506612050470651, 0, -268.40528964037652, 0, 268.40528964037652, 0, 0, 0, 0, 0, 0, 0, 0, 1.19823790018025232, 0, -33.5506612050470651, 0, 0, 0, 268.40528964037652, 0, -153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.958590320144201859, 0, -50.3259918075705976, 0, 268.40528964037652, 0, -268.40528964037652, 0, 0, 0, 20.449926829742973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.239647580036050465, 0, -16.7753306025235325, 0, 134.20264482018826, 0, -268.40528964037652, 0, 153.374451223072297, 0, -20.449926829742973, 0, 0, + + 0.202539171902860758, 0, 0, 0.810156687611443034, 0, -14.1777420332002531, 0, 0, 0, 0, 1.01269585951430379, 0, -42.5332260996007593, 0, 113.421936265602025, 0, 0, 0, 0, 0, 0, 0, 0, -28.3554840664005062, 0, 226.843872531204049, 0, -226.843872531204049, 0, 0, 0, 0, 0, 0, 0, 0, -1.01269585951430379, 0, 28.3554840664005062, 0, 0, 0, -226.843872531204049, 0, 129.625070017830885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.810156687611443034, 0, 42.5332260996007593, 0, -226.843872531204049, 0, 226.843872531204049, 0, 0, 0, -17.2833426690441181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.202539171902860758, 0, 14.1777420332002531, 0, -113.421936265602025, 0, 226.843872531204049, 0, -129.625070017830885, 0, 17.2833426690441181, 0, 0, + 0, 0, -3.03808757854291138, 0, 0, 0, 0, -3.03808757854291138, 0, 56.7109681328010124, 0, 0, 0, 0, 0, 0, 18.2285254712574683, 0, 0, 0, -204.159485278083644, 0, 0, 0, 0, 0, 0, 0, 0, 42.5332260996007593, 0, -340.265808796806074, 0, 204.159485278083644, 0, 194.437605026746328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33.4189633639720251, 0, -453.687745062408099, 0, 1020.79742639041822, 0, -388.875210053492656, 0, -43.2083566726102951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.11426273562873413, 0, -170.132904398403037, 0, 612.478455834250933, 0, -583.312815080238984, 0, 129.625070017830885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.35329251920326267, 0, 0, 0, 0, 2.35329251920326267, 0, -43.9281270251275699, 0, 0, 0, 0, 0, 0, -14.119755115219576, 0, 0, 0, 158.141257290459252, 0, 0, 0, 0, 0, 0, 0, 0, -32.9460952688456774, 0, 263.568762150765419, 0, -158.141257290459252, 0, -150.610721229008811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -25.8862177112358894, 0, 351.425016201020559, 0, -790.706286452296258, 0, 301.221442458017622, 0, 33.469049162001958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.05987755760978802, 0, 131.78438107538271, 0, -474.423771871377755, 0, 451.832163687026433, 0, -100.407147486005874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.261476946578140297, 0, 0, -0.522953893156280594, 0, -16.734524581000979, 0, 0, 0, 0, -4.44510809182838505, 0, 50.203573743002937, 0, 117.141672067006853, 0, 0, 0, 0, 0, 0, -7.32135450418792832, 0, 234.283344134013706, 0, -468.566688268027412, 0, -187.426675307210965, 0, 0, 0, 0, 0, 0, 0, 0, -4.44510809182838505, 0, 234.283344134013706, 0, -1171.41672067006853, 0, 937.133376536054825, 0, 66.938098324003916, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.522953893156280594, 0, 50.203573743002937, 0, -468.566688268027412, 0, 937.133376536054825, 0, -401.628589944023496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.261476946578140297, 0, -16.734524581000979, 0, 117.141672067006853, 0, -187.426675307210965, 0, 66.938098324003916, 0, 0, 0, 0, + + -0.184892122049355627, 0, 0, 0.369784244098711255, 0, 11.8330958111587602, 0, 0, 0, 0, 3.14316607483904567, 0, -35.4992874334762805, 0, -82.8316706781113211, 0, 0, 0, 0, 0, 0, 5.17697941738195757, 0, -165.663341356222642, 0, 331.326682712445284, 0, 132.530673084978114, 0, 0, 0, 0, 0, 0, 0, 0, 3.14316607483904567, 0, -165.663341356222642, 0, 828.316706781113211, 0, -662.653365424890569, 0, -47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.369784244098711255, 0, -35.4992874334762805, 0, 331.326682712445284, 0, -662.653365424890569, 0, 283.994299467810244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.184892122049355627, 0, 11.8330958111587602, 0, -82.8316706781113211, 0, 132.530673084978114, 0, -47.3323832446350406, 0, 0, 0, 0, + 0, 0, 3.14316607483904567, 0, 0, 0, 0, -22.0021625238733197, 0, -50.2906571974247307, 0, 0, 0, 0, 0, 0, -69.1496536464590047, 0, 402.325257579397845, 0, 140.813840152789246, 0, 0, 0, 0, 0, 0, 0, 0, -44.0043250477466393, 0, 704.06920076394623, 0, -1267.32456137510321, 0, -80.4650515158795691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15.7158303741952283, 0, 0, 0, -704.06920076394623, 0, 804.650515158795691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15.7158303741952283, 0, -251.453285987123653, 0, 704.06920076394623, 0, -402.325257579397845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.01693493170051083, 0, 0, 0, 0, 14.1185445219035758, 0, 32.2709589072081732, 0, 0, 0, 0, 0, 0, 44.3725684974112382, 0, -258.167671257665386, 0, -90.358684940182885, 0, 0, 0, 0, 0, 0, 0, 0, 28.2370890438071516, 0, -451.793424700914425, 0, 813.228164461645965, 0, 51.6335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.0846746585025541, 0, 0, 0, 451.793424700914425, 0, -516.335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.0846746585025541, 0, 161.354794536040866, 0, -451.793424700914425, 0, 258.167671257665386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.288133561671501547, 0, 0, 3.45760274005801856, 0, 15.5592123302610835, 0, 0, 0, 0, 7.77960616513054176, 0, -202.269760293394086, 0, -82.9824657613924454, 0, 0, 0, 0, 0, 0, 0, 0, -217.828972623655169, 0, 1161.75452065949424, 0, 77.4503013772996157, 0, 0, 0, 0, 0, 0, 0, 0, -7.77960616513054176, 0, 217.828972623655169, 0, 0, 0, -1161.75452065949424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.45760274005801856, 0, 202.269760293394086, 0, -1161.75452065949424, 0, 1161.75452065949424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.288133561671501547, 0, -15.5592123302610835, 0, 82.9824657613924454, 0, -77.4503013772996157, 0, 0, 0, 0, 0, 0, + + 0.166353989393607054, 0, 0, -1.99624787272328465, 0, -8.98311542725478094, 0, 0, 0, 0, -4.49155771362739047, 0, 116.780500554312152, 0, 47.9099489453588317, 0, 0, 0, 0, 0, 0, 0, 0, 125.763615981566933, 0, -670.739285235023644, 0, -44.7159523490015762, 0, 0, 0, 0, 0, 0, 0, 0, 4.49155771362739047, 0, -125.763615981566933, 0, 0, 0, 670.739285235023644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.99624787272328465, 0, -116.780500554312152, 0, 670.739285235023644, 0, -670.739285235023644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.166353989393607054, 0, 8.98311542725478094, 0, -47.9099489453588317, 0, 44.7159523490015762, 0, 0, 0, 0, 0, 0, + 0, 0, -3.16072579847853403, 0, 0, 0, 0, 60.0537901710921467, 0, 37.9287095817424084, 0, 0, 0, 0, 0, 0, 18.9643547908712042, 0, -758.574191634848168, 0, -60.6859353307878535, 0, 0, 0, 0, 0, 0, 0, 0, -132.750483536098429, 0, 531.001934144393718, 0, 1274.40464194654492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66.3752417680492147, 0, 1062.00386828878744, 0, -2124.00773657757487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.1250805893497382, 0, -265.500967072196859, 0, 424.801547315514974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.6214181230580196, 0, 0, 0, 0, -30.8069443381023724, 0, -19.4570174766962352, 0, 0, 0, 0, 0, 0, -9.72850873834811761, 0, 389.140349533924704, 0, 31.1312279627139763, 0, 0, 0, 0, 0, 0, 0, 0, 68.0995611684368233, 0, -272.398244673747293, 0, -653.755787216993503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34.0497805842184116, 0, -544.796489347494586, 0, 1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -11.3499268614061372, 0, 136.199122336873647, 0, -217.918595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.32428362461160392, 0, 0, -8.43137423990170193, 0, -12.9713449844641568, 0, 0, 0, 0, 4.8642543691740588, 0, 350.226314580532234, 0, 38.9140349533924704, 0, 0, 0, 0, 0, 0, 27.2398244673747293, 0, -544.796489347494586, 0, -1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.8642543691740588, 0, -544.796489347494586, 0, 2723.98244673747293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.43137423990170193, 0, 350.226314580532234, 0, -1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.32428362461160392, 0, -12.9713449844641568, 0, 38.9140349533924704, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.145024045724314041, 0, 0, 3.77062518883216506, 0, 5.80096182897256162, 0, 0, 0, 0, -2.17536068586471061, 0, -156.625969382259164, 0, -17.4028854869176849, 0, 0, 0, 0, 0, 0, -12.1820198408423794, 0, 243.640396816847588, 0, 487.280793633695176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.17536068586471061, 0, 243.640396816847588, 0, -1218.20198408423794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.77062518883216506, 0, -156.625969382259164, 0, 487.280793633695176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.145024045724314041, 0, 5.80096182897256162, 0, -17.4028854869176849, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3.04550496021059485, 0, 0, 0, 0, -106.59267360737082, 0, -20.3033664014039657, 0, 0, 0, 0, 0, 0, 274.095446418953537, 0, 730.921190450542765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127.911208328844984, 0, -2558.22416657689968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -228.412872015794614, 0, 1705.48277771793312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27.4095446418953537, 0, -182.730297612635691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.15109267733298502, 0, 0, 0, 0, 40.2882437066544757, 0, 7.67395118221990013, 0, 0, 0, 0, 0, 0, -103.598340959968652, 0, -276.262242559916405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48.3458924479853708, 0, 966.917848959707416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86.3319507999738764, 0, -644.611899306471611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.3598340959968652, 0, 69.0655606399791011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.383697559110995006, 0, 0, 16.8826926008837803, 0, 8.44134630044189014, 0, 0, 0, 0, -63.310097253314176, 0, -379.860583519885056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1772.68272309279693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63.310097253314176, 0, -1772.68272309279693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16.8826926008837803, 0, 379.860583519885056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.383697559110995006, 0, -8.44134630044189014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.115689166958762041, 0, 0, -5.09032334618552982, 0, -2.54516167309276491, 0, 0, 0, 0, 19.0887125481957368, 0, 114.532275289174421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -534.483951349480631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -19.0887125481957368, 0, 534.483951349480631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.09032334618552982, 0, -114.532275289174421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.115689166958762041, 0, 2.54516167309276491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2.66085084005152695, 0, 0, 0, 0, 146.346796202833982, 0, 0, 0, 0, 0, 0, 0, 0, -878.080777217003893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1229.31308810380545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -439.040388608501947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29.2693592405667964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.554825753806619302, 0, 0, 0, 0, -30.5154164593640616, 0, 0, 0, 0, 0, 0, 0, 0, 183.09249875618437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -256.329498258658117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91.5462493780921848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.10308329187281232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.554825753806619302, 0, 0, -36.6184997512368739, 0, 0, 0, 0, 0, 0, 274.638748134276554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -512.658996517316235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274.638748134276554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -36.6184997512368739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.554825753806619302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.566266663742191171, 0, 0, -37.3735998069846173, 0, 0, 0, 0, 0, 0, 280.30199855238463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -523.230397297784642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280.30199855238463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37.3735998069846173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.566266663742191171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.113253332748438234, 0, 0, -7.47471996139692346, 0, 0, 0, 0, 0, 0, 56.0603997104769259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -104.646079459556928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56.0603997104769259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.47471996139692346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.113253332748438234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2.71807998596251762, 0, 0, 0, 0, -149.494399227938469, 0, 0, 0, 0, 0, 0, 0, 0, 896.966395367630815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1255.75295351468314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 448.483197683815407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -29.8988798455876938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0.784642105787196884, 0, 0, 0, 0, -43.1553158182958286, 0, 0, 0, 0, 0, 0, 0, 0, 258.931894909774972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362.50465287368496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129.465947454887486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.63106316365916572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.392321052893598442, 0, 0, 17.2621263273183314, 0, 8.63106316365916572, 0, 0, 0, 0, -64.7329737274437429, 0, -388.397842364662457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1812.5232643684248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64.7329737274437429, 0, -1812.5232643684248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.2621263273183314, 0, 388.397842364662457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.392321052893598442, 0, -8.63106316365916572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.141689713908309089, 0, 0, 6.23434741196559994, 0, 3.11717370598279997, 0, 0, 0, 0, -23.3788027948709998, 0, -140.272816769225999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 654.606478256387993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23.3788027948709998, 0, -654.606478256387993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.23434741196559994, 0, 140.272816769225999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.141689713908309089, 0, -3.11717370598279997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3.11717370598279997, 0, 0, 0, 0, 109.101079709397999, 0, 20.7811580398853331, 0, 0, 0, 0, 0, 0, -280.545633538451997, 0, -748.121689435871992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -130.921295651277599, 0, 2618.42591302555197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233.788027948709998, 0, -1745.61727535036798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -28.0545633538451997, 0, 187.030422358967998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -1.32916733424081186, 0, 0, 0, 0, 46.5208566984284153, 0, 8.86111556160541243, 0, 0, 0, 0, 0, 0, -119.625060081673068, 0, -319.000160217794847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55.8250280381140983, 0, 1116.50056076228197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99.6875500680608898, 0, -744.333707174854644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -11.9625060081673068, 0, 79.7500400544487119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.332291833560202966, 0, 0, -8.63958767256527712, 0, -13.2916733424081186, 0, 0, 0, 0, 4.98437750340304449, 0, 358.875180245019203, 0, 39.8750200272243559, 0, 0, 0, 0, 0, 0, 27.9125140190570492, 0, -558.250280381140983, 0, -1116.50056076228197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.98437750340304449, 0, -558.250280381140983, 0, 2791.25140190570492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.63958767256527712, 0, 358.875180245019203, 0, -1116.50056076228197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.332291833560202966, 0, -13.2916733424081186, 0, 39.8750200272243559, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.16214181230580196, 0, 0, -4.21568711995085096, 0, -6.48567249223207841, 0, 0, 0, 0, 2.4321271845870294, 0, 175.113157290266117, 0, 19.4570174766962352, 0, 0, 0, 0, 0, 0, 13.6199122336873647, 0, -272.398244673747293, 0, -544.796489347494586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.4321271845870294, 0, -272.398244673747293, 0, 1361.99122336873647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.21568711995085096, 0, 175.113157290266117, 0, -544.796489347494586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.16214181230580196, 0, -6.48567249223207841, 0, 19.4570174766962352, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3.2428362461160392, 0, 0, 0, 0, -61.6138886762047449, 0, -38.9140349533924704, 0, 0, 0, 0, 0, 0, -19.4570174766962352, 0, 778.280699067849409, 0, 62.2624559254279527, 0, 0, 0, 0, 0, 0, 0, 0, 136.199122336873647, 0, -544.796489347494586, 0, -1307.51157443398701, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68.0995611684368233, 0, -1089.59297869498917, 0, 2179.18595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22.6998537228122744, 0, 272.398244673747293, 0, -435.837191477995669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 1.77617456229312929, 0, 0, 0, 0, -33.7473166835694566, 0, -21.3140947475175515, 0, 0, 0, 0, 0, 0, -10.6570473737587758, 0, 426.281894950351031, 0, 34.1025515960280824, 0, 0, 0, 0, 0, 0, 0, 0, 74.5993316163114303, 0, -298.397326465245721, 0, -716.153583516589731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37.2996658081557152, 0, -596.794652930491443, 0, 1193.58930586098289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -12.4332219360519051, 0, 149.198663232622861, 0, -238.717861172196577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.296029093715521549, 0, 0, 3.55234912458625859, 0, 15.9855710606381636, 0, 0, 0, 0, 7.99278553031908182, 0, -207.812423788296127, 0, -85.2563789900702061, 0, 0, 0, 0, 0, 0, 0, 0, -223.797994848934291, 0, 1193.58930586098289, 0, 79.5726203907321924, 0, 0, 0, 0, 0, 0, 0, 0, -7.99278553031908182, 0, 223.797994848934291, 0, 0, 0, -1193.58930586098289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.55234912458625859, 0, 207.812423788296127, 0, -1193.58930586098289, 0, 1193.58930586098289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.296029093715521549, 0, -15.9855710606381636, 0, 85.2563789900702061, 0, -79.5726203907321924, 0, 0, 0, 0, 0, 0, + + -0.179682844900943126, 0, 0, 2.15619413881131751, 0, 9.7028736246509288, 0, 0, 0, 0, 4.8514368123254644, 0, -126.137357120462074, 0, -51.7486593314716203, 0, 0, 0, 0, 0, 0, 0, 0, -135.840230745113003, 0, 724.481230640602684, 0, 48.2987487093735122, 0, 0, 0, 0, 0, 0, 0, 0, -4.8514368123254644, 0, 135.840230745113003, 0, 0, 0, -724.481230640602684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.15619413881131751, 0, 126.137357120462074, 0, -724.481230640602684, 0, 724.481230640602684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.179682844900943126, 0, -9.7028736246509288, 0, 51.7486593314716203, 0, -48.2987487093735122, 0, 0, 0, 0, 0, 0, + 0, 0, -3.23429120821697627, 0, 0, 0, 0, 22.6400384575188339, 0, 51.7486593314716203, 0, 0, 0, 0, 0, 0, 71.1544065807734779, 0, -413.989274651772962, 0, -144.896246128120537, 0, 0, 0, 0, 0, 0, 0, 0, 45.2800769150376677, 0, -724.481230640602684, 0, 1304.06621515308483, 0, 82.7978549303545924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16.1714560410848813, 0, 0, 0, 724.481230640602684, 0, -827.978549303545924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16.1714560410848813, 0, 258.743296657358101, 0, -724.481230640602684, 0, 413.989274651772962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.15619413881131751, 0, 0, 0, 0, 15.0933589716792226, 0, 34.4991062209810802, 0, 0, 0, 0, 0, 0, 47.4362710538489852, 0, -275.992849767848641, 0, -96.5974974187470245, 0, 0, 0, 0, 0, 0, 0, 0, 30.1867179433584452, 0, -482.987487093735122, 0, 869.37747676872322, 0, 55.1985699535697283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.7809706940565876, 0, 0, 0, 482.987487093735122, 0, -551.985699535697283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.7809706940565876, 0, 172.495531104905401, 0, -482.987487093735122, 0, 275.992849767848641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.269524267351414689, 0, 0, -0.539048534702829378, 0, -17.2495531104905401, 0, 0, 0, 0, -4.58191254497404971, 0, 51.7486593314716203, 0, 120.746871773433781, 0, 0, 0, 0, 0, 0, -7.54667948583961129, 0, 241.493743546867561, 0, -482.987487093735122, 0, -193.194994837494049, 0, 0, 0, 0, 0, 0, 0, 0, -4.58191254497404971, 0, 241.493743546867561, 0, -1207.46871773433781, 0, 965.974974187470245, 0, 68.9982124419621604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.539048534702829378, 0, 51.7486593314716203, 0, -482.987487093735122, 0, 965.974974187470245, 0, -413.989274651772962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.269524267351414689, 0, -17.2495531104905401, 0, 120.746871773433781, 0, -193.194994837494049, 0, 68.9982124419621604, 0, 0, 0, 0, + + 0.196107709933605223, 0, 0, -0.392215419867210446, 0, -12.5508934357507343, 0, 0, 0, 0, -3.33383106887128879, 0, 37.6526803072522028, 0, 87.8562540502551398, 0, 0, 0, 0, 0, 0, -5.49101587814094624, 0, 175.71250810051028, 0, -351.425016201020559, 0, -140.570006480408224, 0, 0, 0, 0, 0, 0, 0, 0, -3.33383106887128879, 0, 175.71250810051028, 0, -878.562540502551398, 0, 702.850032402041119, 0, 50.203573743002937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.392215419867210446, 0, 37.6526803072522028, 0, -351.425016201020559, 0, 702.850032402041119, 0, -301.221442458017622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.196107709933605223, 0, -12.5508934357507343, 0, 87.8562540502551398, 0, -140.570006480408224, 0, 50.203573743002937, 0, 0, 0, 0, + 0, 0, 3.13772335893768356, 0, 0, 0, 0, 3.13772335893768356, 0, -58.5708360335034265, 0, 0, 0, 0, 0, 0, -18.8263401536261014, 0, 0, 0, 210.855009720612336, 0, 0, 0, 0, 0, 0, 0, 0, -43.9281270251275699, 0, 351.425016201020559, 0, -210.855009720612336, 0, -200.814294972011748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34.5149569483145192, 0, 468.566688268027412, 0, -1054.27504860306168, 0, 401.628589944023496, 0, 44.6253988826692774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.41317007681305069, 0, 175.71250810051028, 0, -632.565029161837007, 0, 602.442884916035244, 0, -133.876196648007832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.48058812043928146, 0, 0, 0, 0, 2.48058812043928146, 0, -46.3043115815332539, 0, 0, 0, 0, 0, 0, -14.8835287226356887, 0, 0, 0, 166.695521693519714, 0, 0, 0, 0, 0, 0, 0, 0, -34.7282336861499404, 0, 277.825869489199523, 0, -166.695521693519714, 0, -158.757639708114013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -27.286469324832096, 0, 370.434492652266031, 0, -833.47760846759857, 0, 317.515279416228027, 0, 35.279475490692003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.44176436131784437, 0, 138.912934744599762, 0, -500.086565080559142, 0, 476.27291912434204, 0, -105.838426472076009, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.248058812043928146, 0, 0, -0.992235248175712583, 0, 17.3641168430749702, 0, 0, 0, 0, -1.24029406021964073, 0, 52.0923505292249106, 0, -138.912934744599762, 0, 0, 0, 0, 0, 0, 0, 0, 34.7282336861499404, 0, -277.825869489199523, 0, 277.825869489199523, 0, 0, 0, 0, 0, 0, 0, 0, 1.24029406021964073, 0, -34.7282336861499404, 0, 0, 0, 277.825869489199523, 0, -158.757639708114013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.992235248175712583, 0, -52.0923505292249106, 0, 277.825869489199523, 0, -277.825869489199523, 0, 0, 0, 21.1676852944152018, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.248058812043928146, 0, -17.3641168430749702, 0, 138.912934744599762, 0, -277.825869489199523, 0, 158.757639708114013, 0, -21.1676852944152018, 0, 0, + + -0.212424875592775713, 0, 0, -0.849699502371102853, 0, 14.8697412914942999, 0, 0, 0, 0, -1.06212437796387857, 0, 44.6092238744828998, 0, -118.957930331954399, 0, 0, 0, 0, 0, 0, 0, 0, 29.7394825829885999, 0, -237.915860663908799, 0, 237.915860663908799, 0, 0, 0, 0, 0, 0, 0, 0, 1.06212437796387857, 0, -29.7394825829885999, 0, 0, 0, 237.915860663908799, 0, -135.951920379376457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.849699502371102853, 0, -44.6092238744828998, 0, 237.915860663908799, 0, -237.915860663908799, 0, 0, 0, 18.1269227172501942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.212424875592775713, 0, -14.8697412914942999, 0, 118.957930331954399, 0, -237.915860663908799, 0, 135.951920379376457, 0, -18.1269227172501942, 0, 0, + 0, 0, -2.97394825829885999, 0, 0, 0, 0, -14.8697412914942999, 0, 59.4789651659771997, 0, 0, 0, 0, 0, 0, -29.7394825829885999, 0, 237.915860663908799, 0, -237.915860663908799, 0, 0, 0, 0, 0, 0, 0, 0, -29.7394825829885999, 0, 356.873790995863198, 0, -713.747581991726397, 0, 271.903840758752913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.8697412914942999, 0, 237.915860663908799, 0, -713.747581991726397, 0, 543.807681517505826, 0, -90.634613586250971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.97394825829885999, 0, 59.4789651659771997, 0, -237.915860663908799, 0, 271.903840758752913, 0, -90.634613586250971, 0, 6.59160826081825244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.7533410732166562, 0, 0, 0, 0, -13.766705366083281, 0, 55.066821464333124, 0, 0, 0, 0, 0, 0, -27.533410732166562, 0, 220.267285857332496, 0, -220.267285857332496, 0, 0, 0, 0, 0, 0, 0, 0, -27.533410732166562, 0, 330.400928785998744, 0, -660.801857571997488, 0, 251.734040979808567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.766705366083281, 0, 220.267285857332496, 0, -660.801857571997488, 0, 503.468081959617133, 0, -83.9113469932695222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.7533410732166562, 0, 55.066821464333124, 0, -220.267285857332496, 0, 251.734040979808567, 0, -83.9113469932695222, 0, 6.10264341769232889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.22944508943472135, 0, 0, 1.3766705366083281, 0, -16.5200464392999372, 0, 0, 0, 0, 3.44167634152082025, 0, -82.6002321964996859, 0, 137.66705366083281, 0, 0, 0, 0, 0, 0, 4.588901788694427, 0, -165.200464392999372, 0, 550.66821464333124, 0, -293.689714476443328, 0, 0, 0, 0, 0, 0, 0, 0, 3.44167634152082025, 0, -165.200464392999372, 0, 826.002321964996859, 0, -881.069143429329983, 0, 188.800530734856425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.3766705366083281, 0, -82.6002321964996859, 0, 550.66821464333124, 0, -881.069143429329983, 0, 377.60106146971285, 0, -33.5645387973078089, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.22944508943472135, 0, -16.5200464392999372, 0, 137.66705366083281, 0, -293.689714476443328, 0, 188.800530734856425, 0, -33.5645387973078089, 0, 1.01710723628205481, + + 0.22944508943472135, 0, 0, 1.3766705366083281, 0, -16.5200464392999372, 0, 0, 0, 0, 3.44167634152082025, 0, -82.6002321964996859, 0, 137.66705366083281, 0, 0, 0, 0, 0, 0, 4.588901788694427, 0, -165.200464392999372, 0, 550.66821464333124, 0, -293.689714476443328, 0, 0, 0, 0, 0, 0, 0, 0, 3.44167634152082025, 0, -165.200464392999372, 0, 826.002321964996859, 0, -881.069143429329983, 0, 188.800530734856425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.3766705366083281, 0, -82.6002321964996859, 0, 550.66821464333124, 0, -881.069143429329983, 0, 377.60106146971285, 0, -33.5645387973078089, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.22944508943472135, 0, -16.5200464392999372, 0, 137.66705366083281, 0, -293.689714476443328, 0, 188.800530734856425, 0, -33.5645387973078089, 0, 1.01710723628205481, + 0, 0, 2.7533410732166562, 0, 0, 0, 0, 13.766705366083281, 0, -55.066821464333124, 0, 0, 0, 0, 0, 0, 27.533410732166562, 0, -220.267285857332496, 0, 220.267285857332496, 0, 0, 0, 0, 0, 0, 0, 0, 27.533410732166562, 0, -330.400928785998744, 0, 660.801857571997488, 0, -251.734040979808567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.766705366083281, 0, -220.267285857332496, 0, 660.801857571997488, 0, -503.468081959617133, 0, 83.9113469932695222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.7533410732166562, 0, -55.066821464333124, 0, 220.267285857332496, 0, -251.734040979808567, 0, 83.9113469932695222, 0, -6.10264341769232889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 2.97394825829885999, 0, 0, 0, 0, 14.8697412914942999, 0, -59.4789651659771997, 0, 0, 0, 0, 0, 0, 29.7394825829885999, 0, -237.915860663908799, 0, 237.915860663908799, 0, 0, 0, 0, 0, 0, 0, 0, 29.7394825829885999, 0, -356.873790995863198, 0, 713.747581991726397, 0, -271.903840758752913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.8697412914942999, 0, -237.915860663908799, 0, 713.747581991726397, 0, -543.807681517505826, 0, 90.634613586250971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.97394825829885999, 0, -59.4789651659771997, 0, 237.915860663908799, 0, -271.903840758752913, 0, 90.634613586250971, 0, -6.59160826081825244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.212424875592775713, 0, 0, -0.849699502371102853, 0, 14.8697412914942999, 0, 0, 0, 0, -1.06212437796387857, 0, 44.6092238744828998, 0, -118.957930331954399, 0, 0, 0, 0, 0, 0, 0, 0, 29.7394825829885999, 0, -237.915860663908799, 0, 237.915860663908799, 0, 0, 0, 0, 0, 0, 0, 0, 1.06212437796387857, 0, -29.7394825829885999, 0, 0, 0, 237.915860663908799, 0, -135.951920379376457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.849699502371102853, 0, -44.6092238744828998, 0, 237.915860663908799, 0, -237.915860663908799, 0, 0, 0, 18.1269227172501942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.212424875592775713, 0, -14.8697412914942999, 0, 118.957930331954399, 0, -237.915860663908799, 0, 135.951920379376457, 0, -18.1269227172501942, 0, 0, + + -0.248058812043928146, 0, 0, -0.992235248175712583, 0, 17.3641168430749702, 0, 0, 0, 0, -1.24029406021964073, 0, 52.0923505292249106, 0, -138.912934744599762, 0, 0, 0, 0, 0, 0, 0, 0, 34.7282336861499404, 0, -277.825869489199523, 0, 277.825869489199523, 0, 0, 0, 0, 0, 0, 0, 0, 1.24029406021964073, 0, -34.7282336861499404, 0, 0, 0, 277.825869489199523, 0, -158.757639708114013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.992235248175712583, 0, -52.0923505292249106, 0, 277.825869489199523, 0, -277.825869489199523, 0, 0, 0, 21.1676852944152018, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.248058812043928146, 0, -17.3641168430749702, 0, 138.912934744599762, 0, -277.825869489199523, 0, 158.757639708114013, 0, -21.1676852944152018, 0, 0, + 0, 0, -2.48058812043928146, 0, 0, 0, 0, -2.48058812043928146, 0, 46.3043115815332539, 0, 0, 0, 0, 0, 0, 14.8835287226356887, 0, 0, 0, -166.695521693519714, 0, 0, 0, 0, 0, 0, 0, 0, 34.7282336861499404, 0, -277.825869489199523, 0, 166.695521693519714, 0, 158.757639708114013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27.286469324832096, 0, -370.434492652266031, 0, 833.47760846759857, 0, -317.515279416228027, 0, -35.279475490692003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.44176436131784437, 0, -138.912934744599762, 0, 500.086565080559142, 0, -476.27291912434204, 0, 105.838426472076009, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -3.13772335893768356, 0, 0, 0, 0, -3.13772335893768356, 0, 58.5708360335034265, 0, 0, 0, 0, 0, 0, 18.8263401536261014, 0, 0, 0, -210.855009720612336, 0, 0, 0, 0, 0, 0, 0, 0, 43.9281270251275699, 0, -351.425016201020559, 0, 210.855009720612336, 0, 200.814294972011748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34.5149569483145192, 0, -468.566688268027412, 0, 1054.27504860306168, 0, -401.628589944023496, 0, -44.6253988826692774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.41317007681305069, 0, -175.71250810051028, 0, 632.565029161837007, 0, -602.442884916035244, 0, 133.876196648007832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.196107709933605223, 0, 0, -0.392215419867210446, 0, -12.5508934357507343, 0, 0, 0, 0, -3.33383106887128879, 0, 37.6526803072522028, 0, 87.8562540502551398, 0, 0, 0, 0, 0, 0, -5.49101587814094624, 0, 175.71250810051028, 0, -351.425016201020559, 0, -140.570006480408224, 0, 0, 0, 0, 0, 0, 0, 0, -3.33383106887128879, 0, 175.71250810051028, 0, -878.562540502551398, 0, 702.850032402041119, 0, 50.203573743002937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.392215419867210446, 0, 37.6526803072522028, 0, -351.425016201020559, 0, 702.850032402041119, 0, -301.221442458017622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.196107709933605223, 0, -12.5508934357507343, 0, 87.8562540502551398, 0, -140.570006480408224, 0, 50.203573743002937, 0, 0, 0, 0, + + 0.269524267351414689, 0, 0, -0.539048534702829378, 0, -17.2495531104905401, 0, 0, 0, 0, -4.58191254497404971, 0, 51.7486593314716203, 0, 120.746871773433781, 0, 0, 0, 0, 0, 0, -7.54667948583961129, 0, 241.493743546867561, 0, -482.987487093735122, 0, -193.194994837494049, 0, 0, 0, 0, 0, 0, 0, 0, -4.58191254497404971, 0, 241.493743546867561, 0, -1207.46871773433781, 0, 965.974974187470245, 0, 68.9982124419621604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.539048534702829378, 0, 51.7486593314716203, 0, -482.987487093735122, 0, 965.974974187470245, 0, -413.989274651772962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.269524267351414689, 0, -17.2495531104905401, 0, 120.746871773433781, 0, -193.194994837494049, 0, 68.9982124419621604, 0, 0, 0, 0, + 0, 0, 2.15619413881131751, 0, 0, 0, 0, -15.0933589716792226, 0, -34.4991062209810802, 0, 0, 0, 0, 0, 0, -47.4362710538489852, 0, 275.992849767848641, 0, 96.5974974187470245, 0, 0, 0, 0, 0, 0, 0, 0, -30.1867179433584452, 0, 482.987487093735122, 0, -869.37747676872322, 0, -55.1985699535697283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.7809706940565876, 0, 0, 0, -482.987487093735122, 0, 551.985699535697283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.7809706940565876, 0, -172.495531104905401, 0, 482.987487093735122, 0, -275.992849767848641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 3.23429120821697627, 0, 0, 0, 0, -22.6400384575188339, 0, -51.7486593314716203, 0, 0, 0, 0, 0, 0, -71.1544065807734779, 0, 413.989274651772962, 0, 144.896246128120537, 0, 0, 0, 0, 0, 0, 0, 0, -45.2800769150376677, 0, 724.481230640602684, 0, -1304.06621515308483, 0, -82.7978549303545924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16.1714560410848813, 0, 0, 0, -724.481230640602684, 0, 827.978549303545924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16.1714560410848813, 0, -258.743296657358101, 0, 724.481230640602684, 0, -413.989274651772962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.179682844900943126, 0, 0, 2.15619413881131751, 0, 9.7028736246509288, 0, 0, 0, 0, 4.8514368123254644, 0, -126.137357120462074, 0, -51.7486593314716203, 0, 0, 0, 0, 0, 0, 0, 0, -135.840230745113003, 0, 724.481230640602684, 0, 48.2987487093735122, 0, 0, 0, 0, 0, 0, 0, 0, -4.8514368123254644, 0, 135.840230745113003, 0, 0, 0, -724.481230640602684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.15619413881131751, 0, 126.137357120462074, 0, -724.481230640602684, 0, 724.481230640602684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.179682844900943126, 0, -9.7028736246509288, 0, 51.7486593314716203, 0, -48.2987487093735122, 0, 0, 0, 0, 0, 0, + + -0.296029093715521549, 0, 0, 3.55234912458625859, 0, 15.9855710606381636, 0, 0, 0, 0, 7.99278553031908182, 0, -207.812423788296127, 0, -85.2563789900702061, 0, 0, 0, 0, 0, 0, 0, 0, -223.797994848934291, 0, 1193.58930586098289, 0, 79.5726203907321924, 0, 0, 0, 0, 0, 0, 0, 0, -7.99278553031908182, 0, 223.797994848934291, 0, 0, 0, -1193.58930586098289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.55234912458625859, 0, 207.812423788296127, 0, -1193.58930586098289, 0, 1193.58930586098289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.296029093715521549, 0, -15.9855710606381636, 0, 85.2563789900702061, 0, -79.5726203907321924, 0, 0, 0, 0, 0, 0, + 0, 0, -1.77617456229312929, 0, 0, 0, 0, 33.7473166835694566, 0, 21.3140947475175515, 0, 0, 0, 0, 0, 0, 10.6570473737587758, 0, -426.281894950351031, 0, -34.1025515960280824, 0, 0, 0, 0, 0, 0, 0, 0, -74.5993316163114303, 0, 298.397326465245721, 0, 716.153583516589731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37.2996658081557152, 0, 596.794652930491443, 0, -1193.58930586098289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12.4332219360519051, 0, -149.198663232622861, 0, 238.717861172196577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -3.2428362461160392, 0, 0, 0, 0, 61.6138886762047449, 0, 38.9140349533924704, 0, 0, 0, 0, 0, 0, 19.4570174766962352, 0, -778.280699067849409, 0, -62.2624559254279527, 0, 0, 0, 0, 0, 0, 0, 0, -136.199122336873647, 0, 544.796489347494586, 0, 1307.51157443398701, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68.0995611684368233, 0, 1089.59297869498917, 0, -2179.18595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.6998537228122744, 0, -272.398244673747293, 0, 435.837191477995669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.16214181230580196, 0, 0, -4.21568711995085096, 0, -6.48567249223207841, 0, 0, 0, 0, 2.4321271845870294, 0, 175.113157290266117, 0, 19.4570174766962352, 0, 0, 0, 0, 0, 0, 13.6199122336873647, 0, -272.398244673747293, 0, -544.796489347494586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.4321271845870294, 0, -272.398244673747293, 0, 1361.99122336873647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.21568711995085096, 0, 175.113157290266117, 0, -544.796489347494586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.16214181230580196, 0, -6.48567249223207841, 0, 19.4570174766962352, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.332291833560202966, 0, 0, -8.63958767256527712, 0, -13.2916733424081186, 0, 0, 0, 0, 4.98437750340304449, 0, 358.875180245019203, 0, 39.8750200272243559, 0, 0, 0, 0, 0, 0, 27.9125140190570492, 0, -558.250280381140983, 0, -1116.50056076228197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.98437750340304449, 0, -558.250280381140983, 0, 2791.25140190570492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.63958767256527712, 0, 358.875180245019203, 0, -1116.50056076228197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.332291833560202966, 0, -13.2916733424081186, 0, 39.8750200272243559, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1.32916733424081186, 0, 0, 0, 0, -46.5208566984284153, 0, -8.86111556160541243, 0, 0, 0, 0, 0, 0, 119.625060081673068, 0, 319.000160217794847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55.8250280381140983, 0, -1116.50056076228197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -99.6875500680608898, 0, 744.333707174854644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11.9625060081673068, 0, -79.7500400544487119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 3.11717370598279997, 0, 0, 0, 0, -109.101079709397999, 0, -20.7811580398853331, 0, 0, 0, 0, 0, 0, 280.545633538451997, 0, 748.121689435871992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130.921295651277599, 0, -2618.42591302555197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -233.788027948709998, 0, 1745.61727535036798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28.0545633538451997, 0, -187.030422358967998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -0.141689713908309089, 0, 0, 6.23434741196559994, 0, 3.11717370598279997, 0, 0, 0, 0, -23.3788027948709998, 0, -140.272816769225999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 654.606478256387993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23.3788027948709998, 0, -654.606478256387993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.23434741196559994, 0, 140.272816769225999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.141689713908309089, 0, -3.11717370598279997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + -0.392321052893598442, 0, 0, 17.2621263273183314, 0, 8.63106316365916572, 0, 0, 0, 0, -64.7329737274437429, 0, -388.397842364662457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1812.5232643684248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64.7329737274437429, 0, -1812.5232643684248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.2621263273183314, 0, 388.397842364662457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.392321052893598442, 0, -8.63106316365916572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -0.784642105787196884, 0, 0, 0, 0, 43.1553158182958286, 0, 0, 0, 0, 0, 0, 0, 0, -258.931894909774972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 362.50465287368496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -129.465947454887486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.63106316365916572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, -2.71807998596251762, 0, 0, 0, 0, 149.494399227938469, 0, 0, 0, 0, 0, 0, 0, 0, -896.966395367630815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1255.75295351468314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -448.483197683815407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29.8988798455876938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0.113253332748438234, 0, 0, -7.47471996139692346, 0, 0, 0, 0, 0, 0, 56.0603997104769259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -104.646079459556928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56.0603997104769259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.47471996139692346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.113253332748438234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0.566266663742191171, 0, 0, -37.3735998069846173, 0, 0, 0, 0, 0, 0, 280.30199855238463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -523.230397297784642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280.30199855238463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37.3735998069846173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.566266663742191171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static dtype g_trans_cart2jI[] = { + 0, + 0, + 0, + 0, + 0, + 0.577350269189625764, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.577350269189625764, + 0, + 0, + 0, + 0, + 0, + -0.707106781186547524, + 0, + 0, + -0.408248290463863016, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.408248290463863016, + 0, + 0, + -0.707106781186547524, + 0, + 0, + 0, + 0, + 0, + 0.690988298942670958, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.345494149471335479, + 0, + 0, + 0, + 0, + 0, + 0.598413420602149016, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.598413420602149016, + 0, + 0, + 0, + 0, + 0, + 0.345494149471335479, + 0, + 0, + 0.690988298942670958, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.772548404046379160, + 0, + 0, + 0, + 0, + 0, + -0.345494149471335479, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.690988298942670958, + 0, + 0, + 0, + 0, + 0, + -0.488602511902919921, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.488602511902919921, + 0, + 0, + 0, + 0, + 0, + -0.690988298942670958, + 0, + 0, + 0.345494149471335479, + 0, + 0, + 0, + 0, + 0, + 0.772548404046379160, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1.158822606069568741, + 0, + 0, + 0, + 0, + -0.386274202023189580, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.772548404046379160, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1.727470747356677396, + 0, + 0, + 0, + 0, + 0, + 0, + 0.172747074735667739, + 0, + 0, + 0, + 0, + 0.172747074735667739, + 0, + -0.690988298942670958, + 0, + 0, + -0.244301255951459960, + 0, + 0, + 0, + 0, + -0.244301255951459960, + 0, + 0.977205023805839843, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.244301255951459960, + 0, + 0, + 0, + 0, + 0.244301255951459960, + 0, + -0.977205023805839843, + 0, + 0, + -0.172747074735667739, + 0, + 0, + 0, + 0, + -0.172747074735667739, + 0, + 0.690988298942670958, + 0, + 0, + 0, + 0, + 0, + 1.727470747356677396, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -0.772548404046379160, + 0, + 0, + 0, + 0, + 0, + 0, + -1.158822606069568741, + 0, + 0, + 0, + 0, + 0.386274202023189580, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -1.251671470898352269, + 0, + 0, + 0, + 0, + 0.417223823632784089, + 0, + 0, + 0, + 0, + -0.473087347878780009, + 0, + 0, + 0, + 0, + 0.157695782626260003, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -1.892349391515120036, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -1.092548430592079070, + 0, + 0, + 0, + 0, + 0, + 0, + 0.273137107648019767, + 0, + 0, + 0, + 0, + 0.273137107648019767, + 0, + -1.092548430592079070, + 0, + 0, + 0.211571093830408607, + 0, + 0, + 0, + 0, + 0.211571093830408607, + 0, + -0.846284375321634430, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.211571093830408607, + 0, + 0, + 0, + 0, + 0.211571093830408607, + 0, + -0.846284375321634430, + 0, + 0, + 0.273137107648019767, + 0, + 0, + 0, + 0, + 0.273137107648019767, + 0, + -1.092548430592079070, + 0, + 0, + 0, + 0, + 0, + 1.092548430592079070, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1.892349391515120036, + 0, + 0, + 0, + 0, + 0, + 0, + -0.473087347878780009, + 0, + 0, + 0, + 0, + 0.157695782626260003, + 0, + 0, + 0, + 0, + -1.251671470898352269, + 0, + 0, + 0, + 0, + 0.417223823632784089, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + + 0, 1.668895294531136358, 0, 0, 0, 0, -1.668895294531136358, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1.251671470898352269, 0, 0, 0, 0, 0, 0, 0.417223823632784089, 0, 0, 0, + + 0, 0, 0, 0, 3.311611435151460063, 0, 0, 0, 0, 0, 0, -1.103870478383820021, 0, 0, 0, + 0, 0.315391565252520006, 0, 0, 0, 0, 0.315391565252520006, 0, -1.892349391515120036, 0, 0, 0, 0, 0, 0, + + 0, -0.546274215296039535, 0, 0, 0, 0, -0.546274215296039535, 0, 3.277645291776237211, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0.819411322944059302, 0, 0, 0, 0, 0, 0, 0.819411322944059302, 0, -1.092548430592079070, 0, + + 0, 0, 0, 0, -1.057855469152043038, 0, 0, 0, 0, 0, 0, -1.057855469152043038, 0, 1.410473958869390717, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1.057855469152043038, 0, 0, 0, 0, 0, 0, 1.057855469152043038, 0, -1.410473958869390717, 0, + + 0, 0, 0, 0, -0.819411322944059302, 0, 0, 0, 0, 0, 0, -0.819411322944059302, 0, 1.092548430592079070, 0, + 0, -0.546274215296039535, 0, 0, 0, 0, -0.546274215296039535, 0, 3.277645291776237211, 0, 0, 0, 0, 0, 0, + + 0, 0.315391565252520006, 0, 0, 0, 0, 0.315391565252520006, 0, -1.892349391515120036, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3.311611435151460063, 0, 0, 0, 0, 0, 0, 1.103870478383820021, 0, 0, 0, + + 0, 0, 0, 0, 1.251671470898352269, 0, 0, 0, 0, 0, 0, -0.417223823632784089, 0, 0, 0, + 0, 1.668895294531136358, 0, 0, 0, 0, -1.668895294531136358, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1.770130769779930531, 0, 0, 0, 0, 1.770130769779930531, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.590043589926643510, 0, 0, 0, 0, 0.590043589926643510, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3.540261539559861062, 0, 0, 0, 0, 0, 0, 1.180087179853287020, 0, 0, 0, + + 0, 0, 0, 0, -1.770130769779930531, 0, 0, 0, 0, 0, 0, 0.590043589926643510, 0, 0, 0, + 0, 0.590043589926643510, 0, 0, 0, 0, 0.590043589926643510, 0, -3.540261539559861062, 0, 0, 0, 0, 0, 0, + + 0, 0.386274202023189580, 0, 0, 0, 0, 0.386274202023189580, 0, -2.317645212139137482, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1.158822606069568741, 0, 0, 0, 0, 0, 0, 1.158822606069568741, 0, -1.545096808092758321, 0, + + 0, 0, 0, 0, 0.946174695757560018, 0, 0, 0, 0, 0, 0, 0.946174695757560018, 0, -1.261566261010080024, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0.946174695757560018, 0, 0, 0, 0, 0, 0, 0.946174695757560018, 0, -1.261566261010080024, 0, + + 0, 0, 0, 0, 1.158822606069568741, 0, 0, 0, 0, 0, 0, 1.158822606069568741, 0, -1.545096808092758321, 0, + 0, -0.386274202023189580, 0, 0, 0, 0, -0.386274202023189580, 0, 2.317645212139137482, 0, 0, 0, 0, 0, 0, + + 0, -0.590043589926643510, 0, 0, 0, 0, -0.590043589926643510, 0, 3.540261539559861062, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1.770130769779930531, 0, 0, 0, 0, 0, 0, 0.590043589926643510, 0, 0, 0, + + 0, 0, 0, 0, -3.540261539559861062, 0, 0, 0, 0, 0, 0, 1.180087179853287020, 0, 0, 0, + 0, 0.590043589926643510, 0, 0, 0, 0, -0.590043589926643510, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.770130769779930531, 0, 0, 0, 0, -1.770130769779930531, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 2.212663462224913163, 0, 0, 0, 0, -4.425326924449826327, 0, 0, 0, 0, 0, 0, 0, 0, 0.442532692444982632, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1.770130769779930531, 0, 0, 0, 0, 0, 0, 1.770130769779930531, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 5.310392309339791593, 0, 0, 0, 0, 0, 0, -5.310392309339791593, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.442532692444982632, 0, 0, 0, 0, 0.295021794963321755, 0, -3.540261539559861062, 0, 0, 0, 0, 0, 0, -0.147510897481660877, 0, 1.180087179853287020, 0, 0, 0, + + 0, -0.885065384889965265, 0, 0, 0, 0, -0.590043589926643510, 0, 7.080523079119722124, 0, 0, 0, 0, 0, 0, 0.295021794963321755, 0, -2.360174359706574041, 0, 0, 0, + 0, 0, 0, 0, 1.770130769779930531, 0, 0, 0, 0, 0, 0, 1.770130769779930531, 0, -3.540261539559861062, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -2.703919414162327062, 0, 0, 0, 0, 0, 0, -2.703919414162327062, 0, 5.407838828324654124, 0, 0, 0, 0, 0, 0, 0, + 0, -0.193137101011594790, 0, 0, 0, 0, -0.386274202023189580, 0, 2.317645212139137482, 0, 0, 0, 0, 0, 0, -0.193137101011594790, 0, 2.317645212139137482, 0, -1.545096808092758321, 0, + + 0, 0.236543673939390004, 0, 0, 0, 0, 0.473087347878780009, 0, -2.838524087272680054, 0, 0, 0, 0, 0, 0, 0.236543673939390004, 0, -2.838524087272680054, 0, 1.892349391515120036, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.236543673939390004, 0, 0, 0, 0, -0.473087347878780009, 0, 2.838524087272680054, 0, 0, 0, 0, 0, 0, -0.236543673939390004, 0, 2.838524087272680054, 0, -1.892349391515120036, 0, + + 0, 0.193137101011594790, 0, 0, 0, 0, 0.386274202023189580, 0, -2.317645212139137482, 0, 0, 0, 0, 0, 0, 0.193137101011594790, 0, -2.317645212139137482, 0, 1.545096808092758321, 0, + 0, 0, 0, 0, -2.703919414162327062, 0, 0, 0, 0, 0, 0, -2.703919414162327062, 0, 5.407838828324654124, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 1.770130769779930531, 0, 0, 0, 0, 0, 0, 1.770130769779930531, 0, -3.540261539559861062, 0, 0, 0, 0, 0, 0, 0, + 0, 0.885065384889965265, 0, 0, 0, 0, 0.590043589926643510, 0, -7.080523079119722124, 0, 0, 0, 0, 0, 0, -0.295021794963321755, 0, 2.360174359706574041, 0, 0, 0, + + 0, -0.442532692444982632, 0, 0, 0, 0, -0.295021794963321755, 0, 3.540261539559861062, 0, 0, 0, 0, 0, 0, 0.147510897481660877, 0, -1.180087179853287020, 0, 0, 0, + 0, 0, 0, 0, 5.310392309339791593, 0, 0, 0, 0, 0, 0, -5.310392309339791593, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -1.770130769779930531, 0, 0, 0, 0, 0, 0, 1.770130769779930531, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2.212663462224913163, 0, 0, 0, 0, 4.425326924449826327, 0, 0, 0, 0, 0, 0, 0, 0, -0.442532692444982632, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2.320661017204290803, 0, 0, 0, 0, 4.641322034408581606, 0, 0, 0, 0, 0, 0, 0, 0, -0.464132203440858160, 0, 0, 0, 0, 0, + + 0, -0.699705623606466358, 0, 0, 0, 0, 1.399411247212932717, 0, 0, 0, 0, 0, 0, 0, 0, -0.139941124721293271, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5.597644988851730871, 0, 0, 0, 0, 0, 0, 5.597644988851730871, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -2.503342941796704538, 0, 0, 0, 0, 0, 0, 2.503342941796704538, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.938753603173764201, 0, 0, 0, 0, 0.625835735449176134, 0, -7.510028825390113615, 0, 0, 0, 0, 0, 0, -0.312917867724588067, 0, 2.503342941796704538, 0, 0, 0, + + 0, 0.541989645495103885, 0, 0, 0, 0, 0.361326430330069256, 0, -4.335917163960831083, 0, 0, 0, 0, 0, 0, -0.180663215165034628, 0, 1.445305721320277027, 0, 0, 0, + 0, 0, 0, 0, 2.890611442640554055, 0, 0, 0, 0, 0, 0, 2.890611442640554055, 0, -5.781222885281108110, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 2.043970952866564726, 0, 0, 0, 0, 0, 0, 2.043970952866564726, 0, -4.087941905733129453, 0, 0, 0, 0, 0, 0, 0, + 0, -0.255496369108320590, 0, 0, 0, 0, -0.510992738216641181, 0, 3.065956429299847090, 0, 0, 0, 0, 0, 0, -0.255496369108320590, 0, 3.065956429299847090, 0, -2.043970952866564726, 0, + + 0, -0.215933843419584674, 0, 0, 0, 0, -0.431867686839169349, 0, 2.591206121035016094, 0, 0, 0, 0, 0, 0, -0.215933843419584674, 0, 2.591206121035016094, 0, -1.727470747356677396, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.215933843419584674, 0, 0, 0, 0, -0.431867686839169349, 0, 2.591206121035016094, 0, 0, 0, 0, 0, 0, -0.215933843419584674, 0, 2.591206121035016094, 0, -1.727470747356677396, 0, + + 0, -0.255496369108320590, 0, 0, 0, 0, -0.510992738216641181, 0, 3.065956429299847090, 0, 0, 0, 0, 0, 0, -0.255496369108320590, 0, 3.065956429299847090, 0, -2.043970952866564726, 0, + 0, 0, 0, 0, -2.043970952866564726, 0, 0, 0, 0, 0, 0, -2.043970952866564726, 0, 4.087941905733129453, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -2.890611442640554055, 0, 0, 0, 0, 0, 0, -2.890611442640554055, 0, 5.781222885281108110, 0, 0, 0, 0, 0, 0, 0, + 0, 0.541989645495103885, 0, 0, 0, 0, 0.361326430330069256, 0, -4.335917163960831083, 0, 0, 0, 0, 0, 0, -0.180663215165034628, 0, 1.445305721320277027, 0, 0, 0, + + 0, 0.938753603173764201, 0, 0, 0, 0, 0.625835735449176134, 0, -7.510028825390113615, 0, 0, 0, 0, 0, 0, -0.312917867724588067, 0, 2.503342941796704538, 0, 0, 0, + 0, 0, 0, 0, 2.503342941796704538, 0, 0, 0, 0, 0, 0, -2.503342941796704538, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 5.597644988851730871, 0, 0, 0, 0, 0, 0, -5.597644988851730871, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.699705623606466358, 0, 0, 0, 0, 1.399411247212932717, 0, 0, 0, 0, 0, 0, 0, 0, -0.139941124721293271, 0, 0, 0, 0, 0, + + 0, -2.320661017204290803, 0, 0, 0, 0, 4.641322034408581606, 0, 0, 0, 0, 0, 0, 0, 0, -0.464132203440858160, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 2.7847932206451498, 0, 0, 0, 0, -9.2826440688171665, 0, 0, 0, 0, 0, 0, 0, 0, 2.7847932206451498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2.3206610172042916, 0, 0, 0, 0, 0, 0, 4.6413220344085833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4641322034408583, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 7.6967618596711320, 0, 0, 0, 0, 0, 0, -15.3935237193422640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.5393523719342264, 0, 0, 0, 0, 0, + 0, 0.5597644988851730, 0, 0, 0, 0, 0, 0, -5.5976449888517319, 0, 0, 0, 0, 0, 0, -0.5597644988851730, 0, 5.5976449888517319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.2516714708983521, 0, 0, 0, 0, 0, 0, 12.5167147089835247, 0, 0, 0, 0, 0, 0, 1.2516714708983521, 0, -12.5167147089835247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2.8162608095212929, 0, 0, 0, 0, 0, 0, 1.8775072063475287, 0, -7.5100288253901146, 0, 0, 0, 0, 0, 0, 0, 0, -0.9387536031737643, 0, 2.5033429417967050, 0, 0, 0, + + 0, 0, 0, 0, -4.8779068094559346, 0, 0, 0, 0, 0, 0, -3.2519378729706236, 0, 13.0077514918824946, 0, 0, 0, 0, 0, 0, 0, 0, 1.6259689364853118, 0, -4.3359171639608318, 0, 0, 0, + 0, -0.3613264303300693, 0, 0, 0, 0, -0.7226528606601387, 0, 5.7812228852811094, 0, 0, 0, 0, 0, 0, -0.3613264303300693, 0, 5.7812228852811094, 0, -5.7812228852811094, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.5109927382166413, 0, 0, 0, 0, 1.0219854764332825, 0, -8.1758838114662602, 0, 0, 0, 0, 0, 0, 0.5109927382166413, 0, -8.1758838114662602, 0, 8.1758838114662602, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1.2774818455416030, 0, 0, 0, 0, 0, 0, -2.5549636910832061, 0, 5.1099273821664122, 0, 0, 0, 0, 0, 0, 0, 0, -1.2774818455416030, 0, 5.1099273821664122, 0, -2.0439709528665646, 0, + + 0, 0, 0, 0, 1.5115369039370925, 0, 0, 0, 0, 0, 0, 3.0230738078741850, 0, -6.0461476157483700, 0, 0, 0, 0, 0, 0, 0, 0, 1.5115369039370925, 0, -6.0461476157483700, 0, 2.4184590462993478, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1.5115369039370925, 0, 0, 0, 0, 0, 0, -3.0230738078741850, 0, 6.0461476157483700, 0, 0, 0, 0, 0, 0, 0, 0, -1.5115369039370925, 0, 6.0461476157483700, 0, -2.4184590462993478, 0, + + 0, 0, 0, 0, 1.2774818455416030, 0, 0, 0, 0, 0, 0, 2.5549636910832061, 0, -5.1099273821664122, 0, 0, 0, 0, 0, 0, 0, 0, 1.2774818455416030, 0, -5.1099273821664122, 0, 2.0439709528665646, 0, + 0, 0.5109927382166413, 0, 0, 0, 0, 1.0219854764332825, 0, -8.1758838114662602, 0, 0, 0, 0, 0, 0, 0.5109927382166413, 0, -8.1758838114662602, 0, 8.1758838114662602, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.3613264303300693, 0, 0, 0, 0, -0.7226528606601387, 0, 5.7812228852811094, 0, 0, 0, 0, 0, 0, -0.3613264303300693, 0, 5.7812228852811094, 0, -5.7812228852811094, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4.8779068094559346, 0, 0, 0, 0, 0, 0, 3.2519378729706236, 0, -13.0077514918824946, 0, 0, 0, 0, 0, 0, 0, 0, -1.6259689364853118, 0, 4.3359171639608318, 0, 0, 0, + + 0, 0, 0, 0, -2.8162608095212929, 0, 0, 0, 0, 0, 0, -1.8775072063475287, 0, 7.5100288253901146, 0, 0, 0, 0, 0, 0, 0, 0, 0.9387536031737643, 0, -2.5033429417967050, 0, 0, 0, + 0, -1.2516714708983521, 0, 0, 0, 0, 0, 0, 12.5167147089835247, 0, 0, 0, 0, 0, 0, 1.2516714708983521, 0, -12.5167147089835247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.5597644988851730, 0, 0, 0, 0, 0, 0, -5.5976449888517319, 0, 0, 0, 0, 0, 0, -0.5597644988851730, 0, 5.5976449888517319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7.6967618596711320, 0, 0, 0, 0, 0, 0, 15.3935237193422640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.5393523719342264, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 2.3206610172042916, 0, 0, 0, 0, 0, 0, -4.6413220344085833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4641322034408583, 0, 0, 0, 0, 0, + 0, 2.7847932206451498, 0, 0, 0, 0, -9.2826440688171665, 0, 0, 0, 0, 0, 0, 0, 0, 2.7847932206451498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2.8985046814803979, 0, 0, 0, 0, 9.6616822716013271, 0, 0, 0, 0, 0, 0, 0, 0, -2.8985046814803979, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.8039005577884609, 0, 0, 0, 0, 2.6796685259615369, 0, 0, 0, 0, 0, 0, 0, 0, -0.8039005577884609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8.0390055778846108, 0, 0, 0, 0, 0, 0, 16.0780111557692216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.6078011155769223, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -3.2819102842008516, 0, 0, 0, 0, 0, 0, 6.5638205684017032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.6563820568401703, 0, 0, 0, 0, 0, + 0, 1.3127641136803401, 0, 0, 0, 0, 0, 0, -13.1276411368034029, 0, 0, 0, 0, 0, 0, -1.3127641136803401, 0, 13.1276411368034029, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.6855686991966986, 0, 0, 0, 0, 0, 0, -6.8556869919669872, 0, 0, 0, 0, 0, 0, -0.6855686991966986, 0, 6.8556869919669872, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5.1417652439752395, 0, 0, 0, 0, 0, 0, 3.4278434959834931, 0, -13.7113739839339726, 0, 0, 0, 0, 0, 0, 0, 0, -1.7139217479917466, 0, 4.5704579946446584, 0, 0, 0, + + 0, 0, 0, 0, 3.2519378729706232, 0, 0, 0, 0, 0, 0, 2.1679585819804159, 0, -8.6718343279216636, 0, 0, 0, 0, 0, 0, 0, 0, -1.0839792909902080, 0, 2.8906114426405547, 0, 0, 0, + 0, -0.5419896454951040, 0, 0, 0, 0, -1.0839792909902080, 0, 8.6718343279216636, 0, 0, 0, 0, 0, 0, -0.5419896454951040, 0, 8.6718343279216636, 0, -8.6718343279216636, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.4039752301426884, 0, 0, 0, 0, -0.8079504602853768, 0, 6.4636036822830141, 0, 0, 0, 0, 0, 0, -0.4039752301426884, 0, 6.4636036822830141, 0, -6.4636036822830141, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1.6159009205707533, 0, 0, 0, 0, 0, 0, -3.2318018411415066, 0, 6.4636036822830132, 0, 0, 0, 0, 0, 0, 0, 0, -1.6159009205707533, 0, 6.4636036822830132, 0, -2.5854414729132049, 0, + + 0, 0, 0, 0, -1.3994112472129328, 0, 0, 0, 0, 0, 0, -2.7988224944258655, 0, 5.5976449888517310, 0, 0, 0, 0, 0, 0, 0, 0, -1.3994112472129328, 0, 5.5976449888517310, 0, -2.2390579955406920, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1.3994112472129328, 0, 0, 0, 0, 0, 0, -2.7988224944258655, 0, 5.5976449888517310, 0, 0, 0, 0, 0, 0, 0, 0, -1.3994112472129328, 0, 5.5976449888517310, 0, -2.2390579955406920, 0, + + 0, 0, 0, 0, -1.6159009205707533, 0, 0, 0, 0, 0, 0, -3.2318018411415066, 0, 6.4636036822830132, 0, 0, 0, 0, 0, 0, 0, 0, -1.6159009205707533, 0, 6.4636036822830132, 0, -2.5854414729132049, 0, + 0, 0.4039752301426884, 0, 0, 0, 0, 0.8079504602853768, 0, -6.4636036822830141, 0, 0, 0, 0, 0, 0, 0.4039752301426884, 0, -6.4636036822830141, 0, 6.4636036822830141, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.5419896454951040, 0, 0, 0, 0, 1.0839792909902080, 0, -8.6718343279216636, 0, 0, 0, 0, 0, 0, 0.5419896454951040, 0, -8.6718343279216636, 0, 8.6718343279216636, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3.2519378729706232, 0, 0, 0, 0, 0, 0, 2.1679585819804159, 0, -8.6718343279216636, 0, 0, 0, 0, 0, 0, 0, 0, -1.0839792909902080, 0, 2.8906114426405547, 0, 0, 0, + + 0, 0, 0, 0, 5.1417652439752395, 0, 0, 0, 0, 0, 0, 3.4278434959834931, 0, -13.7113739839339726, 0, 0, 0, 0, 0, 0, 0, 0, -1.7139217479917466, 0, 4.5704579946446584, 0, 0, 0, + 0, -0.6855686991966986, 0, 0, 0, 0, 0, 0, 6.8556869919669872, 0, 0, 0, 0, 0, 0, 0.6855686991966986, 0, -6.8556869919669872, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.3127641136803401, 0, 0, 0, 0, 0, 0, 13.1276411368034029, 0, 0, 0, 0, 0, 0, 1.3127641136803401, 0, -13.1276411368034029, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3.2819102842008516, 0, 0, 0, 0, 0, 0, 6.5638205684017032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.6563820568401703, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -8.0390055778846108, 0, 0, 0, 0, 0, 0, 16.0780111557692216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.6078011155769223, 0, 0, 0, 0, 0, + 0, 0.8039005577884609, 0, 0, 0, 0, -2.6796685259615369, 0, 0, 0, 0, 0, 0, 0, 0, 0.8039005577884609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 2.8985046814803979, 0, 0, 0, 0, -9.6616822716013271, 0, 0, 0, 0, 0, 0, 0, 0, 2.8985046814803979, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 3.3815887950604644, 0, 0, 0, 0, -16.9079439753023237, 0, 0, 0, 0, 0, 0, 0, 0, 10.1447663851813932, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.4830841135800663, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2.8985046814803970, 0, 0, 0, 0, 0, 0, 9.6616822716013235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.8985046814803970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 10.4507072512499910, 0, 0, 0, 0, 0, 0, -34.8356908374999676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.4507072512499910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.6699171314903840, 0, 0, 0, 0, -0.6699171314903840, 0, -8.0390055778846072, 0, 0, 0, 0, 0, 0, -1.2058508366826914, 0, 16.0780111557692145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1339834262980768, 0, -1.6078011155769216, 0, 0, 0, 0, 0, + + 0, -1.6409551421004256, 0, 0, 0, 0, 1.6409551421004256, 0, 19.6914617052051071, 0, 0, 0, 0, 0, 0, 2.9537192557807663, 0, -39.3829234104102142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.3281910284200851, 0, 3.9382923410410213, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3.9382923410410213, 0, 0, 0, 0, 0, 0, 0, 0, -13.1276411368034047, 0, 0, 0, 0, 0, 0, 0, 0, -3.9382923410410213, 0, 13.1276411368034047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -7.5412556911636850, 0, 0, 0, 0, 0, 0, 0, 0, 25.1375189705456172, 0, 0, 0, 0, 0, 0, 0, 0, 7.5412556911636850, 0, -25.1375189705456172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.5141765243975239, 0, 0, 0, 0, -0.8569608739958733, 0, 10.2835304879504772, 0, 0, 0, 0, 0, 0, -0.1713921747991747, 0, 6.8556869919669845, 0, -13.7113739839339726, 0, 0, 0, 0, 0, 0, 0, 0, 0.1713921747991747, 0, -3.4278434959834923, 0, 4.5704579946446575, 0, 0, 0, + + 0, 0.8129844682426559, 0, 0, 0, 0, 1.3549741137377600, 0, -16.2596893648531164, 0, 0, 0, 0, 0, 0, 0.2709948227475520, 0, -10.8397929099020782, 0, 21.6795858198041600, 0, 0, 0, 0, 0, 0, 0, 0, -0.2709948227475520, 0, 5.4198964549510391, 0, -7.2265286066013861, 0, 0, 0, + 0, 0, 0, 0, -2.7099482274755200, 0, 0, 0, 0, 0, 0, -5.4198964549510400, 0, 14.4530572132027721, 0, 0, 0, 0, 0, 0, 0, 0, -2.7099482274755200, 0, 14.4530572132027721, 0, -8.6718343279216654, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 3.6357770712841964, 0, 0, 0, 0, 0, 0, 7.2715541425683927, 0, -19.3908110468490449, 0, 0, 0, 0, 0, 0, 0, 0, 3.6357770712841964, 0, -19.3908110468490449, 0, 11.6344866281094284, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.2019876150713442, 0, 0, 0, 0, 0.6059628452140327, 0, -4.8477027617122603, 0, 0, 0, 0, 0, 0, 0.6059628452140327, 0, -9.6954055234245207, 0, 9.6954055234245207, 0, 0, 0, 0, 0, 0, 0, 0, 0.2019876150713442, 0, -4.8477027617122603, 0, 9.6954055234245207, 0, -2.5854414729132063, 0, + + 0, -0.2332352078688221, 0, 0, 0, 0, -0.6997056236064664, 0, 5.5976449888517301, 0, 0, 0, 0, 0, 0, -0.6997056236064664, 0, 11.1952899777034602, 0, -11.1952899777034602, 0, 0, 0, 0, 0, 0, 0, 0, -0.2332352078688221, 0, 5.5976449888517301, 0, -11.1952899777034602, 0, 2.9854106607209236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.2332352078688221, 0, 0, 0, 0, 0.6997056236064664, 0, -5.5976449888517301, 0, 0, 0, 0, 0, 0, 0.6997056236064664, 0, -11.1952899777034602, 0, 11.1952899777034602, 0, 0, 0, 0, 0, 0, 0, 0, 0.2332352078688221, 0, -5.5976449888517301, 0, 11.1952899777034602, 0, -2.9854106607209236, 0, + + 0, -0.2019876150713442, 0, 0, 0, 0, -0.6059628452140327, 0, 4.8477027617122603, 0, 0, 0, 0, 0, 0, -0.6059628452140327, 0, 9.6954055234245207, 0, -9.6954055234245207, 0, 0, 0, 0, 0, 0, 0, 0, -0.2019876150713442, 0, 4.8477027617122603, 0, -9.6954055234245207, 0, 2.5854414729132063, 0, + 0, 0, 0, 0, 3.6357770712841964, 0, 0, 0, 0, 0, 0, 7.2715541425683927, 0, -19.3908110468490449, 0, 0, 0, 0, 0, 0, 0, 0, 3.6357770712841964, 0, -19.3908110468490449, 0, 11.6344866281094284, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -2.7099482274755200, 0, 0, 0, 0, 0, 0, -5.4198964549510400, 0, 14.4530572132027721, 0, 0, 0, 0, 0, 0, 0, 0, -2.7099482274755200, 0, 14.4530572132027721, 0, -8.6718343279216654, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.8129844682426559, 0, 0, 0, 0, -1.3549741137377600, 0, 16.2596893648531164, 0, 0, 0, 0, 0, 0, -0.2709948227475520, 0, 10.8397929099020782, 0, -21.6795858198041600, 0, 0, 0, 0, 0, 0, 0, 0, 0.2709948227475520, 0, -5.4198964549510391, 0, 7.2265286066013861, 0, 0, 0, + + 0, 0.5141765243975239, 0, 0, 0, 0, 0.8569608739958733, 0, -10.2835304879504772, 0, 0, 0, 0, 0, 0, 0.1713921747991747, 0, -6.8556869919669845, 0, 13.7113739839339726, 0, 0, 0, 0, 0, 0, 0, 0, -0.1713921747991747, 0, 3.4278434959834923, 0, -4.5704579946446575, 0, 0, 0, + 0, 0, 0, 0, -7.5412556911636850, 0, 0, 0, 0, 0, 0, 0, 0, 25.1375189705456172, 0, 0, 0, 0, 0, 0, 0, 0, 7.5412556911636850, 0, -25.1375189705456172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 3.9382923410410213, 0, 0, 0, 0, 0, 0, 0, 0, -13.1276411368034047, 0, 0, 0, 0, 0, 0, 0, 0, -3.9382923410410213, 0, 13.1276411368034047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1.6409551421004256, 0, 0, 0, 0, -1.6409551421004256, 0, -19.6914617052051071, 0, 0, 0, 0, 0, 0, -2.9537192557807663, 0, 39.3829234104102142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.3281910284200851, 0, -3.9382923410410213, 0, 0, 0, 0, 0, + + 0, -0.6699171314903840, 0, 0, 0, 0, 0.6699171314903840, 0, 8.0390055778846072, 0, 0, 0, 0, 0, 0, 1.2058508366826914, 0, -16.0780111557692145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.1339834262980768, 0, 1.6078011155769216, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10.4507072512499910, 0, 0, 0, 0, 0, 0, -34.8356908374999676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.4507072512499910, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -2.8985046814803970, 0, 0, 0, 0, 0, 0, 9.6616822716013235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.8985046814803970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3.3815887950604644, 0, 0, 0, 0, 16.9079439753023237, 0, 0, 0, 0, 0, 0, 0, 0, -10.1447663851813932, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4830841135800663, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3.5002769449938556, 0, 0, 0, 0, 17.5013847249692773, 0, 0, 0, 0, 0, 0, 0, 0, -10.5008308349815653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5000395635705508, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.9037676210049984, 0, 0, 0, 0, 4.5188381050249919, 0, 0, 0, 0, 0, 0, 0, 0, -2.7113028630149949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1291096601435712, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10.8452114520599796, 0, 0, 0, 0, 0, 0, 36.1507048401999356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.8452114520599796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -4.0991046311514854, 0, 0, 0, 0, 0, 0, 13.6636821038382852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.0991046311514854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1.7079602629797861, 0, 0, 0, 0, -1.7079602629797861, 0, -20.4955231557574322, 0, 0, 0, 0, 0, 0, -3.0743284733636154, 0, 40.9910463115148644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.3415920525959572, 0, -4.0991046311514863, 0, 0, 0, 0, 0, + + 0, 0.8204775710502128, 0, 0, 0, 0, -0.8204775710502128, 0, -9.8457308526025535, 0, 0, 0, 0, 0, 0, -1.4768596278903832, 0, 19.6914617052051071, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1640955142100426, 0, -1.9691461705205107, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7.8765846820820427, 0, 0, 0, 0, 0, 0, 0, 0, -26.2552822736068094, 0, 0, 0, 0, 0, 0, 0, 0, -7.8765846820820427, 0, 26.2552822736068094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 4.5475482864949495, 0, 0, 0, 0, 0, 0, 0, 0, -15.1584942883164988, 0, 0, 0, 0, 0, 0, 0, 0, -4.5475482864949495, 0, 15.1584942883164988, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.8526653037178029, 0, 0, 0, 0, -1.4211088395296716, 0, 17.0533060743560583, 0, 0, 0, 0, 0, 0, -0.2842217679059343, 0, 11.3688707162373710, 0, -22.7377414324747456, 0, 0, 0, 0, 0, 0, 0, 0, 0.2842217679059343, 0, -5.6844353581186855, 0, 7.5792471441582485, 0, 0, 0, + + 0, -0.5748668304937213, 0, 0, 0, 0, -0.9581113841562022, 0, 11.4973366098744254, 0, 0, 0, 0, 0, 0, -0.1916222768312404, 0, 7.6648910732496169, 0, -15.3297821464992357, 0, 0, 0, 0, 0, 0, 0, 0, 0.1916222768312404, 0, -3.8324455366248085, 0, 5.1099273821664122, 0, 0, 0, + 0, 0, 0, 0, -3.8324455366248107, 0, 0, 0, 0, 0, 0, -7.6648910732496214, 0, 20.4397095286656523, 0, 0, 0, 0, 0, 0, 0, 0, -3.8324455366248107, 0, 20.4397095286656523, 0, -12.2638257171993938, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -2.9685995477189673, 0, 0, 0, 0, 0, 0, -5.9371990954379346, 0, 15.8325309211678249, 0, 0, 0, 0, 0, 0, 0, 0, -2.9685995477189673, 0, 15.8325309211678249, 0, -9.4995185527006960, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.2473832956432473, 0, 0, 0, 0, 0.7421498869297418, 0, -5.9371990954379337, 0, 0, 0, 0, 0, 0, 0.7421498869297418, 0, -11.8743981908758673, 0, 11.8743981908758673, 0, 0, 0, 0, 0, 0, 0, 0, 0.2473832956432473, 0, -5.9371990954379337, 0, 11.8743981908758673, 0, -3.1665061842335653, 0, + + 0, 0.2181715595945335, 0, 0, 0, 0, 0.6545146787836006, 0, -5.2361174302688038, 0, 0, 0, 0, 0, 0, 0.6545146787836006, 0, -10.4722348605376077, 0, 10.4722348605376077, 0, 0, 0, 0, 0, 0, 0, 0, 0.2181715595945335, 0, -5.2361174302688038, 0, 10.4722348605376077, 0, -2.7925959628100294, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.2181715595945335, 0, 0, 0, 0, 0.6545146787836006, 0, -5.2361174302688038, 0, 0, 0, 0, 0, 0, 0.6545146787836006, 0, -10.4722348605376077, 0, 10.4722348605376077, 0, 0, 0, 0, 0, 0, 0, 0, 0.2181715595945335, 0, -5.2361174302688038, 0, 10.4722348605376077, 0, -2.7925959628100294, 0, + + 0, 0.2473832956432473, 0, 0, 0, 0, 0.7421498869297418, 0, -5.9371990954379337, 0, 0, 0, 0, 0, 0, 0.7421498869297418, 0, -11.8743981908758673, 0, 11.8743981908758673, 0, 0, 0, 0, 0, 0, 0, 0, 0.2473832956432473, 0, -5.9371990954379337, 0, 11.8743981908758673, 0, -3.1665061842335653, 0, + 0, 0, 0, 0, 2.9685995477189673, 0, 0, 0, 0, 0, 0, 5.9371990954379346, 0, -15.8325309211678249, 0, 0, 0, 0, 0, 0, 0, 0, 2.9685995477189673, 0, -15.8325309211678249, 0, 9.4995185527006960, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 3.8324455366248107, 0, 0, 0, 0, 0, 0, 7.6648910732496214, 0, -20.4397095286656523, 0, 0, 0, 0, 0, 0, 0, 0, 3.8324455366248107, 0, -20.4397095286656523, 0, 12.2638257171993938, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.5748668304937213, 0, 0, 0, 0, -0.9581113841562022, 0, 11.4973366098744254, 0, 0, 0, 0, 0, 0, -0.1916222768312404, 0, 7.6648910732496169, 0, -15.3297821464992357, 0, 0, 0, 0, 0, 0, 0, 0, 0.1916222768312404, 0, -3.8324455366248085, 0, 5.1099273821664122, 0, 0, 0, + + 0, -0.8526653037178029, 0, 0, 0, 0, -1.4211088395296716, 0, 17.0533060743560583, 0, 0, 0, 0, 0, 0, -0.2842217679059343, 0, 11.3688707162373710, 0, -22.7377414324747456, 0, 0, 0, 0, 0, 0, 0, 0, 0.2842217679059343, 0, -5.6844353581186855, 0, 7.5792471441582485, 0, 0, 0, + 0, 0, 0, 0, -4.5475482864949495, 0, 0, 0, 0, 0, 0, 0, 0, 15.1584942883164988, 0, 0, 0, 0, 0, 0, 0, 0, 4.5475482864949495, 0, -15.1584942883164988, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -7.8765846820820427, 0, 0, 0, 0, 0, 0, 0, 0, 26.2552822736068094, 0, 0, 0, 0, 0, 0, 0, 0, 7.8765846820820427, 0, -26.2552822736068094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.8204775710502128, 0, 0, 0, 0, -0.8204775710502128, 0, -9.8457308526025535, 0, 0, 0, 0, 0, 0, -1.4768596278903832, 0, 19.6914617052051071, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1640955142100426, 0, -1.9691461705205107, 0, 0, 0, 0, 0, + + 0, 1.7079602629797861, 0, 0, 0, 0, -1.7079602629797861, 0, -20.4955231557574322, 0, 0, 0, 0, 0, 0, -3.0743284733636154, 0, 40.9910463115148644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.3415920525959572, 0, -4.0991046311514863, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4.0991046311514854, 0, 0, 0, 0, 0, 0, -13.6636821038382852, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.0991046311514854, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 10.8452114520599796, 0, 0, 0, 0, 0, 0, -36.1507048401999356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.8452114520599796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.9037676210049984, 0, 0, 0, 0, 4.5188381050249919, 0, 0, 0, 0, 0, 0, 0, 0, -2.7113028630149949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.1291096601435712, 0, 0, 0, 0, 0, 0, 0, + + 0, -3.5002769449938556, 0, 0, 0, 0, 17.5013847249692773, 0, 0, 0, 0, 0, 0, 0, 0, -10.5008308349815653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5000395635705508, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 4.00031650856440531, 0, 0, 0, 0, -28.0022155599508372, 0, 0, 0, 0, 0, 0, 0, 0, 28.0022155599508372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.00031650856440531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3.50027694499385465, 0, 0, 0, 0, 0, 0, 17.5013847249692732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.5008308349815639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.500039563570550664, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 13.5565143150749737, 0, 0, 0, 0, 0, 0, -67.7825715753748683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40.669542945224921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.93664490215356767, 0, 0, 0, 0, 0, 0, 0, + 0, 0.774657960861427067, 0, 0, 0, 0, -1.80753524200999649, 0, -10.8452114520599789, 0, 0, 0, 0, 0, 0, -1.80753524200999649, 0, 36.1507048401999298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.774657960861427067, 0, -10.8452114520599789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -2.04955231557574297, 0, 0, 0, 0, 4.78228873634340025, 0, 28.6937324180604015, 0, 0, 0, 0, 0, 0, 4.78228873634340025, 0, -95.6457747268680051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.04955231557574297, 0, 28.6937324180604015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5.12388078893935741, 0, 0, 0, 0, 0, 0, -5.12388078893935741, 0, -20.4955231557574297, 0, 0, 0, 0, 0, 0, 0, 0, -9.22298542009084335, 0, 40.9910463115148593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.02477615778787148, 0, -4.09910463115148593, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -10.6662084236527642, 0, 0, 0, 0, 0, 0, 10.6662084236527642, 0, 42.6648336946110567, 0, 0, 0, 0, 0, 0, 0, 0, 19.1991751625749755, 0, -85.3296673892221134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.13324168473055283, 0, 8.53296673892221134, 0, 0, 0, 0, 0, + 0, -0.656382056840170103, 0, 0, 0, 0, -0.656382056840170103, 0, 15.7531693641640825, 0, 0, 0, 0, 0, 0, 0.656382056840170103, 0, 0, 0, -26.2552822736068041, 0, 0, 0, 0, 0, 0, 0, 0, 0.656382056840170103, 0, -15.7531693641640825, 0, 26.2552822736068041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.13688707162373734, 0, 0, 0, 0, 1.13688707162373734, 0, -27.2852897189696963, 0, 0, 0, 0, 0, 0, -1.13688707162373734, 0, 0, 0, 45.4754828649494938, 0, 0, 0, 0, 0, 0, 0, 0, -1.13688707162373734, 0, 27.2852897189696963, 0, -45.4754828649494938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4.26332651858901504, 0, 0, 0, 0, 0, 0, -7.1055441976483584, 0, 28.4221767905934336, 0, 0, 0, 0, 0, 0, 0, 0, -1.42110883952967168, 0, 18.9481178603956224, 0, -22.7377414324747469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.42110883952967168, 0, -9.47405893019781121, 0, 7.57924714415824896, 0, 0, 0, + + 0, 0, 0, 0, 6.32353513543093462, 0, 0, 0, 0, 0, 0, 10.5392252257182244, 0, -42.1569009028728975, 0, 0, 0, 0, 0, 0, 0, 0, 2.10784504514364487, 0, -28.104600601915265, 0, 33.725520722298318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.10784504514364487, 0, 14.0523003009576325, 0, -11.241840240766106, 0, 0, 0, + 0, 0.383244553662480886, 0, 0, 0, 0, 1.14973366098744266, 0, -11.4973366098744266, 0, 0, 0, 0, 0, 0, 1.14973366098744266, 0, -22.9946732197488532, 0, 30.6595642929984709, 0, 0, 0, 0, 0, 0, 0, 0, 0.383244553662480886, 0, -11.4973366098744266, 0, 30.6595642929984709, 0, -12.2638257171993884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.49476659128649439, 0, 0, 0, 0, -1.48429977385948317, 0, 14.8429977385948317, 0, 0, 0, 0, 0, 0, -1.48429977385948317, 0, 29.6859954771896634, 0, -39.5813273029195512, 0, 0, 0, 0, 0, 0, 0, 0, -0.49476659128649439, 0, 14.8429977385948317, 0, -39.5813273029195512, 0, 15.8325309211678205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1.73168306950273036, 0, 0, 0, 0, 0, 0, 5.19504920850819109, 0, -13.8534645560218429, 0, 0, 0, 0, 0, 0, 0, 0, 5.19504920850819109, 0, -27.7069291120436858, 0, 16.6241574672262115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.73168306950273036, 0, -13.8534645560218429, 0, 16.6241574672262115, 0, -3.16650618423356409, 0, + + 0, 0, 0, 0, -1.96354403635080146, 0, 0, 0, 0, 0, 0, -5.89063210905240439, 0, 15.7083522908064117, 0, 0, 0, 0, 0, 0, 0, 0, -5.89063210905240439, 0, 31.4167045816128234, 0, -18.850022748967694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.96354403635080146, 0, 15.7083522908064117, 0, -18.850022748967694, 0, 3.5904805236128941, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1.96354403635080146, 0, 0, 0, 0, 0, 0, 5.89063210905240439, 0, -15.7083522908064117, 0, 0, 0, 0, 0, 0, 0, 0, 5.89063210905240439, 0, -31.4167045816128234, 0, 18.850022748967694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.96354403635080146, 0, -15.7083522908064117, 0, 18.850022748967694, 0, -3.5904805236128941, 0, + + 0, 0, 0, 0, -1.73168306950273036, 0, 0, 0, 0, 0, 0, -5.19504920850819109, 0, 13.8534645560218429, 0, 0, 0, 0, 0, 0, 0, 0, -5.19504920850819109, 0, 27.7069291120436858, 0, -16.6241574672262115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.73168306950273036, 0, 13.8534645560218429, 0, -16.6241574672262115, 0, 3.16650618423356409, 0, + 0, -0.49476659128649439, 0, 0, 0, 0, -1.48429977385948317, 0, 14.8429977385948317, 0, 0, 0, 0, 0, 0, -1.48429977385948317, 0, 29.6859954771896634, 0, -39.5813273029195512, 0, 0, 0, 0, 0, 0, 0, 0, -0.49476659128649439, 0, 14.8429977385948317, 0, -39.5813273029195512, 0, 15.8325309211678205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.383244553662480886, 0, 0, 0, 0, 1.14973366098744266, 0, -11.4973366098744266, 0, 0, 0, 0, 0, 0, 1.14973366098744266, 0, -22.9946732197488532, 0, 30.6595642929984709, 0, 0, 0, 0, 0, 0, 0, 0, 0.383244553662480886, 0, -11.4973366098744266, 0, 30.6595642929984709, 0, -12.2638257171993884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6.32353513543093462, 0, 0, 0, 0, 0, 0, -10.5392252257182244, 0, 42.1569009028728975, 0, 0, 0, 0, 0, 0, 0, 0, -2.10784504514364487, 0, 28.104600601915265, 0, -33.725520722298318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.10784504514364487, 0, -14.0523003009576325, 0, 11.241840240766106, 0, 0, 0, + + 0, 0, 0, 0, 4.26332651858901504, 0, 0, 0, 0, 0, 0, 7.1055441976483584, 0, -28.4221767905934336, 0, 0, 0, 0, 0, 0, 0, 0, 1.42110883952967168, 0, -18.9481178603956224, 0, 22.7377414324747469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.42110883952967168, 0, 9.47405893019781121, 0, -7.57924714415824896, 0, 0, 0, + 0, 1.13688707162373734, 0, 0, 0, 0, 1.13688707162373734, 0, -27.2852897189696963, 0, 0, 0, 0, 0, 0, -1.13688707162373734, 0, 0, 0, 45.4754828649494938, 0, 0, 0, 0, 0, 0, 0, 0, -1.13688707162373734, 0, 27.2852897189696963, 0, -45.4754828649494938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.656382056840170103, 0, 0, 0, 0, -0.656382056840170103, 0, 15.7531693641640825, 0, 0, 0, 0, 0, 0, 0.656382056840170103, 0, 0, 0, -26.2552822736068041, 0, 0, 0, 0, 0, 0, 0, 0, 0.656382056840170103, 0, -15.7531693641640825, 0, 26.2552822736068041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10.6662084236527642, 0, 0, 0, 0, 0, 0, -10.6662084236527642, 0, -42.6648336946110567, 0, 0, 0, 0, 0, 0, 0, 0, -19.1991751625749755, 0, 85.3296673892221134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.13324168473055283, 0, -8.53296673892221134, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -5.12388078893935741, 0, 0, 0, 0, 0, 0, 5.12388078893935741, 0, 20.4955231557574297, 0, 0, 0, 0, 0, 0, 0, 0, 9.22298542009084335, 0, -40.9910463115148593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.02477615778787148, 0, 4.09910463115148593, 0, 0, 0, 0, 0, + 0, -2.04955231557574297, 0, 0, 0, 0, 4.78228873634340025, 0, 28.6937324180604015, 0, 0, 0, 0, 0, 0, 4.78228873634340025, 0, -95.6457747268680051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.04955231557574297, 0, 28.6937324180604015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.774657960861427067, 0, 0, 0, 0, -1.80753524200999649, 0, -10.8452114520599789, 0, 0, 0, 0, 0, 0, -1.80753524200999649, 0, 36.1507048401999298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.774657960861427067, 0, -10.8452114520599789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13.5565143150749737, 0, 0, 0, 0, 0, 0, 67.7825715753748683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40.669542945224921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.93664490215356767, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 3.50027694499385465, 0, 0, 0, 0, 0, 0, -17.5013847249692732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.5008308349815639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.500039563570550664, 0, 0, 0, 0, 0, 0, 0, + 0, 4.00031650856440531, 0, 0, 0, 0, -28.0022155599508372, 0, 0, 0, 0, 0, 0, 0, 0, 28.0022155599508372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.00031650856440531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4.12343187517827448, 0, 0, 0, 0, 28.8640231262479213, 0, 0, 0, 0, 0, 0, 0, 0, -28.8640231262479213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.12343187517827448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.00007912714110133, 0, 0, 0, 0, 7.0005538899877093, 0, 0, 0, 0, 0, 0, 0, 0, -7.0005538899877093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.00007912714110133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14.0011077799754186, 0, 0, 0, 0, 0, 0, 70.005538899877093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42.0033233399262558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.00015825428220266, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -4.95013912767217325, 0, 0, 0, 0, 0, 0, 24.7506956383608662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.8504173830165197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.707162732524596178, 0, 0, 0, 0, 0, 0, 0, + 0, 2.12148819757378853, 0, 0, 0, 0, -4.95013912767217325, 0, -29.7008347660330395, 0, 0, 0, 0, 0, 0, -4.95013912767217325, 0, 99.002782553443465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.12148819757378853, 0, -29.7008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.948758364647699116, 0, 0, 0, 0, -2.21376951751129794, 0, -13.2826171050677876, 0, 0, 0, 0, 0, 0, -2.21376951751129794, 0, 44.2753903502259587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.948758364647699116, 0, -13.2826171050677876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 11.0688475875564897, 0, 0, 0, 0, 0, 0, -11.0688475875564897, 0, -44.2753903502259587, 0, 0, 0, 0, 0, 0, 0, 0, -19.9239256576016814, 0, 88.5507807004519175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.21376951751129794, 0, -8.85507807004519175, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 5.91654790557938008, 0, 0, 0, 0, 0, 0, -5.91654790557938008, 0, -23.6661916223175203, 0, 0, 0, 0, 0, 0, 0, 0, -10.6497862300428841, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.18330958111587602, 0, -4.73323832446350406, 0, 0, 0, 0, 0, + 0, -1.18330958111587602, 0, 0, 0, 0, -1.18330958111587602, 0, 28.3994299467810244, 0, 0, 0, 0, 0, 0, 1.18330958111587602, 0, 0, 0, -47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 1.18330958111587602, 0, -28.3994299467810244, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.733857449152875582, 0, 0, 0, 0, -0.733857449152875582, 0, 17.612578779669014, 0, 0, 0, 0, 0, 0, 0.733857449152875582, 0, 0, 0, -29.3542979661150233, 0, 0, 0, 0, 0, 0, 0, 0, 0.733857449152875582, 0, -17.612578779669014, 0, 29.3542979661150233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6.60471704237588023, 0, 0, 0, 0, 0, 0, -11.0078617372931337, 0, 44.0314469491725349, 0, 0, 0, 0, 0, 0, 0, 0, -2.20157234745862674, 0, 29.3542979661150233, 0, -35.2251575593380279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.20157234745862674, 0, -14.6771489830575116, 0, 11.7417191864460093, 0, 0, 0, + + 0, 0, 0, 0, -4.67024020848234288, 0, 0, 0, 0, 0, 0, -7.7837336808039048, 0, 31.1349347232156192, 0, 0, 0, 0, 0, 0, 0, 0, -1.55674673616078096, 0, 20.7566231488104128, 0, -24.9079477785724953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.55674673616078096, 0, -10.3783115744052064, 0, 8.30264925952416512, 0, 0, 0, + 0, 0.51891557872026032, 0, 0, 0, 0, 1.55674673616078096, 0, -15.5674673616078096, 0, 0, 0, 0, 0, 0, 1.55674673616078096, 0, -31.1349347232156192, 0, 41.5132462976208256, 0, 0, 0, 0, 0, 0, 0, 0, 0.51891557872026032, 0, -15.5674673616078096, 0, 41.5132462976208256, 0, -16.6052985190483302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.413951429393932508, 0, 0, 0, 0, 1.24185428818179752, 0, -12.4185428818179752, 0, 0, 0, 0, 0, 0, 1.24185428818179752, 0, -24.8370857636359505, 0, 33.1161143515146006, 0, 0, 0, 0, 0, 0, 0, 0, 0.413951429393932508, 0, -12.4185428818179752, 0, 33.1161143515146006, 0, -13.2464457406058403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2.06975714696966254, 0, 0, 0, 0, 0, 0, 6.20927144090898762, 0, -16.5580571757573003, 0, 0, 0, 0, 0, 0, 0, 0, 6.20927144090898762, 0, -33.1161143515146006, 0, 19.8696686109087604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.06975714696966254, 0, -16.5580571757573003, 0, 19.8696686109087604, 0, -3.78469878303024007, 0, + + 0, 0, 0, 0, 1.85124707101607532, 0, 0, 0, 0, 0, 0, 5.55374121304822595, 0, -14.8099765681286025, 0, 0, 0, 0, 0, 0, 0, 0, 5.55374121304822595, 0, -29.6199531362572051, 0, 17.771971881754323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.85124707101607532, 0, -14.8099765681286025, 0, 17.771971881754323, 0, -3.38513750128653772, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1.85124707101607532, 0, 0, 0, 0, 0, 0, 5.55374121304822595, 0, -14.8099765681286025, 0, 0, 0, 0, 0, 0, 0, 0, 5.55374121304822595, 0, -29.6199531362572051, 0, 17.771971881754323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.85124707101607532, 0, -14.8099765681286025, 0, 17.771971881754323, 0, -3.38513750128653772, 0, + + 0, 0, 0, 0, 2.06975714696966254, 0, 0, 0, 0, 0, 0, 6.20927144090898762, 0, -16.5580571757573003, 0, 0, 0, 0, 0, 0, 0, 0, 6.20927144090898762, 0, -33.1161143515146006, 0, 19.8696686109087604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.06975714696966254, 0, -16.5580571757573003, 0, 19.8696686109087604, 0, -3.78469878303024007, 0, + 0, -0.413951429393932508, 0, 0, 0, 0, -1.24185428818179752, 0, 12.4185428818179752, 0, 0, 0, 0, 0, 0, -1.24185428818179752, 0, 24.8370857636359505, 0, -33.1161143515146006, 0, 0, 0, 0, 0, 0, 0, 0, -0.413951429393932508, 0, 12.4185428818179752, 0, -33.1161143515146006, 0, 13.2464457406058403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.51891557872026032, 0, 0, 0, 0, -1.55674673616078096, 0, 15.5674673616078096, 0, 0, 0, 0, 0, 0, -1.55674673616078096, 0, 31.1349347232156192, 0, -41.5132462976208256, 0, 0, 0, 0, 0, 0, 0, 0, -0.51891557872026032, 0, 15.5674673616078096, 0, -41.5132462976208256, 0, 16.6052985190483302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4.67024020848234288, 0, 0, 0, 0, 0, 0, -7.7837336808039048, 0, 31.1349347232156192, 0, 0, 0, 0, 0, 0, 0, 0, -1.55674673616078096, 0, 20.7566231488104128, 0, -24.9079477785724953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.55674673616078096, 0, -10.3783115744052064, 0, 8.30264925952416512, 0, 0, 0, + + 0, 0, 0, 0, -6.60471704237588023, 0, 0, 0, 0, 0, 0, -11.0078617372931337, 0, 44.0314469491725349, 0, 0, 0, 0, 0, 0, 0, 0, -2.20157234745862674, 0, 29.3542979661150233, 0, -35.2251575593380279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.20157234745862674, 0, -14.6771489830575116, 0, 11.7417191864460093, 0, 0, 0, + 0, 0.733857449152875582, 0, 0, 0, 0, 0.733857449152875582, 0, -17.612578779669014, 0, 0, 0, 0, 0, 0, -0.733857449152875582, 0, 0, 0, 29.3542979661150233, 0, 0, 0, 0, 0, 0, 0, 0, -0.733857449152875582, 0, 17.612578779669014, 0, -29.3542979661150233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.18330958111587602, 0, 0, 0, 0, 1.18330958111587602, 0, -28.3994299467810244, 0, 0, 0, 0, 0, 0, -1.18330958111587602, 0, 0, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, -1.18330958111587602, 0, 28.3994299467810244, 0, -47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5.91654790557938008, 0, 0, 0, 0, 0, 0, -5.91654790557938008, 0, -23.6661916223175203, 0, 0, 0, 0, 0, 0, 0, 0, -10.6497862300428841, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.18330958111587602, 0, -4.73323832446350406, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 11.0688475875564897, 0, 0, 0, 0, 0, 0, -11.0688475875564897, 0, -44.2753903502259587, 0, 0, 0, 0, 0, 0, 0, 0, -19.9239256576016814, 0, 88.5507807004519175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.21376951751129794, 0, -8.85507807004519175, 0, 0, 0, 0, 0, + 0, -0.948758364647699116, 0, 0, 0, 0, 2.21376951751129794, 0, 13.2826171050677876, 0, 0, 0, 0, 0, 0, 2.21376951751129794, 0, -44.2753903502259587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.948758364647699116, 0, 13.2826171050677876, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -2.12148819757378853, 0, 0, 0, 0, 4.95013912767217325, 0, 29.7008347660330395, 0, 0, 0, 0, 0, 0, 4.95013912767217325, 0, -99.002782553443465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.12148819757378853, 0, 29.7008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4.95013912767217325, 0, 0, 0, 0, 0, 0, 24.7506956383608662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.8504173830165197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.707162732524596178, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -14.0011077799754186, 0, 0, 0, 0, 0, 0, 70.005538899877093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42.0033233399262558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.00015825428220266, 0, 0, 0, 0, 0, 0, 0, + 0, 1.00007912714110133, 0, 0, 0, 0, -7.0005538899877093, 0, 0, 0, 0, 0, 0, 0, 0, 7.0005538899877093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.00007912714110133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 4.12343187517827448, 0, 0, 0, 0, -28.8640231262479213, 0, 0, 0, 0, 0, 0, 0, 0, 28.8640231262479213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.12343187517827448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 4.63886085957555879, 0, 0, 0, 0, -43.296034689371882, 0, 0, 0, 0, 0, 0, 0, 0, 64.944052034057823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18.5554434383022352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.51542898439728431, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4.12343187517827448, 0, 0, 0, 0, 0, 0, 28.8640231262479213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -28.8640231262479213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.12343187517827448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 17.0013451613987226, 0, 0, 0, 0, 0, 0, -119.009416129791058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119.009416129791058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.0013451613987226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.875069236248463662, 0, 0, 0, 0, -3.50027694499385465, 0, -14.0011077799754186, 0, 0, 0, 0, 0, 0, -1.75013847249692732, 0, 70.005538899877093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.50019781785275332, 0, -42.0033233399262558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.125009890892637666, 0, 2.00015825428220266, 0, 0, 0, 0, 0, 0, 0, + + 0, -2.47506956383608662, 0, 0, 0, 0, 9.9002782553443465, 0, 39.601113021377386, 0, 0, 0, 0, 0, 0, 4.95013912767217325, 0, -198.00556510688693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.07162732524596178, 0, 118.803339064132158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.353581366262298089, 0, -5.65730186019676943, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6.3644645927213656, 0, 0, 0, 0, 0, 0, -14.8504173830165197, 0, -29.7008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, -14.8504173830165197, 0, 99.002782553443465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.3644645927213656, 0, -29.7008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -14.2313754697154867, 0, 0, 0, 0, 0, 0, 33.2065427626694691, 0, 66.4130855253389381, 0, 0, 0, 0, 0, 0, 0, 0, 33.2065427626694691, 0, -221.376951751129794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.2313754697154867, 0, 66.4130855253389381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.790631970539749263, 0, 0, 0, 0, 0, 0, 22.1376951751129794, 0, 0, 0, 0, 0, 0, 2.21376951751129794, 0, -22.1376951751129794, 0, -44.2753903502259587, 0, 0, 0, 0, 0, 0, 0, 0, 1.26501115286359882, 0, -39.8478513152033629, 0, 88.5507807004519175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.158126394107949853, 0, 4.42753903502259587, 0, -8.85507807004519175, 0, 0, 0, 0, 0, + + 0, 1.47913697639484502, 0, 0, 0, 0, 0, 0, -41.4158353390556606, 0, 0, 0, 0, 0, 0, -4.14158353390556606, 0, 41.4158353390556606, 0, 82.8316706781113211, 0, 0, 0, 0, 0, 0, 0, 0, -2.36661916223175203, 0, 74.548503610300189, 0, -165.663341356222642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.295827395278969004, 0, -8.28316706781113211, 0, 16.5663341356222642, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5.91654790557938008, 0, 0, 0, 0, 0, 0, -5.91654790557938008, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 5.91654790557938008, 0, 0, 0, -47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.91654790557938008, 0, -47.3323832446350406, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 9.54014683898738256, 0, 0, 0, 0, 0, 0, 9.54014683898738256, 0, -76.3211747118990605, 0, 0, 0, 0, 0, 0, 0, 0, -9.54014683898738256, 0, 0, 0, 76.3211747118990605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.54014683898738256, 0, 76.3211747118990605, 0, -76.3211747118990605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.550393086864656686, 0, 0, 0, 0, 1.46771489830575116, 0, -19.8141511271276407, 0, 0, 0, 0, 0, 0, 1.10078617372931337, 0, -33.0235852118794012, 0, 66.0471704237588023, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.60471704237588023, 0, 44.0314469491725349, 0, -35.2251575593380279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.183464362288218895, 0, 6.60471704237588023, 0, -22.0157234745862674, 0, 11.7417191864460093, 0, 0, 0, + + 0, -0.77837336808039048, 0, 0, 0, 0, -2.07566231488104128, 0, 28.0214412508940573, 0, 0, 0, 0, 0, 0, -1.55674673616078096, 0, 46.7024020848234288, 0, -93.4048041696468576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.34048041696468576, 0, -62.2698694464312384, 0, 49.8158955571449907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25945778936013016, 0, -9.34048041696468576, 0, 31.1349347232156192, 0, -16.6052985190483302, 0, 0, 0, + 0, 0, 0, 0, 3.63240905104182224, 0, 0, 0, 0, 0, 0, 10.8972271531254667, 0, -36.3240905104182224, 0, 0, 0, 0, 0, 0, 0, 0, 10.8972271531254667, 0, -72.6481810208364448, 0, 58.1185448166691558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.63240905104182224, 0, -36.3240905104182224, 0, 58.1185448166691558, 0, -16.6052985190483302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -4.55346572333325759, 0, 0, 0, 0, 0, 0, -13.6603971699997728, 0, 45.5346572333325759, 0, 0, 0, 0, 0, 0, 0, 0, -13.6603971699997728, 0, 91.0693144666651517, 0, -72.8554515733321214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.55346572333325759, 0, 45.5346572333325759, 0, -72.8554515733321214, 0, 20.8158433066663204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.206975714696966254, 0, 0, 0, 0, -0.827902858787865016, 0, 8.27902858787865016, 0, 0, 0, 0, 0, 0, -1.24185428818179752, 0, 24.8370857636359505, 0, -33.1161143515146006, 0, 0, 0, 0, 0, 0, 0, 0, -0.827902858787865016, 0, 24.8370857636359505, 0, -66.2322287030292013, 0, 26.4928914812116805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.206975714696966254, 0, 8.27902858787865016, 0, -33.1161143515146006, 0, 26.4928914812116805, 0, -3.78469878303024007, 0, + + 0, 0.231405883877009415, 0, 0, 0, 0, 0.925623535508037658, 0, -9.25623535508037658, 0, 0, 0, 0, 0, 0, 1.38843530326205649, 0, -27.7687060652411297, 0, 37.0249414203215063, 0, 0, 0, 0, 0, 0, 0, 0, 0.925623535508037658, 0, -27.7687060652411297, 0, 74.0498828406430127, 0, -29.6199531362572051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.231405883877009415, 0, -9.25623535508037658, 0, 37.0249414203215063, 0, -29.6199531362572051, 0, 4.23142187660817215, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.231405883877009415, 0, 0, 0, 0, -0.925623535508037658, 0, 9.25623535508037658, 0, 0, 0, 0, 0, 0, -1.38843530326205649, 0, 27.7687060652411297, 0, -37.0249414203215063, 0, 0, 0, 0, 0, 0, 0, 0, -0.925623535508037658, 0, 27.7687060652411297, 0, -74.0498828406430127, 0, 29.6199531362572051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.231405883877009415, 0, 9.25623535508037658, 0, -37.0249414203215063, 0, 29.6199531362572051, 0, -4.23142187660817215, 0, + + 0, 0.206975714696966254, 0, 0, 0, 0, 0.827902858787865016, 0, -8.27902858787865016, 0, 0, 0, 0, 0, 0, 1.24185428818179752, 0, -24.8370857636359505, 0, 33.1161143515146006, 0, 0, 0, 0, 0, 0, 0, 0, 0.827902858787865016, 0, -24.8370857636359505, 0, 66.2322287030292013, 0, -26.4928914812116805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.206975714696966254, 0, -8.27902858787865016, 0, 33.1161143515146006, 0, -26.4928914812116805, 0, 3.78469878303024007, 0, + 0, 0, 0, 0, -4.55346572333325759, 0, 0, 0, 0, 0, 0, -13.6603971699997728, 0, 45.5346572333325759, 0, 0, 0, 0, 0, 0, 0, 0, -13.6603971699997728, 0, 91.0693144666651517, 0, -72.8554515733321214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.55346572333325759, 0, 45.5346572333325759, 0, -72.8554515733321214, 0, 20.8158433066663204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 3.63240905104182224, 0, 0, 0, 0, 0, 0, 10.8972271531254667, 0, -36.3240905104182224, 0, 0, 0, 0, 0, 0, 0, 0, 10.8972271531254667, 0, -72.6481810208364448, 0, 58.1185448166691558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.63240905104182224, 0, -36.3240905104182224, 0, 58.1185448166691558, 0, -16.6052985190483302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.77837336808039048, 0, 0, 0, 0, 2.07566231488104128, 0, -28.0214412508940573, 0, 0, 0, 0, 0, 0, 1.55674673616078096, 0, -46.7024020848234288, 0, 93.4048041696468576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.34048041696468576, 0, 62.2698694464312384, 0, -49.8158955571449907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.25945778936013016, 0, 9.34048041696468576, 0, -31.1349347232156192, 0, 16.6052985190483302, 0, 0, 0, + + 0, -0.550393086864656686, 0, 0, 0, 0, -1.46771489830575116, 0, 19.8141511271276407, 0, 0, 0, 0, 0, 0, -1.10078617372931337, 0, 33.0235852118794012, 0, -66.0471704237588023, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.60471704237588023, 0, -44.0314469491725349, 0, 35.2251575593380279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.183464362288218895, 0, -6.60471704237588023, 0, 22.0157234745862674, 0, -11.7417191864460093, 0, 0, 0, + 0, 0, 0, 0, 9.54014683898738256, 0, 0, 0, 0, 0, 0, 9.54014683898738256, 0, -76.3211747118990605, 0, 0, 0, 0, 0, 0, 0, 0, -9.54014683898738256, 0, 0, 0, 76.3211747118990605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.54014683898738256, 0, 76.3211747118990605, 0, -76.3211747118990605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -5.91654790557938008, 0, 0, 0, 0, 0, 0, -5.91654790557938008, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 5.91654790557938008, 0, 0, 0, -47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.91654790557938008, 0, -47.3323832446350406, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1.47913697639484502, 0, 0, 0, 0, 0, 0, 41.4158353390556606, 0, 0, 0, 0, 0, 0, 4.14158353390556606, 0, -41.4158353390556606, 0, -82.8316706781113211, 0, 0, 0, 0, 0, 0, 0, 0, 2.36661916223175203, 0, -74.548503610300189, 0, 165.663341356222642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.295827395278969004, 0, 8.28316706781113211, 0, -16.5663341356222642, 0, 0, 0, 0, 0, + + 0, 0.790631970539749263, 0, 0, 0, 0, 0, 0, -22.1376951751129794, 0, 0, 0, 0, 0, 0, -2.21376951751129794, 0, 22.1376951751129794, 0, 44.2753903502259587, 0, 0, 0, 0, 0, 0, 0, 0, -1.26501115286359882, 0, 39.8478513152033629, 0, -88.5507807004519175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.158126394107949853, 0, -4.42753903502259587, 0, 8.85507807004519175, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14.2313754697154867, 0, 0, 0, 0, 0, 0, 33.2065427626694691, 0, 66.4130855253389381, 0, 0, 0, 0, 0, 0, 0, 0, 33.2065427626694691, 0, -221.376951751129794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.2313754697154867, 0, 66.4130855253389381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 6.3644645927213656, 0, 0, 0, 0, 0, 0, -14.8504173830165197, 0, -29.7008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, -14.8504173830165197, 0, 99.002782553443465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.3644645927213656, 0, -29.7008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2.47506956383608662, 0, 0, 0, 0, -9.9002782553443465, 0, -39.601113021377386, 0, 0, 0, 0, 0, 0, -4.95013912767217325, 0, 198.00556510688693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.07162732524596178, 0, -118.803339064132158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.353581366262298089, 0, 5.65730186019676943, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.875069236248463662, 0, 0, 0, 0, 3.50027694499385465, 0, 14.0011077799754186, 0, 0, 0, 0, 0, 0, 1.75013847249692732, 0, -70.005538899877093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.50019781785275332, 0, 42.0033233399262558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.125009890892637666, 0, -2.00015825428220266, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17.0013451613987226, 0, 0, 0, 0, 0, 0, -119.009416129791058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119.009416129791058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.0013451613987226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -4.12343187517827448, 0, 0, 0, 0, 0, 0, 28.8640231262479213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -28.8640231262479213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.12343187517827448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4.63886085957555879, 0, 0, 0, 0, 43.296034689371882, 0, 0, 0, 0, 0, 0, 0, 0, -64.944052034057823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18.5554434383022352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.51542898439728431, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4.76597647343204622, 0, 0, 0, 0, 44.4824470853657647, 0, 0, 0, 0, 0, 0, 0, 0, -66.723670628048647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19.0639058937281849, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.52955294149244958, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.0933899902622448, 0, 0, 0, 0, 10.2049732424476182, 0, 0, 0, 0, 0, 0, 0, 0, -15.3074598636714272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.37355996104897921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.121487776695804978, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17.4942398441959169, 0, 0, 0, 0, 0, 0, 122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17.4942398441959169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -5.83141328139863895, 0, 0, 0, 0, 0, 0, 40.8198929697904727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40.8198929697904727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.83141328139863895, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2.55124331061190454, 0, 0, 0, 0, -10.2049732424476182, 0, -40.8198929697904727, 0, 0, 0, 0, 0, 0, -5.10248662122380908, 0, 204.099464848952363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.28926660174829869, 0, -122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.364463330087414934, 0, 5.83141328139863895, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.07173655920786068, 0, 0, 0, 0, -4.28694623683144273, 0, -17.1477849473257709, 0, 0, 0, 0, 0, 0, -2.14347311841572136, 0, 85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.06210445487960195, 0, -51.4433548419773127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.153105222743980097, 0, 2.44968356390368156, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14.6981013834220894, 0, 0, 0, 0, 0, 0, -34.2955698946515418, 0, -68.5911397893030836, 0, 0, 0, 0, 0, 0, 0, 0, -34.2955698946515418, 0, 228.637132631010279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.6981013834220894, 0, -68.5911397893030836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 7.34905069171104468, 0, 0, 0, 0, 0, 0, -17.1477849473257709, 0, -34.2955698946515418, 0, 0, 0, 0, 0, 0, 0, 0, -17.1477849473257709, 0, 114.318566315505139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.34905069171104468, 0, -34.2955698946515418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1.53105222743980097, 0, 0, 0, 0, 0, 0, 42.8694623683144273, 0, 0, 0, 0, 0, 0, 4.28694623683144273, 0, -42.8694623683144273, 0, -85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 2.44968356390368156, 0, -77.1650322629659691, 0, 171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.306210445487960195, 0, 8.57389247366288545, 0, -17.1477849473257709, 0, 0, 0, 0, 0, + + 0, -0.883953415655745223, 0, 0, 0, 0, 0, 0, 24.7506956383608662, 0, 0, 0, 0, 0, 0, 2.47506956383608662, 0, -24.7506956383608662, 0, -49.5013912767217325, 0, 0, 0, 0, 0, 0, 0, 0, 1.41432546504919236, 0, -44.5512521490495592, 0, 99.002782553443465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.176790683131149045, 0, 4.95013912767217325, 0, -9.9002782553443465, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9.9002782553443465, 0, 0, 0, 0, 0, 0, -9.9002782553443465, 0, 79.202226042754772, 0, 0, 0, 0, 0, 0, 0, 0, 9.9002782553443465, 0, 0, 0, -79.202226042754772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.9002782553443465, 0, -79.202226042754772, 0, 79.202226042754772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -6.48125350089154427, 0, 0, 0, 0, 0, 0, -6.48125350089154427, 0, 51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 6.48125350089154427, 0, 0, 0, -51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.48125350089154427, 0, -51.8500280071323542, 0, 51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.810156687611443034, 0, 0, 0, 0, 2.16041783363051476, 0, -29.1656407540119492, 0, 0, 0, 0, 0, 0, 1.62031337522288607, 0, -48.609401256686582, 0, 97.218802513373164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.7218802513373164, 0, 64.8125350089154427, 0, -51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.270052229203814345, 0, 9.7218802513373164, 0, -32.4062675044577213, 0, 17.2833426690441181, 0, 0, 0, + + 0, 0.594492479694352209, 0, 0, 0, 0, 1.58531327918493922, 0, -21.4017292689966795, 0, 0, 0, 0, 0, 0, 1.18898495938870442, 0, -35.6695487816611326, 0, 71.3390975633222651, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.13390975633222651, 0, 47.5593983755481767, 0, -38.0475187004385414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.198164159898117403, 0, 7.13390975633222651, 0, -23.7796991877740884, 0, 12.6825062334795138, 0, 0, 0, + 0, 0, 0, 0, 4.75593983755481767, 0, 0, 0, 0, 0, 0, 14.267819512664453, 0, -47.5593983755481767, 0, 0, 0, 0, 0, 0, 0, 0, 14.267819512664453, 0, -95.1187967510963535, 0, 76.0950374008770828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.75593983755481767, 0, -47.5593983755481767, 0, 76.0950374008770828, 0, -21.7414392573934522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 3.88320861646147339, 0, 0, 0, 0, 0, 0, 11.6496258493844202, 0, -38.8320861646147339, 0, 0, 0, 0, 0, 0, 0, 0, 11.6496258493844202, 0, -77.6641723292294678, 0, 62.1313378633835742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.88320861646147339, 0, -38.8320861646147339, 0, 62.1313378633835742, 0, -17.7518108181095926, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.242700538528842087, 0, 0, 0, 0, -0.970802154115368348, 0, 9.70802154115368348, 0, 0, 0, 0, 0, 0, -1.45620323117305252, 0, 29.1240646234610504, 0, -38.8320861646147339, 0, 0, 0, 0, 0, 0, 0, 0, -0.970802154115368348, 0, 29.1240646234610504, 0, -77.6641723292294678, 0, 31.0656689316917871, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.242700538528842087, 0, 9.70802154115368348, 0, -38.8320861646147339, 0, 31.0656689316917871, 0, -4.43795270452739816, 0, + + 0, -0.219530897104735508, 0, 0, 0, 0, -0.878123588418942033, 0, 8.78123588418942033, 0, 0, 0, 0, 0, 0, -1.31718538262841305, 0, 26.343707652568261, 0, -35.1249435367576813, 0, 0, 0, 0, 0, 0, 0, 0, -0.878123588418942033, 0, 26.343707652568261, 0, -70.2498870735153626, 0, 28.0999548294061451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.219530897104735508, 0, 8.78123588418942033, 0, -35.1249435367576813, 0, 28.0999548294061451, 0, -4.01427926134373501, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.219530897104735508, 0, 0, 0, 0, -0.878123588418942033, 0, 8.78123588418942033, 0, 0, 0, 0, 0, 0, -1.31718538262841305, 0, 26.343707652568261, 0, -35.1249435367576813, 0, 0, 0, 0, 0, 0, 0, 0, -0.878123588418942033, 0, 26.343707652568261, 0, -70.2498870735153626, 0, 28.0999548294061451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.219530897104735508, 0, 8.78123588418942033, 0, -35.1249435367576813, 0, 28.0999548294061451, 0, -4.01427926134373501, 0, + + 0, -0.242700538528842087, 0, 0, 0, 0, -0.970802154115368348, 0, 9.70802154115368348, 0, 0, 0, 0, 0, 0, -1.45620323117305252, 0, 29.1240646234610504, 0, -38.8320861646147339, 0, 0, 0, 0, 0, 0, 0, 0, -0.970802154115368348, 0, 29.1240646234610504, 0, -77.6641723292294678, 0, 31.0656689316917871, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.242700538528842087, 0, 9.70802154115368348, 0, -38.8320861646147339, 0, 31.0656689316917871, 0, -4.43795270452739816, 0, + 0, 0, 0, 0, -3.88320861646147339, 0, 0, 0, 0, 0, 0, -11.6496258493844202, 0, 38.8320861646147339, 0, 0, 0, 0, 0, 0, 0, 0, -11.6496258493844202, 0, 77.6641723292294678, 0, -62.1313378633835742, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.88320861646147339, 0, 38.8320861646147339, 0, -62.1313378633835742, 0, 17.7518108181095926, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -4.75593983755481767, 0, 0, 0, 0, 0, 0, -14.267819512664453, 0, 47.5593983755481767, 0, 0, 0, 0, 0, 0, 0, 0, -14.267819512664453, 0, 95.1187967510963535, 0, -76.0950374008770828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.75593983755481767, 0, 47.5593983755481767, 0, -76.0950374008770828, 0, 21.7414392573934522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.594492479694352209, 0, 0, 0, 0, 1.58531327918493922, 0, -21.4017292689966795, 0, 0, 0, 0, 0, 0, 1.18898495938870442, 0, -35.6695487816611326, 0, 71.3390975633222651, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.13390975633222651, 0, 47.5593983755481767, 0, -38.0475187004385414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.198164159898117403, 0, 7.13390975633222651, 0, -23.7796991877740884, 0, 12.6825062334795138, 0, 0, 0, + + 0, 0.810156687611443034, 0, 0, 0, 0, 2.16041783363051476, 0, -29.1656407540119492, 0, 0, 0, 0, 0, 0, 1.62031337522288607, 0, -48.609401256686582, 0, 97.218802513373164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.7218802513373164, 0, 64.8125350089154427, 0, -51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.270052229203814345, 0, 9.7218802513373164, 0, -32.4062675044577213, 0, 17.2833426690441181, 0, 0, 0, + 0, 0, 0, 0, 6.48125350089154427, 0, 0, 0, 0, 0, 0, 6.48125350089154427, 0, -51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, -6.48125350089154427, 0, 0, 0, 51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.48125350089154427, 0, 51.8500280071323542, 0, -51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 9.9002782553443465, 0, 0, 0, 0, 0, 0, 9.9002782553443465, 0, -79.202226042754772, 0, 0, 0, 0, 0, 0, 0, 0, -9.9002782553443465, 0, 0, 0, 79.202226042754772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.9002782553443465, 0, 79.202226042754772, 0, -79.202226042754772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.883953415655745223, 0, 0, 0, 0, 0, 0, 24.7506956383608662, 0, 0, 0, 0, 0, 0, 2.47506956383608662, 0, -24.7506956383608662, 0, -49.5013912767217325, 0, 0, 0, 0, 0, 0, 0, 0, 1.41432546504919236, 0, -44.5512521490495592, 0, 99.002782553443465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.176790683131149045, 0, 4.95013912767217325, 0, -9.9002782553443465, 0, 0, 0, 0, 0, + + 0, -1.53105222743980097, 0, 0, 0, 0, 0, 0, 42.8694623683144273, 0, 0, 0, 0, 0, 0, 4.28694623683144273, 0, -42.8694623683144273, 0, -85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 2.44968356390368156, 0, -77.1650322629659691, 0, 171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.306210445487960195, 0, 8.57389247366288545, 0, -17.1477849473257709, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7.34905069171104468, 0, 0, 0, 0, 0, 0, 17.1477849473257709, 0, 34.2955698946515418, 0, 0, 0, 0, 0, 0, 0, 0, 17.1477849473257709, 0, -114.318566315505139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.34905069171104468, 0, 34.2955698946515418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -14.6981013834220894, 0, 0, 0, 0, 0, 0, 34.2955698946515418, 0, 68.5911397893030836, 0, 0, 0, 0, 0, 0, 0, 0, 34.2955698946515418, 0, -228.637132631010279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.6981013834220894, 0, 68.5911397893030836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1.07173655920786068, 0, 0, 0, 0, -4.28694623683144273, 0, -17.1477849473257709, 0, 0, 0, 0, 0, 0, -2.14347311841572136, 0, 85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.06210445487960195, 0, -51.4433548419773127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.153105222743980097, 0, 2.44968356390368156, 0, 0, 0, 0, 0, 0, 0, + + 0, 2.55124331061190454, 0, 0, 0, 0, -10.2049732424476182, 0, -40.8198929697904727, 0, 0, 0, 0, 0, 0, -5.10248662122380908, 0, 204.099464848952363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.28926660174829869, 0, -122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.364463330087414934, 0, 5.83141328139863895, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5.83141328139863895, 0, 0, 0, 0, 0, 0, -40.8198929697904727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40.8198929697904727, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.83141328139863895, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 17.4942398441959169, 0, 0, 0, 0, 0, 0, -122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.4942398441959169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1.0933899902622448, 0, 0, 0, 0, 10.2049732424476182, 0, 0, 0, 0, 0, 0, 0, 0, -15.3074598636714272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.37355996104897921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.121487776695804978, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -4.76597647343204622, 0, 0, 0, 0, 44.4824470853657647, 0, 0, 0, 0, 0, 0, 0, 0, -66.723670628048647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19.0639058937281849, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.52955294149244958, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 5.2955294149244958, 0, 0, 0, 0, -63.5463529790939495, 0, 0, 0, 0, 0, 0, 0, 0, 133.447341256097294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63.5463529790939495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.2955294149244958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4.76597647343204622, 0, 0, 0, 0, 0, 0, 44.4824470853657647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66.723670628048647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19.0639058937281849, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.52955294149244958, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 20.7744098149826513, 0, 0, 0, 0, 0, 0, -193.894491606504745, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290.841737409757118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -83.0976392599306051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.30826775722029458, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.971902213566439825, 0, 0, 0, 0, -5.83141328139863895, 0, -17.4942398441959169, 0, 0, 0, 0, 0, 0, 0, 0, 122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.83141328139863895, 0, -122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.971902213566439825, 0, 17.4942398441959169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -2.91570664069931948, 0, 0, 0, 0, 17.4942398441959169, 0, 52.4827195325877506, 0, 0, 0, 0, 0, 0, 0, 0, -367.379036728114254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.4942398441959169, 0, 367.379036728114254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.91570664069931948, 0, -52.4827195325877506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7.65372993183571362, 0, 0, 0, 0, 0, 0, -30.6149197273428545, 0, -40.8198929697904727, 0, 0, 0, 0, 0, 0, 0, 0, -15.3074598636714272, 0, 204.099464848952363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21.8677998052448961, 0, -122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.0933899902622448, 0, 5.83141328139863895, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -18.2195215065336316, 0, 0, 0, 0, 0, 0, 72.8780860261345264, 0, 97.1707813681793685, 0, 0, 0, 0, 0, 0, 0, 0, 36.4390430130672632, 0, -485.853906840896842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52.0557757329532331, 0, 291.512344104538105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.60278878664766166, 0, -13.8815401954541955, 0, 0, 0, 0, 0, 0, 0, + 0, -0.918631336463880584, 0, 0, 0, 0, 1.22484178195184078, 0, 29.3962027668441787, 0, 0, 0, 0, 0, 0, 4.28694623683144273, 0, -68.5911397893030836, 0, -68.5911397893030836, 0, 0, 0, 0, 0, 0, 0, 0, 1.22484178195184078, 0, -68.5911397893030836, 0, 228.637132631010279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.918631336463880584, 0, 29.3962027668441787, 0, -68.5911397893030836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.83726267292776117, 0, 0, 0, 0, -2.44968356390368156, 0, -58.7924055336883574, 0, 0, 0, 0, 0, 0, -8.57389247366288545, 0, 137.182279578606167, 0, 137.182279578606167, 0, 0, 0, 0, 0, 0, 0, 0, -2.44968356390368156, 0, 137.182279578606167, 0, -457.274265262020558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.83726267292776117, 0, -58.7924055336883574, 0, 137.182279578606167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7.65526113719900487, 0, 0, 0, 0, 0, 0, 0, 0, 71.4491039471907121, 0, 0, 0, 0, 0, 0, 0, 0, 21.4347311841572136, 0, -71.4491039471907121, 0, -85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12.2484178195184078, 0, -128.608387104943282, 0, 171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.53105222743980097, 0, 14.2898207894381424, 0, -17.1477849473257709, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 13.2593012348361783, 0, 0, 0, 0, 0, 0, 0, 0, -123.753478191804331, 0, 0, 0, 0, 0, 0, 0, 0, -37.1260434575412994, 0, 123.753478191804331, 0, 148.504173830165197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21.2148819757378853, 0, 222.756260745247796, 0, -297.008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65186024696723567, 0, -24.7506956383608662, 0, 29.7008347660330395, 0, 0, 0, 0, 0, + 0, 0.707162732524596178, 0, 0, 0, 0, 1.41432546504919236, 0, -29.7008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, -29.7008347660330395, 0, 118.803339064132158, 0, 0, 0, 0, 0, 0, 0, 0, -1.41432546504919236, 0, 29.7008347660330395, 0, 0, 0, -79.202226042754772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.707162732524596178, 0, 29.7008347660330395, 0, -118.803339064132158, 0, 79.202226042754772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.08020891681525738, 0, 0, 0, 0, -2.16041783363051476, 0, 45.3687745062408099, 0, 0, 0, 0, 0, 0, 0, 0, 45.3687745062408099, 0, -181.47509802496324, 0, 0, 0, 0, 0, 0, 0, 0, 2.16041783363051476, 0, -45.3687745062408099, 0, 0, 0, 120.983398683308826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.08020891681525738, 0, -45.3687745062408099, 0, 181.47509802496324, 0, -120.983398683308826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5.67109681328010124, 0, 0, 0, 0, 0, 0, 15.1229248354136033, 0, -68.0531617593612148, 0, 0, 0, 0, 0, 0, 0, 0, 11.3421936265602025, 0, -113.421936265602025, 0, 136.10632351872243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22.6843872531204049, 0, 90.7375490124816198, 0, -51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.89036560442670041, 0, 22.6843872531204049, 0, -45.3687745062408099, 0, 17.2833426690441181, 0, 0, 0, + + 0, 0, 0, 0, -7.72840223602657872, 0, 0, 0, 0, 0, 0, -20.6090726294042099, 0, 92.7408268323189446, 0, 0, 0, 0, 0, 0, 0, 0, -15.4568044720531574, 0, 154.568044720531574, 0, -185.481653664637889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30.9136089441063149, 0, -123.65443577642526, 0, 70.6596775865287197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.57613407867552624, 0, -30.9136089441063149, 0, 61.8272178882126298, 0, -23.5532258621762399, 0, 0, 0, + 0, -0.396328319796234806, 0, 0, 0, 0, -1.58531327918493922, 0, 19.0237593502192707, 0, 0, 0, 0, 0, 0, -2.37796991877740884, 0, 57.0712780506578121, 0, -95.1187967510963535, 0, 0, 0, 0, 0, 0, 0, 0, -1.58531327918493922, 0, 57.0712780506578121, 0, -190.237593502192707, 0, 101.46004986783611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.396328319796234806, 0, 19.0237593502192707, 0, -95.1187967510963535, 0, 101.46004986783611, 0, -21.7414392573934522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.485401077057684174, 0, 0, 0, 0, 1.9416043082307367, 0, -23.2992516987688403, 0, 0, 0, 0, 0, 0, 2.91240646234610504, 0, -69.897755096306521, 0, 116.496258493844202, 0, 0, 0, 0, 0, 0, 0, 0, 1.9416043082307367, 0, -69.897755096306521, 0, 232.992516987688403, 0, -124.262675726767148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.485401077057684174, 0, -23.2992516987688403, 0, 116.496258493844202, 0, -124.262675726767148, 0, 26.627716227164389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2.18430484675957878, 0, 0, 0, 0, 0, 0, -8.73721938703831513, 0, 29.1240646234610504, 0, 0, 0, 0, 0, 0, 0, 0, -13.1058290805574727, 0, 87.3721938703831513, 0, -69.897755096306521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.73721938703831513, 0, 87.3721938703831513, 0, -139.795510192613042, 0, 39.9415743407465834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.18430484675957878, 0, 29.1240646234610504, 0, -69.897755096306521, 0, 39.9415743407465834, 0, -4.43795270452739816, 0, + + 0, 0, 0, 0, 2.41483986815209059, 0, 0, 0, 0, 0, 0, 9.65935947260836236, 0, -32.1978649086945412, 0, 0, 0, 0, 0, 0, 0, 0, 14.4890392089125435, 0, -96.5935947260836236, 0, 77.2748757808668989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.65935947260836236, 0, -96.5935947260836236, 0, 154.549751561733798, 0, -44.1570718747810851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.41483986815209059, 0, -32.1978649086945412, 0, 77.2748757808668989, 0, -44.1570718747810851, 0, 4.90634131942012056, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2.41483986815209059, 0, 0, 0, 0, 0, 0, -9.65935947260836236, 0, 32.1978649086945412, 0, 0, 0, 0, 0, 0, 0, 0, -14.4890392089125435, 0, 96.5935947260836236, 0, -77.2748757808668989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.65935947260836236, 0, 96.5935947260836236, 0, -154.549751561733798, 0, 44.1570718747810851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.41483986815209059, 0, 32.1978649086945412, 0, -77.2748757808668989, 0, 44.1570718747810851, 0, -4.90634131942012056, 0, + + 0, 0, 0, 0, 2.18430484675957878, 0, 0, 0, 0, 0, 0, 8.73721938703831513, 0, -29.1240646234610504, 0, 0, 0, 0, 0, 0, 0, 0, 13.1058290805574727, 0, -87.3721938703831513, 0, 69.897755096306521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.73721938703831513, 0, -87.3721938703831513, 0, 139.795510192613042, 0, -39.9415743407465834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.18430484675957878, 0, -29.1240646234610504, 0, 69.897755096306521, 0, -39.9415743407465834, 0, 4.43795270452739816, 0, + 0, 0.485401077057684174, 0, 0, 0, 0, 1.9416043082307367, 0, -23.2992516987688403, 0, 0, 0, 0, 0, 0, 2.91240646234610504, 0, -69.897755096306521, 0, 116.496258493844202, 0, 0, 0, 0, 0, 0, 0, 0, 1.9416043082307367, 0, -69.897755096306521, 0, 232.992516987688403, 0, -124.262675726767148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.485401077057684174, 0, -23.2992516987688403, 0, 116.496258493844202, 0, -124.262675726767148, 0, 26.627716227164389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.396328319796234806, 0, 0, 0, 0, -1.58531327918493922, 0, 19.0237593502192707, 0, 0, 0, 0, 0, 0, -2.37796991877740884, 0, 57.0712780506578121, 0, -95.1187967510963535, 0, 0, 0, 0, 0, 0, 0, 0, -1.58531327918493922, 0, 57.0712780506578121, 0, -190.237593502192707, 0, 101.46004986783611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.396328319796234806, 0, 19.0237593502192707, 0, -95.1187967510963535, 0, 101.46004986783611, 0, -21.7414392573934522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7.72840223602657872, 0, 0, 0, 0, 0, 0, 20.6090726294042099, 0, -92.7408268323189446, 0, 0, 0, 0, 0, 0, 0, 0, 15.4568044720531574, 0, -154.568044720531574, 0, 185.481653664637889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -30.9136089441063149, 0, 123.65443577642526, 0, -70.6596775865287197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.57613407867552624, 0, 30.9136089441063149, 0, -61.8272178882126298, 0, 23.5532258621762399, 0, 0, 0, + + 0, 0, 0, 0, -5.67109681328010124, 0, 0, 0, 0, 0, 0, -15.1229248354136033, 0, 68.0531617593612148, 0, 0, 0, 0, 0, 0, 0, 0, -11.3421936265602025, 0, 113.421936265602025, 0, -136.10632351872243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.6843872531204049, 0, -90.7375490124816198, 0, 51.8500280071323542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.89036560442670041, 0, -22.6843872531204049, 0, 45.3687745062408099, 0, -17.2833426690441181, 0, 0, 0, + 0, -1.08020891681525738, 0, 0, 0, 0, -2.16041783363051476, 0, 45.3687745062408099, 0, 0, 0, 0, 0, 0, 0, 0, 45.3687745062408099, 0, -181.47509802496324, 0, 0, 0, 0, 0, 0, 0, 0, 2.16041783363051476, 0, -45.3687745062408099, 0, 0, 0, 120.983398683308826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.08020891681525738, 0, -45.3687745062408099, 0, 181.47509802496324, 0, -120.983398683308826, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.707162732524596178, 0, 0, 0, 0, 1.41432546504919236, 0, -29.7008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, -29.7008347660330395, 0, 118.803339064132158, 0, 0, 0, 0, 0, 0, 0, 0, -1.41432546504919236, 0, 29.7008347660330395, 0, 0, 0, -79.202226042754772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.707162732524596178, 0, 29.7008347660330395, 0, -118.803339064132158, 0, 79.202226042754772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13.2593012348361783, 0, 0, 0, 0, 0, 0, 0, 0, 123.753478191804331, 0, 0, 0, 0, 0, 0, 0, 0, 37.1260434575412994, 0, -123.753478191804331, 0, -148.504173830165197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21.2148819757378853, 0, -222.756260745247796, 0, 297.008347660330395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.65186024696723567, 0, 24.7506956383608662, 0, -29.7008347660330395, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 7.65526113719900487, 0, 0, 0, 0, 0, 0, 0, 0, -71.4491039471907121, 0, 0, 0, 0, 0, 0, 0, 0, -21.4347311841572136, 0, 71.4491039471907121, 0, 85.7389247366288545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -12.2484178195184078, 0, 128.608387104943282, 0, -171.477849473257709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.53105222743980097, 0, -14.2898207894381424, 0, 17.1477849473257709, 0, 0, 0, 0, 0, + 0, 1.83726267292776117, 0, 0, 0, 0, -2.44968356390368156, 0, -58.7924055336883574, 0, 0, 0, 0, 0, 0, -8.57389247366288545, 0, 137.182279578606167, 0, 137.182279578606167, 0, 0, 0, 0, 0, 0, 0, 0, -2.44968356390368156, 0, 137.182279578606167, 0, -457.274265262020558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.83726267292776117, 0, -58.7924055336883574, 0, 137.182279578606167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.918631336463880584, 0, 0, 0, 0, 1.22484178195184078, 0, 29.3962027668441787, 0, 0, 0, 0, 0, 0, 4.28694623683144273, 0, -68.5911397893030836, 0, -68.5911397893030836, 0, 0, 0, 0, 0, 0, 0, 0, 1.22484178195184078, 0, -68.5911397893030836, 0, 228.637132631010279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.918631336463880584, 0, 29.3962027668441787, 0, -68.5911397893030836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18.2195215065336316, 0, 0, 0, 0, 0, 0, -72.8780860261345264, 0, -97.1707813681793685, 0, 0, 0, 0, 0, 0, 0, 0, -36.4390430130672632, 0, 485.853906840896842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52.0557757329532331, 0, -291.512344104538105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.60278878664766166, 0, 13.8815401954541955, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -7.65372993183571362, 0, 0, 0, 0, 0, 0, 30.6149197273428545, 0, 40.8198929697904727, 0, 0, 0, 0, 0, 0, 0, 0, 15.3074598636714272, 0, -204.099464848952363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -21.8677998052448961, 0, 122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0933899902622448, 0, -5.83141328139863895, 0, 0, 0, 0, 0, 0, 0, + 0, -2.91570664069931948, 0, 0, 0, 0, 17.4942398441959169, 0, 52.4827195325877506, 0, 0, 0, 0, 0, 0, 0, 0, -367.379036728114254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.4942398441959169, 0, 367.379036728114254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.91570664069931948, 0, -52.4827195325877506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.971902213566439825, 0, 0, 0, 0, -5.83141328139863895, 0, -17.4942398441959169, 0, 0, 0, 0, 0, 0, 0, 0, 122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.83141328139863895, 0, -122.459678909371418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.971902213566439825, 0, 17.4942398441959169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20.7744098149826513, 0, 0, 0, 0, 0, 0, 193.894491606504745, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -290.841737409757118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83.0976392599306051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.30826775722029458, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 4.76597647343204622, 0, 0, 0, 0, 0, 0, -44.4824470853657647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66.723670628048647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -19.0639058937281849, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.52955294149244958, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5.2955294149244958, 0, 0, 0, 0, -63.5463529790939495, 0, 0, 0, 0, 0, 0, 0, 0, 133.447341256097294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63.5463529790939495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.2955294149244958, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5.42630291944221461, 0, 0, 0, 0, 65.1156350333065753, 0, 0, 0, 0, 0, 0, 0, 0, -136.742833569943808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65.1156350333065753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.42630291944221461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.1841163748620862, 0, 0, 0, 0, 14.2093964983450344, 0, 0, 0, 0, 0, 0, 0, 0, -29.8397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.2093964983450344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.1841163748620862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -21.3140947475175515, 0, 0, 0, 0, 0, 0, 198.931550976830481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -298.397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85.2563789900702061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.36823274972417239, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -6.74010856667869467, 0, 0, 0, 0, 0, 0, 62.9076799556678169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94.3615199335017254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26.9604342667147787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.748900951853188297, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2.99560380741275319, 0, 0, 0, 0, -17.9736228444765191, 0, -53.9208685334295574, 0, 0, 0, 0, 0, 0, 0, 0, 377.446079734006901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17.9736228444765191, 0, -377.446079734006901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.99560380741275319, 0, 53.9208685334295574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.19033225155963006, 0, 0, 0, 0, -7.14199350935778034, 0, -21.425980528073341, 0, 0, 0, 0, 0, 0, 0, 0, 149.981863696513387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.14199350935778034, 0, -149.981863696513387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.19033225155963006, 0, 21.425980528073341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 18.7477329620641734, 0, 0, 0, 0, 0, 0, -74.9909318482566936, 0, -99.9879091310089248, 0, 0, 0, 0, 0, 0, 0, 0, -37.4954659241283468, 0, 499.939545655044624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53.5649513201833526, 0, -299.963727393026774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.67824756600916763, 0, 14.2839870187155607, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 8.83776607290009063, 0, 0, 0, 0, 0, 0, -35.3510642916003625, 0, -47.1347523888004833, 0, 0, 0, 0, 0, 0, 0, 0, -17.6755321458001813, 0, 235.673761944002417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25.2507602082859732, 0, -141.40425716640145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.26253801041429866, 0, 6.73353605554292619, 0, 0, 0, 0, 0, 0, 0, + 0, -1.89380701562144799, 0, 0, 0, 0, 2.52507602082859732, 0, 60.6018244998863357, 0, 0, 0, 0, 0, 0, 8.83776607290009063, 0, -141.40425716640145, 0, -141.40425716640145, 0, 0, 0, 0, 0, 0, 0, 0, 2.52507602082859732, 0, -141.40425716640145, 0, 471.347523888004833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.89380701562144799, 0, 60.6018244998863357, 0, -141.40425716640145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.02706105729735913, 0, 0, 0, 0, 1.36941474306314551, 0, 32.8659538335154923, 0, 0, 0, 0, 0, 0, 4.79295160072100929, 0, -76.6872256115361487, 0, -76.6872256115361487, 0, 0, 0, 0, 0, 0, 0, 0, 1.36941474306314551, 0, -76.6872256115361487, 0, 255.624085371787162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.02706105729735913, 0, 32.8659538335154923, 0, -76.6872256115361487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13.6941474306314551, 0, 0, 0, 0, 0, 0, 0, 0, 127.812042685893581, 0, 0, 0, 0, 0, 0, 0, 0, 38.3436128057680743, 0, -127.812042685893581, 0, -153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21.9106358890103282, 0, -230.061676834608446, 0, 306.748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.73882948612629102, 0, 25.5624085371787162, 0, -30.6748902446144595, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -8.38591841687309056, 0, 0, 0, 0, 0, 0, 0, 0, 78.2685718908155119, 0, 0, 0, 0, 0, 0, 0, 0, 23.4805715672446536, 0, -78.2685718908155119, 0, -93.9222862689786143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.4174694669969449, 0, -140.883429403467921, 0, 187.844572537957229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.67718368337461811, 0, 15.6537143781631024, 0, -18.7844572537957229, 0, 0, 0, 0, 0, + 0, 1.11812245558307874, 0, 0, 0, 0, 2.23624491116615748, 0, -46.9611431344893072, 0, 0, 0, 0, 0, 0, 0, 0, -46.9611431344893072, 0, 187.844572537957229, 0, 0, 0, 0, 0, 0, 0, 0, -2.23624491116615748, 0, 46.9611431344893072, 0, 0, 0, -125.229715025304819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.11812245558307874, 0, 46.9611431344893072, 0, -187.844572537957229, 0, 125.229715025304819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.763823050178243716, 0, 0, 0, 0, 1.52764610035648743, 0, -32.0805681074862361, 0, 0, 0, 0, 0, 0, 0, 0, -32.0805681074862361, 0, 128.322272429944944, 0, 0, 0, 0, 0, 0, 0, 0, -1.52764610035648743, 0, 32.0805681074862361, 0, 0, 0, -85.5481816199632961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.763823050178243716, 0, 32.0805681074862361, 0, -128.322272429944944, 0, 85.5481816199632961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8.02014202687155901, 0, 0, 0, 0, 0, 0, 21.387045404990824, 0, -96.2417043224587082, 0, 0, 0, 0, 0, 0, 0, 0, 16.040284053743118, 0, -160.40284053743118, 0, 192.483408644917416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32.0805681074862361, 0, 128.322272429944944, 0, -73.3270128171113967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.673380675623853, 0, 32.0805681074862361, 0, -64.1611362149724721, 0, 24.4423376057037989, 0, 0, 0, + + 0, 0, 0, 0, 6.06265750929132863, 0, 0, 0, 0, 0, 0, 16.167086691443543, 0, -72.7518901114959435, 0, 0, 0, 0, 0, 0, 0, 0, 12.1253150185826573, 0, -121.253150185826573, 0, 145.503780222991887, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -24.2506300371653145, 0, 97.0025201486612581, 0, -55.4300115135207189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.02088583643044288, 0, 24.2506300371653145, 0, -48.501260074330629, 0, 18.4766705045069063, 0, 0, 0, + 0, -0.505221459107610719, 0, 0, 0, 0, -2.02088583643044288, 0, 24.2506300371653145, 0, 0, 0, 0, 0, 0, -3.03132875464566431, 0, 72.7518901114959435, 0, -121.253150185826573, 0, 0, 0, 0, 0, 0, 0, 0, -2.02088583643044288, 0, 72.7518901114959435, 0, -242.506300371653145, 0, 129.336693531548344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.505221459107610719, 0, 24.2506300371653145, 0, -121.253150185826573, 0, 129.336693531548344, 0, -27.7150057567603594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.420369663756282355, 0, 0, 0, 0, -1.68147865502512942, 0, 20.177743860301553, 0, 0, 0, 0, 0, 0, -2.52221798253769413, 0, 60.5332315809046591, 0, -100.888719301507765, 0, 0, 0, 0, 0, 0, 0, 0, -1.68147865502512942, 0, 60.5332315809046591, 0, -201.77743860301553, 0, 107.614633921608283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.420369663756282355, 0, 20.177743860301553, 0, -100.888719301507765, 0, 107.614633921608283, 0, -23.0602786974874892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2.52221798253769413, 0, 0, 0, 0, 0, 0, -10.0888719301507765, 0, 33.6295731005025884, 0, 0, 0, 0, 0, 0, 0, 0, -15.1333078952261648, 0, 100.888719301507765, 0, -80.7109754412062121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.0888719301507765, 0, 100.888719301507765, 0, -161.421950882412424, 0, 46.1205573949749784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.52221798253769413, 0, 33.6295731005025884, 0, -80.7109754412062121, 0, 46.1205573949749784, 0, -5.12450637721944204, 0, + + 0, 0, 0, 0, -2.30245947330177705, 0, 0, 0, 0, 0, 0, -9.20983789320710822, 0, 30.6994596440236941, 0, 0, 0, 0, 0, 0, 0, 0, -13.8147568398106623, 0, 92.0983789320710822, 0, -73.6787031456568658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.20983789320710822, 0, 92.0983789320710822, 0, -147.357406291313732, 0, 42.1021160832324947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.30245947330177705, 0, 30.6994596440236941, 0, -73.6787031456568658, 0, 42.1021160832324947, 0, -4.67801289813694386, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2.30245947330177705, 0, 0, 0, 0, 0, 0, -9.20983789320710822, 0, 30.6994596440236941, 0, 0, 0, 0, 0, 0, 0, 0, -13.8147568398106623, 0, 92.0983789320710822, 0, -73.6787031456568658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.20983789320710822, 0, 92.0983789320710822, 0, -147.357406291313732, 0, 42.1021160832324947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.30245947330177705, 0, 30.6994596440236941, 0, -73.6787031456568658, 0, 42.1021160832324947, 0, -4.67801289813694386, 0, + + 0, 0, 0, 0, -2.52221798253769413, 0, 0, 0, 0, 0, 0, -10.0888719301507765, 0, 33.6295731005025884, 0, 0, 0, 0, 0, 0, 0, 0, -15.1333078952261648, 0, 100.888719301507765, 0, -80.7109754412062121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.0888719301507765, 0, 100.888719301507765, 0, -161.421950882412424, 0, 46.1205573949749784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.52221798253769413, 0, 33.6295731005025884, 0, -80.7109754412062121, 0, 46.1205573949749784, 0, -5.12450637721944204, 0, + 0, 0.420369663756282355, 0, 0, 0, 0, 1.68147865502512942, 0, -20.177743860301553, 0, 0, 0, 0, 0, 0, 2.52221798253769413, 0, -60.5332315809046591, 0, 100.888719301507765, 0, 0, 0, 0, 0, 0, 0, 0, 1.68147865502512942, 0, -60.5332315809046591, 0, 201.77743860301553, 0, -107.614633921608283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.420369663756282355, 0, -20.177743860301553, 0, 100.888719301507765, 0, -107.614633921608283, 0, 23.0602786974874892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.505221459107610719, 0, 0, 0, 0, 2.02088583643044288, 0, -24.2506300371653145, 0, 0, 0, 0, 0, 0, 3.03132875464566431, 0, -72.7518901114959435, 0, 121.253150185826573, 0, 0, 0, 0, 0, 0, 0, 0, 2.02088583643044288, 0, -72.7518901114959435, 0, 242.506300371653145, 0, -129.336693531548344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.505221459107610719, 0, -24.2506300371653145, 0, 121.253150185826573, 0, -129.336693531548344, 0, 27.7150057567603594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6.06265750929132863, 0, 0, 0, 0, 0, 0, 16.167086691443543, 0, -72.7518901114959435, 0, 0, 0, 0, 0, 0, 0, 0, 12.1253150185826573, 0, -121.253150185826573, 0, 145.503780222991887, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -24.2506300371653145, 0, 97.0025201486612581, 0, -55.4300115135207189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.02088583643044288, 0, 24.2506300371653145, 0, -48.501260074330629, 0, 18.4766705045069063, 0, 0, 0, + + 0, 0, 0, 0, 8.02014202687155901, 0, 0, 0, 0, 0, 0, 21.387045404990824, 0, -96.2417043224587082, 0, 0, 0, 0, 0, 0, 0, 0, 16.040284053743118, 0, -160.40284053743118, 0, 192.483408644917416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32.0805681074862361, 0, 128.322272429944944, 0, -73.3270128171113967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.673380675623853, 0, 32.0805681074862361, 0, -64.1611362149724721, 0, 24.4423376057037989, 0, 0, 0, + 0, -0.763823050178243716, 0, 0, 0, 0, -1.52764610035648743, 0, 32.0805681074862361, 0, 0, 0, 0, 0, 0, 0, 0, 32.0805681074862361, 0, -128.322272429944944, 0, 0, 0, 0, 0, 0, 0, 0, 1.52764610035648743, 0, -32.0805681074862361, 0, 0, 0, 85.5481816199632961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.763823050178243716, 0, -32.0805681074862361, 0, 128.322272429944944, 0, -85.5481816199632961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.11812245558307874, 0, 0, 0, 0, -2.23624491116615748, 0, 46.9611431344893072, 0, 0, 0, 0, 0, 0, 0, 0, 46.9611431344893072, 0, -187.844572537957229, 0, 0, 0, 0, 0, 0, 0, 0, 2.23624491116615748, 0, -46.9611431344893072, 0, 0, 0, 125.229715025304819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.11812245558307874, 0, -46.9611431344893072, 0, 187.844572537957229, 0, -125.229715025304819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8.38591841687309056, 0, 0, 0, 0, 0, 0, 0, 0, 78.2685718908155119, 0, 0, 0, 0, 0, 0, 0, 0, 23.4805715672446536, 0, -78.2685718908155119, 0, -93.9222862689786143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.4174694669969449, 0, -140.883429403467921, 0, 187.844572537957229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.67718368337461811, 0, 15.6537143781631024, 0, -18.7844572537957229, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -13.6941474306314551, 0, 0, 0, 0, 0, 0, 0, 0, 127.812042685893581, 0, 0, 0, 0, 0, 0, 0, 0, 38.3436128057680743, 0, -127.812042685893581, 0, -153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21.9106358890103282, 0, -230.061676834608446, 0, 306.748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.73882948612629102, 0, 25.5624085371787162, 0, -30.6748902446144595, 0, 0, 0, 0, 0, + 0, 1.02706105729735913, 0, 0, 0, 0, -1.36941474306314551, 0, -32.8659538335154923, 0, 0, 0, 0, 0, 0, -4.79295160072100929, 0, 76.6872256115361487, 0, 76.6872256115361487, 0, 0, 0, 0, 0, 0, 0, 0, -1.36941474306314551, 0, 76.6872256115361487, 0, -255.624085371787162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.02706105729735913, 0, -32.8659538335154923, 0, 76.6872256115361487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.89380701562144799, 0, 0, 0, 0, -2.52507602082859732, 0, -60.6018244998863357, 0, 0, 0, 0, 0, 0, -8.83776607290009063, 0, 141.40425716640145, 0, 141.40425716640145, 0, 0, 0, 0, 0, 0, 0, 0, -2.52507602082859732, 0, 141.40425716640145, 0, -471.347523888004833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.89380701562144799, 0, -60.6018244998863357, 0, 141.40425716640145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8.83776607290009063, 0, 0, 0, 0, 0, 0, -35.3510642916003625, 0, -47.1347523888004833, 0, 0, 0, 0, 0, 0, 0, 0, -17.6755321458001813, 0, 235.673761944002417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25.2507602082859732, 0, -141.40425716640145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.26253801041429866, 0, 6.73353605554292619, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 18.7477329620641734, 0, 0, 0, 0, 0, 0, -74.9909318482566936, 0, -99.9879091310089248, 0, 0, 0, 0, 0, 0, 0, 0, -37.4954659241283468, 0, 499.939545655044624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53.5649513201833526, 0, -299.963727393026774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.67824756600916763, 0, 14.2839870187155607, 0, 0, 0, 0, 0, 0, 0, + 0, -1.19033225155963006, 0, 0, 0, 0, 7.14199350935778034, 0, 21.425980528073341, 0, 0, 0, 0, 0, 0, 0, 0, -149.981863696513387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.14199350935778034, 0, 149.981863696513387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.19033225155963006, 0, -21.425980528073341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -2.99560380741275319, 0, 0, 0, 0, 17.9736228444765191, 0, 53.9208685334295574, 0, 0, 0, 0, 0, 0, 0, 0, -377.446079734006901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.9736228444765191, 0, 377.446079734006901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.99560380741275319, 0, -53.9208685334295574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6.74010856667869467, 0, 0, 0, 0, 0, 0, 62.9076799556678169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94.3615199335017254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26.9604342667147787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.748900951853188297, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -21.3140947475175515, 0, 0, 0, 0, 0, 0, 198.931550976830481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -298.397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85.2563789900702061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.36823274972417239, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1.1841163748620862, 0, 0, 0, 0, -14.2093964983450344, 0, 0, 0, 0, 0, 0, 0, 0, 29.8397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.2093964983450344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.1841163748620862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 5.42630291944221461, 0, 0, 0, 0, -65.1156350333065753, 0, 0, 0, 0, 0, 0, 0, 0, 136.742833569943808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65.1156350333065753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.42630291944221461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 5.96893321138643607, 0, 0, 0, 0, -89.533998170796541, 0, 0, 0, 0, 0, 0, 0, 0, 250.695194878230315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -179.067996341593082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29.8446660569321803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.542630291944221461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5.42630291944221461, 0, 0, 0, 0, 0, 0, 65.1156350333065753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -136.742833569943808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65.1156350333065753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.42630291944221461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 24.8664438721038101, 0, 0, 0, 0, 0, 0, -298.397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 626.634385577016015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -298.397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24.8664438721038101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1.06570473737587758, 0, 0, 0, 0, -8.88087281146564647, 0, -21.3140947475175515, 0, 0, 0, 0, 0, 0, 4.97328877442076202, 0, 198.931550976830481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.6570473737587758, 0, -298.397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.14440731201730169, 0, 85.2563789900702061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.11841163748620862, 0, -2.36823274972417239, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -3.37005428333934733, 0, 0, 0, 0, 28.0837856944945611, 0, 67.4010856667869467, 0, 0, 0, 0, 0, 0, -15.7269199889169542, 0, -629.076799556678169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -33.7005428333934733, 0, 943.615199335017254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.1057666574307952, 0, -269.604342667147787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.374450475926594148, 0, 7.48900951853188297, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8.98681142223825956, 0, 0, 0, 0, 0, 0, -53.9208685334295574, 0, -53.9208685334295574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 377.446079734006901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53.9208685334295574, 0, -377.446079734006901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.98681142223825956, 0, 53.9208685334295574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -22.6163127796329711, 0, 0, 0, 0, 0, 0, 135.697876677797827, 0, 135.697876677797827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -949.885136744584786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -135.697876677797827, 0, 949.885136744584786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.6163127796329711, 0, -135.697876677797827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1.0415407201146763, 0, 0, 0, 0, 3.1246221603440289, 0, 37.4954659241283468, 0, 0, 0, 0, 0, 0, 6.2492443206880578, 0, -149.981863696513387, 0, -99.9879091310089248, 0, 0, 0, 0, 0, 0, 0, 0, -0.892749188669722543, 0, -74.9909318482566936, 0, 499.939545655044624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.82703909745412139, 0, 107.129902640366705, 0, -299.963727393026774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.148791531444953757, 0, -5.35649513201833526, 0, 14.2839870187155607, 0, 0, 0, 0, 0, 0, 0, + + 0, 2.20944151822502266, 0, 0, 0, 0, -6.62832455467506797, 0, -79.5398946561008156, 0, 0, 0, 0, 0, 0, -13.2566491093501359, 0, 318.159578624403263, 0, 212.106385749602175, 0, 0, 0, 0, 0, 0, 0, 0, 1.89380701562144799, 0, 159.079789312201631, 0, -1060.53192874801088, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.99705554946791864, 0, -227.256841874573759, 0, 636.319157248806525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.315634502603574665, 0, 11.3628420937286879, 0, -30.3009122499431679, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9.46903507810723996, 0, 0, 0, 0, 0, 0, 12.6253801041429866, 0, 101.003040833143893, 0, 0, 0, 0, 0, 0, 0, 0, 44.1888303645004531, 0, -235.673761944002417, 0, -141.40425716640145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12.6253801041429866, 0, -235.673761944002417, 0, 471.347523888004833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.46903507810723996, 0, 101.003040833143893, 0, -141.40425716640145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 17.4600379740551053, 0, 0, 0, 0, 0, 0, -23.2800506320734737, 0, -186.24040505658779, 0, 0, 0, 0, 0, 0, 0, 0, -81.480177212257158, 0, 434.560945132038176, 0, 260.736567079222906, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -23.2800506320734737, 0, 434.560945132038176, 0, -869.121890264076352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17.4600379740551053, 0, -186.24040505658779, 0, 260.736567079222906, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.855884214414465945, 0, 0, 0, 0, 0.855884214414465945, 0, -41.0824422918943654, 0, 0, 0, 0, 0, 0, -2.39647580036050465, 0, 0, 0, 191.718064028840372, 0, 0, 0, 0, 0, 0, 0, 0, -3.76589054342365016, 0, 115.030838417304223, 0, -191.718064028840372, 0, -153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.19823790018025232, 0, 65.7319076670309846, 0, -345.092515251912669, 0, 306.748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.171176842882893189, 0, -8.21648845837887307, 0, 38.3436128057680743, 0, -30.6748902446144595, 0, 0, 0, 0, 0, + + 0, -1.39765306947884843, 0, 0, 0, 0, -1.39765306947884843, 0, 67.0873473349847245, 0, 0, 0, 0, 0, 0, 3.9134285945407756, 0, 0, 0, -313.074287563262048, 0, 0, 0, 0, 0, 0, 0, 0, 6.14967350570693308, 0, -187.844572537957229, 0, 313.074287563262048, 0, 250.459430050609638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.9567142972703878, 0, -107.339755735975559, 0, 563.533717613871686, 0, -500.918860101219276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.279530613895769685, 0, 13.4174694669969449, 0, -62.6148575126524095, 0, 50.0918860101219276, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7.82685718908155119, 0, 0, 0, 0, 0, 0, 15.6537143781631024, 0, -109.576000647141717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109.576000647141717, 0, 262.98240155314012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15.6537143781631024, 0, 109.576000647141717, 0, 0, 0, -125.229715025304819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.82685718908155119, 0, 109.576000647141717, 0, -262.98240155314012, 0, 125.229715025304819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -11.4573457526736557, 0, 0, 0, 0, 0, 0, -22.9146915053473115, 0, 160.40284053743118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160.40284053743118, 0, -384.966817289834833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.9146915053473115, 0, -160.40284053743118, 0, 0, 0, 183.317532042778492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11.4573457526736557, 0, -160.40284053743118, 0, 384.966817289834833, 0, -183.317532042778492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.572867287633682787, 0, 0, 0, 0, -2.10051338799017022, 0, 32.0805681074862361, 0, 0, 0, 0, 0, 0, -2.673380675623853, 0, 85.5481816199632961, 0, -192.483408644917416, 0, 0, 0, 0, 0, 0, 0, 0, -1.14573457526736557, 0, 64.1611362149724721, 0, -320.805681074862361, 0, 256.644544859889888, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.190955762544560929, 0, 0, 0, -64.1611362149724721, 0, 171.096363239926592, 0, -73.3270128171113967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.190955762544560929, 0, -10.693522702495412, 0, 64.1611362149724721, 0, -85.5481816199632961, 0, 24.4423376057037989, 0, 0, 0, + + 0, 0.757832188661416079, 0, 0, 0, 0, 2.77871802509185895, 0, -42.4386025650393004, 0, 0, 0, 0, 0, 0, 3.53655021375327503, 0, -113.169606840104801, 0, 254.631615390235802, 0, 0, 0, 0, 0, 0, 0, 0, 1.51566437732283216, 0, -84.8772051300786008, 0, 424.386025650393004, 0, -339.508820520314403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.25261072955380536, 0, 0, 0, 84.8772051300786008, 0, -226.339213680209602, 0, 97.0025201486612581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.25261072955380536, 0, 14.1462008550131001, 0, -84.8772051300786008, 0, 113.169606840104801, 0, -32.334173382887086, 0, 0, 0, + 0, 0, 0, 0, -4.54699313196849647, 0, 0, 0, 0, 0, 0, -18.1879725278739859, 0, 72.7518901114959435, 0, 0, 0, 0, 0, 0, 0, 0, -27.2819587918109788, 0, 218.255670334487831, 0, -218.255670334487831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18.1879725278739859, 0, 218.255670334487831, 0, -436.511340668975661, 0, 166.290034540562157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.54699313196849647, 0, 72.7518901114959435, 0, -218.255670334487831, 0, 166.290034540562157, 0, -27.7150057567603594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 5.46480562883167061, 0, 0, 0, 0, 0, 0, 21.8592225153266825, 0, -87.4368900613067298, 0, 0, 0, 0, 0, 0, 0, 0, 32.7888337729900237, 0, -262.310670183920189, 0, 262.310670183920189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21.8592225153266825, 0, -262.310670183920189, 0, 524.621340367840379, 0, -199.85574871155824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.46480562883167061, 0, -87.4368900613067298, 0, 262.310670183920189, 0, -199.85574871155824, 0, 33.3092914519263733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.210184831878141177, 0, 0, 0, 0, 1.05092415939070589, 0, -12.6110899126884706, 0, 0, 0, 0, 0, 0, 2.10184831878141177, 0, -50.4443596507538826, 0, 84.073932751256471, 0, 0, 0, 0, 0, 0, 0, 0, 2.10184831878141177, 0, -75.6665394761308239, 0, 252.221798253769413, 0, -134.518292402010354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.05092415939070589, 0, -50.4443596507538826, 0, 252.221798253769413, 0, -269.036584804020707, 0, 57.650696743718723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.210184831878141177, 0, -12.6110899126884706, 0, 84.073932751256471, 0, -134.518292402010354, 0, 57.650696743718723, 0, -5.12450637721944204, 0, + + 0, -0.230245947330177705, 0, 0, 0, 0, -1.15122973665088853, 0, 13.8147568398106623, 0, 0, 0, 0, 0, 0, -2.30245947330177705, 0, 55.2590273592426493, 0, -92.0983789320710822, 0, 0, 0, 0, 0, 0, 0, 0, -2.30245947330177705, 0, 82.888541038863974, 0, -276.295136796213247, 0, 147.357406291313732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.15122973665088853, 0, 55.2590273592426493, 0, -276.295136796213247, 0, 294.714812582627463, 0, -63.1531741248487421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.230245947330177705, 0, 13.8147568398106623, 0, -92.0983789320710822, 0, 147.357406291313732, 0, -63.1531741248487421, 0, 5.61361547776433263, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.230245947330177705, 0, 0, 0, 0, 1.15122973665088853, 0, -13.8147568398106623, 0, 0, 0, 0, 0, 0, 2.30245947330177705, 0, -55.2590273592426493, 0, 92.0983789320710822, 0, 0, 0, 0, 0, 0, 0, 0, 2.30245947330177705, 0, -82.888541038863974, 0, 276.295136796213247, 0, -147.357406291313732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.15122973665088853, 0, -55.2590273592426493, 0, 276.295136796213247, 0, -294.714812582627463, 0, 63.1531741248487421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.230245947330177705, 0, -13.8147568398106623, 0, 92.0983789320710822, 0, -147.357406291313732, 0, 63.1531741248487421, 0, -5.61361547776433263, 0, + + 0, -0.210184831878141177, 0, 0, 0, 0, -1.05092415939070589, 0, 12.6110899126884706, 0, 0, 0, 0, 0, 0, -2.10184831878141177, 0, 50.4443596507538826, 0, -84.073932751256471, 0, 0, 0, 0, 0, 0, 0, 0, -2.10184831878141177, 0, 75.6665394761308239, 0, -252.221798253769413, 0, 134.518292402010354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.05092415939070589, 0, 50.4443596507538826, 0, -252.221798253769413, 0, 269.036584804020707, 0, -57.650696743718723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.210184831878141177, 0, 12.6110899126884706, 0, -84.073932751256471, 0, 134.518292402010354, 0, -57.650696743718723, 0, 5.12450637721944204, 0, + 0, 0, 0, 0, 5.46480562883167061, 0, 0, 0, 0, 0, 0, 21.8592225153266825, 0, -87.4368900613067298, 0, 0, 0, 0, 0, 0, 0, 0, 32.7888337729900237, 0, -262.310670183920189, 0, 262.310670183920189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21.8592225153266825, 0, -262.310670183920189, 0, 524.621340367840379, 0, -199.85574871155824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.46480562883167061, 0, -87.4368900613067298, 0, 262.310670183920189, 0, -199.85574871155824, 0, 33.3092914519263733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -4.54699313196849647, 0, 0, 0, 0, 0, 0, -18.1879725278739859, 0, 72.7518901114959435, 0, 0, 0, 0, 0, 0, 0, 0, -27.2819587918109788, 0, 218.255670334487831, 0, -218.255670334487831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18.1879725278739859, 0, 218.255670334487831, 0, -436.511340668975661, 0, 166.290034540562157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.54699313196849647, 0, 72.7518901114959435, 0, -218.255670334487831, 0, 166.290034540562157, 0, -27.7150057567603594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.757832188661416079, 0, 0, 0, 0, -2.77871802509185895, 0, 42.4386025650393004, 0, 0, 0, 0, 0, 0, -3.53655021375327503, 0, 113.169606840104801, 0, -254.631615390235802, 0, 0, 0, 0, 0, 0, 0, 0, -1.51566437732283216, 0, 84.8772051300786008, 0, -424.386025650393004, 0, 339.508820520314403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25261072955380536, 0, 0, 0, -84.8772051300786008, 0, 226.339213680209602, 0, -97.0025201486612581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25261072955380536, 0, -14.1462008550131001, 0, 84.8772051300786008, 0, -113.169606840104801, 0, 32.334173382887086, 0, 0, 0, + + 0, 0.572867287633682787, 0, 0, 0, 0, 2.10051338799017022, 0, -32.0805681074862361, 0, 0, 0, 0, 0, 0, 2.673380675623853, 0, -85.5481816199632961, 0, 192.483408644917416, 0, 0, 0, 0, 0, 0, 0, 0, 1.14573457526736557, 0, -64.1611362149724721, 0, 320.805681074862361, 0, -256.644544859889888, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.190955762544560929, 0, 0, 0, 64.1611362149724721, 0, -171.096363239926592, 0, 73.3270128171113967, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.190955762544560929, 0, 10.693522702495412, 0, -64.1611362149724721, 0, 85.5481816199632961, 0, -24.4423376057037989, 0, 0, 0, + 0, 0, 0, 0, -11.4573457526736557, 0, 0, 0, 0, 0, 0, -22.9146915053473115, 0, 160.40284053743118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160.40284053743118, 0, -384.966817289834833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.9146915053473115, 0, -160.40284053743118, 0, 0, 0, 183.317532042778492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11.4573457526736557, 0, -160.40284053743118, 0, 384.966817289834833, 0, -183.317532042778492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 7.82685718908155119, 0, 0, 0, 0, 0, 0, 15.6537143781631024, 0, -109.576000647141717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109.576000647141717, 0, 262.98240155314012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15.6537143781631024, 0, 109.576000647141717, 0, 0, 0, -125.229715025304819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.82685718908155119, 0, 109.576000647141717, 0, -262.98240155314012, 0, 125.229715025304819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1.39765306947884843, 0, 0, 0, 0, 1.39765306947884843, 0, -67.0873473349847245, 0, 0, 0, 0, 0, 0, -3.9134285945407756, 0, 0, 0, 313.074287563262048, 0, 0, 0, 0, 0, 0, 0, 0, -6.14967350570693308, 0, 187.844572537957229, 0, -313.074287563262048, 0, -250.459430050609638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.9567142972703878, 0, 107.339755735975559, 0, -563.533717613871686, 0, 500.918860101219276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.279530613895769685, 0, -13.4174694669969449, 0, 62.6148575126524095, 0, -50.0918860101219276, 0, 0, 0, 0, 0, + + 0, -0.855884214414465945, 0, 0, 0, 0, -0.855884214414465945, 0, 41.0824422918943654, 0, 0, 0, 0, 0, 0, 2.39647580036050465, 0, 0, 0, -191.718064028840372, 0, 0, 0, 0, 0, 0, 0, 0, 3.76589054342365016, 0, -115.030838417304223, 0, 191.718064028840372, 0, 153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.19823790018025232, 0, -65.7319076670309846, 0, 345.092515251912669, 0, -306.748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.171176842882893189, 0, 8.21648845837887307, 0, -38.3436128057680743, 0, 30.6748902446144595, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 17.4600379740551053, 0, 0, 0, 0, 0, 0, -23.2800506320734737, 0, -186.24040505658779, 0, 0, 0, 0, 0, 0, 0, 0, -81.480177212257158, 0, 434.560945132038176, 0, 260.736567079222906, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -23.2800506320734737, 0, 434.560945132038176, 0, -869.121890264076352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17.4600379740551053, 0, -186.24040505658779, 0, 260.736567079222906, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -9.46903507810723996, 0, 0, 0, 0, 0, 0, 12.6253801041429866, 0, 101.003040833143893, 0, 0, 0, 0, 0, 0, 0, 0, 44.1888303645004531, 0, -235.673761944002417, 0, -141.40425716640145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12.6253801041429866, 0, -235.673761944002417, 0, 471.347523888004833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.46903507810723996, 0, 101.003040833143893, 0, -141.40425716640145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2.20944151822502266, 0, 0, 0, 0, 6.62832455467506797, 0, 79.5398946561008156, 0, 0, 0, 0, 0, 0, 13.2566491093501359, 0, -318.159578624403263, 0, -212.106385749602175, 0, 0, 0, 0, 0, 0, 0, 0, -1.89380701562144799, 0, -159.079789312201631, 0, 1060.53192874801088, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.99705554946791864, 0, 227.256841874573759, 0, -636.319157248806525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.315634502603574665, 0, -11.3628420937286879, 0, 30.3009122499431679, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.0415407201146763, 0, 0, 0, 0, -3.1246221603440289, 0, -37.4954659241283468, 0, 0, 0, 0, 0, 0, -6.2492443206880578, 0, 149.981863696513387, 0, 99.9879091310089248, 0, 0, 0, 0, 0, 0, 0, 0, 0.892749188669722543, 0, 74.9909318482566936, 0, -499.939545655044624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.82703909745412139, 0, -107.129902640366705, 0, 299.963727393026774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.148791531444953757, 0, 5.35649513201833526, 0, -14.2839870187155607, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22.6163127796329711, 0, 0, 0, 0, 0, 0, 135.697876677797827, 0, 135.697876677797827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -949.885136744584786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -135.697876677797827, 0, 949.885136744584786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.6163127796329711, 0, -135.697876677797827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 8.98681142223825956, 0, 0, 0, 0, 0, 0, -53.9208685334295574, 0, -53.9208685334295574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 377.446079734006901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53.9208685334295574, 0, -377.446079734006901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.98681142223825956, 0, 53.9208685334295574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3.37005428333934733, 0, 0, 0, 0, -28.0837856944945611, 0, -67.4010856667869467, 0, 0, 0, 0, 0, 0, 15.7269199889169542, 0, 629.076799556678169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33.7005428333934733, 0, -943.615199335017254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.1057666574307952, 0, 269.604342667147787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.374450475926594148, 0, -7.48900951853188297, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.06570473737587758, 0, 0, 0, 0, 8.88087281146564647, 0, 21.3140947475175515, 0, 0, 0, 0, 0, 0, -4.97328877442076202, 0, -198.931550976830481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.6570473737587758, 0, 298.397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.14440731201730169, 0, -85.2563789900702061, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.11841163748620862, 0, 2.36823274972417239, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 24.8664438721038101, 0, 0, 0, 0, 0, 0, -298.397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 626.634385577016015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -298.397326465245721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24.8664438721038101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -5.42630291944221461, 0, 0, 0, 0, 0, 0, 65.1156350333065753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -136.742833569943808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65.1156350333065753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.42630291944221461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5.96893321138643607, 0, 0, 0, 0, 89.533998170796541, 0, 0, 0, 0, 0, 0, 0, 0, -250.695194878230315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179.067996341593082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -29.8446660569321803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.542630291944221461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6.10308329187281232, 0, 0, 0, 0, 91.5462493780921848, 0, 0, 0, 0, 0, 0, 0, 0, -256.329498258658117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183.09249875618437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -30.5154164593640616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.554825753806619302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.27258083654638245, 0, 0, 0, 0, 19.0887125481957368, 0, 0, 0, 0, 0, 0, 0, 0, -53.4483951349480631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38.1774250963914736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.36290418273191227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.115689166958762041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25.4516167309276491, 0, 0, 0, 0, 0, 0, 305.419400771131789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -641.380741619376757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 305.419400771131789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -25.4516167309276491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -7.67395118221990013, 0, 0, 0, 0, 0, 0, 92.0874141866388015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193.383569791941483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92.0874141866388015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7.67395118221990013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3.45327803199895506, 0, 0, 0, 0, -28.7773169333246255, 0, -69.0655606399791011, 0, 0, 0, 0, 0, 0, 16.1152974826617903, 0, 644.611899306471611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34.5327803199895506, 0, -966.917848959707416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.4294145688848252, 0, 276.262242559916405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.383697559110995006, 0, -7.67395118221990013, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.30521641151882637, 0, 0, 0, 0, -10.876803429323553, 0, -26.1043282303765273, 0, 0, 0, 0, 0, 0, 6.09100992042118971, 0, 243.640396816847588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.0521641151882637, 0, -365.460595225271382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.07584160035099142, 0, 104.417312921506109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145024045724314041, 0, -2.90048091448628081, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 23.2038473158902465, 0, 0, 0, 0, 0, 0, -139.223083895341479, 0, -139.223083895341479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 974.561587267390353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139.223083895341479, 0, -974.561587267390353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -23.2038473158902465, 0, 139.223083895341479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 10.3770759875713254, 0, 0, 0, 0, 0, 0, -62.2624559254279527, 0, -62.2624559254279527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 435.837191477995669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62.2624559254279527, 0, -435.837191477995669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.3770759875713254, 0, 62.2624559254279527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2.26998537228122744, 0, 0, 0, 0, 6.80995611684368233, 0, 81.7194734021241879, 0, 0, 0, 0, 0, 0, 13.6199122336873647, 0, -326.877893608496752, 0, -217.918595738997834, 0, 0, 0, 0, 0, 0, 0, 0, -1.94570174766962352, 0, -163.438946804248376, 0, 1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.16138886762047449, 0, 233.484209720354823, 0, -653.755787216993503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.32428362461160392, 0, -11.6742104860177411, 0, 31.1312279627139763, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.16447792575524938, 0, 0, 0, 0, 3.49343377726574814, 0, 41.9212053271889777, 0, 0, 0, 0, 0, 0, 6.98686755453149629, 0, -167.684821308755911, 0, -111.789880872503941, 0, 0, 0, 0, 0, 0, 0, 0, -0.998123936361642327, 0, -83.8424106543779555, 0, 558.949404362519703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.16072579847853403, 0, 119.774872363397079, 0, -335.369642617511822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.166353989393607054, 0, -5.98874361816985396, 0, 15.9699829817862772, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17.9662308545095619, 0, 0, 0, 0, 0, 0, 23.9549744726794158, 0, 191.639795781435327, 0, 0, 0, 0, 0, 0, 0, 0, 83.8424106543779555, 0, -447.159523490015762, 0, -268.295714094009457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23.9549744726794158, 0, -447.159523490015762, 0, 894.319046980031525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -17.9662308545095619, 0, 191.639795781435327, 0, -268.295714094009457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -10.3728082201740557, 0, 0, 0, 0, 0, 0, 13.8304109602320742, 0, 110.643287681856594, 0, 0, 0, 0, 0, 0, 0, 0, 48.4064383608122598, 0, -258.167671257665386, 0, -154.900602754599231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.8304109602320742, 0, -258.167671257665386, 0, 516.335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.3728082201740557, 0, 110.643287681856594, 0, -154.900602754599231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1.44066780835750773, 0, 0, 0, 0, 1.44066780835750773, 0, -69.1520548011603712, 0, 0, 0, 0, 0, 0, -4.03386986340102165, 0, 0, 0, 322.709589072081732, 0, 0, 0, 0, 0, 0, 0, 0, -6.33893835677303403, 0, 193.625753443249039, 0, -322.709589072081732, 0, -258.167671257665386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.01693493170051083, 0, 110.643287681856594, 0, -580.877260329747118, 0, 516.335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.288133561671501547, 0, -13.8304109602320742, 0, 64.5419178144163464, 0, -51.6335342515330771, 0, 0, 0, 0, 0, + + 0, 0.924460610246778137, 0, 0, 0, 0, 0.924460610246778137, 0, -44.3741092918453506, 0, 0, 0, 0, 0, 0, -2.58848970869097878, 0, 0, 0, 207.079176695278303, 0, 0, 0, 0, 0, 0, 0, 0, -4.0676266850858238, 0, 124.247506017166982, 0, -207.079176695278303, 0, -165.663341356222642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.29424485434548939, 0, 70.998574866952561, 0, -372.742518051500945, 0, 331.326682712445284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.184892122049355627, 0, -8.87482185836907012, 0, 41.4158353390556606, 0, -33.1326682712445284, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 11.8330958111587602, 0, 0, 0, 0, 0, 0, 23.6661916223175203, 0, -165.663341356222642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165.663341356222642, 0, 397.592019254934341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -23.6661916223175203, 0, 165.663341356222642, 0, 0, 0, -189.329532978540163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -11.8330958111587602, 0, 165.663341356222642, 0, -397.592019254934341, 0, 189.329532978540163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 8.36726229050048951, 0, 0, 0, 0, 0, 0, 16.734524581000979, 0, -117.141672067006853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117.141672067006853, 0, 281.140012960816447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -16.734524581000979, 0, 117.141672067006853, 0, 0, 0, -133.876196648007832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8.36726229050048951, 0, 117.141672067006853, 0, -281.140012960816447, 0, 133.876196648007832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.784430839734420891, 0, 0, 0, 0, -2.87624641235954327, 0, 43.9281270251275699, 0, 0, 0, 0, 0, 0, -3.66067725209396416, 0, 117.141672067006853, 0, -263.568762150765419, 0, 0, 0, 0, 0, 0, 0, 0, -1.56886167946884178, 0, 87.8562540502551398, 0, -439.281270251275699, 0, 351.425016201020559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.261476946578140297, 0, 0, 0, -87.8562540502551398, 0, 234.283344134013706, 0, -100.407147486005874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.261476946578140297, 0, -14.6427090083758566, 0, 87.8562540502551398, 0, -117.141672067006853, 0, 33.469049162001958, 0, 0, 0, + + 0, -0.607617515708582275, 0, 0, 0, 0, -2.22793089093146834, 0, 34.0265808796806074, 0, 0, 0, 0, 0, 0, -2.83554840664005062, 0, 90.7375490124816198, 0, -204.159485278083644, 0, 0, 0, 0, 0, 0, 0, 0, -1.21523503141716455, 0, 68.0531617593612148, 0, -340.265808796806074, 0, 272.212647037444859, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.202539171902860758, 0, 0, 0, -68.0531617593612148, 0, 181.47509802496324, 0, -77.7750420106985312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.202539171902860758, 0, -11.3421936265602025, 0, 68.0531617593612148, 0, -90.7375490124816198, 0, 25.9250140035661771, 0, 0, 0, + 0, 0, 0, 0, -5.67109681328010124, 0, 0, 0, 0, 0, 0, -22.6843872531204049, 0, 90.7375490124816198, 0, 0, 0, 0, 0, 0, 0, 0, -34.0265808796806074, 0, 272.212647037444859, 0, -272.212647037444859, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22.6843872531204049, 0, 272.212647037444859, 0, -544.425294074889719, 0, 207.400112028529417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.67109681328010124, 0, 90.7375490124816198, 0, -272.212647037444859, 0, 207.400112028529417, 0, -34.5666853380882361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -4.79295160072100929, 0, 0, 0, 0, 0, 0, -19.1718064028840372, 0, 76.6872256115361487, 0, 0, 0, 0, 0, 0, 0, 0, -28.7577096043260558, 0, 230.061676834608446, 0, -230.061676834608446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -19.1718064028840372, 0, 230.061676834608446, 0, -460.123353669216892, 0, 175.285087112082626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4.79295160072100929, 0, 76.6872256115361487, 0, -230.061676834608446, 0, 175.285087112082626, 0, -29.2141811853471043, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.239647580036050465, 0, 0, 0, 0, 1.19823790018025232, 0, -14.3788548021630279, 0, 0, 0, 0, 0, 0, 2.39647580036050465, 0, -57.5154192086521115, 0, 95.8590320144201859, 0, 0, 0, 0, 0, 0, 0, 0, 2.39647580036050465, 0, -86.2731288129781673, 0, 287.577096043260558, 0, -153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.19823790018025232, 0, -57.5154192086521115, 0, 287.577096043260558, 0, -306.748902446144595, 0, 65.7319076670309846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.239647580036050465, 0, -14.3788548021630279, 0, 95.8590320144201859, 0, -153.374451223072297, 0, 65.7319076670309846, 0, -5.84283623706942085, 0, + + 0, 0.220443711424950199, 0, 0, 0, 0, 1.10221855712475099, 0, -13.2266226854970119, 0, 0, 0, 0, 0, 0, 2.20443711424950199, 0, -52.9064907419880478, 0, 88.1774845699800796, 0, 0, 0, 0, 0, 0, 0, 0, 2.20443711424950199, 0, -79.3597361129820716, 0, 264.532453709940239, 0, -141.083975311968127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.10221855712475099, 0, -52.9064907419880478, 0, 264.532453709940239, 0, -282.167950623936255, 0, 60.4645608479863403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.220443711424950199, 0, -13.2266226854970119, 0, 88.1774845699800796, 0, -141.083975311968127, 0, 60.4645608479863403, 0, -5.37462763093211914, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.220443711424950199, 0, 0, 0, 0, 1.10221855712475099, 0, -13.2266226854970119, 0, 0, 0, 0, 0, 0, 2.20443711424950199, 0, -52.9064907419880478, 0, 88.1774845699800796, 0, 0, 0, 0, 0, 0, 0, 0, 2.20443711424950199, 0, -79.3597361129820716, 0, 264.532453709940239, 0, -141.083975311968127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.10221855712475099, 0, -52.9064907419880478, 0, 264.532453709940239, 0, -282.167950623936255, 0, 60.4645608479863403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.220443711424950199, 0, -13.2266226854970119, 0, 88.1774845699800796, 0, -141.083975311968127, 0, 60.4645608479863403, 0, -5.37462763093211914, 0, + + 0, 0.239647580036050465, 0, 0, 0, 0, 1.19823790018025232, 0, -14.3788548021630279, 0, 0, 0, 0, 0, 0, 2.39647580036050465, 0, -57.5154192086521115, 0, 95.8590320144201859, 0, 0, 0, 0, 0, 0, 0, 0, 2.39647580036050465, 0, -86.2731288129781673, 0, 287.577096043260558, 0, -153.374451223072297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.19823790018025232, 0, -57.5154192086521115, 0, 287.577096043260558, 0, -306.748902446144595, 0, 65.7319076670309846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.239647580036050465, 0, -14.3788548021630279, 0, 95.8590320144201859, 0, -153.374451223072297, 0, 65.7319076670309846, 0, -5.84283623706942085, 0, + 0, 0, 0, 0, 4.79295160072100929, 0, 0, 0, 0, 0, 0, 19.1718064028840372, 0, -76.6872256115361487, 0, 0, 0, 0, 0, 0, 0, 0, 28.7577096043260558, 0, -230.061676834608446, 0, 230.061676834608446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19.1718064028840372, 0, -230.061676834608446, 0, 460.123353669216892, 0, -175.285087112082626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.79295160072100929, 0, -76.6872256115361487, 0, 230.061676834608446, 0, -175.285087112082626, 0, 29.2141811853471043, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 5.67109681328010124, 0, 0, 0, 0, 0, 0, 22.6843872531204049, 0, -90.7375490124816198, 0, 0, 0, 0, 0, 0, 0, 0, 34.0265808796806074, 0, -272.212647037444859, 0, 272.212647037444859, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.6843872531204049, 0, -272.212647037444859, 0, 544.425294074889719, 0, -207.400112028529417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.67109681328010124, 0, -90.7375490124816198, 0, 272.212647037444859, 0, -207.400112028529417, 0, 34.5666853380882361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -0.607617515708582275, 0, 0, 0, 0, -2.22793089093146834, 0, 34.0265808796806074, 0, 0, 0, 0, 0, 0, -2.83554840664005062, 0, 90.7375490124816198, 0, -204.159485278083644, 0, 0, 0, 0, 0, 0, 0, 0, -1.21523503141716455, 0, 68.0531617593612148, 0, -340.265808796806074, 0, 272.212647037444859, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.202539171902860758, 0, 0, 0, -68.0531617593612148, 0, 181.47509802496324, 0, -77.7750420106985312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.202539171902860758, 0, -11.3421936265602025, 0, 68.0531617593612148, 0, -90.7375490124816198, 0, 25.9250140035661771, 0, 0, 0, + + 0, -0.784430839734420891, 0, 0, 0, 0, -2.87624641235954327, 0, 43.9281270251275699, 0, 0, 0, 0, 0, 0, -3.66067725209396416, 0, 117.141672067006853, 0, -263.568762150765419, 0, 0, 0, 0, 0, 0, 0, 0, -1.56886167946884178, 0, 87.8562540502551398, 0, -439.281270251275699, 0, 351.425016201020559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.261476946578140297, 0, 0, 0, -87.8562540502551398, 0, 234.283344134013706, 0, -100.407147486005874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.261476946578140297, 0, -14.6427090083758566, 0, 87.8562540502551398, 0, -117.141672067006853, 0, 33.469049162001958, 0, 0, 0, + 0, 0, 0, 0, -8.36726229050048951, 0, 0, 0, 0, 0, 0, -16.734524581000979, 0, 117.141672067006853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117.141672067006853, 0, -281.140012960816447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16.734524581000979, 0, -117.141672067006853, 0, 0, 0, 133.876196648007832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8.36726229050048951, 0, -117.141672067006853, 0, 281.140012960816447, 0, -133.876196648007832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -11.8330958111587602, 0, 0, 0, 0, 0, 0, -23.6661916223175203, 0, 165.663341356222642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165.663341356222642, 0, -397.592019254934341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23.6661916223175203, 0, -165.663341356222642, 0, 0, 0, 189.329532978540163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11.8330958111587602, 0, -165.663341356222642, 0, 397.592019254934341, 0, -189.329532978540163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0.924460610246778137, 0, 0, 0, 0, 0.924460610246778137, 0, -44.3741092918453506, 0, 0, 0, 0, 0, 0, -2.58848970869097878, 0, 0, 0, 207.079176695278303, 0, 0, 0, 0, 0, 0, 0, 0, -4.0676266850858238, 0, 124.247506017166982, 0, -207.079176695278303, 0, -165.663341356222642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.29424485434548939, 0, 70.998574866952561, 0, -372.742518051500945, 0, 331.326682712445284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.184892122049355627, 0, -8.87482185836907012, 0, 41.4158353390556606, 0, -33.1326682712445284, 0, 0, 0, 0, 0, + + 0, 1.44066780835750773, 0, 0, 0, 0, 1.44066780835750773, 0, -69.1520548011603712, 0, 0, 0, 0, 0, 0, -4.03386986340102165, 0, 0, 0, 322.709589072081732, 0, 0, 0, 0, 0, 0, 0, 0, -6.33893835677303403, 0, 193.625753443249039, 0, -322.709589072081732, 0, -258.167671257665386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.01693493170051083, 0, 110.643287681856594, 0, -580.877260329747118, 0, 516.335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.288133561671501547, 0, -13.8304109602320742, 0, 64.5419178144163464, 0, -51.6335342515330771, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10.3728082201740557, 0, 0, 0, 0, 0, 0, -13.8304109602320742, 0, -110.643287681856594, 0, 0, 0, 0, 0, 0, 0, 0, -48.4064383608122598, 0, 258.167671257665386, 0, 154.900602754599231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.8304109602320742, 0, 258.167671257665386, 0, -516.335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.3728082201740557, 0, -110.643287681856594, 0, 154.900602754599231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 17.9662308545095619, 0, 0, 0, 0, 0, 0, -23.9549744726794158, 0, -191.639795781435327, 0, 0, 0, 0, 0, 0, 0, 0, -83.8424106543779555, 0, 447.159523490015762, 0, 268.295714094009457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -23.9549744726794158, 0, 447.159523490015762, 0, -894.319046980031525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17.9662308545095619, 0, -191.639795781435327, 0, 268.295714094009457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1.16447792575524938, 0, 0, 0, 0, 3.49343377726574814, 0, 41.9212053271889777, 0, 0, 0, 0, 0, 0, 6.98686755453149629, 0, -167.684821308755911, 0, -111.789880872503941, 0, 0, 0, 0, 0, 0, 0, 0, -0.998123936361642327, 0, -83.8424106543779555, 0, 558.949404362519703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.16072579847853403, 0, 119.774872363397079, 0, -335.369642617511822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.166353989393607054, 0, -5.98874361816985396, 0, 15.9699829817862772, 0, 0, 0, 0, 0, 0, 0, + + 0, -2.26998537228122744, 0, 0, 0, 0, 6.80995611684368233, 0, 81.7194734021241879, 0, 0, 0, 0, 0, 0, 13.6199122336873647, 0, -326.877893608496752, 0, -217.918595738997834, 0, 0, 0, 0, 0, 0, 0, 0, -1.94570174766962352, 0, -163.438946804248376, 0, 1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.16138886762047449, 0, 233.484209720354823, 0, -653.755787216993503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.32428362461160392, 0, -11.6742104860177411, 0, 31.1312279627139763, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10.3770759875713254, 0, 0, 0, 0, 0, 0, 62.2624559254279527, 0, 62.2624559254279527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -435.837191477995669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62.2624559254279527, 0, 435.837191477995669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10.3770759875713254, 0, -62.2624559254279527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -23.2038473158902465, 0, 0, 0, 0, 0, 0, 139.223083895341479, 0, 139.223083895341479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -974.561587267390353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -139.223083895341479, 0, 974.561587267390353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23.2038473158902465, 0, -139.223083895341479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1.30521641151882637, 0, 0, 0, 0, -10.876803429323553, 0, -26.1043282303765273, 0, 0, 0, 0, 0, 0, 6.09100992042118971, 0, 243.640396816847588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.0521641151882637, 0, -365.460595225271382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.07584160035099142, 0, 104.417312921506109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.145024045724314041, 0, -2.90048091448628081, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 3.45327803199895506, 0, 0, 0, 0, -28.7773169333246255, 0, -69.0655606399791011, 0, 0, 0, 0, 0, 0, 16.1152974826617903, 0, 644.611899306471611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34.5327803199895506, 0, -966.917848959707416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.4294145688848252, 0, 276.262242559916405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.383697559110995006, 0, -7.67395118221990013, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7.67395118221990013, 0, 0, 0, 0, 0, 0, -92.0874141866388015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193.383569791941483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -92.0874141866388015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7.67395118221990013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 25.4516167309276491, 0, 0, 0, 0, 0, 0, -305.419400771131789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 641.380741619376757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -305.419400771131789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25.4516167309276491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1.27258083654638245, 0, 0, 0, 0, 19.0887125481957368, 0, 0, 0, 0, 0, 0, 0, 0, -53.4483951349480631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38.1774250963914736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.36290418273191227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.115689166958762041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -6.10308329187281232, 0, 0, 0, 0, 91.5462493780921848, 0, 0, 0, 0, 0, 0, 0, 0, -256.329498258658117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183.09249875618437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -30.5154164593640616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.554825753806619302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 6.65790904567943162, 0, 0, 0, 0, -122.061665837456246, 0, 0, 0, 0, 0, 0, 0, 0, 439.421997014842487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -439.421997014842487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122.061665837456246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.65790904567943162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6.10308329187281232, 0, 0, 0, 0, 0, 0, 91.5462493780921848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -256.329498258658117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183.09249875618437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -30.5154164593640616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.554825753806619302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 29.2693592405667964, 0, 0, 0, 0, 0, 0, -439.040388608501947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1229.31308810380545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -878.080777217003893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146.346796202833982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.66085084005152695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1.15689166958762041, 0, 0, 0, 0, -12.7258083654638245, 0, -25.4516167309276491, 0, 0, 0, 0, 0, 0, 15.2709700385565894, 0, 305.419400771131789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15.2709700385565894, 0, -641.380741619376757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -12.7258083654638245, 0, 305.419400771131789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.15689166958762041, 0, -25.4516167309276491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -3.83697559110995006, 0, 0, 0, 0, 42.2067315022094507, 0, 84.4134630044189014, 0, 0, 0, 0, 0, 0, -50.6480778026513408, 0, -1012.96155605302682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -50.6480778026513408, 0, 2127.21926771135631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42.2067315022094507, 0, -1012.96155605302682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.83697559110995006, 0, 84.4134630044189014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10.3598340959968652, 0, 0, 0, 0, 0, 0, -86.3319507999738764, 0, -69.0655606399791011, 0, 0, 0, 0, 0, 0, 0, 0, 48.3458924479853708, 0, 644.611899306471611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103.598340959968652, 0, -966.917848959707416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40.2882437066544757, 0, 276.262242559916405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.15109267733298502, 0, -7.67395118221990013, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -27.4095446418953537, 0, 0, 0, 0, 0, 0, 228.412872015794614, 0, 182.730297612635691, 0, 0, 0, 0, 0, 0, 0, 0, -127.911208328844984, 0, -1705.48277771793312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -274.095446418953537, 0, 2558.22416657689968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106.59267360737082, 0, -730.921190450542765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.04550496021059485, 0, 20.3033664014039657, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1.16019236579451232, 0, 0, 0, 0, 5.80096182897256162, 0, 46.407694631780493, 0, 0, 0, 0, 0, 0, 6.96115419476707395, 0, -278.446167790682958, 0, -139.223083895341479, 0, 0, 0, 0, 0, 0, 0, 0, -6.96115419476707395, 0, 0, 0, 974.561587267390353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.80096182897256162, 0, 278.446167790682958, 0, -974.561587267390353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.16019236579451232, 0, -46.407694631780493, 0, 139.223083895341479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 2.59426899689283136, 0, 0, 0, 0, -12.9713449844641568, 0, -103.770759875713254, 0, 0, 0, 0, 0, 0, -15.5656139813569882, 0, 622.624559254279527, 0, 311.312279627139763, 0, 0, 0, 0, 0, 0, 0, 0, 15.5656139813569882, 0, 0, 0, -2179.18595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12.9713449844641568, 0, -622.624559254279527, 0, 2179.18595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.59426899689283136, 0, 103.770759875713254, 0, -311.312279627139763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11.3499268614061372, 0, 0, 0, 0, 0, 0, 34.0497805842184116, 0, 136.199122336873647, 0, 0, 0, 0, 0, 0, 0, 0, 68.0995611684368233, 0, -544.796489347494586, 0, -217.918595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -9.72850873834811761, 0, -272.398244673747293, 0, 1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -30.8069443381023724, 0, 389.140349533924704, 0, -653.755787216993503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.6214181230580196, 0, -19.4570174766962352, 0, 31.1312279627139763, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 22.1250805893497382, 0, 0, 0, 0, 0, 0, -66.3752417680492147, 0, -265.500967072196859, 0, 0, 0, 0, 0, 0, 0, 0, -132.750483536098429, 0, 1062.00386828878744, 0, 424.801547315514974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18.9643547908712042, 0, 531.001934144393718, 0, -2124.00773657757487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60.0537901710921467, 0, -758.574191634848168, 0, 1274.40464194654492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.16072579847853403, 0, 37.9287095817424084, 0, -60.6859353307878535, 0, 0, 0, 0, 0, 0, 0, + 0, 0.998123936361642327, 0, 0, 0, 0, -0.332707978787214109, 0, -53.8986925635286856, 0, 0, 0, 0, 0, 0, -5.98874361816985396, 0, 71.8649234180382475, 0, 287.45969367215299, 0, 0, 0, 0, 0, 0, 0, 0, -5.98874361816985396, 0, 251.527231963133866, 0, -670.739285235023644, 0, -268.295714094009457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.332707978787214109, 0, 71.8649234180382475, 0, -670.739285235023644, 0, 894.319046980031525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.998123936361642327, 0, -53.8986925635286856, 0, 287.45969367215299, 0, -268.295714094009457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.72880137002900928, 0, 0, 0, 0, 0.576267123343003093, 0, 93.3552739815665011, 0, 0, 0, 0, 0, 0, 10.3728082201740557, 0, -124.473698642088668, 0, -497.894794568354673, 0, 0, 0, 0, 0, 0, 0, 0, 10.3728082201740557, 0, -435.657945247310338, 0, 1161.75452065949424, 0, 464.701808263797694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.576267123343003093, 0, -124.473698642088668, 0, 1161.75452065949424, 0, -1549.00602754599231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.72880137002900928, 0, 93.3552739815665011, 0, -497.894794568354673, 0, 464.701808263797694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10.0846746585025541, 0, 0, 0, 0, 0, 0, 10.0846746585025541, 0, -161.354794536040866, 0, 0, 0, 0, 0, 0, 0, 0, -28.2370890438071516, 0, 0, 0, 451.793424700914425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44.3725684974112382, 0, 451.793424700914425, 0, -451.793424700914425, 0, -258.167671257665386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.1185445219035758, 0, 258.167671257665386, 0, -813.228164461645965, 0, 516.335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.01693493170051083, 0, -32.2709589072081732, 0, 90.358684940182885, 0, -51.6335342515330771, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -15.7158303741952283, 0, 0, 0, 0, 0, 0, -15.7158303741952283, 0, 251.453285987123653, 0, 0, 0, 0, 0, 0, 0, 0, 44.0043250477466393, 0, 0, 0, -704.06920076394623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69.1496536464590047, 0, -704.06920076394623, 0, 704.06920076394623, 0, 402.325257579397845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22.0021625238733197, 0, -402.325257579397845, 0, 1267.32456137510321, 0, -804.650515158795691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.14316607483904567, 0, 50.2906571974247307, 0, -140.813840152789246, 0, 80.4650515158795691, 0, 0, 0, 0, 0, + 0, -0.73956848819742251, 0, 0, 0, 0, -2.21870546459226753, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, -1.47913697639484502, 0, 94.6647664892700813, 0, -331.326682712445284, 0, 0, 0, 0, 0, 0, 0, 0, 1.47913697639484502, 0, 0, 0, -331.326682712445284, 0, 530.122692339912455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.21870546459226753, 0, -94.6647664892700813, 0, 331.326682712445284, 0, 0, 0, -189.329532978540163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.73956848819742251, 0, -47.3323832446350406, 0, 331.326682712445284, 0, -530.122692339912455, 0, 189.329532978540163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.04590778631256119, 0, 0, 0, 0, 3.13772335893768356, 0, -66.938098324003916, 0, 0, 0, 0, 0, 0, 2.09181557262512238, 0, -133.876196648007832, 0, 468.566688268027412, 0, 0, 0, 0, 0, 0, 0, 0, -2.09181557262512238, 0, 0, 0, 468.566688268027412, 0, -749.70670122884386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.13772335893768356, 0, 133.876196648007832, 0, -468.566688268027412, 0, 0, 0, 267.752393296015664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.04590778631256119, 0, 66.938098324003916, 0, -468.566688268027412, 0, 749.70670122884386, 0, -267.752393296015664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7.05987755760978802, 0, 0, 0, 0, 0, 0, -25.8862177112358894, 0, 131.78438107538271, 0, 0, 0, 0, 0, 0, 0, 0, -32.9460952688456774, 0, 351.425016201020559, 0, -474.423771871377755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.119755115219576, 0, 263.568762150765419, 0, -790.706286452296258, 0, 451.832163687026433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.35329251920326267, 0, 0, 0, -158.141257290459252, 0, 301.221442458017622, 0, -100.407147486005874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.35329251920326267, 0, -43.9281270251275699, 0, 158.141257290459252, 0, -150.610721229008811, 0, 33.469049162001958, 0, 0, 0, + + 0, 0, 0, 0, 9.11426273562873413, 0, 0, 0, 0, 0, 0, 33.4189633639720251, 0, -170.132904398403037, 0, 0, 0, 0, 0, 0, 0, 0, 42.5332260996007593, 0, -453.687745062408099, 0, 612.478455834250933, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18.2285254712574683, 0, -340.265808796806074, 0, 1020.79742639041822, 0, -583.312815080238984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.03808757854291138, 0, 0, 0, 204.159485278083644, 0, -388.875210053492656, 0, 129.625070017830885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.03808757854291138, 0, 56.7109681328010124, 0, -204.159485278083644, 0, 194.437605026746328, 0, -43.2083566726102951, 0, 0, 0, + 0, 0.405078343805721517, 0, 0, 0, 0, 2.02539171902860758, 0, -28.3554840664005062, 0, 0, 0, 0, 0, 0, 4.05078343805721517, 0, -113.421936265602025, 0, 226.843872531204049, 0, 0, 0, 0, 0, 0, 0, 0, 4.05078343805721517, 0, -170.132904398403037, 0, 680.531617593612148, 0, -453.687745062408099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.02539171902860758, 0, -113.421936265602025, 0, 680.531617593612148, 0, -907.375490124816198, 0, 259.250140035661771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.405078343805721517, 0, -28.3554840664005062, 0, 226.843872531204049, 0, -453.687745062408099, 0, 259.250140035661771, 0, -34.5666853380882361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.479295160072100929, 0, 0, 0, 0, -2.39647580036050465, 0, 33.5506612050470651, 0, 0, 0, 0, 0, 0, -4.79295160072100929, 0, 134.20264482018826, 0, -268.40528964037652, 0, 0, 0, 0, 0, 0, 0, 0, -4.79295160072100929, 0, 201.30396723028239, 0, -805.215868921129561, 0, 536.810579280753041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.39647580036050465, 0, 134.20264482018826, 0, -805.215868921129561, 0, 1073.62115856150608, 0, -306.748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.479295160072100929, 0, 33.5506612050470651, 0, -268.40528964037652, 0, 536.810579280753041, 0, -306.748902446144595, 0, 40.899853659485946, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2.63612338039655511, 0, 0, 0, 0, 0, 0, 13.1806169019827756, 0, -52.7224676079311022, 0, 0, 0, 0, 0, 0, 0, 0, 26.3612338039655511, 0, -210.889870431724409, 0, 210.889870431724409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26.3612338039655511, 0, -316.334805647586613, 0, 632.669611295173227, 0, -241.01699477911361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.1806169019827756, 0, -210.889870431724409, 0, 632.669611295173227, 0, -482.03398955822722, 0, 80.3389982597045367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.63612338039655511, 0, -52.7224676079311022, 0, 210.889870431724409, 0, -241.01699477911361, 0, 80.3389982597045367, 0, -5.84283623706942085, 0, + + 0, 0, 0, 0, -2.86576824852435259, 0, 0, 0, 0, 0, 0, -14.3288412426217629, 0, 57.3153649704870517, 0, 0, 0, 0, 0, 0, 0, 0, -28.6576824852435259, 0, 229.261459881948207, 0, -229.261459881948207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -28.6576824852435259, 0, 343.89218982292231, 0, -687.784379645844621, 0, 262.013097007940808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.3288412426217629, 0, 229.261459881948207, 0, -687.784379645844621, 0, 524.026194015881616, 0, -87.337699002646936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.86576824852435259, 0, 57.3153649704870517, 0, -229.261459881948207, 0, 262.013097007940808, 0, -87.337699002646936, 0, 6.35183265473795898, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2.86576824852435259, 0, 0, 0, 0, 0, 0, 14.3288412426217629, 0, -57.3153649704870517, 0, 0, 0, 0, 0, 0, 0, 0, 28.6576824852435259, 0, -229.261459881948207, 0, 229.261459881948207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28.6576824852435259, 0, -343.89218982292231, 0, 687.784379645844621, 0, -262.013097007940808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.3288412426217629, 0, -229.261459881948207, 0, 687.784379645844621, 0, -524.026194015881616, 0, 87.337699002646936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.86576824852435259, 0, -57.3153649704870517, 0, 229.261459881948207, 0, -262.013097007940808, 0, 87.337699002646936, 0, -6.35183265473795898, 0, + + 0, 0, 0, 0, -2.63612338039655511, 0, 0, 0, 0, 0, 0, -13.1806169019827756, 0, 52.7224676079311022, 0, 0, 0, 0, 0, 0, 0, 0, -26.3612338039655511, 0, 210.889870431724409, 0, -210.889870431724409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26.3612338039655511, 0, 316.334805647586613, 0, -632.669611295173227, 0, 241.01699477911361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.1806169019827756, 0, 210.889870431724409, 0, -632.669611295173227, 0, 482.03398955822722, 0, -80.3389982597045367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.63612338039655511, 0, 52.7224676079311022, 0, -210.889870431724409, 0, 241.01699477911361, 0, -80.3389982597045367, 0, 5.84283623706942085, 0, + 0, -0.479295160072100929, 0, 0, 0, 0, -2.39647580036050465, 0, 33.5506612050470651, 0, 0, 0, 0, 0, 0, -4.79295160072100929, 0, 134.20264482018826, 0, -268.40528964037652, 0, 0, 0, 0, 0, 0, 0, 0, -4.79295160072100929, 0, 201.30396723028239, 0, -805.215868921129561, 0, 536.810579280753041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.39647580036050465, 0, 134.20264482018826, 0, -805.215868921129561, 0, 1073.62115856150608, 0, -306.748902446144595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.479295160072100929, 0, 33.5506612050470651, 0, -268.40528964037652, 0, 536.810579280753041, 0, -306.748902446144595, 0, 40.899853659485946, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.405078343805721517, 0, 0, 0, 0, 2.02539171902860758, 0, -28.3554840664005062, 0, 0, 0, 0, 0, 0, 4.05078343805721517, 0, -113.421936265602025, 0, 226.843872531204049, 0, 0, 0, 0, 0, 0, 0, 0, 4.05078343805721517, 0, -170.132904398403037, 0, 680.531617593612148, 0, -453.687745062408099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.02539171902860758, 0, -113.421936265602025, 0, 680.531617593612148, 0, -907.375490124816198, 0, 259.250140035661771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.405078343805721517, 0, -28.3554840664005062, 0, 226.843872531204049, 0, -453.687745062408099, 0, 259.250140035661771, 0, -34.5666853380882361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9.11426273562873413, 0, 0, 0, 0, 0, 0, -33.4189633639720251, 0, 170.132904398403037, 0, 0, 0, 0, 0, 0, 0, 0, -42.5332260996007593, 0, 453.687745062408099, 0, -612.478455834250933, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18.2285254712574683, 0, 340.265808796806074, 0, -1020.79742639041822, 0, 583.312815080238984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.03808757854291138, 0, 0, 0, -204.159485278083644, 0, 388.875210053492656, 0, -129.625070017830885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.03808757854291138, 0, -56.7109681328010124, 0, 204.159485278083644, 0, -194.437605026746328, 0, 43.2083566726102951, 0, 0, 0, + + 0, 0, 0, 0, 7.05987755760978802, 0, 0, 0, 0, 0, 0, 25.8862177112358894, 0, -131.78438107538271, 0, 0, 0, 0, 0, 0, 0, 0, 32.9460952688456774, 0, -351.425016201020559, 0, 474.423771871377755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.119755115219576, 0, -263.568762150765419, 0, 790.706286452296258, 0, -451.832163687026433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.35329251920326267, 0, 0, 0, 158.141257290459252, 0, -301.221442458017622, 0, 100.407147486005874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.35329251920326267, 0, 43.9281270251275699, 0, -158.141257290459252, 0, 150.610721229008811, 0, -33.469049162001958, 0, 0, 0, + 0, 1.04590778631256119, 0, 0, 0, 0, 3.13772335893768356, 0, -66.938098324003916, 0, 0, 0, 0, 0, 0, 2.09181557262512238, 0, -133.876196648007832, 0, 468.566688268027412, 0, 0, 0, 0, 0, 0, 0, 0, -2.09181557262512238, 0, 0, 0, 468.566688268027412, 0, -749.70670122884386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.13772335893768356, 0, 133.876196648007832, 0, -468.566688268027412, 0, 0, 0, 267.752393296015664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.04590778631256119, 0, 66.938098324003916, 0, -468.566688268027412, 0, 749.70670122884386, 0, -267.752393296015664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.73956848819742251, 0, 0, 0, 0, -2.21870546459226753, 0, 47.3323832446350406, 0, 0, 0, 0, 0, 0, -1.47913697639484502, 0, 94.6647664892700813, 0, -331.326682712445284, 0, 0, 0, 0, 0, 0, 0, 0, 1.47913697639484502, 0, 0, 0, -331.326682712445284, 0, 530.122692339912455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.21870546459226753, 0, -94.6647664892700813, 0, 331.326682712445284, 0, 0, 0, -189.329532978540163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.73956848819742251, 0, -47.3323832446350406, 0, 331.326682712445284, 0, -530.122692339912455, 0, 189.329532978540163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15.7158303741952283, 0, 0, 0, 0, 0, 0, 15.7158303741952283, 0, -251.453285987123653, 0, 0, 0, 0, 0, 0, 0, 0, -44.0043250477466393, 0, 0, 0, 704.06920076394623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69.1496536464590047, 0, 704.06920076394623, 0, -704.06920076394623, 0, -402.325257579397845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22.0021625238733197, 0, 402.325257579397845, 0, -1267.32456137510321, 0, 804.650515158795691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.14316607483904567, 0, -50.2906571974247307, 0, 140.813840152789246, 0, -80.4650515158795691, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -10.0846746585025541, 0, 0, 0, 0, 0, 0, -10.0846746585025541, 0, 161.354794536040866, 0, 0, 0, 0, 0, 0, 0, 0, 28.2370890438071516, 0, 0, 0, -451.793424700914425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44.3725684974112382, 0, -451.793424700914425, 0, 451.793424700914425, 0, 258.167671257665386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.1185445219035758, 0, -258.167671257665386, 0, 813.228164461645965, 0, -516.335342515330771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.01693493170051083, 0, 32.2709589072081732, 0, -90.358684940182885, 0, 51.6335342515330771, 0, 0, 0, 0, 0, + 0, -1.72880137002900928, 0, 0, 0, 0, 0.576267123343003093, 0, 93.3552739815665011, 0, 0, 0, 0, 0, 0, 10.3728082201740557, 0, -124.473698642088668, 0, -497.894794568354673, 0, 0, 0, 0, 0, 0, 0, 0, 10.3728082201740557, 0, -435.657945247310338, 0, 1161.75452065949424, 0, 464.701808263797694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.576267123343003093, 0, -124.473698642088668, 0, 1161.75452065949424, 0, -1549.00602754599231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.72880137002900928, 0, 93.3552739815665011, 0, -497.894794568354673, 0, 464.701808263797694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.998123936361642327, 0, 0, 0, 0, -0.332707978787214109, 0, -53.8986925635286856, 0, 0, 0, 0, 0, 0, -5.98874361816985396, 0, 71.8649234180382475, 0, 287.45969367215299, 0, 0, 0, 0, 0, 0, 0, 0, -5.98874361816985396, 0, 251.527231963133866, 0, -670.739285235023644, 0, -268.295714094009457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.332707978787214109, 0, 71.8649234180382475, 0, -670.739285235023644, 0, 894.319046980031525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.998123936361642327, 0, -53.8986925635286856, 0, 287.45969367215299, 0, -268.295714094009457, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22.1250805893497382, 0, 0, 0, 0, 0, 0, 66.3752417680492147, 0, 265.500967072196859, 0, 0, 0, 0, 0, 0, 0, 0, 132.750483536098429, 0, -1062.00386828878744, 0, -424.801547315514974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18.9643547908712042, 0, -531.001934144393718, 0, 2124.00773657757487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -60.0537901710921467, 0, 758.574191634848168, 0, -1274.40464194654492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.16072579847853403, 0, -37.9287095817424084, 0, 60.6859353307878535, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 11.3499268614061372, 0, 0, 0, 0, 0, 0, -34.0497805842184116, 0, -136.199122336873647, 0, 0, 0, 0, 0, 0, 0, 0, -68.0995611684368233, 0, 544.796489347494586, 0, 217.918595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.72850873834811761, 0, 272.398244673747293, 0, -1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30.8069443381023724, 0, -389.140349533924704, 0, 653.755787216993503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.6214181230580196, 0, 19.4570174766962352, 0, -31.1312279627139763, 0, 0, 0, 0, 0, 0, 0, + 0, 2.59426899689283136, 0, 0, 0, 0, -12.9713449844641568, 0, -103.770759875713254, 0, 0, 0, 0, 0, 0, -15.5656139813569882, 0, 622.624559254279527, 0, 311.312279627139763, 0, 0, 0, 0, 0, 0, 0, 0, 15.5656139813569882, 0, 0, 0, -2179.18595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12.9713449844641568, 0, -622.624559254279527, 0, 2179.18595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.59426899689283136, 0, 103.770759875713254, 0, -311.312279627139763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.16019236579451232, 0, 0, 0, 0, 5.80096182897256162, 0, 46.407694631780493, 0, 0, 0, 0, 0, 0, 6.96115419476707395, 0, -278.446167790682958, 0, -139.223083895341479, 0, 0, 0, 0, 0, 0, 0, 0, -6.96115419476707395, 0, 0, 0, 974.561587267390353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5.80096182897256162, 0, 278.446167790682958, 0, -974.561587267390353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.16019236579451232, 0, -46.407694631780493, 0, 139.223083895341479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 27.4095446418953537, 0, 0, 0, 0, 0, 0, -228.412872015794614, 0, -182.730297612635691, 0, 0, 0, 0, 0, 0, 0, 0, 127.911208328844984, 0, 1705.48277771793312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274.095446418953537, 0, -2558.22416657689968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -106.59267360737082, 0, 730.921190450542765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.04550496021059485, 0, -20.3033664014039657, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -10.3598340959968652, 0, 0, 0, 0, 0, 0, 86.3319507999738764, 0, 69.0655606399791011, 0, 0, 0, 0, 0, 0, 0, 0, -48.3458924479853708, 0, -644.611899306471611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -103.598340959968652, 0, 966.917848959707416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40.2882437066544757, 0, -276.262242559916405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.15109267733298502, 0, 7.67395118221990013, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3.83697559110995006, 0, 0, 0, 0, 42.2067315022094507, 0, 84.4134630044189014, 0, 0, 0, 0, 0, 0, -50.6480778026513408, 0, -1012.96155605302682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -50.6480778026513408, 0, 2127.21926771135631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42.2067315022094507, 0, -1012.96155605302682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.83697559110995006, 0, 84.4134630044189014, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.15689166958762041, 0, 0, 0, 0, -12.7258083654638245, 0, -25.4516167309276491, 0, 0, 0, 0, 0, 0, 15.2709700385565894, 0, 305.419400771131789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15.2709700385565894, 0, -641.380741619376757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -12.7258083654638245, 0, 305.419400771131789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.15689166958762041, 0, -25.4516167309276491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -29.2693592405667964, 0, 0, 0, 0, 0, 0, 439.040388608501947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1229.31308810380545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 878.080777217003893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -146.346796202833982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.66085084005152695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 6.10308329187281232, 0, 0, 0, 0, 0, 0, -91.5462493780921848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256.329498258658117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183.09249875618437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30.5154164593640616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.554825753806619302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6.65790904567943162, 0, 0, 0, 0, -122.061665837456246, 0, 0, 0, 0, 0, 0, 0, 0, 439.421997014842487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -439.421997014842487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122.061665837456246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.65790904567943162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6.79519996490629405, 0, 0, 0, 0, 124.578666023282058, 0, 0, 0, 0, 0, 0, 0, 0, -448.483197683815407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 448.483197683815407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124.578666023282058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.79519996490629405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.35903999298125881, 0, 0, 0, 0, 24.9157332046564115, 0, 0, 0, 0, 0, 0, 0, 0, -89.6966395367630815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89.6966395367630815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -24.9157332046564115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.35903999298125881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -29.8988798455876938, 0, 0, 0, 0, 0, 0, 448.483197683815407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1255.75295351468314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 896.966395367630815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -149.494399227938469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.71807998596251762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -8.63106316365916572, 0, 0, 0, 0, 0, 0, 129.465947454887486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362.50465287368496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258.931894909774972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43.1553158182958286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.784642105787196884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3.92321052893598442, 0, 0, 0, 0, -43.1553158182958286, 0, -86.3106316365916572, 0, 0, 0, 0, 0, 0, 51.7863789819549943, 0, 1035.72757963909989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51.7863789819549943, 0, -2175.02791724210976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43.1553158182958286, 0, 1035.72757963909989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.92321052893598442, 0, -86.3106316365916572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.41689713908309089, 0, 0, 0, 0, -15.5858685299139998, 0, -31.1717370598279997, 0, 0, 0, 0, 0, 0, 18.7030422358967998, 0, 374.060844717935996, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18.7030422358967998, 0, -785.527773907665592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15.5858685299139998, 0, 374.060844717935996, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.41689713908309089, 0, -31.1717370598279997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 28.0545633538451997, 0, 0, 0, 0, 0, 0, -233.788027948709998, 0, -187.030422358967998, 0, 0, 0, 0, 0, 0, 0, 0, 130.921295651277599, 0, 1745.61727535036798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280.545633538451997, 0, -2618.42591302555197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109.101079709397999, 0, 748.121689435871992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.11717370598279997, 0, -20.7811580398853331, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 11.9625060081673068, 0, 0, 0, 0, 0, 0, -99.6875500680608898, 0, -79.7500400544487119, 0, 0, 0, 0, 0, 0, 0, 0, 55.8250280381140983, 0, 744.333707174854644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119.625060081673068, 0, -1116.50056076228197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -46.5208566984284153, 0, 319.000160217794847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.32916733424081186, 0, -8.86111556160541243, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2.65833466848162373, 0, 0, 0, 0, 13.2916733424081186, 0, 106.333386739264949, 0, 0, 0, 0, 0, 0, 15.9500080108897424, 0, -638.000320435589695, 0, -319.000160217794847, 0, 0, 0, 0, 0, 0, 0, 0, -15.9500080108897424, 0, 0, 0, 2233.00112152456393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -13.2916733424081186, 0, 638.000320435589695, 0, -2233.00112152456393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.65833466848162373, 0, -106.333386739264949, 0, 319.000160217794847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.29713449844641568, 0, 0, 0, 0, 6.48567249223207841, 0, 51.8853799378566272, 0, 0, 0, 0, 0, 0, 7.78280699067849409, 0, -311.312279627139763, 0, -155.656139813569882, 0, 0, 0, 0, 0, 0, 0, 0, -7.78280699067849409, 0, 0, 0, 1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.48567249223207841, 0, 311.312279627139763, 0, -1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.29713449844641568, 0, -51.8853799378566272, 0, 155.656139813569882, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22.6998537228122744, 0, 0, 0, 0, 0, 0, 68.0995611684368233, 0, 272.398244673747293, 0, 0, 0, 0, 0, 0, 0, 0, 136.199122336873647, 0, -1089.59297869498917, 0, -435.837191477995669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -19.4570174766962352, 0, -544.796489347494586, 0, 2179.18595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61.6138886762047449, 0, 778.280699067849409, 0, -1307.51157443398701, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.2428362461160392, 0, -38.9140349533924704, 0, 62.2624559254279527, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -12.4332219360519051, 0, 0, 0, 0, 0, 0, 37.2996658081557152, 0, 149.198663232622861, 0, 0, 0, 0, 0, 0, 0, 0, 74.5993316163114303, 0, -596.794652930491443, 0, -238.717861172196577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.6570473737587758, 0, -298.397326465245721, 0, 1193.58930586098289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -33.7473166835694566, 0, 426.281894950351031, 0, -716.153583516589731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.77617456229312929, 0, -21.3140947475175515, 0, 34.1025515960280824, 0, 0, 0, 0, 0, 0, 0, + 0, 1.77617456229312929, 0, 0, 0, 0, -0.592058187431043098, 0, -95.9134263638289819, 0, 0, 0, 0, 0, 0, -10.6570473737587758, 0, 127.884568485105309, 0, 511.538273940421237, 0, 0, 0, 0, 0, 0, 0, 0, -10.6570473737587758, 0, 447.595989697868582, 0, -1193.58930586098289, 0, -477.435722344393154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.592058187431043098, 0, 127.884568485105309, 0, -1193.58930586098289, 0, 1591.45240781464385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.77617456229312929, 0, -95.9134263638289819, 0, 511.538273940421237, 0, -477.435722344393154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.07809706940565876, 0, 0, 0, 0, -0.359365689801886252, 0, -58.2172417479055728, 0, 0, 0, 0, 0, 0, -6.46858241643395253, 0, 77.6229889972074304, 0, 310.491955988829722, 0, 0, 0, 0, 0, 0, 0, 0, -6.46858241643395253, 0, 271.680461490226006, 0, -724.481230640602684, 0, -289.792492256241073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.359365689801886252, 0, 77.6229889972074304, 0, -724.481230640602684, 0, 965.974974187470245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.07809706940565876, 0, -58.2172417479055728, 0, 310.491955988829722, 0, -289.792492256241073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 16.1714560410848813, 0, 0, 0, 0, 0, 0, 16.1714560410848813, 0, -258.743296657358101, 0, 0, 0, 0, 0, 0, 0, 0, -45.2800769150376677, 0, 0, 0, 724.481230640602684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71.1544065807734779, 0, 724.481230640602684, 0, -724.481230640602684, 0, -413.989274651772962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22.6400384575188339, 0, 413.989274651772962, 0, -1304.06621515308483, 0, 827.978549303545924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.23429120821697627, 0, -51.7486593314716203, 0, 144.896246128120537, 0, -82.7978549303545924, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 10.7809706940565876, 0, 0, 0, 0, 0, 0, 10.7809706940565876, 0, -172.495531104905401, 0, 0, 0, 0, 0, 0, 0, 0, -30.1867179433584452, 0, 0, 0, 482.987487093735122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47.4362710538489852, 0, 482.987487093735122, 0, -482.987487093735122, 0, -275.992849767848641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15.0933589716792226, 0, 275.992849767848641, 0, -869.37747676872322, 0, 551.985699535697283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.15619413881131751, 0, -34.4991062209810802, 0, 96.5974974187470245, 0, -55.1985699535697283, 0, 0, 0, 0, 0, + 0, -1.07809706940565876, 0, 0, 0, 0, -3.23429120821697627, 0, 68.9982124419621604, 0, 0, 0, 0, 0, 0, -2.15619413881131751, 0, 137.996424883924321, 0, -482.987487093735122, 0, 0, 0, 0, 0, 0, 0, 0, 2.15619413881131751, 0, 0, 0, -482.987487093735122, 0, 772.779979349976196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.23429120821697627, 0, -137.996424883924321, 0, 482.987487093735122, 0, 0, 0, -275.992849767848641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.07809706940565876, 0, -68.9982124419621604, 0, 482.987487093735122, 0, -772.779979349976196, 0, 275.992849767848641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.784430839734420891, 0, 0, 0, 0, -2.35329251920326267, 0, 50.203573743002937, 0, 0, 0, 0, 0, 0, -1.56886167946884178, 0, 100.407147486005874, 0, -351.425016201020559, 0, 0, 0, 0, 0, 0, 0, 0, 1.56886167946884178, 0, 0, 0, -351.425016201020559, 0, 562.280025921632895, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.35329251920326267, 0, -100.407147486005874, 0, 351.425016201020559, 0, 0, 0, -200.814294972011748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.784430839734420891, 0, -50.203573743002937, 0, 351.425016201020559, 0, -562.280025921632895, 0, 200.814294972011748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9.41317007681305069, 0, 0, 0, 0, 0, 0, -34.5149569483145192, 0, 175.71250810051028, 0, 0, 0, 0, 0, 0, 0, 0, -43.9281270251275699, 0, 468.566688268027412, 0, -632.565029161837007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18.8263401536261014, 0, 351.425016201020559, 0, -1054.27504860306168, 0, 602.442884916035244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.13772335893768356, 0, 0, 0, -210.855009720612336, 0, 401.628589944023496, 0, -133.876196648007832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.13772335893768356, 0, -58.5708360335034265, 0, 210.855009720612336, 0, -200.814294972011748, 0, 44.6253988826692774, 0, 0, 0, + + 0, 0, 0, 0, -7.44176436131784437, 0, 0, 0, 0, 0, 0, -27.286469324832096, 0, 138.912934744599762, 0, 0, 0, 0, 0, 0, 0, 0, -34.7282336861499404, 0, 370.434492652266031, 0, -500.086565080559142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.8835287226356887, 0, 277.825869489199523, 0, -833.47760846759857, 0, 476.27291912434204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.48058812043928146, 0, 0, 0, -166.695521693519714, 0, 317.515279416228027, 0, -105.838426472076009, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.48058812043928146, 0, -46.3043115815332539, 0, 166.695521693519714, 0, -158.757639708114013, 0, 35.279475490692003, 0, 0, 0, + 0, 0.496117624087856292, 0, 0, 0, 0, 2.48058812043928146, 0, -34.7282336861499404, 0, 0, 0, 0, 0, 0, 4.96117624087856292, 0, -138.912934744599762, 0, 277.825869489199523, 0, 0, 0, 0, 0, 0, 0, 0, 4.96117624087856292, 0, -208.369402116899642, 0, 833.47760846759857, 0, -555.651738978399047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.48058812043928146, 0, -138.912934744599762, 0, 833.47760846759857, 0, -1111.30347795679809, 0, 317.515279416228027, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.496117624087856292, 0, -34.7282336861499404, 0, 277.825869489199523, 0, -555.651738978399047, 0, 317.515279416228027, 0, -42.3353705888304036, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0.424849751185551427, 0, 0, 0, 0, 2.12424875592775713, 0, -29.7394825829885999, 0, 0, 0, 0, 0, 0, 4.24849751185551427, 0, -118.957930331954399, 0, 237.915860663908799, 0, 0, 0, 0, 0, 0, 0, 0, 4.24849751185551427, 0, -178.436895497931599, 0, 713.747581991726397, 0, -475.831721327817598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.12424875592775713, 0, -118.957930331954399, 0, 713.747581991726397, 0, -951.663442655635196, 0, 271.903840758752913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.424849751185551427, 0, -29.7394825829885999, 0, 237.915860663908799, 0, -475.831721327817598, 0, 271.903840758752913, 0, -36.2538454345003884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2.97394825829885999, 0, 0, 0, 0, 0, 0, 14.8697412914942999, 0, -59.4789651659771997, 0, 0, 0, 0, 0, 0, 0, 0, 29.7394825829885999, 0, -237.915860663908799, 0, 237.915860663908799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29.7394825829885999, 0, -356.873790995863198, 0, 713.747581991726397, 0, -271.903840758752913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.8697412914942999, 0, -237.915860663908799, 0, 713.747581991726397, 0, -543.807681517505826, 0, 90.634613586250971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.97394825829885999, 0, -59.4789651659771997, 0, 237.915860663908799, 0, -271.903840758752913, 0, 90.634613586250971, 0, -6.59160826081825244, 0, + + 0, 0, 0, 0, 2.7533410732166562, 0, 0, 0, 0, 0, 0, 13.766705366083281, 0, -55.066821464333124, 0, 0, 0, 0, 0, 0, 0, 0, 27.533410732166562, 0, -220.267285857332496, 0, 220.267285857332496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27.533410732166562, 0, -330.400928785998744, 0, 660.801857571997488, 0, -251.734040979808567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.766705366083281, 0, -220.267285857332496, 0, 660.801857571997488, 0, -503.468081959617133, 0, 83.9113469932695222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.7533410732166562, 0, -55.066821464333124, 0, 220.267285857332496, 0, -251.734040979808567, 0, 83.9113469932695222, 0, -6.10264341769232889, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2.7533410732166562, 0, 0, 0, 0, 0, 0, 13.766705366083281, 0, -55.066821464333124, 0, 0, 0, 0, 0, 0, 0, 0, 27.533410732166562, 0, -220.267285857332496, 0, 220.267285857332496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27.533410732166562, 0, -330.400928785998744, 0, 660.801857571997488, 0, -251.734040979808567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.766705366083281, 0, -220.267285857332496, 0, 660.801857571997488, 0, -503.468081959617133, 0, 83.9113469932695222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.7533410732166562, 0, -55.066821464333124, 0, 220.267285857332496, 0, -251.734040979808567, 0, 83.9113469932695222, 0, -6.10264341769232889, 0, + + 0, 0, 0, 0, 2.97394825829885999, 0, 0, 0, 0, 0, 0, 14.8697412914942999, 0, -59.4789651659771997, 0, 0, 0, 0, 0, 0, 0, 0, 29.7394825829885999, 0, -237.915860663908799, 0, 237.915860663908799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29.7394825829885999, 0, -356.873790995863198, 0, 713.747581991726397, 0, -271.903840758752913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.8697412914942999, 0, -237.915860663908799, 0, 713.747581991726397, 0, -543.807681517505826, 0, 90.634613586250971, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.97394825829885999, 0, -59.4789651659771997, 0, 237.915860663908799, 0, -271.903840758752913, 0, 90.634613586250971, 0, -6.59160826081825244, 0, + 0, -0.424849751185551427, 0, 0, 0, 0, -2.12424875592775713, 0, 29.7394825829885999, 0, 0, 0, 0, 0, 0, -4.24849751185551427, 0, 118.957930331954399, 0, -237.915860663908799, 0, 0, 0, 0, 0, 0, 0, 0, -4.24849751185551427, 0, 178.436895497931599, 0, -713.747581991726397, 0, 475.831721327817598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.12424875592775713, 0, 118.957930331954399, 0, -713.747581991726397, 0, 951.663442655635196, 0, -271.903840758752913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.424849751185551427, 0, 29.7394825829885999, 0, -237.915860663908799, 0, 475.831721327817598, 0, -271.903840758752913, 0, 36.2538454345003884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -0.496117624087856292, 0, 0, 0, 0, -2.48058812043928146, 0, 34.7282336861499404, 0, 0, 0, 0, 0, 0, -4.96117624087856292, 0, 138.912934744599762, 0, -277.825869489199523, 0, 0, 0, 0, 0, 0, 0, 0, -4.96117624087856292, 0, 208.369402116899642, 0, -833.47760846759857, 0, 555.651738978399047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.48058812043928146, 0, 138.912934744599762, 0, -833.47760846759857, 0, 1111.30347795679809, 0, -317.515279416228027, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.496117624087856292, 0, 34.7282336861499404, 0, -277.825869489199523, 0, 555.651738978399047, 0, -317.515279416228027, 0, 42.3353705888304036, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7.44176436131784437, 0, 0, 0, 0, 0, 0, -27.286469324832096, 0, 138.912934744599762, 0, 0, 0, 0, 0, 0, 0, 0, -34.7282336861499404, 0, 370.434492652266031, 0, -500.086565080559142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14.8835287226356887, 0, 277.825869489199523, 0, -833.47760846759857, 0, 476.27291912434204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.48058812043928146, 0, 0, 0, -166.695521693519714, 0, 317.515279416228027, 0, -105.838426472076009, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.48058812043928146, 0, -46.3043115815332539, 0, 166.695521693519714, 0, -158.757639708114013, 0, 35.279475490692003, 0, 0, 0, + + 0, 0, 0, 0, -9.41317007681305069, 0, 0, 0, 0, 0, 0, -34.5149569483145192, 0, 175.71250810051028, 0, 0, 0, 0, 0, 0, 0, 0, -43.9281270251275699, 0, 468.566688268027412, 0, -632.565029161837007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18.8263401536261014, 0, 351.425016201020559, 0, -1054.27504860306168, 0, 602.442884916035244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.13772335893768356, 0, 0, 0, -210.855009720612336, 0, 401.628589944023496, 0, -133.876196648007832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.13772335893768356, 0, -58.5708360335034265, 0, 210.855009720612336, 0, -200.814294972011748, 0, 44.6253988826692774, 0, 0, 0, + 0, 0.784430839734420891, 0, 0, 0, 0, 2.35329251920326267, 0, -50.203573743002937, 0, 0, 0, 0, 0, 0, 1.56886167946884178, 0, -100.407147486005874, 0, 351.425016201020559, 0, 0, 0, 0, 0, 0, 0, 0, -1.56886167946884178, 0, 0, 0, 351.425016201020559, 0, -562.280025921632895, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.35329251920326267, 0, 100.407147486005874, 0, -351.425016201020559, 0, 0, 0, 200.814294972011748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.784430839734420891, 0, 50.203573743002937, 0, -351.425016201020559, 0, 562.280025921632895, 0, -200.814294972011748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1.07809706940565876, 0, 0, 0, 0, 3.23429120821697627, 0, -68.9982124419621604, 0, 0, 0, 0, 0, 0, 2.15619413881131751, 0, -137.996424883924321, 0, 482.987487093735122, 0, 0, 0, 0, 0, 0, 0, 0, -2.15619413881131751, 0, 0, 0, 482.987487093735122, 0, -772.779979349976196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.23429120821697627, 0, 137.996424883924321, 0, -482.987487093735122, 0, 0, 0, 275.992849767848641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.07809706940565876, 0, 68.9982124419621604, 0, -482.987487093735122, 0, 772.779979349976196, 0, -275.992849767848641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10.7809706940565876, 0, 0, 0, 0, 0, 0, 10.7809706940565876, 0, -172.495531104905401, 0, 0, 0, 0, 0, 0, 0, 0, -30.1867179433584452, 0, 0, 0, 482.987487093735122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47.4362710538489852, 0, 482.987487093735122, 0, -482.987487093735122, 0, -275.992849767848641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15.0933589716792226, 0, 275.992849767848641, 0, -869.37747676872322, 0, 551.985699535697283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.15619413881131751, 0, -34.4991062209810802, 0, 96.5974974187470245, 0, -55.1985699535697283, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 16.1714560410848813, 0, 0, 0, 0, 0, 0, 16.1714560410848813, 0, -258.743296657358101, 0, 0, 0, 0, 0, 0, 0, 0, -45.2800769150376677, 0, 0, 0, 724.481230640602684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71.1544065807734779, 0, 724.481230640602684, 0, -724.481230640602684, 0, -413.989274651772962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -22.6400384575188339, 0, 413.989274651772962, 0, -1304.06621515308483, 0, 827.978549303545924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.23429120821697627, 0, -51.7486593314716203, 0, 144.896246128120537, 0, -82.7978549303545924, 0, 0, 0, 0, 0, + 0, -1.07809706940565876, 0, 0, 0, 0, 0.359365689801886252, 0, 58.2172417479055728, 0, 0, 0, 0, 0, 0, 6.46858241643395253, 0, -77.6229889972074304, 0, -310.491955988829722, 0, 0, 0, 0, 0, 0, 0, 0, 6.46858241643395253, 0, -271.680461490226006, 0, 724.481230640602684, 0, 289.792492256241073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.359365689801886252, 0, -77.6229889972074304, 0, 724.481230640602684, 0, -965.974974187470245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.07809706940565876, 0, 58.2172417479055728, 0, -310.491955988829722, 0, 289.792492256241073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -1.77617456229312929, 0, 0, 0, 0, 0.592058187431043098, 0, 95.9134263638289819, 0, 0, 0, 0, 0, 0, 10.6570473737587758, 0, -127.884568485105309, 0, -511.538273940421237, 0, 0, 0, 0, 0, 0, 0, 0, 10.6570473737587758, 0, -447.595989697868582, 0, 1193.58930586098289, 0, 477.435722344393154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.592058187431043098, 0, -127.884568485105309, 0, 1193.58930586098289, 0, -1591.45240781464385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.77617456229312929, 0, 95.9134263638289819, 0, -511.538273940421237, 0, 477.435722344393154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12.4332219360519051, 0, 0, 0, 0, 0, 0, 37.2996658081557152, 0, 149.198663232622861, 0, 0, 0, 0, 0, 0, 0, 0, 74.5993316163114303, 0, -596.794652930491443, 0, -238.717861172196577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10.6570473737587758, 0, -298.397326465245721, 0, 1193.58930586098289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -33.7473166835694566, 0, 426.281894950351031, 0, -716.153583516589731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.77617456229312929, 0, -21.3140947475175515, 0, 34.1025515960280824, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -22.6998537228122744, 0, 0, 0, 0, 0, 0, 68.0995611684368233, 0, 272.398244673747293, 0, 0, 0, 0, 0, 0, 0, 0, 136.199122336873647, 0, -1089.59297869498917, 0, -435.837191477995669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -19.4570174766962352, 0, -544.796489347494586, 0, 2179.18595738997834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61.6138886762047449, 0, 778.280699067849409, 0, -1307.51157443398701, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.2428362461160392, 0, -38.9140349533924704, 0, 62.2624559254279527, 0, 0, 0, 0, 0, 0, 0, + 0, 1.29713449844641568, 0, 0, 0, 0, -6.48567249223207841, 0, -51.8853799378566272, 0, 0, 0, 0, 0, 0, -7.78280699067849409, 0, 311.312279627139763, 0, 155.656139813569882, 0, 0, 0, 0, 0, 0, 0, 0, 7.78280699067849409, 0, 0, 0, -1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.48567249223207841, 0, -311.312279627139763, 0, 1089.59297869498917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.29713449844641568, 0, 51.8853799378566272, 0, -155.656139813569882, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 2.65833466848162373, 0, 0, 0, 0, -13.2916733424081186, 0, -106.333386739264949, 0, 0, 0, 0, 0, 0, -15.9500080108897424, 0, 638.000320435589695, 0, 319.000160217794847, 0, 0, 0, 0, 0, 0, 0, 0, 15.9500080108897424, 0, 0, 0, -2233.00112152456393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13.2916733424081186, 0, -638.000320435589695, 0, 2233.00112152456393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2.65833466848162373, 0, 106.333386739264949, 0, -319.000160217794847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 11.9625060081673068, 0, 0, 0, 0, 0, 0, -99.6875500680608898, 0, -79.7500400544487119, 0, 0, 0, 0, 0, 0, 0, 0, 55.8250280381140983, 0, 744.333707174854644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119.625060081673068, 0, -1116.50056076228197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -46.5208566984284153, 0, 319.000160217794847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.32916733424081186, 0, -8.86111556160541243, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 28.0545633538451997, 0, 0, 0, 0, 0, 0, -233.788027948709998, 0, -187.030422358967998, 0, 0, 0, 0, 0, 0, 0, 0, 130.921295651277599, 0, 1745.61727535036798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280.545633538451997, 0, -2618.42591302555197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109.101079709397999, 0, 748.121689435871992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.11717370598279997, 0, -20.7811580398853331, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1.41689713908309089, 0, 0, 0, 0, 15.5858685299139998, 0, 31.1717370598279997, 0, 0, 0, 0, 0, 0, -18.7030422358967998, 0, -374.060844717935996, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -18.7030422358967998, 0, 785.527773907665592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15.5858685299139998, 0, -374.060844717935996, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.41689713908309089, 0, 31.1717370598279997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, -3.92321052893598442, 0, 0, 0, 0, 43.1553158182958286, 0, 86.3106316365916572, 0, 0, 0, 0, 0, 0, -51.7863789819549943, 0, -1035.72757963909989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51.7863789819549943, 0, 2175.02791724210976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43.1553158182958286, 0, -1035.72757963909989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3.92321052893598442, 0, 86.3106316365916572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8.63106316365916572, 0, 0, 0, 0, 0, 0, 129.465947454887486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -362.50465287368496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258.931894909774972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43.1553158182958286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.784642105787196884, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, -29.8988798455876938, 0, 0, 0, 0, 0, 0, 448.483197683815407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1255.75295351468314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 896.966395367630815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -149.494399227938469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.71807998596251762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1.35903999298125881, 0, 0, 0, 0, -24.9157332046564115, 0, 0, 0, 0, 0, 0, 0, 0, 89.6966395367630815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -89.6966395367630815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24.9157332046564115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.35903999298125881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 6.79519996490629405, 0, 0, 0, 0, -124.578666023282058, 0, 0, 0, 0, 0, 0, 0, 0, 448.483197683815407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -448.483197683815407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124.578666023282058, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6.79519996490629405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static FINT _len_spinor(FINT kappa, FINT l) +{ + if (0 == kappa) { + return 4 * l + 2; + } else if (kappa < 0) { + return 2 * l + 2; + } else { + return 2 * l; + } +} + +static int _len_cart[] = { + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136 +}; + +struct cart2sp_t { + dtype *cart2sph; + dtype *cart2j_lt_lR; + dtype *cart2j_lt_lI; + dtype *cart2j_gt_lR; + dtype *cart2j_gt_lI; +}; + +// hardcoded g_c2s;; warning +static struct cart2sp_t g_c2s[] = { + {g_trans_cart2sph ,g_trans_cart2jR , g_trans_cart2jI , g_trans_cart2jR , g_trans_cart2jI }, + {g_trans_cart2sph+1 ,g_trans_cart2jR+4 , g_trans_cart2jI+4 , g_trans_cart2jR+16 , g_trans_cart2jI+16 }, + /*{g_trans_cart2sph+10 ,g_trans_cart2jR+40 , g_trans_cart2jI+40 , g_trans_cart2jR+88 , g_trans_cart2jI+88 }, + {g_trans_cart2sph+40 ,g_trans_cart2jR+160 , g_trans_cart2jI+160 , g_trans_cart2jR+280 , g_trans_cart2jI+280 }, + {g_trans_cart2sph+110 ,g_trans_cart2jR+440 , g_trans_cart2jI+440 , g_trans_cart2jR+680 , g_trans_cart2jI+680 }, + {g_trans_cart2sph+245 ,g_trans_cart2jR+980 , g_trans_cart2jI+980 , g_trans_cart2jR+1400 , g_trans_cart2jI+1400 }, + {g_trans_cart2sph+476 ,g_trans_cart2jR+1904 , g_trans_cart2jI+1904 , g_trans_cart2jR+2576 , g_trans_cart2jI+2576 }, + {g_trans_cart2sph+840 ,g_trans_cart2jR+3360 , g_trans_cart2jI+3360 , g_trans_cart2jR+4368 , g_trans_cart2jI+4368 }, + {g_trans_cart2sph+1380,g_trans_cart2jR+5520 , g_trans_cart2jI+5520 , g_trans_cart2jR+6960 , g_trans_cart2jI+6960 }, + {g_trans_cart2sph+2145,g_trans_cart2jR+8580 , g_trans_cart2jI+8580 , g_trans_cart2jR+10560, g_trans_cart2jI+10560}, + {g_trans_cart2sph+3190,g_trans_cart2jR+12760, g_trans_cart2jI+12760, g_trans_cart2jR+15400, g_trans_cart2jI+15400}, + {g_trans_cart2sph+4576,g_trans_cart2jR+18304, g_trans_cart2jI+18304, g_trans_cart2jR+21736, g_trans_cart2jI+21736}, + {g_trans_cart2sph+6370,g_trans_cart2jR+25480, g_trans_cart2jI+25480, g_trans_cart2jR+29848, g_trans_cart2jI+29848}, + {g_trans_cart2sph+8645, NULL, NULL, NULL, NULL}, + {g_trans_cart2sph+11480, NULL, NULL, NULL, NULL}, + {g_trans_cart2sph+14960, NULL, NULL, NULL, NULL},*/ +}; + + +static dtype *a_bra_cart2spheric(dtype *gsph, FINT nket, dtype *gcart, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = l * 2 + 1; + CINTdgemm_TN(nd, nket, nf, g_c2s[l].cart2sph, gcart, gsph); + return gsph; +} + +static dtype *a_ket_cart2spheric(dtype *gsph, dtype *gcart, + FINT lds, FINT nbra, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = l * 2 + 1; + CINTdgemm_NN1(nbra, nd, nf, gcart, g_c2s[l].cart2sph, gsph, lds); + return gsph; +} + + +static dtype *s_bra_cart2spheric(dtype *gsph, FINT nket, dtype *gcart, FINT l) +{ + + return gcart; +} +static dtype *s_ket_cart2spheric(dtype *gsph, dtype *gcart, + FINT lds, FINT nbra, FINT l) +{ + + return gcart; +} +static dtype *s_ket_cart2spheric_copy(dtype *gsph, dtype *gcart, + FINT lds, FINT nbra, FINT l) +{ + FINT i; + for (i = 0; i < nbra; i++) { + gsph[i] = gcart[i]; + } + return gsph; +} + + +static dtype *p_bra_cart2spheric(dtype *gsph, FINT nket, dtype *gcart, FINT l) +{ +#ifdef PYPZPX + FINT i; + for (i = 0; i < nket; i++) { + gsph[i*3+0] = gcart[i*3+1]; + gsph[i*3+1] = gcart[i*3+2]; + gsph[i*3+2] = gcart[i*3+0]; + } + return gsph; +#else + return gcart; +#endif +} +static dtype *p_ket_cart2spheric(dtype *gsph, dtype *gcart, + FINT lds, FINT nbra, FINT l) +{ +#ifdef PYPZPX + FINT i; + for (i = 0; i < nbra; i++) { + gsph[0*nbra+i] = gcart[1*nbra+i]; + gsph[1*nbra+i] = gcart[2*nbra+i]; + gsph[2*nbra+i] = gcart[0*nbra+i]; + } + return gsph; +#else + return gcart; +#endif +} +static dtype *p_ket_cart2spheric_copy(dtype *gsph, dtype *gcart, + FINT lds, FINT nbra, FINT l) +{ + FINT i; +#ifdef PYPZPX + for (i = 0; i < nbra; i++) { + gsph[0*nbra+i] = gcart[1*nbra+i]; + gsph[1*nbra+i] = gcart[2*nbra+i]; + gsph[2*nbra+i] = gcart[0*nbra+i]; + } +#else + for (i = 0; i < nbra; i++) { + gsph[0*lds+i] = gcart[0*nbra+i]; + gsph[1*lds+i] = gcart[1*nbra+i]; + gsph[2*lds+i] = gcart[2*nbra+i]; + } +#endif + return gsph; +} + + +static dtype *d_bra_cart2spheric(dtype *gsph, FINT nket, dtype *gcart, FINT l) +{ + return gsph; // NOT IMPLEMENTED YET, g_c2s takes too much memory for single tile. + dtype *coeff_c2s = g_c2s[2].cart2sph; + dtype *pgsph = gsph; + FINT i; + for (i = 0; i < nket; i++) { + gsph[0] = coeff_c2s[ 1] * gcart[1]; + gsph[1] = coeff_c2s[10] * gcart[4]; + gsph[2] = coeff_c2s[12] * gcart[0] + + coeff_c2s[15] * gcart[3] + + coeff_c2s[17] * gcart[5]; + gsph[3] = coeff_c2s[20] * gcart[2]; + gsph[4] = coeff_c2s[24] * gcart[0] + + coeff_c2s[27] * gcart[3]; + gsph += 5; + gcart += 6; + } + return pgsph; +} +static dtype *d_ket_cart2spheric(dtype *gsph, dtype *gcart, + FINT lds, FINT nbra, FINT l) +{ + return gsph; // NOT IMPLEMENTED YET, g_c2s takes too much memory. + dtype *coeff_c2s = g_c2s[2].cart2sph; + dtype *pgsph = gsph; + FINT i; + for (i = 0; i < nbra; i++) { + gsph[0*lds+i] = coeff_c2s[ 1] * gcart[1*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[1*lds+i] = coeff_c2s[10] * gcart[4*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[2*lds+i] = coeff_c2s[12] * gcart[0*nbra+i] + + coeff_c2s[15] * gcart[3*nbra+i] + + coeff_c2s[17] * gcart[5*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[3*lds+i] = coeff_c2s[20] * gcart[2*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[4*lds+i] = coeff_c2s[24] * gcart[0*nbra+i] + + coeff_c2s[27] * gcart[3*nbra+i]; + } + return pgsph; +} + + +static dtype *f_bra_cart2spheric(dtype *gsph, FINT nket, dtype *gcart, FINT l) +{ + return gsph; // Not implemented yet, g_c2s takes too much memory for single tile. + dtype *coeff_c2s = g_c2s[3].cart2sph; + dtype *pgsph = gsph; + FINT i; + for (i = 0; i < nket; i++) { + gsph[0] = coeff_c2s[ 1] * gcart[1] + + coeff_c2s[ 6] * gcart[6]; + gsph[1] = coeff_c2s[14] * gcart[4]; + gsph[2] = coeff_c2s[21] * gcart[1] + + coeff_c2s[26] * gcart[6] + + coeff_c2s[28] * gcart[8]; + gsph[3] = coeff_c2s[32] * gcart[2] + + coeff_c2s[37] * gcart[7] + + coeff_c2s[39] * gcart[9]; + gsph[4] = coeff_c2s[40] * gcart[0] + + coeff_c2s[43] * gcart[3] + + coeff_c2s[45] * gcart[5]; + gsph[5] = coeff_c2s[52] * gcart[2] + + coeff_c2s[57] * gcart[7]; + gsph[6] = coeff_c2s[60] * gcart[0] + + coeff_c2s[63] * gcart[3]; + gsph += 7; + gcart += 10; + } + return pgsph; +} +static dtype *f_ket_cart2spheric(dtype *gsph, dtype *gcart, + FINT lds, FINT nbra, FINT l) +{ + return gsph; // Not implemented yet, g_c2s takes too much memory for single tile. + dtype *coeff_c2s = g_c2s[3].cart2sph; + dtype *pgsph = gsph; + FINT i; + for (i = 0; i < nbra; i++) { + gsph[0*lds+i] = coeff_c2s[ 1] * gcart[1*nbra+i] + + coeff_c2s[ 6] * gcart[6*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[1*lds+i] = coeff_c2s[14] * gcart[4*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[2*lds+i] = coeff_c2s[21] * gcart[1*nbra+i] + + coeff_c2s[26] * gcart[6*nbra+i] + + coeff_c2s[28] * gcart[8*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[3*lds+i] = coeff_c2s[32] * gcart[2*nbra+i] + + coeff_c2s[37] * gcart[7*nbra+i] + + coeff_c2s[39] * gcart[9*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[4*lds+i] = coeff_c2s[40] * gcart[0*nbra+i] + + coeff_c2s[43] * gcart[3*nbra+i] + + coeff_c2s[45] * gcart[5*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[5*lds+i] = coeff_c2s[52] * gcart[2*nbra+i] + + coeff_c2s[57] * gcart[7*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[6*lds+i] = coeff_c2s[60] * gcart[0*nbra+i] + + coeff_c2s[63] * gcart[3*nbra+i]; + } + return pgsph; +} + + +static dtype *g_bra_cart2spheric(dtype *gsph, FINT nket, dtype *gcart, FINT l) +{ + return gsph; // Not implemented yet, g_c2s takes too much memory for single tile. + dtype *coeff_c2s = g_c2s[4].cart2sph; + dtype *pgsph = gsph; + FINT i; + for (i = 0; i < nket; i++) { + gsph[0] = coeff_c2s[ 1] * gcart[ 1] + + coeff_c2s[ 6] * gcart[ 6]; + gsph[1] = coeff_c2s[ 19] * gcart[ 4] + + coeff_c2s[ 26] * gcart[11]; + gsph[2] = coeff_c2s[ 31] * gcart[ 1] + + coeff_c2s[ 36] * gcart[ 6] + + coeff_c2s[ 38] * gcart[ 8]; + gsph[3] = coeff_c2s[ 49] * gcart[ 4] + + coeff_c2s[ 56] * gcart[11] + + coeff_c2s[ 58] * gcart[13]; + gsph[4] = coeff_c2s[ 60] * gcart[ 0] + + coeff_c2s[ 63] * gcart[ 3] + + coeff_c2s[ 65] * gcart[ 5] + + coeff_c2s[ 70] * gcart[10] + + coeff_c2s[ 72] * gcart[12] + + coeff_c2s[ 74] * gcart[14]; + gsph[5] = coeff_c2s[ 77] * gcart[ 2] + + coeff_c2s[ 82] * gcart[ 7] + + coeff_c2s[ 84] * gcart[ 9]; + gsph[6] = coeff_c2s[ 90] * gcart[ 0] + + coeff_c2s[ 95] * gcart[ 5] + + coeff_c2s[100] * gcart[10] + + coeff_c2s[102] * gcart[12]; + gsph[7] = coeff_c2s[107] * gcart[ 2] + + coeff_c2s[112] * gcart[ 7]; + gsph[8] = coeff_c2s[120] * gcart[ 0] + + coeff_c2s[123] * gcart[ 3] + + coeff_c2s[130] * gcart[10]; + gsph += 9; + gcart += 15; + } + return pgsph; +} +static dtype *g_ket_cart2spheric(dtype *gsph, dtype *gcart, + FINT lds, FINT nbra, FINT l) +{ + return gsph; // Not implemented yet, g_c2s takes too much memory for single tile. + dtype *coeff_c2s = g_c2s[4].cart2sph; + dtype *pgsph = gsph; + FINT i; + for (i = 0; i < nbra; i++) { + gsph[0*lds+i] = coeff_c2s[ 1] * gcart[ 1*nbra+i] + + coeff_c2s[ 6] * gcart[ 6*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[1*lds+i] = coeff_c2s[ 19] * gcart[ 4*nbra+i] + + coeff_c2s[ 26] * gcart[11*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[2*lds+i] = coeff_c2s[ 31] * gcart[ 1*nbra+i] + + coeff_c2s[ 36] * gcart[ 6*nbra+i] + + coeff_c2s[ 38] * gcart[ 8*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[3*lds+i] = coeff_c2s[ 49] * gcart[ 4*nbra+i] + + coeff_c2s[ 56] * gcart[11*nbra+i] + + coeff_c2s[ 58] * gcart[13*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[4*lds+i] = coeff_c2s[ 60] * gcart[ 0*nbra+i] + + coeff_c2s[ 63] * gcart[ 3*nbra+i] + + coeff_c2s[ 65] * gcart[ 5*nbra+i] + + coeff_c2s[ 70] * gcart[10*nbra+i] + + coeff_c2s[ 72] * gcart[12*nbra+i] + + coeff_c2s[ 74] * gcart[14*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[5*lds+i] = coeff_c2s[ 77] * gcart[ 2*nbra+i] + + coeff_c2s[ 82] * gcart[ 7*nbra+i] + + coeff_c2s[ 84] * gcart[ 9*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[6*lds+i] = coeff_c2s[ 90] * gcart[ 0*nbra+i] + + coeff_c2s[ 95] * gcart[ 5*nbra+i] + + coeff_c2s[100] * gcart[10*nbra+i] + + coeff_c2s[102] * gcart[12*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[7*lds+i] = coeff_c2s[107] * gcart[ 2*nbra+i] + + coeff_c2s[112] * gcart[ 7*nbra+i]; + } + for (i = 0; i < nbra; i++) { + gsph[8*lds+i] = coeff_c2s[120] * gcart[ 0*nbra+i] + + coeff_c2s[123] * gcart[ 3*nbra+i] + + coeff_c2s[130] * gcart[10*nbra+i]; + } + return pgsph; +} + + +// c2s hardcoded array +#ifdef __cplusplus +//dtype *(*c2s_bra_sph[16])(...) = { +typedef dtype *(*Funcs) (dtype *gsph, int nket, dtype *gcart, int l); +Funcs c2s_bra_sph[16] = { +#else +dtype *(*c2s_bra_sph[])() = { +#endif + s_bra_cart2spheric, + p_bra_cart2spheric, + d_bra_cart2spheric, + f_bra_cart2spheric, + g_bra_cart2spheric, + a_bra_cart2spheric, + a_bra_cart2spheric, + a_bra_cart2spheric, + a_bra_cart2spheric, + a_bra_cart2spheric, + a_bra_cart2spheric, + a_bra_cart2spheric, + a_bra_cart2spheric, + a_bra_cart2spheric, + a_bra_cart2spheric, + a_bra_cart2spheric, +}; + +dtype *(*c2s_ket_sph[])(dtype *gsph, dtype *gcart, + FINT lds, FINT nbra, FINT l) = { + s_ket_cart2spheric, + p_ket_cart2spheric, + d_ket_cart2spheric, + f_ket_cart2spheric, + g_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, +}; + +dtype *(*c2s_ket_sph1[])(dtype *gsph, dtype *gcart, + FINT lds, FINT nbra, FINT l) = { + s_ket_cart2spheric_copy, + p_ket_cart2spheric_copy, + d_ket_cart2spheric, + f_ket_cart2spheric, + g_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, + a_ket_cart2spheric, +}; + + + +static void a_bra_cart2spinor_si(dtype *gspR, dtype *gspI, + dtype *gx, dtype *gy, dtype *gz, dtype *g1, + FINT nket, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + dtype *gspaR = gspR; + dtype *gspaI = gspI; + dtype *gspbR = gspR + nket * nd; + dtype *gspbI = gspI + nket * nd; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, n; + dtype saR, saI, sbR, sbI, caR, caI, cbR, cbI, v1, vx, vy, vz; + + for (j = 0; j < nket; j++) { + for (i = 0; i < nd; i++) { + saR = 0; + saI = 0; + sbR = 0; + sbI = 0; +#pragma GCC ivdep + for (n = 0; n < nf; n++) { + v1 = g1[j*nf+n]; + vx = gx[j*nf+n]; + vy = gy[j*nf+n]; + vz = gz[j*nf+n]; + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; + saR += caR * v1 + caI * vz - cbR * vy + cbI * vx; + saI +=-caI * v1 + caR * vz + cbI * vy + cbR * vx; + sbR += cbR * v1 - cbI * vz + caR * vy + caI * vx; + sbI +=-cbI * v1 - cbR * vz - caI * vy + caR * vx; + } + gspaR[j*nd+i] = saR; + gspaI[j*nd+i] = saI; + gspbR[j*nd+i] = sbR; + gspbI[j*nd+i] = sbI; + } } +} + +static void a_bra_cart2spinor_sf(dtype *gspR, dtype *gspI, + dtype *gx, dtype *gy, dtype *gz, dtype *g1, + FINT nket, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + dtype *gspaR = gspR; + dtype *gspaI = gspI; + dtype *gspbR = gspR + nket * nd; + dtype *gspbI = gspI + nket * nd; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, n; + dtype saR, saI, sbR, sbI, caR, caI, cbR, cbI, v1; + + for (j = 0; j < nket; j++) { + for (i = 0; i < nd; i++) { + saR = 0; + saI = 0; + sbR = 0; + sbI = 0; +#pragma GCC ivdep + for (n = 0; n < nf; n++) { + v1 = g1[j*nf+n]; + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; + saR += caR * v1; + saI +=-caI * v1; + sbR += cbR * v1; + sbI +=-cbI * v1; + } + gspaR[j*nd+i] = saR; + gspaI[j*nd+i] = saI; + gspbR[j*nd+i] = sbR; + gspbI[j*nd+i] = sbI; + } } +} + +static void a_bra1_cart2spinor_si(dtype *gspR, dtype *gspI, + dtype *gx, dtype *gy, dtype *gz, dtype *g1, + FINT ngrids, FINT nket, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + FINT ndg = nd * ngrids; + dtype *gspaR = gspR; + dtype *gspaI = gspI; + dtype *gspbR = gspR + nket * ndg; + dtype *gspbI = gspI + nket * ndg; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, n, m; + dtype caR, caI, cbR, cbI, v1, vx, vy, vz; + + for (j = 0; j < nket; j++) { +#pragma GCC ivdep + for (i = 0; i < ndg; i++) { + gspaR[j*ndg+i] = 0; + gspaI[j*ndg+i] = 0; + gspbR[j*ndg+i] = 0; + gspbI[j*ndg+i] = 0; + } + for (i = 0; i < nd; i++) { + for (n = 0; n < nf; n++) { + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; +#pragma GCC ivdep + for (m = 0; m < ngrids; m++) { + v1 = g1[(j*nf+n)*ngrids+m]; + vx = gx[(j*nf+n)*ngrids+m]; + vy = gy[(j*nf+n)*ngrids+m]; + vz = gz[(j*nf+n)*ngrids+m]; + gspaR[(j*nd+i)*ngrids+m] += caR * v1 + caI * vz - cbR * vy + cbI * vx; + gspaI[(j*nd+i)*ngrids+m] +=-caI * v1 + caR * vz + cbI * vy + cbR * vx; + gspbR[(j*nd+i)*ngrids+m] += cbR * v1 - cbI * vz + caR * vy + caI * vx; + gspbI[(j*nd+i)*ngrids+m] +=-cbI * v1 - cbR * vz - caI * vy + caR * vx; + } + } } + } +} + +static void a_bra1_cart2spinor_sf(dtype *gspR, dtype *gspI, + dtype *gx, dtype *gy, dtype *gz, dtype *g1, + FINT ngrids, FINT nket, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + FINT ndg = nd * ngrids; + dtype *gspaR = gspR; + dtype *gspaI = gspI; + dtype *gspbR = gspR + nket * ndg; + dtype *gspbI = gspI + nket * ndg; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, n, m; + dtype caR, caI, cbR, cbI, v1; + + for (j = 0; j < nket; j++) { +#pragma GCC ivdep + for (i = 0; i < ndg; i++) { + gspaR[j*ndg+i] = 0; + gspaI[j*ndg+i] = 0; + gspbR[j*ndg+i] = 0; + gspbI[j*ndg+i] = 0; + } + for (i = 0; i < nd; i++) { + for (n = 0; n < nf; n++) { + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; +#pragma GCC ivdep + for (m = 0; m < ngrids; m++) { + v1 = g1[(j*nf+n)*ngrids+m]; + gspaR[(j*nd+i)*ngrids+m] += caR * v1; + gspaI[(j*nd+i)*ngrids+m] +=-caI * v1; + gspbR[(j*nd+i)*ngrids+m] += cbR * v1; + gspbI[(j*nd+i)*ngrids+m] +=-cbI * v1; + } + } } + } +} + +static void a_bra1_cart2spinor_zi(dtype *gspR, dtype *gspI, + dtype *gx, dtype *gy, dtype *gz, dtype *g1, + FINT ngrids, FINT nket, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + FINT ndg = nd * ngrids; + dtype *gspaR = gspR; + dtype *gspaI = gspI; + dtype *gspbR = gspR + nket * ndg; + dtype *gspbI = gspI + nket * ndg; + dtype *gxR = gx; + dtype *gyR = gy; + dtype *gzR = gz; + dtype *g1R = g1; + dtype *gxI = gx + nket * nf * ngrids; + dtype *gyI = gy + nket * nf * ngrids; + dtype *gzI = gz + nket * nf * ngrids; + dtype *g1I = g1 + nket * nf * ngrids; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, n, m; + dtype caR, caI, cbR, cbI; + dtype v1R, vxR, vyR, vzR; + dtype v1I, vxI, vyI, vzI; + dtype v11R, v12R, v21R, v22R; + dtype v11I, v12I, v21I, v22I; + + for (j = 0; j < nket; j++) { +#pragma GCC ivdep + for (i = 0; i < ndg; i++) { + gspaR[j*ndg+i] = 0; + gspaI[j*ndg+i] = 0; + gspbR[j*ndg+i] = 0; + gspbI[j*ndg+i] = 0; + } + for (i = 0; i < nd; i++) { + for (n = 0; n < nf; n++) { + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; +#pragma GCC ivdep + for (m = 0; m < ngrids; m++) { + + + v11R = g1R[(j*nf+n)*ngrids+m] - gzI[(j*nf+n)*ngrids+m]; + v11I = g1I[(j*nf+n)*ngrids+m] + gzR[(j*nf+n)*ngrids+m]; + v12R = gyR[(j*nf+n)*ngrids+m] - gxI[(j*nf+n)*ngrids+m]; + v12I = gyI[(j*nf+n)*ngrids+m] + gxR[(j*nf+n)*ngrids+m]; + v21R =-gyR[(j*nf+n)*ngrids+m] - gxI[(j*nf+n)*ngrids+m]; + v21I =-gyI[(j*nf+n)*ngrids+m] + gxR[(j*nf+n)*ngrids+m]; + v22R = g1R[(j*nf+n)*ngrids+m] + gzI[(j*nf+n)*ngrids+m]; + v22I = g1I[(j*nf+n)*ngrids+m] - gzR[(j*nf+n)*ngrids+m]; + gspaR[(j*nd+i)*ngrids+m] += caR * v11R + caI * v11I + cbR * v21R + cbI * v21I; + gspaI[(j*nd+i)*ngrids+m] += caR * v11I - caI * v11R + cbR * v21I - cbI * v21R; + gspbR[(j*nd+i)*ngrids+m] += caR * v12R + caI * v12I + cbR * v22R + cbI * v22I; + gspbI[(j*nd+i)*ngrids+m] += caR * v12I - caI * v12R + cbR * v22I - cbI * v22R; + } + } } + } +} + +static void a_bra1_cart2spinor_zf(dtype *gspR, dtype *gspI, + dtype *gx, dtype *gy, dtype *gz, dtype *g1, + FINT ngrids, FINT nket, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + FINT ndg = nd * ngrids; + dtype *gspaR = gspR; + dtype *gspaI = gspI; + dtype *gspbR = gspR + nket * ndg; + dtype *gspbI = gspI + nket * ndg; + dtype *g1R = g1; + dtype *g1I = g1 + nket * nf * ngrids; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, n, m; + dtype caR, caI, cbR, cbI, v1R, v1I; + + for (j = 0; j < nket; j++) { +#pragma GCC ivdep + for (i = 0; i < ndg; i++) { + gspaR[j*ndg+i] = 0; + gspaI[j*ndg+i] = 0; + gspbR[j*ndg+i] = 0; + gspbI[j*ndg+i] = 0; + } + for (i = 0; i < nd; i++) { + for (n = 0; n < nf; n++) { + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; +#pragma GCC ivdep + for (m = 0; m < ngrids; m++) { + v1R = g1R[(j*nf+n)*ngrids+m]; + v1I = g1I[(j*nf+n)*ngrids+m]; + gspaR[(j*nd+i)*ngrids+m] += caR * v1R + caI * v1I; + gspaI[(j*nd+i)*ngrids+m] += caR * v1I - caI * v1R; + gspbR[(j*nd+i)*ngrids+m] += cbR * v1R + cbI * v1I; + gspbI[(j*nd+i)*ngrids+m] += cbR * v1I - cbI * v1R; + } + } } + } +} + +#if 0 + + +static void a_ket_cart2spinor_si(dtype *gspR, dtype *gspI, + dtype *gx, dtype *gy, dtype *gz, dtype *g1, + FINT lds, FINT nbra, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + dtype *gspaR = gspR; + dtype *gspaI = gspI; + dtype *gspbR = gspR + lds * nd; + dtype *gspbI = gspI + lds * nd; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, n; + dtype caR, caI, cbR, cbI, v1, vx, vy, vz; + + for (i = 0; i < nd; i++) { +#pragma GCC ivdep + for (j = 0; j < nbra; j++) { + gspaR[j+i*lds] = 0; + gspaI[j+i*lds] = 0; + gspbR[j+i*lds] = 0; + gspbI[j+i*lds] = 0; + } + for (n = 0; n < nf; n++) { + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; +#pragma GCC ivdep + for (j = 0; j < nbra; j++) { + v1 = g1[j+n*nbra]; + vx = gx[j+n*nbra]; + vy = gy[j+n*nbra]; + vz = gz[j+n*nbra]; + + + gspaR[j+i*lds] += caR * v1 - caI * vz + cbR * vy - cbI * vx; + gspaI[j+i*lds] += caI * v1 + caR * vz + cbI * vy + cbR * vx; + gspbR[j+i*lds] += cbR * v1 + cbI * vz - caR * vy - caI * vx; + gspbI[j+i*lds] += cbI * v1 - cbR * vz - caI * vy + caR * vx; + } + } + } +} + +static void a_ket_cart2spinor_sf(dtype *gspR, dtype *gspI, + dtype *gx, dtype *gy, dtype *gz, dtype *g1, + FINT lds, FINT nbra, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + dtype *gspaR = gspR; + dtype *gspaI = gspI; + dtype *gspbR = gspR + lds * nd; + dtype *gspbI = gspI + lds * nd; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, n; + dtype caR, caI, cbR, cbI, v1; + + for (i = 0; i < nd; i++) { +#pragma GCC ivdep + for (j = 0; j < nbra; j++) { + gspaR[j+i*lds] = 0; + gspaI[j+i*lds] = 0; + gspbR[j+i*lds] = 0; + gspbI[j+i*lds] = 0; + } + for (n = 0; n < nf; n++) { + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; +#pragma GCC ivdep + for (j = 0; j < nbra; j++) { + v1 = g1[j+n*nbra]; + gspaR[j+i*lds] += caR * v1; + gspaI[j+i*lds] += caI * v1; + gspbR[j+i*lds] += cbR * v1; + gspbI[j+i*lds] += cbI * v1; + } + } + } +} +#endif + +static void a_ket_cart2spinor(dtype *gspR, dtype *gspI, + dtype *gcartR, dtype *gcartI, + FINT nbra, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nf2 = nf * 2; + FINT nd = _len_spinor(kappa, l); + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, n; + dtype cR, cI, gR, gI; + + for (i = 0; i < nd; i++) { +#pragma GCC ivdep + for (j = 0; j < nbra; j++) { + gspR[j+i*nbra] = 0; + gspI[j+i*nbra] = 0; + } + for (n = 0; n < nf2; n++) { + cR = coeffR[i*nf2+n]; + cI = coeffI[i*nf2+n]; + if (cR != 0) { + if (cI != 0) { +#pragma GCC ivdep + for (j = 0; j < nbra; j++) { + gR = gcartR[j+n*nbra]; + gI = gcartI[j+n*nbra]; + gspR[j+i*nbra] += cR * gR - cI * gI; + gspI[j+i*nbra] += cI * gR + cR * gI; + } + } else { +#pragma GCC ivdep + for (j = 0; j < nbra; j++) { + gR = gcartR[j+n*nbra]; + gI = gcartI[j+n*nbra]; + gspR[j+i*nbra] += cR * gR; + gspI[j+i*nbra] += cR * gI; + } + } + } else { + if (cI != 0) { +#pragma GCC ivdep + for (j = 0; j < nbra; j++) { + gR = gcartR[j+n*nbra]; + gI = gcartI[j+n*nbra]; + gspR[j+i*nbra] +=-cI * gI; + gspI[j+i*nbra] += cI * gR; + } + } + } + } + } +} + + +static void a_iket_cart2spinor(dtype *gspR, dtype *gspI, + dtype *gcartR, dtype *gcartI, + FINT nbra, FINT kappa, FINT l) +{ + a_ket_cart2spinor(gspI, gspR, gcartR, gcartI, nbra, kappa, l); + FINT size = _len_spinor(kappa, l) * nbra; + FINT i; + for (i = 0; i < size; i++) { + gspR[i] = -gspR[i]; + } +} + +static void a_ket1_cart2spinor(dtype *gspR, dtype *gspI, + dtype *gcartR, dtype *gcartI, + FINT nbra, FINT counts, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nf2 = nf * 2; + FINT nd = _len_spinor(kappa, l); + FINT nds = nd * nbra; + FINT nfs = nf * nbra; + dtype *gcartaR = gcartR; + dtype *gcartaI = gcartI; + dtype *gcartbR = gcartaR + nfs * counts; + dtype *gcartbI = gcartaI + nfs * counts; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, k, n; + dtype caR, caI, cbR, cbI, gaR, gaI, gbR, gbI; + + for (i = 0; i < nd; i++) { + for (k = 0; k < counts; k++) { +#pragma GCC ivdep + for (j = 0; j < nbra; j++) { + gspR[k*nds+j+i*nbra] = 0; + gspI[k*nds+j+i*nbra] = 0; + } } + for (n = 0; n < nf; n++) { + caR = coeffR[i*nf2 +n]; + caI = coeffI[i*nf2 +n]; + cbR = coeffR[i*nf2+nf+n]; + cbI = coeffI[i*nf2+nf+n]; + for (k = 0; k < counts; k++) { +#pragma GCC ivdep + for (j = 0; j < nbra; j++) { + gaR = gcartaR[k*nfs+j+n*nbra]; + gaI = gcartaI[k*nfs+j+n*nbra]; + gbR = gcartbR[k*nfs+j+n*nbra]; + gbI = gcartbI[k*nfs+j+n*nbra]; + gspR[k*nds+j+i*nbra] += caR * gaR - caI * gaI + cbR * gbR - cbI * gbI; + gspI[k*nds+j+i*nbra] += caR * gaI + caI * gaR + cbR * gbI + cbI * gbR; + } } + } + } +} + + +static void a_iket1_cart2spinor(dtype *gspR, dtype *gspI, + dtype *gcartR, dtype *gcartI, + FINT nbra, FINT counts, FINT kappa, FINT l) +{ + a_ket1_cart2spinor(gspI, gspR, gcartR, gcartI, nbra, counts, kappa, l); + FINT size = _len_spinor(kappa, l) * nbra * counts; + FINT i; + for (i = 0; i < size; i++) { + gspR[i] = -gspR[i]; + } +} + + + +static void dcopy_ij(dtype *out, dtype *gctr, + const FINT ni, const FINT nj, const FINT mi, const FINT mj) +{ + FINT i, j; + + for (j = 0; j < mj; j++) { + for (i = 0; i < mi; i++) { + out[j*ni+i] = gctr[j*mi+i]; + } } +} + +static void zcopy_ij(dtype *out, dtype *gctrR, dtype *gctrI, + const FINT ni, const FINT nj, const FINT mi, const FINT mj) +{ + dtype *dout = (dtype *)out; + FINT i, j; + + for (j = 0; j < mj; j++) { + for (i = 0; i < mi; i++) { + dout[(j*ni+i)*OF_CMPLX ] = gctrR[j*mi+i]; + dout[(j*ni+i)*OF_CMPLX+1] = gctrI[j*mi+i]; + } } +} + +static void dcopy_grids_ij(dtype *out, const dtype *gctr, + const FINT ngrids, const FINT ni, const FINT nj, + const FINT mgrids, const FINT mi, const FINT mj) +{ + const size_t ngi = ngrids * ni; + const size_t mgi = mgrids * mi; + FINT i, j, m; + + for (j = 0; j < mj; j++) { + for (i = 0; i < mi; i++) { +#pragma GCC ivdep + for (m = 0; m < mgrids; m++) { + out[i*ngrids+m] = gctr[i*mgrids+m]; + } } + out += ngi; + gctr += mgi; + } +} + +static void zcopy_grids_ij(dtype *out, dtype *gctrR, dtype *gctrI, + const FINT ngrids, const FINT ni, const FINT nj, + const FINT mgrids, const FINT mi, const FINT mj) +{ + size_t ngi = ngrids * ni * OF_CMPLX; + size_t mgi = mgrids * mi; + dtype *dout = (dtype *)out; + FINT i, j, m; + + for (j = 0; j < mj; j++) { + for (i = 0; i < mi; i++) { +#pragma GCC ivdep + for (m = 0; m < mgrids; m++) { + dout[(i*ngrids+m)*OF_CMPLX ] = gctrR[i*mgrids+m]; + dout[(i*ngrids+m)*OF_CMPLX+1] = gctrI[i*mgrids+m]; + } } + dout += ngi; + gctrR += mgi; + gctrI += mgi; + } +} + + +static void dcopy_iklj(dtype *fijkl, const dtype *gctr, + const FINT ni, const FINT nj, const FINT nk, const FINT nl, + const FINT mi, const FINT mj, const FINT mk, const FINT ml) +{ + const size_t nij = ni * nj; + const size_t nijk = nij * nk; + const size_t mik = mi * mk; + const size_t mikl = mik * ml; + FINT i, j, k, l; + dtype *pijkl; + const dtype *pgctr; + + switch (mi) { + case 1: + for (l = 0; l < ml; l++) { + for (k = 0; k < mk; k++) { + pijkl = fijkl + k * nij; + pgctr = gctr + k * mi; +#pragma GCC ivdep + for (j = 0; j < mj; j++) { + pijkl[ni*j] = pgctr[mikl*j]; + } + } + fijkl += nijk; + gctr += mik; + } + break; + case 3: + for (l = 0; l < ml; l++) { + for (k = 0; k < mk; k++) { + pijkl = fijkl + k * nij; + pgctr = gctr + k * mi; +#pragma GCC ivdep + for (j = 0; j < mj; j++) { + pijkl[ni*j+0] = pgctr[mikl*j+0]; + pijkl[ni*j+1] = pgctr[mikl*j+1]; + pijkl[ni*j+2] = pgctr[mikl*j+2]; + } + } + fijkl += nijk; + gctr += mik; + } + break; + case 5: + for (l = 0; l < ml; l++) { + for (k = 0; k < mk; k++) { + pijkl = fijkl + k * nij; + pgctr = gctr + k * mi; +#pragma GCC ivdep + for (j = 0; j < mj; j++) { + pijkl[ni*j+0] = pgctr[mikl*j+0]; + pijkl[ni*j+1] = pgctr[mikl*j+1]; + pijkl[ni*j+2] = pgctr[mikl*j+2]; + pijkl[ni*j+3] = pgctr[mikl*j+3]; + pijkl[ni*j+4] = pgctr[mikl*j+4]; + } + } + fijkl += nijk; + gctr += mik; + } + break; + case 6: + for (l = 0; l < ml; l++) { + for (k = 0; k < mk; k++) { + pijkl = fijkl + k * nij; + pgctr = gctr + k * mi; +#pragma GCC ivdep + for (j = 0; j < mj; j++) { + pijkl[ni*j+0] = pgctr[mikl*j+0]; + pijkl[ni*j+1] = pgctr[mikl*j+1]; + pijkl[ni*j+2] = pgctr[mikl*j+2]; + pijkl[ni*j+3] = pgctr[mikl*j+3]; + pijkl[ni*j+4] = pgctr[mikl*j+4]; + pijkl[ni*j+5] = pgctr[mikl*j+5]; + } + } + fijkl += nijk; + gctr += mik; + } + break; + case 7: + for (l = 0; l < ml; l++) { + for (k = 0; k < mk; k++) { + pijkl = fijkl + k * nij; + pgctr = gctr + k * mi; +#pragma GCC ivdep + for (j = 0; j < mj; j++) { + pijkl[ni*j+0] = pgctr[mikl*j+0]; + pijkl[ni*j+1] = pgctr[mikl*j+1]; + pijkl[ni*j+2] = pgctr[mikl*j+2]; + pijkl[ni*j+3] = pgctr[mikl*j+3]; + pijkl[ni*j+4] = pgctr[mikl*j+4]; + pijkl[ni*j+5] = pgctr[mikl*j+5]; + pijkl[ni*j+6] = pgctr[mikl*j+6]; + } + } + fijkl += nijk; + gctr += mik; + } + break; + default: + for (l = 0; l < ml; l++) { + for (k = 0; k < mk; k++) { + pijkl = fijkl + k * nij; + pgctr = gctr + k * mi; + for (j = 0; j < mj; j++) { +#pragma GCC ivdep + for (i = 0; i < mi; i++) { + pijkl[ni*j+i] = pgctr[mikl*j+i]; + } + } + } + fijkl += nijk; + gctr += mik; + } + } +} + +static void zcopy_iklj(dtype *fijkl, dtype *gctrR, dtype *gctrI, + const FINT ni, const FINT nj, const FINT nk, const FINT nl, + const FINT mi, const FINT mj, const FINT mk, const FINT ml) +{ + size_t nij = ni * nj; + size_t nijk = nij * nk; + size_t mik = mi * mk; + size_t mikl = mik * ml; + FINT i, j, k, l; + dtype *pijkl; + dtype *pgctrR, *pgctrI; + + for (l = 0; l < ml; l++) { + for (k = 0; k < mk; k++) { + pijkl = (dtype *)(fijkl + k * nij); + pgctrR = gctrR + k * mi; + pgctrI = gctrI + k * mi; + for (j = 0; j < mj; j++) { +#pragma GCC ivdep + for (i = 0; i < mi; i++) { + pijkl[(j*ni+i)*OF_CMPLX ] = pgctrR[j*mikl+i]; + pijkl[(j*ni+i)*OF_CMPLX+1] = pgctrI[j*mikl+i]; + } + } + } + fijkl += nijk; + gctrR += mik; + gctrI += mik; + } +} + +void c2s_dset0(dtype *out, FINT *dims, FINT *counts) +{ + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + size_t nij = ni * nj; + size_t nijk = nij * nk; + FINT i, j, k, l; + if (dims == counts) { + for (i = 0; i < nijk * counts[3]; i++) { + out[i] = 0; + } + return; + } + FINT di = counts[0]; + FINT dj = counts[1]; + FINT dk = counts[2]; + FINT dl = counts[3]; + dtype *pout; + for (l = 0; l < dl; l++) { + for (k = 0; k < dk; k++) { + pout = out + k * nij; + for (j = 0; j < dj; j++) { + for (i = 0; i < di; i++) { + pout[j*ni+i] = 0; + } } + } + out += nijk; + } +} +void c2s_zset0(dtype *out, FINT *dims, FINT *counts) +{ + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + size_t nij = ni * nj; + size_t nijk = nij * nk; + FINT i, j, k, l; + if (dims == counts) { + for (i = 0; i < nijk * counts[3]; i++) { + out[i] = 0; + } + return; + } + FINT di = counts[0]; + FINT dj = counts[1]; + FINT dk = counts[2]; + FINT dl = counts[3]; + dtype *pout; + for (l = 0; l < dl; l++) { + for (k = 0; k < dk; k++) { + pout = out + k * nij; + for (j = 0; j < dj; j++) { + for (i = 0; i < di; i++) { + pout[j*ni+i] = 0; + } } + } + out += nijk; + } +} + +void c2s_grids_dset0(dtype *out, FINT *dims, FINT *counts) +{ + FINT counts1[4] = {counts[2], counts[0], counts[1], counts[3]}; + FINT dims1[4] = {dims[2], dims[0], dims[1],dims [3]}; + c2s_dset0(out, dims1, counts1); +} + +void c2s_grids_zset0(dtype *out, FINT *dims, FINT *counts) +{ + FINT counts1[4] = {counts[2], counts[0], counts[1], counts[3]}; + FINT dims1[4] = {dims[2], dims[0], dims[1],dims [3]}; + c2s_zset0(out, dims1, counts1); +} + + +static dtype *sph2e_inner(dtype *gsph, dtype *gcart, + FINT l, FINT nbra, FINT ncall, FINT sizsph, FINT sizcart) +{ + FINT n; + switch (l) { +#ifdef PYPZPX + case 0: + return gcart; + case 1: + for (n = 0; n < ncall; n++) { + p_ket_cart2spheric(gsph+n*sizsph, gcart+n*sizcart, nbra, nbra, l); + } + break; +#else + case 0: case 1: + return gcart; +#endif + case 2: + for (n = 0; n < ncall; n++) { + d_ket_cart2spheric(gsph+n*sizsph, gcart+n*sizcart, nbra, nbra, l); + } + break; + case 3: + for (n = 0; n < ncall; n++) { + f_ket_cart2spheric(gsph+n*sizsph, gcart+n*sizcart, nbra, nbra, l); + } + break; + case 4: + for (n = 0; n < ncall; n++) { + g_ket_cart2spheric(gsph+n*sizsph, gcart+n*sizcart, nbra, nbra, l); + } + break; + default: + for (n = 0; n < ncall; n++) { + a_ket_cart2spheric(gsph+n*sizsph, gcart+n*sizcart, nbra, nbra, l); + } + } + return gsph; +} + + +void c2s_sph_1e(dtype *opij, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT di = i_l * 2 + 1; + FINT dj = j_l * 2 + 1; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT ofj = ni * dj; + FINT nfi = envs->nfi; + FINT nf = envs->nf; + FINT ic, jc; + FINT buflen = nfi*dj; + //dtype *buf1, *buf2; + //MALLOC_INSTACK(buf1, buflen); + //MALLOC_INSTACK(buf2, buflen); + MALLOC(dtype, buf1); + MALLOC(dtype, buf2); + dtype *pij; + dtype *tmp1; + + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + tmp1 = (c2s_ket_sph[j_l])(buf1, gctr, nfi, nfi, j_l); + tmp1 = (c2s_bra_sph[i_l])(buf2, dj, tmp1, i_l); + pij = opij + ofj * jc + di * ic; + dcopy_ij(pij, tmp1, ni, nj, di, dj); + gctr += nf; + } } +} + + +// return hack start +void c2s_sf_1e(dtype *opij, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + //return; // TODO; + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT ofj = ni * dj; + FINT nfj = envs->nfj; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT ic, jc; + /*dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + MALLOC_INSTACK(tmp1R, di*nf2j); + MALLOC_INSTACK(tmp1I, di*nf2j); + MALLOC_INSTACK(tmp2R, di*dj); + MALLOC_INSTACK(tmp2I, di*dj);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + MALLOC(dtype, tmp2R); + MALLOC(dtype, tmp2I); + + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra_cart2spinor_sf(tmp1R, tmp1I, NULL, NULL, NULL, gctr, nfj, i_kp, i_l); + a_ket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di, j_kp, j_l); + zcopy_ij(opij+ofj*jc+di*ic, tmp2R, tmp2I, ni, nj, di, dj); + gctr += nf; + } } +} + +void c2s_sf_1ei(dtype *opij, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) { + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT ofj = ni * dj; + FINT nfj = envs->nfj; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT ic, jc; + /*dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + MALLOC_INSTACK(tmp1R, di*nf2j); + MALLOC_INSTACK(tmp1I, di*nf2j); + MALLOC_INSTACK(tmp2R, di*dj); + MALLOC_INSTACK(tmp2I, di*dj);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + MALLOC(dtype, tmp2R); + MALLOC(dtype, tmp2I); + + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra_cart2spinor_sf(tmp1R, tmp1I, NULL, NULL, NULL, gctr, nfj, i_kp, i_l); + a_iket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di, j_kp, j_l); + zcopy_ij(opij+ofj*jc+di*ic, tmp2R, tmp2I, ni, nj, di, dj); + gctr += nf; + } } +} + + +void c2s_si_1e(dtype *opij, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + //return; + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT ofj = ni * dj; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nf2i = nfi + nfi; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT ic, jc; + dtype *gc_x = gctr; + dtype *gc_y = gc_x + nf * i_ctr * j_ctr; + dtype *gc_z = gc_y + nf * i_ctr * j_ctr; + dtype *gc_1 = gc_z + nf * i_ctr * j_ctr; + /*dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + MALLOC_INSTACK(tmp1R, di*nf2j); + MALLOC_INSTACK(tmp1I, di*nf2j); + MALLOC_INSTACK(tmp2R, di*dj); + MALLOC_INSTACK(tmp2I, di*dj);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + MALLOC(dtype, tmp2R); + MALLOC(dtype, tmp2I); + + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra_cart2spinor_si(tmp1R, tmp1I, gc_x, gc_y, gc_z, gc_1, nfj, i_kp, i_l); + a_ket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di, j_kp, j_l); + zcopy_ij(opij+ofj*jc+di*ic, tmp2R, tmp2I, ni, nj, di, dj); + + gc_x += nf; + gc_y += nf; + gc_z += nf; + gc_1 += nf; + } } +} +void c2s_si_1ei(dtype *opij, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT ofj = ni * dj; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nf2i = nfi + nfi; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT ic, jc; + dtype *gc_x = gctr; + dtype *gc_y = gc_x + nf * i_ctr * j_ctr; + dtype *gc_z = gc_y + nf * i_ctr * j_ctr; + dtype *gc_1 = gc_z + nf * i_ctr * j_ctr; + /*dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_INSTACK(tmp1R, di*nf2j); + MALLOC_INSTACK(tmp1I, di*nf2j); + MALLOC_INSTACK(tmp2R, di*dj); + MALLOC_INSTACK(tmp2I, di*dj);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + MALLOC(dtype, tmp2R); + MALLOC(dtype, tmp2I); + + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra_cart2spinor_si(tmp1R, tmp1I, gc_x, gc_y, gc_z, gc_1, nfj, i_kp, i_l); + a_iket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di, j_kp, j_l); + zcopy_ij(opij+ofj*jc+di*ic, tmp2R, tmp2I, ni, nj, di, dj); + + gc_x += nf; + gc_y += nf; + gc_z += nf; + gc_1 += nf; + } } +} + +void c2s_sph_1e_grids(dtype *out, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT ngrids = envs->ngrids; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT di = i_l * 2 + 1; + FINT dj = j_l * 2 + 1; + FINT ni = dims[0]; + FINT nj = dims[1]; + size_t Ng = dims[2]; + FINT ofj = ni * dj; + FINT nfi = envs->nfi; + FINT nf = envs->nf; + FINT ic, jc, grids_offset; + FINT bgrids, bgrids_di, bgrids_nfi; + FINT buflen = GRID_BLKSIZE * nfi * dj; + /*dtype *buf1, *buf2; + //return; + MALLOC_ALIGN8_INSTACK(buf1, buflen); + MALLOC_ALIGN8_INSTACK(buf2, buflen);*/ + MALLOC(dtype, buf1); + MALLOC(dtype, buf2); + dtype *pij; + dtype *tmp1; + + for (grids_offset = 0; grids_offset < ngrids; grids_offset += GRID_BLKSIZE) { + bgrids = MIN(ngrids - grids_offset, GRID_BLKSIZE); + bgrids_di = bgrids * di; + bgrids_nfi = bgrids * nfi; + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + tmp1 = (c2s_ket_sph[j_l])(buf1, gctr, bgrids_nfi, bgrids_nfi, j_l); + tmp1 = sph2e_inner(buf2, tmp1, i_l, bgrids, dj, bgrids_di, bgrids_nfi); + pij = out + Ng * (ofj * jc + di * ic) + grids_offset; + dcopy_grids_ij(pij, tmp1, Ng, ni, nj, bgrids, di, dj); + gctr += bgrids * nf; + } } + } +} + +void c2s_cart_1e_grids(dtype *out, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT ngrids = envs->ngrids; + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT ni = dims[0]; + FINT nj = dims[1]; + size_t Ng = dims[2]; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nf = envs->nf; + FINT ofj = ni * nfj; + FINT ic, jc, grids_offset; + FINT bgrids; + dtype *pij; + + for (grids_offset = 0; grids_offset < ngrids; grids_offset += GRID_BLKSIZE) { + bgrids = MIN(ngrids - grids_offset, GRID_BLKSIZE); + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + pij = out + Ng * (ofj * jc + nfi * ic) + grids_offset; + dcopy_grids_ij(pij, gctr, Ng, ni, nj, bgrids, nfi, nfj); + gctr += bgrids * nf; + } } + } +} + + +void c2s_sf_1e_grids(dtype *out, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT ngrids = envs->ngrids; + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT ni = dims[0]; + FINT nj = dims[1]; + size_t Ng = dims[2]; + FINT ofj = ni * dj; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT ic, jc, grids_offset; + FINT bgrids, bgrids_di; + FINT buflen = GRID_BLKSIZE * di * nf2j; + /*dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_ALIGN8_INSTACK(tmp1R, buflen); + MALLOC_ALIGN8_INSTACK(tmp1I, buflen); + MALLOC_ALIGN8_INSTACK(tmp2R, buflen); + MALLOC_ALIGN8_INSTACK(tmp2I, buflen);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + MALLOC(dtype, tmp2R); + MALLOC(dtype, tmp2I); + dtype *pij; + + for (grids_offset = 0; grids_offset < ngrids; grids_offset += GRID_BLKSIZE) { + bgrids = MIN(ngrids - grids_offset, GRID_BLKSIZE); + bgrids_di = bgrids * di; + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra1_cart2spinor_sf(tmp1R, tmp1I, NULL, NULL, NULL, gctr, bgrids, nfj, i_kp, i_l); + a_ket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, bgrids_di, j_kp, j_l); + pij = out + Ng * (ofj * jc + di * ic) + grids_offset; + zcopy_grids_ij(pij, tmp2R, tmp2I, Ng, ni, nj, bgrids, di, dj); + gctr += bgrids * nf; + } } + } +} +void c2s_sf_1e_gridsi(dtype *out, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT ngrids = envs->ngrids; + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT ni = dims[0]; + FINT nj = dims[1]; + size_t Ng = dims[2]; + FINT ofj = ni * dj; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT ic, jc, grids_offset; + FINT bgrids, bgrids_di; + FINT buflen = GRID_BLKSIZE * di * nf2j; + /*dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_ALIGN8_INSTACK(tmp1R, buflen); + MALLOC_ALIGN8_INSTACK(tmp1I, buflen); + MALLOC_ALIGN8_INSTACK(tmp2R, buflen); + MALLOC_ALIGN8_INSTACK(tmp2I, buflen);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + MALLOC(dtype, tmp2R); + MALLOC(dtype, tmp2I); + dtype *pij; + + for (grids_offset = 0; grids_offset < ngrids; grids_offset += GRID_BLKSIZE) { + bgrids = MIN(ngrids - grids_offset, GRID_BLKSIZE); + bgrids_di = bgrids * di; + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra1_cart2spinor_sf(tmp1R, tmp1I, NULL, NULL, NULL, gctr, bgrids, nfj, i_kp, i_l); + a_iket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, bgrids_di, j_kp, j_l); + pij = out + Ng * (ofj * jc + di * ic) + grids_offset; + zcopy_grids_ij(pij, tmp2R, tmp2I, Ng, ni, nj, bgrids, di, dj); + gctr += bgrids * nf; + } } + } +} +void c2s_si_1e_grids(dtype *out, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT ngrids = envs->ngrids; + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT ni = dims[0]; + FINT nj = dims[1]; + size_t Ng = dims[2]; + FINT ofj = ni * dj; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nf2i = nfi + nfi; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT ic, jc, grids_offset; + FINT bgrids, bgrids_di, bgrids_nf; + dtype *gc_x = gctr; + dtype *gc_y = gc_x + ngrids * nf * i_ctr * j_ctr; + dtype *gc_z = gc_y + ngrids * nf * i_ctr * j_ctr; + dtype *gc_1 = gc_z + ngrids * nf * i_ctr * j_ctr; + FINT buflen = GRID_BLKSIZE * di * nf2j; + /*dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_ALIGN8_INSTACK(tmp1R, buflen); + MALLOC_ALIGN8_INSTACK(tmp1I, buflen); + MALLOC_ALIGN8_INSTACK(tmp2R, buflen); + MALLOC_ALIGN8_INSTACK(tmp2I, buflen);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + MALLOC(dtype, tmp2R); + MALLOC(dtype, tmp2I); + dtype *pij; + + for (grids_offset = 0; grids_offset < ngrids; grids_offset += GRID_BLKSIZE) { + bgrids = MIN(ngrids - grids_offset, GRID_BLKSIZE); + bgrids_di = bgrids * di; + bgrids_nf = bgrids * nf; + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra1_cart2spinor_si(tmp1R, tmp1I, gc_x, gc_y, gc_z, gc_1, bgrids, nfj, i_kp, i_l); + a_ket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, bgrids_di, j_kp, j_l); + pij = out + Ng * (ofj * jc + di * ic) + grids_offset; + zcopy_grids_ij(pij, tmp2R, tmp2I, Ng, ni, nj, bgrids, di, dj); + gc_x += bgrids_nf; + gc_y += bgrids_nf; + gc_z += bgrids_nf; + gc_1 += bgrids_nf; + } } + } +} +void c2s_si_1e_gridsi(dtype *out, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT ngrids = envs->ngrids; + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT ni = dims[0]; + FINT nj = dims[1]; + size_t Ng = dims[2]; + FINT ofj = ni * dj; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nf2i = nfi + nfi; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT ic, jc, grids_offset; + FINT bgrids, bgrids_di, bgrids_nf; + dtype *gc_x = gctr; + dtype *gc_y = gc_x + ngrids * nf * i_ctr * j_ctr; + dtype *gc_z = gc_y + ngrids * nf * i_ctr * j_ctr; + dtype *gc_1 = gc_z + ngrids * nf * i_ctr * j_ctr; + FINT buflen = GRID_BLKSIZE * di * nf2j; + /*dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_ALIGN8_INSTACK(tmp1R, buflen); + MALLOC_ALIGN8_INSTACK(tmp1I, buflen); + MALLOC_ALIGN8_INSTACK(tmp2R, buflen); + MALLOC_ALIGN8_INSTACK(tmp2I, buflen);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + MALLOC(dtype, tmp2R); + MALLOC(dtype, tmp2I); + dtype *pij; + + for (grids_offset = 0; grids_offset < ngrids; grids_offset += GRID_BLKSIZE) { + bgrids = MIN(ngrids - grids_offset, GRID_BLKSIZE); + bgrids_di = bgrids * di; + bgrids_nf = bgrids * nf; + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra1_cart2spinor_si(tmp1R, tmp1I, gc_x, gc_y, gc_z, gc_1, bgrids, nfj, i_kp, i_l); + a_iket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, bgrids_di, j_kp, j_l); + pij = out + Ng * (ofj * jc + di * ic) + grids_offset; + zcopy_grids_ij(pij, tmp2R, tmp2I, Ng, ni, nj, bgrids, di, dj); + gc_x += bgrids_nf; + gc_y += bgrids_nf; + gc_z += bgrids_nf; + gc_1 += bgrids_nf; + } } + } +} + + +void c2s_sph_2e1(dtype *out, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT k_l = envs->k_l; + FINT l_l = envs->l_l; + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT l_ctr = envs->x_ctr[3]; + FINT di = i_l * 2 + 1; + FINT dj = j_l * 2 + 1; + FINT dk = k_l * 2 + 1; + FINT dl = l_l * 2 + 1; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT nl = dims[3]; + FINT nfi = envs->nfi; + FINT nfk = envs->nfk; + FINT nfl = envs->nfl; + FINT nfik = nfi * nfk; + FINT nfikl = nfik * nfl; + FINT dlj = dl * dj; + FINT nf = envs->nf; + FINT ofj = ni * dj; + FINT ofk = ni * nj * dk; + FINT ofl = ni * nj * nk * dl; + FINT ic, jc, kc, lc; + FINT buflen = nfikl*dj; + //dtype *buf1; + //MALLOC_INSTACK(buf1, buflen*4); + MALLOC(dtype, buf1); + dtype *buf2 = buf1 + buflen; + dtype *buf3 = buf2 + buflen; + dtype *buf4 = buf3 + buflen; + dtype *pout, *tmp1; + + for (lc = 0; lc < l_ctr; lc++) { + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + tmp1 = (c2s_ket_sph[j_l])(buf1, gctr, nfikl, nfikl, j_l); + tmp1 = sph2e_inner(buf2, tmp1, l_l, nfik, dj, nfik*dl, nfikl); + tmp1 = sph2e_inner(buf3, tmp1, k_l, nfi, dlj, nfi*dk, nfik); + + tmp1 = (c2s_bra_sph[i_l])(buf4, dk*dlj, tmp1, i_l); + + pout = out + ofl * lc + ofk * kc + ofj * jc + di * ic; + dcopy_iklj(pout, tmp1, ni, nj, nk, nl, di, dj, dk, dl); + gctr += nf; + } } } } +} + + +void c2s_sf_2e1(dtype *opij, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT l_ctr = envs->x_ctr[3]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nfl = envs->nfl; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT no = di * nfk * nfl * dj; + FINT d_i = di * nfk * nfl; + FINT d_j = nfk * nfl * nfj; + FINT i; + FINT buflen = di * nfk * nfl * nf2j; + /*dtype *tmp1R, *tmp1I; + return; + MALLOC_INSTACK(tmp1R, buflen); + MALLOC_INSTACK(tmp1I, buflen);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + + for (i = 0; i < i_ctr * j_ctr * k_ctr * l_ctr; i++) { + a_bra_cart2spinor_sf(tmp1R, tmp1I, NULL, NULL, NULL, gctr, d_j, i_kp, i_l); + a_ket_cart2spinor(opij, opij+no, tmp1R, tmp1I, d_i, j_kp, j_l); + gctr += nf; + opij += no * OF_CMPLX; + } +} + +void c2s_sf_2e1i(dtype *opij, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT l_ctr = envs->x_ctr[3]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nfl = envs->nfl; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT no = di * nfk * nfl * dj; + FINT d_i = di * nfk * nfl; + FINT d_j = nfk * nfl * nfj; + FINT i; + FINT len1 = di * nfk * nfl * nf2j; + /*dtype *tmp1R, *tmp1I; + return; + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + + for (i = 0; i < i_ctr * j_ctr * k_ctr * l_ctr; i++) { + a_bra_cart2spinor_sf(tmp1R, tmp1I, NULL, NULL, NULL, gctr, d_j, i_kp, i_l); + a_iket_cart2spinor(opij, opij+no, tmp1R, tmp1I, d_i, j_kp, j_l); + gctr += nf; + opij += no * OF_CMPLX; + } +} + + +void c2s_sf_2e2(dtype *fijkl, dtype *opij, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT k_sh = shls[2]; + FINT l_sh = shls[3]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT k_l = envs->k_l; + FINT l_l = envs->l_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT k_kp = bas(KAPPA_OF, k_sh); + FINT l_kp = bas(KAPPA_OF, l_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT l_ctr = envs->x_ctr[3]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT dk = _len_spinor(k_kp, k_l); + FINT dl = _len_spinor(l_kp, l_l); + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT nl = dims[3]; + FINT nfk = envs->nfk; + FINT nfl = envs->nfl; + FINT nf2k = nfk + nfk; + FINT nf2l = nfl + nfl; + FINT nop = di * nfk * nfl * dj; + FINT ofj = ni * dj; + FINT ofk = ni * nj * dk; + FINT ofl = ni * nj * nk * dl; + FINT ic, jc, kc, lc; + FINT len1 = di * dk * nf2l * dj; + FINT len2 = di * dk * dl * dj; + /*dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1); + MALLOC_INSTACK(tmp2R, len2); + MALLOC_INSTACK(tmp2I, len2);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + MALLOC(dtype, tmp2R); + MALLOC(dtype, tmp2I); + dtype *pfijkl; + + for (lc = 0; lc < l_ctr; lc++) { + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra1_cart2spinor_zf(tmp1R, tmp1I, NULL, NULL, NULL, opij, di, nfl*dj, k_kp, k_l); + a_ket1_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di*dk, dj, l_kp, l_l); + pfijkl = fijkl + (ofl * lc + ofk * kc + ofj * jc + di * ic); + zcopy_iklj(pfijkl, tmp2R, tmp2I, ni, nj, nk, nl, di, dj, dk, dl); + opij += nop * OF_CMPLX; + } } } } +} +void c2s_sf_2e2i(dtype *fijkl, dtype *opij, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT k_sh = shls[2]; + FINT l_sh = shls[3]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT k_l = envs->k_l; + FINT l_l = envs->l_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT k_kp = bas(KAPPA_OF, k_sh); + FINT l_kp = bas(KAPPA_OF, l_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT l_ctr = envs->x_ctr[3]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT dk = _len_spinor(k_kp, k_l); + FINT dl = _len_spinor(l_kp, l_l); + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT nl = dims[3]; + FINT nfk = envs->nfk; + FINT nfl = envs->nfl; + FINT nf2k = nfk + nfk; + FINT nf2l = nfl + nfl; + FINT nop = di * nfk * nfl * dj; + FINT ofj = ni * dj; + FINT ofk = ni * nj * dk; + FINT ofl = ni * nj * nk * dl; + FINT ic, jc, kc, lc; + FINT len2 = di * dk * dl * dj; + FINT len1 = di * dk * nf2l * dj; + /*dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1); + MALLOC_INSTACK(tmp2R, len2); + MALLOC_INSTACK(tmp2I, len2);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + MALLOC(dtype, tmp2R); + MALLOC(dtype, tmp2I); + dtype *pfijkl; + + for (lc = 0; lc < l_ctr; lc++) { + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra1_cart2spinor_zf(tmp1R, tmp1I, NULL, NULL, NULL, opij, di, nfl*dj, k_kp, k_l); + a_iket1_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di*dk, dj, l_kp, l_l); + pfijkl = fijkl + (ofl * lc + ofk * kc + ofj * jc + di * ic); + zcopy_iklj(pfijkl, tmp2R, tmp2I, ni, nj, nk, nl, di, dj, dk, dl); + opij += nop * OF_CMPLX; + } } } } +} + + +void c2s_si_2e1(dtype *opij, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT l_ctr = envs->x_ctr[3]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nfl = envs->nfl; + FINT nf2i = nfi + nfi; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT no = di * nfk * nfl * dj; + FINT d_i = di * nfk * nfl; + FINT d_j = nfk * nfl * nfj; + FINT i; + dtype *gc_x = gctr; + dtype *gc_y = gc_x + nf * i_ctr * j_ctr * k_ctr * l_ctr; + dtype *gc_z = gc_y + nf * i_ctr * j_ctr * k_ctr * l_ctr; + dtype *gc_1 = gc_z + nf * i_ctr * j_ctr * k_ctr * l_ctr; + FINT len1 = di * nfk * nfl * nf2j; + /*dtype *tmp1R, *tmp1I; + return; + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + + for (i = 0; i < i_ctr * j_ctr * k_ctr * l_ctr; i++) { + a_bra_cart2spinor_si(tmp1R, tmp1I, gc_x, gc_y, gc_z, gc_1, d_j, i_kp, i_l); + a_ket_cart2spinor(opij, opij+no, tmp1R, tmp1I, d_i, j_kp, j_l); + gc_x += nf; + gc_y += nf; + gc_z += nf; + gc_1 += nf; + opij += no * OF_CMPLX; + } +} +void c2s_si_2e1i(dtype *opij, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT l_ctr = envs->x_ctr[3]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nfl = envs->nfl; + FINT nf2i = nfi + nfi; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT no = di * nfk * nfl * dj; + FINT d_i = di * nfk * nfl; + FINT d_j = nfk * nfl * nfj; + FINT i; + dtype *gc_x = gctr; + dtype *gc_y = gc_x + nf * i_ctr * j_ctr * k_ctr * l_ctr; + dtype *gc_z = gc_y + nf * i_ctr * j_ctr * k_ctr * l_ctr; + dtype *gc_1 = gc_z + nf * i_ctr * j_ctr * k_ctr * l_ctr; + FINT len1 = di * nfk * nfl * nf2j; + /*dtype *tmp1R, *tmp1I; + return; + + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + + for (i = 0; i < i_ctr * j_ctr * k_ctr * l_ctr; i++) { + a_bra_cart2spinor_si(tmp1R, tmp1I, gc_x, gc_y, gc_z, gc_1, d_j, i_kp, i_l); + a_iket_cart2spinor(opij, opij+no, tmp1R, tmp1I, d_i, j_kp, j_l); + gc_x += nf; + gc_y += nf; + gc_z += nf; + gc_1 += nf; + opij += no * OF_CMPLX; + } +} + +/**/ +void c2s_si_2e2(dtype *fijkl, dtype *opij, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT k_sh = shls[2]; + FINT l_sh = shls[3]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT k_l = envs->k_l; + FINT l_l = envs->l_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT k_kp = bas(KAPPA_OF, k_sh); + FINT l_kp = bas(KAPPA_OF, l_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT l_ctr = envs->x_ctr[3]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT dk = _len_spinor(k_kp, k_l); + FINT dl = _len_spinor(l_kp, l_l); + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT nl = dims[3]; + FINT nfk = envs->nfk; + FINT nfl = envs->nfl; + FINT nf2k = nfk + nfk; + FINT nf2l = nfl + nfl; + FINT nop = di * nfk * nfl * dj; + FINT ofj = ni * dj; + FINT ofk = ni * nj * dk; + FINT ofl = ni * nj * nk * dl; + FINT ic, jc, kc, lc; + dtype *pfijkl; + dtype *ox = opij; + dtype *oy = ox + nop * OF_CMPLX * i_ctr * j_ctr * k_ctr * l_ctr; + dtype *oz = oy + nop * OF_CMPLX * i_ctr * j_ctr * k_ctr * l_ctr; + dtype *o1 = oz + nop * OF_CMPLX * i_ctr * j_ctr * k_ctr * l_ctr; + FINT buflen = di * dk * nf2l * dj; + /*dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_INSTACK(tmp1R, buflen); + MALLOC_INSTACK(tmp1I, buflen); + MALLOC_INSTACK(tmp2R, buflen); + MALLOC_INSTACK(tmp2I, buflen);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + MALLOC(dtype, tmp2R); + MALLOC(dtype, tmp2I); + + for (lc = 0; lc < l_ctr; lc++) { + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra1_cart2spinor_zi(tmp1R, tmp1I, ox, oy, oz, o1, di, nfl*dj, k_kp, k_l); + a_ket1_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di*dk, dj, l_kp, l_l); + pfijkl = fijkl + (ofl * lc + ofk * kc + ofj * jc + di * ic); + zcopy_iklj(pfijkl, tmp2R, tmp2I, ni, nj, nk, nl, di, dj, dk, dl); + ox += nop * OF_CMPLX; + oy += nop * OF_CMPLX; + oz += nop * OF_CMPLX; + o1 += nop * OF_CMPLX; + } } } } +} + +void c2s_si_2e2i(dtype *fijkl, dtype *opij, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT k_sh = shls[2]; + FINT l_sh = shls[3]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT k_l = envs->k_l; + FINT l_l = envs->l_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT k_kp = bas(KAPPA_OF, k_sh); + FINT l_kp = bas(KAPPA_OF, l_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT l_ctr = envs->x_ctr[3]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT dk = _len_spinor(k_kp, k_l); + FINT dl = _len_spinor(l_kp, l_l); + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT nl = dims[3]; + FINT nfk = envs->nfk; + FINT nfl = envs->nfl; + FINT nf2k = nfk + nfk; + FINT nf2l = nfl + nfl; + FINT nop = di * nfk * nfl * dj; + FINT ofj = ni * dj; + FINT ofk = ni * nj * dk; + FINT ofl = ni * nj * nk * dl; + FINT ic, jc, kc, lc; + dtype *pfijkl; + dtype *ox = opij; + dtype *oy = ox + nop * OF_CMPLX * i_ctr * j_ctr * k_ctr * l_ctr; + dtype *oz = oy + nop * OF_CMPLX * i_ctr * j_ctr * k_ctr * l_ctr; + dtype *o1 = oz + nop * OF_CMPLX * i_ctr * j_ctr * k_ctr * l_ctr; + FINT buflen = di * dk * nf2l * dj; + /*dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_INSTACK(tmp2R, buflen); + MALLOC_INSTACK(tmp2I, buflen); + MALLOC_INSTACK(tmp1R, buflen); + MALLOC_INSTACK(tmp1I, buflen);*/ + MALLOC(dtype, tmp1R); + MALLOC(dtype, tmp1I); + MALLOC(dtype, tmp2R); + MALLOC(dtype, tmp2I); + + for (lc = 0; lc < l_ctr; lc++) { + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra1_cart2spinor_zi(tmp1R, tmp1I, ox, oy, oz, o1, di, nfl*dj, k_kp, k_l); + a_iket1_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di*dk, dj, l_kp, l_l); + pfijkl = fijkl + (ofl * lc + ofk * kc + ofj * jc + di * ic); + zcopy_iklj(pfijkl, tmp2R, tmp2I, ni, nj, nk, nl, di, dj, dk, dl); + ox += nop * OF_CMPLX; + oy += nop * OF_CMPLX; + oz += nop * OF_CMPLX; + o1 += nop * OF_CMPLX; + } } } } +} + + +void c2s_cart_1e(dtype *opij, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nf = envs->nf; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT ofj = ni * nfj; + FINT ic, jc; + dtype *popij; + + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + popij = opij + ofj * jc + nfi * ic; + dcopy_ij(popij, gctr, ni, nj, nfi, nfj); + gctr += nf; + } } +} + + +void c2s_cart_2e1(dtype *fijkl, dtype *gctr, FINT *dims, CINTEnvVars *envs, + dtype *cache) +{ + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT l_ctr = envs->x_ctr[3]; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nfl = envs->nfl; + FINT nf = envs->nf; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT nl = dims[3]; + FINT ofj = ni * nfj; + FINT ofk = ni * nj * nfk; + FINT ofl = ni * nj * nk * nfl; + FINT ic, jc, kc, lc; + dtype *pfijkl; + + for (lc = 0; lc < l_ctr; lc++) { + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + pfijkl = fijkl + ofl * lc + ofk * kc + ofj * jc + nfi * ic; + dcopy_iklj(pfijkl, gctr, ni, nj, nk, nl, nfi, nfj, nfk, nfl); + gctr += nf; + } } } } +} +void c2s_cart_2e2() {}; + + +void c2s_sph_3c2e1(dtype *bufijk, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT k_l = envs->k_l; + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT di = i_l * 2 + 1; + FINT dj = j_l * 2 + 1; + FINT dk = k_l * 2 + 1; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT nfi = envs->nfi; + FINT nfk = envs->nfk; + FINT nf = envs->nf; + FINT nfik = nfi * nfk; + FINT ofj = ni * dj; + FINT ofk = ni * nj * dk; + FINT ic, jc, kc; + FINT buflen = nfi*nfk*dj; + /*dtype *buf1; + return; + MALLOC_INSTACK(buf1, buflen*3);*/ // HACK; be warry of this. + MALLOC(dtype, buf1); + dtype *buf2 = buf1 + buflen; + dtype *buf3 = buf2 + buflen; + dtype *pijk; + dtype *tmp1; + + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + tmp1 = (c2s_ket_sph[j_l])(buf1, gctr, nfik, nfik, j_l); + tmp1 = sph2e_inner(buf2, tmp1, k_l, nfi, dj, nfi*dk, nfik); + tmp1 = (c2s_bra_sph[i_l])(buf3, dk*dj, tmp1, i_l); + pijk = bufijk + ofk * kc + ofj * jc + di * ic; + dcopy_iklj(pijk, tmp1, ni, nj, nk, 1, di, dj, dk, 1); + gctr += nf; + } } } +} + +void c2s_cart_3c2e1(dtype *bufijk, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT nf = envs->nf; + FINT ofj = ni * nfj; + FINT ofk = ni * nj * nfk; + FINT ic, jc, kc; + dtype *pijk; + + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + pijk = bufijk + ofk * kc + ofj * jc + nfi * ic; + dcopy_iklj(pijk, gctr, ni, nj, nk, 1, nfi, nfj, nfk, 1); + gctr += nf; + } } } +} + + +void c2s_sph_3c2e1_ssc(dtype *bufijk, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT di = i_l * 2 + 1; + FINT dj = j_l * 2 + 1; + FINT nfi = envs->nfi; + FINT nfk = envs->nfk; + FINT ni = di * i_ctr; + FINT nj = dj * j_ctr; + FINT nk = nfk * k_ctr; + FINT nf = envs->nf; + FINT nfik = nfi * nfk; + FINT ofj = ni * dj; + FINT ofk = ni * nj * nfk; + FINT ic, jc, kc; + FINT buflen = nfi*nfk*dj; + /*dtype *buf1, *buf2; + return; + MALLOC_INSTACK(buf1, buflen); + MALLOC_INSTACK(buf2, buflen);*/ + MALLOC(dtype, buf1) + MALLOC(dtype, buf2) + + dtype *pijk; + dtype *tmp1; + + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + tmp1 = (c2s_ket_sph[j_l])(buf1, gctr, nfik, nfik, j_l); + tmp1 = (c2s_bra_sph[i_l])(buf2, nfk*dj, tmp1, i_l); + pijk = bufijk + ofk * kc + ofj * jc + nfi * ic; + dcopy_iklj(pijk, tmp1, ni, nj, nk, 1, di, dj, nfk, 1); + gctr += nf; + } } } +} + + +void c2s_sf_3c2e1(dtype *opijk, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT k_l = envs->k_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT dk = k_l * 2 + 1; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT nfik = nfi * nfk; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT ofj = ni * dj; + FINT ofk = ni * nj * dk; + FINT ic, jc, kc; + FINT buflen = nfi*dk*nfj; + dtype *buf, *pbuf; + return; + MALLOC_INSTACK(buf, buflen); + FINT len1 = di * dk * nf2j; + FINT len2 = di * dk * dj; + dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1); + MALLOC_INSTACK(tmp2R, len2); + MALLOC_INSTACK(tmp2I, len2); + dtype *pijk; + + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + pbuf = sph2e_inner(buf, gctr, k_l, nfi, nfj, nfi*dk, nfik); + a_bra_cart2spinor_sf(tmp1R, tmp1I, NULL, NULL, NULL, pbuf, dk*nfj, i_kp, i_l); + a_ket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di*dk, j_kp, j_l); + pijk = opijk + ofk * kc + ofj * jc + di * ic; + zcopy_iklj(pijk, tmp2R, tmp2I, ni, nj, nk, 1, di, dj, dk, 1); + gctr += nf; + } } } +} +void c2s_sf_3c2e1i(dtype *opijk, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT k_l = envs->k_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT dk = k_l * 2 + 1; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT nfik = nfi * nfk; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT ofj = ni * dj; + FINT ofk = ni * nj * dk; + FINT d_i = di * dk; + FINT d_j = dk * nfj; + FINT ic, jc, kc; + FINT buflen = nfi*dk*nfj; + dtype *buf, *pbuf; + return; + MALLOC_INSTACK(buf, buflen); + FINT len1 = di*dk*nf2j; + FINT len2 = di*dk*dj; + dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1); + MALLOC_INSTACK(tmp2R, len2); + MALLOC_INSTACK(tmp2I, len2); + dtype *pijk; + + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + pbuf = sph2e_inner(buf, gctr, k_l, nfi, nfj, nfi*dk, nfik); + a_bra_cart2spinor_sf(tmp1R, tmp1I, NULL, NULL, NULL, pbuf, dk*nfj, i_kp, i_l); + a_iket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di*dk, j_kp, j_l); + pijk = opijk + ofk * kc + ofj * jc + di * ic; + zcopy_iklj(pijk, tmp2R, tmp2I, ni, nj, nk, 1, di, dj, dk, 1); + gctr += nf; + } } } +} + +void c2s_si_3c2e1(dtype *opijk, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT k_l = envs->k_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT dk = k_l * 2 + 1; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nf2i = nfi + nfi; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT nfik = nfi * nfk; + FINT nfijdk = nfi * nfj * dk; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT ofj = ni * dj; + FINT ofk = ni * nj * dk; + FINT d_i = di * dk; + FINT d_j = dk * nf2j; + FINT ic, jc, kc; + dtype *gc_x = gctr; + dtype *gc_y = gc_x + nf * i_ctr * j_ctr * k_ctr; + dtype *gc_z = gc_y + nf * i_ctr * j_ctr * k_ctr; + dtype *gc_1 = gc_z + nf * i_ctr * j_ctr * k_ctr; + FINT buflen = nfi*dk*nfj; + dtype *bufx; + return; + MALLOC_INSTACK(bufx, buflen*4); + dtype *bufy = bufx + buflen; + dtype *bufz = bufy + buflen; + dtype *buf1 = bufz + buflen; + dtype *pgx, *pgy, *pgz, *pg1; + FINT len1 = di * dk * nf2j; + FINT len2 = di * dk * dj; + dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1); + MALLOC_INSTACK(tmp2R, len2); + MALLOC_INSTACK(tmp2I, len2); + dtype *pijk; + + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + pgx = sph2e_inner(bufx, gc_x, k_l, nfi, nfj, nfi*dk, nfik); + pgy = sph2e_inner(bufy, gc_y, k_l, nfi, nfj, nfi*dk, nfik); + pgz = sph2e_inner(bufz, gc_z, k_l, nfi, nfj, nfi*dk, nfik); + pg1 = sph2e_inner(buf1, gc_1, k_l, nfi, nfj, nfi*dk, nfik); + a_bra_cart2spinor_si(tmp1R, tmp1I, pgx, pgy, pgz, pg1, dk*nfj, i_kp, i_l); + a_ket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di*dk, j_kp, j_l); + pijk = opijk + ofk * kc + ofj * jc + di * ic; + zcopy_iklj(pijk, tmp2R, tmp2I, ni, nj, nk, 1, di, dj, dk, 1); + gc_x += nf; + gc_y += nf; + gc_z += nf; + gc_1 += nf; + } } } +} + +void c2s_si_3c2e1i(dtype *opijk, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT k_l = envs->k_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT dk = k_l * 2 + 1; + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nf2i = nfi + nfi; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT nfik = nfi * nfk; + FINT nfijdk = nfi * nfj * dk; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT ofj = ni * dj; + FINT ofk = ni * nj * dk; + FINT ic, jc, kc; + dtype *gc_x = gctr; + dtype *gc_y = gc_x + nf * i_ctr * j_ctr * k_ctr; + dtype *gc_z = gc_y + nf * i_ctr * j_ctr * k_ctr; + dtype *gc_1 = gc_z + nf * i_ctr * j_ctr * k_ctr; + dtype *bufx; + FINT buflen = nfi*dk*nfj; + return; + MALLOC_INSTACK(bufx, buflen*4); + dtype *bufy = bufx + buflen; + dtype *bufz = bufy + buflen; + dtype *buf1 = bufz + buflen; + dtype *pgx, *pgy, *pgz, *pg1; + FINT len1 = di * dk * nf2j; + FINT len2 = di * dk * dj; + dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1); + MALLOC_INSTACK(tmp2R, len2); + MALLOC_INSTACK(tmp2I, len2); + dtype *pijk; + + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + pgx = sph2e_inner(bufx, gc_x, k_l, nfi, nfj, nfi*dk, nfik); + pgy = sph2e_inner(bufy, gc_y, k_l, nfi, nfj, nfi*dk, nfik); + pgz = sph2e_inner(bufz, gc_z, k_l, nfi, nfj, nfi*dk, nfik); + pg1 = sph2e_inner(buf1, gc_1, k_l, nfi, nfj, nfi*dk, nfik); + a_bra_cart2spinor_si(tmp1R, tmp1I, pgx, pgy, pgz, pg1, dk*nfj, i_kp, i_l); + a_iket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di*dk, j_kp, j_l); + pijk = opijk + ofk * kc + ofj * jc + di * ic; + zcopy_iklj(pijk, tmp2R, tmp2I, ni, nj, nk, 1, di, dj, dk, 1); + gc_x += nf; + gc_y += nf; + gc_z += nf; + gc_1 += nf; + } } } +} + +void c2s_sf_3c2e1_ssc(dtype *opijk, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT ofj = ni * dj; + FINT ofk = ni * nj * nfk; + FINT ic, jc, kc; + FINT len1 = di*nfk*nf2j; + FINT len2 = di*nfk*dj; + dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1); + MALLOC_INSTACK(tmp2R, len2); + MALLOC_INSTACK(tmp2I, len2); + dtype *pijk; + + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra_cart2spinor_sf(tmp1R, tmp1I, NULL, NULL, NULL, gctr, nfk*nfj, i_kp, i_l); + a_ket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di*nfk, j_kp, j_l); + pijk = opijk + ofk * kc + ofj * jc + di * ic; + zcopy_iklj(pijk, tmp2R, tmp2I, ni, nj, nk, 1, di, dj, nfk, 1); + gctr += nf; + } } } +} + +void c2s_sf_3c2e1i_ssc(dtype *opijk, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT ofj = ni * dj; + FINT ofk = ni * nj * nfk; + FINT ic, jc, kc; + FINT len1 = di*nfk*nf2j; + FINT len2 = di*nfk*dj; + dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1); + MALLOC_INSTACK(tmp2R, len2); + MALLOC_INSTACK(tmp2I, len2); + dtype *pijk; + + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra_cart2spinor_sf(tmp1R, tmp1I, NULL, NULL, NULL, gctr, nfk*nfj, i_kp, i_l); + a_iket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di*nfk, j_kp, j_l); + pijk = opijk + ofk * kc + ofj * jc + di * ic; + zcopy_iklj(pijk, tmp2R, tmp2I, ni, nj, nk, 1, di, dj, nfk, 1); + gctr += nf; + } } } +} +void c2s_si_3c2e1_ssc(dtype *opijk, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nf2i = nfi + nfi; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT nfijdk = nfi * nfj * nfk; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT ofj = ni * dj; + FINT ofk = ni * nj * nfk; + FINT ic, jc, kc; + dtype *gc_x = gctr; + dtype *gc_y = gc_x + nf * i_ctr * j_ctr * k_ctr; + dtype *gc_z = gc_y + nf * i_ctr * j_ctr * k_ctr; + dtype *gc_1 = gc_z + nf * i_ctr * j_ctr * k_ctr; + FINT len2 = di*nfk*dj; + FINT len1 = di*nfk*nf2j; + dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1); + MALLOC_INSTACK(tmp2R, len2); + MALLOC_INSTACK(tmp2I, len2); + dtype *pijk; + + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra_cart2spinor_si(tmp1R, tmp1I, gc_x, gc_y, gc_z, gc_1, nfk*nfj, i_kp, i_l); + a_ket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di*nfk, j_kp, j_l); + pijk = opijk + ofk * kc + ofj * jc + di * ic; + zcopy_iklj(pijk, tmp2R, tmp2I, ni, nj, nk, 1, di, dj, nfk, 1); + gc_x += nf; + gc_y += nf; + gc_z += nf; + gc_1 += nf; + } } } +} +void c2s_si_3c2e1i_ssc(dtype *opijk, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT i_l = envs->i_l; + FINT j_l = envs->j_l; + FINT i_kp = bas(KAPPA_OF, i_sh); + FINT j_kp = bas(KAPPA_OF, j_sh); + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT di = _len_spinor(i_kp, i_l); + FINT dj = _len_spinor(j_kp, j_l); + FINT nfi = envs->nfi; + FINT nfj = envs->nfj; + FINT nfk = envs->nfk; + FINT nf2i = nfi + nfi; + FINT nf2j = nfj + nfj; + FINT nf = envs->nf; + FINT nfijdk = nfi * nfj * nfk; + FINT ni = dims[0]; + FINT nj = dims[1]; + FINT nk = dims[2]; + FINT ofj = ni * dj; + FINT ofk = ni * nj * nfk; + FINT ic, jc, kc; + dtype *gc_x = gctr; + dtype *gc_y = gc_x + nf * i_ctr * j_ctr * k_ctr; + dtype *gc_z = gc_y + nf * i_ctr * j_ctr * k_ctr; + dtype *gc_1 = gc_z + nf * i_ctr * j_ctr * k_ctr; + FINT len2 = di*nfk*dj; + FINT len1 = di*nfk*nf2j; + dtype *tmp1R, *tmp1I, *tmp2R, *tmp2I; + return; + MALLOC_INSTACK(tmp1R, len1); + MALLOC_INSTACK(tmp1I, len1); + MALLOC_INSTACK(tmp2R, len2); + MALLOC_INSTACK(tmp2I, len2); + dtype *pijk; + + for (kc = 0; kc < k_ctr; kc++) { + for (jc = 0; jc < j_ctr; jc++) { + for (ic = 0; ic < i_ctr; ic++) { + a_bra_cart2spinor_si(tmp1R, tmp1I, gc_x, gc_y, gc_z, gc_1, nfk*nfj, i_kp, i_l); + a_iket_cart2spinor(tmp2R, tmp2I, tmp1R, tmp1I, di*nfk, j_kp, j_l); + pijk = opijk + ofk * kc + ofj * jc + di * ic; + zcopy_iklj(pijk, tmp2R, tmp2I, ni, nj, nk, 1, di, dj, nfk, 1); + gc_x += nf; + gc_y += nf; + gc_z += nf; + gc_1 += nf; + } } } +} + + +void c2s_sph_3c1e(dtype *out, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + c2s_sph_3c2e1(out, gctr, dims, envs, cache); +} + +void c2s_cart_3c1e(dtype *out, dtype *gctr, FINT *dims, + CINTEnvVars *envs, dtype *cache) +{ + c2s_cart_3c2e1(out, gctr, dims, envs, cache); +} + + +dtype *CINTc2s_bra_sph(dtype *gsph, FINT nket, dtype *gcart, FINT l) +{ + return (c2s_bra_sph[l])(gsph, nket, gcart, l); +} +dtype *CINTc2s_ket_sph(dtype *gsph, FINT nbra, dtype *gcart, FINT l) +{ + return (c2s_ket_sph[l])(gsph, gcart, nbra, nbra, l); +} +dtype *CINTc2s_ket_sph1(dtype *sph, dtype *cart, FINT lds, FINT ldc, FINT l) +{ + return (c2s_ket_sph1[l])(sph, cart, lds, ldc, l); +} + +void CINTc2s_bra_spinor_e1sf(dtype *gsp, FINT nket, + dtype *gcart, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + dtype *gspa = (dtype *)gsp; + dtype *gspb = gspa + nket * nd * OF_CMPLX; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, n; + dtype saR, saI, sbR, sbI, caR, caI, cbR, cbI, v1; + + for (j = 0; j < nket; j++) { + for (i = 0; i < nd; i++) { + saR = 0; + saI = 0; + sbR = 0; + sbI = 0; +#pragma GCC ivdep + for (n = 0; n < nf; n++) { + v1 = gcart[j*nf+n]; + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; + saR += caR * v1; + saI +=-caI * v1; + sbR += cbR * v1; + sbI +=-cbI * v1; + } + gspa[(j*nd+i)*OF_CMPLX ] = saR; + gspa[(j*nd+i)*OF_CMPLX+1] = saI; + gspb[(j*nd+i)*OF_CMPLX ] = sbR; + gspb[(j*nd+i)*OF_CMPLX+1] = sbI; + } } +} + +/*void CINTc2s_bra_spinor_sf(dtype *gsp, FINT nket, + dtype *gcart, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + dtype *gspa = (dtype *)gsp; + dtype *gspb = gspa + nket * nd * OF_CMPLX; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, n; + dtype saR, saI, sbR, sbI, caR, caI, cbR, cbI, v1R, v1I; + + for (j = 0; j < nket; j++) { + for (i = 0; i < nd; i++) { + saR = 0; + saI = 0; + sbR = 0; + sbI = 0; +#pragma GCC ivdep + for (n = 0; n < nf; n++) { + v1R = creal(gcart[j*nf+n]); + v1I = cimag(gcart[j*nf+n]); + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; + saR += caR * v1R + caI * v1I; + saI +=-caI * v1R + caR * v1I; + sbR += cbR * v1R + cbI * v1I; + sbI +=-cbI * v1R + cbR * v1I; + } + gspa[(j*nd+i)*OF_CMPLX ] = saR; + gspa[(j*nd+i)*OF_CMPLX+1] = saI; + gspb[(j*nd+i)*OF_CMPLX ] = sbR; + gspb[(j*nd+i)*OF_CMPLX+1] = sbI; + } } +}*/ + + +/*void CINTc2s_bra_spinor_si(dtype *gsp, FINT nket, + dtype *gcart, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nf2 = nf * 2; + FINT nd = _len_spinor(kappa, l); + dtype *gspz = (dtype *)gsp; + dtype *gcarta = gcart; + dtype *gcartb = gcarta + nf * nket; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, n; + dtype sR, sI, caR, caI, cbR, cbI, gaR, gaI, gbR, gbI; + + for (j = 0; j < nket; j++) { + for (i = 0; i < nd; i++) { + sR = 0; + sI = 0; +#pragma GCC ivdep + for (n = 0; n < nf; n++) { + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; + gaR = creal(gcarta[j*nf+n]); + gaI = cimag(gcarta[j*nf+n]); + gbR = creal(gcartb[j*nf+n]); + gbI = cimag(gcartb[j*nf+n]); + sR += caR * gaR + caI * gaI + cbR * gbR + cbI * gbI; + sI += caR * gaI - caI * gaR + cbR * gbI - cbI * gbR; + } + gspz[(j*nd+i)*OF_CMPLX ] = sR; + gspz[(j*nd+i)*OF_CMPLX+1] = sI; + } } +}*/ + + +void CINTc2s_ket_spinor_sf1(dtype *gspa, dtype *gspb, dtype *gcart, + FINT lds, FINT ldc, FINT nctr, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + dtype *gspaz = (dtype *)gspa; + dtype *gspbz = (dtype *)gspb; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, k, n; + dtype caR, caI, cbR, cbI, v1; + + for (k = 0; k < nctr; k++) { + for (i = 0; i < nd; i++) { +#pragma GCC ivdep + for (j = 0; j < ldc; j++) { + gspaz[(j+i*lds)*OF_CMPLX ] = 0; + gspaz[(j+i*lds)*OF_CMPLX+1] = 0; + gspbz[(j+i*lds)*OF_CMPLX ] = 0; + gspbz[(j+i*lds)*OF_CMPLX+1] = 0; + } + for (n = 0; n < nf; n++) { + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; +#pragma GCC ivdep + for (j = 0; j < ldc; j++) { + v1 = gcart[j+n*ldc]; + gspaz[(j+i*lds)*OF_CMPLX ] += caR * v1; + gspaz[(j+i*lds)*OF_CMPLX+1] += caI * v1; + gspbz[(j+i*lds)*OF_CMPLX ] += cbR * v1; + gspbz[(j+i*lds)*OF_CMPLX+1] += cbI * v1; + } + } + } + gspaz += nd * lds * OF_CMPLX; + gspbz += nd * lds * OF_CMPLX; + gcart += nf * ldc; + } +} + +void CINTc2s_iket_spinor_sf1(dtype *gspa, dtype *gspb, dtype *gcart, + FINT lds, FINT ldc, FINT nctr, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + dtype *gspaz = (dtype *)gspa; + dtype *gspbz = (dtype *)gspb; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, k, n; + dtype caR, caI, cbR, cbI, v1; + + for (k = 0; k < nctr; k++) { + for (i = 0; i < nd; i++) { +#pragma GCC ivdep + for (j = 0; j < ldc; j++) { + gspaz[(j+i*lds)*OF_CMPLX ] = 0; + gspaz[(j+i*lds)*OF_CMPLX+1] = 0; + gspbz[(j+i*lds)*OF_CMPLX ] = 0; + gspbz[(j+i*lds)*OF_CMPLX+1] = 0; + } + for (n = 0; n < nf; n++) { + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; +#pragma GCC ivdep + for (j = 0; j < ldc; j++) { + v1 = gcart[j+n*ldc]; + gspaz[(j+i*lds)*OF_CMPLX ] -= caI * v1; + gspaz[(j+i*lds)*OF_CMPLX+1] += caR * v1; + gspbz[(j+i*lds)*OF_CMPLX ] -= cbI * v1; + gspbz[(j+i*lds)*OF_CMPLX+1] += cbR * v1; + } + } + } + gspaz += nd * lds * OF_CMPLX; + gspbz += nd * lds * OF_CMPLX; + gcart += nf * ldc; + } +} + +void CINTc2s_ket_spinor_si1(dtype *gspa, dtype *gspb, dtype *gcart, + FINT lds, FINT ldc, FINT nctr, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + FINT ngc = nf * ldc; + dtype *gc_x = gcart; + dtype *gc_y = gc_x + nctr*ngc; + dtype *gc_z = gc_y + nctr*ngc; + dtype *gc_1 = gc_z + nctr*ngc; + dtype *gspaz = (dtype *)gspa; + dtype *gspbz = (dtype *)gspb; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, k, n; + dtype caR, caI, cbR, cbI, v1, vx, vy, vz; + + for (k = 0; k < nctr; k++) { + for (i = 0; i < nd; i++) { +#pragma GCC ivdep + for (j = 0; j < ldc; j++) { + gspaz[(j+i*lds)*OF_CMPLX ] = 0; + gspaz[(j+i*lds)*OF_CMPLX+1] = 0; + gspbz[(j+i*lds)*OF_CMPLX ] = 0; + gspbz[(j+i*lds)*OF_CMPLX+1] = 0; + } + for (n = 0; n < nf; n++) { + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; +#pragma GCC ivdep + for (j = 0; j < ldc; j++) { + v1 = gc_1[j+n*ldc]; + vx = gc_x[j+n*ldc]; + vy = gc_y[j+n*ldc]; + vz = gc_z[j+n*ldc]; + gspaz[(j+i*lds)*OF_CMPLX ] += caR * v1 - caI * vz + cbR * vy - cbI * vx; + gspaz[(j+i*lds)*OF_CMPLX+1] += caI * v1 + caR * vz + cbI * vy + cbR * vx; + gspbz[(j+i*lds)*OF_CMPLX ] += cbR * v1 + cbI * vz - caR * vy - caI * vx; + gspbz[(j+i*lds)*OF_CMPLX+1] += cbI * v1 - cbR * vz - caI * vy + caR * vx; + } + } + } + gspaz += nd * lds * OF_CMPLX; + gspbz += nd * lds * OF_CMPLX; + gc_x += ngc; + gc_y += ngc; + gc_z += ngc; + gc_1 += ngc; + } +} + +void CINTc2s_iket_spinor_si1(dtype *gspa, dtype *gspb, dtype *gcart, + FINT lds, FINT ldc, FINT nctr, FINT kappa, FINT l) +{ + FINT nf = _len_cart[l]; + FINT nd = _len_spinor(kappa, l); + FINT ngc = nf * ldc; + dtype *gc_x = gcart; + dtype *gc_y = gc_x + nctr*ngc; + dtype *gc_z = gc_y + nctr*ngc; + dtype *gc_1 = gc_z + nctr*ngc; + dtype *gspaz = (dtype *)gspa; + dtype *gspbz = (dtype *)gspb; + dtype *coeffR, *coeffI; + if (kappa < 0) { + coeffR = g_c2s[l].cart2j_gt_lR; + coeffI = g_c2s[l].cart2j_gt_lI; + } else { + coeffR = g_c2s[l].cart2j_lt_lR; + coeffI = g_c2s[l].cart2j_lt_lI; + } + + FINT i, j, k, n; + dtype caR, caI, cbR, cbI, v1, vx, vy, vz; + + for (k = 0; k < nctr; k++) { + for (i = 0; i < nd; i++) { +#pragma GCC ivdep + for (j = 0; j < ldc; j++) { + gspaz[(j+i*lds)*OF_CMPLX ] = 0; + gspaz[(j+i*lds)*OF_CMPLX+1] = 0; + gspbz[(j+i*lds)*OF_CMPLX ] = 0; + gspbz[(j+i*lds)*OF_CMPLX+1] = 0; + } + for (n = 0; n < nf; n++) { + caR = coeffR[i*nf*2 +n]; + caI = coeffI[i*nf*2 +n]; + cbR = coeffR[i*nf*2+nf+n]; + cbI = coeffI[i*nf*2+nf+n]; +#pragma GCC ivdep + for (j = 0; j < ldc; j++) { + v1 = gc_1[j+n*ldc]; + vx = gc_x[j+n*ldc]; + vy = gc_y[j+n*ldc]; + vz = gc_z[j+n*ldc]; + + gspaz[(j+i*lds)*OF_CMPLX ] -= caI * v1 + caR * vz + cbI * vy + cbR * vx; + gspaz[(j+i*lds)*OF_CMPLX+1] += caR * v1 - caI * vz + cbR * vy - cbI * vx; + gspbz[(j+i*lds)*OF_CMPLX ] -= cbI * v1 - cbR * vz - caI * vy + caR * vx; + gspbz[(j+i*lds)*OF_CMPLX+1] += cbR * v1 + cbI * vz - caR * vy - caI * vx; + } + } + } + gspaz += nd * lds * OF_CMPLX; + gspbz += nd * lds * OF_CMPLX; + gc_x += ngc; + gc_y += ngc; + gc_z += ngc; + gc_1 += ngc; + } +} + + +dtype *CINTs2c_bra_sph(dtype *gsph, FINT nket, dtype *gcart, FINT l) +{ + FINT nf = (l+1)*(l+2)/2; + FINT nd = l * 2 + 1; + CINTdgemm_NN1(nf, nket, nd, g_c2s[l].cart2sph, gsph, gcart, nf); + return gcart; +} +dtype *CINTs2c_ket_sph(dtype *gsph, FINT nbra, dtype *gcart, FINT l) +{ + FINT nf = (l+1)*(l+2)/2; + FINT nd = l * 2 + 1; + CINTdgemm_NT(nbra, nf, nd, gsph, g_c2s[l].cart2sph, gcart); + return gcart; +} + + +#ifdef WITH_FORTRAN +#include +#include + + + +FINT cintlen_spinor_(const FINT *bas_id, const FINT *bas) +{ + return CINTlen_spinor(*bas_id, bas); +} + +FINT cintcgtos_cart_(const FINT *bas_id, const FINT *bas) +{ + return CINTcgto_cart(*bas_id, bas); +} +FINT cintcgto_cart_(const FINT *bas_id, const FINT *bas) +{ + return CINTcgto_cart(*bas_id, bas); +} + +FINT cintcgtos_spheric_(const FINT *bas_id, const FINT *bas) +{ + return CINTcgto_spheric(*bas_id, bas); +} +FINT cintcgto_spheric_(const FINT *bas_id, const FINT *bas) +{ + return CINTcgto_spheric(*bas_id, bas); +} + +FINT cintcgtos_spinor_(const FINT *bas_id, const FINT *bas) +{ + return CINTcgto_spinor(*bas_id, bas); +} +FINT cintcgto_spinor_(const FINT *bas_id, const FINT *bas) +{ + return CINTcgto_spinor(*bas_id, bas); +} + + +FINT cinttot_pgto_spheric_(const FINT *bas, const FINT *nbas) +{ + return CINTtot_pgto_spheric(bas, *nbas); +} + + +FINT cinttot_pgto_spinor_(const FINT *bas, const FINT *nbas) +{ + return CINTtot_pgto_spinor(bas, *nbas); +} + + +FINT cinttot_cgto_cart_(const FINT *bas, const FINT *nbas) +{ + return CINTtot_cgto_cart(bas, *nbas); +} + + +FINT cinttot_cgto_spheric_(const FINT *bas, const FINT *nbas) +{ + return CINTtot_cgto_spheric(bas, *nbas); +} + + +FINT cinttot_cgto_spinor_(const FINT *bas, const FINT *nbas) +{ + return CINTtot_cgto_spinor(bas, *nbas); +} + + +void cintshells_cart_offset_(FINT ao_loc[], const FINT *bas, const FINT *nbas) +{ + CINTshells_cart_offset(ao_loc, bas, *nbas); +} + + +void cintshells_spheric_offset_(FINT ao_loc[], const FINT *bas, const FINT *nbas) +{ + CINTshells_spheric_offset(ao_loc, bas, *nbas); +} + + +void cintshells_spinor_offset_(FINT ao_loc[], const FINT *bas, const FINT *nbas) +{ + CINTshells_spinor_offset(ao_loc, bas, *nbas); +} + +dtype cintgto_norm_(FINT *n, dtype *a) +{ + return CINTgto_norm(*n, *a); +} + + + + +void cintinit_2e_optimizer_(CINTOpt **opt, + FINT *atm, FINT *natm, + FINT *bas, FINT *nbas, dtype *env) +{ + CINTinit_2e_optimizer(opt, atm, *natm, bas, *nbas, env); +} +void cintinit_optimizer_(CINTOpt **opt, + FINT *atm, FINT *natm, + FINT *bas, FINT *nbas, dtype *env) +{ + cintinit_2e_optimizer_(opt, atm, natm, bas, nbas, env); +} +void cintdel_2e_optimizer_(CINTOpt **opt) +{ + CINTdel_2e_optimizer(opt); +} +void cintdel_optimizer_(CINTOpt **opt) +{ + cintdel_2e_optimizer_(opt); +} +#endif + + + +#include +#include +#include + +void CINTinit_int1e_grids_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, + FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env) +{ + CINTinit_int1e_EnvVars(envs, ng, shls, atm, natm, bas, nbas, env); + FINT ngrids = shls[3] - shls[2]; + dtype *grids = env + (size_t)env[PTR_GRIDS] + shls[2] * 3; + + envs->ngrids = ngrids; + envs->grids = grids; + envs->common_factor = 2 * M_PI + * CINTcommon_fac_sp(envs->i_l) * CINTcommon_fac_sp(envs->j_l); + + int rys_order = envs->nrys_roots; + int nroots = rys_order; + dtype omega = env[PTR_RANGE_OMEGA]; + if (omega < 0 && rys_order <= 3) { + nroots *= 2; + } + envs->rys_order = rys_order; + envs->nrys_roots = nroots; + + FINT dli, dlj; + FINT ibase = envs->li_ceil > envs->lj_ceil; + if (ibase) { + dli = envs->li_ceil + envs->lj_ceil + 1; + dlj = envs->lj_ceil + 1; + envs->rirj[0] = envs->ri[0] - envs->rj[0]; + envs->rirj[1] = envs->ri[1] - envs->rj[1]; + envs->rirj[2] = envs->ri[2] - envs->rj[2]; + } else { + dli = envs->li_ceil + 1; + dlj = envs->li_ceil + envs->lj_ceil + 1; + envs->rirj[0] = envs->rj[0] - envs->ri[0]; + envs->rirj[1] = envs->rj[1] - envs->ri[1]; + envs->rirj[2] = envs->rj[2] - envs->ri[2]; + } + envs->g_stride_i = GRID_BLKSIZE * nroots; + envs->g_stride_j = GRID_BLKSIZE * nroots * dli; + envs->g_size = GRID_BLKSIZE * nroots * dli * dlj; + envs->g_stride_k = envs->g_size; + envs->g_stride_l = envs->g_size; +} + +#define RGSQUARE(r, ig) (r[ig+GRID_BLKSIZE*0]*r[ig+GRID_BLKSIZE*0] + \ + r[ig+GRID_BLKSIZE*1]*r[ig+GRID_BLKSIZE*1] + \ + r[ig+GRID_BLKSIZE*2]*r[ig+GRID_BLKSIZE*2]) + +FINT CINTg0_1e_grids(dtype *g, dtype cutoff, + CINTEnvVars *envs, dtype *cache, dtype *gridsT) +{ + FINT ngrids = envs->ngrids; + FINT bgrids = MIN(ngrids - envs->grids_offset, GRID_BLKSIZE); + int nroots = envs->nrys_roots; + dtype *gx = g; + dtype *gy = g + envs->g_size; + dtype *gz = g + envs->g_size * 2; + dtype *w = gz; + dtype *rij = envs->rij; + dtype ubuf[MXRYSROOTS]; + dtype wbuf[MXRYSROOTS]; + dtype *u; + return 0; + MALLOC_ALIGN8_INSTACK(u, GRID_BLKSIZE*nroots); + dtype *rijrg; + MALLOC_ALIGN8_INSTACK(rijrg, GRID_BLKSIZE*3); + dtype aij = envs->ai[0] + envs->aj[0]; + FINT n, i, j, ig; + dtype x, fac1; + + for (i = 0; i < nroots; i++) { + for (ig = 0; ig < bgrids; ig++) { + gx[ig+GRID_BLKSIZE*i] = 1; + gy[ig+GRID_BLKSIZE*i] = 1; + } + } +#pragma GCC ivdep + for (ig = 0; ig < bgrids; ig++) { + rijrg[ig+GRID_BLKSIZE*0] = gridsT[ig+GRID_BLKSIZE*0] - rij[0]; + rijrg[ig+GRID_BLKSIZE*1] = gridsT[ig+GRID_BLKSIZE*1] - rij[1]; + rijrg[ig+GRID_BLKSIZE*2] = gridsT[ig+GRID_BLKSIZE*2] - rij[2]; + } + + dtype omega = envs->env[PTR_RANGE_OMEGA]; + dtype zeta = envs->env[PTR_RINV_ZETA]; + dtype omega2, theta, sqrt_theta, a0, tau2; + + assert(zeta >= 0); + if (omega == 0. && zeta == 0.) { + fac1 = envs->fac[0] / aij; + for (ig = 0; ig < bgrids; ig++) { + x = aij * RGSQUARE(rijrg, ig); + CINTrys_roots(nroots, x, ubuf, wbuf); + for (i = 0; i < nroots; i++) { + + u[ig+GRID_BLKSIZE*i] = ubuf[i] / (ubuf[i] + 1); + w[ig+GRID_BLKSIZE*i] = wbuf[i] * fac1; + } + } + } else if (omega < 0.) { + a0 = aij; + fac1 = envs->fac[0] / aij; + if (zeta == 0.) { + tau2 = 1.; + omega2 = omega * omega; + theta = omega2 / (omega2 + aij); + } else { + tau2 = zeta / (zeta + aij); + a0 *= tau2; + fac1 *= sqrt(tau2); + omega2 = omega * omega; + theta = omega2 / (omega2 + a0); + } + sqrt_theta = sqrt(theta); + + + + dtype temp_cutoff = MIN(cutoff, EXPCUTOFF_SR); + int rorder = envs->rys_order; + dtype tau_theta, fac_theta; + for (ig = 0; ig < bgrids; ig++) { + x = a0 * RGSQUARE(rijrg, ig); + if (theta * x > temp_cutoff) { + + for (i = 0; i < nroots; i++) { + u[ig+GRID_BLKSIZE*i] = 0; + w[ig+GRID_BLKSIZE*i] = 0; + } + } else if (rorder == nroots) { + CINTsr_rys_roots(nroots, x, sqrt_theta, ubuf, wbuf); + for (i = 0; i < nroots; i++) { + u[ig+GRID_BLKSIZE*i] = ubuf[i] / (ubuf[i] + 1) * tau2; + w[ig+GRID_BLKSIZE*i] = wbuf[i] * fac1; + } + } else { + tau_theta = tau2 * theta; + fac_theta = fac1 * -sqrt_theta; + CINTrys_roots(rorder, x, ubuf, wbuf); + CINTrys_roots(rorder, theta*x, ubuf+rorder, wbuf+rorder); + for (i = 0; i < rorder; i++) { + u[ig+GRID_BLKSIZE*i] = ubuf[i] / (ubuf[i] + 1) * tau2; + w[ig+GRID_BLKSIZE*i] = wbuf[i] * fac1; + u[ig+GRID_BLKSIZE*(i+rorder)] = ubuf[i] / (ubuf[i] + 1) * tau_theta; + w[ig+GRID_BLKSIZE*(i+rorder)] = wbuf[i] * fac_theta; + } + } + } + } else { + + + a0 = aij; + fac1 = envs->fac[0] / aij; + if (zeta == 0.) { + omega2 = omega * omega; + theta = omega2 / (omega2 + aij); + a0 *= theta; + fac1 *= sqrt(theta); + } else if (omega == 0.) { + theta = zeta / (zeta + aij); + a0 *= theta; + fac1 *= sqrt(theta); + } else { + omega2 = omega * omega; + theta = omega2*zeta / (omega2*zeta + (zeta+omega2)*aij); + a0 *= theta; + fac1 *= sqrt(theta); + } + for (ig = 0; ig < bgrids; ig++) { + x = a0 * RGSQUARE(rijrg, ig); + CINTrys_roots(nroots, x, ubuf, wbuf); + for (i = 0; i < nroots; i++) { + + u[ig+GRID_BLKSIZE*i] = ubuf[i] / (ubuf[i] + 1) * theta; + w[ig+GRID_BLKSIZE*i] = wbuf[i] * fac1; + } + } + } + FINT nmax = envs->li_ceil + envs->lj_ceil; + if (nmax == 0) { + return 1; + } + + dtype *rirj = envs->rirj; + FINT lj, di, dj; + dtype *rx; + if (envs->li_ceil > envs->lj_ceil) { + + lj = envs->lj_ceil; + di = envs->g_stride_i; + dj = envs->g_stride_j; + rx = envs->ri; + } else { + + lj = envs->li_ceil; + di = envs->g_stride_j; + dj = envs->g_stride_i; + rx = envs->rj; + } + dtype rijrx[3]; + rijrx[0] = rij[0] - rx[0]; + rijrx[1] = rij[1] - rx[1]; + rijrx[2] = rij[2] - rx[2]; + + dtype *p0x, *p0y, *p0z; + dtype *p1x, *p1y, *p1z; + dtype *p2x, *p2y, *p2z; + dtype *t2; + return 0; + MALLOC_ALIGN8_INSTACK(t2, GRID_BLKSIZE*4); + dtype *rirgx = t2 + GRID_BLKSIZE; + dtype *rirgy = rirgx + GRID_BLKSIZE; + dtype *rirgz = rirgy + GRID_BLKSIZE; + dtype aij2 = 0.5 / aij; + dtype tx, ty, tz; + + for (n = 0; n < nroots; n++) { + p0x = gx + GRID_BLKSIZE*n; + p0y = gy + GRID_BLKSIZE*n; + p0z = gz + GRID_BLKSIZE*n; + p1x = p0x + di; + p1y = p0y + di; + p1z = p0z + di; +#pragma GCC ivdep + for (ig = 0; ig < bgrids; ig++) { + rirgx[ig] = rijrx[0] + u[ig+GRID_BLKSIZE*n] * rijrg[ig+GRID_BLKSIZE*0]; + rirgy[ig] = rijrx[1] + u[ig+GRID_BLKSIZE*n] * rijrg[ig+GRID_BLKSIZE*1]; + rirgz[ig] = rijrx[2] + u[ig+GRID_BLKSIZE*n] * rijrg[ig+GRID_BLKSIZE*2]; + p1x[ig] = rirgx[ig] * p0x[ig]; + p1y[ig] = rirgy[ig] * p0y[ig]; + p1z[ig] = rirgz[ig] * p0z[ig]; + } + if (nmax > 0) { + for (ig = 0; ig < bgrids; ig++) { + t2[ig] = aij2 * (1 - u[ig+GRID_BLKSIZE*n]); + } + } + for (i = 1; i < nmax; i++) { + p0x = gx + GRID_BLKSIZE*n + i * di; + p0y = gy + GRID_BLKSIZE*n + i * di; + p0z = gz + GRID_BLKSIZE*n + i * di; + p1x = p0x + di; + p1y = p0y + di; + p1z = p0z + di; + p2x = p0x - di; + p2y = p0y - di; + p2z = p0z - di; +#pragma GCC ivdep + for (ig = 0; ig < bgrids; ig++) { + p1x[ig] = i * t2[ig] * p2x[ig] + rirgx[ig] * p0x[ig]; + p1y[ig] = i * t2[ig] * p2y[ig] + rirgy[ig] * p0y[ig]; + p1z[ig] = i * t2[ig] * p2z[ig] + rirgz[ig] * p0z[ig]; + } + } + } + + for (j = 1; j <= lj; j++) { + for (i = 0; i <= nmax - j; i++) { + p0x = gx + j * dj + i * di; + p0y = gy + j * dj + i * di; + p0z = gz + j * dj + i * di; + p1x = p0x - dj; + p1y = p0y - dj; + p1z = p0z - dj; + p2x = p1x + di; + p2y = p1y + di; + p2z = p1z + di; + + for (n = 0; n < nroots; n++) { +#pragma GCC ivdep + for (ig = 0; ig < bgrids; ig++) { + p0x[ig+GRID_BLKSIZE*n] = p2x[ig+GRID_BLKSIZE*n] + rirj[0] * p1x[ig+GRID_BLKSIZE*n]; + p0y[ig+GRID_BLKSIZE*n] = p2y[ig+GRID_BLKSIZE*n] + rirj[1] * p1y[ig+GRID_BLKSIZE*n]; + p0z[ig+GRID_BLKSIZE*n] = p2z[ig+GRID_BLKSIZE*n] + rirj[2] * p1z[ig+GRID_BLKSIZE*n]; + } } + } } + return 1; +} + +void CINTgout1e_grids(dtype *gout, dtype *g, FINT *idx, + CINTEnvVars *envs, FINT gout_empty) +{ + FINT ngrids = envs->ngrids; + FINT bgrids = MIN(ngrids - envs->grids_offset, GRID_BLKSIZE); + FINT nroots = envs->nrys_roots; + FINT nf = envs->nf; + FINT i, n, ig; + dtype *gx, *gy, *gz; + dtype s[GRID_BLKSIZE]; + + if (gout_empty) { + for (n = 0; n < nf; n++, idx+=3) { + gx = g + idx[0]; + gy = g + idx[1]; + gz = g + idx[2]; + for (ig = 0; ig < bgrids; ig++) { + s[ig] = 0; + } + for (i = 0; i < nroots; i++) { + for (ig = 0; ig < bgrids; ig++) { + s[ig] += gx[ig+GRID_BLKSIZE*i] * gy[ig+GRID_BLKSIZE*i] * gz[ig+GRID_BLKSIZE*i]; + } + } + for (ig = 0; ig < bgrids; ig++) { + gout[ig+bgrids*n] = s[ig]; + } + } + } else { + for (n = 0; n < nf; n++, idx+=3) { + gx = g + idx[0]; + gy = g + idx[1]; + gz = g + idx[2]; + for (ig = 0; ig < bgrids; ig++) { + s[ig] = 0; + } + for (i = 0; i < nroots; i++) { + for (ig = 0; ig < bgrids; ig++) { + s[ig] += gx[ig+GRID_BLKSIZE*i] * gy[ig+GRID_BLKSIZE*i] * gz[ig+GRID_BLKSIZE*i]; + } + } + for (ig = 0; ig < bgrids; ig++) { + gout[ig+bgrids*n] += s[ig]; + } + } + } +} + +void CINTnabla1i_grids(dtype *f, dtype *g, + FINT li, FINT lj, CINTEnvVars *envs) +{ + FINT ngrids = envs->ngrids; + FINT bgrids = MIN(ngrids - envs->grids_offset, GRID_BLKSIZE); + FINT nroots = envs->nrys_roots; + const FINT di = envs->g_stride_i; + const FINT dj = envs->g_stride_j; + const dtype ai2 = -2 * envs->ai[0]; + FINT i, j, n, ig, ptr; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (j = 0; j <= lj; j++) { + + for (n = 0; n < nroots; n++) { + ptr = dj * j + n * GRID_BLKSIZE; +#pragma GCC ivdep + for (ig = ptr; ig < ptr+bgrids; ig++) { + fx[ig] = ai2 * gx[ig+di]; + fy[ig] = ai2 * gy[ig+di]; + fz[ig] = ai2 * gz[ig+di]; + } + } + + for (i = 1; i <= li; i++) { + for (n = 0; n < nroots; n++) { + ptr = dj * j + di * i + n * GRID_BLKSIZE; +#pragma GCC ivdep + for (ig = ptr; ig < ptr+bgrids; ig++) { + fx[ig] = i * gx[ig-di] + ai2 * gx[ig+di]; + fy[ig] = i * gy[ig-di] + ai2 * gy[ig+di]; + fz[ig] = i * gz[ig-di] + ai2 * gz[ig+di]; + } + } } + } +} + +void CINTnabla1j_grids(dtype *f, dtype *g, + FINT li, FINT lj, CINTEnvVars *envs) +{ + FINT ngrids = envs->ngrids; + FINT bgrids = MIN(ngrids - envs->grids_offset, GRID_BLKSIZE); + FINT nroots = envs->nrys_roots; + const FINT di = envs->g_stride_i; + const FINT dj = envs->g_stride_j; + const dtype aj2 = -2 * envs->aj[0]; + FINT i, j, n, ig, ptr; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + + for (i = 0; i <= li; i++) { + for (n = 0; n < nroots; n++) { + ptr = di * i + n * GRID_BLKSIZE; +#pragma GCC ivdep + for (ig = ptr; ig < ptr+bgrids; ig++) { + fx[ig] = aj2 * gx[ig+dj]; + fy[ig] = aj2 * gy[ig+dj]; + fz[ig] = aj2 * gz[ig+dj]; + } + } } + + for (j = 1; j <= lj; j++) { + for (i = 0; i <= li; i++) { + for (n = 0; n < nroots; n++) { + ptr = dj * j + di * i + n * GRID_BLKSIZE; +#pragma GCC ivdep + for (ig = ptr; ig < ptr+bgrids; ig++) { + fx[ig] = j * gx[ig-dj] + aj2 * gx[ig+dj]; + fy[ig] = j * gy[ig-dj] + aj2 * gy[ig+dj]; + fz[ig] = j * gz[ig-dj] + aj2 * gz[ig+dj]; + } + } } } +} + +void CINTx1i_grids(dtype *f, dtype *g, dtype *ri, + FINT li, FINT lj, CINTEnvVars *envs) +{ + FINT ngrids = envs->ngrids; + FINT bgrids = MIN(ngrids - envs->grids_offset, GRID_BLKSIZE); + FINT nroots = envs->nrys_roots; + FINT i, j, n, ig, ptr; + const FINT di = envs->g_stride_i; + const FINT dj = envs->g_stride_j; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (j = 0; j <= lj; j++) { + for (i = 0; i <= li; i++) { + for (n = 0; n < nroots; n++) { + ptr = dj * j + di * i + n * GRID_BLKSIZE; +#pragma GCC ivdep + for (ig = ptr; ig < ptr+bgrids; ig++) { + fx[ig] = gx[ig+di] + ri[0] * gx[ig]; + fy[ig] = gy[ig+di] + ri[1] * gy[ig]; + fz[ig] = gz[ig+di] + ri[2] * gz[ig]; + } + } } } +} + +void CINTx1j_grids(dtype *f, dtype *g, dtype *rj, + FINT li, FINT lj, CINTEnvVars *envs) +{ + FINT ngrids = envs->ngrids; + FINT bgrids = MIN(ngrids - envs->grids_offset, GRID_BLKSIZE); + FINT nroots = envs->nrys_roots; + FINT i, j, n, ig, ptr; + const FINT di = envs->g_stride_i; + const FINT dj = envs->g_stride_j; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (j = 0; j <= lj; j++) { + for (i = 0; i <= li; i++) { + for (n = 0; n < nroots; n++) { + ptr = dj * j + di * i + n * GRID_BLKSIZE; +#pragma GCC ivdep + for (ig = ptr; ig < ptr+bgrids; ig++) { + fx[ig] = gx[ig+dj] + rj[0] * gx[ig]; + fy[ig] = gy[ig+dj] + rj[1] * gy[ig]; + fz[ig] = gz[ig+dj] + rj[2] * gz[ig]; + } + } } } +} + + +//#include +#include +#include +#include + +#define DEF_GXYZ(type, G, GX, GY, GZ) \ + type *GX = G; \ + type *GY = G + envs->g_size; \ + type *GZ = G + envs->g_size * 2 + +#define realbas bas + +int version_f_g0_2d4d = -1; + +void CINTinit_int2e_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) +{ + envs->natm = natm; + envs->nbas = nbas; + envs->atm = atm; + envs->bas = bas; + envs->env = env; + envs->shls = shls; + + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT k_sh = shls[2]; + FINT l_sh = shls[3]; + envs->i_l = bas(ANG_OF, i_sh); + envs->j_l = bas(ANG_OF, j_sh); + envs->k_l = bas(ANG_OF, k_sh); + envs->l_l = bas(ANG_OF, l_sh); + envs->x_ctr[0] = bas(NCTR_OF, i_sh); + envs->x_ctr[1] = bas(NCTR_OF, j_sh); + envs->x_ctr[2] = bas(NCTR_OF, k_sh); + envs->x_ctr[3] = bas(NCTR_OF, l_sh); + envs->nfi = (envs->i_l+1)*(envs->i_l+2)/2; + envs->nfj = (envs->j_l+1)*(envs->j_l+2)/2; + envs->nfk = (envs->k_l+1)*(envs->k_l+2)/2; + envs->nfl = (envs->l_l+1)*(envs->l_l+2)/2; + envs->nf = envs->nfi * envs->nfk * envs->nfl * envs->nfj; + + envs->ri = env + atm(PTR_COORD, bas(ATOM_OF, i_sh)); + envs->rj = env + atm(PTR_COORD, bas(ATOM_OF, j_sh)); + envs->rk = env + atm(PTR_COORD, bas(ATOM_OF, k_sh)); + envs->rl = env + atm(PTR_COORD, bas(ATOM_OF, l_sh)); + + envs->common_factor = (M_PI*M_PI*M_PI)*2/SQRTPI + * CINTcommon_fac_sp(envs->i_l) * CINTcommon_fac_sp(envs->j_l) + * CINTcommon_fac_sp(envs->k_l) * CINTcommon_fac_sp(envs->l_l); + if (env[PTR_EXPCUTOFF] == 0) { + envs->expcutoff = EXPCUTOFF; + } else { + + envs->expcutoff = MAX(MIN_EXPCUTOFF, env[PTR_EXPCUTOFF]) + 1; + } + + envs->gbits = ng[GSHIFT]; + envs->ncomp_e1 = ng[POS_E1]; + envs->ncomp_e2 = ng[POS_E2]; + envs->ncomp_tensor = ng[TENSOR]; + + envs->li_ceil = envs->i_l + ng[IINC]; + envs->lj_ceil = envs->j_l + ng[JINC]; + envs->lk_ceil = envs->k_l + ng[KINC]; + envs->ll_ceil = envs->l_l + ng[LINC]; + int rys_order =(envs->li_ceil + envs->lj_ceil + envs->lk_ceil + envs->ll_ceil)/2 + 1; + int nrys_roots = rys_order; + dtype omega = env[PTR_RANGE_OMEGA]; + if (omega < 0 && rys_order <= 3) { + nrys_roots *= 2; + } + envs->rys_order = rys_order; + envs->nrys_roots = nrys_roots; + + /*assert(i_sh < SHLS_MAX); + assert(j_sh < SHLS_MAX); + assert(k_sh < SHLS_MAX); + assert(l_sh < SHLS_MAX); + assert(envs->i_l < ANG_MAX); + assert(envs->j_l < ANG_MAX); + assert(envs->k_l < ANG_MAX); + assert(envs->l_l < ANG_MAX); + assert(bas(ATOM_OF,i_sh) >= 0); + assert(bas(ATOM_OF,j_sh) >= 0); + assert(bas(ATOM_OF,k_sh) >= 0); + assert(bas(ATOM_OF,l_sh) >= 0); + assert(bas(ATOM_OF,i_sh) < natm); + assert(bas(ATOM_OF,j_sh) < natm); + assert(bas(ATOM_OF,k_sh) < natm); + assert(bas(ATOM_OF,l_sh) < natm); + assert(rys_order < MXRYSROOTS);*/ + + FINT dli, dlj, dlk, dll; + FINT ibase = envs->li_ceil > envs->lj_ceil; + FINT kbase = envs->lk_ceil > envs->ll_ceil; + if (kbase) { + dlk = envs->lk_ceil + envs->ll_ceil + 1; + dll = envs->ll_ceil + 1; + } else { + dlk = envs->lk_ceil + 1; + dll = envs->lk_ceil + envs->ll_ceil + 1; + } + + if (ibase) { + dli = envs->li_ceil + envs->lj_ceil + 1; + dlj = envs->lj_ceil + 1; + } else { + dli = envs->li_ceil + 1; + dlj = envs->li_ceil + envs->lj_ceil + 1; + } + envs->g_stride_i = nrys_roots; + envs->g_stride_k = nrys_roots * dli; + envs->g_stride_l = nrys_roots * dli * dlk; + envs->g_stride_j = nrys_roots * dli * dlk * dll; + envs->g_size = nrys_roots * dli * dlk * dll * dlj; + + if (kbase) { + envs->g2d_klmax = envs->g_stride_k; + envs->rx_in_rklrx = envs->rk; + envs->rkrl[0] = envs->rk[0] - envs->rl[0]; + envs->rkrl[1] = envs->rk[1] - envs->rl[1]; + envs->rkrl[2] = envs->rk[2] - envs->rl[2]; + } else { + envs->g2d_klmax = envs->g_stride_l; + envs->rx_in_rklrx = envs->rl; + envs->rkrl[0] = envs->rl[0] - envs->rk[0]; + envs->rkrl[1] = envs->rl[1] - envs->rk[1]; + envs->rkrl[2] = envs->rl[2] - envs->rk[2]; + } + + if (ibase) { + envs->g2d_ijmax = envs->g_stride_i; + envs->rx_in_rijrx = envs->ri; + envs->rirj[0] = envs->ri[0] - envs->rj[0]; + envs->rirj[1] = envs->ri[1] - envs->rj[1]; + envs->rirj[2] = envs->ri[2] - envs->rj[2]; + } else { + envs->g2d_ijmax = envs->g_stride_j; + envs->rx_in_rijrx = envs->rj; + envs->rirj[0] = envs->rj[0] - envs->ri[0]; + envs->rirj[1] = envs->rj[1] - envs->ri[1]; + envs->rirj[2] = envs->rj[2] - envs->ri[2]; + } + + + #ifdef __cplusplus + if (rys_order <= 2) { + envs->f_g0_2d4d = (void (*)(...))&CINTg0_2e_2d4d_unrolled; + version_f_g0_2d4d = 0; + if (rys_order != nrys_roots) { + envs->f_g0_2d4d = (void (*)(...))&CINTsrg0_2e_2d4d_unrolled; + version_f_g0_2d4d = 1; + } + } else if (kbase) { + if (ibase) { + envs->f_g0_2d4d = (void (*)(...))&CINTg0_2e_ik2d4d; + version_f_g0_2d4d = 2; + } else { + envs->f_g0_2d4d = (void (*)(...))&CINTg0_2e_kj2d4d; + version_f_g0_2d4d = 3; + } + } else { + if (ibase) { + envs->f_g0_2d4d = (void (*)(...))&CINTg0_2e_il2d4d; + version_f_g0_2d4d = 4; + } else { + envs->f_g0_2d4d = (void (*)(...))&CINTg0_2e_lj2d4d; + version_f_g0_2d4d = 5; + } + } + envs->f_g0_2e = (int (*)(...))&CINTg0_2e; + #else + if (rys_order <= 2) { + envs->f_g0_2d4d = &CINTg0_2e_2d4d_unrolled; + if (rys_order != nrys_roots) { + envs->f_g0_2d4d = &CINTsrg0_2e_2d4d_unrolled; + } + } else if (kbase) { + if (ibase) { + envs->f_g0_2d4d = &CINTg0_2e_ik2d4d; + } else { + envs->f_g0_2d4d = &CINTg0_2e_kj2d4d; + } + } else { + if (ibase) { + envs->f_g0_2d4d = &CINTg0_2e_il2d4d; + } else { + envs->f_g0_2d4d = &CINTg0_2e_lj2d4d; + } + } + envs->f_g0_2e = &CINTg0_2e; + + #endif +} + +void CINTg2e_index_xyz(FINT *idx, const CINTEnvVars *envs) +{ + const FINT i_l = envs->i_l; + const FINT j_l = envs->j_l; + const FINT k_l = envs->k_l; + const FINT l_l = envs->l_l; + const FINT nfi = envs->nfi; + const FINT nfj = envs->nfj; + const FINT nfk = envs->nfk; + const FINT nfl = envs->nfl; + const FINT di = envs->g_stride_i; + const FINT dk = envs->g_stride_k; + const FINT dl = envs->g_stride_l; + const FINT dj = envs->g_stride_j; + FINT i, j, k, l, n; + FINT ofx, ofkx, oflx; + FINT ofy, ofky, ofly; + FINT ofz, ofkz, oflz; + FINT i_nx[CART_MAX], i_ny[CART_MAX], i_nz[CART_MAX]; + FINT j_nx[CART_MAX], j_ny[CART_MAX], j_nz[CART_MAX]; + FINT k_nx[CART_MAX], k_ny[CART_MAX], k_nz[CART_MAX]; + FINT l_nx[CART_MAX], l_ny[CART_MAX], l_nz[CART_MAX]; + + CINTcart_comp(i_nx, i_ny, i_nz, i_l); + CINTcart_comp(j_nx, j_ny, j_nz, j_l); + CINTcart_comp(k_nx, k_ny, k_nz, k_l); + CINTcart_comp(l_nx, l_ny, l_nz, l_l); + + ofx = 0; + ofy = envs->g_size; + ofz = envs->g_size * 2; + n = 0; + for (j = 0; j < nfj; j++) { + for (l = 0; l < nfl; l++) { + oflx = ofx + dj * j_nx[j] + dl * l_nx[l]; + ofly = ofy + dj * j_ny[j] + dl * l_ny[l]; + oflz = ofz + dj * j_nz[j] + dl * l_nz[l]; + for (k = 0; k < nfk; k++) { + ofkx = oflx + dk * k_nx[k]; + ofky = ofly + dk * k_ny[k]; + ofkz = oflz + dk * k_nz[k]; + switch (i_l) { + case 0: + idx[n+0] = ofkx; + idx[n+1] = ofky; + idx[n+2] = ofkz; + n += 3; + break; + case 1: + idx[n+0] = ofkx + di; + idx[n+1] = ofky; + idx[n+2] = ofkz; + idx[n+3] = ofkx; + idx[n+4] = ofky + di; + idx[n+5] = ofkz; + idx[n+6] = ofkx; + idx[n+7] = ofky; + idx[n+8] = ofkz + di; + n += 9; + break; + case 2: + idx[n+0 ] = ofkx + di*2; + idx[n+1 ] = ofky; + idx[n+2 ] = ofkz; + idx[n+3 ] = ofkx + di; + idx[n+4 ] = ofky + di; + idx[n+5 ] = ofkz; + idx[n+6 ] = ofkx + di; + idx[n+7 ] = ofky; + idx[n+8 ] = ofkz + di; + idx[n+9 ] = ofkx; + idx[n+10] = ofky + di*2; + idx[n+11] = ofkz; + idx[n+12] = ofkx; + idx[n+13] = ofky + di; + idx[n+14] = ofkz + di; + idx[n+15] = ofkx; + idx[n+16] = ofky; + idx[n+17] = ofkz + di*2; + n += 18; + break; + default: + for (i = 0; i < nfi; i++) { + idx[n+0] = ofkx + di * i_nx[i]; + idx[n+1] = ofky + di * i_ny[i]; + idx[n+2] = ofkz + di * i_nz[i]; + n += 3; + } + } + } + } + } +} + + +void CINTg0_2e_2d(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + const FINT nroots = envs->nrys_roots; + const FINT nmax = envs->li_ceil + envs->lj_ceil; + const FINT mmax = envs->lk_ceil + envs->ll_ceil; + const FINT dm = envs->g2d_klmax; + const FINT dn = envs->g2d_ijmax; + FINT i, j, m, n, off; + DEF_GXYZ(dtype, g, gx, gy, gz); + dtype *p0x, *p0y, *p0z; + dtype *p1x, *p1y, *p1z; + dtype nb1, mb0; + + for (i = 0; i < nroots; i++) { + gx[i] = 1; + gy[i] = 1; + + } + + dtype s0x, s1x, s2x, t0x, t1x; + dtype s0y, s1y, s2y, t0y, t1y; + dtype s0z, s1z, s2z, t0z, t1z; + dtype c00x, c00y, c00z, c0px, c0py, c0pz, b10, b01, b00; + for (i = 0; i < nroots; i++) { + c00x = bc->c00x[i]; + c00y = bc->c00y[i]; + c00z = bc->c00z[i]; + c0px = bc->c0px[i]; + c0py = bc->c0py[i]; + c0pz = bc->c0pz[i]; + b10 = bc->b10[i]; + b01 = bc->b01[i]; + b00 = bc->b00[i]; + if (nmax > 0) { + + + + s0x = gx[i]; + s0y = gy[i]; + s0z = gz[i]; + s1x = c00x * s0x; + s1y = c00y * s0y; + s1z = c00z * s0z; + gx[i+dn] = s1x; + gy[i+dn] = s1y; + gz[i+dn] = s1z; + for (n = 1; n < nmax; ++n) { + s2x = c00x * s1x + n * b10 * s0x; + s2y = c00y * s1y + n * b10 * s0y; + s2z = c00z * s1z + n * b10 * s0z; + gx[i+(n+1)*dn] = s2x; + gy[i+(n+1)*dn] = s2y; + gz[i+(n+1)*dn] = s2z; + s0x = s1x; + s0y = s1y; + s0z = s1z; + s1x = s2x; + s1y = s2y; + s1z = s2z; + } + } + + if (mmax > 0) { + + + + s0x = gx[i]; + s0y = gy[i]; + s0z = gz[i]; + s1x = c0px * s0x; + s1y = c0py * s0y; + s1z = c0pz * s0z; + gx[i+dm] = s1x; + gy[i+dm] = s1y; + gz[i+dm] = s1z; + for (m = 1; m < mmax; ++m) { + s2x = c0px * s1x + m * b01 * s0x; + s2y = c0py * s1y + m * b01 * s0y; + s2z = c0pz * s1z + m * b01 * s0z; + gx[i+(m+1)*dm] = s2x; + gy[i+(m+1)*dm] = s2y; + gz[i+(m+1)*dm] = s2z; + s0x = s1x; + s0y = s1y; + s0z = s1z; + s1x = s2x; + s1y = s2y; + s1z = s2z; + } + + if (nmax > 0) { + + + + + s0x = gx[i+dn]; + s0y = gy[i+dn]; + s0z = gz[i+dn]; + s1x = c0px * s0x + b00 * gx[i]; + s1y = c0py * s0y + b00 * gy[i]; + s1z = c0pz * s0z + b00 * gz[i]; + gx[i+dn+dm] = s1x; + gy[i+dn+dm] = s1y; + gz[i+dn+dm] = s1z; + for (m = 1; m < mmax; ++m) { + s2x = c0px*s1x + m*b01*s0x + b00*gx[i+m*dm]; + s2y = c0py*s1y + m*b01*s0y + b00*gy[i+m*dm]; + s2z = c0pz*s1z + m*b01*s0z + b00*gz[i+m*dm]; + gx[i+dn+(m+1)*dm] = s2x; + gy[i+dn+(m+1)*dm] = s2y; + gz[i+dn+(m+1)*dm] = s2z; + s0x = s1x; + s0y = s1y; + s0z = s1z; + s1x = s2x; + s1y = s2y; + s1z = s2z; + } + } + } + + + + + for (m = 1; m <= mmax; ++m) { + off = m * dm; + j = off + i; + s0x = gx[j]; + s0y = gy[j]; + s0z = gz[j]; + s1x = gx[j + dn]; + s1y = gy[j + dn]; + s1z = gz[j + dn]; + for (n = 1; n < nmax; ++n) { + s2x = c00x*s1x + n*b10*s0x + m*b00*gx[j+n*dn-dm]; + s2y = c00y*s1y + n*b10*s0y + m*b00*gy[j+n*dn-dm]; + s2z = c00z*s1z + n*b10*s0z + m*b00*gz[j+n*dn-dm]; + gx[j+(n+1)*dn] = s2x; + gy[j+(n+1)*dn] = s2y; + gz[j+(n+1)*dn] = s2z; + s0x = s1x; + s0y = s1y; + s0z = s1z; + s1x = s2x; + s1y = s2y; + s1z = s2z; + } + } + } +} + + + + +void CINTg0_lj2d_4d(dtype * g, CINTEnvVars *envs) +{ + FINT li = envs->li_ceil; + FINT lk = envs->lk_ceil; + if (li == 0 && lk == 0) { + return; + } + FINT nmax = envs->li_ceil + envs->lj_ceil; + FINT mmax = envs->lk_ceil + envs->ll_ceil; + + FINT lj = envs->lj_ceil; + FINT nroots = envs->nrys_roots; + FINT i, j, k, l, ptr, n; + FINT di = envs->g_stride_i; + FINT dk = envs->g_stride_k; + FINT dl = envs->g_stride_l; + FINT dj = envs->g_stride_j; + dtype *rirj = envs->rirj; + dtype *rkrl = envs->rkrl; + DEF_GXYZ(dtype, g, gx, gy, gz); + dtype *p1x, *p1y, *p1z, *p2x, *p2y, *p2z; + dtype rx, ry, rz; + + + rx = rirj[0]; + ry = rirj[1]; + rz = rirj[2]; + p1x = gx - di; + p1y = gy - di; + p1z = gz - di; + p2x = gx - di + dj; + p2y = gy - di + dj; + p2z = gz - di + dj; + for (i = 1; i <= li; i++) { + for (j = 0; j <= nmax-i; j++) { + for (l = 0; l <= mmax; l++) { + ptr = j*dj + l*dl + i*di; + for (n = ptr; n < ptr+nroots; n++) { + gx[n] = rx * p1x[n] + p2x[n]; + gy[n] = ry * p1y[n] + p2y[n]; + gz[n] = rz * p1z[n] + p2z[n]; + } + } } } + + + rx = rkrl[0]; + ry = rkrl[1]; + rz = rkrl[2]; + p1x = gx - dk; + p1y = gy - dk; + p1z = gz - dk; + p2x = gx - dk + dl; + p2y = gy - dk + dl; + p2z = gz - dk + dl; + for (j = 0; j <= lj; j++) { + for (k = 1; k <= lk; k++) { + for (l = 0; l <= mmax-k; l++) { + ptr = j*dj + l*dl + k*dk; + for (n = ptr; n < ptr+dk; n++) { + gx[n] = rx * p1x[n] + p2x[n]; + gy[n] = ry * p1y[n] + p2y[n]; + gz[n] = rz * p1z[n] + p2z[n]; + } + } } } +} + + +void CINTg0_kj2d_4d(dtype *g, CINTEnvVars *envs) +{ + FINT li = envs->li_ceil; + FINT ll = envs->ll_ceil; + if (li == 0 && ll == 0) { + return; + } + FINT nmax = envs->li_ceil + envs->lj_ceil; + FINT mmax = envs->lk_ceil + envs->ll_ceil; + + FINT lj = envs->lj_ceil; + FINT nroots = envs->nrys_roots; + FINT i, j, k, l, ptr, n; + FINT di = envs->g_stride_i; + FINT dk = envs->g_stride_k; + FINT dl = envs->g_stride_l; + FINT dj = envs->g_stride_j; + dtype *rirj = envs->rirj; + dtype *rkrl = envs->rkrl; + DEF_GXYZ(dtype, g, gx, gy, gz); + dtype *p1x, *p1y, *p1z, *p2x, *p2y, *p2z; + dtype rx, ry, rz; + + + rx = rirj[0]; + ry = rirj[1]; + rz = rirj[2]; + p1x = gx - di; + p1y = gy - di; + p1z = gz - di; + p2x = gx - di + dj; + p2y = gy - di + dj; + p2z = gz - di + dj; + for (i = 1; i <= li; i++) { + for (j = 0; j <= nmax-i; j++) { + for (k = 0; k <= mmax; k++) { + ptr = j*dj + k*dk + i*di; + for (n = ptr; n < ptr+nroots; n++) { + gx[n] = rx * p1x[n] + p2x[n]; + gy[n] = ry * p1y[n] + p2y[n]; + gz[n] = rz * p1z[n] + p2z[n]; + } + } } } + + + rx = rkrl[0]; + ry = rkrl[1]; + rz = rkrl[2]; + p1x = gx - dl; + p1y = gy - dl; + p1z = gz - dl; + p2x = gx - dl + dk; + p2y = gy - dl + dk; + p2z = gz - dl + dk; + for (j = 0; j <= lj; j++) { + for (l = 1; l <= ll; l++) { + for (k = 0; k <= mmax-l; k++) { + ptr = j*dj + l*dl + k*dk; + for (n = ptr; n < ptr+dk; n++) { + gx[n] = rx * p1x[n] + p2x[n]; + gy[n] = ry * p1y[n] + p2y[n]; + gz[n] = rz * p1z[n] + p2z[n]; + } + } } } +} + + +void CINTg0_il2d_4d(dtype *g, CINTEnvVars *envs) +{ + FINT lk = envs->lk_ceil; + FINT lj = envs->lj_ceil; + if (lj == 0 && lk == 0) { + return; + } + FINT nmax = envs->li_ceil + envs->lj_ceil; + FINT mmax = envs->lk_ceil + envs->ll_ceil; + + FINT ll = envs->ll_ceil; + FINT nroots = envs->nrys_roots; + FINT i, j, k, l, ptr, n; + FINT di = envs->g_stride_i; + FINT dk = envs->g_stride_k; + FINT dl = envs->g_stride_l; + FINT dj = envs->g_stride_j; + dtype *rirj = envs->rirj; + dtype *rkrl = envs->rkrl; + DEF_GXYZ(dtype, g, gx, gy, gz); + dtype *p1x, *p1y, *p1z, *p2x, *p2y, *p2z; + dtype rx, ry, rz; + + + rx = rkrl[0]; + ry = rkrl[1]; + rz = rkrl[2]; + p1x = gx - dk; + p1y = gy - dk; + p1z = gz - dk; + p2x = gx - dk + dl; + p2y = gy - dk + dl; + p2z = gz - dk + dl; + for (k = 1; k <= lk; k++) { + for (l = 0; l <= mmax-k; l++) { + for (i = 0; i <= nmax; i++) { + ptr = l*dl + k*dk + i*di; + for (n = ptr; n < ptr+nroots; n++) { + gx[n] = rx * p1x[n] + p2x[n]; + gy[n] = ry * p1y[n] + p2y[n]; + gz[n] = rz * p1z[n] + p2z[n]; + } + } } } + + + rx = rirj[0]; + ry = rirj[1]; + rz = rirj[2]; + p1x = gx - dj; + p1y = gy - dj; + p1z = gz - dj; + p2x = gx - dj + di; + p2y = gy - dj + di; + p2z = gz - dj + di; + for (j = 1; j <= lj; j++) { + for (l = 0; l <= ll; l++) { + for (k = 0; k <= lk; k++) { + ptr = j*dj + l*dl + k*dk; + for (n = ptr; n < ptr+dk-di*j; n++) { + gx[n] = rx * p1x[n] + p2x[n]; + gy[n] = ry * p1y[n] + p2y[n]; + gz[n] = rz * p1z[n] + p2z[n]; + } + } } } +} + + +void CINTg0_ik2d_4d(dtype *g, CINTEnvVars *envs) +{ + FINT lj = envs->lj_ceil; + FINT ll = envs->ll_ceil; + if (lj == 0 && ll == 0) { + return; + } + FINT nmax = envs->li_ceil + envs->lj_ceil; + FINT mmax = envs->lk_ceil + envs->ll_ceil; + + FINT lk = envs->lk_ceil; + FINT nroots = envs->nrys_roots; + FINT i, j, k, l, ptr, n; + FINT di = envs->g_stride_i; + FINT dk = envs->g_stride_k; + FINT dl = envs->g_stride_l; + FINT dj = envs->g_stride_j; + dtype *rirj = envs->rirj; + dtype *rkrl = envs->rkrl; + DEF_GXYZ(dtype, g, gx, gy, gz); + dtype *p1x, *p1y, *p1z, *p2x, *p2y, *p2z; + dtype rx, ry, rz; + + + rx = rkrl[0]; + ry = rkrl[1]; + rz = rkrl[2]; + p1x = gx - dl; + p1y = gy - dl; + p1z = gz - dl; + p2x = gx - dl + dk; + p2y = gy - dl + dk; + p2z = gz - dl + dk; + for (l = 1; l <= ll; l++) { + + + for (k = 0; k <= mmax-l; k++) { + for (i = 0; i <= nmax; i++) { + ptr = l*dl + k*dk + i*di; + for (n = ptr; n < ptr+nroots; n++) { + gx[n] = rx * p1x[n] + p2x[n]; + gy[n] = ry * p1y[n] + p2y[n]; + gz[n] = rz * p1z[n] + p2z[n]; + } + } } + } + + + rx = rirj[0]; + ry = rirj[1]; + rz = rirj[2]; + p1x = gx - dj; + p1y = gy - dj; + p1z = gz - dj; + p2x = gx - dj + di; + p2y = gy - dj + di; + p2z = gz - dj + di; + for (j = 1; j <= lj; j++) { + for (l = 0; l <= ll; l++) { + for (k = 0; k <= lk; k++) { + ptr = j*dj + l*dl + k*dk; + for (n = ptr; n < ptr+dk-di*j; n++) { + gx[n] = rx * p1x[n] + p2x[n]; + gy[n] = ry * p1y[n] + p2y[n]; + gz[n] = rz * p1z[n] + p2z[n]; + } + } } } +} + + +static inline void _g0_2d4d_0000(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + g[0] = 1; + g[1] = 1; + +} + + +static inline void _g0_2d4d_0001(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + g[0] = 1; + g[1] = cpx[0]; + g[2] = 1; + g[3] = cpy[0]; + + g[5] = cpz[0] * g[4]; +} + + +static inline void _g0_2d4d_0002(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[4] = cpx[0] * cpx[0] + b01[0]; + g[5] = cpx[1] * cpx[1] + b01[1]; + g[6] = 1; + g[7] = 1; + g[8] = cpy[0]; + g[9] = cpy[1]; + g[10] = cpy[0] * cpy[0] + b01[0]; + g[11] = cpy[1] * cpy[1] + b01[1]; + + + g[14] = cpz[0] * g[12]; + g[15] = cpz[1] * g[13]; + g[16] = cpz[0] * g[14] + b01[0] * g[12]; + g[17] = cpz[1] * g[15] + b01[1] * g[13]; +} + + +static inline void _g0_2d4d_0003(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[4] = cpx[0] * cpx[0] + b01[0]; + g[5] = cpx[1] * cpx[1] + b01[1]; + g[6] = cpx[0] * (g[4] + 2 * b01[0]); + g[7] = cpx[1] * (g[5] + 2 * b01[1]); + g[8] = 1; + g[9] = 1; + g[10] = cpy[0]; + g[11] = cpy[1]; + g[12] = cpy[0] * cpy[0] + b01[0]; + g[13] = cpy[1] * cpy[1] + b01[1]; + g[14] = cpy[0] * (g[12] + 2 * b01[0]); + g[15] = cpy[1] * (g[13] + 2 * b01[1]); + + + g[18] = cpz[0] * g[16]; + g[19] = cpz[1] * g[17]; + g[20] = cpz[0] * g[18] + b01[0] * g[16]; + g[21] = cpz[1] * g[19] + b01[1] * g[17]; + g[22] = cpz[0] * g[20] + 2 * b01[0] * g[18]; + g[23] = cpz[1] * g[21] + 2 * b01[1] * g[19]; +} + + +static inline void _g0_2d4d_0010(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + g[0] = 1; + g[1] = cpx[0]; + g[2] = 1; + g[3] = cpy[0]; + + g[5] = cpz[0] * g[4]; +} + + +static inline void _g0_2d4d_0011(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + dtype xkxl = envs->rkrl[0]; + dtype ykyl = envs->rkrl[1]; + dtype zkzl = envs->rkrl[2]; + g[0] = 1; + g[1] = 1; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[0] * (xkxl + cpx[0]) + b01[0]; + g[7] = cpx[1] * (xkxl + cpx[1]) + b01[1]; + g[2] = xkxl + cpx[0]; + g[3] = xkxl + cpx[1]; + g[12] = 1; + g[13] = 1; + g[16] = cpy[0]; + g[17] = cpy[1]; + g[18] = cpy[0] * (ykyl + cpy[0]) + b01[0]; + g[19] = cpy[1] * (ykyl + cpy[1]) + b01[1]; + g[14] = ykyl + cpy[0]; + g[15] = ykyl + cpy[1]; + + + g[28] = cpz[0] * g[24]; + g[29] = cpz[1] * g[25]; + g[30] = g[28] * (zkzl + cpz[0]) + b01[0] * g[24]; + g[31] = g[29] * (zkzl + cpz[1]) + b01[1] * g[25]; + g[26] = g[24] * (zkzl + cpz[0]); + g[27] = g[25] * (zkzl + cpz[1]); +} + +static inline void _g0_2d4d_0012(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + dtype xkxl = envs->rkrl[0]; + dtype ykyl = envs->rkrl[1]; + dtype zkzl = envs->rkrl[2]; + g[0] = 1; + g[1] = 1; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[8] = cpx[0] * cpx[0] + b01[0]; + g[9] = cpx[1] * cpx[1] + b01[1]; + g[10] = g[8] * (xkxl + cpx[0]) + cpx[0] * 2 * b01[0]; + g[11] = g[9] * (xkxl + cpx[1]) + cpx[1] * 2 * b01[1]; + g[6] = cpx[0] * (xkxl + cpx[0]) + b01[0]; + g[7] = cpx[1] * (xkxl + cpx[1]) + b01[1]; + g[2] = xkxl + cpx[0]; + g[3] = xkxl + cpx[1]; + g[16] = 1; + g[17] = 1; + g[20] = cpy[0]; + g[21] = cpy[1]; + g[24] = cpy[0] * cpy[0] + b01[0]; + g[25] = cpy[1] * cpy[1] + b01[1]; + g[26] = g[24] * (ykyl + cpy[0]) + cpy[0] * 2 * b01[0]; + g[27] = g[25] * (ykyl + cpy[1]) + cpy[1] * 2 * b01[1]; + g[22] = cpy[0] * (ykyl + cpy[0]) + b01[0]; + g[23] = cpy[1] * (ykyl + cpy[1]) + b01[1]; + g[18] = ykyl + cpy[0]; + g[19] = ykyl + cpy[1]; + + + g[36] = cpz[0] * g[32]; + g[37] = cpz[1] * g[33]; + g[40] = cpz[0] * g[36] + b01[0] * g[32]; + g[41] = cpz[1] * g[37] + b01[1] * g[33]; + g[42] = g[40] * (zkzl + cpz[0]) + 2 * b01[0] * g[36]; + g[43] = g[41] * (zkzl + cpz[1]) + 2 * b01[1] * g[37]; + g[38] = g[36] * (zkzl + cpz[0]) + b01[0] * g[32]; + g[39] = g[37] * (zkzl + cpz[1]) + b01[1] * g[33]; + g[34] = g[32] * (zkzl + cpz[0]); + g[35] = g[33] * (zkzl + cpz[1]); +} + +static inline void _g0_2d4d_0020(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[4] = cpx[0] * cpx[0] + b01[0]; + g[5] = cpx[1] * cpx[1] + b01[1]; + g[6] = 1; + g[7] = 1; + g[8] = cpy[0]; + g[9] = cpy[1]; + g[10] = cpy[0] * cpy[0] + b01[0]; + g[11] = cpy[1] * cpy[1] + b01[1]; + + + g[14] = cpz[0] * g[12]; + g[15] = cpz[1] * g[13]; + g[16] = cpz[0] * g[14] + b01[0] * g[12]; + g[17] = cpz[1] * g[15] + b01[1] * g[13]; +} + +static inline void _g0_2d4d_0021(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + dtype xkxl = envs->rkrl[0]; + dtype ykyl = envs->rkrl[1]; + dtype zkzl = envs->rkrl[2]; + g[0] = 1; + g[1] = 1; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[4] = cpx[0] * cpx[0] + b01[0]; + g[5] = cpx[1] * cpx[1] + b01[1]; + g[8] = xkxl + cpx[0]; + g[9] = xkxl + cpx[1]; + g[10] = cpx[0] * (xkxl + cpx[0]) + b01[0]; + g[11] = cpx[1] * (xkxl + cpx[1]) + b01[1]; + g[12] = g[4] * (xkxl + cpx[0]) + cpx[0] * 2 * b01[0]; + g[13] = g[5] * (xkxl + cpx[1]) + cpx[1] * 2 * b01[1]; + g[16] = 1; + g[17] = 1; + g[18] = cpy[0]; + g[19] = cpy[1]; + g[20] = cpy[0] * cpy[0] + b01[0]; + g[21] = cpy[1] * cpy[1] + b01[1]; + g[24] = ykyl + cpy[0]; + g[25] = ykyl + cpy[1]; + g[26] = cpy[0] * (ykyl + cpy[0]) + b01[0]; + g[27] = cpy[1] * (ykyl + cpy[1]) + b01[1]; + g[28] = g[20] * (ykyl + cpy[0]) + cpy[0] * 2 * b01[0]; + g[29] = g[21] * (ykyl + cpy[1]) + cpy[1] * 2 * b01[1]; + + + g[34] = cpz[0] * g[32]; + g[35] = cpz[1] * g[33]; + g[36] = cpz[0] * g[34] + b01[0] * g[32]; + g[37] = cpz[1] * g[35] + b01[1] * g[33]; + g[40] = g[32] * (zkzl + cpz[0]); + g[41] = g[33] * (zkzl + cpz[1]); + g[42] = g[34] * (zkzl + cpz[0]) + b01[0] * g[32]; + g[43] = g[35] * (zkzl + cpz[1]) + b01[1] * g[33]; + g[44] = g[36] * (zkzl + cpz[0]) + 2 * b01[0] * g[34]; + g[45] = g[37] * (zkzl + cpz[1]) + 2 * b01[1] * g[35]; +} + +static inline void _g0_2d4d_0030(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[4] = cpx[0] * cpx[0] + b01[0]; + g[5] = cpx[1] * cpx[1] + b01[1]; + g[6] = cpx[0] * (g[4] + 2 * b01[0]); + g[7] = cpx[1] * (g[5] + 2 * b01[1]); + g[8] = 1; + g[9] = 1; + g[10] = cpy[0]; + g[11] = cpy[1]; + g[12] = cpy[0] * cpy[0] + b01[0]; + g[13] = cpy[1] * cpy[1] + b01[1]; + g[14] = cpy[0] * (g[12] + 2 * b01[0]); + g[15] = cpy[1] * (g[13] + 2 * b01[1]); + + + g[18] = cpz[0] * g[16]; + g[19] = cpz[1] * g[17]; + g[20] = cpz[0] * g[18] + b01[0] * g[16]; + g[21] = cpz[1] * g[19] + b01[1] * g[17]; + g[22] = cpz[0] * g[20] + 2 * b01[0] * g[18]; + g[23] = cpz[1] * g[21] + 2 * b01[1] * g[19]; +} + +static inline void _g0_2d4d_0100(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + g[0] = 1; + g[1] = c0x[0]; + g[2] = 1; + g[3] = c0y[0]; + + g[5] = c0z[0] * g[4]; +} + +static inline void _g0_2d4d_0101(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + g[0] = 1; + g[1] = 1; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = cpx[0] * c0x[0] + b00[0]; + g[7] = cpx[1] * c0x[1] + b00[1]; + g[8] = 1; + g[9] = 1; + g[10] = cpy[0]; + g[11] = cpy[1]; + g[12] = c0y[0]; + g[13] = c0y[1]; + g[14] = cpy[0] * c0y[0] + b00[0]; + g[15] = cpy[1] * c0y[1] + b00[1]; + + + g[18] = cpz[0] * g[16]; + g[19] = cpz[1] * g[17]; + g[20] = c0z[0] * g[16]; + g[21] = c0z[1] * g[17]; + g[22] = cpz[0] * g[20] + b00[0] * g[16]; + g[23] = cpz[1] * g[21] + b00[1] * g[17]; +} + +static inline void _g0_2d4d_0102(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[6] = c0x[0]; + g[7] = c0x[1]; + g[4] = cpx[0] * cpx[0] + b01[0]; + g[5] = cpx[1] * cpx[1] + b01[1]; + g[8] = cpx[0] * c0x[0] + b00[0]; + g[9] = cpx[1] * c0x[1] + b00[1]; + g[10] = cpx[0] * (g[8] + b00[0]) + b01[0] * c0x[0]; + g[11] = cpx[1] * (g[9] + b00[1]) + b01[1] * c0x[1]; + g[12] = 1; + g[13] = 1; + g[14] = cpy[0]; + g[15] = cpy[1]; + g[18] = c0y[0]; + g[19] = c0y[1]; + g[16] = cpy[0] * cpy[0] + b01[0]; + g[17] = cpy[1] * cpy[1] + b01[1]; + g[20] = cpy[0] * c0y[0] + b00[0]; + g[21] = cpy[1] * c0y[1] + b00[1]; + g[22] = cpy[0] * (g[20] + b00[0]) + b01[0] * c0y[0]; + g[23] = cpy[1] * (g[21] + b00[1]) + b01[1] * c0y[1]; + + + g[26] = cpz[0] * g[24]; + g[27] = cpz[1] * g[25]; + g[30] = c0z[0] * g[24]; + g[31] = c0z[1] * g[25]; + g[28] = cpz[0] * g[26] + b01[0] * g[24]; + g[29] = cpz[1] * g[27] + b01[1] * g[25]; + g[32] = cpz[0] * g[30] + b00[0] * g[24]; + g[33] = cpz[1] * g[31] + b00[1] * g[25]; + g[34] = cpz[0] * g[32] + b01[0] * g[30] + b00[0] * g[26]; + g[35] = cpz[1] * g[33] + b01[1] * g[31] + b00[1] * g[27]; +} + +static inline void _g0_2d4d_0110(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + g[0] = 1; + g[1] = 1; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = cpx[0] * c0x[0] + b00[0]; + g[7] = cpx[1] * c0x[1] + b00[1]; + g[8] = 1; + g[9] = 1; + g[10] = cpy[0]; + g[11] = cpy[1]; + g[12] = c0y[0]; + g[13] = c0y[1]; + g[14] = cpy[0] * c0y[0] + b00[0]; + g[15] = cpy[1] * c0y[1] + b00[1]; + + + g[18] = cpz[0] * g[16]; + g[19] = cpz[1] * g[17]; + g[20] = c0z[0] * g[16]; + g[21] = c0z[1] * g[17]; + g[22] = cpz[0] * g[20] + b00[0] * g[16]; + g[23] = cpz[1] * g[21] + b00[1] * g[17]; +} + +static inline void _g0_2d4d_0111(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b01 = bc->b01; + dtype xkxl = envs->rkrl[0]; + dtype ykyl = envs->rkrl[1]; + dtype zkzl = envs->rkrl[2]; + g[0] = 1; + g[1] = 1; + g[12] = c0x[0]; + g[13] = c0x[1]; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[16] = cpx[0] * c0x[0] + b00[0]; + g[17] = cpx[1] * c0x[1] + b00[1]; + g[6] = cpx[0] * (xkxl + cpx[0]) + b01[0]; + g[7] = cpx[1] * (xkxl + cpx[1]) + b01[1]; + g[18] = g[16] * (xkxl + cpx[0]) + cpx[0] * b00[0] + b01[0] * c0x[0]; + g[19] = g[17] * (xkxl + cpx[1]) + cpx[1] * b00[1] + b01[1] * c0x[1]; + g[2] = xkxl + cpx[0]; + g[3] = xkxl + cpx[1]; + g[14] = c0x[0] * (xkxl + cpx[0]) + b00[0]; + g[15] = c0x[1] * (xkxl + cpx[1]) + b00[1]; + g[24] = 1; + g[25] = 1; + g[36] = c0y[0]; + g[37] = c0y[1]; + g[28] = cpy[0]; + g[29] = cpy[1]; + g[40] = cpy[0] * c0y[0] + b00[0]; + g[41] = cpy[1] * c0y[1] + b00[1]; + g[30] = cpy[0] * (ykyl + cpy[0]) + b01[0]; + g[31] = cpy[1] * (ykyl + cpy[1]) + b01[1]; + g[42] = g[40] * (ykyl + cpy[0]) + cpy[0] * b00[0] + b01[0] * c0y[0]; + g[43] = g[41] * (ykyl + cpy[1]) + cpy[1] * b00[1] + b01[1] * c0y[1]; + g[26] = ykyl + cpy[0]; + g[27] = ykyl + cpy[1]; + g[38] = c0y[0] * (ykyl + cpy[0]) + b00[0]; + g[39] = c0y[1] * (ykyl + cpy[1]) + b00[1]; + + + g[60] = c0z[0] * g[48]; + g[61] = c0z[1] * g[49]; + g[52] = cpz[0] * g[48]; + g[53] = cpz[1] * g[49]; + g[64] = cpz[0] * g[60] + b00[0] * g[48]; + g[65] = cpz[1] * g[61] + b00[1] * g[49]; + g[54] = g[52] * (zkzl + cpz[0]) + b01[0] * g[48]; + g[55] = g[53] * (zkzl + cpz[1]) + b01[1] * g[49]; + g[66] = g[64] * (zkzl + cpz[0]) + b01[0] * g[60] + b00[0] * g[52]; + g[67] = g[65] * (zkzl + cpz[1]) + b01[1] * g[61] + b00[1] * g[53]; + g[50] = g[48] * (zkzl + cpz[0]); + g[51] = g[49] * (zkzl + cpz[1]); + g[62] = g[60] * (zkzl + cpz[0]) + b00[0] * g[48]; + g[63] = g[61] * (zkzl + cpz[1]) + b00[1] * g[49]; +} + +static inline void _g0_2d4d_0120(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[6] = c0x[0]; + g[7] = c0x[1]; + g[4] = cpx[0] * cpx[0] + b01[0]; + g[5] = cpx[1] * cpx[1] + b01[1]; + g[8] = cpx[0] * c0x[0] + b00[0]; + g[9] = cpx[1] * c0x[1] + b00[1]; + g[10] = cpx[0] * (g[8] + b00[0]) + b01[0] * c0x[0]; + g[11] = cpx[1] * (g[9] + b00[1]) + b01[1] * c0x[1]; + g[12] = 1; + g[13] = 1; + g[14] = cpy[0]; + g[15] = cpy[1]; + g[18] = c0y[0]; + g[19] = c0y[1]; + g[16] = cpy[0] * cpy[0] + b01[0]; + g[17] = cpy[1] * cpy[1] + b01[1]; + g[20] = cpy[0] * c0y[0] + b00[0]; + g[21] = cpy[1] * c0y[1] + b00[1]; + g[22] = cpy[0] * (g[20] + b00[0]) + b01[0] * c0y[0]; + g[23] = cpy[1] * (g[21] + b00[1]) + b01[1] * c0y[1]; + + + g[26] = cpz[0] * g[24]; + g[27] = cpz[1] * g[25]; + g[30] = c0z[0] * g[24]; + g[31] = c0z[1] * g[25]; + g[28] = cpz[0] * g[26] + b01[0] * g[24]; + g[29] = cpz[1] * g[27] + b01[1] * g[25]; + g[32] = cpz[0] * g[30] + b00[0] * g[24]; + g[33] = cpz[1] * g[31] + b00[1] * g[25]; + g[34] = cpz[0] * g[32] + b01[0] * g[30] + b00[0] * g[26]; + g[35] = cpz[1] * g[33] + b01[1] * g[31] + b00[1] * g[27]; +} + +static inline void _g0_2d4d_0200(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = c0x[0] * c0x[0] + b10[0]; + g[5] = c0x[1] * c0x[1] + b10[1]; + g[6] = 1; + g[7] = 1; + g[8] = c0y[0]; + g[9] = c0y[1]; + g[10] = c0y[0] * c0y[0] + b10[0]; + g[11] = c0y[1] * c0y[1] + b10[1]; + + + g[14] = c0z[0] * g[12]; + g[15] = c0z[1] * g[13]; + g[16] = c0z[0] * g[14] + b10[0] * g[12]; + g[17] = c0z[1] * g[15] + b10[1] * g[13]; +} + +static inline void _g0_2d4d_0201(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[8] = c0x[0] * c0x[0] + b10[0]; + g[9] = c0x[1] * c0x[1] + b10[1]; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[6] = cpx[0] * c0x[0] + b00[0]; + g[7] = cpx[1] * c0x[1] + b00[1]; + g[10] = c0x[0] * (g[6] + b00[0]) + b10[0] * cpx[0]; + g[11] = c0x[1] * (g[7] + b00[1]) + b10[1] * cpx[1]; + g[12] = 1; + g[13] = 1; + g[16] = c0y[0]; + g[17] = c0y[1]; + g[20] = c0y[0] * c0y[0] + b10[0]; + g[21] = c0y[1] * c0y[1] + b10[1]; + g[14] = cpy[0]; + g[15] = cpy[1]; + g[18] = cpy[0] * c0y[0] + b00[0]; + g[19] = cpy[1] * c0y[1] + b00[1]; + g[22] = c0y[0] * (g[18] + b00[0]) + b10[0] * cpy[0]; + g[23] = c0y[1] * (g[19] + b00[1]) + b10[1] * cpy[1]; + + + g[28] = c0z[0] * g[24]; + g[29] = c0z[1] * g[25]; + g[32] = c0z[0] * g[28] + b10[0] * g[24]; + g[33] = c0z[1] * g[29] + b10[1] * g[25]; + g[26] = cpz[0] * g[24]; + g[27] = cpz[1] * g[25]; + g[30] = cpz[0] * g[28] + b00[0] * g[24]; + g[31] = cpz[1] * g[29] + b00[1] * g[25]; + g[34] = c0z[0] * g[30] + b10[0] * g[26] + b00[0] * g[28]; + g[35] = c0z[1] * g[31] + b10[1] * g[27] + b00[1] * g[29]; +} + +static inline void _g0_2d4d_0210(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = cpx[0] * c0x[0] + b00[0]; + g[7] = cpx[1] * c0x[1] + b00[1]; + g[8] = c0x[0] * c0x[0] + b10[0]; + g[9] = c0x[1] * c0x[1] + b10[1]; + g[10] = c0x[0] * (g[6] + b00[0]) + b10[0] * cpx[0]; + g[11] = c0x[1] * (g[7] + b00[1]) + b10[1] * cpx[1]; + g[12] = 1; + g[13] = 1; + g[14] = cpy[0]; + g[15] = cpy[1]; + g[16] = c0y[0]; + g[17] = c0y[1]; + g[18] = cpy[0] * c0y[0] + b00[0]; + g[19] = cpy[1] * c0y[1] + b00[1]; + g[20] = c0y[0] * c0y[0] + b10[0]; + g[21] = c0y[1] * c0y[1] + b10[1]; + g[22] = c0y[0] * (g[18] + b00[0]) + b10[0] * cpy[0]; + g[23] = c0y[1] * (g[19] + b00[1]) + b10[1] * cpy[1]; + + + g[26] = cpz[0] * g[24]; + g[27] = cpz[1] * g[25]; + g[28] = c0z[0] * g[24]; + g[29] = c0z[1] * g[25]; + g[30] = cpz[0] * g[28] + b00[0] * g[24]; + g[31] = cpz[1] * g[29] + b00[1] * g[25]; + g[32] = c0z[0] * g[28] + b10[0] * g[24]; + g[33] = c0z[1] * g[29] + b10[1] * g[25]; + g[34] = c0z[0] * g[30] + b10[0] * g[26] + b00[0] * g[28]; + g[35] = c0z[1] * g[31] + b10[1] * g[27] + b00[1] * g[29]; +} + +static inline void _g0_2d4d_0300(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = c0x[0] * c0x[0] + b10[0]; + g[5] = c0x[1] * c0x[1] + b10[1]; + g[6] = c0x[0] * (g[4] + 2 * b10[0]); + g[7] = c0x[1] * (g[5] + 2 * b10[1]); + g[8] = 1; + g[9] = 1; + g[10] = c0y[0]; + g[11] = c0y[1]; + g[12] = c0y[0] * c0y[0] + b10[0]; + g[13] = c0y[1] * c0y[1] + b10[1]; + g[14] = c0y[0] * (g[12] + 2 * b10[0]); + g[15] = c0y[1] * (g[13] + 2 * b10[1]); + + + g[18] = c0z[0] * g[16]; + g[19] = c0z[1] * g[17]; + g[20] = c0z[0] * g[18] + b10[0] * g[16]; + g[21] = c0z[1] * g[19] + b10[1] * g[17]; + g[22] = c0z[0] * g[20] + 2 * b10[0] * g[18]; + g[23] = c0z[1] * g[21] + 2 * b10[1] * g[19]; +} + +static inline void _g0_2d4d_1000(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + g[0] = 1; + g[1] = c0x[0]; + g[2] = 1; + g[3] = c0y[0]; + + g[5] = c0z[0] * g[4]; +} + +static inline void _g0_2d4d_1001(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[0] * c0x[0] + b00[0]; + g[7] = cpx[1] * c0x[1] + b00[1]; + g[8] = 1; + g[9] = 1; + g[10] = c0y[0]; + g[11] = c0y[1]; + g[12] = cpy[0]; + g[13] = cpy[1]; + g[14] = cpy[0] * c0y[0] + b00[0]; + g[15] = cpy[1] * c0y[1] + b00[1]; + + + g[18] = c0z[0] * g[16]; + g[19] = c0z[1] * g[17]; + g[20] = cpz[0] * g[16]; + g[21] = cpz[1] * g[17]; + g[22] = cpz[0] * g[18] + b00[0] * g[16]; + g[23] = cpz[1] * g[19] + b00[1] * g[17]; +} + +static inline void _g0_2d4d_1002(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[0] * c0x[0] + b00[0]; + g[7] = cpx[1] * c0x[1] + b00[1]; + g[8] = cpx[0] * cpx[0] + b01[0]; + g[9] = cpx[1] * cpx[1] + b01[1]; + g[10] = cpx[0] * (g[6] + b00[0]) + b01[0] * c0x[0]; + g[11] = cpx[1] * (g[7] + b00[1]) + b01[1] * c0x[1]; + g[12] = 1; + g[13] = 1; + g[14] = c0y[0]; + g[15] = c0y[1]; + g[16] = cpy[0]; + g[17] = cpy[1]; + g[18] = cpy[0] * c0y[0] + b00[0]; + g[19] = cpy[1] * c0y[1] + b00[1]; + g[20] = cpy[0] * cpy[0] + b01[0]; + g[21] = cpy[1] * cpy[1] + b01[1]; + g[22] = cpy[0] * (g[18] + b00[0]) + b01[0] * c0y[0]; + g[23] = cpy[1] * (g[19] + b00[1]) + b01[1] * c0y[1]; + + + g[26] = c0z[0] * g[24]; + g[27] = c0z[1] * g[25]; + g[28] = cpz[0] * g[24]; + g[29] = cpz[1] * g[25]; + g[30] = cpz[0] * g[26] + b00[0] * g[24]; + g[31] = cpz[1] * g[27] + b00[1] * g[25]; + g[32] = cpz[0] * g[28] + b01[0] * g[24]; + g[33] = cpz[1] * g[29] + b01[1] * g[25]; + g[34] = cpz[0] * g[30] + b01[0] * g[26] + b00[0] * g[28]; + g[35] = cpz[1] * g[31] + b01[1] * g[27] + b00[1] * g[29]; +} + +static inline void _g0_2d4d_1010(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[0] * c0x[0] + b00[0]; + g[7] = cpx[1] * c0x[1] + b00[1]; + g[8] = 1; + g[9] = 1; + g[10] = c0y[0]; + g[11] = c0y[1]; + g[12] = cpy[0]; + g[13] = cpy[1]; + g[14] = cpy[0] * c0y[0] + b00[0]; + g[15] = cpy[1] * c0y[1] + b00[1]; + + + g[18] = c0z[0] * g[16]; + g[19] = c0z[1] * g[17]; + g[20] = cpz[0] * g[16]; + g[21] = cpz[1] * g[17]; + g[22] = cpz[0] * g[18] + b00[0] * g[16]; + g[23] = cpz[1] * g[19] + b00[1] * g[17]; +} + +static inline void _g0_2d4d_1011(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b01 = bc->b01; + dtype xkxl = envs->rkrl[0]; + dtype ykyl = envs->rkrl[1]; + dtype zkzl = envs->rkrl[2]; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[8] = cpx[0]; + g[9] = cpx[1]; + g[10] = cpx[0] * c0x[0] + b00[0]; + g[11] = cpx[1] * c0x[1] + b00[1]; + g[12] = cpx[0] * (xkxl + cpx[0]) + b01[0]; + g[13] = cpx[1] * (xkxl + cpx[1]) + b01[1]; + g[14] = g[10] * (xkxl + cpx[0]) + cpx[0] * b00[0] + b01[0] * c0x[0]; + g[15] = g[11] * (xkxl + cpx[1]) + cpx[1] * b00[1] + b01[1] * c0x[1]; + g[4] = xkxl + cpx[0]; + g[5] = xkxl + cpx[1]; + g[6] = c0x[0] * (xkxl + cpx[0]) + b00[0]; + g[7] = c0x[1] * (xkxl + cpx[1]) + b00[1]; + g[24] = 1; + g[25] = 1; + g[26] = c0y[0]; + g[27] = c0y[1]; + g[32] = cpy[0]; + g[33] = cpy[1]; + g[34] = cpy[0] * c0y[0] + b00[0]; + g[35] = cpy[1] * c0y[1] + b00[1]; + g[36] = cpy[0] * (ykyl + cpy[0]) + b01[0]; + g[37] = cpy[1] * (ykyl + cpy[1]) + b01[1]; + g[38] = g[34] * (ykyl + cpy[0]) + cpy[0] * b00[0] + b01[0] * c0y[0]; + g[39] = g[35] * (ykyl + cpy[1]) + cpy[1] * b00[1] + b01[1] * c0y[1]; + g[28] = ykyl + cpy[0]; + g[29] = ykyl + cpy[1]; + g[30] = c0y[0] * (ykyl + cpy[0]) + b00[0]; + g[31] = c0y[1] * (ykyl + cpy[1]) + b00[1]; + + + g[50] = c0z[0] * g[48]; + g[51] = c0z[1] * g[49]; + g[56] = cpz[0] * g[48]; + g[57] = cpz[1] * g[49]; + g[58] = cpz[0] * g[50] + b00[0] * g[48]; + g[59] = cpz[1] * g[51] + b00[1] * g[49]; + g[60] = g[56] * (zkzl + cpz[0]) + b01[0] * g[48]; + g[61] = g[57] * (zkzl + cpz[1]) + b01[1] * g[49]; + g[62] = g[58] * (zkzl + cpz[0]) + b01[0] * g[50] + b00[0] * g[56]; + g[63] = g[59] * (zkzl + cpz[1]) + b01[1] * g[51] + b00[1] * g[57]; + g[52] = g[48] * (zkzl + cpz[0]); + g[53] = g[49] * (zkzl + cpz[1]); + g[54] = g[50] * (zkzl + cpz[0]) + b00[0] * g[48]; + g[55] = g[51] * (zkzl + cpz[1]) + b00[1] * g[49]; +} + +static inline void _g0_2d4d_1020(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[0] * c0x[0] + b00[0]; + g[7] = cpx[1] * c0x[1] + b00[1]; + g[8] = cpx[0] * cpx[0] + b01[0]; + g[9] = cpx[1] * cpx[1] + b01[1]; + g[10] = cpx[0] * (g[6] + b00[0]) + b01[0] * c0x[0]; + g[11] = cpx[1] * (g[7] + b00[1]) + b01[1] * c0x[1]; + g[12] = 1; + g[13] = 1; + g[14] = c0y[0]; + g[15] = c0y[1]; + g[16] = cpy[0]; + g[17] = cpy[1]; + g[18] = cpy[0] * c0y[0] + b00[0]; + g[19] = cpy[1] * c0y[1] + b00[1]; + g[20] = cpy[0] * cpy[0] + b01[0]; + g[21] = cpy[1] * cpy[1] + b01[1]; + g[22] = cpy[0] * (g[18] + b00[0]) + b01[0] * c0y[0]; + g[23] = cpy[1] * (g[19] + b00[1]) + b01[1] * c0y[1]; + + + g[26] = c0z[0] * g[24]; + g[27] = c0z[1] * g[25]; + g[28] = cpz[0] * g[24]; + g[29] = cpz[1] * g[25]; + g[30] = cpz[0] * g[26] + b00[0] * g[24]; + g[31] = cpz[1] * g[27] + b00[1] * g[25]; + g[32] = cpz[0] * g[28] + b01[0] * g[24]; + g[33] = cpz[1] * g[29] + b01[1] * g[25]; + g[34] = cpz[0] * g[30] + b01[0] * g[26] + b00[0] * g[28]; + g[35] = cpz[1] * g[31] + b01[1] * g[27] + b00[1] * g[29]; +} + +static inline void _g0_2d4d_1100(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + dtype xixj = envs->rirj[0]; + dtype yiyj = envs->rirj[1]; + dtype zizj = envs->rirj[2]; + g[0] = 1; + g[1] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[0] * (xixj + c0x[0]) + b10[0]; + g[7] = c0x[1] * (xixj + c0x[1]) + b10[1]; + g[2] = xixj + c0x[0]; + g[3] = xixj + c0x[1]; + g[12] = 1; + g[13] = 1; + g[16] = c0y[0]; + g[17] = c0y[1]; + g[18] = c0y[0] * (yiyj + c0y[0]) + b10[0]; + g[19] = c0y[1] * (yiyj + c0y[1]) + b10[1]; + g[14] = yiyj + c0y[0]; + g[15] = yiyj + c0y[1]; + + + g[28] = c0z[0] * g[24]; + g[29] = c0z[1] * g[25]; + g[30] = g[28] * (zizj + c0z[0]) + b10[0] * g[24]; + g[31] = g[29] * (zizj + c0z[1]) + b10[1] * g[25]; + g[26] = g[24] * (zizj + c0z[0]); + g[27] = g[25] * (zizj + c0z[1]); +} + +static inline void _g0_2d4d_1101(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b10 = bc->b10; + dtype xixj = envs->rirj[0]; + dtype yiyj = envs->rirj[1]; + dtype zizj = envs->rirj[2]; + g[0] = 1; + g[1] = 1; + g[8] = c0x[0]; + g[9] = c0x[1]; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[12] = cpx[0] * c0x[0] + b00[0]; + g[13] = cpx[1] * c0x[1] + b00[1]; + g[10] = c0x[0] * (xixj + c0x[0]) + b10[0]; + g[11] = c0x[1] * (xixj + c0x[1]) + b10[1]; + g[2] = xixj + c0x[0]; + g[3] = xixj + c0x[1]; + g[14] = g[12] * (xixj + c0x[0]) + c0x[0] * b00[0] + b10[0] * cpx[0]; + g[15] = g[13] * (xixj + c0x[1]) + c0x[1] * b00[1] + b10[1] * cpx[1]; + g[6] = cpx[0] * (xixj + c0x[0]) + b00[0]; + g[7] = cpx[1] * (xixj + c0x[1]) + b00[1]; + g[24] = 1; + g[25] = 1; + g[32] = c0y[0]; + g[33] = c0y[1]; + g[28] = cpy[0]; + g[29] = cpy[1]; + g[36] = cpy[0] * c0y[0] + b00[0]; + g[37] = cpy[1] * c0y[1] + b00[1]; + g[34] = c0y[0] * (yiyj + c0y[0]) + b10[0]; + g[35] = c0y[1] * (yiyj + c0y[1]) + b10[1]; + g[26] = yiyj + c0y[0]; + g[27] = yiyj + c0y[1]; + g[38] = g[36] * (yiyj + c0y[0]) + c0y[0] * b00[0] + b10[0] * cpy[0]; + g[39] = g[37] * (yiyj + c0y[1]) + c0y[1] * b00[1] + b10[1] * cpy[1]; + g[30] = cpy[0] * (yiyj + c0y[0]) + b00[0]; + g[31] = cpy[1] * (yiyj + c0y[1]) + b00[1]; + + + g[56] = c0z[0] * g[48]; + g[57] = c0z[1] * g[49]; + g[52] = cpz[0] * g[48]; + g[53] = cpz[1] * g[49]; + g[60] = cpz[0] * g[56] + b00[0] * g[48]; + g[61] = cpz[1] * g[57] + b00[1] * g[49]; + g[58] = g[56] * (zizj + c0z[0]) + b10[0] * g[48]; + g[59] = g[57] * (zizj + c0z[1]) + b10[1] * g[49]; + g[50] = g[48] * (zizj + c0z[0]); + g[51] = g[49] * (zizj + c0z[1]); + g[62] = g[60] * (zizj + c0z[0]) + b10[0] * g[52] + b00[0] * g[56]; + g[63] = g[61] * (zizj + c0z[1]) + b10[1] * g[53] + b00[1] * g[57]; + g[54] = zizj * g[52] + cpz[0] * g[56] + b00[0] * g[48]; + g[55] = zizj * g[53] + cpz[1] * g[57] + b00[1] * g[49]; +} + +static inline void _g0_2d4d_1110(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b10 = bc->b10; + dtype xixj = envs->rirj[0]; + dtype yiyj = envs->rirj[1]; + dtype zizj = envs->rirj[2]; + g[0] = 1; + g[1] = 1; + g[8] = c0x[0]; + g[9] = c0x[1]; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[12] = cpx[0] * c0x[0] + b00[0]; + g[13] = cpx[1] * c0x[1] + b00[1]; + g[10] = c0x[0] * (xixj + c0x[0]) + b10[0]; + g[11] = c0x[1] * (xixj + c0x[1]) + b10[1]; + g[2] = xixj + c0x[0]; + g[3] = xixj + c0x[1]; + g[14] = g[12] * (xixj + c0x[0]) + c0x[0] * b00[0] + b10[0] * cpx[0]; + g[15] = g[13] * (xixj + c0x[1]) + c0x[1] * b00[1] + b10[1] * cpx[1]; + g[6] = cpx[0] * (xixj + c0x[0]) + b00[0]; + g[7] = cpx[1] * (xixj + c0x[1]) + b00[1]; + g[24] = 1; + g[25] = 1; + g[32] = c0y[0]; + g[33] = c0y[1]; + g[28] = cpy[0]; + g[29] = cpy[1]; + g[36] = cpy[0] * c0y[0] + b00[0]; + g[37] = cpy[1] * c0y[1] + b00[1]; + g[34] = c0y[0] * (yiyj + c0y[0]) + b10[0]; + g[35] = c0y[1] * (yiyj + c0y[1]) + b10[1]; + g[26] = yiyj + c0y[0]; + g[27] = yiyj + c0y[1]; + g[38] = g[36] * (yiyj + c0y[0]) + c0y[0] * b00[0] + b10[0] * cpy[0]; + g[39] = g[37] * (yiyj + c0y[1]) + c0y[1] * b00[1] + b10[1] * cpy[1]; + g[30] = cpy[0] * (yiyj + c0y[0]) + b00[0]; + g[31] = cpy[1] * (yiyj + c0y[1]) + b00[1]; + + + g[56] = c0z[0] * g[48]; + g[57] = c0z[1] * g[49]; + g[52] = cpz[0] * g[48]; + g[53] = cpz[1] * g[49]; + g[60] = cpz[0] * g[56] + b00[0] * g[48]; + g[61] = cpz[1] * g[57] + b00[1] * g[49]; + g[58] = g[56] * (zizj + c0z[0]) + b10[0] * g[48]; + g[59] = g[57] * (zizj + c0z[1]) + b10[1] * g[49]; + g[50] = g[48] * (zizj + c0z[0]); + g[51] = g[49] * (zizj + c0z[1]); + g[62] = g[60] * (zizj + c0z[0]) + b10[0] * g[52] + b00[0] * g[56]; + g[63] = g[61] * (zizj + c0z[1]) + b10[1] * g[53] + b00[1] * g[57]; + g[54] = zizj * g[52] + cpz[0] * g[56] + b00[0] * g[48]; + g[55] = zizj * g[53] + cpz[1] * g[57] + b00[1] * g[49]; +} + +static inline void _g0_2d4d_1200(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + dtype xixj = envs->rirj[0]; + dtype yiyj = envs->rirj[1]; + dtype zizj = envs->rirj[2]; + g[0] = 1; + g[1] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[8] = c0x[0] * c0x[0] + b10[0]; + g[9] = c0x[1] * c0x[1] + b10[1]; + g[10] = g[8] * (xixj + c0x[0]) + c0x[0] * 2 * b10[0]; + g[11] = g[9] * (xixj + c0x[1]) + c0x[1] * 2 * b10[1]; + g[6] = c0x[0] * (xixj + c0x[0]) + b10[0]; + g[7] = c0x[1] * (xixj + c0x[1]) + b10[1]; + g[2] = xixj + c0x[0]; + g[3] = xixj + c0x[1]; + g[16] = 1; + g[17] = 1; + g[20] = c0y[0]; + g[21] = c0y[1]; + g[24] = c0y[0] * c0y[0] + b10[0]; + g[25] = c0y[1] * c0y[1] + b10[1]; + g[26] = g[24] * (yiyj + c0y[0]) + c0y[0] * 2 * b10[0]; + g[27] = g[25] * (yiyj + c0y[1]) + c0y[1] * 2 * b10[1]; + g[22] = c0y[0] * (yiyj + c0y[0]) + b10[0]; + g[23] = c0y[1] * (yiyj + c0y[1]) + b10[1]; + g[18] = yiyj + c0y[0]; + g[19] = yiyj + c0y[1]; + + + g[36] = c0z[0] * g[32]; + g[37] = c0z[1] * g[33]; + g[40] = c0z[0] * g[36] + b10[0] * g[32]; + g[41] = c0z[1] * g[37] + b10[1] * g[33]; + g[42] = g[40] * (zizj + c0z[0]) + 2 * b10[0] * g[36]; + g[43] = g[41] * (zizj + c0z[1]) + 2 * b10[1] * g[37]; + g[38] = g[36] * (zizj + c0z[0]) + b10[0] * g[32]; + g[39] = g[37] * (zizj + c0z[1]) + b10[1] * g[33]; + g[34] = g[32] * (zizj + c0z[0]); + g[35] = g[33] * (zizj + c0z[1]); +} + +static inline void _g0_2d4d_2000(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = c0x[0] * c0x[0] + b10[0]; + g[5] = c0x[1] * c0x[1] + b10[1]; + g[6] = 1; + g[7] = 1; + g[8] = c0y[0]; + g[9] = c0y[1]; + g[10] = c0y[0] * c0y[0] + b10[0]; + g[11] = c0y[1] * c0y[1] + b10[1]; + + + g[14] = c0z[0] * g[12]; + g[15] = c0z[1] * g[13]; + g[16] = c0z[0] * g[14] + b10[0] * g[12]; + g[17] = c0z[1] * g[15] + b10[1] * g[13]; +} + +static inline void _g0_2d4d_2001(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = c0x[0] * c0x[0] + b10[0]; + g[5] = c0x[1] * c0x[1] + b10[1]; + g[6] = cpx[0]; + g[7] = cpx[1]; + g[8] = cpx[0] * c0x[0] + b00[0]; + g[9] = cpx[1] * c0x[1] + b00[1]; + g[10] = c0x[0] * (g[8] + b00[0]) + b10[0] * cpx[0]; + g[11] = c0x[1] * (g[9] + b00[1]) + b10[1] * cpx[1]; + g[12] = 1; + g[13] = 1; + g[14] = c0y[0]; + g[15] = c0y[1]; + g[16] = c0y[0] * c0y[0] + b10[0]; + g[17] = c0y[1] * c0y[1] + b10[1]; + g[18] = cpy[0]; + g[19] = cpy[1]; + g[20] = cpy[0] * c0y[0] + b00[0]; + g[21] = cpy[1] * c0y[1] + b00[1]; + g[22] = c0y[0] * (g[20] + b00[0]) + b10[0] * cpy[0]; + g[23] = c0y[1] * (g[21] + b00[1]) + b10[1] * cpy[1]; + + + g[26] = c0z[0] * g[24]; + g[27] = c0z[1] * g[25]; + g[28] = c0z[0] * g[26] + b10[0] * g[24]; + g[29] = c0z[1] * g[27] + b10[1] * g[25]; + g[30] = cpz[0] * g[24]; + g[31] = cpz[1] * g[25]; + g[32] = cpz[0] * g[26] + b00[0] * g[24]; + g[33] = cpz[1] * g[27] + b00[1] * g[25]; + g[34] = c0z[0] * g[32] + b10[0] * g[30] + b00[0] * g[26]; + g[35] = c0z[1] * g[33] + b10[1] * g[31] + b00[1] * g[27]; +} + +static inline void _g0_2d4d_2010(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = c0x[0] * c0x[0] + b10[0]; + g[5] = c0x[1] * c0x[1] + b10[1]; + g[6] = cpx[0]; + g[7] = cpx[1]; + g[8] = cpx[0] * c0x[0] + b00[0]; + g[9] = cpx[1] * c0x[1] + b00[1]; + g[10] = c0x[0] * (g[8] + b00[0]) + b10[0] * cpx[0]; + g[11] = c0x[1] * (g[9] + b00[1]) + b10[1] * cpx[1]; + g[12] = 1; + g[13] = 1; + g[14] = c0y[0]; + g[15] = c0y[1]; + g[16] = c0y[0] * c0y[0] + b10[0]; + g[17] = c0y[1] * c0y[1] + b10[1]; + g[18] = cpy[0]; + g[19] = cpy[1]; + g[20] = cpy[0] * c0y[0] + b00[0]; + g[21] = cpy[1] * c0y[1] + b00[1]; + g[22] = c0y[0] * (g[20] + b00[0]) + b10[0] * cpy[0]; + g[23] = c0y[1] * (g[21] + b00[1]) + b10[1] * cpy[1]; + + + g[26] = c0z[0] * g[24]; + g[27] = c0z[1] * g[25]; + g[28] = c0z[0] * g[26] + b10[0] * g[24]; + g[29] = c0z[1] * g[27] + b10[1] * g[25]; + g[30] = cpz[0] * g[24]; + g[31] = cpz[1] * g[25]; + g[32] = cpz[0] * g[26] + b00[0] * g[24]; + g[33] = cpz[1] * g[27] + b00[1] * g[25]; + g[34] = c0z[0] * g[32] + b10[0] * g[30] + b00[0] * g[26]; + g[35] = c0z[1] * g[33] + b10[1] * g[31] + b00[1] * g[27]; +} + +static inline void _g0_2d4d_2100(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + dtype xixj = envs->rirj[0]; + dtype yiyj = envs->rirj[1]; + dtype zizj = envs->rirj[2]; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = c0x[0] * c0x[0] + b10[0]; + g[5] = c0x[1] * c0x[1] + b10[1]; + g[12] = g[4] * (xixj + c0x[0]) + c0x[0] * 2 * b10[0]; + g[13] = g[5] * (xixj + c0x[1]) + c0x[1] * 2 * b10[1]; + g[10] = c0x[0] * (xixj + c0x[0]) + b10[0]; + g[11] = c0x[1] * (xixj + c0x[1]) + b10[1]; + g[8] = xixj + c0x[0]; + g[9] = xixj + c0x[1]; + g[16] = 1; + g[17] = 1; + g[18] = c0y[0]; + g[19] = c0y[1]; + g[20] = c0y[0] * c0y[0] + b10[0]; + g[21] = c0y[1] * c0y[1] + b10[1]; + g[28] = g[20] * (yiyj + c0y[0]) + c0y[0] * 2 * b10[0]; + g[29] = g[21] * (yiyj + c0y[1]) + c0y[1] * 2 * b10[1]; + g[26] = c0y[0] * (yiyj + c0y[0]) + b10[0]; + g[27] = c0y[1] * (yiyj + c0y[1]) + b10[1]; + g[24] = yiyj + c0y[0]; + g[25] = yiyj + c0y[1]; + + + g[34] = c0z[0] * g[32]; + g[35] = c0z[1] * g[33]; + g[36] = c0z[0] * g[34] + b10[0] * g[32]; + g[37] = c0z[1] * g[35] + b10[1] * g[33]; + g[44] = g[36] * (zizj + c0z[0]) + 2 * b10[0] * g[34]; + g[45] = g[37] * (zizj + c0z[1]) + 2 * b10[1] * g[35]; + g[42] = g[34] * (zizj + c0z[0]) + b10[0] * g[32]; + g[43] = g[35] * (zizj + c0z[1]) + b10[1] * g[33]; + g[40] = g[32] * (zizj + c0z[0]); + g[41] = g[33] * (zizj + c0z[1]); +} + +static inline void _g0_2d4d_3000(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = c0x[0] * c0x[0] + b10[0]; + g[5] = c0x[1] * c0x[1] + b10[1]; + g[6] = c0x[0] * (g[4] + 2 * b10[0]); + g[7] = c0x[1] * (g[5] + 2 * b10[1]); + g[8] = 1; + g[9] = 1; + g[10] = c0y[0]; + g[11] = c0y[1]; + g[12] = c0y[0] * c0y[0] + b10[0]; + g[13] = c0y[1] * c0y[1] + b10[1]; + g[14] = c0y[0] * (g[12] + 2 * b10[0]); + g[15] = c0y[1] * (g[13] + 2 * b10[1]); + + + g[18] = c0z[0] * g[16]; + g[19] = c0z[1] * g[17]; + g[20] = c0z[0] * g[18] + b10[0] * g[16]; + g[21] = c0z[1] * g[19] + b10[1] * g[17]; + g[22] = c0z[0] * g[20] + 2 * b10[0] * g[18]; + g[23] = c0z[1] * g[21] + 2 * b10[1] * g[19]; +} + +void CINTg0_2e_2d4d_unrolled(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + int type_ijkl = ((envs->li_ceil << 6) | (envs->lj_ceil << 4) | + (envs->lk_ceil << 2) | (envs->ll_ceil)); + switch (type_ijkl) { + case 0b00000000: _g0_2d4d_0000(g, bc, envs); return; + case 0b00000001: _g0_2d4d_0001(g, bc, envs); return; + case 0b00000010: _g0_2d4d_0002(g, bc, envs); return; + case 0b00000011: _g0_2d4d_0003(g, bc, envs); return; + case 0b00000100: _g0_2d4d_0010(g, bc, envs); return; + case 0b00000101: _g0_2d4d_0011(g, bc, envs); return; + case 0b00000110: _g0_2d4d_0012(g, bc, envs); return; + case 0b00001000: _g0_2d4d_0020(g, bc, envs); return; + case 0b00001001: _g0_2d4d_0021(g, bc, envs); return; + case 0b00001100: _g0_2d4d_0030(g, bc, envs); return; + case 0b00010000: _g0_2d4d_0100(g, bc, envs); return; + case 0b00010001: _g0_2d4d_0101(g, bc, envs); return; + case 0b00010010: _g0_2d4d_0102(g, bc, envs); return; + case 0b00010100: _g0_2d4d_0110(g, bc, envs); return; + case 0b00010101: _g0_2d4d_0111(g, bc, envs); return; + case 0b00011000: _g0_2d4d_0120(g, bc, envs); return; + case 0b00100000: _g0_2d4d_0200(g, bc, envs); return; + case 0b00100001: _g0_2d4d_0201(g, bc, envs); return; + case 0b00100100: _g0_2d4d_0210(g, bc, envs); return; + case 0b00110000: _g0_2d4d_0300(g, bc, envs); return; + case 0b01000000: _g0_2d4d_1000(g, bc, envs); return; + case 0b01000001: _g0_2d4d_1001(g, bc, envs); return; + case 0b01000010: _g0_2d4d_1002(g, bc, envs); return; + case 0b01000100: _g0_2d4d_1010(g, bc, envs); return; + case 0b01000101: _g0_2d4d_1011(g, bc, envs); return; + case 0b01001000: _g0_2d4d_1020(g, bc, envs); return; + case 0b01010000: _g0_2d4d_1100(g, bc, envs); return; + case 0b01010001: _g0_2d4d_1101(g, bc, envs); return; + case 0b01010100: _g0_2d4d_1110(g, bc, envs); return; + case 0b01100000: _g0_2d4d_1200(g, bc, envs); return; + case 0b10000000: _g0_2d4d_2000(g, bc, envs); return; + case 0b10000001: _g0_2d4d_2001(g, bc, envs); return; + case 0b10000100: _g0_2d4d_2010(g, bc, envs); return; + case 0b10010000: _g0_2d4d_2100(g, bc, envs); return; + case 0b11000000: _g0_2d4d_3000(g, bc, envs); return; + } + //fprintf(stderr, "Dimension error for CINTg0_2e_lj2d4d: iklj = %d %d %d %d", + // (int)envs->li_ceil, (int)envs->lk_ceil, + // (int)envs->ll_ceil, (int)envs->lj_ceil); +} + +static inline void _srg0_2d4d_0000(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + + +} + +static inline void _srg0_2d4d_0001(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + g[0] = 1; + g[1] = 1; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[4] = 1; + g[5] = 1; + g[6] = cpy[0]; + g[7] = cpy[1]; + + + g[10] = cpz[0] * g[8]; + g[11] = cpz[1] * g[9]; +} + +static inline void _srg0_2d4d_0002(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[2]; + g[7] = cpx[3]; + g[8] = cpx[0] * cpx[0] + b01[0]; + g[9] = cpx[1] * cpx[1] + b01[1]; + g[10] = cpx[2] * cpx[2] + b01[2]; + g[11] = cpx[3] * cpx[3] + b01[3]; + g[12] = 1; + g[13] = 1; + g[14] = 1; + g[15] = 1; + g[16] = cpy[0]; + g[17] = cpy[1]; + g[18] = cpy[2]; + g[19] = cpy[3]; + g[20] = cpy[0] * cpy[0] + b01[0]; + g[21] = cpy[1] * cpy[1] + b01[1]; + g[22] = cpy[2] * cpy[2] + b01[2]; + g[23] = cpy[3] * cpy[3] + b01[3]; + + + + + g[28] = cpz[0] * g[24]; + g[29] = cpz[1] * g[25]; + g[30] = cpz[2] * g[26]; + g[31] = cpz[3] * g[27]; + g[32] = cpz[0] * g[28] + b01[0] * g[24]; + g[33] = cpz[1] * g[29] + b01[1] * g[25]; + g[34] = cpz[2] * g[30] + b01[2] * g[26]; + g[35] = cpz[3] * g[31] + b01[3] * g[27]; +} + +static inline void _srg0_2d4d_0003(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[2]; + g[7] = cpx[3]; + g[8] = cpx[0] * cpx[0] + b01[0]; + g[9] = cpx[1] * cpx[1] + b01[1]; + g[10] = cpx[2] * cpx[2] + b01[2]; + g[11] = cpx[3] * cpx[3] + b01[3]; + g[12] = cpx[0] * (g[8] + 2 * b01[0]); + g[13] = cpx[1] * (g[9] + 2 * b01[1]); + g[14] = cpx[2] * (g[10] + 2 * b01[2]); + g[15] = cpx[3] * (g[11] + 2 * b01[3]); + g[16] = 1; + g[17] = 1; + g[18] = 1; + g[19] = 1; + g[20] = cpy[0]; + g[21] = cpy[1]; + g[22] = cpy[2]; + g[23] = cpy[3]; + g[24] = cpy[0] * cpy[0] + b01[0]; + g[25] = cpy[1] * cpy[1] + b01[1]; + g[26] = cpy[2] * cpy[2] + b01[2]; + g[27] = cpy[3] * cpy[3] + b01[3]; + g[28] = cpy[0] * (g[24] + 2 * b01[0]); + g[29] = cpy[1] * (g[25] + 2 * b01[1]); + g[30] = cpy[2] * (g[26] + 2 * b01[2]); + g[31] = cpy[3] * (g[27] + 2 * b01[3]); + + + + + g[36] = cpz[0] * g[32]; + g[37] = cpz[1] * g[33]; + g[38] = cpz[2] * g[34]; + g[39] = cpz[3] * g[35]; + g[40] = cpz[0] * g[36] + b01[0] * g[32]; + g[41] = cpz[1] * g[37] + b01[1] * g[33]; + g[42] = cpz[2] * g[38] + b01[2] * g[34]; + g[43] = cpz[3] * g[39] + b01[3] * g[35]; + g[44] = cpz[0] * g[40] + 2 * b01[0] * g[36]; + g[45] = cpz[1] * g[41] + 2 * b01[1] * g[37]; + g[46] = cpz[2] * g[42] + 2 * b01[2] * g[38]; + g[47] = cpz[3] * g[43] + 2 * b01[3] * g[39]; +} + +static inline void _srg0_2d4d_0010(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + g[0] = 1; + g[1] = 1; + g[2] = cpx[0]; + g[3] = cpx[1]; + g[4] = 1; + g[5] = 1; + g[6] = cpy[0]; + g[7] = cpy[1]; + + + g[10] = cpz[0] * g[8]; + g[11] = cpz[1] * g[9]; +} + +static inline void _srg0_2d4d_0011(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + dtype xkxl = envs->rkrl[0]; + dtype ykyl = envs->rkrl[1]; + dtype zkzl = envs->rkrl[2]; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[8] = cpx[0]; + g[9] = cpx[1]; + g[10] = cpx[2]; + g[11] = cpx[3]; + g[12] = cpx[0] * (xkxl + cpx[0]) + b01[0]; + g[13] = cpx[1] * (xkxl + cpx[1]) + b01[1]; + g[14] = cpx[2] * (xkxl + cpx[2]) + b01[2]; + g[15] = cpx[3] * (xkxl + cpx[3]) + b01[3]; + g[4] = xkxl + cpx[0]; + g[5] = xkxl + cpx[1]; + g[6] = xkxl + cpx[2]; + g[7] = xkxl + cpx[3]; + g[24] = 1; + g[25] = 1; + g[26] = 1; + g[27] = 1; + g[32] = cpy[0]; + g[33] = cpy[1]; + g[34] = cpy[2]; + g[35] = cpy[3]; + g[36] = cpy[0] * (ykyl + cpy[0]) + b01[0]; + g[37] = cpy[1] * (ykyl + cpy[1]) + b01[1]; + g[38] = cpy[2] * (ykyl + cpy[2]) + b01[2]; + g[39] = cpy[3] * (ykyl + cpy[3]) + b01[3]; + g[28] = ykyl + cpy[0]; + g[29] = ykyl + cpy[1]; + g[30] = ykyl + cpy[2]; + g[31] = ykyl + cpy[3]; + + + + + g[56] = cpz[0] * g[48]; + g[57] = cpz[1] * g[49]; + g[58] = cpz[2] * g[50]; + g[59] = cpz[3] * g[51]; + g[60] = g[56] * (zkzl + cpz[0]) + b01[0] * g[48]; + g[61] = g[57] * (zkzl + cpz[1]) + b01[1] * g[49]; + g[62] = g[58] * (zkzl + cpz[2]) + b01[2] * g[50]; + g[63] = g[59] * (zkzl + cpz[3]) + b01[3] * g[51]; + g[52] = g[48] * (zkzl + cpz[0]); + g[53] = g[49] * (zkzl + cpz[1]); + g[54] = g[50] * (zkzl + cpz[2]); + g[55] = g[51] * (zkzl + cpz[3]); +} + +static inline void _srg0_2d4d_0012(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + dtype xkxl = envs->rkrl[0]; + dtype ykyl = envs->rkrl[1]; + dtype zkzl = envs->rkrl[2]; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[8] = cpx[0]; + g[9] = cpx[1]; + g[10] = cpx[2]; + g[11] = cpx[3]; + g[16] = cpx[0] * cpx[0] + b01[0]; + g[17] = cpx[1] * cpx[1] + b01[1]; + g[18] = cpx[2] * cpx[2] + b01[2]; + g[19] = cpx[3] * cpx[3] + b01[3]; + g[20] = g[16] * (xkxl + cpx[0]) + cpx[0] * 2 * b01[0]; + g[21] = g[17] * (xkxl + cpx[1]) + cpx[1] * 2 * b01[1]; + g[22] = g[18] * (xkxl + cpx[2]) + cpx[2] * 2 * b01[2]; + g[23] = g[19] * (xkxl + cpx[3]) + cpx[3] * 2 * b01[3]; + g[12] = cpx[0] * (xkxl + cpx[0]) + b01[0]; + g[13] = cpx[1] * (xkxl + cpx[1]) + b01[1]; + g[14] = cpx[2] * (xkxl + cpx[2]) + b01[2]; + g[15] = cpx[3] * (xkxl + cpx[3]) + b01[3]; + g[4] = xkxl + cpx[0]; + g[5] = xkxl + cpx[1]; + g[6] = xkxl + cpx[2]; + g[7] = xkxl + cpx[3]; + g[32] = 1; + g[33] = 1; + g[34] = 1; + g[35] = 1; + g[40] = cpy[0]; + g[41] = cpy[1]; + g[42] = cpy[2]; + g[43] = cpy[3]; + g[48] = cpy[0] * cpy[0] + b01[0]; + g[49] = cpy[1] * cpy[1] + b01[1]; + g[50] = cpy[2] * cpy[2] + b01[2]; + g[51] = cpy[3] * cpy[3] + b01[3]; + g[52] = g[48] * (ykyl + cpy[0]) + cpy[0] * 2 * b01[0]; + g[53] = g[49] * (ykyl + cpy[1]) + cpy[1] * 2 * b01[1]; + g[54] = g[50] * (ykyl + cpy[2]) + cpy[2] * 2 * b01[2]; + g[55] = g[51] * (ykyl + cpy[3]) + cpy[3] * 2 * b01[3]; + g[44] = cpy[0] * (ykyl + cpy[0]) + b01[0]; + g[45] = cpy[1] * (ykyl + cpy[1]) + b01[1]; + g[46] = cpy[2] * (ykyl + cpy[2]) + b01[2]; + g[47] = cpy[3] * (ykyl + cpy[3]) + b01[3]; + g[36] = ykyl + cpy[0]; + g[37] = ykyl + cpy[1]; + g[38] = ykyl + cpy[2]; + g[39] = ykyl + cpy[3]; + + + + + g[72] = cpz[0] * g[64]; + g[73] = cpz[1] * g[65]; + g[74] = cpz[2] * g[66]; + g[75] = cpz[3] * g[67]; + g[80] = cpz[0] * g[72] + b01[0] * g[64]; + g[81] = cpz[1] * g[73] + b01[1] * g[65]; + g[82] = cpz[2] * g[74] + b01[2] * g[66]; + g[83] = cpz[3] * g[75] + b01[3] * g[67]; + g[84] = g[80] * (zkzl + cpz[0]) + 2 * b01[0] * g[72]; + g[85] = g[81] * (zkzl + cpz[1]) + 2 * b01[1] * g[73]; + g[86] = g[82] * (zkzl + cpz[2]) + 2 * b01[2] * g[74]; + g[87] = g[83] * (zkzl + cpz[3]) + 2 * b01[3] * g[75]; + g[76] = g[72] * (zkzl + cpz[0]) + b01[0] * g[64]; + g[77] = g[73] * (zkzl + cpz[1]) + b01[1] * g[65]; + g[78] = g[74] * (zkzl + cpz[2]) + b01[2] * g[66]; + g[79] = g[75] * (zkzl + cpz[3]) + b01[3] * g[67]; + g[68] = g[64] * (zkzl + cpz[0]); + g[69] = g[65] * (zkzl + cpz[1]); + g[70] = g[66] * (zkzl + cpz[2]); + g[71] = g[67] * (zkzl + cpz[3]); +} + +static inline void _srg0_2d4d_0020(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[2]; + g[7] = cpx[3]; + g[8] = cpx[0] * cpx[0] + b01[0]; + g[9] = cpx[1] * cpx[1] + b01[1]; + g[10] = cpx[2] * cpx[2] + b01[2]; + g[11] = cpx[3] * cpx[3] + b01[3]; + g[12] = 1; + g[13] = 1; + g[14] = 1; + g[15] = 1; + g[16] = cpy[0]; + g[17] = cpy[1]; + g[18] = cpy[2]; + g[19] = cpy[3]; + g[20] = cpy[0] * cpy[0] + b01[0]; + g[21] = cpy[1] * cpy[1] + b01[1]; + g[22] = cpy[2] * cpy[2] + b01[2]; + g[23] = cpy[3] * cpy[3] + b01[3]; + + + + + g[28] = cpz[0] * g[24]; + g[29] = cpz[1] * g[25]; + g[30] = cpz[2] * g[26]; + g[31] = cpz[3] * g[27]; + g[32] = cpz[0] * g[28] + b01[0] * g[24]; + g[33] = cpz[1] * g[29] + b01[1] * g[25]; + g[34] = cpz[2] * g[30] + b01[2] * g[26]; + g[35] = cpz[3] * g[31] + b01[3] * g[27]; +} + +static inline void _srg0_2d4d_0021(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + dtype xkxl = envs->rkrl[0]; + dtype ykyl = envs->rkrl[1]; + dtype zkzl = envs->rkrl[2]; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[2]; + g[7] = cpx[3]; + g[8] = cpx[0] * cpx[0] + b01[0]; + g[9] = cpx[1] * cpx[1] + b01[1]; + g[10] = cpx[2] * cpx[2] + b01[2]; + g[11] = cpx[3] * cpx[3] + b01[3]; + g[16] = xkxl + cpx[0]; + g[17] = xkxl + cpx[1]; + g[18] = xkxl + cpx[2]; + g[19] = xkxl + cpx[3]; + g[20] = cpx[0] * (xkxl + cpx[0]) + b01[0]; + g[21] = cpx[1] * (xkxl + cpx[1]) + b01[1]; + g[22] = cpx[2] * (xkxl + cpx[2]) + b01[2]; + g[23] = cpx[3] * (xkxl + cpx[3]) + b01[3]; + g[24] = g[8] * (xkxl + cpx[0]) + cpx[0] * 2 * b01[0]; + g[25] = g[9] * (xkxl + cpx[1]) + cpx[1] * 2 * b01[1]; + g[26] = g[10] * (xkxl + cpx[2]) + cpx[2] * 2 * b01[2]; + g[27] = g[11] * (xkxl + cpx[3]) + cpx[3] * 2 * b01[3]; + g[32] = 1; + g[33] = 1; + g[34] = 1; + g[35] = 1; + g[36] = cpy[0]; + g[37] = cpy[1]; + g[38] = cpy[2]; + g[39] = cpy[3]; + g[40] = cpy[0] * cpy[0] + b01[0]; + g[41] = cpy[1] * cpy[1] + b01[1]; + g[42] = cpy[2] * cpy[2] + b01[2]; + g[43] = cpy[3] * cpy[3] + b01[3]; + g[48] = ykyl + cpy[0]; + g[49] = ykyl + cpy[1]; + g[50] = ykyl + cpy[2]; + g[51] = ykyl + cpy[3]; + g[52] = cpy[0] * (ykyl + cpy[0]) + b01[0]; + g[53] = cpy[1] * (ykyl + cpy[1]) + b01[1]; + g[54] = cpy[2] * (ykyl + cpy[2]) + b01[2]; + g[55] = cpy[3] * (ykyl + cpy[3]) + b01[3]; + g[56] = g[40] * (ykyl + cpy[0]) + cpy[0] * 2 * b01[0]; + g[57] = g[41] * (ykyl + cpy[1]) + cpy[1] * 2 * b01[1]; + g[58] = g[42] * (ykyl + cpy[2]) + cpy[2] * 2 * b01[2]; + g[59] = g[43] * (ykyl + cpy[3]) + cpy[3] * 2 * b01[3]; + + + + + g[68] = cpz[0] * g[64]; + g[69] = cpz[1] * g[65]; + g[70] = cpz[2] * g[66]; + g[71] = cpz[3] * g[67]; + g[72] = cpz[0] * g[68] + b01[0] * g[64]; + g[73] = cpz[1] * g[69] + b01[1] * g[65]; + g[74] = cpz[2] * g[70] + b01[2] * g[66]; + g[75] = cpz[3] * g[71] + b01[3] * g[67]; + g[80] = g[64] * (zkzl + cpz[0]); + g[81] = g[65] * (zkzl + cpz[1]); + g[82] = g[66] * (zkzl + cpz[2]); + g[83] = g[67] * (zkzl + cpz[3]); + g[84] = g[68] * (zkzl + cpz[0]) + b01[0] * g[64]; + g[85] = g[69] * (zkzl + cpz[1]) + b01[1] * g[65]; + g[86] = g[70] * (zkzl + cpz[2]) + b01[2] * g[66]; + g[87] = g[71] * (zkzl + cpz[3]) + b01[3] * g[67]; + g[88] = g[72] * (zkzl + cpz[0]) + 2 * b01[0] * g[68]; + g[89] = g[73] * (zkzl + cpz[1]) + 2 * b01[1] * g[69]; + g[90] = g[74] * (zkzl + cpz[2]) + 2 * b01[2] * g[70]; + g[91] = g[75] * (zkzl + cpz[3]) + 2 * b01[3] * g[71]; +} + +static inline void _srg0_2d4d_0030(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[2]; + g[7] = cpx[3]; + g[8] = cpx[0] * cpx[0] + b01[0]; + g[9] = cpx[1] * cpx[1] + b01[1]; + g[10] = cpx[2] * cpx[2] + b01[2]; + g[11] = cpx[3] * cpx[3] + b01[3]; + g[12] = cpx[0] * (g[8] + 2 * b01[0]); + g[13] = cpx[1] * (g[9] + 2 * b01[1]); + g[14] = cpx[2] * (g[10] + 2 * b01[2]); + g[15] = cpx[3] * (g[11] + 2 * b01[3]); + g[16] = 1; + g[17] = 1; + g[18] = 1; + g[19] = 1; + g[20] = cpy[0]; + g[21] = cpy[1]; + g[22] = cpy[2]; + g[23] = cpy[3]; + g[24] = cpy[0] * cpy[0] + b01[0]; + g[25] = cpy[1] * cpy[1] + b01[1]; + g[26] = cpy[2] * cpy[2] + b01[2]; + g[27] = cpy[3] * cpy[3] + b01[3]; + g[28] = cpy[0] * (g[24] + 2 * b01[0]); + g[29] = cpy[1] * (g[25] + 2 * b01[1]); + g[30] = cpy[2] * (g[26] + 2 * b01[2]); + g[31] = cpy[3] * (g[27] + 2 * b01[3]); + + + + + g[36] = cpz[0] * g[32]; + g[37] = cpz[1] * g[33]; + g[38] = cpz[2] * g[34]; + g[39] = cpz[3] * g[35]; + g[40] = cpz[0] * g[36] + b01[0] * g[32]; + g[41] = cpz[1] * g[37] + b01[1] * g[33]; + g[42] = cpz[2] * g[38] + b01[2] * g[34]; + g[43] = cpz[3] * g[39] + b01[3] * g[35]; + g[44] = cpz[0] * g[40] + 2 * b01[0] * g[36]; + g[45] = cpz[1] * g[41] + 2 * b01[1] * g[37]; + g[46] = cpz[2] * g[42] + 2 * b01[2] * g[38]; + g[47] = cpz[3] * g[43] + 2 * b01[3] * g[39]; +} + +static inline void _srg0_2d4d_0100(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = 1; + g[5] = 1; + g[6] = c0y[0]; + g[7] = c0y[1]; + + + g[10] = c0z[0] * g[8]; + g[11] = c0z[1] * g[9]; +} + +static inline void _srg0_2d4d_0101(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[2]; + g[7] = cpx[3]; + g[8] = c0x[0]; + g[9] = c0x[1]; + g[10] = c0x[2]; + g[11] = c0x[3]; + g[12] = cpx[0] * c0x[0] + b00[0]; + g[13] = cpx[1] * c0x[1] + b00[1]; + g[14] = cpx[2] * c0x[2] + b00[2]; + g[15] = cpx[3] * c0x[3] + b00[3]; + g[16] = 1; + g[17] = 1; + g[18] = 1; + g[19] = 1; + g[20] = cpy[0]; + g[21] = cpy[1]; + g[22] = cpy[2]; + g[23] = cpy[3]; + g[24] = c0y[0]; + g[25] = c0y[1]; + g[26] = c0y[2]; + g[27] = c0y[3]; + g[28] = cpy[0] * c0y[0] + b00[0]; + g[29] = cpy[1] * c0y[1] + b00[1]; + g[30] = cpy[2] * c0y[2] + b00[2]; + g[31] = cpy[3] * c0y[3] + b00[3]; + + + + + g[36] = cpz[0] * g[32]; + g[37] = cpz[1] * g[33]; + g[38] = cpz[2] * g[34]; + g[39] = cpz[3] * g[35]; + g[40] = c0z[0] * g[32]; + g[41] = c0z[1] * g[33]; + g[42] = c0z[2] * g[34]; + g[43] = c0z[3] * g[35]; + g[44] = cpz[0] * g[40] + b00[0] * g[32]; + g[45] = cpz[1] * g[41] + b00[1] * g[33]; + g[46] = cpz[2] * g[42] + b00[2] * g[34]; + g[47] = cpz[3] * g[43] + b00[3] * g[35]; +} + +static inline void _srg0_2d4d_0102(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[2]; + g[7] = cpx[3]; + g[12] = c0x[0]; + g[13] = c0x[1]; + g[14] = c0x[2]; + g[15] = c0x[3]; + g[8] = cpx[0] * cpx[0] + b01[0]; + g[9] = cpx[1] * cpx[1] + b01[1]; + g[10] = cpx[2] * cpx[2] + b01[2]; + g[11] = cpx[3] * cpx[3] + b01[3]; + g[16] = cpx[0] * c0x[0] + b00[0]; + g[17] = cpx[1] * c0x[1] + b00[1]; + g[18] = cpx[2] * c0x[2] + b00[2]; + g[19] = cpx[3] * c0x[3] + b00[3]; + g[20] = cpx[0] * (g[16] + b00[0]) + b01[0] * c0x[0]; + g[21] = cpx[1] * (g[17] + b00[1]) + b01[1] * c0x[1]; + g[22] = cpx[2] * (g[18] + b00[2]) + b01[2] * c0x[2]; + g[23] = cpx[3] * (g[19] + b00[3]) + b01[3] * c0x[3]; + g[24] = 1; + g[25] = 1; + g[26] = 1; + g[27] = 1; + g[28] = cpy[0]; + g[29] = cpy[1]; + g[30] = cpy[2]; + g[31] = cpy[3]; + g[36] = c0y[0]; + g[37] = c0y[1]; + g[38] = c0y[2]; + g[39] = c0y[3]; + g[32] = cpy[0] * cpy[0] + b01[0]; + g[33] = cpy[1] * cpy[1] + b01[1]; + g[34] = cpy[2] * cpy[2] + b01[2]; + g[35] = cpy[3] * cpy[3] + b01[3]; + g[40] = cpy[0] * c0y[0] + b00[0]; + g[41] = cpy[1] * c0y[1] + b00[1]; + g[42] = cpy[2] * c0y[2] + b00[2]; + g[43] = cpy[3] * c0y[3] + b00[3]; + g[44] = cpy[0] * (g[40] + b00[0]) + b01[0] * c0y[0]; + g[45] = cpy[1] * (g[41] + b00[1]) + b01[1] * c0y[1]; + g[46] = cpy[2] * (g[42] + b00[2]) + b01[2] * c0y[2]; + g[47] = cpy[3] * (g[43] + b00[3]) + b01[3] * c0y[3]; + + + + + g[52] = cpz[0] * g[48]; + g[53] = cpz[1] * g[49]; + g[54] = cpz[2] * g[50]; + g[55] = cpz[3] * g[51]; + g[60] = c0z[0] * g[48]; + g[61] = c0z[1] * g[49]; + g[62] = c0z[2] * g[50]; + g[63] = c0z[3] * g[51]; + g[56] = cpz[0] * g[52] + b01[0] * g[48]; + g[57] = cpz[1] * g[53] + b01[1] * g[49]; + g[58] = cpz[2] * g[54] + b01[2] * g[50]; + g[59] = cpz[3] * g[55] + b01[3] * g[51]; + g[64] = cpz[0] * g[60] + b00[0] * g[48]; + g[65] = cpz[1] * g[61] + b00[1] * g[49]; + g[66] = cpz[2] * g[62] + b00[2] * g[50]; + g[67] = cpz[3] * g[63] + b00[3] * g[51]; + g[68] = cpz[0] * g[64] + b01[0] * g[60] + b00[0] * g[52]; + g[69] = cpz[1] * g[65] + b01[1] * g[61] + b00[1] * g[53]; + g[70] = cpz[2] * g[66] + b01[2] * g[62] + b00[2] * g[54]; + g[71] = cpz[3] * g[67] + b01[3] * g[63] + b00[3] * g[55]; +} + +static inline void _srg0_2d4d_0110(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[2]; + g[7] = cpx[3]; + g[8] = c0x[0]; + g[9] = c0x[1]; + g[10] = c0x[2]; + g[11] = c0x[3]; + g[12] = cpx[0] * c0x[0] + b00[0]; + g[13] = cpx[1] * c0x[1] + b00[1]; + g[14] = cpx[2] * c0x[2] + b00[2]; + g[15] = cpx[3] * c0x[3] + b00[3]; + g[16] = 1; + g[17] = 1; + g[18] = 1; + g[19] = 1; + g[20] = cpy[0]; + g[21] = cpy[1]; + g[22] = cpy[2]; + g[23] = cpy[3]; + g[24] = c0y[0]; + g[25] = c0y[1]; + g[26] = c0y[2]; + g[27] = c0y[3]; + g[28] = cpy[0] * c0y[0] + b00[0]; + g[29] = cpy[1] * c0y[1] + b00[1]; + g[30] = cpy[2] * c0y[2] + b00[2]; + g[31] = cpy[3] * c0y[3] + b00[3]; + + + + + g[36] = cpz[0] * g[32]; + g[37] = cpz[1] * g[33]; + g[38] = cpz[2] * g[34]; + g[39] = cpz[3] * g[35]; + g[40] = c0z[0] * g[32]; + g[41] = c0z[1] * g[33]; + g[42] = c0z[2] * g[34]; + g[43] = c0z[3] * g[35]; + g[44] = cpz[0] * g[40] + b00[0] * g[32]; + g[45] = cpz[1] * g[41] + b00[1] * g[33]; + g[46] = cpz[2] * g[42] + b00[2] * g[34]; + g[47] = cpz[3] * g[43] + b00[3] * g[35]; +} + +static inline void _srg0_2d4d_0111(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b01 = bc->b01; + dtype xkxl = envs->rkrl[0]; + dtype ykyl = envs->rkrl[1]; + dtype zkzl = envs->rkrl[2]; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[24] = c0x[0]; + g[25] = c0x[1]; + g[26] = c0x[2]; + g[27] = c0x[3]; + g[8] = cpx[0]; + g[9] = cpx[1]; + g[10] = cpx[2]; + g[11] = cpx[3]; + g[32] = cpx[0] * c0x[0] + b00[0]; + g[33] = cpx[1] * c0x[1] + b00[1]; + g[34] = cpx[2] * c0x[2] + b00[2]; + g[35] = cpx[3] * c0x[3] + b00[3]; + g[12] = cpx[0] * (xkxl + cpx[0]) + b01[0]; + g[13] = cpx[1] * (xkxl + cpx[1]) + b01[1]; + g[14] = cpx[2] * (xkxl + cpx[2]) + b01[2]; + g[15] = cpx[3] * (xkxl + cpx[3]) + b01[3]; + g[36] = g[32] * (xkxl + cpx[0]) + cpx[0] * b00[0] + b01[0] * c0x[0]; + g[37] = g[33] * (xkxl + cpx[1]) + cpx[1] * b00[1] + b01[1] * c0x[1]; + g[38] = g[34] * (xkxl + cpx[2]) + cpx[2] * b00[2] + b01[2] * c0x[2]; + g[39] = g[35] * (xkxl + cpx[3]) + cpx[3] * b00[3] + b01[3] * c0x[3]; + g[4] = xkxl + cpx[0]; + g[5] = xkxl + cpx[1]; + g[6] = xkxl + cpx[2]; + g[7] = xkxl + cpx[3]; + g[28] = c0x[0] * (xkxl + cpx[0]) + b00[0]; + g[29] = c0x[1] * (xkxl + cpx[1]) + b00[1]; + g[30] = c0x[2] * (xkxl + cpx[2]) + b00[2]; + g[31] = c0x[3] * (xkxl + cpx[3]) + b00[3]; + g[48] = 1; + g[49] = 1; + g[50] = 1; + g[51] = 1; + g[72] = c0y[0]; + g[73] = c0y[1]; + g[74] = c0y[2]; + g[75] = c0y[3]; + g[56] = cpy[0]; + g[57] = cpy[1]; + g[58] = cpy[2]; + g[59] = cpy[3]; + g[80] = cpy[0] * c0y[0] + b00[0]; + g[81] = cpy[1] * c0y[1] + b00[1]; + g[82] = cpy[2] * c0y[2] + b00[2]; + g[83] = cpy[3] * c0y[3] + b00[3]; + g[60] = cpy[0] * (ykyl + cpy[0]) + b01[0]; + g[61] = cpy[1] * (ykyl + cpy[1]) + b01[1]; + g[62] = cpy[2] * (ykyl + cpy[2]) + b01[2]; + g[63] = cpy[3] * (ykyl + cpy[3]) + b01[3]; + g[84] = g[80] * (ykyl + cpy[0]) + cpy[0] * b00[0] + b01[0] * c0y[0]; + g[85] = g[81] * (ykyl + cpy[1]) + cpy[1] * b00[1] + b01[1] * c0y[1]; + g[86] = g[82] * (ykyl + cpy[2]) + cpy[2] * b00[2] + b01[2] * c0y[2]; + g[87] = g[83] * (ykyl + cpy[3]) + cpy[3] * b00[3] + b01[3] * c0y[3]; + g[52] = ykyl + cpy[0]; + g[53] = ykyl + cpy[1]; + g[54] = ykyl + cpy[2]; + g[55] = ykyl + cpy[3]; + g[76] = c0y[0] * (ykyl + cpy[0]) + b00[0]; + g[77] = c0y[1] * (ykyl + cpy[1]) + b00[1]; + g[78] = c0y[2] * (ykyl + cpy[2]) + b00[2]; + g[79] = c0y[3] * (ykyl + cpy[3]) + b00[3]; + + + + + g[120] = c0z[0] * g[96]; + g[121] = c0z[1] * g[97]; + g[122] = c0z[2] * g[98]; + g[123] = c0z[3] * g[99]; + g[104] = cpz[0] * g[96]; + g[105] = cpz[1] * g[97]; + g[106] = cpz[2] * g[98]; + g[107] = cpz[3] * g[99]; + g[128] = cpz[0] * g[120] + b00[0] * g[96]; + g[129] = cpz[1] * g[121] + b00[1] * g[97]; + g[130] = cpz[2] * g[122] + b00[2] * g[98]; + g[131] = cpz[3] * g[123] + b00[3] * g[99]; + g[108] = g[104] * (zkzl + cpz[0]) + b01[0] * g[96]; + g[109] = g[105] * (zkzl + cpz[1]) + b01[1] * g[97]; + g[110] = g[106] * (zkzl + cpz[2]) + b01[2] * g[98]; + g[111] = g[107] * (zkzl + cpz[3]) + b01[3] * g[99]; + g[132] = g[128] * (zkzl + cpz[0]) + b01[0] * g[120] + b00[0] * g[104]; + g[133] = g[129] * (zkzl + cpz[1]) + b01[1] * g[121] + b00[1] * g[105]; + g[134] = g[130] * (zkzl + cpz[2]) + b01[2] * g[122] + b00[2] * g[106]; + g[135] = g[131] * (zkzl + cpz[3]) + b01[3] * g[123] + b00[3] * g[107]; + g[100] = g[96] * (zkzl + cpz[0]); + g[101] = g[97] * (zkzl + cpz[1]); + g[102] = g[98] * (zkzl + cpz[2]); + g[103] = g[99] * (zkzl + cpz[3]); + g[124] = g[120] * (zkzl + cpz[0]) + b00[0] * g[96]; + g[125] = g[121] * (zkzl + cpz[1]) + b00[1] * g[97]; + g[126] = g[122] * (zkzl + cpz[2]) + b00[2] * g[98]; + g[127] = g[123] * (zkzl + cpz[3]) + b00[3] * g[99]; +} + +static inline void _srg0_2d4d_0120(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[2]; + g[7] = cpx[3]; + g[12] = c0x[0]; + g[13] = c0x[1]; + g[14] = c0x[2]; + g[15] = c0x[3]; + g[8] = cpx[0] * cpx[0] + b01[0]; + g[9] = cpx[1] * cpx[1] + b01[1]; + g[10] = cpx[2] * cpx[2] + b01[2]; + g[11] = cpx[3] * cpx[3] + b01[3]; + g[16] = cpx[0] * c0x[0] + b00[0]; + g[17] = cpx[1] * c0x[1] + b00[1]; + g[18] = cpx[2] * c0x[2] + b00[2]; + g[19] = cpx[3] * c0x[3] + b00[3]; + g[20] = cpx[0] * (g[16] + b00[0]) + b01[0] * c0x[0]; + g[21] = cpx[1] * (g[17] + b00[1]) + b01[1] * c0x[1]; + g[22] = cpx[2] * (g[18] + b00[2]) + b01[2] * c0x[2]; + g[23] = cpx[3] * (g[19] + b00[3]) + b01[3] * c0x[3]; + g[24] = 1; + g[25] = 1; + g[26] = 1; + g[27] = 1; + g[28] = cpy[0]; + g[29] = cpy[1]; + g[30] = cpy[2]; + g[31] = cpy[3]; + g[36] = c0y[0]; + g[37] = c0y[1]; + g[38] = c0y[2]; + g[39] = c0y[3]; + g[32] = cpy[0] * cpy[0] + b01[0]; + g[33] = cpy[1] * cpy[1] + b01[1]; + g[34] = cpy[2] * cpy[2] + b01[2]; + g[35] = cpy[3] * cpy[3] + b01[3]; + g[40] = cpy[0] * c0y[0] + b00[0]; + g[41] = cpy[1] * c0y[1] + b00[1]; + g[42] = cpy[2] * c0y[2] + b00[2]; + g[43] = cpy[3] * c0y[3] + b00[3]; + g[44] = cpy[0] * (g[40] + b00[0]) + b01[0] * c0y[0]; + g[45] = cpy[1] * (g[41] + b00[1]) + b01[1] * c0y[1]; + g[46] = cpy[2] * (g[42] + b00[2]) + b01[2] * c0y[2]; + g[47] = cpy[3] * (g[43] + b00[3]) + b01[3] * c0y[3]; + + + + + g[52] = cpz[0] * g[48]; + g[53] = cpz[1] * g[49]; + g[54] = cpz[2] * g[50]; + g[55] = cpz[3] * g[51]; + g[60] = c0z[0] * g[48]; + g[61] = c0z[1] * g[49]; + g[62] = c0z[2] * g[50]; + g[63] = c0z[3] * g[51]; + g[56] = cpz[0] * g[52] + b01[0] * g[48]; + g[57] = cpz[1] * g[53] + b01[1] * g[49]; + g[58] = cpz[2] * g[54] + b01[2] * g[50]; + g[59] = cpz[3] * g[55] + b01[3] * g[51]; + g[64] = cpz[0] * g[60] + b00[0] * g[48]; + g[65] = cpz[1] * g[61] + b00[1] * g[49]; + g[66] = cpz[2] * g[62] + b00[2] * g[50]; + g[67] = cpz[3] * g[63] + b00[3] * g[51]; + g[68] = cpz[0] * g[64] + b01[0] * g[60] + b00[0] * g[52]; + g[69] = cpz[1] * g[65] + b01[1] * g[61] + b00[1] * g[53]; + g[70] = cpz[2] * g[66] + b01[2] * g[62] + b00[2] * g[54]; + g[71] = cpz[3] * g[67] + b01[3] * g[63] + b00[3] * g[55]; +} + +static inline void _srg0_2d4d_0200(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[2]; + g[7] = c0x[3]; + g[8] = c0x[0] * c0x[0] + b10[0]; + g[9] = c0x[1] * c0x[1] + b10[1]; + g[10] = c0x[2] * c0x[2] + b10[2]; + g[11] = c0x[3] * c0x[3] + b10[3]; + g[12] = 1; + g[13] = 1; + g[14] = 1; + g[15] = 1; + g[16] = c0y[0]; + g[17] = c0y[1]; + g[18] = c0y[2]; + g[19] = c0y[3]; + g[20] = c0y[0] * c0y[0] + b10[0]; + g[21] = c0y[1] * c0y[1] + b10[1]; + g[22] = c0y[2] * c0y[2] + b10[2]; + g[23] = c0y[3] * c0y[3] + b10[3]; + + + + + g[28] = c0z[0] * g[24]; + g[29] = c0z[1] * g[25]; + g[30] = c0z[2] * g[26]; + g[31] = c0z[3] * g[27]; + g[32] = c0z[0] * g[28] + b10[0] * g[24]; + g[33] = c0z[1] * g[29] + b10[1] * g[25]; + g[34] = c0z[2] * g[30] + b10[2] * g[26]; + g[35] = c0z[3] * g[31] + b10[3] * g[27]; +} + +static inline void _srg0_2d4d_0201(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[8] = c0x[0]; + g[9] = c0x[1]; + g[10] = c0x[2]; + g[11] = c0x[3]; + g[16] = c0x[0] * c0x[0] + b10[0]; + g[17] = c0x[1] * c0x[1] + b10[1]; + g[18] = c0x[2] * c0x[2] + b10[2]; + g[19] = c0x[3] * c0x[3] + b10[3]; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[2]; + g[7] = cpx[3]; + g[12] = cpx[0] * c0x[0] + b00[0]; + g[13] = cpx[1] * c0x[1] + b00[1]; + g[14] = cpx[2] * c0x[2] + b00[2]; + g[15] = cpx[3] * c0x[3] + b00[3]; + g[20] = c0x[0] * (g[12] + b00[0]) + b10[0] * cpx[0]; + g[21] = c0x[1] * (g[13] + b00[1]) + b10[1] * cpx[1]; + g[22] = c0x[2] * (g[14] + b00[2]) + b10[2] * cpx[2]; + g[23] = c0x[3] * (g[15] + b00[3]) + b10[3] * cpx[3]; + g[24] = 1; + g[25] = 1; + g[26] = 1; + g[27] = 1; + g[32] = c0y[0]; + g[33] = c0y[1]; + g[34] = c0y[2]; + g[35] = c0y[3]; + g[40] = c0y[0] * c0y[0] + b10[0]; + g[41] = c0y[1] * c0y[1] + b10[1]; + g[42] = c0y[2] * c0y[2] + b10[2]; + g[43] = c0y[3] * c0y[3] + b10[3]; + g[28] = cpy[0]; + g[29] = cpy[1]; + g[30] = cpy[2]; + g[31] = cpy[3]; + g[36] = cpy[0] * c0y[0] + b00[0]; + g[37] = cpy[1] * c0y[1] + b00[1]; + g[38] = cpy[2] * c0y[2] + b00[2]; + g[39] = cpy[3] * c0y[3] + b00[3]; + g[44] = c0y[0] * (g[36] + b00[0]) + b10[0] * cpy[0]; + g[45] = c0y[1] * (g[37] + b00[1]) + b10[1] * cpy[1]; + g[46] = c0y[2] * (g[38] + b00[2]) + b10[2] * cpy[2]; + g[47] = c0y[3] * (g[39] + b00[3]) + b10[3] * cpy[3]; + + + + + g[56] = c0z[0] * g[48]; + g[57] = c0z[1] * g[49]; + g[58] = c0z[2] * g[50]; + g[59] = c0z[3] * g[51]; + g[64] = c0z[0] * g[56] + b10[0] * g[48]; + g[65] = c0z[1] * g[57] + b10[1] * g[49]; + g[66] = c0z[2] * g[58] + b10[2] * g[50]; + g[67] = c0z[3] * g[59] + b10[3] * g[51]; + g[52] = cpz[0] * g[48]; + g[53] = cpz[1] * g[49]; + g[54] = cpz[2] * g[50]; + g[55] = cpz[3] * g[51]; + g[60] = cpz[0] * g[56] + b00[0] * g[48]; + g[61] = cpz[1] * g[57] + b00[1] * g[49]; + g[62] = cpz[2] * g[58] + b00[2] * g[50]; + g[63] = cpz[3] * g[59] + b00[3] * g[51]; + g[68] = c0z[0] * g[60] + b10[0] * g[52] + b00[0] * g[56]; + g[69] = c0z[1] * g[61] + b10[1] * g[53] + b00[1] * g[57]; + g[70] = c0z[2] * g[62] + b10[2] * g[54] + b00[2] * g[58]; + g[71] = c0z[3] * g[63] + b10[3] * g[55] + b00[3] * g[59]; +} + +static inline void _srg0_2d4d_0210(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = cpx[0]; + g[5] = cpx[1]; + g[6] = cpx[2]; + g[7] = cpx[3]; + g[8] = c0x[0]; + g[9] = c0x[1]; + g[10] = c0x[2]; + g[11] = c0x[3]; + g[12] = cpx[0] * c0x[0] + b00[0]; + g[13] = cpx[1] * c0x[1] + b00[1]; + g[14] = cpx[2] * c0x[2] + b00[2]; + g[15] = cpx[3] * c0x[3] + b00[3]; + g[16] = c0x[0] * c0x[0] + b10[0]; + g[17] = c0x[1] * c0x[1] + b10[1]; + g[18] = c0x[2] * c0x[2] + b10[2]; + g[19] = c0x[3] * c0x[3] + b10[3]; + g[20] = c0x[0] * (g[12] + b00[0]) + b10[0] * cpx[0]; + g[21] = c0x[1] * (g[13] + b00[1]) + b10[1] * cpx[1]; + g[22] = c0x[2] * (g[14] + b00[2]) + b10[2] * cpx[2]; + g[23] = c0x[3] * (g[15] + b00[3]) + b10[3] * cpx[3]; + g[24] = 1; + g[25] = 1; + g[26] = 1; + g[27] = 1; + g[28] = cpy[0]; + g[29] = cpy[1]; + g[30] = cpy[2]; + g[31] = cpy[3]; + g[32] = c0y[0]; + g[33] = c0y[1]; + g[34] = c0y[2]; + g[35] = c0y[3]; + g[36] = cpy[0] * c0y[0] + b00[0]; + g[37] = cpy[1] * c0y[1] + b00[1]; + g[38] = cpy[2] * c0y[2] + b00[2]; + g[39] = cpy[3] * c0y[3] + b00[3]; + g[40] = c0y[0] * c0y[0] + b10[0]; + g[41] = c0y[1] * c0y[1] + b10[1]; + g[42] = c0y[2] * c0y[2] + b10[2]; + g[43] = c0y[3] * c0y[3] + b10[3]; + g[44] = c0y[0] * (g[36] + b00[0]) + b10[0] * cpy[0]; + g[45] = c0y[1] * (g[37] + b00[1]) + b10[1] * cpy[1]; + g[46] = c0y[2] * (g[38] + b00[2]) + b10[2] * cpy[2]; + g[47] = c0y[3] * (g[39] + b00[3]) + b10[3] * cpy[3]; + + + + + g[52] = cpz[0] * g[48]; + g[53] = cpz[1] * g[49]; + g[54] = cpz[2] * g[50]; + g[55] = cpz[3] * g[51]; + g[56] = c0z[0] * g[48]; + g[57] = c0z[1] * g[49]; + g[58] = c0z[2] * g[50]; + g[59] = c0z[3] * g[51]; + g[60] = cpz[0] * g[56] + b00[0] * g[48]; + g[61] = cpz[1] * g[57] + b00[1] * g[49]; + g[62] = cpz[2] * g[58] + b00[2] * g[50]; + g[63] = cpz[3] * g[59] + b00[3] * g[51]; + g[64] = c0z[0] * g[56] + b10[0] * g[48]; + g[65] = c0z[1] * g[57] + b10[1] * g[49]; + g[66] = c0z[2] * g[58] + b10[2] * g[50]; + g[67] = c0z[3] * g[59] + b10[3] * g[51]; + g[68] = c0z[0] * g[60] + b10[0] * g[52] + b00[0] * g[56]; + g[69] = c0z[1] * g[61] + b10[1] * g[53] + b00[1] * g[57]; + g[70] = c0z[2] * g[62] + b10[2] * g[54] + b00[2] * g[58]; + g[71] = c0z[3] * g[63] + b10[3] * g[55] + b00[3] * g[59]; +} + +static inline void _srg0_2d4d_0300(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[2]; + g[7] = c0x[3]; + g[8] = c0x[0] * c0x[0] + b10[0]; + g[9] = c0x[1] * c0x[1] + b10[1]; + g[10] = c0x[2] * c0x[2] + b10[2]; + g[11] = c0x[3] * c0x[3] + b10[3]; + g[12] = c0x[0] * (g[8] + 2 * b10[0]); + g[13] = c0x[1] * (g[9] + 2 * b10[1]); + g[14] = c0x[2] * (g[10] + 2 * b10[2]); + g[15] = c0x[3] * (g[11] + 2 * b10[3]); + g[16] = 1; + g[17] = 1; + g[18] = 1; + g[19] = 1; + g[20] = c0y[0]; + g[21] = c0y[1]; + g[22] = c0y[2]; + g[23] = c0y[3]; + g[24] = c0y[0] * c0y[0] + b10[0]; + g[25] = c0y[1] * c0y[1] + b10[1]; + g[26] = c0y[2] * c0y[2] + b10[2]; + g[27] = c0y[3] * c0y[3] + b10[3]; + g[28] = c0y[0] * (g[24] + 2 * b10[0]); + g[29] = c0y[1] * (g[25] + 2 * b10[1]); + g[30] = c0y[2] * (g[26] + 2 * b10[2]); + g[31] = c0y[3] * (g[27] + 2 * b10[3]); + + + + + g[36] = c0z[0] * g[32]; + g[37] = c0z[1] * g[33]; + g[38] = c0z[2] * g[34]; + g[39] = c0z[3] * g[35]; + g[40] = c0z[0] * g[36] + b10[0] * g[32]; + g[41] = c0z[1] * g[37] + b10[1] * g[33]; + g[42] = c0z[2] * g[38] + b10[2] * g[34]; + g[43] = c0z[3] * g[39] + b10[3] * g[35]; + g[44] = c0z[0] * g[40] + 2 * b10[0] * g[36]; + g[45] = c0z[1] * g[41] + 2 * b10[1] * g[37]; + g[46] = c0z[2] * g[42] + 2 * b10[2] * g[38]; + g[47] = c0z[3] * g[43] + 2 * b10[3] * g[39]; +} + +static inline void _srg0_2d4d_1000(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + g[0] = 1; + g[1] = 1; + g[2] = c0x[0]; + g[3] = c0x[1]; + g[4] = 1; + g[5] = 1; + g[6] = c0y[0]; + g[7] = c0y[1]; + + + g[10] = c0z[0] * g[8]; + g[11] = c0z[1] * g[9]; +} + +static inline void _srg0_2d4d_1001(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[2]; + g[7] = c0x[3]; + g[8] = cpx[0]; + g[9] = cpx[1]; + g[10] = cpx[2]; + g[11] = cpx[3]; + g[12] = cpx[0] * c0x[0] + b00[0]; + g[13] = cpx[1] * c0x[1] + b00[1]; + g[14] = cpx[2] * c0x[2] + b00[2]; + g[15] = cpx[3] * c0x[3] + b00[3]; + g[16] = 1; + g[17] = 1; + g[18] = 1; + g[19] = 1; + g[20] = c0y[0]; + g[21] = c0y[1]; + g[22] = c0y[2]; + g[23] = c0y[3]; + g[24] = cpy[0]; + g[25] = cpy[1]; + g[26] = cpy[2]; + g[27] = cpy[3]; + g[28] = cpy[0] * c0y[0] + b00[0]; + g[29] = cpy[1] * c0y[1] + b00[1]; + g[30] = cpy[2] * c0y[2] + b00[2]; + g[31] = cpy[3] * c0y[3] + b00[3]; + + + + + g[36] = c0z[0] * g[32]; + g[37] = c0z[1] * g[33]; + g[38] = c0z[2] * g[34]; + g[39] = c0z[3] * g[35]; + g[40] = cpz[0] * g[32]; + g[41] = cpz[1] * g[33]; + g[42] = cpz[2] * g[34]; + g[43] = cpz[3] * g[35]; + g[44] = cpz[0] * g[36] + b00[0] * g[32]; + g[45] = cpz[1] * g[37] + b00[1] * g[33]; + g[46] = cpz[2] * g[38] + b00[2] * g[34]; + g[47] = cpz[3] * g[39] + b00[3] * g[35]; +} + +static inline void _srg0_2d4d_1002(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[2]; + g[7] = c0x[3]; + g[8] = cpx[0]; + g[9] = cpx[1]; + g[10] = cpx[2]; + g[11] = cpx[3]; + g[12] = cpx[0] * c0x[0] + b00[0]; + g[13] = cpx[1] * c0x[1] + b00[1]; + g[14] = cpx[2] * c0x[2] + b00[2]; + g[15] = cpx[3] * c0x[3] + b00[3]; + g[16] = cpx[0] * cpx[0] + b01[0]; + g[17] = cpx[1] * cpx[1] + b01[1]; + g[18] = cpx[2] * cpx[2] + b01[2]; + g[19] = cpx[3] * cpx[3] + b01[3]; + g[20] = cpx[0] * (g[12] + b00[0]) + b01[0] * c0x[0]; + g[21] = cpx[1] * (g[13] + b00[1]) + b01[1] * c0x[1]; + g[22] = cpx[2] * (g[14] + b00[2]) + b01[2] * c0x[2]; + g[23] = cpx[3] * (g[15] + b00[3]) + b01[3] * c0x[3]; + g[24] = 1; + g[25] = 1; + g[26] = 1; + g[27] = 1; + g[28] = c0y[0]; + g[29] = c0y[1]; + g[30] = c0y[2]; + g[31] = c0y[3]; + g[32] = cpy[0]; + g[33] = cpy[1]; + g[34] = cpy[2]; + g[35] = cpy[3]; + g[36] = cpy[0] * c0y[0] + b00[0]; + g[37] = cpy[1] * c0y[1] + b00[1]; + g[38] = cpy[2] * c0y[2] + b00[2]; + g[39] = cpy[3] * c0y[3] + b00[3]; + g[40] = cpy[0] * cpy[0] + b01[0]; + g[41] = cpy[1] * cpy[1] + b01[1]; + g[42] = cpy[2] * cpy[2] + b01[2]; + g[43] = cpy[3] * cpy[3] + b01[3]; + g[44] = cpy[0] * (g[36] + b00[0]) + b01[0] * c0y[0]; + g[45] = cpy[1] * (g[37] + b00[1]) + b01[1] * c0y[1]; + g[46] = cpy[2] * (g[38] + b00[2]) + b01[2] * c0y[2]; + g[47] = cpy[3] * (g[39] + b00[3]) + b01[3] * c0y[3]; + + + + + g[52] = c0z[0] * g[48]; + g[53] = c0z[1] * g[49]; + g[54] = c0z[2] * g[50]; + g[55] = c0z[3] * g[51]; + g[56] = cpz[0] * g[48]; + g[57] = cpz[1] * g[49]; + g[58] = cpz[2] * g[50]; + g[59] = cpz[3] * g[51]; + g[60] = cpz[0] * g[52] + b00[0] * g[48]; + g[61] = cpz[1] * g[53] + b00[1] * g[49]; + g[62] = cpz[2] * g[54] + b00[2] * g[50]; + g[63] = cpz[3] * g[55] + b00[3] * g[51]; + g[64] = cpz[0] * g[56] + b01[0] * g[48]; + g[65] = cpz[1] * g[57] + b01[1] * g[49]; + g[66] = cpz[2] * g[58] + b01[2] * g[50]; + g[67] = cpz[3] * g[59] + b01[3] * g[51]; + g[68] = cpz[0] * g[60] + b01[0] * g[52] + b00[0] * g[56]; + g[69] = cpz[1] * g[61] + b01[1] * g[53] + b00[1] * g[57]; + g[70] = cpz[2] * g[62] + b01[2] * g[54] + b00[2] * g[58]; + g[71] = cpz[3] * g[63] + b01[3] * g[55] + b00[3] * g[59]; +} + +static inline void _srg0_2d4d_1010(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[2]; + g[7] = c0x[3]; + g[8] = cpx[0]; + g[9] = cpx[1]; + g[10] = cpx[2]; + g[11] = cpx[3]; + g[12] = cpx[0] * c0x[0] + b00[0]; + g[13] = cpx[1] * c0x[1] + b00[1]; + g[14] = cpx[2] * c0x[2] + b00[2]; + g[15] = cpx[3] * c0x[3] + b00[3]; + g[16] = 1; + g[17] = 1; + g[18] = 1; + g[19] = 1; + g[20] = c0y[0]; + g[21] = c0y[1]; + g[22] = c0y[2]; + g[23] = c0y[3]; + g[24] = cpy[0]; + g[25] = cpy[1]; + g[26] = cpy[2]; + g[27] = cpy[3]; + g[28] = cpy[0] * c0y[0] + b00[0]; + g[29] = cpy[1] * c0y[1] + b00[1]; + g[30] = cpy[2] * c0y[2] + b00[2]; + g[31] = cpy[3] * c0y[3] + b00[3]; + + + + + g[36] = c0z[0] * g[32]; + g[37] = c0z[1] * g[33]; + g[38] = c0z[2] * g[34]; + g[39] = c0z[3] * g[35]; + g[40] = cpz[0] * g[32]; + g[41] = cpz[1] * g[33]; + g[42] = cpz[2] * g[34]; + g[43] = cpz[3] * g[35]; + g[44] = cpz[0] * g[36] + b00[0] * g[32]; + g[45] = cpz[1] * g[37] + b00[1] * g[33]; + g[46] = cpz[2] * g[38] + b00[2] * g[34]; + g[47] = cpz[3] * g[39] + b00[3] * g[35]; +} + +static inline void _srg0_2d4d_1011(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b01 = bc->b01; + dtype xkxl = envs->rkrl[0]; + dtype ykyl = envs->rkrl[1]; + dtype zkzl = envs->rkrl[2]; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[2]; + g[7] = c0x[3]; + g[16] = cpx[0]; + g[17] = cpx[1]; + g[18] = cpx[2]; + g[19] = cpx[3]; + g[20] = cpx[0] * c0x[0] + b00[0]; + g[21] = cpx[1] * c0x[1] + b00[1]; + g[22] = cpx[2] * c0x[2] + b00[2]; + g[23] = cpx[3] * c0x[3] + b00[3]; + g[24] = cpx[0] * (xkxl + cpx[0]) + b01[0]; + g[25] = cpx[1] * (xkxl + cpx[1]) + b01[1]; + g[26] = cpx[2] * (xkxl + cpx[2]) + b01[2]; + g[27] = cpx[3] * (xkxl + cpx[3]) + b01[3]; + g[28] = g[20] * (xkxl + cpx[0]) + cpx[0] * b00[0] + b01[0] * c0x[0]; + g[29] = g[21] * (xkxl + cpx[1]) + cpx[1] * b00[1] + b01[1] * c0x[1]; + g[30] = g[22] * (xkxl + cpx[2]) + cpx[2] * b00[2] + b01[2] * c0x[2]; + g[31] = g[23] * (xkxl + cpx[3]) + cpx[3] * b00[3] + b01[3] * c0x[3]; + g[8] = xkxl + cpx[0]; + g[9] = xkxl + cpx[1]; + g[10] = xkxl + cpx[2]; + g[11] = xkxl + cpx[3]; + g[12] = c0x[0] * (xkxl + cpx[0]) + b00[0]; + g[13] = c0x[1] * (xkxl + cpx[1]) + b00[1]; + g[14] = c0x[2] * (xkxl + cpx[2]) + b00[2]; + g[15] = c0x[3] * (xkxl + cpx[3]) + b00[3]; + g[48] = 1; + g[49] = 1; + g[50] = 1; + g[51] = 1; + g[52] = c0y[0]; + g[53] = c0y[1]; + g[54] = c0y[2]; + g[55] = c0y[3]; + g[64] = cpy[0]; + g[65] = cpy[1]; + g[66] = cpy[2]; + g[67] = cpy[3]; + g[68] = cpy[0] * c0y[0] + b00[0]; + g[69] = cpy[1] * c0y[1] + b00[1]; + g[70] = cpy[2] * c0y[2] + b00[2]; + g[71] = cpy[3] * c0y[3] + b00[3]; + g[72] = cpy[0] * (ykyl + cpy[0]) + b01[0]; + g[73] = cpy[1] * (ykyl + cpy[1]) + b01[1]; + g[74] = cpy[2] * (ykyl + cpy[2]) + b01[2]; + g[75] = cpy[3] * (ykyl + cpy[3]) + b01[3]; + g[76] = g[68] * (ykyl + cpy[0]) + cpy[0] * b00[0] + b01[0] * c0y[0]; + g[77] = g[69] * (ykyl + cpy[1]) + cpy[1] * b00[1] + b01[1] * c0y[1]; + g[78] = g[70] * (ykyl + cpy[2]) + cpy[2] * b00[2] + b01[2] * c0y[2]; + g[79] = g[71] * (ykyl + cpy[3]) + cpy[3] * b00[3] + b01[3] * c0y[3]; + g[56] = ykyl + cpy[0]; + g[57] = ykyl + cpy[1]; + g[58] = ykyl + cpy[2]; + g[59] = ykyl + cpy[3]; + g[60] = c0y[0] * (ykyl + cpy[0]) + b00[0]; + g[61] = c0y[1] * (ykyl + cpy[1]) + b00[1]; + g[62] = c0y[2] * (ykyl + cpy[2]) + b00[2]; + g[63] = c0y[3] * (ykyl + cpy[3]) + b00[3]; + + + + + g[100] = c0z[0] * g[96]; + g[101] = c0z[1] * g[97]; + g[102] = c0z[2] * g[98]; + g[103] = c0z[3] * g[99]; + g[112] = cpz[0] * g[96]; + g[113] = cpz[1] * g[97]; + g[114] = cpz[2] * g[98]; + g[115] = cpz[3] * g[99]; + g[116] = cpz[0] * g[100] + b00[0] * g[96]; + g[117] = cpz[1] * g[101] + b00[1] * g[97]; + g[118] = cpz[2] * g[102] + b00[2] * g[98]; + g[119] = cpz[3] * g[103] + b00[3] * g[99]; + g[120] = g[112] * (zkzl + cpz[0]) + b01[0] * g[96]; + g[121] = g[113] * (zkzl + cpz[1]) + b01[1] * g[97]; + g[122] = g[114] * (zkzl + cpz[2]) + b01[2] * g[98]; + g[123] = g[115] * (zkzl + cpz[3]) + b01[3] * g[99]; + g[124] = g[116] * (zkzl + cpz[0]) + b01[0] * g[100] + b00[0] * g[112]; + g[125] = g[117] * (zkzl + cpz[1]) + b01[1] * g[101] + b00[1] * g[113]; + g[126] = g[118] * (zkzl + cpz[2]) + b01[2] * g[102] + b00[2] * g[114]; + g[127] = g[119] * (zkzl + cpz[3]) + b01[3] * g[103] + b00[3] * g[115]; + g[104] = g[96] * (zkzl + cpz[0]); + g[105] = g[97] * (zkzl + cpz[1]); + g[106] = g[98] * (zkzl + cpz[2]); + g[107] = g[99] * (zkzl + cpz[3]); + g[108] = g[100] * (zkzl + cpz[0]) + b00[0] * g[96]; + g[109] = g[101] * (zkzl + cpz[1]) + b00[1] * g[97]; + g[110] = g[102] * (zkzl + cpz[2]) + b00[2] * g[98]; + g[111] = g[103] * (zkzl + cpz[3]) + b00[3] * g[99]; +} + +static inline void _srg0_2d4d_1020(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b01 = bc->b01; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[2]; + g[7] = c0x[3]; + g[8] = cpx[0]; + g[9] = cpx[1]; + g[10] = cpx[2]; + g[11] = cpx[3]; + g[12] = cpx[0] * c0x[0] + b00[0]; + g[13] = cpx[1] * c0x[1] + b00[1]; + g[14] = cpx[2] * c0x[2] + b00[2]; + g[15] = cpx[3] * c0x[3] + b00[3]; + g[16] = cpx[0] * cpx[0] + b01[0]; + g[17] = cpx[1] * cpx[1] + b01[1]; + g[18] = cpx[2] * cpx[2] + b01[2]; + g[19] = cpx[3] * cpx[3] + b01[3]; + g[20] = cpx[0] * (g[12] + b00[0]) + b01[0] * c0x[0]; + g[21] = cpx[1] * (g[13] + b00[1]) + b01[1] * c0x[1]; + g[22] = cpx[2] * (g[14] + b00[2]) + b01[2] * c0x[2]; + g[23] = cpx[3] * (g[15] + b00[3]) + b01[3] * c0x[3]; + g[24] = 1; + g[25] = 1; + g[26] = 1; + g[27] = 1; + g[28] = c0y[0]; + g[29] = c0y[1]; + g[30] = c0y[2]; + g[31] = c0y[3]; + g[32] = cpy[0]; + g[33] = cpy[1]; + g[34] = cpy[2]; + g[35] = cpy[3]; + g[36] = cpy[0] * c0y[0] + b00[0]; + g[37] = cpy[1] * c0y[1] + b00[1]; + g[38] = cpy[2] * c0y[2] + b00[2]; + g[39] = cpy[3] * c0y[3] + b00[3]; + g[40] = cpy[0] * cpy[0] + b01[0]; + g[41] = cpy[1] * cpy[1] + b01[1]; + g[42] = cpy[2] * cpy[2] + b01[2]; + g[43] = cpy[3] * cpy[3] + b01[3]; + g[44] = cpy[0] * (g[36] + b00[0]) + b01[0] * c0y[0]; + g[45] = cpy[1] * (g[37] + b00[1]) + b01[1] * c0y[1]; + g[46] = cpy[2] * (g[38] + b00[2]) + b01[2] * c0y[2]; + g[47] = cpy[3] * (g[39] + b00[3]) + b01[3] * c0y[3]; + + + + + g[52] = c0z[0] * g[48]; + g[53] = c0z[1] * g[49]; + g[54] = c0z[2] * g[50]; + g[55] = c0z[3] * g[51]; + g[56] = cpz[0] * g[48]; + g[57] = cpz[1] * g[49]; + g[58] = cpz[2] * g[50]; + g[59] = cpz[3] * g[51]; + g[60] = cpz[0] * g[52] + b00[0] * g[48]; + g[61] = cpz[1] * g[53] + b00[1] * g[49]; + g[62] = cpz[2] * g[54] + b00[2] * g[50]; + g[63] = cpz[3] * g[55] + b00[3] * g[51]; + g[64] = cpz[0] * g[56] + b01[0] * g[48]; + g[65] = cpz[1] * g[57] + b01[1] * g[49]; + g[66] = cpz[2] * g[58] + b01[2] * g[50]; + g[67] = cpz[3] * g[59] + b01[3] * g[51]; + g[68] = cpz[0] * g[60] + b01[0] * g[52] + b00[0] * g[56]; + g[69] = cpz[1] * g[61] + b01[1] * g[53] + b00[1] * g[57]; + g[70] = cpz[2] * g[62] + b01[2] * g[54] + b00[2] * g[58]; + g[71] = cpz[3] * g[63] + b01[3] * g[55] + b00[3] * g[59]; +} + +static inline void _srg0_2d4d_1100(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + dtype xixj = envs->rirj[0]; + dtype yiyj = envs->rirj[1]; + dtype zizj = envs->rirj[2]; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[8] = c0x[0]; + g[9] = c0x[1]; + g[10] = c0x[2]; + g[11] = c0x[3]; + g[12] = c0x[0] * (xixj + c0x[0]) + b10[0]; + g[13] = c0x[1] * (xixj + c0x[1]) + b10[1]; + g[14] = c0x[2] * (xixj + c0x[2]) + b10[2]; + g[15] = c0x[3] * (xixj + c0x[3]) + b10[3]; + g[4] = xixj + c0x[0]; + g[5] = xixj + c0x[1]; + g[6] = xixj + c0x[2]; + g[7] = xixj + c0x[3]; + g[24] = 1; + g[25] = 1; + g[26] = 1; + g[27] = 1; + g[32] = c0y[0]; + g[33] = c0y[1]; + g[34] = c0y[2]; + g[35] = c0y[3]; + g[36] = c0y[0] * (yiyj + c0y[0]) + b10[0]; + g[37] = c0y[1] * (yiyj + c0y[1]) + b10[1]; + g[38] = c0y[2] * (yiyj + c0y[2]) + b10[2]; + g[39] = c0y[3] * (yiyj + c0y[3]) + b10[3]; + g[28] = yiyj + c0y[0]; + g[29] = yiyj + c0y[1]; + g[30] = yiyj + c0y[2]; + g[31] = yiyj + c0y[3]; + + + + + g[56] = c0z[0] * g[48]; + g[57] = c0z[1] * g[49]; + g[58] = c0z[2] * g[50]; + g[59] = c0z[3] * g[51]; + g[60] = g[56] * (zizj + c0z[0]) + b10[0] * g[48]; + g[61] = g[57] * (zizj + c0z[1]) + b10[1] * g[49]; + g[62] = g[58] * (zizj + c0z[2]) + b10[2] * g[50]; + g[63] = g[59] * (zizj + c0z[3]) + b10[3] * g[51]; + g[52] = g[48] * (zizj + c0z[0]); + g[53] = g[49] * (zizj + c0z[1]); + g[54] = g[50] * (zizj + c0z[2]); + g[55] = g[51] * (zizj + c0z[3]); +} + +static inline void _srg0_2d4d_1101(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b10 = bc->b10; + dtype xixj = envs->rirj[0]; + dtype yiyj = envs->rirj[1]; + dtype zizj = envs->rirj[2]; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[16] = c0x[0]; + g[17] = c0x[1]; + g[18] = c0x[2]; + g[19] = c0x[3]; + g[8] = cpx[0]; + g[9] = cpx[1]; + g[10] = cpx[2]; + g[11] = cpx[3]; + g[24] = cpx[0] * c0x[0] + b00[0]; + g[25] = cpx[1] * c0x[1] + b00[1]; + g[26] = cpx[2] * c0x[2] + b00[2]; + g[27] = cpx[3] * c0x[3] + b00[3]; + g[20] = c0x[0] * (xixj + c0x[0]) + b10[0]; + g[21] = c0x[1] * (xixj + c0x[1]) + b10[1]; + g[22] = c0x[2] * (xixj + c0x[2]) + b10[2]; + g[23] = c0x[3] * (xixj + c0x[3]) + b10[3]; + g[4] = xixj + c0x[0]; + g[5] = xixj + c0x[1]; + g[6] = xixj + c0x[2]; + g[7] = xixj + c0x[3]; + g[28] = g[24] * (xixj + c0x[0]) + c0x[0] * b00[0] + b10[0] * cpx[0]; + g[29] = g[25] * (xixj + c0x[1]) + c0x[1] * b00[1] + b10[1] * cpx[1]; + g[30] = g[26] * (xixj + c0x[2]) + c0x[2] * b00[2] + b10[2] * cpx[2]; + g[31] = g[27] * (xixj + c0x[3]) + c0x[3] * b00[3] + b10[3] * cpx[3]; + g[12] = cpx[0] * (xixj + c0x[0]) + b00[0]; + g[13] = cpx[1] * (xixj + c0x[1]) + b00[1]; + g[14] = cpx[2] * (xixj + c0x[2]) + b00[2]; + g[15] = cpx[3] * (xixj + c0x[3]) + b00[3]; + g[48] = 1; + g[49] = 1; + g[50] = 1; + g[51] = 1; + g[64] = c0y[0]; + g[65] = c0y[1]; + g[66] = c0y[2]; + g[67] = c0y[3]; + g[56] = cpy[0]; + g[57] = cpy[1]; + g[58] = cpy[2]; + g[59] = cpy[3]; + g[72] = cpy[0] * c0y[0] + b00[0]; + g[73] = cpy[1] * c0y[1] + b00[1]; + g[74] = cpy[2] * c0y[2] + b00[2]; + g[75] = cpy[3] * c0y[3] + b00[3]; + g[68] = c0y[0] * (yiyj + c0y[0]) + b10[0]; + g[69] = c0y[1] * (yiyj + c0y[1]) + b10[1]; + g[70] = c0y[2] * (yiyj + c0y[2]) + b10[2]; + g[71] = c0y[3] * (yiyj + c0y[3]) + b10[3]; + g[52] = yiyj + c0y[0]; + g[53] = yiyj + c0y[1]; + g[54] = yiyj + c0y[2]; + g[55] = yiyj + c0y[3]; + g[76] = g[72] * (yiyj + c0y[0]) + c0y[0] * b00[0] + b10[0] * cpy[0]; + g[77] = g[73] * (yiyj + c0y[1]) + c0y[1] * b00[1] + b10[1] * cpy[1]; + g[78] = g[74] * (yiyj + c0y[2]) + c0y[2] * b00[2] + b10[2] * cpy[2]; + g[79] = g[75] * (yiyj + c0y[3]) + c0y[3] * b00[3] + b10[3] * cpy[3]; + g[60] = cpy[0] * (yiyj + c0y[0]) + b00[0]; + g[61] = cpy[1] * (yiyj + c0y[1]) + b00[1]; + g[62] = cpy[2] * (yiyj + c0y[2]) + b00[2]; + g[63] = cpy[3] * (yiyj + c0y[3]) + b00[3]; + + + + + g[112] = c0z[0] * g[96]; + g[113] = c0z[1] * g[97]; + g[114] = c0z[2] * g[98]; + g[115] = c0z[3] * g[99]; + g[104] = cpz[0] * g[96]; + g[105] = cpz[1] * g[97]; + g[106] = cpz[2] * g[98]; + g[107] = cpz[3] * g[99]; + g[120] = cpz[0] * g[112] + b00[0] * g[96]; + g[121] = cpz[1] * g[113] + b00[1] * g[97]; + g[122] = cpz[2] * g[114] + b00[2] * g[98]; + g[123] = cpz[3] * g[115] + b00[3] * g[99]; + g[116] = g[112] * (zizj + c0z[0]) + b10[0] * g[96]; + g[117] = g[113] * (zizj + c0z[1]) + b10[1] * g[97]; + g[118] = g[114] * (zizj + c0z[2]) + b10[2] * g[98]; + g[119] = g[115] * (zizj + c0z[3]) + b10[3] * g[99]; + g[100] = g[96] * (zizj + c0z[0]); + g[101] = g[97] * (zizj + c0z[1]); + g[102] = g[98] * (zizj + c0z[2]); + g[103] = g[99] * (zizj + c0z[3]); + g[124] = g[120] * (zizj + c0z[0]) + b10[0] * g[104] + b00[0] * g[112]; + g[125] = g[121] * (zizj + c0z[1]) + b10[1] * g[105] + b00[1] * g[113]; + g[126] = g[122] * (zizj + c0z[2]) + b10[2] * g[106] + b00[2] * g[114]; + g[127] = g[123] * (zizj + c0z[3]) + b10[3] * g[107] + b00[3] * g[115]; + g[108] = zizj * g[104] + cpz[0] * g[112] + b00[0] * g[96]; + g[109] = zizj * g[105] + cpz[1] * g[113] + b00[1] * g[97]; + g[110] = zizj * g[106] + cpz[2] * g[114] + b00[2] * g[98]; + g[111] = zizj * g[107] + cpz[3] * g[115] + b00[3] * g[99]; +} + +static inline void _srg0_2d4d_1110(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b10 = bc->b10; + dtype xixj = envs->rirj[0]; + dtype yiyj = envs->rirj[1]; + dtype zizj = envs->rirj[2]; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[16] = c0x[0]; + g[17] = c0x[1]; + g[18] = c0x[2]; + g[19] = c0x[3]; + g[8] = cpx[0]; + g[9] = cpx[1]; + g[10] = cpx[2]; + g[11] = cpx[3]; + g[24] = cpx[0] * c0x[0] + b00[0]; + g[25] = cpx[1] * c0x[1] + b00[1]; + g[26] = cpx[2] * c0x[2] + b00[2]; + g[27] = cpx[3] * c0x[3] + b00[3]; + g[20] = c0x[0] * (xixj + c0x[0]) + b10[0]; + g[21] = c0x[1] * (xixj + c0x[1]) + b10[1]; + g[22] = c0x[2] * (xixj + c0x[2]) + b10[2]; + g[23] = c0x[3] * (xixj + c0x[3]) + b10[3]; + g[4] = xixj + c0x[0]; + g[5] = xixj + c0x[1]; + g[6] = xixj + c0x[2]; + g[7] = xixj + c0x[3]; + g[28] = g[24] * (xixj + c0x[0]) + c0x[0] * b00[0] + b10[0] * cpx[0]; + g[29] = g[25] * (xixj + c0x[1]) + c0x[1] * b00[1] + b10[1] * cpx[1]; + g[30] = g[26] * (xixj + c0x[2]) + c0x[2] * b00[2] + b10[2] * cpx[2]; + g[31] = g[27] * (xixj + c0x[3]) + c0x[3] * b00[3] + b10[3] * cpx[3]; + g[12] = cpx[0] * (xixj + c0x[0]) + b00[0]; + g[13] = cpx[1] * (xixj + c0x[1]) + b00[1]; + g[14] = cpx[2] * (xixj + c0x[2]) + b00[2]; + g[15] = cpx[3] * (xixj + c0x[3]) + b00[3]; + g[48] = 1; + g[49] = 1; + g[50] = 1; + g[51] = 1; + g[64] = c0y[0]; + g[65] = c0y[1]; + g[66] = c0y[2]; + g[67] = c0y[3]; + g[56] = cpy[0]; + g[57] = cpy[1]; + g[58] = cpy[2]; + g[59] = cpy[3]; + g[72] = cpy[0] * c0y[0] + b00[0]; + g[73] = cpy[1] * c0y[1] + b00[1]; + g[74] = cpy[2] * c0y[2] + b00[2]; + g[75] = cpy[3] * c0y[3] + b00[3]; + g[68] = c0y[0] * (yiyj + c0y[0]) + b10[0]; + g[69] = c0y[1] * (yiyj + c0y[1]) + b10[1]; + g[70] = c0y[2] * (yiyj + c0y[2]) + b10[2]; + g[71] = c0y[3] * (yiyj + c0y[3]) + b10[3]; + g[52] = yiyj + c0y[0]; + g[53] = yiyj + c0y[1]; + g[54] = yiyj + c0y[2]; + g[55] = yiyj + c0y[3]; + g[76] = g[72] * (yiyj + c0y[0]) + c0y[0] * b00[0] + b10[0] * cpy[0]; + g[77] = g[73] * (yiyj + c0y[1]) + c0y[1] * b00[1] + b10[1] * cpy[1]; + g[78] = g[74] * (yiyj + c0y[2]) + c0y[2] * b00[2] + b10[2] * cpy[2]; + g[79] = g[75] * (yiyj + c0y[3]) + c0y[3] * b00[3] + b10[3] * cpy[3]; + g[60] = cpy[0] * (yiyj + c0y[0]) + b00[0]; + g[61] = cpy[1] * (yiyj + c0y[1]) + b00[1]; + g[62] = cpy[2] * (yiyj + c0y[2]) + b00[2]; + g[63] = cpy[3] * (yiyj + c0y[3]) + b00[3]; + + + + + g[112] = c0z[0] * g[96]; + g[113] = c0z[1] * g[97]; + g[114] = c0z[2] * g[98]; + g[115] = c0z[3] * g[99]; + g[104] = cpz[0] * g[96]; + g[105] = cpz[1] * g[97]; + g[106] = cpz[2] * g[98]; + g[107] = cpz[3] * g[99]; + g[120] = cpz[0] * g[112] + b00[0] * g[96]; + g[121] = cpz[1] * g[113] + b00[1] * g[97]; + g[122] = cpz[2] * g[114] + b00[2] * g[98]; + g[123] = cpz[3] * g[115] + b00[3] * g[99]; + g[116] = g[112] * (zizj + c0z[0]) + b10[0] * g[96]; + g[117] = g[113] * (zizj + c0z[1]) + b10[1] * g[97]; + g[118] = g[114] * (zizj + c0z[2]) + b10[2] * g[98]; + g[119] = g[115] * (zizj + c0z[3]) + b10[3] * g[99]; + g[100] = g[96] * (zizj + c0z[0]); + g[101] = g[97] * (zizj + c0z[1]); + g[102] = g[98] * (zizj + c0z[2]); + g[103] = g[99] * (zizj + c0z[3]); + g[124] = g[120] * (zizj + c0z[0]) + b10[0] * g[104] + b00[0] * g[112]; + g[125] = g[121] * (zizj + c0z[1]) + b10[1] * g[105] + b00[1] * g[113]; + g[126] = g[122] * (zizj + c0z[2]) + b10[2] * g[106] + b00[2] * g[114]; + g[127] = g[123] * (zizj + c0z[3]) + b10[3] * g[107] + b00[3] * g[115]; + g[108] = zizj * g[104] + cpz[0] * g[112] + b00[0] * g[96]; + g[109] = zizj * g[105] + cpz[1] * g[113] + b00[1] * g[97]; + g[110] = zizj * g[106] + cpz[2] * g[114] + b00[2] * g[98]; + g[111] = zizj * g[107] + cpz[3] * g[115] + b00[3] * g[99]; +} + +static inline void _srg0_2d4d_1200(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + dtype xixj = envs->rirj[0]; + dtype yiyj = envs->rirj[1]; + dtype zizj = envs->rirj[2]; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[8] = c0x[0]; + g[9] = c0x[1]; + g[10] = c0x[2]; + g[11] = c0x[3]; + g[16] = c0x[0] * c0x[0] + b10[0]; + g[17] = c0x[1] * c0x[1] + b10[1]; + g[18] = c0x[2] * c0x[2] + b10[2]; + g[19] = c0x[3] * c0x[3] + b10[3]; + g[20] = g[16] * (xixj + c0x[0]) + c0x[0] * 2 * b10[0]; + g[21] = g[17] * (xixj + c0x[1]) + c0x[1] * 2 * b10[1]; + g[22] = g[18] * (xixj + c0x[2]) + c0x[2] * 2 * b10[2]; + g[23] = g[19] * (xixj + c0x[3]) + c0x[3] * 2 * b10[3]; + g[12] = c0x[0] * (xixj + c0x[0]) + b10[0]; + g[13] = c0x[1] * (xixj + c0x[1]) + b10[1]; + g[14] = c0x[2] * (xixj + c0x[2]) + b10[2]; + g[15] = c0x[3] * (xixj + c0x[3]) + b10[3]; + g[4] = xixj + c0x[0]; + g[5] = xixj + c0x[1]; + g[6] = xixj + c0x[2]; + g[7] = xixj + c0x[3]; + g[32] = 1; + g[33] = 1; + g[34] = 1; + g[35] = 1; + g[40] = c0y[0]; + g[41] = c0y[1]; + g[42] = c0y[2]; + g[43] = c0y[3]; + g[48] = c0y[0] * c0y[0] + b10[0]; + g[49] = c0y[1] * c0y[1] + b10[1]; + g[50] = c0y[2] * c0y[2] + b10[2]; + g[51] = c0y[3] * c0y[3] + b10[3]; + g[52] = g[48] * (yiyj + c0y[0]) + c0y[0] * 2 * b10[0]; + g[53] = g[49] * (yiyj + c0y[1]) + c0y[1] * 2 * b10[1]; + g[54] = g[50] * (yiyj + c0y[2]) + c0y[2] * 2 * b10[2]; + g[55] = g[51] * (yiyj + c0y[3]) + c0y[3] * 2 * b10[3]; + g[44] = c0y[0] * (yiyj + c0y[0]) + b10[0]; + g[45] = c0y[1] * (yiyj + c0y[1]) + b10[1]; + g[46] = c0y[2] * (yiyj + c0y[2]) + b10[2]; + g[47] = c0y[3] * (yiyj + c0y[3]) + b10[3]; + g[36] = yiyj + c0y[0]; + g[37] = yiyj + c0y[1]; + g[38] = yiyj + c0y[2]; + g[39] = yiyj + c0y[3]; + + + + + g[72] = c0z[0] * g[64]; + g[73] = c0z[1] * g[65]; + g[74] = c0z[2] * g[66]; + g[75] = c0z[3] * g[67]; + g[80] = c0z[0] * g[72] + b10[0] * g[64]; + g[81] = c0z[1] * g[73] + b10[1] * g[65]; + g[82] = c0z[2] * g[74] + b10[2] * g[66]; + g[83] = c0z[3] * g[75] + b10[3] * g[67]; + g[84] = g[80] * (zizj + c0z[0]) + 2 * b10[0] * g[72]; + g[85] = g[81] * (zizj + c0z[1]) + 2 * b10[1] * g[73]; + g[86] = g[82] * (zizj + c0z[2]) + 2 * b10[2] * g[74]; + g[87] = g[83] * (zizj + c0z[3]) + 2 * b10[3] * g[75]; + g[76] = g[72] * (zizj + c0z[0]) + b10[0] * g[64]; + g[77] = g[73] * (zizj + c0z[1]) + b10[1] * g[65]; + g[78] = g[74] * (zizj + c0z[2]) + b10[2] * g[66]; + g[79] = g[75] * (zizj + c0z[3]) + b10[3] * g[67]; + g[68] = g[64] * (zizj + c0z[0]); + g[69] = g[65] * (zizj + c0z[1]); + g[70] = g[66] * (zizj + c0z[2]); + g[71] = g[67] * (zizj + c0z[3]); +} + +static inline void _srg0_2d4d_2000(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[2]; + g[7] = c0x[3]; + g[8] = c0x[0] * c0x[0] + b10[0]; + g[9] = c0x[1] * c0x[1] + b10[1]; + g[10] = c0x[2] * c0x[2] + b10[2]; + g[11] = c0x[3] * c0x[3] + b10[3]; + g[12] = 1; + g[13] = 1; + g[14] = 1; + g[15] = 1; + g[16] = c0y[0]; + g[17] = c0y[1]; + g[18] = c0y[2]; + g[19] = c0y[3]; + g[20] = c0y[0] * c0y[0] + b10[0]; + g[21] = c0y[1] * c0y[1] + b10[1]; + g[22] = c0y[2] * c0y[2] + b10[2]; + g[23] = c0y[3] * c0y[3] + b10[3]; + + + + + g[28] = c0z[0] * g[24]; + g[29] = c0z[1] * g[25]; + g[30] = c0z[2] * g[26]; + g[31] = c0z[3] * g[27]; + g[32] = c0z[0] * g[28] + b10[0] * g[24]; + g[33] = c0z[1] * g[29] + b10[1] * g[25]; + g[34] = c0z[2] * g[30] + b10[2] * g[26]; + g[35] = c0z[3] * g[31] + b10[3] * g[27]; +} + +static inline void _srg0_2d4d_2001(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[2]; + g[7] = c0x[3]; + g[8] = c0x[0] * c0x[0] + b10[0]; + g[9] = c0x[1] * c0x[1] + b10[1]; + g[10] = c0x[2] * c0x[2] + b10[2]; + g[11] = c0x[3] * c0x[3] + b10[3]; + g[12] = cpx[0]; + g[13] = cpx[1]; + g[14] = cpx[2]; + g[15] = cpx[3]; + g[16] = cpx[0] * c0x[0] + b00[0]; + g[17] = cpx[1] * c0x[1] + b00[1]; + g[18] = cpx[2] * c0x[2] + b00[2]; + g[19] = cpx[3] * c0x[3] + b00[3]; + g[20] = c0x[0] * (g[16] + b00[0]) + b10[0] * cpx[0]; + g[21] = c0x[1] * (g[17] + b00[1]) + b10[1] * cpx[1]; + g[22] = c0x[2] * (g[18] + b00[2]) + b10[2] * cpx[2]; + g[23] = c0x[3] * (g[19] + b00[3]) + b10[3] * cpx[3]; + g[24] = 1; + g[25] = 1; + g[26] = 1; + g[27] = 1; + g[28] = c0y[0]; + g[29] = c0y[1]; + g[30] = c0y[2]; + g[31] = c0y[3]; + g[32] = c0y[0] * c0y[0] + b10[0]; + g[33] = c0y[1] * c0y[1] + b10[1]; + g[34] = c0y[2] * c0y[2] + b10[2]; + g[35] = c0y[3] * c0y[3] + b10[3]; + g[36] = cpy[0]; + g[37] = cpy[1]; + g[38] = cpy[2]; + g[39] = cpy[3]; + g[40] = cpy[0] * c0y[0] + b00[0]; + g[41] = cpy[1] * c0y[1] + b00[1]; + g[42] = cpy[2] * c0y[2] + b00[2]; + g[43] = cpy[3] * c0y[3] + b00[3]; + g[44] = c0y[0] * (g[40] + b00[0]) + b10[0] * cpy[0]; + g[45] = c0y[1] * (g[41] + b00[1]) + b10[1] * cpy[1]; + g[46] = c0y[2] * (g[42] + b00[2]) + b10[2] * cpy[2]; + g[47] = c0y[3] * (g[43] + b00[3]) + b10[3] * cpy[3]; + + + + + g[52] = c0z[0] * g[48]; + g[53] = c0z[1] * g[49]; + g[54] = c0z[2] * g[50]; + g[55] = c0z[3] * g[51]; + g[56] = c0z[0] * g[52] + b10[0] * g[48]; + g[57] = c0z[1] * g[53] + b10[1] * g[49]; + g[58] = c0z[2] * g[54] + b10[2] * g[50]; + g[59] = c0z[3] * g[55] + b10[3] * g[51]; + g[60] = cpz[0] * g[48]; + g[61] = cpz[1] * g[49]; + g[62] = cpz[2] * g[50]; + g[63] = cpz[3] * g[51]; + g[64] = cpz[0] * g[52] + b00[0] * g[48]; + g[65] = cpz[1] * g[53] + b00[1] * g[49]; + g[66] = cpz[2] * g[54] + b00[2] * g[50]; + g[67] = cpz[3] * g[55] + b00[3] * g[51]; + g[68] = c0z[0] * g[64] + b10[0] * g[60] + b00[0] * g[52]; + g[69] = c0z[1] * g[65] + b10[1] * g[61] + b00[1] * g[53]; + g[70] = c0z[2] * g[66] + b10[2] * g[62] + b00[2] * g[54]; + g[71] = c0z[3] * g[67] + b10[3] * g[63] + b00[3] * g[55]; +} + +static inline void _srg0_2d4d_2010(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *cpx = bc->c0px; + dtype *cpy = bc->c0py; + dtype *cpz = bc->c0pz; + dtype *b00 = bc->b00; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[2]; + g[7] = c0x[3]; + g[8] = c0x[0] * c0x[0] + b10[0]; + g[9] = c0x[1] * c0x[1] + b10[1]; + g[10] = c0x[2] * c0x[2] + b10[2]; + g[11] = c0x[3] * c0x[3] + b10[3]; + g[12] = cpx[0]; + g[13] = cpx[1]; + g[14] = cpx[2]; + g[15] = cpx[3]; + g[16] = cpx[0] * c0x[0] + b00[0]; + g[17] = cpx[1] * c0x[1] + b00[1]; + g[18] = cpx[2] * c0x[2] + b00[2]; + g[19] = cpx[3] * c0x[3] + b00[3]; + g[20] = c0x[0] * (g[16] + b00[0]) + b10[0] * cpx[0]; + g[21] = c0x[1] * (g[17] + b00[1]) + b10[1] * cpx[1]; + g[22] = c0x[2] * (g[18] + b00[2]) + b10[2] * cpx[2]; + g[23] = c0x[3] * (g[19] + b00[3]) + b10[3] * cpx[3]; + g[24] = 1; + g[25] = 1; + g[26] = 1; + g[27] = 1; + g[28] = c0y[0]; + g[29] = c0y[1]; + g[30] = c0y[2]; + g[31] = c0y[3]; + g[32] = c0y[0] * c0y[0] + b10[0]; + g[33] = c0y[1] * c0y[1] + b10[1]; + g[34] = c0y[2] * c0y[2] + b10[2]; + g[35] = c0y[3] * c0y[3] + b10[3]; + g[36] = cpy[0]; + g[37] = cpy[1]; + g[38] = cpy[2]; + g[39] = cpy[3]; + g[40] = cpy[0] * c0y[0] + b00[0]; + g[41] = cpy[1] * c0y[1] + b00[1]; + g[42] = cpy[2] * c0y[2] + b00[2]; + g[43] = cpy[3] * c0y[3] + b00[3]; + g[44] = c0y[0] * (g[40] + b00[0]) + b10[0] * cpy[0]; + g[45] = c0y[1] * (g[41] + b00[1]) + b10[1] * cpy[1]; + g[46] = c0y[2] * (g[42] + b00[2]) + b10[2] * cpy[2]; + g[47] = c0y[3] * (g[43] + b00[3]) + b10[3] * cpy[3]; + + + + + g[52] = c0z[0] * g[48]; + g[53] = c0z[1] * g[49]; + g[54] = c0z[2] * g[50]; + g[55] = c0z[3] * g[51]; + g[56] = c0z[0] * g[52] + b10[0] * g[48]; + g[57] = c0z[1] * g[53] + b10[1] * g[49]; + g[58] = c0z[2] * g[54] + b10[2] * g[50]; + g[59] = c0z[3] * g[55] + b10[3] * g[51]; + g[60] = cpz[0] * g[48]; + g[61] = cpz[1] * g[49]; + g[62] = cpz[2] * g[50]; + g[63] = cpz[3] * g[51]; + g[64] = cpz[0] * g[52] + b00[0] * g[48]; + g[65] = cpz[1] * g[53] + b00[1] * g[49]; + g[66] = cpz[2] * g[54] + b00[2] * g[50]; + g[67] = cpz[3] * g[55] + b00[3] * g[51]; + g[68] = c0z[0] * g[64] + b10[0] * g[60] + b00[0] * g[52]; + g[69] = c0z[1] * g[65] + b10[1] * g[61] + b00[1] * g[53]; + g[70] = c0z[2] * g[66] + b10[2] * g[62] + b00[2] * g[54]; + g[71] = c0z[3] * g[67] + b10[3] * g[63] + b00[3] * g[55]; +} + +static inline void _srg0_2d4d_2100(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + dtype xixj = envs->rirj[0]; + dtype yiyj = envs->rirj[1]; + dtype zizj = envs->rirj[2]; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[2]; + g[7] = c0x[3]; + g[8] = c0x[0] * c0x[0] + b10[0]; + g[9] = c0x[1] * c0x[1] + b10[1]; + g[10] = c0x[2] * c0x[2] + b10[2]; + g[11] = c0x[3] * c0x[3] + b10[3]; + g[24] = g[8] * (xixj + c0x[0]) + c0x[0] * 2 * b10[0]; + g[25] = g[9] * (xixj + c0x[1]) + c0x[1] * 2 * b10[1]; + g[26] = g[10] * (xixj + c0x[2]) + c0x[2] * 2 * b10[2]; + g[27] = g[11] * (xixj + c0x[3]) + c0x[3] * 2 * b10[3]; + g[20] = c0x[0] * (xixj + c0x[0]) + b10[0]; + g[21] = c0x[1] * (xixj + c0x[1]) + b10[1]; + g[22] = c0x[2] * (xixj + c0x[2]) + b10[2]; + g[23] = c0x[3] * (xixj + c0x[3]) + b10[3]; + g[16] = xixj + c0x[0]; + g[17] = xixj + c0x[1]; + g[18] = xixj + c0x[2]; + g[19] = xixj + c0x[3]; + g[32] = 1; + g[33] = 1; + g[34] = 1; + g[35] = 1; + g[36] = c0y[0]; + g[37] = c0y[1]; + g[38] = c0y[2]; + g[39] = c0y[3]; + g[40] = c0y[0] * c0y[0] + b10[0]; + g[41] = c0y[1] * c0y[1] + b10[1]; + g[42] = c0y[2] * c0y[2] + b10[2]; + g[43] = c0y[3] * c0y[3] + b10[3]; + g[56] = g[40] * (yiyj + c0y[0]) + c0y[0] * 2 * b10[0]; + g[57] = g[41] * (yiyj + c0y[1]) + c0y[1] * 2 * b10[1]; + g[58] = g[42] * (yiyj + c0y[2]) + c0y[2] * 2 * b10[2]; + g[59] = g[43] * (yiyj + c0y[3]) + c0y[3] * 2 * b10[3]; + g[52] = c0y[0] * (yiyj + c0y[0]) + b10[0]; + g[53] = c0y[1] * (yiyj + c0y[1]) + b10[1]; + g[54] = c0y[2] * (yiyj + c0y[2]) + b10[2]; + g[55] = c0y[3] * (yiyj + c0y[3]) + b10[3]; + g[48] = yiyj + c0y[0]; + g[49] = yiyj + c0y[1]; + g[50] = yiyj + c0y[2]; + g[51] = yiyj + c0y[3]; + + + + + g[68] = c0z[0] * g[64]; + g[69] = c0z[1] * g[65]; + g[70] = c0z[2] * g[66]; + g[71] = c0z[3] * g[67]; + g[72] = c0z[0] * g[68] + b10[0] * g[64]; + g[73] = c0z[1] * g[69] + b10[1] * g[65]; + g[74] = c0z[2] * g[70] + b10[2] * g[66]; + g[75] = c0z[3] * g[71] + b10[3] * g[67]; + g[88] = g[72] * (zizj + c0z[0]) + 2 * b10[0] * g[68]; + g[89] = g[73] * (zizj + c0z[1]) + 2 * b10[1] * g[69]; + g[90] = g[74] * (zizj + c0z[2]) + 2 * b10[2] * g[70]; + g[91] = g[75] * (zizj + c0z[3]) + 2 * b10[3] * g[71]; + g[84] = g[68] * (zizj + c0z[0]) + b10[0] * g[64]; + g[85] = g[69] * (zizj + c0z[1]) + b10[1] * g[65]; + g[86] = g[70] * (zizj + c0z[2]) + b10[2] * g[66]; + g[87] = g[71] * (zizj + c0z[3]) + b10[3] * g[67]; + g[80] = g[64] * (zizj + c0z[0]); + g[81] = g[65] * (zizj + c0z[1]); + g[82] = g[66] * (zizj + c0z[2]); + g[83] = g[67] * (zizj + c0z[3]); +} + +static inline void _srg0_2d4d_3000(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + dtype *c0x = bc->c00x; + dtype *c0y = bc->c00y; + dtype *c0z = bc->c00z; + dtype *b10 = bc->b10; + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] = c0x[0]; + g[5] = c0x[1]; + g[6] = c0x[2]; + g[7] = c0x[3]; + g[8] = c0x[0] * c0x[0] + b10[0]; + g[9] = c0x[1] * c0x[1] + b10[1]; + g[10] = c0x[2] * c0x[2] + b10[2]; + g[11] = c0x[3] * c0x[3] + b10[3]; + g[12] = c0x[0] * (g[8] + 2 * b10[0]); + g[13] = c0x[1] * (g[9] + 2 * b10[1]); + g[14] = c0x[2] * (g[10] + 2 * b10[2]); + g[15] = c0x[3] * (g[11] + 2 * b10[3]); + g[16] = 1; + g[17] = 1; + g[18] = 1; + g[19] = 1; + g[20] = c0y[0]; + g[21] = c0y[1]; + g[22] = c0y[2]; + g[23] = c0y[3]; + g[24] = c0y[0] * c0y[0] + b10[0]; + g[25] = c0y[1] * c0y[1] + b10[1]; + g[26] = c0y[2] * c0y[2] + b10[2]; + g[27] = c0y[3] * c0y[3] + b10[3]; + g[28] = c0y[0] * (g[24] + 2 * b10[0]); + g[29] = c0y[1] * (g[25] + 2 * b10[1]); + g[30] = c0y[2] * (g[26] + 2 * b10[2]); + g[31] = c0y[3] * (g[27] + 2 * b10[3]); + + + + + g[36] = c0z[0] * g[32]; + g[37] = c0z[1] * g[33]; + g[38] = c0z[2] * g[34]; + g[39] = c0z[3] * g[35]; + g[40] = c0z[0] * g[36] + b10[0] * g[32]; + g[41] = c0z[1] * g[37] + b10[1] * g[33]; + g[42] = c0z[2] * g[38] + b10[2] * g[34]; + g[43] = c0z[3] * g[39] + b10[3] * g[35]; + g[44] = c0z[0] * g[40] + 2 * b10[0] * g[36]; + g[45] = c0z[1] * g[41] + 2 * b10[1] * g[37]; + g[46] = c0z[2] * g[42] + 2 * b10[2] * g[38]; + g[47] = c0z[3] * g[43] + 2 * b10[3] * g[39]; +} + +void CINTsrg0_2e_2d4d_unrolled(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + int type_ijkl = ((envs->li_ceil << 6) | (envs->lj_ceil << 4) | + (envs->lk_ceil << 2) | (envs->ll_ceil)); + switch (type_ijkl) { + case 0b00000000: _srg0_2d4d_0000(g, bc, envs); return; + case 0b00000001: _srg0_2d4d_0001(g, bc, envs); return; + case 0b00000010: _srg0_2d4d_0002(g, bc, envs); return; + case 0b00000011: _srg0_2d4d_0003(g, bc, envs); return; + case 0b00000100: _srg0_2d4d_0010(g, bc, envs); return; + case 0b00000101: _srg0_2d4d_0011(g, bc, envs); return; + case 0b00000110: _srg0_2d4d_0012(g, bc, envs); return; + case 0b00001000: _srg0_2d4d_0020(g, bc, envs); return; + case 0b00001001: _srg0_2d4d_0021(g, bc, envs); return; + case 0b00001100: _srg0_2d4d_0030(g, bc, envs); return; + case 0b00010000: _srg0_2d4d_0100(g, bc, envs); return; + case 0b00010001: _srg0_2d4d_0101(g, bc, envs); return; + case 0b00010010: _srg0_2d4d_0102(g, bc, envs); return; + case 0b00010100: _srg0_2d4d_0110(g, bc, envs); return; + case 0b00010101: _srg0_2d4d_0111(g, bc, envs); return; + case 0b00011000: _srg0_2d4d_0120(g, bc, envs); return; + case 0b00100000: _srg0_2d4d_0200(g, bc, envs); return; + case 0b00100001: _srg0_2d4d_0201(g, bc, envs); return; + case 0b00100100: _srg0_2d4d_0210(g, bc, envs); return; + case 0b00110000: _srg0_2d4d_0300(g, bc, envs); return; + case 0b01000000: _srg0_2d4d_1000(g, bc, envs); return; + case 0b01000001: _srg0_2d4d_1001(g, bc, envs); return; + case 0b01000010: _srg0_2d4d_1002(g, bc, envs); return; + case 0b01000100: _srg0_2d4d_1010(g, bc, envs); return; + case 0b01000101: _srg0_2d4d_1011(g, bc, envs); return; + case 0b01001000: _srg0_2d4d_1020(g, bc, envs); return; + case 0b01010000: _srg0_2d4d_1100(g, bc, envs); return; + case 0b01010001: _srg0_2d4d_1101(g, bc, envs); return; + case 0b01010100: _srg0_2d4d_1110(g, bc, envs); return; + case 0b01100000: _srg0_2d4d_1200(g, bc, envs); return; + case 0b10000000: _srg0_2d4d_2000(g, bc, envs); return; + case 0b10000001: _srg0_2d4d_2001(g, bc, envs); return; + case 0b10000100: _srg0_2d4d_2010(g, bc, envs); return; + case 0b10010000: _srg0_2d4d_2100(g, bc, envs); return; + case 0b11000000: _srg0_2d4d_3000(g, bc, envs); return; + } + //fprintf(stderr, "Dimension error for CINTg0_2e_lj2d4d: iklj = %d %d %d %d", + // (int)envs->li_ceil, (int)envs->lk_ceil, + // (int)envs->ll_ceil, (int)envs->lj_ceil); +} + +void CINTg0_2e_lj2d4d(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + CINTg0_2e_2d(g, bc, envs); + CINTg0_lj2d_4d(g, envs); +} + +void CINTg0_2e_kj2d4d(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + CINTg0_2e_2d(g, bc, envs); + CINTg0_kj2d_4d(g, envs); +} +void CINTg0_2e_ik2d4d(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + CINTg0_2e_2d(g, bc, envs); + CINTg0_ik2d_4d(g, envs); +} +void CINTg0_2e_il2d4d(dtype *g, Rys2eT *bc, CINTEnvVars *envs) +{ + CINTg0_2e_2d(g, bc, envs); + CINTg0_il2d_4d(g, envs); +} + + +FINT CINTg0_2e(dtype *g, dtype *rij, dtype *rkl, dtype cutoff, CINTEnvVars *envs) +{ + FINT irys; + FINT nroots = envs->nrys_roots; + dtype aij = envs->ai[0] + envs->aj[0]; + dtype akl = envs->ak[0] + envs->al[0]; + dtype a0, a1, fac1, x; + dtype u[MXRYSROOTS]; + dtype *w = g + envs->g_size * 2; + dtype xij_kl = rij[0] - rkl[0]; + dtype yij_kl = rij[1] - rkl[1]; + dtype zij_kl = rij[2] - rkl[2]; + dtype rr = xij_kl * xij_kl + yij_kl * yij_kl + zij_kl * zij_kl; + + a1 = aij * akl; + a0 = a1 / (aij + akl); + fac1 = sqrt(a0 / (a1 * a1 * a1)) * envs->fac[0]; + x = a0 * rr; + const dtype omega = envs->env[PTR_RANGE_OMEGA]; + dtype theta = 0; + if (omega == 0.) { + CINTrys_roots(nroots, x, u, w); + } else if (omega < 0.) { + + theta = omega * omega / (omega * omega + a0); + + + if (theta * x > cutoff || theta * x > EXPCUTOFF_SR) { + return 0; + } + int rorder = envs->rys_order; + if (rorder == nroots) { + CINTsr_rys_roots(nroots, x, sqrt(theta), u, w); + } else { + dtype sqrt_theta = -sqrt(theta); + CINTrys_roots(rorder, x, u, w); + CINTrys_roots(rorder, theta*x, u+rorder, w+rorder); + if (envs->g_size == 2) { + g[0] = 1; + g[1] = 1; + g[2] = 1; + g[3] = 1; + g[4] *= fac1; + g[5] *= fac1 * sqrt_theta; + return 1; + } + for (irys = rorder; irys < nroots; irys++) { + dtype ut = u[irys] * theta; + u[irys] = ut / (u[irys]+1.-ut); + w[irys] *= sqrt_theta; + } + } + } else { + + theta = omega * omega / (omega * omega + a0); + x *= theta; + fac1 *= sqrt(theta); + CINTrys_roots(nroots, x, u, w); + + for (irys = 0; irys < nroots; irys++) { + dtype ut = u[irys] * theta; + u[irys] = ut / (u[irys]+1.-ut); + } + } + if (envs->g_size == 1) { + g[0] = 1; + g[1] = 1; + g[2] *= fac1; + return 1; + } + + dtype u2, tmp1, tmp2, tmp3, tmp4, tmp5; + dtype rijrx = rij[0] - envs->rx_in_rijrx[0]; + dtype rijry = rij[1] - envs->rx_in_rijrx[1]; + dtype rijrz = rij[2] - envs->rx_in_rijrx[2]; + dtype rklrx = rkl[0] - envs->rx_in_rklrx[0]; + dtype rklry = rkl[1] - envs->rx_in_rklrx[1]; + dtype rklrz = rkl[2] - envs->rx_in_rklrx[2]; + Rys2eT bc; + dtype *b00 = bc.b00; + dtype *b10 = bc.b10; + dtype *b01 = bc.b01; + dtype *c00x = bc.c00x; + dtype *c00y = bc.c00y; + dtype *c00z = bc.c00z; + dtype *c0px = bc.c0px; + dtype *c0py = bc.c0py; + dtype *c0pz = bc.c0pz; + + for (irys = 0; irys < nroots; irys++) { + + u2 = a0 * u[irys]; + tmp4 = .5 / (u2 * (aij + akl) + a1); + tmp5 = u2 * tmp4; + tmp1 = 2. * tmp5; + tmp2 = tmp1 * akl; + tmp3 = tmp1 * aij; + b00[irys] = tmp5; + b10[irys] = tmp5 + tmp4 * akl; + b01[irys] = tmp5 + tmp4 * aij; + c00x[irys] = rijrx - tmp2 * xij_kl; + c00y[irys] = rijry - tmp2 * yij_kl; + c00z[irys] = rijrz - tmp2 * zij_kl; + c0px[irys] = rklrx + tmp3 * xij_kl; + c0py[irys] = rklry + tmp3 * yij_kl; + c0pz[irys] = rklrz + tmp3 * zij_kl; + w[irys] *= fac1; + } + + //(*envs->f_g0_2d4d)(g, &bc, envs); + if (version_f_g0_2d4d == 0){ CINTg0_2e_2d4d_unrolled(g, &bc, envs); } + else if (version_f_g0_2d4d == 1){ CINTsrg0_2e_2d4d_unrolled(g, &bc, envs); } + else if (version_f_g0_2d4d == 2){ CINTg0_2e_ik2d4d(g, &bc, envs); } + else if (version_f_g0_2d4d == 3){ CINTg0_2e_kj2d4d(g, &bc, envs); } + else if (version_f_g0_2d4d == 4){ CINTg0_2e_il2d4d(g, &bc, envs); } + else if (version_f_g0_2d4d == 5){ CINTg0_2e_lj2d4d(g, &bc, envs); } + + /*if (rys_order <= 2) { + envs->f_g0_2d4d = (void (*)(...))&CINTg0_2e_2d4d_unrolled; + version_f_g0_2d4d = 0 + if (rys_order != nrys_roots) { + envs->f_g0_2d4d = (void (*)(...))&CINTsrg0_2e_2d4d_unrolled; + version_f_g0_2d4d = 1 + } + } else if (kbase) { + if (ibase) { + envs->f_g0_2d4d = (void (*)(...))&CINTg0_2e_ik2d4d; + version_f_g0_2d4d = 2 + } else { + envs->f_g0_2d4d = (void (*)(...))&CINTg0_2e_kj2d4d; + version_f_g0_2d4d = 3 + } + } else { + if (ibase) { + envs->f_g0_2d4d = (void (*)(...))&CINTg0_2e_il2d4d; + version_f_g0_2d4d = 4 + } else { + envs->f_g0_2d4d = (void (*)(...))&CINTg0_2e_lj2d4d; + version_f_g0_2d4d = 5 + } + }*/ + + return 1; +} + + +void CINTnabla1i_2e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs) +{ + FINT i, j, k, l, n, ptr; + const FINT di = envs->g_stride_i; + const FINT dk = envs->g_stride_k; + const FINT dl = envs->g_stride_l; + const FINT dj = envs->g_stride_j; + const FINT nroots = envs->nrys_roots; + const dtype ai2 = -2 * envs->ai[0]; + DEF_GXYZ(const dtype, g, gx, gy, gz); + DEF_GXYZ(dtype, f, fx, fy, fz); + + const dtype *p1x = gx - di; + const dtype *p1y = gy - di; + const dtype *p1z = gz - di; + const dtype *p2x = gx + di; + const dtype *p2y = gy + di; + const dtype *p2z = gz + di; + for (j = 0; j <= lj; j++) + for (l = 0; l <= ll; l++) + for (k = 0; k <= lk; k++) { + ptr = dj * j + dl * l + dk * k; + + for (n = ptr; n < ptr+nroots; n++) { + fx[n] = ai2 * p2x[n]; + fy[n] = ai2 * p2y[n]; + fz[n] = ai2 * p2z[n]; + } + ptr += di; + + for (i = 1; i <= li; i++) { + for (n = ptr; n < ptr+nroots; n++) { + fx[n] = i*p1x[n] + ai2*p2x[n]; + fy[n] = i*p1y[n] + ai2*p2y[n]; + fz[n] = i*p1z[n] + ai2*p2z[n]; + } + ptr += di; + } + } +} + + +void CINTnabla1j_2e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs) +{ + FINT i, j, k, l, n, ptr; + const FINT di = envs->g_stride_i; + const FINT dk = envs->g_stride_k; + const FINT dl = envs->g_stride_l; + const FINT dj = envs->g_stride_j; + const FINT nroots = envs->nrys_roots; + const dtype aj2 = -2 * envs->aj[0]; + DEF_GXYZ(const dtype, g, gx, gy, gz); + DEF_GXYZ(dtype, f, fx, fy, fz); + + const dtype *p1x = gx - dj; + const dtype *p1y = gy - dj; + const dtype *p1z = gz - dj; + const dtype *p2x = gx + dj; + const dtype *p2y = gy + dj; + const dtype *p2z = gz + dj; + + for (l = 0; l <= ll; l++) { + for (k = 0; k <= lk; k++) { + ptr = dl * l + dk * k; + for (i = 0; i <= li; i++) { + for (n = ptr; n < ptr+nroots; n++) { + fx[n] = aj2 * p2x[n]; + fy[n] = aj2 * p2y[n]; + fz[n] = aj2 * p2z[n]; + } + ptr += di; + } + } } + + for (j = 1; j <= lj; j++) { + for (l = 0; l <= ll; l++) { + for (k = 0; k <= lk; k++) { + ptr = dj * j + dl * l + dk * k; + for (i = 0; i <= li; i++) { + for (n = ptr; n < ptr+nroots; n++) { + fx[n] = j*p1x[n] + aj2*p2x[n]; + fy[n] = j*p1y[n] + aj2*p2y[n]; + fz[n] = j*p1z[n] + aj2*p2z[n]; + } + ptr += di; + } + } } + } +} + + +void CINTnabla1k_2e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs) +{ + FINT i, j, k, l, n, ptr; + const FINT di = envs->g_stride_i; + const FINT dk = envs->g_stride_k; + const FINT dl = envs->g_stride_l; + const FINT dj = envs->g_stride_j; + const FINT nroots = envs->nrys_roots; + const dtype ak2 = -2 * envs->ak[0]; + DEF_GXYZ(const dtype, g, gx, gy, gz); + DEF_GXYZ(dtype, f, fx, fy, fz); + + const dtype *p1x = gx - dk; + const dtype *p1y = gy - dk; + const dtype *p1z = gz - dk; + const dtype *p2x = gx + dk; + const dtype *p2y = gy + dk; + const dtype *p2z = gz + dk; + for (j = 0; j <= lj; j++) + for (l = 0; l <= ll; l++) { + ptr = dj * j + dl * l; + + for (i = 0; i <= li; i++) { + for (n = ptr; n < ptr+nroots; n++) { + fx[n] = ak2 * p2x[n]; + fy[n] = ak2 * p2y[n]; + fz[n] = ak2 * p2z[n]; + } + ptr += di; + } + + for (k = 1; k <= lk; k++) { + ptr = dj * j + dl * l + dk * k; + for (i = 0; i <= li; i++) { + for (n = ptr; n < ptr+nroots; n++) { + fx[n] = k*p1x[n] + ak2*p2x[n]; + fy[n] = k*p1y[n] + ak2*p2y[n]; + fz[n] = k*p1z[n] + ak2*p2z[n]; + } + ptr += di; + } + } + } +} + + +void CINTnabla1l_2e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs) +{ + FINT i, j, k, l, n, ptr; + const FINT di = envs->g_stride_i; + const FINT dk = envs->g_stride_k; + const FINT dl = envs->g_stride_l; + const FINT dj = envs->g_stride_j; + const FINT nroots = envs->nrys_roots; + const dtype al2 = -2 * envs->al[0]; + DEF_GXYZ(const dtype, g, gx, gy, gz); + DEF_GXYZ(dtype, f, fx, fy, fz); + + const dtype *p1x = gx - dl; + const dtype *p1y = gy - dl; + const dtype *p1z = gz - dl; + const dtype *p2x = gx + dl; + const dtype *p2y = gy + dl; + const dtype *p2z = gz + dl; + for (j = 0; j <= lj; j++) { + + for (k = 0; k <= lk; k++) { + ptr = dj * j + dk * k; + for (i = 0; i <= li; i++) { + for (n = ptr; n < ptr+nroots; n++) { + fx[n] = al2 * p2x[n]; + fy[n] = al2 * p2y[n]; + fz[n] = al2 * p2z[n]; + } + ptr += di; + } + } + + for (l = 1; l <= ll; l++) { + for (k = 0; k <= lk; k++) { + ptr = dj * j + dl * l + dk * k; + for (i = 0; i <= li; i++, ptr += di) { + for (n = ptr; n < ptr+nroots; n++) { + fx[n] = l*p1x[n] + al2*p2x[n]; + fy[n] = l*p1y[n] + al2*p2y[n]; + fz[n] = l*p1z[n] + al2*p2z[n]; + } } + } + } + } +} + + +void CINTx1i_2e(dtype *f, const dtype *g, const dtype *ri, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs) +{ + FINT i, j, k, l, n, ptr; + const FINT di = envs->g_stride_i; + const FINT dk = envs->g_stride_k; + const FINT dl = envs->g_stride_l; + const FINT dj = envs->g_stride_j; + const FINT nroots = envs->nrys_roots; + DEF_GXYZ(const dtype, g, gx, gy, gz); + DEF_GXYZ(dtype, f, fx, fy, fz); + + const dtype *p1x = gx + di; + const dtype *p1y = gy + di; + const dtype *p1z = gz + di; + for (j = 0; j <= lj; j++) + for (l = 0; l <= ll; l++) { + for (k = 0; k <= lk; k++) { + + ptr = dj * j + dl * l + dk * k; + for (i = 0; i <= li; i++) { + for (n = ptr; n < ptr+nroots; n++) { + fx[n] = p1x[n] + ri[0] * gx[n]; + fy[n] = p1y[n] + ri[1] * gy[n]; + fz[n] = p1z[n] + ri[2] * gz[n]; + } + ptr += di; + } + } } +} + + +void CINTx1j_2e(dtype *f, const dtype *g, const dtype *rj, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs) +{ + FINT i, j, k, l, n, ptr; + const FINT di = envs->g_stride_i; + const FINT dk = envs->g_stride_k; + const FINT dl = envs->g_stride_l; + const FINT dj = envs->g_stride_j; + const FINT nroots = envs->nrys_roots; + DEF_GXYZ(const dtype, g, gx, gy, gz); + DEF_GXYZ(dtype, f, fx, fy, fz); + + const dtype *p1x = gx + dj; + const dtype *p1y = gy + dj; + const dtype *p1z = gz + dj; + for (j = 0; j <= lj; j++) + for (l = 0; l <= ll; l++) { + for (k = 0; k <= lk; k++) { + + ptr = dj * j + dl * l + dk * k; + for (i = 0; i <= li; i++) { + for (n = ptr; n < ptr+nroots; n++) { + fx[n] = p1x[n] + rj[0] * gx[n]; + fy[n] = p1y[n] + rj[1] * gy[n]; + fz[n] = p1z[n] + rj[2] * gz[n]; + } + ptr += di; + } + } } +} + + +void CINTx1k_2e(dtype *f, const dtype *g, const dtype *rk, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs) +{ + FINT i, j, k, l, n, ptr; + const FINT di = envs->g_stride_i; + const FINT dk = envs->g_stride_k; + const FINT dl = envs->g_stride_l; + const FINT dj = envs->g_stride_j; + const FINT nroots = envs->nrys_roots; + DEF_GXYZ(const dtype, g, gx, gy, gz); + DEF_GXYZ(dtype, f, fx, fy, fz); + + const dtype *p1x = gx + dk; + const dtype *p1y = gy + dk; + const dtype *p1z = gz + dk; + for (j = 0; j <= lj; j++) + for (l = 0; l <= ll; l++) { + for (k = 0; k <= lk; k++) { + + ptr = dj * j + dl * l + dk * k; + for (i = 0; i <= li; i++) { + for (n = ptr; n < ptr+nroots; n++) { + fx[n] = p1x[n] + rk[0] * gx[n]; + fy[n] = p1y[n] + rk[1] * gy[n]; + fz[n] = p1z[n] + rk[2] * gz[n]; + } + ptr += di; + } + } } +} + + +void CINTx1l_2e(dtype *f, const dtype *g, const dtype *rl, + const FINT li, const FINT lj, const FINT lk, const FINT ll, + const CINTEnvVars *envs) +{ + FINT i, j, k, l, n, ptr; + const FINT di = envs->g_stride_i; + const FINT dk = envs->g_stride_k; + const FINT dl = envs->g_stride_l; + const FINT dj = envs->g_stride_j; + const FINT nroots = envs->nrys_roots; + DEF_GXYZ(const dtype, g, gx, gy, gz); + DEF_GXYZ(dtype, f, fx, fy, fz); + + const dtype *p1x = gx + dl; + const dtype *p1y = gy + dl; + const dtype *p1z = gz + dl; + for (j = 0; j <= lj; j++) + for (l = 0; l <= ll; l++) { + for (k = 0; k <= lk; k++) { + + ptr = dj * j + dl * l + dk * k; + for (i = 0; i <= li; i++) { + for (n = ptr; n < ptr+nroots; n++) { + fx[n] = p1x[n] + rl[0] * gx[n]; + fy[n] = p1y[n] + rl[1] * gy[n]; + fz[n] = p1z[n] + rl[2] * gz[n]; + } + ptr += di; + } + } } +} + + + +#include +//#include +#include +#include + +#define gctrg gout +#define gctrm gctr +#define mempty empty +#define m_ctr n_comp +#define ALIAS_ADDR_IF_EQUAL(x, y) \ + if (y##_ctr == 1) { \ + gctr##x = gctr##y; \ + x##empty = y##empty; \ + } else { \ + gctr##x = g1; \ + g1 += len##x; \ + } + +#define PRIM2CTR(ctrsymb, gp, ngp) \ + if (ctrsymb##_ctr > 1) {\ + if (*ctrsymb##empty) { \ + CINTprim_to_ctr_0(gctr##ctrsymb, gp, c##ctrsymb+ctrsymb##p, \ + ngp, ctrsymb##_prim, ctrsymb##_ctr, \ + non0ctr##ctrsymb[ctrsymb##p], \ + non0idx##ctrsymb+ctrsymb##p*ctrsymb##_ctr); \ + } else { \ + CINTprim_to_ctr_1(gctr##ctrsymb, gp, c##ctrsymb+ctrsymb##p, \ + ngp, ctrsymb##_prim, ctrsymb##_ctr, \ + non0ctr##ctrsymb[ctrsymb##p], \ + non0idx##ctrsymb+ctrsymb##p*ctrsymb##_ctr); \ + } \ + } \ + *ctrsymb##empty = 0 + +#define TRANSPOSE(a) \ + if (*empty) { \ + CINTdmat_transpose(gctr, a, nf*nc, n_comp); \ + *empty = 0; \ + } else { \ + CINTdplus_transpose(gctr, a, nf*nc, n_comp); \ + } \ + +FINT CINT2e_loop_nopt(dtype *gctr, CINTEnvVars *envs, dtype *cache, FINT *empty) +{ + FINT *shls = envs->shls; + FINT *bas = envs->bas; + dtype *env = envs->env; + FINT i_sh = shls[0]; + FINT j_sh = shls[1]; + FINT k_sh = shls[2]; + FINT l_sh = shls[3]; + FINT i_ctr = envs->x_ctr[0]; + FINT j_ctr = envs->x_ctr[1]; + FINT k_ctr = envs->x_ctr[2]; + FINT l_ctr = envs->x_ctr[3]; + FINT i_prim = bas(NPRIM_OF, i_sh); + FINT j_prim = bas(NPRIM_OF, j_sh); + FINT k_prim = bas(NPRIM_OF, k_sh); + FINT l_prim = bas(NPRIM_OF, l_sh); + + dtype *rk = envs->rk; + dtype *rl = envs->rl; + dtype *ai = env + bas(PTR_EXP, i_sh); + dtype *aj = env + bas(PTR_EXP, j_sh); + dtype *ak = env + bas(PTR_EXP, k_sh); + dtype *al = env + bas(PTR_EXP, l_sh); + dtype *ci = env + bas(PTR_COEFF, i_sh); + dtype *cj = env + bas(PTR_COEFF, j_sh); + dtype *ck = env + bas(PTR_COEFF, k_sh); + dtype *cl = env + bas(PTR_COEFF, l_sh); + dtype expcutoff = envs->expcutoff; + dtype rr_ij = SQUARE(envs->rirj); + dtype rr_kl = SQUARE(envs->rkrl); + //dtype *log_maxci, *log_maxcj, *log_maxck, *log_maxcl; + //PairData *pdata_base, *pdata_ij; + dtype *log_maxcj, *log_maxck, *log_maxcl; + PairData *pdata_ij; + + MALLOC(dtype, log_maxci); + MALLOC(PairData, pdata_base); + //MALLOC_INSTACK(log_maxci, i_prim+j_prim+k_prim+l_prim); + //MALLOC_INSTACK(pdata_base, i_prim*j_prim); + log_maxcj = log_maxci + i_prim; + log_maxck = log_maxcj + j_prim; + log_maxcl = log_maxck + k_prim; + CINTOpt_log_max_pgto_coeff(log_maxci, ci, i_prim, i_ctr); + CINTOpt_log_max_pgto_coeff(log_maxcj, cj, j_prim, j_ctr); + if (CINTset_pairdata(pdata_base, ai, aj, envs->ri, envs->rj, + log_maxci, log_maxcj, envs->li_ceil, envs->lj_ceil, + i_prim, j_prim, rr_ij, expcutoff, env)) { + return 0; + } + CINTOpt_log_max_pgto_coeff(log_maxck, ck, k_prim, k_ctr); + CINTOpt_log_max_pgto_coeff(log_maxcl, cl, l_prim, l_ctr); + + FINT n_comp = envs->ncomp_e1 * envs->ncomp_e2 * envs->ncomp_tensor; + size_t nf = envs->nf; + dtype fac1i, fac1j, fac1k, fac1l; + FINT ip, jp, kp, lp; + FINT _empty[5] = {1, 1, 1, 1, 1}; + FINT *iempty = _empty + 0; + FINT *jempty = _empty + 1; + FINT *kempty = _empty + 2; + FINT *lempty = _empty + 3; + FINT *gempty = _empty + 4; + + int lkl = envs->lk_ceil + envs->ll_ceil; + dtype akl, ekl, expijkl, ccekl, log_rr_kl, eijcutoff, cutoff; + dtype rkl[3]; + dtype *rij; + akl = ak[k_prim-1] + al[l_prim-1]; + log_rr_kl = 1.7 - 1.5 * approx_log(akl); + dtype omega = env[PTR_RANGE_OMEGA]; + if (omega < 0) { + + if (envs->rys_order > 1) { + dtype r_guess = 8.; + dtype omega2 = omega * omega; + int lij = envs->li_ceil + envs->lj_ceil; + if (lij > 0) { + dtype aij = ai[i_prim-1] + aj[j_prim-1]; + dtype dist_ij = sqrt(rr_ij); + dtype theta = omega2 / (omega2 + aij); + expcutoff += lij * approx_log( + (dist_ij+theta*r_guess+1.)/(dist_ij+1.)); + } + if (lkl > 0) { + dtype theta = omega2 / (omega2 + akl); + log_rr_kl += lkl * approx_log( + sqrt(rr_kl) + theta*r_guess + 1.); + } + } + } else { + if (lkl > 0) { + log_rr_kl += lkl * approx_log(sqrt(rr_kl) + 1.); + } + } + + //FINT *idx; + //MALLOC_INSTACK(idx, nf * 3); + MALLOC(FINT, idx); + CINTg2e_index_xyz(idx, envs); + + //FINT *non0ctri, *non0ctrj, *non0ctrk, *non0ctrl; + FINT *non0ctrj, *non0ctrk, *non0ctrl; + FINT *non0idxi, *non0idxj, *non0idxk, *non0idxl; + //MALLOC_INSTACK(non0ctri, i_prim+j_prim+k_prim+l_prim+i_prim*i_ctr+j_prim*j_ctr+k_prim*k_ctr+l_prim*l_ctr); + MALLOC(FINT, non0ctri); + non0ctrj = non0ctri + i_prim; + non0ctrk = non0ctrj + j_prim; + non0ctrl = non0ctrk + k_prim; + non0idxi = non0ctrl + l_prim; + non0idxj = non0idxi + i_prim*i_ctr; + non0idxk = non0idxj + j_prim*j_ctr; + non0idxl = non0idxk + k_prim*k_ctr; + CINTOpt_non0coeff_byshell(non0idxi, non0ctri, ci, i_prim, i_ctr); + CINTOpt_non0coeff_byshell(non0idxj, non0ctrj, cj, j_prim, j_ctr); + CINTOpt_non0coeff_byshell(non0idxk, non0ctrk, ck, k_prim, k_ctr); + CINTOpt_non0coeff_byshell(non0idxl, non0ctrl, cl, l_prim, l_ctr); + + FINT nc = i_ctr * j_ctr * k_ctr * l_ctr; + + size_t leng = envs->g_size * 3 * ((1<gbits)+1); + size_t lenl = nf * nc * n_comp; + size_t lenk = nf * i_ctr * j_ctr * k_ctr * n_comp; + size_t lenj = nf * i_ctr * j_ctr * n_comp; + size_t leni = nf * i_ctr * n_comp; + size_t len0 = nf * n_comp; + size_t len = leng + lenl + lenk + lenj + leni + len0; + //dtype *g; + //MALLOC_INSTACK(g, len); + MALLOC(dtype, g); + dtype *g1 = g + leng; + dtype *gout, *gctri, *gctrj, *gctrk, *gctrl; + ALIAS_ADDR_IF_EQUAL(l, m); + ALIAS_ADDR_IF_EQUAL(k, l); + ALIAS_ADDR_IF_EQUAL(j, k); + ALIAS_ADDR_IF_EQUAL(i, j); + ALIAS_ADDR_IF_EQUAL(g, i); + + for (lp = 0; lp < l_prim; lp++) { + envs->al[0] = al[lp]; + if (l_ctr == 1) { + fac1l = envs->common_factor * cl[lp]; + } else { + fac1l = envs->common_factor; + *kempty = 1; + } + for (kp = 0; kp < k_prim; kp++) { + akl = ak[kp] + al[lp]; + ekl = rr_kl * ak[kp] * al[lp] / akl; + ccekl = ekl - log_rr_kl - log_maxck[kp] - log_maxcl[lp]; + if (ccekl > expcutoff) { + goto k_contracted; + } + envs->ak[0] = ak[kp]; + rkl[0] = (ak[kp]*rk[0] + al[lp]*rl[0]) / akl; + rkl[1] = (ak[kp]*rk[1] + al[lp]*rl[1]) / akl; + rkl[2] = (ak[kp]*rk[2] + al[lp]*rl[2]) / akl; + eijcutoff = expcutoff - ccekl; + ekl = exp(-ekl); + + if (k_ctr == 1) { + fac1k = fac1l * ck[kp]; + } else { + fac1k = fac1l; + *jempty = 1; + } + + pdata_ij = pdata_base; + for (jp = 0; jp < j_prim; jp++) { + envs->aj[0] = aj[jp]; + if (j_ctr == 1) { + fac1j = fac1k * cj[jp]; + } else { + fac1j = fac1k; + *iempty = 1; + } + for (ip = 0; ip < i_prim; ip++, pdata_ij++) { + if (pdata_ij->cceij > eijcutoff) { + goto i_contracted; + } + envs->ai[0] = ai[ip]; + rij = pdata_ij->rij; + cutoff = eijcutoff - pdata_ij->cceij; + expijkl = pdata_ij->eij * ekl; + if (i_ctr == 1) { + fac1i = fac1j*ci[ip]*expijkl; + } else { + fac1i = fac1j*expijkl; + } + envs->fac[0] = fac1i; + // todo; + //if ((*envs->f_g0_2e)(g, rij, rkl, cutoff, envs)) { + // (*envs->f_gout)(gout, g, idx, envs, *gempty); + if (CINTg0_2e(g, rij, rkl, cutoff, envs)) { + if (WHICH_INTEGRAL == INT2E_SPH){ + CINTgout2e(gout, g, idx, envs, *gempty); + } + else if (WHICH_INTEGRAL == INT2E_IP1_SPH){ + CINTgout2e_int2e_ip1(gout, g, idx, envs, *gempty); + } + + PRIM2CTR(i, gout, len0); + } +i_contracted: ; + } + if (!*iempty) { + PRIM2CTR(j, gctri, leni); + } + } + if (!*jempty) { + PRIM2CTR(k, gctrj, lenj); + } +k_contracted: ; + } + if (!*kempty) { + PRIM2CTR(l, gctrk, lenk); + } + } + + if (n_comp > 1 && !*lempty) { + TRANSPOSE(gctrl); + } + return !*empty; +} + +#define COMMON_ENVS_AND_DECLARE \ + FINT *shls = envs->shls; \ + FINT *bas = envs->bas; \ + dtype *env = envs->env; \ + FINT i_sh = shls[0]; \ + FINT j_sh = shls[1]; \ + FINT k_sh = shls[2]; \ + FINT l_sh = shls[3]; \ + CINTOpt *opt = envs->opt; \ + if (opt->pairdata != NULL && \ + ((opt->pairdata[i_sh*opt->nbas+j_sh] == NOVALUE) || \ + (opt->pairdata[k_sh*opt->nbas+l_sh] == NOVALUE))) { \ + return 0; \ + } \ + FINT i_ctr = envs->x_ctr[0]; \ + FINT j_ctr = envs->x_ctr[1]; \ + FINT k_ctr = envs->x_ctr[2]; \ + FINT l_ctr = envs->x_ctr[3]; \ + FINT i_prim = bas(NPRIM_OF, i_sh); \ + FINT j_prim = bas(NPRIM_OF, j_sh); \ + FINT k_prim = bas(NPRIM_OF, k_sh); \ + FINT l_prim = bas(NPRIM_OF, l_sh); \ + dtype *ai = env + bas(PTR_EXP, i_sh); \ + dtype *aj = env + bas(PTR_EXP, j_sh); \ + dtype *ak = env + bas(PTR_EXP, k_sh); \ + dtype *al = env + bas(PTR_EXP, l_sh); \ + dtype *ci = env + bas(PTR_COEFF, i_sh); \ + dtype *cj = env + bas(PTR_COEFF, j_sh); \ + dtype *ck = env + bas(PTR_COEFF, k_sh); \ + dtype *cl = env + bas(PTR_COEFF, l_sh); \ + dtype expcutoff = envs->expcutoff; \ + dtype rr_ij = SQUARE(envs->rirj); \ + dtype rr_kl = SQUARE(envs->rkrl); \ + PairData *_pdata_ij, *_pdata_kl, *pdata_ij, *pdata_kl; \ + if (opt->pairdata != NULL) { \ + _pdata_ij = opt->pairdata[i_sh*opt->nbas+j_sh]; \ + _pdata_kl = opt->pairdata[k_sh*opt->nbas+l_sh]; \ + } else { \ + dtype *log_maxci = opt->log_max_coeff[i_sh]; \ + dtype *log_maxcj = opt->log_max_coeff[j_sh]; \ + MALLOC(PairData, _pdata_ij); \ + if (CINTset_pairdata(_pdata_ij, ai, aj, envs->ri, envs->rj, \ + log_maxci, log_maxcj, envs->li_ceil, envs->lj_ceil, \ + i_prim, j_prim, rr_ij, expcutoff, env)) { \ + return 0; \ + } \ + dtype *log_maxck = opt->log_max_coeff[k_sh]; \ + dtype *log_maxcl = opt->log_max_coeff[l_sh]; \ + _pdata_kl = _pdata_ij + i_prim*j_prim; \ + if (CINTset_pairdata(_pdata_kl, ak, al, envs->rk, envs->rl, \ + log_maxck, log_maxcl, envs->lk_ceil, envs->ll_ceil, \ + k_prim, l_prim, rr_kl, expcutoff, env)) { \ + return 0; \ + } \ + } \ + FINT n_comp = envs->ncomp_e1 * envs->ncomp_e2 * envs->ncomp_tensor; \ + size_t nf = envs->nf; \ + dtype fac1i, fac1j, fac1k, fac1l; \ + FINT ip, jp, kp, lp; \ + FINT _empty[5] = {1, 1, 1, 1, 1}; \ + FINT *iempty = _empty + 0; \ + FINT *jempty = _empty + 1; \ + FINT *kempty = _empty + 2; \ + FINT *lempty = _empty + 3; \ + FINT *gempty = _empty + 4; \ + FINT *non0ctri = opt->non0ctr[i_sh]; \ + FINT *non0ctrj = opt->non0ctr[j_sh]; \ + FINT *non0ctrk = opt->non0ctr[k_sh]; \ + FINT *non0ctrl = opt->non0ctr[l_sh]; \ + FINT *non0idxi = opt->sortedidx[i_sh]; \ + FINT *non0idxj = opt->sortedidx[j_sh]; \ + FINT *non0idxk = opt->sortedidx[k_sh]; \ + FINT *non0idxl = opt->sortedidx[l_sh]; \ + dtype expij, expkl, eijcutoff, eklcutoff, cutoff; \ + eklcutoff = expcutoff; \ + dtype *rij, *rkl; \ + FINT *idx = opt->index_xyz_array[envs->i_l*LMAX1*LMAX1*LMAX1 \ + +envs->j_l*LMAX1*LMAX1 \ + +envs->k_l*LMAX1 \ + +envs->l_l]; \ + if (idx == NULL) { \ + MALLOC(FINT, idx); \ + CINTg2e_index_xyz(idx, envs); \ + } + +#define ADJUST_CUTOFF \ + dtype omega = env[PTR_RANGE_OMEGA]; \ + if (omega < 0 && envs->rys_order > 1) { \ + dtype r_guess = 8.; \ + dtype omega2 = omega * omega; \ + int lij = envs->li_ceil + envs->lj_ceil; \ + int lkl = envs->lk_ceil + envs->ll_ceil; \ + if (lij > 0) { \ + dtype dist_ij = sqrt(rr_ij); \ + dtype aij = ai[i_prim-1] + aj[j_prim-1]; \ + dtype theta = omega2 / (omega2 + aij); \ + expcutoff += lij * approx_log( \ + (dist_ij+theta*r_guess+1.)/(dist_ij+1.)); \ + } \ + if (lkl > 0) { \ + dtype dist_kl = sqrt(rr_kl); \ + dtype akl = ak[k_prim-1] + al[l_prim-1]; \ + dtype theta = omega2 / (omega2 + akl); \ + expcutoff += lkl * approx_log( \ + (dist_kl+theta*r_guess+1.)/(dist_kl+1.)); \ + } \ + } + +#define SET_RIJ(I,J) \ + if (pdata_##I##J->cceij > e##I##J##cutoff) { \ + goto I##_contracted; } \ + envs->a##I[0] = a##I[I##p]; \ + exp##I##J = pdata_##I##J->eij; \ + r##I##J = pdata_##I##J->rij; + + +FINT CINT2e_1111_loop(dtype *gctr, CINTEnvVars *envs, dtype *cache, FINT *empty) +{ + COMMON_ENVS_AND_DECLARE; + ADJUST_CUTOFF; + FINT nc = 1; + size_t leng = envs->g_size * 3 * ((1<gbits)+1); + size_t len0 = nf * n_comp; + size_t len = leng + len0; + dtype *gout; + //dtype *g; + //MALLOC_INSTACK(g, len); + MALLOC(dtype, g); + if (n_comp == 1) { + gout = gctr; + gempty = empty; + } else { + gout = g + leng; + } + + pdata_kl = _pdata_kl; + for (lp = 0; lp < l_prim; lp++) { + envs->al[0] = al[lp]; + fac1l = envs->common_factor * cl[lp]; + for (kp = 0; kp < k_prim; kp++, pdata_kl++) { + SET_RIJ(k, l); + fac1k = fac1l * ck[kp]; + eijcutoff = eklcutoff - pdata_kl->cceij; + pdata_ij = _pdata_ij; + for (jp = 0; jp < j_prim; jp++) { + envs->aj[0] = aj[jp]; + fac1j = fac1k * cj[jp]; + for (ip = 0; ip < i_prim; ip++, pdata_ij++) { + SET_RIJ(i, j); + fac1i = fac1j*ci[ip]*expij*expkl; + envs->fac[0] = fac1i; + cutoff = eijcutoff - pdata_ij->cceij; + if ((*envs->f_g0_2e)(g, rij, rkl, cutoff, envs)) { + (*envs->f_gout)(gout, g, idx, envs, *gempty); + *gempty = 0; + } +i_contracted: ; + } + } +k_contracted: ; + } + } + + if (n_comp > 1 && !*gempty) { + TRANSPOSE(gout); + } + return !*empty; +} + + +FINT CINT2e_n111_loop(dtype *gctr, CINTEnvVars *envs, dtype *cache, FINT *empty) +{ + COMMON_ENVS_AND_DECLARE; + ADJUST_CUTOFF; + FINT nc = i_ctr; + size_t leng = envs->g_size * 3 * ((1<gbits)+1); + size_t leni = nf * i_ctr * n_comp; + size_t len0 = nf * n_comp; + size_t len = leng + leni + len0; + //dtype *g; + //MALLOC_INSTACK(g, len); + MALLOC(dtype, g); + dtype *g1 = g + leng; + dtype *gout, *gctri; + ALIAS_ADDR_IF_EQUAL(i, m); + gout = g1; + + pdata_kl = _pdata_kl; + for (lp = 0; lp < l_prim; lp++) { + envs->al[0] = al[lp]; + fac1l = envs->common_factor * cl[lp]; + for (kp = 0; kp < k_prim; kp++, pdata_kl++) { + SET_RIJ(k, l); + fac1k = fac1l * ck[kp]; + eijcutoff = eklcutoff - pdata_kl->cceij; + pdata_ij = _pdata_ij; + for (jp = 0; jp < j_prim; jp++) { + envs->aj[0] = aj[jp]; + fac1j = fac1k * cj[jp]; + for (ip = 0; ip < i_prim; ip++, pdata_ij++) { + if (pdata_ij->cceij > eijcutoff) { + goto i_contracted; + } + SET_RIJ(i, j); + cutoff = eijcutoff - pdata_ij->cceij; + fac1i = fac1j*expij*expkl; + envs->fac[0] = fac1i; + if ((*envs->f_g0_2e)(g, rij, rkl, cutoff, envs)) { + (*envs->f_gout)(gout, g, idx, envs, 1); + PRIM2CTR(i, gout, len0); + } +i_contracted: ; + } + } +k_contracted: ; + } + } + + if (n_comp > 1 && !*iempty) { + TRANSPOSE(gctri); + } + return !*empty; +} + + +FINT CINT2e_1n11_loop(dtype *gctr, CINTEnvVars *envs, dtype *cache, FINT *empty) +{ + //return 0; + COMMON_ENVS_AND_DECLARE; + ADJUST_CUTOFF; + FINT nc = j_ctr; + size_t leng = envs->g_size * 3 * ((1<gbits)+1); + size_t lenj = nf * j_ctr * n_comp; + size_t len0 = nf * n_comp; + size_t len = leng + lenj + len0; + //dtype *g; + //MALLOC_INSTACK(g, len); + MALLOC(dtype, g); + dtype *g1 = g + leng; + dtype *gout, *gctrj; + ALIAS_ADDR_IF_EQUAL(j, m); + gout = g1; + + pdata_kl = _pdata_kl; + for (lp = 0; lp < l_prim; lp++) { + envs->al[0] = al[lp]; + fac1l = envs->common_factor * cl[lp]; + for (kp = 0; kp < k_prim; kp++, pdata_kl++) { + SET_RIJ(k, l); + fac1k = fac1l * ck[kp]; + eijcutoff = eklcutoff - pdata_kl->cceij; + pdata_ij = _pdata_ij; + for (jp = 0; jp < j_prim; jp++) { + envs->aj[0] = aj[jp]; + fac1j = fac1k; + *iempty = 1; + for (ip = 0; ip < i_prim; ip++, pdata_ij++) { + SET_RIJ(i, j); + cutoff = eijcutoff - pdata_ij->cceij; + fac1i = fac1j*ci[ip]*expij*expkl; + envs->fac[0] = fac1i; + if ((*envs->f_g0_2e)(g, rij, rkl, cutoff, envs)) { + (*envs->f_gout)(gout, g, idx, envs, *iempty); + *iempty = 0; + } +i_contracted: ; + } + if (!*iempty) { + PRIM2CTR(j, gout, len0); + } + } +k_contracted: ; + } + } + + if (n_comp > 1 && !*jempty) { + TRANSPOSE(gctrj); + } + return !*empty; +} + + +FINT CINT2e_11n1_loop(dtype *gctr, CINTEnvVars *envs, dtype *cache, FINT *empty) +{ + //return 0; + COMMON_ENVS_AND_DECLARE; + ADJUST_CUTOFF; + FINT nc = k_ctr; + size_t leng = envs->g_size * 3 * ((1<gbits)+1); + size_t lenk = nf * k_ctr * n_comp; + size_t len0 = nf * n_comp; + size_t len = leng + lenk + len0; + //dtype *g; + //MALLOC_INSTACK(g, len); + MALLOC(dtype, g); + dtype *g1 = g + leng; + dtype *gout, *gctrk; + ALIAS_ADDR_IF_EQUAL(k, m); + gout = g1; + + pdata_kl = _pdata_kl; + for (lp = 0; lp < l_prim; lp++) { + envs->al[0] = al[lp]; + fac1l = envs->common_factor * cl[lp]; + for (kp = 0; kp < k_prim; kp++, pdata_kl++) { + SET_RIJ(k, l); + fac1k = fac1l; + eijcutoff = eklcutoff - pdata_kl->cceij; + pdata_ij = _pdata_ij; + *jempty = 1; + for (jp = 0; jp < j_prim; jp++) { + envs->aj[0] = aj[jp]; + fac1j = fac1k * cj[jp]; + for (ip = 0; ip < i_prim; ip++, pdata_ij++) { + SET_RIJ(i, j); + cutoff = eijcutoff - pdata_ij->cceij; + fac1i = fac1j*ci[ip]*expij*expkl; + envs->fac[0] = fac1i; + if ((*envs->f_g0_2e)(g, rij, rkl, cutoff, envs)) { + (*envs->f_gout)(gout, g, idx, envs, *jempty); + *jempty = 0; + } +i_contracted: ; + } + } + if (!*jempty) { + PRIM2CTR(k, gout, len0); + } +k_contracted: ; + } + } + + if (n_comp > 1 && !*kempty) { + TRANSPOSE(gctrk); + } + return !*empty; +} + + +FINT CINT2e_111n_loop(dtype *gctr, CINTEnvVars *envs, dtype *cache, FINT *empty) +{ + //return 0; + COMMON_ENVS_AND_DECLARE; + ADJUST_CUTOFF; + FINT nc = l_ctr; + size_t leng = envs->g_size * 3 * ((1<gbits)+1); + size_t lenl = nf * l_ctr * n_comp; + size_t len0 = nf * n_comp; + size_t len = leng + lenl + len0; + //dtype *g; + //MALLOC_INSTACK(g, len); + MALLOC(dtype, g); + dtype *g1 = g + leng; + dtype *gout, *gctrl; + ALIAS_ADDR_IF_EQUAL(l, m); + gout = g1; + + pdata_kl = _pdata_kl; + for (lp = 0; lp < l_prim; lp++) { + envs->al[0] = al[lp]; + fac1l = envs->common_factor; + *kempty = 1; + for (kp = 0; kp < k_prim; kp++, pdata_kl++) { + SET_RIJ(k, l); + fac1k = fac1l * ck[kp]; + eijcutoff = eklcutoff - pdata_kl->cceij; + pdata_ij = _pdata_ij; + for (jp = 0; jp < j_prim; jp++) { + envs->aj[0] = aj[jp]; + fac1j = fac1k * cj[jp]; + for (ip = 0; ip < i_prim; ip++, pdata_ij++) { + SET_RIJ(i, j); + cutoff = eijcutoff - pdata_ij->cceij; + fac1i = fac1j*ci[ip]*expij*expkl; + envs->fac[0] = fac1i; + if ((*envs->f_g0_2e)(g, rij, rkl, cutoff, envs)) { + (*envs->f_gout)(gout, g, idx, envs, *kempty); + *kempty = 0; + } +i_contracted: ; + } + } +k_contracted: ; + } + if (!*kempty) { + PRIM2CTR(l, gout, len0); + } + } + + if (n_comp > 1 && !*lempty) { + TRANSPOSE(gctrl); + } + return !*empty; +} + +FINT CINT2e_loop(dtype *gctr, CINTEnvVars *envs, dtype *cache, FINT *empty) +{ + //return 0; + COMMON_ENVS_AND_DECLARE; + ADJUST_CUTOFF; + FINT nc = i_ctr * j_ctr * k_ctr * l_ctr; + size_t leng = envs->g_size * 3 * ((1<gbits)+1); + size_t lenl = nf * nc * n_comp; + size_t lenk = nf * i_ctr * j_ctr * k_ctr * n_comp; + size_t lenj = nf * i_ctr * j_ctr * n_comp; + size_t leni = nf * i_ctr * n_comp; + size_t len0 = nf * n_comp; + size_t len = leng + lenl + lenk + lenj + leni + len0; + //dtype *g; + //MALLOC_INSTACK(g, len); + MALLOC(dtype, g); + dtype *g1 = g + leng; + dtype *gout, *gctri, *gctrj, *gctrk, *gctrl; + + ALIAS_ADDR_IF_EQUAL(l, m); + ALIAS_ADDR_IF_EQUAL(k, l); + ALIAS_ADDR_IF_EQUAL(j, k); + ALIAS_ADDR_IF_EQUAL(i, j); + ALIAS_ADDR_IF_EQUAL(g, i); + + pdata_kl = _pdata_kl; + for (lp = 0; lp < l_prim; lp++) { + envs->al[0] = al[lp]; + if (l_ctr == 1) { + fac1l = envs->common_factor * cl[lp]; + } else { + fac1l = envs->common_factor; + *kempty = 1; + } + for (kp = 0; kp < k_prim; kp++, pdata_kl++) { + + if (pdata_kl->cceij > eklcutoff) { + goto k_contracted; + } + envs->ak[0] = ak[kp]; + expkl = pdata_kl->eij; + rkl = pdata_kl->rij; + eijcutoff = eklcutoff - pdata_kl->cceij; + + if (k_ctr == 1) { + fac1k = fac1l * ck[kp]; + } else { + fac1k = fac1l; + *jempty = 1; + } + + pdata_ij = _pdata_ij; + for (jp = 0; jp < j_prim; jp++) { + envs->aj[0] = aj[jp]; + if (j_ctr == 1) { + fac1j = fac1k * cj[jp]; + } else { + fac1j = fac1k; + *iempty = 1; + } + for (ip = 0; ip < i_prim; ip++, pdata_ij++) { + + if (pdata_ij->cceij > eijcutoff) { + goto i_contracted; + } + envs->ai[0] = ai[ip]; + expij = pdata_ij->eij; + rij = pdata_ij->rij; + + cutoff = eijcutoff - pdata_ij->cceij; + if (i_ctr == 1) { + fac1i = fac1j*ci[ip] * expij*expkl; + } else { + fac1i = fac1j * expij*expkl; + } + envs->fac[0] = fac1i; + if ((*envs->f_g0_2e)(g, rij, rkl, cutoff, envs)) { + (*envs->f_gout)(gout, g, idx, envs, *gempty); + PRIM2CTR(i, gout, len0); + } +i_contracted: ; + } + if (!*iempty) { + PRIM2CTR(j, gctri, leni); + } + } + if (!*jempty) { + PRIM2CTR(k, gctrj, lenj); + } +k_contracted: ; + } + if (!*kempty) { + PRIM2CTR(l, gctrk, lenk); + } + } + + if (n_comp > 1 && !*lempty) { + TRANSPOSE(gctrl); + } + return !*empty; +} + +static FINT (*CINTf_2e_loop[16])(dtype *, CINTEnvVars *, dtype *, FINT *) = { + CINT2e_loop, + CINT2e_loop, + CINT2e_loop, + CINT2e_loop, + CINT2e_loop, + CINT2e_loop, + CINT2e_loop, + CINT2e_n111_loop, + CINT2e_loop, + CINT2e_loop, + CINT2e_loop, + CINT2e_1n11_loop, + CINT2e_loop, + CINT2e_11n1_loop, + CINT2e_111n_loop, + CINT2e_1111_loop, +}; + +#define PAIRDATA_NON0IDX_SIZE(ps) \ + FINT *bas = envs->bas; \ + FINT *shls = envs->shls; \ + FINT i_prim = bas(NPRIM_OF, shls[0]); \ + FINT j_prim = bas(NPRIM_OF, shls[1]); \ + FINT k_prim = bas(NPRIM_OF, shls[2]); \ + FINT l_prim = bas(NPRIM_OF, shls[3]); \ + size_t ps = ((i_prim*j_prim + k_prim*l_prim) * 5 \ + + i_prim * x_ctr[0] \ + + j_prim * x_ctr[1] \ + + k_prim * x_ctr[2] \ + + l_prim * x_ctr[3] \ + +(i_prim+j_prim+k_prim+l_prim)*2 + nf*3); + +//acint +CACHE_SIZE_T CINT2e_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, dtype *cache)//, void (*f_c2s)(dtype *opij, dtype *gctr, FINT *dims, CINTEnvVars *envs, dtype *cache)) +{ + FINT *x_ctr = envs->x_ctr; + size_t nf = envs->nf; + size_t nc = nf * x_ctr[0] * x_ctr[1] * x_ctr[2] * x_ctr[3]; + FINT n_comp = envs->ncomp_e1 * envs->ncomp_e2 * envs->ncomp_tensor; + + /*if (out == NULL) { // warning + PAIRDATA_NON0IDX_SIZE(pdata_size); + size_t leng = envs->g_size*3*((1<gbits)+1); + size_t len0 = nf*n_comp; + size_t cache_size = MAX(leng+len0+nc*n_comp*3 + pdata_size, + nc*n_comp+nf*4); +#if !defined(I8) && !defined(CACHE_SIZE_I8) + if (cache_size >= INT32_MAX) { + //fprintf(stderr, "CINT2e_drv cache_size overflow: " + // "cache_size %zu > %d, nf %zu, nc %zu, n_comp %d\n", + // cache_size, INT32_MAX, nf, nc, (int)n_comp); + cache_size = 0; + } +#endif + return cache_size; + }*/ + dtype stack[128]; + /*dtype *stack = NULL; + if (cache == NULL) { + PAIRDATA_NON0IDX_SIZE(pdata_size); + size_t leng = envs->g_size*3*((1<gbits)+1); + size_t len0 = nf*n_comp; + size_t cache_size = MAX(leng+len0+nc*n_comp*3 + pdata_size, + nc*n_comp+nf*4); + printf("cint2e -> cache_size %d\n", (int)cache_size); + + + #ifdef __cplusplus + stack = new dtype[128]; + #else + stack = malloc(sizeof(dtype)*cache_size); + #endif + cache = stack; + }*/ + //dtype *gctr; + //MALLOC_INSTACK(gctr, nc*n_comp); + //MALLOC(dtype, gctr); + dtype gctr[128]; + + FINT n; + FINT empty = 1; + /*if (opt != NULL) { // WARNING + printf("ASD\n"); + envs->opt = opt; + n = ((x_ctr[0]==1) << 3) + ((x_ctr[1]==1) << 2) + + ((x_ctr[2]==1) << 1) + (x_ctr[3]==1); + CINTf_2e_loop[n](gctr, envs, cache, &empty); + } else {*/ + CINT2e_loop_nopt(gctr, envs, cache, &empty); + //} + + //return !empty; //skip need for allthe translation (memory expensive) + + FINT counts[4]; + //if (f_c2s == &c2s_sph_2e1) { + counts[0] = (envs->i_l*2+1) * x_ctr[0]; + counts[1] = (envs->j_l*2+1) * x_ctr[1]; + counts[2] = (envs->k_l*2+1) * x_ctr[2]; + counts[3] = (envs->l_l*2+1) * x_ctr[3]; + /*} else { + counts[0] = envs->nfi * x_ctr[0]; + counts[1] = envs->nfj * x_ctr[1]; + counts[2] = envs->nfk * x_ctr[2]; + counts[3] = envs->nfl * x_ctr[3]; + }*/ + if (dims == NULL) { + dims = counts; + } + FINT nout = dims[0] * dims[1] * dims[2] * dims[3]; + if (!empty) { + for (n = 0; n < n_comp; n++) { + //(*f_c2s)(out+nout*n, gctr+nc*n, dims, envs, cache); + // this is the one taking ~500kb/tile in code. + // ideally, we'd store this only on say 10 tiles and have them do all of theese. + c2s_sph_2e1(out+nout*n, gctr+nc*n, dims, envs, cache); // warning + } + } else { + for (n = 0; n < n_comp; n++) { + c2s_dset0(out+nout*n, dims, counts); + } + } + /*if (stack != NULL) { + //free(stack); + }*/ + return !empty; +} + +#ifdef __cplusplus +CACHE_SIZE_T CINT2e_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(...), void (*f_e2_c2s)(...)) +#else +CACHE_SIZE_T CINT2e_spinor_drv(dtype *out, FINT *dims, CINTEnvVars *envs, CINTOpt *opt, + dtype *cache, void (*f_e1_c2s)(), void (*f_e2_c2s)()) +#endif +{ + return 0; + FINT *shls = envs->shls; + FINT *bas = envs->bas; + FINT counts[4]; + counts[0] = CINTcgto_spinor(shls[0], bas); + counts[1] = CINTcgto_spinor(shls[1], bas); + counts[2] = CINTcgto_spinor(shls[2], bas); + counts[3] = CINTcgto_spinor(shls[3], bas); + FINT *x_ctr = envs->x_ctr; + size_t nf = envs->nf; + size_t nc = nf * x_ctr[0] * x_ctr[1] * x_ctr[2] * x_ctr[3]; + FINT n_comp = envs->ncomp_e1 * envs->ncomp_e2 * envs->ncomp_tensor; + FINT n1 = counts[0] * envs->nfk * x_ctr[2] + * envs->nfl * x_ctr[3] * counts[1]; + if (out == NULL) { + PAIRDATA_NON0IDX_SIZE(pdata_size); + size_t leng = envs->g_size*3*((1<gbits)+1); + size_t len0 = nf*n_comp; + size_t cache_size = MAX(leng+len0+nc*n_comp*3 + pdata_size, + nc*n_comp + n1*envs->ncomp_e2*OF_CMPLX + + nf*32*OF_CMPLX); +#if !defined(I8) && !defined(CACHE_SIZE_I8) + if (cache_size >= INT32_MAX) { + //fprintf(stderr, "CINT2e_drv cache_size overflow: " + // "cache_size %zu > %d, nf %zu, nc %zu, n_comp %d\n", + // cache_size, INT32_MAX, nf, nc, (int)n_comp); + cache_size = 0; + } +#endif + return cache_size; + } + dtype *stack = NULL; + if (cache == NULL) { + PAIRDATA_NON0IDX_SIZE(pdata_size); + size_t leng = envs->g_size*3*((1<gbits)+1); + size_t len0 = nf*n_comp; + size_t cache_size = MAX(leng+len0+nc*n_comp*3 + pdata_size, + nc*n_comp + n1*envs->ncomp_e2*OF_CMPLX + + nf*32*OF_CMPLX); + #ifdef __cplusplus + stack = new dtype[128]; + #else + stack = malloc(sizeof(dtype)*cache_size); + #endif + cache = stack; + } + dtype *gctr; + MALLOC_INSTACK(gctr, nc*n_comp); + + FINT n, m; + FINT empty = 1; + if (opt != NULL) { + envs->opt = opt; + n = ((x_ctr[0]==1) << 3) + ((x_ctr[1]==1) << 2) + + ((x_ctr[2]==1) << 1) + (x_ctr[3]==1); + CINTf_2e_loop[n](gctr, envs, cache, &empty); + } else { + CINT2e_loop_nopt(gctr, envs, cache, &empty); + } + + if (dims == NULL) { + dims = counts; + } + FINT nout = dims[0] * dims[1] * dims[2] * dims[3]; + if (!empty) { + dtype *opij; + MALLOC_INSTACK(opij, n1*envs->ncomp_e2); + for (n = 0; n < envs->ncomp_tensor; n++) { + for (m = 0; m < envs->ncomp_e2; m++) { + (*f_e1_c2s)(opij+n1*m, gctr, dims, envs, cache); + gctr += nc * envs->ncomp_e1; + } + (*f_e2_c2s)(out+nout*n, opij, dims, envs, cache); + } + } else { + for (n = 0; n < envs->ncomp_tensor; n++) { + c2s_zset0(out+nout*n, dims, counts); + } + } + if (stack != NULL) { + //free(stack); + } + return !empty; +} + + +void CINTgout2e(dtype *gout, dtype *g, FINT *idx, + CINTEnvVars *envs, FINT gout_empty) +{ + FINT nf = envs->nf; + FINT i, ix, iy, iz, n; + dtype s; + + if (gout_empty) { + switch (envs->nrys_roots) { + case 1: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] = g[ix] * g[iy] * g[iz]; + } + break; + case 2: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] = g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1]; + } + break; + case 3: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] = g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1] + + g[ix+2] * g[iy+2] * g[iz+2]; + } + break; + case 4: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] = g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1] + + g[ix+2] * g[iy+2] * g[iz+2] + + g[ix+3] * g[iy+3] * g[iz+3]; + } + break; + case 5: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] = g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1] + + g[ix+2] * g[iy+2] * g[iz+2] + + g[ix+3] * g[iy+3] * g[iz+3] + + g[ix+4] * g[iy+4] * g[iz+4]; + } + break; + case 6: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] = g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1] + + g[ix+2] * g[iy+2] * g[iz+2] + + g[ix+3] * g[iy+3] * g[iz+3] + + g[ix+4] * g[iy+4] * g[iz+4] + + g[ix+5] * g[iy+5] * g[iz+5]; + } + break; + case 7: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] = g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1] + + g[ix+2] * g[iy+2] * g[iz+2] + + g[ix+3] * g[iy+3] * g[iz+3] + + g[ix+4] * g[iy+4] * g[iz+4] + + g[ix+5] * g[iy+5] * g[iz+5] + + g[ix+6] * g[iy+6] * g[iz+6]; + } + break; + case 8: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] = g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1] + + g[ix+2] * g[iy+2] * g[iz+2] + + g[ix+3] * g[iy+3] * g[iz+3] + + g[ix+4] * g[iy+4] * g[iz+4] + + g[ix+5] * g[iy+5] * g[iz+5] + + g[ix+6] * g[iy+6] * g[iz+6] + + g[ix+7] * g[iy+7] * g[iz+7]; + } + break; + default: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + s = 0; + for (i = 0; i < envs->nrys_roots; i++) { + s += g[ix+i] * g[iy+i] * g[iz+i]; + } + gout[n] = s; + } + break; + } + } else { + switch (envs->nrys_roots) { + case 1: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] += g[ix] * g[iy] * g[iz]; + } + break; + case 2: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] +=g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1]; + } + break; + case 3: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] +=g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1] + + g[ix+2] * g[iy+2] * g[iz+2]; + } + break; + case 4: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] +=g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1] + + g[ix+2] * g[iy+2] * g[iz+2] + + g[ix+3] * g[iy+3] * g[iz+3]; + } + break; + case 5: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] +=g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1] + + g[ix+2] * g[iy+2] * g[iz+2] + + g[ix+3] * g[iy+3] * g[iz+3] + + g[ix+4] * g[iy+4] * g[iz+4]; + } + break; + case 6: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] +=g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1] + + g[ix+2] * g[iy+2] * g[iz+2] + + g[ix+3] * g[iy+3] * g[iz+3] + + g[ix+4] * g[iy+4] * g[iz+4] + + g[ix+5] * g[iy+5] * g[iz+5]; + } + break; + case 7: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] +=g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1] + + g[ix+2] * g[iy+2] * g[iz+2] + + g[ix+3] * g[iy+3] * g[iz+3] + + g[ix+4] * g[iy+4] * g[iz+4] + + g[ix+5] * g[iy+5] * g[iz+5] + + g[ix+6] * g[iy+6] * g[iz+6]; + } + break; + case 8: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + gout[n] +=g[ix ] * g[iy ] * g[iz ] + + g[ix+1] * g[iy+1] * g[iz+1] + + g[ix+2] * g[iy+2] * g[iz+2] + + g[ix+3] * g[iy+3] * g[iz+3] + + g[ix+4] * g[iy+4] * g[iz+4] + + g[ix+5] * g[iy+5] * g[iz+5] + + g[ix+6] * g[iy+6] * g[iz+6] + + g[ix+7] * g[iy+7] * g[iz+7]; + } + break; + default: + for (n = 0; n < nf; n++, idx+=3) { + ix = idx[0]; + iy = idx[1]; + iz = idx[2]; + s = 0; + for (i = 0; i < envs->nrys_roots; i++) { + s += g[ix+i] * g[iy+i] * g[iz+i]; + } + gout[n] += s; + } + break; + } + } +} + +CACHE_SIZE_T int2e_sph(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) +{ + FINT ng[] = {0, 0, 0, 0, 0, 1, 1, 1}; + WHICH_INTEGRAL = INT2E_SPH; + + CINTEnvVars envs; + CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); + #ifdef __cplusplus + envs.f_gout = (void (*)(...))&CINTgout2e; + #else + envs.f_gout = &CINTgout2e; + #endif + return CINT2e_drv(out, dims, &envs, opt, cache);//, &c2s_sph_2e1); +} +void int2e_optimizer(CINTOpt **opt, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env) +{ + FINT ng[] = {0, 0, 0, 0, 0, 1, 1, 1}; + CINTall_2e_optimizer(opt, ng, atm, natm, bas, nbas, env); +} + +CACHE_SIZE_T int2e_cart(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, + FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache) +{ + FINT ng[] = {0, 0, 0, 0, 0, 1, 1, 1}; + CINTEnvVars envs; + CINTinit_int2e_EnvVars(&envs, ng, shls, atm, natm, bas, nbas, env); + #ifdef __cplusplus + envs.f_gout = (void (*)(...))&CINTgout2e; + #else + envs.f_gout = &CINTgout2e; + #endif + return CINT2e_drv(out, dims, &envs, opt, cache);//, &c2s_cart_2e1); +} + + +void hardcoded_f_gout(dtype *gout, dtype *g, FINT *idx, CINTEnvVars *envs, FINT gout_empty){ + if (WHICH_INTEGRAL == INT1E_NUC) { + //printf("int1e_nuc\n"); + CINTgout1e_nuc(gout, g, idx, envs, gout_empty); + } + else if (WHICH_INTEGRAL == INT1E_KIN){ + //f_gout = CINTgout1e_int1e_kin; + //printf("int1e_kin\n"); + CINTgout1e_int1e_kin(gout, g, idx, envs, gout_empty); + } + else if (WHICH_INTEGRAL == INT1E_OVLP){ + //printf("int1e_ovlp\n"); + CINTgout1e(gout, g, idx, envs, gout_empty); + } + else if (WHICH_INTEGRAL == INT1E_KIN_IP){ + ///printf("int1e_kin_ip\n"); + CINTgout1e_int1e_ipkin(gout, g, idx, envs, gout_empty); + } + else if (WHICH_INTEGRAL == INT1E_NUC_IP){ + CINTgout1e_int1e_ipnuc(gout, g, idx, envs, gout_empty); + } + else if (WHICH_INTEGRAL == INT1E_OVLP_IP){ + CINTgout1e_int1e_ipovlp(gout, g, idx, envs, gout_empty); + } +} + +static void make_g1e_gout(dtype *gout, dtype *g, FINT *idx, + CINTEnvVars *envs, FINT empty, FINT int1e_type) +{ + if (print) printf("make_g1e_gout %d\n", int1e_type); + //printf("%d\n", int1e_type); + FINT ia; + switch (int1e_type) { + case 0: + CINTg1e_ovlp(g, envs); + hardcoded_f_gout(gout, g, idx, envs, empty); + break; + case 1: + CINTg1e_nuc(g, envs, -1); + hardcoded_f_gout(gout, g, idx, envs, empty); + break; + case 2: + for (ia = 0; ia < envs->natm; ia++) { + CINTg1e_nuc(g, envs, ia); + hardcoded_f_gout(gout, g, idx, envs, (empty && ia == 0)); + } + break; + } + if (print) printf("done make g1e_gout\n"); +} + + + +ALL_CINT(int2e) +ALL_CINT_FORTRAN_(int2e) + + + +#include +#include +#include + +void CINTinit_int3c1e_EnvVars(CINTEnvVars *envs, FINT *ng, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env) +{ + envs->natm = natm; + envs->nbas = nbas; + envs->atm = atm; + envs->bas = bas; + envs->env = env; + envs->shls = shls; + + const FINT i_sh = shls[0]; + const FINT j_sh = shls[1]; + const FINT k_sh = shls[2]; + envs->i_l = bas(ANG_OF, i_sh); + envs->j_l = bas(ANG_OF, j_sh); + envs->k_l = bas(ANG_OF, k_sh); + envs->l_l = 0; + envs->x_ctr[0] = bas(NCTR_OF, i_sh); + envs->x_ctr[1] = bas(NCTR_OF, j_sh); + envs->x_ctr[2] = bas(NCTR_OF, k_sh); + envs->x_ctr[3] = 1; + envs->nfi = (envs->i_l+1)*(envs->i_l+2)/2; + envs->nfj = (envs->j_l+1)*(envs->j_l+2)/2; + envs->nfk = (envs->k_l+1)*(envs->k_l+2)/2; + envs->nfl = 1; + envs->nf = envs->nfi * envs->nfj * envs->nfk; + + envs->ri = env + atm(PTR_COORD, bas(ATOM_OF, i_sh)); + envs->rj = env + atm(PTR_COORD, bas(ATOM_OF, j_sh)); + envs->rk = env + atm(PTR_COORD, bas(ATOM_OF, k_sh)); + + envs->gbits = ng[GSHIFT]; + envs->ncomp_e1 = ng[POS_E1]; + envs->ncomp_e2 = 0; + envs->ncomp_tensor = ng[TENSOR]; + + envs->li_ceil = envs->i_l + ng[IINC]; + envs->lj_ceil = envs->j_l + ng[JINC]; + envs->lk_ceil = envs->k_l + ng[KINC]; + envs->ll_ceil = 0; + envs->nrys_roots =(envs->li_ceil + envs->lj_ceil + envs->lk_ceil)/2 + 1; + + envs->common_factor = SQRTPI * M_PI + * CINTcommon_fac_sp(envs->i_l) * CINTcommon_fac_sp(envs->j_l) + * CINTcommon_fac_sp(envs->k_l); + if (env[PTR_EXPCUTOFF] == 0) { + envs->expcutoff = EXPCUTOFF; + } else { + envs->expcutoff = MAX(MIN_EXPCUTOFF, env[PTR_EXPCUTOFF]); + } + + FINT dli = envs->li_ceil + 1; + FINT dlj = envs->lj_ceil + envs->lk_ceil + 1; + FINT dlk = envs->lk_ceil + 1; + envs->g_stride_i = 1; + envs->g_stride_j = dli; + envs->g_stride_k = dli * dlj; + envs->g_stride_l = envs->g_stride_k; + FINT nmax = envs->li_ceil + dlj; + envs->g_size = MAX(dli*dlj*dlk, dli*nmax); + + envs->rirj[0] = envs->ri[0] - envs->rj[0]; + envs->rirj[1] = envs->ri[1] - envs->rj[1]; + envs->rirj[2] = envs->ri[2] - envs->rj[2]; +} + +void CINTg3c1e_index_xyz(FINT *idx, const CINTEnvVars *envs) +{ + const FINT i_l = envs->i_l; + const FINT j_l = envs->j_l; + const FINT k_l = envs->k_l; + const FINT nfi = envs->nfi; + const FINT nfj = envs->nfj; + const FINT nfk = envs->nfk; + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + FINT i, j, k, n; + FINT ofx, ofjx, ofkx; + FINT ofy, ofjy, ofky; + FINT ofz, ofjz, ofkz; + FINT i_nx[CART_MAX], i_ny[CART_MAX], i_nz[CART_MAX]; + FINT j_nx[CART_MAX], j_ny[CART_MAX], j_nz[CART_MAX]; + FINT k_nx[CART_MAX], k_ny[CART_MAX], k_nz[CART_MAX]; + + CINTcart_comp(i_nx, i_ny, i_nz, i_l); + CINTcart_comp(j_nx, j_ny, j_nz, j_l); + CINTcart_comp(k_nx, k_ny, k_nz, k_l); + + ofx = 0; + ofy = envs->g_size; + ofz = envs->g_size * 2; + n = 0; + for (k = 0; k < nfk; k++) { + ofkx = ofx + dk * k_nx[k]; + ofky = ofy + dk * k_ny[k]; + ofkz = ofz + dk * k_nz[k]; + for (j = 0; j < nfj; j++) { + ofjx = ofkx + dj * j_nx[j]; + ofjy = ofky + dj * j_ny[j]; + ofjz = ofkz + dj * j_nz[j]; + for (i = 0; i < nfi; i++) { + idx[n+0] = ofjx + i_nx[i]; + idx[n+1] = ofjy + i_ny[i]; + idx[n+2] = ofjz + i_nz[i]; + n += 3; + } + } + } +} + + + +void CINTg3c1e_nuc(dtype *g, dtype ai, dtype aj, dtype ak, dtype *rijk, + dtype *cr, dtype t2, CINTEnvVars *envs) +{ + const FINT li = envs->li_ceil; + const FINT lj = envs->lj_ceil; + const FINT lk = envs->lk_ceil; + const FINT nmax = li + lj + lk; + const FINT mmax = lj + lk; + dtype *gx = g; + dtype *gy = g + envs->g_size; + dtype *gz = g + envs->g_size * 2; + gx[0] = 1; + gy[0] = 1; + gz[0] = 2/SQRTPI * envs->fac[0]; + if (nmax == 0) { + return; + } + + FINT dj = li + 1; + const FINT dk = envs->g_stride_k; + const dtype aijk = ai + aj + ak; + const dtype *rj = envs->rj; + const dtype *rk = envs->rk; + FINT i, j, k, off; + const dtype *rirj = envs->rirj; + dtype rjrk[3], rjr0[3]; + + rjrk[0] = rj[0] - rk[0]; + rjrk[1] = rj[1] - rk[1]; + rjrk[2] = rj[2] - rk[2]; + + rjr0[0] = rj[0] - (rijk[0] + t2 * (cr[0] - rijk[0])); + rjr0[1] = rj[1] - (rijk[1] + t2 * (cr[1] - rijk[1])); + rjr0[2] = rj[2] - (rijk[2] + t2 * (cr[2] - rijk[2])); + + gx[dj] = -rjr0[0] * gx[0]; + gy[dj] = -rjr0[1] * gy[0]; + gz[dj] = -rjr0[2] * gz[0]; + + const dtype aijk1 = .5 * (1 - t2) / aijk; + for (j = 1; j < nmax; j++) { + gx[(j+1)*dj] = aijk1 * j * gx[(j-1)*dj] - rjr0[0] * gx[j*dj]; + gy[(j+1)*dj] = aijk1 * j * gy[(j-1)*dj] - rjr0[1] * gy[j*dj]; + gz[(j+1)*dj] = aijk1 * j * gz[(j-1)*dj] - rjr0[2] * gz[j*dj]; + } + + for (i = 1; i <= li; i++) { + for (j = 0; j <= nmax-i; j++) { + gx[i+j*dj] = gx[i-1+(j+1)*dj] - rirj[0] * gx[i-1+j*dj]; + gy[i+j*dj] = gy[i-1+(j+1)*dj] - rirj[1] * gy[i-1+j*dj]; + gz[i+j*dj] = gz[i-1+(j+1)*dj] - rirj[2] * gz[i-1+j*dj]; + } + } + + dj = envs->g_stride_j; + for (k = 1; k <= lk; k++) { + for (j = 0; j <= mmax-k; j++) { + off = k * dk + j * dj; + for (i = off; i <= off+li; i++) { + gx[i] = gx[i+dj-dk] + rjrk[0] * gx[i-dk]; + gy[i] = gy[i+dj-dk] + rjrk[1] * gy[i-dk]; + gz[i] = gz[i+dj-dk] + rjrk[2] * gz[i-dk]; + } + } + } +} + + +void CINTnabla1i_3c1e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, + const CINTEnvVars *envs) +{ + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + const dtype ai2 = -2 * envs->ai[0]; + FINT i, j, k, ptr; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (k = 0; k <= lk; k++) { + for (j = 0; j <= lj; j++) { + ptr = dj * j + dk * k; + + fx[ptr] = ai2 * gx[ptr+1]; + fy[ptr] = ai2 * gy[ptr+1]; + fz[ptr] = ai2 * gz[ptr+1]; + + for (i = 1; i <= li; i++) { + fx[ptr+i] = i * gx[ptr+i-1] + ai2 * gx[ptr+i+1]; + fy[ptr+i] = i * gy[ptr+i-1] + ai2 * gy[ptr+i+1]; + fz[ptr+i] = i * gz[ptr+i-1] + ai2 * gz[ptr+i+1]; + } + } } +} + + +void CINTnabla1j_3c1e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, + const CINTEnvVars *envs) +{ + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + const dtype aj2 = -2 * envs->aj[0]; + FINT i, j, k, ptr; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (k = 0; k <= lk; k++) { + ptr = dk * k; + + for (i = ptr; i <= ptr+li; i++) { + fx[i] = aj2 * gx[i+dj]; + fy[i] = aj2 * gy[i+dj]; + fz[i] = aj2 * gz[i+dj]; + } + + for (j = 1; j <= lj; j++) { + ptr = dj * j + dk * k; + for (i = ptr; i <= ptr+li; i++) { + fx[i] = j * gx[i-dj] + aj2 * gx[i+dj]; + fy[i] = j * gy[i-dj] + aj2 * gy[i+dj]; + fz[i] = j * gz[i-dj] + aj2 * gz[i+dj]; + } + } + } +} + + +void CINTnabla1k_3c1e(dtype *f, const dtype *g, + const FINT li, const FINT lj, const FINT lk, + const CINTEnvVars *envs) +{ + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + const dtype ak2 = -2 * envs->ak[0]; + FINT i, j, k, ptr; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (j = 0; j <= lj; j++) { + ptr = dj * j; + for (i = ptr; i <= ptr+li; i++) { + fx[i] = ak2 * gx[i+dk]; + fy[i] = ak2 * gy[i+dk]; + fz[i] = ak2 * gz[i+dk]; + } + } + for (k = 1; k <= lk; k++) { + for (j = 0; j <= lj; j++) { + ptr = dj * j + dk * k; + for (i = ptr; i <= ptr+li; i++) { + fx[i] = k * gx[i-dk] + ak2 * gx[i+dk]; + fy[i] = k * gy[i-dk] + ak2 * gy[i+dk]; + fz[i] = k * gz[i-dk] + ak2 * gz[i+dk]; + } + } + } +} + + +void CINTx1i_3c1e(dtype *f, const dtype *g, const dtype *ri, + const FINT li, const FINT lj, const FINT lk, + const CINTEnvVars *envs) +{ + FINT i, j, k, ptr; + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (k = 0; k <= lk; k++) { + for (j = 0; j <= lj; j++) { + ptr = dj * j + dk * k; + for (i = ptr; i <= ptr+li; i++) { + fx[i] = gx[i+1] + ri[0] * gx[i]; + fy[i] = gy[i+1] + ri[1] * gy[i]; + fz[i] = gz[i+1] + ri[2] * gz[i]; + } + } } +} + + +void CINTx1j_3c1e(dtype *f, const dtype *g, const dtype *rj, + const FINT li, const FINT lj, const FINT lk, + const CINTEnvVars *envs) +{ + FINT i, j, k, ptr; + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (k = 0; k <= lk; k++) { + for (j = 0; j <= lj; j++) { + ptr = dj * j + dk * k; + for (i = ptr; i <= ptr+li; i++) { + fx[i] = gx[i+dj] + rj[0] * gx[i]; + fy[i] = gy[i+dj] + rj[1] * gy[i]; + fz[i] = gz[i+dj] + rj[2] * gz[i]; + } + } } +} + + +void CINTx1k_3c1e(dtype *f, const dtype *g, const dtype *rk, + const FINT li, const FINT lj, const FINT lk, + const CINTEnvVars *envs) +{ + FINT i, j, k, ptr; + const FINT dj = envs->g_stride_j; + const FINT dk = envs->g_stride_k; + const dtype *gx = g; + const dtype *gy = g + envs->g_size; + const dtype *gz = g + envs->g_size * 2; + dtype *fx = f; + dtype *fy = f + envs->g_size; + dtype *fz = f + envs->g_size * 2; + + for (k = 0; k <= lk; k++) { + for (j = 0; j <= lj; j++) { + ptr = dj * j + dk * k; + for (i = ptr; i <= ptr+li; i++) { + fx[i] = gx[i+dk] + rk[0] * gx[i]; + fy[i] = gy[i+dk] + rk[1] * gy[i]; + fz[i] = gz[i+dk] + rk[2] * gz[i]; + } + } } +} + + + +//#include +#include +#include +#include +#include + +static dtype POLY_SMALLX_R0[] = { + +5.0000000000000000e-01, + +1.3069360623708470e-01, +2.8693063937629151e+00, + +6.0376924683279896e-02, +7.7682335593104601e-01, +6.6627997193856743e+00, + +3.4819897306147152e-02, +3.8156718508004406e-01, +1.7373072694588976e+00, +1.1846305648154912e+01, + +2.2665926631698637e-02, +2.3127169214090557e-01, +8.5734602411883609e-01, +2.9735303812034606e+00, +1.8415185975905100e+01, + +1.5933294950708051e-02, +1.5647046776795465e-01, +5.2658326320347937e-01, +1.4554949383527416e+00, +4.4772915489042244e+00, +2.6368226486820891e+01, + +1.1813808454790223e-02, +1.1337832545962978e-01, +3.6143546199827142e-01, +8.9527303800610059e-01, +2.1671830744997034e+00, +6.2459217468839974e+00, +3.5704994544697506e+01, + +9.1096129361797583e-03, +8.6130778786234360e-02, +2.6546936423055723e-01, +6.1752374342048377e-01, +1.3290252120652055e+00, +2.9891077977621077e+00, +8.2783291650163164e+00, +4.6425304325782918e+01, + +7.2388268576176690e-03, +6.7744856280706228e-02, +2.0415049332589749e-01, +4.5633199434791133e-01, +9.1729173690437338e-01, +1.8243932992566771e+00, +3.9197868892557834e+00, +1.0573996723107014e+01, +5.8529065180664020e+01, + +5.8908068184661301e-03, +5.4725924879562259e-02, +1.6232609261161096e-01, +3.5315267858751925e-01, +6.7944242243948438e-01, +1.2573939988964797e+00, +2.3797176188890110e+00, +4.9584689501831161e+00, +1.3132652926121416e+01, +7.2016228580573340e+01, + +4.8873361261651269e-03, +4.5157008761019399e-02, +1.3240037096506918e-01, +2.8253618374640332e-01, +5.2746670115882444e-01, +9.3166748944873068e-01, +1.6361250128213276e+00, +2.9941113975093119e+00, +6.1047380665207358e+00, +1.5954143802284950e+01, +8.6886766630657462e+01, + +4.1201918467690364e-03, +3.7911181291998906e-02, +1.1018828563899001e-01, +2.3179530831466225e-01, +4.2345630230694603e-01, +7.2421338523125789e-01, +1.2113317522159244e+00, +2.0525334008082456e+00, +3.6670630733185123e+00, +7.3583481234816475e+00, +1.9038376627614220e+01, +1.0314066236793083e+02, + +3.5205547919345487e-03, +3.2289011702114359e-02, +9.3214971024566495e-02, +1.9395959218782607e-01, +3.4863942062035819e-01, +5.8246762196717317e-01, +9.4178878042410219e-01, +1.5174658097736393e+00, +2.5060512608340129e+00, +4.3982595654500427e+00, +8.7191456120517863e+00, +2.2385292804867444e+01, +1.2077790499430500e+02, + +3.0429596866636517e-03, +2.7836958317494689e-02, +7.9934050123079720e-02, +1.6491083995350633e-01, +2.9275174955113165e-01, +4.8056334796006994e-01, +7.5805833071173867e-01, +1.1792349429563096e+00, +1.8494738526884431e+00, +2.9963211569901405e+00, +5.1875000243561145e+00, +1.0187030609882370e+01, +2.5994853806516272e+01, +1.3979848737030667e+02, + +2.6563882798588422e-03, +2.4250094342677907e-02, +6.9335687672495691e-02, +1.4207481953281492e-01, +2.4974878660205013e-01, +4.0442628385592422e-01, +6.2615572291363975e-01, +9.4929992942214436e-01, +1.4359478786754303e+00, +2.2069717422671000e+00, +3.5231083207720131e+00, +6.0346505430483566e+00, +1.1761935734646896e+01, +2.9867033445944998e+01, +1.6020240462202361e+02, + +2.3390891340939958e-03, +2.1317080945253201e-02, +6.0736095944339923e-02, +1.2376819871441241e-01, +2.1586001541338806e-01, +3.4579995866737606e-01, +5.2767337072352205e-01, +7.8452789304120707e-01, +1.1555935675460669e+00, +1.7115298466871347e+00, +2.5897019911803474e+00, +4.0862530420883099e+00, +6.9396189328516167e+00, +1.3443814172272431e+01, +3.4001813414873574e+01, +1.8198965332991693e+02, + +2.0754424341283091e-03, +1.8887592459816600e-02, +5.3658014548213083e-02, +1.0884885454501933e-01, +1.8862266668962116e-01, +2.9954903459405208e-01, +4.5185308380311651e-01, +6.6164964801649240e-01, +9.5509492609113844e-01, +1.3765373767867681e+00, +2.0057094213304625e+00, +2.9974863464885759e+00, +4.6856434232417712e+00, +7.9023399751558259e+00, +1.5232632558400770e+01, +3.8399180598022653e+01, +2.0516023103739158e+02, + +1.8539963414043730e-03, +1.6852276947378890e-02, +4.7759641118871647e-02, +9.6517662877457097e-02, +1.6636649640437165e-01, +2.6232651719296074e-01, +3.9202397022416274e-01, +5.6711232331318462e-01, +8.0578967544389657e-01, +1.1374575501399538e+00, +1.6118526781020055e+00, +2.3182957744259616e+00, +3.4301980006685246e+00, +5.3211990723247959e+00, +8.9227664393420767e+00, +1.7128366583322400e+01, +4.3059125399051126e+01, +2.2971413594275947e+02, + +1.6661998936375252e-03, +1.5130014686433138e-02, +4.2790695960997299e-02, +8.6200730889532062e-02, +1.4792271329238424e-01, +2.3186595750538547e-01, +3.4384897279841592e-01, +4.9253668994919914e-01, +6.9103506867637832e-01, +9.5970145594169631e-01, +1.3313348322389476e+00, +1.8613408062545294e+00, +2.6491513055224365e+00, +3.8877446160652291e+00, +5.9928609675506301e+00, +1.0000863418852175e+01, +1.9130998189134935e+01, +4.7981640664446111e+01, +2.5565136670034096e+02, + +1.5055636736750460e-03, +1.3659581309068787e-02, +3.8564342567293824e-02, +7.7476594928727063e-02, +1.3245147741657512e-01, +2.0658296700885234e-01, +3.0439699080823512e-01, +4.3248851020324230e-01, +6.0056920785975065e-01, +8.2323977038557739e-01, +1.1231054875957920e+00, +1.5365239604700129e+00, +2.1248567569558028e+00, +2.9981746126480338e+00, +4.3700575829188786e+00, +6.7005849497038312e+00, +1.1136604650698095e+01, +2.1240513731235975e+01, +5.3166720972969635e+01, +2.8297192228864293e+02, + +1.3670907867368810e-03, +1.2394054047073586e-02, +3.4938717738704779e-02, +7.0029665723141538e-02, +1.1933546517548120e-01, +1.8533975034810135e-01, +2.7162214849373179e-01, +3.8330281537433031e-01, +5.2775249147995862e-01, +7.1575249251405548e-01, +9.6345103210237271e-01, +1.2957976481725484e+00, +1.7528752562478540e+00, +2.4022925139112141e+00, +3.3652895418982895e+00, +4.8770850124786653e+00, +7.4443374249155490e+00, +1.2329970060272636e+01, +2.3456902742141821e+01, +5.8614362155227504e+01, +3.1167580192095022e+02, + +1.2468830266566071e-03, +1.1296974077260939e-02, +3.1804472951472436e-02, +6.3619574436888329e-02, +1.0811189954427899e-01, +1.6730017611467515e-01, +2.4405695487560791e-01, +3.4242592106441611e-01, +4.6811614228539372e-01, +6.2928567081422648e-01, +8.3781715700385528e-01, +1.1114655761383376e+00, +1.4776257531369692e+00, +1.9802761199884003e+00, +2.6935661694090105e+00, +3.7504379423093370e+00, +5.4087870441105492e+00, +8.2240924562866571e+00, +1.3580944085234208e+01, +2.5780157081866051e+01, +6.4324560961905945e+01, +3.4176300498341982e+02, + +1.1418631828867911e-03, +1.0339660911653800e-02, +2.9076181798097987e-02, +5.8060466666749251e-02, +9.8427835316294177e-02, +1.5183741234468401e-01, +2.2062391084280356e-01, +3.0802869139363409e-01, +4.1855186217289764e-01, +5.5849619707813158e-01, +7.3682598952358325e-01, +9.6656238513293491e-01, +1.2671304167611064e+00, +1.6684742780654425e+00, +2.2186404130584330e+00, +2.9986146322141836e+00, +4.1535747513207992e+00, +5.9651326283714123e+00, +9.0398297521904443e+00, +1.4889514507506986e+01, +2.8210270342431137e+01, +7.0297314830298916e+01, +3.7323353099141679e+02, + +1.0495759261988334e-03, +9.4992992354385325e-03, +2.6686295586583197e-02, +5.3206697955337431e-02, +9.0009970388381530e-02, +1.3847326383472791e-01, +2.0051570393946336e-01, +2.7876963531845217e-01, +3.7683660713108602e-01, +4.9967393580009961e-01, +6.5418912561449616e-01, +8.5017628790014732e-01, +1.1018357175881530e+00, +1.4303284449010452e+00, +1.8682541268706729e+00, +2.4679012551940342e+00, +3.3173886234481418e+00, +4.5746645870722178e+00, +6.5460972759896343e+00, +9.8915332475732622e+00, +1.6255671624263933e+01, +3.0747237423089796e+01, +7.6532621717181570e+01, +4.0608737955819714e+02, + +9.6804284738431225e-04, +8.7575539343254932e-03, +2.4580815547761405e-02, +4.8942752455150472e-02, +8.2643793737600238e-02, +1.2683727043286128e-01, +1.8311667069998602e-01, +2.5364456253704887e-01, +3.4134207545566181e-01, +4.5016937343104196e-01, +5.8554703532077257e-01, +7.5500228999917485e-01, +9.6918565647872623e-01, +1.2435195346086747e+00, +1.6009686601323014e+00, +2.0768956135707137e+00, +2.7280060286023411e+00, +3.6498491702681330e+00, +5.0136793389300003e+00, +7.1516614535243814e+00, +1.0779190085915269e+01, +1.7679407649692763e+01, +3.3391054222461705e+01, +8.3030479977314329e+01, +4.4032455037210190e+02, + +8.9565544579415254e-04, +8.0995527542570573e-03, +2.2716144347385257e-02, +4.5176009998213855e-02, +7.6158887961076630e-02, +1.1663848431984211e-01, +1.6794992820605648e-01, +2.3188820866452553e-01, +3.1085069091583328e-01, +4.0804436959930529e-01, +5.2779092420711327e-01, +6.7598365319794951e-01, +8.6078710994700591e-01, +1.0937368186145631e+00, +1.3915217951874832e+00, +1.7789794003868797e+00, +2.2943435454843417e+00, +2.9989128434113854e+00, +3.9959651029812480e+00, +5.4705964337941646e+00, +7.7818094208903092e+00, +1.1702789877157626e+01, +1.9160716276781699e+01, +3.6141717412159579e+01, +8.9790888273867822e+01, +4.7594504317971854e+02, + +8.3109512231001499e-04, +7.5131289999639658e-03, +2.1056762228657960e-02, +4.1831472800230959e-02, +7.0418380847064116e-02, +1.0764559262935150e-01, +1.5464094439970513e-01, +2.1290812273042228e-01, +2.8443540318795413e-01, +3.7185131035702607e-01, +4.7864959901382476e-01, +6.0951929142249150e-01, +7.7083812244638827e-01, +9.7142732494617945e-01, +1.2237373962444573e+00, +1.5457695551603108e+00, +1.9643035543347287e+00, +2.5205537131838662e+00, +3.2805879923783383e+00, +4.3557112384146945e+00, +5.9453975688643608e+00, +8.4365283763879209e+00, +1.2662324149042576e+01, +2.0699592351914731e+01, +3.8999224268126255e+01, +9.6813845511527404e+01, +5.1294885777328875e+02, + +7.7327265934614168e-04, +6.9882508946790788e-03, +1.9573489101087662e-02, +3.8847864637965371e-02, +6.5311250720158837e-02, +9.9672659091338711e-02, +1.4289191032726364e-01, +1.9623917849107639e-01, +2.6137903585278394e-01, +3.4048907901994535e-01, +4.3642861876513317e-01, +5.5298158998816316e-01, +6.9521214980263679e-01, +8.6999572387224722e-01, +1.0868307890446043e+00, +1.3591137397500017e+00, +1.7062043430069920e+00, +2.1568951145849722e+00, +2.7554903420777213e+00, +3.5730040885853245e+00, +4.7290670414068323e+00, +6.4380677720692976e+00, +9.1158078193148011e+00, +1.3657785936164659e+01, +2.2296031630204965e+01, +4.1963572543442723e+01, +1.0409935078594111e+02, +5.5133599398118213e+02, + +7.2128194564740754e-04, +6.5165867490334173e-03, +1.8242169108187746e-02, +3.6174706944078615e-02, +6.0746630485518080e-02, +9.2568726696294054e-02, +1.3246337474487627e-01, +1.8151161540602556e-01, +2.4111887374480270e-01, +3.1310655640913304e-01, +3.9984041967064188e-01, +5.0441237267625860e-01, +6.3090166347065468e-01, +7.8475672612934000e-01, +9.7336500077332955e-01, +1.2069236234854512e+00, +1.4998064894190901e+00, +1.8727788041083879e+00, +2.3567166558988348e+00, +2.9991242138096359e+00, +3.8761386831078006e+00, +5.1160156250390809e+00, +6.9485946963461123e+00, +9.8196390688702735e+00, +1.4689169468495249e+01, +2.3950030589416851e+01, +4.5034760371338379e+01, +1.1164740334510041e+02, +5.9110645166061056e+02, + +6.7436423858690424e-04, +6.0911701752723131e-03, +1.7042663914726686e-02, +3.3770100579734327e-02, +5.6649534609952659e-02, +8.6210122382939763e-02, +1.2316086250453281e-01, +1.6842816229032329e-01, +2.2320778254362922e-01, +2.8903640974860378e-01, +3.6789065056317111e-01, +4.6232515675023911e-01, +5.7566774544675881e-01, +7.1229929883268572e-01, +8.7806261702092869e-01, +1.0808722364210885e+00, +1.3316459770568605e+00, +1.6457673300845621e+00, +2.0454542277297771e+00, +2.5637374631125205e+00, +3.2514312621986456e+00, +4.1899732254466091e+00, +5.5165429945418198e+00, +7.4769680832474528e+00, +1.0548014896887539e+01, +1.5756469932714268e+01, +2.5661586286947824e+01, +4.8212786190469124e+01, +1.1945800255953849e+02, +6.3226023069200130e+02, + +6.3188030795311258e-04, +5.7061398509158142e-03, +1.5958074377719466e-02, +3.1599024262999015e-02, +5.2957614335718592e-02, +8.0494684232131519e-02, +1.1482497679045181e-01, +1.5674738549368780e-01, +2.0728641098615663e-01, +2.6774869366161896e-01, +3.3980028211803459e-01, +4.2557300057118946e-01, +5.2781244442213382e-01, +6.5008669605942015e-01, +7.9708543296514911e-01, +9.7505658701549880e-01, +1.1924574198151743e+00, +1.4609489039066195e+00, +1.7969565829860152e+00, +2.2241986989346771e+00, +2.7779321228812770e+00, +3.5123915105929826e+00, +4.5144922723425349e+00, +5.9306374689397341e+00, +8.0231793507898264e+00, +1.1300929244520692e+01, +1.6859683287482135e+01, +2.7430696248828827e+01, +5.1497648686801327e+01, +1.2753114789911722e+02, +6.7479733097461019e+02, +}; + +static dtype POLY_SMALLX_R1[] = { + +-2.0000000000000001e-01, + +-2.9043023608241049e-02, +-6.3762364305842567e-01, + +-9.2887576435815231e-03, +-1.1951128552785324e-01, +-1.0250461106747191e+00, + +-4.0964585066055473e-03, +-4.4890257068240479e-02, +-2.0438909052457618e-01, +-1.3936830174299895e+00, + +-2.1586596792093939e-03, +-2.2025875441991007e-02, +-8.1652002297032011e-02, +-2.8319336963842484e-01, +-1.7538272358004856e+00, + +-1.2746635960566440e-03, +-1.2517637421436372e-02, +-4.2126661056278353e-02, +-1.1643959506821934e-01, +-3.5818332391233798e-01, +-2.1094581189456711e+00, + +-8.1474541067518772e-04, +-7.8191948592848132e-03, +-2.4926583586087684e-02, +-6.1742968138351763e-02, +-1.4946090168963472e-01, +-4.3075322392303428e-01, +-2.4624134168756902e+00, + +-5.5209775370786412e-04, +-5.2200471991657189e-03, +-1.6089052377609530e-02, +-3.7425681419423255e-02, +-8.0546982549406398e-02, +-1.8115804834921864e-01, +-5.0171691909189797e-01, +-2.8136548076232071e+00, + +-3.9128793824960370e-04, +-3.6618841232814174e-03, +-1.1035161801399865e-02, +-2.4666594289076287e-02, +-4.9583337129966133e-02, +-9.8615854013874446e-02, +-2.1188037239220453e-01, +-5.7156739043821692e-01, +-3.1637332530088660e+00, + +-2.8735643016907951e-04, +-2.6695573111981587e-03, +-7.9183459810541930e-03, +-1.7226959931098500e-02, +-3.3143532801926071e-02, +-6.1336292629096574e-02, +-1.1608378628726883e-01, +-2.4187653415527396e-01, +-6.4061721590836185e-01, +-3.5129867600279674e+00, + +-2.1721493894067231e-04, +-2.0069781671564176e-03, +-5.8844609317808515e-03, +-1.2557163722062370e-02, +-2.3442964495947752e-02, +-4.1407443975499142e-02, +-7.2716667236503454e-02, +-1.3307161766708053e-01, +-2.7132169184536603e-01, +-7.0907305787933106e-01, +-3.8616340724736649e+00, + +-1.6817109578649129e-04, +-1.5473951547754655e-03, +-4.4974810464893881e-03, +-9.4610329924351942e-03, +-1.7283930706405961e-02, +-2.9559730009439098e-02, +-4.9442112335343846e-02, +-8.3776873502377364e-02, +-1.4967604380891888e-01, +-3.0034073973394482e-01, +-7.7707659704547827e-01, +-4.2098229537930951e+00, + +-1.3285112422394522e-04, +-1.2184532717779003e-03, +-3.5175460763987357e-03, +-7.3192298938802294e-03, +-1.3156204551711631e-02, +-2.1979910262912194e-02, +-3.5539199261286875e-02, +-5.7262860746175065e-02, +-9.4567972106943884e-02, +-1.6597205907358650e-01, +-3.2902436271893531e-01, +-8.4472803037235644e-01, +-4.5576567922379247e+00, + +-1.0677051532153163e-04, +-9.7673537956121715e-04, +-2.8047035130905162e-03, +-5.7863452615265383e-03, +-1.0271991212320409e-02, +-1.6861871858248067e-02, +-2.6598537919710129e-02, +-4.1376664665133671e-02, +-6.4893819392576949e-02, +-1.0513407568386457e-01, +-1.8201754471424963e-01, +-3.5743967052218845e-01, +-9.1210013356197439e-01, +-4.9052100831686554e+00, + +-8.7094697700289907e-05, +-7.9508506041566917e-04, +-2.2733012351637931e-03, +-4.6581908043545877e-03, +-8.1884848066245946e-03, +-1.3259878159210630e-02, +-2.0529695833234090e-02, +-3.1124587849906373e-02, +-4.7080258317227223e-02, +-7.2359729254659014e-02, +-1.1551174822203321e-01, +-1.9785739485404447e-01, +-3.8563723720153753e-01, +-9.7924699822770489e-01, +-5.2525378564597904e+00, + +-7.1971973356738328e-05, +-6.5591018293086772e-04, +-1.8688029521335360e-03, +-3.8082522681357664e-03, +-6.6418466281042482e-03, +-1.0639998728226956e-02, +-1.6236103714569908e-02, +-2.4139319785883295e-02, +-3.5556725155263598e-02, +-5.2662456821142609e-02, +-7.9683138190164524e-02, +-1.2573086283348647e-01, +-2.1352673639543437e-01, +-4.1365582068530554e-01, +-1.0462096435345716e+00, +-5.5996816409205206e+00, + +-6.0157751713864028e-05, +-5.4746644811062611e-04, +-1.5553047695134228e-03, +-3.1550392621744732e-03, +-5.4673236721629326e-03, +-8.6825807128710752e-03, +-1.3097190834872943e-02, +-1.9178250667144705e-02, +-2.7683910901192418e-02, +-3.9899634109761398e-02, +-5.8136504966100365e-02, +-8.6883662217060162e-02, +-1.3581575139831223e-01, +-2.2905333261321234e-01, +-4.4152558140292086e-01, +-1.1130197274789173e+00, +-5.9466733634026543e+00, + +-5.0794420312448578e-05, +-4.6170621773640794e-04, +-1.3084833183252507e-03, +-2.6443195308892354e-03, +-4.5579862028594974e-03, +-7.1870278683002940e-03, +-1.0740382745867472e-02, +-1.5537323926388621e-02, +-2.2076429464216344e-02, +-3.1163220551779554e-02, +-4.4160347345260427e-02, +-6.3514952723998944e-02, +-9.3978027415576024e-02, +-1.4578627595410401e-01, +-2.4445935450252265e-01, +-4.6927031735129865e-01, +-1.1797020657274282e+00, +-6.2935379710345059e+00, + +-4.3277919315260391e-05, +-3.9298739445280882e-04, +-1.1114466483375923e-03, +-2.2389800231047289e-03, +-3.8421483972047852e-03, +-6.0224924027372853e-03, +-8.9311421506082060e-03, +-1.2793160777901276e-02, +-1.7948962822763075e-02, +-2.4927310543940165e-02, +-3.4580125512699934e-02, +-4.8346514448169599e-02, +-6.8809124818764583e-02, +-1.0098037963805791e-01, +-1.5565872642988648e-01, +-2.5976268620395260e-01, +-4.9690904387363471e-01, +-1.2462763808947042e+00, +-6.6402952389698946e+00, + +-3.7174411695680151e-05, +-3.3727361256959967e-04, +-9.5220598931589691e-04, +-1.9130023439191868e-03, +-3.2704068497919785e-03, +-5.1008140002185764e-03, +-7.5159750816848189e-03, +-1.0678728646993636e-02, +-1.4828869329870386e-02, +-2.0326907910754997e-02, +-2.7730999693723259e-02, +-3.7938863221481801e-02, +-5.2465598937180315e-02, +-7.4029002781432929e-02, +-1.0790265636836738e-01, +-1.6544654196799582e-01, +-2.7497789260982952e-01, +-5.2445712916632037e-01, +-1.3127585425424602e+00, +-6.9869610441640235e+00, + +-3.2166842040867788e-05, +-2.9162480110761377e-04, +-8.2208747620481830e-04, +-1.6477568405445066e-03, +-2.8078932982466163e-03, +-4.3609353023082676e-03, +-6.3911093763231001e-03, +-9.0188897735136529e-03, +-1.2417705681881379e-02, +-1.6841235117977776e-02, +-2.2669436049467591e-02, +-3.0489356427589372e-02, +-4.1244123676420094e-02, +-5.6524529739087392e-02, +-7.9183283338783286e-02, +-1.1475494147008623e-01, +-1.7516088058624821e-01, +-2.9011694259465026e-01, +-5.5192712334451344e-01, +-1.3791614624759412e+00, +-7.3335482804929466e+00, + +-2.8019843295654089e-05, +-2.5386458600586381e-04, +-7.1470725733645919e-04, +-1.4296533581323221e-03, +-2.4294808886354828e-03, +-3.7595545194309024e-03, +-5.4844259522608520e-03, +-7.6949645183014854e-03, +-1.0519463871581881e-02, +-1.4141251029533179e-02, +-1.8827351842783266e-02, +-2.4976754519962643e-02, +-3.3205073104201552e-02, +-4.4500586966031465e-02, +-6.0529576840651925e-02, +-8.4279504321558132e-02, +-1.2154577627214719e-01, +-1.8481106643340806e-01, +-3.0518975472436422e-01, +-5.7932937262620343e-01, +-1.4454957519529426e+00, +-7.6800675277172985e+00, + +-2.4556197481436369e-05, +-2.2235829917535054e-04, +-6.2529423221716106e-04, +-1.2486121863817042e-03, +-2.1167276412106277e-03, +-3.2653206955846024e-03, +-4.7446002331785709e-03, +-6.6242729331964312e-03, +-9.0011153155461852e-03, +-1.2010670904906056e-02, +-1.5845720204808240e-02, +-2.0786287852321179e-02, +-2.7250116489486158e-02, +-3.5881167270224570e-02, +-4.7712697055020063e-02, +-6.4486336176649103e-02, +-8.9324188200447296e-02, +-1.2828242211551424e-01, +-1.9440494090732141e-01, +-3.2020461306466635e-01, +-6.0667248048238998e-01, +-1.5117702114042777e+00, +-8.0265275482025125e+00, + +-2.1640740746367700e-05, +-1.9586183990594915e-04, +-5.5023289869243698e-04, +-1.0970453186667512e-03, +-1.8558756781109594e-03, +-2.8551188419531528e-03, +-4.1343444111229559e-03, +-5.7478275323392201e-03, +-7.7698269511564128e-03, +-1.0302555377321641e-02, +-1.3488435579680333e-02, +-1.7529407997941181e-02, +-2.2718262218312437e-02, +-2.9491308142289591e-02, +-3.8520703646817998e-02, +-5.0884561962763600e-02, +-6.8399765431920445e-02, +-9.4322981176746756e-02, +-1.3497107785545637e-01, +-2.0394913912522192e-01, +-3.3516848709822544e-01, +-6.3396365820803702e-01, +-1.5779922003542592e+00, +-8.3729356609937557e+00, + +-1.9169165294738857e-05, +-1.7341690959060381e-04, +-4.8674882272794860e-04, +-9.6916341495347468e-04, +-1.6365107670811929e-03, +-2.5116291174824014e-03, +-3.6260726871284363e-03, +-5.0226646046940366e-03, +-6.7592490189239962e-03, +-8.9142450184364740e-03, +-1.1594990798431138e-02, +-1.4950540396023263e-02, +-1.9191795177796560e-02, +-2.4624149200171776e-02, +-3.1702349705590126e-02, +-4.1126645813281459e-02, +-5.4019921358462203e-02, +-7.2274240995408578e-02, +-9.9280778988712889e-02, +-1.4161705848563130e-01, +-2.1344930863198552e-01, +-3.5008728019193586e-01, +-6.6120899450419213e-01, +-1.6441679203428579e+00, +-8.7192980271703355e+00, + +-1.7060103729412429e-05, +-1.5427719531918205e-04, +-4.3268846375971913e-04, +-8.6049542853740670e-04, +-1.4506454849728882e-03, +-2.2216854156160404e-03, +-3.1990462515439329e-03, +-4.4169182602766767e-03, +-5.9209655412539672e-03, +-7.7722737066534342e-03, +-1.0053160461087871e-02, +-1.2875879108532372e-02, +-1.6395944951371543e-02, +-2.0833082259325012e-02, +-2.6505177051190154e-02, +-3.3885321912131047e-02, +-4.3701781818749362e-02, +-5.7122149398312110e-02, +-7.6113621009166618e-02, +-1.0420183683417455e-01, +-1.4822494135029160e-01, +-2.2291028337443097e-01, +-3.6496602431965136e-01, +-6.8841366499351586e-01, +-1.7103026337879585e+00, +-9.0656198700898774e+00, + +-1.5249451785504861e-05, +-1.3785557798099020e-04, +-3.8636260970014607e-04, +-7.6754995963726534e-04, +-1.2920803825149380e-03, +-1.9751484886119542e-03, +-2.8374485210955072e-03, +-3.9065710592738039e-03, +-5.2189982236321856e-03, +-6.8229598230646988e-03, +-8.7825614497949490e-03, +-1.1183840209587001e-02, +-1.4143818760484188e-02, +-1.7824354586168430e-02, +-2.2453897178797380e-02, +-2.8362744131381849e-02, +-3.6042267052013369e-02, +-4.6248691985025070e-02, +-6.0194275089510793e-02, +-7.9921307126875132e-02, +-1.0908986364888736e-01, +-1.5479868580528294e-01, +-2.3233622291821240e-01, +-3.7980903398008681e-01, +-7.1558209666286710e-01, +-1.7764008350738973e+00, +-9.4119056472163081e+00, + +-1.3686241758338792e-05, +-1.2368585654299255e-04, +-3.4643343541748077e-04, +-6.8757282545071452e-04, +-1.1559513401798024e-03, +-1.7641178600236939e-03, +-2.5290603597745778e-03, +-3.4732597963022371e-03, +-4.6261776257129905e-03, +-6.0263553808839881e-03, +-7.7244003321262512e-03, +-9.7872847785515603e-03, +-1.2304639819515696e-02, +-1.5398154404818535e-02, +-1.9235943168931048e-02, +-2.4055110438053130e-02, +-3.0198306955875963e-02, +-3.8175134771415438e-02, +-4.8769740567747279e-02, +-6.3239010417439373e-02, +-8.3700301617820050e-02, +-1.1394810216051854e-01, +-1.6134173131530621e-01, +-2.4173072453388778e-01, +-3.9462002885318520e-01, +-7.4271809811403044e-01, +-1.8424663855918781e+00, +-9.7581591855076493e+00, + +-1.2329605908502692e-05, +-1.1139464528262253e-04, +-3.1183195056731187e-04, +-6.1837105887313872e-04, +-1.0384039399233859e-03, +-1.5823713965178472e-03, +-2.2643311922201071e-03, +-3.1027626565132576e-03, +-4.1216901494838072e-03, +-5.3522488275065472e-03, +-6.8348789687289208e-03, +-8.6224337209616850e-03, +-1.0784643820011191e-02, +-1.3414644891099829e-02, +-1.6638717961937256e-02, +-2.0631173051033354e-02, +-2.5637717767847696e-02, +-3.2013312890741670e-02, +-4.0285754801689486e-02, +-5.1267080577942499e-02, +-6.6258780907825651e-02, +-8.7453258547676604e-02, +-1.1877939651873697e-01, +-1.6785707810034656e-01, +-2.5109691399137180e-01, +-4.0940223229772399e-01, +-7.6982496361262176e-01, +-1.9085026212837679e+00, +-1.0104383789070267e+01, + +-1.1146516340279409e-05, +-1.0068049876483163e-04, +-2.8169692421035848e-04, +-5.5818348065676566e-04, +-9.3635594396615962e-04, +-1.4249607005444589e-03, +-2.0357167356121128e-03, +-2.7839365667822031e-03, +-3.6893848354318877e-03, +-4.7774613181587400e-03, +-6.0808371993912582e-03, +-7.6417381281031257e-03, +-9.5151693462274187e-03, +-1.1773542129465880e-02, +-1.4513431686296341e-02, +-1.7865656800348573e-02, +-2.2010677306724968e-02, +-2.7202765786521688e-02, +-3.3809160788921939e-02, +-4.2375825836570589e-02, +-5.3742665490886701e-02, +-6.9255755792505938e-02, +-9.1182528835401983e-02, +-1.2358624930987525e-01, +-1.7434735366756263e-01, +-2.6043751954899613e-01, +-4.2415845102393096e-01, +-7.9690555686725828e-01, +-1.9745124390006361e+00, +-1.0450582325487625e+01, + +-1.0110084927249801e-05, +-9.1298237614653030e-05, +-2.5532919004351141e-04, +-5.0558438820798421e-04, +-8.4732182937149742e-04, +-1.2879149477141043e-03, +-1.8371996286472290e-03, +-2.5079581678990048e-03, +-3.3165825757785062e-03, +-4.2839790985859027e-03, +-5.4368045138885540e-03, +-6.8091680091390315e-03, +-8.4449991107541419e-03, +-1.0401387136950723e-02, +-1.2753366927442385e-02, +-1.5600905392247981e-02, +-1.9079318717042791e-02, +-2.3375182462505910e-02, +-2.8751305327776241e-02, +-3.5587179182954835e-02, +-4.4446913966100433e-02, +-5.6198264169487720e-02, +-7.2231876357480559e-02, +-9.4890199503035746e-02, +-1.2837086961263722e-01, +-1.8081486791233109e-01, +-2.6975493259971417e-01, +-4.3889113998126128e-01, +-8.2396237898882119e-01, +-2.0404983663858753e+00, +-1.0796757295593762e+01, +}; + +static dtype POLY_SMALLX_W0[] = { + +1.0000000000000000e+00, + +6.5214515486254609e-01, +3.4785484513745385e-01, + +4.6791393457269104e-01, +3.6076157304813861e-01, +1.7132449237917036e-01, + +3.6268378337836199e-01, +3.1370664587788727e-01, +2.2238103445337448e-01, +1.0122853629037626e-01, + +2.9552422471475287e-01, +2.6926671930999635e-01, +2.1908636251598204e-01, +1.4945134915058059e-01, +6.6671344308688138e-02, + +2.4914704581340277e-01, +2.3349253653835481e-01, +2.0316742672306592e-01, +1.6007832854334622e-01, +1.0693932599531843e-01, +4.7175336386511828e-02, + +2.1526385346315779e-01, +2.0519846372129560e-01, +1.8553839747793782e-01, +1.5720316715819355e-01, +1.2151857068790319e-01, +8.0158087159760208e-02, +3.5119460331751860e-02, + +1.8945061045506850e-01, +1.8260341504492358e-01, +1.6915651939500254e-01, +1.4959598881657674e-01, +1.2462897125553388e-01, +9.5158511682492786e-02, +6.2253523938647894e-02, +2.7152459411754096e-02, + +1.6914238296314360e-01, +1.6427648374583273e-01, +1.5468467512626524e-01, +1.4064291467065065e-01, +1.2255520671147846e-01, +1.0094204410628717e-01, +7.6425730254889052e-02, +4.9714548894969797e-02, +2.1616013526483312e-02, + +1.5275338713072584e-01, +1.4917298647260374e-01, +1.4209610931838204e-01, +1.3168863844917664e-01, +1.1819453196151841e-01, +1.0193011981724044e-01, +8.3276741576704755e-02, +6.2672048334109068e-02, +4.0601429800386939e-02, +1.7614007139152118e-02, + +1.3925187285563198e-01, +1.3654149834601517e-01, +1.3117350478706238e-01, +1.2325237681051242e-01, +1.1293229608053922e-01, +1.0041414444288096e-01, +8.5941606217067729e-02, +6.9796468424520489e-02, +5.2293335152683286e-02, +3.3774901584814152e-02, +1.4627995298272200e-02, + +1.2793819534675216e-01, +1.2583745634682830e-01, +1.2167047292780339e-01, +1.1550566805372560e-01, +1.0744427011596563e-01, +9.7618652104113884e-02, +8.6190161531953274e-02, +7.3346481411080300e-02, +5.9298584915436783e-02, +4.4277438817419808e-02, +2.8531388628933663e-02, +1.2341229799987200e-02, + +1.1832141527926228e-01, +1.1666044348529658e-01, +1.1336181654631966e-01, +1.0847184052857659e-01, +1.0205916109442542e-01, +9.4213800355914146e-02, +8.5045894313485235e-02, +7.4684149765659749e-02, +6.3274046329574840e-02, +5.0975825297147809e-02, +3.7962383294362766e-02, +2.4417851092631910e-02, +1.0551372617343006e-02, + +1.1004701301647520e-01, +1.0871119225829413e-01, +1.0605576592284642e-01, +1.0211296757806076e-01, +9.6930657997929923e-02, +9.0571744393032838e-02, +8.3113417228901212e-02, +7.4646214234568783e-02, +6.5272923966999602e-02, +5.5107345675716748e-02, +4.4272934759004227e-02, +3.2901427782304378e-02, +2.1132112592771261e-02, +9.1242825930945171e-03, + +1.0285265289355884e-01, +1.0176238974840550e-01, +9.9593420586795267e-02, +9.6368737174644253e-02, +9.2122522237786122e-02, +8.6899787201082976e-02, +8.0755895229420213e-02, +7.3755974737705204e-02, +6.5974229882180491e-02, +5.7493156217619065e-02, +4.8402672830594053e-02, +3.8799192569627050e-02, +2.8784707883323369e-02, +1.8466468311090958e-02, +7.9681924961666050e-03, + +9.6540088514727798e-02, +9.5638720079274861e-02, +9.3844399080804566e-02, +9.1173878695763891e-02, +8.7652093004403811e-02, +8.3311924226946749e-02, +7.8193895787070311e-02, +7.2345794108848505e-02, +6.5822222776361849e-02, +5.8684093478535544e-02, +5.0998059262376175e-02, +4.2835898022226683e-02, +3.4273862913021431e-02, +2.5392065309262059e-02, +1.6274394730905670e-02, +7.0186100094700964e-03, + +9.0956740330259869e-02, +9.0203044370640736e-02, +8.8701897835693863e-02, +8.6465739747035752e-02, +8.3513099699845661e-02, +7.9868444339771846e-02, +7.5561974660031936e-02, +7.0629375814255727e-02, +6.5111521554076415e-02, +5.9054135827524494e-02, +5.2507414572678109e-02, +4.5525611523353271e-02, +3.8166593796387517e-02, +3.0491380638446131e-02, +2.2563721985494969e-02, +1.4450162748595036e-02, +6.2291405559086847e-03, + +8.5983275670394751e-02, +8.5346685739338624e-02, +8.4078218979661931e-02, +8.2187266704339706e-02, +7.9687828912071601e-02, +7.6598410645870668e-02, +7.2941885005653059e-02, +6.8745323835736449e-02, +6.4039797355015485e-02, +5.8860144245324819e-02, +5.3244713977759921e-02, +4.7235083490265978e-02, +4.0875750923644892e-02, +3.4213810770307232e-02, +2.7298621498568779e-02, +2.0181515297735472e-02, +1.2915947284065574e-02, +5.5657196642450455e-03, + +8.1525029280385783e-02, +8.0982493770597103e-02, +7.9901033243527819e-02, +7.8287844658210953e-02, +7.6153663548446396e-02, +7.3512692584743453e-02, +7.0382507066898956e-02, +6.6783937979140409e-02, +6.2740933392133061e-02, +5.8280399146997203e-02, +5.3432019910332321e-02, +4.8228061860758682e-02, +4.2703158504674432e-02, +3.6894081594024741e-02, +3.0839500545175053e-02, +2.4579739738232374e-02, +1.8156577709613236e-02, +1.1613444716468675e-02, +5.0028807496393457e-03, + +7.7505947978424805e-02, +7.7039818164247972e-02, +7.6110361900626242e-02, +7.4723169057968261e-02, +7.2886582395804062e-02, +7.0611647391286780e-02, +6.7912045815233898e-02, +6.4804013456601042e-02, +6.1306242492928938e-02, +5.7439769099391552e-02, +5.3227846983936823e-02, +4.8695807635072232e-02, +4.3870908185673269e-02, +3.8782167974472016e-02, +3.3460195282547844e-02, +2.7937006980023400e-02, +2.2245849194166958e-02, +1.6421058381907890e-02, +1.0498284531152813e-02, +4.5212770985331909e-03, + +7.3864234232172879e-02, +7.3460813453467527e-02, +7.2656175243804105e-02, +7.1454714265170985e-02, +6.9862992492594159e-02, +6.7889703376521948e-02, +6.5545624364908975e-02, +6.2843558045002579e-02, +5.9798262227586656e-02, +5.6426369358018383e-02, +5.2746295699174071e-02, +4.8778140792803244e-02, +4.4543577771965881e-02, +4.0065735180692265e-02, +3.5369071097592110e-02, +3.0479240699603467e-02, +2.5422959526113047e-02, +2.0227869569052644e-02, +1.4922443697357493e-02, +9.5362203017485027e-03, +4.1059986046490847e-03, + +7.0549157789354069e-02, +7.0197685473558216e-02, +6.9496491861572585e-02, +6.8449070269366655e-02, +6.7060638906293657e-02, +6.5338114879181439e-02, +6.3290079733203858e-02, +6.0926736701561970e-02, +5.8259859877595493e-02, +5.5302735563728056e-02, +5.2070096091704460e-02, +4.8578046448352036e-02, +4.4843984081970031e-02, +4.0886512310346221e-02, +3.6725347813808873e-02, +3.2381222812069822e-02, +2.7875782821281010e-02, +2.3231481902019211e-02, +1.8471481736814750e-02, +1.3619586755579985e-02, +8.7004813675248434e-03, +3.7454048031127776e-03, + +6.7518685849036461e-02, +6.7210613600678176e-02, +6.6595874768454882e-02, +6.5677274267781208e-02, +6.4459003467139064e-02, +6.2946621064394512e-02, +6.1147027724650478e-02, +5.9068434595546317e-02, +5.6720325843991233e-02, +5.4113415385856754e-02, +5.1259598007143019e-02, +4.8171895101712200e-02, +4.4864395277318128e-02, +4.1352190109678728e-02, +3.7651305357386068e-02, +3.3778627999106900e-02, +2.9751829552202756e-02, +2.5589286397130012e-02, +2.1309998754136500e-02, +1.6933514007836239e-02, +1.2479883770988685e-02, +7.9698982297246226e-03, +3.4303008681070483e-03, + +6.4737696812683918e-02, +6.4466164435950088e-02, +6.3924238584648185e-02, +6.3114192286254020e-02, +6.2039423159892665e-02, +6.0704439165893881e-02, +5.9114839698395635e-02, +5.7277292100403214e-02, +5.5199503699984165e-02, +5.2890189485193667e-02, +5.0359035553854473e-02, +4.7616658492490478e-02, +4.4674560856694280e-02, +4.1545082943464748e-02, +3.8241351065830709e-02, +3.4777222564770442e-02, +3.1167227832798090e-02, +2.7426509708356948e-02, +2.3570760839324380e-02, +1.9616160457355529e-02, +1.5579315722943849e-02, +1.1477234579234540e-02, +7.3275539012762625e-03, +3.1533460523058385e-03, + +6.2176616655347260e-02, +6.1936067420683243e-02, +6.1455899590316665e-02, +6.0737970841770218e-02, +5.9785058704265460e-02, +5.8600849813222444e-02, +5.7189925647728380e-02, +5.5557744806212520e-02, +5.3710621888996245e-02, +5.1655703069581137e-02, +4.9400938449466317e-02, +4.6955051303948434e-02, +4.4327504338803274e-02, +4.1528463090147696e-02, +3.8568756612587678e-02, +3.5459835615146151e-02, +3.2213728223578014e-02, +2.8842993580535197e-02, +2.5360673570012392e-02, +2.1780243170124794e-02, +1.8115560713489392e-02, +1.4380822761485574e-02, +1.0590548383650969e-02, +6.7597991957454012e-03, +2.9086225531551411e-03, + +5.9810365745291860e-02, +5.9596260171248160e-02, +5.9168815466042968e-02, +5.8529561771813871e-02, +5.7680787452526826e-02, +5.6625530902368597e-02, +5.5367569669302653e-02, +5.3911406932757262e-02, +5.2262255383906990e-02, +5.0426018566342379e-02, +4.8409269744074897e-02, +4.6219228372784790e-02, +4.3863734259000406e-02, +4.1351219500560268e-02, +3.8690678310423977e-02, +3.5891634835097233e-02, +3.2964109089718800e-02, +2.9918581147143946e-02, +2.6765953746504013e-02, +2.3517513553984463e-02, +2.0184891507980793e-02, +1.6780023396300737e-02, +1.3315114982340961e-02, +9.8026345794627514e-03, +6.2555239629732773e-03, +2.6913169500471113e-03, + +5.7617536707147025e-02, +5.7426137054112113e-02, +5.7043973558794599e-02, +5.6472315730625965e-02, +5.5713062560589985e-02, +5.4768736213057986e-02, +5.3642473647553611e-02, +5.2338016198298747e-02, +5.0859697146188147e-02, +4.9212427324528886e-02, +4.7401678806444990e-02, +4.5433466728276715e-02, +4.3314329309597013e-02, +4.1051306136644976e-02, +3.8651914782102517e-02, +3.6124125840383554e-02, +3.3476336464372647e-02, +3.0717342497870677e-02, +2.7856309310595871e-02, +2.4902741467208774e-02, +2.1866451422853084e-02, +1.8757527621469379e-02, +1.5586303035924131e-02, +1.2363328128847644e-02, +9.0993694555093971e-03, +5.8056110152399851e-03, +2.4974818357615860e-03, + +5.5579746306514397e-02, +5.5407952503245123e-02, +5.5064895901762424e-02, +5.4551636870889424e-02, +5.3869761865714488e-02, +5.3021378524010766e-02, +5.2009109151741402e-02, +5.0836082617798484e-02, +4.9505924683047577e-02, +4.8022746793600260e-02, +4.6391133373001894e-02, +4.4616127652692281e-02, +4.2703216084667088e-02, +4.0658311384744517e-02, +3.8487734259247661e-02, +3.6198193872315189e-02, +3.3796767115611762e-02, +3.1290876747310445e-02, +2.8688268473822741e-02, +2.5996987058391954e-02, +2.3225351562565315e-02, +2.0381929882402571e-02, +1.7475512911400946e-02, +1.4515089278021472e-02, +1.1509824340383383e-02, +8.4690631633078869e-03, +5.4025222460153382e-03, +2.3238553757732156e-03, + +5.3681119863334847e-02, +5.3526343304058255e-02, +5.3217236446579011e-02, +5.2754690526370836e-02, +5.2140039183669822e-02, +5.1375054618285725e-02, +5.0461942479953129e-02, +4.9403335508962393e-02, +4.8202285945417749e-02, +4.6862256729026344e-02, +4.5387111514819806e-02, +4.3781103533640252e-02, +4.2048863329582124e-02, +4.0195385409867800e-02, +3.8226013845858435e-02, +3.6146426867087272e-02, +3.3962620493416008e-02, +3.1680891253809330e-02, +2.9307818044160491e-02, +2.6850243181981870e-02, +2.4315252724963952e-02, +2.1710156140146236e-02, +1.9042465461893407e-02, +1.6319874234970964e-02, +1.3550237112988812e-02, +1.0741553532878773e-02, +7.9019738499986752e-03, +5.0399816126502428e-03, +2.1677232496274501e-03, + +5.1907877631220636e-02, +5.1767943174910187e-02, +5.1488451500980935e-02, +5.1070156069855627e-02, +5.0514184532509374e-02, +4.9822035690550180e-02, +4.8995575455756835e-02, +4.8037031819971182e-02, +4.6948988848912201e-02, +4.5734379716114486e-02, +4.4396478795787113e-02, +4.2938892835935639e-02, +4.1365551235584753e-02, +3.9680695452380801e-02, +3.7888867569243444e-02, +3.5994898051084502e-02, +3.4003892724946423e-02, +3.1921219019296329e-02, +2.9752491500788944e-02, +2.7503556749924791e-02, +2.5180477621521247e-02, +2.2789516943997820e-02, +2.0337120729457286e-02, +1.7829901014207720e-02, +1.5274618596784799e-02, +1.2678166476815959e-02, +1.0047557182287984e-02, +7.3899311633454558e-03, +4.7127299269535683e-03, +2.0268119688737585e-03, + +5.0248000375256278e-02, +5.0121069569043289e-02, +4.9867528594952394e-02, +4.9488017919699291e-02, +4.8983496220517835e-02, +4.8355237963477675e-02, +4.7604830184101235e-02, +4.6734168478415522e-02, +4.5745452214570180e-02, +4.4641178977124413e-02, +4.3424138258047418e-02, +4.2097404410385099e-02, +4.0664328882417444e-02, +3.9128531751963083e-02, +3.7493892582280031e-02, +3.5764540622768140e-02, +3.3944844379410546e-02, +3.2039400581624682e-02, +3.0053022573989872e-02, +2.7990728163314639e-02, +2.5857726954024697e-02, +2.3659407208682794e-02, +2.1401322277669967e-02, +1.9089176658573199e-02, +1.6728811790177316e-02, +1.4326191823806518e-02, +1.1887390117010501e-02, +9.4185794284203875e-03, +6.9260419018309606e-03, +4.4163334569309052e-03, +1.8992056795136905e-03, +}; + +static dtype POLY_SMALLX_W1[] = { + +-3.3333333333333331e-01, + +-1.2271362192859778e-01, +-2.1061971140473557e-01, + +-5.6487691723447885e-02, +-1.4907718645889767e-01, +-1.2776845515098778e-01, + +-3.1384430571429409e-02, +-8.9804624256712817e-02, +-1.2931437096375242e-01, +-8.2829907541438680e-02, + +-1.9686757690986864e-02, +-5.6173759018728280e-02, +-9.7115272681211257e-02, +-1.0297926219357020e-01, +-5.7378281748836732e-02, + +-1.3404459326117429e-02, +-3.7140259226780728e-02, +-6.9798025993402457e-02, +-8.9903208869919593e-02, +-8.1202949733650345e-02, +-4.1884430183462780e-02, + +-9.6762784934135981e-03, +-2.5810077192692869e-02, +-5.0559277860857933e-02, +-7.1997207281479375e-02, +-7.8739057440032886e-02, +-6.4711830138776669e-02, +-3.1839604926079998e-02, + +-7.2956931243810877e-03, +-1.8697575943681034e-02, +-3.7385544074891822e-02, +-5.6452682904581976e-02, +-6.8429140245654982e-02, +-6.7705342645285799e-02, +-5.2380981359025407e-02, +-2.4986373035831237e-02, + +-5.6884471222090364e-03, +-1.4017609368068548e-02, +-2.8279396473125228e-02, +-4.4297481709585342e-02, +-5.7192383961753759e-02, +-6.2644131890598725e-02, +-5.8019794346925377e-02, +-4.3080183147849817e-02, +-2.0113905313217502e-02, + +-4.5548069078836916e-03, +-1.0812068870036251e-02, +-2.1858322694621932e-02, +-3.5065901484532154e-02, +-4.7201253922888042e-02, +-5.5107972224754838e-02, +-5.6377251364257981e-02, +-4.9866349375738916e-02, +-3.5958202071776788e-02, +-1.6531204416842745e-02, + +-3.7265960577018311e-03, +-8.5403678824716809e-03, +-1.7229332137015666e-02, +-2.8080687367955298e-02, +-3.8907666134333468e-02, +-4.7433694841593890e-02, +-5.1693920888210537e-02, +-5.0384549968286702e-02, +-4.3099530033836778e-02, +-3.0414471142145506e-02, +-1.3822516879781982e-02, + +-3.1038096899801901e-03, +-6.8830915722212487e-03, +-1.3819746842434521e-02, +-2.2762002213180321e-02, +-3.2198834723663874e-02, +-4.0484183390368120e-02, +-4.6081931636853396e-02, +-4.7795785285076720e-02, +-4.4950377862156901e-02, +-3.7497135400073503e-02, +-2.6030178540522940e-02, +-1.1726256176801588e-02, + +-2.6240792114390053e-03, +-5.6436186987320449e-03, +-1.1257772310878891e-02, +-1.8670533124689720e-02, +-2.6815751926887902e-02, +-3.4492520092913835e-02, +-4.0518024622316566e-02, +-4.3878709377426037e-02, +-4.3860783492389178e-02, +-4.0143708158048838e-02, +-3.2844993055811733e-02, +-2.2511371641957784e-02, +-1.0071467619841788e-02, + +-2.2469308790401127e-03, +-4.6964849046452917e-03, +-9.2974560817277799e-03, +-1.5486275275472907e-02, +-2.2495801468911308e-02, +-2.9439624856328239e-02, +-3.5409663026430928e-02, +-3.9576455854167823e-02, +-4.1281268726971909e-02, +-4.0109999958463663e-02, +-3.5940867319080382e-02, +-2.8960749795930670e-02, +-1.9649015970703121e-02, +-8.7427392154592037e-03, + +-1.9452005169610048e-03, +-3.9590659703587971e-03, +-7.7727242996177151e-03, +-1.2978556297161697e-02, +-1.9014501003127515e-02, +-2.5218029951309142e-02, +-3.0889870150948288e-02, +-3.5361429299482924e-02, +-3.8059523861408914e-02, +-3.8562264536316726e-02, +-3.6640791404117634e-02, +-3.2282899099728132e-02, +-2.5696361141300823e-02, +-1.7292174284832689e-02, +-7.6599415166613213e-03, + +-1.7001230829367258e-03, +-3.3754187760707522e-03, +-6.5691417015674332e-03, +-1.0980813193163734e-02, +-1.6191752239187309e-02, +-2.1700508243780385e-02, +-2.6965355395781234e-02, +-3.1450294276355116e-02, +-3.4670712171327708e-02, +-3.6234880948403915e-02, +-3.5877818286314068e-02, +-3.3484676556934885e-02, +-2.9101705514392662e-02, +-2.2933920020103322e-02, +-1.5330145136012663e-02, +-6.7660677910014247e-03, + +-1.4984074950259089e-03, +-2.9067246676076157e-03, +-5.6063199913378228e-03, +-9.3719000074020762e-03, +-1.3886833612390828e-02, +-1.8766944700796127e-02, +-2.3589413509197684e-02, +-2.7924639812563028e-02, +-3.1368700683786291e-02, +-3.3573990726416987e-02, +-3.4275766919362793e-02, +-3.3312623741992758e-02, +-3.0639375470369250e-02, +-2.6331392475133136e-02, +-2.0580114466852976e-02, +-1.3680500642828962e-02, +-6.0196844102690869e-03, + +-1.3304316837717016e-03, +-2.5254539216072332e-03, +-4.8267625926033710e-03, +-8.0628400015049003e-03, +-1.1990899100116491e-02, +-1.6313190281052339e-02, +-2.0697019672680061e-02, +-2.4797149597584039e-02, +-2.8279093434533591e-02, +-3.0841757376119491e-02, +-3.2237924483929564e-02, +-3.2291219224453237e-02, +-3.0908424053730399e-02, +-2.8086328935576100e-02, +-2.3912663421741687e-02, +-1.8561091188511476e-02, +-1.2280982655562224e-02, +-5.3901017082554287e-03, + +-1.1890941070327255e-03, +-2.2116988826134500e-03, +-4.1886553631745567e-03, +-6.9875756372839480e-03, +-1.0419927528137743e-02, +-1.4252420410437240e-02, +-1.8221106397652641e-02, +-2.2047354808442856e-02, +-2.5454745823222515e-02, +-2.8185874148949006e-02, +-3.0018058614902164e-02, +-3.0777018638139111e-02, +-3.0347699599460185e-02, +-2.8681599315174507e-02, +-2.5800157550483593e-02, +-2.1794010982877157e-02, +-1.6818196700600894e-02, +-1.1083936470966001e-02, +-4.8542023537830386e-03, + +-1.0690629147509234e-03, +-1.9508097838309760e-03, +-3.6611187853273588e-03, +-6.0965216267657952e-03, +-9.1089122140064586e-03, +-1.2513632207604274e-02, +-1.6099559879687413e-02, +-1.9640657574944317e-02, +-2.2908354254861273e-02, +-2.5684094401597250e-02, +-2.7771375416823764e-02, +-2.9006623070525431e-02, +-2.9268317072484000e-02, +-2.8483873130656211e-02, +-2.6633909001728261e-02, +-2.3753664147307559e-02, +-1.9931501267395593e-02, +-1.5304606185569621e-02, +-1.0052431646823436e-02, +-4.3943087506434211e-03, + +-9.6627314278892426e-04, +-1.7318347083541976e-03, +-3.2210239526491015e-03, +-5.3520511073680780e-03, +-8.0073246286096484e-03, +-1.1039282585195927e-02, +-1.4277715337011516e-02, +-1.7538220345659664e-02, +-2.0631374387745500e-02, +-2.3372173185105094e-02, +-2.5589275254414505e-02, +-2.7133596260340120e-02, +-2.7885831872629167e-02, +-2.7762539538660241e-02, +-2.6720480163454536e-02, +-2.4759006126101473e-02, +-2.1920378758193571e-02, +-1.8288004573812425e-02, +-1.3982709537162180e-02, +-9.1575193277493756e-03, +-3.9967185403280816e-03, + +-8.7758269425313210e-04, +-1.5464683528524546e-03, +-2.8508202714467739e-03, +-4.7253106993737966e-03, +-7.0756580127189356e-03, +-9.7828924188553788e-03, +-1.2708741997005996e-02, +-1.5701898033920712e-02, +-1.8604879236247839e-02, +-2.1261187557625936e-02, +-2.3522435269239354e-02, +-2.5255124114469417e-02, +-2.6346772869184864e-02, +-2.6711118691921380e-02, +-2.6292159006198620e-02, +-2.5066852499734976e-02, +-2.3046357966386773e-02, +-2.0275756003799422e-02, +-1.6832270733800399e-02, +-1.2822101353378577e-02, +-8.3762659163262396e-03, +-3.6506796345923557e-03, + +-8.0053237561891213e-04, +-1.3883300247785086e-03, +-2.5370292953011361e-03, +-4.1939521779308740e-03, +-6.2828211065206491e-03, +-8.7069202945531735e-03, +-1.1353106382478750e-02, +-1.4096503966598999e-02, +-1.6805693484973475e-02, +-1.9348178723997807e-02, +-2.1595909708747425e-02, +-2.3430634422247840e-02, +-2.4748859759267428e-02, +-2.5466218075784461e-02, +-2.5521059996814338e-02, +-2.4877125808989646e-02, +-2.3525185527977711e-02, +-2.1483580167976052e-02, +-1.8797642603314672e-02, +-1.5538026278976966e-02, +-1.1798038198100505e-02, +-7.6903245153657745e-03, +-3.3476604370182329e-03, + +-7.3317556916507529e-04, +-1.2524590747887223e-03, +-2.2691845462950136e-03, +-3.7405007205857576e-03, +-5.6041788910352087e-03, +-7.7809841253016748e-03, +-1.0177696039521220e-02, +-1.2690665256319447e-02, +-1.5209771470394179e-02, +-1.7622633889750192e-02, +-1.9818915283735725e-02, +-2.1694557310112852e-02, +-2.3155787346856936e-02, +-2.4122745624809844e-02, +-2.4532595723585893e-02, +-2.4342000921887333e-02, +-2.3528872763375518e-02, +-2.2093325643166399e-02, +-2.0057801314458116e-02, +-1.7466359276473199e-02, +-1.4383164083589122e-02, +-1.0890252413042244e-02, +-7.0848839825290218e-03, +-3.0808220625546364e-03, + +-6.7395540337246787e-04, +-1.1349566358644543e-03, +-2.0390746801447687e-03, +-3.3511690623813806e-03, +-5.0200781398304032e-03, +-6.9804175588084787e-03, +-9.1548797431910186e-03, +-1.1456954442290054e-02, +-1.3793975716853965e-02, +-1.6070389378533476e-02, +-1.8191127216247032e-02, +-2.0064970609393468e-02, +-2.1607786472664380e-02, +-2.2745522888648222e-02, +-2.3416860109892888e-02, +-2.3575424563802901e-02, +-2.3191488659954042e-02, +-2.2253097062672412e-02, +-2.0766580060411256e-02, +-1.8756436145074561e-02, +-1.6264588577291961e-02, +-1.3349045851497947e-02, +-1.0082036571136040e-02, +-6.5478866197224098e-03, +-2.8446311636533511e-03, + +-6.2161488689990480e-04, +-1.0327275086083386e-03, +-1.8401960580889394e-03, +-3.0149869640499873e-03, +-4.5147339695371389e-03, +-6.2851163121741835e-03, +-8.2616265380855095e-03, +-1.0371671052150202e-02, +-1.2536935793770810e-02, +-1.4675940887304666e-02, +-1.6706702024265049e-02, +-1.8549412886245953e-02, +-2.0129062224194316e-02, +-2.1377901293589997e-02, +-2.2237682139585283e-02, +-2.2661594577637559e-02, +-2.2615839388568829e-02, +-2.2080786934452167e-02, +-2.1051683736156294e-02, +-1.9538884132735745e-02, +-1.7567599591891560e-02, +-1.5177174446041301e-02, +-1.2419915194091842e-02, +-9.3595332664645377e-03, +-6.0694393571820810e-03, +-2.6345721695611437e-03, + +-5.7513028408902322e-04, +-9.4329168430796887e-04, +-1.6673519036875177e-03, +-2.7231558362285969e-03, +-4.0753849099907985e-03, +-5.6786233722776929e-03, +-7.4787299505662741e-03, +-9.4144739152637359e-03, +-1.1419386669380317e-02, +-1.3423773547435855e-02, +-1.5356825713614353e-02, +-1.7148769050359263e-02, +-1.8732985812784094e-02, +-2.0048045624828675e-02, +-2.1039585086268936e-02, +-2.1661979765378692e-02, +-2.1879758536315162e-02, +-2.1668717899778190e-02, +-2.1016702873908635e-02, +-1.9924031000705781e-02, +-1.8403546708975267e-02, +-1.6480304475441670e-02, +-1.4190890952391386e-02, +-1.1582409919015752e-02, +-8.7111810553797079e-03, +-5.6413659566756039e-03, +-2.4469308282843898e-03, + +-5.3366111684094713e-04, +-8.6464500025246356e-04, +-1.5163554162466518e-03, +-2.4685657231938683e-03, +-3.6916481016212623e-03, +-5.1474059282214536e-03, +-6.7901472727191041e-03, +-8.5679696755271186e-03, +-1.0424220488828342e-02, +-1.2299092180139715e-02, +-1.4131308241160878e-02, +-1.5859852820091818e-02, +-1.7425695972749667e-02, +-1.8773466540719552e-02, +-1.9853026110371076e-02, +-2.0620900244837929e-02, +-2.1041527136180304e-02, +-2.1088288887562652e-02, +-2.0744296665855217e-02, +-2.0002907798798691e-02, +-1.8867960345377299e-02, +-1.7353718559221982e-02, +-1.5484530854094966e-02, +-1.3294210470928623e-02, +-1.0825159460360188e-02, +-8.1272796169722730e-03, +-5.2568631355084626e-03, +-2.2786295689508269e-03, + +-4.9651222051138092e-04, +-7.9515492910924588e-04, +-1.3838075161188327e-03, +-2.2454304965243265e-03, +-3.3550242159053603e-03, +-4.6802840672847696e-03, +-6.1824474473191234e-03, +-7.8173104864695114e-03, +-9.5363881834857386e-03, +-1.1288187853302170e-02, +-1.3019562855678271e-02, +-1.4677111485834683e-02, +-1.6208584731990053e-02, +-1.7564266368590393e-02, +-1.8698289564294306e-02, +-1.9569855822093415e-02, +-2.0144324592970581e-02, +-2.0394145249041540e-02, +-2.0299607180963412e-02, +-1.9849388492826435e-02, +-1.9040888986250282e-02, +-1.7880338725651895e-02, +-1.6382679334875805e-02, +-1.4571221214845644e-02, +-1.2477086244340073e-02, +-1.0138453615874508e-02, +-7.5996463863333523e-03, +-4.9102340771396448e-03, +-2.1271009877085771e-03, + +-4.6310464738128133e-04, +-7.3348180776671226e-04, +-1.2669287870492598e-03, +-2.0490099239445147e-03, +-3.0585149395456822e-03, +-4.2679787427113616e-03, +-5.6443547331045977e-03, +-7.1498252733619401e-03, +-8.7427296744303148e-03, +-1.0378587186787830e-02, +-1.2011190184133108e-02, +-1.3593741021053611e-02, +-1.5080004983478243e-02, +-1.6425451356138845e-02, +-1.7588354914387684e-02, +-1.8530831101716622e-02, +-1.9219779756140722e-02, +-1.9627714459533419e-02, +-1.9733457350653339e-02, +-1.9522682498344823e-02, +-1.8988294598248755e-02, +-1.8130633747778603e-02, +-1.6957501279801657e-02, +-1.5484006012953288e-02, +-1.3732234769856470e-02, +-1.1730755802916937e-02, +-9.5139701834677914e-03, +-7.1213437578314283e-03, +-4.5966801393834151e-03, +-1.9901896994310832e-03, + +-4.3295313883927794e-04, +-6.7851870107199454e-04, +-1.1634312017740312e-03, +-1.8753961641719409e-03, +-2.7963255554749196e-03, +-3.9027531947284874e-03, +-5.1663738309140816e-03, +-6.5546936397432127e-03, +-8.0317773547678734e-03, +-9.5590750512080276e-03, +-1.1096309789162002e-02, +-1.2602405937747242e-02, +-1.4036437074665549e-02, +-1.5358571907751601e-02, +-1.6530996706426423e-02, +-1.7518793260717383e-02, +-1.8290752391624653e-02, +-1.8820104496316398e-02, +-1.9085150491865859e-02, +-1.9069778779481357e-02, +-1.8763856436510597e-02, +-1.8163485698059839e-02, +-1.7271119851178813e-02, +-1.6095535868708110e-02, +-1.4651664402953265e-02, +-1.2960281132221278e-02, +-1.1047567099186447e-02, +-8.9445508736011696e-03, +-6.6864610473804766e-03, +-4.3121367372060491e-03, +-1.8660755178749769e-03, +}; + +static dtype POLY_LARGEX_RT[] = { + +5.0000000000000000e-01, + +2.7525512860841095e-01, +2.7247448713915889e+00, + +1.9016350919348812e-01, +1.7844927485432516e+00, +5.5253437422632601e+00, + +1.4530352150331710e-01, +1.3390972881263614e+00, +3.9269635013582871e+00, +8.5886356890120350e+00, + +1.1758132021177814e-01, +1.0745620124369040e+00, +3.0859374437175502e+00, +6.4147297336620301e+00, +1.1807189489971737e+01, + +9.8747014068481187e-02, +8.9830283456961768e-01, +2.5525898026681713e+00, +5.1961525300544658e+00, +9.1242480375311796e+00, +1.5129959781108086e+01, + +8.5115442997594035e-02, +7.7213792004277704e-01, +2.1805918884504591e+00, +4.3897928867310139e+00, +7.5540913261017844e+00, +1.1989993039823879e+01, +1.8528277495852493e+01, + +7.4791882596818265e-02, +6.7724908764928915e-01, +1.9051136350314284e+00, +3.8094763614849070e+00, +6.4831454286271706e+00, +1.0093323675221344e+01, +1.4972627088426393e+01, +2.1984272840962650e+01, + +6.6702230958194400e-02, +6.0323635708174872e-01, +1.6923950797931788e+00, +3.3691762702432690e+00, +5.6944233429577551e+00, +8.7697567302686021e+00, +1.2771825354869193e+01, +1.8046505467728981e+01, +2.5485979166099078e+01, + +6.0192063149587915e-02, +5.4386750029464603e-01, +1.5229441054044437e+00, +3.0225133764515739e+00, +5.0849077500985240e+00, +7.7774392315254453e+00, +1.1208130204348663e+01, +1.5561163332189350e+01, +2.1193892096301543e+01, +2.9024950340236227e+01, + +5.4839869578818493e-02, +4.9517412335035643e-01, +1.3846557400845998e+00, +2.7419199401067025e+00, +4.5977377004857116e+00, +6.9993974695288363e+00, +1.0018908275957234e+01, +1.3769305866101691e+01, +1.8441119680978193e+01, +2.4401961242387042e+01, +3.2594980091440817e+01, + +5.0361889117293952e-02, +4.5450668156378027e-01, +1.2695899401039614e+00, +2.5098480972321280e+00, +4.1984156448784136e+00, +6.3699753880306353e+00, +9.0754342309612035e+00, +1.2390447963809471e+01, +1.6432195087675314e+01, +2.1396755936166109e+01, +2.7661108779846089e+01, +3.6191360360615604e+01, + +4.6560083245024773e-02, +4.2002740640121355e-01, +1.1723107732777798e+00, +2.3145408643494343e+00, +3.8645850382281592e+00, +5.8487348113063433e+00, +8.3045534899859010e+00, +1.1285750993517638e+01, +1.4870960377525401e+01, +1.9180919485610456e+01, +2.4416692333056517e+01, +3.0963938274746795e+01, +3.9810426068749337e+01, + +4.3292035739773548e-02, +3.9042092604203149e-01, +1.0889658675692704e+00, +2.1477994705822314e+00, +3.5810282499917712e+00, +5.4091123306164599e+00, +7.6606911156100850e+00, +1.0375563009770053e+01, +1.3609711429390236e+01, +1.7444294475704190e+01, +2.2003196766914922e+01, +2.7492041504843851e+01, +3.4304620509373080e+01, +4.3449262307852045e+01, + +4.0452704304575260e-02, +3.6472064505140778e-01, +1.0167460688574956e+00, +2.0037189531339226e+00, +3.3369832057345099e+00, +5.0328052776251155e+00, +7.1135937697298752e+00, +9.6098172843044445e+00, +1.2563082369948498e+01, +1.6031284108073976e+01, +2.0097785334755926e+01, +2.4889312475156551e+01, +3.0615717400899491e+01, +3.7678471784205300e+01, +4.7105508618218913e+01, + +3.7962914575313457e-02, +3.4220015601094766e-01, +9.5355315539086549e-01, +1.8779315076960743e+00, +3.1246010507021444e+00, +4.7067267076675874e+00, +6.6422151797414442e+00, +8.9550013377233899e+00, +1.1677033673975957e+01, +1.4851431341801250e+01, +1.8537743178606693e+01, +2.2821300693525210e+01, +2.7831438211328678e+01, +3.3781970488226165e+01, +4.1081666525491201e+01, +5.0777223877537082e+01, + +3.5761858556337386e-02, +3.2230289701540760e-01, +8.9778743824424956e-01, +1.7671330095048279e+00, +2.9380104369247211e+00, +4.4212366485835117e+00, +6.2313736025080120e+00, +8.3876207781715131e+00, +1.0915150152476127e+01, +1.3847145110793951e+01, +1.7228024947684798e+01, +2.1118801755252182e+01, +2.5606595795917325e+01, +3.0823164238528481e+01, +3.6986065260934993e+01, +4.4511035627908562e+01, +5.4462790440994993e+01, + +3.3802060596144767e-02, +3.0459519206802305e-01, +8.4820747882451009e-01, +1.6687755533298347e+00, +2.7727245286391229e+00, +4.1690582475017761e+00, +5.8697952945278802e+00, +7.8906059174609409e+00, +1.0251740616401369e+01, +1.2979403028335362e+01, +1.6107833621211359e+01, +1.9682594096569808e+01, +2.3766014733151867e+01, +2.8446863416187917e+01, +3.3859169865578401e+01, +4.0224050469543094e+01, +4.7963921373889526e+01, +5.8160844506183068e+01, + +3.2045913128252994e-02, +2.8873407234686432e-01, +8.0383479939549507e-01, +1.5808614575096895e+00, +2.6252513972914890e+00, +3.9445843839317147e+00, +5.5489066368145510e+00, +7.4511963747374166e+00, +9.6680282675023470e+00, +1.2220529929386148e+01, +1.5135786084744241e+01, +1.8448961406463173e+01, +2.2206639606535553e+01, +2.6472355727146923e+01, +3.1336411796150887e+01, +3.6934985280054455e+01, +4.3492591618441629e+01, +5.1438070769382129e+01, +6.1870224479037041e+01, + +3.0463239279482524e-02, +2.7444471579285035e-01, +7.6388755844391321e-01, +1.5018014976681044e+00, +2.4928301451213657e+00, +3.7434180412162936e+00, +5.2620558537883513e+00, +7.0596277357415609e+00, +9.1498983120306487e+00, +1.1550198286442804e+01, +1.4282403685210403e+01, +1.7374366975199077e+01, +2.0862075185437845e+01, +2.4793039892463458e+01, +2.9231910157093427e+01, +3.4270428925039575e+01, +4.0046815790245603e+01, +4.6788846392124967e+01, +5.4931555621020550e+01, +6.5589931990639727e+01, + +2.9029543936387635e-02, +2.6150430708215294e-01, +7.2773338834365031e-01, +1.4303150459330356e+00, +2.3732474728319004e+00, +3.5620583926357074e+00, +5.0039935628186738e+00, +6.7082806310126752e+00, +8.6864934825800209e+00, +1.0953055650413523e+01, +1.3525943011373357e+01, +1.6427682387916022e+01, +1.9686806658322944e+01, +2.3340045388239311e+01, +2.7435762818520232e+01, +3.2039647947988584e+01, +3.7244806615266050e+01, +4.3191409701011828e+01, +5.0110370364086812e+01, +5.8442711638286255e+01, +6.9319101991400871e+01, + +2.7724736591276774e-02, +2.4973028108823533e-01, +6.9485521795227390e-01, +1.3653582776868292e+00, +2.2647072589375217e+00, +3.3976808657520632e+00, +4.7705156762734964e+00, +6.3911097478094518e+00, +8.2693001309060623e+00, +1.0417240214581929e+01, +1.2849916314252928e+01, +1.5585864757495914e+01, +1.8648187517474806e+01, +2.2066029202676830e+01, +2.5876798119301597e+01, +3.0129649964964479e+01, +3.4891252115132360e+01, +4.0256006929107102e+01, +4.6365957352938530e+01, +5.3455044504540616e+01, +6.1970091334807094e+01, +7.3056979479728611e+01, + +2.6532183876098379e-02, +2.3897161999933406e-01, +6.6482608325629022e-01, +1.3060716158039978e+00, +2.1657359795353486e+00, +3.2479796092961242e+00, +4.5582116475947760e+00, +6.1032492614598546e+00, +7.8915323621309739e+00, +9.9334115718826261e+00, +1.2241535951273148e+01, +1.4831380588625729e+01, +1.7721976213997483e+01, +2.0936940207605186e+01, +2.4505973901846374e+01, +2.8467112454527676e+01, +3.2870252361043640e+01, +3.7782987405363052e+01, +4.3300959201161334e+01, +4.9568012842125619e+01, +5.6821018665012517e+01, +6.5512427112270117e+01, +7.6802901160312700e+01, + +2.5437996585689359e-02, +2.2910231649262433e-01, +6.3729027873266875e-01, +1.2517406323627465e+00, +2.0751129098523808e+00, +3.1110524551477132e+00, +4.3642830769353065e+00, +5.8407332713236082e+00, +7.5477046800234540e+00, +9.4940953300264876e+00, +1.1690695926056073e+01, +1.4150586187285759e+01, +1.6889671928527108e+01, +1.9927425875242463e+01, +2.3287932824879917e+01, +2.7001406056472355e+01, +3.1106464709046566e+01, +3.5653703516328214e+01, +4.0711598185543110e+01, +4.6376979557540132e+01, +5.2795432527283630e+01, +6.0206666963057224e+01, +6.9068601975304375e+01, +8.0556280819950402e+01, + +2.4430486164134554e-02, +2.2001639865187669e-01, +6.1194905886035600e-01, +1.2017665377409916e+00, +1.9918178052911781e+00, +2.9853154656388092e+00, +4.1864105010442785e+00, +5.6002933990827337e+00, +7.2333279637322212e+00, +9.0932267983089190e+00, +1.1189281321712450e+01, +1.3532664930275971e+01, +1.6136836705389790e+01, +1.9018086906205195e+01, +2.2196288008884540e+01, +2.5695953089717140e+01, +2.9547770386068311e+01, +3.3790907096465993e+01, +3.8476619956375998e+01, +4.3674228042342541e+01, +4.9481707240111525e+01, +5.6046326151559533e+01, +6.3610552160222085e+01, +7.2637626045451725e+01, +8.4316597544701708e+01, + +2.3499745451748166e-02, +2.1162409772850768e-01, +5.8854965565640838e-01, +1.1556436128826397e+00, +1.9149911321201440e+00, +2.8694384848332137e+00, +4.0226539114050963e+00, +5.3792094651444282e+00, +6.9446884907059312e+00, +8.7258252848297229e+00, +1.0730686164960115e+01, +1.2968905056512702e+01, +1.5451992498719477e+01, +1.8193745832982035e+01, +2.1210802311794055e+01, +2.4523399621789363e+01, +2.8156446757738671e+01, +3.2141075953841757e+01, +3.6516971983705098e+01, +4.1336022358465094e+01, +4.6668355740523516e+01, +5.2613053664164717e+01, +5.9319017574105793e+01, +6.7031396926394294e+01, +7.6218617538242384e+01, +8.8083386135303101e+01, + +2.2637321764490403e-02, +2.0384886358910115e-01, +5.6687674698997592e-01, +1.1129417449108705e+00, +1.8439034531225937e+00, +2.7622958634819486e+00, +3.8713773423959186e+00, +5.1751974796436677e+00, +6.6786842873405901e+00, +8.3877565918984587e+00, +1.0309468348865641e+01, +1.2452194292401609e+01, +1.4825870237972618e+01, +1.7442307191222060e+01, +2.0315607360293736e+01, +2.3462724279507746e+01, +2.6904232239340534e+01, +3.0665409061778991e+01, +3.4777804747837429e+01, +3.9281595476659632e+01, +4.4229272334197169e+01, +4.9691743673383556e+01, +5.5769161249665579e+01, +6.2612012913671613e+01, +7.0468060440696945e+01, +7.9810787215031667e+01, +9.1856229242335857e+01, + +2.1835959421664289e-02, +1.9662501675605398e-01, +5.4674575955457738e-01, +1.0732927646925488e+00, +1.7779315886935154e+00, +2.6629283184247892e+00, +3.7311909350139651e+00, +4.9863243745575856e+00, +6.4327019219178299e+00, +8.0755565686670163e+00, +9.9210973194213103e+00, +1.1976657318097082e+01, +1.4250883359461472e+01, +1.6753980285337462e+01, +1.9498029648036461e+01, +2.2497411050074689e+01, +2.5769368816152561e+01, +2.9334789869091171e+01, +3.3219297919270076e+01, +3.7454838268460072e+01, +4.2082055800206739e+01, +4.7154021248777767e+01, +5.2742395970002200e+01, +5.8948369842919362e+01, +6.5923974474211676e+01, +7.3919519173353009e+01, +8.3413425568839060e+01, +9.5634750860588284e+01, + +2.1089395098205156e-02, +1.8989588398975638e-01, +5.2799756150380650e-01, +1.0363796519133510e+00, +1.7165398584196183e+00, +2.5705130786025099e+00, +3.6009058856172511e+00, +4.8109422295121211e+00, +6.2045223787503812e+00, +7.7862978584545157e+00, +9.5617661276720227e+00, +1.1537390089408222e+01, +1.3720749420799105e+01, +1.6120733421037702e+01, +1.8747789038878786e+01, +2.1614243675418422e+01, +2.4734731466985338e+01, +2.8126766135082082e+01, +3.1811526931229533e+01, +3.5814963828855454e+01, +4.0169397995140628e+01, +4.4915923137908337e+01, +5.0108168407561145e+01, +5.5818524151111106e+01, +6.2149189096788938e+01, +6.9253699227995114e+01, +7.7384850976179521e+01, +8.7025892182318486e+01, +9.9418610907768539e+01, + +2.0392193775236527e-02, +1.8361230503708192e-01, +5.1049421913596571e-01, +1.0019279274528394e+00, +1.6592651780060930e+00, +2.4843402777905514e+00, +3.4794990281427913e+00, +4.6476369270260962e+00, +5.9922482023656096e+00, +7.5174877929290096e+00, +9.2282491217658844e+00, +1.1130261490352575e+01, +1.3230212276078705e+01, +1.5535901019228723e+01, +1.8056435214799702e+01, +2.0802481620579336e+01, +2.3786592878196362e+01, +2.7023638435386893e+01, +3.0531383273363225e+01, +3.4331281605561593e+01, +3.8449592717510598e+01, +4.2918996674025955e+01, +4.7781018446551954e+01, +5.3089826610037136e+01, +5.8918518746195041e+01, +6.5370275574797105e+01, +7.2600100925448842e+01, +8.0863221815671636e+01, +9.0647606826965728e+01, +1.0320750067582173e+02, + +1.9739616193178225e-02, +1.7773142707141706e-01, +4.9411557648940696e-01, +9.6969873164499709e-01, +1.6057051140985357e+00, +2.4037941117242698e+00, +3.3660847103142895e+00, +4.4951876368162758e+00, +5.7942464369889661e+00, +7.2669891295593967e+00, +8.9177926244746359e+00, +1.0751762818395916e+01, +1.2774834264847245e+01, +1.4993894676815959e+01, +1.7416941435106203e+01, +2.0053280025321786e+01, +2.2913778355123558e+01, +2.6011196940249089e+01, +2.9360624220999089e+01, +3.2980060918172178e+01, +3.6891221217477799e+01, +4.1120658946990169e+01, +4.5701398131155180e+01, +5.0675379370668551e+01, +5.6097293554984454e+01, +6.2040925662658722e+01, +6.8610413634453707e+01, +7.5962195116562384e+01, +8.4353874634793740e+01, +9.4278041969742887e+01, +1.0700113899010603e+02, +}; + +static dtype POLY_LARGEX_WW[] = { + +1.0000000000000000e+00, + +9.0824829046386302e-01, +9.1751709536136983e-02, + +8.1765693911205850e-01, +1.7723149208382905e-01, +5.1115688041124931e-03, + +7.4602451535815473e-01, +2.3447981532351803e-01, +1.9270440241576533e-02, +2.2522907675073554e-04, + +6.8928466986403814e-01, +2.7096740596053548e-01, +3.8223161001540572e-02, +1.5161418686244353e-03, +8.6213052614365738e-06, + +6.4332872302566002e-01, +2.9393409609065996e-01, +5.8233375824728303e-02, +4.4067613750663976e-03, +9.6743698451812559e-05, +2.9998543352743358e-07, + +6.0526925362603901e-01, +3.0816667968502726e-01, +7.7300217648506794e-02, +8.8578382138948062e-03, +4.0067910752148827e-04, +5.3219826881352609e-06, +9.7363225154967611e-09, + +5.7313704247602426e-01, +3.1667674550189923e-01, +9.4569504708028052e-02, +1.4533875202369467e-02, +1.0519698531478185e-03, +3.0600064324974545e-05, +2.6189464325736453e-07, +2.9956294463236794e-10, + +5.4556646930857577e-01, +3.2137060778702525e-01, +1.0979326496044525e-01, +2.1033035503882684e-02, +2.1309695925833040e-03, +1.0359792288232413e-04, +2.0431047952739623e-06, +1.1810976957673191e-08, +8.8331775387174107e-12, + +5.2158612689910977e-01, +3.2347866796799990e-01, +1.2301274412795381e-01, +2.7995674894202006e-02, +3.6602062621609857e-03, +2.5765255992385888e-04, +8.8042421804617054e-06, +1.2254980519965896e-07, +4.9641247246303573e-10, +2.5156013448758539e-13, + +5.0048719317386992e-01, +3.2381258682735053e-01, +1.3439262285778006e-01, +3.5138145761611533e-02, +5.6175220951544319e-03, +5.2456660651192756e-04, +2.6691954253619027e-05, +6.6397074996280721e-07, +6.7330283189164226e-09, +1.9682757964692173e-11, +6.9589212957542919e-15, + +4.8174023109328062e-01, +3.2291902573400016e-01, +1.4413872803435665e-01, +4.2252688817935091e-02, +7.9532178583626174e-03, +9.2943743755879136e-04, +6.4190011305491828e-05, +2.4353194908851625e-06, +4.5349233469612837e-08, +3.4373298559297163e-10, +7.4299483055247976e-13, +1.8780387378083912e-16, + +4.6494147126015534e-01, +3.2117309122758919e-01, +1.5245906441260604e-01, +4.9195331314242363e-02, +1.0604396031364489e-02, +1.4884051527208678e-03, +1.3115117388667682e-04, +6.8868272246162541e-06, +1.9973511146629173e-07, +2.8485864759760186e-09, +1.6485618886327706e-11, +2.6890952993271460e-14, +4.9613885207872613e-18, + +4.4977725950135311e-01, +3.1883638732261832e-01, +1.5954673202319922e-01, +5.5871569535761778e-02, +1.3504919418060288e-02, +2.2086118557151971e-03, +2.3765707628035695e-04, +1.6187168114290304e-05, +6.6097288998530188e-07, +1.4958725169227277e-08, +1.6653219687764516e-10, +7.4918020703531324e-13, +9.3835311390007269e-16, +1.2865094877603708e-19, + +4.3599994363115452e-01, +3.1609390641804141e-01, +1.6557367343124368e-01, +6.2223540367002554e-02, +1.6591495115446591e-02, +3.0894146797321703e-03, +3.9302588796965280e-04, +3.3159963261346906e-05, +1.7818177737242388e-06, +5.7643503080952891e-08, +1.0356918934379420e-09, +9.1468517426524072e-12, +3.2481602599447942e-14, +3.1711218899325956e-17, +3.2816140162356828e-21, + +4.2341113976095862e-01, +3.1307798751519689e-01, +1.7068961654416151e-01, +6.8219695452184106e-02, +1.9806923404641182e-02, +4.1241021026157693e-03, +6.0511405163412495e-04, +6.1119606121792604e-05, +4.1192442079068574e-06, +1.7762581426211791e-07, +4.6250368241484811e-09, +6.6950024796024144e-11, +4.7561297115556171e-13, +1.3510580447340238e-15, +1.0416899183921723e-18, +8.2492149780365387e-23, + +4.1184987333822709e-01, +3.0988419302971959e-01, +1.7502336271724780e-01, +7.3846925916088518e-02, +2.3101477893554247e-02, +5.3016484766203907e-03, +8.7992993354924756e-04, +1.0365425286733819e-04, +8.4554514967754892e-06, +4.6240685286457705e-07, +1.6234818080244531e-08, +3.4486111334905771e-10, +4.0733153595416136e-12, +2.3558755812450367e-14, +5.4161094185246469e-17, +3.3362887511570735e-20, +2.0466542596109164e-24, + +4.0118401287804417e-01, +3.0658202679942276e-01, +1.7868499500877333e-01, +7.9104739533119445e-02, +2.6433148031204251e-02, +6.6082690768705906e-03, +1.2215096671021977e-03, +1.6440051124820763e-04, +1.5793956173446348e-05, +1.0556630385602033e-06, +4.7476455547314095e-08, +1.3742166774424460e-09, +2.4094891730959752e-11, +2.3480585102103185e-13, +1.1174227957300119e-15, +2.1005883869494762e-18, +1.0444732401725871e-21, +5.0180752692698952e-26, + +3.9130397408272694e-01, +3.0322229252021565e-01, +1.8176831110517649e-01, +8.4001039948325432e-02, +2.9767244441382214e-02, +8.0286850035604113e-03, +1.6319828251932273e-03, +2.4684151322487875e-04, +2.7333196978369716e-05, +2.1703986095318892e-06, +1.2035140659893825e-07, +4.5029695793209629e-09, +1.0862939294794203e-10, +1.5883441401039689e-12, +1.2895813049708617e-14, +5.0973075787523842e-17, +7.9075044204715010e-20, +3.2031736699482299e-23, +1.2172039136849715e-27, + +3.8211801932398098e-01, +2.9984222352714129e-01, +1.8435315834012161e-01, +8.8549110404553627e-02, +3.3075688285138807e-02, +9.5470897636467222e-03, +2.1117580338036305e-03, +3.5414585759848034e-04, +4.4423542864951672e-05, +4.0977948721629217e-06, +2.7206848431497516e-07, +1.2651794377097727e-08, +3.9782370520555256e-10, +8.0752771633903726e-12, +9.9361770583955663e-14, +6.7797068864966500e-16, +2.2445504136542276e-18, +2.8972188631031838e-21, +9.6409358804016256e-25, +2.9236797477388334e-29, + +3.7354869772403904e-01, +2.9646910879859129e-01, +1.8650753720919128e-01, +9.2765483582315497e-02, +3.6336180231103146e-02, +1.1147849122436932e-02, +2.6597718111442863e-03, +4.8905337817380372e-04, +6.8514755458217144e-05, +7.2106204226087590e-06, +5.6008898522734312e-07, +3.1408112827615208e-08, +1.2364837913810998e-09, +3.2968179518363160e-11, +5.6788001330617536e-13, +5.9277568359646953e-15, +3.4256354220559639e-17, +9.5710836993052230e-20, +1.0356140658899054e-22, +2.8523956917266094e-26, +6.9596835174689164e-31, + +3.6553011371946231e-01, +2.9312288834281841e-01, +1.8828943358993128e-01, +9.6668454590768463e-02, +3.9531361667655203e-02, +1.2815980436689405e-02, +3.2737594536686007e-03, +6.5380594526582214e-04, +1.0110048687004475e-04, +1.1961012995742855e-05, +1.0668304325616616e-06, +7.0441602788046541e-08, +3.3660916108090524e-09, +1.1313130408204488e-10, +2.5781296319278107e-12, +3.7970360820092867e-14, +3.3868542207148304e-16, +1.6693353963053630e-18, +3.9630311999855163e-21, +3.6189621414024282e-24, +8.3072697216188933e-28, +1.6430501786349221e-32, + +3.5800580619470224e-01, +2.8981803207491413e-01, +1.8974838445154743e-01, +1.0027705660218360e-01, +4.2648028294714431e-02, +1.4537458961986797e-02, +3.9505207413261072e-03, +8.5011717981626621e-04, +1.4366505225061130e-04, +1.8873197643040382e-05, +1.9035156699551580e-06, +1.4516963726858872e-07, +8.2164449617053346e-09, +3.3722125814057582e-10, +9.7482259264857162e-12, +1.9122727690869887e-13, +2.4244888308603273e-15, +1.8600707015402171e-17, +7.8690901804095408e-20, +1.5972254521067973e-22, +1.2385719396147015e-25, +2.3844925442657878e-29, +3.8493292540923028e-34, + +3.5092708362373221e-01, +2.8656491398635237e-01, +1.9092680112285854e-01, +1.0361036709912053e-01, +4.5676424200182683e-02, +1.6299393710703856e-02, +4.6861642235208030e-03, +1.0791731692543769e-03, +1.9763609835222678e-04, +2.8532184648493629e-05, +3.2127873910852268e-06, +2.7855833791199193e-07, +1.8308111492627642e-08, +8.9485743068727498e-10, +3.1767219624927134e-11, +7.9516119169429805e-13, +1.3513354549314233e-14, +1.4839987196129436e-16, +9.8509302193979142e-19, +3.5977098324746188e-21, +6.2789532895984159e-24, +4.1581179428373256e-27, +6.7529122862707464e-31, +8.9543109477517401e-36, + +3.4425170398488636e-01, +2.8337082649988776e-01, +1.9186108071620300e-01, +1.0668704906340193e-01, +4.8609625728486129e-02, +1.8090108309699284e-02, +5.4763217938706820e-03, +1.3416561239574158e-03, +2.6434526573379763e-04, +4.1569703514690922e-05, +5.1698753178987693e-06, +5.0292197616776470e-07, +3.7764519536704563e-08, +2.1541215787780342e-09, +9.1532734246208986e-11, +2.8284578722532820e-12, +6.1676573740107623e-14, +9.1333964936011630e-16, +8.7363436324031306e-18, +5.0449656143360147e-20, +1.5990188955830168e-22, +2.4120891015221532e-25, +1.3712561517848866e-28, +1.8886829319168770e-32, +2.0692150011539962e-37, + +3.3794281831211437e-01, +2.8024073546098432e-01, +1.9258253664230973e-01, +1.0952505818221495e-01, +5.1443013966369251e-02, +1.9899155012384467e-02, +6.3163306227402025e-03, +1.6377836829106235e-03, +3.4499769531939000e-04, +5.8648633425770045e-05, +7.9822676287387412e-06, +8.6158159056191463e-07, +7.2919305786010736e-08, +4.7737982856558615e-09, +2.3782159601959589e-10, +8.8381931671955866e-12, +2.3909835074532958e-13, +4.5669756896372288e-15, +5.9243423891952970e-17, +4.9611413029243299e-19, +2.5046563890060752e-21, +6.9230353804790649e-24, +9.0697778108407137e-27, +4.4476138376213146e-30, +5.2211960259687506e-34, +4.7522163234420851e-39, + +3.3196811795916797e-01, +2.7717784627086350e-01, +1.9311817671143119e-01, +1.1214146659976469e-01, +5.4173829278283167e-02, +2.1717283483241989e-02, +7.2013828893609513e-03, +1.9673577634472727e-03, +4.4065031364698225e-04, +8.0447056193944704e-05, +1.1887976024248379e-05, +1.4102595988863506e-06, +1.3299289524291626e-07, +9.8546372097326664e-09, +5.6585279982455109e-10, +2.4761135152376546e-11, +8.0919962956343983e-13, +1.9265276469394000e-14, +3.2395644735553757e-16, +3.6991112272006689e-18, +2.7246881477213788e-20, +1.2080980930422961e-22, +2.9251392406309606e-25, +3.3429672492020109e-28, +1.4203821086453334e-31, +1.4277608134851950e-35, +1.0851136987196605e-40, + +3.2629914080686934e-01, +2.7418403121591522e-01, +1.9349135384672128e-01, +1.1455236779916420e-01, +5.6800798959136672e-02, +2.3536380515071280e-02, +8.1266456989688568e-03, +2.3298181360809985e-03, +5.5219822553578704e-04, +1.0764284892273721e-04, +1.7152583673214982e-05, +2.2181151846596210e-06, +2.3080391657036210e-07, +1.9130906282643374e-08, +1.2482138218979068e-09, +6.3205006410821946e-11, +2.4420298304472757e-12, +7.0528726336758567e-14, +1.4847846385026617e-15, +2.2081547314362957e-17, +2.2293012712626885e-19, +1.4505724806862015e-21, +5.6724748192019088e-24, +1.2081232562612244e-26, +1.2093961010872282e-29, +4.4708121318609240e-33, +3.8646806884574510e-37, +2.4643207251964564e-42, + +3.2091070260471899e-01, +2.7126015390759434e-01, +1.9372231080136831e-01, +1.1677283731866922e-01, +5.9323828445470898e-02, +2.5349392478457165e-02, +9.0873545403086370e-03, +2.7242971132887413e-03, +6.8036819444262659e-04, +1.4089949985735000e-04, +2.4065325529694293e-05, +3.3683591904564624e-06, +3.8347678623247262e-07, +3.5200066343932804e-08, +2.5784329171251308e-09, +1.4890103967540035e-10, +6.6820102338953568e-12, +2.2903165842743183e-13, +5.8723917058983836e-15, +1.0979718124159402e-16, +1.4502656885515038e-18, +1.2998534256895677e-20, +7.5014959155146296e-23, +2.5973065268494646e-25, +4.8845679074858355e-28, +4.2994974135956300e-31, +1.3882300680633443e-34, +1.0361288228040763e-38, +5.5680352918588278e-44, + +3.1578042765949238e-01, +2.6840631685517313e-01, +1.9382863687099960e-01, +1.1881693127749456e-01, +6.1743746844779984e-02, +2.7150238923080394e-02, +1.0078883978552689e-02, +3.1496727855870829e-03, +8.2571803671126003e-04, +1.8085360541258893e-04, +3.2934475587777893e-05, +4.9584218331236953e-06, +6.1310664099141697e-07, +6.1785017606854071e-08, +5.0289859710017596e-09, +3.2715763079828753e-10, +1.6801084533762248e-11, +6.7120850712329025e-13, +2.0498413262850772e-14, +4.6855314259072089e-16, +7.8120487098049794e-18, +9.2003980457468935e-20, +7.3486452176672533e-22, +3.7752824470360482e-24, +1.1615602816842657e-26, +1.9358169994612708e-29, +1.5036325048276650e-32, +4.2558250249436302e-36, +2.7529603514345679e-40, +1.2520351346822822e-45, + +3.1088835901770417e-01, +2.6562205119893828e-01, +1.9382565158599319e-01, +1.2069770990611951e-01, +6.4062098330091646e-02, +2.8933723190107209e-02, +1.1096799233588306e-02, +3.6046190917707753e-03, +9.8864073763996327e-04, +2.2810430848881909e-04, +4.4082312968263375e-05, +7.0996778628839258e-06, +9.4734617519597147e-07, +1.0402046551304455e-07, +9.3247728369681139e-09, +6.7620297828389661e-10, +3.9244392817292199e-11, +1.8000072378314520e-12, +6.4284832978960700e-14, +1.7562292529450302e-15, +3.5926337638018172e-17, +5.3612722742496849e-19, +5.6502164272837441e-21, +4.0359700176457077e-23, +1.8521346940051287e-25, +5.0810055281854111e-28, +7.5291225128713794e-31, +5.1779710958942424e-34, +1.2890636290348067e-37, +7.2526085391619564e-42, +2.8025709293189409e-47, +}; + +#ifdef HAVE_QUADMATH_H +//#include +#endif +#define PIE4 0.78539816339744827900 +#define THRESHOLD_ZERO (DBL_EPSILON * 8) +#define SMALLX_LIMIT 3e-7 + +static int rys_root1(dtype x, dtype *roots, dtype *weights); +static int rys_root2(dtype x, dtype *roots, dtype *weights); +static int rys_root3(dtype x, dtype *roots, dtype *weights); +static int rys_root4(dtype x, dtype *roots, dtype *weights); +static int rys_root5(dtype x, dtype *roots, dtype *weights); +typedef int QuadratureFunction(int n, dtype x, dtype lower, dtype *roots, dtype *weights); +#ifndef HAVE_QUADMATH_H +#define CINTqrys_schmidt CINTlrys_schmidt +#define CINTqrys_laguerre CINTlrys_laguerre +#define CINTqrys_jacobi CINTlrys_jacobi +#endif + +int _CINT_polynomial_roots(dtype *roots, dtype *cs, int nroots){return 0;} + +static int segment_solve(int n, dtype x, dtype lower, dtype *u, dtype *w, + dtype breakpoint, QuadratureFunction fn1, QuadratureFunction fn2) +{ + int error; + if (x <= breakpoint) { + error = fn1(n, x, lower, u, w); + } else { + error = fn2(n, x, lower, u, w); + } + if (error) { + error = CINTqrys_schmidt(n, x, lower, u, w); + } + return error; +} + +void CINTrys_roots(int nroots, dtype x, dtype *u, dtype *w) +{ + if (x <= SMALLX_LIMIT) { + int off = nroots * (nroots - 1) / 2; + int i; + for (i = 0; i < nroots; i++) { + u[i] = POLY_SMALLX_R0[off+i] + POLY_SMALLX_R1[off+i] * x; + w[i] = POLY_SMALLX_W0[off+i] + POLY_SMALLX_W1[off+i] * x; + } + return; + } else if (x >= 35+nroots*5) { + int off = nroots * (nroots - 1) / 2; + int i; + dtype rt; + dtype t = sqrt(PIE4/x); + for (i = 0; i < nroots; i++) { + rt = POLY_LARGEX_RT[off+i]; + u[i] = rt / (x - rt); + w[i] = POLY_LARGEX_WW[off+i] * t; + } + return; + } + + int err; + switch (nroots) { + case 1: + err = rys_root1(x, u, w); + break; + case 2: + err = rys_root2(x, u, w); + break; + case 3: + err = rys_root3(x, u, w); + break; + /*case 4: + err = rys_root4(x, u, w); + break; + case 5: + err = rys_root5(x, u, w); + break; + case 6: case 7: + err = segment_solve(nroots, x, 0., u, w, 11, CINTrys_jacobi, CINTrys_schmidt); + break; + case 8: + err = segment_solve(nroots, x, 0., u, w, 11, CINTrys_jacobi, CINTlrys_schmidt); + break; + case 9: + err = segment_solve(nroots, x, 0., u, w, 10, CINTlrys_jacobi, CINTlrys_laguerre); + break; + case 10: case 11: + err = segment_solve(nroots, x, 0., u, w, 18, CINTlrys_jacobi, CINTlrys_laguerre); + break; + case 12: + err = segment_solve(nroots, x, 0., u, w, 22, CINTlrys_jacobi, CINTlrys_laguerre); + break; + default: + err = segment_solve(nroots, x, 0., u, w, 50, CINTqrys_jacobi, CINTqrys_laguerre); + */} + if (err) { + //fprintf(stderr, "rys_roots fails: nroots=%d x=%g\n", + // nroots, x); +#ifndef KEEP_GOING + exit(err); +#endif + } +} + + +static int segment_solve1(int n, dtype x, dtype lower, dtype *u, dtype *w, + dtype lower_bp1, dtype lower_bp2, dtype breakpoint, + QuadratureFunction fn1, QuadratureFunction fn2, QuadratureFunction fn3) +{ + int error; + if (lower < lower_bp1) { + if (x <= breakpoint) { + error = fn1(n, x, lower, u, w); + } else { + error = fn2(n, x, lower, u, w); + } + } else if (lower < lower_bp2) { + error = fn3(n, x, lower, u, w); + } else { + return 1; + } + if (error) { + error = CINTqrys_schmidt(n, x, lower, u, w); + } + return error; +} + +void CINTsr_rys_roots(int nroots, dtype x, dtype lower, dtype *u, dtype *w) +{ + int err = 1; + switch (nroots) { + case 1: + err = CINTrys_schmidt(nroots, x, lower, u, w); + break; + case 2: + if (lower < 0.99) { + err = CINTrys_schmidt(nroots, x, lower, u, w); + } else { + err = CINTqrys_jacobi(nroots, x, lower, u, w); + } + break; + case 3: +#ifdef WITH_POLYNOMIAL_FIT + if (lower < 0.6) { + err = CINTsr_rys_polyfits(nroots, x, lower, u, w); + if (err == 0) { + break;; + } + } +#endif + if (lower < 0.93) { + err = CINTrys_schmidt(nroots, x, lower, u, w); + } else if (lower < 0.97) { + err = segment_solve(nroots, x, lower, u, w, 10, CINTlrys_jacobi, CINTlrys_laguerre); + } else { + err = CINTqrys_jacobi(nroots, x, lower, u, w); + } + break; + case 4: +#ifdef WITH_POLYNOMIAL_FIT + if (lower < 0.6) { + err = CINTsr_rys_polyfits(nroots, x, lower, u, w); + if (err == 0) { + break;; + } + } +#endif + if (lower < 0.8) { + err = CINTrys_schmidt(nroots, x, lower, u, w); + } else if (lower < 0.9) { + err = segment_solve(nroots, x, lower, u, w, 10, CINTlrys_jacobi, CINTlrys_laguerre); + } else { + err = CINTqrys_jacobi(nroots, x, lower, u, w); + } + break; + case 5: +#ifdef WITH_POLYNOMIAL_FIT + if (lower < 0.6) { + err = CINTsr_rys_polyfits(nroots, x, lower, u, w); + if (err == 0) { + break;; + } + } +#endif + if (lower < 0.4) { + err = segment_solve(nroots, x, lower, u, w, 50, CINTrys_schmidt, CINTlrys_laguerre); + } else if (lower < 0.8) { + err = segment_solve(nroots, x, lower, u, w, 10, CINTlrys_jacobi, CINTlrys_laguerre); + } else { + err = CINTqrys_jacobi(nroots, x, lower, u, w); + } + break; + case 6: + if (lower < 0.25) { + err = segment_solve(nroots, x, lower, u, w, 60, CINTrys_schmidt, CINTlrys_laguerre); + } else if (lower < 0.8) { + err = segment_solve(nroots, x, lower, u, w, 10, CINTlrys_jacobi, CINTlrys_laguerre); + } else { + err = CINTqrys_jacobi(nroots, x, lower, u, w); + } + break; + case 7: + err = segment_solve1(nroots, x, lower, u, w, 0.5, 1., 60, CINTlrys_jacobi, CINTlrys_laguerre, CINTqrys_jacobi); + break; + case 8: case 9: case 10: + + err = segment_solve1(nroots, x, lower, u, w, 0.15, 1., 60, CINTqrys_jacobi, CINTqrys_laguerre, CINTqrys_jacobi); + break; + case 11: case 12: + err = segment_solve1(nroots, x, lower, u, w, 0.15, 1., 60, CINTqrys_jacobi, CINTqrys_laguerre, CINTqrys_jacobi); + break; + case 13: case 14: + err = segment_solve1(nroots, x, lower, u, w, 0.25, 1., 60, CINTqrys_jacobi, CINTqrys_laguerre, CINTqrys_jacobi); + break; + case 15: case 16: + err = segment_solve1(nroots, x, lower, u, w, 0.25, 0.75, 60, CINTqrys_jacobi, CINTqrys_laguerre, CINTqrys_jacobi); + break; + case 17: + segment_solve1(nroots, x, lower, u, w, 0.25, 0.65, 60, CINTqrys_jacobi, CINTqrys_laguerre, CINTqrys_jacobi); + break; + case 18: + segment_solve1(nroots, x, lower, u, w, 0.15, 0.65, 60, CINTqrys_jacobi, CINTqrys_laguerre, CINTqrys_jacobi); + break; + case 19: + err = segment_solve1(nroots, x, lower, u, w, 0.15, 0.55, 60, CINTqrys_jacobi, CINTqrys_laguerre, CINTqrys_jacobi); + break; + case 20: case 21: + err = segment_solve1(nroots, x, lower, u, w, 0.25, 0.45, 60, CINTqrys_jacobi, CINTqrys_laguerre, CINTqrys_jacobi); + break; + case 22: case 23: case 24: + err = segment_solve1(nroots, x, lower, u, w, 0.25, 0.35, 60, CINTqrys_jacobi, CINTqrys_laguerre, CINTqrys_jacobi); + break; + default: + //fprintf(stderr, "libcint SR-rys_roots does not support nroots=%d\n", nroots); +#ifndef KEEP_GOING + exit(1); +#endif + } + if (err) { + //fprintf(stderr, "sr_rys_roots fails: nroots=%d x=%.15g lower=%.15g\n", + // nroots, x, lower); +#ifndef KEEP_GOING + exit(err); +#endif + } +} + +static int rys_root1(dtype X, dtype *roots, dtype *weights) +{ + dtype Y, F1; + + if (X > 33.) { + weights[0] = sqrt(PIE4/X); + roots[0] = 0.5E+00/(X-0.5E+00); + return 0; + } else if (X < 3.e-7) { + weights[0] = 1.0E+00 -X/3.0E+00; + roots[0] = 0.5E+00 -X/5.0E+00; + return 0; + } + + dtype E = exp(-X); + if (X > 15.) { + Y = 1./X; + F1 = ((( 1.9623264149430E-01*Y-4.9695241464490E-01)*Y - + 6.0156581186481E-05)* E + sqrt(PIE4/X) - E)*Y; + F1 *= .5; + } else if (X > 10.) { + Y = 1./X; + F1 = ((((-1.8784686463512E-01*Y+2.2991849164985E-01)*Y - + 4.9893752514047E-01)*Y-2.1916512131607E-05)* E + + sqrt(PIE4/X) - E)*Y; + F1 *= .5; + } else if (X > 5.) { + Y = 1./X; + F1 = ((((((( 4.6897511375022E-01*Y-6.9955602298985E-01)*Y + + 5.3689283271887E-01)*Y-3.2883030418398E-01)*Y + + 2.4645596956002E-01)*Y-4.9984072848436E-01)*Y - + 3.1501078774085E-06)* E + sqrt(PIE4/X) - E)*Y; + F1 *= .5; + } else if (X > 3.){ + Y = X-4.0E+00; + F1 = ((((((((((-2.62453564772299E-11*Y+3.24031041623823E-10 )*Y- + 3.614965656163E-09)*Y+3.760256799971E-08)*Y- + 3.553558319675E-07)*Y+3.022556449731E-06)*Y- + 2.290098979647E-05)*Y+1.526537461148E-04)*Y- + 8.81947375894379E-04 )*Y+4.33207949514611E-03 )*Y- + 1.75257821619926E-02 )*Y+5.28406320615584E-02; + } else if (X > 1.) { + Y = X-2.0E+00; + F1 = ((((((((((-1.61702782425558E-10*Y+1.96215250865776E-09 )*Y- + 2.14234468198419E-08 )*Y+2.17216556336318E-07 )*Y- + 1.98850171329371E-06 )*Y+1.62429321438911E-05 )*Y- + 1.16740298039895E-04 )*Y+7.24888732052332E-04 )*Y- + 3.79490003707156E-03 )*Y+1.61723488664661E-02 )*Y- + 5.29428148329736E-02 )*Y+1.15702180856167E-01; + } else { + F1 = ((((((((-8.36313918003957E-08*X+1.21222603512827E-06 )*X- + 1.15662609053481E-05 )*X+9.25197374512647E-05 )*X- + 6.40994113129432E-04 )*X+3.78787044215009E-03 )*X- + 1.85185172458485E-02 )*X+7.14285713298222E-02 )*X- + 1.99999999997023E-01 )*X+3.33333333333318E-01; + } + + dtype WW1 = 2. * X * F1 + E; + weights[0] = WW1; + roots[0] = F1 / (WW1 - F1); + return 0; +} + +static int rys_root2(dtype X, dtype *roots, dtype *weights) +{ + + dtype R12, R22, W22; + dtype RT1, RT2, WW1, WW2; + dtype F1, E, Y; + + R12 = 2.75255128608411E-01; + R22 = 2.72474487139158E+00; + W22 = 9.17517095361369E-02; + + if (X < 3.e-7){ + RT1 = 1.30693606237085E-01 -2.90430236082028E-02 *X; + RT2 = 2.86930639376291E+00 -6.37623643058102E-01 *X; + WW1 = 6.52145154862545E-01 -1.22713621927067E-01 *X; + WW2 = 3.47854845137453E-01 -2.10619711404725E-01 *X; + } else if (X < 1.) { + F1 = ((((((((-8.36313918003957E-08*X+1.21222603512827E-06 )*X- + 1.15662609053481E-05 )*X+9.25197374512647E-05 )*X- + 6.40994113129432E-04 )*X+3.78787044215009E-03 )*X- + 1.85185172458485E-02 )*X+7.14285713298222E-02 )*X- + 1.99999999997023E-01 )*X+3.33333333333318E-01; + WW1 = (X+X)*F1+exp(-X); + RT1 = (((((((-2.35234358048491E-09*X+2.49173650389842E-08)*X- + 4.558315364581E-08)*X-2.447252174587E-06)*X+ + 4.743292959463E-05)*X-5.33184749432408E-04 )*X+ + 4.44654947116579E-03 )*X-2.90430236084697E-02 )*X+ + 1.30693606237085E-01; + RT2 = (((((((-2.47404902329170E-08*X+2.36809910635906E-07)*X+ + 1.835367736310E-06)*X-2.066168802076E-05)*X- + 1.345693393936E-04)*X-5.88154362858038E-05 )*X+ + 5.32735082098139E-02 )*X-6.37623643056745E-01 )*X+ + 2.86930639376289E+00; + WW2 = ((F1-WW1)*RT1+F1)*(1.0E+00+RT2)/(RT2-RT1); + WW1 = WW1-WW2; + } else if (X < 3.) { + Y = X-2.0E+00; + F1 = ((((((((((-1.61702782425558E-10*Y+1.96215250865776E-09 )*Y- + 2.14234468198419E-08 )*Y+2.17216556336318E-07 )*Y- + 1.98850171329371E-06 )*Y+1.62429321438911E-05 )*Y- + 1.16740298039895E-04 )*Y+7.24888732052332E-04 )*Y- + 3.79490003707156E-03 )*Y+1.61723488664661E-02 )*Y- + 5.29428148329736E-02 )*Y+1.15702180856167E-01; + WW1 = (X+X)*F1+exp(-X); + RT1 = (((((((((-6.36859636616415E-12*Y+8.47417064776270E-11)*Y- + 5.152207846962E-10)*Y-3.846389873308E-10)*Y+ + 8.472253388380E-08)*Y-1.85306035634293E-06 )*Y+ + 2.47191693238413E-05 )*Y-2.49018321709815E-04 )*Y+ + 2.19173220020161E-03 )*Y-1.63329339286794E-02 )*Y+ + 8.68085688285261E-02; + RT2 = ((((((((( 1.45331350488343E-10*Y+2.07111465297976E-09)*Y- + 1.878920917404E-08)*Y-1.725838516261E-07)*Y+ + 2.247389642339E-06)*Y+9.76783813082564E-06 )*Y- + 1.93160765581969E-04 )*Y-1.58064140671893E-03 )*Y+ + 4.85928174507904E-02 )*Y-4.30761584997596E-01 )*Y+ + 1.80400974537950E+00; + WW2 = ((F1-WW1)*RT1+F1)*(1.0E+00+RT2)/(RT2-RT1); + WW1 = WW1-WW2; + } else if (X < 5.){ + Y = X-4.0E+00; + F1 = ((((((((((-2.62453564772299E-11*Y+3.24031041623823E-10 )*Y- + 3.614965656163E-09)*Y+3.760256799971E-08)*Y- + 3.553558319675E-07)*Y+3.022556449731E-06)*Y- + 2.290098979647E-05)*Y+1.526537461148E-04)*Y- + 8.81947375894379E-04 )*Y+4.33207949514611E-03 )*Y- + 1.75257821619926E-02 )*Y+5.28406320615584E-02; + WW1 = (X+X)*F1+exp(-X); + RT1 = ((((((((-4.11560117487296E-12*Y+7.10910223886747E-11)*Y- + 1.73508862390291E-09 )*Y+5.93066856324744E-08 )*Y- + 9.76085576741771E-07 )*Y+1.08484384385679E-05 )*Y- + 1.12608004981982E-04 )*Y+1.16210907653515E-03 )*Y- + 9.89572595720351E-03 )*Y+6.12589701086408E-02; + RT2 = (((((((((-1.80555625241001E-10*Y+5.44072475994123E-10)*Y+ + 1.603498045240E-08)*Y-1.497986283037E-07)*Y- + 7.017002532106E-07)*Y+1.85882653064034E-05 )*Y- + 2.04685420150802E-05 )*Y-2.49327728643089E-03 )*Y+ + 3.56550690684281E-02 )*Y-2.60417417692375E-01 )*Y+ + 1.12155283108289E+00; + WW2 = ((F1-WW1)*RT1+F1)*(1.0E+00+RT2)/(RT2-RT1); + WW1 = WW1-WW2; + } else if (X < 10) { + E = exp(-X); + WW1 = (((((( 4.6897511375022E-01/X-6.9955602298985E-01)/X + + 5.3689283271887E-01)/X-3.2883030418398E-01)/X + + 2.4645596956002E-01)/X-4.9984072848436E-01)/X - + 3.1501078774085E-06)*E + sqrt(PIE4/X); + F1 = (WW1-E)/(X+X); + Y = X-7.5E+00; + RT1 = (((((((((((((-1.43632730148572E-16*Y+2.38198922570405E-16)* + Y+1.358319618800E-14)*Y-7.064522786879E-14)*Y- + 7.719300212748E-13)*Y+7.802544789997E-12)*Y+ + 6.628721099436E-11)*Y-1.775564159743E-09)*Y+ + 1.713828823990E-08)*Y-1.497500187053E-07)*Y+ + 2.283485114279E-06)*Y-3.76953869614706E-05 )*Y+ + 4.74791204651451E-04 )*Y-4.60448960876139E-03 )*Y+ + 3.72458587837249E-02; + RT2 = (((((((((((( 2.48791622798900E-14*Y-1.36113510175724E-13)*Y- + 2.224334349799E-12)*Y+4.190559455515E-11)*Y- + 2.222722579924E-10)*Y-2.624183464275E-09)*Y+ + 6.128153450169E-08)*Y-4.383376014528E-07)*Y- + 2.49952200232910E-06 )*Y+1.03236647888320E-04 )*Y- + 1.44614664924989E-03 )*Y+1.35094294917224E-02 )*Y- + 9.53478510453887E-02 )*Y+5.44765245686790E-01; + WW2 = ((F1-WW1)*RT1+F1)*(1.0E+00+RT2)/(RT2-RT1); + WW1 = WW1-WW2; + } else if (X < 15) { + E = exp(-X); + WW1 = (((-1.8784686463512E-01/X+2.2991849164985E-01)/X - + 4.9893752514047E-01)/X-2.1916512131607E-05)*E + + sqrt(PIE4/X); + F1 = (WW1-E)/(X+X); + RT1 = ((((-1.01041157064226E-05*X+1.19483054115173E-03)*X - + 6.73760231824074E-02)*X+1.25705571069895E+00)*X + + (((-8.57609422987199E+03/X+5.91005939591842E+03)/X - + 1.70807677109425E+03)/X+2.64536689959503E+02)/X - + 2.38570496490846E+01)*E + R12/(X-R12); + RT2 = ((( 3.39024225137123E-04*X-9.34976436343509E-02)*X - + 4.22216483306320E+00)*X + + (((-2.08457050986847E+03/X - + 1.04999071905664E+03)/X+3.39891508992661E+02)/X - + 1.56184800325063E+02)/X+8.00839033297501E+00)*E + R22/(X-R22); + WW2 = ((F1-WW1)*RT1+F1)*(1.0E+00+RT2)/(RT2-RT1); + WW1 = WW1-WW2; + } else if (X < 33) { + E = exp(-X); + WW1 = (( 1.9623264149430E-01/X-4.9695241464490E-01)/X - + 6.0156581186481E-05)*E + sqrt(PIE4/X); + F1 = (WW1-E)/(X+X); + RT1 = ((((-1.14906395546354E-06*X+1.76003409708332E-04)*X - + 1.71984023644904E-02)*X-1.37292644149838E-01)*X + + (-4.75742064274859E+01/X+9.21005186542857E+00)/X - + 2.31080873898939E-02)*E + R12/(X-R12); + RT2 = ((( 3.64921633404158E-04*X-9.71850973831558E-02)*X - + 4.02886174850252E+00)*X + + (-1.35831002139173E+02/X - + 8.66891724287962E+01)/X+2.98011277766958E+00)*E + R22/(X-R22); + WW2 = ((F1-WW1)*RT1+F1)*(1.0E+00+RT2)/(RT2-RT1); + WW1 = WW1-WW2; + } else if (X < 40) { + WW1 = sqrt(PIE4/X); + E = exp(-X); + RT1 = (-8.78947307498880E-01*X+1.09243702330261E+01)*E + R12/(X-R12); + RT2 = (-9.28903924275977E+00*X+8.10642367843811E+01)*E + R22/(X-R22); + WW2 = ( 4.46857389308400E+00*X-7.79250653461045E+01)*E + W22*WW1; + WW1 = WW1-WW2; + } else { + WW1 = sqrt(PIE4/X); + RT1 = R12/(X-R12); + RT2 = R22/(X-R22); + WW2 = W22*WW1; + WW1 = WW1-WW2; + } + roots[0] = RT1; + roots[1] = RT2; + weights[0] = WW1; + weights[1] = WW2; + return 0; +} + +static int rys_root3(dtype X, dtype *roots, dtype *weights) +{ + + dtype R13, R23, W23, R33, W33; + dtype RT1, RT2, RT3, WW1, WW2, WW3; + dtype F1, F2, E, T1, T2, T3, A1, A2, Y; + + R13 = 1.90163509193487E-01; + R23 = 1.78449274854325E+00; + W23 = 1.77231492083829E-01; + R33 = 5.52534374226326E+00; + W33 = 5.11156880411248E-03; + + if (X < 3.e-7){ + RT1 = 6.03769246832797E-02 -9.28875764357368E-03 *X; + RT2 = 7.76823355931043E-01 -1.19511285527878E-01 *X; + RT3 = 6.66279971938567E+00 -1.02504611068957E+00 *X; + WW1 = 4.67913934572691E-01 -5.64876917232519E-02 *X; + WW2 = 3.60761573048137E-01 -1.49077186455208E-01 *X; + WW3 = 1.71324492379169E-01 -1.27768455150979E-01 *X; + } else if (X < 1.) { + RT1 = ((((((-5.10186691538870E-10*X+2.40134415703450E-08)*X- + 5.01081057744427E-07 )*X+7.58291285499256E-06 )*X- + 9.55085533670919E-05 )*X+1.02893039315878E-03 )*X- + 9.28875764374337E-03 )*X+6.03769246832810E-02; + RT2 = ((((((-1.29646524960555E-08*X+7.74602292865683E-08)*X+ + 1.56022811158727E-06 )*X-1.58051990661661E-05 )*X- + 3.30447806384059E-04 )*X+9.74266885190267E-03 )*X- + 1.19511285526388E-01 )*X+7.76823355931033E-01; + RT3 = ((((((-9.28536484109606E-09*X-3.02786290067014E-07)*X- + 2.50734477064200E-06 )*X-7.32728109752881E-06 )*X+ + 2.44217481700129E-04 )*X+4.94758452357327E-02 )*X- + 1.02504611065774E+00 )*X+6.66279971938553E+00; + F2 = ((((((((-7.60911486098850E-08*X+1.09552870123182E-06 )*X- + 1.03463270693454E-05 )*X+8.16324851790106E-05 )*X- + 5.55526624875562E-04 )*X+3.20512054753924E-03 )*X- + 1.51515139838540E-02 )*X+5.55555554649585E-02 )*X- + 1.42857142854412E-01 )*X+1.99999999999986E-01; + E = exp(-X); + F1 = ((X+X)*F2+E)/3.0E+00; + WW1 = (X+X)*F1+E; + T1 = RT1/(RT1+1.0E+00); + T2 = RT2/(RT2+1.0E+00); + T3 = RT3/(RT3+1.0E+00); + A2 = F2-T1*F1; + A1 = F1-T1*WW1; + WW3 = (A2-T2*A1)/((T3-T2)*(T3-T1)); + WW2 = (T3*A1-A2)/((T3-T2)*(T2-T1)); + WW1 = WW1-WW2-WW3; + } else if (X < 3.) { + Y = X-2.0E+00; + RT1 = (((((((( 1.44687969563318E-12*Y+4.85300143926755E-12)*Y- + 6.55098264095516E-10 )*Y+1.56592951656828E-08 )*Y- + 2.60122498274734E-07 )*Y+3.86118485517386E-06 )*Y- + 5.13430986707889E-05 )*Y+6.03194524398109E-04 )*Y- + 6.11219349825090E-03 )*Y+4.52578254679079E-02; + RT2 = ((((((( 6.95964248788138E-10*Y-5.35281831445517E-09)*Y- + 6.745205954533E-08)*Y+1.502366784525E-06)*Y+ + 9.923326947376E-07)*Y-3.89147469249594E-04 )*Y+ + 7.51549330892401E-03 )*Y-8.48778120363400E-02 )*Y+ + 5.73928229597613E-01; + RT3 = ((((((((-2.81496588401439E-10*Y+3.61058041895031E-09)*Y+ + 4.53631789436255E-08 )*Y-1.40971837780847E-07 )*Y- + 6.05865557561067E-06 )*Y-5.15964042227127E-05 )*Y+ + 3.34761560498171E-05 )*Y+5.04871005319119E-02 )*Y- + 8.24708946991557E-01 )*Y+4.81234667357205E+00; + F2 = ((((((((((-1.48044231072140E-10*Y+1.78157031325097E-09 )*Y- + 1.92514145088973E-08 )*Y+1.92804632038796E-07 )*Y- + 1.73806555021045E-06 )*Y+1.39195169625425E-05 )*Y- + 9.74574633246452E-05 )*Y+5.83701488646511E-04 )*Y- + 2.89955494844975E-03 )*Y+1.13847001113810E-02 )*Y- + 3.23446977320647E-02 )*Y+5.29428148329709E-02; + E = exp(-X); + F1 = ((X+X)*F2+E)/3.0E+00; + WW1 = (X+X)*F1+E; + T1 = RT1/(RT1+1.0E+00); + T2 = RT2/(RT2+1.0E+00); + T3 = RT3/(RT3+1.0E+00); + A2 = F2-T1*F1; + A1 = F1-T1*WW1; + WW3 = (A2-T2*A1)/((T3-T2)*(T3-T1)); + WW2 = (T3*A1-A2)/((T3-T2)*(T2-T1)); + WW1 = WW1-WW2-WW3; + } else if (X < 5.){ + Y = X-4.0E+00; + RT1 = ((((((( 1.44265709189601E-11*Y-4.66622033006074E-10)*Y+ + 7.649155832025E-09)*Y-1.229940017368E-07)*Y+ + 2.026002142457E-06)*Y-2.87048671521677E-05 )*Y+ + 3.70326938096287E-04 )*Y-4.21006346373634E-03 )*Y+ + 3.50898470729044E-02; + RT2 = ((((((((-2.65526039155651E-11*Y+1.97549041402552E-10)*Y+ + 2.15971131403034E-09 )*Y-7.95045680685193E-08 )*Y+ + 5.15021914287057E-07 )*Y+1.11788717230514E-05 )*Y- + 3.33739312603632E-04 )*Y+5.30601428208358E-03 )*Y- + 5.93483267268959E-02 )*Y+4.31180523260239E-01; + RT3 = ((((((((-3.92833750584041E-10*Y-4.16423229782280E-09)*Y+ + 4.42413039572867E-08 )*Y+6.40574545989551E-07 )*Y- + 3.05512456576552E-06 )*Y-1.05296443527943E-04 )*Y- + 6.14120969315617E-04 )*Y+4.89665802767005E-02 )*Y- + 6.24498381002855E-01 )*Y+3.36412312243724E+00; + F2 = ((((((((((-2.36788772599074E-11*Y+2.89147476459092E-10 )*Y- + 3.18111322308846E-09 )*Y+3.25336816562485E-08 )*Y- + 3.00873821471489E-07 )*Y+2.48749160874431E-06 )*Y- + 1.81353179793672E-05 )*Y+1.14504948737066E-04 )*Y- + 6.10614987696677E-04 )*Y+2.64584212770942E-03 )*Y- + 8.66415899015349E-03 )*Y+1.75257821619922E-02; + E = exp(-X); + F1 = ((X+X)*F2+E)/3.0E+00; + WW1 = (X+X)*F1+E; + T1 = RT1/(RT1+1.0E+00); + T2 = RT2/(RT2+1.0E+00); + T3 = RT3/(RT3+1.0E+00); + A2 = F2-T1*F1; + A1 = F1-T1*WW1; + WW3 = (A2-T2*A1)/((T3-T2)*(T3-T1)); + WW2 = (T3*A1-A2)/((T3-T2)*(T2-T1)); + WW1 = WW1-WW2-WW3; + } else if (X < 10) { + E = exp(-X); + WW1 = (((((( 4.6897511375022E-01/X-6.9955602298985E-01)/X + + 5.3689283271887E-01)/X-3.2883030418398E-01)/X + + 2.4645596956002E-01)/X-4.9984072848436E-01)/X - + 3.1501078774085E-06)*E + sqrt(PIE4/X); + F1 = (WW1-E)/(X+X); + F2 = (F1+F1+F1-E)/(X+X); + Y = X-7.5E+00; + RT1 = ((((((((((( 5.74429401360115E-16*Y+7.11884203790984E-16)*Y- + 6.736701449826E-14)*Y-6.264613873998E-13)*Y+ + 1.315418927040E-11)*Y-4.23879635610964E-11 )*Y+ + 1.39032379769474E-09 )*Y-4.65449552856856E-08 )*Y+ + 7.34609900170759E-07 )*Y-1.08656008854077E-05 )*Y+ + 1.77930381549953E-04 )*Y-2.39864911618015E-03 )*Y+ + 2.39112249488821E-02; + RT2 = ((((((((((( 1.13464096209120E-14*Y+6.99375313934242E-15)*Y- + 8.595618132088E-13)*Y-5.293620408757E-12)*Y- + 2.492175211635E-11)*Y+2.73681574882729E-09 )*Y- + 1.06656985608482E-08 )*Y-4.40252529648056E-07 )*Y+ + 9.68100917793911E-06 )*Y-1.68211091755327E-04 )*Y+ + 2.69443611274173E-03 )*Y-3.23845035189063E-02 )*Y+ + 2.75969447451882E-01; + RT3 = (((((((((((( 6.66339416996191E-15*Y+1.84955640200794E-13)*Y- + 1.985141104444E-12)*Y-2.309293727603E-11)*Y+ + 3.917984522103E-10)*Y+1.663165279876E-09)*Y- + 6.205591993923E-08)*Y+8.769581622041E-09)*Y+ + 8.97224398620038E-06 )*Y-3.14232666170796E-05 )*Y- + 1.83917335649633E-03 )*Y+3.51246831672571E-02 )*Y- + 3.22335051270860E-01 )*Y+1.73582831755430E+00; + T1 = RT1/(RT1+1.0E+00); + T2 = RT2/(RT2+1.0E+00); + T3 = RT3/(RT3+1.0E+00); + A2 = F2-T1*F1; + A1 = F1-T1*WW1; + WW3 = (A2-T2*A1)/((T3-T2)*(T3-T1)); + WW2 = (T3*A1-A2)/((T3-T2)*(T2-T1)); + WW1 = WW1-WW2-WW3; + } else if (X < 15) { + E = exp(-X); + WW1 = (((-1.8784686463512E-01/X+2.2991849164985E-01)/X - + 4.9893752514047E-01)/X-2.1916512131607E-05)*E + + sqrt(PIE4/X); + F1 = (WW1-E)/(X+X); + F2 = (F1+F1+F1-E)/(X+X); + Y = X-12.5E+00; + RT1 = ((((((((((( 4.42133001283090E-16*Y-2.77189767070441E-15)*Y- + 4.084026087887E-14)*Y+5.379885121517E-13)*Y+ + 1.882093066702E-12)*Y-8.67286219861085E-11 )*Y+ + 7.11372337079797E-10 )*Y-3.55578027040563E-09 )*Y+ + 1.29454702851936E-07 )*Y-4.14222202791434E-06 )*Y+ + 8.04427643593792E-05 )*Y-1.18587782909876E-03 )*Y+ + 1.53435577063174E-02; + RT2 = ((((((((((( 6.85146742119357E-15*Y-1.08257654410279E-14)*Y- + 8.579165965128E-13)*Y+6.642452485783E-12)*Y+ + 4.798806828724E-11)*Y-1.13413908163831E-09 )*Y+ + 7.08558457182751E-09 )*Y-5.59678576054633E-08 )*Y+ + 2.51020389884249E-06 )*Y-6.63678914608681E-05 )*Y+ + 1.11888323089714E-03 )*Y-1.45361636398178E-02 )*Y+ + 1.65077877454402E-01; + RT3 = (((((((((((( 3.20622388697743E-15*Y-2.73458804864628E-14)*Y- + 3.157134329361E-13)*Y+8.654129268056E-12)*Y- + 5.625235879301E-11)*Y-7.718080513708E-10)*Y+ + 2.064664199164E-08)*Y-1.567725007761E-07)*Y- + 1.57938204115055E-06 )*Y+6.27436306915967E-05 )*Y- + 1.01308723606946E-03 )*Y+1.13901881430697E-02 )*Y- + 1.01449652899450E-01 )*Y+7.77203937334739E-01; + T1 = RT1/(RT1+1.0E+00); + T2 = RT2/(RT2+1.0E+00); + T3 = RT3/(RT3+1.0E+00); + A2 = F2-T1*F1; + A1 = F1-T1*WW1; + WW3 = (A2-T2*A1)/((T3-T2)*(T3-T1)); + WW2 = (T3*A1-A2)/((T3-T2)*(T2-T1)); + WW1 = WW1-WW2-WW3; + } else if (X < 33) { + E = exp(-X); + WW1 = (( 1.9623264149430E-01/X-4.9695241464490E-01)/X - + 6.0156581186481E-05)*E + sqrt(PIE4/X); + F1 = (WW1-E)/(X+X); + F2 = (F1+F1+F1-E)/(X+X); + if (X < 20) { + RT1 = ((((((-2.43270989903742E-06*X+3.57901398988359E-04)*X - + 2.34112415981143E-02)*X+7.81425144913975E-01)*X - + 1.73209218219175E+01)*X+2.43517435690398E+02)*X + + (-1.97611541576986E+04/X+9.82441363463929E+03)/X - + 2.07970687843258E+03)*E + R13/(X-R13); + RT2 = (((((-2.62627010965435E-04*X+3.49187925428138E-02)*X - + 3.09337618731880E+00)*X+1.07037141010778E+02)*X - + 2.36659637247087E+03)*X + + ((-2.91669113681020E+06/X + + 1.41129505262758E+06)/X-2.91532335433779E+05)/X + + 3.35202872835409E+04)*E + R23/(X-R23); + RT3 = ((((( 9.31856404738601E-05*X-2.87029400759565E-02)*X - + 7.83503697918455E-01)*X-1.84338896480695E+01)*X + + 4.04996712650414E+02)*X + + (-1.89829509315154E+05/X + + 5.11498390849158E+04)/X-6.88145821789955E+03)*E + + R33/(X-R33); + } else { + RT1 = ((((-4.97561537069643E-04*X-5.00929599665316E-02)*X + + 1.31099142238996E+00)*X-1.88336409225481E+01)*X - + 6.60344754467191E+02 /X+1.64931462413877E+02)*E + + R13/(X-R13); + RT2 = ((((-4.48218898474906E-03*X-5.17373211334924E-01)*X + + 1.13691058739678E+01)*X-1.65426392885291E+02)*X - + 6.30909125686731E+03 /X+1.52231757709236E+03)*E + + R23/(X-R23); + RT3 = ((((-1.38368602394293E-02*X-1.77293428863008E+00)*X + + 1.73639054044562E+01)*X-3.57615122086961E+02)*X - + 1.45734701095912E+04 /X+2.69831813951849E+03)*E + + R33/(X-R33); + } + T1 = RT1/(RT1+1.0E+00); + T2 = RT2/(RT2+1.0E+00); + T3 = RT3/(RT3+1.0E+00); + A2 = F2-T1*F1; + A1 = F1-T1*WW1; + WW3 = (A2-T2*A1)/((T3-T2)*(T3-T1)); + WW2 = (T3*A1-A2)/((T3-T2)*(T2-T1)); + WW1 = WW1-WW2-WW3; + } else if (X < 47) { + WW1 = sqrt(PIE4/X); + E = exp(-X); + RT1 = ((-7.39058467995275E+00*X+3.21318352526305E+02)*X - + 3.99433696473658E+03)*E + R13/(X-R13); + RT2 = ((-7.38726243906513E+01*X+3.13569966333873E+03)*X - + 3.86862867311321E+04)*E + R23/(X-R23); + RT3 = ((-2.63750565461336E+02*X+1.04412168692352E+04)*X - + 1.28094577915394E+05)*E + R33/(X-R33); + WW3 = ((( 1.52258947224714E-01*X-8.30661900042651E+00)*X + + 1.92977367967984E+02)*X-1.67787926005344E+03)*E + + W33*WW1; + WW2 = (( 6.15072615497811E+01*X-2.91980647450269E+03)*X + + 3.80794303087338E+04)*E + W23*WW1; + WW1 = WW1-WW2-WW3; + } else { + WW1 = sqrt(PIE4/X); + RT1 = R13/(X-R13); + RT2 = R23/(X-R23); + RT3 = R33/(X-R33); + WW2 = W23*WW1; + WW3 = W33*WW1; + WW1 = WW1-WW2-WW3; + } + roots[0] = RT1; + roots[1] = RT2; + roots[2] = RT3; + weights[0] = WW1; + weights[1] = WW2; + weights[2] = WW3; + return 0; +} + +static int rys_root4(dtype X, dtype *roots, dtype *weights) +{ + dtype R14, R24, W24, R34, W34, R44, W44; + dtype RT1, RT2, RT3, RT4, WW1, WW2, WW3, WW4; + dtype Y, E; + + R14 = 1.45303521503316E-01; + R24 = 1.33909728812636E+00; + W24 = 2.34479815323517E-01; + R34 = 3.92696350135829E+00; + W34 = 1.92704402415764E-02; + R44 = 8.58863568901199E+00; + W44 = 2.25229076750736E-04; + + if (X <= 3.0E-7) { + RT1 = 3.48198973061471E-02 -4.09645850660395E-03 *X; + RT2 = 3.81567185080042E-01 -4.48902570656719E-02 *X; + RT3 = 1.73730726945891E+00 -2.04389090547327E-01 *X; + RT4 = 1.18463056481549E+01 -1.39368301742312E+00 *X; + WW1 = 3.62683783378362E-01 -3.13844305713928E-02 *X; + WW2 = 3.13706645877886E-01 -8.98046242557724E-02 *X; + WW3 = 2.22381034453372E-01 -1.29314370958973E-01 *X; + WW4 = 1.01228536290376E-01 -8.28299075414321E-02 *X; + } else if (X <= 1.0) { + RT1 = ((((((-1.95309614628539E-10*X+5.19765728707592E-09)*X- + 1.01756452250573E-07 )*X+1.72365935872131E-06 )*X- + 2.61203523522184E-05 )*X+3.52921308769880E-04 )*X- + 4.09645850658433E-03 )*X+3.48198973061469E-02; + RT2 = (((((-1.89554881382342E-08*X+3.07583114342365E-07)*X+ + 1.270981734393E-06)*X-1.417298563884E-04)*X+ + 3.226979163176E-03)*X-4.48902570678178E-02 )*X+ + 3.81567185080039E-01; + RT3 = (((((( 1.77280535300416E-09*X+3.36524958870615E-08)*X- + 2.58341529013893E-07 )*X-1.13644895662320E-05 )*X- + 7.91549618884063E-05 )*X+1.03825827346828E-02 )*X- + 2.04389090525137E-01 )*X+1.73730726945889E+00; + RT4 = (((((-5.61188882415248E-08*X-2.49480733072460E-07)*X+ + 3.428685057114E-06)*X+1.679007454539E-04)*X+ + 4.722855585715E-02)*X-1.39368301737828E+00 )*X+ + 1.18463056481543E+01; + WW1 = ((((((-1.14649303201279E-08*X+1.88015570196787E-07)*X- + 2.33305875372323E-06 )*X+2.68880044371597E-05 )*X- + 2.94268428977387E-04 )*X+3.06548909776613E-03 )*X- + 3.13844305680096E-02 )*X+3.62683783378335E-01; + WW2 = ((((((((-4.11720483772634E-09*X+6.54963481852134E-08)*X- + 7.20045285129626E-07 )*X+6.93779646721723E-06 )*X- + 6.05367572016373E-05 )*X+4.74241566251899E-04 )*X- + 3.26956188125316E-03 )*X+1.91883866626681E-02 )*X- + 8.98046242565811E-02 )*X+3.13706645877886E-01; + WW3 = ((((((((-3.41688436990215E-08*X+5.07238960340773E-07)*X- + 5.01675628408220E-06 )*X+4.20363420922845E-05 )*X- + 3.08040221166823E-04 )*X+1.94431864731239E-03 )*X- + 1.02477820460278E-02 )*X+4.28670143840073E-02 )*X- + 1.29314370962569E-01 )*X+2.22381034453369E-01; + WW4 = ((((((((( 4.99660550769508E-09*X-7.94585963310120E-08)*X+ + 8.359072409485E-07)*X-7.422369210610E-06)*X+ + 5.763374308160E-05)*X-3.86645606718233E-04 )*X+ + 2.18417516259781E-03 )*X-9.99791027771119E-03 )*X+ + 3.48791097377370E-02 )*X-8.28299075413889E-02 )*X+ + 1.01228536290376E-01; + } else if (X <= 5) { + Y = X-3.0E+00; + RT1 = (((((((((-1.48570633747284E-15*Y-1.33273068108777E-13)*Y+ + 4.068543696670E-12)*Y-9.163164161821E-11)*Y+ + 2.046819017845E-09)*Y-4.03076426299031E-08 )*Y+ + 7.29407420660149E-07 )*Y-1.23118059980833E-05 )*Y+ + 1.88796581246938E-04 )*Y-2.53262912046853E-03 )*Y+ + 2.51198234505021E-02; + RT2 = ((((((((( 1.35830583483312E-13*Y-2.29772605964836E-12)*Y- + 3.821500128045E-12)*Y+6.844424214735E-10)*Y- + 1.048063352259E-08)*Y+1.50083186233363E-08 )*Y+ + 3.48848942324454E-06 )*Y-1.08694174399193E-04 )*Y+ + 2.08048885251999E-03 )*Y-2.91205805373793E-02 )*Y+ + 2.72276489515713E-01; + RT3 = ((((((((( 5.02799392850289E-13*Y+1.07461812944084E-11)*Y- + 1.482277886411E-10)*Y-2.153585661215E-09)*Y+ + 3.654087802817E-08)*Y+5.15929575830120E-07 )*Y- + 9.52388379435709E-06 )*Y-2.16552440036426E-04 )*Y+ + 9.03551469568320E-03 )*Y-1.45505469175613E-01 )*Y+ + 1.21449092319186E+00; + RT4 = (((((((((-1.08510370291979E-12*Y+6.41492397277798E-11)*Y+ + 7.542387436125E-10)*Y-2.213111836647E-09)*Y- + 1.448228963549E-07)*Y-1.95670833237101E-06 )*Y- + 1.07481314670844E-05 )*Y+1.49335941252765E-04 )*Y+ + 4.87791531990593E-02 )*Y-1.10559909038653E+00 )*Y+ + 8.09502028611780E+00; + WW1 = ((((((((((-4.65801912689961E-14*Y+7.58669507106800E-13)*Y- + 1.186387548048E-11)*Y+1.862334710665E-10)*Y- + 2.799399389539E-09)*Y+4.148972684255E-08)*Y- + 5.933568079600E-07)*Y+8.168349266115E-06)*Y- + 1.08989176177409E-04 )*Y+1.41357961729531E-03 )*Y- + 1.87588361833659E-02 )*Y+2.89898651436026E-01; + WW2 = ((((((((((((-1.46345073267549E-14*Y+2.25644205432182E-13)*Y- + 3.116258693847E-12)*Y+4.321908756610E-11)*Y- + 5.673270062669E-10)*Y+7.006295962960E-09)*Y- + 8.120186517000E-08)*Y+8.775294645770E-07)*Y- + 8.77829235749024E-06 )*Y+8.04372147732379E-05 )*Y- + 6.64149238804153E-04 )*Y+4.81181506827225E-03 )*Y- + 2.88982669486183E-02 )*Y+1.56247249979288E-01; + WW3 = ((((((((((((( 9.06812118895365E-15*Y-1.40541322766087E-13)* + Y+1.919270015269E-12)*Y-2.605135739010E-11)*Y+ + 3.299685839012E-10)*Y-3.86354139348735E-09 )*Y+ + 4.16265847927498E-08 )*Y-4.09462835471470E-07 )*Y+ + 3.64018881086111E-06 )*Y-2.88665153269386E-05 )*Y+ + 2.00515819789028E-04 )*Y-1.18791896897934E-03 )*Y+ + 5.75223633388589E-03 )*Y-2.09400418772687E-02 )*Y+ + 4.85368861938873E-02; + WW4 = ((((((((((((((-9.74835552342257E-16*Y+1.57857099317175E-14)* + Y-2.249993780112E-13)*Y+3.173422008953E-12)*Y- + 4.161159459680E-11)*Y+5.021343560166E-10)*Y- + 5.545047534808E-09)*Y+5.554146993491E-08)*Y- + 4.99048696190133E-07 )*Y+3.96650392371311E-06 )*Y- + 2.73816413291214E-05 )*Y+1.60106988333186E-04 )*Y- + 7.64560567879592E-04 )*Y+2.81330044426892E-03 )*Y- + 7.16227030134947E-03 )*Y+9.66077262223353E-03; + } else if (X <= 10.0) { + Y = X-7.5E+00; + RT1 = ((((((((( 4.64217329776215E-15*Y-6.27892383644164E-15)*Y+ + 3.462236347446E-13)*Y-2.927229355350E-11)*Y+ + 5.090355371676E-10)*Y-9.97272656345253E-09 )*Y+ + 2.37835295639281E-07 )*Y-4.60301761310921E-06 )*Y+ + 8.42824204233222E-05 )*Y-1.37983082233081E-03 )*Y+ + 1.66630865869375E-02; + RT2 = ((((((((( 2.93981127919047E-14*Y+8.47635639065744E-13)*Y- + 1.446314544774E-11)*Y-6.149155555753E-12)*Y+ + 8.484275604612E-10)*Y-6.10898827887652E-08 )*Y+ + 2.39156093611106E-06 )*Y-5.35837089462592E-05 )*Y+ + 1.00967602595557E-03 )*Y-1.57769317127372E-02 )*Y+ + 1.74853819464285E-01; + RT3 = (((((((((( 2.93523563363000E-14*Y-6.40041776667020E-14)*Y- + 2.695740446312E-12)*Y+1.027082960169E-10)*Y- + 5.822038656780E-10)*Y-3.159991002539E-08)*Y+ + 4.327249251331E-07)*Y+4.856768455119E-06)*Y- + 2.54617989427762E-04 )*Y+5.54843378106589E-03 )*Y- + 7.95013029486684E-02 )*Y+7.20206142703162E-01; + RT4 = (((((((((((-1.62212382394553E-14*Y+7.68943641360593E-13)*Y+ + 5.764015756615E-12)*Y-1.380635298784E-10)*Y- + 1.476849808675E-09)*Y+1.84347052385605E-08 )*Y+ + 3.34382940759405E-07 )*Y-1.39428366421645E-06 )*Y- + 7.50249313713996E-05 )*Y-6.26495899187507E-04 )*Y+ + 4.69716410901162E-02 )*Y-6.66871297428209E-01 )*Y+ + 4.11207530217806E+00; + WW1 = ((((((((((-1.65995045235997E-15*Y+6.91838935879598E-14)*Y- + 9.131223418888E-13)*Y+1.403341829454E-11)*Y- + 3.672235069444E-10)*Y+6.366962546990E-09)*Y- + 1.039220021671E-07)*Y+1.959098751715E-06)*Y- + 3.33474893152939E-05 )*Y+5.72164211151013E-04 )*Y- + 1.05583210553392E-02 )*Y+2.26696066029591E-01; + WW2 = ((((((((((((-3.57248951192047E-16*Y+6.25708409149331E-15)*Y- + 9.657033089714E-14)*Y+1.507864898748E-12)*Y- + 2.332522256110E-11)*Y+3.428545616603E-10)*Y- + 4.698730937661E-09)*Y+6.219977635130E-08)*Y- + 7.83008889613661E-07 )*Y+9.08621687041567E-06 )*Y- + 9.86368311253873E-05 )*Y+9.69632496710088E-04 )*Y- + 8.14594214284187E-03 )*Y+8.50218447733457E-02; + WW3 = ((((((((((((( 1.64742458534277E-16*Y-2.68512265928410E-15)* + Y+3.788890667676E-14)*Y-5.508918529823E-13)*Y+ + 7.555896810069E-12)*Y-9.69039768312637E-11 )*Y+ + 1.16034263529672E-09 )*Y-1.28771698573873E-08 )*Y+ + 1.31949431805798E-07 )*Y-1.23673915616005E-06 )*Y+ + 1.04189803544936E-05 )*Y-7.79566003744742E-05 )*Y+ + 5.03162624754434E-04 )*Y-2.55138844587555E-03 )*Y+ + 1.13250730954014E-02; + WW4 = ((((((((((((((-1.55714130075679E-17*Y+2.57193722698891E-16)* + Y-3.626606654097E-15)*Y+5.234734676175E-14)*Y- + 7.067105402134E-13)*Y+8.793512664890E-12)*Y- + 1.006088923498E-10)*Y+1.050565098393E-09)*Y- + 9.91517881772662E-09 )*Y+8.35835975882941E-08 )*Y- + 6.19785782240693E-07 )*Y+3.95841149373135E-06 )*Y- + 2.11366761402403E-05 )*Y+9.00474771229507E-05 )*Y- + 2.78777909813289E-04 )*Y+5.26543779837487E-04; + } else if (X <= 15) { + Y = X-12.5E+00; + RT1 = ((((((((((( 4.94869622744119E-17*Y+8.03568805739160E-16)*Y- + 5.599125915431E-15)*Y-1.378685560217E-13)*Y+ + 7.006511663249E-13)*Y+1.30391406991118E-11 )*Y+ + 8.06987313467541E-11 )*Y-5.20644072732933E-09 )*Y+ + 7.72794187755457E-08 )*Y-1.61512612564194E-06 )*Y+ + 4.15083811185831E-05 )*Y-7.87855975560199E-04 )*Y+ + 1.14189319050009E-02; + RT2 = ((((((((((( 4.89224285522336E-16*Y+1.06390248099712E-14)*Y- + 5.446260182933E-14)*Y-1.613630106295E-12)*Y+ + 3.910179118937E-12)*Y+1.90712434258806E-10 )*Y+ + 8.78470199094761E-10 )*Y-5.97332993206797E-08 )*Y+ + 9.25750831481589E-07 )*Y-2.02362185197088E-05 )*Y+ + 4.92341968336776E-04 )*Y-8.68438439874703E-03 )*Y+ + 1.15825965127958E-01; + RT3 = (((((((((( 6.12419396208408E-14*Y+1.12328861406073E-13)*Y- + 9.051094103059E-12)*Y-4.781797525341E-11)*Y+ + 1.660828868694E-09)*Y+4.499058798868E-10)*Y- + 2.519549641933E-07)*Y+4.977444040180E-06)*Y- + 1.25858350034589E-04 )*Y+2.70279176970044E-03 )*Y- + 3.99327850801083E-02 )*Y+4.33467200855434E-01; + RT4 = ((((((((((( 4.63414725924048E-14*Y-4.72757262693062E-14)*Y- + 1.001926833832E-11)*Y+6.074107718414E-11)*Y+ + 1.576976911942E-09)*Y-2.01186401974027E-08 )*Y- + 1.84530195217118E-07 )*Y+5.02333087806827E-06 )*Y+ + 9.66961790843006E-06 )*Y-1.58522208889528E-03 )*Y+ + 2.80539673938339E-02 )*Y-2.78953904330072E-01 )*Y+ + 1.82835655238235E+00; + WW4 = ((((((((((((( 2.90401781000996E-18*Y-4.63389683098251E-17)* + Y+6.274018198326E-16)*Y-8.936002188168E-15)*Y+ + 1.194719074934E-13)*Y-1.45501321259466E-12 )*Y+ + 1.64090830181013E-11 )*Y-1.71987745310181E-10 )*Y+ + 1.63738403295718E-09 )*Y-1.39237504892842E-08 )*Y+ + 1.06527318142151E-07 )*Y-7.27634957230524E-07 )*Y+ + 4.12159381310339E-06 )*Y-1.74648169719173E-05 )*Y+ + 8.50290130067818E-05; + WW3 = ((((((((((((-4.19569145459480E-17*Y+5.94344180261644E-16)*Y- + 1.148797566469E-14)*Y+1.881303962576E-13)*Y- + 2.413554618391E-12)*Y+3.372127423047E-11)*Y- + 4.933988617784E-10)*Y+6.116545396281E-09)*Y- + 6.69965691739299E-08 )*Y+7.52380085447161E-07 )*Y- + 8.08708393262321E-06 )*Y+6.88603417296672E-05 )*Y- + 4.67067112993427E-04 )*Y+5.42313365864597E-03; + WW2 = ((((((((((-6.22272689880615E-15*Y+1.04126809657554E-13)*Y- + 6.842418230913E-13)*Y+1.576841731919E-11)*Y- + 4.203948834175E-10)*Y+6.287255934781E-09)*Y- + 8.307159819228E-08)*Y+1.356478091922E-06)*Y- + 2.08065576105639E-05 )*Y+2.52396730332340E-04 )*Y- + 2.94484050194539E-03 )*Y+6.01396183129168E-02; + WW1 = (((-1.8784686463512E-01/X+2.2991849164985E-01)/X - + 4.9893752514047E-01)/X-2.1916512131607E-05)*exp(-X) + + sqrt(PIE4/X)-WW4-WW3-WW2; + } else if (X <= 20) { + WW1 = sqrt(PIE4/X); + Y = X-17.5E+00; + RT1 = ((((((((((( 4.36701759531398E-17*Y-1.12860600219889E-16)*Y- + 6.149849164164E-15)*Y+5.820231579541E-14)*Y+ + 4.396602872143E-13)*Y-1.24330365320172E-11 )*Y+ + 6.71083474044549E-11 )*Y+2.43865205376067E-10 )*Y+ + 1.67559587099969E-08 )*Y-9.32738632357572E-07 )*Y+ + 2.39030487004977E-05 )*Y-4.68648206591515E-04 )*Y+ + 8.34977776583956E-03; + RT2 = ((((((((((( 4.98913142288158E-16*Y-2.60732537093612E-16)*Y- + 7.775156445127E-14)*Y+5.766105220086E-13)*Y+ + 6.432696729600E-12)*Y-1.39571683725792E-10 )*Y+ + 5.95451479522191E-10 )*Y+2.42471442836205E-09 )*Y+ + 2.47485710143120E-07 )*Y-1.14710398652091E-05 )*Y+ + 2.71252453754519E-04 )*Y-4.96812745851408E-03 )*Y+ + 8.26020602026780E-02; + RT3 = ((((((((((( 1.91498302509009E-15*Y+1.48840394311115E-14)*Y- + 4.316925145767E-13)*Y+1.186495793471E-12)*Y+ + 4.615806713055E-11)*Y-5.54336148667141E-10 )*Y+ + 3.48789978951367E-10 )*Y-2.79188977451042E-09 )*Y+ + 2.09563208958551E-06 )*Y-6.76512715080324E-05 )*Y+ + 1.32129867629062E-03 )*Y-2.05062147771513E-02 )*Y+ + 2.88068671894324E-01; + RT4 = (((((((((((-5.43697691672942E-15*Y-1.12483395714468E-13)*Y+ + 2.826607936174E-12)*Y-1.266734493280E-11)*Y- + 4.258722866437E-10)*Y+9.45486578503261E-09 )*Y- + 5.86635622821309E-08 )*Y-1.28835028104639E-06 )*Y+ + 4.41413815691885E-05 )*Y-7.61738385590776E-04 )*Y+ + 9.66090902985550E-03 )*Y-1.01410568057649E-01 )*Y+ + 9.54714798156712E-01; + WW4 = ((((((((((((-7.56882223582704E-19*Y+7.53541779268175E-18)*Y- + 1.157318032236E-16)*Y+2.411195002314E-15)*Y- + 3.601794386996E-14)*Y+4.082150659615E-13)*Y- + 4.289542980767E-12)*Y+5.086829642731E-11)*Y- + 6.35435561050807E-10 )*Y+6.82309323251123E-09 )*Y- + 5.63374555753167E-08 )*Y+3.57005361100431E-07 )*Y- + 2.40050045173721E-06 )*Y+4.94171300536397E-05; + WW3 = (((((((((((-5.54451040921657E-17*Y+2.68748367250999E-16)*Y+ + 1.349020069254E-14)*Y-2.507452792892E-13)*Y+ + 1.944339743818E-12)*Y-1.29816917658823E-11 )*Y+ + 3.49977768819641E-10 )*Y-8.67270669346398E-09 )*Y+ + 1.31381116840118E-07 )*Y-1.36790720600822E-06 )*Y+ + 1.19210697673160E-05 )*Y-1.42181943986587E-04 )*Y+ + 4.12615396191829E-03; + WW2 = (((((((((((-1.86506057729700E-16*Y+1.16661114435809E-15)*Y+ + 2.563712856363E-14)*Y-4.498350984631E-13)*Y+ + 1.765194089338E-12)*Y+9.04483676345625E-12 )*Y+ + 4.98930345609785E-10 )*Y-2.11964170928181E-08 )*Y+ + 3.98295476005614E-07 )*Y-5.49390160829409E-06 )*Y+ + 7.74065155353262E-05 )*Y-1.48201933009105E-03 )*Y+ + 4.97836392625268E-02; + WW1 = (( 1.9623264149430E-01/X-4.9695241464490E-01)/X - + 6.0156581186481E-05)*exp(-X)+WW1-WW2-WW3-WW4; + } else if (X <= 35) { + WW1 = sqrt(PIE4/X); + E = exp(-X); + RT1 = ((((((-4.45711399441838E-05*X+1.27267770241379E-03)*X - + 2.36954961381262E-01)*X+1.54330657903756E+01)*X - + 5.22799159267808E+02)*X+1.05951216669313E+04)*X + + (-2.51177235556236E+06/X+8.72975373557709E+05)/X - + 1.29194382386499E+05)*E + R14/(X-R14); + RT2 = (((((-7.85617372254488E-02*X+6.35653573484868E+00)*X - + 3.38296938763990E+02)*X+1.25120495802096E+04)*X - + 3.16847570511637E+05)*X + + ((-1.02427466127427E+09/X + + 3.70104713293016E+08)/X-5.87119005093822E+07)/X + + 5.38614211391604E+06)*E + R24/(X-R24); + RT3 = (((((-2.37900485051067E-01*X+1.84122184400896E+01)*X - + 1.00200731304146E+03)*X+3.75151841595736E+04)*X - + 9.50626663390130E+05)*X + + ((-2.88139014651985E+09/X + + 1.06625915044526E+09)/X-1.72465289687396E+08)/X + + 1.60419390230055E+07)*E + R34/(X-R34); + RT4 = ((((((-6.00691586407385E-04*X-3.64479545338439E-01)*X + + 1.57496131755179E+01)*X-6.54944248734901E+02)*X + + 1.70830039597097E+04)*X-2.90517939780207E+05)*X + + (3.49059698304732E+07/X-1.64944522586065E+07)/X + + 2.96817940164703E+06)*E + R44/(X-R44); + if (X <= 25) + WW4 = ((((((( 2.33766206773151E-07*X- + 3.81542906607063E-05)*X +3.51416601267000E-03)*X- + 1.66538571864728E-01)*X +4.80006136831847E+00)*X- + 8.73165934223603E+01)*X +9.77683627474638E+02)*X + + 1.66000945117640E+04/X -6.14479071209961E+03)*E + W44*WW1; + else + WW4 = (((((( 5.74245945342286E-06*X- + 7.58735928102351E-05)*X +2.35072857922892E-04)*X- + 3.78812134013125E-03)*X +3.09871652785805E-01)*X- + 7.11108633061306E+00)*X +5.55297573149528E+01)*E + W44*WW1; + WW3 = (((((( 2.36392855180768E-04*X-9.16785337967013E-03)*X + + 4.62186525041313E-01)*X-1.96943786006540E+01)*X + + 4.99169195295559E+02)*X-6.21419845845090E+03)*X + + ((+5.21445053212414E+07/X-1.34113464389309E+07)/X + + 1.13673298305631E+06)/X-2.81501182042707E+03)*E + W34*WW1; + WW2 = (((((( 7.29841848989391E-04*X-3.53899555749875E-02)*X + + 2.07797425718513E+00)*X-1.00464709786287E+02)*X + + 3.15206108877819E+03)*X-6.27054715090012E+04)*X + + (+1.54721246264919E+07/X-5.26074391316381E+06)/X + + 7.67135400969617E+05)*E + W24*WW1; + WW1 = (( 1.9623264149430E-01/X-4.9695241464490E-01)/X - + 6.0156581186481E-05)*E + WW1-WW2-WW3-WW4; + } else if (X <= 53) { + WW1 = sqrt(PIE4/X); + E = exp(-X)*pow(X,4); + RT4 = ((-2.19135070169653E-03*X-1.19108256987623E-01)*X - + 7.50238795695573E-01)*E + R44/(X-R44); + RT3 = ((-9.65842534508637E-04*X-4.49822013469279E-02)*X + + 6.08784033347757E-01)*E + R34/(X-R34); + RT2 = ((-3.62569791162153E-04*X-9.09231717268466E-03)*X + + 1.84336760556262E-01)*E + R24/(X-R24); + RT1 = ((-4.07557525914600E-05*X-6.88846864931685E-04)*X + + 1.74725309199384E-02)*E + R14/(X-R14); + WW4 = (( 5.76631982000990E-06*X-7.89187283804890E-05)*X + + 3.28297971853126E-04)*E + W44*WW1; + WW3 = (( 2.08294969857230E-04*X-3.77489954837361E-03)*X + + 2.09857151617436E-02)*E + W34*WW1; + WW2 = (( 6.16374517326469E-04*X-1.26711744680092E-02)*X + + 8.14504890732155E-02)*E + W24*WW1; + WW1 = WW1-WW2-WW3-WW4; + } else { + WW1 = sqrt(PIE4/X); + RT1 = R14/(X-R14); + RT2 = R24/(X-R24); + RT3 = R34/(X-R34); + RT4 = R44/(X-R44); + WW4 = W44*WW1; + WW3 = W34*WW1; + WW2 = W24*WW1; + WW1 = WW1-WW2-WW3-WW4; + } + roots[0] = RT1; + roots[1] = RT2; + roots[2] = RT3; + roots[3] = RT4; + weights[0] = WW1; + weights[1] = WW2; + weights[2] = WW3; + weights[3] = WW4; + return 0; +} + +static int rys_root5(dtype X, dtype *roots, dtype *weights) +{ + dtype R15,R25,W25,R35,W35,R45,W45,R55,W55; + dtype RT1, RT2, RT3, RT4, RT5, WW1, WW2, WW3, WW4, WW5; + dtype Y, E, XXX; + + R15 = 1.17581320211778E-01; + R25 = 1.07456201243690E+00; + W25 = 2.70967405960535E-01; + R35 = 3.08593744371754E+00; + W35 = 3.82231610015404E-02; + R45 = 6.41472973366203E+00; + W45 = 1.51614186862443E-03; + R55 = 1.18071894899717E+01; + W55 = 8.62130526143657E-06; + + if (X < 3.e-7){ + RT1 = 2.26659266316985E-02 -2.15865967920897E-03 *X; + RT2 = 2.31271692140903E-01 -2.20258754389745E-02 *X; + RT3 = 8.57346024118836E-01 -8.16520023025515E-02 *X; + RT4 = 2.97353038120346E+00 -2.83193369647137E-01 *X; + RT5 = 1.84151859759051E+01 -1.75382723579439E+00 *X; + WW1 = 2.95524224714752E-01 -1.96867576909777E-02 *X; + WW2 = 2.69266719309995E-01 -5.61737590184721E-02 *X; + WW3 = 2.19086362515981E-01 -9.71152726793658E-02 *X; + WW4 = 1.49451349150580E-01 -1.02979262193565E-01 *X; + WW5 = 6.66713443086877E-02 -5.73782817488315E-02 *X; + } else if (X < 1.0){ + RT1 = ((((((-4.46679165328413E-11*X+1.21879111988031E-09)*X- + 2.62975022612104E-08 )*X+5.15106194905897E-07 )*X- + 9.27933625824749E-06 )*X+1.51794097682482E-04 )*X- + 2.15865967920301E-03 )*X+2.26659266316985E-02; + RT2 = (((((( 1.93117331714174E-10*X-4.57267589660699E-09)*X+ + 2.48339908218932E-08 )*X+1.50716729438474E-06 )*X- + 6.07268757707381E-05 )*X+1.37506939145643E-03 )*X- + 2.20258754419939E-02 )*X+2.31271692140905E-01; + RT3 = ((((( 4.84989776180094E-09*X+1.31538893944284E-07)*X- + 2.766753852879E-06)*X-7.651163510626E-05)*X+ + 4.033058545972E-03)*X-8.16520022916145E-02 )*X+ + 8.57346024118779E-01; + RT4 = ((((-2.48581772214623E-07*X-4.34482635782585E-06)*X- + 7.46018257987630E-07 )*X+1.01210776517279E-02 )*X- + 2.83193369640005E-01 )*X+2.97353038120345E+00; + RT5 = (((((-8.92432153868554E-09*X+1.77288899268988E-08)*X+ + 3.040754680666E-06)*X+1.058229325071E-04)*X+ + 4.596379534985E-02)*X-1.75382723579114E+00 )*X+ + 1.84151859759049E+01; + WW1 = ((((((-2.03822632771791E-09*X+3.89110229133810E-08)*X- + 5.84914787904823E-07 )*X+8.30316168666696E-06 )*X- + 1.13218402310546E-04 )*X+1.49128888586790E-03 )*X- + 1.96867576904816E-02 )*X+2.95524224714749E-01; + WW2 = ((((((( 8.62848118397570E-09*X-1.38975551148989E-07)*X+ + 1.602894068228E-06)*X-1.646364300836E-05)*X+ + 1.538445806778E-04)*X-1.28848868034502E-03 )*X+ + 9.38866933338584E-03 )*X-5.61737590178812E-02 )*X+ + 2.69266719309991E-01; + WW3 = ((((((((-9.41953204205665E-09*X+1.47452251067755E-07)*X- + 1.57456991199322E-06 )*X+1.45098401798393E-05 )*X- + 1.18858834181513E-04 )*X+8.53697675984210E-04 )*X- + 5.22877807397165E-03 )*X+2.60854524809786E-02 )*X- + 9.71152726809059E-02 )*X+2.19086362515979E-01; + WW4 = ((((((((-3.84961617022042E-08*X+5.66595396544470E-07)*X- + 5.52351805403748E-06 )*X+4.53160377546073E-05 )*X- + 3.22542784865557E-04 )*X+1.95682017370967E-03 )*X- + 9.77232537679229E-03 )*X+3.79455945268632E-02 )*X- + 1.02979262192227E-01 )*X+1.49451349150573E-01; + WW5 = ((((((((( 4.09594812521430E-09*X-6.47097874264417E-08)*X+ + 6.743541482689E-07)*X-5.917993920224E-06)*X+ + 4.531969237381E-05)*X-2.99102856679638E-04 )*X+ + 1.65695765202643E-03 )*X-7.40671222520653E-03 )*X+ + 2.50889946832192E-02 )*X-5.73782817487958E-02 )*X+ + 6.66713443086877E-02; + } else if (X < 5.0) { + Y = X-3.0E+00; + RT1 = ((((((((-2.58163897135138E-14*Y+8.14127461488273E-13)*Y- + 2.11414838976129E-11 )*Y+5.09822003260014E-10 )*Y- + 1.16002134438663E-08 )*Y+2.46810694414540E-07 )*Y- + 4.92556826124502E-06 )*Y+9.02580687971053E-05 )*Y- + 1.45190025120726E-03 )*Y+1.73416786387475E-02; + RT2 = ((((((((( 1.04525287289788E-14*Y+5.44611782010773E-14)*Y- + 4.831059411392E-12)*Y+1.136643908832E-10)*Y- + 1.104373076913E-09)*Y-2.35346740649916E-08 )*Y+ + 1.43772622028764E-06 )*Y-4.23405023015273E-05 )*Y+ + 9.12034574793379E-04 )*Y-1.52479441718739E-02 )*Y+ + 1.76055265928744E-01; + RT3 = (((((((((-6.89693150857911E-14*Y+5.92064260918861E-13)*Y+ + 1.847170956043E-11)*Y-3.390752744265E-10)*Y- + 2.995532064116E-09)*Y+1.57456141058535E-07 )*Y- + 3.95859409711346E-07 )*Y-9.58924580919747E-05 )*Y+ + 3.23551502557785E-03 )*Y-5.97587007636479E-02 )*Y+ + 6.46432853383057E-01; + RT4 = ((((((((-3.61293809667763E-12*Y-2.70803518291085E-11)*Y+ + 8.83758848468769E-10 )*Y+1.59166632851267E-08 )*Y- + 1.32581997983422E-07 )*Y-7.60223407443995E-06 )*Y- + 7.41019244900952E-05 )*Y+9.81432631743423E-03 )*Y- + 2.23055570487771E-01 )*Y+2.21460798080643E+00; + RT5 = ((((((((( 7.12332088345321E-13*Y+3.16578501501894E-12)*Y- + 8.776668218053E-11)*Y-2.342817613343E-09)*Y- + 3.496962018025E-08)*Y-3.03172870136802E-07 )*Y+ + 1.50511293969805E-06 )*Y+1.37704919387696E-04 )*Y+ + 4.70723869619745E-02 )*Y-1.47486623003693E+00 )*Y+ + 1.35704792175847E+01; + WW1 = ((((((((( 1.04348658616398E-13*Y-1.94147461891055E-12)*Y+ + 3.485512360993E-11)*Y-6.277497362235E-10)*Y+ + 1.100758247388E-08)*Y-1.88329804969573E-07 )*Y+ + 3.12338120839468E-06 )*Y-5.04404167403568E-05 )*Y+ + 8.00338056610995E-04 )*Y-1.30892406559521E-02 )*Y+ + 2.47383140241103E-01; + WW2 = ((((((((((( 3.23496149760478E-14*Y-5.24314473469311E-13)*Y+ + 7.743219385056E-12)*Y-1.146022750992E-10)*Y+ + 1.615238462197E-09)*Y-2.15479017572233E-08 )*Y+ + 2.70933462557631E-07 )*Y-3.18750295288531E-06 )*Y+ + 3.47425221210099E-05 )*Y-3.45558237388223E-04 )*Y+ + 3.05779768191621E-03 )*Y-2.29118251223003E-02 )*Y+ + 1.59834227924213E-01; + WW3 = ((((((((((((-3.42790561802876E-14*Y+5.26475736681542E-13)*Y- + 7.184330797139E-12)*Y+9.763932908544E-11)*Y- + 1.244014559219E-09)*Y+1.472744068942E-08)*Y- + 1.611749975234E-07)*Y+1.616487851917E-06)*Y- + 1.46852359124154E-05 )*Y+1.18900349101069E-04 )*Y- + 8.37562373221756E-04 )*Y+4.93752683045845E-03 )*Y- + 2.25514728915673E-02 )*Y+6.95211812453929E-02; + WW4 = ((((((((((((( 1.04072340345039E-14*Y-1.60808044529211E-13)* + Y+2.183534866798E-12)*Y-2.939403008391E-11)*Y+ + 3.679254029085E-10)*Y-4.23775673047899E-09 )*Y+ + 4.46559231067006E-08 )*Y-4.26488836563267E-07 )*Y+ + 3.64721335274973E-06 )*Y-2.74868382777722E-05 )*Y+ + 1.78586118867488E-04 )*Y-9.68428981886534E-04 )*Y+ + 4.16002324339929E-03 )*Y-1.28290192663141E-02 )*Y+ + 2.22353727685016E-02; + WW5 = ((((((((((((((-8.16770412525963E-16*Y+1.31376515047977E-14)* + Y-1.856950818865E-13)*Y+2.596836515749E-12)*Y- + 3.372639523006E-11)*Y+4.025371849467E-10)*Y- + 4.389453269417E-09)*Y+4.332753856271E-08)*Y- + 3.82673275931962E-07 )*Y+2.98006900751543E-06 )*Y- + 2.00718990300052E-05 )*Y+1.13876001386361E-04 )*Y- + 5.23627942443563E-04 )*Y+1.83524565118203E-03 )*Y- + 4.37785737450783E-03 )*Y+5.36963805223095E-03; + } else if (X < 10.0) { + Y = X-7.5E+00; + RT1 = ((((((((-1.13825201010775E-14*Y+1.89737681670375E-13)*Y- + 4.81561201185876E-12 )*Y+1.56666512163407E-10 )*Y- + 3.73782213255083E-09 )*Y+9.15858355075147E-08 )*Y- + 2.13775073585629E-06 )*Y+4.56547356365536E-05 )*Y- + 8.68003909323740E-04 )*Y+1.22703754069176E-02; + RT2 = (((((((((-3.67160504428358E-15*Y+1.27876280158297E-14)*Y- + 1.296476623788E-12)*Y+1.477175434354E-11)*Y+ + 5.464102147892E-10)*Y-2.42538340602723E-08 )*Y+ + 8.20460740637617E-07 )*Y-2.20379304598661E-05 )*Y+ + 4.90295372978785E-04 )*Y-9.14294111576119E-03 )*Y+ + 1.22590403403690E-01; + RT3 = ((((((((( 1.39017367502123E-14*Y-6.96391385426890E-13)*Y+ + 1.176946020731E-12)*Y+1.725627235645E-10)*Y- + 3.686383856300E-09)*Y+2.87495324207095E-08 )*Y+ + 1.71307311000282E-06 )*Y-7.94273603184629E-05 )*Y+ + 2.00938064965897E-03 )*Y-3.63329491677178E-02 )*Y+ + 4.34393683888443E-01; + RT4 = ((((((((((-1.27815158195209E-14*Y+1.99910415869821E-14)*Y+ + 3.753542914426E-12)*Y-2.708018219579E-11)*Y- + 1.190574776587E-09)*Y+1.106696436509E-08)*Y+ + 3.954955671326E-07)*Y-4.398596059588E-06)*Y- + 2.01087998907735E-04 )*Y+7.89092425542937E-03 )*Y- + 1.42056749162695E-01 )*Y+1.39964149420683E+00; + RT5 = ((((((((((-1.19442341030461E-13*Y-2.34074833275956E-12)*Y+ + 6.861649627426E-12)*Y+6.082671496226E-10)*Y+ + 5.381160105420E-09)*Y-6.253297138700E-08)*Y- + 2.135966835050E-06)*Y-2.373394341886E-05)*Y+ + 2.88711171412814E-06 )*Y+4.85221195290753E-02 )*Y- + 1.04346091985269E+00 )*Y+7.89901551676692E+00; + WW1 = ((((((((( 7.95526040108997E-15*Y-2.48593096128045E-13)*Y+ + 4.761246208720E-12)*Y-9.535763686605E-11)*Y+ + 2.225273630974E-09)*Y-4.49796778054865E-08 )*Y+ + 9.17812870287386E-07 )*Y-1.86764236490502E-05 )*Y+ + 3.76807779068053E-04 )*Y-8.10456360143408E-03 )*Y+ + 2.01097936411496E-01; + WW2 = ((((((((((( 1.25678686624734E-15*Y-2.34266248891173E-14)*Y+ + 3.973252415832E-13)*Y-6.830539401049E-12)*Y+ + 1.140771033372E-10)*Y-1.82546185762009E-09 )*Y+ + 2.77209637550134E-08 )*Y-4.01726946190383E-07 )*Y+ + 5.48227244014763E-06 )*Y-6.95676245982121E-05 )*Y+ + 8.05193921815776E-04 )*Y-8.15528438784469E-03 )*Y+ + 9.71769901268114E-02; + WW3 = ((((((((((((-8.20929494859896E-16*Y+1.37356038393016E-14)*Y- + 2.022863065220E-13)*Y+3.058055403795E-12)*Y- + 4.387890955243E-11)*Y+5.923946274445E-10)*Y- + 7.503659964159E-09)*Y+8.851599803902E-08)*Y- + 9.65561998415038E-07 )*Y+9.60884622778092E-06 )*Y- + 8.56551787594404E-05 )*Y+6.66057194311179E-04 )*Y- + 4.17753183902198E-03 )*Y+2.25443826852447E-02; + WW4 = ((((((((((((((-1.08764612488790E-17*Y+1.85299909689937E-16)* + Y-2.730195628655E-15)*Y+4.127368817265E-14)*Y- + 5.881379088074E-13)*Y+7.805245193391E-12)*Y- + 9.632707991704E-11)*Y+1.099047050624E-09)*Y- + 1.15042731790748E-08 )*Y+1.09415155268932E-07 )*Y- + 9.33687124875935E-07 )*Y+7.02338477986218E-06 )*Y- + 4.53759748787756E-05 )*Y+2.41722511389146E-04 )*Y- + 9.75935943447037E-04 )*Y+2.57520532789644E-03; + WW5 = ((((((((((((((( 7.28996979748849E-19*Y-1.26518146195173E-17) + *Y+1.886145834486E-16)*Y-2.876728287383E-15)*Y+ + 4.114588668138E-14)*Y-5.44436631413933E-13 )*Y+ + 6.64976446790959E-12 )*Y-7.44560069974940E-11 )*Y+ + 7.57553198166848E-10 )*Y-6.92956101109829E-09 )*Y+ + 5.62222859033624E-08 )*Y-3.97500114084351E-07 )*Y+ + 2.39039126138140E-06 )*Y-1.18023950002105E-05 )*Y+ + 4.52254031046244E-05 )*Y-1.21113782150370E-04 )*Y+ + 1.75013126731224E-04; + } else if (X < 15.0) { + Y = X-12.5E+00; + RT1 = ((((((((((-4.16387977337393E-17*Y+7.20872997373860E-16)*Y+ + 1.395993802064E-14)*Y+3.660484641252E-14)*Y- + 4.154857548139E-12)*Y+2.301379846544E-11)*Y- + 1.033307012866E-09)*Y+3.997777641049E-08)*Y- + 9.35118186333939E-07 )*Y+2.38589932752937E-05 )*Y- + 5.35185183652937E-04 )*Y+8.85218988709735E-03; + RT2 = ((((((((((-4.56279214732217E-16*Y+6.24941647247927E-15)*Y+ + 1.737896339191E-13)*Y+8.964205979517E-14)*Y- + 3.538906780633E-11)*Y+9.561341254948E-11)*Y- + 9.772831891310E-09)*Y+4.240340194620E-07)*Y- + 1.02384302866534E-05 )*Y+2.57987709704822E-04 )*Y- + 5.54735977651677E-03 )*Y+8.68245143991948E-02; + RT3 = ((((((((((-2.52879337929239E-15*Y+2.13925810087833E-14)*Y+ + 7.884307667104E-13)*Y-9.023398159510E-13)*Y- + 5.814101544957E-11)*Y-1.333480437968E-09)*Y- + 2.217064940373E-08)*Y+1.643290788086E-06)*Y- + 4.39602147345028E-05 )*Y+1.08648982748911E-03 )*Y- + 2.13014521653498E-02 )*Y+2.94150684465425E-01; + RT4 = ((((((((((-6.42391438038888E-15*Y+5.37848223438815E-15)*Y+ + 8.960828117859E-13)*Y+5.214153461337E-11)*Y- + 1.106601744067E-10)*Y-2.007890743962E-08)*Y+ + 1.543764346501E-07)*Y+4.520749076914E-06)*Y- + 1.88893338587047E-04 )*Y+4.73264487389288E-03 )*Y- + 7.91197893350253E-02 )*Y+8.60057928514554E-01; + RT5 = (((((((((((-2.24366166957225E-14*Y+4.87224967526081E-14)*Y+ + 5.587369053655E-12)*Y-3.045253104617E-12)*Y- + 1.223983883080E-09)*Y-2.05603889396319E-09 )*Y+ + 2.58604071603561E-07 )*Y+1.34240904266268E-06 )*Y- + 5.72877569731162E-05 )*Y-9.56275105032191E-04 )*Y+ + 4.23367010370921E-02 )*Y-5.76800927133412E-01 )*Y+ + 3.87328263873381E+00; + WW1 = ((((((((( 8.98007931950169E-15*Y+7.25673623859497E-14)*Y+ + 5.851494250405E-14)*Y-4.234204823846E-11)*Y+ + 3.911507312679E-10)*Y-9.65094802088511E-09 )*Y+ + 3.42197444235714E-07 )*Y-7.51821178144509E-06 )*Y+ + 1.94218051498662E-04 )*Y-5.38533819142287E-03 )*Y+ + 1.68122596736809E-01; + WW2 = ((((((((((-1.05490525395105E-15*Y+1.96855386549388E-14)*Y- + 5.500330153548E-13)*Y+1.003849567976E-11)*Y- + 1.720997242621E-10)*Y+3.533277061402E-09)*Y- + 6.389171736029E-08)*Y+1.046236652393E-06)*Y- + 1.73148206795827E-05 )*Y+2.57820531617185E-04 )*Y- + 3.46188265338350E-03 )*Y+7.03302497508176E-02; + WW3 = ((((((((((( 3.60020423754545E-16*Y-6.24245825017148E-15)*Y+ + 9.945311467434E-14)*Y-1.749051512721E-12)*Y+ + 2.768503957853E-11)*Y-4.08688551136506E-10 )*Y+ + 6.04189063303610E-09 )*Y-8.23540111024147E-08 )*Y+ + 1.01503783870262E-06 )*Y-1.20490761741576E-05 )*Y+ + 1.26928442448148E-04 )*Y-1.05539461930597E-03 )*Y+ + 1.15543698537013E-02; + WW4 = ((((((((((((( 2.51163533058925E-18*Y-4.31723745510697E-17)* + Y+6.557620865832E-16)*Y-1.016528519495E-14)*Y+ + 1.491302084832E-13)*Y-2.06638666222265E-12 )*Y+ + 2.67958697789258E-11 )*Y-3.23322654638336E-10 )*Y+ + 3.63722952167779E-09 )*Y-3.75484943783021E-08 )*Y+ + 3.49164261987184E-07 )*Y-2.92658670674908E-06 )*Y+ + 2.12937256719543E-05 )*Y-1.19434130620929E-04 )*Y+ + 6.45524336158384E-04; + WW5 = ((((((((((((((-1.29043630202811E-19*Y+2.16234952241296E-18)* + Y-3.107631557965E-17)*Y+4.570804313173E-16)*Y- + 6.301348858104E-15)*Y+8.031304476153E-14)*Y- + 9.446196472547E-13)*Y+1.018245804339E-11)*Y- + 9.96995451348129E-11 )*Y+8.77489010276305E-10 )*Y- + 6.84655877575364E-09 )*Y+4.64460857084983E-08 )*Y- + 2.66924538268397E-07 )*Y+1.24621276265907E-06 )*Y- + 4.30868944351523E-06 )*Y+9.94307982432868E-06; + } else if (X < 20.0){ + Y = X-17.5E+00; + RT1 = (((((((((( 1.91875764545740E-16*Y+7.8357401095707E-16)*Y- + 3.260875931644E-14)*Y-1.186752035569E-13)*Y+ + 4.275180095653E-12)*Y+3.357056136731E-11)*Y- + 1.123776903884E-09)*Y+1.231203269887E-08)*Y- + 3.99851421361031E-07 )*Y+1.45418822817771E-05 )*Y- + 3.49912254976317E-04 )*Y+6.67768703938812E-03; + RT2 = (((((((((( 2.02778478673555E-15*Y+1.01640716785099E-14)*Y- + 3.385363492036E-13)*Y-1.615655871159E-12)*Y+ + 4.527419140333E-11)*Y+3.853670706486E-10)*Y- + 1.184607130107E-08)*Y+1.347873288827E-07)*Y- + 4.47788241748377E-06 )*Y+1.54942754358273E-04 )*Y- + 3.55524254280266E-03 )*Y+6.44912219301603E-02; + RT3 = (((((((((( 7.79850771456444E-15*Y+6.00464406395001E-14)*Y- + 1.249779730869E-12)*Y-1.020720636353E-11)*Y+ + 1.814709816693E-10)*Y+1.766397336977E-09)*Y- + 4.603559449010E-08)*Y+5.863956443581E-07)*Y- + 2.03797212506691E-05 )*Y+6.31405161185185E-04 )*Y- + 1.30102750145071E-02 )*Y+2.10244289044705E-01; + RT4 = (((((((((((-2.92397030777912E-15*Y+1.94152129078465E-14)*Y+ + 4.859447665850E-13)*Y-3.217227223463E-12)*Y- + 7.484522135512E-11)*Y+7.19101516047753E-10 )*Y+ + 6.88409355245582E-09 )*Y-1.44374545515769E-07 )*Y+ + 2.74941013315834E-06 )*Y-1.02790452049013E-04 )*Y+ + 2.59924221372643E-03 )*Y-4.35712368303551E-02 )*Y+ + 5.62170709585029E-01; + RT5 = ((((((((((( 1.17976126840060E-14*Y+1.24156229350669E-13)*Y- + 3.892741622280E-12)*Y-7.755793199043E-12)*Y+ + 9.492190032313E-10)*Y-4.98680128123353E-09 )*Y- + 1.81502268782664E-07 )*Y+2.69463269394888E-06 )*Y+ + 2.50032154421640E-05 )*Y-1.33684303917681E-03 )*Y+ + 2.29121951862538E-02 )*Y-2.45653725061323E-01 )*Y+ + 1.89999883453047E+00; + WW1 = (((((((((( 1.74841995087592E-15*Y-6.95671892641256E-16)*Y- + 3.000659497257E-13)*Y+2.021279817961E-13)*Y+ + 3.853596935400E-11)*Y+1.461418533652E-10)*Y- + 1.014517563435E-08)*Y+1.132736008979E-07)*Y- + 2.86605475073259E-06 )*Y+1.21958354908768E-04 )*Y- + 3.86293751153466E-03 )*Y+1.45298342081522E-01; + WW2 = ((((((((((-1.11199320525573E-15*Y+1.85007587796671E-15)*Y+ + 1.220613939709E-13)*Y+1.275068098526E-12)*Y- + 5.341838883262E-11)*Y+6.161037256669E-10)*Y- + 1.009147879750E-08)*Y+2.907862965346E-07)*Y- + 6.12300038720919E-06 )*Y+1.00104454489518E-04 )*Y- + 1.80677298502757E-03 )*Y+5.78009914536630E-02; + WW3 = ((((((((((-9.49816486853687E-16*Y+6.67922080354234E-15)*Y+ + 2.606163540537E-15)*Y+1.983799950150E-12)*Y- + 5.400548574357E-11)*Y+6.638043374114E-10)*Y- + 8.799518866802E-09)*Y+1.791418482685E-07)*Y- + 2.96075397351101E-06 )*Y+3.38028206156144E-05 )*Y- + 3.58426847857878E-04 )*Y+8.39213709428516E-03; + WW4 = ((((((((((( 1.33829971060180E-17*Y-3.44841877844140E-16)*Y+ + 4.745009557656E-15)*Y-6.033814209875E-14)*Y+ + 1.049256040808E-12)*Y-1.70859789556117E-11 )*Y+ + 2.15219425727959E-10 )*Y-2.52746574206884E-09 )*Y+ + 3.27761714422960E-08 )*Y-3.90387662925193E-07 )*Y+ + 3.46340204593870E-06 )*Y-2.43236345136782E-05 )*Y+ + 3.54846978585226E-04; + WW5 = ((((((((((((( 2.69412277020887E-20*Y-4.24837886165685E-19)* + Y+6.030500065438E-18)*Y-9.069722758289E-17)*Y+ + 1.246599177672E-15)*Y-1.56872999797549E-14 )*Y+ + 1.87305099552692E-13 )*Y-2.09498886675861E-12 )*Y+ + 2.11630022068394E-11 )*Y-1.92566242323525E-10 )*Y+ + 1.62012436344069E-09 )*Y-1.23621614171556E-08 )*Y+ + 7.72165684563049E-08 )*Y-3.59858901591047E-07 )*Y+ + 2.43682618601000E-06; + } else if (X < 25.0) { + Y = X-22.5E+00; + RT1 = (((((((((-1.13927848238726E-15*Y+7.39404133595713E-15)*Y+ + 1.445982921243E-13)*Y-2.676703245252E-12)*Y+ + 5.823521627177E-12)*Y+2.17264723874381E-10 )*Y+ + 3.56242145897468E-09 )*Y-3.03763737404491E-07 )*Y+ + 9.46859114120901E-06 )*Y-2.30896753853196E-04 )*Y+ + 5.24663913001114E-03; + RT2 = (((((((((( 2.89872355524581E-16*Y-1.22296292045864E-14)*Y+ + 6.184065097200E-14)*Y+1.649846591230E-12)*Y- + 2.729713905266E-11)*Y+3.709913790650E-11)*Y+ + 2.216486288382E-09)*Y+4.616160236414E-08)*Y- + 3.32380270861364E-06 )*Y+9.84635072633776E-05 )*Y- + 2.30092118015697E-03 )*Y+5.00845183695073E-02; + RT3 = (((((((((( 1.97068646590923E-15*Y-4.89419270626800E-14)*Y+ + 1.136466605916E-13)*Y+7.546203883874E-12)*Y- + 9.635646767455E-11)*Y-8.295965491209E-11)*Y+ + 7.534109114453E-09)*Y+2.699970652707E-07)*Y- + 1.42982334217081E-05 )*Y+3.78290946669264E-04 )*Y- + 8.03133015084373E-03 )*Y+1.58689469640791E-01; + RT4 = (((((((((( 1.33642069941389E-14*Y-1.55850612605745E-13)*Y- + 7.522712577474E-13)*Y+3.209520801187E-11)*Y- + 2.075594313618E-10)*Y-2.070575894402E-09)*Y+ + 7.323046997451E-09)*Y+1.851491550417E-06)*Y- + 6.37524802411383E-05 )*Y+1.36795464918785E-03 )*Y- + 2.42051126993146E-02 )*Y+3.97847167557815E-01; + RT5 = ((((((((((-6.07053986130526E-14*Y+1.04447493138843E-12)*Y- + 4.286617818951E-13)*Y-2.632066100073E-10)*Y+ + 4.804518986559E-09)*Y-1.835675889421E-08)*Y- + 1.068175391334E-06)*Y+3.292234974141E-05)*Y- + 5.94805357558251E-04 )*Y+8.29382168612791E-03 )*Y- + 9.93122509049447E-02 )*Y+1.09857804755042E+00; + WW1 = (((((((((-9.10338640266542E-15*Y+1.00438927627833E-13)*Y+ + 7.817349237071E-13)*Y-2.547619474232E-11)*Y+ + 1.479321506529E-10)*Y+1.52314028857627E-09 )*Y+ + 9.20072040917242E-09 )*Y-2.19427111221848E-06 )*Y+ + 8.65797782880311E-05 )*Y-2.82718629312875E-03 )*Y+ + 1.28718310443295E-01; + WW2 = ((((((((( 5.52380927618760E-15*Y-6.43424400204124E-14)*Y- + 2.358734508092E-13)*Y+8.261326648131E-12)*Y+ + 9.229645304956E-11)*Y-5.68108973828949E-09 )*Y+ + 1.22477891136278E-07 )*Y-2.11919643127927E-06 )*Y+ + 4.23605032368922E-05 )*Y-1.14423444576221E-03 )*Y+ + 5.06607252890186E-02; + WW3 = ((((((((( 3.99457454087556E-15*Y-5.11826702824182E-14)*Y- + 4.157593182747E-14)*Y+4.214670817758E-12)*Y+ + 6.705582751532E-11)*Y-3.36086411698418E-09 )*Y+ + 6.07453633298986E-08 )*Y-7.40736211041247E-07 )*Y+ + 8.84176371665149E-06 )*Y-1.72559275066834E-04 )*Y+ + 7.16639814253567E-03; + WW4 = (((((((((((-2.14649508112234E-18*Y-2.45525846412281E-18)*Y+ + 6.126212599772E-16)*Y-8.526651626939E-15)*Y+ + 4.826636065733E-14)*Y-3.39554163649740E-13 )*Y+ + 1.67070784862985E-11 )*Y-4.42671979311163E-10 )*Y+ + 6.77368055908400E-09 )*Y-7.03520999708859E-08 )*Y+ + 6.04993294708874E-07 )*Y-7.80555094280483E-06 )*Y+ + 2.85954806605017E-04; + WW5 = ((((((((((((-5.63938733073804E-21*Y+6.92182516324628E-20)*Y- + 1.586937691507E-18)*Y+3.357639744582E-17)*Y- + 4.810285046442E-16)*Y+5.386312669975E-15)*Y- + 6.117895297439E-14)*Y+8.441808227634E-13)*Y- + 1.18527596836592E-11 )*Y+1.36296870441445E-10 )*Y- + 1.17842611094141E-09 )*Y+7.80430641995926E-09 )*Y- + 5.97767417400540E-08 )*Y+1.65186146094969E-06; + } else if (X < 40) { + WW1 = sqrt(PIE4/X); + E = exp(-X); + RT1 = ((((((((-1.73363958895356E-06*X+1.19921331441483E-04)*X - + 1.59437614121125E-02)*X+1.13467897349442E+00)*X - + 4.47216460864586E+01)*X+1.06251216612604E+03)*X - + 1.52073917378512E+04)*X+1.20662887111273E+05)*X - + 4.07186366852475E+05)*E + R15/(X-R15); + RT2 = ((((((((-1.60102542621710E-05*X+1.10331262112395E-03)*X - + 1.50043662589017E-01)*X+1.05563640866077E+01)*X - + 4.10468817024806E+02)*X+9.62604416506819E+03)*X - + 1.35888069838270E+05)*X+1.06107577038340E+06)*X - + 3.51190792816119E+06)*E + R25/(X-R25); + RT3 = ((((((((-4.48880032128422E-05*X+2.69025112122177E-03)*X - + 4.01048115525954E-01)*X+2.78360021977405E+01)*X - + 1.04891729356965E+03)*X+2.36985942687423E+04)*X - + 3.19504627257548E+05)*X+2.34879693563358E+06)*X - + 7.16341568174085E+06)*E + R35/(X-R35); + RT4 = ((((((((-6.38526371092582E-05*X-2.29263585792626E-03)*X - + 7.65735935499627E-02)*X+9.12692349152792E+00)*X - + 2.32077034386717E+02)*X+2.81839578728845E+02)*X + + 9.59529683876419E+04)*X-1.77638956809518E+06)*X + + 1.02489759645410E+07)*E + R45/(X-R45); + RT5 = ((((((((-3.59049364231569E-05*X-2.25963977930044E-02)*X + + 1.12594870794668E+00)*X-4.56752462103909E+01)*X + + 1.05804526830637E+03)*X-1.16003199605875E+04)*X - + 4.07297627297272E+04)*X+2.22215528319857E+06)*X - + 1.61196455032613E+07)*E + R55/(X-R55); + WW5 = (((((((((-4.61100906133970E-10*X+1.43069932644286E-07)*X - + 1.63960915431080E-05)*X+1.15791154612838E-03)*X - + 5.30573476742071E-02)*X+1.61156533367153E+00)*X - + 3.23248143316007E+01)*X+4.12007318109157E+02)*X - + 3.02260070158372E+03)*X+9.71575094154768E+03)*E + W55*WW1; + WW4 = (((((((((-2.40799435809950E-08*X+8.12621667601546E-06)*X - + 9.04491430884113E-04)*X+6.37686375770059E-02)*X - + 2.96135703135647E+00)*X+9.15142356996330E+01)*X - + 1.86971865249111E+03)*X+2.42945528916947E+04)*X - + 1.81852473229081E+05)*X+5.96854758661427E+05)*E + W45*WW1; + WW3 = (((((((( 1.83574464457207E-05*X-1.54837969489927E-03)*X + + 1.18520453711586E-01)*X-6.69649981309161E+00)*X + + 2.44789386487321E+02)*X-5.68832664556359E+03)*X + + 8.14507604229357E+04)*X-6.55181056671474E+05)*X + + 2.26410896607237E+06)*E + W35*WW1; + WW2 = (((((((( 2.77778345870650E-05*X-2.22835017655890E-03)*X + + 1.61077633475573E-01)*X-8.96743743396132E+00)*X + + 3.28062687293374E+02)*X-7.65722701219557E+03)*X + + 1.10255055017664E+05)*X-8.92528122219324E+05)*X + + 3.10638627744347E+06)*E + W25*WW1; + WW1 = WW1-0.01962E+00*E-WW2-WW3-WW4-WW5; + } else if (X < 59.0) { + WW1 = sqrt(PIE4/X); + XXX = X * X * X; + E = XXX*exp(-X); + RT1 = (((-2.43758528330205E-02*X+2.07301567989771E+00)*X - + 6.45964225381113E+01)*X+7.14160088655470E+02)*E + R15/(X-R15); + RT2 = (((-2.28861955413636E-01*X+1.93190784733691E+01)*X - + 5.99774730340912E+02)*X+6.61844165304871E+03)*E + R25/(X-R25); + RT3 = (((-6.95053039285586E-01*X+5.76874090316016E+01)*X - + 1.77704143225520E+03)*X+1.95366082947811E+04)*E + R35/(X-R35); + RT4 = (((-1.58072809087018E+00*X+1.27050801091948E+02)*X - + 3.86687350914280E+03)*X+4.23024828121420E+04)*E + R45/(X-R45); + RT5 = (((-3.33963830405396E+00*X+2.51830424600204E+02)*X - + 7.57728527654961E+03)*X+8.21966816595690E+04)*E + R55/(X-R55); + E = XXX*E; + WW5 = (( 1.35482430510942E-08*X-3.27722199212781E-07)*X + + 2.41522703684296E-06)*E + W55*WW1; + WW4 = (( 1.23464092261605E-06*X-3.55224564275590E-05)*X + + 3.03274662192286E-04)*E + W45*WW1; + WW3 = (( 1.34547929260279E-05*X-4.19389884772726E-04)*X + + 3.87706687610809E-03)*E + W35*WW1; + WW2 = (( 2.09539509123135E-05*X-6.87646614786982E-04)*X + + 6.68743788585688E-03)*E + W25*WW1; + WW1 = WW1-WW2-WW3-WW4-WW5; + } else { + WW1 = sqrt(PIE4/X); + RT1 = R15/(X-R15); + RT2 = R25/(X-R25); + RT3 = R35/(X-R35); + RT4 = R45/(X-R45); + RT5 = R55/(X-R55); + WW2 = W25*WW1; + WW3 = W35*WW1; + WW4 = W45*WW1; + WW5 = W55*WW1; + WW1 = WW1-WW2-WW3-WW4-WW5; + } + roots[0] = RT1; + roots[1] = RT2; + roots[2] = RT3; + roots[3] = RT4; + roots[4] = RT5; + weights[0] = WW1; + weights[1] = WW2; + weights[2] = WW3; + weights[3] = WW4; + weights[4] = WW5; + return 0; +} + +#define POLYNOMIAL_VALUE1(p, a, order, x) \ +p = a[order]; \ +for (i = 1; i <= order; i++) { \ + p = p * x + a[order-i]; \ +} + +#define SET_ZERO(a, n, start) \ + for (k = start; k < n; ++k) { \ + for (i = 0; i < n; ++i) { \ + a[i + k * n] = 0; \ + } \ + } \ + +static int R_dsmit(dtype *cs, dtype *fmt_ints, int n) +{ + int i, j, k; + dtype fac, dot, tmp; + dtype v[MXRYSROOTS]; + + fac = -fmt_ints[1] / fmt_ints[0]; + tmp = fmt_ints[2] + fac * fmt_ints[1]; + if (tmp <= 0) { + //fprintf(stderr, "libcint::rys_roots negative value in sqrt for roots %d (j=1)\n", n-1); + SET_ZERO(cs, n, 1); + return 1; + } + tmp = 1 / sqrt(tmp); + cs[0+0*n] = 1 / sqrt(fmt_ints[0]); + cs[0+1*n] = fac * tmp; + cs[1+1*n] = tmp; + + for (j = 2; j < n; ++j) { + for (k = 0; k < j; ++k) { + v[k] = 0; + } + fac = fmt_ints[j + j]; + for (k = 0; k < j; ++k) { + dot = 0; + for (i = 0; i <= k; ++i) { + dot += cs[i + k * n] * fmt_ints[i+j]; + } + for (i = 0; i <= k; ++i) { + v[i] -= dot * cs[i + k * n]; + } + fac -= dot * dot; + } + + if (fac <= 0) { + + SET_ZERO(cs, n, j); + if (fac == 0) { + return 0; + } + //fprintf(stderr, "libcint::rys_roots negative value in sqrt for roots %d (j=%d)\n", n-1, j); + return j; + } + fac = 1 / sqrt(fac); + cs[j + j * n] = fac; + for (k = 0; k < j; ++k) { + cs[k + j * n] = fac * v[k]; + } + } + return 0; +} + + +static int _rdk_rys_roots(int nroots, dtype *fmt_ints, + dtype *roots, dtype *weights) +{ + int i, k, j, order; + int nroots1 = nroots + 1; + dtype rt[MXRYSROOTS + MXRYSROOTS * MXRYSROOTS]; + dtype *cs = rt + nroots1; + dtype *a; + dtype root, poly, dum; + + + if (fmt_ints[0] == 0) { + for (k = 0; k < nroots; ++k) { + roots[k] = 0; + weights[k] = 0; + } + return 0; + } + if (nroots == 1) { + roots[0] = fmt_ints[1] / (fmt_ints[0] - fmt_ints[1]); + weights[0] = fmt_ints[0]; + return 0; + } + + int error = R_dsmit(cs, fmt_ints, nroots1); + if (error) { + return 1; + } + error = _CINT_polynomial_roots(rt, cs, nroots); + if (error) { + return error; + } + + for (k = 0; k < nroots; ++k) { + root = rt[k]; + + + + + if (root == 1) { + roots[k] = 0; + weights[k] = 0; + continue; + } + + dum = 1 / fmt_ints[0]; + for (j = 1; j < nroots; ++j) { + order = j; + a = cs + j * nroots1; + + POLYNOMIAL_VALUE1(poly, a, order, root); + dum += poly * poly; + } + roots[k] = root / (1 - root); + weights[k] = 1 / dum; + } + return 0; +} + +int CINTrys_schmidt(int nroots, dtype x, dtype lower, dtype *roots, dtype *weights) +{ + dtype fmt_ints[MXRYSROOTS*2]; + if (lower == 0) { + gamma_inc_like(fmt_ints, x, nroots*2); + } else { + fmt_erfc_like(fmt_ints, x, lower, nroots*2); + } + return _rdk_rys_roots(nroots, fmt_ints, roots, weights); +} + + +#ifdef HAVE_SQRTL +#define SQRTL sqrtl +#else +static dtype c99_sqrtl(dtype x) +{ + dtype z = sqrt(x); + + + + return (z*z + x)/(z * 2); +} +#define SQRTL c99_sqrtl +#endif + +#ifdef HAVE_EXPL +#define EXPL expl +#else + + +static dtype c99_expl(dtype x) +{ + return exp(x); +} +#define EXPL c99_expl +#endif + +static int R_lsmit(dtype *cs, dtype *fmt_ints, int n) +{ + int i, j, k; + dtype fac, dot, tmp; + dtype v[MXRYSROOTS]; + + fac = -fmt_ints[1] / fmt_ints[0]; + tmp = fmt_ints[2] + fac * fmt_ints[1]; + if (tmp <= 0) { + //fprintf(stderr, "libcint::rys_roots negative value in sqrtl for roots %d (j=1)\n", n-1); + SET_ZERO(cs, n, 1); + return 1; + } + + + //cs[0+0*n] = 1 / SQRTL(fmt_ints[0]); + //p = 1 / sqrt(tmp); + tmp = 1 / sqrt(tmp); + cs[0+0*n] = 1 / sqrt(fmt_ints[0]); + cs[0+1*n] = fac *tmp; + cs[1+1*n] = tmp; + /* + tmp = 1 / SQRTL(tmp); + cs[0+0*n] = 1 / SQRTL(fmt_ints[0]); + cs[0+1*n] = fac * tmp; + cs[1+1*n] = tmp; + + */ + + for (j = 2; j < n; ++j) { + for (k = 0; k < j; ++k) { + v[k] = 0; + } + fac = fmt_ints[j + j]; + for (k = 0; k < j; ++k) { + dot = 0; + for (i = 0; i <= k; ++i) { + dot += cs[i + k * n] * fmt_ints[i+j]; + } + for (i = 0; i <= k; ++i) { + v[i] -= dot * cs[i + k * n]; + } + fac -= dot * dot; + } + + if (fac <= 0) { + + SET_ZERO(cs, n, j); + if (fac == 0) { + return 0; + } + //fprintf(stderr, "libcint::rys_roots negative value in sqrtl for roots %d (j=%d)\n", n-1, j); + return j; + } + //fac = 1 / SQRTL(fac); + fac = 1 / sqrt(fac); + cs[j + j * n] = fac; + for (k = 0; k < j; ++k) { + cs[k + j * n] = fac * v[k]; + } + + } + return 0; +} + +int CINTlrys_schmidt(int nroots, dtype x, dtype lower, dtype *roots, dtype *weights) +{ + int i, k, j, order, error; + int nroots1 = nroots + 1; + dtype fmt_ints[MXRYSROOTS * 2 + MXRYSROOTS * MXRYSROOTS]; + dtype *qcs = fmt_ints + nroots1 * 2; + dtype rt[MXRYSROOTS + MXRYSROOTS * MXRYSROOTS]; + dtype *cs = rt + nroots; + dtype *a; + dtype root, poly, dum, dum0; + + if (lower == 0) { + lgamma_inc_like(fmt_ints, x, nroots*2); + } else { + fmt_lerfc_like(fmt_ints, x, lower, nroots*2); + } + + if (fmt_ints[0] == 0) { + for (k = 0; k < nroots; ++k) { + roots[k] = 0; + weights[k] = 0; + } + return 0; + } + + if (nroots == 1) { + rt[0] = fmt_ints[1] / fmt_ints[0]; + } else { + error = R_lsmit(qcs, fmt_ints, nroots1); + if (error) { + return error; + } + for (k = 1; k < nroots1; k++) { + for (i = 0; i <= k; i++) { + cs[k * nroots1 + i] = qcs[k * nroots1 + i]; + } + } + + error = _CINT_polynomial_roots(rt, cs, nroots); + if (error) { + return error; + } + } + + dum0 = 1 / fmt_ints[0]; + for (k = 0; k < nroots; ++k) { + root = rt[k]; + if (root == 1) { + roots[k] = 0; + weights[k] = 0; + continue; + } + + dum = dum0; + for (j = 1; j < nroots; ++j) { + order = j; + a = cs + j * nroots1; + + POLYNOMIAL_VALUE1(poly, a, order, root); + dum += poly * poly; + } + roots[k] = root / (1 - root); + weights[k] = 1 / dum; + } + return 0; +} + +#ifdef HAVE_QUADMATH_H + + + + +#endif + + + + +//#define MAX(I,J) ((I) > (J) ? (I) : (J)) +//#define MIN(I,J) ((I) < (J) ? (I) : (J)) + +int GTOmax_shell_dim(const int *ao_loc, const int *shls_slice, int ncenter) +{ + int i; + int i0 = shls_slice[0]; + int i1 = shls_slice[1]; + int di = 0; + for (i = 1; i < ncenter; i++) { + i0 = MIN(i0, shls_slice[i*2 ]); + i1 = MAX(i1, shls_slice[i*2+1]); + } + for (i = i0; i < i1; i++) { + di = MAX(di, ao_loc[i+1]-ao_loc[i]); + } + return di; +} + +#ifdef __cplusplus +int GTOmax_cache_size(int (*intor)(...), int *shls_slice, int ncenter, + int *atm, int natm, int *bas, int nbas, dtype *env) +#else +int GTOmax_cache_size(int (*intor)(), int *shls_slice, int ncenter, + int *atm, int natm, int *bas, int nbas, dtype *env) +#endif +{ + int i, n; + int i0 = shls_slice[0]; + int i1 = shls_slice[1]; + for (i = 1; i < ncenter; i++) { + i0 = MIN(i0, shls_slice[i*2 ]); + i1 = MAX(i1, shls_slice[i*2+1]); + } + int shls[4]; + int cache_size = 0; + for (i = i0; i < i1; i++) { + shls[0] = i; + shls[1] = i; + shls[2] = i; + shls[3] = i; + n = (*intor)(NULL, NULL, shls, atm, natm, bas, nbas, env, NULL, NULL); + cache_size = MAX(cache_size, n); + } + return cache_size; +} + + +#ifdef __cplusplus +void GTOnr2e_fill_s1(int (*intor)(...), int (*fprescreen)(...), + dtype *eri, dtype *buf, int comp, int ishp, int jshp, + int *shls_slice, int *ao_loc, CINTOpt *cintopt, + int *atm, int natm, int *bas, int nbas, dtype *env, int _WHICH_INTEGRAL) + +#else +void GTOnr2e_fill_s1(int (*intor)(), int (*fprescreen)(), + dtype *eri, dtype *buf, int comp, int ishp, int jshp, + int *shls_slice, int *ao_loc, CINTOpt *cintopt, + int *atm, int natm, int *bas, int nbas, dtype *env, int _WHICH_INTEGRAL) +#endif +{ + WHICH_INTEGRAL = WHICH_INTEGRAL; + int ish0 = shls_slice[0]; + int ish1 = shls_slice[1]; + int jsh0 = shls_slice[2]; + int jsh1 = shls_slice[3]; + int ksh0 = shls_slice[4]; + int ksh1 = shls_slice[5]; + int lsh0 = shls_slice[6]; + int lsh1 = shls_slice[7]; + int ni = ao_loc[ish1] - ao_loc[ish0]; + int nj = ao_loc[jsh1] - ao_loc[jsh0]; + int nk = ao_loc[ksh1] - ao_loc[ksh0]; + int nl = ao_loc[lsh1] - ao_loc[lsh0]; + size_t nij = ni * nj; + size_t nkl = nk * nl; + size_t neri = nij * nkl; + + int ish = ishp + ish0; + int jsh = jshp + jsh0; + int i0 = ao_loc[ish] - ao_loc[ish0]; + int j0 = ao_loc[jsh] - ao_loc[jsh0]; + eri += nkl * (i0 * nj + j0); + + int di = ao_loc[ish+1] - ao_loc[ish]; + int dj = ao_loc[jsh+1] - ao_loc[jsh]; + int dij = di * dj; + int k0, l0, dk, dl, dijk, dijkl; + int i, j, k, l, icomp; + int ksh, lsh; + int shls[4]; + dtype *eri0, *peri, *buf0, *pbuf, *cache; + + shls[0] = ish; + shls[1] = jsh; + //printf("Which_integral %d\n", WHICH_INTEGRAL); + + for (ksh = ksh0; ksh < ksh1; ksh++) { + for (lsh = lsh0; lsh < lsh1; lsh++) { + shls[2] = ksh; + shls[3] = lsh; + k0 = ao_loc[ksh] - ao_loc[ksh0]; + l0 = ao_loc[lsh] - ao_loc[lsh0]; + dk = ao_loc[ksh+1] - ao_loc[ksh]; + dl = ao_loc[lsh+1] - ao_loc[lsh]; + dijk = dij * dk; + dijkl = dijk * dl; + cache = buf + dijkl * comp; + + FINT not_empty; + if (WHICH_INTEGRAL == INT2E_SPH){ + //printf(">> int2e_sph\n"); + not_empty = int2e_sph(buf, NULL, shls, atm, natm, bas, nbas, env, cintopt, cache); + //printf("%d\n", not_empty); + } + else if (WHICH_INTEGRAL == INT2E_IP1_SPH){ + not_empty = int2e_ip1_sph(buf, NULL, shls, atm, natm, bas, nbas, env, cintopt, cache); + } + + if (not_empty + //(*fprescreen)(shls, atm, bas, env) && + //(*intor)(buf, NULL, shls, atm, natm, bas, nbas, env, cintopt, cache) + //int2e_sph(buf, NULL, shls, atm, natm, bas, nbas, env, cintopt, cache) + ) { + //printf("inside\n"); + eri0 = eri + k0*nl+l0; + buf0 = buf; + for (icomp = 0; icomp < comp; icomp++) { + for (i = 0; i < di; i++) { + for (j = 0; j < dj; j++) { + peri = eri0 + nkl*(i*nj+j); + for (k = 0; k < dk; k++) { + for (pbuf = buf0 + k*dij + j*di + i, + l = 0; l < dl; l++) { + peri[k*nl+l] = pbuf[l*dijk]; + } } + } } + buf0 += dijkl; + eri0 += neri; + } + } else { + eri0 = eri + k0*nl+l0; + for (icomp = 0; icomp < comp; icomp++) { + for (i = 0; i < di; i++) { + for (j = 0; j < dj; j++) { + peri = eri0 + nkl*(i*nj+j); + for (k = 0; k < dk; k++) { + for (l = 0; l < dl; l++) { + peri[k*nl+l] = 0; + } + } + } } + eri0 += neri; + } + } + } } +} + +#ifdef __cplusplus +void GTOnr2e_fill_s2ij(int (*intor)(...), int (*fprescreen)(...), + dtype *eri, dtype *buf, int comp, int ishp, int jshp, + int *shls_slice, int *ao_loc, CINTOpt *cintopt, + int *atm, int natm, int *bas, int nbas, dtype *env) +#else +void GTOnr2e_fill_s2ij(int (*intor)(), int (*fprescreen)(), + dtype *eri, dtype *buf, int comp, int ishp, int jshp, + int *shls_slice, int *ao_loc, CINTOpt *cintopt, + int *atm, int natm, int *bas, int nbas, dtype *env) +#endif +{ + if (ishp < jshp) { + return; + } + + int ish0 = shls_slice[0]; + int ish1 = shls_slice[1]; + int jsh0 = shls_slice[2]; + + int ksh0 = shls_slice[4]; + int ksh1 = shls_slice[5]; + int lsh0 = shls_slice[6]; + int lsh1 = shls_slice[7]; + int ni = ao_loc[ish1] - ao_loc[ish0]; + + int nk = ao_loc[ksh1] - ao_loc[ksh0]; + int nl = ao_loc[lsh1] - ao_loc[lsh0]; + size_t nij = ni * (ni+1) / 2; + size_t nkl = nk * nl; + size_t neri = nij * nkl; + + int ish = ishp + ish0; + int jsh = jshp + jsh0; + int i0 = ao_loc[ish] - ao_loc[ish0]; + int j0 = ao_loc[jsh] - ao_loc[jsh0]; + eri += nkl * (i0*(i0+1)/2 + j0); + + int di = ao_loc[ish+1] - ao_loc[ish]; + int dj = ao_loc[jsh+1] - ao_loc[jsh]; + int dij = di * dj; + int k0, l0, dk, dl, dijk, dijkl; + int i, j, k, l, icomp; + int ksh, lsh; + int shls[4]; + dtype *eri0, *peri0, *peri, *buf0, *pbuf, *cache; + + shls[0] = ish; + shls[1] = jsh; + + for (ksh = ksh0; ksh < ksh1; ksh++) { + for (lsh = lsh0; lsh < lsh1; lsh++) { + shls[2] = ksh; + shls[3] = lsh; + k0 = ao_loc[ksh] - ao_loc[ksh0]; + l0 = ao_loc[lsh] - ao_loc[lsh0]; + dk = ao_loc[ksh+1] - ao_loc[ksh]; + dl = ao_loc[lsh+1] - ao_loc[lsh]; + dijk = dij * dk; + dijkl = dijk * dl; + cache = buf + dijkl * comp; + if ((*fprescreen)(shls, atm, bas, env) && + (*intor)(buf, NULL, shls, atm, natm, bas, nbas, env, cintopt, cache)) { + eri0 = eri + k0*nl+l0; + buf0 = buf; + for (icomp = 0; icomp < comp; icomp++) { + peri0 = eri0; + if (ishp > jshp) { + for (i = 0; i < di; i++, peri0+=nkl*(i0+i)) { + for (j = 0; j < dj; j++) { + peri = peri0 + nkl*j; + for (k = 0; k < dk; k++) { + for (pbuf = buf0 + k*dij + j*di + i, + l = 0; l < dl; l++) { + peri[k*nl+l] = pbuf[l*dijk]; + } } + } } + } else { + for (i = 0; i < di; i++, peri0+=nkl*(i0+i)) { + for (j = 0; j <= i; j++) { + peri = peri0 + nkl*j; + for (k = 0; k < dk; k++) { + for (pbuf = buf0 + k*dij + j*di + i, + l = 0; l < dl; l++) { + peri[k*nl+l] = pbuf[l*dijk]; + } } + } } + } + buf0 += dijkl; + eri0 += neri; + } + } else { + eri0 = eri + k0*nl+l0; + for (icomp = 0; icomp < comp; icomp++) { + peri0 = eri0; + if (ishp > jshp) { + for (i = 0; i < di; i++, peri0+=nkl*(i0+i)) { + for (j = 0; j < dj; j++) { + peri = peri0 + nkl*j; + for (k = 0; k < dk; k++) { + for (l = 0; l < dl; l++) { + peri[k*nl+l] = 0; + } } + } } + } else { + for (i = 0; i < di; i++, peri0+=nkl*(i0+i)) { + for (j = 0; j <= i; j++) { + peri = peri0 + nkl*j; + for (k = 0; k < dk; k++) { + for (l = 0; l < dl; l++) { + peri[k*nl+l] = 0; + } } + } } + } + eri0 += neri; + } + } + } } +} + +#ifdef __cplusplus +void GTOnr2e_fill_s2kl(int (*intor)(...), int (*fprescreen)(...), + dtype *eri, dtype *buf, int comp, int ishp, int jshp, + int *shls_slice, int *ao_loc, CINTOpt *cintopt, + int *atm, int natm, int *bas, int nbas, dtype *env) +#else +void GTOnr2e_fill_s2kl(int (*intor)(), int (*fprescreen)(), + dtype *eri, dtype *buf, int comp, int ishp, int jshp, + int *shls_slice, int *ao_loc, CINTOpt *cintopt, + int *atm, int natm, int *bas, int nbas, dtype *env) +#endif +{ + int ish0 = shls_slice[0]; + int ish1 = shls_slice[1]; + int jsh0 = shls_slice[2]; + int jsh1 = shls_slice[3]; + int ksh0 = shls_slice[4]; + int ksh1 = shls_slice[5]; + int lsh0 = shls_slice[6]; + + int ni = ao_loc[ish1] - ao_loc[ish0]; + int nj = ao_loc[jsh1] - ao_loc[jsh0]; + int nk = ao_loc[ksh1] - ao_loc[ksh0]; + + size_t nij = ni * nj; + size_t nkl = nk * (nk+1) / 2; + size_t neri = nij * nkl; + + int ish = ishp + ish0; + int jsh = jshp + jsh0; + int i0 = ao_loc[ish] - ao_loc[ish0]; + int j0 = ao_loc[jsh] - ao_loc[jsh0]; + eri += nkl * (i0 * nj + j0); + + int di = ao_loc[ish+1] - ao_loc[ish]; + int dj = ao_loc[jsh+1] - ao_loc[jsh]; + int dij = di * dj; + int k0, l0, dk, dl, dijk, dijkl; + int i, j, k, l, icomp; + int ksh, lsh, kshp, lshp; + int shls[4]; + dtype *eri0, *peri, *buf0, *pbuf, *cache; + + shls[0] = ish; + shls[1] = jsh; + + for (kshp = 0; kshp < ksh1-ksh0; kshp++) { + for (lshp = 0; lshp <= kshp; lshp++) { + ksh = kshp + ksh0; + lsh = lshp + lsh0; + shls[2] = ksh; + shls[3] = lsh; + k0 = ao_loc[ksh] - ao_loc[ksh0]; + l0 = ao_loc[lsh] - ao_loc[lsh0]; + dk = ao_loc[ksh+1] - ao_loc[ksh]; + dl = ao_loc[lsh+1] - ao_loc[lsh]; + dijk = dij * dk; + dijkl = dijk * dl; + cache = buf + dijkl * comp; + if ((*fprescreen)(shls, atm, bas, env) && + (*intor)(buf, NULL, shls, atm, natm, bas, nbas, env, cintopt, cache)) { + eri0 = eri + k0*(k0+1)/2+l0; + buf0 = buf; + for (icomp = 0; icomp < comp; icomp++) { + if (kshp > lshp) { + for (i = 0; i < di; i++) { + for (j = 0; j < dj; j++) { + peri = eri0 + nkl*(i*nj+j); + for (k = 0; k < dk; k++, peri+=k0+k) { + for (pbuf = buf0 + k*dij + j*di + i, + l = 0; l < dl; l++) { + peri[l] = pbuf[l*dijk]; + } } + } } + } else { + for (i = 0; i < di; i++) { + for (j = 0; j < dj; j++) { + peri = eri0 + nkl*(i*nj+j); + for (k = 0; k < dk; k++, peri+=k0+k) { + for (pbuf = buf0 + k*dij + j*di + i, + l = 0; l <= k; l++) { + peri[l] = pbuf[l*dijk]; + } } + } } + } + buf0 += dijkl; + eri0 += neri; + } + } else { + eri0 = eri + k0*(k0+1)/2+l0; + for (icomp = 0; icomp < comp; icomp++) { + if (kshp > lshp) { + for (i = 0; i < di; i++) { + for (j = 0; j < dj; j++) { + peri = eri0 + nkl*(i*nj+j); + for (k = 0; k < dk; k++, peri+=k0+k) { + for (l = 0; l < dl; l++) { + peri[l] = 0; + } } + } } + } else { + for (i = 0; i < di; i++) { + for (j = 0; j < dj; j++) { + peri = eri0 + nkl*(i*nj+j); + for (k = 0; k < dk; k++, peri+=k0+k) { + for (l = 0; l <= k; l++) { + peri[l] = 0; + } } + } } + } + eri0 += neri; + } + } + } } +} + +#ifdef __cplusplus +void GTOnr2e_fill_s4(int (*intor)(...), int (*fprescreen)(...), + dtype *eri, dtype *buf, int comp, int ishp, int jshp, + int *shls_slice, int *ao_loc, CINTOpt *cintopt, + int *atm, int natm, int *bas, int nbas, dtype *env) +#else +void GTOnr2e_fill_s4(int (*intor)(), int (*fprescreen)(), + dtype *eri, dtype *buf, int comp, int ishp, int jshp, + int *shls_slice, int *ao_loc, CINTOpt *cintopt, + int *atm, int natm, int *bas, int nbas, dtype *env) +#endif +{ + if (ishp < jshp) { + return; + } + + int ish0 = shls_slice[0]; + int ish1 = shls_slice[1]; + int jsh0 = shls_slice[2]; + + int ksh0 = shls_slice[4]; + int ksh1 = shls_slice[5]; + int lsh0 = shls_slice[6]; + + int ni = ao_loc[ish1] - ao_loc[ish0]; + + int nk = ao_loc[ksh1] - ao_loc[ksh0]; + + size_t nij = ni * (ni+1) / 2; + size_t nkl = nk * (nk+1) / 2; + size_t neri = nij * nkl; + + int ish = ishp + ish0; + int jsh = jshp + jsh0; + int i0 = ao_loc[ish] - ao_loc[ish0]; + int j0 = ao_loc[jsh] - ao_loc[jsh0]; + eri += nkl * (i0*(i0+1)/2 + j0); + + int di = ao_loc[ish+1] - ao_loc[ish]; + int dj = ao_loc[jsh+1] - ao_loc[jsh]; + int dij = di * dj; + int k0, l0, dk, dl, dijk, dijkl; + int i, j, k, l, icomp; + int ksh, lsh, kshp, lshp; + int shls[4]; + dtype *eri0, *peri0, *peri, *buf0, *pbuf, *cache; + + shls[0] = ish; + shls[1] = jsh; + + for (kshp = 0; kshp < ksh1-ksh0; kshp++) { + for (lshp = 0; lshp <= kshp; lshp++) { + ksh = kshp + ksh0; + lsh = lshp + lsh0; + shls[2] = ksh; + shls[3] = lsh; + k0 = ao_loc[ksh] - ao_loc[ksh0]; + l0 = ao_loc[lsh] - ao_loc[lsh0]; + dk = ao_loc[ksh+1] - ao_loc[ksh]; + dl = ao_loc[lsh+1] - ao_loc[lsh]; + dijk = dij * dk; + dijkl = dijk * dl; + cache = buf + dijkl * comp; + if ((*fprescreen)(shls, atm, bas, env) && + (*intor)(buf, NULL, shls, atm, natm, bas, nbas, env, cintopt, cache)) { + eri0 = eri + k0*(k0+1)/2+l0; + buf0 = buf; + for (icomp = 0; icomp < comp; icomp++) { + peri0 = eri0; + if (kshp > lshp && ishp > jshp) { + for (i = 0; i < di; i++, peri0+=nkl*(i0+i)) { + for (j = 0; j < dj; j++) { + peri = peri0 + nkl*j; + for (k = 0; k < dk; k++, peri+=k0+k) { + for (pbuf = buf0 + k*dij + j*di + i, + l = 0; l < dl; l++) { + peri[l] = pbuf[l*dijk]; + } } + } } + } else if (ish > jsh) { + for (i = 0; i < di; i++, peri0+=nkl*(i0+i)) { + for (j = 0; j < dj; j++) { + peri = peri0 + nkl*j; + for (k = 0; k < dk; k++, peri+=k0+k) { + for (pbuf = buf0 + k*dij + j*di + i, + l = 0; l <= k; l++) { + peri[l] = pbuf[l*dijk]; + } } + } } + } else if (ksh > lsh) { + for (i = 0; i < di; i++, peri0+=nkl*(i0+i)) { + for (j = 0; j <= i; j++) { + peri = peri0 + nkl*j; + for (k = 0; k < dk; k++, peri+=k0+k) { + for (pbuf = buf0 + k*dij + j*di + i, + l = 0; l < dl; l++) { + peri[l] = pbuf[l*dijk]; + } } + } } + } else { + for (i = 0; i < di; i++, peri0+=nkl*(i0+i)) { + for (j = 0; j <= i; j++) { + peri = peri0 + nkl*j; + for (k = 0; k < dk; k++, peri+=k0+k) { + for (pbuf = buf0 + k*dij + j*di + i, + l = 0; l <= k; l++) { + peri[l] = pbuf[l*dijk]; + } } + } } + } + buf0 += dijkl; + eri0 += neri; + } + } else { + eri0 = eri + k0*(k0+1)/2+l0; + buf0 = buf; + for (icomp = 0; icomp < comp; icomp++) { + peri0 = eri0; + if (kshp > lshp && ishp > jshp) { + for (i = 0; i < di; i++, peri0+=nkl*(i0+i)) { + for (j = 0; j < dj; j++) { + peri = peri0 + nkl*j; + for (k = 0; k < dk; k++, peri+=k0+k) { + for (l = 0; l < dl; l++) { + peri[l] = 0; + } } + } } + } else if (ish > jsh) { + for (i = 0; i < di; i++, peri0+=nkl*(i0+i)) { + for (j = 0; j < dj; j++) { + peri = peri0 + nkl*j; + for (k = 0; k < dk; k++, peri+=k0+k) { + for (l = 0; l <= k; l++) { + peri[l] = 0; + } } + } } + } else if (ksh > lsh) { + for (i = 0; i < di; i++, peri0+=nkl*(i0+i)) { + for (j = 0; j <= i; j++) { + peri = peri0 + nkl*j; + for (k = 0; k < dk; k++, peri+=k0+k) { + for (l = 0; l < dl; l++) { + peri[l] = 0; + } } + } } + } else { + for (i = 0; i < di; i++, peri0+=nkl*(i0+i)) { + for (j = 0; j <= i; j++) { + peri = peri0 + nkl*j; + for (k = 0; k < dk; k++, peri+=k0+k) { + for (l = 0; l <= k; l++) { + peri[l] = 0; + } } + } } + } + eri0 += neri; + } + } + } } +} + + +static int no_prescreen() +{ + return 1; +} + +#ifdef __cplusplus +void GTOnr2e_fill_drv(int (*intor)(...), void (*fill)(...), int (*fprescreen)(...), + dtype *eri, int comp, + int *shls_slice, int *ao_loc, CINTOpt *cintopt, + int *atm, int natm, int *bas, int nbas, dtype *env, int _WHICH_INTEGRAL) +#else +void GTOnr2e_fill_drv(int (*intor)(), void (*fill)(), int (*fprescreen)(), + dtype *eri, int comp, + int *shls_slice, int *ao_loc, CINTOpt *cintopt, + int *atm, int natm, int *bas, int nbas, dtype *env, _WHICH_INTEGRAL) +#endif +{ + WHICH_INTEGRAL = _WHICH_INTEGRAL; + //printf("GTOnr2e_fill_drv, comp=%d, which_integral=%d\n", comp, WHICH_INTEGRAL); + /*printf("integral %d\n", WHICH_INTEGRAL); + if (fprescreen == NULL) { + #ifdef __cplusplus + fprescreen = (int (*)(...))no_prescreen; + #else + fprescreen = no_prescreen; + #endif + }*/ + + const int ish0 = shls_slice[0]; + const int ish1 = shls_slice[1]; + const int jsh0 = shls_slice[2]; + const int jsh1 = shls_slice[3]; + const int nish = ish1 - ish0; + const int njsh = jsh1 - jsh0; + const int di = GTOmax_shell_dim(ao_loc, shls_slice, 4); + const int cache_size = 256;//GTOmax_cache_size(intor, shls_slice, 4, + // atm, natm, bas, nbas, env); + +#pragma omp parallel +{ + int ij, i, j; + #ifdef __cplusplus + //dtype *buf = new dtype[2048]; + dtype buf[256]; + #else + dtype *buf = malloc(sizeof(dtype) * (di*di*di*di*comp + cache_size)); + #endif +#pragma omp for nowait schedule(dynamic) + for (ij = 0; ij < nish*njsh; ij++) { + i = ij / njsh; + j = ij % njsh; + //printf("loop: %d\n", ij); + //(*fill)(intor, fprescreen, eri, buf, comp, i, j, shls_slice, + GTOnr2e_fill_s1(intor, fprescreen, eri, buf, comp, i, j, + shls_slice, ao_loc, cintopt, atm, natm, bas, nbas, env, WHICH_INTEGRAL); + } + //free(buf); +} +} + + + + +#define PLAIN 0 +#define HERMITIAN 1 +#define ANTIHERMI 2 +#define SYMMETRIC 3 + +#define BLOCK_DIM 104 + +#define TRIU_LOOP(I, J) \ + for (j0 = 0; j0 < n; j0+=BLOCK_DIM) \ + for (I = 0, j1 = MIN(j0+BLOCK_DIM, n); I < j1; I++) \ + for (J = MAX(I,j0); J < j1; J++) + +void NPdsymm_triu(int n, dtype *mat, int hermi) +{ + size_t i, j, j0, j1; + + if (hermi == HERMITIAN || hermi == SYMMETRIC) { + TRIU_LOOP(i, j) { + mat[i*n+j] = mat[j*n+i]; + } + } else { + TRIU_LOOP(i, j) { + mat[i*n+j] = -mat[j*n+i]; + } + } +} + +#ifdef __cplusplus +//void GTOint2c(int (*intor)(...), dtype *mat, int comp, int hermi, +void GTOint2c(int (*intor)(dtype *out, FINT *dims, FINT *shls, + FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache), dtype *mat, int comp, int hermi, + int *shls_slice, int *ao_loc, CINTOpt *opt, + int *atm, int natm, int *bas, int nbas, dtype *env) +#else +void GTOint2c(int (*intor)(), dtype *mat, int comp, int hermi, + int *shls_slice, int *ao_loc, CINTOpt *opt, + int *atm, int natm, int *bas, int nbas, dtype *env) +#endif +{ + //printf("ish0 jsh0 %d %d\n", shls_slice[0], shls_slice[2]); + const int ish0 = shls_slice[0]; + const int ish1 = shls_slice[1]; + const int jsh0 = shls_slice[2]; + const int jsh1 = shls_slice[3]; + const int nish = ish1 - ish0; + const int njsh = jsh1 - jsh0; + const size_t naoi = ao_loc[ish1] - ao_loc[ish0]; + const size_t naoj = ao_loc[jsh1] - ao_loc[jsh0]; + const int cache_size = 128;//GTOmax_cache_size(intor, shls_slice, 2, atm, natm, bas, nbas, env); + +/*#ifdef __POPC__ +#pragma omp parallel +{ +#endif*/ + int dims[2]= {(int)naoi, (int)naoj}; + int ish, jsh, ij, i0, j0; + int shls[2]; + #ifdef __cplusplus + //dtype cache[128]; + dtype cache[128*2]; + #else + dtype *cache = malloc(sizeof(dtype) * cache_size); + #endif + +/*#ifdef __POPC__ +#else +#pragma omp for schedule(dynamic, 4) +#endif*/ + + /*printf("[-1] "); + for (int i = 0; i < 12; i++){ + printf("%f ", mat[i]); + } + printf("\n");*/ + + + + for (ij = 0; ij < nish*njsh; ij++) { + //printf("[%d / %d]\n", ij, nish*njsh); + ish = ij / njsh; + jsh = ij % njsh; + if (hermi != PLAIN && ish > jsh) { + continue; + } + + ish += ish0; + jsh += jsh0; + //printf("ish jsh %d %d\n", ish, jsh); + shls[0] = ish; + shls[1] = jsh; + //printf("shls[] %d %d \n", shls[0], shls[1]); + //printf("%d %d\n", ish, jsh); + i0 = ao_loc[ish] - ao_loc[ish0]; + j0 = ao_loc[jsh] - ao_loc[jsh0]; + + (*intor)(mat+j0*naoi+i0, dims, shls, atm, natm, bas, nbas, env, opt, cache); + + /*printf("[%d] ", j0*naoi+i0); + for (int i = 0; i < 5; i++){ + printf("%f ", mat[i]); + } + printf("\n"); + return; */ + + //int1e_ipkin_sph(mat+j0*naoi+i0, dims, shls, atm, natm, bas, nbas, env, opt, cache); + //printf("%f\n", (mat+j0*naoi+i0)[0]); + /*for (int asd = 0; asd < 12; asd++){ + printf("%f ", mat[asd]); + } + printf("\n");*/ + + } + //free(cache); + +/*#ifdef __POPC__ +#else +} +#endif*/ + if (hermi != PLAIN) { + int ic; + for (ic = 0; ic < comp; ic++) { + NPdsymm_triu(naoi, mat+ic*naoi*naoi, hermi); + } + } + + /*printf("[D] "); + for (int i = 0; i < 12; i++){ + printf("%f ", mat[i]); + }*/ +} + + + +#ifdef __cplusplus +} +#endif diff --git a/pyscf_ipu/electron_repulsion/popcint/libcint.cpp b/pyscf_ipu/electron_repulsion/popcint/libcint.cpp new file mode 100644 index 0000000..e97a531 --- /dev/null +++ b/pyscf_ipu/electron_repulsion/popcint/libcint.cpp @@ -0,0 +1,127 @@ +#include +#include +#include +#include +#include +#include +#include "poplar/TileConstants.hpp" +#include + +using namespace poplar; + +#ifdef __IPU__ +// Use the IPU intrinsics +#include +#include +#define NAMESPACE ipu +#else +// Use the std functions +#include +#define NAMESPACE std +#endif + +#include "libcint.c" + + +class Grad : public Vertex { +public: + // TODO: Change InOut to Input. + // Using InOut so it's float* instead of const float* (which would require changing 30k lines in libcint.c) + InOut> mat; + InOut> shls_slice; + InOut> ao_loc; + InOut> atm; + InOut> bas; + InOut> env; + Input> natm; + Input> nbas; + Input> which_integral; + Output> out; + + bool compute() { + float * _env = env.data(); + int *_bas = bas.data(); + int *_atm = atm.data(); + int *_shls_slice = shls_slice.data(); + int *_ao_loc = ao_loc.data(); + float * _mat = mat.data(); + + if (which_integral.data()[0] == INT1E_KIN){ + GTOint2c( + (int (*)(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache)) + int1e_kin_sph, out.data(), 1, 0, _shls_slice, _ao_loc, NULL, _atm, natm.data()[0], _bas, nbas.data()[0], _env); + } + else if (which_integral.data()[0] == INT1E_NUC){ + GTOint2c( + (int (*)(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache)) + int1e_nuc_sph, out.data(), 1, 0, _shls_slice, _ao_loc, NULL, _atm, natm.data()[0], _bas, nbas.data()[0], _env); + } + else if (which_integral.data()[0] == INT1E_OVLP){ + GTOint2c( + (int (*)(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache)) + int1e_ovlp_sph, out.data(), 1, 0, _shls_slice, _ao_loc, NULL, _atm, natm.data()[0], _bas, nbas.data()[0], _env); + } + if (which_integral.data()[0] == INT1E_OVLP_IP){ + GTOint2c( + (int (*)(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache)) + int1e_ipovlp_sph, out.data(), 3, 0, _shls_slice, _ao_loc, NULL, _atm, natm.data()[0], _bas, nbas.data()[0], _env); + } + else if (which_integral.data()[0] == INT1E_KIN_IP){ + GTOint2c( + (int (*)(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache)) + int1e_ipkin_sph, out.data(), 3, 0, _shls_slice, _ao_loc, NULL, _atm, natm.data()[0], _bas, nbas.data()[0], _env); + } + else if (which_integral.data()[0] == INT1E_NUC_IP){ + GTOint2c( + (int (*)(dtype *out, FINT *dims, FINT *shls, FINT *atm, FINT natm, FINT *bas, FINT nbas, dtype *env, CINTOpt *opt, dtype *cache)) + int1e_ipnuc_sph, out.data(), 3, 0, _shls_slice, _ao_loc, NULL, _atm, natm.data()[0], _bas, nbas.data()[0], _env); + } + + + + return true; + } +}; + + + + + +class Int2e : public Vertex { +public: + //"mat", "shls_slice", "ao_loc", "atm", "bas", "env" + InOut> mat; + InOut> shls_slice; + InOut> ao_loc; + InOut> atm; + InOut> bas; + InOut> env; + Input> natm; + Input> nbas; + Input> which_integral; + Input> comp; + + Output> out; + + bool compute() { + float * _env = env.data(); + int *_bas = bas.data(); + int *_atm = atm.data(); + int *_shls_slice = shls_slice.data(); + int *_ao_loc = ao_loc.data(); + float * _mat = mat.data(); + + GTOnr2e_fill_drv( + (int (*)(...))int2e_sph, + (void (*)(...))GTOnr2e_fill_s1, + NULL, + out.data(), comp.data()[0], _shls_slice, _ao_loc, NULL, + _atm, natm.data()[0], + _bas, nbas.data()[0], + _env, which_integral.data()[0] + ); + + + return true; + } +}; diff --git a/pyscf_ipu/electron_repulsion/popcint/libcint.py b/pyscf_ipu/electron_repulsion/popcint/libcint.py new file mode 100644 index 0000000..266d468 --- /dev/null +++ b/pyscf_ipu/electron_repulsion/popcint/libcint.py @@ -0,0 +1,517 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. +# [x] Refactor into {def int2e_sph, def int1e_nuc, ...}. +# [ ] Add tile-mapping of integral computation (what is basic unit we tmap? ). +# [ ] Consider how to interface this code into nanoDFT. +# [ ] Remove hard-coding of tensor (i.e. move shape computation to python/jax.trace). +# [ ] Add direct matmul. +# [ ] For -all test, compile graph once, then do all tests (add more molecules for this as well). +import os +import pyscf +import numpy as np +import ctypes +import ctypes +import numpy +from pyscf import lib +from functools import partial +import os.path as osp +import jax +import jax.numpy as jnp +from tessellate_ipu import create_ipu_tile_primitive, ipu_cycle_count, tile_map, tile_put_sharded, tile_put_replicated +vertex_filename = osp.join(osp.dirname(__file__), "libcint.cpp") +int2e = create_ipu_tile_primitive( + "Int2e" , + "Int2e" , + inputs=["mat", "shls_slice", "ao_loc", "atm", "bas", "env", "natm", "nbas", "which_integral", "comp"], + outputs={"out": 0}, + gp_filename=vertex_filename, + perf_estimate=100, +) +grad = create_ipu_tile_primitive( + "Grad" , + "Grad" , + inputs=["mat", "shls_slice", "ao_loc", "atm", "bas", "env", "natm", "nbas", "which_integral"], + outputs={"out": 0}, + gp_filename=vertex_filename, + perf_estimate=100, +) + + +libcgto = numpy.ctypeslib.load_library("libcint.so", "") +float32 = "#define dtype float" in open("libcint.c", "r").read() + +ANG_OF = 1 +NPRIM_OF = 2 +NCTR_OF = 3 +KAPPA_OF = 4 +PTR_EXP = 5 +PTR_COEFF = 6 +BAS_SLOTS = 8 +NGRIDS = 11 +PTR_GRIDS = 12 + +INT1E_KIN = 0 +INT1E_NUC = 1 +INT1E_OVLP = 2 +INT1E_KIN_IP = 3 +INT1E_NUC_IP = 4 +INT1E_OVLP_IP = 5 +INT2E_SPH = 6 +INT2E_IP1_SPH = 7 + +def make_loc(bas, key): + if 'cart' in key: + l = bas[:,ANG_OF] + dims = (l+1)*(l+2)//2 * bas[:,NCTR_OF] + elif 'sph' in key: + dims = (bas[:,ANG_OF]*2+1) * bas[:,NCTR_OF] + else: # spinor + l = bas[:,ANG_OF] + k = bas[:,KAPPA_OF] + dims = (l*4+2) * bas[:,NCTR_OF] + dims[k<0] = (l[k<0] * 2 + 2) * bas[k<0,NCTR_OF] + dims[k>0] = (l[k>0] * 2 ) * bas[k>0,NCTR_OF] + + ao_loc = numpy.empty(len(dims)+1, dtype=numpy.int32) + ao_loc[0] = 0 + dims.cumsum(dtype=numpy.int32, out=ao_loc[1:]) + return ao_loc + + + +def ipu_make_loc(bas, key): + if 'cart' in key: + l = bas[:,ANG_OF] + dims = (l+1)*(l+2)//2 * bas[:,NCTR_OF] + elif 'sph' in key: + dims = (bas[:,ANG_OF]*2+1) * bas[:,NCTR_OF] + else: # spinor + l = bas[:,ANG_OF] + k = bas[:,KAPPA_OF] + dims = (l*4+2) * bas[:,NCTR_OF] + dims[k<0] = (l[k<0] * 2 + 2) * bas[k<0,NCTR_OF] + dims[k>0] = (l[k>0] * 2 ) * bas[k>0,NCTR_OF] + + #ao_loc = numpy.empty(len(dims)+1, dtype=numpy.int32) + ao_loc = np.arange(len(dims)+1, dtype=numpy.int32) + #ao_loc[0] = 0 + #dims.cumsum(dtype=numpy.int32, out=ao_loc[1:]) + #ao_loc = jnp.concatenate([jnp.zeros(1), jnp.cumsum(ao_loc[1:])]) + return ao_loc + +def getints2c(intor_name, N, atm, bas, env, shls_slice=None, comp=1, hermi=0, + ao_loc=None, cintopt=None, out=None): + natm = atm.shape[0] + nbas = bas.shape[0] + shls_slice = (0, nbas, 0, nbas) + ao_loc = make_loc(bas, intor_name) + + shape = (N, N, comp) + prefix = 'GTO' + + dtype = numpy.double + drv_name = prefix + 'int2c' + + #mat = numpy.ndarray(shape, dtype, out, order='F') + mat = numpy.zeros(shape, dtype=dtype, order="F")#, dtype, out, order='F') + cintopt = None + + # type + if float32: + mat = mat.astype(np.float32) + env = env.astype(np.float32) + + fn = getattr(libcgto, drv_name) + fn(getattr(libcgto, intor_name), mat.ctypes.data_as(ctypes.c_void_p), + ctypes.c_int(comp), ctypes.c_int(hermi), + (ctypes.c_int*4)(*(shls_slice[:4])), + ao_loc.ctypes.data_as(ctypes.c_void_p), cintopt, + atm.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(natm), + bas.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(nbas), + env.ctypes.data_as(ctypes.c_void_p)) + + mat = numpy.rollaxis(mat, -1, 0) + if comp == 1: + mat = mat[0] + return mat + +def cpu_intor1e(self, intor, N, comp=None, hermi=0, aosym='s1', out=None, shls_slice=None, grids=None): + return getints2c(intor+"_sph", N, self._atm, self._bas, self._env, shls_slice, comp, hermi, None, None, out) + +def ipu_intor1e(atm, bas, env, which_integral, N, comp=None, hermi=0, aosym='s1', out=None, shls_slice=None, grids=None): + #mat, shls_slice, ao_loc, atm, bas, env + if comp == 3 : intor = "int1e_ipnuc" + elif comp == 1: intor = "int1e_nuc" + + #if "ip" in intor: + #intor = "int1e_nuc" + + intor_name, N, shls_slice, comp, hermi, ao_loc, cintopt, out=\ + intor+"_sph", N, shls_slice, comp, hermi, None, None, out + + natm = atm.shape[0] + nbas = bas.shape[0] + shls_slice = (0, nbas, 0, nbas) + #ao_loc = ipu_make_loc(bas, "int1e_kin_sph") + + ao_loc = jnp.cumsum(jnp.concatenate([jnp.zeros(1), (bas[:,1]*2+1) * bas[:,3] ])).astype(np.int32) + + shape = (N, N, comp) + + dtype = numpy.double + + mat = numpy.ndarray(shape, dtype, out, order='F') + + # type + if float32: + mat = mat.astype(np.float32) + env = env.astype(np.float32) + + if comp == 3: + mat = np.transpose(np.zeros(shape), (2,0,1)) + else: + mat = np.zeros(shape) + + mat = tile_put_replicated(np.array(mat, dtype=jnp.float32), (1,)) + shls_slice = tile_put_replicated(np.array(shls_slice[:4], dtype=jnp.int32), (1,)) + ao_loc = tile_put_replicated(ao_loc.astype(jnp.int32), (1,)) + atm = tile_put_replicated(atm.astype(jnp.int32), (1,)) + bas = tile_put_replicated(bas.astype(jnp.int32), (1,)) + env = tile_put_replicated(env.astype(jnp.float32), (1,)) + natm = tile_put_replicated(np.array(natm, dtype=jnp.int32), (1,)) + nbas = tile_put_replicated(np.array(nbas, dtype=jnp.int32), (1,)) + + which_integral = tile_put_replicated(which_integral.astype(jnp.int32), (1,)) + + value = tile_map(grad, mat, shls_slice, ao_loc, atm, bas, env, natm, nbas, which_integral) + + result = value.array[0] + + return result + +def cpu_getints4c(intor_name, atm, bas, env, N, shls_slice=None, comp=1, + aosym='s1', ao_loc=None, cintopt=None, out=None, which_integral=-1): + c_atm = atm.ctypes.data_as(ctypes.c_void_p) + c_bas = bas.ctypes.data_as(ctypes.c_void_p) + natm = atm.shape[0] + nbas = bas.shape[0] + ao_loc = make_loc(bas, intor_name) + + shls_slice = (0, nbas, 0, nbas, 0, nbas, 0, nbas) + + shape = [comp, N, N, N, N] + + drv = libcgto.GTOnr2e_fill_drv + fill = getattr(libcgto, 'GTOnr2e_fill_'+aosym) + #out = numpy.ndarray(shape, buffer=out) + out = numpy.zeros(shape) + + # type + if float32: + out = out.astype(np.float32) + env = env.astype(np.float32) + + c_env = env.ctypes.data_as(ctypes.c_void_p) + + cintopt = None + prescreen = lib.c_null_ptr() + drv(getattr(libcgto, intor_name), fill, prescreen, + out.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(comp), + (ctypes.c_int*8)(*shls_slice), + ao_loc.ctypes.data_as(ctypes.c_void_p), cintopt, + c_atm, ctypes.c_int(natm), c_bas, ctypes.c_int(nbas), c_env, which_integral) + + if comp == 1: + out = out[0] + return out + + +def python_GTOnr2e_fill_drv(intor, shls_slice, prescreen, eri, ao_loc, + comp, cintopt, c_atm, natm, c_bas, nbas, c_env, which_integral): + ish0 = shls_slice[0] + ish1 = shls_slice[1] + jsh0 = shls_slice[2] + jsh1 = shls_slice[3] + nish = ish1 - ish0 + njsh = jsh1 - jsh0 + di = 1 # ...? + cache_size = 256 + buf = np.zeros(cache_size, dtype=np.float32).ctypes.data_as(ctypes.c_void_p) + ao_loc = ao_loc.ctypes.data_as(ctypes.c_void_p) + + for ij in range(nish*njsh): + i = ctypes.c_int(ij // njsh) + j = ctypes.c_int(ij % njsh) + libcgto.GTOnr2e_fill_s1(intor, prescreen, eri.ctypes.data_as(ctypes.c_void_p), buf, comp, i, j, + (ctypes.c_int*8)(*shls_slice), ao_loc, cintopt, c_atm, ctypes.c_int(natm), c_bas, ctypes.c_int(nbas), + c_env, which_integral) + + pass + +def cpu_tile_map_getints4c(intor_name, atm, bas, env, N, shls_slice=None, comp=1, + aosym='s1', ao_loc=None, cintopt=None, out=None, which_integral=-1): + # we can't tilemap on cpu, this code just helps debugging IPU tilemap code. + # this function is to above, but contains code for scheduling integrals in python. + c_atm = atm.ctypes.data_as(ctypes.c_void_p) + c_bas = bas.ctypes.data_as(ctypes.c_void_p) + natm = atm.shape[0] + nbas = bas.shape[0] + ao_loc = make_loc(bas, intor_name) + + shls_slice = (0, nbas, 0, nbas, 0, nbas, 0, nbas) + + shape = [comp, N, N, N, N] + + drv = libcgto.GTOnr2e_fill_drv + fill = getattr(libcgto, 'GTOnr2e_fill_'+aosym) + #out = numpy.ndarray(shape, buffer=out) + out = numpy.zeros(shape) + eri = numpy.zeros(shape) + + # type + if float32: + out = out.astype(np.float32) + eri = eri.astype(np.float32) + env = env.astype(np.float32) + + c_env = env.ctypes.data_as(ctypes.c_void_p) + + cintopt = None + prescreen = lib.c_null_ptr() + drv(getattr(libcgto, intor_name), fill, prescreen, + out.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(comp), + (ctypes.c_int*8)(*shls_slice), + ao_loc.ctypes.data_as(ctypes.c_void_p), cintopt, + c_atm, ctypes.c_int(natm), c_bas, ctypes.c_int(nbas), c_env, which_integral) + + + # preparing for tilemap by moving logic to python with C++/cpu backend. + python_GTOnr2e_fill_drv(getattr(libcgto, intor_name), shls_slice, prescreen, eri, ao_loc, + comp, cintopt, c_atm, natm, c_bas, nbas, c_env, which_integral) + + out = eri + + if comp == 1: + out = out[0] + return out + + +def cpu_intor2e(self, intor, N, comp=None, hermi=0, aosym='s1', out=None, shls_slice=None, grids=None, which_integral=-1, tile_map=False): + if tile_map: return cpu_tile_map_getints4c(intor, self._atm, self._bas, self._env, N, None, comp, "s1", None, None, None, which_integral) + else: return cpu_getints4c(intor, self._atm, self._bas, self._env, N, None, comp, "s1", None, None, None, which_integral) + +def ipu_getints4c(intor_name, atm, bas, env, N, shls_slice=None, comp=1, + aosym='s1', ao_loc=None, cintopt=None, out=None, which_integral=-1): + natm = atm.shape[0] + nbas = bas.shape[0] + + shls_slice = (0, nbas, 0, nbas, 0, nbas, 0, nbas) + + shape = [comp, N, N, N, N] + + drv = libcgto.GTOnr2e_fill_drv + fill = getattr(libcgto, 'GTOnr2e_fill_'+aosym) + out = numpy.ndarray(shape, buffer=out) + + # type + if float32: + out = out.astype(np.float32) + env = env.astype(np.float32) + + natm = atm.shape[0] + nbas = bas.shape[0] + + prefix = 'GTO' + + if float32: + out = out.astype(np.float32) + env = env.astype(np.float32) + + + out = tile_put_replicated(jnp.array(out, dtype=jnp.float32), (1,)) + shls_slice = tile_put_replicated(jnp.array(shls_slice, dtype=jnp.int32), (1,)) + ao_loc = tile_put_replicated(jnp.array(ao_loc, dtype=jnp.int32), (1,)) + atm = tile_put_replicated(jnp.array(atm, dtype=jnp.int32), (1,)) + bas = tile_put_replicated(jnp.array(bas, dtype=jnp.int32), (1,)) + env = tile_put_replicated(jnp.array(env, dtype=jnp.float32), (1,)) + natm = tile_put_replicated(jnp.array(natm, dtype=jnp.int32), (1,)) + nbas = tile_put_replicated(jnp.array(nbas, dtype=jnp.int32), (1,)) + comp = tile_put_replicated(jnp.array(comp, dtype=jnp.int32), (1,)) + + which_integral = tile_put_replicated(np.array(which_integral, dtype=jnp.int32), (1,)) + + value = tile_map(int2e, out, shls_slice, ao_loc, atm, bas, env, natm, nbas, which_integral, comp) + + out = value.array + + if comp == 1: + out = out[0] + return out + + + +def ipu_tile_map_getints4c(intor_name, atm, bas, env, N, shls_slice=None, comp=1, + aosym='s1', ao_loc=None, cintopt=None, out=None, which_integral=-1): + natm = atm.shape[0] + nbas = bas.shape[0] + + shls_slice = (0, nbas, 0, nbas, 0, nbas, 0, nbas) + + shape = [comp, N, N, N, N] + + drv = libcgto.GTOnr2e_fill_drv + fill = getattr(libcgto, 'GTOnr2e_fill_'+aosym) + out = numpy.ndarray(shape, buffer=out) + + # type + if float32: + out = out.astype(np.float32) + env = env.astype(np.float32) + + + natm = atm.shape[0] + nbas = bas.shape[0] + + prefix = 'GTO' + + if float32: + out = out.astype(np.float32) + env = env.astype(np.float32) + + + out = tile_put_replicated(jnp.array(out, dtype=jnp.float32), (1,)) + shls_slice = tile_put_replicated(jnp.array(shls_slice, dtype=jnp.int32), (1,)) + ao_loc = tile_put_replicated(jnp.array(ao_loc, dtype=jnp.int32), (1,)) + atm = tile_put_replicated(jnp.array(atm, dtype=jnp.int32), (1,)) + bas = tile_put_replicated(jnp.array(bas, dtype=jnp.int32), (1,)) + env = tile_put_replicated(jnp.array(env, dtype=jnp.float32), (1,)) + natm = tile_put_replicated(jnp.array(natm, dtype=jnp.int32), (1,)) + nbas = tile_put_replicated(jnp.array(nbas, dtype=jnp.int32), (1,)) + comp = tile_put_replicated(jnp.array(comp, dtype=jnp.int32), (1,)) + + which_integral = tile_put_replicated(np.array(which_integral, dtype=jnp.int32), (1,)) + + value = tile_map(int2e, out, shls_slice, ao_loc, atm, bas, env, natm, nbas, which_integral, comp) + + out = value.array + + if comp == 1: + out = out[0] + return out + + + +def ipu_intor2e(self, intor, N, comp=None, hermi=0, aosym='s1', out=None, shls_slice=None, grids=None, which_integral=-1, tile_map=False): + ao_loc = make_loc(mol._bas, intor) + if tile_map: + return np.asarray(jax.jit(ipu_tile_map_getints4c, static_argnums=(0,4,5,6,7,9,10,11)) + (intor, self._atm, self._bas, self._env, N, None, comp, "s1", ao_loc, None, None, which_integral)) + else: + return np.asarray(jax.jit(ipu_getints4c, static_argnums=(0,4,5,6,7,9,10,11)) + (intor, self._atm, self._bas, self._env, N, None, comp, "s1", ao_loc, None, None, which_integral)) + + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(prog='popcint', description='Libcint compiled to poplar. ') + parser.add_argument('-nuc', action="store_true") + parser.add_argument('-kin', action="store_true") + parser.add_argument('-ovlp', action="store_true") + parser.add_argument('-eri', action="store_true") + parser.add_argument('-nucgrad', action="store_true") + parser.add_argument('-kingrad', action="store_true") + parser.add_argument('-ovlpgrad', action="store_true") + parser.add_argument('-erigrad', action="store_true") + parser.add_argument('-all', action="store_true") + parser.add_argument('-tilemap', action="store_true") + parser.add_argument("-basis", type=str, default="sto3g") + parser.add_argument("-skipipu", action="store_true") + args = parser.parse_args() + + mol = pyscf.gto.Mole(atom="H 0 0 0; H 0 0 1; ", basis=args.basis) + mol.build() + N = mol.nao_nr() + print("[N=%i]"%N) + + #def ipu_intor1e(self, which_integral, N, comp=None, hermi=0, aosym='s1', out=None, shls_slice=None, grids=None): + #def ipu_intor1e(atm, bas, env, which_integral, N, comp=None, hermi=0, aosym='s1', out=None, shls_slice=None, grids=None): + ipu_intor1e = jax.jit(ipu_intor1e, backend="ipu", static_argnums=(4,5,6,7,8,9,10)) + + def test(truth, us, str): + error = np.max(us.reshape(-1)-truth.reshape(-1)) + print(str, error) + if error > 1e-6: + print(us.reshape(-1)) + print(truth.reshape(-1)) + + if args.nuc or args.all: + print("\n[Nuclear Integral]") + us = cpu_intor1e(mol, 'int1e_nuc', N, comp=1) + truth = mol.intor('int1e_nuc', comp=1) + test(us, truth, "CPU: \t") + if not args.skipipu: + us = np.asarray( ipu_intor1e(mol._atm, mol._bas, mol._env, INT1E_NUC, N, 1)) + test(us, truth, "IPU: \t") + + if args.kin or args.all: + print("\n[Kinetic Integral]") + us = cpu_intor1e(mol, 'int1e_kin', N, comp=1) + truth = mol.intor('int1e_kin', comp=1) + test(us, truth, "CPU: \t") + if not args.skipipu: + us = np.asarray( ipu_intor1e(mol._atm, mol._bas, mol._env, INT1E_KIN, N, 1)) + test(us, truth, "IPU: \t") + + if args.ovlp or args.all: + print("\n[Overlap Integral]") + us = cpu_intor1e(mol, 'int1e_ovlp', N, comp=1) + truth = mol.intor('int1e_ovlp', comp=1) + test(us, truth, "CPU: \t") + if not args.skipipu: + us = np.asarray( ipu_intor1e(mol._atm, mol._bas, mol._env, INT1E_OVLP, N, 1)) + test(us, truth, "IPU: \t") + + if args.nucgrad or args.all: + print("\n[Grad Nuclear]") + us = - cpu_intor1e(mol, 'int1e_ipnuc', N, comp=3) + truth = - mol.intor('int1e_ipnuc', comp=3) + test(us, truth, "CPU: \t") + if not args.skipipu: + us = - np.transpose(np.asarray( ipu_intor1e(mol._atm, mol._bas, mol._env, INT1E_NUC_IP, N, 3)), (0,2,1)) + test(us, truth, "IPU: \t") + + if args.kingrad or args.all: + print("\n[Grad Kinetic]") + us = - cpu_intor1e(mol, 'int1e_ipkin', N, comp=3) + truth = - mol.intor('int1e_ipkin', comp=3) + test(us, truth, "CPU: \t") + if not args.skipipu: + us = - np.transpose(np.asarray( ipu_intor1e(mol._atm, mol._bas, mol._env, INT1E_KIN_IP, N, 3)), (0,2,1)) + test(us, truth, "IPU: \t") + + if args.ovlpgrad or args.all: + print("\n[Grad Overlap]") + us = - cpu_intor1e(mol, 'int1e_ipovlp', N, comp=3) + truth = - mol.intor('int1e_ipovlp', comp=3) + test(us, truth, "CPU: \t") + if not args.skipipu: + us = - np.transpose(np.asarray( ipu_intor1e(mol._atm, mol._bas, mol._env, INT1E_OVLP_IP, N, 3)), (0,2,1)) + test(us, truth, "IPU: \t") + + if args.eri or args.all: + print("\n[Electron Repulsion Integral]") + truth = mol.intor("int2e_sph") + us = cpu_intor2e(mol, "int2e_sph", N, 1, which_integral=INT2E_SPH, tile_map=args.tilemap) + test(us, truth, "CPU: \t") + if not args.skipipu: + us = ipu_intor2e(mol, "int2e_sph", N, 1, which_integral=INT2E_SPH, tile_map=args.tilemap) + test(us, truth, "IPU: \t") + + if args.erigrad or args.all: + print("\n[Grad of Electron Repulsion Integral]") + truth = mol.intor("int2e_ip1_sph") + us = cpu_intor2e(mol, "int2e_ip1_sph", N, 3, which_integral=INT2E_IP1_SPH, tile_map=args.tilemap) + test(us, truth, "CPU: \t") + if not args.skipipu: + us = ipu_intor2e(mol, "int2e_ip1_sph", N, 3, which_integral=INT2E_IP1_SPH, tile_map=args.tilemap) + test(us, truth, "IPU: \t") \ No newline at end of file diff --git a/pyscf_ipu/electron_repulsion/popcint/libcint.sh b/pyscf_ipu/electron_repulsion/popcint/libcint.sh new file mode 100755 index 0000000..e0cd425 --- /dev/null +++ b/pyscf_ipu/electron_repulsion/popcint/libcint.sh @@ -0,0 +1,7 @@ +clear +rm libcint.so + +g++ libcint.c -shared -fpic -o libcint.so -lpoplar -lpoputil -fpermissive +echo "Done compiling. Calling C code from python. " + +XLA_IPU_PLATFORM_DEVICE_COUNT=1 TF_POPLAR_FLAGS=--show_progress_bar=true python libcint.py $@ \ No newline at end of file diff --git a/pyscf_ipu/electron_repulsion/popcint/readme.MD b/pyscf_ipu/electron_repulsion/popcint/readme.MD new file mode 100644 index 0000000..c9a4f24 --- /dev/null +++ b/pyscf_ipu/electron_repulsion/popcint/readme.MD @@ -0,0 +1,87 @@ +# popcint +Libcint (manually) compiled to IPU implementing + +``` +import pyscf +mol = pyscf.gto.Mole([["H", (0,0,0)], ["H", (0,0,1)]], basis="sto3g") +mol.build() +mol.intor("int1e_nuc") # nuclear integral +mol.intor("int1e_kin") # kinetic integral +mol.intor("int1e_ovlp") # overlap integral + +mol.intor("int1e_ipnuc") # gradient of nuclear integral +mol.intor("int1e_ipkin") # gradient of kinetic integral +mol.intor("int1e_ipovlp") # gradient of overlap integral + +mol.intor("int2e_sph") # electron repulsion integral +mol.intor("int2e_ip1_sph") # gradient (ip1) of electron repulsion integral +``` + +You can test all integrals with `./cpp_libcint.sh -all`. The C++ plumbing to run all integrals is in place and all (but kinetic) pass a simple H2 test-case in STO3G (this compiles and runs libcint.c both with CPU/G++ and IPU/tesselate). + +``` +> ./cpp_libcint.sh -all + +Compiling with C++ +Done compiling. Calling C code from python. +[N=2] + +[Nuclear Integral] +CPU: 2.763163926555734e-07 +Compiling module jit_ipu_intor1e.0: +[##################################################] 100% Compilation Finished [Elapsed: 00:00:15.6] +IPU: 2.763163926555734e-07 + +[Kinetic Integral] +CPU: -1.8022852765753328e-08 +Compiling module jit_ipu_intor1e.1: +[##################################################] 100% Compilation Finished [Elapsed: 00:00:15.9] +IPU: -1.05722721688295e-08 + +[Overlap Integral] +CPU: -1.2445099606406274e-07 +Compiling module jit_ipu_intor1e.2: +[##################################################] 100% Compilation Finished [Elapsed: 00:00:16.0] +IPU: -6.484635128867211e-08 + +[Grad Nuclear] +CPU: 7.246001532124069e-08 +Compiling module jit_ipu_intor1e.3: +[##################################################] 100% Compilation Finished [Elapsed: 00:00:15.8] +IPU: 7.246001532124069e-08 + +[Grad Kinetic] +CPU: 0.22741775584087665 +[ 0. -0. -0. 0. 0. -0. + -0. 0. 0. 0.19630939 -0.19630939 0. ] +[-0.0000000e+00 5.6303712e-04 -5.6303712e-04 -0.0000000e+00 + -1.4645594e-01 2.4947241e-02 -2.2242269e-02 1.6426709e-01 + -0.0000000e+00 -3.1108368e-02 -1.6386819e-01 9.0011621e-01] +Compiling module jit_ipu_intor1e.4: +[##################################################] 100% Compilation Finished [Elapsed: 00:00:15.8] +T[1.2]: inside CINTset_pairdata +T[1.2]: inside CINTset_pairdata +IPU: 0.1963094174861908 +[ 0. -0. -0. 0. 0. -0. + -0. 0. 0. 0.19630939 -0.19630939 0. ] +[-0. -0. -0. -0. -0. -0. + -0. -0. -0.19630942 -0. -0. -0. ] + +[Grad Overlap] +CPU: 6.077975783780332e-08 +Compiling module jit_ipu_intor1e.5: +[##################################################] 100% Compilation Finished [Elapsed: 00:00:15.5] +IPU: 6.077975783780332e-08 + +[Electron Repulsion Integral] +CPU: -4.443460513425812e-08 +Compiling module jit_ipu_getints4c.6: +[##################################################] 100% Compilation Finished [Elapsed: 00:00:15.8] +IPU: -2.953344391265489e-08 + +[Grad of Electron Repulsion Integral] +CPU: 1.341920186359591e-07 +Compiling module jit_ipu_getints4c.7: +[##################################################] 100% Compilation Finished [Elapsed: 00:00:15.6] +IPU: 1.1929085744211143e-07 +``` diff --git a/pyscf_ipu/exchange_correlation/__init__.py b/pyscf_ipu/exchange_correlation/__init__.py index e69de29..3fa68fc 100644 --- a/pyscf_ipu/exchange_correlation/__init__.py +++ b/pyscf_ipu/exchange_correlation/__init__.py @@ -0,0 +1 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. \ No newline at end of file diff --git a/pyscf_ipu/exchange_correlation/b88.py b/pyscf_ipu/exchange_correlation/b88.py index b37e69c..8775adf 100644 --- a/pyscf_ipu/exchange_correlation/b88.py +++ b/pyscf_ipu/exchange_correlation/b88.py @@ -1,3 +1,4 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. # The functional definition in this file was ported to Python # from XCFun, which is Copyright Ulf Ekström and contributors 2009-2020 # and provided under the Mozilla Public License (v2.0) diff --git a/pyscf_ipu/exchange_correlation/lyp.py b/pyscf_ipu/exchange_correlation/lyp.py index fec0063..464dfd4 100644 --- a/pyscf_ipu/exchange_correlation/lyp.py +++ b/pyscf_ipu/exchange_correlation/lyp.py @@ -1,3 +1,4 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. # The functional definition in this file was ported to Python # from XCFun, which is Copyright Ulf Ekström and contributors 2009-2020 # and provided under the Mozilla Public License (v2.0) diff --git a/pyscf_ipu/exchange_correlation/vwn.py b/pyscf_ipu/exchange_correlation/vwn.py index 308b9ac..5c96e79 100644 --- a/pyscf_ipu/exchange_correlation/vwn.py +++ b/pyscf_ipu/exchange_correlation/vwn.py @@ -1,3 +1,4 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. # The functional definition in this file was ported to Python # from XCFun, which is Copyright Ulf Ekström and contributors 2009-2020 # and provided under the Mozilla Public License (v2.0) diff --git a/pyscf_ipu/experimental/basis.py b/pyscf_ipu/experimental/basis.py index eb7ebad..7ff73b6 100644 --- a/pyscf_ipu/experimental/basis.py +++ b/pyscf_ipu/experimental/basis.py @@ -3,6 +3,7 @@ import chex import jax.numpy as jnp +import numpy as np from .orbital import Orbital from .structure import Structure @@ -61,9 +62,9 @@ def basisset(structure: Structure, basis_name: str = "sto-3g"): for lmn in LMN_MAP[s["angular_momentum"][0]]: ao = Orbital.from_bse( center=center, - alphas=jnp.array(s["exponents"], dtype=float), - lmn=jnp.array(lmn, dtype=jnp.int32), - coefficients=jnp.array(s["coefficients"], dtype=float), + alphas=np.array(s["exponents"], dtype=np.float32), + lmn=np.array(lmn, dtype=np.int32), + coefficients=np.array(s["coefficients"], dtype=np.float32), ) orbitals.append(ao) diff --git a/pyscf_ipu/experimental/binom_factor_table.py b/pyscf_ipu/experimental/binom_factor_table.py new file mode 100644 index 0000000..6f4041f --- /dev/null +++ b/pyscf_ipu/experimental/binom_factor_table.py @@ -0,0 +1,51 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. +# AUTOGENERATED from notebooks/binom_factor_table.ipynb +# fmt: off +# flake8: noqa +# isort: skip_file +from numpy import array +binom_factor_table = ((array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]), array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 1, 1, 1, 1, 1, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]), array([0, 0, 1, 0, 1, 2, 0, 1, 2, 3, 0, 0, 1, 1, 0, 1, 1, 2, 2, 0, 1, 1, + 2, 2, 3, 3, 0, 1, 1, 2, 2, 3, 3, 4, 4, 0, 1, 0, 1, 1, 2, 2, 0, 1, + 1, 2, 2, 2, 3, 3, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 0, 1, 1, 2, 2, + 2, 3, 3, 3, 4, 4, 4, 0, 1, 2, 0, 1, 1, 2, 2, 3, 3, 0, 1, 1, 2, 2, + 2, 3, 3, 3, 4, 4, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 0, 1, 1, + 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 0, 1, 2, 3, 0, 1, 1, 2, 2, 3, 3, + 4, 4, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 0, 1, 1, 2, 2, 2, 3, 3, + 3, 3, 4, 4, 4, 4, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4]), array([ 4, 21, 4, 11, 21, 4, 2, 11, 21, 4, 15, 3, 4, 15, 1, 3, 21, + 4, 15, 17, 1, 11, 3, 21, 4, 15, 19, 2, 17, 1, 11, 3, 21, 4, + 15, 22, 15, 10, 3, 22, 4, 15, 23, 1, 10, 3, 21, 22, 4, 15, 9, + 17, 23, 1, 10, 11, 3, 21, 22, 4, 15, 12, 9, 19, 2, 17, 23, 1, + 10, 11, 3, 21, 22, 13, 22, 15, 14, 10, 13, 3, 22, 4, 15, 5, 14, + 23, 1, 10, 13, 3, 21, 22, 4, 15, 16, 5, 9, 14, 17, 23, 1, 10, + 11, 13, 3, 21, 22, 18, 12, 16, 5, 9, 19, 2, 14, 17, 23, 1, 10, + 11, 13, 7, 13, 22, 15, 24, 7, 14, 10, 13, 3, 22, 4, 15, 20, 5, + 24, 7, 14, 23, 1, 10, 13, 3, 21, 22, 6, 16, 20, 5, 9, 24, 7, + 14, 17, 23, 1, 10, 11, 13, 8, 6, 18, 12, 16, 20, 5, 9, 19, 24, + 2, 7, 14, 17, 23])), array([ 1., 1., 2., 1., 3., 3., 1., 4., 6., 4., 1., 1., 1., + 1., 1., 2., 1., 2., 1., 1., 3., 1., 3., 3., 3., 1., + 1., 1., 4., 6., 4., 4., 6., 4., 1., 1., 2., 1., 2., + 1., 1., 2., 1., 2., 2., 4., 1., 1., 2., 2., 1., 2., + 3., 6., 3., 1., 6., 3., 1., 3., 2., 1., 4., 2., 1., + 8., 6., 12., 4., 4., 8., 6., 1., 1., 3., 3., 1., 3., + 1., 3., 3., 1., 3., 1., 2., 3., 3., 6., 1., 6., 1., + 3., 2., 3., 1., 3., 3., 3., 3., 9., 9., 9., 1., 1., + 9., 3., 3., 1., 3., 4., 6., 12., 3., 1., 4., 12., 18., + 18., 12., 4., 1., 1., 4., 6., 4., 1., 1., 4., 6., 4., + 4., 6., 1., 4., 1., 4., 2., 1., 8., 6., 4., 12., 4., + 8., 1., 6., 1., 4., 3., 12., 6., 3., 1., 12., 4., 18., + 12., 18., 1., 4., 1., 4., 4., 6., 16., 6., 24., 24., 4., + 4., 1., 1., 16., 16., 36.])) diff --git a/pyscf_ipu/experimental/device.py b/pyscf_ipu/experimental/device.py index 110928a..31a10fe 100644 --- a/pyscf_ipu/experimental/device.py +++ b/pyscf_ipu/experimental/device.py @@ -1,5 +1,6 @@ # Copyright (c) 2023 Graphcore Ltd. All rights reserved. from functools import partial, wraps + import numpy as np from jax import devices, jit diff --git a/pyscf_ipu/experimental/integrals.py b/pyscf_ipu/experimental/integrals.py index e3e0613..32ddac8 100644 --- a/pyscf_ipu/experimental/integrals.py +++ b/pyscf_ipu/experimental/integrals.py @@ -6,89 +6,47 @@ import jax.numpy as jnp import numpy as np -from jax import lax, vmap, jit, tree_map +from jax import jit, tree_map, vmap from jax.ops import segment_sum -from jax.scipy.special import gammainc, gammaln from .basis import Basis from .orbital import batch_orbitals from .primitive import Primitive, product -from .types import IntN, FloatN, FloatNxN, Float3, FloatNx3 +from .special import binom, binom_factor, factorial, factorial2, gammanu +from .types import Float3, FloatN, FloatNx3, FloatNxN +from .units import LMAX -# Maximum value an individual component of the angular momentum lmn can take -# Used for static ahead-of-time compilation of functions involving lmn. -LMAX = 4 - -""" -Special functions used in integral evaluation """ +JAX implementation for integrals over Gaussian basis functions. Based upon the +closed-form expressions derived in + Taketa, H., Huzinaga, S., & O-ohata, K. (1966). Gaussian-expansion methods for + molecular integrals. Journal of the physical society of Japan, 21(11), 2313-2324. + -def factorial(n: IntN, nmax: int = LMAX) -> IntN: - def body_fun(i, val): - return val * jnp.where(i <= n, i, 1) - - return lax.fori_loop(1, nmax + 1, body_fun, jnp.ones_like(n)) - - -def factorial2(n: IntN, nmax: int = 2 * LMAX) -> IntN: - def body_fun(i, val): - return val * jnp.where((i <= n) & (n % 2 == i % 2), i, 1) - - return lax.fori_loop(1, nmax + 1, body_fun, jnp.ones_like(n)) - - -def binom(x: IntN, y: IntN, nmax: int = LMAX) -> IntN: - bang = partial(factorial, nmax=nmax) - c = x * bang(x - 1) / (bang(y) * bang(x - y)) - return jnp.where(x == y, 1, c) - - -def gammanu(nu: IntN, t: FloatN, epsilon: float = 1e-10) -> FloatN: - """ - eq 2.11 from THO but simplified using SymPy and converted to jax - - t, u = symbols("t u", real=True, positive=True) - nu = Symbol("nu", integer=True, nonnegative=True) - - expr = simplify(integrate(u ** (2 * nu) * exp(-t * u**2), (u, 0, 1))) - f = lambdify((nu, t), expr, modules="scipy") - ?f - - We evaulate this in log-space to avoid overflow/nan - """ - t = jnp.maximum(t, epsilon) - x = nu + 0.5 - gn = jnp.log(0.5) - x * jnp.log(t) + jnp.log(gammainc(x, t)) + gammaln(x) - return jnp.exp(gn) +Hereafter referred to as the "THO paper" +Related work: -@partial(vmap, in_axes=(0, None, None, None, None)) -def binom_factor(s: IntN, i: int, j: int, pa: float, pb: float): - """ - Eq. 15 from Augspurger JD, Dykstra CE. General quantum mechanical operators. An +[1] Augspurger JD, Dykstra CE. General quantum mechanical operators. An open-ended approach for one-electron integrals with Gaussian bases. Journal of computational chemistry. 1990 Jan;11(1):105-11. - """ - - def term(t): - return binom(i, s - t) * binom(j, t) * pa ** (i - s + t) * pb ** (j - t) - def body_fun(t, val): - mask = (t <= s) & (t >= (s - i)) & (t <= j) - return val + jnp.where(mask, term(t), 0.0) - - return lax.fori_loop(0, LMAX + 1, body_fun, 0.0) +[2] PyQuante: +""" @partial(vmap, in_axes=(0, 0, 0, 0, None)) -def overlap_axis(i: int, j: int, pa: int, pb: int, alpha: float) -> float: - ii = jnp.arange(LMAX + 1) - out = binom_factor(2 * ii, i, j, pa, pb) - out *= factorial2(2 * ii - 1) / (2 * alpha) ** ii - mask = ii <= jnp.floor_divide(i + j, 2) - out = jnp.where(mask, out, 0.0) +def overlap_axis(i: int, j: int, a: float, b: float, alpha: float) -> float: + idx = [(s, t) for s in range(LMAX + 1) for t in range(2 * s + 1)] + s, t = jnp.array(idx, dtype=jnp.uint32).T + out = binom(i, 2 * s - t) * binom(j, t) + out *= a ** (i - (2 * s - t)) * b ** (j - t) + out *= factorial2(2 * s - 1) / (2 * alpha) ** s + + mask = (2 * s - i <= t) & (t <= j) + out = jnp.where(mask, out, 0) return jnp.sum(out) @@ -167,7 +125,7 @@ def g_term(l1, l2, pa, pb, cp): index = i - 2 * r - u g = ( jnp.power(-1, i + u) - * binom_factor(i, l1, l2, pa, pb) + * jnp.take(binom_factor(l1, l2, pa, pb), i) * factorial(i) * jnp.power(cp, index - u) * jnp.power(epsilon, r + u) @@ -239,7 +197,7 @@ def H(l1, l2, a, b, i, r, gamma): # Note this should match THO Eq 3.5 but that seems to incorrectly show a # 1/(4 gamma) ^(i- 2r) term which is inconsistent with Eq 2.22. # Using (4 gamma)^(r - i) matches the reported expressions for H_L - u = factorial(i) * binom_factor(i, l1, l2, a, b) + u = factorial(i) * jnp.take(binom_factor(l1, l2, a, b, 2 * LMAX), i) v = factorial(r) * factorial(i - 2 * r) * (4 * gamma) ** (i - r) return u / v @@ -257,6 +215,7 @@ def c_term(la, lb, lc, ld, pa, pb, qc, qd, qp): return segment_sum(c, index, num_segments=4 * LMAX + 1) # Manual vmap over cartesian axes (x, y, z) as ran into possible bug. + # See https://github.com/graphcore-research/pyscf-ipu/issues/105 args = [a.lmn, b.lmn, c.lmn, d.lmn, pa, pb, qc, qd, qp] Ci, Cj, Ck = [c_term(*[v.at[i].get() for v in args]) for i in range(3)] @@ -320,7 +279,7 @@ def eri_basis_sparse(b: Basis): tree_map(lambda x: jnp.take(x, idx, axis=0), primitives) for idx in indices ] eris = cijkl * vmap_eri_primitives(*pijkl) - return segment_sum(eris, batch) + return segment_sum(eris, batch, num_segments=count + 1) def eri_basis(b: Basis): diff --git a/pyscf_ipu/experimental/interop.py b/pyscf_ipu/experimental/interop.py new file mode 100644 index 0000000..0b57574 --- /dev/null +++ b/pyscf_ipu/experimental/interop.py @@ -0,0 +1,42 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. +from typing import Tuple + +import numpy as np +from periodictable import elements +from pyscf import gto + +from .basis import Basis, basisset +from .structure import Structure + + +def to_pyscf( + structure: Structure, basis_name: str = "sto-3g", unit: str = "Bohr" +) -> "gto.Mole": + mol = gto.Mole(unit=unit, spin=structure.num_electrons % 2, cart=True) + mol.atom = [ + (symbol, pos) + for symbol, pos in zip(structure.atomic_symbol, structure.position) + ] + mol.basis = basis_name + mol.build(unit=unit) + return mol + + +def from_pyscf(mol: "gto.Mole") -> Tuple[Structure, Basis]: + atomic_number = [] + position = [] + + for i in range(mol.natm): + sym, pos = mol.atom[i] + atomic_number.append(elements.symbol(sym).number) + position.append(pos) + + structure = Structure( + atomic_number=np.array(atomic_number), + position=np.array(position), + is_bohr=mol.unit != "Angstom", + ) + + basis = basisset(structure, basis_name=mol.basis) + + return structure, basis diff --git a/pyscf_ipu/experimental/mesh.py b/pyscf_ipu/experimental/mesh.py index 3af7cdc..aa2c917 100644 --- a/pyscf_ipu/experimental/mesh.py +++ b/pyscf_ipu/experimental/mesh.py @@ -1,8 +1,10 @@ # Copyright (c) 2023 Graphcore Ltd. All rights reserved. -from typing import Union, Tuple, Optional +from typing import Optional, Tuple, Union + import jax.numpy as jnp + from .basis import Basis -from .types import FloatNx3, FloatN, FloatNxN +from .types import FloatN, FloatNx3, FloatNxN def uniform_mesh( @@ -26,13 +28,20 @@ def uniform_mesh( axes = [jnp.linspace(-bi, bi, ni) for bi, ni in zip(b, n)] mesh = jnp.stack(jnp.meshgrid(*axes, indexing="ij"), axis=-1) mesh = mesh.reshape(-1, ndim) - return mesh + return mesh, axes def electron_density( basis: Basis, mesh: FloatNx3, C: Optional[FloatNxN] = None ) -> FloatN: - C = jnp.eye(basis.num_orbitals) if C is None else C - orbitals = basis(mesh) @ C + orbitals = molecular_orbitals(basis, mesh, C) density = jnp.sum(basis.occupancy * orbitals * orbitals, axis=-1) return density + + +def molecular_orbitals( + basis: Basis, mesh: FloatNx3, C: Optional[FloatNxN] = None +) -> FloatN: + C = jnp.eye(basis.num_orbitals) if C is None else C + orbitals = basis(mesh) @ C + return orbitals diff --git a/pyscf_ipu/experimental/numerics.py b/pyscf_ipu/experimental/numerics.py new file mode 100644 index 0000000..066e159 --- /dev/null +++ b/pyscf_ipu/experimental/numerics.py @@ -0,0 +1,47 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. +from functools import wraps +from typing import Callable + +import jax.numpy as jnp +import numpy as np +from jax.experimental import enable_x64 +from jaxtyping import Array + + +def apply_fpcast(v: Array, dtype: np.dtype): + if isinstance(v, jnp.ndarray) and np.issubdtype(v, np.floating): + return v.astype(dtype) + + return v + + +def fpcast(func: Callable, dtype=jnp.float32): + @wraps(func) + def wrapper(*args, **kwargs): + inputs = [apply_fpcast(v, dtype) for v in args] + outputs = func(*inputs, **kwargs) + return outputs + + return wrapper + + +def compare_fp32_to_fp64(func: Callable): + @wraps(func) + def wrapper(*args, **kwargs): + with enable_x64(): + outputs_fp32 = fpcast(func, dtype=jnp.float32)(*args, **kwargs) + outputs_fp64 = fpcast(func, dtype=jnp.float64)(*args, **kwargs) + print_compare(func.__name__, outputs_fp32, outputs_fp64) + return outputs_fp32 + + return wrapper + + +def print_compare(name: str, fp32, fp64): + fp32 = [fp32] if isinstance(fp32, jnp.ndarray) else fp32 + fp64 = [fp64] if isinstance(fp64, jnp.ndarray) else fp64 + + for idx, (low, high) in enumerate(zip(fp32, fp64)): + low = np.asarray(low).astype(np.float64) + high = np.asarray(high) + print(f"{name} output {idx} has max |fp64 - fp32| = {np.abs(high - low).max()}") diff --git a/pyscf_ipu/experimental/orbital.py b/pyscf_ipu/experimental/orbital.py index 2cb4340..285fea9 100644 --- a/pyscf_ipu/experimental/orbital.py +++ b/pyscf_ipu/experimental/orbital.py @@ -1,7 +1,7 @@ # Copyright (c) 2023 Graphcore Ltd. All rights reserved. -from typing import Tuple from functools import partial +from typing import Tuple import chex import jax.numpy as jnp diff --git a/pyscf_ipu/experimental/plot.py b/pyscf_ipu/experimental/plot.py new file mode 100644 index 0000000..adb1cd6 --- /dev/null +++ b/pyscf_ipu/experimental/plot.py @@ -0,0 +1,79 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. +import numpy as np +from numpy.typing import NDArray + +from .structure import Structure +from .types import MeshAxes +from .units import to_angstrom + + +def plot_volume(structure: Structure, value: NDArray, axes: MeshAxes): + """plots volumetric data value with molecular structure. + + Args: + structure (Structure): molecular structure + value (NDArray): the volume data to render + axes (MeshAxes): the axes over which the data was sampled. + + Returns: + py3DMol View object + """ + v = structure.view() + v.addVolumetricData(cube_data(value, axes), "cube", build_transferfn(value)) + return v + + +def cube_data(value: NDArray, axes: MeshAxes) -> str: + """Generate the cube file format as a string. See: + + https://paulbourke.net/dataformats/cube/ + + Args: + value (NDArray): the volume data to serialise in the cube format + axes (MeshAxes): the axes over which the data was sampled + + Returns: + str: cube format representation of the volumetric data. + """ + axes = [to_angstrom(ax) for ax in axes] + fmt = "cube format\n\n" + x, y, z = axes + nx, ny, nz = [ax.shape[0] for ax in axes] + fmt += "0 " + " ".join([f"{v:12.6f}" for v in [x[0], y[0], z[0]]]) + "\n" + fmt += f"{nx} " + " ".join([f"{v:12.6f}" for v in [x[1] - x[0], 0.0, 0.0]]) + "\n" + fmt += f"{ny} " + " ".join([f"{v:12.6f}" for v in [0.0, y[1] - y[0], 0.0]]) + "\n" + fmt += f"{nz} " + " ".join([f"{v:12.6f}" for v in [0.0, 0.0, z[1] - z[0]]]) + "\n" + + line = "" + for i in range(len(value)): + line += f"{value[i]:12.6f}" + + if i % 6 == 0: + fmt += line + "\n" + line = "" + + return fmt + + +def build_transferfn(value: NDArray) -> dict: + """Generate the 3dmol.js transferfn argument for a particular value. + + Tries to set isovalues to capture main features of the volume data. + + Args: + value (NDArray): the volume data. + + Returns: + dict: containing transferfn + """ + v = np.percentile(value, [99.9, 75]) + a = [0.02, 0.0005] + return { + "transferfn": [ + {"color": "blue", "opacity": a[0], "value": -v[0]}, + {"color": "blue", "opacity": a[1], "value": -v[1]}, + {"color": "white", "opacity": 0.0, "value": 0.0}, + {"color": "red", "opacity": a[1], "value": v[1]}, + {"color": "red", "opacity": a[0], "value": v[0]}, + ] + } diff --git a/pyscf_ipu/experimental/primitive.py b/pyscf_ipu/experimental/primitive.py index 283ac9e..1113b5a 100644 --- a/pyscf_ipu/experimental/primitive.py +++ b/pyscf_ipu/experimental/primitive.py @@ -3,16 +3,17 @@ import chex import jax.numpy as jnp -from jax.scipy.special import gammaln +import numpy as np +from scipy.special import gammaln from .types import Float3, FloatN, FloatNx3, Int3 @chex.dataclass class Primitive: - center: Float3 = jnp.zeros(3, dtype=jnp.float32) + center: Float3 = np.zeros(3, dtype=np.float32) alpha: float = 1.0 - lmn: Int3 = jnp.zeros(3, dtype=jnp.int32) + lmn: Int3 = np.zeros(3, dtype=np.int32) norm: Optional[float] = None def __post_init__(self): @@ -21,16 +22,16 @@ def __post_init__(self): @property def angular_momentum(self) -> int: - return jnp.sum(self.lmn) + return np.sum(self.lmn) def __call__(self, pos: FloatNx3) -> FloatN: return eval_primitive(self, pos) def normalize(lmn: Int3, alpha: float) -> float: - L = jnp.sum(lmn) + L = np.sum(lmn) N = ((1 / 2) / alpha) ** (L + 3 / 2) - N *= jnp.exp(jnp.sum(gammaln(lmn + 1 / 2))) + N *= np.exp(np.sum(gammaln(lmn + 1 / 2))) return N**-0.5 diff --git a/pyscf_ipu/experimental/special.py b/pyscf_ipu/experimental/special.py new file mode 100644 index 0000000..65fbc85 --- /dev/null +++ b/pyscf_ipu/experimental/special.py @@ -0,0 +1,129 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. +from functools import partial + +import jax.numpy as jnp +import numpy as np +from jax import lax +from jax.ops import segment_sum +from jax.scipy.special import betaln, gammainc, gammaln + +from .types import FloatN, IntN +from .units import LMAX + + +def factorial_fori(n: IntN, nmax: int = LMAX) -> IntN: + def body_fun(i, val): + return val * jnp.where(i <= n, i, 1) + + return lax.fori_loop(1, nmax + 1, body_fun, jnp.ones_like(n)) + + +def factorial_gamma(n: IntN) -> IntN: + """Appoximate factorial by evaluating the gamma function in log-space. + + This approximation is exact for small integers (n < 10). + """ + approx = jnp.exp(gammaln(n + 1)) + return jnp.rint(approx) + + +def factorial_lookup(n: IntN, nmax: int = LMAX) -> IntN: + N = np.cumprod(np.arange(1, nmax + 1)) + N = np.insert(N, 0, 1) + N = jnp.array(N, dtype=jnp.uint32) + return N.at[n.astype(jnp.uint32)].get() + + +factorial = factorial_gamma + + +def factorial2_fori(n: IntN, nmax: int = 2 * LMAX) -> IntN: + def body_fun(i, val): + return val * jnp.where((i <= n) & (n % 2 == i % 2), i, 1) + + return lax.fori_loop(1, nmax + 1, body_fun, jnp.ones_like(n)) + + +def factorial2_lookup(n: IntN, nmax: int = 2 * LMAX) -> IntN: + stop = nmax + 1 if nmax % 2 == 0 else nmax + 2 + N = np.arange(1, stop).reshape(-1, 2) + N = np.cumprod(N, axis=0).reshape(-1) + N = np.insert(N, 0, 1) + N = jnp.array(N) + n = jnp.maximum(n, 0) + return N.at[n].get() + + +factorial2 = factorial2_lookup + + +def binom_beta(x: IntN, y: IntN) -> IntN: + approx = 1.0 / ((x + 1) * jnp.exp(betaln(x - y + 1, y + 1))) + return jnp.rint(approx) + + +def binom_fori(x: IntN, y: IntN, nmax: int = LMAX) -> IntN: + bang = partial(factorial_fori, nmax=nmax) + c = x * bang(x - 1) / (bang(y) * bang(x - y)) + return jnp.where(x == y, 1, c) + + +def binom_lookup(x: IntN, y: IntN, nmax: int = LMAX) -> IntN: + bang = partial(factorial_lookup, nmax=nmax) + c = x * bang(x - 1) / (bang(y) * bang(x - y)) + return jnp.where(x == y, 1, c) + + +binom = binom_lookup + + +def gammanu_gamma(nu: IntN, t: FloatN, epsilon: float = 1e-10) -> FloatN: + """ + eq 2.11 from THO but simplified using SymPy and converted to jax + + t, u = symbols("t u", real=True, positive=True) + nu = Symbol("nu", integer=True, nonnegative=True) + + expr = simplify(integrate(u ** (2 * nu) * exp(-t * u**2), (u, 0, 1))) + f = lambdify((nu, t), expr, modules="scipy") + ?f + + We evaulate this in log-space to avoid overflow/nan + """ + t = jnp.maximum(t, epsilon) + x = nu + 0.5 + gn = jnp.log(0.5) - x * jnp.log(t) + jnp.log(gammainc(x, t)) + gammaln(x) + return jnp.exp(gn) + + +def gammanu_series(nu: IntN, t: FloatN, num_terms: int = 128) -> FloatN: + """ + eq 2.11 from THO but simplified as derived in equation 19 of gammanu.ipynb + """ + an = nu + 0.5 + tn = 1 / an + total = jnp.full_like(nu, tn, dtype=jnp.float32) + + for _ in range(num_terms): + an = an + 1 + tn = tn * t / an + total = total + tn + + return jnp.exp(-t) / 2 * total + + +gammanu = gammanu_series + + +def binom_factor(i: int, j: int, a: float, b: float, lmax: int = LMAX) -> FloatN: + """ + Eq. 15 from Augspurger JD, Dykstra CE. General quantum mechanical operators. An + open-ended approach for one-electron integrals with Gaussian bases. Journal of + computational chemistry. 1990 Jan;11(1):105-11. + + """ + s, t = jnp.tril_indices(lmax + 1) + out = binom(i, s - t) * binom(j, t) * a ** (i - (s - t)) * b ** (j - t) + mask = ((s - i) <= t) & (t <= j) + out = jnp.where(mask, out, 0.0) + return segment_sum(out, s, num_segments=lmax + 1) diff --git a/pyscf_ipu/experimental/structure.py b/pyscf_ipu/experimental/structure.py index c1ba34d..4e894ff 100644 --- a/pyscf_ipu/experimental/structure.py +++ b/pyscf_ipu/experimental/structure.py @@ -5,7 +5,6 @@ import numpy as np from periodictable import elements from py3Dmol import view -from pyscf import gto from .types import FloatNx3, IntN from .units import to_angstrom, to_bohr @@ -21,6 +20,9 @@ def __post_init__(self): if not self.is_bohr: self.position = to_bohr(self.position) + # single atom case + self.position = np.atleast_2d(self.position) + @property def num_atoms(self) -> int: return len(self.atomic_number) @@ -48,19 +50,6 @@ def view(self) -> "view": return view(data=self.to_xyz(), style={"stick": {"radius": 0.06}}) -def to_pyscf( - structure: Structure, basis_name: str = "sto-3g", unit: str = "Bohr" -) -> "gto.Mole": - mol = gto.Mole(unit=unit, spin=structure.num_electrons % 2, cart=True) - mol.atom = [ - (symbol, pos) - for symbol, pos in zip(structure.atomic_symbol, structure.position) - ] - mol.basis = basis_name - mol.build(unit=unit) - return mol - - def molecule(name: str): name = name.lower() @@ -87,3 +76,24 @@ def molecule(name: str): ) raise NotImplementedError(f"No structure registered for: {name}") + + +def nuclear_energy(structure: Structure) -> float: + """Nuclear electrostatic interaction energy + + Evaluated by taking sum over all unique pairs of atom centers: + + sum_{j > i} z_i z_j / |r_i - r_j| + + where z_i is the charge of the ith atom (the atomic number). + + Args: + structure (Structure): input structure + + Returns: + float: the total nuclear repulsion energy + """ + idx, jdx = np.triu_indices(structure.num_atoms, 1) + u = structure.atomic_number[idx] * structure.atomic_number[jdx] + rij = structure.position[idx, :] - structure.position[jdx, :] + return np.sum(u / np.linalg.norm(rij, axis=1)) diff --git a/pyscf_ipu/experimental/types.py b/pyscf_ipu/experimental/types.py index b8450db..63077ca 100644 --- a/pyscf_ipu/experimental/types.py +++ b/pyscf_ipu/experimental/types.py @@ -1,6 +1,7 @@ # Copyright (c) 2023 Graphcore Ltd. All rights reserved. -from jaxtyping import Float, Int, Array +from typing import Tuple +from jaxtyping import Array, Float, Int Float3 = Float[Array, "3"] FloatNx3 = Float[Array, "N 3"] @@ -9,3 +10,5 @@ FloatNxM = Float[Array, "N M"] Int3 = Int[Array, "3"] IntN = Int[Array, "N"] + +MeshAxes = Tuple[FloatN, FloatN, FloatN] diff --git a/pyscf_ipu/experimental/units.py b/pyscf_ipu/experimental/units.py index 4099f40..93de8ed 100644 --- a/pyscf_ipu/experimental/units.py +++ b/pyscf_ipu/experimental/units.py @@ -1,6 +1,10 @@ # Copyright (c) 2023 Graphcore Ltd. All rights reserved. from jaxtyping import Array +# Maximum value an individual component of the angular momentum lmn can take +# Used for static ahead-of-time compilation of functions involving lmn. +LMAX = 4 + BOHR_PER_ANGSTROM = 0.529177210903 diff --git a/pyscf_ipu/nanoDFT/__init__.py b/pyscf_ipu/nanoDFT/__init__.py index 8e91d5e..13a97d5 100644 --- a/pyscf_ipu/nanoDFT/__init__.py +++ b/pyscf_ipu/nanoDFT/__init__.py @@ -1 +1,2 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. from .nanoDFT import * diff --git a/pyscf_ipu/nanoDFT/experimental_pmap_nanoDFT.py b/pyscf_ipu/nanoDFT/experimental_pmap_nanoDFT.py deleted file mode 100644 index 3791e10..0000000 --- a/pyscf_ipu/nanoDFT/experimental_pmap_nanoDFT.py +++ /dev/null @@ -1,628 +0,0 @@ -# Copyright (c) 2023 Graphcore Ltd. All rights reserved. -import os -os.environ["OMP_NUM_THREADS"] = "16" -import jax -import jax.numpy as jnp -import numpy as np -import pyscf -from jsonargparse import CLI, Namespace -from functools import partial - -from pyscf_ipu.exchange_correlation.b3lyp import b3lyp -from pyscf_ipu.electron_repulsion.direct import (prepare_electron_repulsion_integrals, - electron_repulsion_integrals, - ipu_einsum) - - -HARTREE_TO_EV = 27.2114079527 -EPSILON_B3LYP = 1e-20 -HYB_B3LYP = 0.2 - -def energy(density_matrix, H_core, diff_JK, E_xc, E_nuc, _np=jax.numpy): - """Density Functional Theory (DFT) solves the optimisation problem: - - min_{density_matrix} energy(density_matrix, ...) - - We like to think of `energy(...)` as a loss function. `density_matrix` - represents the density of electrons as: - - rho(r) = sum_{ij}^N density_matrix_{ij} X_i(r) X_j(r) where X_i(r)~exp(-|r|^2). - - Here N is the number of atomic orbitals (AO) **and** molecular orbitals (N=66 for C6H6). - All input matrices (density_matrix, H_core, diff_JK) are (N, N). The X_i(r) are called - Gaussian Type Orbitals (GTO). The inputs (diff_JK, E_xc) depend on density_matrix. - """ - E_core = _np.sum(density_matrix * H_core) # float = -712.04[Ha] for C6H6. - E_J_K = _np.sum(density_matrix * diff_JK) # NOTE: diff_JK is already diff_JK = J - (K / 2 * HYB_B3LYP) - E = E_core + E_J_K/2 + E_xc + E_nuc # float = -232.04[Ha] for C6H6. - - return _np.array([E, E_core, E_J_K/2, E_xc, E_nuc]) # Energy (and its terms). - -def nanoDFT_iteration(i, vals, opts, mol): - """Each call updates density_matrix attempting to minimize energy(density_matrix, ... ). """ - density_matrix, V_xc, O, H_core, L_inv, diff_JK = vals[:6] # All (N, N) matrices - E_nuc, occupancy, ERI, sharded_grid_weights, sharded_grid_AO, diis_history, log= vals[6:] # Varying types/shapes. - - if opts.v: - print("---------- MEMORY CONSUMPTION ----------") - MB = 0 - for t in vals: - try: - if type(t) != type(()) and len(np.shape(t)) > 0: - print(t.nbytes/10**6, t.shape, t.dtype) - MB += t.nbytes/10**6 - except: - print(type(t)) - print("ERI") - for a in ERI: # prints weird in dense_ERI case - print( a.nbytes/10**6, a.shape) - MB += a.nbytes / 10**6 - print("__________") - print("Total: ", MB) - print("----------------------------------------") - print("") - - # Step 1: Update Hamiltonian (optionally use DIIS to improve DFT convergence). - H = H_core + diff_JK + V_xc # (N, N) - if opts.diis: H, diis_history = DIIS(i, H, density_matrix, O, diis_history, opts) # H_{i+1}=c_1H_i+...+c9H_{i-9}. - - # Step 2: Solve eigh (L_inv turns generalized eigh into eigh). - eigvects = L_inv.T @ linalg_eigh(L_inv @ H @ L_inv.T, opts)[1] # (N, N) - - # Step 3: Use result from eigenproblem to update density_matrix. - density_matrix = (eigvects*occupancy*2) @ eigvects.T # (N, N) - E_xc, V_xc = exchange_correlation(density_matrix, sharded_grid_AO, sharded_grid_weights) # float (N, N) - diff_JK = get_JK(density_matrix, ERI, opts.dense_ERI) #(4,gsize,N) # (N, N) - - # Log SCF matrices and energies (not used by DFT algorithm). - #log["matrices"] = log["matrices"].at[i].set(jnp.stack((density_matrix, J, K, H))) # (iterations, 4, N, N) ## removing this reduces memory from 50kb to 18kb - N = density_matrix.shape[0] - log["matrices"] = jax.lax.dynamic_update_slice(log["matrices"], density_matrix.reshape(1, 1, N, N), (i, 0, 0, 0)) - log["matrices"] = jax.lax.dynamic_update_slice(log["matrices"], diff_JK. reshape(1, 1, N, N), (i, 1, 0, 0)) - log["matrices"] = jax.lax.dynamic_update_slice(log["matrices"], H. reshape(1, 1, N, N), (i, 2, 0, 0)) - log["energy"] = log["energy"].at[i].set(energy(density_matrix, H_core, diff_JK, E_xc, E_nuc)) # (iterations, 6) - - return [density_matrix, V_xc, O, H_core, L_inv, diff_JK, E_nuc, occupancy, ERI, sharded_grid_weights, sharded_grid_AO, diis_history, log] - -def exchange_correlation(density_matrix, sharded_grid_AO, sharded_grid_weights): - """Compute exchange correlation integral using atomic orbitals (AO) evalauted on a grid. """ - # TODO: we can also use sparsity on grid! Visualization shows it's similarly sparse to ERI! - - # Perfectly SIMD parallelizable over grid_size axis. - # Only need one reduce_sum in the end. - grid_AO_dm = sharded_grid_AO[0] @ density_matrix # (gsize, N) @ (N, N) -> (gsize, N) - grid_AO_dm = jnp.expand_dims(grid_AO_dm, axis=0) # (1, gsize, N) - mult = grid_AO_dm * sharded_grid_AO - rho = jnp.sum(mult, axis=2) # (4, grid_size)=(4, 45624) for C6H6. - E_xc, vrho, vgamma = b3lyp(rho, EPSILON_B3LYP) # (gridsize,) (gridsize,) (gridsize,) - E_xc = jax.lax.psum(jnp.sum(rho[0] * sharded_grid_weights * E_xc), axis_name="p") # float=-27.968[Ha] for C6H6 at convergence. - rho = jnp.concatenate([vrho.reshape(1, -1)/2, 4*vgamma*rho[1:4]], axis=0) * sharded_grid_weights # (4, grid_size)=(4, 45624) - grid_AO_T = sharded_grid_AO[0].T # (N, gsize) - rho = jnp.expand_dims(rho, axis=2) # (4, gsize, 1) - grid_AO_rho = sharded_grid_AO * rho # (4, gsize, N) - sum_grid_AO_rho = jnp.sum(grid_AO_rho, axis=0) # (gsize, N) - V_xc = grid_AO_T @ sum_grid_AO_rho # (N, N) - V_xc = jax.lax.psum(V_xc, axis_name="p") #(N, N) - V_xc = V_xc + V_xc.T # (N, N) - return E_xc, V_xc # (float) (N, N) - -def get_JK(density_matrix, ERI, dense_ERI): - """Computes the (N, N) matrices J and K. Density matrix is (N, N) and ERI is (N, N, N, N). """ - N = density_matrix.shape[0] - - if dense_ERI: - J = jnp.einsum('ijkl,ji->kl', ERI, density_matrix) # (N, N) - K = jnp.einsum('ijkl,jk->il', ERI, density_matrix) # (N, N) - diff_JK = J - (K / 2 * HYB_B3LYP) - else: - from sparse_symmetric_ERI import sparse_symmetric_einsum - diff_JK = sparse_symmetric_einsum(ERI[0], ERI[1], density_matrix, opts.backend) - - diff_JK = diff_JK.reshape(N, N) - - return diff_JK # (N, N) (N, N), - -def _nanoDFT(E_nuc, density_matrix, kinetic, nuclear, O, - mask, _input_floats, _input_ints, L_inv, diis_history, sharded_grid_AO, sharded_grid_weights, ERI, opts, mol): - # Utilize the IPUs MIMD parallism to compute the electron repulsion integrals (ERIs) in parallel. - #if opts.backend == "ipu": ERI = electron_repulsion_integrals(_input_floats, _input_ints, mol, opts.threads_int, opts.intv) - #else: pass # Compute on CPU. - sharded_grid_AO = jnp.transpose(sharded_grid_AO, (1,0,2)) # (padded_gsize/16, 4, N) -> (4, pgsize, N) - - # Precompute the remaining tensors. - E_xc, V_xc = exchange_correlation(density_matrix, sharded_grid_AO, sharded_grid_weights) # float (N, N) - diff_JK = get_JK(density_matrix, ERI, opts.dense_ERI) # (N, N) (N, N) - H_core = kinetic + nuclear # (N, N) - - # Log matrices from all DFT iterations (not used by DFT algorithm). - N = H_core.shape[0] - log = {"matrices": np.zeros((opts.its, 3, N, N)), "E_xc": np.zeros((opts.its)), "energy": np.zeros((opts.its, 5))} - - # Perform DFT iterations. - log = jax.lax.fori_loop(0, opts.its, partial(nanoDFT_iteration, opts=opts, mol=mol), [density_matrix, V_xc, O, H_core, L_inv, diff_JK, # all (N, N) matrices - E_nuc, mask, ERI, sharded_grid_weights, sharded_grid_AO, diis_history, log])[-1] - return log["matrices"], H_core, log["energy"] - -def init_dft_tensors_cpu(mol, opts, DIIS_iters=9): - N = mol.nao_nr() # N=66 for C6H6 (number of atomic **and** molecular orbitals) - print("-----> [ %i ] <-----"%N) - n_electrons_half = mol.nelectron//2 # 21 for C6H6 - E_nuc = mol.energy_nuc() # float = 202.4065 [Hartree] for C6H6. - - # TODO(): port grid/eval_gto to Jax. - grids = pyscf.dft.gen_grid.Grids(mol) - grids.level = opts.level - grids.build() - grid_weights = grids.weights # (grid_size,) = (45624,) for C6H6 - coord_str = 'GTOval_cart_deriv1' if mol.cart else 'GTOval_sph_deriv1' - grid_AO = mol.eval_gto(coord_str, grids.coords, 4) # (4, grid_size, N) = (4, 45624, 9) for C6H6. - density_matrix = pyscf.scf.hf.init_guess_by_minao(mol) # (N,N)=(66,66) for C6H6. - - # TODO(): Add integral math formulas for kinetic/nuclear/O/ERI. - kinetic = mol.intor_symmetric('int1e_kin') # (N,N) - nuclear = mol.intor_symmetric('int1e_nuc') # (N,N) - O = mol.intor_symmetric('int1e_ovlp') # (N,N) - L_inv = np.linalg.inv(np.linalg.cholesky(O)) # (N,N) - - input_floats, input_ints = 0, 0 #prepare_electron_repulsion_integrals(mol)[:2] - mask = np.concatenate([np.ones(n_electrons_half), np.zeros(N-n_electrons_half)]) - - # DIIS is an optional technique to improve DFT convergence. - DIIS_H = np.zeros((DIIS_iters+1, DIIS_iters+1)) - DIIS_H[0,1:] = DIIS_H[1:,0] = 1 - diis_history = (np.zeros((DIIS_iters, N**2)), np.zeros((DIIS_iters, N**2)), DIIS_H) - - tensors = [E_nuc, density_matrix, kinetic, nuclear, O, mask, input_floats, input_ints, L_inv, diis_history] - - return tensors, n_electrons_half, E_nuc, N, L_inv, grid_weights, grids.coords, grid_AO - -def nanoDFT(mol, opts): - # Init DFT tensors on CPU using PySCF. - tensors, n_electrons_half, E_nuc, N, L_inv, grid_weights, grid_coords, grid_AO = init_dft_tensors_cpu(mol, opts) - - sharded_grid_AO = jnp.transpose(grid_AO, (1, 0, 2)) # (4,gsize,N) -> (gsize,4,N) - sharded_grid_weights = grid_weights - gsize = sharded_grid_AO.shape[0] - - remainder = gsize % opts.ndevices - if remainder != 0: - sharded_grid_AO = jnp.pad(sharded_grid_AO, ((0,remainder), (0,0), (0,0)) ) - sharded_grid_weights = jnp.pad(sharded_grid_weights, ((0,remainder)) ) - sharded_grid_AO = sharded_grid_AO.reshape(opts.ndevices, -1, 4, N) - sharded_grid_weights = sharded_grid_weights.reshape(opts.ndevices, -1) - - tensors.append(sharded_grid_AO) - tensors.append(sharded_grid_weights) - - # Run DFT algorithm (can be hardware accelerated). - # we can have "ipus" argument instead, or pod16 as backend? - if opts.dense_ERI: - assert opts.ndevices == 1, "Only support '--dense_ERI True' for `--ndevices 1`. " - eri_in_axes = 0 - ERI = mol.intor("int2e_sph") - ERI = np.expand_dims(ERI, 0) - tensors.append(ERI) - else: - from sparse_symmetric_ERI import num_repetitions_fast, get_i_j - distinct_ERI = mol.intor("int2e_sph", aosym="s8") - print(distinct_ERI.size) - indxs = np.abs(distinct_ERI)<1e-7 - distinct_ERI[indxs] = 0 - nonzero_indices = np.nonzero(distinct_ERI)[0].astype(np.uint64) - nonzero_distinct_ERI = distinct_ERI[nonzero_indices].astype(np.float32) - - ij, kl = get_i_j(nonzero_indices) - rep = num_repetitions_fast(ij, kl) - nonzero_distinct_ERI = nonzero_distinct_ERI / rep - batches = int(opts.batches) # perhaps make 10 batches? - nipu = opts.ndevices - remainder = nonzero_indices.shape[0] % (nipu*batches) - - if remainder != 0: - print(nipu*batches-remainder, ij.shape) - ij = np.pad(ij, ((0,nipu*batches-remainder))) - kl = np.pad(kl, ((0,nipu*batches-remainder))) - nonzero_distinct_ERI = np.pad(nonzero_distinct_ERI, (0,nipu*batches-remainder)) - - ij = ij.reshape(nipu, batches, -1) - kl = kl.reshape(nipu, batches, -1) - nonzero_distinct_ERI = nonzero_distinct_ERI.reshape(nipu, batches, -1) - - i, j = get_i_j(ij.reshape(-1)) - k, l = get_i_j(kl.reshape(-1)) - nonzero_indices = np.vstack([i,j,k,l]).T.reshape(nipu, batches, -1, 4).astype(np.int16) - nonzero_indices = jax.lax.bitcast_convert_type(nonzero_indices, np.float16) - - sparse_ERI = [nonzero_distinct_ERI, nonzero_indices] - tensors.append(sparse_ERI) - eri_in_axes = [0,0] - - jitted_nanoDFT = jax.pmap(partial(_nanoDFT, opts=opts, mol=mol), axis_name="p", backend=opts.backend, - in_axes=(None, None, None, None, None, None, None, None, None, (None, None, None), 0, 0, eri_in_axes)) - - jitted_nanoDFT(*tensors) - vals = jitted_nanoDFT(*tensors) - logged_matrices, H_core, logged_energies = [np.asarray(a[0]).astype(np.float64) for a in vals] # Ensure CPU - - # It's cheap to compute energy/hlgap on CPU in float64 from the logged values/matrices. - logged_E_xc = logged_energies[:, 3].copy() - print(logged_energies[:, 0] * HARTREE_TO_EV) - - density_matrices, diff_JKs, H = [logged_matrices[:, i] for i in range(3)] - energies, hlgaps = np.zeros((opts.its, 5)), np.zeros(opts.its) - for i in range(opts.its): - energies[i] = energy(density_matrices[i], H_core, diff_JKs[i], logged_E_xc[i], E_nuc, np) - hlgaps[i] = hlgap(L_inv, H[i], n_electrons_half, np) - energies, logged_energies, hlgaps = [a * HARTREE_TO_EV for a in [energies, logged_energies, hlgaps]] - mo_energy, mo_coeff = np.linalg.eigh(L_inv @ H[-1] @ L_inv.T) - mo_coeff = L_inv.T @ mo_coeff - return energies, (logged_energies, hlgaps, mo_energy, mo_coeff, grid_coords, grid_weights) - -def DIIS(i, H, density_matrix, O, diis_history, opts): - # DIIS is an optional technique which improves DFT convergence by computing: - # H_{i+1} = c_1 H_i + ... + c_8 H_{i-8} where c=pinv(some_matrix)[0,:] - # We thus like to think of DIIS as "fancy momentum". - _V, _H, DIIS_H = diis_history # (diis_iters, N**2), (diis_iters, N**2), (diis_iters+1, diis_iters+1) - diis_iters, d = _V.shape - DIIS_head = i % _V.shape[0] # int in {0, ..., diis_iters-1} - sdf = O @ density_matrix @ H # (N, N)=(66,66) for C6H6. - errvec = sdf - sdf.T # (N, N) - - _V = jax.lax.dynamic_update_slice(_V, errvec.reshape(1, d), (DIIS_head, 0)) # (diis_iters, N**2)=(9, 4356) for C6H6. - _H = jax.lax.dynamic_update_slice(_H, H.reshape(1, d), (DIIS_head, 0)) # (diis_iters, N**2) - - mask = jnp.where(np.arange(_V.shape[0]) < jnp.minimum(i+1, _V.shape[0]), jnp.ones(_V.shape[0], dtype=_V.dtype), jnp.zeros(_V.shape[0], dtype=_V.dtype)) - tmps = (_V.reshape(diis_iters, 1, d) @ errvec.reshape(1, d, 1)).reshape(-1) * mask # (diis_iters, ) - - DIIS_H = jax.lax.dynamic_update_slice( DIIS_H, tmps.reshape(1, -1), (DIIS_head+1, 1) ) # (diis_iters+1, diis_iters+1) - DIIS_H = jax.lax.dynamic_update_slice( DIIS_H, tmps.reshape(-1, 1), (1, DIIS_head+1) ) # (diis_iters+1, diis_iters+1) - - mask_ = jnp.concatenate([jnp.ones(1, dtype=mask.dtype), mask]) # (diis_iters+1,) - masked_DIIS_H = DIIS_H * mask_.reshape(-1, 1) * mask_.reshape(1, -1) - - if opts.backend == "ipu": c = pinv0(masked_DIIS_H, opts) # (diis_iters+1,)=10 for C6H6. - else: c = jnp.linalg.pinv(masked_DIIS_H)[0, :] # (diis_iters+1,)=10 for C6H6. - - H = (c[1:] @ _H).reshape(H.shape) # (N, N) - return H, (_V, _H, DIIS_H) # (N, N) - -def hlgap(L_inv, H, n_electrons_half, _np): - mo_energy = _np.linalg.eigh(L_inv @ H @ L_inv.T)[0] - return _np.abs(mo_energy[n_electrons_half] - mo_energy[n_electrons_half-1]) - -def linalg_eigh(x, opts): - if opts.backend == "ipu": - from tessellate_ipu.linalg import ipu_eigh - - n = x.shape[0] - pad = n % 2 - if pad: - x = jnp.pad(x, [(0, 1), (0, 1)], mode='constant') - assert False - - eigvects, eigvals = ipu_eigh(x, sort_eigenvalues=True, num_iters=12) # is this the culprit? - - if pad: - e1 = eigvects[-1:] - col = jnp.argmax(e1) - eigvects = jnp.roll(eigvects, -col-1) - eigvects = eigvects[:, :-1] - eigvects = jnp.roll(eigvects, -(-col)) - eigvects = eigvects[:-1] - assert False - else: - eigvals, eigvects = jnp.linalg.eigh(x) - - return eigvals, eigvects - -def pinv0(a, opts): # take out first row - # TODO: add a comment explaining the role of this constant - cond = 9*1.1920929e-07 - vals, vect = linalg_eigh(a, opts) - c = vect @ ( jnp.where( jnp.abs(vals) > cond, 1/vals, 0) * vect[0, :]) - return c - -def grad_elec(weight, grid_AO, eri, s1, h1aos, natm, aoslices, mask, mo_energy, mo_coeff): - # Electronic part of RHF/RKS gradients - dm0 = 2 * (mo_coeff*mask) @ mo_coeff.T # (N, N) = (66, 66) for C6H6. - dme0 = 2 * (mo_coeff * mask*mo_energy) @ mo_coeff.T # (N, N) = (66, 66) for C6H6> - - # Code identical to exchange correlation. - rho = jnp.sum( grid_AO[:1] @ dm0 * grid_AO, axis=2) # (10, grid_size) = (10, 45624) for C6H6. - _, vrho, vgamma = b3lyp(rho, EPSILON_B3LYP) # (grid_size,) (grid_size,) - V_xc = jnp.concatenate([vrho.reshape(1, -1)/2, 4*vgamma.reshape(1, -1)*rho[1:4]], axis=0) # (4, grid_size) - - vmat = grid_AO[1:4].transpose(0, 2, 1) @ jnp.sum(grid_AO[:4] * jnp.expand_dims(weight * V_xc, axis=2), axis=0) # (3, N, N) - aos = jnp.concatenate([jnp.expand_dims(grid_AO[np.array([1,4,5,6])], 0), jnp.expand_dims(grid_AO[np.array([2,5,7,8])], 0), jnp.expand_dims(grid_AO[np.array([3,6,8,9])], 0)], axis=0) # (3, N, N) - V_xc = - vmat - jnp.transpose(jnp.einsum("snpi,np->spi", aos, weight*V_xc), axes=(0,2,1)) @ grid_AO[0] # (3, 4, grid_size, N) - - vj = - jnp.einsum('sijkl,lk->sij', eri, dm0) # (3, N, N) - vk = - jnp.einsum('sijkl,jk->sil', eri, dm0) # (3, N, N) - vhf = V_xc + vj - vk * .5 * HYB_B3LYP # (3, N, N) - - de = jnp.einsum('lxij,ij->lx', h1aos, dm0) # (natm, 3) - for k, ia in enumerate(range(natm)): - p0, p1 = aoslices[ia][2], aoslices[ia][3] - de = de.at[k].add(jnp.einsum('xij,ij->x', vhf[:, p0:p1], dm0[p0:p1]) * 2) - de = de.at[k].add(-jnp.einsum('xij,ij->x', s1[:, p0:p1], dme0[p0:p1]) * 2) - return de - -def grad_nuc(charges, coords): - # Derivatives of nuclear repulsion energy wrt nuclear coordinates - natm = charges.shape[0] - pairwise_charges = charges.reshape(natm, 1) * charges.reshape(1, natm) # (natm, natm) - pairwise_difference = coords.reshape(1, natm, 3) - coords.reshape(natm, 1, 3) # (natm, natm, 3) - pairwise_distances = jnp.linalg.norm(pairwise_difference, axis=2) ** 3 # (natm, natm) - pairwise_distances = jnp.where(pairwise_distances == 0, jnp.inf, pairwise_distances) # (natm, natm) - all = - pairwise_charges.reshape(natm, natm, 1) * pairwise_difference # (natm, natm, 3) - all = all / pairwise_distances.reshape(natm, natm, 1) # (natm, natm, 3) - all = all.at[jnp.diag_indices(natm)].set(0) # (natm, natm, 3) - return jnp.sum(all, axis=0) # (natm, natm) - -def grad(mol, coords, weight, mo_coeff, mo_energy): - # Initialize DFT tensors on CPU using PySCF. - ao = pyscf.dft.numint.NumInt().eval_ao(mol, coords, deriv=2) - eri = mol.intor("int2e_ip1") - s1 = - mol.intor('int1e_ipovlp', comp=3) - kin = - mol.intor('int1e_ipkin', comp=3) - nuc = - mol.intor('int1e_ipnuc', comp=3) - - mask = np.ones(mol.nao_nr()) - mask[mol.nelectron//2:] = 0 - - aoslices = mol.aoslice_by_atom() - h1 = kin + nuc - def hcore_deriv(atm_id, aoslices, h1): # <\nabla|1/r|> - _, _, p0, p1 = aoslices[atm_id] - with mol.with_rinv_at_nucleus(atm_id): - vrinv = mol.intor('int1e_iprinv', comp=3) # - vrinv *= -mol.atom_charge(atm_id) - vrinv[:,p0:p1] += h1[:,p0:p1] - return vrinv + vrinv.transpose(0,2,1) - N = h1.shape[1] # (3, N , N) - h1aos = np.zeros((mol.natm, 3, N, N)) - for k, ia in enumerate(range(mol.natm)): - p0, p1 = aoslices[ia,2:] - h1aos[k] = hcore_deriv(ia, aoslices, h1) - - charges = np.zeros((mol.natm)) - coords = np.zeros((mol.natm,3)) - for j in range(mol.natm): - charges[j] = mol.atom_charge(j) - coords[j]= mol.atom_coord(j) - - _grad_elec = jax.jit(grad_elec, static_argnames=["aoslices", "natm"], backend="cpu") - _grad_nuc = jax.jit(grad_nuc, backend="cpu") - - return _grad_elec(weight, ao, eri, s1, h1aos, mol.natm, tuple([tuple(a) for a in aoslices.tolist()]), mask, mo_energy, mo_coeff) + _grad_nuc(charges, coords) - -def pyscf_reference(mol_str, opts): - from pyscf import __config__ - __config__.dft_rks_RKS_grids_level = opts.level - - mol = build_mol(mol_str, opts.basis) - mol.max_cycle = opts.its - mf = pyscf.scf.RKS(mol) - mf.max_cycle = opts.its - mf.xc = opts.xc - mf.diis_space = 9 - if not opts.diis: # - mf.diis_space = 0 - mf.diis = False - pyscf_energies = [] - pyscf_hlgaps = [] - lumo = mol.nelectron//2 - homo = lumo - 1 - def callback(envs): - pyscf_energies.append(envs["e_tot"]*HARTREE_TO_EV) - hl_gap_hartree = np.abs(envs["mo_energy"][homo] - envs["mo_energy"][lumo]) * HARTREE_TO_EV - pyscf_hlgaps.append(hl_gap_hartree) - mf.callback = callback - mf.kernel() - forces = 0#mf.nuc_grad_method().kernel() - return np.array(pyscf_energies), np.array(pyscf_hlgaps), np.array(forces) - -def print_difference(nanoDFT_E, nanoDFT_forces, nanoDFT_logged_E, nanoDFT_hlgap, pyscf_E, pyscf_forces, pyscf_hlgap): - #TODO(HH): rename to match caller variable names - print("pyscf_hlgap\t%15f"%( pyscf_hlgap[-1])) - print("us_hlgap\t%15f"%( nanoDFT_hlgap[-1])) - print("err_hlgap\t%15f"%np.abs(pyscf_hlgap[-1] - nanoDFT_hlgap[-1])) - print("pyscf:\t\t%15f"%pyscf_E[-1]) - print("us:\t\t%15f"%nanoDFT_E[-1, 0]) - print("mus:\t\t%15f"%np.mean(nanoDFT_E[-10:, 0])) - print("diff:\t\t%15f"%np.abs(pyscf_E[-1]-nanoDFT_E[-1, 0])) - print("mdiff:\t\t%15f"%np.abs(pyscf_E[-1]-np.mean(nanoDFT_E[-10:, 0])), np.std(nanoDFT_E[-10:, 0])) - print("chemAcc: \t%15f"%0.043) - print("chemAcc/diff: \t%15f"%(0.043/np.abs(pyscf_E[-1]-nanoDFT_E[-1, 0]))) - print("chemAcc/mdiff: \t%15f"%(0.043/np.abs(pyscf_E[-1]-np.mean(nanoDFT_E[-10:, 0])))) - print("") - pyscf_E = np.concatenate([pyscf_E, np.ones(nanoDFT_E.shape[0]-pyscf_E.shape[0])*pyscf_E[-1]]) - pyscf_hlgap = np.concatenate([pyscf_hlgap, np.ones(nanoDFT_hlgap.shape[0]-pyscf_hlgap.shape[0])*pyscf_hlgap[-1]]) - print("%18s"%"", "\t".join(["%10s"%str("iter %i "%i) for i in np.arange(1, nanoDFT_E.shape[0]+1)[1::3]])) - print("%18s"%"Error Energy [eV]", "\t".join(["%10s"%str("%.2e"%f) for f in (pyscf_E[1::3] - nanoDFT_E[1::3, 0]).reshape(-1)])) - print("%18s"%"Error HLGAP [eV]", "\t".join(["%10s"%str("%.2e"%f) for f in (pyscf_hlgap[1::3] - nanoDFT_hlgap[1::3]).reshape(-1)])) - - print() - print("%18s"%"E_core [eV]", "\t".join(["%10s"%str("%.5f"%f) for f in (nanoDFT_E[1::3, 1]).reshape(-1)])) - print("%18s"%"E_J_K [eV]", "\t".join(["%10s"%str("%.5f"%f) for f in (nanoDFT_E[1::3, 2]).reshape(-1)])) - print("%18s"%"E_xc [eV]", "\t".join(["%10s"%str("%.5f"%f) for f in (nanoDFT_E[1::3, 3]).reshape(-1)])) - print("%18s"%"E_nuc [eV]", "\t".join(["%10s"%str("%.5f"%f) for f in (nanoDFT_E[1::3, 4]).reshape(-1)])) - - -def build_mol(mol_str, basis_name): - mol = pyscf.gto.mole.Mole() - mol.build(atom=mol_str, unit="Angstrom", basis=basis_name, spin=0, verbose=0) - return mol - -def nanoDFT_options( - its: int = 20, - mol_str: str = "benzene", - float32: bool = False, - basis: str = "sto-3g", - xc: str = "b3lyp", - backend: str = "cpu", - level: int = 0, - multv: int = 2, - intv: int = 1, - threads: int = 1, - threads_int: int = 1, - diis: bool = True, - structure_optimization: bool = False, # AKA gradient descent on energy wrt nuclei - batches: int = 32, - ndevices: int = 1, - dense_ERI: bool = False, # whether to use sparse/distinct eri. - v: bool = False, # verbose - profile: bool = False # if we only want profile exit after IPU finishes. - -): - """ - nanoDFT - - Args: - its (int): Number of Kohn-Sham iterations. - mol_str (str): Molecule string, e.g., "H 0 0 0; H 0 0 1; O 1 0 0; " - float32 (bool) : Whether to use float32 (default is float64). - basis (str): Which Gaussian basis set to use. - xc (str): Exchange-correlation functional. Only support B3LYP - backend (str): Accelerator backend to use: "-backend cpu" or "-backend ipu". - level (int): Level of grids for XC numerical integration. - gdb (int): Which version of GDP to load {10, 11, 13, 17}. - multv (int): Which version of our einsum algorithm to use;comptues ERI@flat(v). Different versions trades-off for memory vs sequentiality - intv (int): Which version to use of our integral algorithm. - threads (int): For -backend ipu. Number of threads for einsum(ERI, dm) with custom C++ (trades-off speed vs memory). - threads_int (int): For -backend ipu. Number of threads for computing ERI with custom C++ (trades off speed vs memory). - """ - if mol_str == "benzene": - mol_str = [ - ["C", ( 0.0000, 0.0000, 0.0000)], - ["C", ( 1.4000, 0.0000, 0.0000)], - ["C", ( 2.1000, 1.2124, 0.0000)], - ["C", ( 1.4000, 2.4249, 0.0000)], - ["C", ( 0.0000, 2.4249, 0.0000)], - ["C", (-0.7000, 1.2124, 0.0000)], - ["H", (-0.5500, -0.9526, 0.0000)], - ["H", (-0.5500, 3.3775, 0.0000)], - ["H", ( 1.9500, -0.9526, 0.0000)], - ["H", (-1.8000, 1.2124, 0.0000)], - ["H", ( 3.2000, 1.2124, 0.0000)], - ["H", ( 1.9500, 3.3775, 0.0000)] - ] - elif mol_str == "methane": - mol_str = [ - ["C", (0, 0, 0)], - ["H", (0, 0, 1)], - ["H", (0, 1, 0)], - ["H", (1, 0, 0)], - ["H", (1, 1, 1)] - ] - elif mol_str == "pmap": - mol_str = "".join([f"H 0 0 {i};" for i in range(2)]) # N=4 - # mol_str = [["H", (0, 0, n) for n in range(2)]] # N=4 - # mol_str = [["H", (0, 0, n) for n in range(8)]] # N=16 - # mol_str = [["H", (0, 0, n) for n in range(8*2)]] # N=32 - # mol_str = [["H", (0, 0, n) for n in range(32)]] # N=64 - # mol_str = [["H", (0, 0, n) for n in range(32+16)]] # N=96 - # mol_str = [["H", (0, 0, n) for n in range(8*2*2*2)]] # N=128 - # mol_str = [["H", (0, 0, n) for n in range(8*2*2*2*2)]] # N=256 - basis = "6-31g" - elif mol_str == "cgrid": - mol_str = [["C", (0, i*1.5, j*1.5)] for i in range(10) for j in range(10)] - #mol_str = [["C", (0, i*1.5, j*1.5)] for i in range(2) for j in range(2)] - #mol_str = [["C", (0, i*1.5, j*1.5)] for i in range(5) for j in range(6)] - #mol_str = [["C", (0, i*1.5, j*1.5)] for i in range(5) for j in range(5)] - #mol_str = [["C", (0, i*1.5, j*1.5)] for i in range(6) for j in range(6)] - #mol_str = [["C", (0, i*1.5, j*1.5)] for i in range(7) for j in range(7)] - elif mol_str == "c20": - mol_str = """C 1.56910 -0.65660 -0.93640 ; - C 1.76690 0.64310 -0.47200 ; - C 0.47050 -0.66520 -1.79270 ; - C 0.01160 0.64780 -1.82550 ; - C 0.79300 1.46730 -1.02840 ; - C -0.48740 -1.48180 -1.21570; - C -1.56350 -0.65720 -0.89520 ; - C -1.26940 0.64900 -1.27670 ; - C -0.00230 -1.96180 -0.00720 ; - C -0.76980 -1.45320 1.03590 ; - C -1.75760 -0.63800 0.47420 ; - C 1.28780 -1.45030 0.16290 ; - C 1.28960 -0.65950 1.30470; - C 0.01150 -0.64600 1.85330 ; - C 1.58300 0.64540 0.89840 ; - C 0.48480 1.43830 1.19370 ; - C -0.50320 0.64690 1.77530 ; - C -1.60620 0.67150 0.92310 ; - C -1.29590 1.48910 -0.16550; - C -0.01020 1.97270 -0.00630 ;""" - - - - - args = locals() - mol_str = args["mol_str"] - del args["mol_str"] - args = Namespace(**args) - if not args.float32: - jax.config.update('jax_enable_x64', not float32) - return args, mol_str - -if __name__ == "__main__": - # Limit PySCF threads to mitigate problem with NUMA nodes. - jax.config.FLAGS.jax_platform_name = 'cpu' - opts, mol_str = CLI(nanoDFT_options) - assert opts.xc == "b3lyp" - print("float32") if opts.float32 else print("float64") - - if not opts.structure_optimization: - # Test Case: Compare nanoDFT against PySCF. - mol = build_mol(mol_str, opts.basis) - nanoDFT_E, (nanoDFT_logged_E, nanoDFT_hlgap, mo_energy, mo_coeff, grid_coords, grid_weights) = nanoDFT(mol, opts) - nanoDFT_forces = 0 # grad(mol, grid_coords, grid_weights, mo_coeff, mo_energy) - pyscf_E, pyscf_hlgap, pyscf_forces = pyscf_reference(mol_str, opts) - print_difference(nanoDFT_E, nanoDFT_forces, nanoDFT_logged_E, nanoDFT_hlgap, pyscf_E, pyscf_forces, pyscf_hlgap) - else: - # pip install mogli imageio[ffmpeg] matplotlib - import mogli - import imageio - import matplotlib.pyplot as plt - opts.basis = "6-31G" - p = np.array([[0,1,1], [0,2,2], [0,3,3], - [0,4,4], [0,5,5], [0,6,6]]) - np.random.seed(42) - p = p + np.random.normal(0, 0.3, p.shape) # slightly break symmetry - A = ["H", "O", "H", "H", "O", "H"] - natm = p.shape[0] - os.makedirs("_tmp/", exist_ok=True) - E = [] - ims = [] - for i in range(20): - mol_str = "".join([f"{A[i]} {p[i]};".replace("[", "]").replace("]", "") for i in range(natm)]) - mol = build_mol(mol_str, opts.basis) - nanoDFT_E, (nanoDFT_logged_E, nanoDFT_hlgap, mo_energy, mo_coeff, grid_coords, grid_weights) = nanoDFT(mol, opts) - f = open(f"_tmp/{i}.xyz", "w") - f.write(f"""{natm}\n{mol_str} {nanoDFT_E[-1, 0]}\n"""+"".join([f"{A[i]} {p[i]}\n".replace("[", "").replace("]", "") for i in range(natm)])) - f.close() - molecules = mogli.read(f'_tmp/{i}.xyz') - mogli.export(molecules[0], f'_tmp/{i}.png', width=400, height=400, - bonds_param=1.15, camera=((9, 0, 0), - (0, 0, 0), - (0, 9, 0))) - ims.append(imageio.v2.imread(f"_tmp/{i}.png/")) - E.append(nanoDFT_E[-1, 0]) - nanoDFT_forces = grad(mol, grid_coords, grid_weights, mo_coeff, mo_energy) - p = p - nanoDFT_forces - print(nanoDFT_E[-1, 0], i) - writer = imageio.get_writer('_tmp/test.gif', loop=0, duration=3) - fig, ax = plt.subplots(1, 2, figsize=(10, 4)) - for c, i in enumerate(ims): - for a in ax: a.cla() - ax[0].axis("off") - ax[1].set_ylabel("Energy [eV]") - ax[1].set_xlabel("Step Number in Structure Optimization") - ax[0].imshow(i) - ax[1].plot(E, label="energy [eV]") - ax[1].legend() - ax[1].plot([c, c], [np.min(E), np.max(E)], '-k') - plt.tight_layout() - plt.savefig("_tmp/tmp.jpg") - writer.append_data(imageio.v2.imread("_tmp/tmp.jpg")) - writer.close() diff --git a/pyscf_ipu/nanoDFT/nanoDFT.py b/pyscf_ipu/nanoDFT/nanoDFT.py index 6464a19..b50e3ad 100644 --- a/pyscf_ipu/nanoDFT/nanoDFT.py +++ b/pyscf_ipu/nanoDFT/nanoDFT.py @@ -1,28 +1,23 @@ # Copyright (c) 2023 Graphcore Ltd. All rights reserved. -import sys import jax import jax.numpy as jnp import numpy as np import pyscf -import h5py import chex from jaxtyping import Float, Array, Int from jsonargparse import CLI, Namespace from functools import partial from collections import namedtuple from icecream import ic - from pyscf_ipu.nanoDFT import utils from pyscf_ipu.exchange_correlation.b3lyp import b3lyp -from pyscf_ipu.electron_repulsion.direct import (prepare_electron_repulsion_integrals, - electron_repulsion_integrals, - ipu_einsum) +from pyscf_ipu.electron_repulsion.direct import (prepare_electron_repulsion_integrals, electron_repulsion_integrals, ipu_einsum) HARTREE_TO_EV = 27.2114079527 EPSILON_B3LYP = 1e-20 HYB_B3LYP = 0.2 -def energy(density_matrix, H_core, J, K, E_xc, E_nuc, _np=jax.numpy): +def energy(density_matrix, H_core, diff_JK, E_xc, E_nuc, _np=jax.numpy): """Density Functional Theory (DFT) solves the optimisation problem: min_{density_matrix} energy(density_matrix, ...) @@ -33,24 +28,41 @@ def energy(density_matrix, H_core, J, K, E_xc, E_nuc, _np=jax.numpy): rho(r) = sum_{ij}^N density_matrix_{ij} X_i(r) X_j(r) where X_i(r)~exp(-|r|^2). Here N is the number of atomic orbitals (AO) **and** molecular orbitals (N=66 for C6H6). - All input matrices (density_matrix, H_core, J, K) are (N, N). The X_i(r) are called - Gaussian Type Orbitals (GTO). The inputs (J, K, E_xc) depend on density_matrix. + All input matrices (density_matrix, H_core, diff_JK) are (N, N). The X_i(r) are called + Gaussian Type Orbitals (GTO). The inputs (diff_JK, E_xc) depend on density_matrix. """ - E_core = _np.sum(density_matrix * H_core) # float = -712.04[Ha] for C6H6. - E_J = _np.sum(density_matrix * J) # float = 624.38[Ha] for C6H6. - E_K = _np.sum(density_matrix * K) # float = 26.53[Ha] for C6H6. - - E = E_core + E_J/2 - E_K/4 + E_xc + E_nuc # float = -232.04[Ha] for C6H6. + E_core = _np.sum(density_matrix * H_core) # float = -712.04[Ha] for C6H6. + E_J_K = _np.sum(density_matrix * diff_JK) # NOTE: diff_JK is already diff_JK = J - (K / 2 * HYB_B3LYP) + E = E_core + E_J_K/2 + E_xc + E_nuc # float = -232.04[Ha] for C6H6. - return _np.array([E, E_core, E_J/2, -E_K/4, E_xc, E_nuc]) # Energy (and its terms). + return _np.array([E, E_core, E_J_K/2, E_xc, E_nuc]) # Energy (and its terms). def nanoDFT_iteration(i, vals, opts, mol): """Each call updates density_matrix attempting to minimize energy(density_matrix, ... ). """ - density_matrix, V_xc, J, K, O, H_core, L_inv = vals[:7] # All (N, N) matrices - E_nuc, occupancy, ERI, grid_weights, grid_AO, diis_history, log = vals[7:] # Varying types/shapes. + density_matrix, V_xc, diff_JK, O, H_core, L_inv = vals[:6] # All (N, N) matrices + E_nuc, occupancy, ERI, grid_weights, grid_AO, diis_history, log = vals[6:] # Varying types/shapes. + + if opts.v: + print("---------- MEMORY CONSUMPTION ----------") + MB = 0 + for t in vals: + try: + if type(t) != type(()) and len(np.shape(t)) > 0: + print(t.nbytes/10**6, t.shape, t.dtype) + MB += t.nbytes/10**6 + except: + print(type(t)) + print("ERI") + for a in ERI: # prints weird in dense_ERI case + print( a.nbytes/10**6, a.shape) + MB += a.nbytes / 10**6 + print("__________") + print("Total: ", MB) + print("----------------------------------------") + print("") # Step 1: Update Hamiltonian (optionally use DIIS to improve DFT convergence). - H = H_core + J - K/2 + V_xc # (N, N) + H = H_core + diff_JK + V_xc # (N, N) if opts.diis: H, diis_history = DIIS(i, H, density_matrix, O, diis_history, opts) # H_{i+1}=c_1H_i+...+c9H_{i-9}. # Step 2: Solve eigh (L_inv turns generalized eigh into eigh). @@ -59,60 +71,97 @@ def nanoDFT_iteration(i, vals, opts, mol): # Step 3: Use result from eigenproblem to update density_matrix. density_matrix = (eigvects*occupancy*2) @ eigvects.T # (N, N) E_xc, V_xc = exchange_correlation(density_matrix, grid_AO, grid_weights) # float (N, N) - J, K = get_JK(density_matrix, ERI, opts, mol) # (N, N) (N, N) + diff_JK = get_JK(density_matrix, ERI, opts.dense_ERI, opts.backend) # (N, N) (N, N) # Log SCF matrices and energies (not used by DFT algorithm). - log["matrices"] = log["matrices"].at[i].set(jnp.stack((density_matrix, J, K, H))) # (iterations, 4, N, N) - log["energy"] = log["energy"].at[i].set(energy(density_matrix, H_core, J, K, E_xc, E_nuc)) # (iterations, 6) + #log["matrices"] = log["matrices"].at[i].set(jnp.stack((density_matrix, J, K, H))) # (iterations, 4, N, N) + N = density_matrix.shape[0] + log["matrices"] = jax.lax.dynamic_update_slice(log["matrices"], density_matrix.reshape(1, 1, N, N), (i, 0, 0, 0)) + log["matrices"] = jax.lax.dynamic_update_slice(log["matrices"], diff_JK. reshape(1, 1, N, N), (i, 1, 0, 0)) + log["matrices"] = jax.lax.dynamic_update_slice(log["matrices"], H. reshape(1, 1, N, N), (i, 2, 0, 0)) + log["energy"] = log["energy"].at[i].set(energy(density_matrix, H_core, diff_JK, E_xc, E_nuc)) # (iterations, 6) + + if opts.vis_num_error is True: + import os + dir_label = opts.molecule_name + num_error_dir = f'num_error/{dir_label}/' + os.makedirs(num_error_dir , exist_ok=True) + + def host_callback(data, i): + # labels are adjusted to the `data` that will be passed to the callback - keep that in mind when passing different list of tensors + labels = ["density_matrix", "V_xc", "diff_JK", "O", "H_core", "L_inv", "E_nuc", "occupancy", "ERI", "grid_weights", "grid_AO", "diis_history", "E_xc", "eigvects", "H"] + for l, d in zip(labels, data): + if l == "diis_history" or l == "ERI": + for idx, arr in enumerate(d): + np.savez(f'{num_error_dir}{i}_{l}{idx}.npz', v = np.array(arr)) + else: + np.savez(f'{num_error_dir}{i}_{l}.npz', v = d) + + jax.debug.callback(host_callback, vals[:-1] + [E_xc, eigvects, H], i) + + return [density_matrix, V_xc, diff_JK, O, H_core, L_inv, E_nuc, occupancy, ERI, grid_weights, grid_AO, diis_history, log] - return [density_matrix, V_xc, J, K, O, H_core, L_inv, E_nuc, occupancy, ERI, grid_weights, grid_AO, diis_history, log] def exchange_correlation(density_matrix, grid_AO, grid_weights): - """Compute exchange correlation integral using atomic orbitals (AO) evaluated on a grid. """ - rho = jnp.sum(grid_AO[:1] @ density_matrix * grid_AO, axis=2) # (4, grid_size)=(4, 45624) for C6H6. - E_xc, vrho, vgamma = b3lyp(rho, EPSILON_B3LYP) # (gridsize,) (gridsize,) (gridsize,) - E_xc = jnp.sum(rho[0] * grid_weights * E_xc) # float=-27.968[Ha] for C6H6 at convergence. - - rho = jnp.concatenate([vrho.reshape(1, -1)/2, 4*vgamma*rho[1:4]], axis=0) * grid_weights # (4, grid_size)=(4, 45624) - V_xc = grid_AO[0].T @ jnp.sum(grid_AO * jnp.expand_dims(rho, axis=2), axis=0) # (N, N) - V_xc = V_xc + V_xc.T # (N, N) - - return E_xc, V_xc # (float) (N, N) - -def get_JK(density_matrix, ERI, opts, mol): + """Compute exchange correlation integral using atomic orbitals (AO) evalauted on a grid. """ + # Perfectly SIMD parallelizable over grid_size axis. + # Only need one reduce_sum in the end. + grid_AO_dm = grid_AO[0] @ density_matrix # (gsize, N) @ (N, N) -> (gsize, N) + grid_AO_dm = jnp.expand_dims(grid_AO_dm, axis=0) # (1, gsize, N) + mult = grid_AO_dm * grid_AO + rho = jnp.sum(mult, axis=2) # (4, grid_size)=(4, 45624) for C6H6. + E_xc, vrho, vgamma = b3lyp(rho, EPSILON_B3LYP) # (gridsize,) (gridsize,) (gridsize,) + E_xc = jax.lax.psum(jnp.sum(rho[0] * grid_weights * E_xc), axis_name="p") # float=-27.968[Ha] for C6H6 at convergence. + rho = jnp.concatenate([vrho.reshape(1, -1)/2, 4*vgamma*rho[1:4]], axis=0) * grid_weights # (4, grid_size)=(4, 45624) + grid_AO_T = grid_AO[0].T # (N, gsize) + rho = jnp.expand_dims(rho, axis=2) # (4, gsize, 1) + grid_AO_rho = grid_AO * rho # (4, gsize, N) + sum_grid_AO_rho = jnp.sum(grid_AO_rho, axis=0) # (gsize, N) + V_xc = grid_AO_T @ sum_grid_AO_rho # (N, N) + V_xc = jax.lax.psum(V_xc, axis_name="p") # (N, N) + V_xc = V_xc + V_xc.T # (N, N) + return E_xc, V_xc # (float) (N, N) + +def get_JK(density_matrix, ERI, dense_ERI, backend): """Computes the (N, N) matrices J and K. Density matrix is (N, N) and ERI is (N, N, N, N). """ - if opts.backend != "ipu": + N = density_matrix.shape[0] + + if dense_ERI: J = jnp.einsum('ijkl,ji->kl', ERI, density_matrix) # (N, N) K = jnp.einsum('ijkl,jk->il', ERI, density_matrix) # (N, N) + diff_JK = J - (K / 2 * HYB_B3LYP) else: - # Custom einsum which utilize ERI[ijkl]=ERI[ijlk]=ERI[jikl]=ERI[jilk]=ERI[lkij]=ERI[lkji]=ERI[lkij]=ERI[lkji] - J, K = ipu_einsum(ERI, density_matrix, mol, opts.threads, opts.multv) # (N, N) (N, N) - return J, K * HYB_B3LYP # (N, N) (N, N) + from pyscf_ipu.nanoDFT.sparse_symmetric_ERI import sparse_symmetric_einsum + diff_JK = sparse_symmetric_einsum(ERI[0], ERI[1], density_matrix, backend) + + diff_JK = diff_JK.reshape(N, N) -def _nanoDFT(state, opts, mol): + return diff_JK + +def _nanoDFT(state, ERI, grid_AO, grid_weights, opts, mol): # Utilize the IPUs MIMD parallism to compute the electron repulsion integrals (ERIs) in parallel. - if opts.backend == "ipu": state.ERI = electron_repulsion_integrals(state.input_floats, state.input_ints, mol, opts.threads_int, opts.intv) - else: pass # Compute on CPU. + #if opts.backend == "ipu": state.ERI = electron_repulsion_integrals(state.input_floats, state.input_ints, mol, opts.threads_int, opts.intv) + #else: pass # Compute on CPU. + grid_AO = jnp.transpose(grid_AO, (1,0,2)) # (padded_gsize/16, 4, N) -> (4, pgsize, N) # Precompute the remaining tensors. - E_xc, V_xc = exchange_correlation(state.density_matrix, state.grid_AO, state.grid_weights) # float (N, N) - J, K = get_JK(state.density_matrix, state.ERI, opts, mol) # (N, N) (N, N) + E_xc, V_xc = exchange_correlation(state.density_matrix, grid_AO, grid_weights) # float (N, N) + diff_JK = get_JK(state.density_matrix, ERI, opts.dense_ERI, opts.backend) # (N, N) (N, N) H_core = state.kinetic + state.nuclear # (N, N) # Log matrices from all DFT iterations (not used by DFT algorithm). N = H_core.shape[0] - log = {"matrices": np.zeros((opts.its, 4, N, N)), "E_xc": np.zeros((opts.its)), "energy": np.zeros((opts.its, 6))} + log = {"matrices": np.zeros((opts.its, 4, N, N)), "E_xc": np.zeros((opts.its)), "energy": np.zeros((opts.its, 5))} # Perform DFT iterations. - log = jax.lax.fori_loop(0, opts.its, partial(nanoDFT_iteration, opts=opts, mol=mol), [state.density_matrix, V_xc, J, K, state.O, H_core, state.L_inv, # all (N, N) matrices - state.E_nuc, state.mask, state.ERI, state.grid_weights, state.grid_AO, state.diis_history, log])[-1] + log = jax.lax.fori_loop(0, opts.its, partial(nanoDFT_iteration, opts=opts, mol=mol), [state.density_matrix, V_xc, diff_JK, state.O, H_core, state.L_inv, # all (N, N) matrices + state.E_nuc, state.mask, ERI, grid_weights, grid_AO, state.diis_history, log])[-1] return log["matrices"], H_core, log["energy"] FloatN = Float[Array, "N"] FloatNxN = Float[Array, "N N"] -FloatNxNxNxN = Float[Array, "N N N N"] Grid = Float[Array, "4 grid_size N"] FloatArray = Float[Array, "..."] IntArray = Int[Array, "..."] @@ -134,9 +183,6 @@ class IterationState: kinetic (FloatNxN): Kinetic energy integrals in the LCAO basis set. nuclear (FloatNxN): nuclear attraction integrals in the LCAO basis set. O (FloatNxN): Overlap integrals in the LCAO basis set. - grid_AO (Grid): Numerical grid used to evaluate the exchange-correlation energy integral. - ERI (FloatNxNxNxN): Two-electron repulsion integrals in the LCAO basis set. - grid_weights (FloatArray): Weights associated with the grid_AO mask (FloatN): Orbital occupation mask. input_floats (FloatArray): Supplementary vector of floats for ERI evaluation with libcint input_ints (IntArray): Supplementary vector of ints for ERI evaluation with libcint @@ -153,18 +199,15 @@ class IterationState: kinetic: FloatNxN nuclear: FloatNxN O: FloatNxN - grid_AO: Grid - ERI: FloatNxNxNxN - grid_weights: FloatArray mask: FloatN input_floats: FloatArray input_ints: IntArray L_inv: FloatNxN diis_history: FloatArray - def init_dft_tensors_cpu(mol, opts, DIIS_iters=9): N = mol.nao_nr() # N=66 for C6H6 (number of atomic **and** molecular orbitals) + print("-----> [ %i ] <-----"%N) n_electrons_half = mol.nelectron//2 # 21 for C6H6 E_nuc = mol.energy_nuc() # float = 202.4065 [Hartree] for C6H6. TODO(): Port to jax. @@ -175,10 +218,18 @@ def init_dft_tensors_cpu(mol, opts, DIIS_iters=9): grid_weights = grids.weights # (grid_size,) = (45624,) for C6H6 coord_str = 'GTOval_cart_deriv1' if mol.cart else 'GTOval_sph_deriv1' grid_AO = mol.eval_gto(coord_str, grids.coords, 4) # (4, grid_size, N) = (4, 45624, 9) for C6H6. - if opts.ao_threshold is not None: + if opts.ao_threshold > 0.0: grid_AO[np.abs(grid_AO) (gsize,4,N) + grid_weights = _grid_weights + gsize = grid_AO.shape[0] + + remainder = gsize % opts.ndevices + if remainder != 0: + grid_AO = jnp.pad(grid_AO, ((0,remainder), (0,0), (0,0)) ) + grid_weights = jnp.pad(grid_weights, ((0,remainder)) ) + grid_AO = grid_AO.reshape(opts.ndevices, -1, 4, N) + grid_weights = grid_weights.reshape(opts.ndevices, -1) # Run DFT algorithm (can be hardware accelerated). - jitted_nanoDFT = jax.jit(partial(_nanoDFT, opts=opts, mol=mol), backend=opts.backend) - vals = jitted_nanoDFT(state) - logged_matrices, H_core, logged_energies = [np.asarray(a).astype(np.float64) for a in vals] # Ensure CPU + if opts.dense_ERI: + assert opts.ndevices == 1, "Only support '--dense_ERI True' for `--ndevices 1`. " + eri_in_axes = 0 + ERI = mol.intor("int2e_sph") + ERI = np.expand_dims(ERI, 0) + below_thr = np.abs(ERI) <= opts.eri_threshold + ERI[below_thr] = 0.0 + ic(ERI.size, np.sum(below_thr), np.sum(below_thr)/ERI.size) + else: + from pyscf_ipu.nanoDFT.sparse_symmetric_ERI import get_i_j, num_repetitions_fast + distinct_ERI = mol.intor("int2e_sph", aosym="s8") + print(distinct_ERI.size) + below_thr = np.abs(distinct_ERI) <= opts.eri_threshold + distinct_ERI[below_thr] = 0.0 + ic(distinct_ERI.size, np.sum(below_thr), np.sum(below_thr)/distinct_ERI.size) + nonzero_indices = np.nonzero(distinct_ERI)[0].astype(np.uint64) + nonzero_distinct_ERI = distinct_ERI[nonzero_indices].astype(np.float32) + + ij, kl = get_i_j(nonzero_indices) + rep = num_repetitions_fast(ij, kl) + nonzero_distinct_ERI = nonzero_distinct_ERI / rep + batches = int(opts.batches) # perhaps make 10 batches? + nipu = opts.ndevices + remainder = nonzero_indices.shape[0] % (nipu*batches) + + if remainder != 0: + print(nipu*batches-remainder, ij.shape) + ij = np.pad(ij, ((0,nipu*batches-remainder))) + kl = np.pad(kl, ((0,nipu*batches-remainder))) + nonzero_distinct_ERI = np.pad(nonzero_distinct_ERI, (0,nipu*batches-remainder)) + + ij = ij.reshape(nipu, batches, -1) + kl = kl.reshape(nipu, batches, -1) + nonzero_distinct_ERI = nonzero_distinct_ERI.reshape(nipu, batches, -1) + + i, j = get_i_j(ij.reshape(-1)) + k, l = get_i_j(kl.reshape(-1)) + nonzero_indices = np.vstack([i,j,k,l]).T.reshape(nipu, batches, -1, 4).astype(np.int16) + nonzero_indices = jax.lax.bitcast_convert_type(nonzero_indices, np.float16) + + ERI = [nonzero_distinct_ERI, nonzero_indices] + eri_in_axes = [0,0] + #jitted_nanoDFT = jax.jit(partial(_nanoDFT, opts=opts, mol=mol), backend=opts.backend) + jitted_nanoDFT = jax.pmap(partial(_nanoDFT, opts=opts, mol=mol), backend=opts.backend, + in_axes=(None, eri_in_axes, 0, 0), + axis_name="p") + print(grid_AO.shape, grid_weights.shape) + vals = jitted_nanoDFT(state, ERI, grid_AO, grid_weights) + logged_matrices, H_core, logged_energies = [np.asarray(a[0]).astype(np.float64) for a in vals] # Ensure CPU # It's cheap to compute energy/hlgap on CPU in float64 from the logged values/matrices. - logged_E_xc = logged_energies[:, 4].copy() - density_matrices, Js, Ks, H = [logged_matrices[:, i] for i in range(4)] - energies, hlgaps = np.zeros((opts.its, 6)), np.zeros(opts.its) + logged_E_xc = logged_energies[:, 3].copy() + print(logged_energies[:, 0] * HARTREE_TO_EV) + density_matrices, diff_JKs, H = [logged_matrices[:, i] for i in range(3)] + energies, hlgaps = np.zeros((opts.its, 5)), np.zeros(opts.its) for i in range(opts.its): - energies[i] = energy(density_matrices[i], H_core, Js[i], Ks[i], logged_E_xc[i], E_nuc, np) + energies[i] = energy(density_matrices[i], H_core, diff_JKs[i], logged_E_xc[i], E_nuc, np) hlgaps[i] = hlgap(L_inv, H[i], n_electrons_half, np) energies, logged_energies, hlgaps = [a * HARTREE_TO_EV for a in [energies, logged_energies, hlgaps]] mo_energy, mo_coeff = np.linalg.eigh(L_inv @ H[-1] @ L_inv.T) mo_coeff = L_inv.T @ mo_coeff - return energies, (logged_energies, hlgaps, mo_energy, mo_coeff, grid_coords, grid_weights) + return energies, (logged_energies, hlgaps, mo_energy, mo_coeff, grid_coords, _grid_weights) def DIIS(i, H, density_matrix, O, diis_history, opts): # DIIS is an optional technique which improves DFT convergence by computing: @@ -274,6 +375,7 @@ def linalg_eigh(x, opts): pad = n % 2 if pad: x = jnp.pad(x, [(0, 1), (0, 1)], mode='constant') + #assert False eigvects, eigvals = ipu_eigh(x, sort_eigenvalues=True, num_iters=12) @@ -284,6 +386,7 @@ def linalg_eigh(x, opts): eigvects = eigvects[:, :-1] eigvects = jnp.roll(eigvects, -(-col)) eigvects = eigvects[:-1] + #assert False else: eigvals, eigvects = jnp.linalg.eigh(x) @@ -296,10 +399,11 @@ def pinv0(a, opts): # take out first row c = vect @ ( jnp.where( jnp.abs(vals) > cond, 1/vals, 0) * vect[0, :]) return c -def grad_elec(weight, grid_AO, eri, s1, h1aos, natm, aoslices, mask, mo_energy, mo_coeff): + +def grad_elec(weight, grid_AO, eri, s1, h1aos, natm, aoslices, mask, mo_energy, mo_coeff, mol): # Electronic part of RHF/RKS gradients dm0 = 2 * (mo_coeff*mask) @ mo_coeff.T # (N, N) = (66, 66) for C6H6. - dme0 = 2 * (mo_coeff * mask*mo_energy) @ mo_coeff.T # (N, N) = (66, 66) for C6H6> + dme0 = 2 * (mo_coeff * mask*mo_energy) @ mo_coeff.T # (N, N) = (66, 66) for C6H6. # Code identical to exchange correlation. rho = jnp.sum( grid_AO[:1] @ dm0 * grid_AO, axis=2) # (10, grid_size) = (10, 45624) for C6H6. @@ -334,6 +438,7 @@ def grad_nuc(charges, coords): return jnp.sum(all, axis=0) # (natm, natm) def grad(mol, coords, weight, mo_coeff, mo_energy): + print(coords.shape, weight.shape) # Initialize DFT tensors on CPU using PySCF. ao = pyscf.dft.numint.NumInt().eval_ao(mol, coords, deriv=2) eri = mol.intor("int2e_ip1") @@ -365,12 +470,16 @@ def hcore_deriv(atm_id, aoslices, h1): # <\nabla|1/r|> charges[j] = mol.atom_charge(j) coords[j]= mol.atom_coord(j) - _grad_elec = jax.jit(grad_elec, static_argnames=["aoslices", "natm"], backend="cpu") + #_grad_elec = jax.jit(grad_elec, static_argnames=["aoslices", "natm"], backend="cpu") + _grad_elec = grad_elec _grad_nuc = jax.jit(grad_nuc, backend="cpu") - return _grad_elec(weight, ao, eri, s1, h1aos, mol.natm, tuple([tuple(a) for a in aoslices.tolist()]), mask, mo_energy, mo_coeff) + _grad_nuc(charges, coords) + return _grad_elec(weight, ao, eri, s1, h1aos, mol.natm, tuple([tuple(a) for a in aoslices.tolist()]), mask, mo_energy, mo_coeff, mol) + _grad_nuc(charges, coords) def pyscf_reference(mol_str, opts): + from pyscf import __config__ + __config__.dft_rks_RKS_grids_level = opts.level + mol = build_mol(mol_str, opts.basis) mol.max_cycle = opts.its mf = pyscf.scf.RKS(mol) @@ -388,8 +497,10 @@ def callback(envs): pyscf_energies.append(envs["e_tot"]*HARTREE_TO_EV) hl_gap_hartree = np.abs(envs["mo_energy"][homo] - envs["mo_energy"][lumo]) * HARTREE_TO_EV pyscf_hlgaps.append(hl_gap_hartree) + print("\rPYSCF: ", pyscf_energies[-1] , end="") mf.callback = callback mf.kernel() + print("") forces = mf.nuc_grad_method().kernel() return np.array(pyscf_energies), np.array(pyscf_hlgaps), np.array(forces) @@ -413,13 +524,11 @@ def print_difference(nanoDFT_E, nanoDFT_forces, nanoDFT_logged_E, nanoDFT_hlgap, print("%18s"%"Error Energy [eV]", "\t".join(["%10s"%str("%.2e"%f) for f in (pyscf_E[1::3] - nanoDFT_E[1::3, 0]).reshape(-1)])) print("%18s"%"Error HLGAP [eV]", "\t".join(["%10s"%str("%.2e"%f) for f in (pyscf_hlgap[1::3] - nanoDFT_hlgap[1::3]).reshape(-1)])) - # E_core, E_J/2, -E_K/4, E_xc, E_nuc print() print("%18s"%"E_core [eV]", "\t".join(["%10s"%str("%.5f"%f) for f in (nanoDFT_E[1::3, 1]).reshape(-1)])) - print("%18s"%"E_J [eV]", "\t".join(["%10s"%str("%.5f"%f) for f in (nanoDFT_E[1::3, 2]).reshape(-1)])) - print("%18s"%"E_K [eV]", "\t".join(["%10s"%str("%.5f"%f) for f in (nanoDFT_E[1::3, 3]).reshape(-1)])) - print("%18s"%"E_xc [eV]", "\t".join(["%10s"%str("%.5f"%f) for f in (nanoDFT_E[1::3, 4]).reshape(-1)])) - print("%18s"%"E_nuc [eV]", "\t".join(["%10s"%str("%.5f"%f) for f in (nanoDFT_E[1::3, 5]).reshape(-1)])) + print("%18s"%"E_J_K [eV]", "\t".join(["%10s"%str("%.5f"%f) for f in (nanoDFT_E[1::3, 2]).reshape(-1)])) + print("%18s"%"E_xc [eV]", "\t".join(["%10s"%str("%.5f"%f) for f in (nanoDFT_E[1::3, 3]).reshape(-1)])) + print("%18s"%"E_nuc [eV]", "\t".join(["%10s"%str("%.5f"%f) for f in (nanoDFT_E[1::3, 4]).reshape(-1)])) # Forces print() @@ -443,7 +552,7 @@ def nanoDFT_options( basis: str = "sto-3g", xc: str = "b3lyp", backend: str = "cpu", - level: int = 1, + level: int = 0, multv: int = 2, intv: int = 1, threads: int = 1, @@ -451,7 +560,14 @@ def nanoDFT_options( diis: bool = True, structure_optimization: bool = False, # AKA gradient descent on energy wrt nuclei eri_threshold : float = 0.0, - ao_threshold: float = None + ao_threshold: float = 0.0, + batches: int = 32, + ndevices: int = 1, + dense_ERI: bool = False, + v: bool = False, # verbose + profile: bool = False, # if we only want profile exit after IPU finishes. + vis_num_error: bool = False, + molecule_name: str = None ): """ nanoDFT @@ -473,22 +589,29 @@ def nanoDFT_options( threads_int (int): For -backend ipu. Number of threads for computing ERI with custom C++ (trades off speed vs memory). eri_threshold (float): Zero out ERIs that are below the threshold in absolute value. Not supported for '--backend ipu'. ao_threshold (float): Zero out grid_AO that are below the threshold in absolute value. + dense_ERI (bool): Whether to use dense ERI (s1) or sparse symmtric ERI. """ + if molecule_name is None: + # use mol_str as a molecule name (in case it has not been provided) + # before mol_str CLI arg is preprocessed and overwritten + molecule_name = mol_str # From a compound name or CID, get a list of its atoms and their coordinates mol_str = utils.process_mol_str(mol_str) if mol_str is None: - sys.exit(1) + exit(1) print(f"Minimum interatomic distance: {utils.min_interatomic_distance(mol_str)}") # TODO: dies for --mol_str methane - if backend=='ipu' and eri_threshold >0.0: - print("ERI threshold > 0.0 only if backend=='cpu'. Overriding...") - eri_threshold = 0.0 args = locals() mol_str = args["mol_str"] del args["mol_str"] args = Namespace(**args) + + from pyscf_ipu.experimental.device import has_ipu + import os + if has_ipu() and "JAX_IPU_USE_MODEL" in os.environ: + args.dense_ERI = True args = namedtuple('DFTOptionsImmutable',vars(args).keys())(**vars(args)) # make immutable if not args.float32: jax.config.update('jax_enable_x64', not float32) @@ -496,9 +619,8 @@ def nanoDFT_options( def main(): # Limit PySCF threads to mitigate problem with NUMA nodes. - import os - os.environ['OMP_NUM_THREADS'] = "16" jax.config.FLAGS.jax_platform_name = 'cpu' + import os opts, mol_str = CLI(nanoDFT_options) assert opts.xc == "b3lyp" print("Precision: float32") if opts.float32 else print("Precision: float64") @@ -514,6 +636,12 @@ def main(): nanoDFT_forces = grad(mol, grid_coords, grid_weights, mo_coeff, mo_energy) pyscf_E, pyscf_hlgap, pyscf_forces = pyscf_reference(mol_str, opts) print_difference(nanoDFT_E, nanoDFT_forces, nanoDFT_logged_E, nanoDFT_hlgap, pyscf_E, pyscf_forces, pyscf_hlgap) + + if opts.vis_num_error is True: + from utils import save_plot + import sys + _plot_title = f"Created with: python {' '.join(sys.argv)}" + save_plot("num_error/", opts.molecule_name, opts.its, _plot_title) else: # pip install mogli imageio[ffmpeg] matplotlib import mogli diff --git a/pyscf_ipu/nanoDFT/sparse_ERI.py b/pyscf_ipu/nanoDFT/sparse_ERI.py index d5d3cce..7c2d3ae 100644 --- a/pyscf_ipu/nanoDFT/sparse_ERI.py +++ b/pyscf_ipu/nanoDFT/sparse_ERI.py @@ -1,3 +1,4 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. import numpy as np import jax.numpy as jnp import os diff --git a/pyscf_ipu/nanoDFT/sparse_symmetric_ERI.py b/pyscf_ipu/nanoDFT/sparse_symmetric_ERI.py index d72a5e6..63f73f7 100644 --- a/pyscf_ipu/nanoDFT/sparse_symmetric_ERI.py +++ b/pyscf_ipu/nanoDFT/sparse_symmetric_ERI.py @@ -4,7 +4,6 @@ import jax import jax.numpy as jnp import os.path as osp -from tessellate_ipu import create_ipu_tile_primitive, ipu_cycle_count, tile_map, tile_put_sharded, tile_put_replicated from functools import partial from icecream import ic jax.config.update('jax_platform_name', "cpu") @@ -23,6 +22,7 @@ def cpu_ijkl(value, symmetry, N, f): @partial(jax.jit, backend="ipu") def ipu_ijkl(nonzero_indices, symmetry, N): + from tessellate_ipu import create_ipu_tile_primitive, ipu_cycle_count, tile_map, tile_put_sharded, tile_put_replicated vertex_filename = osp.join(osp.dirname(__file__), "compute_indices.cpp") compute_indices= create_ipu_tile_primitive( "IndicesIJKL" , @@ -78,20 +78,16 @@ def num_repetitions_fast(ij, kl): ) return repetitions - indices_func = lambda i,j,k,l,symmetry,N: jnp.array([i*N+j, j*N+i, i*N+j, j*N+i, k*N+l, l*N+k, k*N+l, l*N+k, k*N+l, k*N+l, l*N+k, l*N+k, i*N+j, i*N+j, j*N+i, j*N+i, k*N+j, k*N+i, l*N+j, l*N+i, i*N+l, i*N+k, j*N+l, j*N+k, i*N+l, j*N+l, i*N+k, j*N+k, k*N+j, l*N+j, k*N+i, l*N+i])[symmetry] def sparse_symmetric_einsum(nonzero_distinct_ERI, nonzero_indices, dm, backend): - - dm = dm.reshape(-1) diff_JK = jnp.zeros(dm.shape) N = int(np.sqrt(dm.shape[0])) - dnums = jax.lax.GatherDimensionNumbers( offset_dims=(), collapsed_slice_dims=(0,), @@ -111,6 +107,7 @@ def sequentialized_iter(i, vals): diff_JK = vals indices = nonzero_indices[i] + print(nonzero_indices.shape, indices.shape) indices = jax.lax.bitcast_convert_type(indices, np.int16).astype(np.int32) eris = nonzero_distinct_ERI[i] diff --git a/pyscf_ipu/nanoDFT/symmetric_ERI.py b/pyscf_ipu/nanoDFT/symmetric_ERI.py index 7abcb03..abd9df0 100644 --- a/pyscf_ipu/nanoDFT/symmetric_ERI.py +++ b/pyscf_ipu/nanoDFT/symmetric_ERI.py @@ -1,3 +1,4 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. import numpy as np import jax.numpy as jnp import os diff --git a/pyscf_ipu/nanoDFT/utils.py b/pyscf_ipu/nanoDFT/utils.py index 3308cae..f9e1197 100644 --- a/pyscf_ipu/nanoDFT/utils.py +++ b/pyscf_ipu/nanoDFT/utils.py @@ -57,12 +57,16 @@ def get_mol_str_pubchem(entry: str): 'entry' is interpreted as Compound ID if it is a string of digits or as name of a compound otherwise""" - if entry.isdigit(): # If all digits, we assume it is a CID + if entry.isdigit(): # If all digits, we assume it is a CID print(f"Searching in PubChem for CID '{entry}'") compound = pubchempy.get_compounds(entry, "cid", record_type='3d') - else: - print(f"Searching in PubChem for compound with name '{entry}'") # if not, we assume it is a name + if len(compound) == 0: + compound = pubchempy.get_compounds(entry, 'cid', record_type='2d') + else: # if not, we assume it is a name + print(f"Searching in PubChem for compound with name '{entry}'") compound = pubchempy.get_compounds(entry, 'name', record_type='3d') + if len(compound) == 0: + compound = pubchempy.get_compounds(entry, 'name', record_type='2d') mol_str = [] if len(compound) > 1: print("INFO: PubChem returned more than one compound; using the first...", file=sys.stderr) @@ -71,11 +75,11 @@ def get_mol_str_pubchem(entry: str): return None print(f"Found compound: {compound[0].synonyms[0]}") for a in compound[0].atoms: - mol_str.append((a.element,np.array([a.x, a.y, a.z]))) + z = a.z or 0.0 + mol_str.append((a.element,np.array([a.x, a.y, z]))) return mol_str - def process_mol_str(mol_str: str): if mol_str == "benzene": mol_str = [ @@ -92,6 +96,34 @@ def process_mol_str(mol_str: str): ["H", ( 3.2000, 1.2124, 0.0000)], ["H", ( 1.9500, 3.3775, 0.0000)] ] + + elif mol_str == "c20": + mol_str = [["C", ( 1.56910, -0.65660, -0.93640)], + ["C", ( 1.76690, 0.64310, -0.47200)], + ["C", ( 0.47050, -0.66520, -1.79270)], + ["C", ( 0.01160, 0.64780, -1.82550)], + ["C", ( 0.79300, 1.46730, -1.02840)], + ["C", (-0.48740, -1.48180, -1.21570)], + ["C", (-1.56350, -0.65720, -0.89520)], + ["C", (-1.26940, 0.64900, -1.27670)], + ["C", (-0.00230, -1.96180, -0.00720)], + ["C", (-0.76980, -1.45320, 1.03590)], + ["C", (-1.75760, -0.63800, 0.47420)], + ["C", ( 1.28780, -1.45030, 0.16290)], + ["C", ( 1.28960, -0.65950, 1.30470)], + ["C", ( 0.01150, -0.64600, 1.85330)], + ["C", ( 1.58300, 0.64540, 0.89840)], + ["C", ( 0.48480, 1.43830, 1.19370)], + ["C", (-0.50320, 0.64690, 1.77530)], + ["C", (-1.60620, 0.67150, 0.92310)], + ["C", (-1.29590, 1.48910, -0.16550)], + ["C", (-0.01020, 1.97270, -0.00630)]] + + elif mol_str == "c100": + mol_str = [["C", (-1.59600, 4.04060, 1.32260)],["C", (-2.78560, 3.62030, 0.86750)],["C", (1.12220, 4.19180, 1.58100)],["C", (0.55610, 4.64280, 0.46450)],["C", (-0.77450, 4.57120, 0.33060)],["C", (2.38160, 3.69870, 1.54910)],["C", (-1.02360, 4.37320, -1.01930)],["C", (-2.15360, 3.78860, -1.47040)],["C", (-3.11650, 3.57250, -0.49370)],["C", (-4.07380, 2.65850, -0.62040)],["C", (-4.08550, 1.85070, -1.70820)],["C", (0.17640, 4.21330, -1.63780)],["C", (1.57810, 2.79300, -2.77190)],["C", (0.31370, 3.29660, -2.67280)],["C", (-0.78760, 2.51750, -3.11720)],["C", (-2.05650, 2.85680, -2.55400)],["C", (-3.04480, 1.90090, -2.60350)],["C", (2.45400, 3.92590, -0.79790)],["C", (1.19210, 4.46580, -0.72750)],["C", (4.72530, 0.48500, -0.82090)],["C", (4.33740, 1.81210, -0.85310)],["C", (3.52930, 2.11560, -1.94060)],["C", (2.62760, 3.12360, -1.90640)],["C", (3.15780, 3.56490, 0.37740)],["C", (4.17050, 1.69290, 1.50600)],["C", (4.09670, 2.50770, 0.35700)],["C", (-4.78460, 0.88520, 0.69790)],["C", (-4.94170, 0.10250, -0.42550)],["C", (-4.35220, 2.13210, 0.60270)],["C", (-4.50980, 0.58230, -1.61180)],["C", (-3.75240, -0.20620, -2.43260)],["C", (-4.72170, -1.17630, -0.10650)],["C", (-4.10050, -2.08990, -0.97260)],["C", (-3.52710, -1.54660, -2.19040)],["C", (1.81720, 1.54840, -3.29360)],["C", (0.80120, 0.66170, -3.69130)],["C", (-0.54510, 1.15100, -3.61770)],["C", (-1.59230, 0.16810, -3.53580)],["C", (-2.82410, 0.61220, -3.06230)],["C", (0.04120, -1.69860, -3.50530)],["C", (-1.33460, -1.24450, -3.43350)],["C", (-2.33640, -2.08070, -2.75570)],["C", (-1.90190, -3.26080, -2.17080)],["C", (-3.72600, -2.10920, 1.77120)],["C", (-4.36030, 0.10230, 1.72000)],["C", (-4.45960, -1.16570, 1.25030)],["C", (-3.32190, -3.16890, 1.04190)],["C", (-2.44730, -3.79040, -1.00750)],["C", (-3.47160, -3.17320, -0.35860)],["C", (-2.79440, -1.80090, 2.74020)],["C", (-2.51340, -0.49730, 3.17740)],["C", (-3.37210, 0.51980, 2.66280)],["C", (-2.90680, 1.85220, 2.56000)],["C", (-3.47480, 2.63330, 1.52020)],["C", (-0.71820, 1.14100, 3.56130)],["C", (-1.59830, 2.19250, 3.01350)],["C", (-1.00360, 3.37840, 2.43610)],["C", (0.35590, 3.52050, 2.51960)],["C", (-1.88220, -2.80190, 2.68870)],["C", (0.30780, -3.48370, 2.52260)],["C", (-0.59030, -2.60600, 3.11250)],["C", (-0.16700, -1.32420, 3.58230)],["C", (-1.16010, -0.23250, 3.60700)],["C", (1.25530, -1.05910, 3.50810)],["C", (0.69910, 1.36660, 3.58220)],["C", (1.16600, 2.59400, 3.09010)],["C", (-1.43880, -4.46790, -0.35830)],["C", (-1.30850, -4.41700, 1.02040)],["C", (-2.23670, -3.69220, 1.66990)],["C", (-0.03590, -4.36530, 1.50140)],["C", (1.63220, -3.19410, 2.40140)],["C", (2.17870, -2.02470, 2.89450)],["C", (1.65930, 0.29600, 3.55460)],["C", (2.94030, 0.58290, 3.03560)],["C", (3.28150, 1.81110, 2.53170)],["C", (2.41570, 2.78520, 2.55760)],["C", (2.12750, -3.88250, 1.29960)],["C", (3.05340, -3.54940, -0.79220)],["C", (3.20520, -3.42060, 0.60000)],["C", (3.91450, -2.33270, 1.11310)],["C", (3.41180, -1.64450, 2.27850)],["C", (3.75800, -0.31930, 2.40740)],["C", (-0.33620, -4.48080, -1.16030)],["C", (1.91230, -4.03080, -1.37980)],["C", (0.92590, -4.60230, -0.65250)],["C", (1.06310, -4.53250, 0.71870)],["C", (2.46220, -1.11070, -3.21010)],["C", (1.12460, -0.73920, -3.64590)],["C", (2.64170, -2.36200, -2.63770)],["C", (1.63300, -3.24840, -2.50300)],["C", (0.35250, -2.97660, -2.93690)],["C", (-0.61630, -3.69160, -2.27130)],["C", (4.33780, -1.65960, -1.16960)],["C", (4.32530, -0.43960, -1.77130)],["C", (3.40550, -0.14210, -2.78300)],["C", (3.05390, 1.16070, -2.83410)],["C", (3.55050, -2.61110, -1.63070)],["C", (4.51580, 0.38190, 1.48320)],["C", (4.58670, -1.52770, 0.17300)],["C", (4.86400, -0.22290, 0.35100)],] + elif mol_str == "c180": + mol_str = [["C", (5.94060, 0.59650, -0.41930)],["C", (5.93570, -0.73530, -0.16200)],["C", (5.66630, -1.38200, -1.32280)],["C", (5.50750, -0.45190, -2.29460)],["C", (5.67810, 0.77110, -1.73860)],["C", (2.83010, 5.12760, 1.23450)],["C", (3.83470, 4.56120, 0.52130)],["C", (3.57290, 4.73550, -0.79620)],["C", (2.39920, 5.40580, -0.89720)],["C", (1.94210, 5.65200, 0.35430)],["C", (3.37000, -0.17130, 4.94290)],["C", (4.38070, 0.08380, 4.07510)],["C", (4.38280, 1.41520, 3.81810)],["C", (3.37330, 1.97720, 4.52830)],["C", (2.75020, 0.99860, 5.22730)],["C", (2.37120, -5.36250, 1.18010)],["C", (3.54640, -4.70310, 1.03000)],["C", (3.81640, -4.05840, 2.19080)],["C", (2.80660, -4.31830, 3.05820)],["C", (1.91470, -5.12670, 2.43360)],["C", (1.21740, -3.27530, -4.86340)],["C", (2.49140, -3.19300, -4.40510)],["C", (2.65450, -4.12300, -3.43440)],["C", (1.47620, -4.77650, -3.28620)],["C", (0.59020, -4.25790, -4.16960)],["C", (1.49520, 3.20730, -4.82930)],["C", (2.66790, 2.53390, -4.72220)],["C", (2.50350, 1.31170, -5.28280)],["C", (1.22700, 1.23160, -5.73180)],["C", (0.60550, 2.40280, -5.45710)],["C", (-5.93570, -0.59440, 0.42270)],["C", (-5.67490, -0.76940, 1.74010)],["C", (-5.50630, 0.45710, 2.29310)],["C", (-5.66940, 1.38700, 1.32150)],["C", (-5.93590, 0.73720, 0.16170)],["C", (-1.94110, -5.64480, -0.34860)],["C", (-2.40080, -5.40690, 0.90320)],["C", (-3.57220, -4.73310, 0.79580)],["C", (-3.83120, -4.55720, -0.52420)],["C", (-2.82610, -5.12390, -1.23370)],["C", (-0.60830, -2.40370, 5.45100)],["C", (-1.22900, -1.22950, 5.72670)],["C", (-2.50360, -1.31650, 5.27460)],["C", (-2.66790, -2.54160, 4.72150)],["C", (-1.49840, -3.21580, 4.83180)],["C", (-0.59120, 4.25700, 4.16640)],["C", (-1.47730, 4.78080, 3.28550)],["C", (-2.65030, 4.11680, 3.43640)],["C", (-2.48640, 3.19020, 4.41060)],["C", (-1.21440, 3.27630, 4.86590)],["C", (-1.91330, 5.12020, -2.42570)],["C", (-2.80240, 4.31240, -3.05500)],["C", (-3.81120, 4.05680, -2.18500)],["C", (-3.54830, 4.70870, -1.02640)],["C", (-2.37370, 5.36730, -1.17590)],["C", (-2.75150, -1.00080, -5.22350)],["C", (-3.37950, -1.97970, -4.52910)],["C", (-4.38810, -1.41580, -3.82380)],["C", (-4.38430, -0.08480, -4.08200)],["C", (-3.37290, 0.17320, -4.94870)],["C", (5.57710, 1.08350, 1.83600)],["C", (4.43850, 3.23390, 2.34680)],["C", (5.28420, 2.79100, 0.04890)],["C", (4.93750, 1.97320, 2.71950)],["C", (5.74720, 1.54940, 0.51980)],["C", (4.65680, 3.60500, 1.00830)],["C", (5.57430, -0.34890, 2.11230)],["C", (4.42640, -2.15060, 3.39110)],["C", (5.26880, -2.59390, 1.09270)],["C", (4.93250, -0.84460, 3.26330)],["C", (5.74000, -1.27030, 1.06310)],["C", (4.64190, -2.99270, 2.28460)],["C", (4.98110, -3.29150, -0.15470)],["C", (3.34730, -4.77230, -1.30340)],["C", (4.49930, -2.97310, -2.57300)],["C", (4.07280, -4.36590, -0.16980)],["C", (5.17630, -2.64090, -1.38770)],["C", (3.61360, -4.06120, -2.48620)],["C", (4.32560, -1.97330, -3.62020)],["C", (2.69660, -1.01610, -5.23840)],["C", (4.33340, 0.46670, -4.09490)],["C", (3.26990, -2.09560, -4.54410)],["C", (4.83730, -0.67480, -3.44870)],["C", (3.27860, 0.24260, -4.99800)],["C", (5.00110, 2.97520, -1.36880)],["C", (3.37090, 3.93170, -2.98480)],["C", (4.51340, 1.78380, -3.49510)],["C", (4.09730, 3.97270, -1.78120)],["C", (5.19190, 1.91430, -2.27160)],["C", (3.63030, 2.82940, -3.81860)],["C", (3.35530, 3.83830, 3.11290)],["C", (1.50250, 3.36900, 4.70820)],["C", (1.20710, 5.07450, 2.91980)],["C", (2.80700, 3.16710, 4.22090)],["C", (2.52450, 4.80090, 2.51020)],["C", (0.75140, 4.35030, 4.03430)],["C", (0.26130, 5.69300, -1.79430)],["C", (-0.22800, 4.50100, -3.92490)],["C", (2.11060, 4.65470, -3.09810)],["C", (-0.61880, 5.24320, -2.79750)],["C", (1.62070, 5.39090, -2.00420)],["C", (1.15220, 4.25230, -4.04230)],["C", (0.25520, 5.63800, 1.96900)],["C", (-2.08430, 5.48330, 1.14000)],["C", (-0.23060, 5.95560, -0.44780)],["C", (-1.12660, 5.45600, 2.16810)],["C", (0.64870, 5.90900, 0.64650)],["C", (-1.59020, 5.76060, -0.14830)],["C", (3.34110, -2.42890, 4.32250)],["C", (1.18430, -3.63500, 4.60310)],["C", (1.49470, -1.38840, 5.62330)],["C", (2.50300, -3.54070, 4.12210)],["C", (2.79910, -1.38800, 5.09960)],["C", (0.73410, -2.54270, 5.36710)],["C", (0.82690, -0.12770, 5.92340)],["C", (-1.32370, 1.10600, 5.72560)],["C", (0.83250, 2.31330, 5.45590)],["C", (-0.57910, -0.06470, 5.95260)],["C", (1.48580, 1.09320, 5.69450)],["C", (-0.57150, 2.27530, 5.50530)],["C", (2.08400, -5.47980, -1.13790)],["C", (-0.25530, -5.63370, -1.96610)],["C", (0.23070, -5.95420, 0.45400)],["C", (1.12480, -5.45150, -2.16760)],["C", (1.58950, -5.75730, 0.14900)],["C", (-0.64750, -5.90410, -0.64310)],["C", (-0.26090, -5.69470, 1.80130)],["C", (-2.11070, -4.65830, 3.10220)],["C", (0.22940, -4.50830, 3.93000)],["C", (-1.62110, -5.39420, 2.00760)],["C", (0.62070, -5.25020, 2.80300)],["C", (-1.14910, -4.25880, 4.04770)],["C", (1.32480, -1.10600, -5.72510)],["C", (-0.82670, 0.12640, -5.92430)],["C", (-0.83270, -2.31670, -5.45360)],["C", (0.57880, 0.06580, -5.95410)],["C", (0.57250, -2.27350, -5.50360)],["C", (-1.48540, -1.09440, -5.69230)],["C", (-1.20610, -5.07110, -2.91790)],["C", (-3.35630, -3.83580, -3.11560)],["C", (-1.50400, -3.37190, -4.70700)],["C", (-2.52500, -4.79620, -2.51020)],["C", (-0.75120, -4.34940, -4.03600)],["C", (-2.80860, -3.16690, -4.22480)],["C", (-1.18410, 3.63010, -4.59950)],["C", (-3.34400, 2.42360, -4.32360)],["C", (-1.49450, 1.38780, -5.62530)],["C", (-2.50400, 3.53340, -4.11940)],["C", (-0.73450, 2.54190, -5.36800)],["C", (-2.79830, 1.38680, -5.10360)],["C", (-5.28210, -2.78640, -0.04890)],["C", (-4.43990, -3.22970, -2.34990)],["C", (-5.58160, -1.08230, -1.83860)],["C", (-4.65460, -3.60040, -1.01090)],["C", (-5.74710, -1.54440, -0.52180)],["C", (-4.94350, -1.96950, -2.72300)],["C", (-4.99750, -2.97540, 1.36780)],["C", (-3.37150, -3.93370, 2.98690)],["C", (-4.51240, -1.78380, 3.49440)],["C", (-4.09640, -3.97220, 1.78180)],["C", (-5.18950, -1.91320, 2.27080)],["C", (-3.63200, -2.83060, 3.81940)],["C", (-4.33190, -0.46660, 4.09240)],["C", (-2.69540, 1.01560, 5.23780)],["C", (-4.32420, 1.97410, 3.62040)],["C", (-3.27600, -0.24160, 4.99570)],["C", (-4.83560, 0.67700, 3.44730)],["C", (-3.27010, 2.09710, 4.54330)],["C", (-4.49720, 2.97340, 2.57230)],["C", (-3.34830, 4.77430, 1.30130)],["C", (-4.98450, 3.29150, 0.15260)],["C", (-3.60960, 4.06190, 2.48420)],["C", (-5.17700, 2.64390, 1.38570)],["C", (-4.07750, 4.36590, 0.16870)],["C", (-5.26910, 2.59410, -1.09490)],["C", (-4.42920, 2.14530, -3.39250)],["C", (-5.57870, 0.34880, -2.11590)],["C", (-4.63860, 2.99100, -2.28840)],["C", (-5.74200, 1.26840, -1.06660)],["C", (-4.93810, 0.84050, -3.26730)],] + elif mol_str == "methane": mol_str = [ ["C", (0, 0, 0)], @@ -115,4 +147,80 @@ def min_interatomic_distance(mol_str): """This computes the minimum distance between atoms.""" coords = map(itemgetter(1), mol_str) distances = map(lambda x: np.linalg.norm(np.array(x[0]) - np.array(x[1])), combinations(coords, 2)) - return min(distances) \ No newline at end of file + return min(distances) + + +def save_plot(base_data_dir: str, molecule_name: str, iterations: int, _plot_title: str = "Default Title"): + import matplotlib.pyplot as plt + import matplotlib + import os + matplotlib.rc('font', **{'family': 'serif', 'serif': ['Computer Modern']}) + + import seaborn as sns + sns.set_theme() + sns.set_style("white") + + data_dir = base_data_dir + molecule_name + '/' + + def prepare(val): + val = np.abs(val[val == val]) + val[np.logical_and(val<1e-15, val!=0)] = 2e-15 # show the ones that go out of plot + val[val==0] = 1e-17 # remove zeros. + return val + + xticks = [] + xticklabels = [] + + fig, ax = plt.subplots(1, 1, figsize=(14,8)) + images_subdir = f'{base_data_dir}/tmp_images/num_error/' + os.makedirs(images_subdir, exist_ok=True) + + for outer_num, i in enumerate(range(iterations)): + skip = 0 + print(f'figure [{i+1} / {iterations}]\r', end="") + plt.cla() + plt.title("[Iterations %i] \n"%(i+1) + _plot_title) + files = sorted([a for a in os.listdir(data_dir) if "[" not in a and int(a.split("_")[0]) == i and ".jpg" not in a and ".gif" not in a]) + + for num, file in enumerate(files): + val= np.load(data_dir+file, allow_pickle=True)["v"] + shape = val.shape + if np.prod(shape) <= 1: + skip += 1 + continue + + val = prepare(val) + val = np.sort(val) + num_max_dots = 500 + + if val.size > num_max_dots: val= val[::int(val.size)//num_max_dots] + + ys = -np.ones(val.shape[0])*(num - skip) + ax.plot([1e-15, 1e18], [ys[0], ys[1]], 'C%i-'%(num%10), lw=10, alpha=0.2) + ax.plot(val, ys, 'C%io'%(num%10), ms=6, alpha=0.2) + + if i == 0: + xticks.append(ys[0]) + xticklabels.append(file.replace(".npz", "").replace("%i_"%i, "")) + + plt.plot( [10**(-10), 10**(-10)], [0, xticks[-1]], 'C7--', alpha=0.6) + plt.plot( [10**(10), 10**10], [0, xticks[-1]], 'C7--', alpha=0.6) + plt.plot( [10**(0), 10**0], [0, xticks[-1]], 'C7-', alpha=1) + + for x, label in zip(xticks, xticklabels): + ax.text(1e10, x+0.25, label, horizontalalignment='left', size='small', color='black', weight='normal') + + plt.yticks([], []) + plt.xscale("log") + plt.xlim([10**(-15), 10**18]) + if i == 0: plt.tight_layout() + + plt.savefig(f'{images_subdir}num_error{outer_num}.jpg') + + import imageio + gif_path = f'{base_data_dir}visualize_DFT_num_error_{molecule_name}.gif' + writer = imageio.get_writer(gif_path, loop=0, duration=7) + for i in range(iterations): + writer.append_data(imageio.v2.imread(f'{images_subdir}num_error{i}.jpg')) + writer.close() + print("Numerical error visualisation saved in", gif_path) diff --git a/requirements_test.txt b/requirements_test.txt index 9d07eb3..eeac8a0 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -4,5 +4,10 @@ # requirements_core.txt for core runtime configuration # requirements_cpu.txt for cpu backend configuration # requirements_ipu.txt for ipu backend configuration +black[jupyter] pytest nbmake +pre-commit +flake8 +flake8-copyright +isort diff --git a/test/test_experimental.py b/test/test_integrals.py similarity index 59% rename from test/test_experimental.py rename to test/test_integrals.py index ad62bd8..00b359a 100644 --- a/test/test_experimental.py +++ b/test/test_integrals.py @@ -2,11 +2,9 @@ import jax.numpy as jnp import numpy as np import pytest -from jax import tree_map, vmap from numpy.testing import assert_allclose from pyscf_ipu.experimental.basis import basisset -from pyscf_ipu.experimental.device import has_ipu, ipu_func from pyscf_ipu.experimental.integrals import ( eri_basis, eri_basis_sparse, @@ -18,45 +16,9 @@ overlap_basis, overlap_primitives, ) -from pyscf_ipu.experimental.mesh import electron_density, uniform_mesh +from pyscf_ipu.experimental.interop import to_pyscf from pyscf_ipu.experimental.primitive import Primitive -from pyscf_ipu.experimental.structure import to_pyscf, molecule - - -@pytest.mark.parametrize("basis_name", ["sto-3g", "6-31g**"]) -def test_to_pyscf(basis_name): - mol = molecule("water") - basis = basisset(mol, basis_name) - pyscf_mol = to_pyscf(mol, basis_name) - assert basis.num_orbitals == pyscf_mol.nao - - -@pytest.mark.parametrize("basis_name", ["sto-3g", "6-31+g"]) -def test_gto(basis_name): - from pyscf.dft.numint import eval_rho - - # Atomic orbitals - structure = molecule("water") - basis = basisset(structure, basis_name) - mesh = uniform_mesh() - actual = basis(mesh) - - mol = to_pyscf(structure, basis_name) - expect_ao = mol.eval_gto("GTOval_cart", np.asarray(mesh)) - assert_allclose(actual, expect_ao, atol=1e-6) - - # Molecular orbitals - mf = mol.KS() - mf.kernel() - C = jnp.array(mf.mo_coeff, dtype=jnp.float32) - actual = basis.occupancy * C @ C.T - expect = jnp.array(mf.make_rdm1(), dtype=jnp.float32) - assert_allclose(actual, expect, atol=1e-6) - - # Electron density - actual = electron_density(basis, mesh, C) - expect = eval_rho(mol, expect_ao, mf.make_rdm1(), "lda") - assert_allclose(actual, expect, atol=1e-6) +from pyscf_ipu.experimental.structure import molecule def test_overlap(): @@ -146,19 +108,6 @@ def test_water_nuclear(): assert_allclose(actual, expect, atol=1e-4) -def eri_orbitals(orbitals): - def take(orbital, index): - p = tree_map(lambda *xs: jnp.stack(xs), *orbital.primitives) - p = tree_map(lambda x: jnp.take(x, index, axis=0), p) - c = jnp.take(orbital.coefficients, index) - return p, c - - indices = [jnp.arange(o.num_primitives) for o in orbitals] - indices = [i.reshape(-1) for i in jnp.meshgrid(*indices)] - prim, coef = zip(*[take(o, i) for o, i in zip(orbitals, indices)]) - return jnp.sum(jnp.prod(jnp.stack(coef), axis=0) * vmap(eri_primitives)(*prim)) - - def test_eri(): # PyQuante test cases for ERI a, b, c, d = [Primitive()] * 4 @@ -167,18 +116,6 @@ def test_eri(): c, d = [Primitive(lmn=jnp.array([1, 0, 0]))] * 2 assert_allclose(eri_primitives(a, b, c, d), 0.940316, atol=1e-5) - # H2 molecule in sto-3g: See equation 3.235 of Szabo and Ostlund - h2 = molecule("h2") - basis = basisset(h2, "sto-3g") - indices = [(0, 0, 0, 0), (0, 0, 1, 1), (1, 0, 0, 0), (1, 0, 1, 0)] - expected = [0.7746, 0.5697, 0.4441, 0.2970] - - for ijkl, expect in zip(indices, expected): - actual = eri_orbitals([basis.orbitals[aoid] for aoid in ijkl]) - assert_allclose(actual, expect, atol=1e-4) - - -def test_eri_basis(): # H2 molecule in sto-3g: See equation 3.235 of Szabo and Ostlund h2 = molecule("h2") basis = basisset(h2, "sto-3g") @@ -214,42 +151,3 @@ def test_water_eri(sparse): aosym = "s8" if sparse else "s1" expect = to_pyscf(h2o, basis_name=basis_name).intor("int2e_cart", aosym=aosym) assert_allclose(actual, expect, atol=1e-4) - - -@pytest.mark.skipif(not has_ipu(), reason="Skipping ipu test!") -def test_ipu_overlap(): - from pyscf_ipu.experimental.integrals import _overlap_primitives - - a, b = [Primitive()] * 2 - actual = ipu_func(_overlap_primitives)(a, b) - assert_allclose(actual, overlap_primitives(a, b)) - - -@pytest.mark.skipif(not has_ipu(), reason="Skipping ipu test!") -def test_ipu_kinetic(): - from pyscf_ipu.experimental.integrals import _kinetic_primitives - - a, b = [Primitive()] * 2 - actual = ipu_func(_kinetic_primitives)(a, b) - assert_allclose(actual, kinetic_primitives(a, b)) - - -@pytest.mark.skipif(not has_ipu(), reason="Skipping ipu test!") -def test_ipu_nuclear(): - from pyscf_ipu.experimental.integrals import _nuclear_primitives - - # PyQuante test case for nuclear attraction integral - a, b = [Primitive()] * 2 - c = jnp.zeros(3) - actual = ipu_func(_nuclear_primitives)(a, b, c) - assert_allclose(actual, -1.595769, atol=1e-5) - - -@pytest.mark.skipif(not has_ipu(), reason="Skipping ipu test!") -def test_ipu_eri(): - from pyscf_ipu.experimental.integrals import _eri_primitives - - # PyQuante test cases for ERI - a, b, c, d = [Primitive()] * 4 - actual = ipu_func(_eri_primitives)(a, b, c, d) - assert_allclose(actual, 1.128379, atol=1e-5) diff --git a/test/test_integrals_ipu.py b/test/test_integrals_ipu.py new file mode 100644 index 0000000..4359d1b --- /dev/null +++ b/test/test_integrals_ipu.py @@ -0,0 +1,47 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. +import jax.numpy as jnp +import pytest +from numpy.testing import assert_allclose + +from pyscf_ipu.experimental.device import has_ipu, ipu_func +from pyscf_ipu.experimental.integrals import kinetic_primitives, overlap_primitives +from pyscf_ipu.experimental.primitive import Primitive + + +@pytest.mark.skipif(not has_ipu(), reason="Skipping ipu test!") +def test_overlap(): + from pyscf_ipu.experimental.integrals import _overlap_primitives + + a, b = [Primitive()] * 2 + actual = ipu_func(_overlap_primitives)(a, b) + assert_allclose(actual, overlap_primitives(a, b)) + + +@pytest.mark.skipif(not has_ipu(), reason="Skipping ipu test!") +def test_kinetic(): + from pyscf_ipu.experimental.integrals import _kinetic_primitives + + a, b = [Primitive()] * 2 + actual = ipu_func(_kinetic_primitives)(a, b) + assert_allclose(actual, kinetic_primitives(a, b)) + + +@pytest.mark.skipif(not has_ipu(), reason="Skipping ipu test!") +def test_nuclear(): + from pyscf_ipu.experimental.integrals import _nuclear_primitives + + # PyQuante test case for nuclear attraction integral + a, b = [Primitive()] * 2 + c = jnp.zeros(3) + actual = ipu_func(_nuclear_primitives)(a, b, c) + assert_allclose(actual, -1.595769, atol=1e-5) + + +@pytest.mark.skipif(not has_ipu(), reason="Skipping ipu test!") +def test_eri(): + from pyscf_ipu.experimental.integrals import _eri_primitives + + # PyQuante test cases for ERI + a, b, c, d = [Primitive()] * 4 + actual = ipu_func(_eri_primitives)(a, b, c, d) + assert_allclose(actual, 1.128379, atol=1e-5) diff --git a/test/test_interop.py b/test/test_interop.py new file mode 100644 index 0000000..8ed52cf --- /dev/null +++ b/test/test_interop.py @@ -0,0 +1,54 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. +import jax.numpy as jnp +import numpy as np +import pytest +from numpy.testing import assert_allclose + +from pyscf_ipu.experimental.basis import basisset +from pyscf_ipu.experimental.interop import to_pyscf +from pyscf_ipu.experimental.mesh import electron_density, uniform_mesh +from pyscf_ipu.experimental.structure import molecule, nuclear_energy + + +@pytest.mark.parametrize("basis_name", ["sto-3g", "6-31g**"]) +def test_to_pyscf(basis_name): + mol = molecule("water") + basis = basisset(mol, basis_name) + pyscf_mol = to_pyscf(mol, basis_name) + assert basis.num_orbitals == pyscf_mol.nao + + +def test_gto(): + from pyscf.dft.numint import eval_rho + + # Atomic orbitals + basis_name = "6-31+g" + structure = molecule("water") + basis = basisset(structure, basis_name) + mesh, _ = uniform_mesh() + actual = basis(mesh) + + mol = to_pyscf(structure, basis_name) + expect_ao = mol.eval_gto("GTOval_cart", np.asarray(mesh)) + assert_allclose(actual, expect_ao, atol=1e-6) + + # Molecular orbitals + mf = mol.KS() + mf.kernel() + C = jnp.array(mf.mo_coeff, dtype=jnp.float32) + actual = basis.occupancy * C @ C.T + expect = jnp.array(mf.make_rdm1(), dtype=jnp.float32) + assert_allclose(actual, expect, atol=1e-6) + + # Electron density + actual = electron_density(basis, mesh, C) + expect = eval_rho(mol, expect_ao, mf.make_rdm1(), "lda") + assert_allclose(actual, expect, atol=1e-6) + + +@pytest.mark.parametrize("name", ["water", "h2"]) +def test_nuclear_energy(name): + mol = molecule(name) + actual = nuclear_energy(mol) + expect = to_pyscf(mol).energy_nuc() + assert_allclose(actual, expect) diff --git a/test/test_special.py b/test/test_special.py new file mode 100644 index 0000000..5e6545c --- /dev/null +++ b/test/test_special.py @@ -0,0 +1,51 @@ +# Copyright (c) 2023 Graphcore Ltd. All rights reserved. +import jax.numpy as jnp +import pytest +from numpy.testing import assert_allclose + +from pyscf_ipu.experimental.special import ( + binom_beta, + binom_fori, + binom_lookup, + factorial2_fori, + factorial2_lookup, + factorial_fori, + factorial_gamma, + factorial_lookup, +) + + +def test_factorial(): + x = jnp.array([1, 2, 3, 4, 5, 6, 7, 8]) + expect = jnp.array([1, 2, 6, 24, 120, 720, 5040, 40320]) + assert_allclose(factorial_fori(x, x[-1]), expect) + assert_allclose(factorial_lookup(x, x[-1]), expect) + assert_allclose(factorial_gamma(x), expect) + + +def test_factorial2(): + x = jnp.array([1, 2, 3, 4, 5, 6, 7, 8]) + expect = jnp.array([1, 2, 3, 8, 15, 48, 105, 384]) + assert_allclose(factorial2_fori(x), expect) + assert_allclose(factorial2_fori(0), 1) + + assert_allclose(factorial2_lookup(x), expect) + assert_allclose(factorial2_lookup(0), 1) + + +@pytest.mark.parametrize("binom_func", [binom_beta, binom_fori, binom_lookup]) +def test_binom(binom_func): + x = jnp.array([4, 4, 4, 4]) + y = jnp.array([1, 2, 3, 4]) + expect = jnp.array([4, 6, 4, 1]) + assert_allclose(binom_func(x, y), expect) + + zero = jnp.array([0]) + assert_allclose(binom_func(zero, y), jnp.zeros_like(x)) + assert_allclose(binom_func(x, zero), jnp.ones_like(y)) + assert_allclose(binom_func(y, y), jnp.ones_like(y)) + + one = jnp.array([1]) + assert_allclose(binom_func(one, one), one) + assert_allclose(binom_func(zero, -one), zero) + assert_allclose(binom_func(zero, zero), one)